OSDN Git Service

39e2b0c7ed81641b7a1dfe786f2d9b763310d6d1
[pettanr/clientJs.git] / 0.6.x / js / 05_util / 04_XXML.js
1 /*\r
2  * XMLWrapper_find 周りの オリジナルコードに関する情報\r
3  *  Original code by pettanR team\r
4  *  - http://sourceforge.jp/projects/pettanr/scm/git/clientJs/blobs/master/0.6.x/js/01_dom/18_XDomQuery.js\r
5  *  and\r
6  *  Original code by ofk ( kQuery, ksk )\r
7  *  - http://d.hatena.ne.jp/ofk/comment/20090106/1231258010\r
8  *  - http://d.hatena.ne.jp/ofk/20090111/1231668170\r
9  */\r
10 \r
11 X[ 'XML' ] = XMLWrapper;\r
12 \r
13 /**\r
14  * XML 探索用のラッパークラスです\r
15  * @alias X.XML\r
16  * @class XML 探索用のラッパークラスです\r
17  * @constructor\r
18  * @param {xml}\r
19  */\r
20 function XMLWrapper( xml ){\r
21         this._rawXML = xml;\r
22 };\r
23 \r
24 XMLWrapper.prototype.length    = 1;\r
25 XMLWrapper.prototype[ 'has' ]  = XMLWrapper_has;\r
26 XMLWrapper.prototype[ 'get' ]  = XMLWrapper_get;\r
27 XMLWrapper.prototype[ 'val' ]  = XMLWrapper_val;\r
28 XMLWrapper.prototype[ 'find' ] = XMLWrapper_find;\r
29 \r
30 function XMLWrapper_has( queryString ){\r
31         return !!this.find( queryString ).length;\r
32 };\r
33 \r
34 function XMLWrapper_get( index ){\r
35         if( this.length === 1 ) return this;\r
36         if( this.length === 0 ) return null;\r
37         // 一度発行した XMLWrapper は控えて置いて再発行する。\r
38         if( this._wraps && this._wraps[ index ] ) return this._wraps[ index ];\r
39         if( !this._wraps ) this._wraps = [];\r
40         return this[ index ] ?\r
41                 ( this._wraps[ index ] = new XMLWrapper( this[ index ] ) ) :\r
42                 null;\r
43 };\r
44 \r
45 function XMLWrapper_val( queryString, type ){\r
46         var attr_textContent = X_UA[ 'IE' ] < 9 || X_UA[ 'Opera' ] ? 'innerText' : X_UA[ 'IE9' ] ? 'text' : 'textContent',\r
47                 wrapper, xml, v;\r
48         \r
49         switch( queryString ){\r
50                 case 'number' :\r
51                 case 'int' :\r
52                 case 'boolean' :\r
53                 case 'string' :\r
54                 case undefined :\r
55                         type = queryString;\r
56                         queryString = undefined;\r
57         };\r
58                 \r
59         wrapper = queryString ? this.find( queryString ) : this;\r
60         xml     = wrapper.length === 1 ? wrapper._rawXML : wrapper[ 0 ];\r
61 \r
62         if( !xml ){\r
63                 switch( type ){\r
64                         case 'number' :\r
65                         case 'int' :\r
66                                 return NaN;\r
67                         case 'boolean' :\r
68                                 return false;\r
69                         case 'string' :\r
70                                 return '';\r
71                         default :\r
72                                 return null;\r
73                 };\r
74         };\r
75         \r
76         v = xml.nodeType === 1 ? xml.innerText || xml.text || xml.textContent : xml.nodeValue;\r
77         //xml.toStrign()\r
78         switch( type ){\r
79                 case 'number' :\r
80                         return parseFloat( v );\r
81                 case 'int' :\r
82                         return parseInt( v );\r
83                 case 'boolean' :\r
84                         return v && v !== '0' && v !== 'false' && v !== 'null' && v !== 'undefined' && v !== 'NaN';\r
85                 //case 'string' :\r
86                 //default :     \r
87         };\r
88         return v || '';\r
89 };\r
90 \r
91         function XMLWrapper_find( queryString ){\r
92 \r
93                 var scope     = this.constructor === XMLListWrapper ? this : [ this._rawXML ],\r
94                         parents   = scope, // 探索元の親要素 xmlList の場合あり\r
95                         ARY_PUSH  = Array.prototype.push,\r
96                         ret       = [], // 結果要素\r
97                         isXML     = true,\r
98                         isMulti   = 1 < scope.length,// 要素をマージする必要がある\r
99                         isStart   = true,\r
100                         _         = ' ',\r
101                         isAll, isNot, hasRoot,\r
102                         l, i, n, parsed,\r
103                         xmlList, // 一時保存用\r
104                         merge, // 要素がコメントノードで汚染されている場合使う\r
105                         combinator, selector, name, tagName,\r
106                         uid, tmp, xml, filter, key, op, val, toLower, useName,\r
107             links, className, attr, flag;\r
108 \r
109                 // 文字列以外は空で返す\r
110                 if( !X_Type_isString( queryString ) ) return XMLListWrapper_0;\r
111                 \r
112                 xmlList = [];\r
113                 \r
114                 // 以下、パースと探索\r
115                 for( ; queryString.length; ){\r
116                         //console.log( 'queryString[' + queryString + ']' );\r
117                         \r
118                         // 初期化処理\r
119                         if( !parsed ){\r
120                                 parsed = X_Node_Selector__parse( queryString );\r
121                                 \r
122                                 if( X_Type_isNumber( parsed ) ){\r
123                                         // error\r
124                                         return XMLListWrapper_0;\r
125                                 };\r
126                                 \r
127                                 queryString = queryString.substr( parsed[ 0 ] );\r
128                                 parsed      = parsed[ 1 ];\r
129                                 \r
130                                 if( parsed === 5 ){\r
131                                         isMulti = true;\r
132                                         parents = scope;\r
133                                         xmlList && xmlList.length && ARY_PUSH.apply( ret, xmlList );\r
134                                         parsed  = null;\r
135                                         xmlList = [];\r
136                                         isStart = true;\r
137                                         continue;\r
138                                 };\r
139                         };\r
140                         \r
141                         combinator  = parsed[ 0 ];\r
142                         selector    = parsed[ 1 ];\r
143                         name        = parsed[ 2 ];\r
144                         tagName     = selector === 1 ? name : '*';\r
145                         isAll       = tagName === '*';\r
146         \r
147                         if( !isStart ){\r
148                                 if( !xmlList.length ){\r
149                                         parsed = null;\r
150                                         continue;                                       \r
151                                 } else\r
152                                 if( combinator !== 0 ){\r
153                                         parents = xmlList;\r
154                                         xmlList = [];\r
155                                         //console.log( 'cobinator !== 0 ' + parents.length + ' : ' + xmlList.length );\r
156                                 };\r
157                         };\r
158                         \r
159                         i = 0;\r
160                         l = parents.length;\r
161                         n = -1; \r
162                         isMulti = isMulti || 1 < l;\r
163                         \r
164                         console.log( 'combinator ' + combinator );\r
165         \r
166                         switch( combinator ){\r
167                                 // > TagName|*\r
168                                 case 2 :\r
169                                         for( ; i < l; ++i ){\r
170                                                 for( xml = parents[ i ].firstChild; xml; xml = xml.nextSibling ){\r
171                                                         if( xml.nodeType === 1 && ( isAll || tagName === xml.tagName ) ) xmlList[ ++n ] = xml;\r
172                                                 };                              \r
173                                         };\r
174                                         break;\r
175                                 // + TagName|*\r
176                                 case 3 :\r
177                                         for( ; i < l; ++i ){\r
178                                                 for( xml = parents[ i ].nextSibling; xml; xml = xml.nextSibling ){\r
179                                                         if( xml.nodeType === 1 ){\r
180                                                                 if( isAll || tagName === xml.tagName ) xmlList[ ++n ] = xml;\r
181                                                                 break;                                                          \r
182                                                         };\r
183                                                 };                                                              \r
184                                         };\r
185                                         break;\r
186                                 // ~ TagName|*\r
187                                 case 4 :\r
188                                         merge = [];\r
189                                         for( ; i < l; ++i ){\r
190                                                 for( xml = parents[ i ].nextSibling; xml; xml = xml.nextSibling ){\r
191                                                         if( xml.nodeType === 1 && ( isAll || tagName === xml.tagName ) ){\r
192                                                                 if( merge.indexOf( xml ) !== -1 ){\r
193                                                                         break;\r
194                                                                 } else {\r
195                                                                         merge[ merge.length ] = xml;\r
196                                                                         xmlList[ ++n ] = xml;\r
197                                                                 };\r
198                                                         };                                                                      \r
199                                                 };                                                              \r
200                                         };\r
201                                         break;\r
202 \r
203                                 // @ 属性ノード\r
204                                 case 6 :\r
205                                         selector = 0;\r
206                                         tagName  = '*';\r
207                                         for( ; i < l; ++i ){\r
208                                                 if( xml = parents[ i ].getAttributeNode( name ) ){\r
209                                                         xmlList[ ++n ] = xml;\r
210                                                 };\r
211                                         };\r
212                                         break;\r
213                                 default :\r
214                                         if( combinator === 1 || ( isStart && selector < 7 ) ){\r
215                                                 console.log( l + ' > ' + xmlList.length + ' tag:' + tagName );\r
216                                                 for( ; i < l; ++i ){\r
217                                                         xml = parents[ i ];\r
218                                                         xml.childNodes && xml.childNodes.length && XMLWrapper_fetchElements( xmlList, xml, isAll ? null : tagName );\r
219                                                 };\r
220                                                 console.log( l + ' >> ' + xmlList.length + ' tag:' + tagName );\r
221                                         };\r
222                         };\r
223                         \r
224                         isStart = false;\r
225                         \r
226                         //alert( 'pre-selector:' + ( xmlList && xmlList.length ) )\r
227                         \r
228                         switch( selector ){\r
229                                 // #, ID\r
230                                 case 2 :\r
231                                         filter = [ 'id', 1, name ]; break;\r
232                                 // ., class\r
233                                 case 3 :\r
234                                         filter = [ 'class', 3 /*'~='*/, name ]; break;\r
235                                 // :, 擬似クラス\r
236                                 case 4 :\r
237                                         if( !( filter = XMLWrapper_filter[ name ] ) ){\r
238                                                 return XMLListWrapper_0;;\r
239                                         };\r
240                                         break;\r
241                                 // [] 属性\r
242                                 case 5 :\r
243                                         filter = [ name, parsed[ 3 ], parsed[ 4 ] ]; break;\r
244                                 // :not\r
245                                 case 6 :\r
246                                         isNot  = true;\r
247                                         parsed = parsed[ 2 ];\r
248                                         name   = parsed[ 2 ];\r
249                                         switch( parsed[ 1 ] ) {\r
250                                                 case 1 :\r
251                                                         filter = [ 'tag', 1, name ]; break;\r
252                                                 // #, ID\r
253                                                 case 2 :\r
254                                                         filter = [ 'id', 1, name ]; break;\r
255                                                 // ., class\r
256                                                 case 3 :\r
257                                                         filter = [ 'class', 3, name ]; break;\r
258                                                 // :, 擬似クラス\r
259                                                 case 4 :\r
260                                                         if( !( filter = X_Node_Selector__filter[ name ] ) ){\r
261                                                                 return [];\r
262                                                         };\r
263                                                         break;\r
264                                                 // [] 属性\r
265                                                 case 5 :\r
266                                                         filter = [ name, parsed[ 3 ], parsed[ 4 ] ]; break;\r
267                                         };\r
268                                         break;\r
269                                 // scope\r
270                                 case 7 :\r
271                                         xmlList = scope; break;\r
272                                 /* root\r
273                                 case 8 :\r
274                                         hasRoot = true;\r
275                                         xmlList = [ HTML ]; break;\r
276                                 // link\r
277                                 case 9 :\r
278                                         if( links = document.links ){\r
279                                                 for( xmlList = [], i = links.length; i; ){\r
280                                                         xmlList[ --i ] = new Node( links[ i ] );\r
281                                                 };\r
282                                         } else {\r
283                                                 // area[href],a[href]\r
284                                         }; */\r
285                         };\r
286                         \r
287                         if( filter && xmlList.length ){\r
288                                 // filter.mが関数の場合\r
289                                 if( filter.m ){\r
290                                         xmlList = filter.m(\r
291                                                 {\r
292                                                         not : isNot,\r
293                                                         xml : isXML\r
294                                                 },\r
295                                                 xmlList,\r
296                                                 parsed[ 3 ], parsed[ 4 ]\r
297                                         );\r
298                                 } else\r
299                                 // filterが関数の場合\r
300                                 if( X_Type_isFunction( filter ) ){\r
301                                         tmp = [];\r
302                                         for( i = 0, n = -1; xml = xmlList[ i ]; ++i ){\r
303                                                 if( ( !!filter( xml ) ) ^ isNot ) tmp[ ++n ] = xml;     \r
304                                         };\r
305                                         xmlList = tmp;\r
306                                 } else {\r
307                                 // 属性セレクター                        \r
308                                         tmp = [];\r
309                                         key = filter[ 0 ];\r
310                                         op  = filter[ 1 ];\r
311                                         val = filter[ 2 ];\r
312 \r
313                                         // 通常\r
314                                                 if( op === 3 ) val = _ + val + _;\r
315 \r
316                                                 for( i = 0, n = -1, l = xmlList.length; i < l; ++i ){\r
317                                                         xml  = xmlList[ i ];\r
318                                                         attr = xml.getAttribute( key, 2 );\r
319                                                         flag = attr != null;// && ( !useName || attr !== '' );\r
320                                                         if( flag && op ){\r
321                                                                 //if( toLower ) attr = attr.toLowerCase();\r
322                                                                 \r
323                                                                 switch( op ){\r
324                                                                         case 1: // =\r
325                                                                                 flag = attr === val;\r
326                                                                                 break;\r
327                                                                         case 2: // !=\r
328                                                                                 flag = attr !== val;\r
329                                                                                 break;\r
330                                                                         case 3: // ~=\r
331                                                                                 flag = ( _ + attr + _ ).indexOf( val ) !== -1;\r
332                                                                                 break;\r
333                                                                         case 4: // ^=\r
334                                                                                 flag = attr.indexOf( val ) === 0;\r
335                                                                                 break;\r
336                                                                         case 5: // $=\r
337                                                                                 flag = attr.lastIndexOf( val ) + val.length === attr.length;\r
338                                                                                 break;\r
339                                                                         case 6: // *=\r
340                                                                                 flag = attr.indexOf( val ) !== -1;\r
341                                                                                 break;\r
342                                                                         case 7: // |=\r
343                                                                                 flag = attr === val || attr.substring( 0, val.length + 1 ) === val + '-';\r
344                                                                                 break;\r
345                                                                 };\r
346                                                         };\r
347                                                         if( !!flag ^ isNot ) tmp[ ++n ] = xml;\r
348                                                 //};\r
349                                         };\r
350                                         xmlList = tmp;\r
351                                 };\r
352                         };\r
353                         filter  = null;\r
354                         isNot   = false;\r
355                         parsed  = null;\r
356                         \r
357                         //console.log( '//end :' + ( xmlList && xmlList.length ) );\r
358                 };\r
359                 //console.log( 'multi:' + ( xmlList && xmlList.length ) );\r
360                 \r
361                 // tree 順に並び替え、同一要素の排除\r
362                 if( isMulti ){\r
363                         xmlList && xmlList.length && ARY_PUSH.apply( ret, xmlList );\r
364                         l = ret.length;\r
365                         if( l === 0 ) return XMLListWrapper_0;\r
366                         if( l === 1 ) return new XMLWrapper( ret[ 0 ] );\r
367                         \r
368                         xmlList = [];\r
369                         //merge   = [];\r
370                         for( i = 0, n = -1; i < l; ++i ){\r
371                                 //alert( 'multi:' + i )\r
372                                 xml = ret[ i ];\r
373                                 if( xmlList.indexOf( xml ) === -1 ){\r
374                                         //merge[ merge.length ] = xml;\r
375                                         xmlList[ ++n ] = xml;\r
376                                 };\r
377                         };\r
378                         XMLWrapper_sortElementOrder( ret = [], xmlList, this._rawXML.childNodes );\r
379                         \r
380                         // @\r
381                         for( i = 0, l = xmlList.length; i < l; ++i ){\r
382                                 if( ret.indexOf( xml = xmlList[ i ] ) === -1 ){\r
383                                         ret[ ret.length ] = xml;\r
384                                 };\r
385                         };\r
386                         \r
387                         xmlList = ret;\r
388                 };\r
389 \r
390                 return xmlList.length === 1 ? new XMLWrapper( xmlList[ 0 ] ) : new XMLListWrapper( xmlList );\r
391         };\r
392 \r
393         function XMLWrapper_sortElementOrder( newList, list, xmlList ){\r
394                 var l = xmlList.length,\r
395                         i = 0,\r
396                         j, child, _xmlList;\r
397                 for( ; i < l; ++i ){\r
398                         child = xmlList[ i ];\r
399                         //if( child.nodeType !== 1 ) continue;\r
400                         //console.log( child.tagName );\r
401                         if( ( j = list.indexOf( child ) ) !== -1 ){\r
402                                 newList[ newList.length ] = child;\r
403                                 list.splice( j, 1 );\r
404                                 if( list.length === 1 ){\r
405                                         newList[ newList.length ] = list[ 0 ];\r
406                                         list.length = 0;\r
407                                         return true;\r
408                                 };\r
409                                 if( list.length === 0 ) return true;\r
410                         };\r
411                         if( ( _xmlList = child.childNodes ) && XMLWrapper_sortElementOrder( newList, list, _xmlList ) ){\r
412                                 return true;\r
413                         };\r
414                 };\r
415         };\r
416         \r
417         function XMLWrapper_fetchElements( list, parent, tag ){\r
418                 var xmlList = parent.childNodes,\r
419                         l      = xmlList.length,\r
420                         i      = 0,\r
421                         child;\r
422                 for( ; i < l; ++i ){\r
423                         child = xmlList[ i ];\r
424                         if( child.nodeType === 1 ){\r
425                                 ( !tag || child.tagName === tag ) && ( list[ list.length ] = child );\r
426                                 //console.log( parent.tagName + ' > ' + child.tagName + ' == ' + tag+ ' l:' + list.length );\r
427                                 child.childNodes && child.childNodes.length && XMLWrapper_fetchElements( list, child, tag );\r
428                         };\r
429                 };\r
430         };\r
431 \r
432         function XMLWrapper_funcSelectorChild( type, flag_all, flags, xmlList ){\r
433                 var res      = [],\r
434                         flag_not = flags.not,\r
435                         i = 0, n = -1, xnode, node,\r
436                         tagName, tmp;\r
437                 for( ; xnode = xmlList[ i ]; ++i ){\r
438                         tagName = flag_all || xnode.tagName;\r
439                         tmp     = null;\r
440                         if( /* tmp === null && */ type <= 0 ){\r
441                                 for( node = xnode.previousSibling; node; node = node.previousSibling ){\r
442                                         if( node.nodeType === 1 && ( flag_all || tagName === node.tagName ) ){\r
443                                                 tmp = false;\r
444                                                 break;\r
445                                         };\r
446                                 };\r
447                         };\r
448                         if( tmp === null && 0 <= type ){\r
449                                 for( node = xnode.nextSibling; node; node = node.nextSibling ){\r
450                                         if( node.nodeType === 1 && ( flag_all || tagName === node.tagName ) ){\r
451                                                 tmp = false;\r
452                                                 break;\r
453                                         };              \r
454                                 };                                              \r
455                         };\r
456                         if( tmp === null ) tmp = true;\r
457                         if( tmp ^ flag_not ) res[ ++n ] = xnode;\r
458                 };\r
459                 return res;\r
460         };\r
461         function XMLWrapper_funcSelectorNth( pointer, sibling, flag_all, flags, xmlList, a, b ){\r
462                 var res      = [],\r
463                         checked  = {},\r
464                         flag_not = flags.not,\r
465                         i = 0, n = -1, uid,\r
466                         c, xnode, tmp, node, tagName;\r
467                 for( ; xnode = xmlList[ i ]; ++i ){\r
468                         uid = xnode._uid;\r
469                         tmp = checked[ uid ];\r
470                         if( tmp === void 0 ){\r
471                                 for( c = 0, node = xnode.parentNode[ pointer ], tagName = flag_all || xnode.tagName; node; node = node[ sibling ] ){\r
472                                         if( node.nodeType === 1 && ( flag_all || tagName === node.tagName ) ){\r
473                                                 ++c;\r
474                                                 checked[ node._uid ] = a === 0 ? c === b : (c - b) % a === 0 && (c - b) / a >= 0;\r
475                                         };                                                      \r
476                                 };\r
477                                 tmp = checked[ uid ];\r
478                         };\r
479                         if( tmp ^ flag_not ) res[ ++n ] = xnode;\r
480                 };\r
481                 return res;\r
482         };\r
483         function XMLWrapper_funcSelectorProp( prop, flag, flags, xmlList ){\r
484                 var res = [],\r
485                         flag_not = flag ? flags.not : !flags.not,\r
486                         i = 0, n = -1, xnode;\r
487                 for( ; xnode = xmlList[ i ]; ++i ){\r
488                         if( xnode.getAttributeNode( prop ) ^ flag_not ) res[ ++n ] = xnode;\r
489                 };\r
490                 return res;\r
491         };\r
492 \r
493 var XMLWrapper_filter = {\r
494         'first-child' : {\r
495                 m : function( flags, xmlList ){ return XMLWrapper_funcSelectorChild( -1, true, flags, xmlList ); }\r
496         },\r
497         'last-child' : {\r
498                 m : function( flags, xmlList ){ return XMLWrapper_funcSelectorChild( 1, true, flags, xmlList ); }\r
499         },\r
500         'only-child' : {\r
501                 m : function( flags, xmlList ){ return XMLWrapper_funcSelectorChild( 0, true, flags, xmlList ); }\r
502         },\r
503         'first-of-type' : {\r
504                 m : function( flags, xmlList ){ return XMLWrapper_funcSelectorChild( -1, false, flags, xmlList ); }\r
505         },\r
506         'last-of-type' : {\r
507                 m : function( flags, xmlList ){ return XMLWrapper_funcSelectorChild( 1, false, flags, xmlList ); }\r
508         },\r
509         'only-of-type' : {\r
510                 m : function( flags, xmlList ){ return XMLWrapper_funcSelectorChild( 0, false, flags, xmlList ); }\r
511         },\r
512         'nth-child' : {\r
513                 m : function( flags, xmlList, a, b ){ return XMLWrapper_funcSelectorNth( 'firstChild', 'nextSibling', true, flags, xmlList, a, b ); }\r
514         },\r
515         'nth-last-child' : {\r
516                 m : function( flags, xmlList, a, b ){ return XMLWrapper_funcSelectorNth( 'lastChild', 'previousSibling', true, flags, xmlList, a, b ); }\r
517         },\r
518         'nth-of-type' : {\r
519                 m : function( flags, xmlList, a, b ){ return XMLWrapper_funcSelectorNth( 'firstChild', 'nextSibling', false, flags, xmlList, a, b ); }\r
520         },\r
521         'nth-last-of-type' : {\r
522                 m : function( flags, xmlList, a, b ){ return XMLWrapper_funcSelectorNth( 'lastChild', 'previousSibling', false, flags, xmlList, a, b ); }\r
523         },\r
524         empty : {\r
525                 m : function( flags, xmlList ){\r
526                         var res = [],\r
527                                 flag_not = flags.not,\r
528                                 i = 0, n = -1, xnode, tmp, node;\r
529                         for( ; xnode = xmlList[i]; ++i ){\r
530                                 tmp = true;\r
531                                 for( node = xnode.firstChild; node; node = node.nextSibling ){\r
532                                         if( node.nodeType === 1 || ( node.nodeType === 3 && node._text ) ){\r
533                                                 tmp = false;\r
534                                                 break;\r
535                                         };                              \r
536                                 };\r
537                                 if( tmp ^ flag_not ) res[ ++n ] = xnode;\r
538                         };\r
539                         return res;\r
540                 }\r
541         },\r
542         contains : {\r
543                 m : function( flags, xmlList, arg ){\r
544                         var res = [],\r
545                                 flag_not = flags.not,\r
546                                 i = 0, n = -1, xnode, text = '',\r
547                                 // kquery\r
548                                 attr_textContent = X_UA[ 'IE' ] < 9 || X_UA[ 'Opera' ] ? 'innerText' : X_UA[ 'IE9' ] ? 'text' : 'textContent';\r
549                         for( ; xnode = xmlList[ i ]; ++i ){\r
550                                 switch( xnode.nodeType ){\r
551                                         case 1 :\r
552                                                 text = xml.nodeType === 1 ? xml.innerText || xml.text || xml.textContent : xml.nodeValue;// xnode[ attr_textContent ];\r
553                                                 break;\r
554                                         case 2 :\r
555                                         case 3 :\r
556                                                 text = xnode.nodeValue;\r
557                                                 break;\r
558                                 };\r
559                                 console.log( text + ' ' + arg );\r
560                                 if ( ( -1 < text.indexOf( arg ) ) ^ flag_not ) res[ ++n ] = xnode;                                              \r
561                         };\r
562                         return res;\r
563                 }\r
564         }\r
565 };\r
566 \r
567 function XMLListWrapper( xmlList ){\r
568         var i = 0, l = xmlList ? xmlList.length : 0;\r
569         for( ; i < l; ++i ){\r
570                 this[ i ] = xmlList[ i ];\r
571         };\r
572         this.length = l;\r
573 };\r
574 \r
575 var XMLListWrapper_0 = new XMLListWrapper();\r
576 \r
577 XMLListWrapper.prototype.length    = 0;\r
578 XMLListWrapper.prototype._wraps    = null;\r
579 XMLListWrapper.prototype[ 'has' ]  = XMLWrapper_has;\r
580 XMLListWrapper.prototype[ 'get' ]  = XMLWrapper_get;\r
581 XMLListWrapper.prototype[ 'val' ]  = XMLWrapper_val;\r
582 XMLListWrapper.prototype[ 'find' ] = XMLWrapper_find;\r