OSDN Git Service

ae2901fbdfaa612dd625fee1fb4a40b507f218ea
[pettanr/clientJs.git] / 0.6.x / js / dom / 11_XDomNode.js
1 \r
2 X.Dom.Dirty = {\r
3         CLEAN            :  0,\r
4         CHILD_IS_DIRTY   :  1,\r
5         ID               :  2, // width, height, x, y\r
6         CONTENT          :  4, // width, height, x, y textNode の内容\r
7         CLASSNAME        :  8, // _getCharSize, width, height, x, y\r
8         ATTR             : 16, // _getCharSize, width, height, x, y\r
9         CSS              : 32, // _getCharSize, width, height, x, y\r
10         IE_FILTER        : X.UA.IE && X.UA.IE < 9 ? 64 : 0,\r
11         UNKNOWN_TAG_FIX  : 128,\r
12         IE4_TEXTNODE_FIX : 256\r
13 };\r
14 \r
15 ie55 = 7;\r
16 \r
17 X.Dom.State = {\r
18         DESTROYED          : 0,\r
19         EXIST              : 1,\r
20         BELONG_TREE        : 2,\r
21         DISPLAY_NONE       : 4,\r
22         DISPLAY_BLOCK      : 8,\r
23         DISPLAY_INLINE     : 16,\r
24         POSITION_ABSOLUTE  : 32,\r
25         OVERFLOW_HIDDEN    : 64,\r
26         HAS_WIDTH_LENGTH   : 128,\r
27         HAS_WIDTH_PERCENT  : 256,\r
28         HAS_HEIGHT_LENGTH  : 512,\r
29         HAS_HEIGHT_PERCENT : 1024,\r
30         IE4_ONLY_TEXT      : 2048,\r
31         IE5_DISPLAY_NONE_FIX : 5 <= X.UA.IE && X.UA.IE < ie55 ? 4096 : 0\r
32 };\r
33 \r
34 /*\r
35  * Node( rawElement | rawTextnode | htmlString | textString )\r
36  */\r
37 //;(function( window, document, undeifned ){\r
38 X.Dom.Node = X.EventDispatcher.inherits(\r
39         'XDomNode',\r
40         X.Class.POOL_OBJECT,\r
41         {\r
42                 _uid       : 0,\r
43                 _state     : 0,\r
44                 _dirty     : 0,\r
45                 \r
46                 _isNew     : false,\r
47                 \r
48                 _rawNode   : null,\r
49                 _root      : null, // xnode が文書ツリーに属しているか?はこれを見る\r
50                 parent     : null, // remove された枝も親子構造は維持している。\r
51                 _xnodes    : null,\r
52         \r
53                 _xnodeType : 0,\r
54                 _tag       : null,\r
55                 _text      : null,\r
56                 _id        : null,\r
57                 _className : '',\r
58 \r
59                 _attrs     : null, // X.Dom.Attr\r
60                 _newAttrs  : null,\r
61                 _attrText  : ' ', // X.Dom.Attr.objToAttrText が必要な場合は false が入っている\r
62                 \r
63                 _css       : null, // X.Dom.Style\r
64                 _cssText   : null,\r
65                 \r
66                 _fontSize  : 0,\r
67                 \r
68                 _anime     : null,\r
69                 \r
70                 Constructor : function( v ){\r
71                         var css, xnodes, xnode, parent, uid = Node._chashe.length;\r
72                         \r
73                         if( Node._newByTag ){\r
74                                 Node._newByTag  = false;\r
75                                 this._tag       = v.toUpperCase();\r
76                                 this._xnodeType = 1;\r
77                                 this._state     = X.Dom.State.DISPLAY_INLINE; // todo\r
78                                 arguments[ 1 ] && this.attr( arguments[ 1 ] );\r
79                                 css = arguments[ 2 ] || arguments[ 1 ];\r
80                                 css && this[ X.Type.isString( css ) ? 'cssText' : 'css' ]( css );\r
81                         } else\r
82                         if( Node._newByText ){\r
83                                 Node._newByText = false;\r
84                                 this._text      = v;\r
85                                 this._xnodeType = 3;\r
86                                 this._state     = X.Dom.State.DISPLAY_INLINE;\r
87                         } else {\r
88                                 if( 1 < arguments.length ) return new X.Dom.NodeList( arguments );\r
89                                 if( X.Type.isArray( v ) && v.length ) return new X.Dom.NodeList( v );\r
90                                 if( !this || this.append !== Node.prototype.append ) return new Node( v );\r
91                 \r
92                                 switch( Node._getType( v ) ){\r
93                                         case Node.IS_XNODE :\r
94                                         case Node.IS_XNODE_LIST :\r
95                                                 return v;\r
96                                         case Node.IS_RAW_HTML :\r
97                                                 if( xnode = Node._getXNode( v ) ) return xnode;\r
98                                                 // v.parentNode || v.parentElement : dom1 || dom0\r
99                                                 this.parent     = ( parent = v.parentNode || v.parentElement ) && parent.tagName /* ie7- */ && Node._getXNode( parent );\r
100                                                 this._root      = this.parent ? this.parent._root : null;\r
101                                                 this._rawNode   = v;\r
102                                                 this._xnodeType = 1;\r
103                                                 this._state     = X.Dom.State.DISPLAY_BLOCK; // todo\r
104                                                 this._tag       = v.tagName.toUpperCase();\r
105                                                 this._id        = v.id;\r
106                                                 this._className = v.className;\r
107                                                 this.cssText( v.style.cssText );\r
108                                                 // X.Dom.Dirty.CSS を落とす\r
109                                                 this._dirty = 0;\r
110                                                 // attr の回収は不可能、、、\r
111                                                 if( X.Dom.DOM_IE4 ){\r
112                                                         v.setAttribute( 'UID', '' + uid );\r
113                                                 } else {\r
114                                                         v.UID = uid;\r
115                                                 };\r
116                                                 // childNodes...\r
117                                                 break;\r
118                                         case Node.IS_RAW_TEXT :\r
119                                                 if( xnode = Node._getXNode( v ) ) return xnode;\r
120                                                 this.parent     = Node._getXNode( v.parentNode );\r
121                                                 this._root      = this.parent ? this.parent._root : null;\r
122                                                 this._rawNode   = v;\r
123                                                 this._xnodeType = 3;\r
124                                                 this._state     = X.Dom.State.DISPLAY_INLINE;\r
125                                                 this._text      = v.data;\r
126                                                 v.UID = uid;\r
127                                                 break;\r
128                                         case Node.IS_HTML_STRING :\r
129                                         case Node.IS_STRING :\r
130                                                 if( xnodes = X.Dom.parse( v, true ) && 1 < xnodes.length ) return new X.Dom.NodeList( xnodes );\r
131                                                 if( xnodes.length ) return xnodes[ 0 ];\r
132                                                 return Node.none;\r
133                                         case Node.IS_IMAGE :\r
134                                                 if( xnode = Node._getXNode( v ) ) return xnode;\r
135                                                 this._rawNode   = v;\r
136                                                 this._xnodeType = 4;\r
137                                                 v.UID           = uid;\r
138                                                 this._state     = X.Dom.State.EXIST;\r
139                                                 break;\r
140                                         case Node.IS_WINDOW :\r
141                                         case Node.IS_DOCUMENT :\r
142                                                 if( xnode = Node._getXNode( v ) ) return xnode;\r
143                                                 this._rawNode   = v;\r
144                                                 this._xnodeType = 2;\r
145                                                 this._state     = X.Dom.State.DISPLAY_BLOCK;\r
146                                                 break;\r
147                                         default :\r
148                                                 if( Node.none ) return Node.none;\r
149                                                 return;\r
150                                 };\r
151                         };\r
152                         \r
153                         Node._chashe[ this._uid = uid ] = this;\r
154                 }\r
155         }\r
156 );\r
157 \r
158 var Node = X.Dom.Node;\r
159 \r
160 Node.IS_XNODE       = 1;\r
161 Node.IS_RAW_HTML    = 2;\r
162 Node.IS_RAW_TEXT    = 3;\r
163 Node.IS_HTML_STRING = 4;\r
164 Node.IS_STRING      = 5;\r
165 //Node.IS_DOC_FRAG    = 6;\r
166 Node.IS_XNODE_LIST  = 7;\r
167 Node.IS_WINDOW      = 8;\r
168 Node.IS_DOCUMENT    = 9;\r
169 Node.IS_IMAGE       = 10;\r
170 \r
171 Node._useDocumentFragment = document.createDocumentFragment && ( !X.UA.IE || 6 <= X.UA.IE ) && document.createDocumentFragment();\r
172 \r
173 Node._getType = function( v ){\r
174         if( v === '' ) return Node.IS_STRING;\r
175         if( !v ) return 0;\r
176         if( v === window ) return Node.IS_WINDOW;\r
177         if( v === document ) return Node.IS_DOCUMENT;\r
178         if( v.constructor === window.Image ) return Node.IS_IMAGE;\r
179         if( X.UA.Safari && X.UA.Safari < 3 ){\r
180                 if( v.src !== undefined && v.onload !== undefined && X.Type.isNumber( v.height ) && X.Type.isNumber( v.width ) && X.Type.isBoolean( v.complete ) ){\r
181                         return Node.IS_IMAGE;\r
182                 };\r
183         };      \r
184         if( v.constructor === Node ) return Node.IS_XNODE;\r
185         if( v.constructor === X.Dom.NodeList ) return Node.IS_XNODE_LIST;\r
186         if( v.tagName ) return Node.IS_RAW_HTML;\r
187         if( v.nodeType === 3 ) return Node.IS_RAW_TEXT;\r
188         if( typeof v === 'string' ){\r
189                 return '<' === v.charAt( 0 ) && v.charAt( v.length - 1 ) === '>' ? Node.IS_HTML_STRING : Node.IS_STRING;\r
190         };\r
191         //if( v.nodeType === 11 ) return Node.IS_DOC_FRAG;\r
192         return 0;\r
193 };\r
194 Node._getXNode = function( v ){\r
195         var uid, i, chashe, xnode;\r
196         switch( Node._getType( v ) ){\r
197                 case Node.IS_XNODE :\r
198                 case Node.IS_XNODE_LIST :\r
199                         return v;\r
200                 case Node.IS_RAW_HTML :\r
201                 case Node.IS_IMAGE :\r
202                         // fake TextNode too.\r
203                         if( X.Dom.DOM_IE4 ){\r
204                                 uid = v.getAttribute( 'UID' );\r
205                                 return uid && Node._chashe[ uid ];\r
206                         };\r
207                         return v.UID && Node._chashe[ v.UID ];\r
208                 case Node.IS_WINDOW :\r
209                         return Node._window;\r
210                 case Node.IS_DOCUMENT :\r
211                         return Node._document;\r
212                 case Node.IS_RAW_TEXT :\r
213                         if( v.UID ) return Node._chashe[ v.UID ];\r
214                         for( chashe = Node._chashe, i = chashe.length; i; ){\r
215                                 if( ( xnode = Node._chashe[ --i ] ) && ( xnode._rawNode === v ) ) return xnode;\r
216                         };\r
217         };\r
218 };\r
219 \r
220 \r
221 Node.create = function( tag, opt_attrs, opt_css ){\r
222         var list, i;\r
223         switch( Node._getType( tag ) ){\r
224                 case Node.IS_STRING :\r
225                         Node._newByTag = true;\r
226                         return new Node( tag, opt_attrs, opt_css );\r
227                 case Node.IS_HTML_STRING :\r
228                         list = X.Dom.parse( tag, true );\r
229                         for( i = list.length; 1 < i; ){\r
230                                 list[ --i ].destroy();\r
231                         };\r
232                         return list[ 0 ];\r
233         };\r
234 };\r
235 Node.createText = function( text ){\r
236         Node._newByText = true;\r
237         return new Node( text );\r
238 };\r
239 \r
240 \r
241 Node.getRoot = function( xnode ){\r
242         return Node._document;\r
243         //return xnode.root._rawNode.documentElement ? node : node.ownerDocument || node.document;\r
244 };\r
245         // XMLかどうかを判別する\r
246 Node.isXmlDocument =\r
247         X.Dom.DOM_IE4 ?\r
248                 X.emptyFunction :\r
249                 (function( root ){\r
250                         if( X.Type.isBoolean( root.isXML ) ) return root.isXML;\r
251                         return root.isXML = root._rawNode.createElement( 'p' ).tagName !== root._rawNode.createElement( 'P' ).tagName;\r
252                 });\r
253 \r
254 Node._chashe     = [];\r
255 Node.none        = Node._chashe[ 0 ] = new Node();\r
256 Node._window     = new Node( window ); // Node._chashe[ 1 ]\r
257 Node._document   = new Node( document ); // Node._chashe[ 2 ]\r
258 Node._html       = null; // Node._chashe[ 3 ]\r
259 Node.root        = null;// = Node._chashe[ 4 ] body\r
260 Node._systemNode = null;// = Node._chashe[ ? ]\r
261 \r
262 Node._reserveRemoval = [];\r
263 \r
264 if( X.Dom.DOM_IE4 ){\r
265         Node.prototype._ie4getRawNode = function(){\r
266                 var elm = this._rawNode;\r
267                 return elm ||\r
268                         ( ( elm = document.all[ 'ie4uid' + this._uid ] ) && ( this._rawNode = elm ) ) ||\r
269                         ( this._id && ( elm = document.all[ this._id ] ) ) && ( this._rawNode = elm );\r
270         };\r
271 };\r
272 \r
273 \r
274 /* --------------------------------------\r
275  *  Create\r
276  */\r
277 Node.prototype.create = function( tag, opt_attrs, opt_css ){\r
278         var xnode;\r
279         if( this._xnodeType !== 1 ) return;\r
280         if( !this._xnodes ) this._xnodes = [];\r
281         \r
282         xnode = Node.create( tag, opt_attrs, opt_css );\r
283         \r
284         xnode.parent = this;\r
285         this._xnodes[ this._xnodes.length ] = xnode;\r
286         this._root && this._reserveUpdate();\r
287         return xnode;\r
288 };\r
289 \r
290 /* --------------------------------------\r
291  *  CreateText\r
292  */\r
293 Node.prototype.createText = function( text ){\r
294         var xnode;\r
295         if( this._xnodeType !== 1 ) return;\r
296         if( !this._xnodes ) this._xnodes = [];\r
297         \r
298         Node._newByText = true;\r
299         xnode = new Node( text );\r
300         xnode.parent = this;\r
301         \r
302         this._root && this._reserveUpdate();\r
303         this._xnodes[ this._xnodes.length ] = xnode;\r
304         return xnode;\r
305 };\r
306 \r
307 /* --------------------------------------\r
308  *  Clone\r
309  * http://d.hatena.ne.jp/think49/20110724/1311472811\r
310  * http://d.hatena.ne.jp/uupaa/20100508/1273299874\r
311  */\r
312 Node.prototype.clone = function( opt_clone_children ){\r
313         var xnode, xnodes, i, l;\r
314         switch( this._xnodeType ){\r
315                 case 1 :\r
316                         Node._newByTag = true;\r
317                         xnode = new Node( this._tag, X.cloneObject( this._attrs ), X.cloneObject( this._css ) )\r
318                                 .attr( { 'id' : this._id } )\r
319                                 .className( this._className );\r
320                         if( opt_clone_children && ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
321                                 for( i = 0; i < l; ++i ){\r
322                                         xnode.append( xnodes[ i ].clone( true ) );\r
323                                 };\r
324                         };\r
325                         return xnode;\r
326                 case 3 :\r
327                         Node._newByText = true;\r
328                         xnode = new Node( this._text );\r
329                         return xnode;\r
330                 \r
331                 //case 0 :\r
332                 //case 2 :\r
333         };\r
334         return this;\r
335 };\r
336 \r
337 /* --------------------------------------\r
338  *  Add\r
339  * Node\r
340  * HtmlElement の場合は内部使用専用 そのため event の破棄等しない\r
341  */\r
342 Node.prototype.append = function( v ){\r
343         var i, l, xnodes, frg;\r
344         if( this._xnodeType !== 1 ) return;\r
345         \r
346         if( 1 < ( l = arguments.length ) ){\r
347                 for( i = 0; i < l; ++i ){\r
348                         this.append( arguments[ i ] );\r
349                 };\r
350                 return this;\r
351         };\r
352         \r
353         if( !( xnodes = this._xnodes ) ) this._xnodes = xnodes = [];\r
354         \r
355         switch( Node._getType( v ) ){\r
356                 case Node.IS_RAW_HTML :\r
357                 case Node.IS_RAW_TEXT :\r
358                         v = new Node( v );\r
359                         break;\r
360                 case Node.IS_HTML_STRING :\r
361                 case Node.IS_STRING :\r
362                         return this.append.apply( this, X.Dom.parse( v, true ) );\r
363                 case Node.IS_XNODE :\r
364                         if( v._xnodeType !== 1 && v._xnodeType !== 3 ) return this;\r
365                         // 親の xnodes から v を消す\r
366                         if( v.parent ){\r
367                                 //if( X.Dom.DOM_W3C ){\r
368                                 //      v.parent._xnodes.splice( v.parent._xnodes.indexOf( v ), 1 );\r
369                                 //} else\r
370                                 //if( X.Dom.DOM_IE4 ){\r
371                                         v.remove();\r
372                                 //} else {\r
373                                         \r
374                                 //};\r
375                         };// else\r
376                         //if( ( i = Node._reserveRemoval.indexOf( v ) ) !== -1 ){\r
377                         //      if( !this._state ) alert( 'xnode already destroyed!' );\r
378                         //      Node._reserveRemoval.splice( i, 1 );\r
379                         //};\r
380                         break;\r
381                 default :\r
382                         return this;\r
383         };\r
384 \r
385         v.parent = this;\r
386         xnodes[ xnodes.length ] = v;\r
387         this._root && this._reserveUpdate();\r
388         return this;\r
389 };\r
390 \r
391 \r
392 Node.prototype.appendAt = function( start, v ){\r
393         var xnodes, l, i;\r
394         \r
395         if( this._xnodeType !== 1 ) return this;\r
396         \r
397         l = arguments.length;\r
398         if( !( xnodes = this._xnodes ) ) xnodes = this._xnodes = [];\r
399         \r
400         if( xnodes.length <= start ){\r
401                 if( l === 2 ) return this.append( v );\r
402                 for( i = 1; i < l; ++i ){\r
403                         this.append( arguments[ i ] );\r
404                 };\r
405                 return this;\r
406         };\r
407         if( start < 0 ) start = 0;\r
408         if( 2 < l ){\r
409                 for( ; l; ){\r
410                         this.appendAt( start, arguments[ --l ] );\r
411                 };\r
412                 return this;\r
413         };\r
414 \r
415         switch( Node._getType( v ) ){\r
416                 case Node.IS_RAW_HTML :\r
417                 case Node.IS_RAW_TEXT :\r
418                         v = new Node( v );\r
419                         break;\r
420                 case Node.IS_HTML_STRING :\r
421                 case Node.IS_STRING :\r
422                         v = X.Dom.parse( v, true );\r
423                         for( i = v.length; i; ){\r
424                                 this.appendAt( start, v[ --i ] );\r
425                         };\r
426                         return this;\r
427                 case Node.IS_XNODE :\r
428                         if( v._xnodeType !== 1 && v._xnodeType !== 3 ) return this;\r
429                         // 親の xnodes から v を消す\r
430                         if( v.parent ){\r
431                                 //if( X.Dom.DOM_W3C ){\r
432                                 //      v.parent._xnodes.splice( v.parent._xnodes.indexOf( v ), 1 );\r
433                                 //} else\r
434                                 //if( X.Dom.DOM_IE4 ){\r
435                                         v.remove();\r
436                                 //} else {\r
437                                         \r
438                                 //};\r
439                         };// else\r
440                         //if( ( i = Node._reserveRemoval.indexOf( v ) ) !== -1 ){\r
441                         //      if( !this._state ) alert( 'xnode already destroyed!' );\r
442                         //      Node._reserveRemoval.splice( i, 1 );\r
443                         //};\r
444                         break;\r
445                 default :\r
446                         return this;\r
447         };\r
448 \r
449         v.parent = this;\r
450         this._xnodes.splice( start, 0, v );\r
451         this._root && this._reserveUpdate();\r
452         return this;\r
453 };\r
454 \r
455 Node.prototype.appendTo = function( parent, opt_index ){\r
456         switch( Node._getType( parent ) ){\r
457                 case Node.IS_RAW_HTML :\r
458                         parent = new Node( parent );\r
459                         break;\r
460                 case Node.IS_HTML_STRING :\r
461                         parent = X.Dom.parse( parent, true );\r
462                         parent = parent[ 0 ] || parent;\r
463                 case Node.IS_XNODE :\r
464                         break;\r
465                 default :\r
466                         return this;\r
467         };\r
468         opt_index === undefined ? parent.append( this ) : parent.appendAt( opt_index, this );\r
469         return this;\r
470 };\r
471 \r
472 Node.prototype.appendToRoot = function( opt_index ){\r
473         opt_index === undefined ? Node.root.append( this ) : Node.root.appendAt( opt_index, this );\r
474         return this;\r
475 };\r
476 \r
477 /* --------------------------------------\r
478  *  Before , After, Replace\r
479  */\r
480 Node.prototype.before = function( v ){\r
481         var parent, l, start;\r
482         if( !( parent = this.parent ) ) return this;\r
483         \r
484         l = arguments.length;\r
485         start = this.getOrder();\r
486         if( 1 < l ){\r
487                 for( ; l; ){\r
488                         parent.appendAt( start, arguments[ --l ] );\r
489                 };\r
490                 return this;\r
491         };\r
492         parent.appendAt( start, v );\r
493         return this;\r
494 };\r
495 \r
496 Node.prototype.after = function( v ){\r
497         var parent, l, i, start;\r
498         if( !( parent = this.parent ) ) return this;\r
499         \r
500         l = arguments.length;\r
501         start = this.getOrder() + 1;\r
502         if( parent._xnodes.length <= start ){\r
503                 if( 1 < l ){\r
504                         for( i = 0; i < l; ++i ){\r
505                                 parent.append( arguments[ i ] );\r
506                         };\r
507                         return this;\r
508                 };\r
509                 parent.append( v );\r
510                 return this;\r
511         };\r
512         if( 1 < l ){\r
513                 for( ; l; ){\r
514                         parent.appendAt( start, arguments[ --l ] );\r
515                 };\r
516                 return this;\r
517         };\r
518         parent.appendAt( start, v );\r
519         return this;\r
520 };\r
521 \r
522 Node.prototype.replace = function( v ){\r
523         if( !this.parent ) return this;\r
524         return arguments.length === 1 ? this.before( v ).remove() : this.before.apply( this, arguments ).remove();\r
525 };\r
526 \r
527 /* --------------------------------------\r
528  *  Remove\r
529  */\r
530 Node.prototype.remove = function(){\r
531         var parent = this.parent;\r
532         \r
533         if( !parent ) return this;\r
534 \r
535         parent._xnodes.splice( parent._xnodes.indexOf( this ), 1 );\r
536         if( this._root ){\r
537                 Node._reserveRemoval[ Node._reserveRemoval.length ] = this;\r
538                 this._reserveUpdate();\r
539         };\r
540         delete this.parent;\r
541         delete this._root;\r
542         return this;\r
543 };\r
544 \r
545 Node.prototype.empty = function(){\r
546         var xnodes = this._xnodes, i;\r
547         if( xnodes && ( i = xnodes.length ) ){\r
548                 for( ; i; ){\r
549                         xnodes[ --i ].destroy();\r
550                 };\r
551                 xnodes.length = 0;\r
552         };\r
553         return this;\r
554 };\r
555 \r
556 /* --------------------------------------\r
557  *  destory\r
558  */\r
559 Node.prototype.destroy = function( isChild ){\r
560         var xnodes = this._xnodes, i, elm;\r
561         \r
562         if( !this._state ) return;\r
563         \r
564         elm = this._rawNode || this._ie4getRawNode && this._ie4getRawNode();\r
565         \r
566         if( xnodes && ( i = xnodes.length ) ){\r
567                 //for( ; i; ){\r
568                 //      xnodes[ --i ].destroy( true );\r
569                 //};\r
570         };\r
571         elm && this._listeners && this.unlisten(); // イベントの退避\r
572 \r
573         delete Node._chashe[ this._uid ];\r
574         delete this._state;\r
575         \r
576         if( this._root ){\r
577                 !isChild && this.remove();\r
578         } else {\r
579                 this.parent && this.parent._xnodes.splice( this.parent._xnodes.indexOf( this ), 1 );\r
580                 elm && !isChild && this._actualRemove();\r
581                 this.kill();\r
582         };\r
583 };\r
584 \r
585 \r
586 \r
587 /* --------------------------------------\r
588  *  contains\r
589  */\r
590 Node.prototype.contains = function( v ){\r
591         var elm, type, xnodes, i;\r
592         if( !v || this._xnodeType !== 1 ) return false;\r
593         // contains ie4+\r
594         if( ( elm = this._rawNode || this._ie4getRawNode && this._ie4getRawNode() ) && document.contains && ( type = Node._getType( v ) ) && ( type === Node.IS_RAW_HTML || type === Node.IS_RAW_TEXT ) ){\r
595                 return elm.contains( v );       \r
596         };\r
597         //if( document.compareDocumentPosition ){\r
598         //      \r
599         //};\r
600         xnodes = this._xnodes;\r
601         if( xnodes.indexOf( v ) !== -1 ) return true;\r
602         if( elm === v.parentNode ) return false;\r
603         for( i = xnodes.length; i; ){\r
604                 if( xnodes[ --i ].contains( v ) ) return true;\r
605         };\r
606         return false;\r
607 };\r
608 \r
609 /* --------------------------------------\r
610  *  getChild\r
611  */\r
612 Node.prototype.getChildAt = function( i ){\r
613         var xnodes = this._xnodeType === 1 && this._xnodes;\r
614         return xnodes && 0 <= i && i < xnodes.length && xnodes[ i ];\r
615 };\r
616 \r
617 \r
618 /* --------------------------------------\r
619  *  prevNode, nextNode, firstChild, lastChild\r
620  */\r
621 \r
622 Node.prototype.prevNode = function(){\r
623         var parent = this.parent, xnodes, index;\r
624         if( !parent ) return;\r
625         xnodes = parent._xnodes;\r
626         index = xnodes.indexOf( this );\r
627         if( 0 < index ) return xnodes[ index - 1 ];\r
628 };\r
629 Node.prototype.nextNode = function(){\r
630         var parent = this.parent, xnodes, index;\r
631         if( !parent ) return;\r
632         xnodes = parent._xnodes;\r
633         index  = xnodes.indexOf( this );\r
634         if( index + 1 < xnodes.length ) return xnodes[ index + 1 ];\r
635 };\r
636 Node.prototype.firstChild = function(){\r
637         return this.getChildAt( 0 );\r
638 };\r
639 Node.prototype.lastChild = function(){\r
640         return this.getChildAt( this._xnodes.length - 1 );\r
641 };\r
642 \r
643 /* --------------------------------------\r
644  *  getOrder\r
645  */\r
646 Node.prototype.getOrder = function(){\r
647         var parent = this.parent;\r
648         if( !parent ) return -1;\r
649         return parent._xnodes.indexOf( this );\r
650 };\r
651 \r
652 /* --------------------------------------\r
653  *  className, addClass, removeClass, hasClass\r
654  */\r
655 Node.prototype.className = function( v ){\r
656         var node, _, __;\r
657         // getter\r
658         if( v === undefined ) return this._className;\r
659         \r
660         // setter\r
661         if( this._className === v ) return this;\r
662         if( !v || typeof v !== 'string' ){\r
663                 delete this._className;\r
664         } else {\r
665                 // cleanup\r
666                 _  = ' ';\r
667                 __ = '  ';\r
668                 while( v.indexOf( __ ) !== -1 ){ v = v.split( __ ).join( _ ); };\r
669                 v.charAt( 0 ) === _ && ( v = v.substr( 1 ) );\r
670                 v.lastIndexOf( _ ) === 0 && ( v = v.substr( 0, v.length - 1 ) );\r
671                 \r
672                 if( this._className === v ) return this;\r
673                 v ? ( this._className = v ) : delete this._className;\r
674         };\r
675         this._dirty |= X.Dom.Dirty.CLASSNAME;\r
676         this._root && this._reserveUpdate();\r
677         return this;\r
678 };\r
679 Node.prototype.addClass = function( v ){\r
680         var names = v.split( ' ' ),\r
681                 i     = names.length,\r
682                 name;\r
683         v = '';\r
684         for( ; i; ){\r
685                 name = names[ --i ];\r
686                 if( !name ) continue;\r
687                 !this.hasClass( name ) && ( v += ( v ? ' ' : '' ) + name );\r
688         };\r
689         return v ? this.className( this._className + ( this._className ? ' ' : '' ) + v ) : this;\r
690 };\r
691 Node.prototype.removeClass = function( v ){\r
692         var _          = ' ',\r
693                 className  = this._className,\r
694                 names      = v.split( ' ' ),\r
695                 classNames, i, f, j;\r
696         if( !className ) return this;\r
697         for( classNames = className.split( _ ), i = classNames.length; i; ){\r
698                 className = classNames[ --i ];\r
699                 for( j = names.length; j; ){\r
700                         if( className === names[ --j ] ){\r
701                                 classNames.splice( i, 1 );\r
702                                 names.splice( j, 1 );\r
703                                 f = true;\r
704                                 break;\r
705                         };\r
706                 };\r
707         };\r
708         return f ? this.className( classNames.join( ' ' ) ) : this;\r
709 };\r
710 Node.prototype.toggleClass = function( v ){\r
711 \r
712 };\r
713 Node.prototype.hasClass = function( v ){\r
714         var _ = ' ',\r
715                 className = this._className,\r
716                 i, name;\r
717         if( className === v ) return true;\r
718         if( !className ) return false;\r
719         \r
720         className = _ + className + _;\r
721         if( className.indexOf( _ + v + _ ) !== -1 ) return true; // lucky hit\r
722         \r
723         for( v = v.split( _ ), i = v.length; i; ){\r
724                 name = v[ --i ];\r
725                 if( name === '' ) continue;\r
726                 if( className.indexOf( _ + name + _ ) === -1 ) return false;\r
727         };\r
728         return true;\r
729 };\r
730 \r
731 /* --------------------------------------\r
732  *  html, text\r
733  */\r
734 \r
735 Node._outerFlag = null;\r
736 \r
737 Node.prototype.html = function( html ){\r
738         var _ = '', q = '"', xnodes, n, i, l;\r
739         // setter\r
740         if( X.Type.isString( html ) ){\r
741                 if( this._xnodeType === 3 ) return this.text( html );\r
742                 return html ? this.empty().append.apply( this, X.Dom.parse( html, true ) ) : this.empty();\r
743         };\r
744         \r
745         // getter\r
746         if( this._xnodeType === 3 ){\r
747                 return this._text;\r
748         };\r
749         \r
750         if( this._dirty & X.Dom.Dirty.CSS && !( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
751                 delete this._cssText;\r
752         };\r
753         html = !Node._outerFlag ? [] : [\r
754                 '<', this._tag,\r
755                 this._id ? ' id="' + this._id + q : _,\r
756                 this._className ? ' class="' + this._className + q : _,\r
757                 this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
758                 this._cssText ? ' style="' + this._cssText + q : _,\r
759         '>' ];\r
760         \r
761         n = html.length;\r
762         if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
763                 if( !Node._outerFlag ) Node._outerFlag = this;\r
764                 for( i = 0; i < l; ++i ){\r
765                         html[ n ] = xnodes[ i ].html();\r
766                         ++n;\r
767                 };\r
768                 if( Node._outerFlag === this )  Node._outerFlag = null;\r
769         };\r
770         !Node._outerFlag || X.Dom.DTD.EMPTY[ this._tag ] || ( html[ n ] = '<\/' + this._tag + '>' );\r
771         return html.join( _ );\r
772 };\r
773 \r
774 Node.prototype.text = function( text ){\r
775         var xnodes, texts, i, l;\r
776         // setter\r
777         if( X.Type.isString( text ) ){\r
778                 if( this._xnodeType === 3 ){\r
779                         if( this._text !== text ){\r
780                                 text ? ( this._text = text ) : delete this.text;\r
781                                 this._root && this._reserveUpdate();\r
782                                 this._dirty |= X.Dom.Dirty.CONTENT;\r
783                         };\r
784                         return this;\r
785                 };\r
786                 if( !text ) return this.empty();\r
787                 this.empty().createText( text );\r
788                 return this;\r
789         };\r
790         // getter\r
791         if( this._xnodeType === 1 ){\r
792                 if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
793                         for( texts = [], i = 0; i < l; ++i ){\r
794                                 texts[ i ] = xnodes[ i ].text();\r
795                         };\r
796                         return texts.join( '' );\r
797                 };\r
798                 return '';\r
799         };\r
800         return this._text;\r
801 };\r
802 \r
803 Node.prototype.each = function( func ){\r
804         func.call( this, 0 );\r
805         return this;\r
806 };\r
807 \r
808 \r
809 /* --------------------------------------\r
810  *  Async commit update\r
811  * \r
812  * state:\r
813  *  0 : no_rawnode\r
814  *  1 : not_added\r
815  *  3 : dirty\r
816  *  4 : clean\r
817  * \r
818  * remove :\r
819  * root._reserveRemoval = [] に追加。commitUpdate で remove して state は not_added\r
820  * add :\r
821  * root._reserveRemoval にいたら消す, new_parent._xnodes に挿入 steta は not_added にして commitUpdate を待つ\r
822  */\r
823         \r
824 Node.prototype._reserveUpdate = function(){\r
825         var root = Node.root;\r
826         if( root && !root._updateTimerID ) root._updateTimerID = X.Timer.requestFrame( root, root._startUpdate );\r
827 };\r
828 \r
829 Node.prototype._startUpdate = function(){\r
830         var removal, i, xnode, tmp;\r
831         if( X.Dom.readyState < X.Dom.Event.DOM_INIT ){\r
832                 return;\r
833         };\r
834         if( this._updateTimerID ){\r
835                 //X.Timer.cancelFrame( this._updateTimerID ); // fire 中の cancel が動かない、、、\r
836                 this._updateTimerID = 0;\r
837         } else {\r
838                 return;\r
839         };\r
840         // このイベントでサイズを取ると無限ループに\r
841         // X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.BEFORE_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.BEFORE_UPDATE } );\r
842 \r
843         removal = Node._reserveRemoval;\r
844         \r
845         tmp = this._rawNode.style.visibility;\r
846         //this._rawNode.style.visibility = 'hidden';\r
847         \r
848         if( i = removal.length ){\r
849                 for( ; i; ){\r
850                         xnode = removal[ --i ];\r
851                         xnode._actualRemove();\r
852                         !this._state && xnode.kill();\r
853                 };\r
854                 removal.length = 0;\r
855         };\r
856         \r
857         Node._html._dirty ? Node._html._commitUpdate() : this._commitUpdate();\r
858         \r
859         //X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.AFTER_UPDATE ] && X.Dom.dispatch( { type : X.Dom.Event.AFTER_UPDATE } );\r
860         X.Dom._listeners && X.Dom._listeners[ X.Dom.Event.AFTER_UPDATE ] && X.Dom.asyncDispatch( 0, { type : X.Dom.Event.AFTER_UPDATE } );\r
861         //this._rawNode.style.visibility = tmp;\r
862 };\r
863 \r
864 Node.prototype._commitUpdate =\r
865         X.Dom.DOM_W3C ?\r
866                 ( function( parentElement, nextElement ){\r
867                         var elm = this._rawNode,\r
868                                 xnodes, l, i, frg, next, k, v;\r
869 \r
870                         if( this._state & X.Dom.State.IE5_DISPLAY_NONE_FIX ){\r
871                                 //alert( this._tag + ' ' + !!elm );\r
872                                 elm && elm.parentNode && this._actualRemove();\r
873                                 return nextElement;\r
874                         };\r
875 \r
876                         if( !elm || ( parentElement && elm.parentNode !== parentElement ) || ( nextElement && elm.nextSibling !== nextElement ) ){\r
877                                 nextElement ?\r
878                                         parentElement.insertBefore( this._actualCreate(), nextElement ) :\r
879                                         parentElement.appendChild( this._actualCreate() );\r
880                                 this._afterActualCreate();\r
881 \r
882                                 return elm || this._rawNode;\r
883                         } else\r
884                         if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ) {\r
885                                 \r
886                                 /*if( elm.childNodes.length !== l && ( frg = Node._useDocumentFragment ) ){\r
887                                         for( i = 0; i < l; ++i ){\r
888                                                 frg.appendChild( xnodes[ i ]._actualCreate( true ) );\r
889                                         };\r
890                                         elm.appendChild( frg );\r
891                                         for( i = 0; i < l; ++i ){\r
892                                                 xnodes[ i ]._afterActualCreate( true );\r
893                                         };\r
894                                 } else {*/\r
895                                         for( ; l; ){\r
896                                                 next = xnodes[ --l ]._commitUpdate( elm, next );\r
897                                         };\r
898                                 //};\r
899                         };\r
900 \r
901                         delete this._fontSize;\r
902                         this._dirty && this._updateRawNode( elm );\r
903                         if( this._state & X.Dom.State.IE5_DISPLAY_NONE_FIX ){\r
904                                 return nextElement;\r
905                         };\r
906                         return elm;\r
907                 }) :\r
908         X.Dom.DOM_IE4 ? \r
909                 ( function( parentElement, prevElement ){\r
910                         var elm    = this._rawNode || this._ie4getRawNode(),\r
911                                 xnodes, l, i, html, text, prev;\r
912 \r
913                         if( !elm ){\r
914                                 prevElement ?\r
915                                         prevElement.insertAdjacentHTML( 'AfterEnd', this._actualCreate() ) :\r
916                                         parentElement.insertAdjacentHTML( 'AfterBegin', this._actualCreate() );\r
917                                 this._afterActualCreate();\r
918                                 return this._rawNode || this._ie4getRawNode();\r
919                         };\r
920                         \r
921                         xnodes = this._xnodes;\r
922                         l      = xnodes ? xnodes.length : 0;\r
923                         \r
924                         if( this._dirty & X.Dom.Dirty.IE4_TEXTNODE_FIX || ( this._state & X.Dom.State.IE4_ONLY_TEXT && ( l !== 1 || xnodes[ 0 ]._xnodeType !== 3 ) ) ){ // 1 < l && elm.children.length === 0\r
925                                 html = [];\r
926                                 for( i = 0; i < l; ++i ){\r
927                                         html[ i ] = xnodes[ i ]._actualCreate();\r
928                                 };\r
929                                 elm.innerHTML = html.join( '' );\r
930                                 for( i = 0; i < l; ++i ){\r
931                                         xnodes[ i ]._afterActualCreate();\r
932                                 };\r
933                                 this._state &= ~X.Dom.State.IE4_ONLY_TEXT;\r
934                         } else\r
935                         if( this._state & X.Dom.State.IE4_ONLY_TEXT ){ // textNode が swap した場合の検出は、_root で行う\r
936                                 text = xnodes[ 0 ];\r
937                                 if( text._dirty || !text._root ){\r
938                                         elm.innerHTML = text._text;\r
939                                         delete text._dirty;\r
940                                         text._root = this._root;                                        \r
941                                 };\r
942                         } else\r
943                         if( l ){\r
944                                 for( i = 0; i < l; ++i ){\r
945                                         prev = xnodes[ i ]._commitUpdate( elm, prev );\r
946                                 };\r
947                         };\r
948                         \r
949                         delete this._fontSize;\r
950                         this._dirty && this._updateRawNode( elm );\r
951                         return elm;\r
952                 }) :\r
953                 (function(){});\r
954 \r
955 Node.prototype._updateRawNode =\r
956         X.Dom.DOM_W3C ?\r
957                 ( function( elm ){\r
958                         var attrs, rename, k, v;\r
959 \r
960                         // textNode\r
961                         if( this._dirty & X.Dom.Dirty.CONTENT ){\r
962                                 elm.data = X.Dom.chrReferanceTo( this._text );\r
963                                 delete this._dirty;\r
964                                 return;\r
965                         };\r
966                         // id\r
967                         if( this._dirty & X.Dom.Dirty.ID ){\r
968                                 //if( X.UA.IE && X.UA.IE < 7 ){\r
969                                         this._id ? ( elm.id = this._id ) : ( elm.id && elm.removeAttribute( 'id' ) );           \r
970                                 //} else {\r
971                                 //      this._id ? ( elm.id = this._id ) : elm.removeAttribute( 'id' );                                 \r
972                                 //};\r
973                         };\r
974                         // className\r
975                         if( this._dirty & X.Dom.Dirty.CLASSNAME ){\r
976                                 //if( X.UA.IE && X.UA.IE < 8 ){\r
977                                         //elm.className = this._className;\r
978 \r
979                                 //} else {\r
980                                         this._className ? ( elm.className = this._className ) : ( elm.className && elm.removeAttribute( 'class' ) );                                    \r
981                                 //};\r
982                                         // ie5 only\r
983                                         if( X.Dom.State.IE5_DISPLAY_NONE_FIX && elm.currentStyle.display === 'none' ){\r
984                                                 this._actualRemove();\r
985                                                 this._state |= X.Dom.State.IE5_DISPLAY_NONE_FIX;\r
986                                                 return;\r
987                                         };\r
988                         };\r
989                         // style\r
990                         if( this._dirty & X.Dom.Dirty.CSS ){\r
991                                 if( this._cssText || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
992                                         X.UA.Opera && X.UA.Opera < 9 ?\r
993                                                 elm.setAttribute( 'style', this._cssText ) : // opera8用\r
994                                                 ( elm.style.cssText = this._cssText );\r
995                                 } else {\r
996                                         elm.style.cssText = ''; // IE5.5以下 Safari3.2 で必要\r
997                                         elm.removeAttribute( 'style' );\r
998                                         delete this._cssText;\r
999                                 };\r
1000                         };\r
1001                         \r
1002                         if( this._dirty & X.Dom.Dirty.IE_FILTER ){\r
1003                                 elm.style.filter = X.Dom.Style.SPECIAL_FIX( this._css );\r
1004                         };\r
1005                         \r
1006                         // attr\r
1007                         if( this._dirty & X.Dom.Dirty.ATTR && ( attrs = this._newAttrs || this._attrs ) ){\r
1008                                 rename = X.Dom.Attr.renameForDOM;\r
1009                                 for( k in attrs ){\r
1010                                         if( 5 <= X.UA.IE && X.UA.IE < 6 ){ // IETester 5.5 ではエラーが出なかった.MultipulIE5.5 ではエラーが出たので\r
1011                                                 if( this._tag === 'TEXTAREA' && k === 'value' ){\r
1012                                                         elm.firstChild ?\r
1013                                                                 ( elm.firstChild.data = attrs[ k ] ) :\r
1014                                                                 elm.appendChild( document.createTextNode( attrs[ k ] ) );\r
1015                                                         continue;\r
1016                                                 };\r
1017                                         };\r
1018                                         ( v = attrs[ k ] ) === undefined ?\r
1019                                                 elm.removeAttribute( rename[ k ] || k ) :\r
1020                                                 ( elm[ rename[ k ] || k ] = v );                                                \r
1021 \r
1022                                 };\r
1023                                 delete this._newAttrs;\r
1024                         };\r
1025                         \r
1026                         delete this._dirty;\r
1027                 }) :\r
1028         X.Dom.DOM_IE4 ? \r
1029                 ( function( elm ){\r
1030                         var attrs, rename, k, v;\r
1031 \r
1032                         // fake textNode\r
1033                         if( this._dirty & X.Dom.Dirty.CONTENT ){\r
1034                                 elm.innerText = this._text;\r
1035                                 delete this._dirty;\r
1036                                 return;\r
1037                         };\r
1038                         \r
1039                 /*\r
1040                  * http://www.tohoho-web.com/js/element.htm\r
1041                  * title、className、id、lang、language には setAttribute でなく、element.id で直接読み書きできる\r
1042                  */     \r
1043                         // id\r
1044                         if( this._dirty & X.Dom.Dirty.CONTENT ) elm.setAttribute( 'id', this._id || ( 'ie4uid' + xnode._uid ) );\r
1045 \r
1046                         // className\r
1047                         if( this._dirty & X.Dom.Dirty.CLASSNAME ){\r
1048                                 this._className ? ( elm.className = this._className ) : elm.removeAttribute( 'class' );\r
1049                         };\r
1050                         // style\r
1051                         if( this._dirty & X.Dom.Dirty.CSS ){\r
1052                                 if( this._cssText || ( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
1053                                         elm.style.cssText = this._cssText;\r
1054                                 } else {\r
1055                                         elm.style.cssText = '';\r
1056                                         elm.removeAttribute( 'style' );\r
1057                                         delete this._cssText;\r
1058                                 };\r
1059                         };\r
1060                         \r
1061                         if( this._dirty & X.Dom.Dirty.IE_FILTER ){\r
1062                                 this._rawNode.style.filter = X.Dom.Style.SPECIAL_FIX( this._css );\r
1063                         };\r
1064                         \r
1065                         // attr\r
1066                         if( this._dirty & X.Dom.Dirty.ATTR && ( attrs = this._newAttrs || this._attrs ) ){\r
1067                                 rename = X.Dom.Attr.renameForDOM;\r
1068                                 for( k in attrs ){\r
1069                                         ( v = attrs[ k ] ) === undefined ?\r
1070                                                 elm.removeAttribute( rename[ k ] || k ) :\r
1071                                                 elm.setAttribute( rename[ k ] || k, v );\r
1072                                 };\r
1073                                 delete this._newAttrs;\r
1074                         };\r
1075                         \r
1076                         delete this._dirty;\r
1077                 }) :\r
1078                 (function(){});\r
1079 \r
1080 /* --------------------------------------\r
1081  *  Create\r
1082  * \r
1083  * http://d.hatena.ne.jp/uupaa/20080718/1216362040\r
1084  * DOM Rangeが使える環境(Firefox2+,Opera9+,Safari3+)なら、innerHTMLいらずで、ガーって書けます。\r
1085  * return document.createRange().createContextualFragment("<div><select><option></option></select></div>");\r
1086  * insertAdjacentHTML\r
1087  * \r
1088  * ie7 以下では iframe の frameborder や、input name は、createElement 後に setAttribute しても無視される\r
1089  * \r
1090  * fragument がある場合 children も足して\r
1091  * Mozilla: 1.0+, IE: 6.0+, Netscape: 2.0+, Safari: 1.0+, Opera: 7.0+\r
1092  * ie6 大丈夫?fragment の場合リークしないか?チェックが必要\r
1093  * http://msdn.microsoft.com/ja-jp/library/bb250448%28v=vs.85%29.aspx\r
1094  * \r
1095  * document.createElement of ie4 is only for OPTION & IMAGE.\r
1096  */\r
1097 Node.prototype._actualCreate =\r
1098         X.Dom.DOM_W3C ? (function( isChild ){\r
1099                 var elm = this._rawNode,\r
1100                         xnodes, frg, i, l;\r
1101                 \r
1102                 if( this._xnodeType === 3 ){\r
1103                         if( elm ) return elm;\r
1104                         delete this._dirty;\r
1105                         return this._rawNode = document.createTextNode( X.Dom.chrReferanceTo( this._text ) );\r
1106                 };\r
1107                 \r
1108                 if( !elm ){\r
1109                         if( this._dirty & X.Dom.Dirty.CSS && !( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
1110                                 delete this._cssText;\r
1111                         };\r
1112                         this._isNew = true;\r
1113                         this._rawNode = elm =\r
1114                                 ie55 <= X.UA.IE && X.UA.IE < 9 ?\r
1115                                         document.createElement( [\r
1116                                                 '<', this._tag,\r
1117                                                         ' UID="', this._uid, '"',\r
1118                                                         this._id ? ' id="' + this._id + '"' : '',\r
1119                                                         this._className ? ' class="' + this._className + '"' : '',\r
1120                                                         this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
1121                                                         this._cssText ? ' style="' + this._cssText + '"' : '',\r
1122                                                 '>' ].join( '' ) ) :\r
1123                                         document.createElement( this._tag );\r
1124                 };\r
1125                 if( Node._useDocumentFragment ){\r
1126                         if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
1127                                 !isChild && ( frg = Node._useDocumentFragment ).appendChild( elm );\r
1128                                 for( i = 0; i < l; ++i ){\r
1129                                         elm.appendChild( xnodes[ i ]._actualCreate( true ) );\r
1130                                 };\r
1131                                 return frg || elm;\r
1132                         };\r
1133                 };\r
1134                 \r
1135                 return elm;\r
1136         }) :\r
1137         X.Dom.DOM_IE4 ? (function( isChild ){\r
1138                 var uid = this._uid,\r
1139                         html, xnodes, n, i, l;\r
1140                 \r
1141                 if( this._xnodeType === 3 ){\r
1142                         html = [ '<FONT id=ie4uid', uid, ' UID="', uid, '">', this._text, '</FONT>' ];// fake textNode\r
1143                         delete this._rawNode;\r
1144                 } else {\r
1145                         if( this._rawNode && !isChild ) this._actualRemove( true );\r
1146                         \r
1147                         if( this._dirty & X.Dom.Dirty.CSS && !( this._cssText = X.Dom.Style.objToCssText( this._css ) ) ){\r
1148                                 delete this._cssText;\r
1149                         };\r
1150                         \r
1151                         html = [\r
1152                                 '<', this._tag, ' id=', ( this._id || ( 'ie4uid' + uid ) ), ' UID="', uid, '"',\r
1153                                 this._className ? ' class="' + this._className + '"' : '',\r
1154                                 this._attrText || ( this._attrText = X.Dom.Attr.objToAttrText( this._attrs ) ),\r
1155                                 this._cssText ? ' style="' + this._cssText + '"' : '',\r
1156                         '>' ];\r
1157                         \r
1158                         n = html.length;\r
1159                         if( ( xnodes = this._xnodes ) && ( l = xnodes.length ) ){\r
1160                                 if( l === 1 && xnodes[ 0 ]._xnodeType === 3 ){\r
1161                                         // only textnode\r
1162                                         html[ n ] = xnodes[ 0 ]._text;\r
1163                                         ++n;\r
1164                                         this._state |= X.Dom.State.IE4_ONLY_TEXT;\r
1165                                 } else {\r
1166                                         for( i = 0; i < l; ++i ){\r
1167                                                 html[ n ] = xnodes[ i ]._actualCreate( true );\r
1168                                                 ++n;\r
1169                                         };                                      \r
1170                                 };\r
1171                         };\r
1172                         X.Dom.DTD.EMPTY[ this._tag ] || ( html[ n ] = '<\/' + this._tag + '>' );\r
1173                         \r
1174                         delete this._newAttrs;\r
1175                 };\r
1176                 \r
1177                 return html.join( '' );\r
1178         }) :\r
1179         (function(){});\r
1180 \r
1181 Node.prototype._afterActualCreate =\r
1182         X.Dom.DOM_W3C ? (function(){\r
1183                 var elm = this._rawNode, xnodes, l, attrs, k, i;\r
1184                 \r
1185                 this._root  = this.parent._root;\r
1186                 \r
1187                 if( this._xnodeType === 3 ){\r
1188                         this._dirty && this._updateRawNode( elm );\r
1189                         return this;\r
1190                 };\r
1191                         \r
1192                 xnodes = this._xnodes;\r
1193                 l      = xnodes && xnodes.length;\r
1194                 \r
1195                 if( this._isNew ){\r
1196                         if( !Node._useDocumentFragment && l ){// docFrg が使えない場合、doc 追加後に子を追加\r
1197                                 for( i = 0; i < l; ++i ){\r
1198                                         elm.appendChild( xnodes[ i ]._actualCreate( true ) );\r
1199                                 };\r
1200                         };\r
1201                         //if( X.UA.IE && X.UA.IE < 5.5 ){\r
1202                         //      this._dirty = X.Dom.Dirty.CSS | X.Dom.Dirty.IE_FILTER;\r
1203                         //      this._updateRawNode( elm );\r
1204                         //} else\r
1205                         if( !X.UA.IE || X.UA.IE < ie55 || 9 <= X.UA.IE ){\r
1206                                 elm.UID = this._uid;\r
1207                                 this._newAttrs = this._attrs;\r
1208                                 this._dirty = X.Dom.Dirty.ID | X.Dom.Dirty.CLASSNAME | X.Dom.Dirty.CSS | X.Dom.Dirty.ATTR | X.Dom.Dirty.IE_FILTER;\r
1209                                 this._updateRawNode( elm );\r
1210                         } else\r
1211                         if( this._dirty & X.Dom.Dirty.IE_FILTER ){\r
1212                                 elm.style.filter = X.Dom.Style.SPECIAL_FIX( this._css );\r
1213                                 delete this._dirty;\r
1214                         };\r
1215                         \r
1216                         delete this._isNew;\r
1217                 } else {\r
1218                         this._dirty && this._updateRawNode( elm );\r
1219                 };\r
1220                 \r
1221                 if( l ){\r
1222                         for( i = 0; i < l; ++i ){\r
1223                                 xnodes[ i ]._afterActualCreate();\r
1224                         };\r
1225                 };\r
1226                 // src の onload があるので先ではないか?\r
1227                 // ie の str から要素を作る場合、srcだけ イベント設定後ではないか?\r
1228                 this._restoreEvent();// イベントの復帰\r
1229         }) :\r
1230         X.Dom.DOM_IE4 ? (function(){\r
1231                 var xnodes, i;\r
1232                 this._root = this.parent._root;\r
1233                 \r
1234                 if( this._xnodeType !== 1 ) return this;\r
1235                 \r
1236                 if( ( xnodes = this._xnodes ) && ( i = xnodes.length ) ){\r
1237                         for( ; i; ){\r
1238                                 xnodes[ --i ]._afterActualCreate();\r
1239                         };\r
1240                 };\r
1241                 // textarea への value の適用はここで\r
1242                 if( this._dirty & X.Dom.Dirty.IE_FILTER ){\r
1243                         this._ie4getRawNode().style.filter = X.Dom.Style.SPECIAL_FIX( this._css );\r
1244                 };\r
1245                 delete this._dirty;\r
1246                 this._restoreEvent();// イベントの復帰\r
1247         }) :\r
1248         (function(){});\r
1249 \r
1250 Node.prototype._actualRemove =\r
1251         X.Dom.DOM_W3C ?\r
1252                 ( function( isChild ){\r
1253                         var xnodes = this._xnodes,\r
1254                                 elm    = this._rawNode,\r
1255                                 child, i, l;\r
1256                         if( xnodes && ( l = xnodes.length ) ){\r
1257                                 for( i = 0; i < l; ++i ){\r
1258                                         child = xnodes[ i ];\r
1259                                         child._xnodeType === 1 && child._actualRemove( true );\r
1260                                 };\r
1261                         };\r
1262 \r
1263                         if( !elm ) return;\r
1264                         this._xnodeType === 1 && this._migrateEvent();// イベントの退避\r
1265                         // elm.parentNode.tagName for ie7\r
1266                         !isChild && elm.parentNode && elm.parentNode.tagName && elm.parentNode.removeChild( elm );\r
1267                 }) :\r
1268         X.Dom.DOM_IE4 ?\r
1269                 ( function( isChild ){\r
1270                         var xnodes = this._xnodes,\r
1271                                 elm    = this._rawNode || this._ie4getRawNode(),\r
1272                                 i, l, xnode;\r
1273                         if( xnodes && ( l = xnodes.length ) ){\r
1274                                 for( i = 0; i < l; ++i ){\r
1275                                         xnodes[ i ]._actualRemove( true );\r
1276                                 };\r
1277                         };\r
1278 \r
1279                         if( !elm ) return;\r
1280                         this._xnodeType === 1 && this._migrateEvent();// イベントの退避\r
1281                         \r
1282                         if( X.Dom.Attr.HAS_VALUE[ this._tag ] && ( !this._newAttrs || !X.inObject( 'value', this._newAttrs ) ) ){\r
1283                                 this._attrs.value = elm.value;\r
1284                         };\r
1285                         elm.removeAttribute( 'id' ); // ?\r
1286                         document.all[ this._id || ( 'ie4uid' + this._uid ) ] = null; // ?\r
1287                         if( !isChild ) elm.outerHTML = '';\r
1288                         delete this._rawNode;\r
1289                 }) :\r
1290                 (function(){});\r
1291         \r
1292         \r
1293 //})( window, document );\r
1294 \r
1295 \r
1296 \r
1297 \r