OSDN Git Service

Version 0.6.28, bugfix.
authoritozyun <itozyun@user.sourceforge.jp>
Sat, 8 Mar 2014 11:02:05 +0000 (20:02 +0900)
committeritozyun <itozyun@user.sourceforge.jp>
Sat, 8 Mar 2014 11:02:05 +0000 (20:02 +0900)
12 files changed:
0.6.x/js/core/05_XTimer.js
0.6.x/js/core/06_XEventDispatcher.js
0.6.x/js/dom/11_XDomDTD.js
0.6.x/js/dom/11_XDomNode.js
0.6.x/js/dom/12_XDomEvent.js
0.6.x/js/dom/13_XDomBoxModel.js
0.6.x/js/dom/17_XDomNodeList.js
0.6.x/js/dom/18_XDomQuery.js
0.6.x/js/dom/19_XDomParser.js
0.6.x/js/dom/20_XDomImage.js
0.6.x/js/ui/06_AbstractUINode.js
0.6.x/js/ui/09_UINodeStyle.js

index cadab22..3b1b261 100644 (file)
@@ -134,7 +134,7 @@ X.Timer = ( function(){
                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
index 29ff847..a1fe81f 100644 (file)
@@ -42,7 +42,7 @@ X.EventDispatcher =
                        },\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
index de6d12d..45068d7 100644 (file)
@@ -1,6 +1,16 @@
 \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
index 549382a..9ec6353 100644 (file)
@@ -639,15 +639,24 @@ Node.prototype.getOrder = function(){
  *  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
@@ -708,10 +717,10 @@ Node.prototype.hasClass = function( v ){
 /* --------------------------------------\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
@@ -730,7 +739,7 @@ Node.prototype.html = function( html, opt_outer ){
        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
@@ -740,20 +749,22 @@ Node.prototype.html = function( html, opt_outer ){
        \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
@@ -767,11 +778,11 @@ Node.prototype.text = function( text ){
        };\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
@@ -808,12 +819,15 @@ Node.prototype._startUpdate = function(){
        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
@@ -830,6 +844,7 @@ Node.prototype._startUpdate = function(){
        \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
index 1a22f4f..e8946eb 100644 (file)
-/**
- * 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
index 94336e9..5a2b983 100644 (file)
-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
index 7bc3fb8..d55d60b 100644 (file)
@@ -51,13 +51,11 @@ X.Dom.listenOnce( X.Dom.Event.DOM_PRE_INIT, function(){
                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
index 719311a..9874d3c 100644 (file)
@@ -721,3 +721,5 @@ X.Dom.Query._filter = {
        }\r
 };\r
 \r
+\r
+\r
index 535e472..010537c 100644 (file)
-/*
- * 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
index 46870d4..469abde 100644 (file)
@@ -1,4 +1,5 @@
 \r
+\r
 X.Dom.Image = {\r
        _actualSize : {},\r
        \r
@@ -180,3 +181,5 @@ X.Dom.Image = {
        )\r
 };\r
 \r
+\r
+\r
index f0731f1..7bebfa4 100644 (file)
@@ -245,60 +245,18 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                        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
@@ -317,21 +275,17 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                        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
@@ -351,28 +305,23 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                        } 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
@@ -385,6 +334,8 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                        } 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
@@ -416,11 +367,11 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                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
@@ -440,30 +391,31 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                         *     コンテンツの高さの再取得が必要\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
@@ -471,25 +423,26 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                                        } 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
@@ -504,7 +457,7 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                        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
@@ -519,72 +472,66 @@ var _AbstractUINode = X.EventDispatcher.inherits(
                                        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
index 2dd1a68..6ba26b0 100644 (file)
@@ -171,55 +171,50 @@ var _DisplayNodeStyle = X.Class.create(
                                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;