3 ;(function( window, document, undefined ){
\r
9 extend : function( target, override ){
\r
10 for( var k in override ){
\r
11 target[ k ] = override[ k ];
\r
14 copyArray : function( ary ){
\r
18 ret[ --i ] = ary[ i ];
\r
22 find$ : function( v ){
\r
23 var list = HIDE_LIST,
\r
26 if( list[ --i ].elm === v || list[ i ].elms === v ) return $LIST[ i ];
\r
29 getPrivate : function( $ ){
\r
30 var i = $LIST.indexOf( $ );
\r
32 return HIDE_LIST[ HIDE_LIST.length ] = {};
\r
34 return HIDE_LIST[ i ];
\r
36 each : function( $, funcName, args ){
\r
37 var data = Util.getPrivate( $ ),
\r
40 for( var i = 0, l = elms.length; i < l; ++i ){
\r
41 _$ = new X.$( elms[ i ] );
\r
42 _$[ funcName ].apply( _$, args );
\r
45 is$ : function( v ){
\r
46 return $LIST.indexOf(v) !== -1;
\r
48 isHTMLList : function( v ){
\r
50 if( !type.isArray( v ) ) return false;
\r
51 for( var i = v.length; i; ){
\r
52 if( !type.isHTMLElement( v[ --i ] ) ) return false;
\r
56 isHTMLString : function(v){
\r
57 if( typeof v === 'string' && v.charAt(0) === '<' && v.charAt(v.length - 1) === '>' ){
\r
62 isSelectorString : function(v){
\r
63 return typeof v === 'string';
\r
65 getKind : function(v){
\r
66 return Util.is$(v) ? 0 :
\r
67 Util.isHTMLList(v) ? 5 :
\r
68 X.Type.isHTMLElement(v) ? 1 :
\r
69 Util.isHTMLString(v) ? 2 :
\r
70 Util.isSelectorString(v) ? 3 : 4;
\r
74 if( !document.getElementById && document.all ){
\r
75 Util.ie4remove = function( parent, target, html, save ){
\r
76 var children = X.Dom.getChildNodes( parent ),
\r
77 l = children.length,
\r
78 i = 0, child, $, data;
\r
79 for( ; i < l; ++i ){
\r
80 child = children[ i ];
\r
81 if( child === target ){
\r
82 $ = Util.find$( child );
\r
84 data = Util.getPrivate( $ );
\r
85 data.htmlText = child.outerHTML;
\r
89 if( typeof child !== 'string' ){
\r
91 * 要素の書き換え前に UID を記入して要素を復帰できるようにする
\r
93 $ = Util.find$( child );
\r
95 $.UID = '' + save.length;
\r
96 child.setAttribute( 'UID', $.UID );
\r
97 save[ save.length ] = $;
\r
99 Util.ie4remove( child, null, null, save );
\r
100 if( html ) html[ html.length ] = child.outerHTML;
\r
102 if( html ) html[ html.length ] = child;
\r
108 X.$ = function( v ){
\r
109 if( !this || this.append !== X.$.prototype.append ) return new X.$( v );
\r
111 var elm, elms, htmlText, $, data;
\r
113 switch( Util.getKind(v) ){
\r
118 $ = Util.find$( v );
\r
125 return this.find( v );
\r
131 data = Util.getPrivate( this );
\r
132 $LIST[ $LIST.length ] = this;
\r
133 if( elm ) data.elm = elm;
\r
134 if( elms ) data.elms = elms;
\r
135 if( htmlText ) data.htmlText = htmlText;
\r
142 document.getElementById ?
\r
144 var data = Util.getPrivate( this );
\r
146 switch( Util.getKind(v) ){
\r
148 data.elm.appendChild( Util.getPrivate( v ).elm );
\r
151 data.elm.appendChild( v );
\r
154 // data.elm.appendChild( );
\r
158 if( !data.children ) data.children = [];
\r
159 data.children[ data.children.length ] = v;
\r
165 var data = Util.getPrivate( this ),
\r
169 switch( Util.getKind( v ) ){
\r
171 _data = Util.getPrivate( v );
\r
172 elm.insertAdjacentHTML( 'BeforeEnd', _data.htmlText || elm && elm.outerHTML );
\r
173 _data.elm = elm.children[ elm.children.length - 1 ];
\r
176 data.elm.insertAdjacentHTML( 'BeforeEnd', v.outerHTML );
\r
179 data.elm.insertAdjacentHTML( 'BeforeEnd', v );
\r
183 if( !data.children ){
\r
184 data.children = [ v ];
\r
186 data.children[ data.children.length ] = v;
\r
193 document.getElementById ?
\r
195 var data = Util.getPrivate( this );
\r
196 switch( Util.getKind(v) ){
\r
201 v.appendChild( data.elm );
\r
204 X.$(v).append(this)
\r
211 var data = Util.getPrivate( this ),
\r
213 switch( Util.getKind( v ) ){
\r
219 html = data.elm.outerHTML;
\r
222 html = data.htmlText;
\r
225 v.insertAdjacentHTML( 'BeforeEnd', html ); // elm の場合と string の場合がある
\r
226 if( data.htmlText ){
\r
227 delete data.htmlText;
\r
229 data.elm = v.children[ v.children.length - 1 ];
\r
233 X.$( v ).append( this );
\r
241 document.getElementById ?
\r
243 var data = Util.getPrivate( this );
\r
244 data.elm.parentNode && data.elm.parentNode.removeChild( data.elm );
\r
245 data.htmlText = data.elm.outerHTML;
\r
251 var data = Util.getPrivate( this ),
\r
254 html, save, all, uid;
\r
257 Util.ie4remove( parent = elm.parentElement, elm, html = [], save = [] );
\r
258 parent.innerHTML = html.join( '' );
\r
259 all = Util.copyArray( parent.all );
\r
261 for( i = save.length; i; ){
\r
264 for( j = all.length; j; ){
\r
266 if( elm.UID === uid ){
\r
267 Util.getPrivate( $ ).elm = elm;
\r
269 elm.removeAttribute( 'UID' );
\r
270 all.splice( j, 1 );
\r
274 all.splice( j, 1 );
\r
281 destroy : function(){
\r
285 document.getElementById ?
\r
287 var data = Util.getPrivate( this ),
\r
288 elm = data.elm, div;
\r
290 if( typeof v === 'string' ){
\r
291 div = document.createElement( 'div' );
\r
293 document.body.appendChild( div );
\r
294 v = div.firstChild;
\r
295 document.body.removeChild( div );
\r
297 elm.parentNode && elm.parentNode.insertBefore( v, elm );
\r
303 var data = Util.getPrivate( this ),
\r
305 parent, _data, _elm, i, children;
\r
306 if( !elm ) return this;
\r
307 parent = elm.parentElement;
\r
309 switch( Util.getKind(v) ){
\r
311 if( this === v ) return this;
\r
312 _data = Util.getPrivate( v );
\r
315 if( parent === _elm || _elm.contains( elm ) === true ) return this;
\r
318 elm.insertAdjacentHTML( 'BeforeBegin', _data.htmlText );
\r
319 for( children = X.Dom.getChildNodes( parent ), i = children.length; i; ){
\r
320 if( children[ --i ] === elm ){
\r
321 _data.elm = children[ --i ];
\r
322 delete _data.htmlText;
\r
328 elm && elm.insertAdjacentHTML( 'BeforeBegin', v.outerHTML );
\r
331 elm && elm.insertAdjacentHTML( 'BeforeBegin', v );
\r
338 document.getElementById ?
\r
340 var data = Util.getPrivate( this ),
\r
341 elm = data.elm, div;
\r
343 if( typeof v === 'string' ){
\r
344 div = document.createElement( 'div' );
\r
346 document.body.appendChild( div );
\r
347 v = div.firstChild;
\r
348 document.body.removeChild( div );
\r
350 elm.parentNode && elm.parentNode.insertBefore( v, elm.nextSibling );
\r
356 var data = Util.getPrivate( this ),
\r
358 parent, _data, _elm, i, children;
\r
359 if( !elm ) return this;
\r
360 parent = elm.parentElement;
\r
362 switch( Util.getKind(v) ){
\r
364 if( this === v ) return this;
\r
365 _data = Util.getPrivate( v );
\r
368 if( parent === _elm || _elm.contains( elm ) === true ) return this;
\r
371 elm.insertAdjacentHTML( 'AfterEnd', _data.htmlText );
\r
372 for( children = X.Dom.getChildNodes( parent ), i = children.length; i; ){
\r
373 if( children[ --i ] === elm ){
\r
374 _data.elm = children[ ++i ];
\r
375 delete _data.htmlText;
\r
381 elm && elm.insertAdjacentHTML( 'AfterEnd', v.outerHTML ); // elm の場合と string の場合がある
\r
384 elm && elm.insertAdjacentHTML( 'AfterEnd', v ); // elm の場合と string の場合がある
\r
390 find : function( v ){
\r
391 var querys = parser(v), query;
\r
392 var selector, name;
\r
393 var key, operator, value;
\r
394 var elms = [], _elms, j, m;
\r
396 for( var i = 0, l = querys.length; i < l; ++i ){
\r
397 query = querys[ i ];
\r
398 if( typeof query === 'number' ){
\r
401 if( query.length === 2 ){
\r
406 switch( query[ 0 ] ){
\r
408 _elms.push( dom.getElementById( name ) );
\r
410 case 5 : // . classname
\r
411 for( ; j < m; ++j ){
\r
412 _elms = _elms.concat( dom.getElementsByClassName( elms[ j ], name ));
\r
419 case 8 : // . tagname
\r
420 for( ; j < m; ++j ){
\r
421 _elms = _elms.concat( dom.getElementsByTagName( elms[ j ], name ));
\r
430 return new X.$( elms );
\r
432 each : function( func /* func(index){ return false } */ ){
\r
433 var data = Util.getPrivate( this ),
\r
434 elms = data.elms, $s = [];
\r
435 for( var i = 0, l = elms.length; i < l; ++i ){
\r
436 $s[ $s.length ] = new X.$( elms[ i ] );
\r
438 for( i = 0, l = $s.length; i < l; ++i ){
\r
439 if( func.call( $s[ i ], i ) === false ) break;
\r
443 html : function( v ){
\r
444 var data = Util.getPrivate( this ),
\r
446 return elm ? elm.innerHTML : data.htmlText;
\r
463 SELECTORS = ' >+~#.:[';
\r
471 ATTR_FILTER_KEY : 3,
\r
472 ATTR_FILTER_OPERATOR : 4,
\r
473 ATTR_FILTER_VALUE : 5
\r
475 OPERATORS = { "=": 1, "!=": 2, "~=": 3, "^=": 4, "$=": 5, "*=": 6, "|=": 7 };
\r
476 ALPHABET = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-0123456789';
\r
478 function parser( query ){
\r
481 var i = 0, l = query.length, s;
\r
482 var selectors = [];
\r
483 var mode = PASER.START;
\r
484 var name = '', str, key, value, selector = -1, operator, lastSelector, nameString, nameFirst, escape;
\r
485 for( ; i < l; ++i ){
\r
486 str = query.charAt( i );
\r
487 nameString = ALPHABET.indexOf( str ) !== -1;
\r
488 nameFirst = nameString && ALPHABET.indexOf( str ) < 52;
\r
489 escape = str === '\\';
\r
496 if( escape && selector === 4 ){
\r
497 str = query.charAt( i + 1 );
\r
498 if( ':.'.indexOf( str ) !== -1 ){
\r
503 result[ result.length ] = [ selector, name ];
\r
504 mode = PASER.START;
\r
507 selector = SELECTORS.indexOf( str );
\r
508 if( selector === -1 && nameFirst ){
\r
509 selector = 8; // tag name
\r
513 if( selector === 7 ){ // [
\r
514 mode = PASER.ATTR_FILTER_START;
\r
516 if( 0 <= selector ){
\r
518 mode = selector < 4 ? PASER.FINISH : PASER.SELECTOR;// > ,+,~
\r
519 if( selector === 0 && lastSelector === 0 ) mode = PASER.START; // 子孫セレクタ
\r
522 mode = PASER.ERROR;
\r
525 case PASER.SELECTOR :
\r
531 mode = PASER.ERROR;
\r
533 case PASER.ATTR_FILTER_START :
\r
535 mode = PASER.ATTR_FILTER_KEY;
\r
540 mode = PASER.ERROR;
\r
542 case PASER.ATTR_FILTER_KEY :
\r
543 operator = OPERATORS[ query.substr( i, 2 ) ];
\r
550 mode = PASER.ATTR_FILTER_VALUE;
\r
552 if( operator !== -1 ){
\r
553 mode = PASER.ATTR_FILTER_VALUE;
\r
557 mode = PASER.ERROR;
\r
560 case PASER.ATTR_FILTER_VALUE :
\r
566 mode = PASER.FINISH;
\r
569 mode = PASER.ERROR;
\r
573 //alert( str + ' ' + mode + ' ' + selector + ' ' + name + ' ' + nameFirst )
\r
574 if( mode === PASER.ERROR ) return [];
\r
576 if( mode === PASER.FINISH && 0 <= selector ){
\r
577 result[ result.length ] = selector === 7 ? [ key, operator, value ] :
\r
578 selector < 4 ? selector :
\r
579 [ selector, name ];
\r
580 lastSelector = selector;
\r
582 mode = PASER.START;
\r
589 })( window, document );