+X[ 'Net' ][ 'Form' ] = {\r
+ // 隠し iframe 使用の可否\r
+};\r
+\r
+var X_NET_Form_errorTimerID, X_Net_Form_onloadCount = 0;\r
+\r
+X_TEMP.X_NET_Form_init = function(){\r
+ X_NET_FormWrapper = X_Class_override( X[ 'Util' ][ 'NinjaIframe' ](), X_TEMP.X_NET_Form_params );\r
+ \r
+ delete X_TEMP.X_NET_Form_init;\r
+ delete X_TEMP.X_NET_Form_params;\r
+ \r
+ return X_NET_FormWrapper;\r
+};\r
+\r
+/*\r
+ * form 構築時に "><script> といった文字列の挿入を禁止するために " を エスケープする、併せて改行文字を消す\r
+ */\r
+function X_NET_Form_escapeQuote( str ){\r
+ return X_String_toChrReferance( str );\r
+};\r
+\r
+X_TEMP.X_NET_Form_params = {\r
+ \r
+ _busy : false,\r
+ _canceled : false,\r
+ \r
+ timeout : 1000,\r
+ isJump : false, // ページを離脱するか?\r
+ \r
+ load : function( option ){\r
+ //createURL\r
+ var params = option[ 'params' ] || {},\r
+ target = option[ 'target' ],\r
+ html, k;\r
+ \r
+ target = target === '_self' ? '_parent' : target === '_blank' ? '_self' : target,\r
+ html = [\r
+ '<form method="', X_NET_Form_escapeQuote( option[ 'method' ] || 'GET' ), \r
+ '" action="', X_NET_Form_escapeQuote( option[ 'url' ] || '' ), \r
+ '" target="', X_NET_Form_escapeQuote( target || '_self' ),\r
+ '">' ],\r
+ k;\r
+ \r
+ if( target === '_top' || target === '_parent' ) this.isJump = true;\r
+ if( 0 <= option[ 'timeout' ] ) this.timeout = option[ 'timeout' ];\r
+ \r
+ for( k in params ){\r
+ // TODO 使用すべきでない name\r
+ html.push( '<input type="hidden" name="', X_NET_Form_escapeQuote( k ), '" value="', X_NET_Form_escapeQuote( params[ k ] || '' ), '">' );\r
+ };\r
+ \r
+ html.push( '</form><script>document.forms[0].submit();</script>' );\r
+ \r
+ X_NET_FormWrapper\r
+ [ 'refresh' ]( html.join( '' ) )\r
+ [ 'listen' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener );\r
+ \r
+ X_NET_FormWrapper._busy = true;\r
+ },\r
+ \r
+ cancel : function(){\r
+ X_NET_FormWrapper.reset();\r
+ X_NET_FormWrapper._canceled = true;\r
+ },\r
+ \r
+ reset : function(){\r
+ X_NET_FormWrapper._busy = X_NET_FormWrapper._canceled = false;\r
+ X_NET_FormWrapper[ 'unlisten' ]( [ 'ninjaload', 'ninjaerror' ], X_NET_Form_iframeListener );\r
+ X_NET_FormWrapper[ 'refresh' ]( '' );\r
+ X_NET_Form_errorTimerID && X_Timer_remove( X_NET_Form_errorTimerID );\r
+ X_NET_Form_errorTimerID = X_Net_Form_onloadCount = 0;\r
+ }\r
+ };\r
+\r
+function X_NET_Form_iframeListener( e ){\r
+ var idoc;\r
+ \r
+ switch( e.type ){\r
+ case 'ninjaload' :\r
+ if( this.isJump ){\r
+ return;\r
+ };\r
+ \r
+ if( ++X_Net_Form_onloadCount === 1 ){\r
+ X_NET_Form_errorTimerID = X_NET_FormWrapper[ 'asyncDispatch' ]( this.timeout, X_EVENT_ERROR );\r
+\r
+ // TODO レスポンスの html にアクセスしたい場合\r
+ // TODO samedomain or xiframe-sender\r
+ \r
+ idoc = this[ '_rawObject' ].contentDocument || this._iwin.document,\r
+ \r
+ X_NET_FormWrapper[ 'asyncDispatch' ]( { type : X_EVENT_SUCCESS, responce : idoc && idoc.body ? idoc.body.innerHTML : '' } );\r
+ };\r
+ break;\r
+ case 'ninjaerror' :\r
+ console.log( 'iframe onerror' );\r
+ X_NET_FormWrapper[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
+ break;\r
+ };\r
+ return X_Callback_UN_LISTEN;\r
+};\r