+X_NET_ImageWrapper[ 'listen' ]( [ 'load', 'error' /*, 'abort'*/, X_EVENT_KILL_INSTANCE ], X_NET_Image_handleEvent );\r
+\r
+return X_NET_ImageWrapper;\r
+\r
+};\r
+\r
+function X_NET_Image_detect(){\r
+ if( this.finish ) return;\r
+ if( this[ '_rawObject' ] && this[ '_rawObject' ].complete ){\r
+ this._busy = false;\r
+ this.finish = true;\r
+ if( this[ '_rawObject' ].width ) return;\r
+ X_Timer_remove( this.timerID );\r
+ this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
+ } else\r
+ if( this.timeout < ( this.tick += this.delay ) ){\r
+ this._busy = false;\r
+ this.finish = true;\r
+ X_Timer_remove( this.timerID );\r
+ this.timerID = this[ 'asyncDispatch' ]( X_EVENT_TIMEOUT );\r
+ };\r
+};\r
+\r
+function X_NET_Image_handleEvent( e ){\r
+ var size;\r
+ \r
+ switch( e.type ){\r
+ case 'error' :\r
+ //case 'abort' : // TODO ??\r
+ if( this.finish ) return;\r
+ this._busy = false;\r
+ this.finish = true;\r
+ this.timerID && X_Timer_remove( this.timerID );\r
+ this.timerID = this[ 'asyncDispatch' ]( /*e.type === 'error' ?*/ X_EVENT_ERROR /*: X_EVENT_CANCELED*/ );\r
+ break;\r
+\r
+ case 'load' :\r
+ // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
+ // if( timer ) return; // これがあると safari3.2 で駄目、、、\r
+ this._busy = false;\r
+ this.finish = true;\r
+ this.timerID && X_Timer_remove( this.timerID );\r
+ if( X_UA[ 'Opera' ] && !this[ '_rawObject' ].complete ){\r
+ this.timerID = this[ 'asyncDispatch' ]( X_EVENT_ERROR );\r
+ return;\r
+ };\r
+\r
+ size = X_Util_Image_getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
+ this.timerID = this[ 'asyncDispatch' ]( {\r
+ type : X_EVENT_SUCCESS,\r
+ src : this.abspath,\r
+ w : size[ 0 ],\r
+ h : size[ 1 ]\r
+ // TODO feedback net speed\r
+ // time , this[ '_rawObject' ].fileSize\r
+ } );\r
+ break;\r
+\r
+ case X_EVENT_KILL_INSTANCE :\r
+ this.reset();\r
+ !X_Net_Image_hasImage && this[ 'kill' ](); // if xnode\r
+ break;\r
+ };\r
+};\r
+\r