Rev 2108 | Blame | Compare with Previous | Last modification | View Log | RSS feed
(function(){/** jQuery 1.2.3 - New Wave Javascript** Copyright (c) 2008 John Resig (jquery.com)* Dual licensed under the MIT (MIT-LICENSE.txt)* and GPL (GPL-LICENSE.txt) licenses.** $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $* $Rev: 4663 $*/// Map over jQuery in case of overwriteif ( window.jQuery )var _jQuery = window.jQuery;var jQuery = window.jQuery = function( selector, context ) {// The jQuery object is actually just the init constructor 'enhanced'return new jQuery.prototype.init( selector, context );};// Map over the $ in case of overwriteif ( window.$ )var _$ = window.$;// Map the jQuery namespace to the '$' onewindow.$ = jQuery;// A simple way to check for HTML strings or ID strings// (both of which we optimize for)var quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/;// Is it a simple selectorvar isSimple = /^.[^:#\[\.]*$/;jQuery.fn = jQuery.prototype = {init: function( selector, context ) {// Make sure that a selection was providedselector = selector || document;// Handle $(DOMElement)if ( selector.nodeType ) {this[0] = selector;this.length = 1;return this;// Handle HTML strings} else if ( typeof selector == "string" ) {// Are we dealing with HTML string or an ID?var match = quickExpr.exec( selector );// Verify a match, and that no context was specified for #idif ( match && (match[1] || !context) ) {// HANDLE: $(html) -> $(array)if ( match[1] )selector = jQuery.clean( [ match[1] ], context );// HANDLE: $("#id")else {var elem = document.getElementById( match[3] );// Make sure an element was locatedif ( elem )// Handle the case where IE and Opera return items// by name instead of IDif ( elem.id != match[3] )return jQuery().find( selector );// Otherwise, we inject the element directly into the jQuery objectelse {this[0] = elem;this.length = 1;return this;}elseselector = [];}// HANDLE: $(expr, [context])// (which is just equivalent to: $(content).find(expr)} elsereturn new jQuery( context ).find( selector );// HANDLE: $(function)// Shortcut for document ready} else if ( jQuery.isFunction( selector ) )return new jQuery( document )[ jQuery.fn.ready ? "ready" : "load" ]( selector );return this.setArray(// HANDLE: $(array)selector.constructor == Array && selector ||// HANDLE: $(arraylike)// Watch for when an array-like object, contains DOM nodes, is passed in as the selector(selector.jquery || selector.length && selector != window && !selector.nodeType && selector[0] != undefined && selector[0].nodeType) && jQuery.makeArray( selector ) ||// HANDLE: $(*)[ selector ] );},// The current version of jQuery being usedjquery: "1.2.3",// The number of elements contained in the matched element setsize: function() {return this.length;},// The number of elements contained in the matched element setlength: 0,// Get the Nth element in the matched element set OR// Get the whole matched element set as a clean arrayget: function( num ) {return num == undefined ?// Return a 'clean' arrayjQuery.makeArray( this ) :// Return just the objectthis[ num ];},// Take an array of elements and push it onto the stack// (returning the new matched element set)pushStack: function( elems ) {// Build a new jQuery matched element setvar ret = jQuery( elems );// Add the old object onto the stack (as a reference)ret.prevObject = this;// Return the newly-formed element setreturn ret;},// Force the current matched set of elements to become// the specified array of elements (destroying the stack in the process)// You should use pushStack() in order to do this, but maintain the stacksetArray: function( elems ) {// Resetting the length to 0, then using the native Array push// is a super-fast way to populate an object with array-like propertiesthis.length = 0;Array.prototype.push.apply( this, elems );return this;},// Execute a callback for every element in the matched set.// (You can seed the arguments with an array of args, but this is// only used internally.)each: function( callback, args ) {return jQuery.each( this, callback, args );},// Determine the position of an element within// the matched set of elementsindex: function( elem ) {var ret = -1;// Locate the position of the desired elementthis.each(function(i){if ( this == elem )ret = i;});return ret;},attr: function( name, value, type ) {var options = name;// Look for the case where we're accessing a style valueif ( name.constructor == String )if ( value == undefined )return this.length && jQuery[ type || "attr" ]( this[0], name ) || undefined;else {options = {};options[ name ] = value;}// Check to see if we're setting style valuesreturn this.each(function(i){// Set all the stylesfor ( name in options )jQuery.attr(type ?this.style :this,name, jQuery.prop( this, options[ name ], type, i, name ));});},css: function( key, value ) {// ignore negative width and height valuesif ( (key == 'width' || key == 'height') && parseFloat(value) < 0 )value = undefined;return this.attr( key, value, "curCSS" );},text: function( text ) {if ( typeof text != "object" && text != null )return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );var ret = "";jQuery.each( text || this, function(){jQuery.each( this.childNodes, function(){if ( this.nodeType != 8 )ret += this.nodeType != 1 ?this.nodeValue :jQuery.fn.text( [ this ] );});});return ret;},wrapAll: function( html ) {if ( this[0] )// The elements to wrap the target aroundjQuery( html, this[0].ownerDocument ).clone().insertBefore( this[0] ).map(function(){var elem = this;while ( elem.firstChild )elem = elem.firstChild;return elem;}).append(this);return this;},wrapInner: function( html ) {return this.each(function(){jQuery( this ).contents().wrapAll( html );});},wrap: function( html ) {return this.each(function(){jQuery( this ).wrapAll( html );});},append: function() {return this.domManip(arguments, true, false, function(elem){if (this.nodeType == 1)this.appendChild( elem );});},prepend: function() {return this.domManip(arguments, true, true, function(elem){if (this.nodeType == 1)this.insertBefore( elem, this.firstChild );});},before: function() {return this.domManip(arguments, false, false, function(elem){this.parentNode.insertBefore( elem, this );});},after: function() {return this.domManip(arguments, false, true, function(elem){this.parentNode.insertBefore( elem, this.nextSibling );});},end: function() {return this.prevObject || jQuery( [] );},find: function( selector ) {var elems = jQuery.map(this, function(elem){return jQuery.find( selector, elem );});return this.pushStack( /[^+>] [^+>]/.test( selector ) || selector.indexOf("..") > -1 ?jQuery.unique( elems ) :elems );},clone: function( events ) {// Do the clonevar ret = this.map(function(){if ( jQuery.browser.msie && !jQuery.isXMLDoc(this) ) {// IE copies events bound via attachEvent when// using cloneNode. Calling detachEvent on the// clone will also remove the events from the orignal// In order to get around this, we use innerHTML.// Unfortunately, this means some modifications to// attributes in IE that are actually only stored// as properties will not be copied (such as the// the name attribute on an input).var clone = this.cloneNode(true),container = document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];} elsereturn this.cloneNode(true);});// Need to set the expando to null on the cloned set if it exists// removeData doesn't work here, IE removes it from the original as well// this is primarily for IE but the data expando shouldn't be copied over in any browservar clone = ret.find("*").andSelf().each(function(){if ( this[ expando ] != undefined )this[ expando ] = null;});// Copy the events from the original to the cloneif ( events === true )this.find("*").andSelf().each(function(i){if (this.nodeType == 3)return;var events = jQuery.data( this, "events" );for ( var type in events )for ( var handler in events[ type ] )jQuery.event.add( clone[ i ], type, events[ type ][ handler ], events[ type ][ handler ].data );});// Return the cloned setreturn ret;},filter: function( selector ) {return this.pushStack(jQuery.isFunction( selector ) &&jQuery.grep(this, function(elem, i){return selector.call( elem, i );}) ||jQuery.multiFilter( selector, this ) );},not: function( selector ) {if ( selector.constructor == String )// test special case where just one selector is passed inif ( isSimple.test( selector ) )return this.pushStack( jQuery.multiFilter( selector, this, true ) );elseselector = jQuery.multiFilter( selector, this );var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType;return this.filter(function() {return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector;});},add: function( selector ) {return !selector ? this : this.pushStack( jQuery.merge(this.get(),selector.constructor == String ?jQuery( selector ).get() :selector.length != undefined && (!selector.nodeName || jQuery.nodeName(selector, "form")) ?selector : [selector] ) );},is: function( selector ) {return selector ?jQuery.multiFilter( selector, this ).length > 0 :false;},hasClass: function( selector ) {return this.is( "." + selector );},val: function( value ) {if ( value == undefined ) {if ( this.length ) {var elem = this[0];// We need to handle select boxes specialif ( jQuery.nodeName( elem, "select" ) ) {var index = elem.selectedIndex,values = [],options = elem.options,one = elem.type == "select-one";// Nothing was selectedif ( index < 0 )return null;// Loop through all the selected optionsfor ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {var option = options[ i ];if ( option.selected ) {// Get the specifc value for the optionvalue = jQuery.browser.msie && !option.attributes.value.specified ? option.text : option.value;// We don't need an array for one selectsif ( one )return value;// Multi-Selects return an arrayvalues.push( value );}}return values;// Everything else, we just grab the value} elsereturn (this[0].value || "").replace(/\r/g, "");}return undefined;}return this.each(function(){if ( this.nodeType != 1 )return;if ( value.constructor == Array && /radio|checkbox/.test( this.type ) )this.checked = (jQuery.inArray(this.value, value) >= 0 ||jQuery.inArray(this.name, value) >= 0);else if ( jQuery.nodeName( this, "select" ) ) {var values = value.constructor == Array ?value :[ value ];jQuery( "option", this ).each(function(){this.selected = (jQuery.inArray( this.value, values ) >= 0 ||jQuery.inArray( this.text, values ) >= 0);});if ( !values.length )this.selectedIndex = -1;} elsethis.value = value;});},html: function( value ) {return value == undefined ?(this.length ?this[0].innerHTML :null) :this.empty().append( value );},replaceWith: function( value ) {return this.after( value ).remove();},eq: function( i ) {return this.slice( i, i + 1 );},slice: function() {return this.pushStack( Array.prototype.slice.apply( this, arguments ) );},map: function( callback ) {return this.pushStack( jQuery.map(this, function(elem, i){return callback.call( elem, i, elem );}));},andSelf: function() {return this.add( this.prevObject );},data: function( key, value ){var parts = key.split(".");parts[1] = parts[1] ? "." + parts[1] : "";if ( value == null ) {var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);if ( data == undefined && this.length )data = jQuery.data( this[0], key );return data == null && parts[1] ?this.data( parts[0] ) :data;} elsereturn this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){jQuery.data( this, key, value );});},removeData: function( key ){return this.each(function(){jQuery.removeData( this, key );});},domManip: function( args, table, reverse, callback ) {var clone = this.length > 1, elems;return this.each(function(){if ( !elems ) {elems = jQuery.clean( args, this.ownerDocument );if ( reverse )elems.reverse();}var obj = this;if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )obj = this.getElementsByTagName("tbody")[0] || this.appendChild( this.ownerDocument.createElement("tbody") );var scripts = jQuery( [] );jQuery.each(elems, function(){var elem = clone ?jQuery( this ).clone( true )[0] :this;// execute all scripts after the elements have been injectedif ( jQuery.nodeName( elem, "script" ) ) {scripts = scripts.add( elem );} else {// Remove any inner scripts for later evaluationif ( elem.nodeType == 1 )scripts = scripts.add( jQuery( "script", elem ).remove() );// Inject the elements into the documentcallback.call( obj, elem );}});scripts.each( evalScript );});}};// Give the init function the jQuery prototype for later instantiationjQuery.prototype.init.prototype = jQuery.prototype;function evalScript( i, elem ) {if ( elem.src )jQuery.ajax({url: elem.src,async: false,dataType: "script"});elsejQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );if ( elem.parentNode )elem.parentNode.removeChild( elem );}jQuery.extend = jQuery.fn.extend = function() {// copy reference to target objectvar target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options;// Handle a deep copy situationif ( target.constructor == Boolean ) {deep = target;target = arguments[1] || {};// skip the boolean and the targeti = 2;}// Handle case when target is a string or something (possible in deep copy)if ( typeof target != "object" && typeof target != "function" )target = {};// extend jQuery itself if only one argument is passedif ( length == 1 ) {target = this;i = 0;}for ( ; i < length; i++ )// Only deal with non-null/undefined valuesif ( (options = arguments[ i ]) != null )// Extend the base objectfor ( var name in options ) {// Prevent never-ending loopif ( target === options[ name ] )continue;// Recurse if we're merging object valuesif ( deep && options[ name ] && typeof options[ name ] == "object" && target[ name ] && !options[ name ].nodeType )target[ name ] = jQuery.extend( target[ name ], options[ name ] );// Don't bring in undefined valueselse if ( options[ name ] != undefined )target[ name ] = options[ name ];}// Return the modified objectreturn target;};var expando = "jQuery" + (new Date()).getTime(), uuid = 0, windowData = {};// exclude the following css properties to add pxvar exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i;jQuery.extend({noConflict: function( deep ) {window.$ = _$;if ( deep )window.jQuery = _jQuery;return jQuery;},// See test/unit/core.js for details concerning this function.isFunction: function( fn ) {return !!fn && typeof fn != "string" && !fn.nodeName &&fn.constructor != Array && /function/i.test( fn + "" );},// check if an element is in a (or is an) XML documentisXMLDoc: function( elem ) {return elem.documentElement && !elem.body ||elem.tagName && elem.ownerDocument && !elem.ownerDocument.body;},// Evalulates a script in a global contextglobalEval: function( data ) {data = jQuery.trim( data );if ( data ) {// Inspired by code by Andrea Giammarchi// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.htmlvar head = document.getElementsByTagName("head")[0] || document.documentElement,script = document.createElement("script");script.type = "text/javascript";if ( jQuery.browser.msie )script.text = data;elsescript.appendChild( document.createTextNode( data ) );head.appendChild( script );head.removeChild( script );}},nodeName: function( elem, name ) {return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase();},cache: {},data: function( elem, name, data ) {elem = elem == window ?windowData :elem;var id = elem[ expando ];// Compute a unique ID for the elementif ( !id )id = elem[ expando ] = ++uuid;// Only generate the data cache if we're// trying to access or manipulate itif ( name && !jQuery.cache[ id ] )jQuery.cache[ id ] = {};// Prevent overriding the named cache with undefined valuesif ( data != undefined )jQuery.cache[ id ][ name ] = data;// Return the named cache data, or the ID for the elementreturn name ?jQuery.cache[ id ][ name ] :id;},removeData: function( elem, name ) {elem = elem == window ?windowData :elem;var id = elem[ expando ];// If we want to remove a specific section of the element's dataif ( name ) {if ( jQuery.cache[ id ] ) {// Remove the section of cache datadelete jQuery.cache[ id ][ name ];// If we've removed all the data, remove the element's cachename = "";for ( name in jQuery.cache[ id ] )break;if ( !name )jQuery.removeData( elem );}// Otherwise, we want to remove all of the element's data} else {// Clean up the element expandotry {delete elem[ expando ];} catch(e){// IE has trouble directly removing the expando// but it's ok with using removeAttributeif ( elem.removeAttribute )elem.removeAttribute( expando );}// Completely remove the data cachedelete jQuery.cache[ id ];}},// args is for internal usage onlyeach: function( object, callback, args ) {if ( args ) {if ( object.length == undefined ) {for ( var name in object )if ( callback.apply( object[ name ], args ) === false )break;} elsefor ( var i = 0, length = object.length; i < length; i++ )if ( callback.apply( object[ i ], args ) === false )break;// A special, fast, case for the most common use of each} else {if ( object.length == undefined ) {for ( var name in object )if ( callback.call( object[ name ], name, object[ name ] ) === false )break;} elsefor ( var i = 0, length = object.length, value = object[0];i < length && callback.call( value, i, value ) !== false; value = object[++i] ){}}return object;},prop: function( elem, value, type, i, name ) {// Handle executable functionsif ( jQuery.isFunction( value ) )value = value.call( elem, i );// Handle passing in a number to a CSS propertyreturn value && value.constructor == Number && type == "curCSS" && !exclude.test( name ) ?value + "px" :value;},className: {// internal only, use addClass("class")add: function( elem, classNames ) {jQuery.each((classNames || "").split(/\s+/), function(i, className){if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) )elem.className += (elem.className ? " " : "") + className;});},// internal only, use removeClass("class")remove: function( elem, classNames ) {if (elem.nodeType == 1)elem.className = classNames != undefined ?jQuery.grep(elem.className.split(/\s+/), function(className){return !jQuery.className.has( classNames, className );}).join(" ") :"";},// internal only, use is(".class")has: function( elem, className ) {return jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1;}},// A method for quickly swapping in/out CSS properties to get correct calculationsswap: function( elem, options, callback ) {var old = {};// Remember the old values, and insert the new onesfor ( var name in options ) {old[ name ] = elem.style[ name ];elem.style[ name ] = options[ name ];}callback.call( elem );// Revert the old valuesfor ( var name in options )elem.style[ name ] = old[ name ];},css: function( elem, name, force ) {if ( name == "width" || name == "height" ) {var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ];function getWH() {val = name == "width" ? elem.offsetWidth : elem.offsetHeight;var padding = 0, border = 0;jQuery.each( which, function() {padding += parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;border += parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;});val -= Math.round(padding + border);}if ( jQuery(elem).is(":visible") )getWH();elsejQuery.swap( elem, props, getWH );return Math.max(0, val);}return jQuery.curCSS( elem, name, force );},curCSS: function( elem, name, force ) {var ret;// A helper method for determining if an element's values are brokenfunction color( elem ) {if ( !jQuery.browser.safari )return false;var ret = document.defaultView.getComputedStyle( elem, null );return !ret || ret.getPropertyValue("color") == "";}// We need to handle opacity special in IEif ( name == "opacity" && jQuery.browser.msie ) {ret = jQuery.attr( elem.style, "opacity" );return ret == "" ?"1" :ret;}// Opera sometimes will give the wrong display answer, this fixes it, see #2037if ( jQuery.browser.opera && name == "display" ) {var save = elem.style.outline;elem.style.outline = "0 solid black";elem.style.outline = save;}// Make sure we're using the right name for getting the float valueif ( name.match( /float/i ) )name = styleFloat;if ( !force && elem.style && elem.style[ name ] )ret = elem.style[ name ];else if ( document.defaultView && document.defaultView.getComputedStyle ) {// Only "float" is needed hereif ( name.match( /float/i ) )name = "float";name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase();var getComputedStyle = document.defaultView.getComputedStyle( elem, null );if ( getComputedStyle && !color( elem ) )ret = getComputedStyle.getPropertyValue( name );// If the element isn't reporting its values properly in Safari// then some display: none elements are involvedelse {var swap = [], stack = [];// Locate all of the parent display: none elementsfor ( var a = elem; a && color(a); a = a.parentNode )stack.unshift(a);// Go through and make them visible, but in reverse// (It would be better if we knew the exact display type that they had)for ( var i = 0; i < stack.length; i++ )if ( color( stack[ i ] ) ) {swap[ i ] = stack[ i ].style.display;stack[ i ].style.display = "block";}// Since we flip the display style, we have to handle that// one special, otherwise get the valueret = name == "display" && swap[ stack.length - 1 ] != null ?"none" :( getComputedStyle && getComputedStyle.getPropertyValue( name ) ) || "";// Finally, revert the display styles backfor ( var i = 0; i < swap.length; i++ )if ( swap[ i ] != null )stack[ i ].style.display = swap[ i ];}// We should always get a number back from opacityif ( name == "opacity" && ret == "" )ret = "1";} else if ( elem.currentStyle ) {var camelCase = name.replace(/\-(\w)/g, function(all, letter){return letter.toUpperCase();});ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];// From the awesome hack by Dean Edwards// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291// If we're not dealing with a regular pixel number// but a number that has a weird ending, we need to convert it to pixelsif ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) {// Remember the original valuesvar style = elem.style.left, runtimeStyle = elem.runtimeStyle.left;// Put in the new values to get a computed value outelem.runtimeStyle.left = elem.currentStyle.left;elem.style.left = ret || 0;ret = elem.style.pixelLeft + "px";// Revert the changed valueselem.style.left = style;elem.runtimeStyle.left = runtimeStyle;}}return ret;},clean: function( elems, context ) {var ret = [];context = context || document;// !context.createElement fails in IE with an error but returns typeof 'object'if (typeof context.createElement == 'undefined')context = context.ownerDocument || context[0] && context[0].ownerDocument || document;jQuery.each(elems, function(i, elem){if ( !elem )return;if ( elem.constructor == Number )elem = elem.toString();// Convert html string into DOM nodesif ( typeof elem == "string" ) {// Fix "XHTML"-style tags in all browserselem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ?all :front + "></" + tag + ">";});// Trim whitespace, otherwise indexOf won't work as expectedvar tags = jQuery.trim( elem ).toLowerCase(), div = context.createElement("div");var wrap =// option or optgroup!tags.indexOf("<opt") &&[ 1, "<select multiple='multiple'>", "</select>" ] ||!tags.indexOf("<leg") &&[ 1, "<fieldset>", "</fieldset>" ] ||tags.match(/^<(thead|tbody|tfoot|colg|cap)/) &&[ 1, "<table>", "</table>" ] ||!tags.indexOf("<tr") &&[ 2, "<table><tbody>", "</tbody></table>" ] ||// <thead> matched above(!tags.indexOf("<td") || !tags.indexOf("<th")) &&[ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] ||!tags.indexOf("<col") &&[ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] ||// IE can't serialize <link> and <script> tags normallyjQuery.browser.msie &&[ 1, "div<div>", "</div>" ] ||[ 0, "", "" ];// Go to html and back, then peel off extra wrappersdiv.innerHTML = wrap[1] + elem + wrap[2];// Move to the right depthwhile ( wrap[0]-- )div = div.lastChild;// Remove IE's autoinserted <tbody> from table fragmentsif ( jQuery.browser.msie ) {// String was a <table>, *may* have spurious <tbody>var tbody = !tags.indexOf("<table") && tags.indexOf("<tbody") < 0 ?div.firstChild && div.firstChild.childNodes :// String was a bare <thead> or <tfoot>wrap[1] == "<table>" && tags.indexOf("<tbody") < 0 ?div.childNodes :[];for ( var j = tbody.length - 1; j >= 0 ; --j )if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length )tbody[ j ].parentNode.removeChild( tbody[ j ] );// IE completely kills leading whitespace when innerHTML is usedif ( /^\s/.test( elem ) )div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild );}elem = jQuery.makeArray( div.childNodes );}if ( elem.length === 0 && (!jQuery.nodeName( elem, "form" ) && !jQuery.nodeName( elem, "select" )) )return;if ( elem[0] == undefined || jQuery.nodeName( elem, "form" ) || elem.options )ret.push( elem );elseret = jQuery.merge( ret, elem );});return ret;},attr: function( elem, name, value ) {// don't set attributes on text and comment nodesif (!elem || elem.nodeType == 3 || elem.nodeType == 8)return undefined;var fix = jQuery.isXMLDoc( elem ) ?{} :jQuery.props;// Safari mis-reports the default selected property of a hidden option// Accessing the parent's selectedIndex property fixes itif ( name == "selected" && jQuery.browser.safari )elem.parentNode.selectedIndex;// Certain attributes only work when accessed via the old DOM 0 wayif ( fix[ name ] ) {if ( value != undefined )elem[ fix[ name ] ] = value;return elem[ fix[ name ] ];} else if ( jQuery.browser.msie && name == "style" )return jQuery.attr( elem.style, "cssText", value );else if ( value == undefined && jQuery.browser.msie && jQuery.nodeName( elem, "form" ) && (name == "action" || name == "method") )return elem.getAttributeNode( name ).nodeValue;// IE elem.getAttribute passes even for styleelse if ( elem.tagName ) {if ( value != undefined ) {// We can't allow the type property to be changed (since it causes problems in IE)if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode )throw "type property can't be changed";// convert the value to a string (all browsers do this but IE) see #1070elem.setAttribute( name, "" + value );}if ( jQuery.browser.msie && /href|src/.test( name ) && !jQuery.isXMLDoc( elem ) )return elem.getAttribute( name, 2 );return elem.getAttribute( name );// elem is actually elem.style ... set the style} else {// IE actually uses filters for opacityif ( name == "opacity" && jQuery.browser.msie ) {if ( value != undefined ) {// IE has trouble with opacity if it does not have layout// Force it by setting the zoom levelelem.zoom = 1;// Set the alpha filter to set the opacityelem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) +(parseFloat( value ).toString() == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")");}return elem.filter && elem.filter.indexOf("opacity=") >= 0 ?(parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100).toString() :"";}name = name.replace(/-([a-z])/ig, function(all, letter){return letter.toUpperCase();});if ( value != undefined )elem[ name ] = value;return elem[ name ];}},trim: function( text ) {return (text || "").replace( /^\s+|\s+$/g, "" );},makeArray: function( array ) {var ret = [];// Need to use typeof to fight Safari childNodes crashesif ( typeof array != "array" )for ( var i = 0, length = array.length; i < length; i++ )ret.push( array[ i ] );elseret = array.slice( 0 );return ret;},inArray: function( elem, array ) {for ( var i = 0, length = array.length; i < length; i++ )if ( array[ i ] == elem )return i;return -1;},merge: function( first, second ) {// We have to loop this way because IE & Opera overwrite the length// expando of getElementsByTagName// Also, we need to make sure that the correct elements are being returned// (IE returns comment nodes in a '*' query)if ( jQuery.browser.msie ) {for ( var i = 0; second[ i ]; i++ )if ( second[ i ].nodeType != 8 )first.push( second[ i ] );} elsefor ( var i = 0; second[ i ]; i++ )first.push( second[ i ] );return first;},unique: function( array ) {var ret = [], done = {};try {for ( var i = 0, length = array.length; i < length; i++ ) {var id = jQuery.data( array[ i ] );if ( !done[ id ] ) {done[ id ] = true;ret.push( array[ i ] );}}} catch( e ) {ret = array;}return ret;},grep: function( elems, callback, inv ) {var ret = [];// Go through the array, only saving the items// that pass the validator functionfor ( var i = 0, length = elems.length; i < length; i++ )if ( !inv && callback( elems[ i ], i ) || inv && !callback( elems[ i ], i ) )ret.push( elems[ i ] );return ret;},map: function( elems, callback ) {var ret = [];// Go through the array, translating each of the items to their// new value (or values).for ( var i = 0, length = elems.length; i < length; i++ ) {var value = callback( elems[ i ], i );if ( value !== null && value != undefined ) {if ( value.constructor != Array )value = [ value ];ret = ret.concat( value );}}return ret;}});var userAgent = navigator.userAgent.toLowerCase();// Figure out what browser is being usedjQuery.browser = {version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [])[1],safari: /webkit/.test( userAgent ),opera: /opera/.test( userAgent ),msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ),mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent )};var styleFloat = jQuery.browser.msie ?"styleFloat" :"cssFloat";jQuery.extend({// Check to see if the W3C box model is being usedboxModel: !jQuery.browser.msie || document.compatMode == "CSS1Compat",props: {"for": "htmlFor","class": "className","float": styleFloat,cssFloat: styleFloat,styleFloat: styleFloat,innerHTML: "innerHTML",className: "className",value: "value",disabled: "disabled",checked: "checked",readonly: "readOnly",selected: "selected",maxlength: "maxLength",selectedIndex: "selectedIndex",defaultValue: "defaultValue",tagName: "tagName",nodeName: "nodeName"}});jQuery.each({parent: function(elem){return elem.parentNode;},parents: function(elem){return jQuery.dir(elem,"parentNode");},next: function(elem){return jQuery.nth(elem,2,"nextSibling");},prev: function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll: function(elem){return jQuery.dir(elem,"nextSibling");},prevAll: function(elem){return jQuery.dir(elem,"previousSibling");},siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children: function(elem){return jQuery.sibling(elem.firstChild);},contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}}, function(name, fn){jQuery.fn[ name ] = function( selector ) {var ret = jQuery.map( this, fn );if ( selector && typeof selector == "string" )ret = jQuery.multiFilter( selector, ret );return this.pushStack( jQuery.unique( ret ) );};});jQuery.each({appendTo: "append",prependTo: "prepend",insertBefore: "before",insertAfter: "after",replaceAll: "replaceWith"}, function(name, original){jQuery.fn[ name ] = function() {var args = arguments;return this.each(function(){for ( var i = 0, length = args.length; i < length; i++ )jQuery( args[ i ] )[ original ]( this );});};});jQuery.each({removeAttr: function( name ) {jQuery.attr( this, name, "" );if (this.nodeType == 1)this.removeAttribute( name );},addClass: function( classNames ) {jQuery.className.add( this, classNames );},removeClass: function( classNames ) {jQuery.className.remove( this, classNames );},toggleClass: function( classNames ) {jQuery.className[ jQuery.className.has( this, classNames ) ? "remove" : "add" ]( this, classNames );},remove: function( selector ) {if ( !selector || jQuery.filter( selector, [ this ] ).r.length ) {// Prevent memory leaksjQuery( "*", this ).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if (this.parentNode)this.parentNode.removeChild( this );}},empty: function() {// Remove element nodes and prevent memory leaksjQuery( ">*", this ).remove();// Remove any remaining nodeswhile ( this.firstChild )this.removeChild( this.firstChild );}}, function(name, fn){jQuery.fn[ name ] = function(){return this.each( fn, arguments );};});jQuery.each([ "Height", "Width" ], function(i, name){var type = name.toLowerCase();jQuery.fn[ type ] = function( size ) {// Get window width or heightreturn this[0] == window ?// Opera reports document.body.client[Width/Height] properly in both quirks and standardsjQuery.browser.opera && document.body[ "client" + name ] ||// Safari reports inner[Width/Height] just fine (Mozilla and Opera include scroll bar widths)jQuery.browser.safari && window[ "inner" + name ] ||// Everyone else use document.documentElement or document.body depending on Quirks vs Standards modedocument.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || document.body[ "client" + name ] :// Get document width or heightthis[0] == document ?// Either scroll[Width/Height] or offset[Width/Height], whichever is greaterMath.max(Math.max(document.body["scroll" + name], document.documentElement["scroll" + name]),Math.max(document.body["offset" + name], document.documentElement["offset" + name])) :// Get or set width or height on the elementsize == undefined ?// Get width or height on the element(this.length ? jQuery.css( this[0], type ) : null) :// Set the width or height on the element (default to pixels if value is unitless)this.css( type, size.constructor == String ? size : size + "px" );};});var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ?"(?:[\\w*_-]|\\\\.)" :"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild = new RegExp("^>\\s*(" + chars + "+)"),quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"),quickClass = new RegExp("^([#.]?)(" + chars + "*)");jQuery.extend({expr: {"": function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#": function(a,i,m){return a.getAttribute("id")==m[2];},":": {// Position Checkslt: function(a,i,m){return i<m[3]-0;},gt: function(a,i,m){return i>m[3]-0;},nth: function(a,i,m){return m[3]-0==i;},eq: function(a,i,m){return m[3]-0==i;},first: function(a,i){return i==0;},last: function(a,i,m,r){return i==r.length-1;},even: function(a,i){return i%2==0;},odd: function(a,i){return i%2;},// Child Checks"first-child": function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child": function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child": function(a){return !jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},// Parent Checksparent: function(a){return a.firstChild;},empty: function(a){return !a.firstChild;},// Text Checkcontains: function(a,i,m){return (a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},// Visibilityvisible: function(a){return "hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden: function(a){return "hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},// Form attributesenabled: function(a){return !a.disabled;},disabled: function(a){return a.disabled;},checked: function(a){return a.checked;},selected: function(a){return a.selected||jQuery.attr(a,"selected");},// Form elementstext: function(a){return "text"==a.type;},radio: function(a){return "radio"==a.type;},checkbox: function(a){return "checkbox"==a.type;},file: function(a){return "file"==a.type;},password: function(a){return "password"==a.type;},submit: function(a){return "submit"==a.type;},image: function(a){return "image"==a.type;},reset: function(a){return "reset"==a.type;},button: function(a){return "button"==a.type||jQuery.nodeName(a,"button");},input: function(a){return /input|select|textarea|button/i.test(a.nodeName);},// :has()has: function(a,i,m){return jQuery.find(m[3],a).length;},// :headerheader: function(a){return /h\d/i.test(a.nodeName);},// :animatedanimated: function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},// The regular expressions that power the parsing engineparse: [// Match: [@value='test'], [@foo]/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,// Match: :contains('foo')/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,// Match: :even, :last-chlid, #id, .classnew RegExp("^([:.#]*)(" + chars + "+)")],multiFilter: function( expr, elems, not ) {var old, cur = [];while ( expr && expr != old ) {old = expr;var f = jQuery.filter( expr, elems, not );expr = f.t.replace(/^\s*,\s*/, "" );cur = not ? elems = f.r : jQuery.merge( cur, f.r );}return cur;},find: function( t, context ) {// Quickly handle non-string expressionsif ( typeof t != "string" )return [ t ];// check to make sure context is a DOM element or a documentif ( context && context.nodeType != 1 && context.nodeType != 9)return [ ];// Set the correct context (if none is provided)context = context || document;// Initialize the searchvar ret = [context], done = [], last, nodeName;// Continue while a selector expression exists, and while// we're no longer looping upon ourselveswhile ( t && last != t ) {var r = [];last = t;t = jQuery.trim(t);var foundToken = false;// An attempt at speeding up child selectors that// point to a specific element tagvar re = quickChild;var m = re.exec(t);if ( m ) {nodeName = m[1].toUpperCase();// Perform our own iteration and filterfor ( var i = 0; ret[i]; i++ )for ( var c = ret[i].firstChild; c; c = c.nextSibling )if ( c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName) )r.push( c );ret = r;t = t.replace( re, "" );if ( t.indexOf(" ") == 0 ) continue;foundToken = true;} else {re = /^([>+~])\s*(\w*)/i;if ( (m = re.exec(t)) != null ) {r = [];var merge = {};nodeName = m[2].toUpperCase();m = m[1];for ( var j = 0, rl = ret.length; j < rl; j++ ) {var n = m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild;for ( ; n; n = n.nextSibling )if ( n.nodeType == 1 ) {var id = jQuery.data(n);if ( m == "~" && merge[id] ) break;if (!nodeName || n.nodeName.toUpperCase() == nodeName ) {if ( m == "~" ) merge[id] = true;r.push( n );}if ( m == "+" ) break;}}ret = r;// And remove the tokent = jQuery.trim( t.replace( re, "" ) );foundToken = true;}}// See if there's still an expression, and that we haven't already// matched a tokenif ( t && !foundToken ) {// Handle multiple expressionsif ( !t.indexOf(",") ) {// Clean the result setif ( context == ret[0] ) ret.shift();// Merge the result setsdone = jQuery.merge( done, ret );// Reset the contextr = ret = [context];// Touch up the selector stringt = " " + t.substr(1,t.length);} else {// Optimize for the case nodeName#idNamevar re2 = quickID;var m = re2.exec(t);// Re-organize the results, so that they're consistentif ( m ) {m = [ 0, m[2], m[3], m[1] ];} else {// Otherwise, do a traditional filter check for// ID, class, and element selectorsre2 = quickClass;m = re2.exec(t);}m[2] = m[2].replace(/\\/g, "");var elem = ret[ret.length-1];// Try to do a global search by ID, where we canif ( m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem) ) {// Optimization for HTML document casevar oid = elem.getElementById(m[2]);// Do a quick check for the existence of the actual ID attribute// to avoid selecting by the name attribute in IE// also check to insure id is a string to avoid selecting an element with the name of 'id' inside a formif ( (jQuery.browser.msie||jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2] )oid = jQuery('[@id="'+m[2]+'"]', elem)[0];// Do a quick check for node name (where applicable) so// that div#foo searches will be really fastret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : [];} else {// We need to find all descendant elementsfor ( var i = 0; ret[i]; i++ ) {// Grab the tag name being searched forvar tag = m[1] == "#" && m[3] ? m[3] : m[1] != "" || m[0] == "" ? "*" : m[2];// Handle IE7 being really dumb about <object>sif ( tag == "*" && ret[i].nodeName.toLowerCase() == "object" )tag = "param";r = jQuery.merge( r, ret[i].getElementsByTagName( tag ));}// It's faster to filter by class and be done with itif ( m[1] == "." )r = jQuery.classFilter( r, m[2] );// Same with ID filteringif ( m[1] == "#" ) {var tmp = [];// Try to find the element with the IDfor ( var i = 0; r[i]; i++ )if ( r[i].getAttribute("id") == m[2] ) {tmp = [ r[i] ];break;}r = tmp;}ret = r;}t = t.replace( re2, "" );}}// If a selector string still existsif ( t ) {// Attempt to filter itvar val = jQuery.filter(t,r);ret = r = val.r;t = jQuery.trim(val.t);}}// An error occurred with the selector;// just return an empty set insteadif ( t )ret = [];// Remove the root contextif ( ret && context == ret[0] )ret.shift();// And combine the resultsdone = jQuery.merge( done, ret );return done;},classFilter: function(r,m,not){m = " " + m + " ";var tmp = [];for ( var i = 0; r[i]; i++ ) {var pass = (" " + r[i].className + " ").indexOf( m ) >= 0;if ( !not && pass || not && !pass )tmp.push( r[i] );}return tmp;},filter: function(t,r,not) {var last;// Look for common filter expressionswhile ( t && t != last ) {last = t;var p = jQuery.parse, m;for ( var i = 0; p[i]; i++ ) {m = p[i].exec( t );if ( m ) {// Remove what we just matchedt = t.substring( m[0].length );m[2] = m[2].replace(/\\/g, "");break;}}if ( !m )break;// :not() is a special case that can be optimized by// keeping it out of the expression listif ( m[1] == ":" && m[2] == "not" )// optimize if only one selector found (most common case)r = isSimple.test( m[3] ) ?jQuery.filter(m[3], r, true).r :jQuery( r ).not( m[3] );// We can get a big speed boost by filtering by class hereelse if ( m[1] == "." )r = jQuery.classFilter(r, m[2], not);else if ( m[1] == "[" ) {var tmp = [], type = m[3];for ( var i = 0, rl = r.length; i < rl; i++ ) {var a = r[i], z = a[ jQuery.props[m[2]] || m[2] ];if ( z == null || /href|src|selected/.test(m[2]) )z = jQuery.attr(a,m[2]) || '';if ( (type == "" && !!z ||type == "=" && z == m[5] ||type == "!=" && z != m[5] ||type == "^=" && z && !z.indexOf(m[5]) ||type == "$=" && z.substr(z.length - m[5].length) == m[5] ||(type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not )tmp.push( a );}r = tmp;// We can get a speed boost by handling nth-child here} else if ( m[1] == ":" && m[2] == "nth-child" ) {var merge = {}, tmp = [],// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" ||!/\D/.test(m[3]) && "0n+" + m[3] || m[3]),// calculate the numbers (first)n+(last) including if they are negativefirst = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;// loop through all the elements left in the jQuery objectfor ( var i = 0, rl = r.length; i < rl; i++ ) {var node = r[i], parentNode = node.parentNode, id = jQuery.data(parentNode);if ( !merge[id] ) {var c = 1;for ( var n = parentNode.firstChild; n; n = n.nextSibling )if ( n.nodeType == 1 )n.nodeIndex = c++;merge[id] = true;}var add = false;if ( first == 0 ) {if ( node.nodeIndex == last )add = true;} else if ( (node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0 )add = true;if ( add ^ not )tmp.push( node );}r = tmp;// Otherwise, find the expression to execute} else {var fn = jQuery.expr[ m[1] ];if ( typeof fn == "object" )fn = fn[ m[2] ];if ( typeof fn == "string" )fn = eval("false||function(a,i){return " + fn + ";}");// Execute it against the current filterr = jQuery.grep( r, function(elem, i){return fn(elem, i, m, r);}, not );}}// Return an array of filtered elements (r)// and the modified expression string (t)return { r: r, t: t };},dir: function( elem, dir ){var matched = [];var cur = elem[dir];while ( cur && cur != document ) {if ( cur.nodeType == 1 )matched.push( cur );cur = cur[dir];}return matched;},nth: function(cur,result,dir,elem){result = result || 1;var num = 0;for ( ; cur; cur = cur[dir] )if ( cur.nodeType == 1 && ++num == result )break;return cur;},sibling: function( n, elem ) {var r = [];for ( ; n; n = n.nextSibling ) {if ( n.nodeType == 1 && (!elem || n != elem) )r.push( n );}return r;}});/** A number of helper functions used for managing events.* Many of the ideas behind this code orignated from* Dean Edwards' addEvent library.*/jQuery.event = {// Bind an event to an element// Original by Dean Edwardsadd: function(elem, types, handler, data) {if ( elem.nodeType == 3 || elem.nodeType == 8 )return;// For whatever reason, IE has trouble passing the window object// around, causing it to be cloned in the processif ( jQuery.browser.msie && elem.setInterval != undefined )elem = window;// Make sure that the function being executed has a unique IDif ( !handler.guid )handler.guid = this.guid++;// if data is passed, bind to handlerif( data != undefined ) {// Create temporary function pointer to original handlervar fn = handler;// Create unique handler function, wrapped around original handlerhandler = function() {// Pass arguments and context to original handlerreturn fn.apply(this, arguments);};// Store data in unique handlerhandler.data = data;// Set the guid of unique handler to the same of original handler, so it can be removedhandler.guid = fn.guid;}// Init the element's event structurevar events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}),handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){// returned undefined or falsevar val;// Handle the second event of a trigger and when// an event is called after a page has unloadedif ( typeof jQuery == "undefined" || jQuery.event.triggered )return val;val = jQuery.event.handle.apply(arguments.callee.elem, arguments);return val;});// Add elem as a property of the handle function// This is to prevent a memory leak with non-native// event in IE.handle.elem = elem;// Handle multiple events seperated by a space// jQuery(...).bind("mouseover mouseout", fn);jQuery.each(types.split(/\s+/), function(index, type) {// Namespaced event handlersvar parts = type.split(".");type = parts[0];handler.type = parts[1];// Get the current list of functions bound to this eventvar handlers = events[type];// Init the event handler queueif (!handlers) {handlers = events[type] = {};// Check for a special event handler// Only use addEventListener/attachEvent if the special// events handler returns falseif ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem) === false ) {// Bind the global event handler to the elementif (elem.addEventListener)elem.addEventListener(type, handle, false);else if (elem.attachEvent)elem.attachEvent("on" + type, handle);}}// Add the function to the element's handler listhandlers[handler.guid] = handler;// Keep track of which events have been used, for global triggeringjQuery.event.global[type] = true;});// Nullify elem to prevent memory leaks in IEelem = null;},guid: 1,global: {},// Detach an event or set of events from an elementremove: function(elem, types, handler) {// don't do events on text and comment nodesif ( elem.nodeType == 3 || elem.nodeType == 8 )return;var events = jQuery.data(elem, "events"), ret, index;if ( events ) {// Unbind all events for the elementif ( types == undefined || (typeof types == "string" && types.charAt(0) == ".") )for ( var type in events )this.remove( elem, type + (types || "") );else {// types is actually an event object hereif ( types.type ) {handler = types.handler;types = types.type;}// Handle multiple events seperated by a space// jQuery(...).unbind("mouseover mouseout", fn);jQuery.each(types.split(/\s+/), function(index, type){// Namespaced event handlersvar parts = type.split(".");type = parts[0];if ( events[type] ) {// remove the given handler for the given typeif ( handler )delete events[type][handler.guid];// remove all handlers for the given typeelsefor ( handler in events[type] )// Handle the removal of namespaced eventsif ( !parts[1] || events[type][handler].type == parts[1] )delete events[type][handler];// remove generic event handler if no more handlers existfor ( ret in events[type] ) break;if ( !ret ) {if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem) === false ) {if (elem.removeEventListener)elem.removeEventListener(type, jQuery.data(elem, "handle"), false);else if (elem.detachEvent)elem.detachEvent("on" + type, jQuery.data(elem, "handle"));}ret = null;delete events[type];}}});}// Remove the expando if it's no longer usedfor ( ret in events ) break;if ( !ret ) {var handle = jQuery.data( elem, "handle" );if ( handle ) handle.elem = null;jQuery.removeData( elem, "events" );jQuery.removeData( elem, "handle" );}}},trigger: function(type, data, elem, donative, extra) {// Clone the incoming data, if anydata = jQuery.makeArray(data || []);if ( type.indexOf("!") >= 0 ) {type = type.slice(0, -1);var exclusive = true;}// Handle a global triggerif ( !elem ) {// Only trigger if we've ever bound an event for itif ( this.global[type] )jQuery("*").add([window, document]).trigger(type, data);// Handle triggering a single element} else {// don't do events on text and comment nodesif ( elem.nodeType == 3 || elem.nodeType == 8 )return undefined;var val, ret, fn = jQuery.isFunction( elem[ type ] || null ),// Check to see if we need to provide a fake event, or notevent = !data[0] || !data[0].preventDefault;// Pass along a fake eventif ( event )data.unshift( this.fix({ type: type, target: elem }) );// Enforce the right trigger typedata[0].type = type;if ( exclusive )data[0].exclusive = true;// Trigger the eventif ( jQuery.isFunction( jQuery.data(elem, "handle") ) )val = jQuery.data(elem, "handle").apply( elem, data );// Handle triggering native .onfoo handlersif ( !fn && elem["on"+type] && elem["on"+type].apply( elem, data ) === false )val = false;// Extra functions don't get the custom event objectif ( event )data.shift();// Handle triggering of extra functionif ( extra && jQuery.isFunction( extra ) ) {// call the extra function and tack the current return value on the end for possible inspectionret = extra.apply( elem, val == null ? data : data.concat( val ) );// if anything is returned, give it precedence and have it overwrite the previous valueif (ret !== undefined)val = ret;}// Trigger the native events (except for clicks on links)if ( fn && donative !== false && val !== false && !(jQuery.nodeName(elem, 'a') && type == "click") ) {this.triggered = true;try {elem[ type ]();// prevent IE from throwing an error for some hidden elements} catch (e) {}}this.triggered = false;}return val;},handle: function(event) {// returned undefined or falsevar val;// Empty object is for triggered events with no dataevent = jQuery.event.fix( event || window.event || {} );// Namespaced event handlersvar parts = event.type.split(".");event.type = parts[0];var handlers = jQuery.data(this, "events") && jQuery.data(this, "events")[event.type], args = Array.prototype.slice.call( arguments, 1 );args.unshift( event );for ( var j in handlers ) {var handler = handlers[j];// Pass in a reference to the handler function itself// So that we can later remove itargs[0].handler = handler;args[0].data = handler.data;// Filter the functions by classif ( !parts[1] && !event.exclusive || handler.type == parts[1] ) {var ret = handler.apply( this, args );if ( val !== false )val = ret;if ( ret === false ) {event.preventDefault();event.stopPropagation();}}}// Clean up added properties in IE to prevent memory leakif (jQuery.browser.msie)event.target = event.preventDefault = event.stopPropagation =event.handler = event.data = null;return val;},fix: function(event) {// store a copy of the original event object// and clone to set read-only propertiesvar originalEvent = event;event = jQuery.extend({}, originalEvent);// add preventDefault and stopPropagation since// they will not work on the cloneevent.preventDefault = function() {// if preventDefault exists run it on the original eventif (originalEvent.preventDefault)originalEvent.preventDefault();// otherwise set the returnValue property of the original event to false (IE)originalEvent.returnValue = false;};event.stopPropagation = function() {// if stopPropagation exists run it on the original eventif (originalEvent.stopPropagation)originalEvent.stopPropagation();// otherwise set the cancelBubble property of the original event to true (IE)originalEvent.cancelBubble = true;};// Fix target property, if necessaryif ( !event.target )event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either// check if target is a textnode (safari)if ( event.target.nodeType == 3 )event.target = originalEvent.target.parentNode;// Add relatedTarget, if necessaryif ( !event.relatedTarget && event.fromElement )event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement;// Calculate pageX/Y if missing and clientX/Y availableif ( event.pageX == null && event.clientX != null ) {var doc = document.documentElement, body = document.body;event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0);event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0);}// Add which for key eventsif ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) )event.which = event.charCode || event.keyCode;// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)if ( !event.metaKey && event.ctrlKey )event.metaKey = event.ctrlKey;// Add which for click: 1 == left; 2 == middle; 3 == right// Note: button is not normalized, so don't use itif ( !event.which && event.button )event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));return event;},special: {ready: {setup: function() {// Make sure the ready event is setupbindReady();return;},teardown: function() { return; }},mouseenter: {setup: function() {if ( jQuery.browser.msie ) return false;jQuery(this).bind("mouseover", jQuery.event.special.mouseenter.handler);return true;},teardown: function() {if ( jQuery.browser.msie ) return false;jQuery(this).unbind("mouseover", jQuery.event.special.mouseenter.handler);return true;},handler: function(event) {// If we actually just moused on to a sub-element, ignore itif ( withinElement(event, this) ) return true;// Execute the right handlers by setting the event type to mouseenterarguments[0].type = "mouseenter";return jQuery.event.handle.apply(this, arguments);}},mouseleave: {setup: function() {if ( jQuery.browser.msie ) return false;jQuery(this).bind("mouseout", jQuery.event.special.mouseleave.handler);return true;},teardown: function() {if ( jQuery.browser.msie ) return false;jQuery(this).unbind("mouseout", jQuery.event.special.mouseleave.handler);return true;},handler: function(event) {// If we actually just moused on to a sub-element, ignore itif ( withinElement(event, this) ) return true;// Execute the right handlers by setting the event type to mouseleavearguments[0].type = "mouseleave";return jQuery.event.handle.apply(this, arguments);}}}};jQuery.fn.extend({bind: function( type, data, fn ) {return type == "unload" ? this.one(type, data, fn) : this.each(function(){jQuery.event.add( this, type, fn || data, fn && data );});},one: function( type, data, fn ) {return this.each(function(){jQuery.event.add( this, type, function(event) {jQuery(this).unbind(event);return (fn || data).apply( this, arguments);}, fn && data);});},unbind: function( type, fn ) {return this.each(function(){jQuery.event.remove( this, type, fn );});},trigger: function( type, data, fn ) {return this.each(function(){jQuery.event.trigger( type, data, this, true, fn );});},triggerHandler: function( type, data, fn ) {if ( this[0] )return jQuery.event.trigger( type, data, this[0], false, fn );return undefined;},toggle: function() {// Save reference to arguments for access in closurevar args = arguments;return this.click(function(event) {// Figure out which function to executethis.lastToggle = 0 == this.lastToggle ? 1 : 0;// Make sure that clicks stopevent.preventDefault();// and execute the functionreturn args[this.lastToggle].apply( this, arguments ) || false;});},hover: function(fnOver, fnOut) {return this.bind('mouseenter', fnOver).bind('mouseleave', fnOut);},ready: function(fn) {// Attach the listenersbindReady();// If the DOM is already readyif ( jQuery.isReady )// Execute the function immediatelyfn.call( document, jQuery );// Otherwise, remember the function for laterelse// Add the function to the wait listjQuery.readyList.push( function() { return fn.call(this, jQuery); } );return this;}});jQuery.extend({isReady: false,readyList: [],// Handle when the DOM is readyready: function() {// Make sure that the DOM is not already loadedif ( !jQuery.isReady ) {// Remember that the DOM is readyjQuery.isReady = true;// If there are functions bound, to executeif ( jQuery.readyList ) {// Execute all of themjQuery.each( jQuery.readyList, function(){this.apply( document );});// Reset the list of functionsjQuery.readyList = null;}// Trigger any bound ready eventsjQuery(document).triggerHandler("ready");}}});var readyBound = false;function bindReady(){if ( readyBound ) return;readyBound = true;// Mozilla, Opera (see further below for it) and webkit nightlies currently support this eventif ( document.addEventListener && !jQuery.browser.opera)// Use the handy event callbackdocument.addEventListener( "DOMContentLoaded", jQuery.ready, false );// If IE is used and is not in a frame// Continually check to see if the document is readyif ( jQuery.browser.msie && window == top ) (function(){if (jQuery.isReady) return;try {// If IE is used, use the trick by Diego Perini// http://javascript.nwbox.com/IEContentLoaded/document.documentElement.doScroll("left");} catch( error ) {setTimeout( arguments.callee, 0 );return;}// and execute any waiting functionsjQuery.ready();})();if ( jQuery.browser.opera )document.addEventListener( "DOMContentLoaded", function () {if (jQuery.isReady) return;for (var i = 0; i < document.styleSheets.length; i++)if (document.styleSheets[i].disabled) {setTimeout( arguments.callee, 0 );return;}// and execute any waiting functionsjQuery.ready();}, false);if ( jQuery.browser.safari ) {var numStyles;(function(){if (jQuery.isReady) return;if ( document.readyState != "loaded" && document.readyState != "complete" ) {setTimeout( arguments.callee, 0 );return;}if ( numStyles === undefined )numStyles = jQuery("style, link[rel=stylesheet]").length;if ( document.styleSheets.length != numStyles ) {setTimeout( arguments.callee, 0 );return;}// and execute any waiting functionsjQuery.ready();})();}// A fallback to window.onload, that will always workjQuery.event.add( window, "load", jQuery.ready );}jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," +"mousedown,mouseup,mousemove,mouseover,mouseout,change,select," +"submit,keydown,keypress,keyup,error").split(","), function(i, name){// Handle event bindingjQuery.fn[name] = function(fn){return fn ? this.bind(name, fn) : this.trigger(name);};});// Checks if an event happened on an element within another element// Used in jQuery.event.special.mouseenter and mouseleave handlersvar withinElement = function(event, elem) {// Check if mouse(over|out) are still within the same parent elementvar parent = event.relatedTarget;// Traverse up the treewhile ( parent && parent != elem ) try { parent = parent.parentNode; } catch(error) { parent = elem; }// Return true if we actually just moused on to a sub-elementreturn parent == elem;};// Prevent memory leaks in IE// And prevent errors on refresh with events like mouseover in other browsers// Window isn't included so as not to unbind existing unload eventsjQuery(window).bind("unload", function() {jQuery("*").add(document).unbind();});jQuery.fn.extend({load: function( url, params, callback ) {if ( jQuery.isFunction( url ) )return this.bind("load", url);var off = url.indexOf(" ");if ( off >= 0 ) {var selector = url.slice(off, url.length);url = url.slice(0, off);}callback = callback || function(){};// Default to a GET requestvar type = "GET";// If the second parameter was providedif ( params )// If it's a functionif ( jQuery.isFunction( params ) ) {// We assume that it's the callbackcallback = params;params = null;// Otherwise, build a param string} else {params = jQuery.param( params );type = "POST";}var self = this;// Request the remote documentjQuery.ajax({url: url,type: type,dataType: "html",data: params,complete: function(res, status){// If successful, inject the HTML into all the matched elementsif ( status == "success" || status == "notmodified" )// See if a selector was specifiedself.html( selector ?// Create a dummy div to hold the resultsjQuery("<div/>")// inject the contents of the document in, removing the scripts// to avoid any 'Permission Denied' errors in IE.append(res.responseText.replace(/<script(.|\s)*?\/script>/g, ""))// Locate the specified elements.find(selector) :// If not, just inject the full resultres.responseText );self.each( callback, [res.responseText, status, res] );}});return this;},serialize: function() {return jQuery.param(this.serializeArray());},serializeArray: function() {return this.map(function(){return jQuery.nodeName(this, "form") ?jQuery.makeArray(this.elements) : this;}).filter(function(){return this.name && !this.disabled &&(this.checked || /select|textarea/i.test(this.nodeName) ||/text|hidden|password/i.test(this.type));}).map(function(i, elem){var val = jQuery(this).val();return val == null ? null :val.constructor == Array ?jQuery.map( val, function(val, i){return {name: elem.name, value: val};}) :{name: elem.name, value: val};}).get();}});// Attach a bunch of functions for handling common AJAX eventsjQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){jQuery.fn[o] = function(f){return this.bind(o, f);};});var jsc = (new Date).getTime();jQuery.extend({get: function( url, data, callback, type ) {// shift arguments if data argument was ommitedif ( jQuery.isFunction( data ) ) {callback = data;data = null;}return jQuery.ajax({type: "GET",url: url,data: data,success: callback,dataType: type});},getScript: function( url, callback ) {return jQuery.get(url, null, callback, "script");},getJSON: function( url, data, callback ) {return jQuery.get(url, data, callback, "json");},post: function( url, data, callback, type ) {if ( jQuery.isFunction( data ) ) {callback = data;data = {};}return jQuery.ajax({type: "POST",url: url,data: data,success: callback,dataType: type});},ajaxSetup: function( settings ) {jQuery.extend( jQuery.ajaxSettings, settings );},ajaxSettings: {global: true,type: "GET",timeout: 0,contentType: "application/x-www-form-urlencoded",processData: true,async: true,data: null,username: null,password: null,accepts: {xml: "application/xml, text/xml",html: "text/html",script: "text/javascript, application/javascript",json: "application/json, text/javascript",text: "text/plain",_default: "*/*"}},// Last-Modified header cache for next requestlastModified: {},ajax: function( s ) {var jsonp, jsre = /=\?(&|$)/g, status, data;// Extend the settings, but re-extend 's' so that it can be// checked again later (in the test suite, specifically)s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s));// convert data if not already a stringif ( s.data && s.processData && typeof s.data != "string" )s.data = jQuery.param(s.data);// Handle JSONP Parameter Callbacksif ( s.dataType == "jsonp" ) {if ( s.type.toLowerCase() == "get" ) {if ( !s.url.match(jsre) )s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?";} else if ( !s.data || !s.data.match(jsre) )s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";s.dataType = "json";}// Build temporary JSONP functionif ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) {jsonp = "jsonp" + jsc++;// Replace the =? sequence both in the query string and the dataif ( s.data )s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");s.url = s.url.replace(jsre, "=" + jsonp + "$1");// We need to make sure// that a JSONP style response is executed properlys.dataType = "script";// Handle JSONP-style loadingwindow[ jsonp ] = function(tmp){data = tmp;success();complete();// Garbage collectwindow[ jsonp ] = undefined;try{ delete window[ jsonp ]; } catch(e){}if ( head )head.removeChild( script );};}if ( s.dataType == "script" && s.cache == null )s.cache = false;if ( s.cache === false && s.type.toLowerCase() == "get" ) {var ts = (new Date()).getTime();// try replacing _= if it is therevar ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2");// if nothing was replaced, add timestamp to the ends.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : "");}// If data is available, append data to url for get requestsif ( s.data && s.type.toLowerCase() == "get" ) {s.url += (s.url.match(/\?/) ? "&" : "?") + s.data;// IE likes to send both get and post data, prevent thiss.data = null;}// Watch for a new set of requestsif ( s.global && ! jQuery.active++ )jQuery.event.trigger( "ajaxStart" );// If we're requesting a remote document// and trying to load JSON or Script with a GETif ( (!s.url.indexOf("http") || !s.url.indexOf("//")) && s.dataType == "script" && s.type.toLowerCase() == "get" ) {var head = document.getElementsByTagName("head")[0];var script = document.createElement("script");script.src = s.url;if (s.scriptCharset)script.charset = s.scriptCharset;// Handle Script loadingif ( !jsonp ) {var done = false;// Attach handlers for all browsersscript.onload = script.onreadystatechange = function(){if ( !done && (!this.readyState ||this.readyState == "loaded" || this.readyState == "complete") ) {done = true;success();complete();head.removeChild( script );}};}head.appendChild(script);// We handle everything using the script element injectionreturn undefined;}var requestDone = false;// Create the request object; Microsoft failed to properly// implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is availablevar xml = window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();// Open the socketxml.open(s.type, s.url, s.async, s.username, s.password);// Need an extra try/catch for cross domain requests in Firefox 3try {// Set the correct header, if data is being sentif ( s.data )xml.setRequestHeader("Content-Type", s.contentType);// Set the If-Modified-Since header, if ifModified mode.if ( s.ifModified )xml.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );// Set header so the called script knows that it's an XMLHttpRequestxml.setRequestHeader("X-Requested-With", "XMLHttpRequest");// Set the Accepts header for the server, depending on the dataTypexml.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?s.accepts[ s.dataType ] + ", */*" :s.accepts._default );} catch(e){}// Allow custom headers/mimetypesif ( s.beforeSend )s.beforeSend(xml);if ( s.global )jQuery.event.trigger("ajaxSend", [xml, s]);// Wait for a response to come backvar onreadystatechange = function(isTimeout){// The transfer is complete and the data is available, or the request timed outif ( !requestDone && xml && (xml.readyState == 4 || isTimeout == "timeout") ) {requestDone = true;// clear poll intervalif (ival) {clearInterval(ival);ival = null;}status = isTimeout == "timeout" && "timeout" ||!jQuery.httpSuccess( xml ) && "error" ||s.ifModified && jQuery.httpNotModified( xml, s.url ) && "notmodified" ||"success";if ( status == "success" ) {// Watch for, and catch, XML document parse errorstry {// process the data (runs the xml through httpData regardless of callback)data = jQuery.httpData( xml, s.dataType );} catch(e) {status = "parsererror";}}// Make sure that the request was successful or notmodifiedif ( status == "success" ) {// Cache Last-Modified header, if ifModified mode.var modRes;try {modRes = xml.getResponseHeader("Last-Modified");} catch(e) {} // swallow exception thrown by FF if header is not availableif ( s.ifModified && modRes )jQuery.lastModified[s.url] = modRes;// JSONP handles its own success callbackif ( !jsonp )success();} elsejQuery.handleError(s, xml, status);// Fire the complete handlerscomplete();// Stop memory leaksif ( s.async )xml = null;}};if ( s.async ) {// don't attach the handler to the request, just poll it insteadvar ival = setInterval(onreadystatechange, 13);// Timeout checkerif ( s.timeout > 0 )setTimeout(function(){// Check to see if the request is still happeningif ( xml ) {// Cancel the requestxml.abort();if( !requestDone )onreadystatechange( "timeout" );}}, s.timeout);}// Send the datatry {xml.send(s.data);} catch(e) {jQuery.handleError(s, xml, null, e);}// firefox 1.5 doesn't fire statechange for sync requestsif ( !s.async )onreadystatechange();function success(){// If a local callback was specified, fire it and pass it the dataif ( s.success )s.success( data, status );// Fire the global callbackif ( s.global )jQuery.event.trigger( "ajaxSuccess", [xml, s] );}function complete(){// Process resultif ( s.complete )s.complete(xml, status);// The request was completedif ( s.global )jQuery.event.trigger( "ajaxComplete", [xml, s] );// Handle the global AJAX counterif ( s.global && ! --jQuery.active )jQuery.event.trigger( "ajaxStop" );}// return XMLHttpRequest to allow aborting the request etc.return xml;},handleError: function( s, xml, status, e ) {// If a local callback was specified, fire itif ( s.error ) s.error( xml, status, e );// Fire the global callbackif ( s.global )jQuery.event.trigger( "ajaxError", [xml, s, e] );},// Counter for holding the number of active queriesactive: 0,// Determines if an XMLHttpRequest was successful or nothttpSuccess: function( r ) {try {// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450return !r.status && location.protocol == "file:" ||( r.status >= 200 && r.status < 300 ) || r.status == 304 || r.status == 1223 ||jQuery.browser.safari && r.status == undefined;} catch(e){}return false;},// Determines if an XMLHttpRequest returns NotModifiedhttpNotModified: function( xml, url ) {try {var xmlRes = xml.getResponseHeader("Last-Modified");// Firefox always returns 200. check Last-Modified datereturn xml.status == 304 || xmlRes == jQuery.lastModified[url] ||jQuery.browser.safari && xml.status == undefined;} catch(e){}return false;},httpData: function( r, type ) {var ct = r.getResponseHeader("content-type");var xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0;var data = xml ? r.responseXML : r.responseText;if ( xml && data.documentElement.tagName == "parsererror" )throw "parsererror";// If the type is "script", eval it in global contextif ( type == "script" )jQuery.globalEval( data );// Get the JavaScript object, if JSON is used.if ( type == "json" )data = eval("(" + data + ")");return data;},// Serialize an array of form elements or a set of// key/values into a query stringparam: function( a ) {var s = [];// If an array was passed in, assume that it is an array// of form elementsif ( a.constructor == Array || a.jquery )// Serialize the form elementsjQuery.each( a, function(){s.push( encodeURIComponent(this.name) + "=" + encodeURIComponent( this.value ) );});// Otherwise, assume that it's an object of key/value pairselse// Serialize the key/valuesfor ( var j in a )// If the value is an array then the key names need to be repeatedif ( a[j] && a[j].constructor == Array )jQuery.each( a[j], function(){s.push( encodeURIComponent(j) + "=" + encodeURIComponent( this ) );});elses.push( encodeURIComponent(j) + "=" + encodeURIComponent( a[j] ) );// Return the resulting serializationreturn s.join("&").replace(/%20/g, "+");}});jQuery.fn.extend({show: function(speed,callback){return speed ?this.animate({height: "show", width: "show", opacity: "show"}, speed, callback) :this.filter(":hidden").each(function(){this.style.display = this.oldblock || "";if ( jQuery.css(this,"display") == "none" ) {var elem = jQuery("<" + this.tagName + " />").appendTo("body");this.style.display = elem.css("display");// handle an edge condition where css is - div { display:none; } or similarif (this.style.display == "none")this.style.display = "block";elem.remove();}}).end();},hide: function(speed,callback){return speed ?this.animate({height: "hide", width: "hide", opacity: "hide"}, speed, callback) :this.filter(":visible").each(function(){this.oldblock = this.oldblock || jQuery.css(this,"display");this.style.display = "none";}).end();},// Save the old toggle function_toggle: jQuery.fn.toggle,toggle: function( fn, fn2 ){return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ?this._toggle( fn, fn2 ) :fn ?this.animate({height: "toggle", width: "toggle", opacity: "toggle"}, fn, fn2) :this.each(function(){jQuery(this)[ jQuery(this).is(":hidden") ? "show" : "hide" ]();});},slideDown: function(speed,callback){return this.animate({height: "show"}, speed, callback);},slideUp: function(speed,callback){return this.animate({height: "hide"}, speed, callback);},slideToggle: function(speed, callback){return this.animate({height: "toggle"}, speed, callback);},fadeIn: function(speed, callback){return this.animate({opacity: "show"}, speed, callback);},fadeOut: function(speed, callback){return this.animate({opacity: "hide"}, speed, callback);},fadeTo: function(speed,to,callback){return this.animate({opacity: to}, speed, callback);},animate: function( prop, speed, easing, callback ) {var optall = jQuery.speed(speed, easing, callback);return this[ optall.queue === false ? "each" : "queue" ](function(){if ( this.nodeType != 1)return false;var opt = jQuery.extend({}, optall);var hidden = jQuery(this).is(":hidden"), self = this;for ( var p in prop ) {if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden )return jQuery.isFunction(opt.complete) && opt.complete.apply(this);if ( p == "height" || p == "width" ) {// Store display propertyopt.display = jQuery.css(this, "display");// Make sure that nothing sneaks outopt.overflow = this.style.overflow;}}if ( opt.overflow != null )this.style.overflow = "hidden";opt.curAnim = jQuery.extend({}, prop);jQuery.each( prop, function(name, val){var e = new jQuery.fx( self, opt, name );if ( /toggle|show|hide/.test(val) )e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop );else {var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start = e.cur(true) || 0;if ( parts ) {var end = parseFloat(parts[2]),unit = parts[3] || "px";// We need to compute starting valueif ( unit != "px" ) {self.style[ name ] = (end || 1) + unit;start = ((end || 1) / e.cur(true)) * start;self.style[ name ] = start + unit;}// If a +=/-= token was provided, we're doing a relative animationif ( parts[1] )end = ((parts[1] == "-=" ? -1 : 1) * end) + start;e.custom( start, end, unit );} elsee.custom( start, val, "" );}});// For JS strict compliancereturn true;});},queue: function(type, fn){if ( jQuery.isFunction(type) || ( type && type.constructor == Array )) {fn = type;type = "fx";}if ( !type || (typeof type == "string" && !fn) )return queue( this[0], type );return this.each(function(){if ( fn.constructor == Array )queue(this, type, fn);else {queue(this, type).push( fn );if ( queue(this, type).length == 1 )fn.apply(this);}});},stop: function(clearQueue, gotoEnd){var timers = jQuery.timers;if (clearQueue)this.queue([]);this.each(function(){// go in reverse order so anything added to the queue during the loop is ignoredfor ( var i = timers.length - 1; i >= 0; i-- )if ( timers[i].elem == this ) {if (gotoEnd)// force the next step to be the lasttimers[i](true);timers.splice(i, 1);}});// start the next in the queue if the last step wasn't forcedif (!gotoEnd)this.dequeue();return this;}});var queue = function( elem, type, array ) {if ( !elem )return undefined;type = type || "fx";var q = jQuery.data( elem, type + "queue" );if ( !q || array )q = jQuery.data( elem, type + "queue",array ? jQuery.makeArray(array) : [] );return q;};jQuery.fn.dequeue = function(type){type = type || "fx";return this.each(function(){var q = queue(this, type);q.shift();if ( q.length )q[0].apply( this );});};jQuery.extend({speed: function(speed, easing, fn) {var opt = speed && speed.constructor == Object ? speed : {complete: fn || !fn && easing ||jQuery.isFunction( speed ) && speed,duration: speed,easing: fn && easing || easing && easing.constructor != Function && easing};opt.duration = (opt.duration && opt.duration.constructor == Number ?opt.duration :{ slow: 600, fast: 200 }[opt.duration]) || 400;// Queueingopt.old = opt.complete;opt.complete = function(){if ( opt.queue !== false )jQuery(this).dequeue();if ( jQuery.isFunction( opt.old ) )opt.old.apply( this );};return opt;},easing: {linear: function( p, n, firstNum, diff ) {return firstNum + diff * p;},swing: function( p, n, firstNum, diff ) {return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;}},timers: [],timerId: null,fx: function( elem, options, prop ){this.options = options;this.elem = elem;this.prop = prop;if ( !options.orig )options.orig = {};}});jQuery.fx.prototype = {// Simple function for setting a style valueupdate: function(){if ( this.options.step )this.options.step.apply( this.elem, [ this.now, this ] );(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );// Set display property to block for height/width animationsif ( this.prop == "height" || this.prop == "width" )this.elem.style.display = "block";},// Get the current sizecur: function(force){if ( this.elem[this.prop] != null && this.elem.style[this.prop] == null )return this.elem[ this.prop ];var r = parseFloat(jQuery.css(this.elem, this.prop, force));return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;},// Start an animation from one number to anothercustom: function(from, to, unit){this.startTime = (new Date()).getTime();this.start = from;this.end = to;this.unit = unit || this.unit || "px";this.now = this.start;this.pos = this.state = 0;this.update();var self = this;function t(gotoEnd){return self.step(gotoEnd);}t.elem = this.elem;jQuery.timers.push(t);if ( jQuery.timerId == null ) {jQuery.timerId = setInterval(function(){var timers = jQuery.timers;for ( var i = 0; i < timers.length; i++ )if ( !timers[i]() )timers.splice(i--, 1);if ( !timers.length ) {clearInterval( jQuery.timerId );jQuery.timerId = null;}}, 13);}},// Simple 'show' functionshow: function(){// Remember where we started, so that we can go back to it laterthis.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );this.options.show = true;// Begin the animationthis.custom(0, this.cur());// Make sure that we start at a small width/height to avoid any// flash of contentif ( this.prop == "width" || this.prop == "height" )this.elem.style[this.prop] = "1px";// Start by showing the elementjQuery(this.elem).show();},// Simple 'hide' functionhide: function(){// Remember where we started, so that we can go back to it laterthis.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop );this.options.hide = true;// Begin the animationthis.custom(this.cur(), 0);},// Each step of an animationstep: function(gotoEnd){var t = (new Date()).getTime();if ( gotoEnd || t > this.options.duration + this.startTime ) {this.now = this.end;this.pos = this.state = 1;this.update();this.options.curAnim[ this.prop ] = true;var done = true;for ( var i in this.options.curAnim )if ( this.options.curAnim[i] !== true )done = false;if ( done ) {if ( this.options.display != null ) {// Reset the overflowthis.elem.style.overflow = this.options.overflow;// Reset the displaythis.elem.style.display = this.options.display;if ( jQuery.css(this.elem, "display") == "none" )this.elem.style.display = "block";}// Hide the element if the "hide" operation was doneif ( this.options.hide )this.elem.style.display = "none";// Reset the properties, if the item has been hidden or shownif ( this.options.hide || this.options.show )for ( var p in this.options.curAnim )jQuery.attr(this.elem.style, p, this.options.orig[p]);}// If a callback was provided, execute itif ( done && jQuery.isFunction( this.options.complete ) )// Execute the complete functionthis.options.complete.apply( this.elem );return false;} else {var n = t - this.startTime;this.state = n / this.options.duration;// Perform the easing function, defaults to swingthis.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration);this.now = this.start + ((this.end - this.start) * this.pos);// Perform the next step of the animationthis.update();}return true;}};jQuery.fx.step = {scrollLeft: function(fx){fx.elem.scrollLeft = fx.now;},scrollTop: function(fx){fx.elem.scrollTop = fx.now;},opacity: function(fx){jQuery.attr(fx.elem.style, "opacity", fx.now);},_default: function(fx){fx.elem.style[ fx.prop ] = fx.now + fx.unit;}};// The Offset Method// Originally By Brandon Aaron, part of the Dimension Plugin// http://jquery.com/plugins/project/dimensionsjQuery.fn.offset = function() {var left = 0, top = 0, elem = this[0], results;if ( elem ) with ( jQuery.browser ) {var parent = elem.parentNode,offsetChild = elem,offsetParent = elem.offsetParent,doc = elem.ownerDocument,safari2 = safari && parseInt(version) < 522 && !/adobeair/i.test(userAgent),fixed = jQuery.css(elem, "position") == "fixed";// Use getBoundingClientRect if availableif ( elem.getBoundingClientRect ) {var box = elem.getBoundingClientRect();// Add the document scroll offsetsadd(box.left + Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),box.top + Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));// IE adds the HTML element's border, by default it is medium which is 2px// IE 6 and 7 quirks mode the border width is overwritable by the following css html { border: 0; }// IE 7 standards mode, the border is always 2px// This border/offset is typically represented by the clientLeft and clientTop properties// However, in IE6 and 7 quirks mode the clientLeft and clientTop properties are not updated when overwriting it via CSS// Therefore this method will be off by 2px in IE while in quirksmodeadd( -doc.documentElement.clientLeft, -doc.documentElement.clientTop );// Otherwise loop through the offsetParents and parentNodes} else {// Initial element offsetsadd( elem.offsetLeft, elem.offsetTop );// Get parent offsetswhile ( offsetParent ) {// Add offsetParent offsetsadd( offsetParent.offsetLeft, offsetParent.offsetTop );// Mozilla and Safari > 2 does not include the border on offset parents// However Mozilla adds the border for table or table cellsif ( mozilla && !/^t(able|d|h)$/i.test(offsetParent.tagName) || safari && !safari2 )border( offsetParent );// Add the document scroll offsets if position is fixed on any offsetParentif ( !fixed && jQuery.css(offsetParent, "position") == "fixed" )fixed = true;// Set offsetChild to previous offsetParent unless it is the body elementoffsetChild = /^body$/i.test(offsetParent.tagName) ? offsetChild : offsetParent;// Get next offsetParentoffsetParent = offsetParent.offsetParent;}// Get parent scroll offsetswhile ( parent && parent.tagName && !/^body|html$/i.test(parent.tagName) ) {// Remove parent scroll UNLESS that parent is inline or a table to work around Opera inline/table scrollLeft/Top bugif ( !/^inline|table.*$/i.test(jQuery.css(parent, "display")) )// Subtract parent scroll offsetsadd( -parent.scrollLeft, -parent.scrollTop );// Mozilla does not add the border for a parent that has overflow != visibleif ( mozilla && jQuery.css(parent, "overflow") != "visible" )border( parent );// Get next parentparent = parent.parentNode;}// Safari <= 2 doubles body offsets with a fixed position element/offsetParent or absolutely positioned offsetChild// Mozilla doubles body offsets with a non-absolutely positioned offsetChildif ( (safari2 && (fixed || jQuery.css(offsetChild, "position") == "absolute")) ||(mozilla && jQuery.css(offsetChild, "position") != "absolute") )add( -doc.body.offsetLeft, -doc.body.offsetTop );// Add the document scroll offsets if position is fixedif ( fixed )add(Math.max(doc.documentElement.scrollLeft, doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop, doc.body.scrollTop));}// Return an object with top and left propertiesresults = { top: top, left: left };}function border(elem) {add( jQuery.curCSS(elem, "borderLeftWidth", true), jQuery.curCSS(elem, "borderTopWidth", true) );}function add(l, t) {left += parseInt(l) || 0;top += parseInt(t) || 0;}return results;};})();