return acme;\r
};\r
\r
- if( i = dua.indexOf( 'NetFront\/' ) ){\r
+ if( ( i = dua.indexOf( 'NetFront\/' ) !== -1 ) ){\r
acme.NetFront = parseFloat( dua.substr( i + 9 ) ) || 0;\r
return acme;\r
};\r
acme.Khtml = ( dav.indexOf("Konqueror") >= 0 ) ? tv : undefined;\r
acme.WebKit = parseFloat(dua.split("WebKit\/")[1]) || undefined;\r
acme.Chrome = parseFloat(dua.split("Chrome\/")[1]) || undefined;\r
- // replace( reg, ) don't work for Sigmarion2 pocketIE\r
- acme.Gecko = eval( '(navigator.userAgent.indexOf("Gecko\/") >= 0) ? parseFloat(navigator.userAgent.split("rv:")[1].replace( /^(\d*\.\d*)\.(\d*)/, "$1$2" )) : undefined' );\r
i = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);\r
if( i && !acme.Chrome ){\r
acme.Safari = parseFloat( dav.split("Version/")[1] );\r
return acme;\r
})( navigator );\r
\r
-X.inObject = X.UA.IE && X.UA.IE < 5 ?\r
+X.inObject = X.UA.IE && X.UA.IE < 5 ? // TODO JScript で判定\r
(function( name, obj ){\r
var p;\r
if( obj[ name ] ) return true;\r
\r
// Safari 3.1 未満は開発コンソールがない!\r
// http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
+/*@+debug[*/\r
if( X.UA.Safari && X.UA.WebKit < 525.13 ){ \r
window.onerror = function( x, y, z ){\r
var n = String.fromCharCode( 10 );\r
return true;\r
};\r
};\r
+/*]@+debug*/\r
\r
if( X.UA.IE && X.UA.IE < 7 ){ // error @ NN7.2\r
// bonus: hotfix for IE6 SP1 (bug KB823727)\r
klass = new Function( 'var a=arguments,f=a.callee;if(f.__new)return f.__new(a)' );\r
klass.__new = C;\r
if( X.UA.Safari && X.UA.Safari < 2 ){\r
+ // Safari では、prototype の差し替えができない, 1.3 で確認\r
+ // あとから super class にプロパティを足しても、sub に伝播しない、、、\r
traits && X.Class._override( klass.prototype, traits, false );\r
X.Class._override( X.Class._override( klass.prototype, CommonProps, false ), props, true );\r
} else {\r
type = e.type,\r
unlistens, i, l, f, r, sysOnly;\r
\r
+ if( !list ) return ret;\r
+ \r
// 数値, 文字が渡された場合\r
if( !type ) e = { type : type = e };\r
e.target = e.target || this;\r
\r
- if( !list || !( list = list[ type ] ) ) return ret;\r
+ if( !( list = list[ type ] ) ) return ret;\r
\r
++this._dispatching;\r
\r
\r
for( i = 0; i < list.length; ++i ){\r
f = list[ i ];\r
+ if( !unlistens ){\r
+ unlistens = this._unlistens[ type ];\r
+ };\r
if( unlistens && unlistens.indexOf( f ) !== -1 ) continue;\r
\r
- r = typeof f === 'function' ? f( e ) : f.handleEvent( e );\r
+ r = typeof f === 'function' ? f( e ) : f.handleEvent( e ); // dispatch 中に unlisten が作られることがある\r
\r
- if( f.once === true || r & X.Callback.UN_LISTEN ){\r
- unlistens ?\r
- ( unlistens[ unlistens.length ] = f ) :\r
- ( unlistens = this._unlistens[ type ] = [ f ] );\r
+ if( f.once || r & X.Callback.UN_LISTEN ){\r
+ if( !unlistens ){\r
+ unlistens = this._unlistens || ( this._unlistens = {} );\r
+ unlistens = unlistens[ type ] || ( unlistens[ type ] = [] );\r
+ };\r
+ unlistens.indexOf( f ) === -1 && ( unlistens[ unlistens.length ] = f );\r
};\r
\r
if( r & X.Callback.STOP_NOW ){\r
for( i = list.length; i; ){\r
this.unlisten( type, list[ --i ] );\r
};\r
- unlistens.length = 0;\r
+ list.length = 0;\r
+ delete unlistens[ type ];\r
};\r
\r
if( this._killReserved ){\r
_init : function(){\r
var s, size, h, r;\r
if( X.Dom.Event.DOM_PRE_INIT <= X.Dom.readyState ) return X.Callback.UN_LISTEN;\r
- if( s = X.Dom._script ){\r
- s.parentNode.removeChild( s );\r
- s.onreadystatechange = X.emptyFunction;\r
- s.onreadystatechange = null;\r
- delete X.Dom._script;\r
- };\r
delete X.Dom._init;\r
X.Dom.readyState = X.Dom.Event.DOM_PRE_INIT;\r
\r
_getSize :\r
X.UA.IE ?\r
new Function( 'return[X.Dom._root.clientWidth,X.Dom._root.clientHeight]' ) :\r
+\r
new Function( 'return[window.innerWidth,window.innerHeight]' ),\r
\r
getSize : function(){\r
// Safari2.0.4では標準・互換どちらも document.body\r
\r
Node.root._updateTimerID && Node.root._startUpdate();\r
- \r
+ /*X.UA.Opera ?\r
+ ( document.documentElement && document.documentElement.clientWidth ?\r
+ new Function( 'return[document.documentElement.clientWidth,document.documentElement.clientHeight]' ) :\r
+ new Function( 'return[document.body.clientWidth,document.body.clientHeight]' )\r
+ ) :*/ \r
return [\r
X.Dom._root.scrollWidth || X.Dom._root.offsetWidth,\r
X.Dom._root.scrollHeight || X.Dom._root.offsetHeight\r
\r
_attrs : null, // X.Dom.Attr\r
_newAttrs : null,\r
- _attrText : '',\r
+ _attrText : ' ', // X.Dom.Attr.objToAttrText が必要な場合は false が入っている\r
\r
_css : null, // X.Dom.Style\r
_cssText : null,\r
document.write( "<script id=__ie_onload defer src=javascript:void(0)><\/script>" );\r
X.Dom._script = document.getElementById( "__ie_onload" );\r
X.Dom._script.onreadystatechange = function(){\r
- this.readyState === 'complete' && X.Dom._init();\r
+ var s = X.Dom._script;\r
+ if( s && this.readyState === 'complete' ){\r
+ s.onreadystatechange = X.emptyFunction;\r
+ s.onreadystatechange = null;\r
+ s.parentNode.removeChild( s );\r
+ delete X.Dom._script;\r
+ X.Dom._init && X.Dom._init();\r
+ };\r
};\r
} else\r
// Re: onLoad doesn't work with Safari?\r
X.Dom.Attr = {\r
- toName : [],\r
- toIndex : {\r
- id : 0,\r
- className : 1,\r
- 'class' : 1, //\r
- name : 2,\r
- title : 3,\r
- accessKey : 4,\r
- accesskey : 4, //\r
- tabIndex : 5,\r
- tabindex : 5, //\r
- dir : 6,\r
- lang : 7,\r
- 'xml:lang' : 8,\r
- 'xml:space' : 9,\r
- abbr : 10,\r
- accept : 11,\r
- acceptCharset : 12,\r
- 'accept-charset' : 12,\r
- action : 13,\r
- align : 14,\r
- alink : 15,\r
- alt : 16,\r
- archive : 17,\r
- axis : 18,\r
- background : 19,\r
- bgColor : 20,\r
- bgcolor : 20, //\r
- border : 21,\r
- cellPadding : 22,\r
- cellpadding : 22, //\r
- cellSpacing : 23,\r
- cellspacing : 23, //\r
- ch : 24,\r
- 'char' : 24, //\r
- chOff : 25,\r
- charoff : 25, //\r
- charset : 26,\r
- checked : 27,\r
- cite : 28,\r
- classid : 29,\r
- clear : 30,\r
- code : 31,\r
- codeBase : 32,\r
- codebase : 32, //\r
- codeType : 33,\r
- codetype : 33, //\r
- color : 34,\r
- cols : 35,\r
- colspan : 36,\r
- colSpan : 36,\r
- compact : 37,\r
- content : 38,\r
- coords : 39,\r
- data : 40,\r
- dateTime : 41,\r
- datetime : 41, //\r
- declare : 42,\r
- defer : 43,\r
- disabled : 44,\r
- enctype : 45,\r
- face : 46,\r
- htmlFor : 47,\r
- 'for' : 47, //\r
- frame : 48,\r
- frameBorder : 49,\r
- frameborder : 49, //\r
- headers : 50,\r
- height : 51,\r
- href : 52,\r
- hreflang : 53,\r
- hspace : 54,\r
- httpEquiv : 55,\r
- 'http-equiv' : 55, //\r
- ismap : 56,\r
- isMap : 56,\r
- label : 57,\r
- language : 58,\r
- longDesc : 59,\r
- longdesc : 59, //\r
- marginheight : 60,\r
- marginwidth : 61,\r
- maxLength : 62,\r
- maxlength : 62, //\r
- media : 63,\r
- method : 64,\r
- multiple : 65,\r
- noHref : 66,\r
- nohref : 66,\r
- noresize : 67,\r
- noshade : 68,\r
- nowrap : 69,\r
- object : 71,\r
- profile : 72,\r
- prompt : 73,\r
- readOnly : 74,\r
- readonly : 74,\r
- rel : 75,\r
- rev : 76,\r
- rows : 77,\r
- rowspan : 78,\r
- rowSpan : 78,\r
- rules : 79,\r
- scheme : 80,\r
- scope : 81,\r
- scrolling : 82,\r
- selected : 83,\r
- shape : 84,\r
- size : 85,\r
- span : 86,\r
- src : 87,\r
- standby : 88,\r
- start : 89,\r
- summary : 90,\r
- target : 91,\r
- text : 92,\r
- type : 93,\r
- useMap : 94,\r
- usemap : 94,\r
- valign : 95,\r
- value : 96,\r
- valueType : 97,\r
- valuetype : 97,\r
- version : 98,\r
- vlink : 99,\r
- vspace : 100,\r
- width : 101,\r
- wrap : 102,\r
- xmlns : 103\r
- },\r
noValue : {\r
checked : 1,\r
compact : 1,\r
};\r
attrs[ ++n ] = noValue[ p ] ? p : [ p, '="', v, '"' ].join( '' );\r
};\r
- return 0 < n ? attrs.join( ' ' ) : '';\r
+ return 0 < n ? attrs.join( ' ' ) : ' ';\r
}\r
};\r
\r
-(function( toIndex, toName, renameForDOM, renameForTag ){\r
+(function( renameForDOM, renameForTag ){\r
var name, i;\r
- for( name in toIndex ){\r
- if( typeof ( i = toIndex[ name ] ) === 'number' ){\r
- toName[ i ] = name;\r
- };\r
- };\r
for( name in renameForDOM ){\r
renameForTag[ renameForDOM[ name ] ] = name;\r
};\r
-})( X.Dom.Attr.toIndex, X.Dom.Attr.toName, X.Dom.Attr.renameForDOM, X.Dom.Attr.renameForTag );\r
+})( X.Dom.Attr.renameForDOM, X.Dom.Attr.renameForTag );\r
\r
\r
\r
if( this._setAttr( attrs, newAttrs, p, nameOrObj[ p ] ) === true ) f = true;\r
};\r
if( f ){\r
- delete this._attrText;\r
+ this._attrText = false;\r
this._dirty |= X.Dom.Dirty.ATTR;\r
this._root && this._reserveUpdate(); \r
};\r
if( 1 < arguments.length ){\r
// setter\r
if( this._setAttr( attrs || ( this._attrs = {} ), this._newAttrs || ( this._newAttrs = {} ), nameOrObj, arguments[ 1 ] ) === true ){\r
- delete this._attrText;\r
+ this._attrText = false;\r
this._dirty |= X.Dom.Dirty.ATTR;\r
this._root && this._reserveUpdate();\r
};\r
tag === 'INPUT' && (\r
!xnode._attrs ?\r
( xnode._attrs = { type : 'text' } ) :\r
- !xnode._attrs.type || ( xnode._attrs.type = 'text' )\r
+ xnode._attrs.type || ( xnode._attrs.type = 'text' )\r
);\r
current.flag |= 3;\r
current.xtext = null;\r