r39372 MediaWiki - Code Review archive

Repository:MediaWiki
Revision:r39371‎ | r39372 | r39373 >
Date:23:18, 14 August 2008
Author:dale
Status:old
Tags:
Comment:
some fixes for non-pcf skin
Modified paths:
  • /branches/MetavidWiki-exp/MetavidWiki/includes/specials/MV_SpecialMediaSearch.php (modified) (history)
  • /branches/MetavidWiki-exp/MetavidWiki/skins/mv_allpages.js (modified) (history)
  • /branches/MetavidWiki-exp/MetavidWiki/skins/mv_custom.css (modified) (history)
  • /branches/MetavidWiki-exp/MetavidWiki/skins/mv_embed/jquery/jquery-1.2.6.js (added) (history)

Diff [purge]

Index: branches/MetavidWiki-exp/MetavidWiki/includes/specials/MV_SpecialMediaSearch.php
@@ -24,11 +24,9 @@
2525 class MV_SpecialSearch extends SpecialPage {
2626 function MV_SpecialSearch() {
2727 global $wgOut, $wgRequest;
28 - //mvfAddHTMLHeader('search');
29 - //$MvSpecialSearch = new MV_SpecialMediaSearch();
30 - //$MvSpecialSearch->setupFilters();
31 - //$MvSpecialSearch->doSearch();
32 - //$wgOut->addHTML($MvSpecialSearch->getResultsHTML());
 28+ mvfAddHTMLHeader('search');
 29+ $MvSpecialSearch = new MV_SpecialMediaSearch();
 30+ $MvSpecialSearch->doSearchPage( $wgRequest->getVal('search') );
3331 SpecialPage :: SpecialPage('Search');
3432 }
3533 }
@@ -130,7 +128,7 @@
131129 <span class=\"advs_basic\" style=\"display:";
132130 $o .= ($this->adv_search) ? 'none' : 'inline';
133131 $o .= "\">
134 - <input type=\"text\" class=\"searchField\" name=\"mv_search\" id=\"search_field\" value=\"{$this->unified_term_search}\"/>
 132+ <input type=\"text\" class=\"searchField\" name=\"mv_search\" id=\"searchInput\" value=\"{$this->unified_term_search}\"/>
135133 </span>
136134 <span class=\"advs_adv\" id=\"adv_filters\" style=\"display:";
137135 $o .= ($this->adv_search) ? 'inline' : 'none';
@@ -517,6 +515,7 @@
518516 }
519517 $o .= '</div><!--searchSideBarInner-->
520518 </div>';
 519+ $o.='<div style="clear:both;"></div>';
521520 return $o;
522521 }
523522 function getResultsHTML() {
Index: branches/MetavidWiki-exp/MetavidWiki/skins/mv_custom.css
@@ -174,8 +174,20 @@
175175 #mv_time_line{
176176 position:absolute;background:#DDDDDD;left:0px;height:94%;overflow:hidden;
177177 }
 178+#selectionsBox{
 179+ width: 490px;
 180+ height: 517px;
 181+ overflow: auto;
 182+ border: 1px solid #c8c8c8;
 183+ margin: 15px 0;
 184+}
 185+#videoContent {
 186+ width: 410px;
 187+ float: left;
 188+ display: inline;
 189+}
178190 #MV_Tools{
179 - position:absolute;width:400px;top:350px;left:10px;bottom:10px;margin:4px;
 191+ position:absolute;width:400px;top:420px;left:10px;bottom:10px;margin:4px;
180192 }
181193 #mv_tool_cont{
182194 position:absolute;top:0px;left:0px;right:13px;bottom:30px;overflow:auto;
@@ -377,5 +389,84 @@
378390 border:solid black thin;
379391 }
380392
 393+#resultsArea {
 394+ width: 630px;
 395+ float: left;
 396+ display: inline;
 397+ margin: 0 0 10px 8px;
 398+}
381399
 400+ul#metaResults, ul#metaProfile {
 401+ margin: 0;
 402+ padding: 0;
 403+ list-style: none;
 404+ text-align: left;
 405+ overflow: hidden;
 406+ height: 100%;
 407+}
 408+ul#metaResults li, ul#metaProfile li {
 409+ display: inline;
 410+}
 411+ul#metaResults li a, ul#metaProfile li a {
 412+ text-decoration: none;
 413+}
382414
 415+ul#metaResults li.results {font-weight: bold; margin-right: 10px; margin-left:3px;}
 416+ul#metaResults li.relevant {}
 417+ul#metaResults li.recent {}
 418+ul#metaResults li.viewed {margin-right: 10px;}
 419+ul#metaResults li.rss a {background: url(images/ico_rss.png) top right no-repeat; padding: 0 18px 0 0; color: #df5c01; margin-left:40px}
 420+ul#metaResults li.subscribe img {vertical-align: bottom; margin-left: 10px;}
 421+
 422+ul#metaProfile li.recent_activity {font-weight: bold; font-size: 15px; float: left; display: inline;}
 423+ul#metaProfile li.rss a {float: right; display: inline; background: url(images/ico_rss.png) top right no-repeat; padding: 0 18px 0 0; color: #df5c01;}
 424+ul#metaProfile li.subscribe img {vertical-align: bottom; float: right; display: inline; margin-left: 10px;}
 425+ul#metaResults li.prevnext {margin-left:3px; margin-right:10px;}
 426+
 427+#resultsArea ul#results {
 428+ list-style: none;
 429+ margin: 20px 0;
 430+ padding: 0;
 431+}
 432+#resultsArea ul#results li.result {
 433+ margin: 0 0 26px 0;
 434+ overflow: hidden;
 435+ height: 100%;
 436+}
 437+#resultsArea ul#results li.moreBy {
 438+ padding: 10px 0 0 173px;
 439+}
 440+#resultsArea ul#results li.moreBy a {text-decoration: none; font-weight: bold; font-size: 14px;}
 441+
 442+#resultsArea ul#results li.result .vid_img {float: left; display: inline; width:160px;}
 443+#resultsArea ul#results li.result div.result_description {
 444+ width: 353px;
 445+ float: left;
 446+ display: inline;
 447+ margin: 0 0 0 15px;
 448+}
 449+.suggestionsBox div.block p.people2_match img {width: 44px;padding:5px;}
 450+#resultsArea ul#results li.result div.result_description p {margin: 0; padding: 8px 0;}
 451+#resultsArea ul#results li.result div.result_description h4 {margin: 0; padding: 0;}
 452+#resultsArea ul#results li.result div.result_description a {text-decoration: none;}
 453+#resultsArea ul#results li.result div.result_meta {float: right; display: inline; color: #7a7979;}
 454+#resultsArea ul#results li.result div.result_meta span {display: block; font-size: 12px; padding: 2px 0;}
 455+
 456+#searchSideBar {
 457+ width: 253px;
 458+ float: right;
 459+ display: inline;
 460+ overflow: hidden;
 461+}
 462+#searchSideBarInner h6 {color: #242424; text-transform: none; padding: 5px 20px 5px 20px; margin: 0;}
 463+#searchSideBarInner h6.profile {background: #dfebfe; margin: 0px 1px;}
 464+#suggestions {
 465+ width: 295px;
 466+ overflow: hidden;
 467+ position: absolute;
 468+ z-index: 2;
 469+ margin: 0 0 0 230px;
 470+}
 471+#suggestionsInner{
 472+ background:#FFF;
 473+}
\ No newline at end of file
Index: branches/MetavidWiki-exp/MetavidWiki/skins/mv_allpages.js
@@ -162,7 +162,7 @@
163163 if($j('#advs').val()=='0'){
164164 $j('#advs').val('1');
165165 //sync values from basic -> avanced
166 - $j("input[@name$='f[0][v]']").val( $j('#search_field').val() );
 166+ $j("input[@name$='f[0][v]']").val( $j('#searchInput').val() );
167167
168168 $j('.advs_basic').fadeOut('fast',function(){
169169 if($j('#tmp_loading_txt').length==0){
@@ -179,7 +179,7 @@
180180 }else{
181181 $j('#advs').val('0');
182182 //sync values from advanced -> basic
183 - $j('#search_field').val( $j("input[@name$='f[0][v]']").val() );
 183+ $j('#searchInput').val( $j("input[@name$='f[0][v]']").val() );
184184 //do style display swap
185185 $j('.advs_adv').fadeOut('fast',function(){
186186 $j('.advs_basic').fadeIn('fast');
@@ -191,7 +191,7 @@
192192 var uri = wgScript;
193193 //add the person choices div to searchInput
194194 //turn off browser baseed autocomplete:
195 - $j('#search_field').attr('autocomplete',"off");
 195+ $j('#searchInput').attr('autocomplete',"off");
196196
197197 //add the sugestions div (abolute positioned so it can be ontop of everything)
198198 $j('body').prepend('<div id="suggestions" style="position:absolute;display:none;z-index:50;">'+
@@ -201,8 +201,8 @@
202202 '<div id="suggestionsBot"></div>'+
203203 '</div>');
204204 //position the sugestions below the search field:
205 - if( $j('#search_field').get(0)!=null){
206 - sf_pos = $j('#search_field').offset();
 205+ if( $j('#searchInput').get(0)!=null){
 206+ sf_pos = $j('#searchInput').offset();
207207 sf_pos['top']=sf_pos['top']+40;
208208 sf_pos['left']=sf_pos['left']-220;
209209 js_log("moved sugest to: " + sf_pos['top'] + ' '+ sf_pos['left']);
@@ -210,26 +210,26 @@
211211 }
212212
213213 //add hook:
214 - $j('#search_field').autocomplete(
 214+ $j('#searchInput').autocomplete(
215215 uri,
216216 {
217217 autoFill:false,
218218 onItemSelect:function(v){
219219 //alert('selected:' + v.innerHTML + ' page:'+$j('#searchInput').val());
220220 //jump to page:
221 - if($j('#search_field').val()=='do_search'){
 221+ if($j('#searchInput').val()=='do_search'){
222222 qs = v.innerHTML.toLowerCase().indexOf('<b>')+3;
223223 qe = v.innerHTML.toLowerCase().indexOf('</b>');
224224 //update the search input (incase redirect fails)
225 - $j('#search_field').val(v.innerHTML.substring(qs,qe));
 225+ $j('#searchInput').val(v.innerHTML.substring(qs,qe));
226226 window.location=uri+'/'+'Special:MediaSearch?mv_search='+v.innerHTML.substring(qs,qe);
227227 }else{
228 - window.location =uri+'/'+$j('#search_field').val();
 228+ window.location =uri+'/'+$j('#searchInput').val();
229229 }
230230 },
231231 formatItem:function(row){
232232 if(row[0]=='do_search'){
233 - return '<span class="ac_txt">'+row[1].replace('$1',$j('#search_field').val())+'</span>';
 233+ return '<span class="ac_txt">'+row[1].replace('$1',$j('#searchInput').val())+'</span>';
234234 }else if(row[2]=='no_image'){
235235 return '<span class="ac_txt">'+row[1]+'</span>';
236236 }else{
Index: branches/MetavidWiki-exp/MetavidWiki/skins/mv_embed/jquery/jquery-1.2.6.js
@@ -0,0 +1,3549 @@
 2+(function(){
 3+/*
 4+ * jQuery 1.2.6 - New Wave Javascript
 5+ *
 6+ * Copyright (c) 2008 John Resig (jquery.com)
 7+ * Dual licensed under the MIT (MIT-LICENSE.txt)
 8+ * and GPL (GPL-LICENSE.txt) licenses.
 9+ *
 10+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
 11+ * $Rev: 5685 $
 12+ */
 13+
 14+// Map over jQuery in case of overwrite
 15+var _jQuery = window.jQuery,
 16+// Map over the $ in case of overwrite
 17+ _$ = window.$;
 18+
 19+var jQuery = window.jQuery = window.$ = function( selector, context ) {
 20+ // The jQuery object is actually just the init constructor 'enhanced'
 21+ return new jQuery.fn.init( selector, context );
 22+};
 23+
 24+// A simple way to check for HTML strings or ID strings
 25+// (both of which we optimize for)
 26+var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,
 27+
 28+// Is it a simple selector
 29+ isSimple = /^.[^:#\[\.]*$/,
 30+
 31+// Will speed up references to undefined, and allows munging its name.
 32+ undefined;
 33+
 34+jQuery.fn = jQuery.prototype = {
 35+ init: function( selector, context ) {
 36+ // Make sure that a selection was provided
 37+ selector = selector || document;
 38+
 39+ // Handle $(DOMElement)
 40+ if ( selector.nodeType ) {
 41+ this[0] = selector;
 42+ this.length = 1;
 43+ return this;
 44+ }
 45+ // Handle HTML strings
 46+ if ( typeof selector == "string" ) {
 47+ // Are we dealing with HTML string or an ID?
 48+ var match = quickExpr.exec( selector );
 49+
 50+ // Verify a match, and that no context was specified for #id
 51+ if ( match && (match[1] || !context) ) {
 52+
 53+ // HANDLE: $(html) -> $(array)
 54+ if ( match[1] )
 55+ selector = jQuery.clean( [ match[1] ], context );
 56+
 57+ // HANDLE: $("#id")
 58+ else {
 59+ var elem = document.getElementById( match[3] );
 60+
 61+ // Make sure an element was located
 62+ if ( elem ){
 63+ // Handle the case where IE and Opera return items
 64+ // by name instead of ID
 65+ if ( elem.id != match[3] )
 66+ return jQuery().find( selector );
 67+
 68+ // Otherwise, we inject the element directly into the jQuery object
 69+ return jQuery( elem );
 70+ }
 71+ selector = [];
 72+ }
 73+
 74+ // HANDLE: $(expr, [context])
 75+ // (which is just equivalent to: $(content).find(expr)
 76+ } else
 77+ return jQuery( context ).find( selector );
 78+
 79+ // HANDLE: $(function)
 80+ // Shortcut for document ready
 81+ } else if ( jQuery.isFunction( selector ) )
 82+ return jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );
 83+
 84+ return this.setArray(jQuery.makeArray(selector));
 85+ },
 86+
 87+ // The current version of jQuery being used
 88+ jquery: "1.2.6",
 89+
 90+ // The number of elements contained in the matched element set
 91+ size: function() {
 92+ return this.length;
 93+ },
 94+
 95+ // The number of elements contained in the matched element set
 96+ length: 0,
 97+
 98+ // Get the Nth element in the matched element set OR
 99+ // Get the whole matched element set as a clean array
 100+ get: function( num ) {
 101+ return num == undefined ?
 102+
 103+ // Return a 'clean' array
 104+ jQuery.makeArray( this ) :
 105+
 106+ // Return just the object
 107+ this[ num ];
 108+ },
 109+
 110+ // Take an array of elements and push it onto the stack
 111+ // (returning the new matched element set)
 112+ pushStack: function( elems ) {
 113+ // Build a new jQuery matched element set
 114+ var ret = jQuery( elems );
 115+
 116+ // Add the old object onto the stack (as a reference)
 117+ ret.prevObject = this;
 118+
 119+ // Return the newly-formed element set
 120+ return ret;
 121+ },
 122+
 123+ // Force the current matched set of elements to become
 124+ // the specified array of elements (destroying the stack in the process)
 125+ // You should use pushStack() in order to do this, but maintain the stack
 126+ setArray: function( elems ) {
 127+ // Resetting the length to 0, then using the native Array push
 128+ // is a super-fast way to populate an object with array-like properties
 129+ this.length = 0;
 130+ Array.prototype.push.apply( this, elems );
 131+
 132+ return this;
 133+ },
 134+
 135+ // Execute a callback for every element in the matched set.
 136+ // (You can seed the arguments with an array of args, but this is
 137+ // only used internally.)
 138+ each: function( callback, args ) {
 139+ return jQuery.each( this, callback, args );
 140+ },
 141+
 142+ // Determine the position of an element within
 143+ // the matched set of elements
 144+ index: function( elem ) {
 145+ var ret = -1;
 146+
 147+ // Locate the position of the desired element
 148+ return jQuery.inArray(
 149+ // If it receives a jQuery object, the first element is used
 150+ elem && elem.jquery ? elem[0] : elem
 151+ , this );
 152+ },
 153+
 154+ attr: function( name, value, type ) {
 155+ var options = name;
 156+
 157+ // Look for the case where we're accessing a style value
 158+ if ( name.constructor == String )
 159+ if ( value === undefined )
 160+ return this[0] && jQuery[ type || "attr" ]( this[0], name );
 161+
 162+ else {
 163+ options = {};
 164+ options[ name ] = value;
 165+ }
 166+
 167+ // Check to see if we're setting style values
 168+ return this.each(function(i){
 169+ // Set all the styles
 170+ for ( name in options )
 171+ jQuery.attr(
 172+ type ?
 173+ this.style :
 174+ this,
 175+ name, jQuery.prop( this, options[ name ], type, i, name )
 176+ );
 177+ });
 178+ },
 179+
 180+ css: function( key, value ) {
 181+ // ignore negative width and height values
 182+ if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )
 183+ value = undefined;
 184+ return this.attr( key, value, "curCSS" );
 185+ },
 186+
 187+ text: function( text ) {
 188+ if ( typeof text != "object" && text != null )
 189+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
 190+
 191+ var ret = "";
 192+
 193+ jQuery.each( text || this, function(){
 194+ jQuery.each( this.childNodes, function(){
 195+ if ( this.nodeType != 8 )
 196+ ret += this.nodeType != 1 ?
 197+ this.nodeValue :
 198+ jQuery.fn.text( [ this ] );
 199+ });
 200+ });
 201+
 202+ return ret;
 203+ },
 204+
 205+ wrapAll: function( html ) {
 206+ if ( this[0] )
 207+ // The elements to wrap the target around
 208+ jQuery( html, this[0].ownerDocument )
 209+ .clone()
 210+ .insertBefore( this[0] )
 211+ .map(function(){
 212+ var elem = this;
 213+
 214+ while ( elem.firstChild )
 215+ elem = elem.firstChild;
 216+
 217+ return elem;
 218+ })
 219+ .append(this);
 220+
 221+ return this;
 222+ },
 223+
 224+ wrapInner: function( html ) {
 225+ return this.each(function(){
 226+ jQuery( this ).contents().wrapAll( html );
 227+ });
 228+ },
 229+
 230+ wrap: function( html ) {
 231+ return this.each(function(){
 232+ jQuery( this ).wrapAll( html );
 233+ });
 234+ },
 235+
 236+ append: function() {
 237+ return this.domManip(arguments, true, false, function(elem){
 238+ if (this.nodeType == 1)
 239+ this.appendChild( elem );
 240+ });
 241+ },
 242+
 243+ prepend: function() {
 244+ return this.domManip(arguments, true, true, function(elem){
 245+ if (this.nodeType == 1)
 246+ this.insertBefore( elem, this.firstChild );
 247+ });
 248+ },
 249+
 250+ before: function() {
 251+ return this.domManip(arguments, false, false, function(elem){
 252+ this.parentNode.insertBefore( elem, this );
 253+ });
 254+ },
 255+
 256+ after: function() {
 257+ return this.domManip(arguments, false, true, function(elem){
 258+ this.parentNode.insertBefore( elem, this.nextSibling );
 259+ });
 260+ },
 261+
 262+ end: function() {
 263+ return this.prevObject || jQuery( [] );
 264+ },
 265+
 266+ find: function( selector ) {
 267+ var elems = jQuery.map(this, function(elem){
 268+ return jQuery.find( selector, elem );
 269+ });
 270+
 271+ return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?
 272+ jQuery.unique( elems ) :
 273+ elems );
 274+ },
 275+
 276+ clone: function( events ) {
 277+ // Do the clone
 278+ var ret = this.map(function(){
 279+ if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {
 280+ // IE copies events bound via attachEvent when
 281+ // using cloneNode. Calling detachEvent on the
 282+ // clone will also remove the events from the orignal
 283+ // In order to get around this, we use innerHTML.
 284+ // Unfortunately, this means some modifications to
 285+ // attributes in IE that are actually only stored
 286+ // as properties will not be copied (such as the
 287+ // the name attribute on an input).
 288+ var clone = this.cloneNode(true),
 289+ container = document.createElement("div");
 290+ container.appendChild(clone);
 291+ return jQuery.clean([container.innerHTML])[0];
 292+ } else
 293+ return this.cloneNode(true);
 294+ });
 295+
 296+ // Need to set the expando to null on the cloned set if it exists
 297+ // removeData doesn't work here, IE removes it from the original as well
 298+ // this is primarily for IE but the data expando shouldn't be copied over in any browser
 299+ var clone = ret.find("*").andSelf().each(function(){
 300+ if ( this[ expando ] != undefined )
 301+ this[ expando ] = null;
 302+ });
 303+
 304+ // Copy the events from the original to the clone
 305+ if ( events === true )
 306+ this.find("*").andSelf().each(function(i){
 307+ if (this.nodeType == 3)
 308+ return;
 309+ var events = jQuery.data( this, "events" );
 310+
 311+ for ( var type in events )
 312+ for ( var handler in events[ type ] )
 313+ jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );
 314+ });
 315+
 316+ // Return the cloned set
 317+ return ret;
 318+ },
 319+
 320+ filter: function( selector ) {
 321+ return this.pushStack(
 322+ jQuery.isFunction( selector ) &&
 323+ jQuery.grep(this, function(elem, i){
 324+ return selector.call( elem, i );
 325+ }) ||
 326+
 327+ jQuery.multiFilter( selector, this ) );
 328+ },
 329+
 330+ not: function( selector ) {
 331+ if ( selector.constructor == String )
 332+ // test special case where just one selector is passed in
 333+ if ( isSimple.test( selector ) )
 334+ return this.pushStack( jQuery.multiFilter( selector, this, true ) );
 335+ else
 336+ selector = jQuery.multiFilter( selector, this );
 337+
 338+ var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;
 339+ return this.filter(function() {
 340+ return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;
 341+ });
 342+ },
 343+
 344+ add: function( selector ) {
 345+ return this.pushStack( jQuery.unique( jQuery.merge(
 346+ this.get(),
 347+ typeof selector == 'string' ?
 348+ jQuery( selector ) :
 349+ jQuery.makeArray( selector )
 350+ )));
 351+ },
 352+
 353+ is: function( selector ) {
 354+ return !!selector && jQuery.multiFilter( selector, this ).length > 0;
 355+ },
 356+
 357+ hasClass: function( selector ) {
 358+ return this.is( "." + selector );
 359+ },
 360+
 361+ val: function( value ) {
 362+ if ( value == undefined ) {
 363+
 364+ if ( this.length ) {
 365+ var elem = this[0];
 366+
 367+ // We need to handle select boxes special
 368+ if ( jQuery.nodeName( elem, "select" ) ) {
 369+ var index = elem.selectedIndex,
 370+ values = [],
 371+ options = elem.options,
 372+ one = elem.type == "select-one";
 373+
 374+ // Nothing was selected
 375+ if ( index < 0 )
 376+ return null;
 377+
 378+ // Loop through all the selected options
 379+ for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
 380+ var option = options[ i ];
 381+
 382+ if ( option.selected ) {
 383+ // Get the specifc value for the option
 384+ value = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;
 385+
 386+ // We don't need an array for one selects
 387+ if ( one )
 388+ return value;
 389+
 390+ // Multi-Selects return an array
 391+ values.push( value );
 392+ }
 393+ }
 394+
 395+ return values;
 396+
 397+ // Everything else, we just grab the value
 398+ } else
 399+ return (this[0].value || "").replace(/\r/g, "");
 400+
 401+ }
 402+
 403+ return undefined;
 404+ }
 405+
 406+ if( value.constructor == Number )
 407+ value += '';
 408+
 409+ return this.each(function(){
 410+ if ( this.nodeType != 1 )
 411+ return;
 412+
 413+ if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )
 414+ this.checked = (jQuery.inArray(this.value, value) >= 0 ||
 415+ jQuery.inArray(this.name, value) >= 0);
 416+
 417+ else if ( jQuery.nodeName( this, "select" ) ) {
 418+ var values = jQuery.makeArray(value);
 419+
 420+ jQuery( "option", this ).each(function(){
 421+ this.selected = (jQuery.inArray( this.value, values ) >= 0 ||
 422+ jQuery.inArray( this.text, values ) >= 0);
 423+ });
 424+
 425+ if ( !values.length )
 426+ this.selectedIndex = -1;
 427+
 428+ } else
 429+ this.value = value;
 430+ });
 431+ },
 432+
 433+ html: function( value ) {
 434+ return value == undefined ?
 435+ (this[0] ?
 436+ this[0].innerHTML :
 437+ null) :
 438+ this.empty().append( value );
 439+ },
 440+
 441+ replaceWith: function( value ) {
 442+ return this.after( value ).remove();
 443+ },
 444+
 445+ eq: function( i ) {
 446+ return this.slice( i, i + 1 );
 447+ },
 448+
 449+ slice: function() {
 450+ return this.pushStack( Array.prototype.slice.apply( this, arguments ) );
 451+ },
 452+
 453+ map: function( callback ) {
 454+ return this.pushStack( jQuery.map(this, function(elem, i){
 455+ return callback.call( elem, i, elem );
 456+ }));
 457+ },
 458+
 459+ andSelf: function() {
 460+ return this.add( this.prevObject );
 461+ },
 462+
 463+ data: function( key, value ){
 464+ var parts = key.split(".");
 465+ parts[1] = parts[1] ? "." + parts[1] : "";
 466+
 467+ if ( value === undefined ) {
 468+ var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
 469+
 470+ if ( data === undefined && this.length )
 471+ data = jQuery.data( this[0], key );
 472+
 473+ return data === undefined && parts[1] ?
 474+ this.data( parts[0] ) :
 475+ data;
 476+ } else
 477+ return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){
 478+ jQuery.data( this, key, value );
 479+ });
 480+ },
 481+
 482+ removeData: function( key ){
 483+ return this.each(function(){
 484+ jQuery.removeData( this, key );
 485+ });
 486+ },
 487+
 488+ domManip: function( args, table, reverse, callback ) {
 489+ var clone = this.length > 1, elems;
 490+
 491+ return this.each(function(){
 492+ if ( !elems ) {
 493+ elems = jQuery.clean( args, this.ownerDocument );
 494+
 495+ if ( reverse )
 496+ elems.reverse();
 497+ }
 498+
 499+ var obj = this;
 500+
 501+ if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
 502+ obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );
 503+
 504+ var scripts = jQuery( [] );
 505+
 506+ jQuery.each(elems, function(){
 507+ var elem = clone ?
 508+ jQuery( this ).clone( true )[0] :
 509+ this;
 510+
 511+ // execute all scripts after the elements have been injected
 512+ if ( jQuery.nodeName( elem, "script" ) )
 513+ scripts = scripts.add( elem );
 514+ else {
 515+ // Remove any inner scripts for later evaluation
 516+ if ( elem.nodeType == 1 )
 517+ scripts = scripts.add( jQuery( "script", elem ).remove() );
 518+
 519+ // Inject the elements into the document
 520+ callback.call( obj, elem );
 521+ }
 522+ });
 523+
 524+ scripts.each( evalScript );
 525+ });
 526+ }
 527+};
 528+
 529+// Give the init function the jQuery prototype for later instantiation
 530+jQuery.fn.init.prototype = jQuery.fn;
 531+
 532+function evalScript( i, elem ) {
 533+ if ( elem.src )
 534+ jQuery.ajax({
 535+ url: elem.src,
 536+ async: false,
 537+ dataType: "script"
 538+ });
 539+
 540+ else
 541+ jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
 542+
 543+ if ( elem.parentNode )
 544+ elem.parentNode.removeChild( elem );
 545+}
 546+
 547+function now(){
 548+ return +new Date;
 549+}
 550+
 551+jQuery.extend = jQuery.fn.extend = function() {
 552+ // copy reference to target object
 553+ var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;
 554+
 555+ // Handle a deep copy situation
 556+ if ( target.constructor == Boolean ) {
 557+ deep = target;
 558+ target = arguments[1] || {};
 559+ // skip the boolean and the target
 560+ i = 2;
 561+ }
 562+
 563+ // Handle case when target is a string or something (possible in deep copy)
 564+ if ( typeof target != "object" && typeof target != "function" )
 565+ target = {};
 566+
 567+ // extend jQuery itself if only one argument is passed
 568+ if ( length == i ) {
 569+ target = this;
 570+ --i;
 571+ }
 572+
 573+ for ( ; i < length; i++ )
 574+ // Only deal with non-null/undefined values
 575+ if ( (options = arguments[ i ]) != null )
 576+ // Extend the base object
 577+ for ( var name in options ) {
 578+ var src = target[ name ], copy = options[ name ];
 579+
 580+ // Prevent never-ending loop
 581+ if ( target === copy )
 582+ continue;
 583+
 584+ // Recurse if we're merging object values
 585+ if ( deep && copy && typeof copy == "object" && !copy.nodeType )
 586+ target[ name ] = jQuery.extend( deep,
 587+ // Never move original objects, clone them
 588+ src || ( copy.length != null ? [ ] : { } )
 589+ , copy );
 590+
 591+ // Don't bring in undefined values
 592+ else if ( copy !== undefined )
 593+ target[ name ] = copy;
 594+
 595+ }
 596+
 597+ // Return the modified object
 598+ return target;
 599+};
 600+
 601+var expando = "jQuery" + now(), uuid = 0, windowData = {},
 602+ // exclude the following css properties to add px
 603+ exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
 604+ // cache defaultView
 605+ defaultView = document.defaultView || {};
 606+
 607+jQuery.extend({
 608+ noConflict: function( deep ) {
 609+ window.$ = _$;
 610+
 611+ if ( deep )
 612+ window.jQuery = _jQuery;
 613+
 614+ return jQuery;
 615+ },
 616+
 617+ // See test/unit/core.js for details concerning this function.
 618+ isFunction: function( fn ) {
 619+ return !!fn && typeof fn != "string" && !fn.nodeName &&
 620+ fn.constructor != Array && /^[\s[]?function/.test( fn + "" );
 621+ },
 622+
 623+ // check if an element is in a (or is an) XML document
 624+ isXMLDoc: function( elem ) {
 625+ return elem.documentElement && !elem.body ||
 626+ elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;
 627+ },
 628+
 629+ // Evalulates a script in a global context
 630+ globalEval: function( data ) {
 631+ data = jQuery.trim( data );
 632+
 633+ if ( data ) {
 634+ // Inspired by code by Andrea Giammarchi
 635+ // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
 636+ var head = document.getElementsByTagName("head")[0] || document.documentElement,
 637+ script = document.createElement("script");
 638+
 639+ script.type = "text/javascript";
 640+ if ( jQuery.browser.msie )
 641+ script.text = data;
 642+ else
 643+ script.appendChild( document.createTextNode( data ) );
 644+
 645+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
 646+ // This arises when a base node is used (#2709).
 647+ head.insertBefore( script, head.firstChild );
 648+ head.removeChild( script );
 649+ }
 650+ },
 651+
 652+ nodeName: function( elem, name ) {
 653+ return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();
 654+ },
 655+
 656+ cache: {},
 657+
 658+ data: function( elem, name, data ) {
 659+ elem = elem == window ?
 660+ windowData :
 661+ elem;
 662+
 663+ var id = elem[ expando ];
 664+
 665+ // Compute a unique ID for the element
 666+ if ( !id )
 667+ id = elem[ expando ] = ++uuid;
 668+
 669+ // Only generate the data cache if we're
 670+ // trying to access or manipulate it
 671+ if ( name && !jQuery.cache[ id ] )
 672+ jQuery.cache[ id ] = {};
 673+
 674+ // Prevent overriding the named cache with undefined values
 675+ if ( data !== undefined )
 676+ jQuery.cache[ id ][ name ] = data;
 677+
 678+ // Return the named cache data, or the ID for the element
 679+ return name ?
 680+ jQuery.cache[ id ][ name ] :
 681+ id;
 682+ },
 683+
 684+ removeData: function( elem, name ) {
 685+ elem = elem == window ?
 686+ windowData :
 687+ elem;
 688+
 689+ var id = elem[ expando ];
 690+
 691+ // If we want to remove a specific section of the element's data
 692+ if ( name ) {
 693+ if ( jQuery.cache[ id ] ) {
 694+ // Remove the section of cache data
 695+ delete jQuery.cache[ id ][ name ];
 696+
 697+ // If we've removed all the data, remove the element's cache
 698+ name = "";
 699+
 700+ for ( name in jQuery.cache[ id ] )
 701+ break;
 702+
 703+ if ( !name )
 704+ jQuery.removeData( elem );
 705+ }
 706+
 707+ // Otherwise, we want to remove all of the element's data
 708+ } else {
 709+ // Clean up the element expando
 710+ try {
 711+ delete elem[ expando ];
 712+ } catch(e){
 713+ // IE has trouble directly removing the expando
 714+ // but it's ok with using removeAttribute
 715+ if ( elem.removeAttribute )
 716+ elem.removeAttribute( expando );
 717+ }
 718+
 719+ // Completely remove the data cache
 720+ delete jQuery.cache[ id ];
 721+ }
 722+ },
 723+
 724+ // args is for internal usage only
 725+ each: function( object, callback, args ) {
 726+ var name, i = 0, length = object.length;
 727+
 728+ if ( args ) {
 729+ if ( length == undefined ) {
 730+ for ( name in object )
 731+ if ( callback.apply( object[ name ], args ) === false )
 732+ break;
 733+ } else
 734+ for ( ; i < length; )
 735+ if ( callback.apply( object[ i++ ], args ) === false )
 736+ break;
 737+
 738+ // A special, fast, case for the most common use of each
 739+ } else {
 740+ if ( length == undefined ) {
 741+ for ( name in object )
 742+ if ( callback.call( object[ name ], name, object[ name ] ) === false )
 743+ break;
 744+ } else
 745+ for ( var value = object[0];
 746+ i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}
 747+ }
 748+
 749+ return object;
 750+ },
 751+
 752+ prop: function( elem, value, type, i, name ) {
 753+ // Handle executable functions
 754+ if ( jQuery.isFunction( value ) )
 755+ value = value.call( elem, i );
 756+
 757+ // Handle passing in a number to a CSS property
 758+ return value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?
 759+ value + "px" :
 760+ value;
 761+ },
 762+
 763+ className: {
 764+ // internal only, use addClass("class")
 765+ add: function( elem, classNames ) {
 766+ jQuery.each((classNames || "").split(/\s+/), function(i, className){
 767+ if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )
 768+ elem.className += (elem.className ? " " : "") + className;
 769+ });
 770+ },
 771+
 772+ // internal only, use removeClass("class")
 773+ remove: function( elem, classNames ) {
 774+ if (elem.nodeType == 1)
 775+ elem.className = classNames != undefined ?
 776+ jQuery.grep(elem.className.split(/\s+/), function(className){
 777+ return !jQuery.className.has( classNames, className );
 778+ }).join(" ") :
 779+ "";
 780+ },
 781+
 782+ // internal only, use hasClass("class")
 783+ has: function( elem, className ) {
 784+ return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;
 785+ }
 786+ },
 787+
 788+ // A method for quickly swapping in/out CSS properties to get correct calculations
 789+ swap: function( elem, options, callback ) {
 790+ var old = {};
 791+ // Remember the old values, and insert the new ones
 792+ for ( var name in options ) {
 793+ old[ name ] = elem.style[ name ];
 794+ elem.style[ name ] = options[ name ];
 795+ }
 796+
 797+ callback.call( elem );
 798+
 799+ // Revert the old values
 800+ for ( var name in options )
 801+ elem.style[ name ] = old[ name ];
 802+ },
 803+
 804+ css: function( elem, name, force ) {
 805+ if ( name == "width" || name == "height" ) {
 806+ var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];
 807+
 808+ function getWH() {
 809+ val = name == "width" ? elem.offsetWidth : elem.offsetHeight;
 810+ var padding = 0, border = 0;
 811+ jQuery.each( which, function() {
 812+ padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
 813+ border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
 814+ });
 815+ val -= Math.round(padding + border);
 816+ }
 817+
 818+ if ( jQuery(elem).is(":visible") )
 819+ getWH();
 820+ else
 821+ jQuery.swap( elem, props, getWH );
 822+
 823+ return Math.max(0, val);
 824+ }
 825+
 826+ return jQuery.curCSS( elem, name, force );
 827+ },
 828+
 829+ curCSS: function( elem, name, force ) {
 830+ var ret, style = elem.style;
 831+
 832+ // A helper method for determining if an element's values are broken
 833+ function color( elem ) {
 834+ if ( !jQuery.browser.safari )
 835+ return false;
 836+
 837+ // defaultView is cached
 838+ var ret = defaultView.getComputedStyle( elem, null );
 839+ return !ret || ret.getPropertyValue("color") == "";
 840+ }
 841+
 842+ // We need to handle opacity special in IE
 843+ if ( name == "opacity" && jQuery.browser.msie ) {
 844+ ret = jQuery.attr( style, "opacity" );
 845+
 846+ return ret == "" ?
 847+ "1" :
 848+ ret;
 849+ }
 850+ // Opera sometimes will give the wrong display answer, this fixes it, see #2037
 851+ if ( jQuery.browser.opera && name == "display" ) {
 852+ var save = style.outline;
 853+ style.outline = "0 solid black";
 854+ style.outline = save;
 855+ }
 856+
 857+ // Make sure we're using the right name for getting the float value
 858+ if ( name.match( /float/i ) )
 859+ name = styleFloat;
 860+
 861+ if ( !force && style && style[ name ] )
 862+ ret = style[ name ];
 863+
 864+ else if ( defaultView.getComputedStyle ) {
 865+
 866+ // Only "float" is needed here
 867+ if ( name.match( /float/i ) )
 868+ name = "float";
 869+
 870+ name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();
 871+
 872+ var computedStyle = defaultView.getComputedStyle( elem, null );
 873+
 874+ if ( computedStyle && !color( elem ) )
 875+ ret = computedStyle.getPropertyValue( name );
 876+
 877+ // If the element isn't reporting its values properly in Safari
 878+ // then some display: none elements are involved
 879+ else {
 880+ var swap = [], stack = [], a = elem, i = 0;
 881+
 882+ // Locate all of the parent display: none elements
 883+ for ( ; a && color(a); a = a.parentNode )
 884+ stack.unshift(a);
 885+
 886+ // Go through and make them visible, but in reverse
 887+ // (It would be better if we knew the exact display type that they had)
 888+ for ( ; i < stack.length; i++ )
 889+ if ( color( stack[ i ] ) ) {
 890+ swap[ i ] = stack[ i ].style.display;
 891+ stack[ i ].style.display = "block";
 892+ }
 893+
 894+ // Since we flip the display style, we have to handle that
 895+ // one special, otherwise get the value
 896+ ret = name == "display" && swap[ stack.length - 1 ] != null ?
 897+ "none" :
 898+ ( computedStyle && computedStyle.getPropertyValue( name ) ) || "";
 899+
 900+ // Finally, revert the display styles back
 901+ for ( i = 0; i < swap.length; i++ )
 902+ if ( swap[ i ] != null )
 903+ stack[ i ].style.display = swap[ i ];
 904+ }
 905+
 906+ // We should always get a number back from opacity
 907+ if ( name == "opacity" && ret == "" )
 908+ ret = "1";
 909+
 910+ } else if ( elem.currentStyle ) {
 911+ var camelCase = name.replace(/\-(\w)/g, function(all, letter){
 912+ return letter.toUpperCase();
 913+ });
 914+
 915+ ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
 916+
 917+ // From the awesome hack by Dean Edwards
 918+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 919+
 920+ // If we're not dealing with a regular pixel number
 921+ // but a number that has a weird ending, we need to convert it to pixels
 922+ if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {
 923+ // Remember the original values
 924+ var left = style.left, rsLeft = elem.runtimeStyle.left;
 925+
 926+ // Put in the new values to get a computed value out
 927+ elem.runtimeStyle.left = elem.currentStyle.left;
 928+ style.left = ret || 0;
 929+ ret = style.pixelLeft + "px";
 930+
 931+ // Revert the changed values
 932+ style.left = left;
 933+ elem.runtimeStyle.left = rsLeft;
 934+ }
 935+ }
 936+
 937+ return ret;
 938+ },
 939+
 940+ clean: function( elems, context ) {
 941+ var ret = [];
 942+ context = context || document;
 943+ // !context.createElement fails in IE with an error but returns typeof 'object'
 944+ if (typeof context.createElement == 'undefined')
 945+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
 946+
 947+ jQuery.each(elems, function(i, elem){
 948+ if ( !elem )
 949+ return;
 950+
 951+ if ( elem.constructor == Number )
 952+ elem += '';
 953+
 954+ // Convert html string into DOM nodes
 955+ if ( typeof elem == "string" ) {
 956+ // Fix "XHTML"-style tags in all browsers
 957+ elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){
 958+ return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?
 959+ all :
 960+ front + "></" + tag + ">";
 961+ });
 962+
 963+ // Trim whitespace, otherwise indexOf won't work as expected
 964+ var tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");
 965+
 966+ var wrap =
 967+ // option or optgroup
 968+ !tags.indexOf("<opt") &&
 969+ [ 1, "<select multiple='multiple'>", "</select>" ] ||
 970+
 971+ !tags.indexOf("<leg") &&
 972+ [ 1, "<fieldset>", "</fieldset>" ] ||
 973+
 974+ tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&
 975+ [ 1, "<table>", "</table>" ] ||
 976+
 977+ !tags.indexOf("<tr") &&
 978+ [ 2, "<table><tbody>", "</tbody></table>" ] ||
 979+
 980+ // <thead> matched above
 981+ (!tags.indexOf("<td") || !tags.indexOf("<th")) &&
 982+ [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||
 983+
 984+ !tags.indexOf("<col") &&
 985+ [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||
 986+
 987+ // IE can't serialize <link> and <script> tags normally
 988+ jQuery.browser.msie &&
 989+ [ 1, "div<div>", "</div>" ] ||
 990+
 991+ [ 0, "", "" ];
 992+
 993+ // Go to html and back, then peel off extra wrappers
 994+ div.innerHTML = wrap[1] + elem + wrap[2];
 995+
 996+ // Move to the right depth
 997+ while ( wrap[0]-- )
 998+ div = div.lastChild;
 999+
 1000+ // Remove IE's autoinserted <tbody> from table fragments
 1001+ if ( jQuery.browser.msie ) {
 1002+
 1003+ // String was a <table>, *may* have spurious <tbody>
 1004+ var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?
 1005+ div.firstChild && div.firstChild.childNodes :
 1006+
 1007+ // String was a bare <thead> or <tfoot>
 1008+ wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?
 1009+ div.childNodes :
 1010+ [];
 1011+
 1012+ for ( var j = tbody.length - 1; j >= 0 ; --j )
 1013+ if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )
 1014+ tbody[ j ].parentNode.removeChild( tbody[ j ] );
 1015+
 1016+ // IE completely kills leading whitespace when innerHTML is used
 1017+ if ( /^\s/.test( elem ) )
 1018+ div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );
 1019+
 1020+ }
 1021+
 1022+ elem = jQuery.makeArray( div.childNodes );
 1023+ }
 1024+
 1025+ if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )
 1026+ return;
 1027+
 1028+ if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )
 1029+ ret.push( elem );
 1030+
 1031+ else
 1032+ ret = jQuery.merge( ret, elem );
 1033+
 1034+ });
 1035+
 1036+ return ret;
 1037+ },
 1038+
 1039+ attr: function( elem, name, value ) {
 1040+ // don't set attributes on text and comment nodes
 1041+ if (!elem || elem.nodeType == 3 || elem.nodeType == 8)
 1042+ return undefined;
 1043+
 1044+ var notxml = !jQuery.isXMLDoc( elem ),
 1045+ // Whether we are setting (or getting)
 1046+ set = value !== undefined,
 1047+ msie = jQuery.browser.msie;
 1048+
 1049+ // Try to normalize/fix the name
 1050+ name = notxml && jQuery.props[ name ] || name;
 1051+
 1052+ // Only do all the following if this is a node (faster for style)
 1053+ // IE elem.getAttribute passes even for style
 1054+ if ( elem.tagName ) {
 1055+
 1056+ // These attributes require special treatment
 1057+ var special = /href|src|style/.test( name );
 1058+
 1059+ // Safari mis-reports the default selected property of a hidden option
 1060+ // Accessing the parent's selectedIndex property fixes it
 1061+ if ( name == "selected" && jQuery.browser.safari )
 1062+ elem.parentNode.selectedIndex;
 1063+
 1064+ // If applicable, access the attribute via the DOM 0 way
 1065+ if ( name in elem && notxml && !special ) {
 1066+ if ( set ){
 1067+ // We can't allow the type property to be changed (since it causes problems in IE)
 1068+ if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )
 1069+ throw "type property can't be changed";
 1070+
 1071+ elem[ name ] = value;
 1072+ }
 1073+
 1074+ // browsers index elements by id/name on forms, give priority to attributes.
 1075+ if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) )
 1076+ return elem.getAttributeNode( name ).nodeValue;
 1077+
 1078+ return elem[ name ];
 1079+ }
 1080+
 1081+ if ( msie && notxml && name == "style" )
 1082+ return jQuery.attr( elem.style, "cssText", value );
 1083+
 1084+ if ( set )
 1085+ // convert the value to a string (all browsers do this but IE) see #1070
 1086+ elem.setAttribute( name, "" + value );
 1087+
 1088+ var attr = msie && notxml && special
 1089+ // Some attributes require a special call on IE
 1090+ ? elem.getAttribute( name, 2 )
 1091+ : elem.getAttribute( name );
 1092+
 1093+ // Non-existent attributes return null, we normalize to undefined
 1094+ return attr === null ? undefined : attr;
 1095+ }
 1096+
 1097+ // elem is actually elem.style ... set the style
 1098+
 1099+ // IE uses filters for opacity
 1100+ if ( msie && name == "opacity" ) {
 1101+ if ( set ) {
 1102+ // IE has trouble with opacity if it does not have layout
 1103+ // Force it by setting the zoom level
 1104+ elem.zoom = 1;
 1105+
 1106+ // Set the alpha filter to set the opacity
 1107+ elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +
 1108+ (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");
 1109+ }
 1110+
 1111+ return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?
 1112+ (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '':
 1113+ "";
 1114+ }
 1115+
 1116+ name = name.replace(/-([a-z])/ig, function(all, letter){
 1117+ return letter.toUpperCase();
 1118+ });
 1119+
 1120+ if ( set )
 1121+ elem[ name ] = value;
 1122+
 1123+ return elem[ name ];
 1124+ },
 1125+
 1126+ trim: function( text ) {
 1127+ return (text || "").replace( /^\s+|\s+$/g, "" );
 1128+ },
 1129+
 1130+ makeArray: function( array ) {
 1131+ var ret = [];
 1132+
 1133+ if( array != null ){
 1134+ var i = array.length;
 1135+ //the window, strings and functions also have 'length'
 1136+ if( i == null || array.split || array.setInterval || array.call )
 1137+ ret[0] = array;
 1138+ else
 1139+ while( i )
 1140+ ret[--i] = array[i];
 1141+ }
 1142+
 1143+ return ret;
 1144+ },
 1145+
 1146+ inArray: function( elem, array ) {
 1147+ for ( var i = 0, length = array.length; i < length; i++ )
 1148+ // Use === because on IE, window == document
 1149+ if ( array[ i ] === elem )
 1150+ return i;
 1151+
 1152+ return -1;
 1153+ },
 1154+
 1155+ merge: function( first, second ) {
 1156+ // We have to loop this way because IE & Opera overwrite the length
 1157+ // expando of getElementsByTagName
 1158+ var i = 0, elem, pos = first.length;
 1159+ // Also, we need to make sure that the correct elements are being returned
 1160+ // (IE returns comment nodes in a '*' query)
 1161+ if ( jQuery.browser.msie ) {
 1162+ while ( elem = second[ i++ ] )
 1163+ if ( elem.nodeType != 8 )
 1164+ first[ pos++ ] = elem;
 1165+
 1166+ } else
 1167+ while ( elem = second[ i++ ] )
 1168+ first[ pos++ ] = elem;
 1169+
 1170+ return first;
 1171+ },
 1172+
 1173+ unique: function( array ) {
 1174+ var ret = [], done = {};
 1175+
 1176+ try {
 1177+
 1178+ for ( var i = 0, length = array.length; i < length; i++ ) {
 1179+ var id = jQuery.data( array[ i ] );
 1180+
 1181+ if ( !done[ id ] ) {
 1182+ done[ id ] = true;
 1183+ ret.push( array[ i ] );
 1184+ }
 1185+ }
 1186+
 1187+ } catch( e ) {
 1188+ ret = array;
 1189+ }
 1190+
 1191+ return ret;
 1192+ },
 1193+
 1194+ grep: function( elems, callback, inv ) {
 1195+ var ret = [];
 1196+
 1197+ // Go through the array, only saving the items
 1198+ // that pass the validator function
 1199+ for ( var i = 0, length = elems.length; i < length; i++ )
 1200+ if ( !inv != !callback( elems[ i ], i ) )
 1201+ ret.push( elems[ i ] );
 1202+
 1203+ return ret;
 1204+ },
 1205+
 1206+ map: function( elems, callback ) {
 1207+ var ret = [];
 1208+
 1209+ // Go through the array, translating each of the items to their
 1210+ // new value (or values).
 1211+ for ( var i = 0, length = elems.length; i < length; i++ ) {
 1212+ var value = callback( elems[ i ], i );
 1213+
 1214+ if ( value != null )
 1215+ ret[ ret.length ] = value;
 1216+ }
 1217+
 1218+ return ret.concat.apply( [], ret );
 1219+ }
 1220+});
 1221+
 1222+var userAgent = navigator.userAgent.toLowerCase();
 1223+
 1224+// Figure out what browser is being used
 1225+jQuery.browser = {
 1226+ version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],
 1227+ safari: /webkit/.test( userAgent ),
 1228+ opera: /opera/.test( userAgent ),
 1229+ msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),
 1230+ mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )
 1231+};
 1232+
 1233+var styleFloat = jQuery.browser.msie ?
 1234+ "styleFloat" :
 1235+ "cssFloat";
 1236+
 1237+jQuery.extend({
 1238+ // Check to see if the W3C box model is being used
 1239+ boxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",
 1240+
 1241+ props: {
 1242+ "for": "htmlFor",
 1243+ "class": "className",
 1244+ "float": styleFloat,
 1245+ cssFloat: styleFloat,
 1246+ styleFloat: styleFloat,
 1247+ readonly: "readOnly",
 1248+ maxlength: "maxLength",
 1249+ cellspacing: "cellSpacing"
 1250+ }
 1251+});
 1252+
 1253+jQuery.each({
 1254+ parent: function(elem){return elem.parentNode;},
 1255+ parents: function(elem){return jQuery.dir(elem,"parentNode");},
 1256+ next: function(elem){return jQuery.nth(elem,2,"nextSibling");},
 1257+ prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},
 1258+ nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},
 1259+ prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},
 1260+ siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},
 1261+ children: function(elem){return jQuery.sibling(elem.firstChild);},
 1262+ contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}
 1263+}, function(name, fn){
 1264+ jQuery.fn[ name ] = function( selector ) {
 1265+ var ret = jQuery.map( this, fn );
 1266+
 1267+ if ( selector && typeof selector == "string" )
 1268+ ret = jQuery.multiFilter( selector, ret );
 1269+
 1270+ return this.pushStack( jQuery.unique( ret ) );
 1271+ };
 1272+});
 1273+
 1274+jQuery.each({
 1275+ appendTo: "append",
 1276+ prependTo: "prepend",
 1277+ insertBefore: "before",
 1278+ insertAfter: "after",
 1279+ replaceAll: "replaceWith"
 1280+}, function(name, original){
 1281+ jQuery.fn[ name ] = function() {
 1282+ var args = arguments;
 1283+
 1284+ return this.each(function(){
 1285+ for ( var i = 0, length = args.length; i < length; i++ )
 1286+ jQuery( args[ i ] )[ original ]( this );
 1287+ });
 1288+ };
 1289+});
 1290+
 1291+jQuery.each({
 1292+ removeAttr: function( name ) {
 1293+ jQuery.attr( this, name, "" );
 1294+ if (this.nodeType == 1)
 1295+ this.removeAttribute( name );
 1296+ },
 1297+
 1298+ addClass: function( classNames ) {
 1299+ jQuery.className.add( this, classNames );
 1300+ },
 1301+
 1302+ removeClass: function( classNames ) {
 1303+ jQuery.className.remove( this, classNames );
 1304+ },
 1305+
 1306+ toggleClass: function( classNames ) {
 1307+ jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );
 1308+ },
 1309+
 1310+ remove: function( selector ) {
 1311+ if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {
 1312+ // Prevent memory leaks
 1313+ jQuery( "*", this ).add(this).each(function(){
 1314+ jQuery.event.remove(this);
 1315+ jQuery.removeData(this);
 1316+ });
 1317+ if (this.parentNode)
 1318+ this.parentNode.removeChild( this );
 1319+ }
 1320+ },
 1321+
 1322+ empty: function() {
 1323+ // Remove element nodes and prevent memory leaks
 1324+ jQuery( ">*", this ).remove();
 1325+
 1326+ // Remove any remaining nodes
 1327+ while ( this.firstChild )
 1328+ this.removeChild( this.firstChild );
 1329+ }
 1330+}, function(name, fn){
 1331+ jQuery.fn[ name ] = function(){
 1332+ return this.each( fn, arguments );
 1333+ };
 1334+});
 1335+
 1336+jQuery.each([ "Height", "Width" ], function(i, name){
 1337+ var type = name.toLowerCase();
 1338+
 1339+ jQuery.fn[ type ] = function( size ) {
 1340+ // Get window width or height
 1341+ return this[0] == window ?
 1342+ // Opera reports document.body.client[Width/Height] properly in both quirks and standards
 1343+ jQuery.browser.opera && document.body[ "client" + name ] ||
 1344+
 1345+ // Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)
 1346+ jQuery.browser.safari && window[ "inner" + name ] ||
 1347+
 1348+ // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
 1349+ document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :
 1350+
 1351+ // Get document width or height
 1352+ this[0] == document ?
 1353+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
 1354+ Math.max(
 1355+ Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),
 1356+ Math.max(document.body["offset" + name], document.documentElement["offset" + name])
 1357+ ) :
 1358+
 1359+ // Get or set width or height on the element
 1360+ size == undefined ?
 1361+ // Get width or height on the element
 1362+ (this.length ? jQuery.css( this[0], type ) : null) :
 1363+
 1364+ // Set the width or height on the element (default to pixels if value is unitless)
 1365+ this.css( type, size.constructor == String ? size : size + "px" );
 1366+ };
 1367+});
 1368+
 1369+// Helper function used by the dimensions and offset modules
 1370+function num(elem, prop) {
 1371+ return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0;
 1372+}var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?
 1373+ "(?:[\\w*_-]|\\\\.)" :
 1374+ "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",
 1375+ quickChild = new RegExp("^>\\s*(" + chars + "+)"),
 1376+ quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),
 1377+ quickClass = new RegExp("^([#.]?)(" + chars + "*)");
 1378+
 1379+jQuery.extend({
 1380+ expr: {
 1381+ "": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},
 1382+ "#": function(a,i,m){return a.getAttribute("id")==m[2];},
 1383+ ":": {
 1384+ // Position Checks
 1385+ lt: function(a,i,m){return i<m[3]-0;},
 1386+ gt: function(a,i,m){return i>m[3]-0;},
 1387+ nth: function(a,i,m){return m[3]-0==i;},
 1388+ eq: function(a,i,m){return m[3]-0==i;},
 1389+ first: function(a,i){return i==0;},
 1390+ last: function(a,i,m,r){return i==r.length-1;},
 1391+ even: function(a,i){return i%2==0;},
 1392+ odd: function(a,i){return i%2;},
 1393+
 1394+ // Child Checks
 1395+ "first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},
 1396+ "last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},
 1397+ "only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},
 1398+
 1399+ // Parent Checks
 1400+ parent: function(a){return a.firstChild;},
 1401+ empty: function(a){return !a.firstChild;},
 1402+
 1403+ // Text Check
 1404+ contains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},
 1405+
 1406+ // Visibility
 1407+ visible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},
 1408+ hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},
 1409+
 1410+ // Form attributes
 1411+ enabled: function(a){return !a.disabled;},
 1412+ disabled: function(a){return a.disabled;},
 1413+ checked: function(a){return a.checked;},
 1414+ selected: function(a){return a.selected||jQuery.attr(a,"selected");},
 1415+
 1416+ // Form elements
 1417+ text: function(a){return "text"==a.type;},
 1418+ radio: function(a){return "radio"==a.type;},
 1419+ checkbox: function(a){return "checkbox"==a.type;},
 1420+ file: function(a){return "file"==a.type;},
 1421+ password: function(a){return "password"==a.type;},
 1422+ submit: function(a){return "submit"==a.type;},
 1423+ image: function(a){return "image"==a.type;},
 1424+ reset: function(a){return "reset"==a.type;},
 1425+ button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},
 1426+ input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},
 1427+
 1428+ // :has()
 1429+ has: function(a,i,m){return jQuery.find(m[3],a).length;},
 1430+
 1431+ // :header
 1432+ header: function(a){return /h\d/i.test(a.nodeName);},
 1433+
 1434+ // :animated
 1435+ animated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}
 1436+ }
 1437+ },
 1438+
 1439+ // The regular expressions that power the parsing engine
 1440+ parse: [
 1441+ // Match: [@value='test'], [@foo]
 1442+ /^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,
 1443+
 1444+ // Match: :contains('foo')
 1445+ /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,
 1446+
 1447+ // Match: :even, :last-child, #id, .class
 1448+ new RegExp("^([:.#]*)(" + chars + "+)")
 1449+ ],
 1450+
 1451+ multiFilter: function( expr, elems, not ) {
 1452+ var old, cur = [];
 1453+
 1454+ while ( expr && expr != old ) {
 1455+ old = expr;
 1456+ var f = jQuery.filter( expr, elems, not );
 1457+ expr = f.t.replace(/^\s*,\s*/, "" );
 1458+ cur = not ? elems = f.r : jQuery.merge( cur, f.r );
 1459+ }
 1460+
 1461+ return cur;
 1462+ },
 1463+
 1464+ find: function( t, context ) {
 1465+ // Quickly handle non-string expressions
 1466+ if ( typeof t != "string" )
 1467+ return [ t ];
 1468+
 1469+ // check to make sure context is a DOM element or a document
 1470+ if ( context && context.nodeType != 1 && context.nodeType != 9)
 1471+ return [ ];
 1472+
 1473+ // Set the correct context (if none is provided)
 1474+ context = context || document;
 1475+
 1476+ // Initialize the search
 1477+ var ret = [context], done = [], last, nodeName;
 1478+
 1479+ // Continue while a selector expression exists, and while
 1480+ // we're no longer looping upon ourselves
 1481+ while ( t && last != t ) {
 1482+ var r = [];
 1483+ last = t;
 1484+
 1485+ t = jQuery.trim(t);
 1486+
 1487+ var foundToken = false,
 1488+
 1489+ // An attempt at speeding up child selectors that
 1490+ // point to a specific element tag
 1491+ re = quickChild,
 1492+
 1493+ m = re.exec(t);
 1494+
 1495+ if ( m ) {
 1496+ nodeName = m[1].toUpperCase();
 1497+
 1498+ // Perform our own iteration and filter
 1499+ for ( var i = 0; ret[i]; i++ )
 1500+ for ( var c = ret[i].firstChild; c; c = c.nextSibling )
 1501+ if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )
 1502+ r.push( c );
 1503+
 1504+ ret = r;
 1505+ t = t.replace( re, "" );
 1506+ if ( t.indexOf(" ") == 0 ) continue;
 1507+ foundToken = true;
 1508+ } else {
 1509+ re = /^([>+~])\s*(\w*)/i;
 1510+
 1511+ if ( (m = re.exec(t)) != null ) {
 1512+ r = [];
 1513+
 1514+ var merge = {};
 1515+ nodeName = m[2].toUpperCase();
 1516+ m = m[1];
 1517+
 1518+ for ( var j = 0, rl = ret.length; j < rl; j++ ) {
 1519+ var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;
 1520+ for ( ; n; n = n.nextSibling )
 1521+ if ( n.nodeType == 1 ) {
 1522+ var id = jQuery.data(n);
 1523+
 1524+ if ( m == "~" && merge[id] ) break;
 1525+
 1526+ if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {
 1527+ if ( m == "~" ) merge[id] = true;
 1528+ r.push( n );
 1529+ }
 1530+
 1531+ if ( m == "+" ) break;
 1532+ }
 1533+ }
 1534+
 1535+ ret = r;
 1536+
 1537+ // And remove the token
 1538+ t = jQuery.trim( t.replace( re, "" ) );
 1539+ foundToken = true;
 1540+ }
 1541+ }
 1542+
 1543+ // See if there's still an expression, and that we haven't already
 1544+ // matched a token
 1545+ if ( t && !foundToken ) {
 1546+ // Handle multiple expressions
 1547+ if ( !t.indexOf(",") ) {
 1548+ // Clean the result set
 1549+ if ( context == ret[0] ) ret.shift();
 1550+
 1551+ // Merge the result sets
 1552+ done = jQuery.merge( done, ret );
 1553+
 1554+ // Reset the context
 1555+ r = ret = [context];
 1556+
 1557+ // Touch up the selector string
 1558+ t = " " + t.substr(1,t.length);
 1559+
 1560+ } else {
 1561+ // Optimize for the case nodeName#idName
 1562+ var re2 = quickID;
 1563+ var m = re2.exec(t);
 1564+
 1565+ // Re-organize the results, so that they're consistent
 1566+ if ( m ) {
 1567+ m = [ 0, m[2], m[3], m[1] ];
 1568+
 1569+ } else {
 1570+ // Otherwise, do a traditional filter check for
 1571+ // ID, class, and element selectors
 1572+ re2 = quickClass;
 1573+ m = re2.exec(t);
 1574+ }
 1575+
 1576+ m[2] = m[2].replace(/\\/g, "");
 1577+
 1578+ var elem = ret[ret.length-1];
 1579+
 1580+ // Try to do a global search by ID, where we can
 1581+ if ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {
 1582+ // Optimization for HTML document case
 1583+ var oid = elem.getElementById(m[2]);
 1584+
 1585+ // Do a quick check for the existence of the actual ID attribute
 1586+ // to avoid selecting by the name attribute in IE
 1587+ // also check to insure id is a string to avoid selecting an element with the name of 'id' inside a form
 1588+ if ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )
 1589+ oid = jQuery('[@id="'+m[2]+'"]', elem)[0];
 1590+
 1591+ // Do a quick check for node name (where applicable) so
 1592+ // that div#foo searches will be really fast
 1593+ ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];
 1594+ } else {
 1595+ // We need to find all descendant elements
 1596+ for ( var i = 0; ret[i]; i++ ) {
 1597+ // Grab the tag name being searched for
 1598+ var tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];
 1599+
 1600+ // Handle IE7 being really dumb about <object>s
 1601+ if ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )
 1602+ tag = "param";
 1603+
 1604+ r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));
 1605+ }
 1606+
 1607+ // It's faster to filter by class and be done with it
 1608+ if ( m[1] == "." )
 1609+ r = jQuery.classFilter( r, m[2] );
 1610+
 1611+ // Same with ID filtering
 1612+ if ( m[1] == "#" ) {
 1613+ var tmp = [];
 1614+
 1615+ // Try to find the element with the ID
 1616+ for ( var i = 0; r[i]; i++ )
 1617+ if ( r[i].getAttribute("id") == m[2] ) {
 1618+ tmp = [ r[i] ];
 1619+ break;
 1620+ }
 1621+
 1622+ r = tmp;
 1623+ }
 1624+
 1625+ ret = r;
 1626+ }
 1627+
 1628+ t = t.replace( re2, "" );
 1629+ }
 1630+
 1631+ }
 1632+
 1633+ // If a selector string still exists
 1634+ if ( t ) {
 1635+ // Attempt to filter it
 1636+ var val = jQuery.filter(t,r);
 1637+ ret = r = val.r;
 1638+ t = jQuery.trim(val.t);
 1639+ }
 1640+ }
 1641+
 1642+ // An error occurred with the selector;
 1643+ // just return an empty set instead
 1644+ if ( t )
 1645+ ret = [];
 1646+
 1647+ // Remove the root context
 1648+ if ( ret && context == ret[0] )
 1649+ ret.shift();
 1650+
 1651+ // And combine the results
 1652+ done = jQuery.merge( done, ret );
 1653+
 1654+ return done;
 1655+ },
 1656+
 1657+ classFilter: function(r,m,not){
 1658+ m = " " + m + " ";
 1659+ var tmp = [];
 1660+ for ( var i = 0; r[i]; i++ ) {
 1661+ var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;
 1662+ if ( !not && pass || not && !pass )
 1663+ tmp.push( r[i] );
 1664+ }
 1665+ return tmp;
 1666+ },
 1667+
 1668+ filter: function(t,r,not) {
 1669+ var last;
 1670+
 1671+ // Look for common filter expressions
 1672+ while ( t && t != last ) {
 1673+ last = t;
 1674+
 1675+ var p = jQuery.parse, m;
 1676+
 1677+ for ( var i = 0; p[i]; i++ ) {
 1678+ m = p[i].exec( t );
 1679+
 1680+ if ( m ) {
 1681+ // Remove what we just matched
 1682+ t = t.substring( m[0].length );
 1683+
 1684+ m[2] = m[2].replace(/\\/g, "");
 1685+ break;
 1686+ }
 1687+ }
 1688+
 1689+ if ( !m )
 1690+ break;
 1691+
 1692+ // :not() is a special case that can be optimized by
 1693+ // keeping it out of the expression list
 1694+ if ( m[1] == ":" && m[2] == "not" )
 1695+ // optimize if only one selector found (most common case)
 1696+ r = isSimple.test( m[3] ) ?
 1697+ jQuery.filter(m[3], r, true).r :
 1698+ jQuery( r ).not( m[3] );
 1699+
 1700+ // We can get a big speed boost by filtering by class here
 1701+ else if ( m[1] == "." )
 1702+ r = jQuery.classFilter(r, m[2], not);
 1703+
 1704+ else if ( m[1] == "[" ) {
 1705+ var tmp = [], type = m[3];
 1706+
 1707+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
 1708+ var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];
 1709+
 1710+ if ( z == null || /href|src|selected/.test(m[2]) )
 1711+ z = jQuery.attr(a,m[2]) || '';
 1712+
 1713+ if ( (type == "" && !!z ||
 1714+ type == "=" && z == m[5] ||
 1715+ type == "!=" && z != m[5] ||
 1716+ type == "^=" && z && !z.indexOf(m[5]) ||
 1717+ type == "$=" && z.substr(z.length - m[5].length) == m[5] ||
 1718+ (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )
 1719+ tmp.push( a );
 1720+ }
 1721+
 1722+ r = tmp;
 1723+
 1724+ // We can get a speed boost by handling nth-child here
 1725+ } else if ( m[1] == ":" && m[2] == "nth-child" ) {
 1726+ var merge = {}, tmp = [],
 1727+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
 1728+ test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
 1729+ m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||
 1730+ !/\D/.test(m[3]) && "0n+" + m[3] || m[3]),
 1731+ // calculate the numbers (first)n+(last) including if they are negative
 1732+ first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
 1733+
 1734+ // loop through all the elements left in the jQuery object
 1735+ for ( var i = 0, rl = r.length; i < rl; i++ ) {
 1736+ var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);
 1737+
 1738+ if ( !merge[id] ) {
 1739+ var c = 1;
 1740+
 1741+ for ( var n = parentNode.firstChild; n; n = n.nextSibling )
 1742+ if ( n.nodeType == 1 )
 1743+ n.nodeIndex = c++;
 1744+
 1745+ merge[id] = true;
 1746+ }
 1747+
 1748+ var add = false;
 1749+
 1750+ if ( first == 0 ) {
 1751+ if ( node.nodeIndex == last )
 1752+ add = true;
 1753+ } else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )
 1754+ add = true;
 1755+
 1756+ if ( add ^ not )
 1757+ tmp.push( node );
 1758+ }
 1759+
 1760+ r = tmp;
 1761+
 1762+ // Otherwise, find the expression to execute
 1763+ } else {
 1764+ var fn = jQuery.expr[ m[1] ];
 1765+ if ( typeof fn == "object" )
 1766+ fn = fn[ m[2] ];
 1767+
 1768+ if ( typeof fn == "string" )
 1769+ fn = eval("false||function(a,i){return " + fn + ";}");
 1770+
 1771+ // Execute it against the current filter
 1772+ r = jQuery.grep( r, function(elem, i){
 1773+ return fn(elem, i, m, r);
 1774+ }, not );
 1775+ }
 1776+ }
 1777+
 1778+ // Return an array of filtered elements (r)
 1779+ // and the modified expression string (t)
 1780+ return { r: r, t: t };
 1781+ },
 1782+
 1783+ dir: function( elem, dir ){
 1784+ var matched = [],
 1785+ cur = elem[dir];
 1786+ while ( cur && cur != document ) {
 1787+ if ( cur.nodeType == 1 )
 1788+ matched.push( cur );
 1789+ cur = cur[dir];
 1790+ }
 1791+ return matched;
 1792+ },
 1793+
 1794+ nth: function(cur,result,dir,elem){
 1795+ result = result || 1;
 1796+ var num = 0;
 1797+
 1798+ for ( ; cur; cur = cur[dir] )
 1799+ if ( cur.nodeType == 1 && ++num == result )
 1800+ break;
 1801+
 1802+ return cur;
 1803+ },
 1804+
 1805+ sibling: function( n, elem ) {
 1806+ var r = [];
 1807+
 1808+ for ( ; n; n = n.nextSibling ) {
 1809+ if ( n.nodeType == 1 && n != elem )
 1810+ r.push( n );
 1811+ }
 1812+
 1813+ return r;
 1814+ }
 1815+});
 1816+/*
 1817+ * A number of helper functions used for managing events.
 1818+ * Many of the ideas behind this code orignated from
 1819+ * Dean Edwards' addEvent library.
 1820+ */
 1821+jQuery.event = {
 1822+
 1823+ // Bind an event to an element
 1824+ // Original by Dean Edwards
 1825+ add: function(elem, types, handler, data) {
 1826+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
 1827+ return;
 1828+
 1829+ // For whatever reason, IE has trouble passing the window object
 1830+ // around, causing it to be cloned in the process
 1831+ if ( jQuery.browser.msie && elem.setInterval )
 1832+ elem = window;
 1833+
 1834+ // Make sure that the function being executed has a unique ID
 1835+ if ( !handler.guid )
 1836+ handler.guid = this.guid++;
 1837+
 1838+ // if data is passed, bind to handler
 1839+ if( data != undefined ) {
 1840+ // Create temporary function pointer to original handler
 1841+ var fn = handler;
 1842+
 1843+ // Create unique handler function, wrapped around original handler
 1844+ handler = this.proxy( fn, function() {
 1845+ // Pass arguments and context to original handler
 1846+ return fn.apply(this, arguments);
 1847+ });
 1848+
 1849+ // Store data in unique handler
 1850+ handler.data = data;
 1851+ }
 1852+
 1853+ // Init the element's event structure
 1854+ var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),
 1855+ handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){
 1856+ // Handle the second event of a trigger and when
 1857+ // an event is called after a page has unloaded
 1858+ if ( typeof jQuery != "undefined" && !jQuery.event.triggered )
 1859+ return jQuery.event.handle.apply(arguments.callee.elem, arguments);
 1860+ });
 1861+ // Add elem as a property of the handle function
 1862+ // This is to prevent a memory leak with non-native
 1863+ // event in IE.
 1864+ handle.elem = elem;
 1865+
 1866+ // Handle multiple events separated by a space
 1867+ // jQuery(...).bind("mouseover mouseout", fn);
 1868+ jQuery.each(types.split(/\s+/), function(index, type) {
 1869+ // Namespaced event handlers
 1870+ var parts = type.split(".");
 1871+ type = parts[0];
 1872+ handler.type = parts[1];
 1873+
 1874+ // Get the current list of functions bound to this event
 1875+ var handlers = events[type];
 1876+
 1877+ // Init the event handler queue
 1878+ if (!handlers) {
 1879+ handlers = events[type] = {};
 1880+
 1881+ // Check for a special event handler
 1882+ // Only use addEventListener/attachEvent if the special
 1883+ // events handler returns false
 1884+ if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {
 1885+ // Bind the global event handler to the element
 1886+ if (elem.addEventListener)
 1887+ elem.addEventListener(type, handle, false);
 1888+ else if (elem.attachEvent)
 1889+ elem.attachEvent("on" + type, handle);
 1890+ }
 1891+ }
 1892+
 1893+ // Add the function to the element's handler list
 1894+ handlers[handler.guid] = handler;
 1895+
 1896+ // Keep track of which events have been used, for global triggering
 1897+ jQuery.event.global[type] = true;
 1898+ });
 1899+
 1900+ // Nullify elem to prevent memory leaks in IE
 1901+ elem = null;
 1902+ },
 1903+
 1904+ guid: 1,
 1905+ global: {},
 1906+
 1907+ // Detach an event or set of events from an element
 1908+ remove: function(elem, types, handler) {
 1909+ // don't do events on text and comment nodes
 1910+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
 1911+ return;
 1912+
 1913+ var events = jQuery.data(elem, "events"), ret, index;
 1914+
 1915+ if ( events ) {
 1916+ // Unbind all events for the element
 1917+ if ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )
 1918+ for ( var type in events )
 1919+ this.remove( elem, type + (types || "") );
 1920+ else {
 1921+ // types is actually an event object here
 1922+ if ( types.type ) {
 1923+ handler = types.handler;
 1924+ types = types.type;
 1925+ }
 1926+
 1927+ // Handle multiple events seperated by a space
 1928+ // jQuery(...).unbind("mouseover mouseout", fn);
 1929+ jQuery.each(types.split(/\s+/), function(index, type){
 1930+ // Namespaced event handlers
 1931+ var parts = type.split(".");
 1932+ type = parts[0];
 1933+
 1934+ if ( events[type] ) {
 1935+ // remove the given handler for the given type
 1936+ if ( handler )
 1937+ delete events[type][handler.guid];
 1938+
 1939+ // remove all handlers for the given type
 1940+ else
 1941+ for ( handler in events[type] )
 1942+ // Handle the removal of namespaced events
 1943+ if ( !parts[1] || events[type][handler].type == parts[1] )
 1944+ delete events[type][handler];
 1945+
 1946+ // remove generic event handler if no more handlers exist
 1947+ for ( ret in events[type] ) break;
 1948+ if ( !ret ) {
 1949+ if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {
 1950+ if (elem.removeEventListener)
 1951+ elem.removeEventListener(type, jQuery.data(elem, "handle"), false);
 1952+ else if (elem.detachEvent)
 1953+ elem.detachEvent("on" + type, jQuery.data(elem, "handle"));
 1954+ }
 1955+ ret = null;
 1956+ delete events[type];
 1957+ }
 1958+ }
 1959+ });
 1960+ }
 1961+
 1962+ // Remove the expando if it's no longer used
 1963+ for ( ret in events ) break;
 1964+ if ( !ret ) {
 1965+ var handle = jQuery.data( elem, "handle" );
 1966+ if ( handle ) handle.elem = null;
 1967+ jQuery.removeData( elem, "events" );
 1968+ jQuery.removeData( elem, "handle" );
 1969+ }
 1970+ }
 1971+ },
 1972+
 1973+ trigger: function(type, data, elem, donative, extra) {
 1974+ // Clone the incoming data, if any
 1975+ data = jQuery.makeArray(data);
 1976+
 1977+ if ( type.indexOf("!") >= 0 ) {
 1978+ type = type.slice(0, -1);
 1979+ var exclusive = true;
 1980+ }
 1981+
 1982+ // Handle a global trigger
 1983+ if ( !elem ) {
 1984+ // Only trigger if we've ever bound an event for it
 1985+ if ( this.global[type] )
 1986+ jQuery("*").add([window, document]).trigger(type, data);
 1987+
 1988+ // Handle triggering a single element
 1989+ } else {
 1990+ // don't do events on text and comment nodes
 1991+ if ( elem.nodeType == 3 || elem.nodeType == 8 )
 1992+ return undefined;
 1993+
 1994+ var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),
 1995+ // Check to see if we need to provide a fake event, or not
 1996+ event = !data[0] || !data[0].preventDefault;
 1997+
 1998+ // Pass along a fake event
 1999+ if ( event ) {
 2000+ data.unshift({
 2001+ type: type,
 2002+ target: elem,
 2003+ preventDefault: function(){},
 2004+ stopPropagation: function(){},
 2005+ timeStamp: now()
 2006+ });
 2007+ data[0][expando] = true; // no need to fix fake event
 2008+ }
 2009+
 2010+ // Enforce the right trigger type
 2011+ data[0].type = type;
 2012+ if ( exclusive )
 2013+ data[0].exclusive = true;
 2014+
 2015+ // Trigger the event, it is assumed that "handle" is a function
 2016+ var handle = jQuery.data(elem, "handle");
 2017+ if ( handle )
 2018+ val = handle.apply( elem, data );
 2019+
 2020+ // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links)
 2021+ if ( (!fn || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )
 2022+ val = false;
 2023+
 2024+ // Extra functions don't get the custom event object
 2025+ if ( event )
 2026+ data.shift();
 2027+
 2028+ // Handle triggering of extra function
 2029+ if ( extra && jQuery.isFunction( extra ) ) {
 2030+ // call the extra function and tack the current return value on the end for possible inspection
 2031+ ret = extra.apply( elem, val == null ? data : data.concat( val ) );
 2032+ // if anything is returned, give it precedence and have it overwrite the previous value
 2033+ if (ret !== undefined)
 2034+ val = ret;
 2035+ }
 2036+
 2037+ // Trigger the native events (except for clicks on links)
 2038+ if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {
 2039+ this.triggered = true;
 2040+ try {
 2041+ elem[ type ]();
 2042+ // prevent IE from throwing an error for some hidden elements
 2043+ } catch (e) {}
 2044+ }
 2045+
 2046+ this.triggered = false;
 2047+ }
 2048+
 2049+ return val;
 2050+ },
 2051+
 2052+ handle: function(event) {
 2053+ // returned undefined or false
 2054+ var val, ret, namespace, all, handlers;
 2055+
 2056+ event = arguments[0] = jQuery.event.fix( event || window.event );
 2057+
 2058+ // Namespaced event handlers
 2059+ namespace = event.type.split(".");
 2060+ event.type = namespace[0];
 2061+ namespace = namespace[1];
 2062+ // Cache this now, all = true means, any handler
 2063+ all = !namespace && !event.exclusive;
 2064+
 2065+ handlers = ( jQuery.data(this, "events") || {} )[event.type];
 2066+
 2067+ for ( var j in handlers ) {
 2068+ var handler = handlers[j];
 2069+
 2070+ // Filter the functions by class
 2071+ if ( all || handler.type == namespace ) {
 2072+ // Pass in a reference to the handler function itself
 2073+ // So that we can later remove it
 2074+ event.handler = handler;
 2075+ event.data = handler.data;
 2076+
 2077+ ret = handler.apply( this, arguments );
 2078+
 2079+ if ( val !== false )
 2080+ val = ret;
 2081+
 2082+ if ( ret === false ) {
 2083+ event.preventDefault();
 2084+ event.stopPropagation();
 2085+ }
 2086+ }
 2087+ }
 2088+
 2089+ return val;
 2090+ },
 2091+
 2092+ fix: function(event) {
 2093+ if ( event[expando] == true )
 2094+ return event;
 2095+
 2096+ // store a copy of the original event object
 2097+ // and "clone" to set read-only properties
 2098+ var originalEvent = event;
 2099+ event = { originalEvent: originalEvent };
 2100+ var props = "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");
 2101+ for ( var i=props.length; i; i-- )
 2102+ event[ props[i] ] = originalEvent[ props[i] ];
 2103+
 2104+ // Mark it as fixed
 2105+ event[expando] = true;
 2106+
 2107+ // add preventDefault and stopPropagation since
 2108+ // they will not work on the clone
 2109+ event.preventDefault = function() {
 2110+ // if preventDefault exists run it on the original event
 2111+ if (originalEvent.preventDefault)
 2112+ originalEvent.preventDefault();
 2113+ // otherwise set the returnValue property of the original event to false (IE)
 2114+ originalEvent.returnValue = false;
 2115+ };
 2116+ event.stopPropagation = function() {
 2117+ // if stopPropagation exists run it on the original event
 2118+ if (originalEvent.stopPropagation)
 2119+ originalEvent.stopPropagation();
 2120+ // otherwise set the cancelBubble property of the original event to true (IE)
 2121+ originalEvent.cancelBubble = true;
 2122+ };
 2123+
 2124+ // Fix timeStamp
 2125+ event.timeStamp = event.timeStamp || now();
 2126+
 2127+ // Fix target property, if necessary
 2128+ if ( !event.target )
 2129+ event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
 2130+
 2131+ // check if target is a textnode (safari)
 2132+ if ( event.target.nodeType == 3 )
 2133+ event.target = event.target.parentNode;
 2134+
 2135+ // Add relatedTarget, if necessary
 2136+ if ( !event.relatedTarget && event.fromElement )
 2137+ event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;
 2138+
 2139+ // Calculate pageX/Y if missing and clientX/Y available
 2140+ if ( event.pageX == null && event.clientX != null ) {
 2141+ var doc = document.documentElement, body = document.body;
 2142+ event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);
 2143+ event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);
 2144+ }
 2145+
 2146+ // Add which for key events
 2147+ if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )
 2148+ event.which = event.charCode || event.keyCode;
 2149+
 2150+ // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
 2151+ if ( !event.metaKey && event.ctrlKey )
 2152+ event.metaKey = event.ctrlKey;
 2153+
 2154+ // Add which for click: 1 == left; 2 == middle; 3 == right
 2155+ // Note: button is not normalized, so don't use it
 2156+ if ( !event.which && event.button )
 2157+ event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
 2158+
 2159+ return event;
 2160+ },
 2161+
 2162+ proxy: function( fn, proxy ){
 2163+ // Set the guid of unique handler to the same of original handler, so it can be removed
 2164+ proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++;
 2165+ // So proxy can be declared as an argument
 2166+ return proxy;
 2167+ },
 2168+
 2169+ special: {
 2170+ ready: {
 2171+ setup: function() {
 2172+ // Make sure the ready event is setup
 2173+ bindReady();
 2174+ return;
 2175+ },
 2176+
 2177+ teardown: function() { return; }
 2178+ },
 2179+
 2180+ mouseenter: {
 2181+ setup: function() {
 2182+ if ( jQuery.browser.msie ) return false;
 2183+ jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);
 2184+ return true;
 2185+ },
 2186+
 2187+ teardown: function() {
 2188+ if ( jQuery.browser.msie ) return false;
 2189+ jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);
 2190+ return true;
 2191+ },
 2192+
 2193+ handler: function(event) {
 2194+ // If we actually just moused on to a sub-element, ignore it
 2195+ if ( withinElement(event, this) ) return true;
 2196+ // Execute the right handlers by setting the event type to mouseenter
 2197+ event.type = "mouseenter";
 2198+ return jQuery.event.handle.apply(this, arguments);
 2199+ }
 2200+ },
 2201+
 2202+ mouseleave: {
 2203+ setup: function() {
 2204+ if ( jQuery.browser.msie ) return false;
 2205+ jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);
 2206+ return true;
 2207+ },
 2208+
 2209+ teardown: function() {
 2210+ if ( jQuery.browser.msie ) return false;
 2211+ jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);
 2212+ return true;
 2213+ },
 2214+
 2215+ handler: function(event) {
 2216+ // If we actually just moused on to a sub-element, ignore it
 2217+ if ( withinElement(event, this) ) return true;
 2218+ // Execute the right handlers by setting the event type to mouseleave
 2219+ event.type = "mouseleave";
 2220+ return jQuery.event.handle.apply(this, arguments);
 2221+ }
 2222+ }
 2223+ }
 2224+};
 2225+
 2226+jQuery.fn.extend({
 2227+ bind: function( type, data, fn ) {
 2228+ return type == "unload" ? this.one(type, data, fn) : this.each(function(){
 2229+ jQuery.event.add( this, type, fn || data, fn && data );
 2230+ });
 2231+ },
 2232+
 2233+ one: function( type, data, fn ) {
 2234+ var one = jQuery.event.proxy( fn || data, function(event) {
 2235+ jQuery(this).unbind(event, one);
 2236+ return (fn || data).apply( this, arguments );
 2237+ });
 2238+ return this.each(function(){
 2239+ jQuery.event.add( this, type, one, fn && data);
 2240+ });
 2241+ },
 2242+
 2243+ unbind: function( type, fn ) {
 2244+ return this.each(function(){
 2245+ jQuery.event.remove( this, type, fn );
 2246+ });
 2247+ },
 2248+
 2249+ trigger: function( type, data, fn ) {
 2250+ return this.each(function(){
 2251+ jQuery.event.trigger( type, data, this, true, fn );
 2252+ });
 2253+ },
 2254+
 2255+ triggerHandler: function( type, data, fn ) {
 2256+ return this[0] && jQuery.event.trigger( type, data, this[0], false, fn );
 2257+ },
 2258+
 2259+ toggle: function( fn ) {
 2260+ // Save reference to arguments for access in closure
 2261+ var args = arguments, i = 1;
 2262+
 2263+ // link all the functions, so any of them can unbind this click handler
 2264+ while( i < args.length )
 2265+ jQuery.event.proxy( fn, args[i++] );
 2266+
 2267+ return this.click( jQuery.event.proxy( fn, function(event) {
 2268+ // Figure out which function to execute
 2269+ this.lastToggle = ( this.lastToggle || 0 ) % i;
 2270+
 2271+ // Make sure that clicks stop
 2272+ event.preventDefault();
 2273+
 2274+ // and execute the function
 2275+ return args[ this.lastToggle++ ].apply( this, arguments ) || false;
 2276+ }));
 2277+ },
 2278+
 2279+ hover: function(fnOver, fnOut) {
 2280+ return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);
 2281+ },
 2282+
 2283+ ready: function(fn) {
 2284+ // Attach the listeners
 2285+ bindReady();
 2286+
 2287+ // If the DOM is already ready
 2288+ if ( jQuery.isReady )
 2289+ // Execute the function immediately
 2290+ fn.call( document, jQuery );
 2291+
 2292+ // Otherwise, remember the function for later
 2293+ else
 2294+ // Add the function to the wait list
 2295+ jQuery.readyList.push( function() { return fn.call(this, jQuery); } );
 2296+
 2297+ return this;
 2298+ }
 2299+});
 2300+
 2301+jQuery.extend({
 2302+ isReady: false,
 2303+ readyList: [],
 2304+ // Handle when the DOM is ready
 2305+ ready: function() {
 2306+ // Make sure that the DOM is not already loaded
 2307+ if ( !jQuery.isReady ) {
 2308+ // Remember that the DOM is ready
 2309+ jQuery.isReady = true;
 2310+
 2311+ // If there are functions bound, to execute
 2312+ if ( jQuery.readyList ) {
 2313+ // Execute all of them
 2314+ jQuery.each( jQuery.readyList, function(){
 2315+ this.call( document );
 2316+ });
 2317+
 2318+ // Reset the list of functions
 2319+ jQuery.readyList = null;
 2320+ }
 2321+
 2322+ // Trigger any bound ready events
 2323+ jQuery(document).triggerHandler("ready");
 2324+ }
 2325+ }
 2326+});
 2327+
 2328+var readyBound = false;
 2329+
 2330+function bindReady(){
 2331+ if ( readyBound ) return;
 2332+ readyBound = true;
 2333+
 2334+ // Mozilla, Opera (see further below for it) and webkit nightlies currently support this event
 2335+ if ( document.addEventListener && !jQuery.browser.opera)
 2336+ // Use the handy event callback
 2337+ document.addEventListener( "DOMContentLoaded", jQuery.ready, false );
 2338+
 2339+ // If IE is used and is not in a frame
 2340+ // Continually check to see if the document is ready
 2341+ if ( jQuery.browser.msie && window == top ) (function(){
 2342+ if (jQuery.isReady) return;
 2343+ try {
 2344+ // If IE is used, use the trick by Diego Perini
 2345+ // http://javascript.nwbox.com/IEContentLoaded/
 2346+ document.documentElement.doScroll("left");
 2347+ } catch( error ) {
 2348+ setTimeout( arguments.callee, 0 );
 2349+ return;
 2350+ }
 2351+ // and execute any waiting functions
 2352+ jQuery.ready();
 2353+ })();
 2354+
 2355+ if ( jQuery.browser.opera )
 2356+ document.addEventListener( "DOMContentLoaded", function () {
 2357+ if (jQuery.isReady) return;
 2358+ for (var i = 0; i < document.styleSheets.length; i++)
 2359+ if (document.styleSheets[i].disabled) {
 2360+ setTimeout( arguments.callee, 0 );
 2361+ return;
 2362+ }
 2363+ // and execute any waiting functions
 2364+ jQuery.ready();
 2365+ }, false);
 2366+
 2367+ if ( jQuery.browser.safari ) {
 2368+ var numStyles;
 2369+ (function(){
 2370+ if (jQuery.isReady) return;
 2371+ if ( document.readyState != "loaded" && document.readyState != "complete" ) {
 2372+ setTimeout( arguments.callee, 0 );
 2373+ return;
 2374+ }
 2375+ if ( numStyles === undefined )
 2376+ numStyles = jQuery("style, link[rel=stylesheet]").length;
 2377+ if ( document.styleSheets.length != numStyles ) {
 2378+ setTimeout( arguments.callee, 0 );
 2379+ return;
 2380+ }
 2381+ // and execute any waiting functions
 2382+ jQuery.ready();
 2383+ })();
 2384+ }
 2385+
 2386+ // A fallback to window.onload, that will always work
 2387+ jQuery.event.add( window, "load", jQuery.ready );
 2388+}
 2389+
 2390+jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +
 2391+ "mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +
 2392+ "submit,keydown,keypress,keyup,error").split(","), function(i, name){
 2393+
 2394+ // Handle event binding
 2395+ jQuery.fn[name] = function(fn){
 2396+ return fn ? this.bind(name, fn) : this.trigger(name);
 2397+ };
 2398+});
 2399+
 2400+// Checks if an event happened on an element within another element
 2401+// Used in jQuery.event.special.mouseenter and mouseleave handlers
 2402+var withinElement = function(event, elem) {
 2403+ // Check if mouse(over|out) are still within the same parent element
 2404+ var parent = event.relatedTarget;
 2405+ // Traverse up the tree
 2406+ while ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }
 2407+ // Return true if we actually just moused on to a sub-element
 2408+ return parent == elem;
 2409+};
 2410+
 2411+// Prevent memory leaks in IE
 2412+// And prevent errors on refresh with events like mouseover in other browsers
 2413+// Window isn't included so as not to unbind existing unload events
 2414+jQuery(window).bind("unload", function() {
 2415+ jQuery("*").add(document).unbind();
 2416+});
 2417+jQuery.fn.extend({
 2418+ // Keep a copy of the old load
 2419+ _load: jQuery.fn.load,
 2420+
 2421+ load: function( url, params, callback ) {
 2422+ if ( typeof url != 'string' )
 2423+ return this._load( url );
 2424+
 2425+ var off = url.indexOf(" ");
 2426+ if ( off >= 0 ) {
 2427+ var selector = url.slice(off, url.length);
 2428+ url = url.slice(0, off);
 2429+ }
 2430+
 2431+ callback = callback || function(){};
 2432+
 2433+ // Default to a GET request
 2434+ var type = "GET";
 2435+
 2436+ // If the second parameter was provided
 2437+ if ( params )
 2438+ // If it's a function
 2439+ if ( jQuery.isFunction( params ) ) {
 2440+ // We assume that it's the callback
 2441+ callback = params;
 2442+ params = null;
 2443+
 2444+ // Otherwise, build a param string
 2445+ } else {
 2446+ params = jQuery.param( params );
 2447+ type = "POST";
 2448+ }
 2449+
 2450+ var self = this;
 2451+
 2452+ // Request the remote document
 2453+ jQuery.ajax({
 2454+ url: url,
 2455+ type: type,
 2456+ dataType: "html",
 2457+ data: params,
 2458+ complete: function(res, status){
 2459+ // If successful, inject the HTML into all the matched elements
 2460+ if ( status == "success" || status == "notmodified" )
 2461+ // See if a selector was specified
 2462+ self.html( selector ?
 2463+ // Create a dummy div to hold the results
 2464+ jQuery("<div/>")
 2465+ // inject the contents of the document in, removing the scripts
 2466+ // to avoid any 'Permission Denied' errors in IE
 2467+ .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))
 2468+
 2469+ // Locate the specified elements
 2470+ .find(selector) :
 2471+
 2472+ // If not, just inject the full result
 2473+ res.responseText );
 2474+
 2475+ self.each( callback, [res.responseText, status, res] );
 2476+ }
 2477+ });
 2478+ return this;
 2479+ },
 2480+
 2481+ serialize: function() {
 2482+ return jQuery.param(this.serializeArray());
 2483+ },
 2484+ serializeArray: function() {
 2485+ return this.map(function(){
 2486+ return jQuery.nodeName(this, "form") ?
 2487+ jQuery.makeArray(this.elements) : this;
 2488+ })
 2489+ .filter(function(){
 2490+ return this.name && !this.disabled &&
 2491+ (this.checked || /select|textarea/i.test(this.nodeName) ||
 2492+ /text|hidden|password/i.test(this.type));
 2493+ })
 2494+ .map(function(i, elem){
 2495+ var val = jQuery(this).val();
 2496+ return val == null ? null :
 2497+ val.constructor == Array ?
 2498+ jQuery.map( val, function(val, i){
 2499+ return {name: elem.name, value: val};
 2500+ }) :
 2501+ {name: elem.name, value: val};
 2502+ }).get();
 2503+ }
 2504+});
 2505+
 2506+// Attach a bunch of functions for handling common AJAX events
 2507+jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){
 2508+ jQuery.fn[o] = function(f){
 2509+ return this.bind(o, f);
 2510+ };
 2511+});
 2512+
 2513+var jsc = now();
 2514+
 2515+jQuery.extend({
 2516+ get: function( url, data, callback, type ) {
 2517+ // shift arguments if data argument was ommited
 2518+ if ( jQuery.isFunction( data ) ) {
 2519+ callback = data;
 2520+ data = null;
 2521+ }
 2522+
 2523+ return jQuery.ajax({
 2524+ type: "GET",
 2525+ url: url,
 2526+ data: data,
 2527+ success: callback,
 2528+ dataType: type
 2529+ });
 2530+ },
 2531+
 2532+ getScript: function( url, callback ) {
 2533+ return jQuery.get(url, null, callback, "script");
 2534+ },
 2535+
 2536+ getJSON: function( url, data, callback ) {
 2537+ return jQuery.get(url, data, callback, "json");
 2538+ },
 2539+
 2540+ post: function( url, data, callback, type ) {
 2541+ if ( jQuery.isFunction( data ) ) {
 2542+ callback = data;
 2543+ data = {};
 2544+ }
 2545+
 2546+ return jQuery.ajax({
 2547+ type: "POST",
 2548+ url: url,
 2549+ data: data,
 2550+ success: callback,
 2551+ dataType: type
 2552+ });
 2553+ },
 2554+
 2555+ ajaxSetup: function( settings ) {
 2556+ jQuery.extend( jQuery.ajaxSettings, settings );
 2557+ },
 2558+
 2559+ ajaxSettings: {
 2560+ url: location.href,
 2561+ global: true,
 2562+ type: "GET",
 2563+ timeout: 0,
 2564+ contentType: "application/x-www-form-urlencoded",
 2565+ processData: true,
 2566+ async: true,
 2567+ data: null,
 2568+ username: null,
 2569+ password: null,
 2570+ accepts: {
 2571+ xml: "application/xml, text/xml",
 2572+ html: "text/html",
 2573+ script: "text/javascript, application/javascript",
 2574+ json: "application/json, text/javascript",
 2575+ text: "text/plain",
 2576+ _default: "*/*"
 2577+ }
 2578+ },
 2579+
 2580+ // Last-Modified header cache for next request
 2581+ lastModified: {},
 2582+
 2583+ ajax: function( s ) {
 2584+ // Extend the settings, but re-extend 's' so that it can be
 2585+ // checked again later (in the test suite, specifically)
 2586+ s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));
 2587+
 2588+ var jsonp, jsre = /=\?(&|$)/g, status, data,
 2589+ type = s.type.toUpperCase();
 2590+
 2591+ // convert data if not already a string
 2592+ if ( s.data && s.processData && typeof s.data != "string" )
 2593+ s.data = jQuery.param(s.data);
 2594+
 2595+ // Handle JSONP Parameter Callbacks
 2596+ if ( s.dataType == "jsonp" ) {
 2597+ if ( type == "GET" ) {
 2598+ if ( !s.url.match(jsre) )
 2599+ s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";
 2600+ } else if ( !s.data || !s.data.match(jsre) )
 2601+ s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
 2602+ s.dataType = "json";
 2603+ }
 2604+
 2605+ // Build temporary JSONP function
 2606+ if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {
 2607+ jsonp = "jsonp" + jsc++;
 2608+
 2609+ // Replace the =? sequence both in the query string and the data
 2610+ if ( s.data )
 2611+ s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
 2612+ s.url = s.url.replace(jsre, "=" + jsonp + "$1");
 2613+
 2614+ // We need to make sure
 2615+ // that a JSONP style response is executed properly
 2616+ s.dataType = "script";
 2617+
 2618+ // Handle JSONP-style loading
 2619+ window[ jsonp ] = function(tmp){
 2620+ data = tmp;
 2621+ success();
 2622+ complete();
 2623+ // Garbage collect
 2624+ window[ jsonp ] = undefined;
 2625+ try{ delete window[ jsonp ]; } catch(e){}
 2626+ if ( head )
 2627+ head.removeChild( script );
 2628+ };
 2629+ }
 2630+
 2631+ if ( s.dataType == "script" && s.cache == null )
 2632+ s.cache = false;
 2633+
 2634+ if ( s.cache === false && type == "GET" ) {
 2635+ var ts = now();
 2636+ // try replacing _= if it is there
 2637+ var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");
 2638+ // if nothing was replaced, add timestamp to the end
 2639+ s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");
 2640+ }
 2641+
 2642+ // If data is available, append data to url for get requests
 2643+ if ( s.data && type == "GET" ) {
 2644+ s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;
 2645+
 2646+ // IE likes to send both get and post data, prevent this
 2647+ s.data = null;
 2648+ }
 2649+
 2650+ // Watch for a new set of requests
 2651+ if ( s.global && ! jQuery.active++ )
 2652+ jQuery.event.trigger( "ajaxStart" );
 2653+
 2654+ // Matches an absolute URL, and saves the domain
 2655+ var remote = /^(?:\w+:)?\/\/([^\/?#]+)/;
 2656+
 2657+ // If we're requesting a remote document
 2658+ // and trying to load JSON or Script with a GET
 2659+ if ( s.dataType == "script" && type == "GET"
 2660+ && remote.test(s.url) && remote.exec(s.url)[1] != location.host ){
 2661+ var head = document.getElementsByTagName("head")[0];
 2662+ var script = document.createElement("script");
 2663+ script.src = s.url;
 2664+ if (s.scriptCharset)
 2665+ script.charset = s.scriptCharset;
 2666+
 2667+ // Handle Script loading
 2668+ if ( !jsonp ) {
 2669+ var done = false;
 2670+
 2671+ // Attach handlers for all browsers
 2672+ script.onload = script.onreadystatechange = function(){
 2673+ if ( !done && (!this.readyState ||
 2674+ this.readyState == "loaded" || this.readyState == "complete") ) {
 2675+ done = true;
 2676+ success();
 2677+ complete();
 2678+ head.removeChild( script );
 2679+ }
 2680+ };
 2681+ }
 2682+
 2683+ head.appendChild(script);
 2684+
 2685+ // We handle everything using the script element injection
 2686+ return undefined;
 2687+ }
 2688+
 2689+ var requestDone = false;
 2690+
 2691+ // Create the request object; Microsoft failed to properly
 2692+ // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available
 2693+ var xhr = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
 2694+
 2695+ // Open the socket
 2696+ // Passing null username, generates a login popup on Opera (#2865)
 2697+ if( s.username )
 2698+ xhr.open(type, s.url, s.async, s.username, s.password);
 2699+ else
 2700+ xhr.open(type, s.url, s.async);
 2701+
 2702+ // Need an extra try/catch for cross domain requests in Firefox 3
 2703+ try {
 2704+ // Set the correct header, if data is being sent
 2705+ if ( s.data )
 2706+ xhr.setRequestHeader("Content-Type", s.contentType);
 2707+
 2708+ // Set the If-Modified-Since header, if ifModified mode.
 2709+ if ( s.ifModified )
 2710+ xhr.setRequestHeader("If-Modified-Since",
 2711+ jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
 2712+
 2713+ // Set header so the called script knows that it's an XMLHttpRequest
 2714+ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
 2715+
 2716+ // Set the Accepts header for the server, depending on the dataType
 2717+ xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
 2718+ s.accepts[ s.dataType ] + ", */*" :
 2719+ s.accepts._default );
 2720+ } catch(e){}
 2721+
 2722+ // Allow custom headers/mimetypes
 2723+ if ( s.beforeSend && s.beforeSend(xhr, s) === false ) {
 2724+ // cleanup active request counter
 2725+ s.global && jQuery.active--;
 2726+ // close opended socket
 2727+ xhr.abort();
 2728+ return false;
 2729+ }
 2730+
 2731+ if ( s.global )
 2732+ jQuery.event.trigger("ajaxSend", [xhr, s]);
 2733+
 2734+ // Wait for a response to come back
 2735+ var onreadystatechange = function(isTimeout){
 2736+ // The transfer is complete and the data is available, or the request timed out
 2737+ if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) {
 2738+ requestDone = true;
 2739+
 2740+ // clear poll interval
 2741+ if (ival) {
 2742+ clearInterval(ival);
 2743+ ival = null;
 2744+ }
 2745+
 2746+ status = isTimeout == "timeout" && "timeout" ||
 2747+ !jQuery.httpSuccess( xhr ) && "error" ||
 2748+ s.ifModified && jQuery.httpNotModified( xhr, s.url ) && "notmodified" ||
 2749+ "success";
 2750+
 2751+ if ( status == "success" ) {
 2752+ // Watch for, and catch, XML document parse errors
 2753+ try {
 2754+ // process the data (runs the xml through httpData regardless of callback)
 2755+ data = jQuery.httpData( xhr, s.dataType, s.dataFilter );
 2756+ } catch(e) {
 2757+ status = "parsererror";
 2758+ }
 2759+ }
 2760+
 2761+ // Make sure that the request was successful or notmodified
 2762+ if ( status == "success" ) {
 2763+ // Cache Last-Modified header, if ifModified mode.
 2764+ var modRes;
 2765+ try {
 2766+ modRes = xhr.getResponseHeader("Last-Modified");
 2767+ } catch(e) {} // swallow exception thrown by FF if header is not available
 2768+
 2769+ if ( s.ifModified && modRes )
 2770+ jQuery.lastModified[s.url] = modRes;
 2771+
 2772+ // JSONP handles its own success callback
 2773+ if ( !jsonp )
 2774+ success();
 2775+ } else
 2776+ jQuery.handleError(s, xhr, status);
 2777+
 2778+ // Fire the complete handlers
 2779+ complete();
 2780+
 2781+ // Stop memory leaks
 2782+ if ( s.async )
 2783+ xhr = null;
 2784+ }
 2785+ };
 2786+
 2787+ if ( s.async ) {
 2788+ // don't attach the handler to the request, just poll it instead
 2789+ var ival = setInterval(onreadystatechange, 13);
 2790+
 2791+ // Timeout checker
 2792+ if ( s.timeout > 0 )
 2793+ setTimeout(function(){
 2794+ // Check to see if the request is still happening
 2795+ if ( xhr ) {
 2796+ // Cancel the request
 2797+ xhr.abort();
 2798+
 2799+ if( !requestDone )
 2800+ onreadystatechange( "timeout" );
 2801+ }
 2802+ }, s.timeout);
 2803+ }
 2804+
 2805+ // Send the data
 2806+ try {
 2807+ xhr.send(s.data);
 2808+ } catch(e) {
 2809+ jQuery.handleError(s, xhr, null, e);
 2810+ }
 2811+
 2812+ // firefox 1.5 doesn't fire statechange for sync requests
 2813+ if ( !s.async )
 2814+ onreadystatechange();
 2815+
 2816+ function success(){
 2817+ // If a local callback was specified, fire it and pass it the data
 2818+ if ( s.success )
 2819+ s.success( data, status );
 2820+
 2821+ // Fire the global callback
 2822+ if ( s.global )
 2823+ jQuery.event.trigger( "ajaxSuccess", [xhr, s] );
 2824+ }
 2825+
 2826+ function complete(){
 2827+ // Process result
 2828+ if ( s.complete )
 2829+ s.complete(xhr, status);
 2830+
 2831+ // The request was completed
 2832+ if ( s.global )
 2833+ jQuery.event.trigger( "ajaxComplete", [xhr, s] );
 2834+
 2835+ // Handle the global AJAX counter
 2836+ if ( s.global && ! --jQuery.active )
 2837+ jQuery.event.trigger( "ajaxStop" );
 2838+ }
 2839+
 2840+ // return XMLHttpRequest to allow aborting the request etc.
 2841+ return xhr;
 2842+ },
 2843+
 2844+ handleError: function( s, xhr, status, e ) {
 2845+ // If a local callback was specified, fire it
 2846+ if ( s.error ) s.error( xhr, status, e );
 2847+
 2848+ // Fire the global callback
 2849+ if ( s.global )
 2850+ jQuery.event.trigger( "ajaxError", [xhr, s, e] );
 2851+ },
 2852+
 2853+ // Counter for holding the number of active queries
 2854+ active: 0,
 2855+
 2856+ // Determines if an XMLHttpRequest was successful or not
 2857+ httpSuccess: function( xhr ) {
 2858+ try {
 2859+ // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
 2860+ return !xhr.status && location.protocol == "file:" ||
 2861+ ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223 ||
 2862+ jQuery.browser.safari && xhr.status == undefined;
 2863+ } catch(e){}
 2864+ return false;
 2865+ },
 2866+
 2867+ // Determines if an XMLHttpRequest returns NotModified
 2868+ httpNotModified: function( xhr, url ) {
 2869+ try {
 2870+ var xhrRes = xhr.getResponseHeader("Last-Modified");
 2871+
 2872+ // Firefox always returns 200. check Last-Modified date
 2873+ return xhr.status == 304 || xhrRes == jQuery.lastModified[url] ||
 2874+ jQuery.browser.safari && xhr.status == undefined;
 2875+ } catch(e){}
 2876+ return false;
 2877+ },
 2878+
 2879+ httpData: function( xhr, type, filter ) {
 2880+ var ct = xhr.getResponseHeader("content-type"),
 2881+ xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0,
 2882+ data = xml ? xhr.responseXML : xhr.responseText;
 2883+
 2884+ if ( xml && data.documentElement.tagName == "parsererror" )
 2885+ throw "parsererror";
 2886+
 2887+ // Allow a pre-filtering function to sanitize the response
 2888+ if( filter )
 2889+ data = filter( data, type );
 2890+
 2891+ // If the type is "script", eval it in global context
 2892+ if ( type == "script" )
 2893+ jQuery.globalEval( data );
 2894+
 2895+ // Get the JavaScript object, if JSON is used.
 2896+ if ( type == "json" )
 2897+ data = eval("(" + data + ")");
 2898+
 2899+ return data;
 2900+ },
 2901+
 2902+ // Serialize an array of form elements or a set of
 2903+ // key/values into a query string
 2904+ param: function( a ) {
 2905+ var s = [];
 2906+
 2907+ // If an array was passed in, assume that it is an array
 2908+ // of form elements
 2909+ if ( a.constructor == Array || a.jquery )
 2910+ // Serialize the form elements
 2911+ jQuery.each( a, function(){
 2912+ s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );
 2913+ });
 2914+
 2915+ // Otherwise, assume that it's an object of key/value pairs
 2916+ else
 2917+ // Serialize the key/values
 2918+ for ( var j in a )
 2919+ // If the value is an array then the key names need to be repeated
 2920+ if ( a[j] && a[j].constructor == Array )
 2921+ jQuery.each( a[j], function(){
 2922+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );
 2923+ });
 2924+ else
 2925+ s.push( encodeURIComponent(j) + "=" + encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) );
 2926+
 2927+ // Return the resulting serialization
 2928+ return s.join("&").replace(/%20/g, "+");
 2929+ }
 2930+
 2931+});
 2932+jQuery.fn.extend({
 2933+ show: function(speed,callback){
 2934+ return speed ?
 2935+ this.animate({
 2936+ height: "show", width: "show", opacity: "show"
 2937+ }, speed, callback) :
 2938+
 2939+ this.filter(":hidden").each(function(){
 2940+ this.style.display = this.oldblock || "";
 2941+ if ( jQuery.css(this,"display") == "none" ) {
 2942+ var elem = jQuery("<" + this.tagName + " />").appendTo("body");
 2943+ this.style.display = elem.css("display");
 2944+ // handle an edge condition where css is - div { display:none; } or similar
 2945+ if (this.style.display == "none")
 2946+ this.style.display = "block";
 2947+ elem.remove();
 2948+ }
 2949+ }).end();
 2950+ },
 2951+
 2952+ hide: function(speed,callback){
 2953+ return speed ?
 2954+ this.animate({
 2955+ height: "hide", width: "hide", opacity: "hide"
 2956+ }, speed, callback) :
 2957+
 2958+ this.filter(":visible").each(function(){
 2959+ this.oldblock = this.oldblock || jQuery.css(this,"display");
 2960+ this.style.display = "none";
 2961+ }).end();
 2962+ },
 2963+
 2964+ // Save the old toggle function
 2965+ _toggle: jQuery.fn.toggle,
 2966+
 2967+ toggle: function( fn, fn2 ){
 2968+ return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?
 2969+ this._toggle.apply( this, arguments ) :
 2970+ fn ?
 2971+ this.animate({
 2972+ height: "toggle", width: "toggle", opacity: "toggle"
 2973+ }, fn, fn2) :
 2974+ this.each(function(){
 2975+ jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();
 2976+ });
 2977+ },
 2978+
 2979+ slideDown: function(speed,callback){
 2980+ return this.animate({height: "show"}, speed, callback);
 2981+ },
 2982+
 2983+ slideUp: function(speed,callback){
 2984+ return this.animate({height: "hide"}, speed, callback);
 2985+ },
 2986+
 2987+ slideToggle: function(speed, callback){
 2988+ return this.animate({height: "toggle"}, speed, callback);
 2989+ },
 2990+
 2991+ fadeIn: function(speed, callback){
 2992+ return this.animate({opacity: "show"}, speed, callback);
 2993+ },
 2994+
 2995+ fadeOut: function(speed, callback){
 2996+ return this.animate({opacity: "hide"}, speed, callback);
 2997+ },
 2998+
 2999+ fadeTo: function(speed,to,callback){
 3000+ return this.animate({opacity: to}, speed, callback);
 3001+ },
 3002+
 3003+ animate: function( prop, speed, easing, callback ) {
 3004+ var optall = jQuery.speed(speed, easing, callback);
 3005+
 3006+ return this[ optall.queue === false ? "each" : "queue" ](function(){
 3007+ if ( this.nodeType != 1)
 3008+ return false;
 3009+
 3010+ var opt = jQuery.extend({}, optall), p,
 3011+ hidden = jQuery(this).is(":hidden"), self = this;
 3012+
 3013+ for ( p in prop ) {
 3014+ if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )
 3015+ return opt.complete.call(this);
 3016+
 3017+ if ( p == "height" || p == "width" ) {
 3018+ // Store display property
 3019+ opt.display = jQuery.css(this, "display");
 3020+
 3021+ // Make sure that nothing sneaks out
 3022+ opt.overflow = this.style.overflow;
 3023+ }
 3024+ }
 3025+
 3026+ if ( opt.overflow != null )
 3027+ this.style.overflow = "hidden";
 3028+
 3029+ opt.curAnim = jQuery.extend({}, prop);
 3030+
 3031+ jQuery.each( prop, function(name, val){
 3032+ var e = new jQuery.fx( self, opt, name );
 3033+
 3034+ if ( /toggle|show|hide/.test(val) )
 3035+ e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );
 3036+ else {
 3037+ var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),
 3038+ start = e.cur(true) || 0;
 3039+
 3040+ if ( parts ) {
 3041+ var end = parseFloat(parts[2]),
 3042+ unit = parts[3] || "px";
 3043+
 3044+ // We need to compute starting value
 3045+ if ( unit != "px" ) {
 3046+ self.style[ name ] = (end || 1) + unit;
 3047+ start = ((end || 1) / e.cur(true)) * start;
 3048+ self.style[ name ] = start + unit;
 3049+ }
 3050+
 3051+ // If a +=/-= token was provided, we're doing a relative animation
 3052+ if ( parts[1] )
 3053+ end = ((parts[1] == "-=" ? -1 : 1) * end) + start;
 3054+
 3055+ e.custom( start, end, unit );
 3056+ } else
 3057+ e.custom( start, val, "" );
 3058+ }
 3059+ });
 3060+
 3061+ // For JS strict compliance
 3062+ return true;
 3063+ });
 3064+ },
 3065+
 3066+ queue: function(type, fn){
 3067+ if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {
 3068+ fn = type;
 3069+ type = "fx";
 3070+ }
 3071+
 3072+ if ( !type || (typeof type == "string" && !fn) )
 3073+ return queue( this[0], type );
 3074+
 3075+ return this.each(function(){
 3076+ if ( fn.constructor == Array )
 3077+ queue(this, type, fn);
 3078+ else {
 3079+ queue(this, type).push( fn );
 3080+
 3081+ if ( queue(this, type).length == 1 )
 3082+ fn.call(this);
 3083+ }
 3084+ });
 3085+ },
 3086+
 3087+ stop: function(clearQueue, gotoEnd){
 3088+ var timers = jQuery.timers;
 3089+
 3090+ if (clearQueue)
 3091+ this.queue([]);
 3092+
 3093+ this.each(function(){
 3094+ // go in reverse order so anything added to the queue during the loop is ignored
 3095+ for ( var i = timers.length - 1; i >= 0; i-- )
 3096+ if ( timers[i].elem == this ) {
 3097+ if (gotoEnd)
 3098+ // force the next step to be the last
 3099+ timers[i](true);
 3100+ timers.splice(i, 1);
 3101+ }
 3102+ });
 3103+
 3104+ // start the next in the queue if the last step wasn't forced
 3105+ if (!gotoEnd)
 3106+ this.dequeue();
 3107+
 3108+ return this;
 3109+ }
 3110+
 3111+});
 3112+
 3113+var queue = function( elem, type, array ) {
 3114+ if ( elem ){
 3115+
 3116+ type = type || "fx";
 3117+
 3118+ var q = jQuery.data( elem, type + "queue" );
 3119+
 3120+ if ( !q || array )
 3121+ q = jQuery.data( elem, type + "queue", jQuery.makeArray(array) );
 3122+
 3123+ }
 3124+ return q;
 3125+};
 3126+
 3127+jQuery.fn.dequeue = function(type){
 3128+ type = type || "fx";
 3129+
 3130+ return this.each(function(){
 3131+ var q = queue(this, type);
 3132+
 3133+ q.shift();
 3134+
 3135+ if ( q.length )
 3136+ q[0].call( this );
 3137+ });
 3138+};
 3139+
 3140+jQuery.extend({
 3141+
 3142+ speed: function(speed, easing, fn) {
 3143+ var opt = speed && speed.constructor == Object ? speed : {
 3144+ complete: fn || !fn && easing ||
 3145+ jQuery.isFunction( speed ) && speed,
 3146+ duration: speed,
 3147+ easing: fn && easing || easing && easing.constructor != Function && easing
 3148+ };
 3149+
 3150+ opt.duration = (opt.duration && opt.duration.constructor == Number ?
 3151+ opt.duration :
 3152+ jQuery.fx.speeds[opt.duration]) || jQuery.fx.speeds.def;
 3153+
 3154+ // Queueing
 3155+ opt.old = opt.complete;
 3156+ opt.complete = function(){
 3157+ if ( opt.queue !== false )
 3158+ jQuery(this).dequeue();
 3159+ if ( jQuery.isFunction( opt.old ) )
 3160+ opt.old.call( this );
 3161+ };
 3162+
 3163+ return opt;
 3164+ },
 3165+
 3166+ easing: {
 3167+ linear: function( p, n, firstNum, diff ) {
 3168+ return firstNum + diff * p;
 3169+ },
 3170+ swing: function( p, n, firstNum, diff ) {
 3171+ return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
 3172+ }
 3173+ },
 3174+
 3175+ timers: [],
 3176+ timerId: null,
 3177+
 3178+ fx: function( elem, options, prop ){
 3179+ this.options = options;
 3180+ this.elem = elem;
 3181+ this.prop = prop;
 3182+
 3183+ if ( !options.orig )
 3184+ options.orig = {};
 3185+ }
 3186+
 3187+});
 3188+
 3189+jQuery.fx.prototype = {
 3190+
 3191+ // Simple function for setting a style value
 3192+ update: function(){
 3193+ if ( this.options.step )
 3194+ this.options.step.call( this.elem, this.now, this );
 3195+
 3196+ (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
 3197+
 3198+ // Set display property to block for height/width animations
 3199+ if ( this.prop == "height" || this.prop == "width" )
 3200+ this.elem.style.display = "block";
 3201+ },
 3202+
 3203+ // Get the current size
 3204+ cur: function(force){
 3205+ if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )
 3206+ return this.elem[ this.prop ];
 3207+
 3208+ var r = parseFloat(jQuery.css(this.elem, this.prop, force));
 3209+ return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
 3210+ },
 3211+
 3212+ // Start an animation from one number to another
 3213+ custom: function(from, to, unit){
 3214+ this.startTime = now();
 3215+ this.start = from;
 3216+ this.end = to;
 3217+ this.unit = unit || this.unit || "px";
 3218+ this.now = this.start;
 3219+ this.pos = this.state = 0;
 3220+ this.update();
 3221+
 3222+ var self = this;
 3223+ function t(gotoEnd){
 3224+ return self.step(gotoEnd);
 3225+ }
 3226+
 3227+ t.elem = this.elem;
 3228+
 3229+ jQuery.timers.push(t);
 3230+
 3231+ if ( jQuery.timerId == null ) {
 3232+ jQuery.timerId = setInterval(function(){
 3233+ var timers = jQuery.timers;
 3234+
 3235+ for ( var i = 0; i < timers.length; i++ )
 3236+ if ( !timers[i]() )
 3237+ timers.splice(i--, 1);
 3238+
 3239+ if ( !timers.length ) {
 3240+ clearInterval( jQuery.timerId );
 3241+ jQuery.timerId = null;
 3242+ }
 3243+ }, 13);
 3244+ }
 3245+ },
 3246+
 3247+ // Simple 'show' function
 3248+ show: function(){
 3249+ // Remember where we started, so that we can go back to it later
 3250+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 3251+ this.options.show = true;
 3252+
 3253+ // Begin the animation
 3254+ this.custom(0, this.cur());
 3255+
 3256+ // Make sure that we start at a small width/height to avoid any
 3257+ // flash of content
 3258+ if ( this.prop == "width" || this.prop == "height" )
 3259+ this.elem.style[this.prop] = "1px";
 3260+
 3261+ // Start by showing the element
 3262+ jQuery(this.elem).show();
 3263+ },
 3264+
 3265+ // Simple 'hide' function
 3266+ hide: function(){
 3267+ // Remember where we started, so that we can go back to it later
 3268+ this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );
 3269+ this.options.hide = true;
 3270+
 3271+ // Begin the animation
 3272+ this.custom(this.cur(), 0);
 3273+ },
 3274+
 3275+ // Each step of an animation
 3276+ step: function(gotoEnd){
 3277+ var t = now();
 3278+
 3279+ if ( gotoEnd || t > this.options.duration + this.startTime ) {
 3280+ this.now = this.end;
 3281+ this.pos = this.state = 1;
 3282+ this.update();
 3283+
 3284+ this.options.curAnim[ this.prop ] = true;
 3285+
 3286+ var done = true;
 3287+ for ( var i in this.options.curAnim )
 3288+ if ( this.options.curAnim[i] !== true )
 3289+ done = false;
 3290+
 3291+ if ( done ) {
 3292+ if ( this.options.display != null ) {
 3293+ // Reset the overflow
 3294+ this.elem.style.overflow = this.options.overflow;
 3295+
 3296+ // Reset the display
 3297+ this.elem.style.display = this.options.display;
 3298+ if ( jQuery.css(this.elem, "display") == "none" )
 3299+ this.elem.style.display = "block";
 3300+ }
 3301+
 3302+ // Hide the element if the "hide" operation was done
 3303+ if ( this.options.hide )
 3304+ this.elem.style.display = "none";
 3305+
 3306+ // Reset the properties, if the item has been hidden or shown
 3307+ if ( this.options.hide || this.options.show )
 3308+ for ( var p in this.options.curAnim )
 3309+ jQuery.attr(this.elem.style, p, this.options.orig[p]);
 3310+ }
 3311+
 3312+ if ( done )
 3313+ // Execute the complete function
 3314+ this.options.complete.call( this.elem );
 3315+
 3316+ return false;
 3317+ } else {
 3318+ var n = t - this.startTime;
 3319+ this.state = n / this.options.duration;
 3320+
 3321+ // Perform the easing function, defaults to swing
 3322+ this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);
 3323+ this.now = this.start + ((this.end - this.start) * this.pos);
 3324+
 3325+ // Perform the next step of the animation
 3326+ this.update();
 3327+ }
 3328+
 3329+ return true;
 3330+ }
 3331+
 3332+};
 3333+
 3334+jQuery.extend( jQuery.fx, {
 3335+ speeds:{
 3336+ slow: 600,
 3337+ fast: 200,
 3338+ // Default speed
 3339+ def: 400
 3340+ },
 3341+ step: {
 3342+ scrollLeft: function(fx){
 3343+ fx.elem.scrollLeft = fx.now;
 3344+ },
 3345+
 3346+ scrollTop: function(fx){
 3347+ fx.elem.scrollTop = fx.now;
 3348+ },
 3349+
 3350+ opacity: function(fx){
 3351+ jQuery.attr(fx.elem.style, "opacity", fx.now);
 3352+ },
 3353+
 3354+ _default: function(fx){
 3355+ fx.elem.style[ fx.prop ] = fx.now + fx.unit;
 3356+ }
 3357+ }
 3358+});
 3359+// The Offset Method
 3360+// Originally By Brandon Aaron, part of the Dimension Plugin
 3361+// http://jquery.com/plugins/project/dimensions
 3362+jQuery.fn.offset = function() {
 3363+ var left = 0, top = 0, elem = this[0], results;
 3364+
 3365+ if ( elem ) with ( jQuery.browser ) {
 3366+ var parent = elem.parentNode,
 3367+ offsetChild = elem,
 3368+ offsetParent = elem.offsetParent,
 3369+ doc = elem.ownerDocument,
 3370+ safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),
 3371+ css = jQuery.curCSS,
 3372+ fixed = css(elem, "position") == "fixed";
 3373+
 3374+ // Use getBoundingClientRect if available
 3375+ if ( elem.getBoundingClientRect ) {
 3376+ var box = elem.getBoundingClientRect();
 3377+
 3378+ // Add the document scroll offsets
 3379+ add(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
 3380+ box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
 3381+
 3382+ // IE adds the HTML element's border, by default it is medium which is 2px
 3383+ // IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }
 3384+ // IE 7 standards mode, the border is always 2px
 3385+ // This border/offset is typically represented by the clientLeft and clientTop properties
 3386+ // However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS
 3387+ // Therefore this method will be off by 2px in IE while in quirksmode
 3388+ add( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );
 3389+
 3390+ // Otherwise loop through the offsetParents and parentNodes
 3391+ } else {
 3392+
 3393+ // Initial element offsets
 3394+ add( elem.offsetLeft, elem.offsetTop );
 3395+
 3396+ // Get parent offsets
 3397+ while ( offsetParent ) {
 3398+ // Add offsetParent offsets
 3399+ add( offsetParent.offsetLeft, offsetParent.offsetTop );
 3400+
 3401+ // Mozilla and Safari > 2 does not include the border on offset parents
 3402+ // However Mozilla adds the border for table or table cells
 3403+ if ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )
 3404+ border( offsetParent );
 3405+
 3406+ // Add the document scroll offsets if position is fixed on any offsetParent
 3407+ if ( !fixed && css(offsetParent, "position") == "fixed" )
 3408+ fixed = true;
 3409+
 3410+ // Set offsetChild to previous offsetParent unless it is the body element
 3411+ offsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;
 3412+ // Get next offsetParent
 3413+ offsetParent = offsetParent.offsetParent;
 3414+ }
 3415+
 3416+ // Get parent scroll offsets
 3417+ while ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {
 3418+ // Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bug
 3419+ if ( !/^inline|table.*$/i.test(css(parent, "display")) )
 3420+ // Subtract parent scroll offsets
 3421+ add( -parent.scrollLeft, -parent.scrollTop );
 3422+
 3423+ // Mozilla does not add the border for a parent that has overflow != visible
 3424+ if ( mozilla && css(parent, "overflow") != "visible" )
 3425+ border( parent );
 3426+
 3427+ // Get next parent
 3428+ parent = parent.parentNode;
 3429+ }
 3430+
 3431+ // Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild
 3432+ // Mozilla doubles body offsets with a non-absolutely positioned offsetChild
 3433+ if ( (safari2 && (fixed || css(offsetChild, "position") == "absolute")) ||
 3434+ (mozilla && css(offsetChild, "position") != "absolute") )
 3435+ add( -doc.body.offsetLeft, -doc.body.offsetTop );
 3436+
 3437+ // Add the document scroll offsets if position is fixed
 3438+ if ( fixed )
 3439+ add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),
 3440+ Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));
 3441+ }
 3442+
 3443+ // Return an object with top and left properties
 3444+ results = { top: top, left: left };
 3445+ }
 3446+
 3447+ function border(elem) {
 3448+ add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );
 3449+ }
 3450+
 3451+ function add(l, t) {
 3452+ left += parseInt(l, 10) || 0;
 3453+ top += parseInt(t, 10) || 0;
 3454+ }
 3455+
 3456+ return results;
 3457+};
 3458+
 3459+
 3460+jQuery.fn.extend({
 3461+ position: function() {
 3462+ var left = 0, top = 0, results;
 3463+
 3464+ if ( this[0] ) {
 3465+ // Get *real* offsetParent
 3466+ var offsetParent = this.offsetParent(),
 3467+
 3468+ // Get correct offsets
 3469+ offset = this.offset(),
 3470+ parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset();
 3471+
 3472+ // Subtract element margins
 3473+ // note: when an element has margin: auto the offsetLeft and marginLeft
 3474+ // are the same in Safari causing offset.left to incorrectly be 0
 3475+ offset.top -= num( this, 'marginTop' );
 3476+ offset.left -= num( this, 'marginLeft' );
 3477+
 3478+ // Add offsetParent borders
 3479+ parentOffset.top += num( offsetParent, 'borderTopWidth' );
 3480+ parentOffset.left += num( offsetParent, 'borderLeftWidth' );
 3481+
 3482+ // Subtract the two offsets
 3483+ results = {
 3484+ top: offset.top - parentOffset.top,
 3485+ left: offset.left - parentOffset.left
 3486+ };
 3487+ }
 3488+
 3489+ return results;
 3490+ },
 3491+
 3492+ offsetParent: function() {
 3493+ var offsetParent = this[0].offsetParent;
 3494+ while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') )
 3495+ offsetParent = offsetParent.offsetParent;
 3496+ return jQuery(offsetParent);
 3497+ }
 3498+});
 3499+
 3500+
 3501+// Create scrollLeft and scrollTop methods
 3502+jQuery.each( ['Left', 'Top'], function(i, name) {
 3503+ var method = 'scroll' + name;
 3504+
 3505+ jQuery.fn[ method ] = function(val) {
 3506+ if (!this[0]) return;
 3507+
 3508+ return val != undefined ?
 3509+
 3510+ // Set the scroll offset
 3511+ this.each(function() {
 3512+ this == window || this == document ?
 3513+ window.scrollTo(
 3514+ !i ? val : jQuery(window).scrollLeft(),
 3515+ i ? val : jQuery(window).scrollTop()
 3516+ ) :
 3517+ this[ method ] = val;
 3518+ }) :
 3519+
 3520+ // Return the scroll offset
 3521+ this[0] == window || this[0] == document ?
 3522+ self[ i ? 'pageYOffset' : 'pageXOffset' ] ||
 3523+ jQuery.boxModel && document.documentElement[ method ] ||
 3524+ document.body[ method ] :
 3525+ this[0][ method ];
 3526+ };
 3527+});
 3528+// Create innerHeight, innerWidth, outerHeight and outerWidth methods
 3529+jQuery.each([ "Height", "Width" ], function(i, name){
 3530+
 3531+ var tl = i ? "Left" : "Top", // top or left
 3532+ br = i ? "Right" : "Bottom"; // bottom or right
 3533+
 3534+ // innerHeight and innerWidth
 3535+ jQuery.fn["inner" + name] = function(){
 3536+ return this[ name.toLowerCase() ]() +
 3537+ num(this, "padding" + tl) +
 3538+ num(this, "padding" + br);
 3539+ };
 3540+
 3541+ // outerHeight and outerWidth
 3542+ jQuery.fn["outer" + name] = function(margin) {
 3543+ return this["inner" + name]() +
 3544+ num(this, "border" + tl + "Width") +
 3545+ num(this, "border" + br + "Width") +
 3546+ (margin ?
 3547+ num(this, "margin" + tl) + num(this, "margin" + br) : 0);
 3548+ };
 3549+
 3550+});})();

Status & tagging log