1    (function(){
2    /*
3     * jQuery 1.2.6 - New Wave Javascript
4     *
5     * Copyright (c) 2008 John Resig (jquery.com)
6     * Dual licensed under the MIT (MIT-LICENSE.txt)
7     * and GPL (GPL-LICENSE.txt) licenses.
8     *
9     * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
10    * $Rev: 5685 $
11    */
12   
13   // Map over jQuery in case of overwrite 
14   var _jQuery = window.jQuery,
15   // Map over the $ in case of overwrite 
16       _$ = window.$;
17   
18   var jQuery = window.jQuery = window.$ = function( selector, context ) {
19       // The jQuery object is actually just the init constructor 'enhanced' 
20       returnnew jQuery.fn.init( selector, context );
21   };
22   
23   // A simple way to check for HTML strings or ID strings 
24   // (both of which we optimize for) 
25   var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
26   
27   // Is it a simple selector 
28       isSimple = /^.[^:#\[\.]*$/,
29   
30   // Will speed up references to undefined, and allows munging its name. 
31       undefined;
32   
33   jQuery.fn = jQuery.prototype = {
34       init: function( selector, context ) {
35           // Make sure that a selection was provided 
36           selector = selector || document;
37   
38           // Handle $(DOMElement) 
39           if ( selector.nodeType ) {
40               this[0] = selector;
41               this.length = 1;
42               returnthis;
43           }
44           // Handle HTML strings 
45           if ( typeof selector == "string" ) {
46               // Are we dealing with HTML string or an ID? 
47               var match = quickExpr.exec( selector );
48   
49               // Verify a match, and that no context was specified for #id 
50               if ( match && (match[1] || !context) ) {
51   
52                   // HANDLE: $(html) -> $(array) 
53                   if ( match[1] )
54                       selector = jQuery.clean( [ match[1] ], context );
55   
56                   // HANDLE: $("#id") 
57                   else {
58                       var elem = document.getElementById( match[3] );
59   
60                       // Make sure an element was located 
61                       if ( elem ){
62                           // Handle the case where IE and Opera return items 
63                           // by name instead of ID 
64                           if ( elem.id != match[3] )
65                               return jQuery().find( selector );
66   
67                           // Otherwise, we inject the element directly into the jQuery object 
68                           return jQuery( elem );
69                       }
70                       selector = [];
71                   }
72   
73               // HANDLE: $(expr, [context]) 
74               // (which is just equivalent to: $(content).find(expr) 
75               } else
76                   return jQuery( context ).find( selector );
77   
78           // HANDLE: $(function) 
79           // Shortcut for document ready 
80           } elseif ( jQuery.isFunction( selector ) )
81               return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
82   
83           returnthis.setArray(jQuery.makeArray(selector));
84       },
85   
86       // The current version of jQuery being used 
87       jquery: "1.2.6",
88   
89       // The number of elements contained in the matched element set 
90       size: function() {
91           returnthis.length;
92       },
93   
94       // The number of elements contained in the matched element set 
95       length: 0,
96   
97       // Get the Nth element in the matched element set OR 
98       // Get the whole matched element set as a clean array 
99       get: function( num ) {
100          return num == undefined ?
101  
102              // Return a 'clean' array 
103              jQuery.makeArray( this ) :
104  
105              // Return just the object 
106              this[ num ];
107      },
108  
109      // Take an array of elements and push it onto the stack 
110      // (returning the new matched element set) 
111      pushStack: function( elems ) {
112          // Build a new jQuery matched element set 
113          var ret = jQuery( elems );
114  
115          // Add the old object onto the stack (as a reference) 
116          ret.prevObject = this;
117  
118          // Return the newly-formed element set 
119          return ret;
120      },
121  
122      // Force the current matched set of elements to become 
123      // the specified array of elements (destroying the stack in the process) 
124      // You should use pushStack() in order to do this, but maintain the stack 
125      setArray: function( elems ) {
126          // Resetting the length to 0, then using the native Array push 
127          // is a super-fast way to populate an object with array-like properties 
128          this.length = 0;
129          Array.prototype.push.apply( this, elems );
130  
131          returnthis;
132      },
133  
134      // Execute a callback for every element in the matched set. 
135      // (You can seed the arguments with an array of args, but this is 
136      // only used internally.) 
137      each: function( callback, args ) {
138          return jQuery.each( this, callback, args );
139      },
140  
141      // Determine the position of an element within 
142      // the matched set of elements 
143      index: function( elem ) {
144          var ret = -1;
145  
146          // Locate the position of the desired element 
147          return jQuery.inArray(
148              // If it receives a jQuery object, the first element is used 
149              elem && elem.jquery ? elem[0] : elem
150          , this );
151      },
152  
153      attr: function( name, value, type ) {
154          var options = name;
155  
156          // Look for the case where we're accessing a style value 
157          if ( name.constructor == String )
158              if ( value === undefined )
159                  returnthis[0] && jQuery[ type || "attr" ]( this[0], name );
160  
161              else {
162                  options = {};
163                  options[ name ] = value;
164              }
165  
166          // Check to see if we're setting style values 
167          returnthis.each(function(i){
168              // Set all the styles 
169              for ( name in options )
170                  jQuery.attr(
171                      type ?
172                          this.style :
173                          this,
174                      name, jQuery.prop( this, options[ name ], type, i, name )
175                  );
176          });
177      },
178  
179      css: function( key, value ) {
180          // ignore negative width and height values 
181          if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
182              value = undefined;
183          returnthis.attr( key, value, "curCSS" );
184      },
185  
186      text: function( text ) {
187          if ( typeof text != "object" && text != null )
188              returnthis.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
189  
190          var ret = "";
191  
192          jQuery.each( text || this, function(){
193              jQuery.each( this.childNodes, function(){
194                  if ( this.nodeType != 8 )
195                      ret += this.nodeType != 1 ?
196                          this.nodeValue :
197                          jQuery.fn.text( [ this ] );
198              });
199          });
200  
201          return ret;
202      },
203  
204      wrapAll: function( html ) {
205          if ( this[0] )
206              // The elements to wrap the target around 
207              jQuery( html, this[0].ownerDocument )
208                  .clone()
209                  .insertBefore( this[0] )
210                  .map(function(){
211                      var elem = this;
212  
213                      while ( elem.firstChild )
214                          elem = elem.firstChild;
215  
216                      return elem;
217                  })
218                  .append(this);
219  
220          returnthis;
221      },
222  
223      wrapInner: function( html ) {
224          returnthis.each(function(){
225              jQuery( this ).contents().wrapAll( html );
226          });
227      },
228  
229      wrap: function( html ) {
230          returnthis.each(function(){
231              jQuery( this ).wrapAll( html );
232          });
233      },
234  
235      append: function() {
236          returnthis.domManip(arguments, true, false, function(elem){
237              if (this.nodeType == 1)
238                  this.appendChild( elem );
239          });
240      },
241  
242      prepend: function() {
243          returnthis.domManip(arguments, true, true, function(elem){
244              if (this.nodeType == 1)
245                  this.insertBefore( elem, this.firstChild );
246          });
247      },
248  
249      before: function() {
250          returnthis.domManip(arguments, false, false, function(elem){
251              this.parentNode.insertBefore( elem, this );
252          });
253      },
254  
255      after: function() {
256          returnthis.domManip(arguments, false, true, function(elem){
257              this.parentNode.insertBefore( elem, this.nextSibling );
258          });
259      },
260  
261      end: function() {
262          returnthis.prevObject || jQuery( [] );
263      },
264  
265      find: function( selector ) {
266          var elems = jQuery.map(this, function(elem){
267              return jQuery.find( selector, elem );
268          });
269  
270          returnthis.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
271              jQuery.unique( elems ) :
272              elems );
273      },
274  
275      clone: function( events ) {
276          // Do the clone 
277          var ret = this.map(function(){
278              if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
279                  // IE copies events bound via attachEvent when 
280                  // using cloneNode. Calling detachEvent on the 
281                  // clone will also remove the events from the orignal 
282                  // In order to get around this, we use innerHTML. 
283                  // Unfortunately, this means some modifications to 
284                  // attributes in IE that are actually only stored 
285                  // as properties will not be copied (such as the 
286                  // the name attribute on an input). 
287                  var clone = this.cloneNode(true),
288                      container = document.createElement("div");
289                  container.appendChild(clone);
290                  return jQuery.clean([container.innerHTML])[0];
291              } else
292                  returnthis.cloneNode(true);
293          });
294  
295          // Need to set the expando to null on the cloned set if it exists 
296          // removeData doesn't work here, IE removes it from the original as well 
297          // this is primarily for IE but the data expando shouldn't be copied over in any browser 
298          var clone = ret.find("*").andSelf().each(function(){
299              if ( this[ expando ] != undefined )
300                  this[ expando ] = null;
301          });
302  
303          // Copy the events from the original to the clone 
304          if ( events === true )
305              this.find("*").andSelf().each(function(i){
306                  if (this.nodeType == 3)
307                      return;
308                  var events = jQuery.data( this, "events" );
309  
310                  for ( var type in events )
311                      for ( var handler in events[ type ] )
312                          jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
313              });
314  
315          // Return the cloned set 
316          return ret;
317      },
318  
319      filter: function( selector ) {
320          returnthis.pushStack(
321              jQuery.isFunction( selector ) &&
322              jQuery.grep(this, function(elem, i){
323                  return selector.call( elem, i );
324              }) ||
325  
326              jQuery.multiFilter( selector, this ) );
327      },
328  
329      not: function( selector ) {
330          if ( selector.constructor == String )
331              // test special case where just one selector is passed in 
332              if ( isSimple.test( selector ) )
333                  returnthis.pushStack( jQuery.multiFilter( selector, this, true ) );
334              else
335                  selector = jQuery.multiFilter( selector, this );
336  
337          var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
338          returnthis.filter(function() {
339              return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
340          });
341      },
342  
343      add: function( selector ) {
344          returnthis.pushStack( jQuery.unique( jQuery.merge(
345              this.get(),
346              typeof selector == 'string' ?
347                  jQuery( selector ) :
348                  jQuery.makeArray( selector )
349          )));
350      },
351  
352      is: function( selector ) {
353          return !!selector && jQuery.multiFilter( selector, this ).length > 0;
354      },
355  
356      hasClass: function( selector ) {
357          returnthis.is( "." + selector );
358      },
359  
360      val: function( value ) {
361          if ( value == undefined ) {
362  
363              if ( this.length ) {
364                  var elem = this[0];
365  
366                  // We need to handle select boxes special 
367                  if ( jQuery.nodeName( elem, "select" ) ) {
368                      var index = elem.selectedIndex,
369                          values = [],
370                          options = elem.options,
371                          one = elem.type == "select-one";
372  
373                      // Nothing was selected 
374                      if ( index < 0 )
375                          returnnull;
376  
377                      // Loop through all the selected options 
378                      for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
379                          var option = options[ i ];
380  
381                          if ( option.selected ) {
382                              // Get the specifc value for the option 
383                              value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
384  
385                              // We don't need an array for one selects 
386                              if ( one )
387                                  returnvalue;
388  
389                              // Multi-Selects return an array 
390                              values.push( value );
391                          }
392                      }
393  
394                      return values;
395  
396                  // Everything else, we just grab the value 
397                  } else
398                      return (this[0].value || "").replace(/\r/g, "");
399  
400              }
401  
402              return undefined;
403          }
404  
405          if( value.constructor == Number )
406              value += '';
407  
408          returnthis.each(function(){
409              if ( this.nodeType != 1 )
410                  return;
411  
412              if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
413                  this.checked = (jQuery.inArray(this.value, value) >= 0 ||
414                      jQuery.inArray(this.name, value) >= 0);
415  
416              elseif ( jQuery.nodeName( this, "select" ) ) {
417                  var values = jQuery.makeArray(value);
418  
419                  jQuery( "option", this ).each(function(){
420                      this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
421                          jQuery.inArray( this.text, values ) >= 0);
422                  });
423  
424                  if ( !values.length )
425                      this.selectedIndex = -1;
426  
427              } else
428                  this.value = value;
429          });
430      },
431  
432      html: function( value ) {
433          returnvalue == undefined ?
434              (this[0] ?
435                  this[0].innerHTML :
436                  null) :
437              this.empty().append( value );
438      },
439  
440      replaceWith: function( value ) {
441          returnthis.after( value ).remove();
442      },
443  
444      eq: function( i ) {
445          returnthis.slice( i, i + 1 );
446      },
447  
448      slice: function() {
449          returnthis.pushStack( Array.prototype.slice.apply( this, arguments ) );
450      },
451  
452      map: function( callback ) {
453          returnthis.pushStack( jQuery.map(this, function(elem, i){
454              return callback.call( elem, i, elem );
455          }));
456      },
457  
458      andSelf: function() {
459          returnthis.add( this.prevObject );
460      },
461  
462      data: function( key, value ){
463          var parts = key.split(".");
464          parts[1] = parts[1] ? "." + parts[1] : "";
465  
466          if ( value === undefined ) {
467              var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
468  
469              if ( data === undefined && this.length )
470                  data = jQuery.data( this[0], key );
471  
472              return data === undefined && parts[1] ?
473                  this.data( parts[0] ) :
474                  data;
475          } else
476              returnthis.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
477                  jQuery.data( this, key, value );
478              });
479      },
480  
481      removeData: function( key ){
482          returnthis.each(function(){
483              jQuery.removeData( this, key );
484          });
485      },
486  
487      domManip: function( args, table, reverse, callback ) {
488          var clone = this.length > 1, elems;
489  
490          returnthis.each(function(){
491              if ( !elems ) {
492                  elems = jQuery.clean( args, this.ownerDocument );
493  
494                  if ( reverse )
495                      elems.reverse();
496              }
497  
498              var obj = this;
499  
500              if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
501                  obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
502  
503              var scripts = jQuery( [] );
504  
505              jQuery.each(elems, function(){
506                  var elem = clone ?
507                      jQuery( this ).clone( true )[0] :
508                      this;
509  
510                  // execute all scripts after the elements have been injected 
511                  if ( jQuery.nodeName( elem, "script" ) )
512                      scripts = scripts.add( elem );
513                  else {
514                      // Remove any inner scripts for later evaluation 
515                      if ( elem.nodeType == 1 )
516                          scripts = scripts.add( jQuery( "script", elem ).remove() );
517  
518                      // Inject the elements into the document 
519                      callback.call( obj, elem );
520                  }
521              });
522  
523              scripts.each( evalScript );
524          });
525      }
526  };
527  
528  // Give the init function the jQuery prototype for later instantiation 
529  jQuery.fn.init.prototype = jQuery.fn;
530  
531  function evalScript( i, elem ) {
532      if ( elem.src )
533          jQuery.ajax({
534              url: elem.src,
535              async: false,
536              dataType: "script"
537          });
538  
539      else
540          jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
541  
542      if ( elem.parentNode )
543          elem.parentNode.removeChild( elem );
544  }
545  
546  function now(){
547      return +newDate;
548  }
549  
550  jQuery.extend = jQuery.fn.extend = function() {
551      // copy reference to target object 
552      var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
553  
554      // Handle a deep copy situation 
555      if ( target.constructor == Boolean ) {
556          deep = target;
557          target = arguments[1] || {};
558          // skip the boolean and the target 
559          i = 2;
560      }
561  
562      // Handle case when target is a string or something (possible in deep copy) 
563      if ( typeof target != "object" && typeof target != "function" )
564          target = {};
565  
566      // extend jQuery itself if only one argument is passed 
567      if ( length == i ) {
568          target = this;
569          --i;
570      }
571  
572      for ( ; i < length; i++ )
573          // Only deal with non-null/undefined values 
574          if ( (options = arguments[ i ]) != null )
575              // Extend the base object 
576              for ( var name in options ) {
577                  var src = target[ name ], copy = options[ name ];
578  
579                  // Prevent never-ending loop 
580                  if ( target === copy )
581                      continue;
582  
583                  // Recurse if we're merging object values 
584                  if ( deep && copy && typeof copy == "object" && !copy.nodeType )
585                      target[ name ] = jQuery.extend( deep, 
586                          // Never move original objects, clone them 
587                          src || ( copy.length != null ? [ ] : { } )
588                      , copy );
589  
590                  // Don't bring in undefined values 
591                  elseif ( copy !== undefined )
592                      target[ name ] = copy;
593  
594              }
595  
596      // Return the modified object 
597      return target;
598  };
599  
600  var expando = "jQuery" + now(), uuid = 0, windowData = {},
601      // exclude the following css properties to add px 
602      exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
603      // cache defaultView 
604      defaultView = document.defaultView || {};
605  
606  jQuery.extend({
607      noConflict: function( deep ) {
608          window.$ = _$;
609  
610          if ( deep )
611              window.jQuery = _jQuery;
612  
613          return jQuery;
614      },
615  
616      // See test/unit/core.js for details concerning this function. 
617      isFunction: function( fn ) {
618          return !!fn && typeof fn != "string" && !fn.nodeName &&
619              fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
620      },
621  
622      // check if an element is in a (or is an) XML document 
623      isXMLDoc: function( elem ) {
624          return elem.documentElement && !elem.body ||
625              elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
626      },
627  
628      // Evalulates a script in a global context 
629      globalEval: function( data ) {
630          data = jQuery.trim( data );
631  
632          if ( data ) {
633              // Inspired by code by Andrea Giammarchi 
634              // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html 
635              var head = document.getElementsByTagName("head")[0] || document.documentElement,
636                  script = document.createElement("script");
637  
638              script.type = "text/javascript";
639              if ( jQuery.browser.msie )
640                  script.text = data;
641              else
642                  script.appendChild( document.createTextNode( data ) );
643  
644              // Use insertBefore instead of appendChild  to circumvent an IE6 bug. 
645              // This arises when a base node is used (#2709). 
646              head.insertBefore( script, head.firstChild );
647              head.removeChild( script );
648          }
649      },
650  
651      nodeName: function( elem, name ) {
652          return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
653      },
654  
655      cache: {},
656  
657      data: function( elem, name, data ) {
658          elem = elem == window ?
659              windowData :
660              elem;
661  
662          var id = elem[ expando ];
663  
664          // Compute a unique ID for the element 
665          if ( !id )
666              id = elem[ expando ] = ++uuid;
667  
668          // Only generate the data cache if we're 
669          // trying to access or manipulate it 
670          if ( name && !jQuery.cache[ id ] )
671              jQuery.cache[ id ] = {};
672  
673          // Prevent overriding the named cache with undefined values 
674          if ( data !== undefined )
675              jQuery.cache[ id ][ name ] = data;
676  
677          // Return the named cache data, or the ID for the element 
678          return name ?
679              jQuery.cache[ id ][ name ] :
680              id;
681      },
682  
683      removeData: function( elem, name ) {
684          elem = elem == window ?
685              windowData :
686              elem;
687  
688          var id = elem[ expando ];
689  
690          // If we want to remove a specific section of the element's data 
691          if ( name ) {
692              if ( jQuery.cache[ id ] ) {