/*\r
* pettanR system.js\r
- * version 0.5.16\r
+ * version 0.5.18\r
* \r
* \r
* Type\r
return false;\r
}\r
var r;\r
- if(v && v.nodeType === 1){\r
+ if(v && v.nodeType === 1 ){\r
try{\r
r = v.cloneNode(false);\r
} catch(n) {\r
}\r
document.createStyleSheet().cssText = "v\:shape,v\:image{behavior:url(#default#VML);display:block;};";\r
}\r
- }\r
+ };\r
})();\r
\r
\r
};\r
}, 0 );\r
\r
+ function clone( src ) {\r
+ var ret;\r
+ if( Type.isArray(src) === true ){\r
+ ret = [];\r
+ } else\r
+ if( Type.isObject(src) === true ){\r
+ ret = {};\r
+ } else\r
+ if( Type.isNumber(src) === true || Type.isString(src) === true || Type.isBoolean( src ) === true ){\r
+ return src;\r
+ } else {\r
+ return null;\r
+ };\r
+ for( var key in src ){\r
+ ret[ key ] = clone( src[ key ]);\r
+ };\r
+ return ret;\r
+ };\r
+ \r
return {\r
parse: function( v ){\r
if( Type.isString( v ) === true ){\r
};\r
};\r
return baseInstance;\r
- }, \r
+ },\r
+ copy: function( objOrArray ){\r
+ return clone( objOrArray );\r
+ },\r
cleanCommnetNode: function ( _targetElm ){\r
search( _targetElm || body );\r
\r
var AsyncCall = ( function(){\r
var CALLBACK_LIST = [];\r
\r
- var CallbackTicketClass = function( _apiuser, _callback, _argments ){\r
- this.apiuser = _apiuser;\r
- this.callback = _callback;\r
- this.argments = _argments;\r
- _apiuser = _callback = _argments = null;\r
- }\r
+ var CallbackTicketClass = function( _apiuser, _callback, _argments, _thisObject ){\r
+ this.apiuser = _apiuser;\r
+ this.callback = _callback;\r
+ this.argments = _argments;\r
+ this.thisObject = _thisObject;\r
+ };\r
CallbackTicketClass.prototype = new TicketBase();\r
CallbackTicketClass.prototype.call = function(){\r
var f = this.callback,\r
- a = this.argments;\r
+ a = this.argments,\r
+ t = this.thisObject;\r
+ this.destroy();\r
if( Type.isArray( a ) === true ){\r
- f.apply( this.apiuser, a );\r
+ f.apply( t, a );\r
} else {\r
- f( a );\r
- }\r
+ f.call( t, a );\r
+ };\r
};\r
CallbackTicketClass.prototype.destroy = function( _apiuser, _callback ){\r
if( _apiuser && _apiuser !== this.apiuser ) return false;\r
var _ticket = CALLBACK_LIST.shift();\r
if( _ticket ){\r
_ticket.call();\r
- _ticket.destroy();\r
CALLBACK_LIST.length !== 0 && SystemTimer.add( SUPER_USER_KEY, dispatch, 1, true );\r
- }\r
- }\r
+ };\r
+ };\r
\r
return {\r
- add: function( _apiuser, _callback, _argments ){\r
+ add: function( _apiuser, _callback, _argments, _thisObject ){\r
CALLBACK_LIST.length === 0 && SystemTimer.add( SUPER_USER_KEY, dispatch, 1, true );\r
- CALLBACK_LIST.push( new CallbackTicketClass( _apiuser, _callback, _argments ) );\r
+ CALLBACK_LIST.push( new CallbackTicketClass( _apiuser, _callback, _argments, _thisObject || _apiuser ) );\r
},\r
remove: function( _apiuser, _callback ){\r
var _ticket,\r
CALLBACK_LIST.splice( i, 1 );\r
} else {\r
++i;\r
- }\r
- }\r
+ };\r
+ };\r
}\r
- }\r
+ };\r
})();\r
\r
/* -----------------------------------------------------------\r
success: onSuccess,\r
error: onError\r
});\r
- }\r
+ };\r
function onSuccess( _data ){\r
currentTicket.load( _data );\r
currentTicket.kill();\r
currentTicket = null;\r
request();\r
- }\r
+ };\r
function onError(){\r
++numError;\r
currentTicket.error();\r
currentTicket.kill(); // retry\r
currentTicket = null;\r
request();\r
- }\r
+ };\r
\r
return {\r
getNumTask: function(){\r
REQUEST_TICKET_RESISTER.push( new RequestTicketClass( _apiuser, DATA_IS_JSON, _data, _url, _onLoad, _onError ));\r
currentTicket === null && request();\r
}\r
- }\r
+ };\r
})();\r
\r
var FILE_CONTROLER = {\r
_type = _ticket.eventType;\r
_callback = _ticket.callBack;\r
if( _eventType === _type && _uid === _ticket.fileUID ){\r
- AsyncCall.add( apiuser, _callback, [ _eventType, _targetFile, e.key, e.value ] );\r
+ AsyncCall.add( apiuser, _callback, [ _eventType, _targetFile, e.key, e.value ], _targetFile );\r
} else\r
if( _type === Const.TREE.EVENT.UPDATE && _eventType === Const.FILE.EVENT.GET_SEQENTIAL_FILES ){\r
//_callback( _eventType, _targetFile );\r
- AsyncCall.add( apiuser, _callback, [ _eventType, _targetFile ] );\r
+ AsyncCall.add( apiuser, _callback, [ _eventType, _targetFile ], instance );\r
};\r
};\r
};\r
KeyEvent.remove( self );\r
SystemTimer.remove( self );\r
AsyncCall.remove( self );\r
- Css.unload( self );\r
+ StyleSheet.unload( self );\r
\r
while( uiList.length > 0 ){\r
uiList.shift().destroy();\r
this.fetchCSS = function( _url, opt_onload, opt_onerror ){\r
if( phase === 1 ){\r
++fetchResource;\r
- Css.load( self, _url, fetchResourceComplete, fetchResourceComplete );\r
+ StyleSheet.load( self, _url, fetchResourceComplete, fetchResourceComplete );\r
};\r
};\r
\r
// overrride\r
return true;\r
}; // false の場合、close の拒否 \r
-AbstractApplication.prototype.addMouseEventListener = function( _element, _eventType, _handler ){\r
+AbstractApplication.prototype.addEventListener = function( _element, _eventType, _handler ){\r
MouseEvent.add( this, _element, _eventType, _handler );\r
};\r
AbstractApplication.prototype.removeMouseEventListener = function( _element, _eventType, _handler ){\r
AbstractApplication.prototype.removeTimer = function( handler ){\r
SystemTimer.remove( this, handler );\r
};\r
-AbstractApplication.prototype.addAsyncCall = function( _callback, _argments ){\r
- AsyncCall.add( this, _callback, _argments );\r
+AbstractApplication.prototype.addAsyncCall = function( _callback, _argments, _thisObject ){\r
+ AsyncCall.add( this, _callback, _argments, _thisObject );\r
};\r
AbstractApplication.prototype.removeAsyncCall = function( _callback ){\r
AsyncCall.remove( this, _callback );\r
} else {\r
Application.onCurrentApplicationChange( coveredApplication );\r
coveredApplication = null;\r
- }\r
+ };\r
},\r
onCurrentApplicationChange: function( _application ){\r
if( Application.isApplicationInstance( _application ) === false ) return;\r
tailList.push( tail );\r
elm = tail.elm;\r
elmContainer.appendChild( elm );\r
- self.addMouseEventListener( elm, 'click', onTailClick );\r
+ self.addEventListener( elm, 'click', onTailClick );\r
};\r
};\r
\r
if( pageNodes.length !== 0 ){\r
if( Type.isFunction( gOS.PageApplicationClass ) === true ){\r
Page.appClass = gOS.PageApplicationClass;\r
- Page.appClass.bgColor = Page.appClass.bgColor || '#ffffff';\r
+ Page.appClass.bgColor = Page.appClass.bgColor;\r
Page.appClass.MIN_WIDTH = Page.appClass.MIN_WIDTH || 240;\r
Page.appClass.MIN_HEIGHT = Page.appClass.MIN_HEIGHT || 240;\r
} else {\r
};\r
};\r
ref = Application.register( Page.appClass, false, true, document.title, 'page', null, Page.appClass.tailColor || '#999999' );\r
+ if( Type.isFunction( gOS.PageApplicationClass ) === true ){\r
+ gOS.PageApplicationRef = ref;\r
+ };\r
};\r
delete Page.onReady;\r
},\r
* http://thudjs.tumblr.com/post/637855087/stylesheet-onload-or-lack-thereof\r
*/\r
\r
-var Css = ( function(){\r
+var StyleSheet = ( function(){\r
var head = doc.getElementsByTagName( 'head' )[ 0 ];\r
\r
var TICKET_LIST = [];\r
};\r
},\r
error: function(){\r
- for( var i = this.onerror.length, c; i; ){\r
- c = this.onerror[ --i ];\r
- Type.isFunction( c ) === true && AsyncCall.add( t.apiusers[ i ], c, t.url );\r
+ for( var i = this.onerror.length, f; i; ){\r
+ f = this.onerror[ --i ];\r
+ Type.isFunction( f ) === true && AsyncCall.add( this.apiusers[ i ], f, this.url );\r
this.onload[ i ] = this.onerror[ i ] = null;\r
};\r
},\r
}\r
})();\r
\r
+/*\r
+ * AssetLoader\r
+ * fetchCSS\r
+ * fetchJson\r
+ * fetchHtml\r
+ * fetchImage\r
+ * fetchLocalFile\r
+ * fetchLocalStorage
+ */\r
+\r
+var Image = ( function(){\r
+ var TASK_LIST = [];\r
+ /* \r
+ * FetchClass original is\r
+ * \r
+ * LICENSE: MIT?\r
+ * URL: http://d.hatena.ne.jp/uupaa/20080413/1208067631\r
+ * AUTHOR: uupaa.js@gmail.com\r
+ * \r
+ */\r
+ function detect(){\r
+ for( var i=0, t; i < TASK_LIST.length; ){\r
+ t = TASK_LIST[ i ];\r
+ if( t.complete() === true ){\r
+ TASK_LIST.splice( i, 1 );\r
+ } else {\r
+ ++i;\r
+ };\r
+ };\r
+ TASK_LIST.length === 0 && SystemTimer.remove( SUPER_USER_KEY, detect );\r
+ };\r
+ function getTask( img ){\r
+ for( var i = TASK_LIST.length; i; ){\r
+ if( TASK_LIST[ --i ].img === img ) return TASK_LIST[ i ];\r
+ };\r
+ };\r
+ function onError(){\r
+ var task = getTask( this );\r
+ if( task.finish === true ) return;\r
+ task.finish = true;\r
+ AsyncCall.add( task.apiuser, task.asyncCallback, null, task );\r
+ };\r
+ function onLoad(){\r
+ // if( finish === true ) return; // これがあると firefox3.6 で駄目、、、\r
+ // if( timer ) return; // これがあると safari3.2 で駄目、、、\r
+ var task = getTask( this );\r
+ task.finish = true;\r
+ TASK_LIST.splice( Util.getIndex( TASK_LIST, task ), 1 );\r
+ if( window.opera && !task.img.complete ){\r
+ AsyncCall.add( task.apiuser, task.asyncCallback, null, task );\r
+ return;\r
+ };\r
+ task.size = Util.getImageSize( this );\r
+ AsyncCall.add( task.apiuser, task.asyncCallback, null, task );\r
+ };\r
+\r
+\r
+ var FetchClass = function( apiuser, abspath, onLoadCallback, onErrorCallback, timeout ){\r
+ this.apiuser = apiuser;\r
+ this.abspath = abspath;\r
+ this.onLoadCallback = onLoadCallback;\r
+ this.onErrorCallback = onErrorCallback;\r
+ this.timeout = timeout;\r
+ this.tick = 0;\r
+ };\r
+ FetchClass.prototype = {\r
+ img: null,\r
+ size: null,\r
+ tick: 0,\r
+ finish: false,\r
+ load: function(){\r
+ var img = this.img = document.createElement( 'img' ); //var img = new Image(); ではieでimgのsizeが取れない、、、removeChildも失敗し、imgSizeGetterにimgが残る\r
+ img.onabort = img.onerror = onError;\r
+ img.onload = onLoad;\r
+ img.src = this.abspath;\r
+ },\r
+ complete: function(){\r
+ if( this.finish === true ) return true;\r
+ if( this.img.complete ){\r
+ this.finish = true;\r
+ if( this.img.width ) return true;\r
+ AsyncCall.add( this.apiuser, this.asyncCallback, null, this );\r
+ return true;\r
+ };\r
+ if( ( this.tick += 250 ) > this.timeout ){\r
+ this.finish = true;\r
+ AsyncCall.add( this.apiuser, this.asyncCallback, null, this );\r
+ return true;\r
+ };\r
+ },\r
+ asyncCallback: function(){\r
+ this.size ? this.onLoadCallback( this.abspath, this.size.width, this.size.height ) : this.onErrorCallback( this.abspath );\r
+ this.destroy();\r
+ },\r
+ destroy: function(){\r
+ this.finish = true;\r
+ this.img.src = this.img.onload = this.img.onabort = this.img.onerror = '';\r
+ delete this.img;\r
+ delete this.size;\r
+ delete this.onLoadCallback;\r
+ delete this.onErrorCallback;\r
+ },\r
+ stop: function(){\r
+ timer !== null && window.clearTimeout( timer );\r
+ destroy();\r
+ }\r
+ };\r
+ \r
+ return {\r
+ load: function( URLorELM, onLoad, onError, opt_timeout ){\r
+ var src, fetch;\r
+ if( Type.isString( URLorELM ) === true ){\r
+ src = URLorELM;\r
+ } else\r
+ if( Type.isHTMLElement( URLorELM ) === true && URLorELM.tagName.toLowerCase() === 'img' ){\r
+ src = URLorELM.src;\r
+ } else {\r
+ return;\r
+ };\r
+ \r
+ fetch = new FetchClass(\r
+ Util.getAbsolutePath( src ),\r
+ onLoad, onError,\r
+ Type.isFinite( opt_timeout ) === true ? opt_timeout : undefined\r
+ );\r
+ TASK_LIST.push( fetch );\r
+ \r
+ SystemTimer.add( SUPER_USER_KEY, detect, 250 );\r
+ },\r
+ unload: function( ){\r
+ \r
+ }\r
+ };\r
+})();\r
+\r
\r
/* ----------------------------------------\r
* \r
elmA.innerHTML = _newValue;\r
elmA.style.display = 'block';\r
\r
- onUpdate && _newValue !== value && AsyncCall.add( apiuser, onUpdate, [ _newValue, value ] );\r
+ onUpdate && _newValue !== value && AsyncCall.add( apiuser, onUpdate, [ _newValue, value ], instance );\r
\r
value = _newValue;\r
focus = false;\r
function onClick(){\r
focus = true;\r
// onUpdate();\r
- AsyncCall.add( apiuser, onUpdate );\r
+ AsyncCall.add( apiuser, onUpdate, null, instance );\r
return false;\r
};\r
this.focus = function(){\r
if( focus === true ){\r
OptionControl.update( instance, _value );\r
};\r
- Type.isFunction( onUpdate ) === true && AsyncCall.add( apiuser, onUpdate, [ _value ] );\r
+ Type.isFunction( onUpdate ) === true && AsyncCall.add( apiuser, onUpdate, _value, instance );\r
break;\r
};\r
};\r
onWindowResize: function( _w, _h ){\r
currentCombobox && AsyncCall.add( apiuser, updateWrapperPosition );\r
}\r
- }\r
+ };\r
})();\r
\r
var UIGroupClass = function( apiuser ){\r
i < l ? i : 0; // 0 < i < l\r
_item = currentList[ i ];\r
if( _item.enabled() === true && _item.visible() === true ){\r
- AsyncCall.add( currentUser, _item.focus );\r
+ AsyncCall.add( currentUser, _item.focus, null, _item );\r
return;\r
};\r
i += _way;\r
gOS.registerDriver = File.registerDriver;\r
\r
})( window, document );\r
+\r
+\r
+\r
+gOS.PageApplicationRef = null;\r
+gOS.PageApplicationClass = function(){\r
+ var app = this;\r
+ this.bgColor = '#FFF';\r
+ this.onOpen = function(){\r
+ var button = document.getElementById( 'server-page-close-button' );\r
+ if( button ){\r
+ app.addEventListener( button, 'click', gOS.PageApplicationRef.shutdown );\r
+ };\r
+ var msg = document.getElementById( 'esc-msg' );\r
+ if( msg ){\r
+ app.addEventListener( msg, 'click', gOS.PageApplicationRef.shutdown );\r
+ };\r
+ app.addKeyEventListener( 'keydown', gOS.PageApplicationRef.shutdown, 27 ); // 27.esc\r
+ };\r
+};
\ No newline at end of file