OSDN Git Service

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