OSDN Git Service

add enter home button.
[pettanr/pettanr.git] / app / assets / javascripts / system.js
index adb6ac0..995ce3d 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * pettanR system.js\r
- *   version 0.5.16\r
+ *   version 0.5.18\r
  * \r
  * \r
  * Type\r
@@ -55,7 +55,7 @@
                                                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
@@ -1718,21 +1740,23 @@ var SystemTimer = ( function(){
 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
@@ -1746,15 +1770,14 @@ var AsyncCall = ( function(){
                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
@@ -1764,10 +1787,10 @@ var AsyncCall = ( function(){
                                        CALLBACK_LIST.splice( i, 1 );\r
                                } else {\r
                                        ++i;\r
-                               }\r
-                       }\r
+                               };\r
+                       };\r
                }\r
-       }\r
+       };\r
 })();\r
 \r
 /* -----------------------------------------------------------\r
@@ -1832,20 +1855,20 @@ var File = ( function(){
                                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
@@ -1858,7 +1881,7 @@ var File = ( function(){
                                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
@@ -1993,11 +2016,11 @@ var File = ( function(){
                                _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
@@ -2590,7 +2613,7 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
                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
@@ -2632,7 +2655,7 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
        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
@@ -2652,7 +2675,7 @@ AbstractApplication.prototype.onClose = function(){
        // 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
@@ -2676,8 +2699,8 @@ AbstractApplication.prototype.addTimer = function( handler, time, once ){
 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
@@ -2783,7 +2806,7 @@ var Application = ( function(){
                        } else {\r
                                Application.onCurrentApplicationChange( coveredApplication );\r
                                coveredApplication = null;\r
-                       }\r
+                       };\r
                },\r
                onCurrentApplicationChange: function( _application ){\r
                        if( Application.isApplicationInstance( _application ) === false ) return;\r
@@ -2850,7 +2873,7 @@ var Application = ( function(){
                                        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
@@ -2973,7 +2996,7 @@ var Application = ( function(){
                                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
@@ -2992,6 +3015,9 @@ var Application = ( function(){
                                                };\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
@@ -3807,7 +3833,7 @@ var KeyEvent = ( function(){
  * 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
@@ -3861,9 +3887,9 @@ var Css = ( function(){
                };\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
@@ -3967,6 +3993,141 @@ var Css = ( function(){
        }\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
@@ -4159,7 +4320,7 @@ var UI = ( function(){
                        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
@@ -4197,7 +4358,7 @@ var UI = ( function(){
                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
@@ -4282,7 +4443,7 @@ var UI = ( function(){
                                                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
@@ -4485,7 +4646,7 @@ var UI = ( function(){
                        onWindowResize: function( _w, _h ){\r
                                currentCombobox && AsyncCall.add( apiuser, updateWrapperPosition );\r
                        }\r
-               }\r
+               };\r
        })();\r
 \r
        var UIGroupClass = function( apiuser ){\r
@@ -4626,7 +4787,7 @@ var UI = ( function(){
                                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
@@ -5296,3 +5457,22 @@ var DHTML = ( function(){
        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