OSDN Git Service

Version 0.6.197, add X.Util.Windfow.
[pettanr/clientJs.git] / 0.6.x / js / 05_util / 06_XWindow.js
1 /**\r
2  * 別窓(別タブ)の操作\r
3  * <ol>\r
4  * <li>win.kill() で別窓を閉じる\r
5  * <li>win.kill() 以外で閉じられた場合、ユーザーの[x]ボタン操作や、他のscriptによって閉じられた場合、X.Event.UNLOAD イベントを発して自身を kill する。\r
6  * </ol>\r
7  * イベント\r
8  * <dl>\r
9  * <dt>X.Event.UNLOAD<dd>win.kill() 以外で閉じられた場合に通知、自身はkillする\r
10  * <dt>X.Event.ERROR<dd>他ドメインに遷移した等の理由で win.write() による書き換えに失敗した場合\r
11  * </dl>\r
12  * \r
13  * @example // 別ページの表示\r
14  * win = X.Util.Window( { url : 'other.html' } );\r
15  * // コンテンツの書き込み\r
16  * win = X.Util.Window( { html : '&lt;p&gt;Hello,world!&lt;/p&gt;' } );\r
17  * // 閉じる\r
18  * win.kill();\r
19  * \r
20  * @alias X.Util.Window\r
21  * @class Window 別窓(別タブ)\r
22  * @extends {EventDispatcher}\r
23  */\r
24 var X_Window = X[ 'Util' ][ 'Window' ] = X_EventDispatcher[ 'inherits' ](\r
25         'X.Window',\r
26         \r
27         /** @lends X.Util.Window.prototype */\r
28         {\r
29                 \r
30                 // TODO pair 側に\r
31                 /**\r
32                  * closed の監視用タイマーID\r
33                  * @private\r
34                  * @type {number} */\r
35                 _timerID : 0,\r
36                 \r
37                 'Constructor' : function( options ){\r
38                         var url  = options[ 'url' ],\r
39                                 page = window.open( url || ''/* 'about:blank' */, options[ 'name' ] || '', options[ 'params' ] || '' ),\r
40                                 html = options[ 'html' ],\r
41                                 doc  = X_Script_try( X_Object_find, [ page, 'document' ] );\r
42                         \r
43                         X_Pair_create( this, page );\r
44                         \r
45                         if( !url && html ){\r
46                                 this[ 'write' ]( html );\r
47                         };\r
48                         \r
49                         X_ViewPort[ 'listenOnce' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent );\r
50                         this[ 'listenOnce' ]( [ X_EVENT_UNLOAD, X_EVENT_KILL_INSTANCE ], X_Util_Window_handleEvent );\r
51                         \r
52                         this._timerID = X_Timer_add( options[ 'interval' ] || 500, 0, this, X_Util_Window_onTimer );\r
53                 },\r
54                 \r
55                 /**\r
56                  * 別窓が閉じられたか?\r
57                  * <ol>\r
58                  * <li>ユーザーの[x]クリック操作等\r
59                  * <li>別窓内の script, または他の script\r
60                  * </ol>\r
61                  * @return {boolean}\r
62                  */\r
63                 'closed' : function(){\r
64                         return X_Script_try( X_Object_find, [ X_Pair_get( this ), 'closed' ] );\r
65                 },\r
66                 \r
67                 /**\r
68                  * 別窓の内容を書き換える\r
69                  * @param {string=} opt_html html文字列\r
70                  * @return {Window} チェーンメソッド\r
71                  */\r
72                 'write' : function( opt_html ){\r
73                         var doc  = X_Script_try( X_Object_find, [ X_Pair_get( this ), 'document' ] );\r
74 \r
75                         if( doc ){\r
76                                 doc.open();\r
77                                 doc.write( opt_html || '' ); // TODO 無毒化\r
78                                 doc.close();\r
79                         } else {\r
80                                 this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
81                         };\r
82                         \r
83                         return this;\r
84                 }\r
85                 \r
86                 // TODO url\r
87                 \r
88         }\r
89 );\r
90 \r
91 function X_Util_Window_onTimer( e ){\r
92         if( this[ 'closed' ]() ){\r
93                 this[ 'asyncDispatch' ]( X_EVENT_UNLOAD );\r
94                 delete this._timerID;\r
95                 return X_CALLBACK_UN_LISTEN;\r
96         };\r
97 };\r
98 \r
99 function X_Util_Window_handleEvent( e ){\r
100         var page = X_Pair_get( this );\r
101 \r
102         switch( e.type ){\r
103                 case X_EVENT_UNLOAD :\r
104                         this[ 'kill' ]();\r
105                         break;\r
106                 \r
107                 case X_EVENT_KILL_INSTANCE :\r
108                         if( page && !this[ 'closed' ]() ){\r
109                                 if( 9 < X_UA[ 'IEHost' ] ){\r
110                                         page.close();\r
111                                 } else {\r
112                                         page.open( 'about:blank', '_self' ).close();\r
113                                 };\r
114                                 X_Pair_release( this, page );                           \r
115                         };\r
116                         this._timerID && X_Timer_remove( this._timerID );\r
117                         X_ViewPort[ 'unlisten' ]( X_EVENT_UNLOAD, this, X_Util_Window_handleEvent );\r
118                         break;\r
119         };\r
120 };\r
121 \r