OSDN Git Service

client is version 0.5.5, update around comic exproler.
[pettanr/pettanr.git] / app / assets / javascripts / system.js
index 6be3255..9799331 100644 (file)
@@ -1,4 +1,23 @@
 /*\r
+ * pettanR system.js\r
+ *   version 0.5.5\r
+ * \r
+ * \r
+ * Type\r
+ * \r
+ * Util\r
+ * \r
+ * UA\r
+ * \r
+ * gadgetOS\r
+ *   author:\r
+ *     itozyun\r
+ *   licence:\r
+ *     3-clause BSD\r
+ */\r
+\r
+\r
+/*\r
  * http://pettanr.sourceforge.jp/test/type.html\r
  */\r
        var Type = {\r
@@ -1641,7 +1660,8 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
        var self          = null, // init で設定\r
                uiList        = [],\r
                finderList    = [],\r
-               fetchResource = false,\r
+               fetchResource = 0,\r
+               bootParams    = null,\r
                phase         = 0;\r
        this.rootElement = document.createElement( 'div' );\r
        this.bgColor     = '#C1CACF';\r
@@ -1656,19 +1676,37 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
        };\r
        this.open = function( _w, _h /*, _option */ ){\r
                phase = 3;\r
-               if( self.MIN_WIDTH > _w || self.MIN_HEIGHT > _h ){\r
-                       if( Type.isHTMLElement( self.rootElement ) === true ){\r
-                               // 小さすぎる!、と表示\r
-                       }\r
-               }\r
-               if( arguments.length > 2 ){\r
-                       self.onOpen.apply( self, arguments );\r
+               bootParams = Util.copyArray( arguments );\r
+               \r
+               if( this.rootElement.innerHTML && this.rootElement.innerHTML.length > 0 ){\r
+                       SystemTimer.add( self, detect, 16 );\r
                } else {\r
-                       self.onOpen( _w, _h );\r
+                       onOpen();\r
                }\r
-               phase = 4;\r
+               \r
+               function detect(){\r
+                       if( self.rootElement.firstChild && fetchResource === 0 ){\r
+                               SystemTimer.remove( self, detect );\r
+                               onOpen();\r
+                       };\r
+               };\r
+               \r
+               function onOpen(){\r
+                       if( self.MIN_WIDTH > _w || self.MIN_HEIGHT > _h ){\r
+                               if( Type.isHTMLElement( self.rootElement ) === true ){\r
+                                       // 小さすぎる!、と表示\r
+                               }\r
+                       }\r
+                       if( bootParams.length > 2 ){\r
+                               self.onOpen.apply( self, bootParams );\r
+                       } else {\r
+                               self.onOpen( _w, _h );\r
+                       }\r
+                       phase = 4;                      \r
+               };\r
        };\r
        this.resize = function( _w, _h ){\r
+               if( phase !== 4 ) return;\r
                if( self.MIN_WIDTH > _w || self.MIN_HEIGHT > _h ){\r
                        if( Type.isHTMLElement( self.rootElement ) === true ){\r
                                // 小さすぎる!、と表示\r
@@ -1721,12 +1759,13 @@ var AbstractApplication = function( displayName, appClass, isOverlay ){
        };\r
        this.fetchCSS = function( _url, opt_onload, opt_onerror ){\r
                if( phase === 1 ){\r
-                       Css.load( self, _url, fetchResourceComplete );\r
+                       ++fetchResource;\r
+                       Css.load( self, _url, fetchResourceComplete, fetchResourceComplete );\r
                };\r
        };\r
        \r
        function fetchResourceComplete(){\r
-               alert( phase );\r
+               --fetchResource;\r
        };\r
 };\r
 \r
@@ -2124,7 +2163,7 @@ var Application = ( function(){
                                        delete this.handler;\r
                                        delete this.destroy;\r
                                };\r
-                       }\r
+                       };\r
                } else {\r
                        wrappedEventClass = function( e, element ){\r
                                this._event        = e;\r
@@ -2147,13 +2186,13 @@ var Application = ( function(){
                                this.wheelDelta    = e.wheelDelta;\r
                                \r
                                e = element = null;\r
-                       }\r
+                       };\r
                        wrappedEventClass.prototype.stopPropagation = function(){\r
                                this._event.cancelBubble = true;\r
-                       }\r
+                       };\r
                        wrappedEventClass.prototype.preventDefault  = function(){\r
                                this._event.returnValue = false;\r
-                       }\r
+                       };\r
 \r
                        if( doc.attachEvent ){\r
                                wrappedHandlerClass = function( element, handler ){\r
@@ -2191,6 +2230,9 @@ var Application = ( function(){
                                        this.element[ 'on' + this.eventType ] = function( e ){\r
                                                return self.fire( self, e );\r
                                        };\r
+                                       this.clean = function(){\r
+                                               self = null;\r
+                                       };\r
                                        _ticket = null;\r
                                };\r
                                tmp.ticketClass.prototype = {\r
@@ -2222,11 +2264,13 @@ var Application = ( function(){
                                                return true;\r
                                        },\r
                                        destroy: function(){\r
+                                               this.clean();\r
                                                this.element[ 'on' + this.eventType ] = '';\r
                                                tmp.list.splice( Util.getIndex( tmp.list, this ), 1 );\r
                                                delete this.element;\r
                                                delete this.eventType;\r
                                                delete this.handlers;\r
+                                               delete this.clean;\r
                                        }\r
                                };\r
                        };\r
@@ -2860,18 +2904,26 @@ var KeyEvent = ( function(){
        }\r
 })();\r
 \r
+/**\r
+ * \r
+ * http://thudjs.tumblr.com/post/637855087/stylesheet-onload-or-lack-thereof
+ */\r
+\r
 var Css = ( function(){\r
        var head = doc.getElementsByTagName( 'head' )[ 0 ];\r
        \r
        var TICKET_LIST = [];\r
        var STATE_LIST  = 'loaded,complete,uninitialized'.split( ',' );\r
        \r
+       var cssRules, sheet;\r
+       \r
        var FetchCssTicketClass = function( _apiuser, _url, _elm, _onload, _onerror ){\r
                this.apiusers = [ _apiuser ];\r
                this.url      = _url;\r
                this.elm      = _elm;\r
                this.onload   = [ _onload ];\r
                this.onerror  = [ _onerror ];\r
+               this.time     = 0;\r
        };\r
        FetchCssTicketClass.prototype = {\r
                match: function( _apiuser, _url ){\r
@@ -2899,9 +2951,32 @@ var Css = ( function(){
                        delete this.elm;\r
                        delete this.onload;\r
                        delete this.onerror;\r
+                       delete this.time;\r
                        \r
                        return true;\r
                },\r
+               loaded: function(){\r
+               for( var i = this.onload.length, f; i; ){\r
+                       f = this.onload[ --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
+               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
+                       this.onload[ i ] = this.onerror[ i ] = null;\r
+               };\r
+               },\r
+               check: function(){\r
+                       var el = this.elm;\r
+                       try {\r
+                               return el[ sheet ] && el[ sheet ][ cssRules ].length > 0;\r
+                       } catch( e ){\r
+                               return false;\r
+                       };\r
+               },\r
                done: false\r
        };\r
        \r
@@ -2914,17 +2989,33 @@ var Css = ( function(){
        \r
        function detect(){\r
                var t = getTicket( this ), rs = this.readyState, c;\r
-               if( t && t.done === false && ( !rs ||  Util.getIndex( STATE_LIST, rs ) !== -1 ) ){\r
+               if( t && t.done === false && ( !rs || Util.getIndex( STATE_LIST, rs ) !== -1 ) ){\r
                        t.done = true;\r
-               for( var i = t.onload.length; i; ){\r
-                       c = t.onload[ --i ];\r
-                       Type.isFunction( c ) === true && AsyncCall.add( t.apiusers[ i ], c, t.url );\r
-               };\r
+               t.loaded();\r
                this.onreadystatechange = new Function();\r
                this.onload = null;\r
                };\r
        };\r
        \r
+       function checkTimer(){\r
+               var l = TICKET_LIST.length,\r
+                       n = 0;\r
+               for( var i = 0; i < l; ++i ){\r
+                       t = TICKET_LIST[ i ];\r
+                       ++t.time;\r
+                       if( t.check() === true ){\r
+                               t.loaded();\r
+                               ++n;\r
+                       } else\r
+                       if( t.time > 99 ){\r
+                               t.error();\r
+                       } else {\r
+                               \r
+                       };\r
+               };\r
+               l === n && SystemTimer.remove( SUPER_USER_KEY, checkTimer );\r
+       };\r
+       \r
        return {\r
                load: function( _apiuser, _url, opt_onload, opt_onerror ){\r
                        _url = Util.getAbsolutePath( _url );\r
@@ -2937,6 +3028,7 @@ var Css = ( function(){
                                                t.onload.push( opt_onload );\r
                                                t.onerror.push( opt_onerror );\r
                                        };\r
+                                       SystemTimer.add( SUPER_USER_KEY, checkTimer, 333 );\r
                                        return;\r
                                };\r
                        };\r
@@ -2947,7 +3039,18 @@ var Css = ( function(){
                        elm.onreadystatechange = elm.onload = detect;\r
                        elm.href = _url;\r
                        \r
+                       if( !sheet ){ // only assign these once\r
+                               cssRules = 'cssRules';\r
+                               sheet    = 'sheet';\r
+                               if ( !( sheet in elm ) ) { // MSIE uses non-standard property names\r
+                                       cssRules = 'rules';\r
+                                       sheet    = 'styleSheet';\r
+                               };\r
+                       };\r
+                       \r
                        TICKET_LIST.push( new FetchCssTicketClass( _apiuser, _url, elm, opt_onload, opt_onerror ) );\r
+                       \r
+                       SystemTimer.add( SUPER_USER_KEY, checkTimer, 333 );\r
                },\r
                unload: function( _apiuser, _url ){\r
                        _url = _url ? Util.getAbsolutePath( _url ) : null;\r
@@ -2959,6 +3062,9 @@ var Css = ( function(){
                                        ++i;\r
                                }\r
                        };\r
+                       if( TICKET_LIST.length === 0 ){\r
+                               SystemTimer.remove( SUPER_USER_KEY, checkTimer );\r
+                       }\r
                }\r
        }\r
 })();\r
@@ -3317,7 +3423,8 @@ var UI = ( function(){
                                                elmValue.data = _option.displayValue;\r
                                                if( focus === true ){\r
                                                        OptionControl.update( instance, _value );\r
-                                               }\r
+                                               };\r
+                                               Type.isFunction( onUpdate ) === true && onUpdate( _value );\r
                                                break;\r
                                        }\r
                                }\r
@@ -3466,9 +3573,9 @@ var UI = ( function(){
                                currentCombobox = _combobox;\r
                                elm             = _combobox.elm;\r
                                \r
-                               for( var i = _optionList.length; i; ){\r
-                                       OPTION_LIST.unshift( new OptionClass( _apiuser, _optionList[ --i ] ) );\r
-                               }\r
+                               for( var i = 0, l = _optionList.length; i<l; ++i ){\r
+                                       OPTION_LIST.unshift( new OptionClass( _apiuser, _optionList[ i ] ) );\r
+                               };\r
                                MouseEvent.add( SUPER_USER_KEY, doc, 'mouseup', bodyMouseupHandler );\r
                                KeyEvent.add( SUPER_USER_KEY, Const.KEY.EVENT.KEY_DOWN, change, 38 );\r
                                KeyEvent.add( SUPER_USER_KEY, Const.KEY.EVENT.KEY_DOWN, change, 40 );\r
@@ -3852,7 +3959,7 @@ var Finder = ( function(){
                        elmContainer.removeChild( ELM_WRAPPER );\r
                        file && file.destroy();\r
                        file = elmContainer = onDownCallback = onEditorCallback = onViewerCallback = onActionCallback = viewerList = editorList = null;\r
-                       FINDER_ICON_POOL.push( instansce);\r
+                       FINDER_ICON_POOL.push( instansce );\r
                };\r
        }\r
        function updateIconPosition( _style, _w, _index, _elm ){\r
@@ -3928,7 +4035,7 @@ var Finder = ( function(){
                        iconH            = size.height,\r
                        style            = 0,\r
                        w, h, bodyH,\r
-                       instance = this;\r
+                       instance         = this;\r
                        \r
                tree.addTreeEventListener( Const.TREE.EVENT.UPDATE, draw );\r
                elmRoot.appendChild( elmContainer );\r
@@ -3975,8 +4082,8 @@ var Finder = ( function(){
                        };\r
                };\r
                \r
-               function onHeadClick( i){\r
-                       var l = BREAD_ARRAY.length -1;\r
+               function onHeadClick( i ){\r
+                       var l = BREAD_ARRAY.length - 1;\r
                        if( i < l){\r
                                var _file = tree.getParentFileAt( i);\r
                                if( _file !== null){\r
@@ -3992,7 +4099,7 @@ var Finder = ( function(){
                                        tree.down( i );\r
                                        draw( w, h );\r
                                } else {\r
-                                       Type.isFunction( onSelect ) === true && onSelect( _file  );\r
+                                       Type.isFunction( onSelect ) === true && onSelect( _file );\r
                                };\r
                                _file.destroy();\r
                        };\r
@@ -4021,33 +4128,35 @@ var Finder = ( function(){
                        h = _h;\r
                        elmBody.style.height = ( _h - headH ) + 'px';\r
                        \r
-                       for( var i=0, l=ICON_ARRAY.length; i<l; ++i ){\r
-                               ICON_ARRAY[ i].onResize( _w );\r
-                       }\r
+                       for( var i = ICON_ARRAY.length; i; ){\r
+                               ICON_ARRAY[ --i ].onResize( _w );\r
+                       };\r
                };\r
                this.destroy = function(){\r
                        tree.removeTreeEventListener( Const.TREE.EVENT.UPDATE, draw );\r
                        \r
                        while( BREAD_ARRAY.length > 0 ){\r
                                BREAD_ARRAY.shift().destroy();\r
-                       }\r
+                       };\r
                        while( ICON_ARRAY.length > 0 ){\r
                                ICON_ARRAY.shift().destroy();\r
-                       }\r
+                       };\r
+                       \r
+                       FINDER_ARRAY.splice( Util.getIndex( FINDER_ARRAY, instance ), 1 );\r
                };\r
        };\r
        FinderClass.prototype = new AbstractBasicPane();\r
        \r
-       function getFinderIcon( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction){\r
+       function getFinderIcon( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction ){\r
                var _icon;\r
                if( FINDER_ICON_POOL.length > 0){\r
                        _icon = FINDER_ICON_POOL.shift();\r
                } else {\r
                        _icon = new FinderIconClass();\r
-               }\r
+               };\r
                _icon.init( _file, _elmContainer, w, index, style, onDown, onEditor, onViwer, onAction );\r
                return _icon;\r
-       }\r
+       };\r
        \r
        function getBreadcrumb( _file, _elmContainer, index, callback ){\r
                var _bread;\r
@@ -4055,10 +4164,10 @@ var Finder = ( function(){
                        _bread = BREAD_OBJECT_POOL.shift();\r
                } else {\r
                        _bread = new BreadcrumbClass();\r
-               }\r
+               };\r
                _bread.init( _file, _elmContainer, index, callback );\r
                return _bread;\r
-       }\r
+       };\r
 \r
        return {\r
                init: function(){\r
@@ -4086,7 +4195,7 @@ var Finder = ( function(){
                },\r
                isFinderHeadInstance: function(){\r
                }\r
-       }\r
+       };\r
 })();\r
 \r
 \r