OSDN Git Service

Version 0.6.149, fix X.Audio & X.UI.
[pettanr/clientJs.git] / 0.6.x / js / 06_net / 05_XXHRGadget.js
1 /*\r
2  * gadgets.io.makeRequest\r
3  * \r
4  * 1. gadget-iframe を作る。指示を # で渡す。 元文書は frame 内の images の監視を開始する。\r
5  *  1. 通信用 img の src\r
6  *\r
7  * 2. gadget-iframe が 通信用 img を作る。#ready\r
8  * \r
9  * 3. 元文書が #ready を受け取ったら、iframe の # を書き換えて指示を送る。指示が長い場合、分割して送る。\r
10  * \r
11  * 4. gadget-iframe は 通信用 img の # に結果を書く。コンテンツが長い場合、分割する。\r
12  * \r
13  * 5. 元文書は結果を受け取ったことを gadget-iframe の # に書いて伝える。\r
14  * \r
15  * \r
16  */\r
17 \r
18 \r
19 \r
20 var X_NET_GIMR_canUse         = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],\r
21         \r
22         X_NET_GIMR_iframeName     = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ),\r
23         \r
24         X_NET_GIMR_GADGET_XML_URL = 'http://googledrive.com/host/0B4Y86MXyTfuoVUkwTE54T3V1V1U',\r
25         \r
26         X_NET_GIMR_GADGET_URL     = 'http://www.ig.gmodules.com/gadgets/ifr?url=' + encodeURIComponent( X_NET_GIMR_GADGET_XML_URL ) + '&nocache=1',\r
27         \r
28         X_NET_GIMR_IMAGE_URL      = 'img/opacity0.gif',\r
29         \r
30         X_NET_GIMR_detection      = new Function( 'f,j,i', 'for(j=f.length;j;)try{i=f[--j];return i.location.hash}catch(e){}' ),\r
31         \r
32         X_NET_GIMR_gadgetIframe,\r
33         \r
34         X_NET_GIMR_requestOptions,\r
35         \r
36         X_NET_GIMR_requestOriginal,\r
37         \r
38         X_NET_GIMR_timerID,\r
39         \r
40         X_NET_GIMR_phase = 0,\r
41         \r
42         X_NET_GIMR_lastHashString;\r
43 \r
44 \r
45 function X_NET_GIMR_detectImageOverIframe(){\r
46         var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ],\r
47                 iwin, ret;\r
48         \r
49         if( raw ){\r
50                 iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];\r
51                 \r
52                 if( iwin && iwin.frames && iwin.frames.length ){\r
53                         ret = X_NET_GIMR_detection( iwin.frames );\r
54                         if( ret && ret !== X_NET_GIMR_lastHashString ){\r
55                                 X_NET_GIMR_lastHashString = ret;\r
56                                 console.log( ret );\r
57                                 \r
58                                 switch( X_NET_GIMR_phase ){\r
59                                         case 0 : // init\r
60                                                 // TODO 分割\r
61                                                 iwin.location.href = X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent( X_NET_GIMR_toJSONString( X_NET_GIMR_requestOptions ) );\r
62                                                 break;\r
63                                                 \r
64                                         case 1 : // after makeRequest > :ok 待ち\r
65                                                 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_waiting_';\r
66                                                 break;\r
67 \r
68                                         case 2 : // _waiting_ 通信結果待ち\r
69                                                 ret = decodeURIComponent( ret.substr( 1 ) );\r
70                                                 ret = window.JSON ? JSON.parse( ret ) : eval( '(' + ret + ')' );\r
71                                                 \r
72                                                 X_NET_GIMRWrapper._busy = false;\r
73                                                 \r
74                                                 X_NET_GIMRWrapper\r
75                                                         [ 'asyncDispatch' ]( {\r
76                                                                 type : ret[ 'errors' ] && ret[ 'errors' ].length ? X_EVENT_ERROR : X_EVENT_SUCCESS,\r
77                                                                 data : ret\r
78                                                         } );\r
79                                                 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';\r
80                                                 X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;\r
81                                                 X_NET_GIMR_lastHashString = '';\r
82                                                 \r
83                                                 return X_Callback_UN_LISTEN;\r
84                                 };\r
85                                 ++X_NET_GIMR_phase;\r
86                         };\r
87                 };\r
88         };\r
89 };\r
90 \r
91 // コマンドが長い場合、分割する\r
92 function X_NET_GIMR_toJSONString( obj ){\r
93         var json = '', k, v;\r
94         for( k in obj ){\r
95                 if( json ) json += ',';\r
96                 v = obj[ k ];\r
97                 v = v || v === 0 ? v : null;\r
98                 json += '"' + k + '":' + ( X_Type_isObject( v ) ? X_NET_GIMR_toJSONString( v ) : X_Type_isString( v ) ? '"' + v + '"' : v );\r
99         };\r
100         console.log( json );\r
101         return '{' + json + '}';\r
102 };\r
103 \r
104 \r
105 // TODO extend NinjaIframe\r
106 X_NET_GIMRWrapper = X_Class_override(\r
107         X_EventDispatcher(),\r
108         {\r
109 \r
110                 _busy         : false,\r
111                 _canceled     : false,\r
112                 _onloadCount  : 0,\r
113                 \r
114                 load : function( obj ){\r
115                         var k;\r
116                         //createURL\r
117                         if( !X_NET_GIMR_gadgetIframe ){\r
118                                 X_NET_GIMR_gadgetIframe = X_Node_systemNode\r
119                                                 .create( 'iframe', {\r
120                                                         className         : 'hidden-iframe',\r
121                                                         name              : X_NET_GIMR_iframeName,\r
122                                                         id                : X_NET_GIMR_iframeName,\r
123                                                         src               : X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent(\r
124                                                                 X_NET_GIMR_toJSONString( { 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ), 'len' : 1000, 'itvl' : 200 } ) ),\r
125                                                         scrolling         : 'no',\r
126                                                         allowtransparency : 'no',                                       \r
127                                                         frameborder       : 0,\r
128                                                         tabindex          : -1\r
129                                                         } );\r
130                         };\r
131                         \r
132                         X_NET_GIMR_timerID = X.Timer.add( 100, 0, X_NET_GIMR_detectImageOverIframe );\r
133                         \r
134                         X_NET_GIMR_requestOriginal = X_Object_deepCopy( v );\r
135                         \r
136                         X_NET_GIMR_requestOptions = {\r
137                                 'CONTENT_TYPE'     : 'TEXT',\r
138                                 'GET_FULL_HEADERS' : true,\r
139                                 'REFRESH_INTERVAL' : 0\r
140                         };\r
141                         \r
142                         for( k in obj ){\r
143                                 if( v = obj[ k ] ){\r
144                                         switch( k ){\r
145                                                 case 'postdata' :\r
146                                                         X_NET_GIMR_requestOptions[ 'POST_DATA' ] = v;\r
147                                                         break;\r
148                                                 case 'method' :\r
149                                                         X_NET_GIMR_requestOptions[ 'METHOD' ] = v;\r
150                                                         break;                                  \r
151                                                 case 'dataType' :\r
152                                                         X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v;\r
153                                                         break;\r
154                                                 case 'headers' :\r
155                                                         X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_Object_clone( v );\r
156                                                         break;\r
157                                                 case 'cashe' :\r
158                                                         X_NET_GIMR_requestOptions[ 'REFRESH_INTERVAL' ] = 3600;\r
159                                                         break;\r
160                                         };                                      \r
161                                 };\r
162                         };\r
163                         \r
164                         this._busy = true;\r
165                 },\r
166                 \r
167                 cancel : function(){\r
168                         this._canceled = true;\r
169                 },\r
170                 \r
171                 reset : function(){\r
172                         this._busy = this._canceled = false;\r
173                         this._onloadCount = 0;\r
174                 }\r
175         }\r
176 );\r