2 * gadgets.io.makeRequest
\r
4 * 1. gadget-iframe を作る。指示を # で渡す。 元文書は frame 内の images の監視を開始する。
\r
7 * 2. gadget-iframe が 通信用 img を作る。#ready
\r
9 * 3. 元文書が #ready を受け取ったら、iframe の # を書き換えて指示を送る。指示が長い場合、分割して送る。
\r
11 * 4. gadget-iframe は 通信用 img の # に結果を書く。コンテンツが長い場合、分割する。
\r
13 * 5. 元文書は結果を受け取ったことを gadget-iframe の # に書いて伝える。
\r
20 var X_NET_GIMR_canUse = 5.5 <= X_UA[ 'IE' ] || !X_UA[ 'IE' ],
\r
22 X_NET_GIMR_iframeName = 'gadgetProxy_' + ( Math.random() * 100000 | 0 ),
\r
24 X_NET_GIMR_GADGET_XML_URL = 'http://googledrive.com/host/0B4Y86MXyTfuoVUkwTE54T3V1V1U',
\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
28 X_NET_GIMR_IMAGE_URL = 'img/opacity0.gif',
\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
32 X_NET_GIMR_gadgetIframe,
\r
34 X_NET_GIMR_requestOptions,
\r
36 X_NET_GIMR_requestOriginal,
\r
40 X_NET_GIMR_phase = 0,
\r
42 X_NET_GIMR_lastHashString,
\r
44 X_NET_GIMR_isReceiveBatches, X_NET_GIMR_receivedString;
\r
47 function X_NET_GIMR_detectImageOverIframe(){
\r
48 var raw = X_NET_GIMR_gadgetIframe[ '_rawObject' ],
\r
49 iwin, ret, n, error, data = null, zero, e;
\r
52 iwin = raw.contentWindow || ( raw.contentDocument && raw.contentDocument.parentWindow ) || window.frames[ X_NET_GIMR_iframeName ];
\r
54 if( iwin && iwin.frames && iwin.frames.length ){
\r
55 ret = X_NET_GIMR_detection( iwin.frames );
\r
56 if( ret && ret !== X_NET_GIMR_lastHashString ){
\r
57 X_NET_GIMR_lastHashString = ret;
\r
58 //console.log( ret.length );
\r
59 //console.log( '' + ret );
\r
61 switch( X_NET_GIMR_phase ){
\r
64 iwin.location.href = X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent( X_NET_GIMR_toJSONString( X_NET_GIMR_requestOptions ) );
\r
67 case 1 : // after makeRequest > :ok 待ち
\r
68 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_waiting_';
\r
71 case 2 : // _waiting_ 通信結果待ち
\r
73 ret = ret.substr( 1 );
\r
74 n = parseInt( ret );
\r
76 if( X_NET_GIMR_isReceiveBatches ){
\r
77 X_NET_GIMR_receivedString += ret;
\r
78 if( --X_NET_GIMR_isReceiveBatches ){
\r
79 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;
\r
84 X_NET_GIMR_receivedString = ret.substr( ( n + ':' ).length );
\r
85 X_NET_GIMR_isReceiveBatches = --n;
\r
86 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_' + X_NET_GIMR_isReceiveBatches;
\r
88 X_NET_GIMR_timerID = X_Timer_add( 16, 0, X_NET_GIMR_detectImageOverIframe );
\r
89 return X_Callback_UN_LISTEN;
\r
91 X_NET_GIMR_receivedString = ret;
\r
94 zero = String.fromCharCode( 0 );
\r
95 console.log( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '--' ).split( zero + 'E0F' ).join( '--' ) );
\r
96 ret = X_String_parseTrustedJsonString( _builtin_decodeURI( X_NET_GIMR_receivedString ).split( zero + '002' ).join( '。' ).split( zero + 'F0E' ).join( '.' ) );
\r
98 X_NET_GIMR_receivedString = '';
\r
100 error = ret[ 'errors' ] && ret[ 'errors' ].length;
\r
102 switch( !error && X_NET_GIMR_requestOriginal[ 'dataType' ] ){
\r
104 data = X_String_parseTrustedJsonString( ret[ 'json' ] || ret[ 'text' ] || '' );
\r
108 //console.dir( data || ret );
\r
110 X_NET_GIMRWrapper._busy = false;
\r
113 [ 'asyncDispatch' ]( e = {
\r
114 type : error || ret[ 'rc' ] < 200 || 400 < ret[ 'rc' ] ? X_EVENT_ERROR : X_EVENT_SUCCESS,
\r
115 status : ret[ 'rc' ] || ( error ? ret[ 'code' ] || 400 : 200 ),
\r
117 'headers' : ret[ 'headers' ],
\r
118 'message' : error && ret[ 'errors' ].join( '\n' )
\r
121 //console.dir( e );
\r
123 X_NET_GIMR_timerID = X_NET_GIMR_phase = 0;
\r
124 X_NET_GIMR_lastHashString = '';
\r
125 iwin.location.href = X_NET_GIMR_GADGET_URL + '#_recived_';
\r
127 return X_Callback_UN_LISTEN;
\r
129 ++X_NET_GIMR_phase;
\r
136 function X_NET_GIMR_toJSONString( obj ){
\r
137 var json = '', k, v;
\r
139 if( json ) json += ',';
\r
141 v = v || v === 0 ? v : null;
\r
142 json += '"' + k + '":' + ( X_Type_isObject( v ) ? X_NET_GIMR_toJSONString( v ) : X_Type_isString( v ) ? '"' + v + '"' : v );
\r
144 console.log( json );
\r
145 return '{' + json + '}';
\r
149 X_TEMP.X_Net_GIMR_init = function(){
\r
151 delete X_TEMP.X_Net_GIMR_init;
\r
153 // TODO extend NinjaIframe
\r
154 X_NET_GIMRWrapper = X_Class_override(
\r
155 X_EventDispatcher(),
\r
162 load : function( obj ){
\r
165 if( !X_NET_GIMR_gadgetIframe ){
\r
166 X_NET_GIMR_gadgetIframe = X_Node_systemNode
\r
167 .create( 'iframe', {
\r
168 className : 'hidden-iframe',
\r
169 name : X_NET_GIMR_iframeName,
\r
170 id : X_NET_GIMR_iframeName,
\r
171 src : X_NET_GIMR_GADGET_URL + '#' + encodeURIComponent(
\r
172 X_NET_GIMR_toJSONString( { 'img' : X_URL_toAbsolutePath( X_NET_GIMR_IMAGE_URL ), 'len' : 1000, 'itvl' : 200 } ) ),
\r
174 allowtransparency : 'no',
\r
180 X_NET_GIMR_timerID = X_Timer_add( 333, 0, X_NET_GIMR_detectImageOverIframe );
\r
182 X_NET_GIMR_requestOriginal = X_Object_deepCopy( obj );
\r
184 //console.dir( obj );
\r
186 X_NET_GIMR_requestOptions = {
\r
187 'CONTENT_TYPE' : 'TEXT',
\r
188 'GET_FULL_HEADERS' : true,
\r
189 'REFRESH_INTERVAL' : 0,
\r
190 'url' : obj[ 'url' ]
\r
194 if( v = '' + obj[ k ] ){
\r
197 X_NET_GIMR_requestOptions[ 'POST_DATA' ] = v;
\r
200 X_NET_GIMR_requestOptions[ 'METHOD' ] = v;
\r
204 switch( v = v.toUpperCase() ){
\r
207 X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = v;
\r
213 X_NET_GIMR_requestOptions[ 'CONTENT_TYPE' ] = 'DOM';
\r
219 X_NET_GIMR_requestOptions[ 'HEADERS' ] = X_NET_GIMR_requestOriginal[ k ];
\r
222 X_NET_GIMR_requestOptions[ 'REFRESH_INTERVAL' ] = 3600;
\r
231 cancel : function(){
\r
232 this._canceled = true;
\r
235 reset : function(){
\r
236 this._busy = this._canceled = false;
\r
237 this._onloadCount = 0;
\r
242 return X_NET_GIMRWrapper;
\r