web/data/jquery.js
changeset 6448 8590d82e9b1b
parent 5767 1d811df051c2
child 7303 7e7b44406cb1
equal deleted inserted replaced
6447:f5d1b1025702 6448:8590d82e9b1b
     1 /*
     1 /*!
     2  * jQuery JavaScript Library v1.3.2
     2  * jQuery JavaScript Library v1.4.2
     3  * http://jquery.com/
     3  * http://jquery.com/
     4  *
     4  *
     5  * Copyright (c) 2010 John Resig
     5  * Copyright 2010, John Resig
     6  * Dual licensed under the MIT and GPL licenses.
     6  * Dual licensed under the MIT or GPL Version 2 licenses.
     7  * http://docs.jquery.com/License
     7  * http://jquery.org/license
     8  *
     8  *
     9  * Date: 2010-02-19 17:34:21 -0500 (Thu, 19 Feb 2010)
     9  * Includes Sizzle.js
    10  * Revision: 6246
    10  * http://sizzlejs.com/
       
    11  * Copyright 2010, The Dojo Foundation
       
    12  * Released under the MIT, BSD, and GPL Licenses.
       
    13  *
       
    14  * Date: Sat Feb 13 22:33:48 2010 -0500
    11  */
    15  */
    12 (function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
    16 (function( window, undefined ) {
       
    17 
       
    18 // Define a local copy of jQuery
       
    19 var jQuery = 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 	// Map over jQuery in case of overwrite
       
    25 	_jQuery = window.jQuery,
       
    26 
       
    27 	// Map over the $ in case of overwrite
       
    28 	_$ = window.$,
       
    29 
       
    30 	// Use the correct document accordingly with window argument (sandbox)
       
    31 	document = window.document,
       
    32 
       
    33 	// A central reference to the root jQuery(document)
       
    34 	rootjQuery,
       
    35 
       
    36 	// A simple way to check for HTML strings or ID strings
       
    37 	// (both of which we optimize for)
       
    38 	quickExpr = /^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,
       
    39 
       
    40 	// Is it a simple selector
       
    41 	isSimple = /^.[^:#\[\.,]*$/,
       
    42 
       
    43 	// Check if a string has a non-whitespace character in it
       
    44 	rnotwhite = /\S/,
       
    45 
       
    46 	// Used for trimming whitespace
       
    47 	rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g,
       
    48 
       
    49 	// Match a standalone tag
       
    50 	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
       
    51 
       
    52 	// Keep a UserAgent string for use with jQuery.browser
       
    53 	userAgent = navigator.userAgent,
       
    54 
       
    55 	// For matching the engine and version of the browser
       
    56 	browserMatch,
       
    57 	
       
    58 	// Has the ready events already been bound?
       
    59 	readyBound = false,
       
    60 	
       
    61 	// The functions to execute on DOM ready
       
    62 	readyList = [],
       
    63 
       
    64 	// The ready event handler
       
    65 	DOMContentLoaded,
       
    66 
       
    67 	// Save a reference to some core methods
       
    68 	toString = Object.prototype.toString,
       
    69 	hasOwnProperty = Object.prototype.hasOwnProperty,
       
    70 	push = Array.prototype.push,
       
    71 	slice = Array.prototype.slice,
       
    72 	indexOf = Array.prototype.indexOf;
       
    73 
       
    74 jQuery.fn = jQuery.prototype = {
       
    75 	init: function( selector, context ) {
       
    76 		var match, elem, ret, doc;
       
    77 
       
    78 		// Handle $(""), $(null), or $(undefined)
       
    79 		if ( !selector ) {
       
    80 			return this;
       
    81 		}
       
    82 
       
    83 		// Handle $(DOMElement)
       
    84 		if ( selector.nodeType ) {
       
    85 			this.context = this[0] = selector;
       
    86 			this.length = 1;
       
    87 			return this;
       
    88 		}
       
    89 		
       
    90 		// The body element only exists once, optimize finding it
       
    91 		if ( selector === "body" && !context ) {
       
    92 			this.context = document;
       
    93 			this[0] = document.body;
       
    94 			this.selector = "body";
       
    95 			this.length = 1;
       
    96 			return this;
       
    97 		}
       
    98 
       
    99 		// Handle HTML strings
       
   100 		if ( typeof selector === "string" ) {
       
   101 			// Are we dealing with HTML string or an ID?
       
   102 			match = quickExpr.exec( selector );
       
   103 
       
   104 			// Verify a match, and that no context was specified for #id
       
   105 			if ( match && (match[1] || !context) ) {
       
   106 
       
   107 				// HANDLE: $(html) -> $(array)
       
   108 				if ( match[1] ) {
       
   109 					doc = (context ? context.ownerDocument || context : document);
       
   110 
       
   111 					// If a single string is passed in and it's a single tag
       
   112 					// just do a createElement and skip the rest
       
   113 					ret = rsingleTag.exec( selector );
       
   114 
       
   115 					if ( ret ) {
       
   116 						if ( jQuery.isPlainObject( context ) ) {
       
   117 							selector = [ document.createElement( ret[1] ) ];
       
   118 							jQuery.fn.attr.call( selector, context, true );
       
   119 
       
   120 						} else {
       
   121 							selector = [ doc.createElement( ret[1] ) ];
       
   122 						}
       
   123 
       
   124 					} else {
       
   125 						ret = buildFragment( [ match[1] ], [ doc ] );
       
   126 						selector = (ret.cacheable ? ret.fragment.cloneNode(true) : ret.fragment).childNodes;
       
   127 					}
       
   128 					
       
   129 					return jQuery.merge( this, selector );
       
   130 					
       
   131 				// HANDLE: $("#id")
       
   132 				} else {
       
   133 					elem = document.getElementById( match[2] );
       
   134 
       
   135 					if ( elem ) {
       
   136 						// Handle the case where IE and Opera return items
       
   137 						// by name instead of ID
       
   138 						if ( elem.id !== match[2] ) {
       
   139 							return rootjQuery.find( selector );
       
   140 						}
       
   141 
       
   142 						// Otherwise, we inject the element directly into the jQuery object
       
   143 						this.length = 1;
       
   144 						this[0] = elem;
       
   145 					}
       
   146 
       
   147 					this.context = document;
       
   148 					this.selector = selector;
       
   149 					return this;
       
   150 				}
       
   151 
       
   152 			// HANDLE: $("TAG")
       
   153 			} else if ( !context && /^\w+$/.test( selector ) ) {
       
   154 				this.selector = selector;
       
   155 				this.context = document;
       
   156 				selector = document.getElementsByTagName( selector );
       
   157 				return jQuery.merge( this, selector );
       
   158 
       
   159 			// HANDLE: $(expr, $(...))
       
   160 			} else if ( !context || context.jquery ) {
       
   161 				return (context || rootjQuery).find( selector );
       
   162 
       
   163 			// HANDLE: $(expr, context)
       
   164 			// (which is just equivalent to: $(context).find(expr)
       
   165 			} else {
       
   166 				return jQuery( context ).find( selector );
       
   167 			}
       
   168 
       
   169 		// HANDLE: $(function)
       
   170 		// Shortcut for document ready
       
   171 		} else if ( jQuery.isFunction( selector ) ) {
       
   172 			return rootjQuery.ready( selector );
       
   173 		}
       
   174 
       
   175 		if (selector.selector !== undefined) {
       
   176 			this.selector = selector.selector;
       
   177 			this.context = selector.context;
       
   178 		}
       
   179 
       
   180 		return jQuery.makeArray( selector, this );
       
   181 	},
       
   182 
       
   183 	// Start with an empty selector
       
   184 	selector: "",
       
   185 
       
   186 	// The current version of jQuery being used
       
   187 	jquery: "1.4.2",
       
   188 
       
   189 	// The default length of a jQuery object is 0
       
   190 	length: 0,
       
   191 
       
   192 	// The number of elements contained in the matched element set
       
   193 	size: function() {
       
   194 		return this.length;
       
   195 	},
       
   196 
       
   197 	toArray: function() {
       
   198 		return slice.call( this, 0 );
       
   199 	},
       
   200 
       
   201 	// Get the Nth element in the matched element set OR
       
   202 	// Get the whole matched element set as a clean array
       
   203 	get: function( num ) {
       
   204 		return num == null ?
       
   205 
       
   206 			// Return a 'clean' array
       
   207 			this.toArray() :
       
   208 
       
   209 			// Return just the object
       
   210 			( num < 0 ? this.slice(num)[ 0 ] : this[ num ] );
       
   211 	},
       
   212 
       
   213 	// Take an array of elements and push it onto the stack
       
   214 	// (returning the new matched element set)
       
   215 	pushStack: function( elems, name, selector ) {
       
   216 		// Build a new jQuery matched element set
       
   217 		var ret = jQuery();
       
   218 
       
   219 		if ( jQuery.isArray( elems ) ) {
       
   220 			push.apply( ret, elems );
       
   221 		
       
   222 		} else {
       
   223 			jQuery.merge( ret, elems );
       
   224 		}
       
   225 
       
   226 		// Add the old object onto the stack (as a reference)
       
   227 		ret.prevObject = this;
       
   228 
       
   229 		ret.context = this.context;
       
   230 
       
   231 		if ( name === "find" ) {
       
   232 			ret.selector = this.selector + (this.selector ? " " : "") + selector;
       
   233 		} else if ( name ) {
       
   234 			ret.selector = this.selector + "." + name + "(" + selector + ")";
       
   235 		}
       
   236 
       
   237 		// Return the newly-formed element set
       
   238 		return ret;
       
   239 	},
       
   240 
       
   241 	// Execute a callback for every element in the matched set.
       
   242 	// (You can seed the arguments with an array of args, but this is
       
   243 	// only used internally.)
       
   244 	each: function( callback, args ) {
       
   245 		return jQuery.each( this, callback, args );
       
   246 	},
       
   247 	
       
   248 	ready: function( fn ) {
       
   249 		// Attach the listeners
       
   250 		jQuery.bindReady();
       
   251 
       
   252 		// If the DOM is already ready
       
   253 		if ( jQuery.isReady ) {
       
   254 			// Execute the function immediately
       
   255 			fn.call( document, jQuery );
       
   256 
       
   257 		// Otherwise, remember the function for later
       
   258 		} else if ( readyList ) {
       
   259 			// Add the function to the wait list
       
   260 			readyList.push( fn );
       
   261 		}
       
   262 
       
   263 		return this;
       
   264 	},
       
   265 	
       
   266 	eq: function( i ) {
       
   267 		return i === -1 ?
       
   268 			this.slice( i ) :
       
   269 			this.slice( i, +i + 1 );
       
   270 	},
       
   271 
       
   272 	first: function() {
       
   273 		return this.eq( 0 );
       
   274 	},
       
   275 
       
   276 	last: function() {
       
   277 		return this.eq( -1 );
       
   278 	},
       
   279 
       
   280 	slice: function() {
       
   281 		return this.pushStack( slice.apply( this, arguments ),
       
   282 			"slice", slice.call(arguments).join(",") );
       
   283 	},
       
   284 
       
   285 	map: function( callback ) {
       
   286 		return this.pushStack( jQuery.map(this, function( elem, i ) {
       
   287 			return callback.call( elem, i, elem );
       
   288 		}));
       
   289 	},
       
   290 	
       
   291 	end: function() {
       
   292 		return this.prevObject || jQuery(null);
       
   293 	},
       
   294 
       
   295 	// For internal use only.
       
   296 	// Behaves like an Array's method, not like a jQuery method.
       
   297 	push: push,
       
   298 	sort: [].sort,
       
   299 	splice: [].splice
       
   300 };
       
   301 
       
   302 // Give the init function the jQuery prototype for later instantiation
       
   303 jQuery.fn.init.prototype = jQuery.fn;
       
   304 
       
   305 jQuery.extend = jQuery.fn.extend = function() {
       
   306 	// copy reference to target object
       
   307 	var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy;
       
   308 
       
   309 	// Handle a deep copy situation
       
   310 	if ( typeof target === "boolean" ) {
       
   311 		deep = target;
       
   312 		target = arguments[1] || {};
       
   313 		// skip the boolean and the target
       
   314 		i = 2;
       
   315 	}
       
   316 
       
   317 	// Handle case when target is a string or something (possible in deep copy)
       
   318 	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
       
   319 		target = {};
       
   320 	}
       
   321 
       
   322 	// extend jQuery itself if only one argument is passed
       
   323 	if ( length === i ) {
       
   324 		target = this;
       
   325 		--i;
       
   326 	}
       
   327 
       
   328 	for ( ; i < length; i++ ) {
       
   329 		// Only deal with non-null/undefined values
       
   330 		if ( (options = arguments[ i ]) != null ) {
       
   331 			// Extend the base object
       
   332 			for ( name in options ) {
       
   333 				src = target[ name ];
       
   334 				copy = options[ name ];
       
   335 
       
   336 				// Prevent never-ending loop
       
   337 				if ( target === copy ) {
       
   338 					continue;
       
   339 				}
       
   340 
       
   341 				// Recurse if we're merging object literal values or arrays
       
   342 				if ( deep && copy && ( jQuery.isPlainObject(copy) || jQuery.isArray(copy) ) ) {
       
   343 					var clone = src && ( jQuery.isPlainObject(src) || jQuery.isArray(src) ) ? src
       
   344 						: jQuery.isArray(copy) ? [] : {};
       
   345 
       
   346 					// Never move original objects, clone them
       
   347 					target[ name ] = jQuery.extend( deep, clone, copy );
       
   348 
       
   349 				// Don't bring in undefined values
       
   350 				} else if ( copy !== undefined ) {
       
   351 					target[ name ] = copy;
       
   352 				}
       
   353 			}
       
   354 		}
       
   355 	}
       
   356 
       
   357 	// Return the modified object
       
   358 	return target;
       
   359 };
       
   360 
       
   361 jQuery.extend({
       
   362 	noConflict: function( deep ) {
       
   363 		window.$ = _$;
       
   364 
       
   365 		if ( deep ) {
       
   366 			window.jQuery = _jQuery;
       
   367 		}
       
   368 
       
   369 		return jQuery;
       
   370 	},
       
   371 	
       
   372 	// Is the DOM ready to be used? Set to true once it occurs.
       
   373 	isReady: false,
       
   374 	
       
   375 	// Handle when the DOM is ready
       
   376 	ready: function() {
       
   377 		// Make sure that the DOM is not already loaded
       
   378 		if ( !jQuery.isReady ) {
       
   379 			// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
       
   380 			if ( !document.body ) {
       
   381 				return setTimeout( jQuery.ready, 13 );
       
   382 			}
       
   383 
       
   384 			// Remember that the DOM is ready
       
   385 			jQuery.isReady = true;
       
   386 
       
   387 			// If there are functions bound, to execute
       
   388 			if ( readyList ) {
       
   389 				// Execute all of them
       
   390 				var fn, i = 0;
       
   391 				while ( (fn = readyList[ i++ ]) ) {
       
   392 					fn.call( document, jQuery );
       
   393 				}
       
   394 
       
   395 				// Reset the list of functions
       
   396 				readyList = null;
       
   397 			}
       
   398 
       
   399 			// Trigger any bound ready events
       
   400 			if ( jQuery.fn.triggerHandler ) {
       
   401 				jQuery( document ).triggerHandler( "ready" );
       
   402 			}
       
   403 		}
       
   404 	},
       
   405 	
       
   406 	bindReady: function() {
       
   407 		if ( readyBound ) {
       
   408 			return;
       
   409 		}
       
   410 
       
   411 		readyBound = true;
       
   412 
       
   413 		// Catch cases where $(document).ready() is called after the
       
   414 		// browser event has already occurred.
       
   415 		if ( document.readyState === "complete" ) {
       
   416 			return jQuery.ready();
       
   417 		}
       
   418 
       
   419 		// Mozilla, Opera and webkit nightlies currently support this event
       
   420 		if ( document.addEventListener ) {
       
   421 			// Use the handy event callback
       
   422 			document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
       
   423 			
       
   424 			// A fallback to window.onload, that will always work
       
   425 			window.addEventListener( "load", jQuery.ready, false );
       
   426 
       
   427 		// If IE event model is used
       
   428 		} else if ( document.attachEvent ) {
       
   429 			// ensure firing before onload,
       
   430 			// maybe late but safe also for iframes
       
   431 			document.attachEvent("onreadystatechange", DOMContentLoaded);
       
   432 			
       
   433 			// A fallback to window.onload, that will always work
       
   434 			window.attachEvent( "onload", jQuery.ready );
       
   435 
       
   436 			// If IE and not a frame
       
   437 			// continually check to see if the document is ready
       
   438 			var toplevel = false;
       
   439 
       
   440 			try {
       
   441 				toplevel = window.frameElement == null;
       
   442 			} catch(e) {}
       
   443 
       
   444 			if ( document.documentElement.doScroll && toplevel ) {
       
   445 				doScrollCheck();
       
   446 			}
       
   447 		}
       
   448 	},
       
   449 
       
   450 	// See test/unit/core.js for details concerning isFunction.
       
   451 	// Since version 1.3, DOM methods and functions like alert
       
   452 	// aren't supported. They return false on IE (#2968).
       
   453 	isFunction: function( obj ) {
       
   454 		return toString.call(obj) === "[object Function]";
       
   455 	},
       
   456 
       
   457 	isArray: function( obj ) {
       
   458 		return toString.call(obj) === "[object Array]";
       
   459 	},
       
   460 
       
   461 	isPlainObject: function( obj ) {
       
   462 		// Must be an Object.
       
   463 		// Because of IE, we also have to check the presence of the constructor property.
       
   464 		// Make sure that DOM nodes and window objects don't pass through, as well
       
   465 		if ( !obj || toString.call(obj) !== "[object Object]" || obj.nodeType || obj.setInterval ) {
       
   466 			return false;
       
   467 		}
       
   468 		
       
   469 		// Not own constructor property must be Object
       
   470 		if ( obj.constructor
       
   471 			&& !hasOwnProperty.call(obj, "constructor")
       
   472 			&& !hasOwnProperty.call(obj.constructor.prototype, "isPrototypeOf") ) {
       
   473 			return false;
       
   474 		}
       
   475 		
       
   476 		// Own properties are enumerated firstly, so to speed up,
       
   477 		// if last one is own, then all properties are own.
       
   478 	
       
   479 		var key;
       
   480 		for ( key in obj ) {}
       
   481 		
       
   482 		return key === undefined || hasOwnProperty.call( obj, key );
       
   483 	},
       
   484 
       
   485 	isEmptyObject: function( obj ) {
       
   486 		for ( var name in obj ) {
       
   487 			return false;
       
   488 		}
       
   489 		return true;
       
   490 	},
       
   491 	
       
   492 	error: function( msg ) {
       
   493 		throw msg;
       
   494 	},
       
   495 	
       
   496 	parseJSON: function( data ) {
       
   497 		if ( typeof data !== "string" || !data ) {
       
   498 			return null;
       
   499 		}
       
   500 
       
   501 		// Make sure leading/trailing whitespace is removed (IE can't handle it)
       
   502 		data = jQuery.trim( data );
       
   503 		
       
   504 		// Make sure the incoming data is actual JSON
       
   505 		// Logic borrowed from http://json.org/json2.js
       
   506 		if ( /^[\],:{}\s]*$/.test(data.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
       
   507 			.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]")
       
   508 			.replace(/(?:^|:|,)(?:\s*\[)+/g, "")) ) {
       
   509 
       
   510 			// Try to use the native JSON parser first
       
   511 			return window.JSON && window.JSON.parse ?
       
   512 				window.JSON.parse( data ) :
       
   513 				(new Function("return " + data))();
       
   514 
       
   515 		} else {
       
   516 			jQuery.error( "Invalid JSON: " + data );
       
   517 		}
       
   518 	},
       
   519 
       
   520 	noop: function() {},
       
   521 
       
   522 	// Evalulates a script in a global context
       
   523 	globalEval: function( data ) {
       
   524 		if ( data && rnotwhite.test(data) ) {
       
   525 			// Inspired by code by Andrea Giammarchi
       
   526 			// http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html
       
   527 			var head = document.getElementsByTagName("head")[0] || document.documentElement,
       
   528 				script = document.createElement("script");
       
   529 
       
   530 			script.type = "text/javascript";
       
   531 
       
   532 			if ( jQuery.support.scriptEval ) {
       
   533 				script.appendChild( document.createTextNode( data ) );
       
   534 			} else {
       
   535 				script.text = data;
       
   536 			}
       
   537 
       
   538 			// Use insertBefore instead of appendChild to circumvent an IE6 bug.
       
   539 			// This arises when a base node is used (#2709).
       
   540 			head.insertBefore( script, head.firstChild );
       
   541 			head.removeChild( script );
       
   542 		}
       
   543 	},
       
   544 
       
   545 	nodeName: function( elem, name ) {
       
   546 		return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
       
   547 	},
       
   548 
       
   549 	// args is for internal usage only
       
   550 	each: function( object, callback, args ) {
       
   551 		var name, i = 0,
       
   552 			length = object.length,
       
   553 			isObj = length === undefined || jQuery.isFunction(object);
       
   554 
       
   555 		if ( args ) {
       
   556 			if ( isObj ) {
       
   557 				for ( name in object ) {
       
   558 					if ( callback.apply( object[ name ], args ) === false ) {
       
   559 						break;
       
   560 					}
       
   561 				}
       
   562 			} else {
       
   563 				for ( ; i < length; ) {
       
   564 					if ( callback.apply( object[ i++ ], args ) === false ) {
       
   565 						break;
       
   566 					}
       
   567 				}
       
   568 			}
       
   569 
       
   570 		// A special, fast, case for the most common use of each
       
   571 		} else {
       
   572 			if ( isObj ) {
       
   573 				for ( name in object ) {
       
   574 					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
       
   575 						break;
       
   576 					}
       
   577 				}
       
   578 			} else {
       
   579 				for ( var value = object[0];
       
   580 					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
       
   581 			}
       
   582 		}
       
   583 
       
   584 		return object;
       
   585 	},
       
   586 
       
   587 	trim: function( text ) {
       
   588 		return (text || "").replace( rtrim, "" );
       
   589 	},
       
   590 
       
   591 	// results is for internal usage only
       
   592 	makeArray: function( array, results ) {
       
   593 		var ret = results || [];
       
   594 
       
   595 		if ( array != null ) {
       
   596 			// The window, strings (and functions) also have 'length'
       
   597 			// The extra typeof function check is to prevent crashes
       
   598 			// in Safari 2 (See: #3039)
       
   599 			if ( array.length == null || typeof array === "string" || jQuery.isFunction(array) || (typeof array !== "function" && array.setInterval) ) {
       
   600 				push.call( ret, array );
       
   601 			} else {
       
   602 				jQuery.merge( ret, array );
       
   603 			}
       
   604 		}
       
   605 
       
   606 		return ret;
       
   607 	},
       
   608 
       
   609 	inArray: function( elem, array ) {
       
   610 		if ( array.indexOf ) {
       
   611 			return array.indexOf( elem );
       
   612 		}
       
   613 
       
   614 		for ( var i = 0, length = array.length; i < length; i++ ) {
       
   615 			if ( array[ i ] === elem ) {
       
   616 				return i;
       
   617 			}
       
   618 		}
       
   619 
       
   620 		return -1;
       
   621 	},
       
   622 
       
   623 	merge: function( first, second ) {
       
   624 		var i = first.length, j = 0;
       
   625 
       
   626 		if ( typeof second.length === "number" ) {
       
   627 			for ( var l = second.length; j < l; j++ ) {
       
   628 				first[ i++ ] = second[ j ];
       
   629 			}
       
   630 		
       
   631 		} else {
       
   632 			while ( second[j] !== undefined ) {
       
   633 				first[ i++ ] = second[ j++ ];
       
   634 			}
       
   635 		}
       
   636 
       
   637 		first.length = i;
       
   638 
       
   639 		return first;
       
   640 	},
       
   641 
       
   642 	grep: function( elems, callback, inv ) {
       
   643 		var ret = [];
       
   644 
       
   645 		// Go through the array, only saving the items
       
   646 		// that pass the validator function
       
   647 		for ( var i = 0, length = elems.length; i < length; i++ ) {
       
   648 			if ( !inv !== !callback( elems[ i ], i ) ) {
       
   649 				ret.push( elems[ i ] );
       
   650 			}
       
   651 		}
       
   652 
       
   653 		return ret;
       
   654 	},
       
   655 
       
   656 	// arg is for internal usage only
       
   657 	map: function( elems, callback, arg ) {
       
   658 		var ret = [], value;
       
   659 
       
   660 		// Go through the array, translating each of the items to their
       
   661 		// new value (or values).
       
   662 		for ( var i = 0, length = elems.length; i < length; i++ ) {
       
   663 			value = callback( elems[ i ], i, arg );
       
   664 
       
   665 			if ( value != null ) {
       
   666 				ret[ ret.length ] = value;
       
   667 			}
       
   668 		}
       
   669 
       
   670 		return ret.concat.apply( [], ret );
       
   671 	},
       
   672 
       
   673 	// A global GUID counter for objects
       
   674 	guid: 1,
       
   675 
       
   676 	proxy: function( fn, proxy, thisObject ) {
       
   677 		if ( arguments.length === 2 ) {
       
   678 			if ( typeof proxy === "string" ) {
       
   679 				thisObject = fn;
       
   680 				fn = thisObject[ proxy ];
       
   681 				proxy = undefined;
       
   682 
       
   683 			} else if ( proxy && !jQuery.isFunction( proxy ) ) {
       
   684 				thisObject = proxy;
       
   685 				proxy = undefined;
       
   686 			}
       
   687 		}
       
   688 
       
   689 		if ( !proxy && fn ) {
       
   690 			proxy = function() {
       
   691 				return fn.apply( thisObject || this, arguments );
       
   692 			};
       
   693 		}
       
   694 
       
   695 		// Set the guid of unique handler to the same of original handler, so it can be removed
       
   696 		if ( fn ) {
       
   697 			proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
       
   698 		}
       
   699 
       
   700 		// So proxy can be declared as an argument
       
   701 		return proxy;
       
   702 	},
       
   703 
       
   704 	// Use of jQuery.browser is frowned upon.
       
   705 	// More details: http://docs.jquery.com/Utilities/jQuery.browser
       
   706 	uaMatch: function( ua ) {
       
   707 		ua = ua.toLowerCase();
       
   708 
       
   709 		var match = /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
       
   710 			/(opera)(?:.*version)?[ \/]([\w.]+)/.exec( ua ) ||
       
   711 			/(msie) ([\w.]+)/.exec( ua ) ||
       
   712 			!/compatible/.test( ua ) && /(mozilla)(?:.*? rv:([\w.]+))?/.exec( ua ) ||
       
   713 		  	[];
       
   714 
       
   715 		return { browser: match[1] || "", version: match[2] || "0" };
       
   716 	},
       
   717 
       
   718 	browser: {}
       
   719 });
       
   720 
       
   721 browserMatch = jQuery.uaMatch( userAgent );
       
   722 if ( browserMatch.browser ) {
       
   723 	jQuery.browser[ browserMatch.browser ] = true;
       
   724 	jQuery.browser.version = browserMatch.version;
       
   725 }
       
   726 
       
   727 // Deprecated, use jQuery.browser.webkit instead
       
   728 if ( jQuery.browser.webkit ) {
       
   729 	jQuery.browser.safari = true;
       
   730 }
       
   731 
       
   732 if ( indexOf ) {
       
   733 	jQuery.inArray = function( elem, array ) {
       
   734 		return indexOf.call( array, elem );
       
   735 	};
       
   736 }
       
   737 
       
   738 // All jQuery objects should point back to these
       
   739 rootjQuery = jQuery(document);
       
   740 
       
   741 // Cleanup functions for the document ready method
       
   742 if ( document.addEventListener ) {
       
   743 	DOMContentLoaded = function() {
       
   744 		document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
       
   745 		jQuery.ready();
       
   746 	};
       
   747 
       
   748 } else if ( document.attachEvent ) {
       
   749 	DOMContentLoaded = function() {
       
   750 		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
       
   751 		if ( document.readyState === "complete" ) {
       
   752 			document.detachEvent( "onreadystatechange", DOMContentLoaded );
       
   753 			jQuery.ready();
       
   754 		}
       
   755 	};
       
   756 }
       
   757 
       
   758 // The DOM ready check for Internet Explorer
       
   759 function doScrollCheck() {
       
   760 	if ( jQuery.isReady ) {
       
   761 		return;
       
   762 	}
       
   763 
       
   764 	try {
       
   765 		// If IE is used, use the trick by Diego Perini
       
   766 		// http://javascript.nwbox.com/IEContentLoaded/
       
   767 		document.documentElement.doScroll("left");
       
   768 	} catch( error ) {
       
   769 		setTimeout( doScrollCheck, 1 );
       
   770 		return;
       
   771 	}
       
   772 
       
   773 	// and execute any waiting functions
       
   774 	jQuery.ready();
       
   775 }
       
   776 
       
   777 function evalScript( i, elem ) {
       
   778 	if ( elem.src ) {
       
   779 		jQuery.ajax({
       
   780 			url: elem.src,
       
   781 			async: false,
       
   782 			dataType: "script"
       
   783 		});
       
   784 	} else {
       
   785 		jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );
       
   786 	}
       
   787 
       
   788 	if ( elem.parentNode ) {
       
   789 		elem.parentNode.removeChild( elem );
       
   790 	}
       
   791 }
       
   792 
       
   793 // Mutifunctional method to get and set values to a collection
       
   794 // The value/s can be optionally by executed if its a function
       
   795 function access( elems, key, value, exec, fn, pass ) {
       
   796 	var length = elems.length;
       
   797 	
       
   798 	// Setting many attributes
       
   799 	if ( typeof key === "object" ) {
       
   800 		for ( var k in key ) {
       
   801 			access( elems, k, key[k], exec, fn, value );
       
   802 		}
       
   803 		return elems;
       
   804 	}
       
   805 	
       
   806 	// Setting one attribute
       
   807 	if ( value !== undefined ) {
       
   808 		// Optionally, function values get executed if exec is true
       
   809 		exec = !pass && exec && jQuery.isFunction(value);
       
   810 		
       
   811 		for ( var i = 0; i < length; i++ ) {
       
   812 			fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
       
   813 		}
       
   814 		
       
   815 		return elems;
       
   816 	}
       
   817 	
       
   818 	// Getting an attribute
       
   819 	return length ? fn( elems[0], key ) : undefined;
       
   820 }
       
   821 
       
   822 function now() {
       
   823 	return (new Date).getTime();
       
   824 }
       
   825 (function() {
       
   826 
       
   827 	jQuery.support = {};
       
   828 
       
   829 	var root = document.documentElement,
       
   830 		script = document.createElement("script"),
       
   831 		div = document.createElement("div"),
       
   832 		id = "script" + now();
       
   833 
       
   834 	div.style.display = "none";
       
   835 	div.innerHTML = "   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
       
   836 
       
   837 	var all = div.getElementsByTagName("*"),
       
   838 		a = div.getElementsByTagName("a")[0];
       
   839 
       
   840 	// Can't get basic test support
       
   841 	if ( !all || !all.length || !a ) {
       
   842 		return;
       
   843 	}
       
   844 
       
   845 	jQuery.support = {
       
   846 		// IE strips leading whitespace when .innerHTML is used
       
   847 		leadingWhitespace: div.firstChild.nodeType === 3,
       
   848 
       
   849 		// Make sure that tbody elements aren't automatically inserted
       
   850 		// IE will insert them into empty tables
       
   851 		tbody: !div.getElementsByTagName("tbody").length,
       
   852 
       
   853 		// Make sure that link elements get serialized correctly by innerHTML
       
   854 		// This requires a wrapper element in IE
       
   855 		htmlSerialize: !!div.getElementsByTagName("link").length,
       
   856 
       
   857 		// Get the style information from getAttribute
       
   858 		// (IE uses .cssText insted)
       
   859 		style: /red/.test( a.getAttribute("style") ),
       
   860 
       
   861 		// Make sure that URLs aren't manipulated
       
   862 		// (IE normalizes it by default)
       
   863 		hrefNormalized: a.getAttribute("href") === "/a",
       
   864 
       
   865 		// Make sure that element opacity exists
       
   866 		// (IE uses filter instead)
       
   867 		// Use a regex to work around a WebKit issue. See #5145
       
   868 		opacity: /^0.55$/.test( a.style.opacity ),
       
   869 
       
   870 		// Verify style float existence
       
   871 		// (IE uses styleFloat instead of cssFloat)
       
   872 		cssFloat: !!a.style.cssFloat,
       
   873 
       
   874 		// Make sure that if no value is specified for a checkbox
       
   875 		// that it defaults to "on".
       
   876 		// (WebKit defaults to "" instead)
       
   877 		checkOn: div.getElementsByTagName("input")[0].value === "on",
       
   878 
       
   879 		// Make sure that a selected-by-default option has a working selected property.
       
   880 		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
       
   881 		optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
       
   882 
       
   883 		parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
       
   884 
       
   885 		// Will be defined later
       
   886 		deleteExpando: true,
       
   887 		checkClone: false,
       
   888 		scriptEval: false,
       
   889 		noCloneEvent: true,
       
   890 		boxModel: null
       
   891 	};
       
   892 
       
   893 	script.type = "text/javascript";
       
   894 	try {
       
   895 		script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
       
   896 	} catch(e) {}
       
   897 
       
   898 	root.insertBefore( script, root.firstChild );
       
   899 
       
   900 	// Make sure that the execution of code works by injecting a script
       
   901 	// tag with appendChild/createTextNode
       
   902 	// (IE doesn't support this, fails, and uses .text instead)
       
   903 	if ( window[ id ] ) {
       
   904 		jQuery.support.scriptEval = true;
       
   905 		delete window[ id ];
       
   906 	}
       
   907 
       
   908 	// Test to see if it's possible to delete an expando from an element
       
   909 	// Fails in Internet Explorer
       
   910 	try {
       
   911 		delete script.test;
       
   912 	
       
   913 	} catch(e) {
       
   914 		jQuery.support.deleteExpando = false;
       
   915 	}
       
   916 
       
   917 	root.removeChild( script );
       
   918 
       
   919 	if ( div.attachEvent && div.fireEvent ) {
       
   920 		div.attachEvent("onclick", function click() {
       
   921 			// Cloning a node shouldn't copy over any
       
   922 			// bound event handlers (IE does this)
       
   923 			jQuery.support.noCloneEvent = false;
       
   924 			div.detachEvent("onclick", click);
       
   925 		});
       
   926 		div.cloneNode(true).fireEvent("onclick");
       
   927 	}
       
   928 
       
   929 	div = document.createElement("div");
       
   930 	div.innerHTML = "<input type='radio' name='radiotest' checked='checked'/>";
       
   931 
       
   932 	var fragment = document.createDocumentFragment();
       
   933 	fragment.appendChild( div.firstChild );
       
   934 
       
   935 	// WebKit doesn't clone checked state correctly in fragments
       
   936 	jQuery.support.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;
       
   937 
       
   938 	// Figure out if the W3C box model works as expected
       
   939 	// document.body must exist before we can do this
       
   940 	jQuery(function() {
       
   941 		var div = document.createElement("div");
       
   942 		div.style.width = div.style.paddingLeft = "1px";
       
   943 
       
   944 		document.body.appendChild( div );
       
   945 		jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
       
   946 		document.body.removeChild( div ).style.display = 'none';
       
   947 
       
   948 		div = null;
       
   949 	});
       
   950 
       
   951 	// Technique from Juriy Zaytsev
       
   952 	// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
       
   953 	var eventSupported = function( eventName ) { 
       
   954 		var el = document.createElement("div"); 
       
   955 		eventName = "on" + eventName; 
       
   956 
       
   957 		var isSupported = (eventName in el); 
       
   958 		if ( !isSupported ) { 
       
   959 			el.setAttribute(eventName, "return;"); 
       
   960 			isSupported = typeof el[eventName] === "function"; 
       
   961 		} 
       
   962 		el = null; 
       
   963 
       
   964 		return isSupported; 
       
   965 	};
       
   966 	
       
   967 	jQuery.support.submitBubbles = eventSupported("submit");
       
   968 	jQuery.support.changeBubbles = eventSupported("change");
       
   969 
       
   970 	// release memory in IE
       
   971 	root = script = div = all = a = null;
       
   972 })();
       
   973 
       
   974 jQuery.props = {
       
   975 	"for": "htmlFor",
       
   976 	"class": "className",
       
   977 	readonly: "readOnly",
       
   978 	maxlength: "maxLength",
       
   979 	cellspacing: "cellSpacing",
       
   980 	rowspan: "rowSpan",
       
   981 	colspan: "colSpan",
       
   982 	tabindex: "tabIndex",
       
   983 	usemap: "useMap",
       
   984 	frameborder: "frameBorder"
       
   985 };
       
   986 var expando = "jQuery" + now(), uuid = 0, windowData = {};
       
   987 
       
   988 jQuery.extend({
       
   989 	cache: {},
       
   990 	
       
   991 	expando:expando,
       
   992 
       
   993 	// The following elements throw uncatchable exceptions if you
       
   994 	// attempt to add expando properties to them.
       
   995 	noData: {
       
   996 		"embed": true,
       
   997 		"object": true,
       
   998 		"applet": true
       
   999 	},
       
  1000 
       
  1001 	data: function( elem, name, data ) {
       
  1002 		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
       
  1003 			return;
       
  1004 		}
       
  1005 
       
  1006 		elem = elem == window ?
       
  1007 			windowData :
       
  1008 			elem;
       
  1009 
       
  1010 		var id = elem[ expando ], cache = jQuery.cache, thisCache;
       
  1011 
       
  1012 		if ( !id && typeof name === "string" && data === undefined ) {
       
  1013 			return null;
       
  1014 		}
       
  1015 
       
  1016 		// Compute a unique ID for the element
       
  1017 		if ( !id ) { 
       
  1018 			id = ++uuid;
       
  1019 		}
       
  1020 
       
  1021 		// Avoid generating a new cache unless none exists and we
       
  1022 		// want to manipulate it.
       
  1023 		if ( typeof name === "object" ) {
       
  1024 			elem[ expando ] = id;
       
  1025 			thisCache = cache[ id ] = jQuery.extend(true, {}, name);
       
  1026 
       
  1027 		} else if ( !cache[ id ] ) {
       
  1028 			elem[ expando ] = id;
       
  1029 			cache[ id ] = {};
       
  1030 		}
       
  1031 
       
  1032 		thisCache = cache[ id ];
       
  1033 
       
  1034 		// Prevent overriding the named cache with undefined values
       
  1035 		if ( data !== undefined ) {
       
  1036 			thisCache[ name ] = data;
       
  1037 		}
       
  1038 
       
  1039 		return typeof name === "string" ? thisCache[ name ] : thisCache;
       
  1040 	},
       
  1041 
       
  1042 	removeData: function( elem, name ) {
       
  1043 		if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
       
  1044 			return;
       
  1045 		}
       
  1046 
       
  1047 		elem = elem == window ?
       
  1048 			windowData :
       
  1049 			elem;
       
  1050 
       
  1051 		var id = elem[ expando ], cache = jQuery.cache, thisCache = cache[ id ];
       
  1052 
       
  1053 		// If we want to remove a specific section of the element's data
       
  1054 		if ( name ) {
       
  1055 			if ( thisCache ) {
       
  1056 				// Remove the section of cache data
       
  1057 				delete thisCache[ name ];
       
  1058 
       
  1059 				// If we've removed all the data, remove the element's cache
       
  1060 				if ( jQuery.isEmptyObject(thisCache) ) {
       
  1061 					jQuery.removeData( elem );
       
  1062 				}
       
  1063 			}
       
  1064 
       
  1065 		// Otherwise, we want to remove all of the element's data
       
  1066 		} else {
       
  1067 			if ( jQuery.support.deleteExpando ) {
       
  1068 				delete elem[ jQuery.expando ];
       
  1069 
       
  1070 			} else if ( elem.removeAttribute ) {
       
  1071 				elem.removeAttribute( jQuery.expando );
       
  1072 			}
       
  1073 
       
  1074 			// Completely remove the data cache
       
  1075 			delete cache[ id ];
       
  1076 		}
       
  1077 	}
       
  1078 });
       
  1079 
       
  1080 jQuery.fn.extend({
       
  1081 	data: function( key, value ) {
       
  1082 		if ( typeof key === "undefined" && this.length ) {
       
  1083 			return jQuery.data( this[0] );
       
  1084 
       
  1085 		} else if ( typeof key === "object" ) {
       
  1086 			return this.each(function() {
       
  1087 				jQuery.data( this, key );
       
  1088 			});
       
  1089 		}
       
  1090 
       
  1091 		var parts = key.split(".");
       
  1092 		parts[1] = parts[1] ? "." + parts[1] : "";
       
  1093 
       
  1094 		if ( value === undefined ) {
       
  1095 			var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
       
  1096 
       
  1097 			if ( data === undefined && this.length ) {
       
  1098 				data = jQuery.data( this[0], key );
       
  1099 			}
       
  1100 			return data === undefined && parts[1] ?
       
  1101 				this.data( parts[0] ) :
       
  1102 				data;
       
  1103 		} else {
       
  1104 			return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function() {
       
  1105 				jQuery.data( this, key, value );
       
  1106 			});
       
  1107 		}
       
  1108 	},
       
  1109 
       
  1110 	removeData: function( key ) {
       
  1111 		return this.each(function() {
       
  1112 			jQuery.removeData( this, key );
       
  1113 		});
       
  1114 	}
       
  1115 });
       
  1116 jQuery.extend({
       
  1117 	queue: function( elem, type, data ) {
       
  1118 		if ( !elem ) {
       
  1119 			return;
       
  1120 		}
       
  1121 
       
  1122 		type = (type || "fx") + "queue";
       
  1123 		var q = jQuery.data( elem, type );
       
  1124 
       
  1125 		// Speed up dequeue by getting out quickly if this is just a lookup
       
  1126 		if ( !data ) {
       
  1127 			return q || [];
       
  1128 		}
       
  1129 
       
  1130 		if ( !q || jQuery.isArray(data) ) {
       
  1131 			q = jQuery.data( elem, type, jQuery.makeArray(data) );
       
  1132 
       
  1133 		} else {
       
  1134 			q.push( data );
       
  1135 		}
       
  1136 
       
  1137 		return q;
       
  1138 	},
       
  1139 
       
  1140 	dequeue: function( elem, type ) {
       
  1141 		type = type || "fx";
       
  1142 
       
  1143 		var queue = jQuery.queue( elem, type ), fn = queue.shift();
       
  1144 
       
  1145 		// If the fx queue is dequeued, always remove the progress sentinel
       
  1146 		if ( fn === "inprogress" ) {
       
  1147 			fn = queue.shift();
       
  1148 		}
       
  1149 
       
  1150 		if ( fn ) {
       
  1151 			// Add a progress sentinel to prevent the fx queue from being
       
  1152 			// automatically dequeued
       
  1153 			if ( type === "fx" ) {
       
  1154 				queue.unshift("inprogress");
       
  1155 			}
       
  1156 
       
  1157 			fn.call(elem, function() {
       
  1158 				jQuery.dequeue(elem, type);
       
  1159 			});
       
  1160 		}
       
  1161 	}
       
  1162 });
       
  1163 
       
  1164 jQuery.fn.extend({
       
  1165 	queue: function( type, data ) {
       
  1166 		if ( typeof type !== "string" ) {
       
  1167 			data = type;
       
  1168 			type = "fx";
       
  1169 		}
       
  1170 
       
  1171 		if ( data === undefined ) {
       
  1172 			return jQuery.queue( this[0], type );
       
  1173 		}
       
  1174 		return this.each(function( i, elem ) {
       
  1175 			var queue = jQuery.queue( this, type, data );
       
  1176 
       
  1177 			if ( type === "fx" && queue[0] !== "inprogress" ) {
       
  1178 				jQuery.dequeue( this, type );
       
  1179 			}
       
  1180 		});
       
  1181 	},
       
  1182 	dequeue: function( type ) {
       
  1183 		return this.each(function() {
       
  1184 			jQuery.dequeue( this, type );
       
  1185 		});
       
  1186 	},
       
  1187 
       
  1188 	// Based off of the plugin by Clint Helfers, with permission.
       
  1189 	// http://blindsignals.com/index.php/2009/07/jquery-delay/
       
  1190 	delay: function( time, type ) {
       
  1191 		time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
       
  1192 		type = type || "fx";
       
  1193 
       
  1194 		return this.queue( type, function() {
       
  1195 			var elem = this;
       
  1196 			setTimeout(function() {
       
  1197 				jQuery.dequeue( elem, type );
       
  1198 			}, time );
       
  1199 		});
       
  1200 	},
       
  1201 
       
  1202 	clearQueue: function( type ) {
       
  1203 		return this.queue( type || "fx", [] );
       
  1204 	}
       
  1205 });
       
  1206 var rclass = /[\n\t]/g,
       
  1207 	rspace = /\s+/,
       
  1208 	rreturn = /\r/g,
       
  1209 	rspecialurl = /href|src|style/,
       
  1210 	rtype = /(button|input)/i,
       
  1211 	rfocusable = /(button|input|object|select|textarea)/i,
       
  1212 	rclickable = /^(a|area)$/i,
       
  1213 	rradiocheck = /radio|checkbox/;
       
  1214 
       
  1215 jQuery.fn.extend({
       
  1216 	attr: function( name, value ) {
       
  1217 		return access( this, name, value, true, jQuery.attr );
       
  1218 	},
       
  1219 
       
  1220 	removeAttr: function( name, fn ) {
       
  1221 		return this.each(function(){
       
  1222 			jQuery.attr( this, name, "" );
       
  1223 			if ( this.nodeType === 1 ) {
       
  1224 				this.removeAttribute( name );
       
  1225 			}
       
  1226 		});
       
  1227 	},
       
  1228 
       
  1229 	addClass: function( value ) {
       
  1230 		if ( jQuery.isFunction(value) ) {
       
  1231 			return this.each(function(i) {
       
  1232 				var self = jQuery(this);
       
  1233 				self.addClass( value.call(this, i, self.attr("class")) );
       
  1234 			});
       
  1235 		}
       
  1236 
       
  1237 		if ( value && typeof value === "string" ) {
       
  1238 			var classNames = (value || "").split( rspace );
       
  1239 
       
  1240 			for ( var i = 0, l = this.length; i < l; i++ ) {
       
  1241 				var elem = this[i];
       
  1242 
       
  1243 				if ( elem.nodeType === 1 ) {
       
  1244 					if ( !elem.className ) {
       
  1245 						elem.className = value;
       
  1246 
       
  1247 					} else {
       
  1248 						var className = " " + elem.className + " ", setClass = elem.className;
       
  1249 						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
       
  1250 							if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
       
  1251 								setClass += " " + classNames[c];
       
  1252 							}
       
  1253 						}
       
  1254 						elem.className = jQuery.trim( setClass );
       
  1255 					}
       
  1256 				}
       
  1257 			}
       
  1258 		}
       
  1259 
       
  1260 		return this;
       
  1261 	},
       
  1262 
       
  1263 	removeClass: function( value ) {
       
  1264 		if ( jQuery.isFunction(value) ) {
       
  1265 			return this.each(function(i) {
       
  1266 				var self = jQuery(this);
       
  1267 				self.removeClass( value.call(this, i, self.attr("class")) );
       
  1268 			});
       
  1269 		}
       
  1270 
       
  1271 		if ( (value && typeof value === "string") || value === undefined ) {
       
  1272 			var classNames = (value || "").split(rspace);
       
  1273 
       
  1274 			for ( var i = 0, l = this.length; i < l; i++ ) {
       
  1275 				var elem = this[i];
       
  1276 
       
  1277 				if ( elem.nodeType === 1 && elem.className ) {
       
  1278 					if ( value ) {
       
  1279 						var className = (" " + elem.className + " ").replace(rclass, " ");
       
  1280 						for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
       
  1281 							className = className.replace(" " + classNames[c] + " ", " ");
       
  1282 						}
       
  1283 						elem.className = jQuery.trim( className );
       
  1284 
       
  1285 					} else {
       
  1286 						elem.className = "";
       
  1287 					}
       
  1288 				}
       
  1289 			}
       
  1290 		}
       
  1291 
       
  1292 		return this;
       
  1293 	},
       
  1294 
       
  1295 	toggleClass: function( value, stateVal ) {
       
  1296 		var type = typeof value, isBool = typeof stateVal === "boolean";
       
  1297 
       
  1298 		if ( jQuery.isFunction( value ) ) {
       
  1299 			return this.each(function(i) {
       
  1300 				var self = jQuery(this);
       
  1301 				self.toggleClass( value.call(this, i, self.attr("class"), stateVal), stateVal );
       
  1302 			});
       
  1303 		}
       
  1304 
       
  1305 		return this.each(function() {
       
  1306 			if ( type === "string" ) {
       
  1307 				// toggle individual class names
       
  1308 				var className, i = 0, self = jQuery(this),
       
  1309 					state = stateVal,
       
  1310 					classNames = value.split( rspace );
       
  1311 
       
  1312 				while ( (className = classNames[ i++ ]) ) {
       
  1313 					// check each className given, space seperated list
       
  1314 					state = isBool ? state : !self.hasClass( className );
       
  1315 					self[ state ? "addClass" : "removeClass" ]( className );
       
  1316 				}
       
  1317 
       
  1318 			} else if ( type === "undefined" || type === "boolean" ) {
       
  1319 				if ( this.className ) {
       
  1320 					// store className if set
       
  1321 					jQuery.data( this, "__className__", this.className );
       
  1322 				}
       
  1323 
       
  1324 				// toggle whole className
       
  1325 				this.className = this.className || value === false ? "" : jQuery.data( this, "__className__" ) || "";
       
  1326 			}
       
  1327 		});
       
  1328 	},
       
  1329 
       
  1330 	hasClass: function( selector ) {
       
  1331 		var className = " " + selector + " ";
       
  1332 		for ( var i = 0, l = this.length; i < l; i++ ) {
       
  1333 			if ( (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
       
  1334 				return true;
       
  1335 			}
       
  1336 		}
       
  1337 
       
  1338 		return false;
       
  1339 	},
       
  1340 
       
  1341 	val: function( value ) {
       
  1342 		if ( value === undefined ) {
       
  1343 			var elem = this[0];
       
  1344 
       
  1345 			if ( elem ) {
       
  1346 				if ( jQuery.nodeName( elem, "option" ) ) {
       
  1347 					return (elem.attributes.value || {}).specified ? elem.value : elem.text;
       
  1348 				}
       
  1349 
       
  1350 				// We need to handle select boxes special
       
  1351 				if ( jQuery.nodeName( elem, "select" ) ) {
       
  1352 					var index = elem.selectedIndex,
       
  1353 						values = [],
       
  1354 						options = elem.options,
       
  1355 						one = elem.type === "select-one";
       
  1356 
       
  1357 					// Nothing was selected
       
  1358 					if ( index < 0 ) {
       
  1359 						return null;
       
  1360 					}
       
  1361 
       
  1362 					// Loop through all the selected options
       
  1363 					for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) {
       
  1364 						var option = options[ i ];
       
  1365 
       
  1366 						if ( option.selected ) {
       
  1367 							// Get the specifc value for the option
       
  1368 							value = jQuery(option).val();
       
  1369 
       
  1370 							// We don't need an array for one selects
       
  1371 							if ( one ) {
       
  1372 								return value;
       
  1373 							}
       
  1374 
       
  1375 							// Multi-Selects return an array
       
  1376 							values.push( value );
       
  1377 						}
       
  1378 					}
       
  1379 
       
  1380 					return values;
       
  1381 				}
       
  1382 
       
  1383 				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
       
  1384 				if ( rradiocheck.test( elem.type ) && !jQuery.support.checkOn ) {
       
  1385 					return elem.getAttribute("value") === null ? "on" : elem.value;
       
  1386 				}
       
  1387 				
       
  1388 
       
  1389 				// Everything else, we just grab the value
       
  1390 				return (elem.value || "").replace(rreturn, "");
       
  1391 
       
  1392 			}
       
  1393 
       
  1394 			return undefined;
       
  1395 		}
       
  1396 
       
  1397 		var isFunction = jQuery.isFunction(value);
       
  1398 
       
  1399 		return this.each(function(i) {
       
  1400 			var self = jQuery(this), val = value;
       
  1401 
       
  1402 			if ( this.nodeType !== 1 ) {
       
  1403 				return;
       
  1404 			}
       
  1405 
       
  1406 			if ( isFunction ) {
       
  1407 				val = value.call(this, i, self.val());
       
  1408 			}
       
  1409 
       
  1410 			// Typecast each time if the value is a Function and the appended
       
  1411 			// value is therefore different each time.
       
  1412 			if ( typeof val === "number" ) {
       
  1413 				val += "";
       
  1414 			}
       
  1415 
       
  1416 			if ( jQuery.isArray(val) && rradiocheck.test( this.type ) ) {
       
  1417 				this.checked = jQuery.inArray( self.val(), val ) >= 0;
       
  1418 
       
  1419 			} else if ( jQuery.nodeName( this, "select" ) ) {
       
  1420 				var values = jQuery.makeArray(val);
       
  1421 
       
  1422 				jQuery( "option", this ).each(function() {
       
  1423 					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
       
  1424 				});
       
  1425 
       
  1426 				if ( !values.length ) {
       
  1427 					this.selectedIndex = -1;
       
  1428 				}
       
  1429 
       
  1430 			} else {
       
  1431 				this.value = val;
       
  1432 			}
       
  1433 		});
       
  1434 	}
       
  1435 });
       
  1436 
       
  1437 jQuery.extend({
       
  1438 	attrFn: {
       
  1439 		val: true,
       
  1440 		css: true,
       
  1441 		html: true,
       
  1442 		text: true,
       
  1443 		data: true,
       
  1444 		width: true,
       
  1445 		height: true,
       
  1446 		offset: true
       
  1447 	},
       
  1448 		
       
  1449 	attr: function( elem, name, value, pass ) {
       
  1450 		// don't set attributes on text and comment nodes
       
  1451 		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
       
  1452 			return undefined;
       
  1453 		}
       
  1454 
       
  1455 		if ( pass && name in jQuery.attrFn ) {
       
  1456 			return jQuery(elem)[name](value);
       
  1457 		}
       
  1458 
       
  1459 		var notxml = elem.nodeType !== 1 || !jQuery.isXMLDoc( elem ),
       
  1460 			// Whether we are setting (or getting)
       
  1461 			set = value !== undefined;
       
  1462 
       
  1463 		// Try to normalize/fix the name
       
  1464 		name = notxml && jQuery.props[ name ] || name;
       
  1465 
       
  1466 		// Only do all the following if this is a node (faster for style)
       
  1467 		if ( elem.nodeType === 1 ) {
       
  1468 			// These attributes require special treatment
       
  1469 			var special = rspecialurl.test( name );
       
  1470 
       
  1471 			// Safari mis-reports the default selected property of an option
       
  1472 			// Accessing the parent's selectedIndex property fixes it
       
  1473 			if ( name === "selected" && !jQuery.support.optSelected ) {
       
  1474 				var parent = elem.parentNode;
       
  1475 				if ( parent ) {
       
  1476 					parent.selectedIndex;
       
  1477 	
       
  1478 					// Make sure that it also works with optgroups, see #5701
       
  1479 					if ( parent.parentNode ) {
       
  1480 						parent.parentNode.selectedIndex;
       
  1481 					}
       
  1482 				}
       
  1483 			}
       
  1484 
       
  1485 			// If applicable, access the attribute via the DOM 0 way
       
  1486 			if ( name in elem && notxml && !special ) {
       
  1487 				if ( set ) {
       
  1488 					// We can't allow the type property to be changed (since it causes problems in IE)
       
  1489 					if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
       
  1490 						jQuery.error( "type property can't be changed" );
       
  1491 					}
       
  1492 
       
  1493 					elem[ name ] = value;
       
  1494 				}
       
  1495 
       
  1496 				// browsers index elements by id/name on forms, give priority to attributes.
       
  1497 				if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
       
  1498 					return elem.getAttributeNode( name ).nodeValue;
       
  1499 				}
       
  1500 
       
  1501 				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
       
  1502 				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
       
  1503 				if ( name === "tabIndex" ) {
       
  1504 					var attributeNode = elem.getAttributeNode( "tabIndex" );
       
  1505 
       
  1506 					return attributeNode && attributeNode.specified ?
       
  1507 						attributeNode.value :
       
  1508 						rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
       
  1509 							0 :
       
  1510 							undefined;
       
  1511 				}
       
  1512 
       
  1513 				return elem[ name ];
       
  1514 			}
       
  1515 
       
  1516 			if ( !jQuery.support.style && notxml && name === "style" ) {
       
  1517 				if ( set ) {
       
  1518 					elem.style.cssText = "" + value;
       
  1519 				}
       
  1520 
       
  1521 				return elem.style.cssText;
       
  1522 			}
       
  1523 
       
  1524 			if ( set ) {
       
  1525 				// convert the value to a string (all browsers do this but IE) see #1070
       
  1526 				elem.setAttribute( name, "" + value );
       
  1527 			}
       
  1528 
       
  1529 			var attr = !jQuery.support.hrefNormalized && notxml && special ?
       
  1530 					// Some attributes require a special call on IE
       
  1531 					elem.getAttribute( name, 2 ) :
       
  1532 					elem.getAttribute( name );
       
  1533 
       
  1534 			// Non-existent attributes return null, we normalize to undefined
       
  1535 			return attr === null ? undefined : attr;
       
  1536 		}
       
  1537 
       
  1538 		// elem is actually elem.style ... set the style
       
  1539 		// Using attr for specific style information is now deprecated. Use style instead.
       
  1540 		return jQuery.style( elem, name, value );
       
  1541 	}
       
  1542 });
       
  1543 var rnamespaces = /\.(.*)$/,
       
  1544 	fcleanup = function( nm ) {
       
  1545 		return nm.replace(/[^\w\s\.\|`]/g, function( ch ) {
       
  1546 			return "\\" + ch;
       
  1547 		});
       
  1548 	};
       
  1549 
    13 /*
  1550 /*
    14  * Sizzle CSS Selector Engine - v0.9.3
  1551  * A number of helper functions used for managing events.
    15  *  Copyright 2010, The Dojo Foundation
  1552  * Many of the ideas behind this code originated from
       
  1553  * Dean Edwards' addEvent library.
       
  1554  */
       
  1555 jQuery.event = {
       
  1556 
       
  1557 	// Bind an event to an element
       
  1558 	// Original by Dean Edwards
       
  1559 	add: function( elem, types, handler, data ) {
       
  1560 		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
       
  1561 			return;
       
  1562 		}
       
  1563 
       
  1564 		// For whatever reason, IE has trouble passing the window object
       
  1565 		// around, causing it to be cloned in the process
       
  1566 		if ( elem.setInterval && ( elem !== window && !elem.frameElement ) ) {
       
  1567 			elem = window;
       
  1568 		}
       
  1569 
       
  1570 		var handleObjIn, handleObj;
       
  1571 
       
  1572 		if ( handler.handler ) {
       
  1573 			handleObjIn = handler;
       
  1574 			handler = handleObjIn.handler;
       
  1575 		}
       
  1576 
       
  1577 		// Make sure that the function being executed has a unique ID
       
  1578 		if ( !handler.guid ) {
       
  1579 			handler.guid = jQuery.guid++;
       
  1580 		}
       
  1581 
       
  1582 		// Init the element's event structure
       
  1583 		var elemData = jQuery.data( elem );
       
  1584 
       
  1585 		// If no elemData is found then we must be trying to bind to one of the
       
  1586 		// banned noData elements
       
  1587 		if ( !elemData ) {
       
  1588 			return;
       
  1589 		}
       
  1590 
       
  1591 		var events = elemData.events = elemData.events || {},
       
  1592 			eventHandle = elemData.handle, eventHandle;
       
  1593 
       
  1594 		if ( !eventHandle ) {
       
  1595 			elemData.handle = eventHandle = function() {
       
  1596 				// Handle the second event of a trigger and when
       
  1597 				// an event is called after a page has unloaded
       
  1598 				return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
       
  1599 					jQuery.event.handle.apply( eventHandle.elem, arguments ) :
       
  1600 					undefined;
       
  1601 			};
       
  1602 		}
       
  1603 
       
  1604 		// Add elem as a property of the handle function
       
  1605 		// This is to prevent a memory leak with non-native events in IE.
       
  1606 		eventHandle.elem = elem;
       
  1607 
       
  1608 		// Handle multiple events separated by a space
       
  1609 		// jQuery(...).bind("mouseover mouseout", fn);
       
  1610 		types = types.split(" ");
       
  1611 
       
  1612 		var type, i = 0, namespaces;
       
  1613 
       
  1614 		while ( (type = types[ i++ ]) ) {
       
  1615 			handleObj = handleObjIn ?
       
  1616 				jQuery.extend({}, handleObjIn) :
       
  1617 				{ handler: handler, data: data };
       
  1618 
       
  1619 			// Namespaced event handlers
       
  1620 			if ( type.indexOf(".") > -1 ) {
       
  1621 				namespaces = type.split(".");
       
  1622 				type = namespaces.shift();
       
  1623 				handleObj.namespace = namespaces.slice(0).sort().join(".");
       
  1624 
       
  1625 			} else {
       
  1626 				namespaces = [];
       
  1627 				handleObj.namespace = "";
       
  1628 			}
       
  1629 
       
  1630 			handleObj.type = type;
       
  1631 			handleObj.guid = handler.guid;
       
  1632 
       
  1633 			// Get the current list of functions bound to this event
       
  1634 			var handlers = events[ type ],
       
  1635 				special = jQuery.event.special[ type ] || {};
       
  1636 
       
  1637 			// Init the event handler queue
       
  1638 			if ( !handlers ) {
       
  1639 				handlers = events[ type ] = [];
       
  1640 
       
  1641 				// Check for a special event handler
       
  1642 				// Only use addEventListener/attachEvent if the special
       
  1643 				// events handler returns false
       
  1644 				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
       
  1645 					// Bind the global event handler to the element
       
  1646 					if ( elem.addEventListener ) {
       
  1647 						elem.addEventListener( type, eventHandle, false );
       
  1648 
       
  1649 					} else if ( elem.attachEvent ) {
       
  1650 						elem.attachEvent( "on" + type, eventHandle );
       
  1651 					}
       
  1652 				}
       
  1653 			}
       
  1654 			
       
  1655 			if ( special.add ) { 
       
  1656 				special.add.call( elem, handleObj ); 
       
  1657 
       
  1658 				if ( !handleObj.handler.guid ) {
       
  1659 					handleObj.handler.guid = handler.guid;
       
  1660 				}
       
  1661 			}
       
  1662 
       
  1663 			// Add the function to the element's handler list
       
  1664 			handlers.push( handleObj );
       
  1665 
       
  1666 			// Keep track of which events have been used, for global triggering
       
  1667 			jQuery.event.global[ type ] = true;
       
  1668 		}
       
  1669 
       
  1670 		// Nullify elem to prevent memory leaks in IE
       
  1671 		elem = null;
       
  1672 	},
       
  1673 
       
  1674 	global: {},
       
  1675 
       
  1676 	// Detach an event or set of events from an element
       
  1677 	remove: function( elem, types, handler, pos ) {
       
  1678 		// don't do events on text and comment nodes
       
  1679 		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
       
  1680 			return;
       
  1681 		}
       
  1682 
       
  1683 		var ret, type, fn, i = 0, all, namespaces, namespace, special, eventType, handleObj, origType,
       
  1684 			elemData = jQuery.data( elem ),
       
  1685 			events = elemData && elemData.events;
       
  1686 
       
  1687 		if ( !elemData || !events ) {
       
  1688 			return;
       
  1689 		}
       
  1690 
       
  1691 		// types is actually an event object here
       
  1692 		if ( types && types.type ) {
       
  1693 			handler = types.handler;
       
  1694 			types = types.type;
       
  1695 		}
       
  1696 
       
  1697 		// Unbind all events for the element
       
  1698 		if ( !types || typeof types === "string" && types.charAt(0) === "." ) {
       
  1699 			types = types || "";
       
  1700 
       
  1701 			for ( type in events ) {
       
  1702 				jQuery.event.remove( elem, type + types );
       
  1703 			}
       
  1704 
       
  1705 			return;
       
  1706 		}
       
  1707 
       
  1708 		// Handle multiple events separated by a space
       
  1709 		// jQuery(...).unbind("mouseover mouseout", fn);
       
  1710 		types = types.split(" ");
       
  1711 
       
  1712 		while ( (type = types[ i++ ]) ) {
       
  1713 			origType = type;
       
  1714 			handleObj = null;
       
  1715 			all = type.indexOf(".") < 0;
       
  1716 			namespaces = [];
       
  1717 
       
  1718 			if ( !all ) {
       
  1719 				// Namespaced event handlers
       
  1720 				namespaces = type.split(".");
       
  1721 				type = namespaces.shift();
       
  1722 
       
  1723 				namespace = new RegExp("(^|\\.)" + 
       
  1724 					jQuery.map( namespaces.slice(0).sort(), fcleanup ).join("\\.(?:.*\\.)?") + "(\\.|$)")
       
  1725 			}
       
  1726 
       
  1727 			eventType = events[ type ];
       
  1728 
       
  1729 			if ( !eventType ) {
       
  1730 				continue;
       
  1731 			}
       
  1732 
       
  1733 			if ( !handler ) {
       
  1734 				for ( var j = 0; j < eventType.length; j++ ) {
       
  1735 					handleObj = eventType[ j ];
       
  1736 
       
  1737 					if ( all || namespace.test( handleObj.namespace ) ) {
       
  1738 						jQuery.event.remove( elem, origType, handleObj.handler, j );
       
  1739 						eventType.splice( j--, 1 );
       
  1740 					}
       
  1741 				}
       
  1742 
       
  1743 				continue;
       
  1744 			}
       
  1745 
       
  1746 			special = jQuery.event.special[ type ] || {};
       
  1747 
       
  1748 			for ( var j = pos || 0; j < eventType.length; j++ ) {
       
  1749 				handleObj = eventType[ j ];
       
  1750 
       
  1751 				if ( handler.guid === handleObj.guid ) {
       
  1752 					// remove the given handler for the given type
       
  1753 					if ( all || namespace.test( handleObj.namespace ) ) {
       
  1754 						if ( pos == null ) {
       
  1755 							eventType.splice( j--, 1 );
       
  1756 						}
       
  1757 
       
  1758 						if ( special.remove ) {
       
  1759 							special.remove.call( elem, handleObj );
       
  1760 						}
       
  1761 					}
       
  1762 
       
  1763 					if ( pos != null ) {
       
  1764 						break;
       
  1765 					}
       
  1766 				}
       
  1767 			}
       
  1768 
       
  1769 			// remove generic event handler if no more handlers exist
       
  1770 			if ( eventType.length === 0 || pos != null && eventType.length === 1 ) {
       
  1771 				if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
       
  1772 					removeEvent( elem, type, elemData.handle );
       
  1773 				}
       
  1774 
       
  1775 				ret = null;
       
  1776 				delete events[ type ];
       
  1777 			}
       
  1778 		}
       
  1779 
       
  1780 		// Remove the expando if it's no longer used
       
  1781 		if ( jQuery.isEmptyObject( events ) ) {
       
  1782 			var handle = elemData.handle;
       
  1783 			if ( handle ) {
       
  1784 				handle.elem = null;
       
  1785 			}
       
  1786 
       
  1787 			delete elemData.events;
       
  1788 			delete elemData.handle;
       
  1789 
       
  1790 			if ( jQuery.isEmptyObject( elemData ) ) {
       
  1791 				jQuery.removeData( elem );
       
  1792 			}
       
  1793 		}
       
  1794 	},
       
  1795 
       
  1796 	// bubbling is internal
       
  1797 	trigger: function( event, data, elem /*, bubbling */ ) {
       
  1798 		// Event object or event type
       
  1799 		var type = event.type || event,
       
  1800 			bubbling = arguments[3];
       
  1801 
       
  1802 		if ( !bubbling ) {
       
  1803 			event = typeof event === "object" ?
       
  1804 				// jQuery.Event object
       
  1805 				event[expando] ? event :
       
  1806 				// Object literal
       
  1807 				jQuery.extend( jQuery.Event(type), event ) :
       
  1808 				// Just the event type (string)
       
  1809 				jQuery.Event(type);
       
  1810 
       
  1811 			if ( type.indexOf("!") >= 0 ) {
       
  1812 				event.type = type = type.slice(0, -1);
       
  1813 				event.exclusive = true;
       
  1814 			}
       
  1815 
       
  1816 			// Handle a global trigger
       
  1817 			if ( !elem ) {
       
  1818 				// Don't bubble custom events when global (to avoid too much overhead)
       
  1819 				event.stopPropagation();
       
  1820 
       
  1821 				// Only trigger if we've ever bound an event for it
       
  1822 				if ( jQuery.event.global[ type ] ) {
       
  1823 					jQuery.each( jQuery.cache, function() {
       
  1824 						if ( this.events && this.events[type] ) {
       
  1825 							jQuery.event.trigger( event, data, this.handle.elem );
       
  1826 						}
       
  1827 					});
       
  1828 				}
       
  1829 			}
       
  1830 
       
  1831 			// Handle triggering a single element
       
  1832 
       
  1833 			// don't do events on text and comment nodes
       
  1834 			if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
       
  1835 				return undefined;
       
  1836 			}
       
  1837 
       
  1838 			// Clean up in case it is reused
       
  1839 			event.result = undefined;
       
  1840 			event.target = elem;
       
  1841 
       
  1842 			// Clone the incoming data, if any
       
  1843 			data = jQuery.makeArray( data );
       
  1844 			data.unshift( event );
       
  1845 		}
       
  1846 
       
  1847 		event.currentTarget = elem;
       
  1848 
       
  1849 		// Trigger the event, it is assumed that "handle" is a function
       
  1850 		var handle = jQuery.data( elem, "handle" );
       
  1851 		if ( handle ) {
       
  1852 			handle.apply( elem, data );
       
  1853 		}
       
  1854 
       
  1855 		var parent = elem.parentNode || elem.ownerDocument;
       
  1856 
       
  1857 		// Trigger an inline bound script
       
  1858 		try {
       
  1859 			if ( !(elem && elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()]) ) {
       
  1860 				if ( elem[ "on" + type ] && elem[ "on" + type ].apply( elem, data ) === false ) {
       
  1861 					event.result = false;
       
  1862 				}
       
  1863 			}
       
  1864 
       
  1865 		// prevent IE from throwing an error for some elements with some event types, see #3533
       
  1866 		} catch (e) {}
       
  1867 
       
  1868 		if ( !event.isPropagationStopped() && parent ) {
       
  1869 			jQuery.event.trigger( event, data, parent, true );
       
  1870 
       
  1871 		} else if ( !event.isDefaultPrevented() ) {
       
  1872 			var target = event.target, old,
       
  1873 				isClick = jQuery.nodeName(target, "a") && type === "click",
       
  1874 				special = jQuery.event.special[ type ] || {};
       
  1875 
       
  1876 			if ( (!special._default || special._default.call( elem, event ) === false) && 
       
  1877 				!isClick && !(target && target.nodeName && jQuery.noData[target.nodeName.toLowerCase()]) ) {
       
  1878 
       
  1879 				try {
       
  1880 					if ( target[ type ] ) {
       
  1881 						// Make sure that we don't accidentally re-trigger the onFOO events
       
  1882 						old = target[ "on" + type ];
       
  1883 
       
  1884 						if ( old ) {
       
  1885 							target[ "on" + type ] = null;
       
  1886 						}
       
  1887 
       
  1888 						jQuery.event.triggered = true;
       
  1889 						target[ type ]();
       
  1890 					}
       
  1891 
       
  1892 				// prevent IE from throwing an error for some elements with some event types, see #3533
       
  1893 				} catch (e) {}
       
  1894 
       
  1895 				if ( old ) {
       
  1896 					target[ "on" + type ] = old;
       
  1897 				}
       
  1898 
       
  1899 				jQuery.event.triggered = false;
       
  1900 			}
       
  1901 		}
       
  1902 	},
       
  1903 
       
  1904 	handle: function( event ) {
       
  1905 		var all, handlers, namespaces, namespace, events;
       
  1906 
       
  1907 		event = arguments[0] = jQuery.event.fix( event || window.event );
       
  1908 		event.currentTarget = this;
       
  1909 
       
  1910 		// Namespaced event handlers
       
  1911 		all = event.type.indexOf(".") < 0 && !event.exclusive;
       
  1912 
       
  1913 		if ( !all ) {
       
  1914 			namespaces = event.type.split(".");
       
  1915 			event.type = namespaces.shift();
       
  1916 			namespace = new RegExp("(^|\\.)" + namespaces.slice(0).sort().join("\\.(?:.*\\.)?") + "(\\.|$)");
       
  1917 		}
       
  1918 
       
  1919 		var events = jQuery.data(this, "events"), handlers = events[ event.type ];
       
  1920 
       
  1921 		if ( events && handlers ) {
       
  1922 			// Clone the handlers to prevent manipulation
       
  1923 			handlers = handlers.slice(0);
       
  1924 
       
  1925 			for ( var j = 0, l = handlers.length; j < l; j++ ) {
       
  1926 				var handleObj = handlers[ j ];
       
  1927 
       
  1928 				// Filter the functions by class
       
  1929 				if ( all || namespace.test( handleObj.namespace ) ) {
       
  1930 					// Pass in a reference to the handler function itself
       
  1931 					// So that we can later remove it
       
  1932 					event.handler = handleObj.handler;
       
  1933 					event.data = handleObj.data;
       
  1934 					event.handleObj = handleObj;
       
  1935 	
       
  1936 					var ret = handleObj.handler.apply( this, arguments );
       
  1937 
       
  1938 					if ( ret !== undefined ) {
       
  1939 						event.result = ret;
       
  1940 						if ( ret === false ) {
       
  1941 							event.preventDefault();
       
  1942 							event.stopPropagation();
       
  1943 						}
       
  1944 					}
       
  1945 
       
  1946 					if ( event.isImmediatePropagationStopped() ) {
       
  1947 						break;
       
  1948 					}
       
  1949 				}
       
  1950 			}
       
  1951 		}
       
  1952 
       
  1953 		return event.result;
       
  1954 	},
       
  1955 
       
  1956 	props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
       
  1957 
       
  1958 	fix: function( event ) {
       
  1959 		if ( event[ expando ] ) {
       
  1960 			return event;
       
  1961 		}
       
  1962 
       
  1963 		// store a copy of the original event object
       
  1964 		// and "clone" to set read-only properties
       
  1965 		var originalEvent = event;
       
  1966 		event = jQuery.Event( originalEvent );
       
  1967 
       
  1968 		for ( var i = this.props.length, prop; i; ) {
       
  1969 			prop = this.props[ --i ];
       
  1970 			event[ prop ] = originalEvent[ prop ];
       
  1971 		}
       
  1972 
       
  1973 		// Fix target property, if necessary
       
  1974 		if ( !event.target ) {
       
  1975 			event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
       
  1976 		}
       
  1977 
       
  1978 		// check if target is a textnode (safari)
       
  1979 		if ( event.target.nodeType === 3 ) {
       
  1980 			event.target = event.target.parentNode;
       
  1981 		}
       
  1982 
       
  1983 		// Add relatedTarget, if necessary
       
  1984 		if ( !event.relatedTarget && event.fromElement ) {
       
  1985 			event.relatedTarget = event.fromElement === event.target ? event.toElement : event.fromElement;
       
  1986 		}
       
  1987 
       
  1988 		// Calculate pageX/Y if missing and clientX/Y available
       
  1989 		if ( event.pageX == null && event.clientX != null ) {
       
  1990 			var doc = document.documentElement, body = document.body;
       
  1991 			event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
       
  1992 			event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
       
  1993 		}
       
  1994 
       
  1995 		// Add which for key events
       
  1996 		if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) {
       
  1997 			event.which = event.charCode || event.keyCode;
       
  1998 		}
       
  1999 
       
  2000 		// Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs)
       
  2001 		if ( !event.metaKey && event.ctrlKey ) {
       
  2002 			event.metaKey = event.ctrlKey;
       
  2003 		}
       
  2004 
       
  2005 		// Add which for click: 1 === left; 2 === middle; 3 === right
       
  2006 		// Note: button is not normalized, so don't use it
       
  2007 		if ( !event.which && event.button !== undefined ) {
       
  2008 			event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
       
  2009 		}
       
  2010 
       
  2011 		return event;
       
  2012 	},
       
  2013 
       
  2014 	// Deprecated, use jQuery.guid instead
       
  2015 	guid: 1E8,
       
  2016 
       
  2017 	// Deprecated, use jQuery.proxy instead
       
  2018 	proxy: jQuery.proxy,
       
  2019 
       
  2020 	special: {
       
  2021 		ready: {
       
  2022 			// Make sure the ready event is setup
       
  2023 			setup: jQuery.bindReady,
       
  2024 			teardown: jQuery.noop
       
  2025 		},
       
  2026 
       
  2027 		live: {
       
  2028 			add: function( handleObj ) {
       
  2029 				jQuery.event.add( this, handleObj.origType, jQuery.extend({}, handleObj, {handler: liveHandler}) ); 
       
  2030 			},
       
  2031 
       
  2032 			remove: function( handleObj ) {
       
  2033 				var remove = true,
       
  2034 					type = handleObj.origType.replace(rnamespaces, "");
       
  2035 				
       
  2036 				jQuery.each( jQuery.data(this, "events").live || [], function() {
       
  2037 					if ( type === this.origType.replace(rnamespaces, "") ) {
       
  2038 						remove = false;
       
  2039 						return false;
       
  2040 					}
       
  2041 				});
       
  2042 
       
  2043 				if ( remove ) {
       
  2044 					jQuery.event.remove( this, handleObj.origType, liveHandler );
       
  2045 				}
       
  2046 			}
       
  2047 
       
  2048 		},
       
  2049 
       
  2050 		beforeunload: {
       
  2051 			setup: function( data, namespaces, eventHandle ) {
       
  2052 				// We only want to do this special case on windows
       
  2053 				if ( this.setInterval ) {
       
  2054 					this.onbeforeunload = eventHandle;
       
  2055 				}
       
  2056 
       
  2057 				return false;
       
  2058 			},
       
  2059 			teardown: function( namespaces, eventHandle ) {
       
  2060 				if ( this.onbeforeunload === eventHandle ) {
       
  2061 					this.onbeforeunload = null;
       
  2062 				}
       
  2063 			}
       
  2064 		}
       
  2065 	}
       
  2066 };
       
  2067 
       
  2068 var removeEvent = document.removeEventListener ?
       
  2069 	function( elem, type, handle ) {
       
  2070 	    elem.removeEventListener( type, handle, false );
       
  2071 	} :
       
  2072 	function( elem, type, handle ) {
       
  2073 		elem.detachEvent( "on" + type, handle );
       
  2074 	};
       
  2075 
       
  2076 jQuery.Event = function( src ) {
       
  2077 	// Allow instantiation without the 'new' keyword
       
  2078 	if ( !this.preventDefault ) {
       
  2079 		return new jQuery.Event( src );
       
  2080 	}
       
  2081 
       
  2082 	// Event object
       
  2083 	if ( src && src.type ) {
       
  2084 		this.originalEvent = src;
       
  2085 		this.type = src.type;
       
  2086 	// Event type
       
  2087 	} else {
       
  2088 		this.type = src;
       
  2089 	}
       
  2090 
       
  2091 	// timeStamp is buggy for some events on Firefox(#3843)
       
  2092 	// So we won't rely on the native value
       
  2093 	this.timeStamp = now();
       
  2094 
       
  2095 	// Mark it as fixed
       
  2096 	this[ expando ] = true;
       
  2097 };
       
  2098 
       
  2099 function returnFalse() {
       
  2100 	return false;
       
  2101 }
       
  2102 function returnTrue() {
       
  2103 	return true;
       
  2104 }
       
  2105 
       
  2106 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
       
  2107 // http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
       
  2108 jQuery.Event.prototype = {
       
  2109 	preventDefault: function() {
       
  2110 		this.isDefaultPrevented = returnTrue;
       
  2111 
       
  2112 		var e = this.originalEvent;
       
  2113 		if ( !e ) {
       
  2114 			return;
       
  2115 		}
       
  2116 		
       
  2117 		// if preventDefault exists run it on the original event
       
  2118 		if ( e.preventDefault ) {
       
  2119 			e.preventDefault();
       
  2120 		}
       
  2121 		// otherwise set the returnValue property of the original event to false (IE)
       
  2122 		e.returnValue = false;
       
  2123 	},
       
  2124 	stopPropagation: function() {
       
  2125 		this.isPropagationStopped = returnTrue;
       
  2126 
       
  2127 		var e = this.originalEvent;
       
  2128 		if ( !e ) {
       
  2129 			return;
       
  2130 		}
       
  2131 		// if stopPropagation exists run it on the original event
       
  2132 		if ( e.stopPropagation ) {
       
  2133 			e.stopPropagation();
       
  2134 		}
       
  2135 		// otherwise set the cancelBubble property of the original event to true (IE)
       
  2136 		e.cancelBubble = true;
       
  2137 	},
       
  2138 	stopImmediatePropagation: function() {
       
  2139 		this.isImmediatePropagationStopped = returnTrue;
       
  2140 		this.stopPropagation();
       
  2141 	},
       
  2142 	isDefaultPrevented: returnFalse,
       
  2143 	isPropagationStopped: returnFalse,
       
  2144 	isImmediatePropagationStopped: returnFalse
       
  2145 };
       
  2146 
       
  2147 // Checks if an event happened on an element within another element
       
  2148 // Used in jQuery.event.special.mouseenter and mouseleave handlers
       
  2149 var withinElement = function( event ) {
       
  2150 	// Check if mouse(over|out) are still within the same parent element
       
  2151 	var parent = event.relatedTarget;
       
  2152 
       
  2153 	// Firefox sometimes assigns relatedTarget a XUL element
       
  2154 	// which we cannot access the parentNode property of
       
  2155 	try {
       
  2156 		// Traverse up the tree
       
  2157 		while ( parent && parent !== this ) {
       
  2158 			parent = parent.parentNode;
       
  2159 		}
       
  2160 
       
  2161 		if ( parent !== this ) {
       
  2162 			// set the correct event type
       
  2163 			event.type = event.data;
       
  2164 
       
  2165 			// handle event if we actually just moused on to a non sub-element
       
  2166 			jQuery.event.handle.apply( this, arguments );
       
  2167 		}
       
  2168 
       
  2169 	// assuming we've left the element since we most likely mousedover a xul element
       
  2170 	} catch(e) { }
       
  2171 },
       
  2172 
       
  2173 // In case of event delegation, we only need to rename the event.type,
       
  2174 // liveHandler will take care of the rest.
       
  2175 delegate = function( event ) {
       
  2176 	event.type = event.data;
       
  2177 	jQuery.event.handle.apply( this, arguments );
       
  2178 };
       
  2179 
       
  2180 // Create mouseenter and mouseleave events
       
  2181 jQuery.each({
       
  2182 	mouseenter: "mouseover",
       
  2183 	mouseleave: "mouseout"
       
  2184 }, function( orig, fix ) {
       
  2185 	jQuery.event.special[ orig ] = {
       
  2186 		setup: function( data ) {
       
  2187 			jQuery.event.add( this, fix, data && data.selector ? delegate : withinElement, orig );
       
  2188 		},
       
  2189 		teardown: function( data ) {
       
  2190 			jQuery.event.remove( this, fix, data && data.selector ? delegate : withinElement );
       
  2191 		}
       
  2192 	};
       
  2193 });
       
  2194 
       
  2195 // submit delegation
       
  2196 if ( !jQuery.support.submitBubbles ) {
       
  2197 
       
  2198 	jQuery.event.special.submit = {
       
  2199 		setup: function( data, namespaces ) {
       
  2200 			if ( this.nodeName.toLowerCase() !== "form" ) {
       
  2201 				jQuery.event.add(this, "click.specialSubmit", function( e ) {
       
  2202 					var elem = e.target, type = elem.type;
       
  2203 
       
  2204 					if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
       
  2205 						return trigger( "submit", this, arguments );
       
  2206 					}
       
  2207 				});
       
  2208 	 
       
  2209 				jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
       
  2210 					var elem = e.target, type = elem.type;
       
  2211 
       
  2212 					if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
       
  2213 						return trigger( "submit", this, arguments );
       
  2214 					}
       
  2215 				});
       
  2216 
       
  2217 			} else {
       
  2218 				return false;
       
  2219 			}
       
  2220 		},
       
  2221 
       
  2222 		teardown: function( namespaces ) {
       
  2223 			jQuery.event.remove( this, ".specialSubmit" );
       
  2224 		}
       
  2225 	};
       
  2226 
       
  2227 }
       
  2228 
       
  2229 // change delegation, happens here so we have bind.
       
  2230 if ( !jQuery.support.changeBubbles ) {
       
  2231 
       
  2232 	var formElems = /textarea|input|select/i,
       
  2233 
       
  2234 	changeFilters,
       
  2235 
       
  2236 	getVal = function( elem ) {
       
  2237 		var type = elem.type, val = elem.value;
       
  2238 
       
  2239 		if ( type === "radio" || type === "checkbox" ) {
       
  2240 			val = elem.checked;
       
  2241 
       
  2242 		} else if ( type === "select-multiple" ) {
       
  2243 			val = elem.selectedIndex > -1 ?
       
  2244 				jQuery.map( elem.options, function( elem ) {
       
  2245 					return elem.selected;
       
  2246 				}).join("-") :
       
  2247 				"";
       
  2248 
       
  2249 		} else if ( elem.nodeName.toLowerCase() === "select" ) {
       
  2250 			val = elem.selectedIndex;
       
  2251 		}
       
  2252 
       
  2253 		return val;
       
  2254 	},
       
  2255 
       
  2256 	testChange = function testChange( e ) {
       
  2257 		var elem = e.target, data, val;
       
  2258 
       
  2259 		if ( !formElems.test( elem.nodeName ) || elem.readOnly ) {
       
  2260 			return;
       
  2261 		}
       
  2262 
       
  2263 		data = jQuery.data( elem, "_change_data" );
       
  2264 		val = getVal(elem);
       
  2265 
       
  2266 		// the current data will be also retrieved by beforeactivate
       
  2267 		if ( e.type !== "focusout" || elem.type !== "radio" ) {
       
  2268 			jQuery.data( elem, "_change_data", val );
       
  2269 		}
       
  2270 		
       
  2271 		if ( data === undefined || val === data ) {
       
  2272 			return;
       
  2273 		}
       
  2274 
       
  2275 		if ( data != null || val ) {
       
  2276 			e.type = "change";
       
  2277 			return jQuery.event.trigger( e, arguments[1], elem );
       
  2278 		}
       
  2279 	};
       
  2280 
       
  2281 	jQuery.event.special.change = {
       
  2282 		filters: {
       
  2283 			focusout: testChange, 
       
  2284 
       
  2285 			click: function( e ) {
       
  2286 				var elem = e.target, type = elem.type;
       
  2287 
       
  2288 				if ( type === "radio" || type === "checkbox" || elem.nodeName.toLowerCase() === "select" ) {
       
  2289 					return testChange.call( this, e );
       
  2290 				}
       
  2291 			},
       
  2292 
       
  2293 			// Change has to be called before submit
       
  2294 			// Keydown will be called before keypress, which is used in submit-event delegation
       
  2295 			keydown: function( e ) {
       
  2296 				var elem = e.target, type = elem.type;
       
  2297 
       
  2298 				if ( (e.keyCode === 13 && elem.nodeName.toLowerCase() !== "textarea") ||
       
  2299 					(e.keyCode === 32 && (type === "checkbox" || type === "radio")) ||
       
  2300 					type === "select-multiple" ) {
       
  2301 					return testChange.call( this, e );
       
  2302 				}
       
  2303 			},
       
  2304 
       
  2305 			// Beforeactivate happens also before the previous element is blurred
       
  2306 			// with this event you can't trigger a change event, but you can store
       
  2307 			// information/focus[in] is not needed anymore
       
  2308 			beforeactivate: function( e ) {
       
  2309 				var elem = e.target;
       
  2310 				jQuery.data( elem, "_change_data", getVal(elem) );
       
  2311 			}
       
  2312 		},
       
  2313 
       
  2314 		setup: function( data, namespaces ) {
       
  2315 			if ( this.type === "file" ) {
       
  2316 				return false;
       
  2317 			}
       
  2318 
       
  2319 			for ( var type in changeFilters ) {
       
  2320 				jQuery.event.add( this, type + ".specialChange", changeFilters[type] );
       
  2321 			}
       
  2322 
       
  2323 			return formElems.test( this.nodeName );
       
  2324 		},
       
  2325 
       
  2326 		teardown: function( namespaces ) {
       
  2327 			jQuery.event.remove( this, ".specialChange" );
       
  2328 
       
  2329 			return formElems.test( this.nodeName );
       
  2330 		}
       
  2331 	};
       
  2332 
       
  2333 	changeFilters = jQuery.event.special.change.filters;
       
  2334 }
       
  2335 
       
  2336 function trigger( type, elem, args ) {
       
  2337 	args[0].type = type;
       
  2338 	return jQuery.event.handle.apply( elem, args );
       
  2339 }
       
  2340 
       
  2341 // Create "bubbling" focus and blur events
       
  2342 if ( document.addEventListener ) {
       
  2343 	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
       
  2344 		jQuery.event.special[ fix ] = {
       
  2345 			setup: function() {
       
  2346 				this.addEventListener( orig, handler, true );
       
  2347 			}, 
       
  2348 			teardown: function() { 
       
  2349 				this.removeEventListener( orig, handler, true );
       
  2350 			}
       
  2351 		};
       
  2352 
       
  2353 		function handler( e ) { 
       
  2354 			e = jQuery.event.fix( e );
       
  2355 			e.type = fix;
       
  2356 			return jQuery.event.handle.call( this, e );
       
  2357 		}
       
  2358 	});
       
  2359 }
       
  2360 
       
  2361 jQuery.each(["bind", "one"], function( i, name ) {
       
  2362 	jQuery.fn[ name ] = function( type, data, fn ) {
       
  2363 		// Handle object literals
       
  2364 		if ( typeof type === "object" ) {
       
  2365 			for ( var key in type ) {
       
  2366 				this[ name ](key, data, type[key], fn);
       
  2367 			}
       
  2368 			return this;
       
  2369 		}
       
  2370 		
       
  2371 		if ( jQuery.isFunction( data ) ) {
       
  2372 			fn = data;
       
  2373 			data = undefined;
       
  2374 		}
       
  2375 
       
  2376 		var handler = name === "one" ? jQuery.proxy( fn, function( event ) {
       
  2377 			jQuery( this ).unbind( event, handler );
       
  2378 			return fn.apply( this, arguments );
       
  2379 		}) : fn;
       
  2380 
       
  2381 		if ( type === "unload" && name !== "one" ) {
       
  2382 			this.one( type, data, fn );
       
  2383 
       
  2384 		} else {
       
  2385 			for ( var i = 0, l = this.length; i < l; i++ ) {
       
  2386 				jQuery.event.add( this[i], type, handler, data );
       
  2387 			}
       
  2388 		}
       
  2389 
       
  2390 		return this;
       
  2391 	};
       
  2392 });
       
  2393 
       
  2394 jQuery.fn.extend({
       
  2395 	unbind: function( type, fn ) {
       
  2396 		// Handle object literals
       
  2397 		if ( typeof type === "object" && !type.preventDefault ) {
       
  2398 			for ( var key in type ) {
       
  2399 				this.unbind(key, type[key]);
       
  2400 			}
       
  2401 
       
  2402 		} else {
       
  2403 			for ( var i = 0, l = this.length; i < l; i++ ) {
       
  2404 				jQuery.event.remove( this[i], type, fn );
       
  2405 			}
       
  2406 		}
       
  2407 
       
  2408 		return this;
       
  2409 	},
       
  2410 	
       
  2411 	delegate: function( selector, types, data, fn ) {
       
  2412 		return this.live( types, data, fn, selector );
       
  2413 	},
       
  2414 	
       
  2415 	undelegate: function( selector, types, fn ) {
       
  2416 		if ( arguments.length === 0 ) {
       
  2417 				return this.unbind( "live" );
       
  2418 		
       
  2419 		} else {
       
  2420 			return this.die( types, null, fn, selector );
       
  2421 		}
       
  2422 	},
       
  2423 	
       
  2424 	trigger: function( type, data ) {
       
  2425 		return this.each(function() {
       
  2426 			jQuery.event.trigger( type, data, this );
       
  2427 		});
       
  2428 	},
       
  2429 
       
  2430 	triggerHandler: function( type, data ) {
       
  2431 		if ( this[0] ) {
       
  2432 			var event = jQuery.Event( type );
       
  2433 			event.preventDefault();
       
  2434 			event.stopPropagation();
       
  2435 			jQuery.event.trigger( event, data, this[0] );
       
  2436 			return event.result;
       
  2437 		}
       
  2438 	},
       
  2439 
       
  2440 	toggle: function( fn ) {
       
  2441 		// Save reference to arguments for access in closure
       
  2442 		var args = arguments, i = 1;
       
  2443 
       
  2444 		// link all the functions, so any of them can unbind this click handler
       
  2445 		while ( i < args.length ) {
       
  2446 			jQuery.proxy( fn, args[ i++ ] );
       
  2447 		}
       
  2448 
       
  2449 		return this.click( jQuery.proxy( fn, function( event ) {
       
  2450 			// Figure out which function to execute
       
  2451 			var lastToggle = ( jQuery.data( this, "lastToggle" + fn.guid ) || 0 ) % i;
       
  2452 			jQuery.data( this, "lastToggle" + fn.guid, lastToggle + 1 );
       
  2453 
       
  2454 			// Make sure that clicks stop
       
  2455 			event.preventDefault();
       
  2456 
       
  2457 			// and execute the function
       
  2458 			return args[ lastToggle ].apply( this, arguments ) || false;
       
  2459 		}));
       
  2460 	},
       
  2461 
       
  2462 	hover: function( fnOver, fnOut ) {
       
  2463 		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
       
  2464 	}
       
  2465 });
       
  2466 
       
  2467 var liveMap = {
       
  2468 	focus: "focusin",
       
  2469 	blur: "focusout",
       
  2470 	mouseenter: "mouseover",
       
  2471 	mouseleave: "mouseout"
       
  2472 };
       
  2473 
       
  2474 jQuery.each(["live", "die"], function( i, name ) {
       
  2475 	jQuery.fn[ name ] = function( types, data, fn, origSelector /* Internal Use Only */ ) {
       
  2476 		var type, i = 0, match, namespaces, preType,
       
  2477 			selector = origSelector || this.selector,
       
  2478 			context = origSelector ? this : jQuery( this.context );
       
  2479 
       
  2480 		if ( jQuery.isFunction( data ) ) {
       
  2481 			fn = data;
       
  2482 			data = undefined;
       
  2483 		}
       
  2484 
       
  2485 		types = (types || "").split(" ");
       
  2486 
       
  2487 		while ( (type = types[ i++ ]) != null ) {
       
  2488 			match = rnamespaces.exec( type );
       
  2489 			namespaces = "";
       
  2490 
       
  2491 			if ( match )  {
       
  2492 				namespaces = match[0];
       
  2493 				type = type.replace( rnamespaces, "" );
       
  2494 			}
       
  2495 
       
  2496 			if ( type === "hover" ) {
       
  2497 				types.push( "mouseenter" + namespaces, "mouseleave" + namespaces );
       
  2498 				continue;
       
  2499 			}
       
  2500 
       
  2501 			preType = type;
       
  2502 
       
  2503 			if ( type === "focus" || type === "blur" ) {
       
  2504 				types.push( liveMap[ type ] + namespaces );
       
  2505 				type = type + namespaces;
       
  2506 
       
  2507 			} else {
       
  2508 				type = (liveMap[ type ] || type) + namespaces;
       
  2509 			}
       
  2510 
       
  2511 			if ( name === "live" ) {
       
  2512 				// bind live handler
       
  2513 				context.each(function(){
       
  2514 					jQuery.event.add( this, liveConvert( type, selector ),
       
  2515 						{ data: data, selector: selector, handler: fn, origType: type, origHandler: fn, preType: preType } );
       
  2516 				});
       
  2517 
       
  2518 			} else {
       
  2519 				// unbind live handler
       
  2520 				context.unbind( liveConvert( type, selector ), fn );
       
  2521 			}
       
  2522 		}
       
  2523 		
       
  2524 		return this;
       
  2525 	}
       
  2526 });
       
  2527 
       
  2528 function liveHandler( event ) {
       
  2529 	var stop, elems = [], selectors = [], args = arguments,
       
  2530 		related, match, handleObj, elem, j, i, l, data,
       
  2531 		events = jQuery.data( this, "events" );
       
  2532 
       
  2533 	// Make sure we avoid non-left-click bubbling in Firefox (#3861)
       
  2534 	if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
       
  2535 		return;
       
  2536 	}
       
  2537 
       
  2538 	event.liveFired = this;
       
  2539 
       
  2540 	var live = events.live.slice(0);
       
  2541 
       
  2542 	for ( j = 0; j < live.length; j++ ) {
       
  2543 		handleObj = live[j];
       
  2544 
       
  2545 		if ( handleObj.origType.replace( rnamespaces, "" ) === event.type ) {
       
  2546 			selectors.push( handleObj.selector );
       
  2547 
       
  2548 		} else {
       
  2549 			live.splice( j--, 1 );
       
  2550 		}
       
  2551 	}
       
  2552 
       
  2553 	match = jQuery( event.target ).closest( selectors, event.currentTarget );
       
  2554 
       
  2555 	for ( i = 0, l = match.length; i < l; i++ ) {
       
  2556 		for ( j = 0; j < live.length; j++ ) {
       
  2557 			handleObj = live[j];
       
  2558 
       
  2559 			if ( match[i].selector === handleObj.selector ) {
       
  2560 				elem = match[i].elem;
       
  2561 				related = null;
       
  2562 
       
  2563 				// Those two events require additional checking
       
  2564 				if ( handleObj.preType === "mouseenter" || handleObj.preType === "mouseleave" ) {
       
  2565 					related = jQuery( event.relatedTarget ).closest( handleObj.selector )[0];
       
  2566 				}
       
  2567 
       
  2568 				if ( !related || related !== elem ) {
       
  2569 					elems.push({ elem: elem, handleObj: handleObj });
       
  2570 				}
       
  2571 			}
       
  2572 		}
       
  2573 	}
       
  2574 
       
  2575 	for ( i = 0, l = elems.length; i < l; i++ ) {
       
  2576 		match = elems[i];
       
  2577 		event.currentTarget = match.elem;
       
  2578 		event.data = match.handleObj.data;
       
  2579 		event.handleObj = match.handleObj;
       
  2580 
       
  2581 		if ( match.handleObj.origHandler.apply( match.elem, args ) === false ) {
       
  2582 			stop = false;
       
  2583 			break;
       
  2584 		}
       
  2585 	}
       
  2586 
       
  2587 	return stop;
       
  2588 }
       
  2589 
       
  2590 function liveConvert( type, selector ) {
       
  2591 	return "live." + (type && type !== "*" ? type + "." : "") + selector.replace(/\./g, "`").replace(/ /g, "&");
       
  2592 }
       
  2593 
       
  2594 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
       
  2595 	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
       
  2596 	"change select submit keydown keypress keyup error").split(" "), function( i, name ) {
       
  2597 
       
  2598 	// Handle event binding
       
  2599 	jQuery.fn[ name ] = function( fn ) {
       
  2600 		return fn ? this.bind( name, fn ) : this.trigger( name );
       
  2601 	};
       
  2602 
       
  2603 	if ( jQuery.attrFn ) {
       
  2604 		jQuery.attrFn[ name ] = true;
       
  2605 	}
       
  2606 });
       
  2607 
       
  2608 // Prevent memory leaks in IE
       
  2609 // Window isn't included so as not to unbind existing unload events
       
  2610 // More info:
       
  2611 //  - http://isaacschlueter.com/2006/10/msie-memory-leaks/
       
  2612 if ( window.attachEvent && !window.addEventListener ) {
       
  2613 	window.attachEvent("onunload", function() {
       
  2614 		for ( var id in jQuery.cache ) {
       
  2615 			if ( jQuery.cache[ id ].handle ) {
       
  2616 				// Try/Catch is to handle iframes being unloaded, see #4280
       
  2617 				try {
       
  2618 					jQuery.event.remove( jQuery.cache[ id ].handle.elem );
       
  2619 				} catch(e) {}
       
  2620 			}
       
  2621 		}
       
  2622 	});
       
  2623 }
       
  2624 /*!
       
  2625  * Sizzle CSS Selector Engine - v1.0
       
  2626  *  Copyright 2009, The Dojo Foundation
    16  *  Released under the MIT, BSD, and GPL Licenses.
  2627  *  Released under the MIT, BSD, and GPL Licenses.
    17  *  More information: http://sizzlejs.com/
  2628  *  More information: http://sizzlejs.com/
    18  */
  2629  */
    19 (function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},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 toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();
  2630 (function(){
       
  2631 
       
  2632 var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
       
  2633 	done = 0,
       
  2634 	toString = Object.prototype.toString,
       
  2635 	hasDuplicate = false,
       
  2636 	baseHasDuplicate = true;
       
  2637 
       
  2638 // Here we check if the JavaScript engine is using some sort of
       
  2639 // optimization where it does not always call our comparision
       
  2640 // function. If that is the case, discard the hasDuplicate value.
       
  2641 //   Thus far that includes Google Chrome.
       
  2642 [0, 0].sort(function(){
       
  2643 	baseHasDuplicate = false;
       
  2644 	return 0;
       
  2645 });
       
  2646 
       
  2647 var Sizzle = function(selector, context, results, seed) {
       
  2648 	results = results || [];
       
  2649 	var origContext = context = context || document;
       
  2650 
       
  2651 	if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
       
  2652 		return [];
       
  2653 	}
       
  2654 	
       
  2655 	if ( !selector || typeof selector !== "string" ) {
       
  2656 		return results;
       
  2657 	}
       
  2658 
       
  2659 	var parts = [], m, set, checkSet, extra, prune = true, contextXML = isXML(context),
       
  2660 		soFar = selector;
       
  2661 	
       
  2662 	// Reset the position of the chunker regexp (start from head)
       
  2663 	while ( (chunker.exec(""), m = chunker.exec(soFar)) !== null ) {
       
  2664 		soFar = m[3];
       
  2665 		
       
  2666 		parts.push( m[1] );
       
  2667 		
       
  2668 		if ( m[2] ) {
       
  2669 			extra = m[3];
       
  2670 			break;
       
  2671 		}
       
  2672 	}
       
  2673 
       
  2674 	if ( parts.length > 1 && origPOS.exec( selector ) ) {
       
  2675 		if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
       
  2676 			set = posProcess( parts[0] + parts[1], context );
       
  2677 		} else {
       
  2678 			set = Expr.relative[ parts[0] ] ?
       
  2679 				[ context ] :
       
  2680 				Sizzle( parts.shift(), context );
       
  2681 
       
  2682 			while ( parts.length ) {
       
  2683 				selector = parts.shift();
       
  2684 
       
  2685 				if ( Expr.relative[ selector ] ) {
       
  2686 					selector += parts.shift();
       
  2687 				}
       
  2688 				
       
  2689 				set = posProcess( selector, set );
       
  2690 			}
       
  2691 		}
       
  2692 	} else {
       
  2693 		// Take a shortcut and set the context if the root selector is an ID
       
  2694 		// (but not if it'll be faster if the inner selector is an ID)
       
  2695 		if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
       
  2696 				Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
       
  2697 			var ret = Sizzle.find( parts.shift(), context, contextXML );
       
  2698 			context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
       
  2699 		}
       
  2700 
       
  2701 		if ( context ) {
       
  2702 			var ret = seed ?
       
  2703 				{ expr: parts.pop(), set: makeArray(seed) } :
       
  2704 				Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
       
  2705 			set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
       
  2706 
       
  2707 			if ( parts.length > 0 ) {
       
  2708 				checkSet = makeArray(set);
       
  2709 			} else {
       
  2710 				prune = false;
       
  2711 			}
       
  2712 
       
  2713 			while ( parts.length ) {
       
  2714 				var cur = parts.pop(), pop = cur;
       
  2715 
       
  2716 				if ( !Expr.relative[ cur ] ) {
       
  2717 					cur = "";
       
  2718 				} else {
       
  2719 					pop = parts.pop();
       
  2720 				}
       
  2721 
       
  2722 				if ( pop == null ) {
       
  2723 					pop = context;
       
  2724 				}
       
  2725 
       
  2726 				Expr.relative[ cur ]( checkSet, pop, contextXML );
       
  2727 			}
       
  2728 		} else {
       
  2729 			checkSet = parts = [];
       
  2730 		}
       
  2731 	}
       
  2732 
       
  2733 	if ( !checkSet ) {
       
  2734 		checkSet = set;
       
  2735 	}
       
  2736 
       
  2737 	if ( !checkSet ) {
       
  2738 		Sizzle.error( cur || selector );
       
  2739 	}
       
  2740 
       
  2741 	if ( toString.call(checkSet) === "[object Array]" ) {
       
  2742 		if ( !prune ) {
       
  2743 			results.push.apply( results, checkSet );
       
  2744 		} else if ( context && context.nodeType === 1 ) {
       
  2745 			for ( var i = 0; checkSet[i] != null; i++ ) {
       
  2746 				if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) {
       
  2747 					results.push( set[i] );
       
  2748 				}
       
  2749 			}
       
  2750 		} else {
       
  2751 			for ( var i = 0; checkSet[i] != null; i++ ) {
       
  2752 				if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
       
  2753 					results.push( set[i] );
       
  2754 				}
       
  2755 			}
       
  2756 		}
       
  2757 	} else {
       
  2758 		makeArray( checkSet, results );
       
  2759 	}
       
  2760 
       
  2761 	if ( extra ) {
       
  2762 		Sizzle( extra, origContext, results, seed );
       
  2763 		Sizzle.uniqueSort( results );
       
  2764 	}
       
  2765 
       
  2766 	return results;
       
  2767 };
       
  2768 
       
  2769 Sizzle.uniqueSort = function(results){
       
  2770 	if ( sortOrder ) {
       
  2771 		hasDuplicate = baseHasDuplicate;
       
  2772 		results.sort(sortOrder);
       
  2773 
       
  2774 		if ( hasDuplicate ) {
       
  2775 			for ( var i = 1; i < results.length; i++ ) {
       
  2776 				if ( results[i] === results[i-1] ) {
       
  2777 					results.splice(i--, 1);
       
  2778 				}
       
  2779 			}
       
  2780 		}
       
  2781 	}
       
  2782 
       
  2783 	return results;
       
  2784 };
       
  2785 
       
  2786 Sizzle.matches = function(expr, set){
       
  2787 	return Sizzle(expr, null, null, set);
       
  2788 };
       
  2789 
       
  2790 Sizzle.find = function(expr, context, isXML){
       
  2791 	var set, match;
       
  2792 
       
  2793 	if ( !expr ) {
       
  2794 		return [];
       
  2795 	}
       
  2796 
       
  2797 	for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
       
  2798 		var type = Expr.order[i], match;
       
  2799 		
       
  2800 		if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
       
  2801 			var left = match[1];
       
  2802 			match.splice(1,1);
       
  2803 
       
  2804 			if ( left.substr( left.length - 1 ) !== "\\" ) {
       
  2805 				match[1] = (match[1] || "").replace(/\\/g, "");
       
  2806 				set = Expr.find[ type ]( match, context, isXML );
       
  2807 				if ( set != null ) {
       
  2808 					expr = expr.replace( Expr.match[ type ], "" );
       
  2809 					break;
       
  2810 				}
       
  2811 			}
       
  2812 		}
       
  2813 	}
       
  2814 
       
  2815 	if ( !set ) {
       
  2816 		set = context.getElementsByTagName("*");
       
  2817 	}
       
  2818 
       
  2819 	return {set: set, expr: expr};
       
  2820 };
       
  2821 
       
  2822 Sizzle.filter = function(expr, set, inplace, not){
       
  2823 	var old = expr, result = [], curLoop = set, match, anyFound,
       
  2824 		isXMLFilter = set && set[0] && isXML(set[0]);
       
  2825 
       
  2826 	while ( expr && set.length ) {
       
  2827 		for ( var type in Expr.filter ) {
       
  2828 			if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
       
  2829 				var filter = Expr.filter[ type ], found, item, left = match[1];
       
  2830 				anyFound = false;
       
  2831 
       
  2832 				match.splice(1,1);
       
  2833 
       
  2834 				if ( left.substr( left.length - 1 ) === "\\" ) {
       
  2835 					continue;
       
  2836 				}
       
  2837 
       
  2838 				if ( curLoop === result ) {
       
  2839 					result = [];
       
  2840 				}
       
  2841 
       
  2842 				if ( Expr.preFilter[ type ] ) {
       
  2843 					match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
       
  2844 
       
  2845 					if ( !match ) {
       
  2846 						anyFound = found = true;
       
  2847 					} else if ( match === true ) {
       
  2848 						continue;
       
  2849 					}
       
  2850 				}
       
  2851 
       
  2852 				if ( match ) {
       
  2853 					for ( var i = 0; (item = curLoop[i]) != null; i++ ) {
       
  2854 						if ( item ) {
       
  2855 							found = filter( item, match, i, curLoop );
       
  2856 							var pass = not ^ !!found;
       
  2857 
       
  2858 							if ( inplace && found != null ) {
       
  2859 								if ( pass ) {
       
  2860 									anyFound = true;
       
  2861 								} else {
       
  2862 									curLoop[i] = false;
       
  2863 								}
       
  2864 							} else if ( pass ) {
       
  2865 								result.push( item );
       
  2866 								anyFound = true;
       
  2867 							}
       
  2868 						}
       
  2869 					}
       
  2870 				}
       
  2871 
       
  2872 				if ( found !== undefined ) {
       
  2873 					if ( !inplace ) {
       
  2874 						curLoop = result;
       
  2875 					}
       
  2876 
       
  2877 					expr = expr.replace( Expr.match[ type ], "" );
       
  2878 
       
  2879 					if ( !anyFound ) {
       
  2880 						return [];
       
  2881 					}
       
  2882 
       
  2883 					break;
       
  2884 				}
       
  2885 			}
       
  2886 		}
       
  2887 
       
  2888 		// Improper expression
       
  2889 		if ( expr === old ) {
       
  2890 			if ( anyFound == null ) {
       
  2891 				Sizzle.error( expr );
       
  2892 			} else {
       
  2893 				break;
       
  2894 			}
       
  2895 		}
       
  2896 
       
  2897 		old = expr;
       
  2898 	}
       
  2899 
       
  2900 	return curLoop;
       
  2901 };
       
  2902 
       
  2903 Sizzle.error = function( msg ) {
       
  2904 	throw "Syntax error, unrecognized expression: " + msg;
       
  2905 };
       
  2906 
       
  2907 var Expr = Sizzle.selectors = {
       
  2908 	order: [ "ID", "NAME", "TAG" ],
       
  2909 	match: {
       
  2910 		ID: /#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
       
  2911 		CLASS: /\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
       
  2912 		NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,
       
  2913 		ATTR: /\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,
       
  2914 		TAG: /^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,
       
  2915 		CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,
       
  2916 		POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,
       
  2917 		PSEUDO: /:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
       
  2918 	},
       
  2919 	leftMatch: {},
       
  2920 	attrMap: {
       
  2921 		"class": "className",
       
  2922 		"for": "htmlFor"
       
  2923 	},
       
  2924 	attrHandle: {
       
  2925 		href: function(elem){
       
  2926 			return elem.getAttribute("href");
       
  2927 		}
       
  2928 	},
       
  2929 	relative: {
       
  2930 		"+": function(checkSet, part){
       
  2931 			var isPartStr = typeof part === "string",
       
  2932 				isTag = isPartStr && !/\W/.test(part),
       
  2933 				isPartStrNotTag = isPartStr && !isTag;
       
  2934 
       
  2935 			if ( isTag ) {
       
  2936 				part = part.toLowerCase();
       
  2937 			}
       
  2938 
       
  2939 			for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
       
  2940 				if ( (elem = checkSet[i]) ) {
       
  2941 					while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
       
  2942 
       
  2943 					checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
       
  2944 						elem || false :
       
  2945 						elem === part;
       
  2946 				}
       
  2947 			}
       
  2948 
       
  2949 			if ( isPartStrNotTag ) {
       
  2950 				Sizzle.filter( part, checkSet, true );
       
  2951 			}
       
  2952 		},
       
  2953 		">": function(checkSet, part){
       
  2954 			var isPartStr = typeof part === "string";
       
  2955 
       
  2956 			if ( isPartStr && !/\W/.test(part) ) {
       
  2957 				part = part.toLowerCase();
       
  2958 
       
  2959 				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  2960 					var elem = checkSet[i];
       
  2961 					if ( elem ) {
       
  2962 						var parent = elem.parentNode;
       
  2963 						checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
       
  2964 					}
       
  2965 				}
       
  2966 			} else {
       
  2967 				for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  2968 					var elem = checkSet[i];
       
  2969 					if ( elem ) {
       
  2970 						checkSet[i] = isPartStr ?
       
  2971 							elem.parentNode :
       
  2972 							elem.parentNode === part;
       
  2973 					}
       
  2974 				}
       
  2975 
       
  2976 				if ( isPartStr ) {
       
  2977 					Sizzle.filter( part, checkSet, true );
       
  2978 				}
       
  2979 			}
       
  2980 		},
       
  2981 		"": function(checkSet, part, isXML){
       
  2982 			var doneName = done++, checkFn = dirCheck;
       
  2983 
       
  2984 			if ( typeof part === "string" && !/\W/.test(part) ) {
       
  2985 				var nodeCheck = part = part.toLowerCase();
       
  2986 				checkFn = dirNodeCheck;
       
  2987 			}
       
  2988 
       
  2989 			checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
       
  2990 		},
       
  2991 		"~": function(checkSet, part, isXML){
       
  2992 			var doneName = done++, checkFn = dirCheck;
       
  2993 
       
  2994 			if ( typeof part === "string" && !/\W/.test(part) ) {
       
  2995 				var nodeCheck = part = part.toLowerCase();
       
  2996 				checkFn = dirNodeCheck;
       
  2997 			}
       
  2998 
       
  2999 			checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
       
  3000 		}
       
  3001 	},
       
  3002 	find: {
       
  3003 		ID: function(match, context, isXML){
       
  3004 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
       
  3005 				var m = context.getElementById(match[1]);
       
  3006 				return m ? [m] : [];
       
  3007 			}
       
  3008 		},
       
  3009 		NAME: function(match, context){
       
  3010 			if ( typeof context.getElementsByName !== "undefined" ) {
       
  3011 				var ret = [], results = context.getElementsByName(match[1]);
       
  3012 
       
  3013 				for ( var i = 0, l = results.length; i < l; i++ ) {
       
  3014 					if ( results[i].getAttribute("name") === match[1] ) {
       
  3015 						ret.push( results[i] );
       
  3016 					}
       
  3017 				}
       
  3018 
       
  3019 				return ret.length === 0 ? null : ret;
       
  3020 			}
       
  3021 		},
       
  3022 		TAG: function(match, context){
       
  3023 			return context.getElementsByTagName(match[1]);
       
  3024 		}
       
  3025 	},
       
  3026 	preFilter: {
       
  3027 		CLASS: function(match, curLoop, inplace, result, not, isXML){
       
  3028 			match = " " + match[1].replace(/\\/g, "") + " ";
       
  3029 
       
  3030 			if ( isXML ) {
       
  3031 				return match;
       
  3032 			}
       
  3033 
       
  3034 			for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
       
  3035 				if ( elem ) {
       
  3036 					if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n]/g, " ").indexOf(match) >= 0) ) {
       
  3037 						if ( !inplace ) {
       
  3038 							result.push( elem );
       
  3039 						}
       
  3040 					} else if ( inplace ) {
       
  3041 						curLoop[i] = false;
       
  3042 					}
       
  3043 				}
       
  3044 			}
       
  3045 
       
  3046 			return false;
       
  3047 		},
       
  3048 		ID: function(match){
       
  3049 			return match[1].replace(/\\/g, "");
       
  3050 		},
       
  3051 		TAG: function(match, curLoop){
       
  3052 			return match[1].toLowerCase();
       
  3053 		},
       
  3054 		CHILD: function(match){
       
  3055 			if ( match[1] === "nth" ) {
       
  3056 				// parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
       
  3057 				var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
       
  3058 					match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
       
  3059 					!/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
       
  3060 
       
  3061 				// calculate the numbers (first)n+(last) including if they are negative
       
  3062 				match[2] = (test[1] + (test[2] || 1)) - 0;
       
  3063 				match[3] = test[3] - 0;
       
  3064 			}
       
  3065 
       
  3066 			// TODO: Move to normal caching system
       
  3067 			match[0] = done++;
       
  3068 
       
  3069 			return match;
       
  3070 		},
       
  3071 		ATTR: function(match, curLoop, inplace, result, not, isXML){
       
  3072 			var name = match[1].replace(/\\/g, "");
       
  3073 			
       
  3074 			if ( !isXML && Expr.attrMap[name] ) {
       
  3075 				match[1] = Expr.attrMap[name];
       
  3076 			}
       
  3077 
       
  3078 			if ( match[2] === "~=" ) {
       
  3079 				match[4] = " " + match[4] + " ";
       
  3080 			}
       
  3081 
       
  3082 			return match;
       
  3083 		},
       
  3084 		PSEUDO: function(match, curLoop, inplace, result, not){
       
  3085 			if ( match[1] === "not" ) {
       
  3086 				// If we're dealing with a complex expression, or a simple one
       
  3087 				if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
       
  3088 					match[3] = Sizzle(match[3], null, null, curLoop);
       
  3089 				} else {
       
  3090 					var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
       
  3091 					if ( !inplace ) {
       
  3092 						result.push.apply( result, ret );
       
  3093 					}
       
  3094 					return false;
       
  3095 				}
       
  3096 			} else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
       
  3097 				return true;
       
  3098 			}
       
  3099 			
       
  3100 			return match;
       
  3101 		},
       
  3102 		POS: function(match){
       
  3103 			match.unshift( true );
       
  3104 			return match;
       
  3105 		}
       
  3106 	},
       
  3107 	filters: {
       
  3108 		enabled: function(elem){
       
  3109 			return elem.disabled === false && elem.type !== "hidden";
       
  3110 		},
       
  3111 		disabled: function(elem){
       
  3112 			return elem.disabled === true;
       
  3113 		},
       
  3114 		checked: function(elem){
       
  3115 			return elem.checked === true;
       
  3116 		},
       
  3117 		selected: function(elem){
       
  3118 			// Accessing this property makes selected-by-default
       
  3119 			// options in Safari work properly
       
  3120 			elem.parentNode.selectedIndex;
       
  3121 			return elem.selected === true;
       
  3122 		},
       
  3123 		parent: function(elem){
       
  3124 			return !!elem.firstChild;
       
  3125 		},
       
  3126 		empty: function(elem){
       
  3127 			return !elem.firstChild;
       
  3128 		},
       
  3129 		has: function(elem, i, match){
       
  3130 			return !!Sizzle( match[3], elem ).length;
       
  3131 		},
       
  3132 		header: function(elem){
       
  3133 			return /h\d/i.test( elem.nodeName );
       
  3134 		},
       
  3135 		text: function(elem){
       
  3136 			return "text" === elem.type;
       
  3137 		},
       
  3138 		radio: function(elem){
       
  3139 			return "radio" === elem.type;
       
  3140 		},
       
  3141 		checkbox: function(elem){
       
  3142 			return "checkbox" === elem.type;
       
  3143 		},
       
  3144 		file: function(elem){
       
  3145 			return "file" === elem.type;
       
  3146 		},
       
  3147 		password: function(elem){
       
  3148 			return "password" === elem.type;
       
  3149 		},
       
  3150 		submit: function(elem){
       
  3151 			return "submit" === elem.type;
       
  3152 		},
       
  3153 		image: function(elem){
       
  3154 			return "image" === elem.type;
       
  3155 		},
       
  3156 		reset: function(elem){
       
  3157 			return "reset" === elem.type;
       
  3158 		},
       
  3159 		button: function(elem){
       
  3160 			return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
       
  3161 		},
       
  3162 		input: function(elem){
       
  3163 			return /input|select|textarea|button/i.test(elem.nodeName);
       
  3164 		}
       
  3165 	},
       
  3166 	setFilters: {
       
  3167 		first: function(elem, i){
       
  3168 			return i === 0;
       
  3169 		},
       
  3170 		last: function(elem, i, match, array){
       
  3171 			return i === array.length - 1;
       
  3172 		},
       
  3173 		even: function(elem, i){
       
  3174 			return i % 2 === 0;
       
  3175 		},
       
  3176 		odd: function(elem, i){
       
  3177 			return i % 2 === 1;
       
  3178 		},
       
  3179 		lt: function(elem, i, match){
       
  3180 			return i < match[3] - 0;
       
  3181 		},
       
  3182 		gt: function(elem, i, match){
       
  3183 			return i > match[3] - 0;
       
  3184 		},
       
  3185 		nth: function(elem, i, match){
       
  3186 			return match[3] - 0 === i;
       
  3187 		},
       
  3188 		eq: function(elem, i, match){
       
  3189 			return match[3] - 0 === i;
       
  3190 		}
       
  3191 	},
       
  3192 	filter: {
       
  3193 		PSEUDO: function(elem, match, i, array){
       
  3194 			var name = match[1], filter = Expr.filters[ name ];
       
  3195 
       
  3196 			if ( filter ) {
       
  3197 				return filter( elem, i, match, array );
       
  3198 			} else if ( name === "contains" ) {
       
  3199 				return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
       
  3200 			} else if ( name === "not" ) {
       
  3201 				var not = match[3];
       
  3202 
       
  3203 				for ( var i = 0, l = not.length; i < l; i++ ) {
       
  3204 					if ( not[i] === elem ) {
       
  3205 						return false;
       
  3206 					}
       
  3207 				}
       
  3208 
       
  3209 				return true;
       
  3210 			} else {
       
  3211 				Sizzle.error( "Syntax error, unrecognized expression: " + name );
       
  3212 			}
       
  3213 		},
       
  3214 		CHILD: function(elem, match){
       
  3215 			var type = match[1], node = elem;
       
  3216 			switch (type) {
       
  3217 				case 'only':
       
  3218 				case 'first':
       
  3219 					while ( (node = node.previousSibling) )	 {
       
  3220 						if ( node.nodeType === 1 ) { 
       
  3221 							return false; 
       
  3222 						}
       
  3223 					}
       
  3224 					if ( type === "first" ) { 
       
  3225 						return true; 
       
  3226 					}
       
  3227 					node = elem;
       
  3228 				case 'last':
       
  3229 					while ( (node = node.nextSibling) )	 {
       
  3230 						if ( node.nodeType === 1 ) { 
       
  3231 							return false; 
       
  3232 						}
       
  3233 					}
       
  3234 					return true;
       
  3235 				case 'nth':
       
  3236 					var first = match[2], last = match[3];
       
  3237 
       
  3238 					if ( first === 1 && last === 0 ) {
       
  3239 						return true;
       
  3240 					}
       
  3241 					
       
  3242 					var doneName = match[0],
       
  3243 						parent = elem.parentNode;
       
  3244 	
       
  3245 					if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
       
  3246 						var count = 0;
       
  3247 						for ( node = parent.firstChild; node; node = node.nextSibling ) {
       
  3248 							if ( node.nodeType === 1 ) {
       
  3249 								node.nodeIndex = ++count;
       
  3250 							}
       
  3251 						} 
       
  3252 						parent.sizcache = doneName;
       
  3253 					}
       
  3254 					
       
  3255 					var diff = elem.nodeIndex - last;
       
  3256 					if ( first === 0 ) {
       
  3257 						return diff === 0;
       
  3258 					} else {
       
  3259 						return ( diff % first === 0 && diff / first >= 0 );
       
  3260 					}
       
  3261 			}
       
  3262 		},
       
  3263 		ID: function(elem, match){
       
  3264 			return elem.nodeType === 1 && elem.getAttribute("id") === match;
       
  3265 		},
       
  3266 		TAG: function(elem, match){
       
  3267 			return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
       
  3268 		},
       
  3269 		CLASS: function(elem, match){
       
  3270 			return (" " + (elem.className || elem.getAttribute("class")) + " ")
       
  3271 				.indexOf( match ) > -1;
       
  3272 		},
       
  3273 		ATTR: function(elem, match){
       
  3274 			var name = match[1],
       
  3275 				result = Expr.attrHandle[ name ] ?
       
  3276 					Expr.attrHandle[ name ]( elem ) :
       
  3277 					elem[ name ] != null ?
       
  3278 						elem[ name ] :
       
  3279 						elem.getAttribute( name ),
       
  3280 				value = result + "",
       
  3281 				type = match[2],
       
  3282 				check = match[4];
       
  3283 
       
  3284 			return result == null ?
       
  3285 				type === "!=" :
       
  3286 				type === "=" ?
       
  3287 				value === check :
       
  3288 				type === "*=" ?
       
  3289 				value.indexOf(check) >= 0 :
       
  3290 				type === "~=" ?
       
  3291 				(" " + value + " ").indexOf(check) >= 0 :
       
  3292 				!check ?
       
  3293 				value && result !== false :
       
  3294 				type === "!=" ?
       
  3295 				value !== check :
       
  3296 				type === "^=" ?
       
  3297 				value.indexOf(check) === 0 :
       
  3298 				type === "$=" ?
       
  3299 				value.substr(value.length - check.length) === check :
       
  3300 				type === "|=" ?
       
  3301 				value === check || value.substr(0, check.length + 1) === check + "-" :
       
  3302 				false;
       
  3303 		},
       
  3304 		POS: function(elem, match, i, array){
       
  3305 			var name = match[2], filter = Expr.setFilters[ name ];
       
  3306 
       
  3307 			if ( filter ) {
       
  3308 				return filter( elem, i, match, array );
       
  3309 			}
       
  3310 		}
       
  3311 	}
       
  3312 };
       
  3313 
       
  3314 var origPOS = Expr.match.POS;
       
  3315 
       
  3316 for ( var type in Expr.match ) {
       
  3317 	Expr.match[ type ] = new RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source );
       
  3318 	Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, function(all, num){
       
  3319 		return "\\" + (num - 0 + 1);
       
  3320 	}));
       
  3321 }
       
  3322 
       
  3323 var makeArray = function(array, results) {
       
  3324 	array = Array.prototype.slice.call( array, 0 );
       
  3325 
       
  3326 	if ( results ) {
       
  3327 		results.push.apply( results, array );
       
  3328 		return results;
       
  3329 	}
       
  3330 	
       
  3331 	return array;
       
  3332 };
       
  3333 
       
  3334 // Perform a simple check to determine if the browser is capable of
       
  3335 // converting a NodeList to an array using builtin methods.
       
  3336 // Also verifies that the returned array holds DOM nodes
       
  3337 // (which is not the case in the Blackberry browser)
       
  3338 try {
       
  3339 	Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
       
  3340 
       
  3341 // Provide a fallback method if it does not work
       
  3342 } catch(e){
       
  3343 	makeArray = function(array, results) {
       
  3344 		var ret = results || [];
       
  3345 
       
  3346 		if ( toString.call(array) === "[object Array]" ) {
       
  3347 			Array.prototype.push.apply( ret, array );
       
  3348 		} else {
       
  3349 			if ( typeof array.length === "number" ) {
       
  3350 				for ( var i = 0, l = array.length; i < l; i++ ) {
       
  3351 					ret.push( array[i] );
       
  3352 				}
       
  3353 			} else {
       
  3354 				for ( var i = 0; array[i]; i++ ) {
       
  3355 					ret.push( array[i] );
       
  3356 				}
       
  3357 			}
       
  3358 		}
       
  3359 
       
  3360 		return ret;
       
  3361 	};
       
  3362 }
       
  3363 
       
  3364 var sortOrder;
       
  3365 
       
  3366 if ( document.documentElement.compareDocumentPosition ) {
       
  3367 	sortOrder = function( a, b ) {
       
  3368 		if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
       
  3369 			if ( a == b ) {
       
  3370 				hasDuplicate = true;
       
  3371 			}
       
  3372 			return a.compareDocumentPosition ? -1 : 1;
       
  3373 		}
       
  3374 
       
  3375 		var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
       
  3376 		if ( ret === 0 ) {
       
  3377 			hasDuplicate = true;
       
  3378 		}
       
  3379 		return ret;
       
  3380 	};
       
  3381 } else if ( "sourceIndex" in document.documentElement ) {
       
  3382 	sortOrder = function( a, b ) {
       
  3383 		if ( !a.sourceIndex || !b.sourceIndex ) {
       
  3384 			if ( a == b ) {
       
  3385 				hasDuplicate = true;
       
  3386 			}
       
  3387 			return a.sourceIndex ? -1 : 1;
       
  3388 		}
       
  3389 
       
  3390 		var ret = a.sourceIndex - b.sourceIndex;
       
  3391 		if ( ret === 0 ) {
       
  3392 			hasDuplicate = true;
       
  3393 		}
       
  3394 		return ret;
       
  3395 	};
       
  3396 } else if ( document.createRange ) {
       
  3397 	sortOrder = function( a, b ) {
       
  3398 		if ( !a.ownerDocument || !b.ownerDocument ) {
       
  3399 			if ( a == b ) {
       
  3400 				hasDuplicate = true;
       
  3401 			}
       
  3402 			return a.ownerDocument ? -1 : 1;
       
  3403 		}
       
  3404 
       
  3405 		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
       
  3406 		aRange.setStart(a, 0);
       
  3407 		aRange.setEnd(a, 0);
       
  3408 		bRange.setStart(b, 0);
       
  3409 		bRange.setEnd(b, 0);
       
  3410 		var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
       
  3411 		if ( ret === 0 ) {
       
  3412 			hasDuplicate = true;
       
  3413 		}
       
  3414 		return ret;
       
  3415 	};
       
  3416 }
       
  3417 
       
  3418 // Utility function for retreiving the text value of an array of DOM nodes
       
  3419 function getText( elems ) {
       
  3420 	var ret = "", elem;
       
  3421 
       
  3422 	for ( var i = 0; elems[i]; i++ ) {
       
  3423 		elem = elems[i];
       
  3424 
       
  3425 		// Get the text from text nodes and CDATA nodes
       
  3426 		if ( elem.nodeType === 3 || elem.nodeType === 4 ) {
       
  3427 			ret += elem.nodeValue;
       
  3428 
       
  3429 		// Traverse everything else, except comment nodes
       
  3430 		} else if ( elem.nodeType !== 8 ) {
       
  3431 			ret += getText( elem.childNodes );
       
  3432 		}
       
  3433 	}
       
  3434 
       
  3435 	return ret;
       
  3436 }
       
  3437 
       
  3438 // Check to see if the browser returns elements by name when
       
  3439 // querying by getElementById (and provide a workaround)
       
  3440 (function(){
       
  3441 	// We're going to inject a fake input element with a specified name
       
  3442 	var form = document.createElement("div"),
       
  3443 		id = "script" + (new Date).getTime();
       
  3444 	form.innerHTML = "<a name='" + id + "'/>";
       
  3445 
       
  3446 	// Inject it into the root element, check its status, and remove it quickly
       
  3447 	var root = document.documentElement;
       
  3448 	root.insertBefore( form, root.firstChild );
       
  3449 
       
  3450 	// The workaround has to do additional checks after a getElementById
       
  3451 	// Which slows things down for other browsers (hence the branching)
       
  3452 	if ( document.getElementById( id ) ) {
       
  3453 		Expr.find.ID = function(match, context, isXML){
       
  3454 			if ( typeof context.getElementById !== "undefined" && !isXML ) {
       
  3455 				var m = context.getElementById(match[1]);
       
  3456 				return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
       
  3457 			}
       
  3458 		};
       
  3459 
       
  3460 		Expr.filter.ID = function(elem, match){
       
  3461 			var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
       
  3462 			return elem.nodeType === 1 && node && node.nodeValue === match;
       
  3463 		};
       
  3464 	}
       
  3465 
       
  3466 	root.removeChild( form );
       
  3467 	root = form = null; // release memory in IE
       
  3468 })();
       
  3469 
       
  3470 (function(){
       
  3471 	// Check to see if the browser returns only elements
       
  3472 	// when doing getElementsByTagName("*")
       
  3473 
       
  3474 	// Create a fake element
       
  3475 	var div = document.createElement("div");
       
  3476 	div.appendChild( document.createComment("") );
       
  3477 
       
  3478 	// Make sure no comments are found
       
  3479 	if ( div.getElementsByTagName("*").length > 0 ) {
       
  3480 		Expr.find.TAG = function(match, context){
       
  3481 			var results = context.getElementsByTagName(match[1]);
       
  3482 
       
  3483 			// Filter out possible comments
       
  3484 			if ( match[1] === "*" ) {
       
  3485 				var tmp = [];
       
  3486 
       
  3487 				for ( var i = 0; results[i]; i++ ) {
       
  3488 					if ( results[i].nodeType === 1 ) {
       
  3489 						tmp.push( results[i] );
       
  3490 					}
       
  3491 				}
       
  3492 
       
  3493 				results = tmp;
       
  3494 			}
       
  3495 
       
  3496 			return results;
       
  3497 		};
       
  3498 	}
       
  3499 
       
  3500 	// Check to see if an attribute returns normalized href attributes
       
  3501 	div.innerHTML = "<a href='#'></a>";
       
  3502 	if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
       
  3503 			div.firstChild.getAttribute("href") !== "#" ) {
       
  3504 		Expr.attrHandle.href = function(elem){
       
  3505 			return elem.getAttribute("href", 2);
       
  3506 		};
       
  3507 	}
       
  3508 
       
  3509 	div = null; // release memory in IE
       
  3510 })();
       
  3511 
       
  3512 if ( document.querySelectorAll ) {
       
  3513 	(function(){
       
  3514 		var oldSizzle = Sizzle, div = document.createElement("div");
       
  3515 		div.innerHTML = "<p class='TEST'></p>";
       
  3516 
       
  3517 		// Safari can't handle uppercase or unicode characters when
       
  3518 		// in quirks mode.
       
  3519 		if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
       
  3520 			return;
       
  3521 		}
       
  3522 	
       
  3523 		Sizzle = function(query, context, extra, seed){
       
  3524 			context = context || document;
       
  3525 
       
  3526 			// Only use querySelectorAll on non-XML documents
       
  3527 			// (ID selectors don't work in non-HTML documents)
       
  3528 			if ( !seed && context.nodeType === 9 && !isXML(context) ) {
       
  3529 				try {
       
  3530 					return makeArray( context.querySelectorAll(query), extra );
       
  3531 				} catch(e){}
       
  3532 			}
       
  3533 		
       
  3534 			return oldSizzle(query, context, extra, seed);
       
  3535 		};
       
  3536 
       
  3537 		for ( var prop in oldSizzle ) {
       
  3538 			Sizzle[ prop ] = oldSizzle[ prop ];
       
  3539 		}
       
  3540 
       
  3541 		div = null; // release memory in IE
       
  3542 	})();
       
  3543 }
       
  3544 
       
  3545 (function(){
       
  3546 	var div = document.createElement("div");
       
  3547 
       
  3548 	div.innerHTML = "<div class='test e'></div><div class='test'></div>";
       
  3549 
       
  3550 	// Opera can't find a second classname (in 9.6)
       
  3551 	// Also, make sure that getElementsByClassName actually exists
       
  3552 	if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
       
  3553 		return;
       
  3554 	}
       
  3555 
       
  3556 	// Safari caches class attributes, doesn't catch changes (in 3.2)
       
  3557 	div.lastChild.className = "e";
       
  3558 
       
  3559 	if ( div.getElementsByClassName("e").length === 1 ) {
       
  3560 		return;
       
  3561 	}
       
  3562 	
       
  3563 	Expr.order.splice(1, 0, "CLASS");
       
  3564 	Expr.find.CLASS = function(match, context, isXML) {
       
  3565 		if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
       
  3566 			return context.getElementsByClassName(match[1]);
       
  3567 		}
       
  3568 	};
       
  3569 
       
  3570 	div = null; // release memory in IE
       
  3571 })();
       
  3572 
       
  3573 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
       
  3574 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  3575 		var elem = checkSet[i];
       
  3576 		if ( elem ) {
       
  3577 			elem = elem[dir];
       
  3578 			var match = false;
       
  3579 
       
  3580 			while ( elem ) {
       
  3581 				if ( elem.sizcache === doneName ) {
       
  3582 					match = checkSet[elem.sizset];
       
  3583 					break;
       
  3584 				}
       
  3585 
       
  3586 				if ( elem.nodeType === 1 && !isXML ){
       
  3587 					elem.sizcache = doneName;
       
  3588 					elem.sizset = i;
       
  3589 				}
       
  3590 
       
  3591 				if ( elem.nodeName.toLowerCase() === cur ) {
       
  3592 					match = elem;
       
  3593 					break;
       
  3594 				}
       
  3595 
       
  3596 				elem = elem[dir];
       
  3597 			}
       
  3598 
       
  3599 			checkSet[i] = match;
       
  3600 		}
       
  3601 	}
       
  3602 }
       
  3603 
       
  3604 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
       
  3605 	for ( var i = 0, l = checkSet.length; i < l; i++ ) {
       
  3606 		var elem = checkSet[i];
       
  3607 		if ( elem ) {
       
  3608 			elem = elem[dir];
       
  3609 			var match = false;
       
  3610 
       
  3611 			while ( elem ) {
       
  3612 				if ( elem.sizcache === doneName ) {
       
  3613 					match = checkSet[elem.sizset];
       
  3614 					break;
       
  3615 				}
       
  3616 
       
  3617 				if ( elem.nodeType === 1 ) {
       
  3618 					if ( !isXML ) {
       
  3619 						elem.sizcache = doneName;
       
  3620 						elem.sizset = i;
       
  3621 					}
       
  3622 					if ( typeof cur !== "string" ) {
       
  3623 						if ( elem === cur ) {
       
  3624 							match = true;
       
  3625 							break;
       
  3626 						}
       
  3627 
       
  3628 					} else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
       
  3629 						match = elem;
       
  3630 						break;
       
  3631 					}
       
  3632 				}
       
  3633 
       
  3634 				elem = elem[dir];
       
  3635 			}
       
  3636 
       
  3637 			checkSet[i] = match;
       
  3638 		}
       
  3639 	}
       
  3640 }
       
  3641 
       
  3642 var contains = document.compareDocumentPosition ? function(a, b){
       
  3643 	return !!(a.compareDocumentPosition(b) & 16);
       
  3644 } : function(a, b){
       
  3645 	return a !== b && (a.contains ? a.contains(b) : true);
       
  3646 };
       
  3647 
       
  3648 var isXML = function(elem){
       
  3649 	// documentElement is verified for cases where it doesn't yet exist
       
  3650 	// (such as loading iframes in IE - #4833) 
       
  3651 	var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
       
  3652 	return documentElement ? documentElement.nodeName !== "HTML" : false;
       
  3653 };
       
  3654 
       
  3655 var posProcess = function(selector, context){
       
  3656 	var tmpSet = [], later = "", match,
       
  3657 		root = context.nodeType ? [context] : context;
       
  3658 
       
  3659 	// Position selectors must be done after the filter
       
  3660 	// And so must :not(positional) so we move all PSEUDOs to the end
       
  3661 	while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
       
  3662 		later += match[0];
       
  3663 		selector = selector.replace( Expr.match.PSEUDO, "" );
       
  3664 	}
       
  3665 
       
  3666 	selector = Expr.relative[selector] ? selector + "*" : selector;
       
  3667 
       
  3668 	for ( var i = 0, l = root.length; i < l; i++ ) {
       
  3669 		Sizzle( selector, root[i], tmpSet );
       
  3670 	}
       
  3671 
       
  3672 	return Sizzle.filter( later, tmpSet );
       
  3673 };
       
  3674 
       
  3675 // EXPOSE
       
  3676 jQuery.find = Sizzle;
       
  3677 jQuery.expr = Sizzle.selectors;
       
  3678 jQuery.expr[":"] = jQuery.expr.filters;
       
  3679 jQuery.unique = Sizzle.uniqueSort;
       
  3680 jQuery.text = getText;
       
  3681 jQuery.isXMLDoc = isXML;
       
  3682 jQuery.contains = contains;
       
  3683 
       
  3684 return;
       
  3685 
       
  3686 window.Sizzle = Sizzle;
       
  3687 
       
  3688 })();
       
  3689 var runtil = /Until$/,
       
  3690 	rparentsprev = /^(?:parents|prevUntil|prevAll)/,
       
  3691 	// Note: This RegExp should be improved, or likely pulled from Sizzle
       
  3692 	rmultiselector = /,/,
       
  3693 	slice = Array.prototype.slice;
       
  3694 
       
  3695 // Implement the identical functionality for filter and not
       
  3696 var winnow = function( elements, qualifier, keep ) {
       
  3697 	if ( jQuery.isFunction( qualifier ) ) {
       
  3698 		return jQuery.grep(elements, function( elem, i ) {
       
  3699 			return !!qualifier.call( elem, i, elem ) === keep;
       
  3700 		});
       
  3701 
       
  3702 	} else if ( qualifier.nodeType ) {
       
  3703 		return jQuery.grep(elements, function( elem, i ) {
       
  3704 			return (elem === qualifier) === keep;
       
  3705 		});
       
  3706 
       
  3707 	} else if ( typeof qualifier === "string" ) {
       
  3708 		var filtered = jQuery.grep(elements, function( elem ) {
       
  3709 			return elem.nodeType === 1;
       
  3710 		});
       
  3711 
       
  3712 		if ( isSimple.test( qualifier ) ) {
       
  3713 			return jQuery.filter(qualifier, filtered, !keep);
       
  3714 		} else {
       
  3715 			qualifier = jQuery.filter( qualifier, filtered );
       
  3716 		}
       
  3717 	}
       
  3718 
       
  3719 	return jQuery.grep(elements, function( elem, i ) {
       
  3720 		return (jQuery.inArray( elem, qualifier ) >= 0) === keep;
       
  3721 	});
       
  3722 };
       
  3723 
       
  3724 jQuery.fn.extend({
       
  3725 	find: function( selector ) {
       
  3726 		var ret = this.pushStack( "", "find", selector ), length = 0;
       
  3727 
       
  3728 		for ( var i = 0, l = this.length; i < l; i++ ) {
       
  3729 			length = ret.length;
       
  3730 			jQuery.find( selector, this[i], ret );
       
  3731 
       
  3732 			if ( i > 0 ) {
       
  3733 				// Make sure that the results are unique
       
  3734 				for ( var n = length; n < ret.length; n++ ) {
       
  3735 					for ( var r = 0; r < length; r++ ) {
       
  3736 						if ( ret[r] === ret[n] ) {
       
  3737 							ret.splice(n--, 1);
       
  3738 							break;
       
  3739 						}
       
  3740 					}
       
  3741 				}
       
  3742 			}
       
  3743 		}
       
  3744 
       
  3745 		return ret;
       
  3746 	},
       
  3747 
       
  3748 	has: function( target ) {
       
  3749 		var targets = jQuery( target );
       
  3750 		return this.filter(function() {
       
  3751 			for ( var i = 0, l = targets.length; i < l; i++ ) {
       
  3752 				if ( jQuery.contains( this, targets[i] ) ) {
       
  3753 					return true;
       
  3754 				}
       
  3755 			}
       
  3756 		});
       
  3757 	},
       
  3758 
       
  3759 	not: function( selector ) {
       
  3760 		return this.pushStack( winnow(this, selector, false), "not", selector);
       
  3761 	},
       
  3762 
       
  3763 	filter: function( selector ) {
       
  3764 		return this.pushStack( winnow(this, selector, true), "filter", selector );
       
  3765 	},
       
  3766 	
       
  3767 	is: function( selector ) {
       
  3768 		return !!selector && jQuery.filter( selector, this ).length > 0;
       
  3769 	},
       
  3770 
       
  3771 	closest: function( selectors, context ) {
       
  3772 		if ( jQuery.isArray( selectors ) ) {
       
  3773 			var ret = [], cur = this[0], match, matches = {}, selector;
       
  3774 
       
  3775 			if ( cur && selectors.length ) {
       
  3776 				for ( var i = 0, l = selectors.length; i < l; i++ ) {
       
  3777 					selector = selectors[i];
       
  3778 
       
  3779 					if ( !matches[selector] ) {
       
  3780 						matches[selector] = jQuery.expr.match.POS.test( selector ) ? 
       
  3781 							jQuery( selector, context || this.context ) :
       
  3782 							selector;
       
  3783 					}
       
  3784 				}
       
  3785 
       
  3786 				while ( cur && cur.ownerDocument && cur !== context ) {
       
  3787 					for ( selector in matches ) {
       
  3788 						match = matches[selector];
       
  3789 
       
  3790 						if ( match.jquery ? match.index(cur) > -1 : jQuery(cur).is(match) ) {
       
  3791 							ret.push({ selector: selector, elem: cur });
       
  3792 							delete matches[selector];
       
  3793 						}
       
  3794 					}
       
  3795 					cur = cur.parentNode;
       
  3796 				}
       
  3797 			}
       
  3798 
       
  3799 			return ret;
       
  3800 		}
       
  3801 
       
  3802 		var pos = jQuery.expr.match.POS.test( selectors ) ? 
       
  3803 			jQuery( selectors, context || this.context ) : null;
       
  3804 
       
  3805 		return this.map(function( i, cur ) {
       
  3806 			while ( cur && cur.ownerDocument && cur !== context ) {
       
  3807 				if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selectors) ) {
       
  3808 					return cur;
       
  3809 				}
       
  3810 				cur = cur.parentNode;
       
  3811 			}
       
  3812 			return null;
       
  3813 		});
       
  3814 	},
       
  3815 	
       
  3816 	// Determine the position of an element within
       
  3817 	// the matched set of elements
       
  3818 	index: function( elem ) {
       
  3819 		if ( !elem || typeof elem === "string" ) {
       
  3820 			return jQuery.inArray( this[0],
       
  3821 				// If it receives a string, the selector is used
       
  3822 				// If it receives nothing, the siblings are used
       
  3823 				elem ? jQuery( elem ) : this.parent().children() );
       
  3824 		}
       
  3825 		// Locate the position of the desired element
       
  3826 		return jQuery.inArray(
       
  3827 			// If it receives a jQuery object, the first element is used
       
  3828 			elem.jquery ? elem[0] : elem, this );
       
  3829 	},
       
  3830 
       
  3831 	add: function( selector, context ) {
       
  3832 		var set = typeof selector === "string" ?
       
  3833 				jQuery( selector, context || this.context ) :
       
  3834 				jQuery.makeArray( selector ),
       
  3835 			all = jQuery.merge( this.get(), set );
       
  3836 
       
  3837 		return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
       
  3838 			all :
       
  3839 			jQuery.unique( all ) );
       
  3840 	},
       
  3841 
       
  3842 	andSelf: function() {
       
  3843 		return this.add( this.prevObject );
       
  3844 	}
       
  3845 });
       
  3846 
       
  3847 // A painfully simple check to see if an element is disconnected
       
  3848 // from a document (should be improved, where feasible).
       
  3849 function isDisconnected( node ) {
       
  3850 	return !node || !node.parentNode || node.parentNode.nodeType === 11;
       
  3851 }
       
  3852 
       
  3853 jQuery.each({
       
  3854 	parent: function( elem ) {
       
  3855 		var parent = elem.parentNode;
       
  3856 		return parent && parent.nodeType !== 11 ? parent : null;
       
  3857 	},
       
  3858 	parents: function( elem ) {
       
  3859 		return jQuery.dir( elem, "parentNode" );
       
  3860 	},
       
  3861 	parentsUntil: function( elem, i, until ) {
       
  3862 		return jQuery.dir( elem, "parentNode", until );
       
  3863 	},
       
  3864 	next: function( elem ) {
       
  3865 		return jQuery.nth( elem, 2, "nextSibling" );
       
  3866 	},
       
  3867 	prev: function( elem ) {
       
  3868 		return jQuery.nth( elem, 2, "previousSibling" );
       
  3869 	},
       
  3870 	nextAll: function( elem ) {
       
  3871 		return jQuery.dir( elem, "nextSibling" );
       
  3872 	},
       
  3873 	prevAll: function( elem ) {
       
  3874 		return jQuery.dir( elem, "previousSibling" );
       
  3875 	},
       
  3876 	nextUntil: function( elem, i, until ) {
       
  3877 		return jQuery.dir( elem, "nextSibling", until );
       
  3878 	},
       
  3879 	prevUntil: function( elem, i, until ) {
       
  3880 		return jQuery.dir( elem, "previousSibling", until );
       
  3881 	},
       
  3882 	siblings: function( elem ) {
       
  3883 		return jQuery.sibling( elem.parentNode.firstChild, elem );
       
  3884 	},
       
  3885 	children: function( elem ) {
       
  3886 		return jQuery.sibling( elem.firstChild );
       
  3887 	},
       
  3888 	contents: function( elem ) {
       
  3889 		return jQuery.nodeName( elem, "iframe" ) ?
       
  3890 			elem.contentDocument || elem.contentWindow.document :
       
  3891 			jQuery.makeArray( elem.childNodes );
       
  3892 	}
       
  3893 }, function( name, fn ) {
       
  3894 	jQuery.fn[ name ] = function( until, selector ) {
       
  3895 		var ret = jQuery.map( this, fn, until );
       
  3896 		
       
  3897 		if ( !runtil.test( name ) ) {
       
  3898 			selector = until;
       
  3899 		}
       
  3900 
       
  3901 		if ( selector && typeof selector === "string" ) {
       
  3902 			ret = jQuery.filter( selector, ret );
       
  3903 		}
       
  3904 
       
  3905 		ret = this.length > 1 ? jQuery.unique( ret ) : ret;
       
  3906 
       
  3907 		if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
       
  3908 			ret = ret.reverse();
       
  3909 		}
       
  3910 
       
  3911 		return this.pushStack( ret, name, slice.call(arguments).join(",") );
       
  3912 	};
       
  3913 });
       
  3914 
       
  3915 jQuery.extend({
       
  3916 	filter: function( expr, elems, not ) {
       
  3917 		if ( not ) {
       
  3918 			expr = ":not(" + expr + ")";
       
  3919 		}
       
  3920 
       
  3921 		return jQuery.find.matches(expr, elems);
       
  3922 	},
       
  3923 	
       
  3924 	dir: function( elem, dir, until ) {
       
  3925 		var matched = [], cur = elem[dir];
       
  3926 		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
       
  3927 			if ( cur.nodeType === 1 ) {
       
  3928 				matched.push( cur );
       
  3929 			}
       
  3930 			cur = cur[dir];
       
  3931 		}
       
  3932 		return matched;
       
  3933 	},
       
  3934 
       
  3935 	nth: function( cur, result, dir, elem ) {
       
  3936 		result = result || 1;
       
  3937 		var num = 0;
       
  3938 
       
  3939 		for ( ; cur; cur = cur[dir] ) {
       
  3940 			if ( cur.nodeType === 1 && ++num === result ) {
       
  3941 				break;
       
  3942 			}
       
  3943 		}
       
  3944 
       
  3945 		return cur;
       
  3946 	},
       
  3947 
       
  3948 	sibling: function( n, elem ) {
       
  3949 		var r = [];
       
  3950 
       
  3951 		for ( ; n; n = n.nextSibling ) {
       
  3952 			if ( n.nodeType === 1 && n !== elem ) {
       
  3953 				r.push( n );
       
  3954 			}
       
  3955 		}
       
  3956 
       
  3957 		return r;
       
  3958 	}
       
  3959 });
       
  3960 var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
       
  3961 	rleadingWhitespace = /^\s+/,
       
  3962 	rxhtmlTag = /(<([\w:]+)[^>]*?)\/>/g,
       
  3963 	rselfClosing = /^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,
       
  3964 	rtagName = /<([\w:]+)/,
       
  3965 	rtbody = /<tbody/i,
       
  3966 	rhtml = /<|&#?\w+;/,
       
  3967 	rnocache = /<script|<object|<embed|<option|<style/i,
       
  3968 	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
       
  3969 	fcloseTag = function( all, front, tag ) {
       
  3970 		return rselfClosing.test( tag ) ?
       
  3971 			all :
       
  3972 			front + "></" + tag + ">";
       
  3973 	},
       
  3974 	wrapMap = {
       
  3975 		option: [ 1, "<select multiple='multiple'>", "</select>" ],
       
  3976 		legend: [ 1, "<fieldset>", "</fieldset>" ],
       
  3977 		thead: [ 1, "<table>", "</table>" ],
       
  3978 		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
       
  3979 		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
       
  3980 		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
       
  3981 		area: [ 1, "<map>", "</map>" ],
       
  3982 		_default: [ 0, "", "" ]
       
  3983 	};
       
  3984 
       
  3985 wrapMap.optgroup = wrapMap.option;
       
  3986 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
       
  3987 wrapMap.th = wrapMap.td;
       
  3988 
       
  3989 // IE can't serialize <link> and <script> tags normally
       
  3990 if ( !jQuery.support.htmlSerialize ) {
       
  3991 	wrapMap._default = [ 1, "div<div>", "</div>" ];
       
  3992 }
       
  3993 
       
  3994 jQuery.fn.extend({
       
  3995 	text: function( text ) {
       
  3996 		if ( jQuery.isFunction(text) ) {
       
  3997 			return this.each(function(i) {
       
  3998 				var self = jQuery(this);
       
  3999 				self.text( text.call(this, i, self.text()) );
       
  4000 			});
       
  4001 		}
       
  4002 
       
  4003 		if ( typeof text !== "object" && text !== undefined ) {
       
  4004 			return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
       
  4005 		}
       
  4006 
       
  4007 		return jQuery.text( this );
       
  4008 	},
       
  4009 
       
  4010 	wrapAll: function( html ) {
       
  4011 		if ( jQuery.isFunction( html ) ) {
       
  4012 			return this.each(function(i) {
       
  4013 				jQuery(this).wrapAll( html.call(this, i) );
       
  4014 			});
       
  4015 		}
       
  4016 
       
  4017 		if ( this[0] ) {
       
  4018 			// The elements to wrap the target around
       
  4019 			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
       
  4020 
       
  4021 			if ( this[0].parentNode ) {
       
  4022 				wrap.insertBefore( this[0] );
       
  4023 			}
       
  4024 
       
  4025 			wrap.map(function() {
       
  4026 				var elem = this;
       
  4027 
       
  4028 				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
       
  4029 					elem = elem.firstChild;
       
  4030 				}
       
  4031 
       
  4032 				return elem;
       
  4033 			}).append(this);
       
  4034 		}
       
  4035 
       
  4036 		return this;
       
  4037 	},
       
  4038 
       
  4039 	wrapInner: function( html ) {
       
  4040 		if ( jQuery.isFunction( html ) ) {
       
  4041 			return this.each(function(i) {
       
  4042 				jQuery(this).wrapInner( html.call(this, i) );
       
  4043 			});
       
  4044 		}
       
  4045 
       
  4046 		return this.each(function() {
       
  4047 			var self = jQuery( this ), contents = self.contents();
       
  4048 
       
  4049 			if ( contents.length ) {
       
  4050 				contents.wrapAll( html );
       
  4051 
       
  4052 			} else {
       
  4053 				self.append( html );
       
  4054 			}
       
  4055 		});
       
  4056 	},
       
  4057 
       
  4058 	wrap: function( html ) {
       
  4059 		return this.each(function() {
       
  4060 			jQuery( this ).wrapAll( html );
       
  4061 		});
       
  4062 	},
       
  4063 
       
  4064 	unwrap: function() {
       
  4065 		return this.parent().each(function() {
       
  4066 			if ( !jQuery.nodeName( this, "body" ) ) {
       
  4067 				jQuery( this ).replaceWith( this.childNodes );
       
  4068 			}
       
  4069 		}).end();
       
  4070 	},
       
  4071 
       
  4072 	append: function() {
       
  4073 		return this.domManip(arguments, true, function( elem ) {
       
  4074 			if ( this.nodeType === 1 ) {
       
  4075 				this.appendChild( elem );
       
  4076 			}
       
  4077 		});
       
  4078 	},
       
  4079 
       
  4080 	prepend: function() {
       
  4081 		return this.domManip(arguments, true, function( elem ) {
       
  4082 			if ( this.nodeType === 1 ) {
       
  4083 				this.insertBefore( elem, this.firstChild );
       
  4084 			}
       
  4085 		});
       
  4086 	},
       
  4087 
       
  4088 	before: function() {
       
  4089 		if ( this[0] && this[0].parentNode ) {
       
  4090 			return this.domManip(arguments, false, function( elem ) {
       
  4091 				this.parentNode.insertBefore( elem, this );
       
  4092 			});
       
  4093 		} else if ( arguments.length ) {
       
  4094 			var set = jQuery(arguments[0]);
       
  4095 			set.push.apply( set, this.toArray() );
       
  4096 			return this.pushStack( set, "before", arguments );
       
  4097 		}
       
  4098 	},
       
  4099 
       
  4100 	after: function() {
       
  4101 		if ( this[0] && this[0].parentNode ) {
       
  4102 			return this.domManip(arguments, false, function( elem ) {
       
  4103 				this.parentNode.insertBefore( elem, this.nextSibling );
       
  4104 			});
       
  4105 		} else if ( arguments.length ) {
       
  4106 			var set = this.pushStack( this, "after", arguments );
       
  4107 			set.push.apply( set, jQuery(arguments[0]).toArray() );
       
  4108 			return set;
       
  4109 		}
       
  4110 	},
       
  4111 	
       
  4112 	// keepData is for internal use only--do not document
       
  4113 	remove: function( selector, keepData ) {
       
  4114 		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
       
  4115 			if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
       
  4116 				if ( !keepData && elem.nodeType === 1 ) {
       
  4117 					jQuery.cleanData( elem.getElementsByTagName("*") );
       
  4118 					jQuery.cleanData( [ elem ] );
       
  4119 				}
       
  4120 
       
  4121 				if ( elem.parentNode ) {
       
  4122 					 elem.parentNode.removeChild( elem );
       
  4123 				}
       
  4124 			}
       
  4125 		}
       
  4126 		
       
  4127 		return this;
       
  4128 	},
       
  4129 
       
  4130 	empty: function() {
       
  4131 		for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
       
  4132 			// Remove element nodes and prevent memory leaks
       
  4133 			if ( elem.nodeType === 1 ) {
       
  4134 				jQuery.cleanData( elem.getElementsByTagName("*") );
       
  4135 			}
       
  4136 
       
  4137 			// Remove any remaining nodes
       
  4138 			while ( elem.firstChild ) {
       
  4139 				elem.removeChild( elem.firstChild );
       
  4140 			}
       
  4141 		}
       
  4142 		
       
  4143 		return this;
       
  4144 	},
       
  4145 
       
  4146 	clone: function( events ) {
       
  4147 		// Do the clone
       
  4148 		var ret = this.map(function() {
       
  4149 			if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) {
       
  4150 				// IE copies events bound via attachEvent when
       
  4151 				// using cloneNode. Calling detachEvent on the
       
  4152 				// clone will also remove the events from the orignal
       
  4153 				// In order to get around this, we use innerHTML.
       
  4154 				// Unfortunately, this means some modifications to
       
  4155 				// attributes in IE that are actually only stored
       
  4156 				// as properties will not be copied (such as the
       
  4157 				// the name attribute on an input).
       
  4158 				var html = this.outerHTML, ownerDocument = this.ownerDocument;
       
  4159 				if ( !html ) {
       
  4160 					var div = ownerDocument.createElement("div");
       
  4161 					div.appendChild( this.cloneNode(true) );
       
  4162 					html = div.innerHTML;
       
  4163 				}
       
  4164 
       
  4165 				return jQuery.clean([html.replace(rinlinejQuery, "")
       
  4166 					// Handle the case in IE 8 where action=/test/> self-closes a tag
       
  4167 					.replace(/=([^="'>\s]+\/)>/g, '="$1">')
       
  4168 					.replace(rleadingWhitespace, "")], ownerDocument)[0];
       
  4169 			} else {
       
  4170 				return this.cloneNode(true);
       
  4171 			}
       
  4172 		});
       
  4173 
       
  4174 		// Copy the events from the original to the clone
       
  4175 		if ( events === true ) {
       
  4176 			cloneCopyEvent( this, ret );
       
  4177 			cloneCopyEvent( this.find("*"), ret.find("*") );
       
  4178 		}
       
  4179 
       
  4180 		// Return the cloned set
       
  4181 		return ret;
       
  4182 	},
       
  4183 
       
  4184 	html: function( value ) {
       
  4185 		if ( value === undefined ) {
       
  4186 			return this[0] && this[0].nodeType === 1 ?
       
  4187 				this[0].innerHTML.replace(rinlinejQuery, "") :
       
  4188 				null;
       
  4189 
       
  4190 		// See if we can take a shortcut and just use innerHTML
       
  4191 		} else if ( typeof value === "string" && !rnocache.test( value ) &&
       
  4192 			(jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
       
  4193 			!wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
       
  4194 
       
  4195 			value = value.replace(rxhtmlTag, fcloseTag);
       
  4196 
       
  4197 			try {
       
  4198 				for ( var i = 0, l = this.length; i < l; i++ ) {
       
  4199 					// Remove element nodes and prevent memory leaks
       
  4200 					if ( this[i].nodeType === 1 ) {
       
  4201 						jQuery.cleanData( this[i].getElementsByTagName("*") );
       
  4202 						this[i].innerHTML = value;
       
  4203 					}
       
  4204 				}
       
  4205 
       
  4206 			// If using innerHTML throws an exception, use the fallback method
       
  4207 			} catch(e) {
       
  4208 				this.empty().append( value );
       
  4209 			}
       
  4210 
       
  4211 		} else if ( jQuery.isFunction( value ) ) {
       
  4212 			this.each(function(i){
       
  4213 				var self = jQuery(this), old = self.html();
       
  4214 				self.empty().append(function(){
       
  4215 					return value.call( this, i, old );
       
  4216 				});
       
  4217 			});
       
  4218 
       
  4219 		} else {
       
  4220 			this.empty().append( value );
       
  4221 		}
       
  4222 
       
  4223 		return this;
       
  4224 	},
       
  4225 
       
  4226 	replaceWith: function( value ) {
       
  4227 		if ( this[0] && this[0].parentNode ) {
       
  4228 			// Make sure that the elements are removed from the DOM before they are inserted
       
  4229 			// this can help fix replacing a parent with child elements
       
  4230 			if ( jQuery.isFunction( value ) ) {
       
  4231 				return this.each(function(i) {
       
  4232 					var self = jQuery(this), old = self.html();
       
  4233 					self.replaceWith( value.call( this, i, old ) );
       
  4234 				});
       
  4235 			}
       
  4236 
       
  4237 			if ( typeof value !== "string" ) {
       
  4238 				value = jQuery(value).detach();
       
  4239 			}
       
  4240 
       
  4241 			return this.each(function() {
       
  4242 				var next = this.nextSibling, parent = this.parentNode;
       
  4243 
       
  4244 				jQuery(this).remove();
       
  4245 
       
  4246 				if ( next ) {
       
  4247 					jQuery(next).before( value );
       
  4248 				} else {
       
  4249 					jQuery(parent).append( value );
       
  4250 				}
       
  4251 			});
       
  4252 		} else {
       
  4253 			return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
       
  4254 		}
       
  4255 	},
       
  4256 
       
  4257 	detach: function( selector ) {
       
  4258 		return this.remove( selector, true );
       
  4259 	},
       
  4260 
       
  4261 	domManip: function( args, table, callback ) {
       
  4262 		var results, first, value = args[0], scripts = [], fragment, parent;
       
  4263 
       
  4264 		// We can't cloneNode fragments that contain checked, in WebKit
       
  4265 		if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
       
  4266 			return this.each(function() {
       
  4267 				jQuery(this).domManip( args, table, callback, true );
       
  4268 			});
       
  4269 		}
       
  4270 
       
  4271 		if ( jQuery.isFunction(value) ) {
       
  4272 			return this.each(function(i) {
       
  4273 				var self = jQuery(this);
       
  4274 				args[0] = value.call(this, i, table ? self.html() : undefined);
       
  4275 				self.domManip( args, table, callback );
       
  4276 			});
       
  4277 		}
       
  4278 
       
  4279 		if ( this[0] ) {
       
  4280 			parent = value && value.parentNode;
       
  4281 
       
  4282 			// If we're in a fragment, just use that instead of building a new one
       
  4283 			if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
       
  4284 				results = { fragment: parent };
       
  4285 
       
  4286 			} else {
       
  4287 				results = buildFragment( args, this, scripts );
       
  4288 			}
       
  4289 			
       
  4290 			fragment = results.fragment;
       
  4291 			
       
  4292 			if ( fragment.childNodes.length === 1 ) {
       
  4293 				first = fragment = fragment.firstChild;
       
  4294 			} else {
       
  4295 				first = fragment.firstChild;
       
  4296 			}
       
  4297 
       
  4298 			if ( first ) {
       
  4299 				table = table && jQuery.nodeName( first, "tr" );
       
  4300 
       
  4301 				for ( var i = 0, l = this.length; i < l; i++ ) {
       
  4302 					callback.call(
       
  4303 						table ?
       
  4304 							root(this[i], first) :
       
  4305 							this[i],
       
  4306 						i > 0 || results.cacheable || this.length > 1  ?
       
  4307 							fragment.cloneNode(true) :
       
  4308 							fragment
       
  4309 					);
       
  4310 				}
       
  4311 			}
       
  4312 
       
  4313 			if ( scripts.length ) {
       
  4314 				jQuery.each( scripts, evalScript );
       
  4315 			}
       
  4316 		}
       
  4317 
       
  4318 		return this;
       
  4319 
       
  4320 		function root( elem, cur ) {
       
  4321 			return jQuery.nodeName(elem, "table") ?
       
  4322 				(elem.getElementsByTagName("tbody")[0] ||
       
  4323 				elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
       
  4324 				elem;
       
  4325 		}
       
  4326 	}
       
  4327 });
       
  4328 
       
  4329 function cloneCopyEvent(orig, ret) {
       
  4330 	var i = 0;
       
  4331 
       
  4332 	ret.each(function() {
       
  4333 		if ( this.nodeName !== (orig[i] && orig[i].nodeName) ) {
       
  4334 			return;
       
  4335 		}
       
  4336 
       
  4337 		var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
       
  4338 
       
  4339 		if ( events ) {
       
  4340 			delete curData.handle;
       
  4341 			curData.events = {};
       
  4342 
       
  4343 			for ( var type in events ) {
       
  4344 				for ( var handler in events[ type ] ) {
       
  4345 					jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data );
       
  4346 				}
       
  4347 			}
       
  4348 		}
       
  4349 	});
       
  4350 }
       
  4351 
       
  4352 function buildFragment( args, nodes, scripts ) {
       
  4353 	var fragment, cacheable, cacheresults,
       
  4354 		doc = (nodes && nodes[0] ? nodes[0].ownerDocument || nodes[0] : document);
       
  4355 
       
  4356 	// Only cache "small" (1/2 KB) strings that are associated with the main document
       
  4357 	// Cloning options loses the selected state, so don't cache them
       
  4358 	// IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
       
  4359 	// Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
       
  4360 	if ( args.length === 1 && typeof args[0] === "string" && args[0].length < 512 && doc === document &&
       
  4361 		!rnocache.test( args[0] ) && (jQuery.support.checkClone || !rchecked.test( args[0] )) ) {
       
  4362 
       
  4363 		cacheable = true;
       
  4364 		cacheresults = jQuery.fragments[ args[0] ];
       
  4365 		if ( cacheresults ) {
       
  4366 			if ( cacheresults !== 1 ) {
       
  4367 				fragment = cacheresults;
       
  4368 			}
       
  4369 		}
       
  4370 	}
       
  4371 
       
  4372 	if ( !fragment ) {
       
  4373 		fragment = doc.createDocumentFragment();
       
  4374 		jQuery.clean( args, doc, fragment, scripts );
       
  4375 	}
       
  4376 
       
  4377 	if ( cacheable ) {
       
  4378 		jQuery.fragments[ args[0] ] = cacheresults ? fragment : 1;
       
  4379 	}
       
  4380 
       
  4381 	return { fragment: fragment, cacheable: cacheable };
       
  4382 }
       
  4383 
       
  4384 jQuery.fragments = {};
       
  4385 
       
  4386 jQuery.each({
       
  4387 	appendTo: "append",
       
  4388 	prependTo: "prepend",
       
  4389 	insertBefore: "before",
       
  4390 	insertAfter: "after",
       
  4391 	replaceAll: "replaceWith"
       
  4392 }, function( name, original ) {
       
  4393 	jQuery.fn[ name ] = function( selector ) {
       
  4394 		var ret = [], insert = jQuery( selector ),
       
  4395 			parent = this.length === 1 && this[0].parentNode;
       
  4396 		
       
  4397 		if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
       
  4398 			insert[ original ]( this[0] );
       
  4399 			return this;
       
  4400 			
       
  4401 		} else {
       
  4402 			for ( var i = 0, l = insert.length; i < l; i++ ) {
       
  4403 				var elems = (i > 0 ? this.clone(true) : this).get();
       
  4404 				jQuery.fn[ original ].apply( jQuery(insert[i]), elems );
       
  4405 				ret = ret.concat( elems );
       
  4406 			}
       
  4407 		
       
  4408 			return this.pushStack( ret, name, insert.selector );
       
  4409 		}
       
  4410 	};
       
  4411 });
       
  4412 
       
  4413 jQuery.extend({
       
  4414 	clean: function( elems, context, fragment, scripts ) {
       
  4415 		context = context || document;
       
  4416 
       
  4417 		// !context.createElement fails in IE with an error but returns typeof 'object'
       
  4418 		if ( typeof context.createElement === "undefined" ) {
       
  4419 			context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
       
  4420 		}
       
  4421 
       
  4422 		var ret = [];
       
  4423 
       
  4424 		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
       
  4425 			if ( typeof elem === "number" ) {
       
  4426 				elem += "";
       
  4427 			}
       
  4428 
       
  4429 			if ( !elem ) {
       
  4430 				continue;
       
  4431 			}
       
  4432 
       
  4433 			// Convert html string into DOM nodes
       
  4434 			if ( typeof elem === "string" && !rhtml.test( elem ) ) {
       
  4435 				elem = context.createTextNode( elem );
       
  4436 
       
  4437 			} else if ( typeof elem === "string" ) {
       
  4438 				// Fix "XHTML"-style tags in all browsers
       
  4439 				elem = elem.replace(rxhtmlTag, fcloseTag);
       
  4440 
       
  4441 				// Trim whitespace, otherwise indexOf won't work as expected
       
  4442 				var tag = (rtagName.exec( elem ) || ["", ""])[1].toLowerCase(),
       
  4443 					wrap = wrapMap[ tag ] || wrapMap._default,
       
  4444 					depth = wrap[0],
       
  4445 					div = context.createElement("div");
       
  4446 
       
  4447 				// Go to html and back, then peel off extra wrappers
       
  4448 				div.innerHTML = wrap[1] + elem + wrap[2];
       
  4449 
       
  4450 				// Move to the right depth
       
  4451 				while ( depth-- ) {
       
  4452 					div = div.lastChild;
       
  4453 				}
       
  4454 
       
  4455 				// Remove IE's autoinserted <tbody> from table fragments
       
  4456 				if ( !jQuery.support.tbody ) {
       
  4457 
       
  4458 					// String was a <table>, *may* have spurious <tbody>
       
  4459 					var hasBody = rtbody.test(elem),
       
  4460 						tbody = tag === "table" && !hasBody ?
       
  4461 							div.firstChild && div.firstChild.childNodes :
       
  4462 
       
  4463 							// String was a bare <thead> or <tfoot>
       
  4464 							wrap[1] === "<table>" && !hasBody ?
       
  4465 								div.childNodes :
       
  4466 								[];
       
  4467 
       
  4468 					for ( var j = tbody.length - 1; j >= 0 ; --j ) {
       
  4469 						if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
       
  4470 							tbody[ j ].parentNode.removeChild( tbody[ j ] );
       
  4471 						}
       
  4472 					}
       
  4473 
       
  4474 				}
       
  4475 
       
  4476 				// IE completely kills leading whitespace when innerHTML is used
       
  4477 				if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
       
  4478 					div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
       
  4479 				}
       
  4480 
       
  4481 				elem = div.childNodes;
       
  4482 			}
       
  4483 
       
  4484 			if ( elem.nodeType ) {
       
  4485 				ret.push( elem );
       
  4486 			} else {
       
  4487 				ret = jQuery.merge( ret, elem );
       
  4488 			}
       
  4489 		}
       
  4490 
       
  4491 		if ( fragment ) {
       
  4492 			for ( var i = 0; ret[i]; i++ ) {
       
  4493 				if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
       
  4494 					scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
       
  4495 				
       
  4496 				} else {
       
  4497 					if ( ret[i].nodeType === 1 ) {
       
  4498 						ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) );
       
  4499 					}
       
  4500 					fragment.appendChild( ret[i] );
       
  4501 				}
       
  4502 			}
       
  4503 		}
       
  4504 
       
  4505 		return ret;
       
  4506 	},
       
  4507 	
       
  4508 	cleanData: function( elems ) {
       
  4509 		var data, id, cache = jQuery.cache,
       
  4510 			special = jQuery.event.special,
       
  4511 			deleteExpando = jQuery.support.deleteExpando;
       
  4512 		
       
  4513 		for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
       
  4514 			id = elem[ jQuery.expando ];
       
  4515 			
       
  4516 			if ( id ) {
       
  4517 				data = cache[ id ];
       
  4518 				
       
  4519 				if ( data.events ) {
       
  4520 					for ( var type in data.events ) {
       
  4521 						if ( special[ type ] ) {
       
  4522 							jQuery.event.remove( elem, type );
       
  4523 
       
  4524 						} else {
       
  4525 							removeEvent( elem, type, data.handle );
       
  4526 						}
       
  4527 					}
       
  4528 				}
       
  4529 				
       
  4530 				if ( deleteExpando ) {
       
  4531 					delete elem[ jQuery.expando ];
       
  4532 
       
  4533 				} else if ( elem.removeAttribute ) {
       
  4534 					elem.removeAttribute( jQuery.expando );
       
  4535 				}
       
  4536 				
       
  4537 				delete cache[ id ];
       
  4538 			}
       
  4539 		}
       
  4540 	}
       
  4541 });
       
  4542 // exclude the following css properties to add px
       
  4543 var rexclude = /z-?index|font-?weight|opacity|zoom|line-?height/i,
       
  4544 	ralpha = /alpha\([^)]*\)/,
       
  4545 	ropacity = /opacity=([^)]*)/,
       
  4546 	rfloat = /float/i,
       
  4547 	rdashAlpha = /-([a-z])/ig,
       
  4548 	rupper = /([A-Z])/g,
       
  4549 	rnumpx = /^-?\d+(?:px)?$/i,
       
  4550 	rnum = /^-?\d/,
       
  4551 
       
  4552 	cssShow = { position: "absolute", visibility: "hidden", display:"block" },
       
  4553 	cssWidth = [ "Left", "Right" ],
       
  4554 	cssHeight = [ "Top", "Bottom" ],
       
  4555 
       
  4556 	// cache check for defaultView.getComputedStyle
       
  4557 	getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
       
  4558 	// normalize float css property
       
  4559 	styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat",
       
  4560 	fcamelCase = function( all, letter ) {
       
  4561 		return letter.toUpperCase();
       
  4562 	};
       
  4563 
       
  4564 jQuery.fn.css = function( name, value ) {
       
  4565 	return access( this, name, value, true, function( elem, name, value ) {
       
  4566 		if ( value === undefined ) {
       
  4567 			return jQuery.curCSS( elem, name );
       
  4568 		}
       
  4569 		
       
  4570 		if ( typeof value === "number" && !rexclude.test(name) ) {
       
  4571 			value += "px";
       
  4572 		}
       
  4573 
       
  4574 		jQuery.style( elem, name, value );
       
  4575 	});
       
  4576 };
       
  4577 
       
  4578 jQuery.extend({
       
  4579 	style: function( elem, name, value ) {
       
  4580 		// don't set styles on text and comment nodes
       
  4581 		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 ) {
       
  4582 			return undefined;
       
  4583 		}
       
  4584 
       
  4585 		// ignore negative width and height values #1599
       
  4586 		if ( (name === "width" || name === "height") && parseFloat(value) < 0 ) {
       
  4587 			value = undefined;
       
  4588 		}
       
  4589 
       
  4590 		var style = elem.style || elem, set = value !== undefined;
       
  4591 
       
  4592 		// IE uses filters for opacity
       
  4593 		if ( !jQuery.support.opacity && name === "opacity" ) {
       
  4594 			if ( set ) {
       
  4595 				// IE has trouble with opacity if it does not have layout
       
  4596 				// Force it by setting the zoom level
       
  4597 				style.zoom = 1;
       
  4598 
       
  4599 				// Set the alpha filter to set the opacity
       
  4600 				var opacity = parseInt( value, 10 ) + "" === "NaN" ? "" : "alpha(opacity=" + value * 100 + ")";
       
  4601 				var filter = style.filter || jQuery.curCSS( elem, "filter" ) || "";
       
  4602 				style.filter = ralpha.test(filter) ? filter.replace(ralpha, opacity) : opacity;
       
  4603 			}
       
  4604 
       
  4605 			return style.filter && style.filter.indexOf("opacity=") >= 0 ?
       
  4606 				(parseFloat( ropacity.exec(style.filter)[1] ) / 100) + "":
       
  4607 				"";
       
  4608 		}
       
  4609 
       
  4610 		// Make sure we're using the right name for getting the float value
       
  4611 		if ( rfloat.test( name ) ) {
       
  4612 			name = styleFloat;
       
  4613 		}
       
  4614 
       
  4615 		name = name.replace(rdashAlpha, fcamelCase);
       
  4616 
       
  4617 		if ( set ) {
       
  4618 			style[ name ] = value;
       
  4619 		}
       
  4620 
       
  4621 		return style[ name ];
       
  4622 	},
       
  4623 
       
  4624 	css: function( elem, name, force, extra ) {
       
  4625 		if ( name === "width" || name === "height" ) {
       
  4626 			var val, props = cssShow, which = name === "width" ? cssWidth : cssHeight;
       
  4627 
       
  4628 			function getWH() {
       
  4629 				val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
       
  4630 
       
  4631 				if ( extra === "border" ) {
       
  4632 					return;
       
  4633 				}
       
  4634 
       
  4635 				jQuery.each( which, function() {
       
  4636 					if ( !extra ) {
       
  4637 						val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0;
       
  4638 					}
       
  4639 
       
  4640 					if ( extra === "margin" ) {
       
  4641 						val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0;
       
  4642 					} else {
       
  4643 						val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0;
       
  4644 					}
       
  4645 				});
       
  4646 			}
       
  4647 
       
  4648 			if ( elem.offsetWidth !== 0 ) {
       
  4649 				getWH();
       
  4650 			} else {
       
  4651 				jQuery.swap( elem, props, getWH );
       
  4652 			}
       
  4653 
       
  4654 			return Math.max(0, Math.round(val));
       
  4655 		}
       
  4656 
       
  4657 		return jQuery.curCSS( elem, name, force );
       
  4658 	},
       
  4659 
       
  4660 	curCSS: function( elem, name, force ) {
       
  4661 		var ret, style = elem.style, filter;
       
  4662 
       
  4663 		// IE uses filters for opacity
       
  4664 		if ( !jQuery.support.opacity && name === "opacity" && elem.currentStyle ) {
       
  4665 			ret = ropacity.test(elem.currentStyle.filter || "") ?
       
  4666 				(parseFloat(RegExp.$1) / 100) + "" :
       
  4667 				"";
       
  4668 
       
  4669 			return ret === "" ?
       
  4670 				"1" :
       
  4671 				ret;
       
  4672 		}
       
  4673 
       
  4674 		// Make sure we're using the right name for getting the float value
       
  4675 		if ( rfloat.test( name ) ) {
       
  4676 			name = styleFloat;
       
  4677 		}
       
  4678 
       
  4679 		if ( !force && style && style[ name ] ) {
       
  4680 			ret = style[ name ];
       
  4681 
       
  4682 		} else if ( getComputedStyle ) {
       
  4683 
       
  4684 			// Only "float" is needed here
       
  4685 			if ( rfloat.test( name ) ) {
       
  4686 				name = "float";
       
  4687 			}
       
  4688 
       
  4689 			name = name.replace( rupper, "-$1" ).toLowerCase();
       
  4690 
       
  4691 			var defaultView = elem.ownerDocument.defaultView;
       
  4692 
       
  4693 			if ( !defaultView ) {
       
  4694 				return null;
       
  4695 			}
       
  4696 
       
  4697 			var computedStyle = defaultView.getComputedStyle( elem, null );
       
  4698 
       
  4699 			if ( computedStyle ) {
       
  4700 				ret = computedStyle.getPropertyValue( name );
       
  4701 			}
       
  4702 
       
  4703 			// We should always get a number back from opacity
       
  4704 			if ( name === "opacity" && ret === "" ) {
       
  4705 				ret = "1";
       
  4706 			}
       
  4707 
       
  4708 		} else if ( elem.currentStyle ) {
       
  4709 			var camelCase = name.replace(rdashAlpha, fcamelCase);
       
  4710 
       
  4711 			ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ];
       
  4712 
       
  4713 			// From the awesome hack by Dean Edwards
       
  4714 			// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
       
  4715 
       
  4716 			// If we're not dealing with a regular pixel number
       
  4717 			// but a number that has a weird ending, we need to convert it to pixels
       
  4718 			if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
       
  4719 				// Remember the original values
       
  4720 				var left = style.left, rsLeft = elem.runtimeStyle.left;
       
  4721 
       
  4722 				// Put in the new values to get a computed value out
       
  4723 				elem.runtimeStyle.left = elem.currentStyle.left;
       
  4724 				style.left = camelCase === "fontSize" ? "1em" : (ret || 0);
       
  4725 				ret = style.pixelLeft + "px";
       
  4726 
       
  4727 				// Revert the changed values
       
  4728 				style.left = left;
       
  4729 				elem.runtimeStyle.left = rsLeft;
       
  4730 			}
       
  4731 		}
       
  4732 
       
  4733 		return ret;
       
  4734 	},
       
  4735 
       
  4736 	// A method for quickly swapping in/out CSS properties to get correct calculations
       
  4737 	swap: function( elem, options, callback ) {
       
  4738 		var old = {};
       
  4739 
       
  4740 		// Remember the old values, and insert the new ones
       
  4741 		for ( var name in options ) {
       
  4742 			old[ name ] = elem.style[ name ];
       
  4743 			elem.style[ name ] = options[ name ];
       
  4744 		}
       
  4745 
       
  4746 		callback.call( elem );
       
  4747 
       
  4748 		// Revert the old values
       
  4749 		for ( var name in options ) {
       
  4750 			elem.style[ name ] = old[ name ];
       
  4751 		}
       
  4752 	}
       
  4753 });
       
  4754 
       
  4755 if ( jQuery.expr && jQuery.expr.filters ) {
       
  4756 	jQuery.expr.filters.hidden = function( elem ) {
       
  4757 		var width = elem.offsetWidth, height = elem.offsetHeight,
       
  4758 			skip = elem.nodeName.toLowerCase() === "tr";
       
  4759 
       
  4760 		return width === 0 && height === 0 && !skip ?
       
  4761 			true :
       
  4762 			width > 0 && height > 0 && !skip ?
       
  4763 				false :
       
  4764 				jQuery.curCSS(elem, "display") === "none";
       
  4765 	};
       
  4766 
       
  4767 	jQuery.expr.filters.visible = function( elem ) {
       
  4768 		return !jQuery.expr.filters.hidden( elem );
       
  4769 	};
       
  4770 }
       
  4771 var jsc = now(),
       
  4772 	rscript = /<script(.|\s)*?\/script>/gi,
       
  4773 	rselectTextarea = /select|textarea/i,
       
  4774 	rinput = /color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,
       
  4775 	jsre = /=\?(&|$)/,
       
  4776 	rquery = /\?/,
       
  4777 	rts = /(\?|&)_=.*?(&|$)/,
       
  4778 	rurl = /^(\w+:)?\/\/([^\/?#]+)/,
       
  4779 	r20 = /%20/g,
       
  4780 
       
  4781 	// Keep a copy of the old load method
       
  4782 	_load = jQuery.fn.load;
       
  4783 
       
  4784 jQuery.fn.extend({
       
  4785 	load: function( url, params, callback ) {
       
  4786 		if ( typeof url !== "string" ) {
       
  4787 			return _load.call( this, url );
       
  4788 
       
  4789 		// Don't do a request if no elements are being requested
       
  4790 		} else if ( !this.length ) {
       
  4791 			return this;
       
  4792 		}
       
  4793 
       
  4794 		var off = url.indexOf(" ");
       
  4795 		if ( off >= 0 ) {
       
  4796 			var selector = url.slice(off, url.length);
       
  4797 			url = url.slice(0, off);
       
  4798 		}
       
  4799 
       
  4800 		// Default to a GET request
       
  4801 		var type = "GET";
       
  4802 
       
  4803 		// If the second parameter was provided
       
  4804 		if ( params ) {
       
  4805 			// If it's a function
       
  4806 			if ( jQuery.isFunction( params ) ) {
       
  4807 				// We assume that it's the callback
       
  4808 				callback = params;
       
  4809 				params = null;
       
  4810 
       
  4811 			// Otherwise, build a param string
       
  4812 			} else if ( typeof params === "object" ) {
       
  4813 				params = jQuery.param( params, jQuery.ajaxSettings.traditional );
       
  4814 				type = "POST";
       
  4815 			}
       
  4816 		}
       
  4817 
       
  4818 		var self = this;
       
  4819 
       
  4820 		// Request the remote document
       
  4821 		jQuery.ajax({
       
  4822 			url: url,
       
  4823 			type: type,
       
  4824 			dataType: "html",
       
  4825 			data: params,
       
  4826 			complete: function( res, status ) {
       
  4827 				// If successful, inject the HTML into all the matched elements
       
  4828 				if ( status === "success" || status === "notmodified" ) {
       
  4829 					// See if a selector was specified
       
  4830 					self.html( selector ?
       
  4831 						// Create a dummy div to hold the results
       
  4832 						jQuery("<div />")
       
  4833 							// inject the contents of the document in, removing the scripts
       
  4834 							// to avoid any 'Permission Denied' errors in IE
       
  4835 							.append(res.responseText.replace(rscript, ""))
       
  4836 
       
  4837 							// Locate the specified elements
       
  4838 							.find(selector) :
       
  4839 
       
  4840 						// If not, just inject the full result
       
  4841 						res.responseText );
       
  4842 				}
       
  4843 
       
  4844 				if ( callback ) {
       
  4845 					self.each( callback, [res.responseText, status, res] );
       
  4846 				}
       
  4847 			}
       
  4848 		});
       
  4849 
       
  4850 		return this;
       
  4851 	},
       
  4852 
       
  4853 	serialize: function() {
       
  4854 		return jQuery.param(this.serializeArray());
       
  4855 	},
       
  4856 	serializeArray: function() {
       
  4857 		return this.map(function() {
       
  4858 			return this.elements ? jQuery.makeArray(this.elements) : this;
       
  4859 		})
       
  4860 		.filter(function() {
       
  4861 			return this.name && !this.disabled &&
       
  4862 				(this.checked || rselectTextarea.test(this.nodeName) ||
       
  4863 					rinput.test(this.type));
       
  4864 		})
       
  4865 		.map(function( i, elem ) {
       
  4866 			var val = jQuery(this).val();
       
  4867 
       
  4868 			return val == null ?
       
  4869 				null :
       
  4870 				jQuery.isArray(val) ?
       
  4871 					jQuery.map( val, function( val, i ) {
       
  4872 						return { name: elem.name, value: val };
       
  4873 					}) :
       
  4874 					{ name: elem.name, value: val };
       
  4875 		}).get();
       
  4876 	}
       
  4877 });
       
  4878 
       
  4879 // Attach a bunch of functions for handling common AJAX events
       
  4880 jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), function( i, o ) {
       
  4881 	jQuery.fn[o] = function( f ) {
       
  4882 		return this.bind(o, f);
       
  4883 	};
       
  4884 });
       
  4885 
       
  4886 jQuery.extend({
       
  4887 
       
  4888 	get: function( url, data, callback, type ) {
       
  4889 		// shift arguments if data argument was omited
       
  4890 		if ( jQuery.isFunction( data ) ) {
       
  4891 			type = type || callback;
       
  4892 			callback = data;
       
  4893 			data = null;
       
  4894 		}
       
  4895 
       
  4896 		return jQuery.ajax({
       
  4897 			type: "GET",
       
  4898 			url: url,
       
  4899 			data: data,
       
  4900 			success: callback,
       
  4901 			dataType: type
       
  4902 		});
       
  4903 	},
       
  4904 
       
  4905 	getScript: function( url, callback ) {
       
  4906 		return jQuery.get(url, null, callback, "script");
       
  4907 	},
       
  4908 
       
  4909 	getJSON: function( url, data, callback ) {
       
  4910 		return jQuery.get(url, data, callback, "json");
       
  4911 	},
       
  4912 
       
  4913 	post: function( url, data, callback, type ) {
       
  4914 		// shift arguments if data argument was omited
       
  4915 		if ( jQuery.isFunction( data ) ) {
       
  4916 			type = type || callback;
       
  4917 			callback = data;
       
  4918 			data = {};
       
  4919 		}
       
  4920 
       
  4921 		return jQuery.ajax({
       
  4922 			type: "POST",
       
  4923 			url: url,
       
  4924 			data: data,
       
  4925 			success: callback,
       
  4926 			dataType: type
       
  4927 		});
       
  4928 	},
       
  4929 
       
  4930 	ajaxSetup: function( settings ) {
       
  4931 		jQuery.extend( jQuery.ajaxSettings, settings );
       
  4932 	},
       
  4933 
       
  4934 	ajaxSettings: {
       
  4935 		url: location.href,
       
  4936 		global: true,
       
  4937 		type: "GET",
       
  4938 		contentType: "application/x-www-form-urlencoded",
       
  4939 		processData: true,
       
  4940 		async: true,
       
  4941 		/*
       
  4942 		timeout: 0,
       
  4943 		data: null,
       
  4944 		username: null,
       
  4945 		password: null,
       
  4946 		traditional: false,
       
  4947 		*/
       
  4948 		// Create the request object; Microsoft failed to properly
       
  4949 		// implement the XMLHttpRequest in IE7 (can't request local files),
       
  4950 		// so we use the ActiveXObject when it is available
       
  4951 		// This function can be overriden by calling jQuery.ajaxSetup
       
  4952 		xhr: window.XMLHttpRequest && (window.location.protocol !== "file:" || !window.ActiveXObject) ?
       
  4953 			function() {
       
  4954 				return new window.XMLHttpRequest();
       
  4955 			} :
       
  4956 			function() {
       
  4957 				try {
       
  4958 					return new window.ActiveXObject("Microsoft.XMLHTTP");
       
  4959 				} catch(e) {}
       
  4960 			},
       
  4961 		accepts: {
       
  4962 			xml: "application/xml, text/xml",
       
  4963 			html: "text/html",
       
  4964 			script: "text/javascript, application/javascript",
       
  4965 			json: "application/json, text/javascript",
       
  4966 			text: "text/plain",
       
  4967 			_default: "*/*"
       
  4968 		}
       
  4969 	},
       
  4970 
       
  4971 	// Last-Modified header cache for next request
       
  4972 	lastModified: {},
       
  4973 	etag: {},
       
  4974 
       
  4975 	ajax: function( origSettings ) {
       
  4976 		var s = jQuery.extend(true, {}, jQuery.ajaxSettings, origSettings);
       
  4977 		
       
  4978 		var jsonp, status, data,
       
  4979 			callbackContext = origSettings && origSettings.context || s,
       
  4980 			type = s.type.toUpperCase();
       
  4981 
       
  4982 		// convert data if not already a string
       
  4983 		if ( s.data && s.processData && typeof s.data !== "string" ) {
       
  4984 			s.data = jQuery.param( s.data, s.traditional );
       
  4985 		}
       
  4986 
       
  4987 		// Handle JSONP Parameter Callbacks
       
  4988 		if ( s.dataType === "jsonp" ) {
       
  4989 			if ( type === "GET" ) {
       
  4990 				if ( !jsre.test( s.url ) ) {
       
  4991 					s.url += (rquery.test( s.url ) ? "&" : "?") + (s.jsonp || "callback") + "=?";
       
  4992 				}
       
  4993 			} else if ( !s.data || !jsre.test(s.data) ) {
       
  4994 				s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?";
       
  4995 			}
       
  4996 			s.dataType = "json";
       
  4997 		}
       
  4998 
       
  4999 		// Build temporary JSONP function
       
  5000 		if ( s.dataType === "json" && (s.data && jsre.test(s.data) || jsre.test(s.url)) ) {
       
  5001 			jsonp = s.jsonpCallback || ("jsonp" + jsc++);
       
  5002 
       
  5003 			// Replace the =? sequence both in the query string and the data
       
  5004 			if ( s.data ) {
       
  5005 				s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1");
       
  5006 			}
       
  5007 
       
  5008 			s.url = s.url.replace(jsre, "=" + jsonp + "$1");
       
  5009 
       
  5010 			// We need to make sure
       
  5011 			// that a JSONP style response is executed properly
       
  5012 			s.dataType = "script";
       
  5013 
       
  5014 			// Handle JSONP-style loading
       
  5015 			window[ jsonp ] = window[ jsonp ] || function( tmp ) {
       
  5016 				data = tmp;
       
  5017 				success();
       
  5018 				complete();
       
  5019 				// Garbage collect
       
  5020 				window[ jsonp ] = undefined;
       
  5021 
       
  5022 				try {
       
  5023 					delete window[ jsonp ];
       
  5024 				} catch(e) {}
       
  5025 
       
  5026 				if ( head ) {
       
  5027 					head.removeChild( script );
       
  5028 				}
       
  5029 			};
       
  5030 		}
       
  5031 
       
  5032 		if ( s.dataType === "script" && s.cache === null ) {
       
  5033 			s.cache = false;
       
  5034 		}
       
  5035 
       
  5036 		if ( s.cache === false && type === "GET" ) {
       
  5037 			var ts = now();
       
  5038 
       
  5039 			// try replacing _= if it is there
       
  5040 			var ret = s.url.replace(rts, "$1_=" + ts + "$2");
       
  5041 
       
  5042 			// if nothing was replaced, add timestamp to the end
       
  5043 			s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
       
  5044 		}
       
  5045 
       
  5046 		// If data is available, append data to url for get requests
       
  5047 		if ( s.data && type === "GET" ) {
       
  5048 			s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
       
  5049 		}
       
  5050 
       
  5051 		// Watch for a new set of requests
       
  5052 		if ( s.global && ! jQuery.active++ ) {
       
  5053 			jQuery.event.trigger( "ajaxStart" );
       
  5054 		}
       
  5055 
       
  5056 		// Matches an absolute URL, and saves the domain
       
  5057 		var parts = rurl.exec( s.url ),
       
  5058 			remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
       
  5059 
       
  5060 		// If we're requesting a remote document
       
  5061 		// and trying to load JSON or Script with a GET
       
  5062 		if ( s.dataType === "script" && type === "GET" && remote ) {
       
  5063 			var head = document.getElementsByTagName("head")[0] || document.documentElement;
       
  5064 			var script = document.createElement("script");
       
  5065 			script.src = s.url;
       
  5066 			if ( s.scriptCharset ) {
       
  5067 				script.charset = s.scriptCharset;
       
  5068 			}
       
  5069 
       
  5070 			// Handle Script loading
       
  5071 			if ( !jsonp ) {
       
  5072 				var done = false;
       
  5073 
       
  5074 				// Attach handlers for all browsers
       
  5075 				script.onload = script.onreadystatechange = function() {
       
  5076 					if ( !done && (!this.readyState ||
       
  5077 							this.readyState === "loaded" || this.readyState === "complete") ) {
       
  5078 						done = true;
       
  5079 						success();
       
  5080 						complete();
       
  5081 
       
  5082 						// Handle memory leak in IE
       
  5083 						script.onload = script.onreadystatechange = null;
       
  5084 						if ( head && script.parentNode ) {
       
  5085 							head.removeChild( script );
       
  5086 						}
       
  5087 					}
       
  5088 				};
       
  5089 			}
       
  5090 
       
  5091 			// Use insertBefore instead of appendChild  to circumvent an IE6 bug.
       
  5092 			// This arises when a base node is used (#2709 and #4378).
       
  5093 			head.insertBefore( script, head.firstChild );
       
  5094 
       
  5095 			// We handle everything using the script element injection
       
  5096 			return undefined;
       
  5097 		}
       
  5098 
       
  5099 		var requestDone = false;
       
  5100 
       
  5101 		// Create the request object
       
  5102 		var xhr = s.xhr();
       
  5103 
       
  5104 		if ( !xhr ) {
       
  5105 			return;
       
  5106 		}
       
  5107 
       
  5108 		// Open the socket
       
  5109 		// Passing null username, generates a login popup on Opera (#2865)
       
  5110 		if ( s.username ) {
       
  5111 			xhr.open(type, s.url, s.async, s.username, s.password);
       
  5112 		} else {
       
  5113 			xhr.open(type, s.url, s.async);
       
  5114 		}
       
  5115 
       
  5116 		// Need an extra try/catch for cross domain requests in Firefox 3
       
  5117 		try {
       
  5118 			// Set the correct header, if data is being sent
       
  5119 			if ( s.data || origSettings && origSettings.contentType ) {
       
  5120 				xhr.setRequestHeader("Content-Type", s.contentType);
       
  5121 			}
       
  5122 
       
  5123 			// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
       
  5124 			if ( s.ifModified ) {
       
  5125 				if ( jQuery.lastModified[s.url] ) {
       
  5126 					xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
       
  5127 				}
       
  5128 
       
  5129 				if ( jQuery.etag[s.url] ) {
       
  5130 					xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
       
  5131 				}
       
  5132 			}
       
  5133 
       
  5134 			// Set header so the called script knows that it's an XMLHttpRequest
       
  5135 			// Only send the header if it's not a remote XHR
       
  5136 			if ( !remote ) {
       
  5137 				xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
       
  5138 			}
       
  5139 
       
  5140 			// Set the Accepts header for the server, depending on the dataType
       
  5141 			xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ?
       
  5142 				s.accepts[ s.dataType ] + ", */*" :
       
  5143 				s.accepts._default );
       
  5144 		} catch(e) {}
       
  5145 
       
  5146 		// Allow custom headers/mimetypes and early abort
       
  5147 		if ( s.beforeSend && s.beforeSend.call(callbackContext, xhr, s) === false ) {
       
  5148 			// Handle the global AJAX counter
       
  5149 			if ( s.global && ! --jQuery.active ) {
       
  5150 				jQuery.event.trigger( "ajaxStop" );
       
  5151 			}
       
  5152 
       
  5153 			// close opended socket
       
  5154 			xhr.abort();
       
  5155 			return false;
       
  5156 		}
       
  5157 
       
  5158 		if ( s.global ) {
       
  5159 			trigger("ajaxSend", [xhr, s]);
       
  5160 		}
       
  5161 
       
  5162 		// Wait for a response to come back
       
  5163 		var onreadystatechange = xhr.onreadystatechange = function( isTimeout ) {
       
  5164 			// The request was aborted
       
  5165 			if ( !xhr || xhr.readyState === 0 || isTimeout === "abort" ) {
       
  5166 				// Opera doesn't call onreadystatechange before this point
       
  5167 				// so we simulate the call
       
  5168 				if ( !requestDone ) {
       
  5169 					complete();
       
  5170 				}
       
  5171 
       
  5172 				requestDone = true;
       
  5173 				if ( xhr ) {
       
  5174 					xhr.onreadystatechange = jQuery.noop;
       
  5175 				}
       
  5176 
       
  5177 			// The transfer is complete and the data is available, or the request timed out
       
  5178 			} else if ( !requestDone && xhr && (xhr.readyState === 4 || isTimeout === "timeout") ) {
       
  5179 				requestDone = true;
       
  5180 				xhr.onreadystatechange = jQuery.noop;
       
  5181 
       
  5182 				status = isTimeout === "timeout" ?
       
  5183 					"timeout" :
       
  5184 					!jQuery.httpSuccess( xhr ) ?
       
  5185 						"error" :
       
  5186 						s.ifModified && jQuery.httpNotModified( xhr, s.url ) ?
       
  5187 							"notmodified" :
       
  5188 							"success";
       
  5189 
       
  5190 				var errMsg;
       
  5191 
       
  5192 				if ( status === "success" ) {
       
  5193 					// Watch for, and catch, XML document parse errors
       
  5194 					try {
       
  5195 						// process the data (runs the xml through httpData regardless of callback)
       
  5196 						data = jQuery.httpData( xhr, s.dataType, s );
       
  5197 					} catch(err) {
       
  5198 						status = "parsererror";
       
  5199 						errMsg = err;
       
  5200 					}
       
  5201 				}
       
  5202 
       
  5203 				// Make sure that the request was successful or notmodified
       
  5204 				if ( status === "success" || status === "notmodified" ) {
       
  5205 					// JSONP handles its own success callback
       
  5206 					if ( !jsonp ) {
       
  5207 						success();
       
  5208 					}
       
  5209 				} else {
       
  5210 					jQuery.handleError(s, xhr, status, errMsg);
       
  5211 				}
       
  5212 
       
  5213 				// Fire the complete handlers
       
  5214 				complete();
       
  5215 
       
  5216 				if ( isTimeout === "timeout" ) {
       
  5217 					xhr.abort();
       
  5218 				}
       
  5219 
       
  5220 				// Stop memory leaks
       
  5221 				if ( s.async ) {
       
  5222 					xhr = null;
       
  5223 				}
       
  5224 			}
       
  5225 		};
       
  5226 
       
  5227 		// Override the abort handler, if we can (IE doesn't allow it, but that's OK)
       
  5228 		// Opera doesn't fire onreadystatechange at all on abort
       
  5229 		try {
       
  5230 			var oldAbort = xhr.abort;
       
  5231 			xhr.abort = function() {
       
  5232 				if ( xhr ) {
       
  5233 					oldAbort.call( xhr );
       
  5234 				}
       
  5235 
       
  5236 				onreadystatechange( "abort" );
       
  5237 			};
       
  5238 		} catch(e) { }
       
  5239 
       
  5240 		// Timeout checker
       
  5241 		if ( s.async && s.timeout > 0 ) {
       
  5242 			setTimeout(function() {
       
  5243 				// Check to see if the request is still happening
       
  5244 				if ( xhr && !requestDone ) {
       
  5245 					onreadystatechange( "timeout" );
       
  5246 				}
       
  5247 			}, s.timeout);
       
  5248 		}
       
  5249 
       
  5250 		// Send the data
       
  5251 		try {
       
  5252 			xhr.send( type === "POST" || type === "PUT" || type === "DELETE" ? s.data : null );
       
  5253 		} catch(e) {
       
  5254 			jQuery.handleError(s, xhr, null, e);
       
  5255 			// Fire the complete handlers
       
  5256 			complete();
       
  5257 		}
       
  5258 
       
  5259 		// firefox 1.5 doesn't fire statechange for sync requests
       
  5260 		if ( !s.async ) {
       
  5261 			onreadystatechange();
       
  5262 		}
       
  5263 
       
  5264 		function success() {
       
  5265 			// If a local callback was specified, fire it and pass it the data
       
  5266 			if ( s.success ) {
       
  5267 				s.success.call( callbackContext, data, status, xhr );
       
  5268 			}
       
  5269 
       
  5270 			// Fire the global callback
       
  5271 			if ( s.global ) {
       
  5272 				trigger( "ajaxSuccess", [xhr, s] );
       
  5273 			}
       
  5274 		}
       
  5275 
       
  5276 		function complete() {
       
  5277 			// Process result
       
  5278 			if ( s.complete ) {
       
  5279 				s.complete.call( callbackContext, xhr, status);
       
  5280 			}
       
  5281 
       
  5282 			// The request was completed
       
  5283 			if ( s.global ) {
       
  5284 				trigger( "ajaxComplete", [xhr, s] );
       
  5285 			}
       
  5286 
       
  5287 			// Handle the global AJAX counter
       
  5288 			if ( s.global && ! --jQuery.active ) {
       
  5289 				jQuery.event.trigger( "ajaxStop" );
       
  5290 			}
       
  5291 		}
       
  5292 		
       
  5293 		function trigger(type, args) {
       
  5294 			(s.context ? jQuery(s.context) : jQuery.event).trigger(type, args);
       
  5295 		}
       
  5296 
       
  5297 		// return XMLHttpRequest to allow aborting the request etc.
       
  5298 		return xhr;
       
  5299 	},
       
  5300 
       
  5301 	handleError: function( s, xhr, status, e ) {
       
  5302 		// If a local callback was specified, fire it
       
  5303 		if ( s.error ) {
       
  5304 			s.error.call( s.context || s, xhr, status, e );
       
  5305 		}
       
  5306 
       
  5307 		// Fire the global callback
       
  5308 		if ( s.global ) {
       
  5309 			(s.context ? jQuery(s.context) : jQuery.event).trigger( "ajaxError", [xhr, s, e] );
       
  5310 		}
       
  5311 	},
       
  5312 
       
  5313 	// Counter for holding the number of active queries
       
  5314 	active: 0,
       
  5315 
       
  5316 	// Determines if an XMLHttpRequest was successful or not
       
  5317 	httpSuccess: function( xhr ) {
       
  5318 		try {
       
  5319 			// IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450
       
  5320 			return !xhr.status && location.protocol === "file:" ||
       
  5321 				// Opera returns 0 when status is 304
       
  5322 				( xhr.status >= 200 && xhr.status < 300 ) ||
       
  5323 				xhr.status === 304 || xhr.status === 1223 || xhr.status === 0;
       
  5324 		} catch(e) {}
       
  5325 
       
  5326 		return false;
       
  5327 	},
       
  5328 
       
  5329 	// Determines if an XMLHttpRequest returns NotModified
       
  5330 	httpNotModified: function( xhr, url ) {
       
  5331 		var lastModified = xhr.getResponseHeader("Last-Modified"),
       
  5332 			etag = xhr.getResponseHeader("Etag");
       
  5333 
       
  5334 		if ( lastModified ) {
       
  5335 			jQuery.lastModified[url] = lastModified;
       
  5336 		}
       
  5337 
       
  5338 		if ( etag ) {
       
  5339 			jQuery.etag[url] = etag;
       
  5340 		}
       
  5341 
       
  5342 		// Opera returns 0 when status is 304
       
  5343 		return xhr.status === 304 || xhr.status === 0;
       
  5344 	},
       
  5345 
       
  5346 	httpData: function( xhr, type, s ) {
       
  5347 		var ct = xhr.getResponseHeader("content-type") || "",
       
  5348 			xml = type === "xml" || !type && ct.indexOf("xml") >= 0,
       
  5349 			data = xml ? xhr.responseXML : xhr.responseText;
       
  5350 
       
  5351 		if ( xml && data.documentElement.nodeName === "parsererror" ) {
       
  5352 			jQuery.error( "parsererror" );
       
  5353 		}
       
  5354 
       
  5355 		// Allow a pre-filtering function to sanitize the response
       
  5356 		// s is checked to keep backwards compatibility
       
  5357 		if ( s && s.dataFilter ) {
       
  5358 			data = s.dataFilter( data, type );
       
  5359 		}
       
  5360 
       
  5361 		// The filter can actually parse the response
       
  5362 		if ( typeof data === "string" ) {
       
  5363 			// Get the JavaScript object, if JSON is used.
       
  5364 			if ( type === "json" || !type && ct.indexOf("json") >= 0 ) {
       
  5365 				data = jQuery.parseJSON( data );
       
  5366 
       
  5367 			// If the type is "script", eval it in global context
       
  5368 			} else if ( type === "script" || !type && ct.indexOf("javascript") >= 0 ) {
       
  5369 				jQuery.globalEval( data );
       
  5370 			}
       
  5371 		}
       
  5372 
       
  5373 		return data;
       
  5374 	},
       
  5375 
       
  5376 	// Serialize an array of form elements or a set of
       
  5377 	// key/values into a query string
       
  5378 	param: function( a, traditional ) {
       
  5379 		var s = [];
       
  5380 		
       
  5381 		// Set traditional to true for jQuery <= 1.3.2 behavior.
       
  5382 		if ( traditional === undefined ) {
       
  5383 			traditional = jQuery.ajaxSettings.traditional;
       
  5384 		}
       
  5385 		
       
  5386 		// If an array was passed in, assume that it is an array of form elements.
       
  5387 		if ( jQuery.isArray(a) || a.jquery ) {
       
  5388 			// Serialize the form elements
       
  5389 			jQuery.each( a, function() {
       
  5390 				add( this.name, this.value );
       
  5391 			});
       
  5392 			
       
  5393 		} else {
       
  5394 			// If traditional, encode the "old" way (the way 1.3.2 or older
       
  5395 			// did it), otherwise encode params recursively.
       
  5396 			for ( var prefix in a ) {
       
  5397 				buildParams( prefix, a[prefix] );
       
  5398 			}
       
  5399 		}
       
  5400 
       
  5401 		// Return the resulting serialization
       
  5402 		return s.join("&").replace(r20, "+");
       
  5403 
       
  5404 		function buildParams( prefix, obj ) {
       
  5405 			if ( jQuery.isArray(obj) ) {
       
  5406 				// Serialize array item.
       
  5407 				jQuery.each( obj, function( i, v ) {
       
  5408 					if ( traditional || /\[\]$/.test( prefix ) ) {
       
  5409 						// Treat each array item as a scalar.
       
  5410 						add( prefix, v );
       
  5411 					} else {
       
  5412 						// If array item is non-scalar (array or object), encode its
       
  5413 						// numeric index to resolve deserialization ambiguity issues.
       
  5414 						// Note that rack (as of 1.0.0) can't currently deserialize
       
  5415 						// nested arrays properly, and attempting to do so may cause
       
  5416 						// a server error. Possible fixes are to modify rack's
       
  5417 						// deserialization algorithm or to provide an option or flag
       
  5418 						// to force array serialization to be shallow.
       
  5419 						buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
       
  5420 					}
       
  5421 				});
       
  5422 					
       
  5423 			} else if ( !traditional && obj != null && typeof obj === "object" ) {
       
  5424 				// Serialize object item.
       
  5425 				jQuery.each( obj, function( k, v ) {
       
  5426 					buildParams( prefix + "[" + k + "]", v );
       
  5427 				});
       
  5428 					
       
  5429 			} else {
       
  5430 				// Serialize scalar item.
       
  5431 				add( prefix, obj );
       
  5432 			}
       
  5433 		}
       
  5434 
       
  5435 		function add( key, value ) {
       
  5436 			// If value is a function, invoke it and return its value
       
  5437 			value = jQuery.isFunction(value) ? value() : value;
       
  5438 			s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
       
  5439 		}
       
  5440 	}
       
  5441 });
       
  5442 var elemdisplay = {},
       
  5443 	rfxtypes = /toggle|show|hide/,
       
  5444 	rfxnum = /^([+-]=)?([\d+-.]+)(.*)$/,
       
  5445 	timerId,
       
  5446 	fxAttrs = [
       
  5447 		// height animations
       
  5448 		[ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
       
  5449 		// width animations
       
  5450 		[ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
       
  5451 		// opacity animations
       
  5452 		[ "opacity" ]
       
  5453 	];
       
  5454 
       
  5455 jQuery.fn.extend({
       
  5456 	show: function( speed, callback ) {
       
  5457 		if ( speed || speed === 0) {
       
  5458 			return this.animate( genFx("show", 3), speed, callback);
       
  5459 
       
  5460 		} else {
       
  5461 			for ( var i = 0, l = this.length; i < l; i++ ) {
       
  5462 				var old = jQuery.data(this[i], "olddisplay");
       
  5463 
       
  5464 				this[i].style.display = old || "";
       
  5465 
       
  5466 				if ( jQuery.css(this[i], "display") === "none" ) {
       
  5467 					var nodeName = this[i].nodeName, display;
       
  5468 
       
  5469 					if ( elemdisplay[ nodeName ] ) {
       
  5470 						display = elemdisplay[ nodeName ];
       
  5471 
       
  5472 					} else {
       
  5473 						var elem = jQuery("<" + nodeName + " />").appendTo("body");
       
  5474 
       
  5475 						display = elem.css("display");
       
  5476 
       
  5477 						if ( display === "none" ) {
       
  5478 							display = "block";
       
  5479 						}
       
  5480 
       
  5481 						elem.remove();
       
  5482 
       
  5483 						elemdisplay[ nodeName ] = display;
       
  5484 					}
       
  5485 
       
  5486 					jQuery.data(this[i], "olddisplay", display);
       
  5487 				}
       
  5488 			}
       
  5489 
       
  5490 			// Set the display of the elements in a second loop
       
  5491 			// to avoid the constant reflow
       
  5492 			for ( var j = 0, k = this.length; j < k; j++ ) {
       
  5493 				this[j].style.display = jQuery.data(this[j], "olddisplay") || "";
       
  5494 			}
       
  5495 
       
  5496 			return this;
       
  5497 		}
       
  5498 	},
       
  5499 
       
  5500 	hide: function( speed, callback ) {
       
  5501 		if ( speed || speed === 0 ) {
       
  5502 			return this.animate( genFx("hide", 3), speed, callback);
       
  5503 
       
  5504 		} else {
       
  5505 			for ( var i = 0, l = this.length; i < l; i++ ) {
       
  5506 				var old = jQuery.data(this[i], "olddisplay");
       
  5507 				if ( !old && old !== "none" ) {
       
  5508 					jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display"));
       
  5509 				}
       
  5510 			}
       
  5511 
       
  5512 			// Set the display of the elements in a second loop
       
  5513 			// to avoid the constant reflow
       
  5514 			for ( var j = 0, k = this.length; j < k; j++ ) {
       
  5515 				this[j].style.display = "none";
       
  5516 			}
       
  5517 
       
  5518 			return this;
       
  5519 		}
       
  5520 	},
       
  5521 
       
  5522 	// Save the old toggle function
       
  5523 	_toggle: jQuery.fn.toggle,
       
  5524 
       
  5525 	toggle: function( fn, fn2 ) {
       
  5526 		var bool = typeof fn === "boolean";
       
  5527 
       
  5528 		if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
       
  5529 			this._toggle.apply( this, arguments );
       
  5530 
       
  5531 		} else if ( fn == null || bool ) {
       
  5532 			this.each(function() {
       
  5533 				var state = bool ? fn : jQuery(this).is(":hidden");
       
  5534 				jQuery(this)[ state ? "show" : "hide" ]();
       
  5535 			});
       
  5536 
       
  5537 		} else {
       
  5538 			this.animate(genFx("toggle", 3), fn, fn2);
       
  5539 		}
       
  5540 
       
  5541 		return this;
       
  5542 	},
       
  5543 
       
  5544 	fadeTo: function( speed, to, callback ) {
       
  5545 		return this.filter(":hidden").css("opacity", 0).show().end()
       
  5546 					.animate({opacity: to}, speed, callback);
       
  5547 	},
       
  5548 
       
  5549 	animate: function( prop, speed, easing, callback ) {
       
  5550 		var optall = jQuery.speed(speed, easing, callback);
       
  5551 
       
  5552 		if ( jQuery.isEmptyObject( prop ) ) {
       
  5553 			return this.each( optall.complete );
       
  5554 		}
       
  5555 
       
  5556 		return this[ optall.queue === false ? "each" : "queue" ](function() {
       
  5557 			var opt = jQuery.extend({}, optall), p,
       
  5558 				hidden = this.nodeType === 1 && jQuery(this).is(":hidden"),
       
  5559 				self = this;
       
  5560 
       
  5561 			for ( p in prop ) {
       
  5562 				var name = p.replace(rdashAlpha, fcamelCase);
       
  5563 
       
  5564 				if ( p !== name ) {
       
  5565 					prop[ name ] = prop[ p ];
       
  5566 					delete prop[ p ];
       
  5567 					p = name;
       
  5568 				}
       
  5569 
       
  5570 				if ( prop[p] === "hide" && hidden || prop[p] === "show" && !hidden ) {
       
  5571 					return opt.complete.call(this);
       
  5572 				}
       
  5573 
       
  5574 				if ( ( p === "height" || p === "width" ) && this.style ) {
       
  5575 					// Store display property
       
  5576 					opt.display = jQuery.css(this, "display");
       
  5577 
       
  5578 					// Make sure that nothing sneaks out
       
  5579 					opt.overflow = this.style.overflow;
       
  5580 				}
       
  5581 
       
  5582 				if ( jQuery.isArray( prop[p] ) ) {
       
  5583 					// Create (if needed) and add to specialEasing
       
  5584 					(opt.specialEasing = opt.specialEasing || {})[p] = prop[p][1];
       
  5585 					prop[p] = prop[p][0];
       
  5586 				}
       
  5587 			}
       
  5588 
       
  5589 			if ( opt.overflow != null ) {
       
  5590 				this.style.overflow = "hidden";
       
  5591 			}
       
  5592 
       
  5593 			opt.curAnim = jQuery.extend({}, prop);
       
  5594 
       
  5595 			jQuery.each( prop, function( name, val ) {
       
  5596 				var e = new jQuery.fx( self, opt, name );
       
  5597 
       
  5598 				if ( rfxtypes.test(val) ) {
       
  5599 					e[ val === "toggle" ? hidden ? "show" : "hide" : val ]( prop );
       
  5600 
       
  5601 				} else {
       
  5602 					var parts = rfxnum.exec(val),
       
  5603 						start = e.cur(true) || 0;
       
  5604 
       
  5605 					if ( parts ) {
       
  5606 						var end = parseFloat( parts[2] ),
       
  5607 							unit = parts[3] || "px";
       
  5608 
       
  5609 						// We need to compute starting value
       
  5610 						if ( unit !== "px" ) {
       
  5611 							self.style[ name ] = (end || 1) + unit;
       
  5612 							start = ((end || 1) / e.cur(true)) * start;
       
  5613 							self.style[ name ] = start + unit;
       
  5614 						}
       
  5615 
       
  5616 						// If a +=/-= token was provided, we're doing a relative animation
       
  5617 						if ( parts[1] ) {
       
  5618 							end = ((parts[1] === "-=" ? -1 : 1) * end) + start;
       
  5619 						}
       
  5620 
       
  5621 						e.custom( start, end, unit );
       
  5622 
       
  5623 					} else {
       
  5624 						e.custom( start, val, "" );
       
  5625 					}
       
  5626 				}
       
  5627 			});
       
  5628 
       
  5629 			// For JS strict compliance
       
  5630 			return true;
       
  5631 		});
       
  5632 	},
       
  5633 
       
  5634 	stop: function( clearQueue, gotoEnd ) {
       
  5635 		var timers = jQuery.timers;
       
  5636 
       
  5637 		if ( clearQueue ) {
       
  5638 			this.queue([]);
       
  5639 		}
       
  5640 
       
  5641 		this.each(function() {
       
  5642 			// go in reverse order so anything added to the queue during the loop is ignored
       
  5643 			for ( var i = timers.length - 1; i >= 0; i-- ) {
       
  5644 				if ( timers[i].elem === this ) {
       
  5645 					if (gotoEnd) {
       
  5646 						// force the next step to be the last
       
  5647 						timers[i](true);
       
  5648 					}
       
  5649 
       
  5650 					timers.splice(i, 1);
       
  5651 				}
       
  5652 			}
       
  5653 		});
       
  5654 
       
  5655 		// start the next in the queue if the last step wasn't forced
       
  5656 		if ( !gotoEnd ) {
       
  5657 			this.dequeue();
       
  5658 		}
       
  5659 
       
  5660 		return this;
       
  5661 	}
       
  5662 
       
  5663 });
       
  5664 
       
  5665 // Generate shortcuts for custom animations
       
  5666 jQuery.each({
       
  5667 	slideDown: genFx("show", 1),
       
  5668 	slideUp: genFx("hide", 1),
       
  5669 	slideToggle: genFx("toggle", 1),
       
  5670 	fadeIn: { opacity: "show" },
       
  5671 	fadeOut: { opacity: "hide" }
       
  5672 }, function( name, props ) {
       
  5673 	jQuery.fn[ name ] = function( speed, callback ) {
       
  5674 		return this.animate( props, speed, callback );
       
  5675 	};
       
  5676 });
       
  5677 
       
  5678 jQuery.extend({
       
  5679 	speed: function( speed, easing, fn ) {
       
  5680 		var opt = speed && typeof speed === "object" ? speed : {
       
  5681 			complete: fn || !fn && easing ||
       
  5682 				jQuery.isFunction( speed ) && speed,
       
  5683 			duration: speed,
       
  5684 			easing: fn && easing || easing && !jQuery.isFunction(easing) && easing
       
  5685 		};
       
  5686 
       
  5687 		opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
       
  5688 			jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default;
       
  5689 
       
  5690 		// Queueing
       
  5691 		opt.old = opt.complete;
       
  5692 		opt.complete = function() {
       
  5693 			if ( opt.queue !== false ) {
       
  5694 				jQuery(this).dequeue();
       
  5695 			}
       
  5696 			if ( jQuery.isFunction( opt.old ) ) {
       
  5697 				opt.old.call( this );
       
  5698 			}
       
  5699 		};
       
  5700 
       
  5701 		return opt;
       
  5702 	},
       
  5703 
       
  5704 	easing: {
       
  5705 		linear: function( p, n, firstNum, diff ) {
       
  5706 			return firstNum + diff * p;
       
  5707 		},
       
  5708 		swing: function( p, n, firstNum, diff ) {
       
  5709 			return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum;
       
  5710 		}
       
  5711 	},
       
  5712 
       
  5713 	timers: [],
       
  5714 
       
  5715 	fx: function( elem, options, prop ) {
       
  5716 		this.options = options;
       
  5717 		this.elem = elem;
       
  5718 		this.prop = prop;
       
  5719 
       
  5720 		if ( !options.orig ) {
       
  5721 			options.orig = {};
       
  5722 		}
       
  5723 	}
       
  5724 
       
  5725 });
       
  5726 
       
  5727 jQuery.fx.prototype = {
       
  5728 	// Simple function for setting a style value
       
  5729 	update: function() {
       
  5730 		if ( this.options.step ) {
       
  5731 			this.options.step.call( this.elem, this.now, this );
       
  5732 		}
       
  5733 
       
  5734 		(jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this );
       
  5735 
       
  5736 		// Set display property to block for height/width animations
       
  5737 		if ( ( this.prop === "height" || this.prop === "width" ) && this.elem.style ) {
       
  5738 			this.elem.style.display = "block";
       
  5739 		}
       
  5740 	},
       
  5741 
       
  5742 	// Get the current size
       
  5743 	cur: function( force ) {
       
  5744 		if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) {
       
  5745 			return this.elem[ this.prop ];
       
  5746 		}
       
  5747 
       
  5748 		var r = parseFloat(jQuery.css(this.elem, this.prop, force));
       
  5749 		return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0;
       
  5750 	},
       
  5751 
       
  5752 	// Start an animation from one number to another
       
  5753 	custom: function( from, to, unit ) {
       
  5754 		this.startTime = now();
       
  5755 		this.start = from;
       
  5756 		this.end = to;
       
  5757 		this.unit = unit || this.unit || "px";
       
  5758 		this.now = this.start;
       
  5759 		this.pos = this.state = 0;
       
  5760 
       
  5761 		var self = this;
       
  5762 		function t( gotoEnd ) {
       
  5763 			return self.step(gotoEnd);
       
  5764 		}
       
  5765 
       
  5766 		t.elem = this.elem;
       
  5767 
       
  5768 		if ( t() && jQuery.timers.push(t) && !timerId ) {
       
  5769 			timerId = setInterval(jQuery.fx.tick, 13);
       
  5770 		}
       
  5771 	},
       
  5772 
       
  5773 	// Simple 'show' function
       
  5774 	show: function() {
       
  5775 		// Remember where we started, so that we can go back to it later
       
  5776 		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
       
  5777 		this.options.show = true;
       
  5778 
       
  5779 		// Begin the animation
       
  5780 		// Make sure that we start at a small width/height to avoid any
       
  5781 		// flash of content
       
  5782 		this.custom(this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur());
       
  5783 
       
  5784 		// Start by showing the element
       
  5785 		jQuery( this.elem ).show();
       
  5786 	},
       
  5787 
       
  5788 	// Simple 'hide' function
       
  5789 	hide: function() {
       
  5790 		// Remember where we started, so that we can go back to it later
       
  5791 		this.options.orig[this.prop] = jQuery.style( this.elem, this.prop );
       
  5792 		this.options.hide = true;
       
  5793 
       
  5794 		// Begin the animation
       
  5795 		this.custom(this.cur(), 0);
       
  5796 	},
       
  5797 
       
  5798 	// Each step of an animation
       
  5799 	step: function( gotoEnd ) {
       
  5800 		var t = now(), done = true;
       
  5801 
       
  5802 		if ( gotoEnd || t >= this.options.duration + this.startTime ) {
       
  5803 			this.now = this.end;
       
  5804 			this.pos = this.state = 1;
       
  5805 			this.update();
       
  5806 
       
  5807 			this.options.curAnim[ this.prop ] = true;
       
  5808 
       
  5809 			for ( var i in this.options.curAnim ) {
       
  5810 				if ( this.options.curAnim[i] !== true ) {
       
  5811 					done = false;
       
  5812 				}
       
  5813 			}
       
  5814 
       
  5815 			if ( done ) {
       
  5816 				if ( this.options.display != null ) {
       
  5817 					// Reset the overflow
       
  5818 					this.elem.style.overflow = this.options.overflow;
       
  5819 
       
  5820 					// Reset the display
       
  5821 					var old = jQuery.data(this.elem, "olddisplay");
       
  5822 					this.elem.style.display = old ? old : this.options.display;
       
  5823 
       
  5824 					if ( jQuery.css(this.elem, "display") === "none" ) {
       
  5825 						this.elem.style.display = "block";
       
  5826 					}
       
  5827 				}
       
  5828 
       
  5829 				// Hide the element if the "hide" operation was done
       
  5830 				if ( this.options.hide ) {
       
  5831 					jQuery(this.elem).hide();
       
  5832 				}
       
  5833 
       
  5834 				// Reset the properties, if the item has been hidden or shown
       
  5835 				if ( this.options.hide || this.options.show ) {
       
  5836 					for ( var p in this.options.curAnim ) {
       
  5837 						jQuery.style(this.elem, p, this.options.orig[p]);
       
  5838 					}
       
  5839 				}
       
  5840 
       
  5841 				// Execute the complete function
       
  5842 				this.options.complete.call( this.elem );
       
  5843 			}
       
  5844 
       
  5845 			return false;
       
  5846 
       
  5847 		} else {
       
  5848 			var n = t - this.startTime;
       
  5849 			this.state = n / this.options.duration;
       
  5850 
       
  5851 			// Perform the easing function, defaults to swing
       
  5852 			var specialEasing = this.options.specialEasing && this.options.specialEasing[this.prop];
       
  5853 			var defaultEasing = this.options.easing || (jQuery.easing.swing ? "swing" : "linear");
       
  5854 			this.pos = jQuery.easing[specialEasing || defaultEasing](this.state, n, 0, 1, this.options.duration);
       
  5855 			this.now = this.start + ((this.end - this.start) * this.pos);
       
  5856 
       
  5857 			// Perform the next step of the animation
       
  5858 			this.update();
       
  5859 		}
       
  5860 
       
  5861 		return true;
       
  5862 	}
       
  5863 };
       
  5864 
       
  5865 jQuery.extend( jQuery.fx, {
       
  5866 	tick: function() {
       
  5867 		var timers = jQuery.timers;
       
  5868 
       
  5869 		for ( var i = 0; i < timers.length; i++ ) {
       
  5870 			if ( !timers[i]() ) {
       
  5871 				timers.splice(i--, 1);
       
  5872 			}
       
  5873 		}
       
  5874 
       
  5875 		if ( !timers.length ) {
       
  5876 			jQuery.fx.stop();
       
  5877 		}
       
  5878 	},
       
  5879 		
       
  5880 	stop: function() {
       
  5881 		clearInterval( timerId );
       
  5882 		timerId = null;
       
  5883 	},
       
  5884 	
       
  5885 	speeds: {
       
  5886 		slow: 600,
       
  5887  		fast: 200,
       
  5888  		// Default speed
       
  5889  		_default: 400
       
  5890 	},
       
  5891 
       
  5892 	step: {
       
  5893 		opacity: function( fx ) {
       
  5894 			jQuery.style(fx.elem, "opacity", fx.now);
       
  5895 		},
       
  5896 
       
  5897 		_default: function( fx ) {
       
  5898 			if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
       
  5899 				fx.elem.style[ fx.prop ] = (fx.prop === "width" || fx.prop === "height" ? Math.max(0, fx.now) : fx.now) + fx.unit;
       
  5900 			} else {
       
  5901 				fx.elem[ fx.prop ] = fx.now;
       
  5902 			}
       
  5903 		}
       
  5904 	}
       
  5905 });
       
  5906 
       
  5907 if ( jQuery.expr && jQuery.expr.filters ) {
       
  5908 	jQuery.expr.filters.animated = function( elem ) {
       
  5909 		return jQuery.grep(jQuery.timers, function( fn ) {
       
  5910 			return elem === fn.elem;
       
  5911 		}).length;
       
  5912 	};
       
  5913 }
       
  5914 
       
  5915 function genFx( type, num ) {
       
  5916 	var obj = {};
       
  5917 
       
  5918 	jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function() {
       
  5919 		obj[ this ] = type;
       
  5920 	});
       
  5921 
       
  5922 	return obj;
       
  5923 }
       
  5924 if ( "getBoundingClientRect" in document.documentElement ) {
       
  5925 	jQuery.fn.offset = function( options ) {
       
  5926 		var elem = this[0];
       
  5927 
       
  5928 		if ( options ) { 
       
  5929 			return this.each(function( i ) {
       
  5930 				jQuery.offset.setOffset( this, options, i );
       
  5931 			});
       
  5932 		}
       
  5933 
       
  5934 		if ( !elem || !elem.ownerDocument ) {
       
  5935 			return null;
       
  5936 		}
       
  5937 
       
  5938 		if ( elem === elem.ownerDocument.body ) {
       
  5939 			return jQuery.offset.bodyOffset( elem );
       
  5940 		}
       
  5941 
       
  5942 		var box = elem.getBoundingClientRect(), doc = elem.ownerDocument, body = doc.body, docElem = doc.documentElement,
       
  5943 			clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0,
       
  5944 			top  = box.top  + (self.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop ) - clientTop,
       
  5945 			left = box.left + (self.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft;
       
  5946 
       
  5947 		return { top: top, left: left };
       
  5948 	};
       
  5949 
       
  5950 } else {
       
  5951 	jQuery.fn.offset = function( options ) {
       
  5952 		var elem = this[0];
       
  5953 
       
  5954 		if ( options ) { 
       
  5955 			return this.each(function( i ) {
       
  5956 				jQuery.offset.setOffset( this, options, i );
       
  5957 			});
       
  5958 		}
       
  5959 
       
  5960 		if ( !elem || !elem.ownerDocument ) {
       
  5961 			return null;
       
  5962 		}
       
  5963 
       
  5964 		if ( elem === elem.ownerDocument.body ) {
       
  5965 			return jQuery.offset.bodyOffset( elem );
       
  5966 		}
       
  5967 
       
  5968 		jQuery.offset.initialize();
       
  5969 
       
  5970 		var offsetParent = elem.offsetParent, prevOffsetParent = elem,
       
  5971 			doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
       
  5972 			body = doc.body, defaultView = doc.defaultView,
       
  5973 			prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
       
  5974 			top = elem.offsetTop, left = elem.offsetLeft;
       
  5975 
       
  5976 		while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
       
  5977 			if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
       
  5978 				break;
       
  5979 			}
       
  5980 
       
  5981 			computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
       
  5982 			top  -= elem.scrollTop;
       
  5983 			left -= elem.scrollLeft;
       
  5984 
       
  5985 			if ( elem === offsetParent ) {
       
  5986 				top  += elem.offsetTop;
       
  5987 				left += elem.offsetLeft;
       
  5988 
       
  5989 				if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.nodeName)) ) {
       
  5990 					top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
       
  5991 					left += parseFloat( computedStyle.borderLeftWidth ) || 0;
       
  5992 				}
       
  5993 
       
  5994 				prevOffsetParent = offsetParent, offsetParent = elem.offsetParent;
       
  5995 			}
       
  5996 
       
  5997 			if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
       
  5998 				top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
       
  5999 				left += parseFloat( computedStyle.borderLeftWidth ) || 0;
       
  6000 			}
       
  6001 
       
  6002 			prevComputedStyle = computedStyle;
       
  6003 		}
       
  6004 
       
  6005 		if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
       
  6006 			top  += body.offsetTop;
       
  6007 			left += body.offsetLeft;
       
  6008 		}
       
  6009 
       
  6010 		if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
       
  6011 			top  += Math.max( docElem.scrollTop, body.scrollTop );
       
  6012 			left += Math.max( docElem.scrollLeft, body.scrollLeft );
       
  6013 		}
       
  6014 
       
  6015 		return { top: top, left: left };
       
  6016 	};
       
  6017 }
       
  6018 
       
  6019 jQuery.offset = {
       
  6020 	initialize: function() {
       
  6021 		var body = document.body, container = document.createElement("div"), innerDiv, checkDiv, table, td, bodyMarginTop = parseFloat( jQuery.curCSS(body, "marginTop", true) ) || 0,
       
  6022 			html = "<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";
       
  6023 
       
  6024 		jQuery.extend( container.style, { position: "absolute", top: 0, left: 0, margin: 0, border: 0, width: "1px", height: "1px", visibility: "hidden" } );
       
  6025 
       
  6026 		container.innerHTML = html;
       
  6027 		body.insertBefore( container, body.firstChild );
       
  6028 		innerDiv = container.firstChild;
       
  6029 		checkDiv = innerDiv.firstChild;
       
  6030 		td = innerDiv.nextSibling.firstChild.firstChild;
       
  6031 
       
  6032 		this.doesNotAddBorder = (checkDiv.offsetTop !== 5);
       
  6033 		this.doesAddBorderForTableAndCells = (td.offsetTop === 5);
       
  6034 
       
  6035 		checkDiv.style.position = "fixed", checkDiv.style.top = "20px";
       
  6036 		// safari subtracts parent border width here which is 5px
       
  6037 		this.supportsFixedPosition = (checkDiv.offsetTop === 20 || checkDiv.offsetTop === 15);
       
  6038 		checkDiv.style.position = checkDiv.style.top = "";
       
  6039 
       
  6040 		innerDiv.style.overflow = "hidden", innerDiv.style.position = "relative";
       
  6041 		this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5);
       
  6042 
       
  6043 		this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
       
  6044 
       
  6045 		body.removeChild( container );
       
  6046 		body = container = innerDiv = checkDiv = table = td = null;
       
  6047 		jQuery.offset.initialize = jQuery.noop;
       
  6048 	},
       
  6049 
       
  6050 	bodyOffset: function( body ) {
       
  6051 		var top = body.offsetTop, left = body.offsetLeft;
       
  6052 
       
  6053 		jQuery.offset.initialize();
       
  6054 
       
  6055 		if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) {
       
  6056 			top  += parseFloat( jQuery.curCSS(body, "marginTop",  true) ) || 0;
       
  6057 			left += parseFloat( jQuery.curCSS(body, "marginLeft", true) ) || 0;
       
  6058 		}
       
  6059 
       
  6060 		return { top: top, left: left };
       
  6061 	},
       
  6062 	
       
  6063 	setOffset: function( elem, options, i ) {
       
  6064 		// set position first, in-case top/left are set even on static elem
       
  6065 		if ( /static/.test( jQuery.curCSS( elem, "position" ) ) ) {
       
  6066 			elem.style.position = "relative";
       
  6067 		}
       
  6068 		var curElem   = jQuery( elem ),
       
  6069 			curOffset = curElem.offset(),
       
  6070 			curTop    = parseInt( jQuery.curCSS( elem, "top",  true ), 10 ) || 0,
       
  6071 			curLeft   = parseInt( jQuery.curCSS( elem, "left", true ), 10 ) || 0;
       
  6072 
       
  6073 		if ( jQuery.isFunction( options ) ) {
       
  6074 			options = options.call( elem, i, curOffset );
       
  6075 		}
       
  6076 
       
  6077 		var props = {
       
  6078 			top:  (options.top  - curOffset.top)  + curTop,
       
  6079 			left: (options.left - curOffset.left) + curLeft
       
  6080 		};
       
  6081 		
       
  6082 		if ( "using" in options ) {
       
  6083 			options.using.call( elem, props );
       
  6084 		} else {
       
  6085 			curElem.css( props );
       
  6086 		}
       
  6087 	}
       
  6088 };
       
  6089 
       
  6090 
       
  6091 jQuery.fn.extend({
       
  6092 	position: function() {
       
  6093 		if ( !this[0] ) {
       
  6094 			return null;
       
  6095 		}
       
  6096 
       
  6097 		var elem = this[0],
       
  6098 
       
  6099 		// Get *real* offsetParent
       
  6100 		offsetParent = this.offsetParent(),
       
  6101 
       
  6102 		// Get correct offsets
       
  6103 		offset       = this.offset(),
       
  6104 		parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
       
  6105 
       
  6106 		// Subtract element margins
       
  6107 		// note: when an element has margin: auto the offsetLeft and marginLeft
       
  6108 		// are the same in Safari causing offset.left to incorrectly be 0
       
  6109 		offset.top  -= parseFloat( jQuery.curCSS(elem, "marginTop",  true) ) || 0;
       
  6110 		offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
       
  6111 
       
  6112 		// Add offsetParent borders
       
  6113 		parentOffset.top  += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth",  true) ) || 0;
       
  6114 		parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
       
  6115 
       
  6116 		// Subtract the two offsets
       
  6117 		return {
       
  6118 			top:  offset.top  - parentOffset.top,
       
  6119 			left: offset.left - parentOffset.left
       
  6120 		};
       
  6121 	},
       
  6122 
       
  6123 	offsetParent: function() {
       
  6124 		return this.map(function() {
       
  6125 			var offsetParent = this.offsetParent || document.body;
       
  6126 			while ( offsetParent && (!/^body|html$/i.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
       
  6127 				offsetParent = offsetParent.offsetParent;
       
  6128 			}
       
  6129 			return offsetParent;
       
  6130 		});
       
  6131 	}
       
  6132 });
       
  6133 
       
  6134 
       
  6135 // Create scrollLeft and scrollTop methods
       
  6136 jQuery.each( ["Left", "Top"], function( i, name ) {
       
  6137 	var method = "scroll" + name;
       
  6138 
       
  6139 	jQuery.fn[ method ] = function(val) {
       
  6140 		var elem = this[0], win;
       
  6141 		
       
  6142 		if ( !elem ) {
       
  6143 			return null;
       
  6144 		}
       
  6145 
       
  6146 		if ( val !== undefined ) {
       
  6147 			// Set the scroll offset
       
  6148 			return this.each(function() {
       
  6149 				win = getWindow( this );
       
  6150 
       
  6151 				if ( win ) {
       
  6152 					win.scrollTo(
       
  6153 						!i ? val : jQuery(win).scrollLeft(),
       
  6154 						 i ? val : jQuery(win).scrollTop()
       
  6155 					);
       
  6156 
       
  6157 				} else {
       
  6158 					this[ method ] = val;
       
  6159 				}
       
  6160 			});
       
  6161 		} else {
       
  6162 			win = getWindow( elem );
       
  6163 
       
  6164 			// Return the scroll offset
       
  6165 			return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
       
  6166 				jQuery.support.boxModel && win.document.documentElement[ method ] ||
       
  6167 					win.document.body[ method ] :
       
  6168 				elem[ method ];
       
  6169 		}
       
  6170 	};
       
  6171 });
       
  6172 
       
  6173 function getWindow( elem ) {
       
  6174 	return ("scrollTo" in elem && elem.document) ?
       
  6175 		elem :
       
  6176 		elem.nodeType === 9 ?
       
  6177 			elem.defaultView || elem.parentWindow :
       
  6178 			false;
       
  6179 }
       
  6180 // Create innerHeight, innerWidth, outerHeight and outerWidth methods
       
  6181 jQuery.each([ "Height", "Width" ], function( i, name ) {
       
  6182 
       
  6183 	var type = name.toLowerCase();
       
  6184 
       
  6185 	// innerHeight and innerWidth
       
  6186 	jQuery.fn["inner" + name] = function() {
       
  6187 		return this[0] ?
       
  6188 			jQuery.css( this[0], type, false, "padding" ) :
       
  6189 			null;
       
  6190 	};
       
  6191 
       
  6192 	// outerHeight and outerWidth
       
  6193 	jQuery.fn["outer" + name] = function( margin ) {
       
  6194 		return this[0] ?
       
  6195 			jQuery.css( this[0], type, false, margin ? "margin" : "border" ) :
       
  6196 			null;
       
  6197 	};
       
  6198 
       
  6199 	jQuery.fn[ type ] = function( size ) {
       
  6200 		// Get window width or height
       
  6201 		var elem = this[0];
       
  6202 		if ( !elem ) {
       
  6203 			return size == null ? null : this;
       
  6204 		}
       
  6205 		
       
  6206 		if ( jQuery.isFunction( size ) ) {
       
  6207 			return this.each(function( i ) {
       
  6208 				var self = jQuery( this );
       
  6209 				self[ type ]( size.call( this, i, self[ type ]() ) );
       
  6210 			});
       
  6211 		}
       
  6212 
       
  6213 		return ("scrollTo" in elem && elem.document) ? // does it walk and quack like a window?
       
  6214 			// Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
       
  6215 			elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
       
  6216 			elem.document.body[ "client" + name ] :
       
  6217 
       
  6218 			// Get document width or height
       
  6219 			(elem.nodeType === 9) ? // is it a document
       
  6220 				// Either scroll[Width/Height] or offset[Width/Height], whichever is greater
       
  6221 				Math.max(
       
  6222 					elem.documentElement["client" + name],
       
  6223 					elem.body["scroll" + name], elem.documentElement["scroll" + name],
       
  6224 					elem.body["offset" + name], elem.documentElement["offset" + name]
       
  6225 				) :
       
  6226 
       
  6227 				// Get or set width or height on the element
       
  6228 				size === undefined ?
       
  6229 					// Get width or height on the element
       
  6230 					jQuery.css( elem, type ) :
       
  6231 
       
  6232 					// Set the width or height on the element (default to pixels if value is unitless)
       
  6233 					this.css( type, typeof size === "string" ? size : size + "px" );
       
  6234 	};
       
  6235 
       
  6236 });
       
  6237 // Expose jQuery to the global object
       
  6238 window.jQuery = window.$ = jQuery;
       
  6239 
       
  6240 })(window);