requestFrame : function( args1, args2, args3 ){\r
var i = REQUEST_FRAME_LIST.length,\r
f;\r
- i === 0 && ( requestID = ( enterFrame ? enterFrame( onEnterFrame ) : X.Timer.add( 16, 1, onEnterFrame ) ) );\r
+ i === 0 && ( requestID = ( enterFrame ? enterFrame( onEnterFrame ) : X.Timer.add( 0, 1, onEnterFrame ) ) );\r
f = REQUEST_FRAME_LIST[ i ] = X.Callback.create( args1, args2, args3 );\r
return f.uid = ++uid;\r
},\r
},\r
unlisten : function( type, arg1, arg2, arg3 ){\r
var list = this._listeners,\r
- _list, reservess, unlistens, i, f;\r
+ _list, reserves, unlistens, i, f;\r
if( !list ) return this;\r
if( type === undefined ){\r
// 全て削除\r
\r
X.Dom.DTD = {\r
EMPTY : {area:1,base:1,basefont:1,br:1,col:1,frame:1,hr:1,img:1,input:1,isindex:1,link:1,meta:1,param:1,embed:1 },//,\r
+ \r
+ TAG_FIX :\r
+ X.UA.IE && 4 <= X.UA.IE && X.UA.IE < 5 ?\r
+ { CITE : 'U', ABBR : 'U' } :\r
+ X.UA.IE && 5 <= X.UA.IE && X.UA.IE < 7 ?\r
+ { abbr : 'span' } :\r
+ {},\r
+ \r
// video:1,audio:1}\r
ATTR_VAL_IS_URI : 'action,archive,background,cite,classid,codebase,data,href,longdesc,profile,src,usemap'.split( ',' )\r
};\r
+\r
+\r
* className, addClass, removeClass, hasClass\r
*/\r
Node.prototype.className = function( v ){\r
- var node;\r
+ var node, _, __;\r
// getter\r
if( v === undefined ) return this._className;\r
+ \r
// setter\r
if( this._className === v ) return this;\r
if( !v || typeof v !== 'string' ){\r
delete this._className;\r
} else {\r
- this._className = v; \r
+ // cleanup\r
+ _ = ' ';\r
+ __ = ' ';\r
+ while( v.indexOf( __ ) !== -1 ){ v = v.split( __ ).join( _ ); };\r
+ v.charAt( 0 ) === _ && ( v = v.substr( 1 ) );\r
+ v.lastIndexOf( _ ) === 0 && ( v = v.substr( 0, v.length - 1 ) );\r
+ \r
+ if( this._className === v ) return this;\r
+ v ? ( this._className = v ) : delete this._className;\r
};\r
this._dirty |= X.Dom.Dirty.CLASSNAME;\r
this._root && this._reserveUpdate();\r
/* --------------------------------------\r
* html, text\r
*/\r
-Node.prototype.html = function( html, opt_outer ){\r
+Node.prototype.html = function( html ){\r
var _ = '', xnodes, n, i, l;\r
// setter\r
- if( html ){\r
+ if( html || html === '' ){\r
if( this._xnodeType === 3 ){\r
if( this._text !== html ){\r
this._text = html;\r
if( this._dirty & X.Dom.Dirty.CSS && !( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
delete this._cssText;\r
};\r
- html = !opt_outer ? [] : [\r
+ html = !Node._needOuter ? [] : [\r
'<', this._tag,\r
this._id ? ' id=' + this._id : _,\r
this._className ? ' class="' + this._className + '"' : _,\r
\r
n = html.length;\r
if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
+ Node._needOuter = true;\r
for( i = 0; i < l; ++i ){\r
- html[ n ] = xnodes[ i ].html( undefined, true );\r
+ html[ n ] = xnodes[ i ].html( undefined );\r
++n;\r
};\r
+ Node._needOuter = false;\r
};\r
- !opt_outer || X.Dom.DTD.EMPTY[ this._tag.toLowerCase() ] || ( html[ n ] = '<\/' + this._tag + '>' );\r
+ !Node._needOuter || X.Dom.DTD.EMPTY[ this._tag.toLowerCase() ] || ( html[ n ] = '<\/' + this._tag + '>' );\r
\r
return html.join( _ );\r
};\r
\r
Node.prototype.text = function( text ){\r
- var xnodes, n, i;\r
+ var xnodes, texts, i, l;\r
// setter\r
- if( text ){\r
+ if( text || text === '' ){\r
if( this._xnodeType === 3 ){\r
if( this._text !== text ){\r
this._text = text;\r
};\r
// getter\r
if( this._xnodeType === 1 ){\r
- if( ( xnodes = this._xnodes ) && ( i = xnodes.length ) ){\r
- for( text = [], n = -1; i; ){\r
- text[ ++n ] = xnodes[ --i ].text();\r
+ if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
+ for( texts = [], i = 0; i < l; ++i ){\r
+ texts[ i ] = xnodes[ i ].text();\r
};\r
- return text.join( '' );\r
+ return texts.join( '' );\r
};\r
return '';\r
};\r
var removal, i, xnode, tmp;\r
\r
if( this._updateTimerID ){\r
- //X.Timer.cancelFrame( this._updateTimerID ); // fire 空の cancel が動かない、、、\r
+ //X.Timer.cancelFrame( this._updateTimerID ); // fire 中の cancel が動かない、、、\r
this._updateTimerID = 0;\r
} else {\r
return;\r
};\r
\r
+\r
+ X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.BEFORE_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.BEFORE_UPDATE } );\r
+\r
removal = Node._reserveRemoval;\r
\r
tmp = this._rawNode.style.visibility;\r
\r
this._commitUpdate();\r
\r
+ X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.AFTER_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.AFTER_UPDATE } );\r
//this._rawNode.style.visibility = tmp;\r
};\r
\r
-/**
- * use X.Callback
- *
- * http://d.hatena.ne.jp/uupaa/20100430/1272561922
- *
- */
-
-if( window.addEventListener ){
- X.Dom.Event = function( e, xnode ){
- //this._event = e;
- this.type = e.type;
-
- //http://www.quirksmode.org/js/events_properties.html
- this.target = Node._getXNode( e.target.nodeType === 3 ? e.target.parentNode : e.target );// defeat Safari bug // xnode
-
- this.currentTarget = xnode; // xnode
- this.relatedTarget = Node._getXNode( e.relatedTarget ); // xnode
- this.eventPhase = e.eventPhase;
-
- this.clientX = e.clientX;
- this.clientY = e.clientY;
- //this.screenX = e.screenX;
- //this.screenY = e.screenY;
- this.pageX = e.pageX;
- this.pageY = e.pageY;
- this.offsetX = e.offsetX || e.layerX;
- this.offsetY = e.offsetY || e.layerY;
-
- this.keyCode = e.keyCode;
- this.altKey = e.altKey;
- this.ctrlKey = e.ctrlKey;
- this.shiftKey = e.shiftKey;
-
- // http://www.programming-magic.com/20090127231544/
- this.which = e.which || ( e.button + 1 ); // 左:1, 中:2, 右:3
-
- // https://developer.mozilla.org/ja/docs/DOM/DOM_event_reference/mousewheel
- if( e.wheelDeltaY !== undefined ){
- this.wheelDeltaX = e.wheelDeltaX / 12;
- this.wheelDeltaY = e.wheelDeltaY / 12;
- } else
- if( e.wheelDelta !== undefined ){
- this.wheelDeltaX = this.wheelDeltaY = e.wheelDelta / 12;
- } else
- if( e.detail !== undefined ){
- this.wheelDeltaX = this.wheelDeltaY = - e.detail * 3;
- } else {
- this.wheelDeltaX = this.wheelDeltaY = 0;
- };
-
- if( e.constructor === window.TouchEvent ){
- // TouchEvent
- this.touches = e.touches;
- this.changedTouches = e.changedTouches;
- this.targetTouches = e.targetTouches;
- this.metaKey = e.metaKey;
- this.force = e.force || e.webkitForce || 0;
- } else
- if( e.constructor === window.PointerEvent ){
- // PointerEvent;
- this.currentPoint = e.currentPoint;
- this.width = e.width;
- this.height = e.height;
- this.timeStamp = e.timeStamp;
- this.hwTimestamp = e.hwTimestamp;
- this.intermediatePoints = e.intermediatePoints;
- this.isPrimary = e.isPrimary;
- this.pointerId = e.pointerId;
- this.pointerType = e.pointerType;
- this.pressure = e.pressure;
- this.tiltX = e.tiltX;
- this.tiltY = e.tiltY;
- };
- };
-} else {
- X.Dom.Event = function( e, xnode, element ){
- var btn;
-
- //this._event = e;
- this.type = e.type;
- this.target = Node._getXNode( e.srcElement ); // xnode
- if( this.target && this.target._xnodeType === 3 ) this.target = this.target.parent; // ie4 の fake Textnode がヒットしていないか?
- this.currentTarget = xnode; // xnode
- this.relatedTarget = Node._getXNode( e.formElement ? e.formElement : e.toElement ); // xnode
- this.eventPhase = e.srcElement === element ? 2: 3;
-
- this.clientX = e.clientX;
- this.clientY = e.clientY;
- //this.screenX = e.screenX;
- //this.screenY = e.screenY;
-
- if( X.Dom._root ){ // uuu...
-
- this.pageX = e.clientX + X.Dom._root.scrollLeft;
- this.pageY = e.clientY + X.Dom._root.scrollTop;
-
- // DOMAssistant 2.8.1
- //event.pageX = DOMAssistant.def(e.pageX)? e.pageX : (event.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0));
- //event.pageY = DOMAssistant.def(e.pageY)? e.pageY : (event.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0));
- };
-
-
-
- if( X.UA.IE && 5 <= X.UA.IE ){
- this.offsetX = e.offsetX; // イベントターゲット左上からの座標
- this.offsetY = e.offsetY;
- }// else
- //if( e.srcElement ){
- // this.offsetX = e.x - e.srcElement.offsetLeft; // e.x はイベント発生要素の親要素を基準にした座標。
- // this.offsetY = e.y - e.srcElement.offsetTop;
- //};
-
- this.keyCode = e.keyCode;
- this.altKey = e.altKey;
- this.ctrlKey = e.ctrlKey;
- this.shiftKey = e.shiftKey;
-
- // http://www.programming-magic.com/20090127231544/
- switch( this.type ){
- case 'click' :
- case 'dblclick' :
- this.which = 1;
- break;
- case 'contextmenu' :
- this.which = 3;
- break;
- default :
- btn = e.button;
- this.which =
- btn & 1 ? 1 :
- btn & 4 ? 2 :
- btn & 2 ? 3 : 0; // 左:1(click:0), 中:4, 右:2
- };
- this.wheelDeltaX = this.wheelDeltaY = e.wheelDelta / 12;
- };
-};
-
-X.Dom.Event.DOM_PRE_INIT = 0;
-X.Dom.Event.DOM_INIT = 1;
-X.Dom.Event.XDOM_READY = 2;
-X.Dom.Event.VIEW_ACTIVATE = 3;
-X.Dom.Event.VIEW_DEACTIVATE = 4;
-X.Dom.Event.VIEW_RESIZED = 5;
-X.Dom.Event.BASE_FONT_RESIZED = 6;
-// on_screen_keyboard_show
-// on_screen_keyboard_hide
-X.Dom.Event.BEFORE_UPDATE = 7;
-X.Dom.Event.COMMIT_UPDATE = 8;
-// hash_change
-X.Dom.Event.BEFORE_UNLOAD = 9;
-X.Dom.Event.UNLOAD = 10;
-X.Dom.Event.LOAD_BEFORE_STOP = 11;
-X.Dom.Event.LOAD_ASSET_STOP = 12;
-X.Dom.Event.LOAD_ASSET_COMPLETE = 13;
-X.Dom.Event.LOAD_ASSET_ERROR = 14;
-
-X.Dom.Event.ANIME_BEFORE_START = 15;
-X.Dom.Event.ANIME_START = 16;
-X.Dom.Event.ANIME = 17;
-X.Dom.Event.ANIME_END = 18;
-X.Dom.Event.ANIME_BEFORE_STOP = 19; // xnode.stop() のみ、指定時間による停止では呼ばれない
-X.Dom.Event.ANIME_STOP = 20;
-X.Dom.Event._LAST_EVENT = 20; // ここに書いてあるイベントの最後の値 X.Dom.Event.ANIME_STOP と同じ値
-
-
-X.Dom.Node.prototype.listen = function( type, arg1, arg2, arg3 /* [ listener || ( context + function ) || function ][ arguments ] */ ){
- var elm;
-
- if( this._xnodeType === 0 || this._xnodeType === 3 || !arg1 ) return this;
-
- ( !this._listeners || !this._listeners[ type ] ) && this._addEvent( type );
-
- return typeof arg1 === 'function' ?
- X.EventDispatcher.prototype.listen.call( this, type, this, arg1, arg2 ) :
- X.EventDispatcher.prototype.listen.apply( this, arguments );
-};
-
-X.Dom.Node.prototype._addEvent =
- document.removeEventListener ?
- (function( type ){
- this._rawNode && this._rawNode.addEventListener( type, this, false );
- }) :
- document.detachEvent ?
- (function( type ){
- if( !this._rawNode ) return;
- this._handleEvent = this._handleEvent || X.Callback.create( this );
- this._rawNode.attachEvent( 'on' + type, this._handleEvent );
- }) :
- (function( type ){
- var elm = this._ie4getRawNode();
- if( !elm ) return;
- this._handleEvent = elm[ 'on' + type ] = this._handleEvent || X.Callback.create( this );
- });
-
-
-X.Dom.Node.prototype.unlisten = function( type /* , arg1, arg2, arg3 */ ){
- var list = this._listeners,
- l = !this._dispatching && list && type !== undefined && list[ type ] && list[ type ].length;
-
- X.EventDispatcher.prototype.unlisten.apply( this, arguments );
-
- l && !list[ type ] && this._removeEvent( type );
-
- return this;
-};
-
-X.Dom.Node.prototype._removeEvent =
- document.removeEventListener ?
- (function( type ){
- var elm = this._rawNode;
- if( !elm ) return;
- elm.removeEventListener( type, this, false );
- }) :
- document.detachEvent ?
- (function( type ){
- var elm = this._rawNode;
- if( !elm ) return;
- elm.detachEvent( 'on' + type, this._handleEvent );
- if( !this._listeners ){
- X.Callback._correct( this._handleEvent );
- delete this._handleEvent;
- };
- }) :
- (function( type ){
- var elm = this._rawNode || this._ie4getRawNode();
- if( !elm ) return;
- elm[ 'on' + type ] = X.emptyFunction;
- elm[ 'on' + type ] = '';
- if( !this._listeners ){
- X.Callback._correct( this._handleEvent );
- delete this._handleEvent;
- };
- });
-
-
-X.Dom.Node.prototype.handleEvent =
- document.removeEventListener ?
- (function( e ){
- var ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( e, this ) );
-
- if( ret & X.Callback.STOP_PROPAGATION ){
- e.stopPropagation();
- };
- if( ret & X.Callback.PREVENT_DEFAULT ){
- this._tag === 'A' && this._rawNode.blur();
- e.preventDefault();
- return false;
- };
- }) :
- (function(){
- var ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( event, this, this._rawNode ) );
-
- if( ret & X.Callback.STOP_PROPAGATION ){
- event.cancelBubble = true;
- };
- if( ret & X.Callback.PREVENT_DEFAULT ){
- this._tag === 'A' && this._rawNode.blur();
- return event.returnValue = false;
- };
- });
-
-
-// イベントの退避、dom が画面から抜かれる場合に実施しておく
-X.Dom.Node.prototype._migrateEvent = function(){
- var hash = this._listeners,
- type;
- if( !hash ) return;
- for( type in hash ){
- this._removeEvent( type );
- };
-};
-
-// 退避したイベントの復帰
-X.Dom.Node.prototype._restoreEvent = function(){
- var hash = this._listeners,
- type;
- if( !hash ) return;
- for( type in hash ){
- this._addEvent( type );
- };
-};
-
-
-
-/* -----------------------------------------------
- * Document Ready
- * Dean Edwards/Matthias Miller/John Resig
- */
-/* for ie9+/Mozilla/Opera9 */
-if( document.addEventListener ){
- X.Dom.Node._document.listenOnce( 'DOMContentLoaded', X.Dom._init );
-} else
-if( 5 <= X.UA.IE && X.inHead ){
- // if this script in Head
- document.write( "<script id=__ie_onload defer src=javascript:void(0)><\/script>" );
- X.Dom._script = document.getElementById( "__ie_onload" );
- X.Dom._script.onreadystatechange = function(){
- this.readyState === 'complete' && X.Dom._init();
- };
-} else
-if( X.UA.WebKit ){ // sniff
- X.Timer.add( 10, function(){
- if( !X.Dom._init ) return X.Callback.UN_LISTEN;
- if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return X.Dom._init();
- });
-};
-
-/* for other browsers */
-X.Dom.Node._window.listenOnce( 'load', X.Dom._init );
-
-//
-X.Dom.listenOnce( X.Dom.Event.XDOM_READY, function(e){ console.log( 'X.Dom XDomReady ' + X.Dom.readyState ); } );
-
-X.Dom.listenOnce( X.Dom.Event.VIEW_RESIZED, function(e){ console.log( 'X.Dom VIEW_RESIZED ' + e.w + 'x' + e.h ); } );
-
-
-/* --------------------------------------
- * load
- */
-X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
-
- Node._html = document.documentElement ?
- new Node( document.documentElement ) :
- document.getElementsByTagName ?
- new Node( document.getElementsByTagName( 'html' )[ 0 ] ) :
- document.all ?
- new Node( document.all.tags( 'html' )[ 0 ] ) :
- null;
-
- var r = Node.root = new Node( document.body ),
- body = r._rawNode,
- createTree, xnodes, s, i, n = 0;
- r.appendTo = r.appendToRoot = r.before = r.after = r.clone = r.remove = r.destroy = r.prevNode = r.nextNode = new Function( 'return this' );
-
- r._root = Node._html._root = r;
- r.parent = Node._html;
- Node._html._xnodes = [ r ];
- //r.width = new Function( 'return X.Dom.getSize()[ 0 ]' );
- //r.height = new Function( 'return X.Dom.getSize()[ 1 ]' );
-
- // todo: cleanup tree
-
-
-
-
- body.childNodes && (function( elm, skip, head ){
- var me = arguments.callee,
- moveToHead = 'style,bgsound,area,base,meta'.split( ',' ),
- remove = 'script,noscript,noframes,comment,!,noembed,nolayer'.split( ',' ),
- noncleanup = 'pre,textarea,code,kbd,samp,xmp,plaintext,listing'.split( ',' ),
- nodes = X.copyArray( elm.childNodes ),
- i = 0,
- l = nodes.length,
- node, tag, textNode, content;
- for( ; i < l; ++i ){
- node = nodes[ i ];
- switch( node.nodeType ){
- case 1 :
- tag = node.tagName.toLowerCase();
- if( moveToHead.indexOf( tag ) !== -1 ){
- head = head || document.getElementsByTagName( 'head' )[ 0 ];
- head.appendChild( node );
- continue;
- } else
- if( remove.indexOf( tag ) !== -1 ){
- elm.removeChild( node );
- continue;
- } else {
- // pre タグ以下はスペースの置換は行わない
- node.childNodes && node.childNodes.length && me( node, skip || noncleanup.indexOf( tag ) !== -1, head );
- };
- textNode = false;
- break;
- case 3 :
- content = skip ? node.data : X.Dom.cleanupWhiteSpace( node.data );
- //console.log( 'Delete space ' + node.data.length + ' => ' + content.length );
- if( !textNode && content !== ' ' && content.length ){
- node.data = content;
- textNode = node;
- break;
- } else
- if( textNode ){
- textNode.data += content; // 直前が TextNode の場合 一本化して削除
- };
- // ブロック要素直下のスペースだけは削除??
- default :
- //console.log( 'Remove type: ' + node.nodeType + ' value: ' + node.nodeValue );
- elm.removeChild( node );
- //++count;
- };
- };
- })( body );
-
- createTree =
- body.childNodes ?
- (function( xnode, childNodes, skipCleanup, textarea ){
- var i = 0,
- j = 0,
- l = childNodes.length,
- child, _xnode, f, tag, text, _xtext, doc;
- childNodes = X.copyArray( childNodes );
-
- if( textarea ){
- xnode.attr( 'value', xnode.text() ).empty();
- return;
- };
-
- for( ; i < l; ++i ){
- child = childNodes[ i ];
- tag = child.tagName;
- if( ( child.nodeType !== 1 && child.nodeType !== 3 ) || tag === '!' || ( tag && tag.charAt( 0 ) === '/' ) ){
- child.parentNode.removeChild( child );
- continue;
- };
- f = false;
- while( xnode._xnodes && j < xnode._xnodes.length ){
- _xnode = xnode._xnodes[ j ];
- _xnode.parent = xnode;
-
- if( _xnode._xnodeType === 1 ){
- if( child.nodeType !== 1 ){
- if( !( text = child.data ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){
- child.parentNode.removeChild( child );
- break;
- };
- alert( '[' +xnode._tag + '>' +_xnode._tag + '] !== ' + child.nodeType + '\n' + child.data );
- ++j;
- continue;
- };
- if( _xnode._tag.toUpperCase() !== tag ){
- alert( '[' +xnode._tag + '>' +_xnode._tag + ' ' + (_xnode._xnodes ? _xnode._xnodes.length : '' ) + '] !== ' + tag + ' ' + (child.childNodes ? child.childNodes.length : '' ) + '\n' + child.outerHTML );
- ++j;
- continue;
- } else {
- _xnode._rawNode = child;
- //if( ( doc = child.ownerDocument || child.document ) && ( doc.createElement( 'p' ).tagName === doc.createElement( 'P' ).tagName ) ){
- if( tag.charAt( 0 ) === '/' ) tag = tag.slice( 1 );
- _xnode._tag = tag; // .toUpperCase()
- //};
- _xnode._root = xnode._root;
- child.UID = _xnode._uid;
- if( 0 <= X.Dom.cleanupTagNames.indexOf( tag.toLowerCase() ) || tag === 'SCRIPT' ){ // ie で body 内の script が2度よばれるのに対処
- //alert( '[' +xnode._tag + '>' + _xnode._tag + '] remove ... ' );
- _xnode.destroy();
- ++n;
- continue;
- } else {
- //alert( '[' +xnode._tag + '>' + _xnode._tag + ' ' + (_xnode._xnodes ? _xnode._xnodes.length : '' ) + '] === ' + tag + ' ' + (child.childNodes ? child.childNodes.length : '' ) + ' Hit\n' + child.outerHTML );
- child.childNodes && child.childNodes.length && createTree( _xnode, child.childNodes, skipCleanup || 0 <= X.Dom.skipCleanupTagNames.indexOf( tag.toLowerCase() ), tag === 'TEXTAREA' );
- };
- _xtext = null;
- f = true;
- ++j;
- break;
- };
- } else
- if( _xnode._xnodeType === 3 ){
-
- if( child.nodeType !== 3 ){
- if( !( text = _xnode._text ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){
- console.log( '[' +xnode._tag + '>' + _xnode._uid + '] destroy ... ' );
- _xnode.destroy();
- ++n;
- continue;
- };
- alert( xnode._tag + '>' + '"' + _xnode._text + '" !== ' + tag + '\n' + child.outerHTML );
- ++j;
- continue;
- };
-
- _xnode._rawNode = child;
- _xnode._root = xnode._root;
- if( !skipCleanup ){
- if( !( text = _xnode._text ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){
- console.log( '[' +xnode._tag + '>' + _xnode._uid + '] destroy ... ' );
- _xnode.destroy();
- ++n;
- continue;
- };
- if( _xtext ){
- _xtext.text( _xtext._text + text );
- console.log( '[' +xnode._tag + '>' + _xnode._uid + '] xtext,destroy ... ' );
- _xnode.destroy();
- ++n;
- continue;
- } else {
- //alert( xnode._tag + '>' + '"' + text + '"\n' + child.data );
- _xnode.text( text );
- };
- } else
- if( _xtext ){
- _xtext.text( _xtext._text + _xnode.text );
- console.log( '[' +xnode._tag + '>' + _xnode._uid + '] xtext,destroy ... ' );
- _xnode.destroy();
- ++n;
- continue;
- };
- _xtext = _xtext || _xnode;
- ++j;
- break;
- } else {
- alert( 'no hit!' );
- };
- ++j;
-
- };
- //if( !f ) alert( '**** ' + child.outerHTML );
- };
- while( xnode._xnodes && j < xnode._xnodes.length ){
- _xnode = xnode._xnodes[ j ];
- _xnode.parent = xnode;
- _xnode.destroy();
- ++n;
- continue;
- };
- }) :
- body.children ?
- (function( xnode, children, skipCleanup, textarea ){
- var parent = xnode,
- xnodes = parent._xnodes,
- l = xnodes && xnodes.length,
- m = children.length,
- i = 0, j = 0, flag = 0,
- elm, tag, xtext, text;
- //children = X.copyArray( children );
-
- if( textarea ){
- xnode.attr( 'value', xnode.text() ).empty();
- return;
- };
-
- for( ; i < xnodes.length; ++i ){
- xnode = xnodes[ i ];
- xnode.parent = parent;
-
- if( xnode._xnodeType === 3 ){
- //alert( X.Dom.cleanupWhiteSpace( xnode._text ) );
- if( !skipCleanup ){
- if( !( text = xnode._text ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){
- xnode.destroy();
- --i;
- } else
- if( xtext ){
- //alert( 'xtext ' + text.charCodeAt( 0 ) + ' : ' + text.length );
- xtext.text( xtext._text + text );
- xnode.destroy();
- --i;
- } else {
- //alert( 'xnode ' + text.charCodeAt( 0 ) + ' : ' + text.length );
- xnode.text( text );
- };
- } else
- if( xtext ){
- //alert( 'skip ' + text.charCodeAt( 0 ) + ' : ' + text.length );
- xtext.text( xtext._text + xnode._text );
- xnode.destroy();
- --i;
- };
- flag |= 4;
- xtext = xtext || xnode;
- continue;
- };
-
- if( xnode._xnodeType !== 1 ){
- //alert( xnode._xnodeType )
- continue;
- };
-
- for( ; j < m; ++j ){
- elm = children[ j ];
- tag = elm.tagName;
- /*
- * 未知のタグについては、閉じタグも含めてタグ名扱いになる
- */
- if( tag === '!' || tag.charAt( 0 ) === '/' ){
- alert( '## ' + tag );
- continue;
- } else
- if( xnode._tag !== tag ){
- alert( xnode._tag + ' ' + ' !== ' + tag + '\nxnode.html():' + xnode.attr('cite') + '\nelm.outerHTML:' + elm.outerHTML );
- } else {
- xnode._rawNode = elm;
- xnode._root = parent._root;
- if( 0 <= X.Dom.cleanupTagNames.indexOf( tag.toLowerCase() ) || tag === 'SCRIPT' ){
- xnode.destroy();
- --i;
- break;
- } else {
- xnode._xnodes && xnode._xnodes.length && createTree( xnode, elm.children, skipCleanup || 0 <= X.Dom.skipCleanupTagNames.indexOf( tag.toLowerCase() ), tag === 'TEXTAREA' );
-
- !xnode._id && elm.setAttribute( 'id', 'ie4uid' + xnode._uid );//( elm.id = 'ie4uid' + xnode._uid );
- elm.setAttribute( 'UID', xnode._uid );
-
- tag === 'INPUT' && (
- !xnode._attrs ?
- ( xnode._attrs = { type : 'text' } ) :
- ( !xnode._attrs.type ) || ( xnode._attrs.type = 'text' )
- );
- flag |= 3;
- xtext = null;
- break;
- };
- };
- };
- // for
- if( !xnode._rawNode ){
- alert( xnode._tag + ' ' + xnode._id + ' !== none...' );
- //--i;
- };
- ++j;
- flag &= 6;
- };
- // textNode がある
- ( flag & 6 ) && ( parent._dirty |= X.Dom.Dirty.IE4_TEXTNODE_FIX );
- //( flag & 4 ) && ( parent._state |= X.Dom.Dirty.ONLY_TEXTNODE );
- }) : 0;
-
- r._xnodes = xnodes = [];
- // body の属性値の取得
-
- Node.skipCreate = true;
- /*
- * http://support.microsoft.com/kb/812417/ja
- * PRB: outerHTML の HTML 要素のプロパティは、既定の属性は表示されません。
- *
- * body.innerHTML でなく、 body.outerHTML にはできなかった、、、
- */
- xnodes.push.apply( xnodes, X.Dom.parse( body.innerHTML, true ) );
- delete Node.skipCreate;
-
- //alert(body.innerHTML);
-
- //alert(r.html());
-
- createTree( r, body.childNodes || body.children );
-
- i = xnodes.length;
- Node._systemNode = s = r.create( 'div' ).className( 'hidden-sysyem-node' );
- //alert( i + ' -> ' + xnodes.length );
-
- Node._fontSizeNode = r.create( 'div' ).className( 'hidden-sysyem-node' ).cssText( 'line-height:1;height:1em;' ).text( 'X' );
-
- r.appendAt( 0, Node._systemNode, Node._fontSizeNode );
-
- r._startUpdate();
-
- //xnodes.splice( xnodes.indexOf( s ), 1 ); // hide from api user
-
- //alert(n + ' ' + body.innerHTML);
-
- X.Timer.add( 200, X.Dom.Event._detectFontSize );
-} );
-
-Node._fontSizeNode = null;
-
-X.Dom.Event._lastFontSize = 0;
-X.Dom.Event._detectFontSize = function(){
- var size = Node._fontSizeNode._rawNode.offsetHeight;
- if( X.Dom.Event._lastFontSize !== size ){
- X.Dom.Event._lastFontSize && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.BASE_FONT_RESIZED, size : size } );
- X.Dom.Event._lastFontSize = size;
- };
-};
+/**\r
+ * use X.Callback\r
+ * \r
+ * http://d.hatena.ne.jp/uupaa/20100430/1272561922\r
+ * \r
+ */\r
+\r
+if( window.addEventListener ){\r
+ X.Dom.Event = function( e, xnode ){\r
+ //this._event = e;\r
+ this.type = e.type;\r
+ \r
+ //http://www.quirksmode.org/js/events_properties.html\r
+ this.target = Node._getXNode( e.target.nodeType === 3 ? e.target.parentNode : e.target );// defeat Safari bug // xnode\r
+ \r
+ this.currentTarget = xnode; // xnode\r
+ this.relatedTarget = Node._getXNode( e.relatedTarget ); // xnode\r
+ this.eventPhase = e.eventPhase;\r
+ \r
+ this.clientX = e.clientX;\r
+ this.clientY = e.clientY;\r
+ //this.screenX = e.screenX;\r
+ //this.screenY = e.screenY;\r
+ this.pageX = e.pageX;\r
+ this.pageY = e.pageY;\r
+ this.offsetX = e.offsetX || e.layerX;\r
+ this.offsetY = e.offsetY || e.layerY;\r
+ \r
+ this.keyCode = e.keyCode;\r
+ this.altKey = e.altKey;\r
+ this.ctrlKey = e.ctrlKey;\r
+ this.shiftKey = e.shiftKey;\r
+ \r
+ // http://www.programming-magic.com/20090127231544/\r
+ this.which = e.which || ( e.button + 1 ); // 左:1, 中:2, 右:3\r
+ \r
+ // https://developer.mozilla.org/ja/docs/DOM/DOM_event_reference/mousewheel\r
+ if( e.wheelDeltaY !== undefined ){\r
+ this.wheelDeltaX = e.wheelDeltaX / 12;\r
+ this.wheelDeltaY = e.wheelDeltaY / 12;\r
+ } else\r
+ if( e.wheelDelta !== undefined ){\r
+ this.wheelDeltaX = this.wheelDeltaY = e.wheelDelta / 12;\r
+ } else\r
+ if( e.detail !== undefined ){\r
+ this.wheelDeltaX = this.wheelDeltaY = - e.detail * 3;\r
+ } else {\r
+ this.wheelDeltaX = this.wheelDeltaY = 0;\r
+ };\r
+ \r
+ if( e.constructor === window.TouchEvent ){\r
+ // TouchEvent\r
+ this.touches = e.touches;\r
+ this.changedTouches = e.changedTouches;\r
+ this.targetTouches = e.targetTouches;\r
+ this.metaKey = e.metaKey;\r
+ this.force = e.force || e.webkitForce || 0;\r
+ } else\r
+ if( e.constructor === window.PointerEvent ){\r
+ // PointerEvent;\r
+ this.currentPoint = e.currentPoint;\r
+ this.width = e.width;\r
+ this.height = e.height;\r
+ this.timeStamp = e.timeStamp;\r
+ this.hwTimestamp = e.hwTimestamp;\r
+ this.intermediatePoints = e.intermediatePoints;\r
+ this.isPrimary = e.isPrimary;\r
+ this.pointerId = e.pointerId;\r
+ this.pointerType = e.pointerType;\r
+ this.pressure = e.pressure;\r
+ this.tiltX = e.tiltX;\r
+ this.tiltY = e.tiltY;\r
+ };\r
+ };\r
+} else {\r
+ X.Dom.Event = function( e, xnode, element ){\r
+ var btn;\r
+ \r
+ //this._event = e;\r
+ this.type = e.type;\r
+ this.target = Node._getXNode( e.srcElement ); // xnode\r
+ if( this.target && this.target._xnodeType === 3 ) this.target = this.target.parent; // ie4 の fake Textnode がヒットしていないか?\r
+ this.currentTarget = xnode; // xnode\r
+ this.relatedTarget = Node._getXNode( e.formElement ? e.formElement : e.toElement ); // xnode\r
+ this.eventPhase = e.srcElement === element ? 2: 3;\r
+ \r
+ this.clientX = e.clientX;\r
+ this.clientY = e.clientY;\r
+ //this.screenX = e.screenX;\r
+ //this.screenY = e.screenY;\r
+ \r
+ if( X.Dom._root ){ // uuu...\r
+ \r
+ this.pageX = e.clientX + X.Dom._root.scrollLeft;\r
+ this.pageY = e.clientY + X.Dom._root.scrollTop;\r
+ \r
+ // DOMAssistant 2.8.1\r
+ //event.pageX = DOMAssistant.def(e.pageX)? e.pageX : (event.clientX + (de.scrollLeft || b.scrollLeft) - (de.clientLeft || 0));\r
+ //event.pageY = DOMAssistant.def(e.pageY)? e.pageY : (event.clientY + (de.scrollTop || b.scrollTop) - (de.clientTop || 0)); \r
+ };\r
+ \r
+\r
+ \r
+ if( X.UA.IE && 5 <= X.UA.IE ){\r
+ this.offsetX = e.offsetX; // イベントターゲット左上からの座標\r
+ this.offsetY = e.offsetY; \r
+ }// else\r
+ //if( e.srcElement ){\r
+ // this.offsetX = e.x - e.srcElement.offsetLeft; // e.x はイベント発生要素の親要素を基準にした座標。\r
+ // this.offsetY = e.y - e.srcElement.offsetTop; \r
+ //};\r
+ \r
+ this.keyCode = e.keyCode;\r
+ this.altKey = e.altKey;\r
+ this.ctrlKey = e.ctrlKey;\r
+ this.shiftKey = e.shiftKey;\r
+ \r
+ // http://www.programming-magic.com/20090127231544/\r
+ switch( this.type ){\r
+ case 'click' :\r
+ case 'dblclick' :\r
+ this.which = 1;\r
+ break;\r
+ case 'contextmenu' :\r
+ this.which = 3;\r
+ break;\r
+ default :\r
+ btn = e.button;\r
+ this.which =\r
+ btn & 1 ? 1 :\r
+ btn & 4 ? 2 :\r
+ btn & 2 ? 3 : 0; // 左:1(click:0), 中:4, 右:2\r
+ };\r
+ this.wheelDeltaX = this.wheelDeltaY = e.wheelDelta / 12;\r
+ };\r
+};\r
+\r
+X.Dom.Event.DOM_PRE_INIT = 0;\r
+X.Dom.Event.DOM_INIT = 1;\r
+X.Dom.Event.XDOM_READY = 2;\r
+X.Dom.Event.VIEW_ACTIVATE = 3;\r
+X.Dom.Event.VIEW_DEACTIVATE = 4;\r
+X.Dom.Event.VIEW_RESIZED = 5;\r
+X.Dom.Event.BASE_FONT_RESIZED = 6;\r
+// on_screen_keyboard_show\r
+// on_screen_keyboard_hide\r
+X.Dom.Event.BEFORE_UPDATE = 7;\r
+X.Dom.Event.AFTER_UPDATE = 8;\r
+// hash_change\r
+X.Dom.Event.BEFORE_UNLOAD = 9;\r
+X.Dom.Event.UNLOAD = 10;\r
+X.Dom.Event.LOAD_BEFORE_STOP = 11;\r
+X.Dom.Event.LOAD_ASSET_STOP = 12;\r
+X.Dom.Event.LOAD_ASSET_COMPLETE = 13;\r
+X.Dom.Event.LOAD_ASSET_ERROR = 14;\r
+\r
+X.Dom.Event.ANIME_BEFORE_START = 15;\r
+X.Dom.Event.ANIME_START = 16;\r
+X.Dom.Event.ANIME = 17;\r
+X.Dom.Event.ANIME_END = 18;\r
+X.Dom.Event.ANIME_BEFORE_STOP = 19; // xnode.stop() のみ、指定時間による停止では呼ばれない\r
+X.Dom.Event.ANIME_STOP = 20;\r
+X.Dom.Event._LAST_EVENT = 20; // ここに書いてあるイベントの最後の値 X.Dom.Event.ANIME_STOP と同じ値\r
+\r
+\r
+X.Dom.Node.prototype.listen = function( type, arg1, arg2, arg3 /* [ listener || ( context + function ) || function ][ arguments ] */ ){\r
+ var elm;\r
+ \r
+ if( this._xnodeType === 0 || this._xnodeType === 3 || !arg1 ) return this;\r
+ \r
+ ( !this._listeners || !this._listeners[ type ] ) && this._addEvent( type );\r
+ \r
+ return typeof arg1 === 'function' ?\r
+ X.EventDispatcher.prototype.listen.call( this, type, this, arg1, arg2 ) :\r
+ X.EventDispatcher.prototype.listen.apply( this, arguments );\r
+};\r
+\r
+X.Dom.Node.prototype._addEvent =\r
+ document.removeEventListener ?\r
+ (function( type ){\r
+ this._rawNode && this._rawNode.addEventListener( type, this, false );\r
+ }) :\r
+ document.detachEvent ?\r
+ (function( type ){\r
+ if( !this._rawNode ) return;\r
+ this._handleEvent = this._handleEvent || X.Callback.create( this );\r
+ this._rawNode.attachEvent( 'on' + type, this._handleEvent );\r
+ }) :\r
+ (function( type ){\r
+ var elm = this._ie4getRawNode();\r
+ if( !elm ) return;\r
+ this._handleEvent = elm[ 'on' + type ] = this._handleEvent || X.Callback.create( this );\r
+ });\r
+\r
+\r
+X.Dom.Node.prototype.unlisten = function( type /* , arg1, arg2, arg3 */ ){\r
+ var list = this._listeners,\r
+ l = !this._dispatching && list && type !== undefined && list[ type ] && list[ type ].length;\r
+ \r
+ X.EventDispatcher.prototype.unlisten.apply( this, arguments );\r
+ \r
+ l && !list[ type ] && this._removeEvent( type );\r
+ \r
+ return this;\r
+};\r
+\r
+X.Dom.Node.prototype._removeEvent =\r
+ document.removeEventListener ?\r
+ (function( type ){\r
+ var elm = this._rawNode;\r
+ if( !elm ) return;\r
+ elm.removeEventListener( type, this, false );\r
+ }) :\r
+ document.detachEvent ?\r
+ (function( type ){\r
+ var elm = this._rawNode;\r
+ if( !elm ) return;\r
+ elm.detachEvent( 'on' + type, this._handleEvent );\r
+ if( !this._listeners ){\r
+ X.Callback._correct( this._handleEvent );\r
+ delete this._handleEvent;\r
+ };\r
+ }) :\r
+ (function( type ){\r
+ var elm = this._rawNode || this._ie4getRawNode();\r
+ if( !elm ) return;\r
+ elm[ 'on' + type ] = X.emptyFunction;\r
+ elm[ 'on' + type ] = '';\r
+ if( !this._listeners ){\r
+ X.Callback._correct( this._handleEvent );\r
+ delete this._handleEvent;\r
+ };\r
+ });\r
+\r
+\r
+X.Dom.Node.prototype.handleEvent =\r
+ document.removeEventListener ?\r
+ (function( e ){\r
+ var ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( e, this ) );\r
+\r
+ if( ret & X.Callback.STOP_PROPAGATION ){\r
+ e.stopPropagation();\r
+ };\r
+ if( ret & X.Callback.PREVENT_DEFAULT ){\r
+ this._tag === 'A' && this._rawNode.blur();\r
+ e.preventDefault();\r
+ return false;\r
+ };\r
+ }) :\r
+ (function(){\r
+ var ret = X.EventDispatcher.prototype.dispatch.call( this, new X.Dom.Event( event, this, this._rawNode ) );\r
+\r
+ if( ret & X.Callback.STOP_PROPAGATION ){\r
+ event.cancelBubble = true;\r
+ };\r
+ if( ret & X.Callback.PREVENT_DEFAULT ){\r
+ this._tag === 'A' && this._rawNode.blur();\r
+ return event.returnValue = false;\r
+ };\r
+ });\r
+\r
+\r
+// イベントの退避、dom が画面から抜かれる場合に実施しておく\r
+X.Dom.Node.prototype._migrateEvent = function(){\r
+ var hash = this._listeners,\r
+ type;\r
+ if( !hash ) return;\r
+ for( type in hash ){\r
+ this._removeEvent( type );\r
+ };\r
+};\r
+\r
+// 退避したイベントの復帰\r
+X.Dom.Node.prototype._restoreEvent = function(){\r
+ var hash = this._listeners,\r
+ type;\r
+ if( !hash ) return;\r
+ for( type in hash ){\r
+ this._addEvent( type );\r
+ };\r
+};\r
+\r
+\r
+\r
+/* -----------------------------------------------\r
+ * Document Ready\r
+ * Dean Edwards/Matthias Miller/John Resig\r
+ */\r
+/* for ie9+/Mozilla/Opera9 */\r
+if( document.addEventListener ){\r
+ X.Dom.Node._document.listenOnce( 'DOMContentLoaded', X.Dom._init );\r
+} else\r
+if( 5 <= X.UA.IE && X.inHead ){\r
+ // if this script in Head\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
+ };\r
+} else\r
+if( X.UA.WebKit ){ // sniff\r
+ X.Timer.add( 10, function(){\r
+ if( !X.Dom._init ) return X.Callback.UN_LISTEN;\r
+ if( 'loaded|complete'.indexOf( document.readyState ) !== -1 ) return X.Dom._init();\r
+ });\r
+};\r
+\r
+/* for other browsers */\r
+X.Dom.Node._window.listenOnce( 'load', X.Dom._init );\r
+\r
+//\r
+X.Dom.listenOnce( X.Dom.Event.XDOM_READY, function(e){ console.log( 'X.Dom XDomReady ' + X.Dom.readyState ); } );\r
+\r
+X.Dom.listenOnce( X.Dom.Event.VIEW_RESIZED, function(e){ console.log( 'X.Dom VIEW_RESIZED ' + e.w + 'x' + e.h ); } );\r
+\r
+\r
+/* --------------------------------------\r
+ * load\r
+ */\r
+X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){\r
+ \r
+ Node._html = document.documentElement ?\r
+ new Node( document.documentElement ) :\r
+ document.getElementsByTagName ?\r
+ new Node( document.getElementsByTagName( 'html' )[ 0 ] ) :\r
+ document.all ?\r
+ new Node( document.all.tags( 'html' )[ 0 ] ) :\r
+ null;\r
+\r
+ var r = Node.root = new Node( document.body ),\r
+ body = r._rawNode,\r
+ createTree, xnodes, s, i, n = 0;\r
+ r.appendTo = r.appendToRoot = r.before = r.after = r.clone = r.remove = r.destroy = r.prevNode = r.nextNode = new Function( 'return this' );\r
+ \r
+ r._root = Node._html._root = r;\r
+ r.parent = Node._html;\r
+ Node._html._xnodes = [ r ];\r
+ //r.width = new Function( 'return X.Dom.getSize()[ 0 ]' );\r
+ //r.height = new Function( 'return X.Dom.getSize()[ 1 ]' );\r
+ \r
+ // todo: cleanup tree\r
+ \r
+ \r
+ \r
+ \r
+ body.childNodes && (function( elm, skip, head ){\r
+ var me = arguments.callee,\r
+ moveToHead = 'style,bgsound,area,base,meta'.split( ',' ),\r
+ remove = 'script,noscript,noframes,comment,!,noembed,nolayer'.split( ',' ),\r
+ noncleanup = 'pre,textarea,code,kbd,samp,xmp,plaintext,listing'.split( ',' ),\r
+ nodes = X.copyArray( elm.childNodes ),\r
+ i = 0,\r
+ l = nodes.length,\r
+ node, tag, textNode, content;\r
+ for( ; i < l; ++i ){\r
+ node = nodes[ i ];\r
+ switch( node.nodeType ){\r
+ case 1 :\r
+ tag = node.tagName.toLowerCase();\r
+ if( moveToHead.indexOf( tag ) !== -1 ){\r
+ head = head || document.getElementsByTagName( 'head' )[ 0 ];\r
+ head.appendChild( node );\r
+ continue;\r
+ } else\r
+ if( remove.indexOf( tag ) !== -1 ){\r
+ elm.removeChild( node );\r
+ continue;\r
+ } else {\r
+ // pre タグ以下はスペースの置換は行わない\r
+ node.childNodes && node.childNodes.length && me( node, skip || noncleanup.indexOf( tag ) !== -1, head );\r
+ };\r
+ textNode = false; \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
+ if( !textNode && content !== ' ' && content.length ){\r
+ node.data = content;\r
+ textNode = node;\r
+ break;\r
+ } else\r
+ if( textNode ){\r
+ textNode.data += content; // 直前が TextNode の場合 一本化して削除\r
+ };\r
+ // ブロック要素直下のスペースだけは削除??\r
+ default :\r
+ //console.log( 'Remove type: ' + node.nodeType + ' value: ' + node.nodeValue );\r
+ elm.removeChild( node );\r
+ //++count;\r
+ };\r
+ };\r
+ })( body );\r
+ \r
+ createTree =\r
+ body.childNodes ?\r
+ (function( xnode, childNodes, skipCleanup, textarea ){\r
+ var i = 0,\r
+ j = 0,\r
+ l = childNodes.length,\r
+ child, _xnode, f, tag, text, _xtext, doc;\r
+ childNodes = X.copyArray( childNodes );\r
+\r
+ if( textarea ){\r
+ xnode.attr( 'value', xnode.text() ).empty();\r
+ return;\r
+ };\r
+\r
+ for( ; i < l; ++i ){\r
+ child = childNodes[ i ];\r
+ tag = child.tagName;\r
+ if( ( child.nodeType !== 1 && child.nodeType !== 3 ) || tag === '!' || ( tag && tag.charAt( 0 ) === '/' ) ){\r
+ child.parentNode.removeChild( child );\r
+ continue;\r
+ };\r
+ f = false;\r
+ while( xnode._xnodes && j < xnode._xnodes.length ){\r
+ _xnode = xnode._xnodes[ j ];\r
+ _xnode.parent = xnode;\r
+ \r
+ if( _xnode._xnodeType === 1 ){\r
+ if( child.nodeType !== 1 ){\r
+ if( !( text = child.data ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
+ child.parentNode.removeChild( child );\r
+ break;\r
+ };\r
+ alert( '[' +xnode._tag + '>' +_xnode._tag + '] !== ' + child.nodeType + '\n' + child.data );\r
+ ++j;\r
+ continue;\r
+ };\r
+ if( _xnode._tag.toUpperCase() !== tag ){\r
+ alert( '[' +xnode._tag + '>' +_xnode._tag + ' ' + (_xnode._xnodes ? _xnode._xnodes.length : '' ) + '] !== ' + tag + ' ' + (child.childNodes ? child.childNodes.length : '' ) + '\n' + child.outerHTML );\r
+ ++j;\r
+ continue;\r
+ } else {\r
+ _xnode._rawNode = child;\r
+ //if( ( doc = child.ownerDocument || child.document ) && ( doc.createElement( 'p' ).tagName === doc.createElement( 'P' ).tagName ) ){\r
+ if( tag.charAt( 0 ) === '/' ) tag = tag.slice( 1 );\r
+ _xnode._tag = tag; // .toUpperCase()\r
+ //};\r
+ _xnode._root = xnode._root;\r
+ child.UID = _xnode._uid;\r
+ if( 0 <= X.Dom.cleanupTagNames.indexOf( tag.toLowerCase() ) || tag === 'SCRIPT' ){ // ie で body 内の script が2度よばれるのに対処\r
+ //alert( '[' +xnode._tag + '>' + _xnode._tag + '] remove ... ' );\r
+ _xnode.destroy();\r
+ ++n;\r
+ continue;\r
+ } else {\r
+ //alert( '[' +xnode._tag + '>' + _xnode._tag + ' ' + (_xnode._xnodes ? _xnode._xnodes.length : '' ) + '] === ' + tag + ' ' + (child.childNodes ? child.childNodes.length : '' ) + ' Hit\n' + child.outerHTML );\r
+ child.childNodes && child.childNodes.length && createTree( _xnode, child.childNodes, skipCleanup || 0 <= X.Dom.skipCleanupTagNames.indexOf( tag.toLowerCase() ), tag === 'TEXTAREA' );\r
+ };\r
+ _xtext = null;\r
+ f = true;\r
+ ++j;\r
+ break;\r
+ };\r
+ } else\r
+ if( _xnode._xnodeType === 3 ){\r
+ \r
+ if( child.nodeType !== 3 ){\r
+ if( !( text = _xnode._text ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
+ console.log( '[' +xnode._tag + '>' + _xnode._uid + '] destroy ... ' );\r
+ _xnode.destroy();\r
+ ++n;\r
+ continue;\r
+ };\r
+ alert( xnode._tag + '>' + '"' + _xnode._text + '" !== ' + tag + '\n' + child.outerHTML );\r
+ ++j;\r
+ continue;\r
+ };\r
+ \r
+ _xnode._rawNode = child;\r
+ _xnode._root = xnode._root;\r
+ if( !skipCleanup ){\r
+ if( !( text = _xnode._text ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
+ console.log( '[' +xnode._tag + '>' + _xnode._uid + '] destroy ... ' );\r
+ _xnode.destroy();\r
+ ++n;\r
+ continue;\r
+ };\r
+ if( _xtext ){\r
+ _xtext.text( _xtext._text + text );\r
+ console.log( '[' +xnode._tag + '>' + _xnode._uid + '] xtext,destroy ... ' );\r
+ _xnode.destroy();\r
+ ++n;\r
+ continue;\r
+ } else {\r
+ //alert( xnode._tag + '>' + '"' + text + '"\n' + child.data );\r
+ _xnode.text( text );\r
+ };\r
+ } else\r
+ if( _xtext ){\r
+ _xtext.text( _xtext._text + _xnode.text );\r
+ console.log( '[' +xnode._tag + '>' + _xnode._uid + '] xtext,destroy ... ' );\r
+ _xnode.destroy();\r
+ ++n;\r
+ continue;\r
+ };\r
+ _xtext = _xtext || _xnode;\r
+ ++j;\r
+ break;\r
+ } else {\r
+ alert( 'no hit!' );\r
+ };\r
+ ++j;\r
+\r
+ }; \r
+ //if( !f ) alert( '**** ' + child.outerHTML );\r
+ };\r
+ while( xnode._xnodes && j < xnode._xnodes.length ){\r
+ _xnode = xnode._xnodes[ j ];\r
+ _xnode.parent = xnode;\r
+ _xnode.destroy();\r
+ ++n;\r
+ continue;\r
+ };\r
+ }) :\r
+ body.children ? \r
+ (function( xnode, children, skipCleanup, textarea ){\r
+ var parent = xnode,\r
+ xnodes = parent._xnodes,\r
+ l = xnodes && xnodes.length,\r
+ m = children.length,\r
+ i = 0, j = 0, flag = 0,\r
+ elm, tag, xtext, text;\r
+ //children = X.copyArray( children );\r
+\r
+ if( textarea ){\r
+ xnode.attr( 'value', xnode.text() ).empty();\r
+ return;\r
+ };\r
+\r
+ for( ; i < xnodes.length; ++i ){\r
+ xnode = xnodes[ i ];\r
+ xnode.parent = parent;\r
+ \r
+ if( xnode._xnodeType === 3 ){\r
+ //alert( X.Dom.cleanupWhiteSpace( xnode._text ) );\r
+ if( !skipCleanup ){\r
+ if( !( text = xnode._text ) || ( text = X.Dom.cleanupWhiteSpace( text ) ) === ' ' ){\r
+ xnode.destroy();\r
+ --i;\r
+ } else\r
+ if( xtext ){\r
+ //alert( 'xtext ' + text.charCodeAt( 0 ) + ' : ' + text.length );\r
+ xtext.text( xtext._text + text );\r
+ xnode.destroy();\r
+ --i;\r
+ } else {\r
+ //alert( 'xnode ' + text.charCodeAt( 0 ) + ' : ' + text.length );\r
+ xnode.text( text );\r
+ };\r
+ } else\r
+ if( xtext ){\r
+ //alert( 'skip ' + text.charCodeAt( 0 ) + ' : ' + text.length );\r
+ xtext.text( xtext._text + xnode._text );\r
+ xnode.destroy();\r
+ --i;\r
+ };\r
+ flag |= 4;\r
+ xtext = xtext || xnode;\r
+ continue;\r
+ };\r
+ \r
+ if( xnode._xnodeType !== 1 ){\r
+ //alert( xnode._xnodeType )\r
+ continue;\r
+ };\r
+ \r
+ for( ; j < m; ++j ){\r
+ elm = children[ j ];\r
+ tag = elm.tagName;\r
+ /*\r
+ * 未知のタグについては、閉じタグも含めてタグ名扱いになる\r
+ */\r
+ if( tag === '!' || tag.charAt( 0 ) === '/' ){\r
+ //alert( '## ' + tag );\r
+ continue;\r
+ } else\r
+ if( xnode._tag !== tag ){\r
+ alert( xnode._tag + ' ' + ' !== ' + tag + '\nxnode.html():' + xnode.attr('cite') + '\nelm.outerHTML:' + elm.outerHTML );\r
+ } else {\r
+ xnode._rawNode = elm;\r
+ xnode._root = parent._root;\r
+ //xnode._tag = X.Dom.DTD.TAG_FIX[ tag ] || tag;\r
+ if( 0 <= X.Dom.cleanupTagNames.indexOf( tag.toLowerCase() ) || tag === 'SCRIPT' ){\r
+ xnode.destroy();\r
+ --i;\r
+ break;\r
+ } else {\r
+ xnode._xnodes && xnode._xnodes.length && createTree( xnode, elm.children, skipCleanup || 0 <= X.Dom.skipCleanupTagNames.indexOf( tag.toLowerCase() ), tag === 'TEXTAREA' );\r
+ \r
+ !xnode._id && elm.setAttribute( 'id', 'ie4uid' + xnode._uid );//( elm.id = 'ie4uid' + xnode._uid );\r
+ elm.setAttribute( 'UID', xnode._uid );\r
+ \r
+ tag === 'INPUT' && (\r
+ !xnode._attrs ?\r
+ ( xnode._attrs = { type : 'text' } ) :\r
+ ( !xnode._attrs.type ) || ( xnode._attrs.type = 'text' )\r
+ );\r
+ flag |= 3;\r
+ xtext = null;\r
+ break;\r
+ };\r
+ };\r
+ };\r
+ // for\r
+ if( !xnode._rawNode ){\r
+ alert( xnode._tag + ' ' + xnode._id + ' !== none...' );\r
+ //--i;\r
+ };\r
+ ++j;\r
+ flag &= 6;\r
+ };\r
+ // textNode がある\r
+ ( flag & 6 ) && ( parent._dirty |= X.Dom.Dirty.IE4_TEXTNODE_FIX );\r
+ //( flag & 4 ) && ( parent._state |= X.Dom.Dirty.ONLY_TEXTNODE );\r
+ }) : 0;\r
+ \r
+ r._xnodes = xnodes = [];\r
+ // body の属性値の取得\r
+\r
+ Node.skipCreate = true;\r
+ /*\r
+ * http://support.microsoft.com/kb/812417/ja\r
+ * PRB: outerHTML の HTML 要素のプロパティは、既定の属性は表示されません。\r
+ * \r
+ * body.innerHTML でなく、 body.outerHTML にはできなかった、、、\r
+ */\r
+ xnodes.push.apply( xnodes, X.Dom.parse( body.innerHTML, true ) );\r
+ delete Node.skipCreate;\r
+ \r
+ //alert(body.innerHTML);\r
+ \r
+ //alert(r.html());\r
+ \r
+ createTree( r, body.childNodes || body.children );\r
+ \r
+ i = xnodes.length;\r
+ Node._systemNode = s = r.create( 'div' ).className( 'hidden-sysyem-node' );\r
+ //alert( i + ' -> ' + xnodes.length );\r
+ \r
+ Node._fontSizeNode = r.create( 'div' ).className( 'hidden-sysyem-node' ).cssText( 'line-height:1;height:1em;' ).text( 'X' );\r
+ \r
+ r.appendAt( 0, Node._systemNode, Node._fontSizeNode );\r
+ \r
+ r._startUpdate();\r
+ \r
+ //xnodes.splice( xnodes.indexOf( s ), 1 ); // hide from api user\r
+ \r
+ //alert(n + ' ' + body.innerHTML);\r
+ \r
+ X.Timer.add( 200, X.Dom.Event._detectFontSize );\r
+} );\r
+\r
+Node._fontSizeNode = null;\r
+\r
+X.Dom.Event._lastFontSize = 0;\r
+X.Dom.Event._detectFontSize = function(){\r
+ var size = Node._fontSizeNode._rawNode.offsetHeight;\r
+ if( X.Dom.Event._lastFontSize !== size ){\r
+ X.Dom.Event._lastFontSize && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.BASE_FONT_RESIZED, size : size } );\r
+ X.Dom.Event._lastFontSize = size;\r
+ };\r
+};\r
-X.Dom.BoxModel = {
- CONTENT_BOX : 1,
- PADDING_BOX : 2,
- BORDER_BOX : 3,
- MARGIN_BOX : 4,
-
- defaultBoxModel : 0,
- boxSizingEnabled : false
-};
-
-X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){
-
- var elm = Node._systemNode._rawNode || Node._systemNode._ie4getRawNode();
- elm.style.cssText = 'width:10px;padding:1px;border:2px solid #0;margin:4px;';
-
- X.Dom.BoxModel.defaultBoxModel = elm.offsetWidth === 10 ?
- X.Dom.BoxModel.BORDER_BOX :
- X.Dom.BoxModel.CONTENT_BOX;
-
- if( X.Dom.BoxModel.defaultBoxModel === X.Dom.BoxModel.CONTENT_BOX ){
- elm.style.cssText += 'box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing: border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;';
-
- X.Dom.BoxModel.boxSizingEnabled = elm.offsetWidth === 10;
- };
- // padding
- // border
- // margin
- // top
-
-
-});
-
-/* --------------------------------------
- * Width, Height
- * display:blobk かつ overflow:hidden かつ size(px,em)が設定されていたら、再描画しないでその値を返す
- * display:none なら 0
- */
-Node.prototype.width = function(){
- if( !this.parent ){
- console.log( 'xnode.width() : no parent' );
- return 0;
- };
- Node.root._updateTimerID && Node.root._startUpdate();
- if( document.getElementById ){
- // this.css( X.Dom.Style.Unit.px, 'width' );
- return this._rawNode.offsetWidth;
- } else
- if( document.all ){
- return ( this._rawNode || this._ie4getRawNode() ).offsetWidth;
- } else {
-
- };
-};
-
-Node.prototype.height = function(){
- if( !this.parent ){
- console.log( 'xnode.height() : no parent' );
- return 0;
- };
- Node.root._updateTimerID && Node.root._startUpdate();
- if( document.getElementById ){
- // this.css( X.Dom.Style.Unit.px, 'height' );
- return this._rawNode.offsetHeight;
- } else
- if( document.all ){
- return ( this._rawNode || this._ie4getRawNode() ).offsetHeight;
- } else {
-
- };
-};
-
-/* --------------------------------------
- * x, y
- * position:absolute かつ x か y が設定されていたら、再描画しないで css オブジェクトから計算した値を返す。 float は?
- * position:absolute の指定で自動で top,left を補う必要あり? -> X.Dom.Style
- * 親要素 border 外側からの値。 IE, Firefox, Safari, Chrome の offsetLeft/Topでは、border 内側なので補正する。
- * transformX, Y は加える? アニメーション中は?
- */
-// X.Dom.Style.transform,
-Node.prototype.x = function(){
- if( !this.parent ){
- console.log( 'xnode.x() : no parent' );
- return 0;
- };
- Node.root._updateTimerID && Node.root._startUpdate();
- if( document.getElementById ){
- // this.css( X.Dom.Style.Unit.px, 'left' );
- // this.css( X.Dom.Style.Unit.px, 'translateX' );
- return this._rawNode.offsetLeft;
- } else
- if( document.all ){
- return ( this._rawNode || this._ie4getRawNode() ).offsetLeft;
- } else {
-
- };
-};
-
-Node.prototype.y = function(){
- if( !this.parent ){
- console.log( 'xnode.y() : no parent' );
- return 0;
- };
- Node.root._updateTimerID && Node.root._startUpdate();
- if( document.getElementById ){
- // this.css( X.Dom.Style.Unit.px, 'top' );
- // this.css( X.Dom.Style.Unit.px, 'transisitonY' );
- return this._rawNode.offsetTop;
- } else
- if( document.all ){
- return ( this._rawNode || this._ie4getRawNode() ).offsetTop;
- } else {
-
- };
-};
-
+X.Dom.BoxModel = {\r
+ CONTENT_BOX : 1,\r
+ PADDING_BOX : 2,\r
+ BORDER_BOX : 3,\r
+ MARGIN_BOX : 4,\r
+ \r
+ defaultBoxModel : 0,\r
+ boxSizingEnabled : false\r
+};\r
+\r
+X.Dom.listenOnce( X.Dom.Event.DOM_INIT, function(){\r
+\r
+ var elm = Node._systemNode._rawNode || Node._systemNode._ie4getRawNode();\r
+ elm.style.cssText = 'width:10px;padding:1px;border:2px solid #0;margin:4px;';\r
+ \r
+ X.Dom.BoxModel.defaultBoxModel = elm.offsetWidth === 10 ?\r
+ X.Dom.BoxModel.BORDER_BOX :\r
+ X.Dom.BoxModel.CONTENT_BOX;\r
+ \r
+ if( X.Dom.BoxModel.defaultBoxModel === X.Dom.BoxModel.CONTENT_BOX ){\r
+ elm.style.cssText += 'box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing: border-box;-o-box-sizing:border-box;-ms-box-sizing:border-box;';\r
+ \r
+ X.Dom.BoxModel.boxSizingEnabled = elm.offsetWidth === 10;\r
+ };\r
+ // padding\r
+ // border\r
+ // margin\r
+ // top\r
+\r
+\r
+});\r
+\r
+/* --------------------------------------\r
+ * Width, Height\r
+ * display:blobk かつ overflow:hidden かつ size(px,em)が設定されていたら、再描画しないでその値を返す\r
+ * display:none なら 0\r
+ */\r
+Node.prototype.width = function(){\r
+ if( !this.parent ){\r
+ console.log( 'xnode.width() : no parent' );\r
+ return 0;\r
+ };\r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ if( document.getElementById ){\r
+ // this.css( X.Dom.Style.Unit.px, 'width' );\r
+ return this._rawNode.offsetWidth;\r
+ } else\r
+ if( document.all ){\r
+ return ( this._rawNode || this._ie4getRawNode() ).offsetWidth;\r
+ } else {\r
+ \r
+ };\r
+};\r
+\r
+Node.prototype.height = function(){\r
+ if( !this.parent ){\r
+ console.log( 'xnode.height() : no parent' );\r
+ return 0;\r
+ };\r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ if( document.getElementById ){\r
+ // this.css( X.Dom.Style.Unit.px, 'height' );\r
+ return this._rawNode.offsetHeight;\r
+ } else\r
+ if( document.all ){\r
+ return ( this._rawNode || this._ie4getRawNode() ).offsetHeight;\r
+ } else {\r
+ \r
+ };\r
+};\r
+\r
+/* --------------------------------------\r
+ * x, y\r
+ * position:absolute かつ x か y が設定されていたら、再描画しないで css オブジェクトから計算した値を返す。 float は?\r
+ * position:absolute の指定で自動で top,left を補う必要あり? -> X.Dom.Style\r
+ * 親要素 border 外側からの値。 IE, Firefox, Safari, Chrome の offsetLeft/Topでは、border 内側なので補正する。\r
+ * transformX, Y は加える? アニメーション中は?\r
+ */\r
+// X.Dom.Style.transform,\r
+Node.prototype.x = function(){\r
+ if( !this.parent ){\r
+ console.log( 'xnode.x() : no parent' );\r
+ return 0;\r
+ };\r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ if( document.getElementById ){\r
+ // this.css( X.Dom.Style.Unit.px, 'left' );\r
+ // this.css( X.Dom.Style.Unit.px, 'translateX' );\r
+ return this._rawNode.offsetLeft;\r
+ } else\r
+ if( document.all ){\r
+ return ( this._rawNode || this._ie4getRawNode() ).offsetLeft;\r
+ } else {\r
+ \r
+ };\r
+};\r
+\r
+Node.prototype.y = function(){\r
+ if( !this.parent ){\r
+ console.log( 'xnode.y() : no parent' );\r
+ return 0;\r
+ };\r
+ Node.root._updateTimerID && Node.root._startUpdate();\r
+ if( document.getElementById ){\r
+ // this.css( X.Dom.Style.Unit.px, 'top' );\r
+ // this.css( X.Dom.Style.Unit.px, 'transisitonY' );\r
+ return this._rawNode.offsetTop;\r
+ } else\r
+ if( document.all ){\r
+ return ( this._rawNode || this._ie4getRawNode() ).offsetTop; \r
+ } else {\r
+ \r
+ };\r
+};\r
+\r
v = src[ p ];\r
if( X.Type.isFunction( v ) && !target[ p ] ){\r
target[ p ] = multi = new Function( [\r
- 'var a=arguments,s=a.callee,f=s.f,t=this,i,l=t.length;',\r
- 'if(0<l){',\r
+ 'var a=arguments,f=X.Dom.Node.prototype.', p, ',t=this,i,l=t.length;',\r
+ 'if(l)',\r
'for(i=0;i<l;++i)if(i===l-1)return f.apply(t[i],a);else f.apply(t[i],a);',\r
- '}',\r
'return f.apply(t,a)'\r
].join( '' ) );\r
- multi.f = v;\r
};\r
};\r
});\r
-/*
- * Original code by Erik John Resig (ejohn.org)
- * http://ejohn.org/blog/pure-javascript-html-parser/
- *
- */
-
-(function(){
-
- var alphabets = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',
- whiteSpace = '\t\r\n\f\b ';
-
- // Empty Elements - HTML 4.01
- var empty = X.Dom.DTD.EMPTY;
-
- // Block Elements - HTML 4.01
- var block = {address:1,applet:1,blockquote:1,button:1,center:1,dd:1,del:1,dir:1,div:1,dl:1,dt:1,fieldset:1,form:1,frameset:1,hr:1,iframe:1,ins:1,isindex:1,li:1,map:1,menu:1,noframes:1,noscript:1,object:1,ol:1,p:1,pre:1,script:1,table:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,ul:1};
-
- // Inline Elements - HTML 4.01
- var inline = {a:1,abbr:1,acronym:1,applet:1,b:1,basefont:1,bdo:1,big:1,br:1,button:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,label:1,map:1,object:1,q:1,s:1,samp:1,script:1,select:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,textarea:1,tt:1,u:1,'var':1};
-
- // Elements that you can, intentionally, leave open
- // (and which close themselves)
- var closeSelf = {colgroup:1,dd:1,dt:1,li:1,options:1,p:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}; // add tbody
-
- // todo:
- var plainText = { plaintext : 1, xmp : 1 };
-
- var sisters = {
- th : { td : 1 },
- td : { th : 1 },
- dt : { dd : 1 },
- dd : { dt : 1 },
- colgroup : { caption : 1 },
- thead : { caption : 1, colgroup : 1 },
- tfoot : { caption : 1, colgroup : 1, thead : 1, tbody : 1 },
- tbody : { caption : 1, colgroup : 1, thead : 1, tfoot : 1 }
- };
- /*
- * http://www.tohoho-web.com/html/tbody.htm
- * HTML4.01では、ヘッダとフッタを先読みして表示するために、<tbody> よりも <tfoot> の方を先に記述しなくてはならないと定義されています。
- * IE5.0 などでは HEAD → BODY → FOOT の順に表示するのですが、
- * <tfoot> に未対応の古いブラウザでは、HEAD → FOOT → BODY の順に表示されてしまいます。
- * また、HTML5 では、<tfoot> と <tbody> の順番はどちらでもよいことになりました。
- */
-
- // Attributes that have their values filled in disabled="disabled"
- var fillAttrs = X.Dom.Attr.noValue; //{checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};
-
- // Special Elements (can contain anything)
- var special = {script:1,style:1};
-
- X.Dom.Parser = function( html, handler ) {
- var stack = [],
- lastHtml = html,
- chars, last, text, index;
-
- while ( html ) {
- chars = true;
- last = stack[ stack.length - 1 ];
-
- // Make sure we're not in a script or style element
- if ( last && special[ last.toLowerCase() ] === 1 ) {
- if( 0 <= ( index = _parseEndTag( stack, handler, html ) ) ){
- //handler.chars( html.substring( 0, index ) );
- html = html.substring( index );
- };
- } else {
- // Comment
- if ( html.indexOf("<!--") === 0 ) {
- if ( 0 < ( index = html.indexOf("-->") ) ) {
- handler.comment( html.substring( 4, index ) );
- html = html.substring( index + 3 );
- chars = false;
- };
-
- // end tag
- } else if ( html.indexOf("</") === 0 ) {
- if ( 2 < ( index = _parseEndTag( stack, handler, html ) ) ) {
- html = html.substring( index );
- chars = false;
- };
-
- // start tag
- } else if ( html.indexOf("<") === 0 ) {
- if( index = _parseStartTag( stack, last, handler, html ) ){
- html = html.substring( index );
- chars = false;
- } else
- if( index === false ){
- return;
- };
- };
-
- if ( chars ) {
- index = html.indexOf("<");
-
- text = index < 0 ? html : html.substring( 0, index );
- html = index < 0 ? '' : html.substring( index );
-
- handler.chars( text );
- };
-
- };
-
- if ( html === lastHtml ){
- handler.err( html );
- return;
- };
- lastHtml = html;
- };
-
- // Clean up any remaining tags
- parseEndTag( stack, handler );
- };
-
- function _parseStartTag( stack, last, handler, html ){
- var uri = X.Dom.DTD.ATTR_VAL_IS_URI,
- phase = 0,
- l = html.length,
- i = 0,
- attrs = [],
- tagName, empty,
- chr, start, attrName, quot, escape;
-
- while( i < l && phase < 9 ){
- chr = html.charAt( i );
- switch( phase ){
- case 0 :
- chr === '<' && ( ++phase );
- break;
- case 1 : // タグ名の開始を待つ
- alphabets.indexOf( chr ) !== -1 && ( ++phase && ( start = i ) );
- break;
- case 2 : // タグ名の終わりの空白文字を待つ
- whiteSpace.indexOf( chr ) !== -1 ?
- ( ++phase && ( tagName = html.substring( start, i ) ) ) :
- ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&
- ( ( tagName = html.substring( start, i ) ) && ( phase = 9 ) );
- break;
- case 3 : // 属性名の開始を待つ
- alphabets.indexOf( chr ) !== -1 ?
- ( ++phase && ( start = i ) ) :
- ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&
- ( phase = 9 );
- break;
- case 4 : // 属性名の終わりを待つ
- chr === '=' ?
- ( ( phase = 6 ) && ( attrName = html.substring( start, i ) ) ) :
- whiteSpace.indexOf( chr ) !== -1 &&
- ( ( phase = 5 ) && ( attrName = html.substring( start, i ) ) );
- break;
- case 5 : // 属性の = または次の属性または htmlタグの閉じ
- whiteSpace.indexOf( chr ) !== -1 ?// ie4 未対応の属性には cite = http:// となる
- 1 :
- alphabets.indexOf( chr ) !== -1 ?
- ( ( phase = 4 ) && ( attrs[ attrs.length ] = attrName ) && ( start = i ) ) :
- chr === '=' ?
- ( phase = 6 ) :
- ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&
- ( ( phase = 9 ) && ( attrs[ attrs.length ] = attrName ) );
- break;
- case 6 : // 属性値の開始 quot を待つ
- ( chr === '"' || chr === "'" ) ?
- ( ( phase = 7 ) && ( quot = chr ) && ( start = i + 1 ) ):
- whiteSpace.indexOf( chr ) === -1 &&
- ( ( phase = 8 ) && ( start = i ) ); // no quot
- break;
- case 7 : //属性値の閉じ quot を待つ
- !escape && ( chr === quot ) && ( phase = 3 ) && saveAttr( attrs, attrName, html.substring( start, i ) );
- break;
- case 8 : //閉じ quot のない属性の値
- whiteSpace.indexOf( chr ) !== -1 ?
- ( ( phase = 3 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :
- ( chr === '>' ) ?
- ( ( phase = 9 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :
- ( !escape && uri.indexOf( attrName ) === -1 && html.substr( i, 2 ) === '/>' ) && // attr の val が uri で / で終わりかつ、未対応属性の場合
- ( empty = true );
- break;
- };
- escape = chr === '\\' && !escape; // \\\\ is not escape for "
- ++i;
- };
- if( phase === 9 ){
- if( parseStartTag( stack, last, handler, tagName, attrs, empty, i ) === false ) return false;
- return i;
- };
- return 0; // error
- };
-
- function _parseEndTag( stack, handler, html ){
- var phase = 0,
- l = html.length,
- i = 0,
- tagName,
- chr, start;
-
- while( i < l && phase < 9 ){
- chr = html.charAt( i );
- switch( phase ){
- case 0 :
- html.substr( i, 2 ) === '</' && ( ++phase && ++i );
- break;
- case 1 : // タグ名の開始を待つ
- alphabets.indexOf( chr ) !== -1 && ( ++phase && ( start = i ) );
- break;
- case 2 : // タグ名の終わりの空白文字を待つ
- whiteSpace.indexOf( chr ) !== -1 && ( ++phase );
- ( chr === '>' ) && ( phase = 9 );
- ( phase !== 2 ) && ( tagName = html.substring( start, i ) );
- break;
- case 3 : // 属性名の開始を待つ
- chr === '>' && ( phase = 9 );
- break;
- };
- ++i;
- };
- if( phase === 9 ){
- parseEndTag( stack, handler, tagName );
- return i;
- };
- return 0; // error
- };
-
- function saveAttr( attrs, name, value ){
- name = name.toLowerCase();
- value = fillAttrs[ name ] === 1 ? name : value;
- attrs[ attrs.length ] = {
- name : name,
- value : value,
- escaped :
- value.indexOf( '"' ) !== -1 ?
- value.split( '"' ).join( '\\"' ).split( '\\\\"' ).join( '\\"' ) :
- value
- };
- };
-
- function parseStartTag( stack, last, handler, tagName, attrs, unary, index ) {
- var tagLower = tagName.toLowerCase();
- if ( block[ tagLower ] === 1 ) {
- while ( last && inline[ last.toLowerCase() ] === 1 ) {
- parseEndTag( stack, handler, last );
- last = stack[ stack.length - 1 ];
- };
- };
- closeSelf[ tagLower ] === 1 && ( last === tagName || ( sisters[ tagLower ] && sisters[ tagLower ][ last.toLowerCase() ] === 1 ) ) && parseEndTag( stack, handler, last );
- unary = empty[ tagLower ] === 1 || !!unary;
- !unary && ( stack[ stack.length ] = tagName );
-
- return handler.start( tagName, attrs, unary, index );
- };
-
- function parseEndTag( stack, handler, tagName ) {
- var pos = 0, i = stack.length;
- // If no tag name is provided, clean shop
-
- // Find the closest opened tag of the same type
- if ( tagName )
- for ( pos = i; 0 <= pos; )
- if ( stack[ --pos ] === tagName )
- break;
-
- if ( 0 <= pos ) {
- // Close all the open elements, up the stack
- for ( ; pos < i; )
- handler.end( stack[ --i ] );
-
- // Remove the open elements from the stack
- stack.length = pos;
- };
- };
-
-})();
-
-X.Dom._htmlStringToXNode = {
- flat : null,
- nest : [],
- err : function( html ){
- this.flat.length = 0;
- this.ignoreError !== true && X.Notification.warn( 'X.Dom.Parser() error ' + html );
- },
- start : function( tagName, attrs, noChild, length ){
- var xnode,
- nest = this.nest,
- flat = this.flat,
- l = nest.length,
- attr, name, i, _attrs; //, toIndex;
- if( l ){
- xnode = nest[ l - 1 ].create( tagName );
- } else {
- xnode = flat[ flat.length ] = X.Dom.Node.create( tagName );
- };
- if( !noChild ) nest[ l ] = xnode;
- if( i = attrs.length ){
- _attrs = {};
- for( ; i; ){
- if( attr = attrs[ --i ] ){
- if( typeof attr === 'string' ){
- name = attr;
- _attrs[ name ] = true;
- } else {
- name = attr.name;
- _attrs[ name ] = attr.escaped;
- };
- };
- };
- xnode.attr( _attrs );
- };
- },
- end : function(){
- 0 < this.nest.length && ( --this.nest.length );
- },
- chars : function( text ){
- if( this.nest.length ){
- this.nest[ this.nest.length - 1 ].createText( text );
- } else {
- this.flat[ this.flat.length ] = X.Dom.Node.createText( text );
- };
- },
- comment : X.emptyFunction
-};
-
-X.Dom.parse = function( html, ignoreError ){
- var worker = X.Dom._htmlStringToXNode, ret;
- worker.flat = [];
- worker.nest.length = 0;
- worker.ignoreError = ignoreError;
- X.Dom.Parser( html, worker );
- ret = worker.flat;
- delete worker.flat;
- return ret;
-};
-
+\r
+/*\r
+ * Original code by Erik John Resig (ejohn.org)\r
+ * http://ejohn.org/blog/pure-javascript-html-parser/\r
+ *\r
+ */\r
+\r
+(function(){\r
+\r
+ var alphabets = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',\r
+ whiteSpace = '\t\r\n\f\b ';\r
+\r
+ // Empty Elements - HTML 4.01\r
+ var empty = X.Dom.DTD.EMPTY;\r
+\r
+ // Block Elements - HTML 4.01\r
+ var block = {address:1,applet:1,blockquote:1,button:1,center:1,dd:1,del:1,dir:1,div:1,dl:1,dt:1,fieldset:1,form:1,frameset:1,hr:1,iframe:1,ins:1,isindex:1,li:1,map:1,menu:1,noframes:1,noscript:1,object:1,ol:1,p:1,pre:1,script:1,table:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1,ul:1};\r
+\r
+ // Inline Elements - HTML 4.01\r
+ var inline = {a:1,abbr:1,acronym:1,applet:1,b:1,basefont:1,bdo:1,big:1,br:1,button:1,cite:1,code:1,del:1,dfn:1,em:1,font:1,i:1,iframe:1,img:1,input:1,ins:1,kbd:1,label:1,map:1,object:1,q:1,s:1,samp:1,script:1,select:1,small:1,span:1,strike:1,strong:1,sub:1,sup:1,textarea:1,tt:1,u:1,'var':1};\r
+\r
+ // Elements that you can, intentionally, leave open\r
+ // (and which close themselves)\r
+ var closeSelf = {colgroup:1,dd:1,dt:1,li:1,options:1,p:1,tbody:1,td:1,tfoot:1,th:1,thead:1,tr:1}; // add tbody\r
+\r
+ // todo:\r
+ var plainText = { plaintext : 1, xmp : 1 };\r
+\r
+ var sisters = {\r
+ th : { td : 1 },\r
+ td : { th : 1 },\r
+ dt : { dd : 1 },\r
+ dd : { dt : 1 },\r
+ colgroup : { caption : 1 },\r
+ thead : { caption : 1, colgroup : 1 },\r
+ tfoot : { caption : 1, colgroup : 1, thead : 1, tbody : 1 },\r
+ tbody : { caption : 1, colgroup : 1, thead : 1, tfoot : 1 }\r
+ };\r
+ /*\r
+ * http://www.tohoho-web.com/html/tbody.htm\r
+ * HTML4.01では、ヘッダとフッタを先読みして表示するために、<tbody> よりも <tfoot> の方を先に記述しなくてはならないと定義されています。\r
+ * IE5.0 などでは HEAD → BODY → FOOT の順に表示するのですが、\r
+ * <tfoot> に未対応の古いブラウザでは、HEAD → FOOT → BODY の順に表示されてしまいます。\r
+ * また、HTML5 では、<tfoot> と <tbody> の順番はどちらでもよいことになりました。\r
+ */\r
+\r
+ // Attributes that have their values filled in disabled="disabled"\r
+ var fillAttrs = X.Dom.Attr.noValue; //{checked:1,compact:1,declare:1,defer:1,disabled:1,ismap:1,multiple:1,nohref:1,noresize:1,noshade:1,nowrap:1,readonly:1,selected:1};\r
+\r
+ // Special Elements (can contain anything)\r
+ var special = {script:1,style:1};\r
+\r
+ X.Dom.Parser = function( html, handler ) {\r
+ var stack = [],\r
+ lastHtml = html,\r
+ chars, last, text, index;\r
+\r
+ while ( html ) {\r
+ chars = true;\r
+ last = stack[ stack.length - 1 ];\r
+ \r
+ // Make sure we're not in a script or style element\r
+ if ( last && special[ last.toLowerCase() ] === 1 ) {\r
+ if( 0 <= ( index = _parseEndTag( stack, handler, html ) ) ){\r
+ //handler.chars( html.substring( 0, index ) );\r
+ html = html.substring( index );\r
+ };\r
+ } else {\r
+ // Comment\r
+ if ( html.indexOf("<!--") === 0 ) {\r
+ if ( 0 < ( index = html.indexOf("-->") ) ) {\r
+ handler.comment( html.substring( 4, index ) );\r
+ html = html.substring( index + 3 );\r
+ chars = false;\r
+ };\r
+ \r
+ // end tag\r
+ } else if ( html.indexOf("</") === 0 ) {\r
+ if ( 2 < ( index = _parseEndTag( stack, handler, html ) ) ) {\r
+ html = html.substring( index );\r
+ chars = false;\r
+ };\r
+ \r
+ // start tag\r
+ } else if ( html.indexOf("<") === 0 ) {\r
+ if( index = _parseStartTag( stack, last, handler, html ) ){\r
+ html = html.substring( index );\r
+ chars = false;\r
+ } else\r
+ if( index === false ){\r
+ return;\r
+ };\r
+ };\r
+\r
+ if ( chars ) {\r
+ index = html.indexOf("<");\r
+ \r
+ text = index < 0 ? html : html.substring( 0, index );\r
+ html = index < 0 ? '' : html.substring( index );\r
+ \r
+ handler.chars( text );\r
+ };\r
+\r
+ };\r
+\r
+ if ( html === lastHtml ){\r
+ handler.err( html );\r
+ return;\r
+ };\r
+ lastHtml = html;\r
+ };\r
+ \r
+ // Clean up any remaining tags\r
+ parseEndTag( stack, handler );\r
+ };\r
+\r
+ function _parseStartTag( stack, last, handler, html ){\r
+ var uri = X.Dom.DTD.ATTR_VAL_IS_URI,\r
+ phase = 0,\r
+ l = html.length,\r
+ i = 0,\r
+ attrs = [],\r
+ tagName, empty,\r
+ chr, start, attrName, quot, escape;\r
+ \r
+ while( i < l && phase < 9 ){\r
+ chr = html.charAt( i );\r
+ switch( phase ){\r
+ case 0 :\r
+ chr === '<' && ( ++phase );\r
+ break;\r
+ case 1 : // タグ名の開始を待つ\r
+ alphabets.indexOf( chr ) !== -1 && ( ++phase && ( start = i ) );\r
+ break;\r
+ case 2 : // タグ名の終わりの空白文字を待つ\r
+ whiteSpace.indexOf( chr ) !== -1 ?\r
+ ( ++phase && ( tagName = html.substring( start, i ) ) ) :\r
+ ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&\r
+ ( ( tagName = html.substring( start, i ) ) && ( phase = 9 ) );\r
+ break;\r
+ case 3 : // 属性名の開始を待つ\r
+ alphabets.indexOf( chr ) !== -1 ?\r
+ ( ++phase && ( start = i ) ) :\r
+ ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&\r
+ ( phase = 9 );\r
+ break;\r
+ case 4 : // 属性名の終わりを待つ\r
+ chr === '=' ?\r
+ ( ( phase = 6 ) && ( attrName = html.substring( start, i ) ) ) :\r
+ whiteSpace.indexOf( chr ) !== -1 &&\r
+ ( ( phase = 5 ) && ( attrName = html.substring( start, i ) ) );\r
+ break;\r
+ case 5 : // 属性の = または次の属性または htmlタグの閉じ\r
+ whiteSpace.indexOf( chr ) !== -1 ?// ie4 未対応の属性には cite = http:// となる\r
+ 1 :\r
+ alphabets.indexOf( chr ) !== -1 ?\r
+ ( ( phase = 4 ) && ( attrs[ attrs.length ] = attrName ) && ( start = i ) ) :\r
+ chr === '=' ?\r
+ ( phase = 6 ) :\r
+ ( chr === '>' || ( empty = html.substr( i, 2 ) === '/>' ) ) &&\r
+ ( ( phase = 9 ) && ( attrs[ attrs.length ] = attrName ) );\r
+ break;\r
+ case 6 : // 属性値の開始 quot を待つ\r
+ ( chr === '"' || chr === "'" ) ?\r
+ ( ( phase = 7 ) && ( quot = chr ) && ( start = i + 1 ) ):\r
+ whiteSpace.indexOf( chr ) === -1 &&\r
+ ( ( phase = 8 ) && ( start = i ) ); // no quot\r
+ break;\r
+ case 7 : //属性値の閉じ quot を待つ\r
+ !escape && ( chr === quot ) && ( phase = 3 ) && saveAttr( attrs, attrName, html.substring( start, i ) );\r
+ break;\r
+ case 8 : //閉じ quot のない属性の値\r
+ whiteSpace.indexOf( chr ) !== -1 ?\r
+ ( ( phase = 3 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :\r
+ ( chr === '>' ) ?\r
+ ( ( phase = 9 ) && saveAttr( attrs, attrName, html.substring( start, i ) ) ) :\r
+ ( !escape && uri.indexOf( attrName ) === -1 && html.substr( i, 2 ) === '\/>' ) && // attr の val が uri で / で終わりかつ、未対応属性の場合\r
+ ( empty = true );\r
+ break;\r
+ };\r
+ escape = chr === '\\' && !escape; // \\\\ is not escape for "\r
+ ++i;\r
+ };\r
+ if( phase === 9 ){\r
+ if( parseStartTag( stack, last, handler, tagName, attrs, empty, i ) === false ) return false;\r
+ return i;\r
+ };\r
+ return 0; // error\r
+ };\r
+\r
+ function _parseEndTag( stack, handler, html ){\r
+ var phase = 0,\r
+ l = html.length,\r
+ i = 0,\r
+ tagName,\r
+ chr, start;\r
+ \r
+ while( i < l && phase < 9 ){\r
+ chr = html.charAt( i );\r
+ switch( phase ){\r
+ case 0 :\r
+ html.substr( i, 2 ) === '</' && ( ++phase && ++i );\r
+ break;\r
+ case 1 : // タグ名の開始を待つ\r
+ alphabets.indexOf( chr ) !== -1 && ( ++phase && ( start = i ) );\r
+ break;\r
+ case 2 : // タグ名の終わりの空白文字を待つ\r
+ whiteSpace.indexOf( chr ) !== -1 && ( ++phase );\r
+ ( chr === '>' ) && ( phase = 9 );\r
+ ( phase !== 2 ) && ( tagName = html.substring( start, i ) );\r
+ break;\r
+ case 3 : // 属性名の開始を待つ\r
+ chr === '>' && ( phase = 9 );\r
+ break;\r
+ };\r
+ ++i;\r
+ };\r
+ if( phase === 9 ){\r
+ parseEndTag( stack, handler, tagName );\r
+ return i;\r
+ };\r
+ return 0; // error\r
+ };\r
+\r
+ function saveAttr( attrs, name, value ){\r
+ name = name.toLowerCase();\r
+ value = fillAttrs[ name ] === 1 ? name : value;\r
+ attrs[ attrs.length ] = {\r
+ name : name,\r
+ value : value,\r
+ escaped :\r
+ value.indexOf( '"' ) !== -1 ?\r
+ value.split( '"' ).join( '\\"' ).split( '\\\\"' ).join( '\\"' ) :\r
+ value\r
+ };\r
+ };\r
+\r
+ function parseStartTag( stack, last, handler, tagName, attrs, unary, index ) {\r
+ var tagLower = tagName.toLowerCase();\r
+ if ( block[ tagLower ] === 1 ) {\r
+ while ( last && inline[ last.toLowerCase() ] === 1 ) {\r
+ parseEndTag( stack, handler, last );\r
+ last = stack[ stack.length - 1 ];\r
+ };\r
+ };\r
+ closeSelf[ tagLower ] === 1 && ( last === tagName || ( sisters[ tagLower ] && sisters[ tagLower ][ last.toLowerCase() ] === 1 ) ) && parseEndTag( stack, handler, last );\r
+ unary = empty[ tagLower ] === 1 || !!unary;\r
+ !unary && ( stack[ stack.length ] = tagName );\r
+ \r
+ return handler.start( tagName, attrs, unary, index );\r
+ };\r
+\r
+ function parseEndTag( stack, handler, tagName ) {\r
+ var pos = 0, i = stack.length;\r
+ // If no tag name is provided, clean shop\r
+ \r
+ // Find the closest opened tag of the same type\r
+ if ( tagName )\r
+ for ( pos = i; 0 <= pos; )\r
+ if ( stack[ --pos ] === tagName )\r
+ break;\r
+ \r
+ if ( 0 <= pos ) {\r
+ // Close all the open elements, up the stack\r
+ for ( ; pos < i; )\r
+ handler.end( stack[ --i ] );\r
+ \r
+ // Remove the open elements from the stack\r
+ stack.length = pos;\r
+ };\r
+ };\r
+\r
+})();\r
+\r
+X.Dom._htmlStringToXNode = {\r
+ flat : null,\r
+ nest : [],\r
+ err : function( html ){\r
+ this.flat.length = 0;\r
+ this.ignoreError !== true && X.Notification.warn( 'X.Dom.Parser() error ' + html );\r
+ },\r
+ start : function( tagName, attrs, noChild, length ){\r
+ var xnode,\r
+ nest = this.nest,\r
+ flat = this.flat,\r
+ l = nest.length,\r
+ attr, name, i, _attrs; //, toIndex;\r
+ if( l ){\r
+ xnode = nest[ l - 1 ].create( tagName );\r
+ } else {\r
+ xnode = flat[ flat.length ] = X.Dom.Node.create( tagName );\r
+ };\r
+ if( !noChild ) nest[ l ] = xnode;\r
+ if( i = attrs.length ){\r
+ _attrs = {};\r
+ for( ; i; ){\r
+ if( attr = attrs[ --i ] ){\r
+ if( typeof attr === 'string' ){\r
+ name = attr;\r
+ _attrs[ name ] = true;\r
+ } else {\r
+ name = attr.name;\r
+ _attrs[ name ] = attr.escaped;\r
+ };\r
+ };\r
+ };\r
+ xnode.attr( _attrs );\r
+ };\r
+ },\r
+ end : function(){\r
+ 0 < this.nest.length && ( --this.nest.length );\r
+ },\r
+ chars : function( text ){\r
+ if( this.nest.length ){\r
+ this.nest[ this.nest.length - 1 ].createText( text );\r
+ } else {\r
+ this.flat[ this.flat.length ] = X.Dom.Node.createText( text );\r
+ };\r
+ },\r
+ comment : X.emptyFunction\r
+};\r
+\r
+X.Dom.parse = function( html, ignoreError ){\r
+ var worker = X.Dom._htmlStringToXNode, ret;\r
+ worker.flat = [];\r
+ worker.nest.length = 0;\r
+ worker.ignoreError = ignoreError;\r
+ X.Dom.Parser( html, worker );\r
+ ret = worker.flat;\r
+ delete worker.flat;\r
+ return ret;\r
+};\r
+\r
\r
+\r
X.Dom.Image = {\r
_actualSize : {},\r
\r
)\r
};\r
\r
+\r
+\r
if( this.rawText ) return this.rawText.data;\r
return null;\r
},\r
- paint : function( dirty ){\r
- var content = this._content,\r
- style = this.styleData; \r
- if( this.updateContent === true || ( style && style.hasPaint === true ) ){\r
- if( !this.rawElement ){\r
- this.rawElement = DOM.createDiv();\r
- this.__parent.addDisplayElement( this );\r
- };\r
- dirty !== 0 && this.commitStyle(); \r
- if( this.updateContent === true ){\r
- if( content !== null ){\r
- if( !this.rawText ){\r
- this.rawText = DOM.cerateText();\r
- this.rawElement.appendChild( this.rawText );\r
- };\r
- this.rawText.data = content; \r
- } else\r
- if( this.rawText ){\r
- DOM.correct( this.rawText );\r
- delete this.rawText;\r
- delete this.contentWidth;\r
- delete this.conetntHeight;\r
- delete this.scrollWidth; \r
- delete this.scrollHeight;\r
- }; \r
- };\r
- } else\r
- if( this.rawElement && content === null && ( !style || style.hasPaint === false ) ){\r
- this.__parent.removeDisplayElement( this );\r
- DOM.correct( this.rawElement );\r
- delete this.contentWidth;\r
- delete this.conetntHeight;\r
- };\r
- },\r
- commitStyle : function(){\r
- var css;\r
- if( this.rawElement ){\r
- css = this.styleData ? this.styleData.cssText( this ) : '';\r
- if( this.contentWidth !== AUTO ) css += 'width:' + this.contentWidth + 'px';\r
- if( this.contentHeight !== AUTO ) css += 'height:' + this.contentHeight + 'px';\r
- //this.rawElement.style.cssText = css;\r
- this.rawElement.cssText( css );\r
- };\r
- },\r
+\r
+\r
+\r
/*\r
* 親の サイズを元に自身のサイズを計算していく\r
*/\r
preMesure : function( allowW, allowH ){\r
var style = this.styleData,\r
styles, calc, box, min, max,\r
- contentW, contentH, allowSize, boxMinus,\r
+ contentW, contentH, boxMinus,\r
paddingT, paddingR, paddingB, paddingL,\r
- borderT, borderR, borderB, borderL;//,\r
- //marginT, marginR, marginB, marginL;\r
+ borderT, borderR, borderB, borderL;\r
\r
if( style ){\r
styles = style.data;\r
paddingR = calc( styles[ X.Css.AttrNo.padding + 1 ], allowW );\r
paddingL = calc( styles[ X.Css.AttrNo.padding + 3 ], allowW );\r
borderR = styles[ X.Css.AttrNo.border + 1 ];\r
- borderL = styles[ X.Css.AttrNo.margin + 3 ];\r
- // marginR = calc( styles[ X.Css.AttrNo.margin + 1 ], allowW );\r
- // marginL = calc( styles[ X.Css.AttrNo.margin + 3 ], allowW );\r
+ borderL = styles[ X.Css.AttrNo.border + 3 ];\r
boxMinus = 0;\r
switch( box ){\r
- //case 3 : // margin-box\r
- // boxMinus = - marginR - marginL;\r
case 2 : // border-box\r
boxMinus -= borderR + borderL;\r
case 1 : // padding-box\r
boxMinus -= paddingR + paddingL;\r
// case 0 : // content-box\r
};\r
- this.contentL = /* marginL + */ borderL + paddingL;\r
- this.contentR = /* marginR + */ borderR + paddingR; \r
+ this.contentL = borderL + paddingL;\r
+ this.contentR = borderR + paddingR; \r
this.contentWidth = contentW + boxMinus;\r
this.boxWidth = contentW - boxMinus + this.contentL + this.contentR;\r
this.boxSizingOffsetLR = boxMinus;\r
} else {\r
contentH = _AbstractUINode.finalValue( styles[ X.Css.AttrNo.height ], styles[ X.Css.AttrNo.minHeight ], styles[ X.Css.AttrNo.maxHeight ], allowH );\r
};\r
- allowSize = styles[ X.Css.AttrNo.pageBox ] === true ? allowH : allowW;\r
- paddingT = calc( styles[ X.Css.AttrNo.padding + 0 ], allowSize );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
- paddingB = calc( styles[ X.Css.AttrNo.padding + 2 ], allowSize );\r
+ paddingT = calc( styles[ X.Css.AttrNo.padding + 0 ], allowH );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
+ paddingB = calc( styles[ X.Css.AttrNo.padding + 2 ], allowH );\r
borderT = styles[ X.Css.AttrNo.border + 0 ];\r
borderB = styles[ X.Css.AttrNo.border + 2 ];\r
- // marginT = calc( styles[ X.Css.AttrNo.margin + 0 ], allowSize );// marginTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
- // marginB = calc( styles[ X.Css.AttrNo.margin + 2 ], allowSize );\r
this.boxHeight = contentH;\r
boxMinus = 0;\r
switch( box ){\r
- // case 3 : // margin-box\r
- // boxMinus = - marginT - marginR;\r
case 2 : // border-box\r
- boxMinus = borderT + borderB;\r
+ boxMinus -= borderT + borderB;\r
case 1 : // padding-box\r
boxMinus -= paddingT + paddingB;\r
// case 0 : // content-box\r
}; \r
- this.contentT = /* marginT + */ borderT + paddingT;\r
- this.conetntB = /* marginB + */ borderB + paddingB; \r
+ this.contentT = borderT + paddingT;\r
+ this.conetntB = borderB + paddingB; \r
this.contentHeight = contentH + boxMinus;\r
- this.boxHeight = contentH - boxMinus + this.contentT + this.conetntB;\r
+ this.boxHeight = contentH - boxMinus + this.contentT + this.conetntB; // padding-box の場合 border だけ足される\r
this.boxSizingOffsetTB = boxMinus;\r
} else {\r
this.boxHeight = this.contentHeight = AUTO;\r
} else {\r
this.boxWidth = this.contentWidth = allowW;\r
this.boxHeight = this.contentHeight = allowH;\r
+ delete this.minContentWidth;\r
+ delete this.maxContentWidth;\r
delete this.minContentHeight;\r
delete this.maxContentHeight;\r
delete this.contentL;\r
w = this.contentWidth,\r
h = this.contentHeight;\r
switch( this.updateContent === true ? X.Css.Dirty.CONTENT : dirty ){\r
+ \r
case X.Css.Dirty.CONTENT : // コンテンツが変更された\r
- this.paint( 0 );\r
- this.lastContentWidth = -1;\r
case X.Css.Dirty.FONT : // フォントサイズが変更された\r
- this.commitStyle();\r
+ this.hasTextNode && Node.root._startUpdate();\r
+ this.lastContentWidth = -1;\r
case X.Css.Dirty.REFLOW : // レイアウトの再計算が必要\r
/* http://web-designs.seesaa.net/article/188400668.html\r
* min-width の値が max-width の値より大きい場合は、max-width の値は min-width の値に設定される。\r
* コンテンツの高さの再取得が必要\r
* 必要でない\r
*/ \r
- if( this.rawText ){\r
+ if( this.hasTextNode ){\r
+ elm = this.rawElement;\r
if( w === AUTO ){\r
- w = this.contentWidth = this.elm.offsetWidth;\r
+ w = this.contentWidth = elm.width();\r
this.scrollWidth = w + this.contentL + this.contentR;\r
if( this.maxContentWidth < w - this.boxSizingOffsetLR ) this.contentWidth = this.maxContentWidth + this.boxSizingOffsetLR;\r
if( w - this.boxSizingOffsetLR < this.minContentWidth ) this.contentWidth = this.minContentWidth + this.boxSizingOffsetLR;\r
this.lastContentWidth = this.contentWidth;\r
\r
- w !== this.contentWidth && this.commitStyle();\r
+ w !== this.contentWidth && elm.css( 'width', this.contentWidth + 'px' );\r
\r
if( h === AUTO ){\r
- h = this.conetntHeight = this.elm.offsetHeight;\r
- this.scrollHeight = h + this.contentT + this.contentB;\r
+ this.conetntHeight = h = elm.height();\r
+ this.scrollHeight = h + this.contentT + this.contentB;\r
if( this.maxContentHeight < h - this.boxSizingOffsetTB ) this.contentHeight = this.maxContentHeight + this.boxSizingOffsetTB;\r
if( h - this.boxSizingOffsetTB < this.minContentHeight ) this.contentHeight = this.minContentHeight + this.boxSizingOffsetTB;\r
} else {\r
- this.scrollHeight = this.elm.offsetHeight + this.contentT + this.contentB;\r
+ this.scrollHeight = elm.height() + this.contentT + this.contentB;\r
};\r
} else\r
if( h === AUTO ){\r
- if( w !== this.lastContentWidth || dirty !== X.Css.Dirty.REFLOW ){\r
- this.commitStyle();\r
+ if( w !== this.lastContentWidth ){\r
+ elm.css( 'width', w + 'px' );\r
this.lastContentWidth = w;\r
- h = this.conetntHeight = this.elm.offsetHeight;\r
+ this.conetntHeight = h = elm.height();\r
this.scrollWidth = w + this.contentL + this.contentR;\r
this.scrollHeight = h + this.contentT + this.contentB;\r
if( this.maxContentHeight < h - this.boxSizingOffsetTB ) this.contentHeight = this.maxContentHeight + this.boxSizingOffsetTB;\r
} else {\r
this.scrollWidth = w + this.contentL + this.contentR;\r
this.scrollHeight = h + this.contentT + this.contentB;\r
- root.paintReserve( this );\r
+ //root.paintReserve( this );\r
};\r
+ } else\r
+ if( dirty !== X.Css.Dirty.REFLOW ){\r
+ this.contentWidth = elm.width();\r
+ this.contentHeight = elm.height();\r
+ this.scrollWidth = this.contentWidth + this.contentL + this.contentR;\r
+ this.scrollHeight = this.contentHeight + this.contentT + this.contentB;\r
} else {\r
- if( dirty !== X.Css.Dirty.REFLOW ){\r
- this.commitStyle();\r
- this.scrollWidth = this.elm.offsetWidth + this.contentL + this.contentR;\r
- this.scrollHeight = this.elm.offsetHeight + this.contentT + this.contentB;\r
- } else {\r
- root.paintReserve( this );\r
- this.scrollWidth = w + this.contentL + this.contentR;\r
- this.scrollHeight = h + this.contentT + this.contentB;\r
- };\r
- }; \r
+ //root.paintReserve( this );\r
+ this.scrollWidth = w + this.contentL + this.contentR;\r
+ this.scrollHeight = h + this.contentT + this.contentB;\r
+ }; \r
} else {\r
+ // コンテンツを持たないため基本のサイズは0\r
if( w === AUTO ) this.contentWidth = w = 0 < this.minContentWidth ? this.minContentWidth : 0;\r
if( h === AUTO ) this.contentHeight = h = 0 < this.minContentHeight ? this.minContentHeight : 0;\r
this.scrollWidth = w + this.contentL + this.contentR;\r
this.scrollHeight = h + this.contentT + this.contentB;\r
- root.paintReserve( this ); \r
+ //root.paintReserve( this );\r
};\r
break; \r
case X.Css.Dirty.PAINT : // 再描画のみ必要\r
var style = this.styleData,\r
styles, calc, box,\r
contentW, contentH,\r
- contentSize, contentPlus,\r
+ contentPlus,\r
paddingT, paddingR, paddingB, paddingL,\r
borderT, borderR, borderB, borderL,\r
min, max;\r
paddingR = calc( styles[ X.Css.AttrNo.padding + 1 ], contentW ); \r
paddingL = calc( styles[ X.Css.AttrNo.padding + 3 ], contentW ); \r
borderR = styles[ X.Css.AttrNo.border + 1 ]; \r
- borderL = styles[ X.Css.AttrNo.border + 3 ]; \r
- //marginR = calc( styles[ X.Css.AttrNo.margin + 1 ], contentW );\r
- //marginL = calc( styles[ X.Css.AttrNo.margin + 3 ], contentW );\r
+ borderL = styles[ X.Css.AttrNo.border + 3 ];\r
contentPlus = 0;\r
switch( box ){\r
- //case 3 : // margin-box\r
- // contentPlus = ( marginR + marginL );\r
case 2 : // border-box\r
contentPlus = borderR + borderL;\r
case 1 : // padding-box\r
contentPlus += paddingR + paddingL;\r
// case 0 : // content-box\r
};\r
- contentW += contentPlus;\r
+ \r
if( !style.constraintW ){\r
+ contentW += contentPlus;\r
min = styles[ X.Css.AttrNo.minWidth ];\r
max = styles[ X.Css.AttrNo.maxWidth ];\r
- if( contentW < min && 1 <= min && contentPlus < min ){\r
+ if( contentW < min && contentPlus < min ){\r
this.contentWidth = min - contentPlus;\r
} else\r
- if( max < contentW && 1 <= max && contentPlus < max ){\r
+ if( max < contentW && contentPlus < max ){\r
this.contentWidth = max - contentPlus;\r
};\r
};\r
- this.contentL = /* marginL + */ borderL + paddingL;\r
- this.contentR = /* marginR + */ borderR + paddingR;\r
+ this.contentL = borderL + paddingL;\r
+ this.contentR = borderR + paddingR;\r
this.boxWidth = this.contentWidth + this.contentL + this.contentR;\r
};\r
// Height\r
if( this.boxHeight === AUTO ){\r
contentH = this.contentHeight;\r
- contentSize = styles[ X.Css.AttrNo.pageBox ] === true ? contentH : contentW;\r
- paddingT = calc( styles[ X.Css.AttrNo.padding + 0 ], contentSize );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
- paddingB = calc( styles[ X.Css.AttrNo.padding + 2 ], contentSize );\r
+ paddingT = calc( styles[ X.Css.AttrNo.padding + 0 ], contentH );// paddingTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
+ paddingB = calc( styles[ X.Css.AttrNo.padding + 2 ], contentH );\r
borderT = styles[ X.Css.AttrNo.border + 0 ];\r
borderB = styles[ X.Css.AttrNo.border + 2 ];\r
- //marginT = calc( styles[ X.Css.AttrNo.margin + 0 ], contentSize );// marginTRBL の % 指定は 最大幅に対して TB でも幅に対して\r
- //marginB = calc( styles[ X.Css.AttrNo.margin + 2 ], contentSize );\r
contentPlus = 0;\r
switch( box ){\r
- //case 3 : // margin-box\r
- //contentPlus = ( marginT + marginB );\r
case 2 : // border-box\r
contentPlus = borderT + borderB;\r
case 1 : // padding-box\r
contentPlus += paddingT + paddingB;\r
// case 0 : // content-box\r
};\r
- contentH += contentPlus;\r
if( !style.constraintH ){\r
+ contentH += contentPlus;\r
min = styles[ X.Css.AttrNo.minHeight ];\r
max = styles[ X.Css.AttrNo.maxHeight ];\r
- if( contentH < min && 1 <= min && contentPlus < min ){\r
+ if( contentH < min && contentPlus < min ){\r
this.contentHeight = min - contentPlus;\r
} else\r
- if( max < contentH && 1 <= max && contentPlus < max ){\r
+ if( max < contentH && contentPlus < max ){\r
this.contentHeight = max - contentPlus;\r
};\r
};\r
- this.contentT = marginT + borderT + paddingT;\r
- this.contentB = marginB + borderB + paddingB; \r
+ this.contentT = borderT + paddingT;\r
+ this.contentB = borderB + paddingB;\r
this.boxHeight = this.contentHeight + this.contentT + this.contentB;\r
}; \r
} else {\r
this.boxWidth = this.contentWidth;\r
this.boxHeight = this.contentHeight;\r
+ delete this.minContentWidth;\r
+ delete this.maxContentWidth;\r
delete this.minContentHeight;\r
delete this.maxContentHeight;\r
delete this.contentL;\r
obj = this._cssObj,
data = this.nodeData,
elm = data.rawElement,
- //style = data.rawStyle,
parent;
if( elm ){
// width
if( isFinite( w ) === true ){
- elm.css( { width : w + 'px' } );
- //style.width = w + 'px';
+ elm.css( 'width', w + 'px' );
obj.width = w;
} else
if( isString( w ) === true ){
obj.width = w;
- elm.css( { width : w } );
- w = elm.width();// elm.offsetWidth;
+ elm.css( 'width', w );
+ w = elm.width();
};
// height
if( isFinite( h ) === true ){
- //style.height = h + 'px';
- elm.css( { height : h + 'px' } );
+ elm.css( 'height', h + 'px' );
obj.height = h;
} else
if( isString( h ) === true ){
obj.height = h;
- elm.css( { height : h } );
- h = elm.height(); //elm.offsetHeight;
+ elm.css( 'height', h );
+ h = elm.height();
};
// x
if( isFinite( x ) === true ){
- //style.left = x + 'px';
- elm.css( { left : x + 'px' } );
+ elm.css( 'left', x + 'px' );
obj.left = x;
} else
if( isString( x ) === true ){
obj.left = x;
- elm.css( { left : x } );
- x = elm.x(); // elm.offsetLeft;
+ elm.css( 'left', x );
+ x = elm.x();
};
// y
if( isFinite( y ) === true ){
- //style.top = y + 'px';
- elm.css( { top : y + 'px' } );
+ elm.css( 'top', y + 'px' );
obj.top = y;
} else
if( isString( y ) === true ){
obj.top = y;
- elm.css( { top : y } );
- y = elm.y(); // elm.offsetTop;
+ elm.css( 'top', y );
+ y = elm.y();
};
};
x = isFinite( x ) === true ? x : data.x;