if( !s.length ) return false; // Safari1.3 312.8 でerror\r
s = s[ s.length - 1 ];\r
// Dom0 || Dom1\r
- return ( s.parentElement || s.parentNode ).tagName.toLowerCase() === 'head';\r
+ s = s.parentElement || s.parentNode || s;// s is for opera7.11\r
+ return s.tagName.toLowerCase() === 'head';// opera7.23 s.tagName is 'HTML'\r
})( document.scripts || document.getElementsByTagName && document.getElementsByTagName( 'script' ) || document.all && document.all.tags( 'script' ) );\r
\r
X.parse = function( v ){\r
case 'true' : return true;\r
case 'false' : return false;\r
case 'Infinity' : return Number.POSITIVE_INFINITY;\r
- case '-Infinity' : return Number.NEGATIVE_INFINITY; \r
+ case '-Infinity' : return Number.NEGATIVE_INFINITY;\r
case 'undefined' : return;\r
};\r
_v = v.split( ' ' ).join( '' );\r
i !== -1 ? parseFloat( dua.substr( i + 6 ) ) : 0,\r
j !== -1 ? parseFloat( dua.substr( j + 8 ) ) : 0,\r
tv );\r
+ acme.Opera7 = acme.Opera < 8;\r
acme.OperaMini = 0 < dua.indexOf("Opera Mini");\r
acme.OperaMobile = 0 < dua.indexOf("Opera Mobi");\r
acme.OperaTablet = 0 < dua.indexOf("Opera Tablet");\r
\r
// Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\r
if( document.all ){\r
- acme.ActiveX = !!window[ 'ActiveXObject' ];\r
- acme.IE = parseFloat(dav.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || 0;\r
- acme.MacIE = !!dav.indexOf( 'Mac_PowerPC' ) || !!dav.indexOf( 'Mac_PPC' ) || !!dav.indexOf( 'Mac_68K' );\r
+ acme.ActiveX = !!window[ 'ActiveXObject' ];\r
+ acme.IE = document.documentMode || parseFloat(dav.split("MSIE ")[1]) || parseFloat(dua.split("rv:")[1]) || 0;\r
+ acme.MacIE = dav.indexOf( 'Mac_PowerPC' ) !== -1 || dav.indexOf( 'Mac_PPC' ) !== -1 || dav.indexOf( 'Mac_68K' ) !== -1;\r
acme.IEMobile = dua.toLowerCase().indexOf( 'iemobile' ) !== -1 ||\r
- dua.toLowerCase().indexOf( 'windows phone' ) !== -1; \r
+ dua.toLowerCase().indexOf( 'windows phone' ) !== -1;\r
return acme;\r
};\r
\r
\r
return acme;\r
})( navigator );\r
-/* ie5 でerror...\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
- name += ''; // 数値も許可\r
- for( p in obj ){\r
- if( p === name ) return true;\r
- };\r
- return false;\r
- }) :\r
- new Function( 'a,b', 'return a in b' ); \r
\r
// Safari 3.1 未満は開発コンソールがない!\r
// http://shimax.cocolog-nifty.com/search/2006/09/safarijavascrip_c54d.html\r
if( X.UA.IE && X.UA.IE < 7 ){ // error @ NN7.2\r
// bonus: hotfix for IE6 SP1 (bug KB823727)\r
document.execCommand && document.execCommand( 'BackgroundImageCache', false, true );\r
-};*/\r
+};\r
+\r
+X.inObject = X.UA.IE && X.UA.IE < 5.5 ? // TODO JScript で判定\r
+ (function( name, obj ){\r
+ var p;\r
+ if( obj[ name ] ) return true;\r
+ name += ''; // 数値も許可\r
+ for( p in obj ){\r
+ if( p === name ) return true;\r
+ };\r
+ return false;\r
+ }) :\r
+ new Function( 'a,b', 'return a in b' );// なぜか ie5 でもerror\r
timerId : 0,\r
endTime : 0, // iOS\r
next : 0,\r
+ busy : false, // for Opera7\r
\r
REQUEST_FRAME_LIST : [],\r
requestID : 0,\r
list = X.Timer.TICKET_LIST,\r
i = list.length,\r
q, f, c;\r
+ \r
+ if( X.Timer.busy ){\r
+ alert( 'busy!' );\r
+ };\r
+ \r
+ X.Timer.busy = true;\r
+ \r
for( ; i; ){\r
q = list[ --i ];\r
if( 0 < ( q.l -= next ) ) continue;\r
q.l = q.t;\r
};\r
X.Timer.timerId = 0;\r
- X.Timer._update();\r
+ X.Timer.busy = false;\r
+ X.Timer._update(); \r
},\r
_update : function(){\r
var list = X.Timer.TICKET_LIST,\r
add : function( time, opt_count, args1, args2, args3 ){\r
var list = X.Timer.TICKET_LIST;\r
time = time < X.Timer.INTERVAL_TIME ? 1 : ( time / X.Timer.INTERVAL_TIME ) | 0; // 正の数で使える「Math.floor(x)」を「(x | 0)」に;\r
-\r
+ \r
if( typeof opt_count !== 'number' ){\r
args3 = args2;\r
args2 = args1;\r
f : X.Callback.create( args1, args2, args3 ),\r
u : ++X.Timer.uid\r
};\r
- X.Timer._update();\r
+ !X.Timer.busy && X.Timer._update();\r
return X.Timer.uid;\r
},\r
once : function( time, args1, args2, args3 ){\r
list.splice( i, 1 );\r
f = q.f;\r
f.kill && f.kill();\r
- ( /* q[ INDEX_COUNT ] <= next || */ l === 1 ) && X.Timer._update();\r
+ !X.Timer.busy && ( /* q[ INDEX_COUNT ] <= next || */ l === 1 ) && X.Timer._update();\r
//q.length = 0;\r
break;\r
};\r
\r
X.Dom.listenOnce( X.Dom.Event.DOM_BUILDER_COMPLETE, function(){\r
X.Dom.readyState = X.Dom.Event.DOM_INIT;\r
- \r
+ //X.UA.Opera7 && alert( 'bc' );\r
Node.root.appendAt( 0,\r
Node._systemNode = Node.create( 'div', { 'class' : 'hidden-system-node' } ),\r
Node._fontSizeNode = Node.create( 'div', { 'class' : 'hidden-system-node' } ).cssText( 'line-height:1;height:1em;' ).text( 'X' )\r
Node._document.listen( 'webkitvisibilitychange', X.Dom );\r
} else\r
if( X.UA.iOS && window[ 'onpageshow' ] !== undefined ) {\r
- Node._window.listen('pageshow', X.Dom );\r
- Node._window.listen('pagehide', X.Dom );\r
+ Node._window.listen( 'pageshow', X.Dom )\r
+ .listen( 'pagehide', X.Dom ); \r
} else {\r
- Node._window.listen('focus', X.Dom );\r
- Node._window.listen('blur', X.Dom );\r
+ Node._window.listen( 'focus', X.Dom )\r
+ .listen( 'blur', X.Dom );\r
};\r
\r
return X.Callback.UN_LISTEN;\r
/*\r
* Node( rawElement | rawTextnode | htmlString | textString )\r
*/\r
-//;(function( window, document, undeifned ){\r
+\r
X.Dom.Node = X.EventDispatcher.inherits(\r
'XDomNode',\r
X.Class.POOL_OBJECT,\r
\r
_attrs : null, // X.Dom.Attr\r
_newAttrs : null,\r
- _attrText : ' ', // X.Dom.Attr.objToAttrText が必要な場合は false が入っている\r
+ _attrText : '', // X.Dom.Attr.objToAttrText が必要な場合は false が入っている\r
\r
_css : null, // X.Dom.Style\r
_cssText : null,\r
Node.IS_DOCUMENT = 9;\r
Node.IS_IMAGE = 10;\r
\r
-Node._useDocumentFragment = document.createDocumentFragment && ( !X.UA.IE || 6 <= X.UA.IE ) && document.createDocumentFragment();\r
+Node._useDocumentFragment = document.createDocumentFragment && ( !X.UA.IE || 5.5 <= X.UA.IE ) && document.createDocumentFragment();\r
\r
Node._getType = function( v ){\r
if( v === '' ) return Node.IS_STRING;\r
'<', this._tag,\r
this._id ? ' id="' + this._id + q : _,\r
this._className ? ' class="' + this._className + q : _,\r
- this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
+ this._attrText === false ? ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ) : this._attrText,\r
this._cssText ? ' style="' + this._cssText + q : _,\r
'>' ];\r
\r
\r
tmp = this._rawNode.style.visibility;\r
//this._rawNode.style.visibility = 'hidden';\r
- \r
+\r
if( i = removal.length ){\r
for( ; i; ){\r
xnode = removal[ --i ];\r
};\r
removal.length = 0;\r
};\r
- \r
+\r
Node._html._dirty ? Node._html._commitUpdate() : this._commitUpdate();\r
\r
X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.AFTER_UPDATE ] && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.AFTER_UPDATE } );\r
};\r
// id\r
if( this._dirty & X.Dom.Dirty.ID ){\r
- //if( X.UA.IE && X.UA.IE < 7 ){\r
- this._id ? ( elm.id = this._id ) : ( elm.id && elm.removeAttribute( 'id' ) ); \r
- //} else {\r
- // this._id ? ( elm.id = this._id ) : elm.removeAttribute( 'id' ); \r
- //};\r
+ this._id ? ( elm.id = this._id ) : ( elm.id && elm.removeAttribute( 'id' ) ); \r
};\r
// className\r
if( this._dirty & X.Dom.Dirty.CLASSNAME ){\r
- //if( X.UA.IE && X.UA.IE < 8 ){\r
- //elm.className = this._className;\r
+ this._className ? ( elm.className = this._className ) : ( elm.className && elm.removeAttribute( 'class' ) ); \r
\r
- //} else {\r
- this._className ? ( elm.className = this._className ) : ( elm.className && elm.removeAttribute( 'class' ) ); \r
- //};\r
- // ie5 only\r
- if( X.Dom.State.IE5_DISPLAY_NONE_FIX && elm.currentStyle.display === 'none' ){\r
- this._actualRemove();\r
- this._state |= X.Dom.State.IE5_DISPLAY_NONE_FIX;\r
- return;\r
- };\r
+ // ie5 only\r
+ if( X.Dom.State.IE5_DISPLAY_NONE_FIX && elm.currentStyle.display === 'none' ){\r
+ this._actualRemove();\r
+ this._state |= X.Dom.State.IE5_DISPLAY_NONE_FIX;\r
+ return;\r
+ };\r
};\r
// style\r
if( this._dirty & X.Dom.Dirty.CSS ){\r
- if( this._cssText || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
+ if( this._cssText !== null || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
X.UA.Opera && X.UA.Opera < 9 ?\r
elm.setAttribute( 'style', this._cssText ) : // opera8用\r
( elm.style.cssText = this._cssText );\r
};\r
// style\r
if( this._dirty & X.Dom.Dirty.CSS ){\r
- if( this._cssText || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
+ if( this._cssText !== null || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
elm.style.cssText = this._cssText;\r
} else {\r
elm.style.cssText = '';\r
' UID="', this._uid, '"',\r
this._id ? ' id="' + this._id + '"' : '',\r
this._className ? ' class="' + this._className + '"' : '',\r
- this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
+ this._attrText === false ? ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ) : this._attrText,\r
this._cssText ? ' style="' + this._cssText + '"' : '',\r
'>' ].join( '' ) ) :\r
document.createElement( this._tag );\r
html = [\r
'<', this._tag, ' id=', ( this._id || ( 'ie4uid' + uid ) ), ' UID="', uid, '"',\r
this._className ? ' class="' + this._className + '"' : '',\r
- this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
+ this._attrText === false ? ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ) : this._attrText,\r
this._cssText ? ' style="' + this._cssText + '"' : '',\r
'>' ];\r
\r
Node.prototype._afterActualCreate =\r
X.Dom.DOM_W3C ? (function(){\r
var elm = this._rawNode, xnodes, l, attrs, k, i;\r
- \r
+ if( !this.parent ){\r
+ alert( 'afterActualCreate : ' + this._tag );\r
+ };\r
this._root = this.parent._root;\r
\r
if( this._xnodeType === 3 ){\r
elm.appendChild( xnodes[ i ]._actualCreate( true ) );\r
};\r
};\r
- //if( X.UA.IE && X.UA.IE < 5.5 ){\r
- // this._dirty = X.Dom.Dirty.CSS | X.Dom.Dirty.IE_FILTER;\r
- // this._updateRawNode( elm );\r
- //} else\r
if( !X.Dom._strictElmCreation ){\r
elm.UID = this._uid;\r
this._newAttrs = this._attrs;\r
if( !elm ) return;\r
this._xnodeType === 1 && this._migrateEvent();// イベントの退避\r
// elm.parentNode.tagName for ie7\r
- !isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
+ //if( !X.UA.Opera7 ){\r
+ !isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
+ //} else {\r
+ // !isChild && elm.parentNode && X.Dom._o7_remove( elm );\r
+ //};\r
}) :\r
X.Dom.DOM_IE4 ?\r
( function( isChild ){\r
delete this._rawNode;\r
}) :\r
(function(){});\r
- \r
- \r
-//})( window, document );\r
-\r
-\r
-\r
\r
raw.addEventListener( type, this._handleEvent, false );\r
};\r
}) :\r
+ X.Dom.EVENT_W3C && X.UA.Opera7 ?\r
+ (function( type ){\r
+ var raw = this._rawNode;\r
+ if( !raw ) return;\r
+ this._handleEvent = this._handleEvent || X.Callback.create( this );\r
+ if( raw === window ){\r
+ raw[ 'on' + type ] = this._handleEvent;\r
+ } else {\r
+ raw.addEventListener( type, this._handleEvent, false );\r
+ };\r
+ }) :\r
X.Dom.EVENT_W3C ?\r
(function( type ){\r
this._rawNode && this._rawNode.addEventListener( X.Dom.Event.Rename[ type ] || type, this, false );\r
delete this._handleEvent;\r
};\r
}) :\r
+ X.Dom.EVENT_W3C && X.UA.Opera7 ?\r
+ (function( type ){\r
+ var raw = this._rawNode;\r
+ if( !raw ) return;\r
+ \r
+ if( raw === window ){\r
+ raw[ 'on' + type ] = null;\r
+ } else {\r
+ raw.removeEventListener( type, this._handleEvent, false );\r
+ };\r
+ if( !this._listeners ){\r
+ X.Callback._correct( this._handleEvent );\r
+ delete this._handleEvent;\r
+ };\r
+ }) :\r
X.Dom.EVENT_W3C ?\r
(function( type ){\r
var elm = this._rawNode;\r
if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return X.Dom._init();\r
});\r
};\r
- /* for other browsers */\r
- Node._window.listenOnce( 'load', X.Dom._init ); \r
-\r
-\r
\r
+/* for other browsers */\r
+Node._window.listenOnce( 'load', X.Dom._init );\r
\r
//\r
X.Dom.listenOnce( X.Dom.Event.XDOM_READY, function(e){\r
objToAttrText : function( obj ){\r
var noValue = X.Dom.Attr.noValue,\r
attrs = [ '' ], n = 0, p, v;\r
+ if( !obj ) return ''; // Opera7\r
for( p in obj ){\r
v = obj[ p ];\r
if( p === 'value' ){\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
SPECIAL_FIX = me.SPECIAL_FIX,
n = -1,
p, name, sp;
+ if( !obj ) return ''; // Opera7.5 未満?
for( p in obj ){
name = uncamelize( p );
if( FIX_PROP[ name ] ){
\r
/*@+debug[*/\r
if( X.Dom.readyState < X.Dom.Event.XDOM_READY ){\r
- alert( 'not ready! X.Dom.listen( X.Dom.Event.XDOM_READY, callback )' );\r
+ alert( 'not ready! use X.Dom.listenOnce( X.Dom.Event.XDOM_READY, callback )' );\r
return;\r
};\r
/*]@+debug*/\r
\r
X.Dom._useBuilder = true;\r
\r
+X.Dom._isCleanupTarget = function( elm ){\r
+ var cname = ' ' + elm.className + ' ',\r
+ tag = ( elm.tagName || '' ).toUpperCase();\r
+ return cname.indexOf( ' skip-cleanup ' ) === -1 &&\r
+ ( X.Dom.cleanupTagNames[ tag ] || 0 < cname.indexOf( ' cleanup-target ' ) );\r
+};\r
+\r
+X.Dom._o7_remove = function( node ){\r
+ var parent = node.parentNode;\r
+ if( node.nodeType === 1 || node.nodeType === 3 ){\r
+ parent && parent.removeChild( node );\r
+ } else {\r
+ node.data = '';\r
+ };\r
+};\r
+\r
/* --------------------------------------\r
* 通常のwebページに対して使用する場合、dom ready で dom tree を写し取るために使う.\r
* 完全にワンページアプリで<body/>が空な場合、このコードはビルドに含める必要はない\r
elmProgress;\r
// TODO\r
// textarea の内容を控えて、消す。xnode tree 構築後に復帰。でないと、html パースでこける\r
- \r
+\r
// cleanup tree \r
X.UA.MacIE || (function/*cleanUpTree*/( elm, skip, head ){\r
var nodes = X.copyArray( elm.childNodes ),\r
break;\r
case 3 :\r
content = skip ? node.data : X.Dom.cleanupWhiteSpace( node.data );\r
- //console.log( 'Delete space ' + node.data.length + ' => ' + content.length );\r
+ //console.log( 'Delete space ' + node.data.length + ' => ' + content.length ); \r
if( !textNode && content !== ' ' && content.length ){\r
node.data = content;\r
textNode = node;\r
// ブロック要素直下のスペースだけは削除??\r
default :\r
//console.log( 'Remove type: ' + node.nodeType + ' value: ' + node.nodeValue );\r
- elm.removeChild( node );\r
+ if( !X.UA.Opera7 ){\r
+ elm.removeChild( node );\r
+ } else {\r
+ X.Dom._o7_remove( node );\r
+ };\r
//++count;\r
};\r
};\r
})( body );\r
- \r
+\r
// body の属性値の取得\r
html = body.innerHTML;\r
\r
.listenOnce( X.Event.SUCCESS, function( e ){\r
var xnodes = Node.root._xnodes = [], t;\r
xnodes.push.apply( xnodes, e.xnodes );\r
- \r
+ elmProgress.style.width = '100%';\r
+\r
X.Dom._asyncCreateTree( Node.root, body.childNodes, elmProgress );\r
} );\r
\r
function( e ){\r
var xnodes = Node.root._xnodes = [], t;\r
xnodes.push.apply( xnodes, e.xnodes );\r
+ elmProgress.style.width = '100%';\r
\r
X.Dom._asyncCreateTree( Node.root, body.childNodes || body.children, elmProgress );\r
}\r
flag : 0\r
},\r
xnode, i, dive;\r
+ //alert( 'X.Dom._asyncCreateTree' );\r
while( current || ( current = stack.pop() ) ){\r
i = current.i;\r
l = current.l;\r
async.current = i < l && current;\r
async.done = done;\r
};\r
+ //alert( 'koko?' );\r
X.Timer.once( 0, X.Dom._asyncCreateTree, [ null, null, elmProgress, async || { stack : stack, current : i < l && current, done : done } ] );\r
// progress\r
elmProgress.style.width = ( ( 1 - done / Node._chashe.length ) * 100 | 0 ) + '%';\r
elm = elems[ current.j ];\r
tag = elm.tagName && elm.tagName.toUpperCase();\r
if( ( elm.nodeType !== 1 && elm.nodeType !== 3 ) || tag === '!' || ( tag && tag.charAt( 0 ) === '/' ) ){\r
- elm.parentNode.removeChild( elm );\r
+ if( !X.UA.Opera7 ){\r
+ elm.parentNode.removeChild( elm );\r
+ } else {\r
+ X.Dom._o7_remove( elm );\r
+ };\r
continue;\r
};\r
\r
if( xnode._xnodeType === 1 ){\r
if( elm.nodeType === 3 ){\r
- //if( !( text = elm.data ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
- // elm.parentNode.removeChild( elm );\r
- // continue;\r
- //};\r
- alert( '[' +parent._tag + '>' +xnode._tag + '] !== ' + elm.nodeType + '\n' + elm.data );\r
+ if( !( text = elm.data ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
+ //alert( text.charCodeAt( 0 ) );\r
+ if( !X.UA.Opera7 ){\r
+ elm.parentNode.removeChild( elm );\r
+ } else {\r
+ X.Dom._o7_remove( elm );\r
+ };\r
+ continue;\r
+ };\r
+ alert( '1:[' +parent._tag + '>' +xnode._tag + '] !== ' + elm.nodeType + '\n' + ( elm.data ) );\r
} else\r
if( xnode._tag !== tag ){\r
- alert( '[' +parent._tag + '>' +xnode._tag + ' ' + (xnode._xnodes ? xnode._xnodes.length : '' ) + '] !== ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + '\n' + elm.outerHTML );\r
+ alert( '2:[' +parent._tag + '>' +xnode._tag + ' len:' + (xnode._xnodes ? xnode._xnodes.length : '' ) + '] !== ' + tag + ' ' + (elm.childNodes ? elm.childNodes.length : '' ) + '\n' + elm.outerHTML );\r
} else {\r
xnode._rawNode = elm;\r
//if( ( doc = elm.ownerDocument || elm.document ) && ( doc.createElement( 'p' ).tagName === doc.createElement( 'P' ).tagName ) ){\r