OSDN Git Service

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