/*\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
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
};\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
};\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
delete this.handler;\r
delete this.destroy;\r
};\r
- }\r
+ };\r
} else {\r
wrappedEventClass = function( e, element ){\r
this._event = e;\r
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
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
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
}\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
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
\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
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
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
++i;\r
}\r
};\r
+ if( TICKET_LIST.length === 0 ){\r
+ SystemTimer.remove( SUPER_USER_KEY, checkTimer );\r
+ }\r
}\r
}\r
})();\r
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
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
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
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
};\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
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
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
_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
},\r
isFinderHeadInstance: function(){\r
}\r
- }\r
+ };\r
})();\r
\r
\r