1 var
  2 	WINDOW_APP = WINDOW_APP || {};
  3 
  4 WINDOW_APP.classes = WINDOW_APP.classes || {};
  5 
  6 
  7 /**
  8  * ウィンドウ開閉の監視
  9  *
 10  * @class
 11  * @param targetWindow {Object} 監視するウィンドウ
 12  * @author	ngi@phantom4.org
 13  * @example
 14  *
 15  * /**
 16  *  * windowの状態が変わった
 17  *  *
 18  *  * @param isOpen {Boolean} 開いているか
 19  *  * @param target {Object} 対象のウィンドウ
 20  *  *\/
 21  *  function onStatusChanged (isOpen, target) {
 22  *  	alert("window.closed", isOpen, target);
 23  *  }
 24  *
 25  *  var monitor = new WINDOW_APP.classes.CloseMonitor();
 26  *  monitor.add(onStatusChanged);	//リスナー追加
 27  */
 28 WINDOW_APP.classes.CloseMonitor = function (targetWindow) {
 29 	var
 30 		_INTERVAL = 250,
 31 
 32 		_isPlaying = false,	//動作中か
 33 		_listeners = [],	//リスナー
 34 		_numListener = 0,	//追加された要素の数
 35 		_timer,	//タイマー
 36 		_prevStatus;	//前回の開閉状態
 37 
 38 	/**
 39 	 * イベントを追加する
 40 	 *
 41 	 * @param func {Function} リスナー
 42 	 */
 43 	function add (func) {
 44 		var
 45 			isAdded = false;	//すでに追加されているか
 46 
 47 		if(typeof func === "function") {
 48 			//同じものがあれば上書き
 49 			for(var i = 0; i < _numListener; i++) {
 50 				if(_listeners[i] === func) {
 51 					_listeners[i] = func;
 52 					isAdded = true;
 53 					break;
 54 				}
 55 			}
 56 
 57 			if(!isAdded) {
 58 				_listeners.push(func);
 59 				_numListener++;
 60 			}
 61 		}
 62 	}
 63 
 64 	/**
 65 	 * イベントを削除する
 66 	 *
 67 	 * @param func {Function} リスナー
 68 	 */
 69 	function remove (func) {
 70 		for(var i = 0; i < _numListener; i++) {
 71 			//一致したリスナーを削除
 72 			if(_listeners[i] === func) {
 73 				delete _listeners[i];
 74 				_numListener--;
 75 				break;
 76 			}
 77 		}
 78 	}
 79 
 80 	/**
 81 	 * モニターの開始(手動で実行する場合)
 82 	 *
 83 	 */
 84 	function start () {
 85 		stop();
 86 
 87 		_monitor();
 88 		_timer = setInterval(_monitor, _INTERVAL);
 89 		_isPlaying = true;
 90 	}
 91 
 92 	/**
 93 	 * モニターの停止(手動で実行する場合)
 94 	 *
 95 	 */
 96 	function stop () {
 97 		if(_timer) {
 98 			clearInterval(_timer);
 99 		}
100 		_isPlaying = false;
101 	}
102 
103 	/**
104 	 * 監視&通知
105 	 *
106 	 */
107 	function _monitor () {
108 		var
109 			isOpen = Boolean(targetWindow && !targetWindow.closed);	//ウィンドウが開いているか
110 
111 		//通知
112 		if(_prevStatus != isOpen) {
113 			for(var i = 0; i < _numListener; i++) {
114 				_listeners[i].apply(_listeners[i], [isOpen, targetWindow]);
115 			}
116 			_prevStatus = isOpen;
117 		}
118 	}
119 
120 	start();
121 
122 	//public
123 	return {
124 		add: add,
125 		remove: remove,
126 		start: start,
127 		stop: stop
128 	};
129 };
130 
131 
132