OSDN Git Service

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