/**\r
* Class を定義し システムの管理下に置く.\r
* 全てのクラスと pool が有効の場合インスタンスへの参照が保持される.\r
- * 1. X.Class.create( opt_settings, opt_name, opt_props ) でクラスを登録.\r
+ * 1. X.Class.create( opt_settings, opt_name, opt_privateClass, opt_props ) でクラスを登録.\r
* 2. コンストラクタ となるメソッドは、Constructor : function( arg ){ ... }, に書く.\r
* 3. 通常通り new で インスタンス生成\r
* 4. kill() でオブジェクトをクリーンして削除、pool が有効の場合は pool される.\r
klass.subClassOf = X_Class_subClassOf;\r
\r
if( X_Class_useObjectCreate ){\r
- klass.prototype = X.Class._override( X.Class._override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
+ klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
klass.prototype.constructor = klass;\r
} else\r
if( X_Class_use_proto_ ){\r
- X.Class._override( klass.prototype, props, true );\r
+ X_Class_override( klass.prototype, props, true );\r
if( X_Class_traits ){\r
klass.prototype.__proto__ = X_Class_traits;\r
} else {\r
- X.Class._override( klass.prototype, X_Class_CommonProps, false );\r
+ X_Class_override( klass.prototype, X_Class_CommonProps, false );\r
};\r
} else {\r
- klass.prototype = X.Class._override( X.Class._override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
+ klass.prototype = X_Class_override( X_Class_override( X_Class_traits || klass.prototype, props, true ), X_Class_CommonProps, false );\r
klass.prototype.constructor = klass;\r
};\r
klass.name = displayName;\r
};\r
\r
function X_Class_subClassOf( klass ){\r
- return X.Class._superClassOf.call( klass, this );\r
+ return X_Class_superClassOf.call( klass, this );\r
};\r
\r
/* サブクラスを作るメソッド \r
if( def.privateClass ){\r
i = def.userList.indexOf( instance );\r
if( i !== -1 ){\r
- data = X.Class._getPrivate( instance );\r
+ data = X_Class_getPrivate( instance );\r
X_Class_killPrivateFlag = true;\r
if( data._dispatching && data.instanceOf( X.EventDispatcher ) ){\r
data._killReserved = true;\r
},\r
\r
// TODO Super\r
- // SuperCall\r
+ // superCall\r
\r
instanceOf : function( klass ){\r
var Super = this;\r
\r
function X_Class_superConstructor(){\r
var s = X_Class_getClassDef( this ).SuperConstructor;\r
- s && s.apply( this, arguments );\r
+ return s && s.apply( this, arguments );\r
};\r
\r
console.log( 'X.Core.Class' );\r
// --- implements ---------------------------------------------------------- //\r
// ------------------------------------------------------------------------- //\r
\r
-if( X.UA.IE < 5 || X.UA.MacIE ){\r
+if( X.UA.IE4 || X.UA.MacIE ){\r
X.Timer[ '_' ] = X_Timer_onTimeout;\r
X_Timer_onTimeout = 'X.Timer._()';\r
};\r
return xnode;\r
};\r
Node.prototype.createAt = function( index, tag, opt_attrs, opt_css ){\r
- // TODO\r
+ var xnode = Node.create( tag, opt_attrs, opt_css );\r
+ this.appendAt( index, xnode );\r
+ return xnode;\r
};\r
\r
/* --------------------------------------\r
return xnode;\r
};\r
Node.prototype.createTextAt = function( index, text ){\r
- // TODO\r
+ var xtext = Node.createText( text );\r
+ this.appendAt( index, xtext );\r
+ return xtext;\r
};\r
\r
/* --------------------------------------\r
\r
switch( e.type ){\r
case X.Dom.Event.AFTER_UPDATE :\r
- //\r
- console.log( 'X.Dom.Event.AFTER_UPDATE' );\r
this._iwin = raw.contentWindow || raw.contentDocument && raw.contentDocument.parentWindow || window.frames[ this._name ];\r
\r
this.xnodeIframe.listen( X.UA.IE < 9 ? [ 'readystatechange', 'error' ] : [ 'load', 'error' ], this );\r
};\r
\r
case 'readystatechange' :\r
- //alert( 'iframe readystatechange. ' + raw.readyState );\r
- \r
if( ( raw.readyState !== 'complete' && raw.readyState !== 'loaded' ) ) return X.Callback.STOP_PROPAGATION;\r
// ie9-\r
if( !this._ready ){\r
return new X_NET_Queue( X_NET_TYPE_JSONP, url );\r
},\r
\r
- image : function( url, useIframe ){\r
+ image : function( url, needSize, useIframe ){\r
return new X_NET_Queue( X_NET_TYPE_IMAGE, url );\r
},\r
\r
break;\r
case X.Event.SUCCESS :\r
case X.Event.ERROR :\r
+ case X.Event.TIMEOUT :\r
case X.Event.CANCELED :\r
console.log( 'q: ' + e.type );\r
this.dispatch( e );\r
if( X_NET_currentQueue ){\r
if( X_NET_currentWrapper._busy ) return;\r
X_NET_currentWrapper\r
- .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue, X_NET_proxyDispatch )\r
+ .unlisten( [ X.Event.PROGRESS, X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_currentQueue, X_NET_proxyDispatch )\r
.reset();\r
X_NET_currentQueue = X_NET_currentWrapper = null;\r
};\r
break;\r
};\r
\r
- X_NET_currentWrapper.listen( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.PROGRESS ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
+ X_NET_currentWrapper.listen( [X.Event.PROGRESS, X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_currentQueue = queue, X_NET_proxyDispatch );\r
\r
X_NET_currentWrapper.load( queue.data );\r
};\r
var X_Net_XHR_W3C = window[ 'XMLHttpRequest' ] && new XMLHttpRequest(),\r
X_Net_XHR_X_DOMAIN = window[ 'XDomainRequest' ] && new XDomainRequest(),\r
X_Net_XHR_VERSION = 0,\r
- X_Net_XHR_ACTIVE_X = 5 <= X.UA.IE && X.UA.IE < 8 && X.UA.ActiveX && ( new Function( [\r
+ X_Net_XHR_ACTIVE_X = !X.UA.IE4 && X.UA.IE < 8 && X.UA.ActiveX && ( new Function( [\r
'var x=".XMLHTTP",',\r
'm="MSXML2"+x,',\r
- 'v=[m+".6.0",m+".3.0",m+".5.0",m+".4.0",m,"Microsoft"+x],',\r
+ 'n=[m+".6.0",m+".3.0",m+".5.0",m+".4.0",m,"Microsoft"+x],',\r
+ 'v=[6,3,5,4,2,1],',\r
'i=-1;',\r
'for(;i<5;){',\r
'try{',\r
- 'return[++i,new ActiveXObject(v[i])];',\r
- '}catch(e){}',\r
+ 'return[v[++i],new ActiveXObject(n[i])]',\r
+ '}catch(e){return false}',\r
'}'\r
].join( '' ) ) )();\r
\r
if( X_Net_XHR_ACTIVE_X ){\r
- X_Net_XHR_VERSION = [ 6, 3, 5, 4, 2, 1 ][ X_Net_XHR_ACTIVE_X[ 0 ] ];\r
+ X_Net_XHR_VERSION = X_Net_XHR_ACTIVE_X[ 0 ];\r
X_Net_XHR_ACTIVE_X = X_Net_XHR_ACTIVE_X[ 1 ];\r
};\r
\r
new X.EventDispatcher(),\r
{\r
\r
- _rawObject : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
- _isXHR : true,\r
- _isXDR : false, // for ie8\r
+ _rawObject : X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X,\r
+ _isXHR : true, // X.EventDispatcher で使用 for ie8-\r
+ _isXDR : false, // for ie8\r
\r
- _method : '',\r
- _type : '',\r
- _busy : false,\r
- _canceled : false,\r
- _lastProgress : 0,\r
+ _method : '',\r
+ _type : '',\r
+ _busy : false,\r
+ _canceled : false,\r
+ _percent : 0,\r
\r
load : function( obj ){\r
- var raw = X_NET_XHRWrapper._rawObject,\r
+ var raw = this._rawObject,\r
method = obj[ 'method' ],\r
url = obj[ 'url' ],\r
async = obj[ 'async' ],\r
};\r
};\r
\r
+ // TODO ie7 http://127.0.0.1 に対しては ActiveX を使う, onerror は不可\r
+ \r
if( X_Net_XHR_X_DOMAIN ){\r
if( false /* isXDomain( url ) */ ){ // isXDomain\r
- //if( raw !== X_Net_XHR_X_DOMAIN ){\r
+ if( !this._isXDR ){\r
X_EventDispatcher_migrateEvent( this );\r
- X_NET_XHRWrapper._rawObject = X_Net_XHR_X_DOMAIN;\r
+ this._rawObject = X_Net_XHR_X_DOMAIN;\r
X_EventDispatcher_restoreEvent( this );\r
- //};\r
+ this._isXDR = true;\r
+ };\r
} else {\r
- //if( raw === X_Net_XHR_X_DOMAIN ){\r
+ if( this._isXDR ){\r
X_EventDispatcher_migrateEvent( this );\r
- X_NET_XHRWrapper._rawObject = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
+ this._rawObject = X_Net_XHR_W3C || X_Net_XHR_ACTIVE_X;\r
X_EventDispatcher_restoreEvent( this);\r
- //};\r
+ this._isXDR = false;\r
+ };\r
};\r
};\r
//if( raw.timeout !== undefined ) raw.timeout = timeout || -1;\r
raw.send( postbody || '' );\r
},\r
\r
- cancel : X.Net.XHR.CANCELABLE ?\r
- function(){\r
- //X_NET_XHRWrapper._rawObject.abort()\r
- } :\r
- function(){\r
- this._canceled = true;\r
- },\r
+ cancel : function(){\r
+ X.Net.XHR.CANCELABLE && this._rawObject.abort();\r
+ this._canceled = true;\r
+ },\r
\r
reset : function(){\r
- this._method = this._type = null;\r
- this._canceled = this._busy = false;\r
- this._lastProgress = 0;\r
+ this._method = this._type = '';\r
+ this._canceled = this._busy = false;\r
+ this._percent = 0;\r
},\r
\r
handleEvent : function( e ){\r
- var raw = X_NET_XHRWrapper._rawObject,\r
+ var raw = this._rawObject,\r
live = !this._canceled,\r
status, data;\r
- console.log( '-- ' + e.type );\r
+\r
switch( e.type ){\r
/*\r
* http://memopad.bitter.jp/w3c/ajax/ajax_xmlhttprequest_onreadystatechange.html\r
http://www.semblog.org/msano/archives/000407.html\r
* */ \r
case 'readystatechange' :\r
- if( !X.Net.XHR.PROGRESS ){\r
+ //if( !X.Net.XHR.PROGRESS ){\r
switch( raw.readyState ){\r
case 0 :\r
case 1 :\r
return;\r
- case 2 : // 0.01%\r
- live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : 0.01 } );\r
+ case 2 : // 0% ajaxstart\r
+ live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : 0 } );\r
return;\r
case 3 :\r
- live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._lastProgress < 99.9 ? 99.9 : ( this._lastProgress + 100 ) / 2 } );\r
+ live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._percent < 99.9 ? 99.9 : ( this._percent + 100 ) / 2 } );\r
// 99.9%\r
return;\r
case 4 :\r
- if( this._lastProgress === 100 ) return; // Opera8 readystatechange が2重に発生\r
+ if( this._percent === 100 ) return; // Opera8 readystatechange が2重に発生\r
// 100%\r
break; // load へ\r
default :\r
// error\r
return;\r
}; \r
- };\r
+ //};\r
\r
case 'load' :\r
\r
- if( !live ){\r
- this.reset();\r
- return;\r
- };\r
- if( this._lastProgress === 100 ) return;\r
- \r
- \r
- this._lastProgress = 100;\r
+ if( !live ) return this.reset();\r
+ if( this._percent === 100 ) return;\r
\r
\r
- status = raw.status;\r
+ this._percent = 100;\r
+ this._busy = false;\r
+ status = raw.status;\r
\r
// https://code.google.com/p/fakeworker-js/source/browse/src/javascript/fakeworker.js\r
if(\r
data = raw[ 'response' ] || raw[ 'responseText' ]; // とりあえず\r
break;\r
};\r
- \r
- //console.log( 'status ' + status );\r
- //console.dir( raw );\r
- \r
- this._busy = false;\r
+\r
this.asyncDispatch( 0, { type : X.Event.SUCCESS, status : status || 200, data : data } ); \r
} else {\r
- console.log( 'status ' + status );\r
- this._busy = false;\r
- //console.dir( raw );\r
live && this.asyncDispatch( 0, { type : X.Event.ERROR, status : raw.status || 0, percent : 100 } );\r
};\r
break;\r
\r
case 'progress' :\r
+ // TODO X.Dom.Event でコピーしていないのでまだ動かない、、、\r
if( e.lengthComputable ){\r
- this._lastProgress = e.loaded / e.total;\r
- live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._lastProgress } );\r
+ this._percent = e.loaded / e.total;\r
+ live && this.asyncDispatch( 0, { type : X.Event.PROGRESS, percent : this._percent } );\r
};\r
break;\r
\r
\r
onUploadProgress : X.Net.XHR.UL_PROGRESS && function( e ){\r
var raw = X_NET_XHRWrapper._rawObject.upload,\r
- live = !this._canceled,\r
+ live = !X_NET_XHRWrapper._canceled,\r
states, data;\r
}\r
},\r
// 同期リクエストでなければならない場合, unload, beforeunload時\r
\r
\r
- // ie8 ã\81§ã\81¯ timeout ã\81\8cæ\9c\89å\8a¹, MSXML ã\81®ã\83\90ã\83¼ã\82¸ã\83§ã\83³ã\81§æ±ºå®\9aã\81\99ã\81¹ã\81\8d?\r
+ // ie8 ã\81§ã\81¯ timeout ã\81\8cæ\9c\89å\8a¹, MSXML ã\81®ã\83\90ã\83¼ã\82¸ã\83§ã\83³ã\81¯é\96¢ä¿\82ã\81ªã\81\95ã\81\9dã\81\86ã\80\81ã\80\81ã\80\81\r
if( X.UA.IE8 ){\r
X_NET_XHRWrapper.listen( [ 'readystatechange', 'error', 'abort', 'timeout' ] );\r
} else\r
if( X.UA.IE7 ){\r
- X_NET_XHRWrapper.listen( [ 'readystatechange', 'error' ] );\r
+ X_NET_XHRWrapper.listen( [ 'readystatechange', 'error' ] ); // ie7 ActiveX の場合、error は不可\r
} else\r
if( X_Net_XHR_ACTIVE_X ){ // win ie5-6\r
- X_NET_XHRWrapper.listen( [ 'readystatechange' ] );\r
+ X_NET_XHRWrapper.listen( 'readystatechange' );\r
} else \r
if( X.Net.XHR.PROGRESS ){\r
X_NET_XHRWrapper.listen( [ 'load', 'progress', 'error', 'abort', 'timeout' ] );\r
* Operaでも非同期リクエストが並列処理できる img-JSONP
* http://developer.cybozu.co.jp/takesako/2007/06/opera_img-jsonp.html
*
+ * iframe を使った jsonp の読み込みエラー判定の記事、
+ * JSONPのエラーを判断する は web archive でも観れない
+ * http://d.hatena.ne.jp/yuushimizu/20090128/1233146321
+ * TODO JSONPの動的取得+エラー処理
+ * http://d.hatena.ne.jp/NeoCat/20110206/1296934235
+ *
* IE9でiframe内で遷移した場合window.parentのメソッドを呼べない
* http://kozo002.blogspot.jp/2012/07/ie9iframewindowparent.html
- */
-
-/*
- * IE6(IETester) で動かない,localhost
+ *
+ * IE6(IETester,localhost) で動かない,
*
* TODO postMessage
*/
X.Net.JSONP = {
cb : function( accessKey, jsonString, time, opt_json2FileSize ){
- if( accessKey !== X_NET_JSONP_ACCESS_KEY ) return;
+ if( accessKey !== X_NET_JSONP_ACCESS_KEY || !X_NET_JSONPWrapper._busy ) return;
X_NET_JSONPWrapper._busy = false;
X_NET_JSONP_NinjaIframe;
-function X_NET_JSONP_operaImageHandleEvent( e ){
- switch( e.type ){
- case X.Event.SUCCESS :
- case X.Event.ERROR :
- X_NET_JSONP_loadScriptInNinjaIframe( e.src );
- break;
- case X.Event.TIMEOUT :
- case X.Event.CANCELED :
- X_NET_JSONPWrapper._operaImage.unlisten().reset();
- X_NET_JSONPWrapper.asyncDispatch( 0, X.Event.ERROR );
- break;
- };
-};
-if( !X.UA.Opera ) X_NET_JSONP_operaImageHandleEvent = null;
-
-
function X_NET_JSONP_loadScriptInNinjaIframe( url ){
var json2Path = 'js/libs/json2.js',
json2FileSize = 18103,
X_NET_JSONP_NinjaIframe || ( X_NET_JSONP_NinjaIframe = new X.Util.NinjaIframe() );
+ // TODO '<scr'+'ipt> 化 恐らくアンチウイルスソフトが反応しないための対策
+
if( X.UA.IE8 ){
html = [
// http://blog.livedoor.jp/dankogai/archives/51503830.html
'<script src="', url, '"></script>' */
'<script id="jp"></script>',
'<script>',
- 'nw=0;',
+ 'nw=0;', // なぜか必要,,,
'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',parent.JSON.stringify(o),-nw)}',
'function tm(){jp.src="', url ,'";nw=+new Date}',
'setTimeout(tm,16);',
html = [
'<script>',
'nw=+new Date;',
- 'function cb(o){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw)}',
+ 'function cb(o){if(nw){nw-=+new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw);nw=0}}',
'</script>',
'<script src="', url, '"></script>'
];
} else
- if( X.UA.IE < 5 || X.UA.MacIE ){
+ if( X.UA.IE4 || X.UA.MacIE ){
html = [
'<script id="jn"></script>',
'<script id="jp"></script>',
} else {
html = [
'<script>',
- 'function cb(o){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ')}',
+ 'function cb(o){if(nw){nw-=new Date;parent.X.Net.JSONP.cb(' + X_NET_JSONP_ACCESS_KEY + ',JSON.stringify(o),-nw,', json2FileSize, ');nw=0}}',
'nw=+new Date;',
'</script>',
'<script src="', json2Path, '"></script>',
//createURL
if( X_NET_JSONP_operaImageHandleEvent ){
this._operaImage = X.Net.Image( url )
- .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR ], X_NET_JSONP_operaImageHandleEvent );
+ .listenOnce( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent );
} else {
X_NET_JSONP_loadScriptInNinjaIframe( url );
};
cancel : function(){
if( this._operaImage ){
this._operaImage
- .unlisten()
+ .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent )
.abort();
delete this._operaImage;
} else {
}
);
+function X_NET_JSONP_operaImageHandleEvent( e ){
+ switch( e.type ){
+ case X.Event.SUCCESS :
+ case X.Event.ERROR :
+ X_NET_JSONP_loadScriptInNinjaIframe( e.src );
+ break;
+ case X.Event.TIMEOUT :
+ X_NET_JSONPWrapper._operaImage
+ .unlisten( [ X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT ], X_NET_JSONP_operaImageHandleEvent )
+ .reset();
+ X_NET_JSONPWrapper.asyncDispatch( 0, X.Event.ERROR );
+ break;
+ };
+};
+if( !X.UA.Opera ) X_NET_JSONP_operaImageHandleEvent = null;
\ No newline at end of file
* \r
*/\r
\r
-var X_Net_Image_hasImage = !!window[ 'Image' ];\r
+var X_Net_Image_hasImage = !!window[ 'Image' ],\r
+ X_Net_Image_image = X_Net_Image_hasImage && new window[ 'Image' ](),\r
+ X_Net_Image_isElement = X.Type.isHTMLElement( X_Net_Image_image );\r
+ \r
\r
if( !X_Net_Image_hasImage ){\r
alert( 'no Image!' );\r
* new Image() のときに Image オブジェクトを作るもの(IE8-)と、HTMLImageElement を作るものがある。\r
* Image は、X.EventDispatcher で、<img> は X.Dom.Node で。\r
*/\r
-X_NET_ImageWrapper = ( X_Net_Image_hasImage ? X.EventDispatcher : X.Dom.Node ).inherits(\r
+X_NET_ImageWrapper = ( !X_Net_Image_isElement ? X.EventDispatcher : X.Dom.Node ).inherits(\r
'X.Net.Image',\r
X.Class.POOL_OBJECT,\r
{\r
- _rawObject : X_Net_Image_hasImage && new Image,\r
+ _rawObject : X_Net_Image_image,\r
\r
tick : 0,\r
timerID : 0,\r
finish : false,\r
- abspath : null,\r
- delay : null,\r
+ abspath : '',\r
+ delay : 0,\r
timeout : 0,\r
\r
Constructor : X_Net_Image_hasImage ?\r
(function(){\r
- this.listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.KILL_INSTANCE ] );\r
+ this.listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.KILL_INSTANCE ] );\r
}) :\r
(function(){\r
this.SuperConstructor( document.createElement( 'img' ) )\r
.appendTo( X.Dom.Node._systemNode )\r
- .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.KILL_INSTANCE ] );\r
+ .listen( [ 'load', 'error', 'abort', X.Event.SUCCESS, X.Event.ERROR, X.Event.TIMEOUT, X.Event.KILL_INSTANCE ] );\r
}),\r
\r
load : function( abspath, opt_delay, opt_timeout ){\r
this.timerID = this.asyncDispatch( 0, { type : X.Event.ERROR } );\r
return;\r
};\r
- size = X.Dom.Image.getActualDimension( X.UA.IE < 9 && X_Net_Image_hasImage ? this.abspath : this );\r
+ size = X.Dom.Image.getActualDimension( !X_Net_Image_isElement ? this.abspath : this );\r
this.timerID = this.asyncDispatch( 0, {\r
type : X.Event.SUCCESS,\r
src : this.abspath,\r
break;\r
case X.Event.SUCCESS :\r
case X.Event.ERROR :\r
+ case X.Event.TIMEOUT :\r
this.timerID && X.Timer.remove( this.timerID );\r
this.timerID = this.asyncDispatch( 0, X.Event.COMPLETE );\r
break;\r
case X.Event.KILL_INSTANCE :\r
- this.timerID && X.Timer.remove( this.timerID );\r
+ this.reset();\r
!X_Net_Image_hasImage && this.destroy(); // if xnode\r
this.unlisten();\r
break;\r
this.timerID && X.Timer.remove( this.timerID );\r
this.timerID = 0;\r
this.finished = false;\r
- this.abspath = null; \r
+ this.abspath = '';\r
}\r
}\r
);\r