Fixed errant pathing bugs.
authordsc <david.schoonover@gmail.com>
Mon, 13 Dec 2010 13:13:00 +0000 (05:13 -0800)
committerdsc <david.schoonover@gmail.com>
Mon, 13 Dec 2010 13:13:00 +0000 (05:13 -0800)
33 files changed:
build.sh [new file with mode: 0755]
lib/jquery-1.4.3.min.js [deleted file]
lib/jquery-1.4.4.js [moved from lib/jquery-1.4.3.js with 90% similarity]
lib/jquery-1.4.4.min.js [new file with mode: 0644]
lib/jquery.hotkeys-0.7.10.js [new file with mode: 0644]
lib/jquery.hotkeys-0.7.10.min.js [moved from lib/jquery.hotkeys.min.js with 100% similarity]
lib/jquery.hotkeys.js [changed from file to symlink]
lib/jquery.js
lib/jquery.sparkline-1.5.1.js [new file with mode: 0644]
lib/jquery.sparkline-1.5.1.min.js [moved from lib/jquery.sparkline.min.js with 100% similarity]
lib/jquery.sparkline.js [changed from file to symlink]
src/Y/modules/metaclass.js [deleted file]
src/Y/modules/old-y.event.js [deleted file]
src/Y/modules/simpleclass.js [deleted file]
src/Y/modules/y.plugin-arch.js [deleted file]
src/Y/modules/y.polyevent.js [deleted file]
src/Y/op.cjs
src/Y/types/array.cjs
src/Y/types/function.cjs
src/ezl/loop/fps.cjs
src/ezl/util/tree/quadtree.cjs
src/tanks/config.cjs
src/tanks/fx/explosion.cjs
src/tanks/game.cjs
src/tanks/map/wall.cjs
src/tanks/thing/bullet.cjs
src/tanks/thing/player.cjs
src/tanks/thing/tank.cjs
src/tanks/ui/grid.cjs
src/tanks/ui/main.cjs
www/deps.html
www/test/math/test-math.js
www/test/shapes/test-shapes.js

diff --git a/build.sh b/build.sh
new file mode 100755 (executable)
index 0000000..dede342
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,9 @@
+#!/bin/bash
+echo "building tanks..."
+if test -z "$*"; then
+    echo "commonjs src/{Y,ezl,tanks} --script-tags > www/deps.html"
+    time commonjs src/{Y,ezl,tanks} --script-tags > www/deps.html
+else
+    echo "commonjs src/{Y,ezl,tanks} $*"
+    time commonjs src/{Y,ezl,tanks} $*
+fi
diff --git a/lib/jquery-1.4.3.min.js b/lib/jquery-1.4.3.min.js
deleted file mode 100644 (file)
index c941a5f..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-/*!
- * jQuery JavaScript Library v1.4.3
- * http://jquery.com/
- *
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2010, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Oct 14 23:10:06 2010 -0400
- */
-(function(E,A){function U(){return false}function ba(){return true}function ja(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ga(a){var b,d,e=[],f=[],h,k,l,n,s,v,B,D;k=c.data(this,this.nodeType?"events":"__events__");if(typeof k==="function")k=k.events;if(!(a.liveFired===this||!k||!k.live||a.button&&a.type==="click")){if(a.namespace)D=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var H=k.live.slice(0);for(n=0;n<H.length;n++){k=H[n];k.origType.replace(X,
-"")===a.type?f.push(k.selector):H.splice(n--,1)}f=c(a.target).closest(f,a.currentTarget);s=0;for(v=f.length;s<v;s++){B=f[s];for(n=0;n<H.length;n++){k=H[n];if(B.selector===k.selector&&(!D||D.test(k.namespace))){l=B.elem;h=null;if(k.preType==="mouseenter"||k.preType==="mouseleave"){a.type=k.preType;h=c(a.relatedTarget).closest(k.selector)[0]}if(!h||h!==l)e.push({elem:l,handleObj:k,level:B.level})}}}s=0;for(v=e.length;s<v;s++){f=e[s];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;
-a.handleObj=f.handleObj;D=f.handleObj.origHandler.apply(f.elem,arguments);if(D===false||a.isPropagationStopped()){d=f.level;if(D===false)b=false}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(Ha,"`").replace(Ia,"&")}function ka(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Ja.test(b))return c.filter(b,
-e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function la(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var k in e[h])c.event.add(this,h,e[h][k],e[h][k].data)}}})}function Ka(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}
-function ma(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?La:Ma,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function ca(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Na.test(a)?e(a,h):ca(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?
-e(a,""):c.each(b,function(f,h){ca(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(na.concat.apply([],na.slice(0,b)),function(){d[this]=a});return d}function oa(a){if(!da[a]){var b=c("<"+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";da[a]=d}return da[a]}function ea(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var u=E.document,c=function(){function a(){if(!b.isReady){try{u.documentElement.doScroll("left")}catch(i){setTimeout(a,
-1);return}b.ready()}}var b=function(i,r){return new b.fn.init(i,r)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,k=/\S/,l=/^\s+/,n=/\s+$/,s=/\W/,v=/\d/,B=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,D=/^[\],:{}\s]*$/,H=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,G=/(?:^|:|,)(?:\s*\[)+/g,M=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,j=/(msie) ([\w.]+)/,o=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,
-q=[],t,x=Object.prototype.toString,C=Object.prototype.hasOwnProperty,P=Array.prototype.push,N=Array.prototype.slice,R=String.prototype.trim,Q=Array.prototype.indexOf,L={};b.fn=b.prototype={init:function(i,r){var y,z,F;if(!i)return this;if(i.nodeType){this.context=this[0]=i;this.length=1;return this}if(i==="body"&&!r&&u.body){this.context=u;this[0]=u.body;this.selector="body";this.length=1;return this}if(typeof i==="string")if((y=h.exec(i))&&(y[1]||!r))if(y[1]){F=r?r.ownerDocument||r:u;if(z=B.exec(i))if(b.isPlainObject(r)){i=
-[u.createElement(z[1])];b.fn.attr.call(i,r,true)}else i=[F.createElement(z[1])];else{z=b.buildFragment([y[1]],[F]);i=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,i)}else{if((z=u.getElementById(y[2]))&&z.parentNode){if(z.id!==y[2])return f.find(i);this.length=1;this[0]=z}this.context=u;this.selector=i;return this}else if(!r&&!s.test(i)){this.selector=i;this.context=u;i=u.getElementsByTagName(i);return b.merge(this,i)}else return!r||r.jquery?(r||f).find(i):b(r).find(i);
-else if(b.isFunction(i))return f.ready(i);if(i.selector!==A){this.selector=i.selector;this.context=i.context}return b.makeArray(i,this)},selector:"",jquery:"1.4.3",length:0,size:function(){return this.length},toArray:function(){return N.call(this,0)},get:function(i){return i==null?this.toArray():i<0?this.slice(i)[0]:this[i]},pushStack:function(i,r,y){var z=b();b.isArray(i)?P.apply(z,i):b.merge(z,i);z.prevObject=this;z.context=this.context;if(r==="find")z.selector=this.selector+(this.selector?" ":
-"")+y;else if(r)z.selector=this.selector+"."+r+"("+y+")";return z},each:function(i,r){return b.each(this,i,r)},ready:function(i){b.bindReady();if(b.isReady)i.call(u,b);else q&&q.push(i);return this},eq:function(i){return i===-1?this.slice(i):this.slice(i,+i+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(i){return this.pushStack(b.map(this,function(r,y){return i.call(r,
-y,r)}))},end:function(){return this.prevObject||b(null)},push:P,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var i=arguments[0]||{},r=1,y=arguments.length,z=false,F,I,K,J,fa;if(typeof i==="boolean"){z=i;i=arguments[1]||{};r=2}if(typeof i!=="object"&&!b.isFunction(i))i={};if(y===r){i=this;--r}for(;r<y;r++)if((F=arguments[r])!=null)for(I in F){K=i[I];J=F[I];if(i!==J)if(z&&J&&(b.isPlainObject(J)||(fa=b.isArray(J)))){if(fa){fa=false;clone=K&&b.isArray(K)?K:[]}else clone=
-K&&b.isPlainObject(K)?K:{};i[I]=b.extend(z,clone,J)}else if(J!==A)i[I]=J}return i};b.extend({noConflict:function(i){E.$=e;if(i)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(i){i===true&&b.readyWait--;if(!b.readyWait||i!==true&&!b.isReady){if(!u.body)return setTimeout(b.ready,1);b.isReady=true;if(!(i!==true&&--b.readyWait>0)){if(q){for(var r=0;i=q[r++];)i.call(u,b);q=null}b.fn.triggerHandler&&b(u).triggerHandler("ready")}}},bindReady:function(){if(!p){p=true;if(u.readyState==="complete")return setTimeout(b.ready,
-1);if(u.addEventListener){u.addEventListener("DOMContentLoaded",t,false);E.addEventListener("load",b.ready,false)}else if(u.attachEvent){u.attachEvent("onreadystatechange",t);E.attachEvent("onload",b.ready);var i=false;try{i=E.frameElement==null}catch(r){}u.documentElement.doScroll&&i&&a()}}},isFunction:function(i){return b.type(i)==="function"},isArray:Array.isArray||function(i){return b.type(i)==="array"},isWindow:function(i){return i&&typeof i==="object"&&"setInterval"in i},isNaN:function(i){return i==
-null||!v.test(i)||isNaN(i)},type:function(i){return i==null?String(i):L[x.call(i)]||"object"},isPlainObject:function(i){if(!i||b.type(i)!=="object"||i.nodeType||b.isWindow(i))return false;if(i.constructor&&!C.call(i,"constructor")&&!C.call(i.constructor.prototype,"isPrototypeOf"))return false;for(var r in i);return r===A||C.call(i,r)},isEmptyObject:function(i){for(var r in i)return false;return true},error:function(i){throw i;},parseJSON:function(i){if(typeof i!=="string"||!i)return null;i=b.trim(i);
-if(D.test(i.replace(H,"@").replace(w,"]").replace(G,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(i):(new Function("return "+i))();else b.error("Invalid JSON: "+i)},noop:function(){},globalEval:function(i){if(i&&k.test(i)){var r=u.getElementsByTagName("head")[0]||u.documentElement,y=u.createElement("script");y.type="text/javascript";if(b.support.scriptEval)y.appendChild(u.createTextNode(i));else y.text=i;r.insertBefore(y,r.firstChild);r.removeChild(y)}},nodeName:function(i,r){return i.nodeName&&i.nodeName.toUpperCase()===
-r.toUpperCase()},each:function(i,r,y){var z,F=0,I=i.length,K=I===A||b.isFunction(i);if(y)if(K)for(z in i){if(r.apply(i[z],y)===false)break}else for(;F<I;){if(r.apply(i[F++],y)===false)break}else if(K)for(z in i){if(r.call(i[z],z,i[z])===false)break}else for(y=i[0];F<I&&r.call(y,F,y)!==false;y=i[++F]);return i},trim:R?function(i){return i==null?"":R.call(i)}:function(i){return i==null?"":i.toString().replace(l,"").replace(n,"")},makeArray:function(i,r){var y=r||[];if(i!=null){var z=b.type(i);i.length==
-null||z==="string"||z==="function"||z==="regexp"||b.isWindow(i)?P.call(y,i):b.merge(y,i)}return y},inArray:function(i,r){if(r.indexOf)return r.indexOf(i);for(var y=0,z=r.length;y<z;y++)if(r[y]===i)return y;return-1},merge:function(i,r){var y=i.length,z=0;if(typeof r.length==="number")for(var F=r.length;z<F;z++)i[y++]=r[z];else for(;r[z]!==A;)i[y++]=r[z++];i.length=y;return i},grep:function(i,r,y){var z=[],F;y=!!y;for(var I=0,K=i.length;I<K;I++){F=!!r(i[I],I);y!==F&&z.push(i[I])}return z},map:function(i,
-r,y){for(var z=[],F,I=0,K=i.length;I<K;I++){F=r(i[I],I,y);if(F!=null)z[z.length]=F}return z.concat.apply([],z)},guid:1,proxy:function(i,r,y){if(arguments.length===2)if(typeof r==="string"){y=i;i=y[r];r=A}else if(r&&!b.isFunction(r)){y=r;r=A}if(!r&&i)r=function(){return i.apply(y||this,arguments)};if(i)r.guid=i.guid=i.guid||r.guid||b.guid++;return r},access:function(i,r,y,z,F,I){var K=i.length;if(typeof r==="object"){for(var J in r)b.access(i,J,r[J],z,F,y);return i}if(y!==A){z=!I&&z&&b.isFunction(y);
-for(J=0;J<K;J++)F(i[J],r,z?y.call(i[J],J,F(i[J],r)):y,I);return i}return K?F(i[0],r):A},now:function(){return(new Date).getTime()},uaMatch:function(i){i=i.toLowerCase();i=M.exec(i)||g.exec(i)||j.exec(i)||i.indexOf("compatible")<0&&o.exec(i)||[];return{browser:i[1]||"",version:i[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(i,r){L["[object "+r+"]"]=r.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=
-m.version}if(b.browser.webkit)b.browser.safari=true;if(Q)b.inArray=function(i,r){return Q.call(r,i)};if(!/\s/.test("\u00a0")){l=/^[\s\xA0]+/;n=/[\s\xA0]+$/}f=b(u);if(u.addEventListener)t=function(){u.removeEventListener("DOMContentLoaded",t,false);b.ready()};else if(u.attachEvent)t=function(){if(u.readyState==="complete"){u.detachEvent("onreadystatechange",t);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=u.documentElement,b=u.createElement("script"),d=u.createElement("div"),
-e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],k=u.createElement("select"),l=k.appendChild(u.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),
-hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:l.selected,optDisabled:false,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};k.disabled=true;c.support.optDisabled=!l.disabled;b.type="text/javascript";try{b.appendChild(u.createTextNode("window."+e+"=1;"))}catch(n){}a.insertBefore(b,
-a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function s(){c.support.noCloneEvent=false;d.detachEvent("onclick",s)});d.cloneNode(true).fireEvent("onclick")}d=u.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=u.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var s=u.createElement("div");
-s.style.width=s.style.paddingLeft="1px";u.body.appendChild(s);c.boxModel=c.support.boxModel=s.offsetWidth===2;if("zoom"in s.style){s.style.display="inline";s.style.zoom=1;c.support.inlineBlockNeedsLayout=s.offsetWidth===2;s.style.display="";s.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=s.offsetWidth!==2}s.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var v=s.getElementsByTagName("td");c.support.reliableHiddenOffsets=v[0].offsetHeight===
-0;v[0].style.display="";v[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&v[0].offsetHeight===0;s.innerHTML="";u.body.removeChild(s).style.display="none"});a=function(s){var v=u.createElement("div");s="on"+s;var B=s in v;if(!B){v.setAttribute(s,"return;");B=typeof v[s]==="function"}return B};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",
-cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var pa={},Oa=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?pa:a;var e=a.nodeType,f=e?a[c.expando]:null,h=c.cache;if(!(e&&!f&&typeof b==="string"&&d===A)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=
-c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==A)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?pa:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);else if(d)delete f[e];else for(var k in a)delete a[k]}},acceptData:function(a){if(a.nodeName){var b=
-c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){if(typeof a==="undefined")return this.length?c.data(this[0]):null;else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===A){var e=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(e===A&&this.length){e=c.data(this[0],a);if(e===A&&this[0].nodeType===1){e=this[0].getAttribute("data-"+a);if(typeof e===
-"string")try{e=e==="true"?true:e==="false"?false:e==="null"?null:!c.isNaN(e)?parseFloat(e):Oa.test(e)?c.parseJSON(e):e}catch(f){}else e=A}}return e===A&&d[1]?this.data(d[0]):e}else return this.each(function(){var h=c(this),k=[d[0],b];h.triggerHandler("setData"+d[1]+"!",k);c.data(this,a,b);h.triggerHandler("changeData"+d[1]+"!",k)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=c.data(a,b);if(!d)return e||
-[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===A)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
-a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var qa=/[\n\t]/g,ga=/\s+/,Pa=/\r/g,Qa=/^(?:href|src|style)$/,Ra=/^(?:button|input)$/i,Sa=/^(?:button|input|object|select|textarea)$/i,Ta=/^a(?:rea)?$/i,ra=/^(?:radio|checkbox)$/i;c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,
-a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(s){var v=c(this);v.addClass(a.call(this,s,v.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1)if(f.className){for(var h=" "+f.className+" ",k=f.className,l=0,n=b.length;l<n;l++)if(h.indexOf(" "+b[l]+" ")<0)k+=" "+b[l];f.className=c.trim(k)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(n){var s=
-c(this);s.removeClass(a.call(this,n,s.attr("class")))});if(a&&typeof a==="string"||a===A)for(var b=(a||"").split(ga),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(qa," "),k=0,l=b.length;k<l;k++)h=h.replace(" "+b[k]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,
-f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,k=c(this),l=b,n=a.split(ga);f=n[h++];){l=e?l:!k.hasClass(f);k[l?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(qa," ").indexOf(a)>-1)return true;return false},
-val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var k=f[h];if(k.selected&&(c.support.optDisabled?!k.disabled:k.getAttribute("disabled")===null)&&(!k.parentNode.disabled||!c.nodeName(k.parentNode,"optgroup"))){a=c(k).val();if(b)return a;d.push(a)}}return d}if(ra.test(b.type)&&
-!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Pa,"")}return A}var l=c.isFunction(a);return this.each(function(n){var s=c(this),v=a;if(this.nodeType===1){if(l)v=a.call(this,n,s.val());if(v==null)v="";else if(typeof v==="number")v+="";else if(c.isArray(v))v=c.map(v,function(D){return D==null?"":D+""});if(c.isArray(v)&&ra.test(this.type))this.checked=c.inArray(s.val(),v)>=0;else if(c.nodeName(this,"select")){var B=c.makeArray(v);c("option",this).each(function(){this.selected=
-c.inArray(c(this).val(),B)>=0});if(!B.length)this.selectedIndex=-1}else this.value=v}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return A;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==A;b=e&&c.props[b]||b;if(a.nodeType===1){var h=Qa.test(b);if((b in a||a[b]!==A)&&e&&!h){if(f){b==="type"&&Ra.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
-if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Sa.test(a.nodeName)||Ta.test(a.nodeName)&&a.href?0:A;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return A;a=!c.support.hrefNormalized&&e&&
-h?a.getAttribute(b,2):a.getAttribute(b);return a===null?A:a}}});var X=/\.(.*)$/,ha=/^(?:textarea|input|select)$/i,Ha=/\./g,Ia=/ /g,Ua=/[^\w\s.|`]/g,Va=function(a){return a.replace(Ua,"\\$&")},sa={focusin:0,focusout:0};c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var k=a.nodeType?"events":"__events__",l=h[k],n=h.handle;if(typeof l===
-"function"){n=l.handle;l=l.events}else if(!l){a.nodeType||(h[k]=h=function(){});h.events=l={}}if(!n)h.handle=n=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(n.elem,arguments):A};n.elem=a;b=b.split(" ");for(var s=0,v;k=b[s++];){h=f?c.extend({},f):{handler:d,data:e};if(k.indexOf(".")>-1){v=k.split(".");k=v.shift();h.namespace=v.slice(0).sort().join(".")}else{v=[];h.namespace=""}h.type=k;if(!h.guid)h.guid=d.guid;var B=l[k],D=c.event.special[k]||{};if(!B){B=l[k]=[];
-if(!D.setup||D.setup.call(a,e,v,n)===false)if(a.addEventListener)a.addEventListener(k,n,false);else a.attachEvent&&a.attachEvent("on"+k,n)}if(D.add){D.add.call(a,h);if(!h.handler.guid)h.handler.guid=d.guid}B.push(h);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,k=0,l,n,s,v,B,D,H=a.nodeType?"events":"__events__",w=c.data(a),G=w&&w[H];if(w&&G){if(typeof G==="function"){w=G;G=G.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||
-typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in G)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[k++];){v=f;l=f.indexOf(".")<0;n=[];if(!l){n=f.split(".");f=n.shift();s=RegExp("(^|\\.)"+c.map(n.slice(0).sort(),Va).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(B=G[f])if(d){v=c.event.special[f]||{};for(h=e||0;h<B.length;h++){D=B[h];if(d.guid===D.guid){if(l||s.test(D.namespace)){e==null&&B.splice(h--,1);v.remove&&v.remove.call(a,D)}if(e!=null)break}}if(B.length===0||e!=null&&B.length===1){if(!v.teardown||
-v.teardown.call(a,n)===false)c.removeEvent(a,f,w.handle);delete G[f]}}else for(h=0;h<B.length;h++){D=B[h];if(l||s.test(D.namespace)){c.event.remove(a,v,D.handler,h);B.splice(h--,1)}}}if(c.isEmptyObject(G)){if(b=w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,H);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=
-f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return A;a.result=A;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===
-false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){e=a.target;var k,l=f.replace(X,""),n=c.nodeName(e,"a")&&l==="click",s=c.event.special[l]||{};if((!s._default||s._default.call(d,a)===false)&&!n&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[l]){if(k=e["on"+l])e["on"+l]=null;c.event.triggered=true;e[l]()}}catch(v){}if(k)e["on"+l]=k;c.event.triggered=false}}},handle:function(a){var b,d,e;
-d=[];var f,h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var k=d.length;f<k;f++){var l=d[f];if(b||e.test(l.namespace)){a.handler=l.handler;a.data=
-l.data;a.handleObj=l;l=l.handler.apply(this,h);if(l!==A){a.result=l;if(l===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
-fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||u;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=u.documentElement;d=u.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
-d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==A)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ga,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
-Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=u.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
-c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
-var ta=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},ua=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?ua:ta,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?ua:ta)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
-"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=A;return ja("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=A;return ja("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
-va=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ha.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=va(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===A||f===e))if(e!=null||f){a.type="change";a.liveFired=
-A;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",va(a))}},setup:function(){if(this.type===
-"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ha.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ha.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}u.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){sa[b]++===0&&u.addEventListener(a,d,true)},teardown:function(){--sa[b]===
-0&&u.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=A}var k=b==="one"?c.proxy(f,function(n){c(this).unbind(n,k);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var l=this.length;h<l;h++)c.event.add(this[h],d,k,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
-a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
-1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var wa={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var k,l=0,n,s,v=h||this.selector;h=h?this:c(this.context);if(typeof d===
-"object"&&!d.preventDefault){for(k in d)h[b](k,e,d[k],v);return this}if(c.isFunction(e)){f=e;e=A}for(d=(d||"").split(" ");(k=d[l++])!=null;){n=X.exec(k);s="";if(n){s=n[0];k=k.replace(X,"")}if(k==="hover")d.push("mouseenter"+s,"mouseleave"+s);else{n=k;if(k==="focus"||k==="blur"){d.push(wa[k]+s);k+=s}else k=(wa[k]||k)+s;if(b==="live"){s=0;for(var B=h.length;s<B;s++)c.event.add(h[s],"live."+Y(k,v),{data:e,selector:v,handler:f,origType:k,origHandler:f,preType:n})}else h.unbind("live."+Y(k,v),f)}}return this}});
-c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
-(function(){function a(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1&&!q){x.sizcache=o;x.sizset=p}if(x.nodeName.toLowerCase()===j){C=x;break}x=x[g]}m[p]=C}}}function b(g,j,o,m,p,q){p=0;for(var t=m.length;p<t;p++){var x=m[p];if(x){x=x[g];for(var C=false;x;){if(x.sizcache===o){C=m[x.sizset];break}if(x.nodeType===1){if(!q){x.sizcache=o;x.sizset=p}if(typeof j!=="string"){if(x===j){C=true;break}}else if(l.filter(j,
-[x]).length>0){C=x;break}}x=x[g]}m[p]=C}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,k=true;[0,0].sort(function(){k=false;return 0});var l=function(g,j,o,m){o=o||[];var p=j=j||u;if(j.nodeType!==1&&j.nodeType!==9)return[];if(!g||typeof g!=="string")return o;var q=[],t,x,C,P,N=true,R=l.isXML(j),Q=g,L;do{d.exec("");if(t=d.exec(Q)){Q=t[3];q.push(t[1]);if(t[2]){P=t[3];
-break}}}while(t);if(q.length>1&&s.exec(g))if(q.length===2&&n.relative[q[0]])x=M(q[0]+q[1],j);else for(x=n.relative[q[0]]?[j]:l(q.shift(),j);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();x=M(g,x)}else{if(!m&&q.length>1&&j.nodeType===9&&!R&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){t=l.find(q.shift(),j,R);j=t.expr?l.filter(t.expr,t.set)[0]:t.set[0]}if(j){t=m?{expr:q.pop(),set:D(m)}:l.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&j.parentNode?j.parentNode:j,R);x=t.expr?l.filter(t.expr,
-t.set):t.set;if(q.length>0)C=D(x);else N=false;for(;q.length;){t=L=q.pop();if(n.relative[L])t=q.pop();else L="";if(t==null)t=j;n.relative[L](C,t,R)}}else C=[]}C||(C=x);C||l.error(L||g);if(f.call(C)==="[object Array]")if(N)if(j&&j.nodeType===1)for(g=0;C[g]!=null;g++){if(C[g]&&(C[g]===true||C[g].nodeType===1&&l.contains(j,C[g])))o.push(x[g])}else for(g=0;C[g]!=null;g++)C[g]&&C[g].nodeType===1&&o.push(x[g]);else o.push.apply(o,C);else D(C,o);if(P){l(P,p,o,m);l.uniqueSort(o)}return o};l.uniqueSort=function(g){if(w){h=
-k;g.sort(w);if(h)for(var j=1;j<g.length;j++)g[j]===g[j-1]&&g.splice(j--,1)}return g};l.matches=function(g,j){return l(g,null,null,j)};l.matchesSelector=function(g,j){return l(j,null,null,[g]).length>0};l.find=function(g,j,o){var m;if(!g)return[];for(var p=0,q=n.order.length;p<q;p++){var t=n.order[p],x;if(x=n.leftMatch[t].exec(g)){var C=x[1];x.splice(1,1);if(C.substr(C.length-1)!=="\\"){x[1]=(x[1]||"").replace(/\\/g,"");m=n.find[t](x,j,o);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=j.getElementsByTagName("*"));
-return{set:m,expr:g}};l.filter=function(g,j,o,m){for(var p=g,q=[],t=j,x,C,P=j&&j[0]&&l.isXML(j[0]);g&&j.length;){for(var N in n.filter)if((x=n.leftMatch[N].exec(g))!=null&&x[2]){var R=n.filter[N],Q,L;L=x[1];C=false;x.splice(1,1);if(L.substr(L.length-1)!=="\\"){if(t===q)q=[];if(n.preFilter[N])if(x=n.preFilter[N](x,t,o,q,m,P)){if(x===true)continue}else C=Q=true;if(x)for(var i=0;(L=t[i])!=null;i++)if(L){Q=R(L,x,i,t);var r=m^!!Q;if(o&&Q!=null)if(r)C=true;else t[i]=false;else if(r){q.push(L);C=true}}if(Q!==
-A){o||(t=q);g=g.replace(n.match[N],"");if(!C)return[];break}}}if(g===p)if(C==null)l.error(g);else break;p=g}return t};l.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=l.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\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,j){var o=typeof j==="string",m=o&&!/\W/.test(j);o=o&&!m;if(m)j=j.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=o||q&&q.nodeName.toLowerCase()===
-j?q||false:q===j}o&&l.filter(j,g,true)},">":function(g,j){var o=typeof j==="string",m,p=0,q=g.length;if(o&&!/\W/.test(j))for(j=j.toLowerCase();p<q;p++){if(m=g[p]){o=m.parentNode;g[p]=o.nodeName.toLowerCase()===j?o:false}}else{for(;p<q;p++)if(m=g[p])g[p]=o?m.parentNode:m.parentNode===j;o&&l.filter(j,g,true)}},"":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=j=j.toLowerCase();p=a}p("parentNode",j,m,g,q,o)},"~":function(g,j,o){var m=e++,p=b,q;if(typeof j==="string"&&!/\W/.test(j)){q=
-j=j.toLowerCase();p=a}p("previousSibling",j,m,g,q,o)}},find:{ID:function(g,j,o){if(typeof j.getElementById!=="undefined"&&!o)return(g=j.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,j){if(typeof j.getElementsByName!=="undefined"){for(var o=[],m=j.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&o.push(m[p]);return o.length===0?null:o}},TAG:function(g,j){return j.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,j,o,m,p,q){g=" "+g[1].replace(/\\/g,
-"")+" ";if(q)return g;q=0;for(var t;(t=j[q])!=null;q++)if(t)if(p^(t.className&&(" "+t.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))o||m.push(t);else if(o)j[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var j=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=j[1]+(j[2]||1)-0;g[3]=j[3]-0}g[0]=e++;return g},ATTR:function(g,j,o,
-m,p,q){j=g[1].replace(/\\/g,"");if(!q&&n.attrMap[j])g[1]=n.attrMap[j];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,j,o,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=l(g[3],null,null,j);else{g=l.filter(g[3],j,o,true^p);o||m.push.apply(m,g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
-true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,j,o){return!!l(o[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
-g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,j){return j===0},last:function(g,j,o,m){return j===m.length-1},even:function(g,j){return j%2===0},odd:function(g,j){return j%2===1},lt:function(g,j,o){return j<o[3]-0},gt:function(g,j,o){return j>o[3]-0},nth:function(g,j,o){return o[3]-
-0===j},eq:function(g,j,o){return o[3]-0===j}},filter:{PSEUDO:function(g,j,o,m){var p=j[1],q=n.filters[p];if(q)return q(g,o,j,m);else if(p==="contains")return(g.textContent||g.innerText||l.getText([g])||"").indexOf(j[3])>=0;else if(p==="not"){j=j[3];o=0;for(m=j.length;o<m;o++)if(j[o]===g)return false;return true}else l.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,j){var o=j[1],m=g;switch(o){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(o===
-"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":o=j[2];var p=j[3];if(o===1&&p===0)return true;var q=j[0],t=g.parentNode;if(t&&(t.sizcache!==q||!g.nodeIndex)){var x=0;for(m=t.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++x;t.sizcache=q}m=g.nodeIndex-p;return o===0?m===0:m%o===0&&m/o>=0}},ID:function(g,j){return g.nodeType===1&&g.getAttribute("id")===j},TAG:function(g,j){return j==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
-j},CLASS:function(g,j){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(j)>-1},ATTR:function(g,j){var o=j[1];o=n.attrHandle[o]?n.attrHandle[o](g):g[o]!=null?g[o]:g.getAttribute(o);var m=o+"",p=j[2],q=j[4];return o==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&o!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,j,o,m){var p=n.setFilters[j[2]];
-if(p)return p(g,o,j,m)}}},s=n.match.POS,v=function(g,j){return"\\"+(j-0+1)},B;for(B in n.match){n.match[B]=RegExp(n.match[B].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[B]=RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[B].source.replace(/\\(\d+)/g,v))}var D=function(g,j){g=Array.prototype.slice.call(g,0);if(j){j.push.apply(j,g);return j}return g};try{Array.prototype.slice.call(u.documentElement.childNodes,0)}catch(H){D=function(g,j){var o=j||[],m=0;if(f.call(g)==="[object Array]")Array.prototype.push.apply(o,
-g);else if(typeof g.length==="number")for(var p=g.length;m<p;m++)o.push(g[m]);else for(;g[m];m++)o.push(g[m]);return o}}var w,G;if(u.documentElement.compareDocumentPosition)w=function(g,j){if(g===j){h=true;return 0}if(!g.compareDocumentPosition||!j.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(j)&4?-1:1};else{w=function(g,j){var o=[],m=[],p=g.parentNode,q=j.parentNode,t=p;if(g===j){h=true;return 0}else if(p===q)return G(g,j);else if(p){if(!q)return 1}else return-1;
-for(;t;){o.unshift(t);t=t.parentNode}for(t=q;t;){m.unshift(t);t=t.parentNode}p=o.length;q=m.length;for(t=0;t<p&&t<q;t++)if(o[t]!==m[t])return G(o[t],m[t]);return t===p?G(g,m[t],-1):G(o[t],j,1)};G=function(g,j,o){if(g===j)return o;for(g=g.nextSibling;g;){if(g===j)return-1;g=g.nextSibling}return 1}}l.getText=function(g){for(var j="",o,m=0;g[m];m++){o=g[m];if(o.nodeType===3||o.nodeType===4)j+=o.nodeValue;else if(o.nodeType!==8)j+=l.getText(o.childNodes)}return j};(function(){var g=u.createElement("div"),
-j="script"+(new Date).getTime();g.innerHTML="<a name='"+j+"'/>";var o=u.documentElement;o.insertBefore(g,o.firstChild);if(u.getElementById(j)){n.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:A:[]};n.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}o.removeChild(g);
-o=g=null})();(function(){var g=u.createElement("div");g.appendChild(u.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(j,o){var m=o.getElementsByTagName(j[1]);if(j[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(j){return j.getAttribute("href",2)};g=null})();u.querySelectorAll&&
-function(){var g=l,j=u.createElement("div");j.innerHTML="<p class='TEST'></p>";if(!(j.querySelectorAll&&j.querySelectorAll(".TEST").length===0)){l=function(m,p,q,t){p=p||u;if(!t&&!l.isXML(p))if(p.nodeType===9)try{return D(p.querySelectorAll(m),q)}catch(x){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var C=p.id,P=p.id="__sizzle__";try{return D(p.querySelectorAll("#"+P+" "+m),q)}catch(N){}finally{if(C)p.id=C;else p.removeAttribute("id")}}return g(m,p,q,t)};for(var o in g)l[o]=g[o];
-j=null}}();(function(){var g=u.documentElement,j=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,o=false;try{j.call(u.documentElement,":sizzle")}catch(m){o=true}if(j)l.matchesSelector=function(p,q){try{if(o||!n.match.PSEUDO.test(q))return j.call(p,q)}catch(t){}return l(q,null,null,[p]).length>0}})();(function(){var g=u.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===
-0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(j,o,m){if(typeof o.getElementsByClassName!=="undefined"&&!m)return o.getElementsByClassName(j[1])};g=null}}})();l.contains=u.documentElement.contains?function(g,j){return g!==j&&(g.contains?g.contains(j):true)}:function(g,j){return!!(g.compareDocumentPosition(j)&16)};l.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var M=function(g,
-j){for(var o=[],m="",p,q=j.nodeType?[j]:j;p=n.match.PSEUDO.exec(g);){m+=p[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;p=0;for(var t=q.length;p<t;p++)l(g,q[p],o);return l.filter(m,o)};c.find=l;c.expr=l.selectors;c.expr[":"]=c.expr.filters;c.unique=l.uniqueSort;c.text=l.getText;c.isXMLDoc=l.isXML;c.contains=l.contains})();var Wa=/Until$/,Xa=/^(?:parents|prevUntil|prevAll)/,Ya=/,/,Ja=/^.[^:#\[\.,]*$/,Za=Array.prototype.slice,$a=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("",
-"find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var k=0;k<d;k++)if(b[k]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(ka(this,a,false),"not",a)},filter:function(a){return this.pushStack(ka(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,
-b){var d=[],e,f,h=this[0];if(c.isArray(a)){var k={},l,n=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:n})}h=h.parentNode;n++}}return d}k=$a.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(k?k.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||
-!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});
-c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",
-d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Wa.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||Ya.test(e))&&Xa.test(a))f=f.reverse();return this.pushStack(f,a,Za.call(arguments).join(","))}});
-c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===A||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var xa=/ jQuery\d+="(?:\d+|null)"/g,
-$=/^\s+/,ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,za=/<([\w:]+)/,ab=/<tbody/i,bb=/<|&#?\w+;/,Aa=/<(?:script|object|embed|option|style)/i,Ba=/checked\s*(?:[^=]|=\s*.checked.)/i,cb=/\=([^="'>\s]+\/)>/g,O={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],
-area:[1,"<map>","</map>"],_default:[0,"",""]};O.optgroup=O.option;O.tbody=O.tfoot=O.colgroup=O.caption=O.thead;O.th=O.td;if(!c.support.htmlSerialize)O._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==A)return this.empty().append((this[0]&&this[0].ownerDocument||u).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,
-d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},
-unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=
-c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));
-c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(xa,"").replace(cb,'="$1">').replace($,
-"")],e)[0]}else return this.cloneNode(true)});if(a===true){la(this,b);la(this.find("*"),b.find("*"))}return b},html:function(a){if(a===A)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(xa,""):null;else if(typeof a==="string"&&!Aa.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!O[(za.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(ya,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?
-this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,
-true)},domManip:function(a,b,d){var e,f,h=a[0],k=[],l;if(!c.support.checkClone&&arguments.length===3&&typeof h==="string"&&Ba.test(h))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(h))return this.each(function(s){var v=c(this);a[0]=h.call(this,s,b?v.html():A);v.domManip(a,b,d)});if(this[0]){e=h&&h.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);l=e.fragment;if(f=l.childNodes.length===1?l=l.firstChild:
-l.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var n=this.length;f<n;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):this[f]:this[f],f>0||e.cacheable||this.length>1?l.cloneNode(true):l)}k.length&&c.each(k,Ka)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:u;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===u&&!Aa.test(a[0])&&(c.support.checkClone||
-!Ba.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=
-d.length;f<h;f++){var k=(f>0?this.clone(true):this).get();c(d[f])[b](k);e=e.concat(k)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||u;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||u;for(var f=[],h=0,k;(k=a[h])!=null;h++){if(typeof k==="number")k+="";if(k){if(typeof k==="string"&&!bb.test(k))k=b.createTextNode(k);else if(typeof k==="string"){k=k.replace(ya,"<$1></$2>");var l=(za.exec(k)||["",""])[1].toLowerCase(),n=O[l]||O._default,
-s=n[0],v=b.createElement("div");for(v.innerHTML=n[1]+k+n[2];s--;)v=v.lastChild;if(!c.support.tbody){s=ab.test(k);l=l==="table"&&!s?v.firstChild&&v.firstChild.childNodes:n[1]==="<table>"&&!s?v.childNodes:[];for(n=l.length-1;n>=0;--n)c.nodeName(l[n],"tbody")&&!l[n].childNodes.length&&l[n].parentNode.removeChild(l[n])}!c.support.leadingWhitespace&&$.test(k)&&v.insertBefore(b.createTextNode($.exec(k)[0]),v.firstChild);k=v.childNodes}if(k.nodeType)f.push(k);else f=c.merge(f,k)}}if(d)for(h=0;f[h];h++)if(e&&
-c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,k=0,l;(l=a[k])!=null;k++)if(!(l.nodeName&&c.noData[l.nodeName.toLowerCase()]))if(d=l[c.expando]){if((b=e[d])&&b.events)for(var n in b.events)f[n]?
-c.event.remove(l,n):c.removeEvent(l,n,b.handle);if(h)delete l[c.expando];else l.removeAttribute&&l.removeAttribute(c.expando);delete e[d]}}});var Ca=/alpha\([^)]*\)/i,db=/opacity=([^)]*)/,eb=/-([a-z])/ig,fb=/([A-Z])/g,Da=/^-?\d+(?:px)?$/i,gb=/^-?\d/,hb={position:"absolute",visibility:"hidden",display:"block"},La=["Left","Right"],Ma=["Top","Bottom"],W,ib=u.defaultView&&u.defaultView.getComputedStyle,jb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===A)return this;
-return c.access(this,a,b,true,function(d,e,f){return f!==A?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),k=a.style,l=c.cssHooks[h];b=c.cssProps[h]||
-h;if(d!==A){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!l||!("set"in l)||(d=l.set(a,d))!==A)try{k[b]=d}catch(n){}}}else{if(l&&"get"in l&&(f=l.get(a,false,e))!==A)return f;return k[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==A)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=
-e[f]},camelCase:function(a){return a.replace(eb,jb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=ma(d,b,f);else c.swap(d,hb,function(){h=ma(d,b,f)});return h+"px"}},set:function(d,e){if(Da.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return db.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":
-b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=d.filter||"";d.filter=Ca.test(f)?f.replace(Ca,e):d.filter+" "+e}};if(ib)W=function(a,b,d){var e;d=d.replace(fb,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return A;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};else if(u.documentElement.currentStyle)W=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],
-h=a.style;if(!Da.test(f)&&gb.test(f)){d=h.left;e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f};if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var kb=c.now(),lb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-mb=/^(?:select|textarea)/i,nb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ob=/^(?:GET|HEAD|DELETE)$/,Na=/\[\]$/,T=/\=\?(&|$)/,ia=/\?/,pb=/([?&])_=[^&]*/,qb=/^(\w+:)?\/\/([^\/?#]+)/,rb=/%20/g,sb=/#.*$/,Ea=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ea)return Ea.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=
-b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(k,l){if(l==="success"||l==="notmodified")h.html(f?c("<div>").append(k.responseText.replace(lb,"")).find(f):k.responseText);d&&h.each(d,[k.responseText,l,k])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
-!this.disabled&&(this.checked||mb.test(this.nodeName)||nb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
-getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
-script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),k=ob.test(h);b.url=b.url.replace(sb,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ia.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
-!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+kb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var l=E[d];E[d]=function(m){f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);if(c.isFunction(l))l(m);else{E[d]=A;try{delete E[d]}catch(p){}}v&&v.removeChild(B)}}if(b.dataType==="script"&&b.cache===null)b.cache=
-false;if(b.cache===false&&h==="GET"){var n=c.now(),s=b.url.replace(pb,"$1_="+n);b.url=s+(s===b.url?(ia.test(b.url)?"&":"?")+"_="+n:"")}if(b.data&&h==="GET")b.url+=(ia.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");n=(n=qb.exec(b.url))&&(n[1]&&n[1]!==location.protocol||n[2]!==location.host);if(b.dataType==="script"&&h==="GET"&&n){var v=u.getElementsByTagName("head")[0]||u.documentElement,B=u.createElement("script");if(b.scriptCharset)B.charset=b.scriptCharset;B.src=
-b.url;if(!d){var D=false;B.onload=B.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);B.onload=B.onreadystatechange=null;v&&B.parentNode&&v.removeChild(B)}}}v.insertBefore(B,v.firstChild);return A}var H=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!k||a&&a.contentType)w.setRequestHeader("Content-Type",
-b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}n||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(G){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
-c.triggerGlobal(b,"ajaxSend",[w,b]);var M=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){H||c.handleComplete(b,w,e,f);H=true;if(w)w.onreadystatechange=c.noop}else if(!H&&w&&(w.readyState===4||m==="timeout")){H=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
-c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&g.call&&g.call(w);M("abort")}}catch(j){}b.async&&b.timeout>0&&setTimeout(function(){w&&!H&&M("timeout")},b.timeout);try{w.send(k||b.data==null?null:b.data)}catch(o){c.handleError(b,w,null,o);c.handleComplete(b,w,e,f)}b.async||M();return w}},param:function(a,b){var d=[],e=function(h,k){k=c.isFunction(k)?k():k;d[d.length]=encodeURIComponent(h)+
-"="+encodeURIComponent(k)};if(b===A)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)ca(f,a[f],b,e);return d.join("&").replace(rb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",[b,a])},handleComplete:function(a,
-b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),e=a.getResponseHeader("Etag");
-if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});if(E.ActiveXObject)c.ajaxSettings.xhr=
-function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var da={},tb=/^(?:toggle|show|hide)$/,ub=/^([+\-]=)?([\d+.\-]+)(.*)$/,aa,na=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",3),a,b,d);else{a=
-0;for(b=this.length;a<b;a++){if(!c.data(this[a],"olddisplay")&&this[a].style.display==="none")this[a].style.display="";this[a].style.display===""&&c.css(this[a],"display")==="none"&&c.data(this[a],"olddisplay",oa(this[a].nodeName))}for(a=0;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",d)}for(a=
-0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,d,e);if(c.isEmptyObject(a))return this.each(f.complete);
-return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),k,l=this.nodeType===1,n=l&&c(this).is(":hidden"),s=this;for(k in a){var v=c.camelCase(k);if(k!==v){a[v]=a[k];delete a[k];k=v}if(a[k]==="hide"&&n||a[k]==="show"&&!n)return h.complete.call(this);if(l&&(k==="height"||k==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(oa(this.nodeName)===
-"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[k])){(h.specialEasing=h.specialEasing||{})[k]=a[k][1];a[k]=a[k][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(B,D){var H=new c.fx(s,h,B);if(tb.test(D))H[D==="toggle"?n?"show":"hide":D](a);else{var w=ub.exec(D),G=H.cur(true)||0;if(w){var M=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(s,B,(M||1)+g);
-G=(M||1)/H.cur(true)*G;c.style(s,B,G+g)}if(w[1])M=(w[1]==="-="?-1:1)*M+G;H.custom(G,M,g)}else H.custom(G,D,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
-d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
-Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(h){return f.step(h)}
-this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var f=this;a=c.fx;e.elem=this.elem;if(e()&&c.timers.push(e)&&!aa)aa=setInterval(a.tick,a.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
-this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(l,n){f.style["overflow"+n]=h.overflow[l]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
-this.options.show)for(var k in this.options.curAnim)c.style(this.elem,k,this.options.orig[k]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
-c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(aa);aa=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
-b.elem}).length};var vb=/^t(?:able|d|h)$/i,Fa=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in u.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(k){c.offset.setOffset(this,a,k)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=ea(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
-h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(s){c.offset.setOffset(this,a,s)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,e=b.ownerDocument,f,h=e.documentElement,k=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;
-for(var l=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==k&&b!==h;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;f=e?e.getComputedStyle(b,null):b.currentStyle;l-=b.scrollTop;n-=b.scrollLeft;if(b===d){l+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&vb.test(b.nodeName))){l+=parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&f.overflow!=="visible"){l+=
-parseFloat(f.borderTopWidth)||0;n+=parseFloat(f.borderLeftWidth)||0}f=f}if(f.position==="relative"||f.position==="static"){l+=k.offsetTop;n+=k.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){l+=Math.max(h.scrollTop,k.scrollTop);n+=Math.max(h.scrollLeft,k.scrollLeft)}return{top:l,left:n}};c.offset={initialize:function(){var a=u.body,b=u.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
-height:"1px",visibility:"hidden"});b.innerHTML="<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>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
-f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
-"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),k=c.css(a,"top"),l=c.css(a,"left"),n=e==="absolute"&&c.inArray("auto",[k,l])>-1;e={};var s={};if(n)s=f.position();k=n?s.top:parseInt(k,10)||0;l=n?s.left:parseInt(l,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+k;if(b.left!=null)e.left=b.left-h.left+l;"using"in b?b.using.call(a,
-e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Fa.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||u.body;a&&!Fa.test(a.nodeName)&&
-c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==A)return this.each(function(){if(h=ea(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=ea(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
-c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(h){var k=c(this);k[d](e.call(this,h,k[d]()))});return c.isWindow(f)?f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b]:f.nodeType===9?Math.max(f.documentElement["client"+
-b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]):e===A?parseFloat(c.css(f,d)):this.css(d,typeof e==="string"?e:e+"px")}})})(window);
similarity index 90%
rename from lib/jquery-1.4.3.js
rename to lib/jquery-1.4.4.js
index ad9a79c..a4f1145 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * jQuery JavaScript Library v1.4.3
+ * jQuery JavaScript Library v1.4.4
  * http://jquery.com/
  *
  * Copyright 2010, John Resig
@@ -11,7 +11,7 @@
  * Copyright 2010, The Dojo Foundation
  * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Thu Oct 14 23:10:06 2010 -0400
+ * Date: Thu Nov 11 19:04:53 2010 -0500
  */
 (function( window, undefined ) {
 
@@ -211,7 +211,7 @@ jQuery.fn = jQuery.prototype = {
        selector: "",
 
        // The current version of jQuery being used
-       jquery: "1.4.3",
+       jquery: "1.4.4",
 
        // The default length of a jQuery object is 0
        length: 0,
@@ -330,8 +330,11 @@ jQuery.fn = jQuery.prototype = {
 jQuery.fn.init.prototype = jQuery.fn;
 
 jQuery.extend = jQuery.fn.extend = function() {
-       // copy reference to target object
-       var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options, name, src, copy, copyIsArray;
+        var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
 
        // Handle a deep copy situation
        if ( typeof target === "boolean" ) {
@@ -433,18 +436,21 @@ jQuery.extend({
                        // If there are functions bound, to execute
                        if ( readyList ) {
                                // Execute all of them
-                               var fn, i = 0;
-                               while ( (fn = readyList[ i++ ]) ) {
-                                       fn.call( document, jQuery );
-                               }
+                               var fn,
+                                       i = 0,
+                                       ready = readyList;
 
                                // Reset the list of functions
                                readyList = null;
-                       }
 
-                       // Trigger any bound ready events
-                       if ( jQuery.fn.triggerHandler ) {
-                               jQuery( document ).triggerHandler( "ready" );
+                               while ( (fn = ready[ i++ ]) ) {
+                                       fn.call( document, jQuery );
+                               }
+
+                               // Trigger any bound ready events
+                               if ( jQuery.fn.trigger ) {
+                                       jQuery( document ).trigger( "ready" ).unbind( "ready" );
+                               }
                        }
                }
        },
@@ -697,7 +703,8 @@ jQuery.extend({
        },
 
        merge: function( first, second ) {
-               var i = first.length, j = 0;
+               var i = first.length,
+                       j = 0;
 
                if ( typeof second.length === "number" ) {
                        for ( var l = second.length; j < l; j++ ) {
@@ -964,6 +971,7 @@ return (window.jQuery = window.$ = jQuery);
                optSelected: opt.selected,
 
                // Will be defined later
+               deleteExpando: true,
                optDisabled: false,
                checkClone: false,
                scriptEval: false,
@@ -994,6 +1002,15 @@ return (window.jQuery = window.$ = jQuery);
                delete window[ id ];
        }
 
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete script.test;
+
+       } catch(e) {
+               jQuery.support.deleteExpando = false;
+       }
+
        root.removeChild( script );
 
        if ( div.attachEvent && div.fireEvent ) {
@@ -1087,20 +1104,6 @@ return (window.jQuery = window.$ = jQuery);
        root = script = div = all = a = null;
 })();
 
-jQuery.props = {
-       "for": "htmlFor",
-       "class": "className",
-       readonly: "readOnly",
-       maxlength: "maxLength",
-       cellspacing: "cellSpacing",
-       rowspan: "rowSpan",
-       colspan: "colSpan",
-       tabindex: "tabIndex",
-       usemap: "useMap",
-       frameborder: "frameBorder"
-};
-
-
 
 
 var windowData = {},
@@ -1237,8 +1240,24 @@ jQuery.extend({
 
 jQuery.fn.extend({
        data: function( key, value ) {
+               var data = null;
+
                if ( typeof key === "undefined" ) {
-                       return this.length ? jQuery.data( this[0] ) : null;
+                       if ( this.length ) {
+                               var attr = this[0].attributes, name;
+                               data = jQuery.data( this[0] );
+
+                               for ( var i = 0, l = attr.length; i < l; i++ ) {
+                                       name = attr[i].name;
+
+                                       if ( name.indexOf( "data-" ) === 0 ) {
+                                               name = name.substr( 5 );
+                                               dataAttr( this[0], name, data[ name ] );
+                                       }
+                               }
+                       }
+
+                       return data;
 
                } else if ( typeof key === "object" ) {
                        return this.each(function() {
@@ -1250,31 +1269,12 @@ jQuery.fn.extend({
                parts[1] = parts[1] ? "." + parts[1] : "";
 
                if ( value === undefined ) {
-                       var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+                       data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
 
                        // Try to fetch any internally stored data first
                        if ( data === undefined && this.length ) {
                                data = jQuery.data( this[0], key );
-
-                               // If nothing was found internally, try to fetch any
-                               // data from the HTML5 data-* attribute
-                               if ( data === undefined && this[0].nodeType === 1 ) {
-                                       data = this[0].getAttribute( "data-" + key );
-
-                                       if ( typeof data === "string" ) {
-                                               try {
-                                                       data = data === "true" ? true :
-                                                               data === "false" ? false :
-                                                               data === "null" ? null :
-                                                               !jQuery.isNaN( data ) ? parseFloat( data ) :
-                                                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                                               data;
-                                               } catch( e ) {}
-
-                                       } else {
-                                               data = undefined;
-                                       }
-                               }
+                               data = dataAttr( this[0], key, data );
                        }
 
                        return data === undefined && parts[1] ?
@@ -1283,7 +1283,8 @@ jQuery.fn.extend({
 
                } else {
                        return this.each(function() {
-                               var $this = jQuery( this ), args = [ parts[0], value ];
+                               var $this = jQuery( this ),
+                                       args = [ parts[0], value ];
 
                                $this.triggerHandler( "setData" + parts[1] + "!", args );
                                jQuery.data( this, key, value );
@@ -1299,6 +1300,33 @@ jQuery.fn.extend({
        }
 });
 
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
+               data = elem.getAttribute( "data-" + key );
+
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               !jQuery.isNaN( data ) ? parseFloat( data ) :
+                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
+
+               } else {
+                       data = undefined;
+               }
+       }
+
+       return data;
+}
+
 
 
 
@@ -1329,7 +1357,8 @@ jQuery.extend({
        dequeue: function( elem, type ) {
                type = type || "fx";
 
-               var queue = jQuery.queue( elem, type ), fn = queue.shift();
+               var queue = jQuery.queue( elem, type ),
+                       fn = queue.shift();
 
                // If the fx queue is dequeued, always remove the progress sentinel
                if ( fn === "inprogress" ) {
@@ -1405,6 +1434,19 @@ var rclass = /[\n\t]/g,
        rclickable = /^a(?:rea)?$/i,
        rradiocheck = /^(?:radio|checkbox)$/i;
 
+jQuery.props = {
+       "for": "htmlFor",
+       "class": "className",
+       readonly: "readOnly",
+       maxlength: "maxLength",
+       cellspacing: "cellSpacing",
+       rowspan: "rowSpan",
+       colspan: "colSpan",
+       tabindex: "tabIndex",
+       usemap: "useMap",
+       frameborder: "frameBorder"
+};
+
 jQuery.fn.extend({
        attr: function( name, value ) {
                return jQuery.access( this, name, value, true, jQuery.attr );
@@ -1438,7 +1480,9 @@ jQuery.fn.extend({
                                                elem.className = value;
 
                                        } else {
-                                               var className = " " + elem.className + " ", setClass = elem.className;
+                                               var className = " " + elem.className + " ",
+                                                       setClass = elem.className;
+
                                                for ( var c = 0, cl = classNames.length; c < cl; c++ ) {
                                                        if ( className.indexOf( " " + classNames[c] + " " ) < 0 ) {
                                                                setClass += " " + classNames[c];
@@ -1486,7 +1530,8 @@ jQuery.fn.extend({
        },
 
        toggleClass: function( value, stateVal ) {
-               var type = typeof value, isBool = typeof stateVal === "boolean";
+               var type = typeof value,
+                       isBool = typeof stateVal === "boolean";
 
                if ( jQuery.isFunction( value ) ) {
                        return this.each(function(i) {
@@ -1498,7 +1543,9 @@ jQuery.fn.extend({
                return this.each(function() {
                        if ( type === "string" ) {
                                // toggle individual class names
-                               var className, i = 0, self = jQuery(this),
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
                                        state = stateVal,
                                        classNames = value.split( rspaces );
 
@@ -1667,91 +1714,88 @@ jQuery.extend({
                // Try to normalize/fix the name
                name = notxml && jQuery.props[ name ] || name;
 
-               // Only do all the following if this is a node (faster for style)
-               if ( elem.nodeType === 1 ) {
-                       // These attributes require special treatment
-                       var special = rspecialurl.test( name );
-
-                       // Safari mis-reports the default selected property of an option
-                       // Accessing the parent's selectedIndex property fixes it
-                       if ( name === "selected" && !jQuery.support.optSelected ) {
-                               var parent = elem.parentNode;
-                               if ( parent ) {
-                                       parent.selectedIndex;
-       
-                                       // Make sure that it also works with optgroups, see #5701
-                                       if ( parent.parentNode ) {
-                                               parent.parentNode.selectedIndex;
-                                       }
-                               }
-                       }
+               // These attributes require special treatment
+               var special = rspecialurl.test( name );
 
-                       // If applicable, access the attribute via the DOM 0 way
-                       // 'in' checks fail in Blackberry 4.7 #6931
-                       if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
-                               if ( set ) {
-                                       // We can't allow the type property to be changed (since it causes problems in IE)
-                                       if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
-                                               jQuery.error( "type property can't be changed" );
-                                       }
+               // Safari mis-reports the default selected property of an option
+               // Accessing the parent's selectedIndex property fixes it
+               if ( name === "selected" && !jQuery.support.optSelected ) {
+                       var parent = elem.parentNode;
+                       if ( parent ) {
+                               parent.selectedIndex;
 
-                                       if ( value === null ) {
-                                               if ( elem.nodeType === 1 ) {
-                                                       elem.removeAttribute( name );
-                                               }
-
-                                       } else {
-                                               elem[ name ] = value;
-                                       }
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
                                }
+                       }
+               }
 
-                               // browsers index elements by id/name on forms, give priority to attributes.
-                               if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
-                                       return elem.getAttributeNode( name ).nodeValue;
+               // If applicable, access the attribute via the DOM 0 way
+               // 'in' checks fail in Blackberry 4.7 #6931
+               if ( (name in elem || elem[ name ] !== undefined) && notxml && !special ) {
+                       if ( set ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( name === "type" && rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
                                }
 
-                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                               if ( name === "tabIndex" ) {
-                                       var attributeNode = elem.getAttributeNode( "tabIndex" );
+                               if ( value === null ) {
+                                       if ( elem.nodeType === 1 ) {
+                                               elem.removeAttribute( name );
+                                       }
 
-                                       return attributeNode && attributeNode.specified ?
-                                               attributeNode.value :
-                                               rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                                       0 :
-                                                       undefined;
+                               } else {
+                                       elem[ name ] = value;
                                }
+                       }
 
-                               return elem[ name ];
+                       // browsers index elements by id/name on forms, give priority to attributes.
+                       if ( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) {
+                               return elem.getAttributeNode( name ).nodeValue;
                        }
 
-                       if ( !jQuery.support.style && notxml && name === "style" ) {
-                               if ( set ) {
-                                       elem.style.cssText = "" + value;
-                               }
+                       // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                       // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                       if ( name === "tabIndex" ) {
+                               var attributeNode = elem.getAttributeNode( "tabIndex" );
 
-                               return elem.style.cssText;
+                               return attributeNode && attributeNode.specified ?
+                                       attributeNode.value :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               undefined;
                        }
 
+                       return elem[ name ];
+               }
+
+               if ( !jQuery.support.style && notxml && name === "style" ) {
                        if ( set ) {
-                               // convert the value to a string (all browsers do this but IE) see #1070
-                               elem.setAttribute( name, "" + value );
+                               elem.style.cssText = "" + value;
                        }
 
-                       // Ensure that missing attributes return undefined
-                       // Blackberry 4.7 returns "" from getAttribute #6938
-                       if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
-                               return undefined;
-                       }
+                       return elem.style.cssText;
+               }
 
-                       var attr = !jQuery.support.hrefNormalized && notxml && special ?
-                                       // Some attributes require a special call on IE
-                                       elem.getAttribute( name, 2 ) :
-                                       elem.getAttribute( name );
+               if ( set ) {
+                       // convert the value to a string (all browsers do this but IE) see #1070
+                       elem.setAttribute( name, "" + value );
+               }
 
-                       // Non-existent attributes return null, we normalize to undefined
-                       return attr === null ? undefined : attr;
+               // Ensure that missing attributes return undefined
+               // Blackberry 4.7 returns "" from getAttribute #6938
+               if ( !elem.attributes[ name ] && (elem.hasAttribute && !elem.hasAttribute( name )) ) {
+                       return undefined;
                }
+
+               var attr = !jQuery.support.hrefNormalized && notxml && special ?
+                               // Some attributes require a special call on IE
+                               elem.getAttribute( name, 2 ) :
+                               elem.getAttribute( name );
+
+               // Non-existent attributes return null, we normalize to undefined
+               return attr === null ? undefined : attr;
        }
 });
 
@@ -1790,6 +1834,9 @@ jQuery.event = {
 
                if ( handler === false ) {
                        handler = returnFalse;
+               } else if ( !handler ) {
+                       // Fixes bug #7229. Fix recommended by jdalton
+                 return;
                }
 
                var handleObjIn, handleObj;
@@ -2133,8 +2180,10 @@ jQuery.event = {
                        jQuery.event.trigger( event, data, parent, true );
 
                } else if ( !event.isDefaultPrevented() ) {
-                       var target = event.target, old, targetType = type.replace(rnamespaces, ""),
-                               isClick = jQuery.nodeName(target, "a") && targetType === "click",
+                       var old,
+                               target = event.target,
+                               targetType = type.replace( rnamespaces, "" ),
+                               isClick = jQuery.nodeName( target, "a" ) && targetType === "click",
                                special = jQuery.event.special[ targetType ] || {};
 
                        if ( (!special._default || special._default.call( elem, event ) === false) && 
@@ -2166,7 +2215,9 @@ jQuery.event = {
        },
 
        handle: function( event ) {
-               var all, handlers, namespaces, namespace_sort = [], namespace_re, events, args = jQuery.makeArray( arguments );
+               var all, handlers, namespaces, namespace_re, events,
+                       namespace_sort = [],
+                       args = jQuery.makeArray( arguments );
 
                event = args[0] = jQuery.event.fix( event || window.event );
                event.currentTarget = this;
@@ -2245,7 +2296,8 @@ jQuery.event = {
 
                // Fix target property, if necessary
                if ( !event.target ) {
-                       event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either
+                       // Fixes #1925 where srcElement might not be defined either
+                       event.target = event.srcElement || document;
                }
 
                // check if target is a textnode (safari)
@@ -2260,7 +2312,9 @@ jQuery.event = {
 
                // Calculate pageX/Y if missing and clientX/Y available
                if ( event.pageX == null && event.clientX != null ) {
-                       var doc = document.documentElement, body = document.body;
+                       var doc = document.documentElement,
+                               body = document.body;
+
                        event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc && doc.clientLeft || body && body.clientLeft || 0);
                        event.pageY = event.clientY + (doc && doc.scrollTop  || body && body.scrollTop  || 0) - (doc && doc.clientTop  || body && body.clientTop  || 0);
                }
@@ -2466,7 +2520,8 @@ if ( !jQuery.support.submitBubbles ) {
                setup: function( data, namespaces ) {
                        if ( this.nodeName.toLowerCase() !== "form" ) {
                                jQuery.event.add(this, "click.specialSubmit", function( e ) {
-                                       var elem = e.target, type = elem.type;
+                                       var elem = e.target,
+                                               type = elem.type;
 
                                        if ( (type === "submit" || type === "image") && jQuery( elem ).closest("form").length ) {
                                                e.liveFired = undefined;
@@ -2475,7 +2530,8 @@ if ( !jQuery.support.submitBubbles ) {
                                });
         
                                jQuery.event.add(this, "keypress.specialSubmit", function( e ) {
-                                       var elem = e.target, type = elem.type;
+                                       var elem = e.target,
+                                               type = elem.type;
 
                                        if ( (type === "text" || type === "password") && jQuery( elem ).closest("form").length && e.keyCode === 13 ) {
                                                e.liveFired = undefined;
@@ -2716,7 +2772,8 @@ jQuery.fn.extend({
 
        toggle: function( fn ) {
                // Save reference to arguments for access in closure
-               var args = arguments, i = 1;
+               var args = arguments,
+                       i = 1;
 
                // link all the functions, so any of them can unbind this click handler
                while ( i < args.length ) {
@@ -2811,8 +2868,9 @@ jQuery.each(["live", "die"], function( i, name ) {
 });
 
 function liveHandler( event ) {
-       var stop, maxLevel, elems = [], selectors = [],
-               related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+       var stop, maxLevel, related, match, handleObj, elem, j, i, l, data, close, namespace, ret,
+               elems = [],
+               selectors = [],
                events = jQuery.data( this, this.nodeType ? "events" : "__events__" );
 
        if ( typeof events === "function" ) {
@@ -2823,7 +2881,7 @@ function liveHandler( event ) {
        if ( event.liveFired === this || !events || !events.live || event.button && event.type === "click" ) {
                return;
        }
-
+       
        if ( event.namespace ) {
                namespace = new RegExp("(^|\\.)" + event.namespace.split(".").join("\\.(?:.*\\.)?") + "(\\.|$)");
        }
@@ -2887,6 +2945,9 @@ function liveHandler( event ) {
                        if ( ret === false ) {
                                stop = false;
                        }
+                       if ( event.isImmediatePropagationStopped() ) {
+                               break;
+                       }
                }
        }
 
@@ -2954,12 +3015,12 @@ var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[
 // optimization where it does not always call our comparision
 // function. If that is the case, discard the hasDuplicate value.
 //   Thus far that includes Google Chrome.
-[0, 0].sort(function(){
+[0, 0].sort(function() {
        baseHasDuplicate = false;
        return 0;
 });
 
-var Sizzle = function(selector, context, results, seed) {
+var Sizzle = function( selector, context, results, seed ) {
        results = results || [];
        context = context || document;
 
@@ -2973,13 +3034,16 @@ var Sizzle = function(selector, context, results, seed) {
                return results;
        }
 
-       var parts = [], m, set, checkSet, extra, prune = true, contextXML = Sizzle.isXML(context),
-               soFar = selector, ret, cur, pop, i;
+       var m, set, checkSet, extra, ret, cur, pop, i,
+               prune = true,
+               contextXML = Sizzle.isXML( context ),
+               parts = [],
+               soFar = selector;
        
        // Reset the position of the chunker regexp (start from head)
        do {
-               chunker.exec("");
-               m = chunker.exec(soFar);
+               chunker.exec( "" );
+               m = chunker.exec( soFar );
 
                if ( m ) {
                        soFar = m[3];
@@ -2994,8 +3058,10 @@ var Sizzle = function(selector, context, results, seed) {
        } while ( m );
 
        if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
                if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
                        set = posProcess( parts[0] + parts[1], context );
+
                } else {
                        set = Expr.relative[ parts[0] ] ?
                                [ context ] :
@@ -3011,23 +3077,31 @@ var Sizzle = function(selector, context, results, seed) {
                                set = posProcess( selector, set );
                        }
                }
+
        } else {
                // Take a shortcut and set the context if the root selector is an ID
                // (but not if it'll be faster if the inner selector is an ID)
                if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
                                Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
                        ret = Sizzle.find( parts.shift(), context, contextXML );
-                       context = ret.expr ? Sizzle.filter( ret.expr, ret.set )[0] : ret.set[0];
+                       context = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set )[0] :
+                               ret.set[0];
                }
 
                if ( context ) {
                        ret = seed ?
                                { expr: parts.pop(), set: makeArray(seed) } :
                                Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-                       set = ret.expr ? Sizzle.filter( ret.expr, ret.set ) : ret.set;
+
+                       set = ret.expr ?
+                               Sizzle.filter( ret.expr, ret.set ) :
+                               ret.set;
 
                        if ( parts.length > 0 ) {
-                               checkSet = makeArray(set);
+                               checkSet = makeArray( set );
+
                        } else {
                                prune = false;
                        }
@@ -3048,6 +3122,7 @@ var Sizzle = function(selector, context, results, seed) {
 
                                Expr.relative[ cur ]( checkSet, pop, contextXML );
                        }
+
                } else {
                        checkSet = parts = [];
                }
@@ -3064,12 +3139,14 @@ var Sizzle = function(selector, context, results, seed) {
        if ( toString.call(checkSet) === "[object Array]" ) {
                if ( !prune ) {
                        results.push.apply( results, checkSet );
+
                } else if ( context && context.nodeType === 1 ) {
                        for ( i = 0; checkSet[i] != null; i++ ) {
                                if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
                                        results.push( set[i] );
                                }
                        }
+
                } else {
                        for ( i = 0; checkSet[i] != null; i++ ) {
                                if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
@@ -3077,6 +3154,7 @@ var Sizzle = function(selector, context, results, seed) {
                                }
                        }
                }
+
        } else {
                makeArray( checkSet, results );
        }
@@ -3089,15 +3167,15 @@ var Sizzle = function(selector, context, results, seed) {
        return results;
 };
 
-Sizzle.uniqueSort = function(results){
+Sizzle.uniqueSort = function( results ) {
        if ( sortOrder ) {
                hasDuplicate = baseHasDuplicate;
-               results.sort(sortOrder);
+               results.sort( sortOrder );
 
                if ( hasDuplicate ) {
                        for ( var i = 1; i < results.length; i++ ) {
-                               if ( results[i] === results[i-1] ) {
-                                       results.splice(i--, 1);
+                               if ( results[i] === results[ i - 1 ] ) {
+                                       results.splice( i--, 1 );
                                }
                        }
                }
@@ -3106,15 +3184,15 @@ Sizzle.uniqueSort = function(results){
        return results;
 };
 
-Sizzle.matches = function(expr, set){
-       return Sizzle(expr, null, null, set);
+Sizzle.matches = function( expr, set ) {
+       return Sizzle( expr, null, null, set );
 };
 
-Sizzle.matchesSelector = function(node, expr){
-       return Sizzle(expr, null, null, [node]).length > 0;
+Sizzle.matchesSelector = function( node, expr ) {
+       return Sizzle( expr, null, null, [node] ).length > 0;
 };
 
-Sizzle.find = function(expr, context, isXML){
+Sizzle.find = function( expr, context, isXML ) {
        var set;
 
        if ( !expr ) {
@@ -3122,15 +3200,17 @@ Sizzle.find = function(expr, context, isXML){
        }
 
        for ( var i = 0, l = Expr.order.length; i < l; i++ ) {
-               var type = Expr.order[i], match;
+               var match,
+                       type = Expr.order[i];
                
                if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
                        var left = match[1];
-                       match.splice(1,1);
+                       match.splice( 1, 1 );
 
                        if ( left.substr( left.length - 1 ) !== "\\" ) {
                                match[1] = (match[1] || "").replace(/\\/g, "");
                                set = Expr.find[ type ]( match, context, isXML );
+
                                if ( set != null ) {
                                        expr = expr.replace( Expr.match[ type ], "" );
                                        break;
@@ -3140,20 +3220,26 @@ Sizzle.find = function(expr, context, isXML){
        }
 
        if ( !set ) {
-               set = context.getElementsByTagName("*");
+               set = context.getElementsByTagName( "*" );
        }
 
-       return {set: set, expr: expr};
+       return { set: set, expr: expr };
 };
 
-Sizzle.filter = function(expr, set, inplace, not){
-       var old = expr, result = [], curLoop = set, match, anyFound,
-               isXMLFilter = set && set[0] && Sizzle.isXML(set[0]);
+Sizzle.filter = function( expr, set, inplace, not ) {
+       var match, anyFound,
+               old = expr,
+               result = [],
+               curLoop = set,
+               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
 
        while ( expr && set.length ) {
                for ( var type in Expr.filter ) {
                        if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
-                               var filter = Expr.filter[ type ], found, item, left = match[1];
+                               var found, item,
+                                       filter = Expr.filter[ type ],
+                                       left = match[1];
+
                                anyFound = false;
 
                                match.splice(1,1);
@@ -3171,6 +3257,7 @@ Sizzle.filter = function(expr, set, inplace, not){
 
                                        if ( !match ) {
                                                anyFound = found = true;
+
                                        } else if ( match === true ) {
                                                continue;
                                        }
@@ -3185,9 +3272,11 @@ Sizzle.filter = function(expr, set, inplace, not){
                                                        if ( inplace && found != null ) {
                                                                if ( pass ) {
                                                                        anyFound = true;
+
                                                                } else {
                                                                        curLoop[i] = false;
                                                                }
+
                                                        } else if ( pass ) {
                                                                result.push( item );
                                                                anyFound = true;
@@ -3216,6 +3305,7 @@ Sizzle.filter = function(expr, set, inplace, not){
                if ( expr === old ) {
                        if ( anyFound == null ) {
                                Sizzle.error( expr );
+
                        } else {
                                break;
                        }
@@ -3233,6 +3323,7 @@ Sizzle.error = function( msg ) {
 
 var Expr = Sizzle.selectors = {
        order: [ "ID", "NAME", "TAG" ],
+
        match: {
                ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
                CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
@@ -3243,20 +3334,24 @@ var Expr = Sizzle.selectors = {
                POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
                PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
        },
+
        leftMatch: {},
+
        attrMap: {
                "class": "className",
                "for": "htmlFor"
        },
+
        attrHandle: {
-               href: function(elem){
-                       return elem.getAttribute("href");
+               href: function( elem ) {
+                       return elem.getAttribute( "href" );
                }
        },
+
        relative: {
                "+": function(checkSet, part){
                        var isPartStr = typeof part === "string",
-                               isTag = isPartStr && !/\W/.test(part),
+                               isTag = isPartStr && !/\W/.test( part ),
                                isPartStrNotTag = isPartStr && !isTag;
 
                        if ( isTag ) {
@@ -3277,23 +3372,29 @@ var Expr = Sizzle.selectors = {
                                Sizzle.filter( part, checkSet, true );
                        }
                },
-               ">": function(checkSet, part){
-                       var isPartStr = typeof part === "string",
-                               elem, i = 0, l = checkSet.length;
 
-                       if ( isPartStr && !/\W/.test(part) ) {
+               ">": function( checkSet, part ) {
+                       var elem,
+                               isPartStr = typeof part === "string",
+                               i = 0,
+                               l = checkSet.length;
+
+                       if ( isPartStr && !/\W/.test( part ) ) {
                                part = part.toLowerCase();
 
                                for ( ; i < l; i++ ) {
                                        elem = checkSet[i];
+
                                        if ( elem ) {
                                                var parent = elem.parentNode;
                                                checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
                                        }
                                }
+
                        } else {
                                for ( ; i < l; i++ ) {
                                        elem = checkSet[i];
+
                                        if ( elem ) {
                                                checkSet[i] = isPartStr ?
                                                        elem.parentNode :
@@ -3306,8 +3407,11 @@ var Expr = Sizzle.selectors = {
                                }
                        }
                },
+
                "": function(checkSet, part, isXML){
-                       var doneName = done++, checkFn = dirCheck, nodeCheck;
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
 
                        if ( typeof part === "string" && !/\W/.test(part) ) {
                                part = part.toLowerCase();
@@ -3315,22 +3419,26 @@ var Expr = Sizzle.selectors = {
                                checkFn = dirNodeCheck;
                        }
 
-                       checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML);
+                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
                },
-               "~": function(checkSet, part, isXML){
-                       var doneName = done++, checkFn = dirCheck, nodeCheck;
 
-                       if ( typeof part === "string" && !/\W/.test(part) ) {
+               "~": function( checkSet, part, isXML ) {
+                       var nodeCheck,
+                               doneName = done++,
+                               checkFn = dirCheck;
+
+                       if ( typeof part === "string" && !/\W/.test( part ) ) {
                                part = part.toLowerCase();
                                nodeCheck = part;
                                checkFn = dirNodeCheck;
                        }
 
-                       checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML);
+                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
                }
        },
+
        find: {
-               ID: function(match, context, isXML){
+               ID: function( match, context, isXML ) {
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
                                var m = context.getElementById(match[1]);
                                // Check parentNode to catch when Blackberry 4.6 returns
@@ -3338,9 +3446,11 @@ var Expr = Sizzle.selectors = {
                                return m && m.parentNode ? [m] : [];
                        }
                },
-               NAME: function(match, context){
+
+               NAME: function( match, context ) {
                        if ( typeof context.getElementsByName !== "undefined" ) {
-                               var ret = [], results = context.getElementsByName(match[1]);
+                               var ret = [],
+                                       results = context.getElementsByName( match[1] );
 
                                for ( var i = 0, l = results.length; i < l; i++ ) {
                                        if ( results[i].getAttribute("name") === match[1] ) {
@@ -3351,12 +3461,13 @@ var Expr = Sizzle.selectors = {
                                return ret.length === 0 ? null : ret;
                        }
                },
-               TAG: function(match, context){
-                       return context.getElementsByTagName(match[1]);
+
+               TAG: function( match, context ) {
+                       return context.getElementsByTagName( match[1] );
                }
        },
        preFilter: {
-               CLASS: function(match, curLoop, inplace, result, not, isXML){
+               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
                        match = " " + match[1].replace(/\\/g, "") + " ";
 
                        if ( isXML ) {
@@ -3369,6 +3480,7 @@ var Expr = Sizzle.selectors = {
                                                if ( !inplace ) {
                                                        result.push( elem );
                                                }
+
                                        } else if ( inplace ) {
                                                curLoop[i] = false;
                                        }
@@ -3377,13 +3489,16 @@ var Expr = Sizzle.selectors = {
 
                        return false;
                },
-               ID: function(match){
+
+               ID: function( match ) {
                        return match[1].replace(/\\/g, "");
                },
-               TAG: function(match, curLoop){
+
+               TAG: function( match, curLoop ) {
                        return match[1].toLowerCase();
                },
-               CHILD: function(match){
+
+               CHILD: function( match ) {
                        if ( match[1] === "nth" ) {
                                // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
                                var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(
@@ -3400,7 +3515,8 @@ var Expr = Sizzle.selectors = {
 
                        return match;
                },
-               ATTR: function(match, curLoop, inplace, result, not, isXML){
+
+               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
                        var name = match[1].replace(/\\/g, "");
                        
                        if ( !isXML && Expr.attrMap[name] ) {
@@ -3413,122 +3529,156 @@ var Expr = Sizzle.selectors = {
 
                        return match;
                },
-               PSEUDO: function(match, curLoop, inplace, result, not){
+
+               PSEUDO: function( match, curLoop, inplace, result, not ) {
                        if ( match[1] === "not" ) {
                                // If we're dealing with a complex expression, or a simple one
                                if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
                                        match[3] = Sizzle(match[3], null, null, curLoop);
+
                                } else {
                                        var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
                                        if ( !inplace ) {
                                                result.push.apply( result, ret );
                                        }
+
                                        return false;
                                }
+
                        } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
                                return true;
                        }
                        
                        return match;
                },
-               POS: function(match){
+
+               POS: function( match ) {
                        match.unshift( true );
+
                        return match;
                }
        },
+       
        filters: {
-               enabled: function(elem){
+               enabled: function( elem ) {
                        return elem.disabled === false && elem.type !== "hidden";
                },
-               disabled: function(elem){
+
+               disabled: function( elem ) {
                        return elem.disabled === true;
                },
-               checked: function(elem){
+
+               checked: function( elem ) {
                        return elem.checked === true;
                },
-               selected: function(elem){
+               
+               selected: function( elem ) {
                        // Accessing this property makes selected-by-default
                        // options in Safari work properly
                        elem.parentNode.selectedIndex;
+                       
                        return elem.selected === true;
                },
-               parent: function(elem){
+
+               parent: function( elem ) {
                        return !!elem.firstChild;
                },
-               empty: function(elem){
+
+               empty: function( elem ) {
                        return !elem.firstChild;
                },
-               has: function(elem, i, match){
+
+               has: function( elem, i, match ) {
                        return !!Sizzle( match[3], elem ).length;
                },
-               header: function(elem){
+
+               header: function( elem ) {
                        return (/h\d/i).test( elem.nodeName );
                },
-               text: function(elem){
+
+               text: function( elem ) {
                        return "text" === elem.type;
                },
-               radio: function(elem){
+               radio: function( elem ) {
                        return "radio" === elem.type;
                },
-               checkbox: function(elem){
+
+               checkbox: function( elem ) {
                        return "checkbox" === elem.type;
                },
-               file: function(elem){
+
+               file: function( elem ) {
                        return "file" === elem.type;
                },
-               password: function(elem){
+               password: function( elem ) {
                        return "password" === elem.type;
                },
-               submit: function(elem){
+
+               submit: function( elem ) {
                        return "submit" === elem.type;
                },
-               image: function(elem){
+
+               image: function( elem ) {
                        return "image" === elem.type;
                },
-               reset: function(elem){
+
+               reset: function( elem ) {
                        return "reset" === elem.type;
                },
-               button: function(elem){
+
+               button: function( elem ) {
                        return "button" === elem.type || elem.nodeName.toLowerCase() === "button";
                },
-               input: function(elem){
-                       return (/input|select|textarea|button/i).test(elem.nodeName);
+
+               input: function( elem ) {
+                       return (/input|select|textarea|button/i).test( elem.nodeName );
                }
        },
        setFilters: {
-               first: function(elem, i){
+               first: function( elem, i ) {
                        return i === 0;
                },
-               last: function(elem, i, match, array){
+
+               last: function( elem, i, match, array ) {
                        return i === array.length - 1;
                },
-               even: function(elem, i){
+
+               even: function( elem, i ) {
                        return i % 2 === 0;
                },
-               odd: function(elem, i){
+
+               odd: function( elem, i ) {
                        return i % 2 === 1;
                },
-               lt: function(elem, i, match){
+
+               lt: function( elem, i, match ) {
                        return i < match[3] - 0;
                },
-               gt: function(elem, i, match){
+
+               gt: function( elem, i, match ) {
                        return i > match[3] - 0;
                },
-               nth: function(elem, i, match){
+
+               nth: function( elem, i, match ) {
                        return match[3] - 0 === i;
                },
-               eq: function(elem, i, match){
+
+               eq: function( elem, i, match ) {
                        return match[3] - 0 === i;
                }
        },
        filter: {
-               PSEUDO: function(elem, match, i, array){
-                       var name = match[1], filter = Expr.filters[ name ];
+               PSEUDO: function( elem, match, i, array ) {
+                       var name = match[1],
+                               filter = Expr.filters[ name ];
 
                        if ( filter ) {
                                return filter( elem, i, match, array );
+
                        } else if ( name === "contains" ) {
                                return (elem.textContent || elem.innerText || Sizzle.getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
                        } else if ( name === "not" ) {
                                var not = match[3];
 
@@ -3539,33 +3689,43 @@ var Expr = Sizzle.selectors = {
                                }
 
                                return true;
+
                        } else {
                                Sizzle.error( "Syntax error, unrecognized expression: " + name );
                        }
                },
-               CHILD: function(elem, match){
-                       var type = match[1], node = elem;
-                       switch (type) {
-                               case 'only':
-                               case 'first':
+
+               CHILD: function( elem, match ) {
+                       var type = match[1],
+                               node = elem;
+
+                       switch ( type ) {
+                               case "only":
+                               case "first":
                                        while ( (node = node.previousSibling) )  {
                                                if ( node.nodeType === 1 ) { 
                                                        return false; 
                                                }
                                        }
+
                                        if ( type === "first" ) { 
                                                return true; 
                                        }
+
                                        node = elem;
-                               case 'last':
+
+                               case "last":
                                        while ( (node = node.nextSibling) )      {
                                                if ( node.nodeType === 1 ) { 
                                                        return false; 
                                                }
                                        }
+
                                        return true;
-                               case 'nth':
-                                       var first = match[2], last = match[3];
+
+                               case "nth":
+                                       var first = match[2],
+                                               last = match[3];
 
                                        if ( first === 1 && last === 0 ) {
                                                return true;
@@ -3576,33 +3736,41 @@ var Expr = Sizzle.selectors = {
        
                                        if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) {
                                                var count = 0;
+                                               
                                                for ( node = parent.firstChild; node; node = node.nextSibling ) {
                                                        if ( node.nodeType === 1 ) {
                                                                node.nodeIndex = ++count;
                                                        }
                                                } 
+
                                                parent.sizcache = doneName;
                                        }
                                        
                                        var diff = elem.nodeIndex - last;
+
                                        if ( first === 0 ) {
                                                return diff === 0;
+
                                        } else {
                                                return ( diff % first === 0 && diff / first >= 0 );
                                        }
                        }
                },
-               ID: function(elem, match){
+
+               ID: function( elem, match ) {
                        return elem.nodeType === 1 && elem.getAttribute("id") === match;
                },
-               TAG: function(elem, match){
+
+               TAG: function( elem, match ) {
                        return (match === "*" && elem.nodeType === 1) || elem.nodeName.toLowerCase() === match;
                },
-               CLASS: function(elem, match){
+               
+               CLASS: function( elem, match ) {
                        return (" " + (elem.className || elem.getAttribute("class")) + " ")
                                .indexOf( match ) > -1;
                },
-               ATTR: function(elem, match){
+
+               ATTR: function( elem, match ) {
                        var name = match[1],
                                result = Expr.attrHandle[ name ] ?
                                        Expr.attrHandle[ name ]( elem ) :
@@ -3633,8 +3801,10 @@ var Expr = Sizzle.selectors = {
                                value === check || value.substr(0, check.length + 1) === check + "-" :
                                false;
                },
-               POS: function(elem, match, i, array){
-                       var name = match[2], filter = Expr.setFilters[ name ];
+
+               POS: function( elem, match, i, array ) {
+                       var name = match[2],
+                               filter = Expr.setFilters[ name ];
 
                        if ( filter ) {
                                return filter( elem, i, match, array );
@@ -3653,7 +3823,7 @@ for ( var type in Expr.match ) {
        Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
 }
 
-var makeArray = function(array, results) {
+var makeArray = function( array, results ) {
        array = Array.prototype.slice.call( array, 0 );
 
        if ( results ) {
@@ -3672,17 +3842,20 @@ try {
        Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
 
 // Provide a fallback method if it does not work
-} catch(e){
-       makeArray = function(array, results) {
-               var ret = results || [], i = 0;
+} catch( e ) {
+       makeArray = function( array, results ) {
+               var i = 0,
+                       ret = results || [];
 
                if ( toString.call(array) === "[object Array]" ) {
                        Array.prototype.push.apply( ret, array );
+
                } else {
                        if ( typeof array.length === "number" ) {
                                for ( var l = array.length; i < l; i++ ) {
                                        ret.push( array[i] );
                                }
+
                        } else {
                                for ( ; array[i]; i++ ) {
                                        ret.push( array[i] );
@@ -3709,10 +3882,15 @@ if ( document.documentElement.compareDocumentPosition ) {
 
                return a.compareDocumentPosition(b) & 4 ? -1 : 1;
        };
+
 } else {
        sortOrder = function( a, b ) {
-               var ap = [], bp = [], aup = a.parentNode, bup = b.parentNode,
-                       cur = aup, al, bl;
+               var al, bl,
+                       ap = [],
+                       bp = [],
+                       aup = a.parentNode,
+                       bup = b.parentNode,
+                       cur = aup;
 
                // The nodes are identical, we can exit early
                if ( a === b ) {
@@ -3805,31 +3983,40 @@ Sizzle.getText = function( elems ) {
 (function(){
        // We're going to inject a fake input element with a specified name
        var form = document.createElement("div"),
-               id = "script" + (new Date()).getTime();
+               id = "script" + (new Date()).getTime(),
+               root = document.documentElement;
+
        form.innerHTML = "<a name='" + id + "'/>";
 
        // Inject it into the root element, check its status, and remove it quickly
-       var root = document.documentElement;
        root.insertBefore( form, root.firstChild );
 
        // The workaround has to do additional checks after a getElementById
        // Which slows things down for other browsers (hence the branching)
        if ( document.getElementById( id ) ) {
-               Expr.find.ID = function(match, context, isXML){
+               Expr.find.ID = function( match, context, isXML ) {
                        if ( typeof context.getElementById !== "undefined" && !isXML ) {
                                var m = context.getElementById(match[1]);
-                               return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : [];
+
+                               return m ?
+                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+                                               [m] :
+                                               undefined :
+                                       [];
                        }
                };
 
-               Expr.filter.ID = function(elem, match){
+               Expr.filter.ID = function( elem, match ) {
                        var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
                        return elem.nodeType === 1 && node && node.nodeValue === match;
                };
        }
 
        root.removeChild( form );
-       root = form = null; // release memory in IE
+
+       // release memory in IE
+       root = form = null;
 })();
 
 (function(){
@@ -3842,8 +4029,8 @@ Sizzle.getText = function( elems ) {
 
        // Make sure no comments are found
        if ( div.getElementsByTagName("*").length > 0 ) {
-               Expr.find.TAG = function(match, context){
-                       var results = context.getElementsByTagName(match[1]);
+               Expr.find.TAG = function( match, context ) {
+                       var results = context.getElementsByTagName( match[1] );
 
                        // Filter out possible comments
                        if ( match[1] === "*" ) {
@@ -3864,19 +4051,25 @@ Sizzle.getText = function( elems ) {
 
        // Check to see if an attribute returns normalized href attributes
        div.innerHTML = "<a href='#'></a>";
+
        if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
                        div.firstChild.getAttribute("href") !== "#" ) {
-               Expr.attrHandle.href = function(elem){
-                       return elem.getAttribute("href", 2);
+
+               Expr.attrHandle.href = function( elem ) {
+                       return elem.getAttribute( "href", 2 );
                };
        }
 
-       div = null; // release memory in IE
+       // release memory in IE
+       div = null;
 })();
 
 if ( document.querySelectorAll ) {
        (function(){
-               var oldSizzle = Sizzle, div = document.createElement("div");
+               var oldSizzle = Sizzle,
+                       div = document.createElement("div"),
+                       id = "__sizzle__";
+
                div.innerHTML = "<p class='TEST'></p>";
 
                // Safari can't handle uppercase or unicode characters when
@@ -3885,9 +4078,12 @@ if ( document.querySelectorAll ) {
                        return;
                }
        
-               Sizzle = function(query, context, extra, seed){
+               Sizzle = function( query, context, extra, seed ) {
                        context = context || document;
 
+                       // Make sure that attribute selectors are quoted
+                       query = query.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
                        // Only use querySelectorAll on non-XML documents
                        // (ID selectors don't work in non-HTML documents)
                        if ( !seed && !Sizzle.isXML(context) ) {
@@ -3901,17 +4097,19 @@ if ( document.querySelectorAll ) {
                                // and working up from there (Thanks to Andrew Dupont for the technique)
                                // IE 8 doesn't work on object elements
                                } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-                                       var old = context.id, id = context.id = "__sizzle__";
+                                       var old = context.getAttribute( "id" ),
+                                               nid = old || id;
+
+                                       if ( !old ) {
+                                               context.setAttribute( "id", nid );
+                                       }
 
                                        try {
-                                               return makeArray( context.querySelectorAll( "#" + id + " " + query ), extra );
+                                               return makeArray( context.querySelectorAll( "#" + nid + " " + query ), extra );
 
                                        } catch(pseudoError) {
                                        } finally {
-                                               if ( old ) {
-                                                       context.id = old;
-
-                                               } else {
+                                               if ( !old ) {
                                                        context.removeAttribute( "id" );
                                                }
                                        }
@@ -3925,7 +4123,8 @@ if ( document.querySelectorAll ) {
                        Sizzle[ prop ] = oldSizzle[ prop ];
                }
 
-               div = null; // release memory in IE
+               // release memory in IE
+               div = null;
        })();
 }
 
@@ -3937,7 +4136,7 @@ if ( document.querySelectorAll ) {
        try {
                // This should fail with an exception
                // Gecko does not error, returns false instead
-               matches.call( document.documentElement, ":sizzle" );
+               matches.call( document.documentElement, "[test!='']:sizzle" );
        
        } catch( pseudoError ) {
                pseudoWorks = true;
@@ -3945,13 +4144,18 @@ if ( document.querySelectorAll ) {
 
        if ( matches ) {
                Sizzle.matchesSelector = function( node, expr ) {
+                       // Make sure that attribute selectors are quoted
+                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+                       if ( !Sizzle.isXML( node ) ) {
                                try { 
-                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) ) {
+                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
                                                return matches.call( node, expr );
                                        }
                                } catch(e) {}
+                       }
 
-                               return Sizzle(expr, null, null, [node]).length > 0;
+                       return Sizzle(expr, null, null, [node]).length > 0;
                };
        }
 })();
@@ -3975,22 +4179,25 @@ if ( document.querySelectorAll ) {
        }
        
        Expr.order.splice(1, 0, "CLASS");
-       Expr.find.CLASS = function(match, context, isXML) {
+       Expr.find.CLASS = function( match, context, isXML ) {
                if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
                        return context.getElementsByClassName(match[1]);
                }
        };
 
-       div = null; // release memory in IE
+       // release memory in IE
+       div = null;
 })();
 
 function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
                var elem = checkSet[i];
+
                if ( elem ) {
-                       elem = elem[dir];
                        var match = false;
 
+                       elem = elem[dir];
+
                        while ( elem ) {
                                if ( elem.sizcache === doneName ) {
                                        match = checkSet[elem.sizset];
@@ -4018,9 +4225,11 @@ function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
 function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
        for ( var i = 0, l = checkSet.length; i < l; i++ ) {
                var elem = checkSet[i];
+
                if ( elem ) {
-                       elem = elem[dir];
                        var match = false;
+                       
+                       elem = elem[dir];
 
                        while ( elem ) {
                                if ( elem.sizcache === doneName ) {
@@ -4033,6 +4242,7 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
                                                elem.sizcache = doneName;
                                                elem.sizset = i;
                                        }
+
                                        if ( typeof cur !== "string" ) {
                                                if ( elem === cur ) {
                                                        match = true;
@@ -4053,21 +4263,34 @@ function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
        }
 }
 
-Sizzle.contains = document.documentElement.contains ? function(a, b){
-       return a !== b && (a.contains ? a.contains(b) : true);
-} : function(a, b){
-       return !!(a.compareDocumentPosition(b) & 16);
-};
+if ( document.documentElement.contains ) {
+       Sizzle.contains = function( a, b ) {
+               return a !== b && (a.contains ? a.contains(b) : true);
+       };
 
-Sizzle.isXML = function(elem){
+} else if ( document.documentElement.compareDocumentPosition ) {
+       Sizzle.contains = function( a, b ) {
+               return !!(a.compareDocumentPosition(b) & 16);
+       };
+
+} else {
+       Sizzle.contains = function() {
+               return false;
+       };
+}
+
+Sizzle.isXML = function( elem ) {
        // documentElement is verified for cases where it doesn't yet exist
        // (such as loading iframes in IE - #4833) 
        var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
        return documentElement ? documentElement.nodeName !== "HTML" : false;
 };
 
-var posProcess = function(selector, context){
-       var tmpSet = [], later = "", match,
+var posProcess = function( selector, context ) {
+       var match,
+               tmpSet = [],
+               later = "",
                root = context.nodeType ? [context] : context;
 
        // Position selectors must be done after the filter
@@ -4109,7 +4332,8 @@ var runtil = /Until$/,
 
 jQuery.fn.extend({
        find: function( selector ) {
-               var ret = this.pushStack( "", "find", selector ), length = 0;
+               var ret = this.pushStack( "", "find", selector ),
+                       length = 0;
 
                for ( var i = 0, l = this.length; i < l; i++ ) {
                        length = ret.length;
@@ -4158,7 +4382,9 @@ jQuery.fn.extend({
                var ret = [], i, l, cur = this[0];
 
                if ( jQuery.isArray( selectors ) ) {
-                       var match, matches = {}, selector, level = 1;
+                       var match, selector,
+                               matches = {},
+                               level = 1;
 
                        if ( cur && selectors.length ) {
                                for ( i = 0, l = selectors.length; i < l; i++ ) {
@@ -4324,7 +4550,9 @@ jQuery.extend({
        },
        
        dir: function( elem, dir, until ) {
-               var matched = [], cur = elem[dir];
+               var matched = [],
+                       cur = elem[ dir ];
+
                while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
                        if ( cur.nodeType === 1 ) {
                                matched.push( cur );
@@ -4400,7 +4628,8 @@ var rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
        rtbody = /<tbody/i,
        rhtml = /<|&#?\w+;/,
        rnocache = /<(?:script|object|embed|option|style)/i,
-       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,  // checked="checked" or checked (html5)
+       // checked="checked" or checked (html5)
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
        raction = /\=([^="'>\s]+\/)>/g,
        wrapMap = {
                option: [ 1, "<select multiple='multiple'>", "</select>" ],
@@ -4426,7 +4655,8 @@ jQuery.fn.extend({
        text: function( text ) {
                if ( jQuery.isFunction(text) ) {
                        return this.each(function(i) {
-                               var self = jQuery(this);
+                               var self = jQuery( this );
+
                                self.text( text.call(this, i, self.text()) );
                        });
                }
@@ -4475,7 +4705,8 @@ jQuery.fn.extend({
                }
 
                return this.each(function() {
-                       var self = jQuery( this ), contents = self.contents();
+                       var self = jQuery( this ),
+                               contents = self.contents();
 
                        if ( contents.length ) {
                                contents.wrapAll( html );
@@ -4586,7 +4817,9 @@ jQuery.fn.extend({
                                // attributes in IE that are actually only stored
                                // as properties will not be copied (such as the
                                // the name attribute on an input).
-                               var html = this.outerHTML, ownerDocument = this.ownerDocument;
+                               var html = this.outerHTML,
+                                       ownerDocument = this.ownerDocument;
+
                                if ( !html ) {
                                        var div = ownerDocument.createElement("div");
                                        div.appendChild( this.cloneNode(true) );
@@ -4641,7 +4874,8 @@ jQuery.fn.extend({
 
                } else if ( jQuery.isFunction( value ) ) {
                        this.each(function(i){
-                               var self = jQuery(this);
+                               var self = jQuery( this );
+
                                self.html( value.call(this, i, self.html()) );
                        });
 
@@ -4664,13 +4898,14 @@ jQuery.fn.extend({
                        }
 
                        if ( typeof value !== "string" ) {
-                               value = jQuery(value).detach();
+                               value = jQuery( value ).detach();
                        }
 
                        return this.each(function() {
-                               var next = this.nextSibling, parent = this.parentNode;
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
 
-                               jQuery(this).remove();
+                               jQuery( this ).remove();
 
                                if ( next ) {
                                        jQuery(next).before( value );
@@ -4688,7 +4923,9 @@ jQuery.fn.extend({
        },
 
        domManip: function( args, table, callback ) {
-               var results, first, value = args[0], scripts = [], fragment, parent;
+               var results, first, fragment, parent,
+                       value = args[0],
+                       scripts = [];
 
                // We can't cloneNode fragments that contain checked, in WebKit
                if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
@@ -4763,7 +5000,9 @@ function cloneCopyEvent(orig, ret) {
                        return;
                }
 
-               var oldData = jQuery.data( orig[i++] ), curData = jQuery.data( this, oldData ), events = oldData && oldData.events;
+               var oldData = jQuery.data( orig[i++] ),
+                       curData = jQuery.data( this, oldData ),
+                       events = oldData && oldData.events;
 
                if ( events ) {
                        delete curData.handle;
@@ -4820,7 +5059,8 @@ jQuery.each({
        replaceAll: "replaceWith"
 }, function( name, original ) {
        jQuery.fn[ name ] = function( selector ) {
-               var ret = [], insert = jQuery( selector ),
+               var ret = [],
+                       insert = jQuery( selector ),
                        parent = this.length === 1 && this[0].parentNode;
                
                if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
@@ -5004,8 +5244,8 @@ var ralpha = /alpha\([^)]*\)/i,
        cssHeight = [ "Top", "Bottom" ],
        curCSS,
 
-       // cache check for defaultView.getComputedStyle
-       getComputedStyle = document.defaultView && document.defaultView.getComputedStyle,
+       getComputedStyle,
+       currentStyle,
 
        fcamelCase = function( all, letter ) {
                return letter.toUpperCase();
@@ -5161,7 +5401,29 @@ jQuery.each(["height", "width"], function( i, name ) {
                                        });
                                }
 
-                               return val + "px";
+                               if ( val <= 0 ) {
+                                       val = curCSS( elem, name, name );
+
+                                       if ( val === "0px" && currentStyle ) {
+                                               val = currentStyle( elem, name, name );
+                                       }
+
+                                       if ( val != null ) {
+                                               // Should return "auto" instead of 0, use 0 for
+                                               // temporary backwards-compat
+                                               return val === "" || val === "auto" ? "0px" : val;
+                                       }
+                               }
+
+                               if ( val < 0 || val == null ) {
+                                       val = elem.style[ name ];
+
+                                       // Should return "auto" instead of 0, use 0 for
+                                       // temporary backwards-compat
+                                       return val === "" || val === "auto" ? "0px" : val;
+                               }
+
+                               return typeof val === "string" ? val : val + "px";
                        }
                },
 
@@ -5210,8 +5472,8 @@ if ( !jQuery.support.opacity ) {
        };
 }
 
-if ( getComputedStyle ) {
-       curCSS = function( elem, newName, name ) {
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+       getComputedStyle = function( elem, newName, name ) {
                var ret, defaultView, computedStyle;
 
                name = name.replace( rupper, "-$1" ).toLowerCase();
@@ -5229,10 +5491,13 @@ if ( getComputedStyle ) {
 
                return ret;
        };
+}
 
-} else if ( document.documentElement.currentStyle ) {
-       curCSS = function( elem, name ) {
-               var left, rsLeft, ret = elem.currentStyle && elem.currentStyle[ name ], style = elem.style;
+if ( document.documentElement.currentStyle ) {
+       currentStyle = function( elem, name ) {
+               var left, rsLeft,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       style = elem.style;
 
                // From the awesome hack by Dean Edwards
                // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
@@ -5254,10 +5519,12 @@ if ( getComputedStyle ) {
                        elem.runtimeStyle.left = rsLeft;
                }
 
-               return ret;
+               return ret === "" ? "auto" : ret;
        };
 }
 
+curCSS = getComputedStyle || currentStyle;
+
 function getWH( elem, name, extra ) {
        var which = name === "width" ? cssWidth : cssHeight,
                val = name === "width" ? elem.offsetWidth : elem.offsetHeight;
@@ -5284,7 +5551,8 @@ function getWH( elem, name, extra ) {
 
 if ( jQuery.expr && jQuery.expr.filters ) {
        jQuery.expr.filters.hidden = function( elem ) {
-               var width = elem.offsetWidth, height = elem.offsetHeight;
+               var width = elem.offsetWidth,
+                       height = elem.offsetHeight;
 
                return (width === 0 && height === 0) || (!jQuery.support.reliableHiddenOffsets && (elem.style.display || jQuery.css( elem, "display" )) === "none");
        };
@@ -5301,7 +5569,7 @@ var jsc = jQuery.now(),
        rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
        rselectTextarea = /^(?:select|textarea)/i,
        rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-       rnoContent = /^(?:GET|HEAD|DELETE)$/,
+       rnoContent = /^(?:GET|HEAD)$/,
        rbracket = /\[\]$/,
        jsre = /\=\?(&|$)/,
        rquery = /\?/,
@@ -5536,10 +5804,6 @@ jQuery.extend({
                        var customJsonp = window[ jsonp ];
 
                        window[ jsonp ] = function( tmp ) {
-                               data = tmp;
-                               jQuery.handleSuccess( s, xhr, status, data );
-                               jQuery.handleComplete( s, xhr, status, data );
-
                                if ( jQuery.isFunction( customJsonp ) ) {
                                        customJsonp( tmp );
 
@@ -5551,6 +5815,10 @@ jQuery.extend({
                                                delete window[ jsonp ];
                                        } catch( jsonpError ) {}
                                }
+
+                               data = tmp;
+                               jQuery.handleSuccess( s, xhr, status, data );
+                               jQuery.handleComplete( s, xhr, status, data );
                                
                                if ( head ) {
                                        head.removeChild( script );
@@ -5562,7 +5830,7 @@ jQuery.extend({
                        s.cache = false;
                }
 
-               if ( s.cache === false && type === "GET" ) {
+               if ( s.cache === false && noContent ) {
                        var ts = jQuery.now();
 
                        // try replacing _= if it is there
@@ -5572,8 +5840,8 @@ jQuery.extend({
                        s.url = ret + ((ret === s.url) ? (rquery.test(s.url) ? "&" : "?") + "_=" + ts : "");
                }
 
-               // If data is available, append data to url for get requests
-               if ( s.data && type === "GET" ) {
+               // If data is available, append data to url for GET/HEAD requests
+               if ( s.data && noContent ) {
                        s.url += (rquery.test(s.url) ? "&" : "?") + s.data;
                }
 
@@ -5584,7 +5852,7 @@ jQuery.extend({
 
                // Matches an absolute URL, and saves the domain
                var parts = rurl.exec( s.url ),
-                       remote = parts && (parts[1] && parts[1] !== location.protocol || parts[2] !== location.host);
+                       remote = parts && (parts[1] && parts[1].toLowerCase() !== location.protocol || parts[2].toLowerCase() !== location.host);
 
                // If we're requesting a remote document
                // and trying to load JSON or Script with a GET
@@ -5760,10 +6028,11 @@ jQuery.extend({
                try {
                        var oldAbort = xhr.abort;
                        xhr.abort = function() {
-                               // xhr.abort in IE7 is not a native JS function
-                               // and does not have a call property
-                               if ( xhr && oldAbort.call ) {
-                                       oldAbort.call( xhr );
+                               if ( xhr ) {
+                                       // oldAbort has no call property in IE7 so
+                                       // just do it this way, which works in all
+                                       // browsers
+                                       Function.prototype.call.call( oldAbort, xhr );
                                }
 
                                onreadystatechange( "abort" );
@@ -5803,11 +6072,12 @@ jQuery.extend({
        // Serialize an array of form elements or a set of
        // key/values into a query string
        param: function( a, traditional ) {
-               var s = [], add = function( key, value ) {
-                       // If value is a function, invoke it and return its value
-                       value = jQuery.isFunction(value) ? value() : value;
-                       s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
-               };
+               var s = [],
+                       add = function( key, value ) {
+                               // If value is a function, invoke it and return its value
+                               value = jQuery.isFunction(value) ? value() : value;
+                               s[ s.length ] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
+                       };
                
                // Set traditional to true for jQuery <= 1.3.2 behavior.
                if ( traditional === undefined ) {
@@ -6029,28 +6299,39 @@ var elemdisplay = {},
 
 jQuery.fn.extend({
        show: function( speed, easing, callback ) {
+               var elem, display;
+
                if ( speed || speed === 0 ) {
                        return this.animate( genFx("show", 3), speed, easing, callback);
+
                } else {
                        for ( var i = 0, j = this.length; i < j; i++ ) {
+                               elem = this[i];
+                               display = elem.style.display;
+
                                // Reset the inline display of this element to learn if it is
                                // being hidden by cascaded rules or not
-                               if ( !jQuery.data(this[i], "olddisplay") && this[i].style.display === "none" ) {
-                                       this[i].style.display = "";
+                               if ( !jQuery.data(elem, "olddisplay") && display === "none" ) {
+                                       display = elem.style.display = "";
                                }
 
                                // Set elements which have been overridden with display: none
                                // in a stylesheet to whatever the default browser style is
                                // for such an element
-                               if ( this[i].style.display === "" && jQuery.css( this[i], "display" ) === "none" ) {
-                                       jQuery.data(this[i], "olddisplay", defaultDisplay(this[i].nodeName));
+                               if ( display === "" && jQuery.css( elem, "display" ) === "none" ) {
+                                       jQuery.data(elem, "olddisplay", defaultDisplay(elem.nodeName));
                                }
                        }
 
                        // Set the display of most of the elements in a second loop
                        // to avoid the constant reflow
                        for ( i = 0; i < j; i++ ) {
-                               this[i].style.display = jQuery.data(this[i], "olddisplay") || "";
+                               elem = this[i];
+                               display = elem.style.display;
+
+                               if ( display === "" || display === "none" ) {
+                                       elem.style.display = jQuery.data(elem, "olddisplay") || "";
+                               }
                        }
 
                        return this;
@@ -6115,7 +6396,7 @@ jQuery.fn.extend({
                }
 
                return this[ optall.queue === false ? "each" : "queue" ](function() {
-                       // XXX â€˜this’ does not always have a nodeName when running the
+                       // XXX 'this' does not always have a nodeName when running the
                        // test suite
 
                        var opt = jQuery.extend({}, optall), p,
@@ -6188,7 +6469,7 @@ jQuery.fn.extend({
 
                                } else {
                                        var parts = rfxnum.exec(val),
-                                               start = e.cur(true) || 0;
+                                               start = e.cur() || 0;
 
                                        if ( parts ) {
                                                var end = parseFloat( parts[2] ),
@@ -6197,7 +6478,7 @@ jQuery.fn.extend({
                                                // We need to compute starting value
                                                if ( unit !== "px" ) {
                                                        jQuery.style( self, name, (end || 1) + unit);
-                                                       start = ((end || 1) / e.cur(true)) * start;
+                                                       start = ((end || 1) / e.cur()) * start;
                                                        jQuery.style( self, name, start + unit);
                                                }
 
@@ -6266,7 +6547,8 @@ jQuery.each({
        slideUp: genFx("hide", 1),
        slideToggle: genFx("toggle", 1),
        fadeIn: { opacity: "show" },
-       fadeOut: { opacity: "hide" }
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
 }, function( name, props ) {
        jQuery.fn[ name ] = function( speed, easing, callback ) {
                return this.animate( props, speed, easing, callback );
@@ -6344,6 +6626,9 @@ jQuery.fx.prototype = {
 
        // Start an animation from one number to another
        custom: function( from, to, unit ) {
+               var self = this,
+                       fx = jQuery.fx;
+
                this.startTime = jQuery.now();
                this.start = from;
                this.end = to;
@@ -6351,7 +6636,6 @@ jQuery.fx.prototype = {
                this.now = this.start;
                this.pos = this.state = 0;
 
-               var self = this, fx = jQuery.fx;
                function t( gotoEnd ) {
                        return self.step(gotoEnd);
                }
@@ -6408,7 +6692,9 @@ jQuery.fx.prototype = {
                        if ( done ) {
                                // Reset the overflow
                                if ( this.options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
-                                       var elem = this.elem, options = this.options;
+                                       var elem = this.elem,
+                                               options = this.options;
+
                                        jQuery.each( [ "", "X", "Y" ], function (index, value) {
                                                elem.style[ "overflow" + value ] = options.overflow[index];
                                        } );
@@ -6587,11 +6873,16 @@ if ( "getBoundingClientRect" in document.documentElement ) {
 
                jQuery.offset.initialize();
 
-               var offsetParent = elem.offsetParent, prevOffsetParent = elem,
-                       doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement,
-                       body = doc.body, defaultView = doc.defaultView,
+               var computedStyle,
+                       offsetParent = elem.offsetParent,
+                       prevOffsetParent = elem,
+                       doc = elem.ownerDocument,
+                       docElem = doc.documentElement,
+                       body = doc.body,
+                       defaultView = doc.defaultView,
                        prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
-                       top = elem.offsetTop, left = elem.offsetLeft;
+                       top = elem.offsetTop,
+                       left = elem.offsetLeft;
 
                while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
                        if ( jQuery.offset.supportsFixedPosition && prevComputedStyle.position === "fixed" ) {
@@ -6673,7 +6964,8 @@ jQuery.offset = {
        },
 
        bodyOffset: function( body ) {
-               var top = body.offsetTop, left = body.offsetLeft;
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
 
                jQuery.offset.initialize();
 
@@ -6854,27 +7146,31 @@ jQuery.each([ "Height", "Width" ], function( i, name ) {
                        });
                }
 
-               return jQuery.isWindow( elem ) ?
+               if ( jQuery.isWindow( elem ) ) {
                        // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
-                       elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
-                       elem.document.body[ "client" + name ] :
-
-                       // Get document width or height
-                       (elem.nodeType === 9) ? // is it a document
-                               // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
-                               Math.max(
-                                       elem.documentElement["client" + name],
-                                       elem.body["scroll" + name], elem.documentElement["scroll" + name],
-                                       elem.body["offset" + name], elem.documentElement["offset" + name]
-                               ) :
-
-                               // Get or set width or height on the element
-                               size === undefined ?
-                                       // Get width or height on the element
-                                       parseFloat( jQuery.css( elem, type ) ) :
-
-                                       // Set the width or height on the element (default to pixels if value is unitless)
-                                       this.css( type, typeof size === "string" ? size : size + "px" );
+                       return elem.document.compatMode === "CSS1Compat" && elem.document.documentElement[ "client" + name ] ||
+                               elem.document.body[ "client" + name ];
+
+               // Get document width or height
+               } else if ( elem.nodeType === 9 ) {
+                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+                       return Math.max(
+                               elem.documentElement["client" + name],
+                               elem.body["scroll" + name], elem.documentElement["scroll" + name],
+                               elem.body["offset" + name], elem.documentElement["offset" + name]
+                       );
+
+               // Get or set width or height on the element
+               } else if ( size === undefined ) {
+                       var orig = jQuery.css( elem, type ),
+                               ret = parseFloat( orig );
+
+                       return jQuery.isNaN( ret ) ? orig : ret;
+
+               // Set the width or height on the element (default to pixels if value is unitless)
+               } else {
+                       return this.css( type, typeof size === "string" ? size : size + "px" );
+               }
        };
 
 });
diff --git a/lib/jquery-1.4.4.min.js b/lib/jquery-1.4.4.min.js
new file mode 100644 (file)
index 0000000..8f3ca2e
--- /dev/null
@@ -0,0 +1,167 @@
+/*!
+ * jQuery JavaScript Library v1.4.4
+ * http://jquery.com/
+ *
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2010, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 11 19:04:53 2010 -0500
+ */
+(function(E,B){function ka(a,b,d){if(d===B&&a.nodeType===1){d=a.getAttribute("data-"+b);if(typeof d==="string"){try{d=d==="true"?true:d==="false"?false:d==="null"?null:!c.isNaN(d)?parseFloat(d):Ja.test(d)?c.parseJSON(d):d}catch(e){}c.data(a,b,d)}else d=B}return d}function U(){return false}function ca(){return true}function la(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function Ka(a){var b,d,e,f,h,l,k,o,x,r,A,C=[];f=[];h=c.data(this,this.nodeType?"events":"__events__");if(typeof h==="function")h=
+h.events;if(!(a.liveFired===this||!h||!h.live||a.button&&a.type==="click")){if(a.namespace)A=RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)");a.liveFired=this;var J=h.live.slice(0);for(k=0;k<J.length;k++){h=J[k];h.origType.replace(X,"")===a.type?f.push(h.selector):J.splice(k--,1)}f=c(a.target).closest(f,a.currentTarget);o=0;for(x=f.length;o<x;o++){r=f[o];for(k=0;k<J.length;k++){h=J[k];if(r.selector===h.selector&&(!A||A.test(h.namespace))){l=r.elem;e=null;if(h.preType==="mouseenter"||
+h.preType==="mouseleave"){a.type=h.preType;e=c(a.relatedTarget).closest(h.selector)[0]}if(!e||e!==l)C.push({elem:l,handleObj:h,level:r.level})}}}o=0;for(x=C.length;o<x;o++){f=C[o];if(d&&f.level>d)break;a.currentTarget=f.elem;a.data=f.handleObj.data;a.handleObj=f.handleObj;A=f.handleObj.origHandler.apply(f.elem,arguments);if(A===false||a.isPropagationStopped()){d=f.level;if(A===false)b=false;if(a.isImmediatePropagationStopped())break}}return b}}function Y(a,b){return(a&&a!=="*"?a+".":"")+b.replace(La,
+"`").replace(Ma,"&")}function ma(a,b,d){if(c.isFunction(b))return c.grep(a,function(f,h){return!!b.call(f,h,f)===d});else if(b.nodeType)return c.grep(a,function(f){return f===b===d});else if(typeof b==="string"){var e=c.grep(a,function(f){return f.nodeType===1});if(Na.test(b))return c.filter(b,e,!d);else b=c.filter(b,e)}return c.grep(a,function(f){return c.inArray(f,b)>=0===d})}function na(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var e=c.data(a[d++]),f=c.data(this,
+e);if(e=e&&e.events){delete f.handle;f.events={};for(var h in e)for(var l in e[h])c.event.add(this,h,e[h][l],e[h][l].data)}}})}function Oa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function oa(a,b,d){var e=b==="width"?a.offsetWidth:a.offsetHeight;if(d==="border")return e;c.each(b==="width"?Pa:Qa,function(){d||(e-=parseFloat(c.css(a,"padding"+this))||0);if(d==="margin")e+=parseFloat(c.css(a,
+"margin"+this))||0;else e-=parseFloat(c.css(a,"border"+this+"Width"))||0});return e}function da(a,b,d,e){if(c.isArray(b)&&b.length)c.each(b,function(f,h){d||Ra.test(a)?e(a,h):da(a+"["+(typeof h==="object"||c.isArray(h)?f:"")+"]",h,d,e)});else if(!d&&b!=null&&typeof b==="object")c.isEmptyObject(b)?e(a,""):c.each(b,function(f,h){da(a+"["+f+"]",h,d,e)});else e(a,b)}function S(a,b){var d={};c.each(pa.concat.apply([],pa.slice(0,b)),function(){d[this]=a});return d}function qa(a){if(!ea[a]){var b=c("<"+
+a+">").appendTo("body"),d=b.css("display");b.remove();if(d==="none"||d==="")d="block";ea[a]=d}return ea[a]}function fa(a){return c.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var t=E.document,c=function(){function a(){if(!b.isReady){try{t.documentElement.doScroll("left")}catch(j){setTimeout(a,1);return}b.ready()}}var b=function(j,s){return new b.fn.init(j,s)},d=E.jQuery,e=E.$,f,h=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,l=/\S/,k=/^\s+/,o=/\s+$/,x=/\W/,r=/\d/,A=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+C=/^[\],:{}\s]*$/,J=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,w=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,I=/(?:^|:|,)(?:\s*\[)+/g,L=/(webkit)[ \/]([\w.]+)/,g=/(opera)(?:.*version)?[ \/]([\w.]+)/,i=/(msie) ([\w.]+)/,n=/(mozilla)(?:.*? rv:([\w.]+))?/,m=navigator.userAgent,p=false,q=[],u,y=Object.prototype.toString,F=Object.prototype.hasOwnProperty,M=Array.prototype.push,N=Array.prototype.slice,O=String.prototype.trim,D=Array.prototype.indexOf,R={};b.fn=b.prototype={init:function(j,
+s){var v,z,H;if(!j)return this;if(j.nodeType){this.context=this[0]=j;this.length=1;return this}if(j==="body"&&!s&&t.body){this.context=t;this[0]=t.body;this.selector="body";this.length=1;return this}if(typeof j==="string")if((v=h.exec(j))&&(v[1]||!s))if(v[1]){H=s?s.ownerDocument||s:t;if(z=A.exec(j))if(b.isPlainObject(s)){j=[t.createElement(z[1])];b.fn.attr.call(j,s,true)}else j=[H.createElement(z[1])];else{z=b.buildFragment([v[1]],[H]);j=(z.cacheable?z.fragment.cloneNode(true):z.fragment).childNodes}return b.merge(this,
+j)}else{if((z=t.getElementById(v[2]))&&z.parentNode){if(z.id!==v[2])return f.find(j);this.length=1;this[0]=z}this.context=t;this.selector=j;return this}else if(!s&&!x.test(j)){this.selector=j;this.context=t;j=t.getElementsByTagName(j);return b.merge(this,j)}else return!s||s.jquery?(s||f).find(j):b(s).find(j);else if(b.isFunction(j))return f.ready(j);if(j.selector!==B){this.selector=j.selector;this.context=j.context}return b.makeArray(j,this)},selector:"",jquery:"1.4.4",length:0,size:function(){return this.length},
+toArray:function(){return N.call(this,0)},get:function(j){return j==null?this.toArray():j<0?this.slice(j)[0]:this[j]},pushStack:function(j,s,v){var z=b();b.isArray(j)?M.apply(z,j):b.merge(z,j);z.prevObject=this;z.context=this.context;if(s==="find")z.selector=this.selector+(this.selector?" ":"")+v;else if(s)z.selector=this.selector+"."+s+"("+v+")";return z},each:function(j,s){return b.each(this,j,s)},ready:function(j){b.bindReady();if(b.isReady)j.call(t,b);else q&&q.push(j);return this},eq:function(j){return j===
+-1?this.slice(j):this.slice(j,+j+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(N.apply(this,arguments),"slice",N.call(arguments).join(","))},map:function(j){return this.pushStack(b.map(this,function(s,v){return j.call(s,v,s)}))},end:function(){return this.prevObject||b(null)},push:M,sort:[].sort,splice:[].splice};b.fn.init.prototype=b.fn;b.extend=b.fn.extend=function(){var j,s,v,z,H,G=arguments[0]||{},K=1,Q=arguments.length,ga=false;
+if(typeof G==="boolean"){ga=G;G=arguments[1]||{};K=2}if(typeof G!=="object"&&!b.isFunction(G))G={};if(Q===K){G=this;--K}for(;K<Q;K++)if((j=arguments[K])!=null)for(s in j){v=G[s];z=j[s];if(G!==z)if(ga&&z&&(b.isPlainObject(z)||(H=b.isArray(z)))){if(H){H=false;v=v&&b.isArray(v)?v:[]}else v=v&&b.isPlainObject(v)?v:{};G[s]=b.extend(ga,v,z)}else if(z!==B)G[s]=z}return G};b.extend({noConflict:function(j){E.$=e;if(j)E.jQuery=d;return b},isReady:false,readyWait:1,ready:function(j){j===true&&b.readyWait--;
+if(!b.readyWait||j!==true&&!b.isReady){if(!t.body)return setTimeout(b.ready,1);b.isReady=true;if(!(j!==true&&--b.readyWait>0))if(q){var s=0,v=q;for(q=null;j=v[s++];)j.call(t,b);b.fn.trigger&&b(t).trigger("ready").unbind("ready")}}},bindReady:function(){if(!p){p=true;if(t.readyState==="complete")return setTimeout(b.ready,1);if(t.addEventListener){t.addEventListener("DOMContentLoaded",u,false);E.addEventListener("load",b.ready,false)}else if(t.attachEvent){t.attachEvent("onreadystatechange",u);E.attachEvent("onload",
+b.ready);var j=false;try{j=E.frameElement==null}catch(s){}t.documentElement.doScroll&&j&&a()}}},isFunction:function(j){return b.type(j)==="function"},isArray:Array.isArray||function(j){return b.type(j)==="array"},isWindow:function(j){return j&&typeof j==="object"&&"setInterval"in j},isNaN:function(j){return j==null||!r.test(j)||isNaN(j)},type:function(j){return j==null?String(j):R[y.call(j)]||"object"},isPlainObject:function(j){if(!j||b.type(j)!=="object"||j.nodeType||b.isWindow(j))return false;if(j.constructor&&
+!F.call(j,"constructor")&&!F.call(j.constructor.prototype,"isPrototypeOf"))return false;for(var s in j);return s===B||F.call(j,s)},isEmptyObject:function(j){for(var s in j)return false;return true},error:function(j){throw j;},parseJSON:function(j){if(typeof j!=="string"||!j)return null;j=b.trim(j);if(C.test(j.replace(J,"@").replace(w,"]").replace(I,"")))return E.JSON&&E.JSON.parse?E.JSON.parse(j):(new Function("return "+j))();else b.error("Invalid JSON: "+j)},noop:function(){},globalEval:function(j){if(j&&
+l.test(j)){var s=t.getElementsByTagName("head")[0]||t.documentElement,v=t.createElement("script");v.type="text/javascript";if(b.support.scriptEval)v.appendChild(t.createTextNode(j));else v.text=j;s.insertBefore(v,s.firstChild);s.removeChild(v)}},nodeName:function(j,s){return j.nodeName&&j.nodeName.toUpperCase()===s.toUpperCase()},each:function(j,s,v){var z,H=0,G=j.length,K=G===B||b.isFunction(j);if(v)if(K)for(z in j){if(s.apply(j[z],v)===false)break}else for(;H<G;){if(s.apply(j[H++],v)===false)break}else if(K)for(z in j){if(s.call(j[z],
+z,j[z])===false)break}else for(v=j[0];H<G&&s.call(v,H,v)!==false;v=j[++H]);return j},trim:O?function(j){return j==null?"":O.call(j)}:function(j){return j==null?"":j.toString().replace(k,"").replace(o,"")},makeArray:function(j,s){var v=s||[];if(j!=null){var z=b.type(j);j.length==null||z==="string"||z==="function"||z==="regexp"||b.isWindow(j)?M.call(v,j):b.merge(v,j)}return v},inArray:function(j,s){if(s.indexOf)return s.indexOf(j);for(var v=0,z=s.length;v<z;v++)if(s[v]===j)return v;return-1},merge:function(j,
+s){var v=j.length,z=0;if(typeof s.length==="number")for(var H=s.length;z<H;z++)j[v++]=s[z];else for(;s[z]!==B;)j[v++]=s[z++];j.length=v;return j},grep:function(j,s,v){var z=[],H;v=!!v;for(var G=0,K=j.length;G<K;G++){H=!!s(j[G],G);v!==H&&z.push(j[G])}return z},map:function(j,s,v){for(var z=[],H,G=0,K=j.length;G<K;G++){H=s(j[G],G,v);if(H!=null)z[z.length]=H}return z.concat.apply([],z)},guid:1,proxy:function(j,s,v){if(arguments.length===2)if(typeof s==="string"){v=j;j=v[s];s=B}else if(s&&!b.isFunction(s)){v=
+s;s=B}if(!s&&j)s=function(){return j.apply(v||this,arguments)};if(j)s.guid=j.guid=j.guid||s.guid||b.guid++;return s},access:function(j,s,v,z,H,G){var K=j.length;if(typeof s==="object"){for(var Q in s)b.access(j,Q,s[Q],z,H,v);return j}if(v!==B){z=!G&&z&&b.isFunction(v);for(Q=0;Q<K;Q++)H(j[Q],s,z?v.call(j[Q],Q,H(j[Q],s)):v,G);return j}return K?H(j[0],s):B},now:function(){return(new Date).getTime()},uaMatch:function(j){j=j.toLowerCase();j=L.exec(j)||g.exec(j)||i.exec(j)||j.indexOf("compatible")<0&&n.exec(j)||
+[];return{browser:j[1]||"",version:j[2]||"0"}},browser:{}});b.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(j,s){R["[object "+s+"]"]=s.toLowerCase()});m=b.uaMatch(m);if(m.browser){b.browser[m.browser]=true;b.browser.version=m.version}if(b.browser.webkit)b.browser.safari=true;if(D)b.inArray=function(j,s){return D.call(s,j)};if(!/\s/.test("\u00a0")){k=/^[\s\xA0]+/;o=/[\s\xA0]+$/}f=b(t);if(t.addEventListener)u=function(){t.removeEventListener("DOMContentLoaded",u,
+false);b.ready()};else if(t.attachEvent)u=function(){if(t.readyState==="complete"){t.detachEvent("onreadystatechange",u);b.ready()}};return E.jQuery=E.$=b}();(function(){c.support={};var a=t.documentElement,b=t.createElement("script"),d=t.createElement("div"),e="script"+c.now();d.style.display="none";d.innerHTML="   <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var f=d.getElementsByTagName("*"),h=d.getElementsByTagName("a")[0],l=t.createElement("select"),
+k=l.appendChild(t.createElement("option"));if(!(!f||!f.length||!h)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(h.getAttribute("style")),hrefNormalized:h.getAttribute("href")==="/a",opacity:/^0.55$/.test(h.style.opacity),cssFloat:!!h.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:k.selected,deleteExpando:true,optDisabled:false,checkClone:false,
+scriptEval:false,noCloneEvent:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};l.disabled=true;c.support.optDisabled=!k.disabled;b.type="text/javascript";try{b.appendChild(t.createTextNode("window."+e+"=1;"))}catch(o){}a.insertBefore(b,a.firstChild);if(E[e]){c.support.scriptEval=true;delete E[e]}try{delete b.test}catch(x){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function r(){c.support.noCloneEvent=
+false;d.detachEvent("onclick",r)});d.cloneNode(true).fireEvent("onclick")}d=t.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=t.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var r=t.createElement("div");r.style.width=r.style.paddingLeft="1px";t.body.appendChild(r);c.boxModel=c.support.boxModel=r.offsetWidth===2;if("zoom"in r.style){r.style.display="inline";r.style.zoom=
+1;c.support.inlineBlockNeedsLayout=r.offsetWidth===2;r.style.display="";r.innerHTML="<div style='width:4px;'></div>";c.support.shrinkWrapBlocks=r.offsetWidth!==2}r.innerHTML="<table><tr><td style='padding:0;display:none'></td><td>t</td></tr></table>";var A=r.getElementsByTagName("td");c.support.reliableHiddenOffsets=A[0].offsetHeight===0;A[0].style.display="";A[1].style.display="none";c.support.reliableHiddenOffsets=c.support.reliableHiddenOffsets&&A[0].offsetHeight===0;r.innerHTML="";t.body.removeChild(r).style.display=
+"none"});a=function(r){var A=t.createElement("div");r="on"+r;var C=r in A;if(!C){A.setAttribute(r,"return;");C=typeof A[r]==="function"}return C};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=f=h=null}})();var ra={},Ja=/^(?:\{.*\}|\[.*\])$/;c.extend({cache:{},uuid:0,expando:"jQuery"+c.now(),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},data:function(a,b,d){if(c.acceptData(a)){a=a==E?ra:a;var e=a.nodeType,f=e?a[c.expando]:null,h=
+c.cache;if(!(e&&!f&&typeof b==="string"&&d===B)){if(e)f||(a[c.expando]=f=++c.uuid);else h=a;if(typeof b==="object")if(e)h[f]=c.extend(h[f],b);else c.extend(h,b);else if(e&&!h[f])h[f]={};a=e?h[f]:h;if(d!==B)a[b]=d;return typeof b==="string"?a[b]:a}}},removeData:function(a,b){if(c.acceptData(a)){a=a==E?ra:a;var d=a.nodeType,e=d?a[c.expando]:a,f=c.cache,h=d?f[e]:e;if(b){if(h){delete h[b];d&&c.isEmptyObject(h)&&c.removeData(a)}}else if(d&&c.support.deleteExpando)delete a[c.expando];else if(a.removeAttribute)a.removeAttribute(c.expando);
+else if(d)delete f[e];else for(var l in a)delete a[l]}},acceptData:function(a){if(a.nodeName){var b=c.noData[a.nodeName.toLowerCase()];if(b)return!(b===true||a.getAttribute("classid")!==b)}return true}});c.fn.extend({data:function(a,b){var d=null;if(typeof a==="undefined"){if(this.length){var e=this[0].attributes,f;d=c.data(this[0]);for(var h=0,l=e.length;h<l;h++){f=e[h].name;if(f.indexOf("data-")===0){f=f.substr(5);ka(this[0],f,d[f])}}}return d}else if(typeof a==="object")return this.each(function(){c.data(this,
+a)});var k=a.split(".");k[1]=k[1]?"."+k[1]:"";if(b===B){d=this.triggerHandler("getData"+k[1]+"!",[k[0]]);if(d===B&&this.length){d=c.data(this[0],a);d=ka(this[0],a,d)}return d===B&&k[1]?this.data(k[0]):d}else return this.each(function(){var o=c(this),x=[k[0],b];o.triggerHandler("setData"+k[1]+"!",x);c.data(this,a,b);o.triggerHandler("changeData"+k[1]+"!",x)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var e=
+c.data(a,b);if(!d)return e||[];if(!e||c.isArray(d))e=c.data(a,b,c.makeArray(d));else e.push(d);return e}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),e=d.shift();if(e==="inprogress")e=d.shift();if(e){b==="fx"&&d.unshift("inprogress");e.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===B)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,
+a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var sa=/[\n\t]/g,ha=/\s+/,Sa=/\r/g,Ta=/^(?:href|src|style)$/,Ua=/^(?:button|input)$/i,Va=/^(?:button|input|object|select|textarea)$/i,Wa=/^a(?:rea)?$/i,ta=/^(?:radio|checkbox)$/i;c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",
+colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};c.fn.extend({attr:function(a,b){return c.access(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(x){var r=c(this);r.addClass(a.call(this,x,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===
+1)if(f.className){for(var h=" "+f.className+" ",l=f.className,k=0,o=b.length;k<o;k++)if(h.indexOf(" "+b[k]+" ")<0)l+=" "+b[k];f.className=c.trim(l)}else f.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(o){var x=c(this);x.removeClass(a.call(this,o,x.attr("class")))});if(a&&typeof a==="string"||a===B)for(var b=(a||"").split(ha),d=0,e=this.length;d<e;d++){var f=this[d];if(f.nodeType===1&&f.className)if(a){for(var h=(" "+f.className+" ").replace(sa," "),
+l=0,k=b.length;l<k;l++)h=h.replace(" "+b[l]+" "," ");f.className=c.trim(h)}else f.className=""}return this},toggleClass:function(a,b){var d=typeof a,e=typeof b==="boolean";if(c.isFunction(a))return this.each(function(f){var h=c(this);h.toggleClass(a.call(this,f,h.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var f,h=0,l=c(this),k=b,o=a.split(ha);f=o[h++];){k=e?k:!l.hasClass(f);l[k?"addClass":"removeClass"](f)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,
+"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(sa," ").indexOf(a)>-1)return true;return false},val:function(a){if(!arguments.length){var b=this[0];if(b){if(c.nodeName(b,"option")){var d=b.attributes.value;return!d||d.specified?b.value:b.text}if(c.nodeName(b,"select")){var e=b.selectedIndex;d=[];var f=b.options;b=b.type==="select-one";
+if(e<0)return null;var h=b?e:0;for(e=b?e+1:f.length;h<e;h++){var l=f[h];if(l.selected&&(c.support.optDisabled?!l.disabled:l.getAttribute("disabled")===null)&&(!l.parentNode.disabled||!c.nodeName(l.parentNode,"optgroup"))){a=c(l).val();if(b)return a;d.push(a)}}return d}if(ta.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Sa,"")}return B}var k=c.isFunction(a);return this.each(function(o){var x=c(this),r=a;if(this.nodeType===1){if(k)r=
+a.call(this,o,x.val());if(r==null)r="";else if(typeof r==="number")r+="";else if(c.isArray(r))r=c.map(r,function(C){return C==null?"":C+""});if(c.isArray(r)&&ta.test(this.type))this.checked=c.inArray(x.val(),r)>=0;else if(c.nodeName(this,"select")){var A=c.makeArray(r);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),A)>=0});if(!A.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},
+attr:function(a,b,d,e){if(!a||a.nodeType===3||a.nodeType===8)return B;if(e&&b in c.attrFn)return c(a)[b](d);e=a.nodeType!==1||!c.isXMLDoc(a);var f=d!==B;b=e&&c.props[b]||b;var h=Ta.test(b);if((b in a||a[b]!==B)&&e&&!h){if(f){b==="type"&&Ua.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");if(d===null)a.nodeType===1&&a.removeAttribute(b);else a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&
+b.specified?b.value:Va.test(a.nodeName)||Wa.test(a.nodeName)&&a.href?0:B;return a[b]}if(!c.support.style&&e&&b==="style"){if(f)a.style.cssText=""+d;return a.style.cssText}f&&a.setAttribute(b,""+d);if(!a.attributes[b]&&a.hasAttribute&&!a.hasAttribute(b))return B;a=!c.support.hrefNormalized&&e&&h?a.getAttribute(b,2):a.getAttribute(b);return a===null?B:a}});var X=/\.(.*)$/,ia=/^(?:textarea|input|select)$/i,La=/\./g,Ma=/ /g,Xa=/[^\w\s.|`]/g,Ya=function(a){return a.replace(Xa,"\\$&")},ua={focusin:0,focusout:0};
+c.event={add:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(c.isWindow(a)&&a!==E&&!a.frameElement)a=E;if(d===false)d=U;else if(!d)return;var f,h;if(d.handler){f=d;d=f.handler}if(!d.guid)d.guid=c.guid++;if(h=c.data(a)){var l=a.nodeType?"events":"__events__",k=h[l],o=h.handle;if(typeof k==="function"){o=k.handle;k=k.events}else if(!k){a.nodeType||(h[l]=h=function(){});h.events=k={}}if(!o)h.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,
+arguments):B};o.elem=a;b=b.split(" ");for(var x=0,r;l=b[x++];){h=f?c.extend({},f):{handler:d,data:e};if(l.indexOf(".")>-1){r=l.split(".");l=r.shift();h.namespace=r.slice(0).sort().join(".")}else{r=[];h.namespace=""}h.type=l;if(!h.guid)h.guid=d.guid;var A=k[l],C=c.event.special[l]||{};if(!A){A=k[l]=[];if(!C.setup||C.setup.call(a,e,r,o)===false)if(a.addEventListener)a.addEventListener(l,o,false);else a.attachEvent&&a.attachEvent("on"+l,o)}if(C.add){C.add.call(a,h);if(!h.handler.guid)h.handler.guid=
+d.guid}A.push(h);c.event.global[l]=true}a=null}}},global:{},remove:function(a,b,d,e){if(!(a.nodeType===3||a.nodeType===8)){if(d===false)d=U;var f,h,l=0,k,o,x,r,A,C,J=a.nodeType?"events":"__events__",w=c.data(a),I=w&&w[J];if(w&&I){if(typeof I==="function"){w=I;I=I.events}if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(f in I)c.event.remove(a,f+b)}else{for(b=b.split(" ");f=b[l++];){r=f;k=f.indexOf(".")<0;o=[];if(!k){o=f.split(".");f=o.shift();x=RegExp("(^|\\.)"+
+c.map(o.slice(0).sort(),Ya).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(A=I[f])if(d){r=c.event.special[f]||{};for(h=e||0;h<A.length;h++){C=A[h];if(d.guid===C.guid){if(k||x.test(C.namespace)){e==null&&A.splice(h--,1);r.remove&&r.remove.call(a,C)}if(e!=null)break}}if(A.length===0||e!=null&&A.length===1){if(!r.teardown||r.teardown.call(a,o)===false)c.removeEvent(a,f,w.handle);delete I[f]}}else for(h=0;h<A.length;h++){C=A[h];if(k||x.test(C.namespace)){c.event.remove(a,r,C.handler,h);A.splice(h--,1)}}}if(c.isEmptyObject(I)){if(b=
+w.handle)b.elem=null;delete w.events;delete w.handle;if(typeof w==="function")c.removeData(a,J);else c.isEmptyObject(w)&&c.removeData(a)}}}}},trigger:function(a,b,d,e){var f=a.type||a;if(!e){a=typeof a==="object"?a[c.expando]?a:c.extend(c.Event(f),a):c.Event(f);if(f.indexOf("!")>=0){a.type=f=f.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[f]&&c.each(c.cache,function(){this.events&&this.events[f]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
+8)return B;a.result=B;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(e=d.nodeType?c.data(d,"handle"):(c.data(d,"__events__")||{}).handle)&&e.apply(d,b);e=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+f]&&d["on"+f].apply(d,b)===false){a.result=false;a.preventDefault()}}catch(h){}if(!a.isPropagationStopped()&&e)c.event.trigger(a,b,e,true);else if(!a.isDefaultPrevented()){var l;e=a.target;var k=f.replace(X,""),o=c.nodeName(e,"a")&&k===
+"click",x=c.event.special[k]||{};if((!x._default||x._default.call(d,a)===false)&&!o&&!(e&&e.nodeName&&c.noData[e.nodeName.toLowerCase()])){try{if(e[k]){if(l=e["on"+k])e["on"+k]=null;c.event.triggered=true;e[k]()}}catch(r){}if(l)e["on"+k]=l;c.event.triggered=false}}},handle:function(a){var b,d,e,f;d=[];var h=c.makeArray(arguments);a=h[0]=c.event.fix(a||E.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;if(!b){e=a.type.split(".");a.type=e.shift();d=e.slice(0).sort();e=RegExp("(^|\\.)"+
+d.join("\\.(?:.*\\.)?")+"(\\.|$)")}a.namespace=a.namespace||d.join(".");f=c.data(this,this.nodeType?"events":"__events__");if(typeof f==="function")f=f.events;d=(f||{})[a.type];if(f&&d){d=d.slice(0);f=0;for(var l=d.length;f<l;f++){var k=d[f];if(b||e.test(k.namespace)){a.handler=k.handler;a.data=k.data;a.handleObj=k;k=k.handler.apply(this,h);if(k!==B){a.result=k;if(k===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
+fix:function(a){if(a[c.expando])return a;var b=a;a=c.Event(b);for(var d=this.props.length,e;d;){e=this.props[--d];a[e]=b[e]}if(!a.target)a.target=a.srcElement||t;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=t.documentElement;d=t.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||
+d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(a.which==null&&(a.charCode!=null||a.keyCode!=null))a.which=a.charCode!=null?a.charCode:a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==B)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,Y(a.origType,a.selector),c.extend({},a,{handler:Ka,guid:a.handler.guid}))},remove:function(a){c.event.remove(this,
+Y(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,d){if(c.isWindow(this))this.onbeforeunload=d},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.removeEvent=t.removeEventListener?function(a,b,d){a.removeEventListener&&a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent&&a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=
+c.now();this[c.expando]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ca;var a=this.originalEvent;if(a)if(a.preventDefault)a.preventDefault();else a.returnValue=false},stopPropagation:function(){this.isPropagationStopped=ca;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ca;this.stopPropagation()},isDefaultPrevented:U,isPropagationStopped:U,isImmediatePropagationStopped:U};
+var va=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},wa=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?wa:va,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?wa:va)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(){if(this.nodeName.toLowerCase()!==
+"form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length){a.liveFired=B;return la("submit",this,arguments)}});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13){a.liveFired=B;return la("submit",this,arguments)}})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};if(!c.support.changeBubbles){var V,
+xa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(e){return e.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},Z=function(a,b){var d=a.target,e,f;if(!(!ia.test(d.nodeName)||d.readOnly)){e=c.data(d,"_change_data");f=xa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",f);if(!(e===B||f===e))if(e!=null||f){a.type="change";a.liveFired=
+B;return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:Z,beforedeactivate:Z,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return Z.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return Z.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,"_change_data",xa(a))}},setup:function(){if(this.type===
+"file")return false;for(var a in V)c.event.add(this,a+".specialChange",V[a]);return ia.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return ia.test(this.nodeName)}};V=c.event.special.change.filters;V.focus=V.beforeactivate}t.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(e){e=c.event.fix(e);e.type=b;return c.event.trigger(e,null,e.target)}c.event.special[b]={setup:function(){ua[b]++===0&&t.addEventListener(a,d,true)},teardown:function(){--ua[b]===
+0&&t.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,e,f){if(typeof d==="object"){for(var h in d)this[b](h,e,d[h],f);return this}if(c.isFunction(e)||e===false){f=e;e=B}var l=b==="one"?c.proxy(f,function(o){c(this).unbind(o,l);return f.apply(this,arguments)}):f;if(d==="unload"&&b!=="one")this.one(d,e,f);else{h=0;for(var k=this.length;h<k;h++)c.event.add(this[h],d,l,e)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault)for(var d in a)this.unbind(d,
+a[d]);else{d=0;for(var e=this.length;d<e;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,e){return this.live(b,d,e,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){var d=c.Event(a);d.preventDefault();d.stopPropagation();c.event.trigger(d,b,this[0]);return d.result}},toggle:function(a){for(var b=arguments,d=
+1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(e){var f=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,f+1);e.preventDefault();return b[f].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var ya={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,e,f,h){var l,k=0,o,x,r=h||this.selector;h=h?this:c(this.context);if(typeof d===
+"object"&&!d.preventDefault){for(l in d)h[b](l,e,d[l],r);return this}if(c.isFunction(e)){f=e;e=B}for(d=(d||"").split(" ");(l=d[k++])!=null;){o=X.exec(l);x="";if(o){x=o[0];l=l.replace(X,"")}if(l==="hover")d.push("mouseenter"+x,"mouseleave"+x);else{o=l;if(l==="focus"||l==="blur"){d.push(ya[l]+x);l+=x}else l=(ya[l]||l)+x;if(b==="live"){x=0;for(var A=h.length;x<A;x++)c.event.add(h[x],"live."+Y(l,r),{data:e,selector:r,handler:f,origType:l,origHandler:f,preType:o})}else h.unbind("live."+Y(l,r),f)}}return this}});
+c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d,e){if(e==null){e=d;d=null}return arguments.length>0?this.bind(b,d,e):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});E.attachEvent&&!E.addEventListener&&c(E).bind("unload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});
+(function(){function a(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1&&!q){y.sizcache=n;y.sizset=p}if(y.nodeName.toLowerCase()===i){F=y;break}y=y[g]}m[p]=F}}}function b(g,i,n,m,p,q){p=0;for(var u=m.length;p<u;p++){var y=m[p];if(y){var F=false;for(y=y[g];y;){if(y.sizcache===n){F=m[y.sizset];break}if(y.nodeType===1){if(!q){y.sizcache=n;y.sizset=p}if(typeof i!=="string"){if(y===i){F=true;break}}else if(k.filter(i,
+[y]).length>0){F=y;break}}y=y[g]}m[p]=F}}}var d=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,f=Object.prototype.toString,h=false,l=true;[0,0].sort(function(){l=false;return 0});var k=function(g,i,n,m){n=n||[];var p=i=i||t;if(i.nodeType!==1&&i.nodeType!==9)return[];if(!g||typeof g!=="string")return n;var q,u,y,F,M,N=true,O=k.isXML(i),D=[],R=g;do{d.exec("");if(q=d.exec(R)){R=q[3];D.push(q[1]);if(q[2]){F=q[3];
+break}}}while(q);if(D.length>1&&x.exec(g))if(D.length===2&&o.relative[D[0]])u=L(D[0]+D[1],i);else for(u=o.relative[D[0]]?[i]:k(D.shift(),i);D.length;){g=D.shift();if(o.relative[g])g+=D.shift();u=L(g,u)}else{if(!m&&D.length>1&&i.nodeType===9&&!O&&o.match.ID.test(D[0])&&!o.match.ID.test(D[D.length-1])){q=k.find(D.shift(),i,O);i=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]}if(i){q=m?{expr:D.pop(),set:C(m)}:k.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&i.parentNode?i.parentNode:i,O);u=q.expr?k.filter(q.expr,
+q.set):q.set;if(D.length>0)y=C(u);else N=false;for(;D.length;){q=M=D.pop();if(o.relative[M])q=D.pop();else M="";if(q==null)q=i;o.relative[M](y,q,O)}}else y=[]}y||(y=u);y||k.error(M||g);if(f.call(y)==="[object Array]")if(N)if(i&&i.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&k.contains(i,y[g])))n.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&n.push(u[g]);else n.push.apply(n,y);else C(y,n);if(F){k(F,p,n,m);k.uniqueSort(n)}return n};k.uniqueSort=function(g){if(w){h=
+l;g.sort(w);if(h)for(var i=1;i<g.length;i++)g[i]===g[i-1]&&g.splice(i--,1)}return g};k.matches=function(g,i){return k(g,null,null,i)};k.matchesSelector=function(g,i){return k(i,null,null,[g]).length>0};k.find=function(g,i,n){var m;if(!g)return[];for(var p=0,q=o.order.length;p<q;p++){var u,y=o.order[p];if(u=o.leftMatch[y].exec(g)){var F=u[1];u.splice(1,1);if(F.substr(F.length-1)!=="\\"){u[1]=(u[1]||"").replace(/\\/g,"");m=o.find[y](u,i,n);if(m!=null){g=g.replace(o.match[y],"");break}}}}m||(m=i.getElementsByTagName("*"));
+return{set:m,expr:g}};k.filter=function(g,i,n,m){for(var p,q,u=g,y=[],F=i,M=i&&i[0]&&k.isXML(i[0]);g&&i.length;){for(var N in o.filter)if((p=o.leftMatch[N].exec(g))!=null&&p[2]){var O,D,R=o.filter[N];D=p[1];q=false;p.splice(1,1);if(D.substr(D.length-1)!=="\\"){if(F===y)y=[];if(o.preFilter[N])if(p=o.preFilter[N](p,F,n,y,m,M)){if(p===true)continue}else q=O=true;if(p)for(var j=0;(D=F[j])!=null;j++)if(D){O=R(D,p,j,F);var s=m^!!O;if(n&&O!=null)if(s)q=true;else F[j]=false;else if(s){y.push(D);q=true}}if(O!==
+B){n||(F=y);g=g.replace(o.match[N],"");if(!q)return[];break}}}if(g===u)if(q==null)k.error(g);else break;u=g}return F};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var o=k.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\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},relative:{"+":function(g,i){var n=typeof i==="string",m=n&&!/\W/.test(i);n=n&&!m;if(m)i=i.toLowerCase();m=0;for(var p=g.length,q;m<p;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=n||q&&q.nodeName.toLowerCase()===
+i?q||false:q===i}n&&k.filter(i,g,true)},">":function(g,i){var n,m=typeof i==="string",p=0,q=g.length;if(m&&!/\W/.test(i))for(i=i.toLowerCase();p<q;p++){if(n=g[p]){n=n.parentNode;g[p]=n.nodeName.toLowerCase()===i?n:false}}else{for(;p<q;p++)if(n=g[p])g[p]=m?n.parentNode:n.parentNode===i;m&&k.filter(i,g,true)}},"":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=i=i.toLowerCase();q=a}q("parentNode",i,p,g,m,n)},"~":function(g,i,n){var m,p=e++,q=b;if(typeof i==="string"&&!/\W/.test(i)){m=
+i=i.toLowerCase();q=a}q("previousSibling",i,p,g,m,n)}},find:{ID:function(g,i,n){if(typeof i.getElementById!=="undefined"&&!n)return(g=i.getElementById(g[1]))&&g.parentNode?[g]:[]},NAME:function(g,i){if(typeof i.getElementsByName!=="undefined"){for(var n=[],m=i.getElementsByName(g[1]),p=0,q=m.length;p<q;p++)m[p].getAttribute("name")===g[1]&&n.push(m[p]);return n.length===0?null:n}},TAG:function(g,i){return i.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,i,n,m,p,q){g=" "+g[1].replace(/\\/g,
+"")+" ";if(q)return g;q=0;for(var u;(u=i[q])!=null;q++)if(u)if(p^(u.className&&(" "+u.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))n||m.push(u);else if(n)i[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var i=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=i[1]+(i[2]||1)-0;g[3]=i[3]-0}g[0]=e++;return g},ATTR:function(g,i,n,
+m,p,q){i=g[1].replace(/\\/g,"");if(!q&&o.attrMap[i])g[1]=o.attrMap[i];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,i,n,m,p){if(g[1]==="not")if((d.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,i);else{g=k.filter(g[3],i,n,true^p);n||m.push.apply(m,g);return false}else if(o.match.POS.test(g[0])||o.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===
+true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,i,n){return!!k(n[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===
+g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,i){return i===0},last:function(g,i,n,m){return i===m.length-1},even:function(g,i){return i%2===0},odd:function(g,i){return i%2===1},lt:function(g,i,n){return i<n[3]-0},gt:function(g,i,n){return i>n[3]-0},nth:function(g,i,n){return n[3]-
+0===i},eq:function(g,i,n){return n[3]-0===i}},filter:{PSEUDO:function(g,i,n,m){var p=i[1],q=o.filters[p];if(q)return q(g,n,i,m);else if(p==="contains")return(g.textContent||g.innerText||k.getText([g])||"").indexOf(i[3])>=0;else if(p==="not"){i=i[3];n=0;for(m=i.length;n<m;n++)if(i[n]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+p)},CHILD:function(g,i){var n=i[1],m=g;switch(n){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(n===
+"first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":n=i[2];var p=i[3];if(n===1&&p===0)return true;var q=i[0],u=g.parentNode;if(u&&(u.sizcache!==q||!g.nodeIndex)){var y=0;for(m=u.firstChild;m;m=m.nextSibling)if(m.nodeType===1)m.nodeIndex=++y;u.sizcache=q}m=g.nodeIndex-p;return n===0?m===0:m%n===0&&m/n>=0}},ID:function(g,i){return g.nodeType===1&&g.getAttribute("id")===i},TAG:function(g,i){return i==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===
+i},CLASS:function(g,i){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(i)>-1},ATTR:function(g,i){var n=i[1];n=o.attrHandle[n]?o.attrHandle[n](g):g[n]!=null?g[n]:g.getAttribute(n);var m=n+"",p=i[2],q=i[4];return n==null?p==="!=":p==="="?m===q:p==="*="?m.indexOf(q)>=0:p==="~="?(" "+m+" ").indexOf(q)>=0:!q?m&&n!==false:p==="!="?m!==q:p==="^="?m.indexOf(q)===0:p==="$="?m.substr(m.length-q.length)===q:p==="|="?m===q||m.substr(0,q.length+1)===q+"-":false},POS:function(g,i,n,m){var p=o.setFilters[i[2]];
+if(p)return p(g,n,i,m)}}},x=o.match.POS,r=function(g,i){return"\\"+(i-0+1)},A;for(A in o.match){o.match[A]=RegExp(o.match[A].source+/(?![^\[]*\])(?![^\(]*\))/.source);o.leftMatch[A]=RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[A].source.replace(/\\(\d+)/g,r))}var C=function(g,i){g=Array.prototype.slice.call(g,0);if(i){i.push.apply(i,g);return i}return g};try{Array.prototype.slice.call(t.documentElement.childNodes,0)}catch(J){C=function(g,i){var n=0,m=i||[];if(f.call(g)==="[object Array]")Array.prototype.push.apply(m,
+g);else if(typeof g.length==="number")for(var p=g.length;n<p;n++)m.push(g[n]);else for(;g[n];n++)m.push(g[n]);return m}}var w,I;if(t.documentElement.compareDocumentPosition)w=function(g,i){if(g===i){h=true;return 0}if(!g.compareDocumentPosition||!i.compareDocumentPosition)return g.compareDocumentPosition?-1:1;return g.compareDocumentPosition(i)&4?-1:1};else{w=function(g,i){var n,m,p=[],q=[];n=g.parentNode;m=i.parentNode;var u=n;if(g===i){h=true;return 0}else if(n===m)return I(g,i);else if(n){if(!m)return 1}else return-1;
+for(;u;){p.unshift(u);u=u.parentNode}for(u=m;u;){q.unshift(u);u=u.parentNode}n=p.length;m=q.length;for(u=0;u<n&&u<m;u++)if(p[u]!==q[u])return I(p[u],q[u]);return u===n?I(g,q[u],-1):I(p[u],i,1)};I=function(g,i,n){if(g===i)return n;for(g=g.nextSibling;g;){if(g===i)return-1;g=g.nextSibling}return 1}}k.getText=function(g){for(var i="",n,m=0;g[m];m++){n=g[m];if(n.nodeType===3||n.nodeType===4)i+=n.nodeValue;else if(n.nodeType!==8)i+=k.getText(n.childNodes)}return i};(function(){var g=t.createElement("div"),
+i="script"+(new Date).getTime(),n=t.documentElement;g.innerHTML="<a name='"+i+"'/>";n.insertBefore(g,n.firstChild);if(t.getElementById(i)){o.find.ID=function(m,p,q){if(typeof p.getElementById!=="undefined"&&!q)return(p=p.getElementById(m[1]))?p.id===m[1]||typeof p.getAttributeNode!=="undefined"&&p.getAttributeNode("id").nodeValue===m[1]?[p]:B:[]};o.filter.ID=function(m,p){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===p}}n.removeChild(g);
+n=g=null})();(function(){var g=t.createElement("div");g.appendChild(t.createComment(""));if(g.getElementsByTagName("*").length>0)o.find.TAG=function(i,n){var m=n.getElementsByTagName(i[1]);if(i[1]==="*"){for(var p=[],q=0;m[q];q++)m[q].nodeType===1&&p.push(m[q]);m=p}return m};g.innerHTML="<a href='#'></a>";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")o.attrHandle.href=function(i){return i.getAttribute("href",2)};g=null})();t.querySelectorAll&&
+function(){var g=k,i=t.createElement("div");i.innerHTML="<p class='TEST'></p>";if(!(i.querySelectorAll&&i.querySelectorAll(".TEST").length===0)){k=function(m,p,q,u){p=p||t;m=m.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!u&&!k.isXML(p))if(p.nodeType===9)try{return C(p.querySelectorAll(m),q)}catch(y){}else if(p.nodeType===1&&p.nodeName.toLowerCase()!=="object"){var F=p.getAttribute("id"),M=F||"__sizzle__";F||p.setAttribute("id",M);try{return C(p.querySelectorAll("#"+M+" "+m),q)}catch(N){}finally{F||
+p.removeAttribute("id")}}return g(m,p,q,u)};for(var n in g)k[n]=g[n];i=null}}();(function(){var g=t.documentElement,i=g.matchesSelector||g.mozMatchesSelector||g.webkitMatchesSelector||g.msMatchesSelector,n=false;try{i.call(t.documentElement,"[test!='']:sizzle")}catch(m){n=true}if(i)k.matchesSelector=function(p,q){q=q.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(p))try{if(n||!o.match.PSEUDO.test(q)&&!/!=/.test(q))return i.call(p,q)}catch(u){}return k(q,null,null,[p]).length>0}})();(function(){var g=
+t.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){o.order.splice(1,0,"CLASS");o.find.CLASS=function(i,n,m){if(typeof n.getElementsByClassName!=="undefined"&&!m)return n.getElementsByClassName(i[1])};g=null}}})();k.contains=t.documentElement.contains?function(g,i){return g!==i&&(g.contains?g.contains(i):true)}:t.documentElement.compareDocumentPosition?
+function(g,i){return!!(g.compareDocumentPosition(i)&16)}:function(){return false};k.isXML=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false};var L=function(g,i){for(var n,m=[],p="",q=i.nodeType?[i]:i;n=o.match.PSEUDO.exec(g);){p+=n[0];g=g.replace(o.match.PSEUDO,"")}g=o.relative[g]?g+"*":g;n=0;for(var u=q.length;n<u;n++)k(g,q[n],m);return k.filter(p,m)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=k.getText;c.isXMLDoc=k.isXML;
+c.contains=k.contains})();var Za=/Until$/,$a=/^(?:parents|prevUntil|prevAll)/,ab=/,/,Na=/^.[^:#\[\.,]*$/,bb=Array.prototype.slice,cb=c.expr.match.POS;c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,e=0,f=this.length;e<f;e++){d=b.length;c.find(a,this[e],b);if(e>0)for(var h=d;h<b.length;h++)for(var l=0;l<d;l++)if(b[l]===b[h]){b.splice(h--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,e=b.length;d<e;d++)if(c.contains(this,b[d]))return true})},
+not:function(a){return this.pushStack(ma(this,a,false),"not",a)},filter:function(a){return this.pushStack(ma(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){var d=[],e,f,h=this[0];if(c.isArray(a)){var l,k={},o=1;if(h&&a.length){e=0;for(f=a.length;e<f;e++){l=a[e];k[l]||(k[l]=c.expr.match.POS.test(l)?c(l,b||this.context):l)}for(;h&&h.ownerDocument&&h!==b;){for(l in k){e=k[l];if(e.jquery?e.index(h)>-1:c(h).is(e))d.push({selector:l,elem:h,level:o})}h=
+h.parentNode;o++}}return d}l=cb.test(a)?c(a,b||this.context):null;e=0;for(f=this.length;e<f;e++)for(h=this[e];h;)if(l?l.index(h)>-1:c.find.matchesSelector(h,a)){d.push(h);break}else{h=h.parentNode;if(!h||!h.ownerDocument||h===b)break}d=d.length>1?c.unique(d):d;return this.pushStack(d,"closest",a)},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var d=typeof a==="string"?c(a,b||this.context):
+c.makeArray(a),e=c.merge(this.get(),d);return this.pushStack(!d[0]||!d[0].parentNode||d[0].parentNode.nodeType===11||!e[0]||!e[0].parentNode||e[0].parentNode.nodeType===11?e:c.unique(e))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,
+2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,
+b){c.fn[a]=function(d,e){var f=c.map(this,b,d);Za.test(a)||(e=d);if(e&&typeof e==="string")f=c.filter(e,f);f=this.length>1?c.unique(f):f;if((this.length>1||ab.test(e))&&$a.test(a))f=f.reverse();return this.pushStack(f,a,bb.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return b.length===1?c.find.matchesSelector(b[0],a)?[b[0]]:[]:c.find.matches(a,b)},dir:function(a,b,d){var e=[];for(a=a[b];a&&a.nodeType!==9&&(d===B||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&
+e.push(a);a=a[b]}return e},nth:function(a,b,d){b=b||1;for(var e=0;a;a=a[d])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var za=/ jQuery\d+="(?:\d+|null)"/g,$=/^\s+/,Aa=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Ba=/<([\w:]+)/,db=/<tbody/i,eb=/<|&#?\w+;/,Ca=/<(?:script|object|embed|option|style)/i,Da=/checked\s*(?:[^=]|=\s*.checked.)/i,fb=/\=([^="'>\s]+\/)>/g,P={option:[1,
+"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};P.optgroup=P.option;P.tbody=P.tfoot=P.colgroup=P.caption=P.thead;P.th=P.td;if(!c.support.htmlSerialize)P._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
+c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==B)return this.empty().append((this[0]&&this[0].ownerDocument||t).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
+wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
+prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
+this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,e;(e=this[d])!=null;d++)if(!a||c.filter(a,[e]).length){if(!b&&e.nodeType===1){c.cleanData(e.getElementsByTagName("*"));c.cleanData([e])}e.parentNode&&e.parentNode.removeChild(e)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
+return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,e=this.ownerDocument;if(!d){d=e.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(za,"").replace(fb,'="$1">').replace($,"")],e)[0]}else return this.cloneNode(true)});if(a===true){na(this,b);na(this.find("*"),b.find("*"))}return b},html:function(a){if(a===B)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(za,""):null;
+else if(typeof a==="string"&&!Ca.test(a)&&(c.support.leadingWhitespace||!$.test(a))&&!P[(Ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Aa,"<$1></$2>");try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(e){this.empty().append(a)}}else c.isFunction(a)?this.each(function(f){var h=c(this);h.html(a.call(this,f,h.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=
+c(this),e=d.html();d.replaceWith(a.call(this,b,e))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){var e,f,h,l=a[0],k=[];if(!c.support.checkClone&&arguments.length===3&&typeof l==="string"&&Da.test(l))return this.each(function(){c(this).domManip(a,
+b,d,true)});if(c.isFunction(l))return this.each(function(x){var r=c(this);a[0]=l.call(this,x,b?r.html():B);r.domManip(a,b,d)});if(this[0]){e=l&&l.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:c.buildFragment(a,this,k);h=e.fragment;if(f=h.childNodes.length===1?h=h.firstChild:h.firstChild){b=b&&c.nodeName(f,"tr");f=0;for(var o=this.length;f<o;f++)d.call(b?c.nodeName(this[f],"table")?this[f].getElementsByTagName("tbody")[0]||this[f].appendChild(this[f].ownerDocument.createElement("tbody")):
+this[f]:this[f],f>0||e.cacheable||this.length>1?h.cloneNode(true):h)}k.length&&c.each(k,Oa)}return this}});c.buildFragment=function(a,b,d){var e,f,h;b=b&&b[0]?b[0].ownerDocument||b[0]:t;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===t&&!Ca.test(a[0])&&(c.support.checkClone||!Da.test(a[0]))){f=true;if(h=c.fragments[a[0]])if(h!==1)e=h}if(!e){e=b.createDocumentFragment();c.clean(a,b,e,d)}if(f)c.fragments[a[0]]=h?e:1;return{fragment:e,cacheable:f}};c.fragments={};c.each({appendTo:"append",
+prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var e=[];d=c(d);var f=this.length===1&&this[0].parentNode;if(f&&f.nodeType===11&&f.childNodes.length===1&&d.length===1){d[b](this[0]);return this}else{f=0;for(var h=d.length;f<h;f++){var l=(f>0?this.clone(true):this).get();c(d[f])[b](l);e=e.concat(l)}return this.pushStack(e,a,d.selector)}}});c.extend({clean:function(a,b,d,e){b=b||t;if(typeof b.createElement==="undefined")b=b.ownerDocument||
+b[0]&&b[0].ownerDocument||t;for(var f=[],h=0,l;(l=a[h])!=null;h++){if(typeof l==="number")l+="";if(l){if(typeof l==="string"&&!eb.test(l))l=b.createTextNode(l);else if(typeof l==="string"){l=l.replace(Aa,"<$1></$2>");var k=(Ba.exec(l)||["",""])[1].toLowerCase(),o=P[k]||P._default,x=o[0],r=b.createElement("div");for(r.innerHTML=o[1]+l+o[2];x--;)r=r.lastChild;if(!c.support.tbody){x=db.test(l);k=k==="table"&&!x?r.firstChild&&r.firstChild.childNodes:o[1]==="<table>"&&!x?r.childNodes:[];for(o=k.length-
+1;o>=0;--o)c.nodeName(k[o],"tbody")&&!k[o].childNodes.length&&k[o].parentNode.removeChild(k[o])}!c.support.leadingWhitespace&&$.test(l)&&r.insertBefore(b.createTextNode($.exec(l)[0]),r.firstChild);l=r.childNodes}if(l.nodeType)f.push(l);else f=c.merge(f,l)}}if(d)for(h=0;f[h];h++)if(e&&c.nodeName(f[h],"script")&&(!f[h].type||f[h].type.toLowerCase()==="text/javascript"))e.push(f[h].parentNode?f[h].parentNode.removeChild(f[h]):f[h]);else{f[h].nodeType===1&&f.splice.apply(f,[h+1,0].concat(c.makeArray(f[h].getElementsByTagName("script"))));
+d.appendChild(f[h])}return f},cleanData:function(a){for(var b,d,e=c.cache,f=c.event.special,h=c.support.deleteExpando,l=0,k;(k=a[l])!=null;l++)if(!(k.nodeName&&c.noData[k.nodeName.toLowerCase()]))if(d=k[c.expando]){if((b=e[d])&&b.events)for(var o in b.events)f[o]?c.event.remove(k,o):c.removeEvent(k,o,b.handle);if(h)delete k[c.expando];else k.removeAttribute&&k.removeAttribute(c.expando);delete e[d]}}});var Ea=/alpha\([^)]*\)/i,gb=/opacity=([^)]*)/,hb=/-([a-z])/ig,ib=/([A-Z])/g,Fa=/^-?\d+(?:px)?$/i,
+jb=/^-?\d/,kb={position:"absolute",visibility:"hidden",display:"block"},Pa=["Left","Right"],Qa=["Top","Bottom"],W,Ga,aa,lb=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){if(arguments.length===2&&b===B)return this;return c.access(this,a,b,true,function(d,e,f){return f!==B?c.style(d,e,f):c.css(d,e)})};c.extend({cssHooks:{opacity:{get:function(a,b){if(b){var d=W(a,"opacity","opacity");return d===""?"1":d}else return a.style.opacity}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,
+zoom:true,lineHeight:true},cssProps:{"float":c.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,b,d,e){if(!(!a||a.nodeType===3||a.nodeType===8||!a.style)){var f,h=c.camelCase(b),l=a.style,k=c.cssHooks[h];b=c.cssProps[h]||h;if(d!==B){if(!(typeof d==="number"&&isNaN(d)||d==null)){if(typeof d==="number"&&!c.cssNumber[h])d+="px";if(!k||!("set"in k)||(d=k.set(a,d))!==B)try{l[b]=d}catch(o){}}}else{if(k&&"get"in k&&(f=k.get(a,false,e))!==B)return f;return l[b]}}},css:function(a,b,d){var e,f=c.camelCase(b),
+h=c.cssHooks[f];b=c.cssProps[f]||f;if(h&&"get"in h&&(e=h.get(a,true,d))!==B)return e;else if(W)return W(a,b,f)},swap:function(a,b,d){var e={},f;for(f in b){e[f]=a.style[f];a.style[f]=b[f]}d.call(a);for(f in b)a.style[f]=e[f]},camelCase:function(a){return a.replace(hb,lb)}});c.curCSS=c.css;c.each(["height","width"],function(a,b){c.cssHooks[b]={get:function(d,e,f){var h;if(e){if(d.offsetWidth!==0)h=oa(d,b,f);else c.swap(d,kb,function(){h=oa(d,b,f)});if(h<=0){h=W(d,b,b);if(h==="0px"&&aa)h=aa(d,b,b);
+if(h!=null)return h===""||h==="auto"?"0px":h}if(h<0||h==null){h=d.style[b];return h===""||h==="auto"?"0px":h}return typeof h==="string"?h:h+"px"}},set:function(d,e){if(Fa.test(e)){e=parseFloat(e);if(e>=0)return e+"px"}else return e}}});if(!c.support.opacity)c.cssHooks.opacity={get:function(a,b){return gb.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var d=a.style;d.zoom=1;var e=c.isNaN(b)?"":"alpha(opacity="+b*100+")",f=
+d.filter||"";d.filter=Ea.test(f)?f.replace(Ea,e):d.filter+" "+e}};if(t.defaultView&&t.defaultView.getComputedStyle)Ga=function(a,b,d){var e;d=d.replace(ib,"-$1").toLowerCase();if(!(b=a.ownerDocument.defaultView))return B;if(b=b.getComputedStyle(a,null)){e=b.getPropertyValue(d);if(e===""&&!c.contains(a.ownerDocument.documentElement,a))e=c.style(a,d)}return e};if(t.documentElement.currentStyle)aa=function(a,b){var d,e,f=a.currentStyle&&a.currentStyle[b],h=a.style;if(!Fa.test(f)&&jb.test(f)){d=h.left;
+e=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;h.left=b==="fontSize"?"1em":f||0;f=h.pixelLeft+"px";h.left=d;a.runtimeStyle.left=e}return f===""?"auto":f};W=Ga||aa;if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetHeight;return a.offsetWidth===0&&b===0||!c.support.reliableHiddenOffsets&&(a.style.display||c.css(a,"display"))==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var mb=c.now(),nb=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ob=/^(?:select|textarea)/i,pb=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,qb=/^(?:GET|HEAD)$/,Ra=/\[\]$/,T=/\=\?(&|$)/,ja=/\?/,rb=/([?&])_=[^&]*/,sb=/^(\w+:)?\/\/([^\/?#]+)/,tb=/%20/g,ub=/#.*$/,Ha=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!=="string"&&Ha)return Ha.apply(this,arguments);else if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var f=a.slice(e,a.length);a=a.slice(0,e)}e="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b===
+"object"){b=c.param(b,c.ajaxSettings.traditional);e="POST"}var h=this;c.ajax({url:a,type:e,dataType:"html",data:b,complete:function(l,k){if(k==="success"||k==="notmodified")h.html(f?c("<div>").append(l.responseText.replace(nb,"")).find(f):l.responseText);d&&h.each(d,[l.responseText,k,l])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&
+!this.disabled&&(this.checked||ob.test(this.nodeName)||pb.test(this.type))}).map(function(a,b){var d=c(this).val();return d==null?null:c.isArray(d)?c.map(d,function(e){return{name:b.name,value:e}}):{name:b.name,value:d}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:e})},
+getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,e){if(c.isFunction(b)){e=e||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:e})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return new E.XMLHttpRequest},accepts:{xml:"application/xml, text/xml",html:"text/html",
+script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},ajax:function(a){var b=c.extend(true,{},c.ajaxSettings,a),d,e,f,h=b.type.toUpperCase(),l=qb.test(h);b.url=b.url.replace(ub,"");b.context=a&&a.context!=null?a.context:b;if(b.data&&b.processData&&typeof b.data!=="string")b.data=c.param(b.data,b.traditional);if(b.dataType==="jsonp"){if(h==="GET")T.test(b.url)||(b.url+=(ja.test(b.url)?"&":"?")+(b.jsonp||"callback")+"=?");else if(!b.data||
+!T.test(b.data))b.data=(b.data?b.data+"&":"")+(b.jsonp||"callback")+"=?";b.dataType="json"}if(b.dataType==="json"&&(b.data&&T.test(b.data)||T.test(b.url))){d=b.jsonpCallback||"jsonp"+mb++;if(b.data)b.data=(b.data+"").replace(T,"="+d+"$1");b.url=b.url.replace(T,"="+d+"$1");b.dataType="script";var k=E[d];E[d]=function(m){if(c.isFunction(k))k(m);else{E[d]=B;try{delete E[d]}catch(p){}}f=m;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);r&&r.removeChild(A)}}if(b.dataType==="script"&&b.cache===null)b.cache=
+false;if(b.cache===false&&l){var o=c.now(),x=b.url.replace(rb,"$1_="+o);b.url=x+(x===b.url?(ja.test(b.url)?"&":"?")+"_="+o:"")}if(b.data&&l)b.url+=(ja.test(b.url)?"&":"?")+b.data;b.global&&c.active++===0&&c.event.trigger("ajaxStart");o=(o=sb.exec(b.url))&&(o[1]&&o[1].toLowerCase()!==location.protocol||o[2].toLowerCase()!==location.host);if(b.dataType==="script"&&h==="GET"&&o){var r=t.getElementsByTagName("head")[0]||t.documentElement,A=t.createElement("script");if(b.scriptCharset)A.charset=b.scriptCharset;
+A.src=b.url;if(!d){var C=false;A.onload=A.onreadystatechange=function(){if(!C&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){C=true;c.handleSuccess(b,w,e,f);c.handleComplete(b,w,e,f);A.onload=A.onreadystatechange=null;r&&A.parentNode&&r.removeChild(A)}}}r.insertBefore(A,r.firstChild);return B}var J=false,w=b.xhr();if(w){b.username?w.open(h,b.url,b.async,b.username,b.password):w.open(h,b.url,b.async);try{if(b.data!=null&&!l||a&&a.contentType)w.setRequestHeader("Content-Type",
+b.contentType);if(b.ifModified){c.lastModified[b.url]&&w.setRequestHeader("If-Modified-Since",c.lastModified[b.url]);c.etag[b.url]&&w.setRequestHeader("If-None-Match",c.etag[b.url])}o||w.setRequestHeader("X-Requested-With","XMLHttpRequest");w.setRequestHeader("Accept",b.dataType&&b.accepts[b.dataType]?b.accepts[b.dataType]+", */*; q=0.01":b.accepts._default)}catch(I){}if(b.beforeSend&&b.beforeSend.call(b.context,w,b)===false){b.global&&c.active--===1&&c.event.trigger("ajaxStop");w.abort();return false}b.global&&
+c.triggerGlobal(b,"ajaxSend",[w,b]);var L=w.onreadystatechange=function(m){if(!w||w.readyState===0||m==="abort"){J||c.handleComplete(b,w,e,f);J=true;if(w)w.onreadystatechange=c.noop}else if(!J&&w&&(w.readyState===4||m==="timeout")){J=true;w.onreadystatechange=c.noop;e=m==="timeout"?"timeout":!c.httpSuccess(w)?"error":b.ifModified&&c.httpNotModified(w,b.url)?"notmodified":"success";var p;if(e==="success")try{f=c.httpData(w,b.dataType,b)}catch(q){e="parsererror";p=q}if(e==="success"||e==="notmodified")d||
+c.handleSuccess(b,w,e,f);else c.handleError(b,w,e,p);d||c.handleComplete(b,w,e,f);m==="timeout"&&w.abort();if(b.async)w=null}};try{var g=w.abort;w.abort=function(){w&&Function.prototype.call.call(g,w);L("abort")}}catch(i){}b.async&&b.timeout>0&&setTimeout(function(){w&&!J&&L("timeout")},b.timeout);try{w.send(l||b.data==null?null:b.data)}catch(n){c.handleError(b,w,null,n);c.handleComplete(b,w,e,f)}b.async||L();return w}},param:function(a,b){var d=[],e=function(h,l){l=c.isFunction(l)?l():l;d[d.length]=
+encodeURIComponent(h)+"="+encodeURIComponent(l)};if(b===B)b=c.ajaxSettings.traditional;if(c.isArray(a)||a.jquery)c.each(a,function(){e(this.name,this.value)});else for(var f in a)da(f,a[f],b,e);return d.join("&").replace(tb,"+")}});c.extend({active:0,lastModified:{},etag:{},handleError:function(a,b,d,e){a.error&&a.error.call(a.context,b,d,e);a.global&&c.triggerGlobal(a,"ajaxError",[b,a,e])},handleSuccess:function(a,b,d,e){a.success&&a.success.call(a.context,e,d,b);a.global&&c.triggerGlobal(a,"ajaxSuccess",
+[b,a])},handleComplete:function(a,b,d){a.complete&&a.complete.call(a.context,b,d);a.global&&c.triggerGlobal(a,"ajaxComplete",[b,a]);a.global&&c.active--===1&&c.event.trigger("ajaxStop")},triggerGlobal:function(a,b,d){(a.context&&a.context.url==null?c(a.context):c.event).trigger(b,d)},httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),
+e=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(e)c.etag[b]=e;return a.status===304},httpData:function(a,b,d){var e=a.getResponseHeader("content-type")||"",f=b==="xml"||!b&&e.indexOf("xml")>=0;a=f?a.responseXML:a.responseText;f&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&e.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&e.indexOf("javascript")>=0)c.globalEval(a);return a}});
+if(E.ActiveXObject)c.ajaxSettings.xhr=function(){if(E.location.protocol!=="file:")try{return new E.XMLHttpRequest}catch(a){}try{return new E.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}};c.support.ajax=!!c.ajaxSettings.xhr();var ea={},vb=/^(?:toggle|show|hide)$/,wb=/^([+\-]=)?([\d+.\-]+)(.*)$/,ba,pa=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b,d){if(a||a===0)return this.animate(S("show",
+3),a,b,d);else{d=0;for(var e=this.length;d<e;d++){a=this[d];b=a.style.display;if(!c.data(a,"olddisplay")&&b==="none")b=a.style.display="";b===""&&c.css(a,"display")==="none"&&c.data(a,"olddisplay",qa(a.nodeName))}for(d=0;d<e;d++){a=this[d];b=a.style.display;if(b===""||b==="none")a.style.display=c.data(a,"olddisplay")||""}return this}},hide:function(a,b,d){if(a||a===0)return this.animate(S("hide",3),a,b,d);else{a=0;for(b=this.length;a<b;a++){d=c.css(this[a],"display");d!=="none"&&c.data(this[a],"olddisplay",
+d)}for(a=0;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b,d){var e=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||e?this.each(function(){var f=e?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(S("toggle",3),a,b,d);return this},fadeTo:function(a,b,d,e){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d,e)},animate:function(a,b,d,e){var f=c.speed(b,
+d,e);if(c.isEmptyObject(a))return this.each(f.complete);return this[f.queue===false?"each":"queue"](function(){var h=c.extend({},f),l,k=this.nodeType===1,o=k&&c(this).is(":hidden"),x=this;for(l in a){var r=c.camelCase(l);if(l!==r){a[r]=a[l];delete a[l];l=r}if(a[l]==="hide"&&o||a[l]==="show"&&!o)return h.complete.call(this);if(k&&(l==="height"||l==="width")){h.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(c.css(this,"display")==="inline"&&c.css(this,"float")==="none")if(c.support.inlineBlockNeedsLayout)if(qa(this.nodeName)===
+"inline")this.style.display="inline-block";else{this.style.display="inline";this.style.zoom=1}else this.style.display="inline-block"}if(c.isArray(a[l])){(h.specialEasing=h.specialEasing||{})[l]=a[l][1];a[l]=a[l][0]}}if(h.overflow!=null)this.style.overflow="hidden";h.curAnim=c.extend({},a);c.each(a,function(A,C){var J=new c.fx(x,h,A);if(vb.test(C))J[C==="toggle"?o?"show":"hide":C](a);else{var w=wb.exec(C),I=J.cur()||0;if(w){var L=parseFloat(w[2]),g=w[3]||"px";if(g!=="px"){c.style(x,A,(L||1)+g);I=(L||
+1)/J.cur()*I;c.style(x,A,I+g)}if(w[1])L=(w[1]==="-="?-1:1)*L+I;J.custom(I,L,g)}else J.custom(I,C,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var e=d.length-1;e>=0;e--)if(d[e].elem===this){b&&d[e](true);d.splice(e,1)}});b||this.dequeue();return this}});c.each({slideDown:S("show",1),slideUp:S("hide",1),slideToggle:S("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){c.fn[a]=function(d,e,f){return this.animate(b,
+d,e,f)}});c.extend({speed:function(a,b,d){var e=a&&typeof a==="object"?c.extend({},a):{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};e.duration=c.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in c.fx.speeds?c.fx.speeds[e.duration]:c.fx.speeds._default;e.old=e.complete;e.complete=function(){e.queue!==false&&c(this).dequeue();c.isFunction(e.old)&&e.old.call(this)};return e},easing:{linear:function(a,b,d,e){return d+e*a},swing:function(a,b,d,e){return(-Math.cos(a*
+Math.PI)/2+0.5)*e+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a=parseFloat(c.css(this.elem,this.prop));return a&&a>-1E4?a:0},custom:function(a,b,d){function e(l){return f.step(l)}
+var f=this,h=c.fx;this.startTime=c.now();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;e.elem=this.elem;if(e()&&c.timers.push(e)&&!ba)ba=setInterval(h.tick,h.interval)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;
+this.custom(this.cur(),0)},step:function(a){var b=c.now(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var e in this.options.curAnim)if(this.options.curAnim[e]!==true)d=false;if(d){if(this.options.overflow!=null&&!c.support.shrinkWrapBlocks){var f=this.elem,h=this.options;c.each(["","X","Y"],function(k,o){f.style["overflow"+o]=h.overflow[k]})}this.options.hide&&c(this.elem).hide();if(this.options.hide||
+this.options.show)for(var l in this.options.curAnim)c.style(this.elem,l,this.options.orig[l]);this.options.complete.call(this.elem)}return false}else{a=b-this.startTime;this.state=a/this.options.duration;b=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||b](this.state,a,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=
+c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},interval:13,stop:function(){clearInterval(ba);ba=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===
+b.elem}).length};var xb=/^t(?:able|d|h)$/i,Ia=/^(?:body|html)$/i;c.fn.offset="getBoundingClientRect"in t.documentElement?function(a){var b=this[0],d;if(a)return this.each(function(l){c.offset.setOffset(this,a,l)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);try{d=b.getBoundingClientRect()}catch(e){}var f=b.ownerDocument,h=f.documentElement;if(!d||!c.contains(h,b))return d||{top:0,left:0};b=f.body;f=fa(f);return{top:d.top+(f.pageYOffset||c.support.boxModel&&
+h.scrollTop||b.scrollTop)-(h.clientTop||b.clientTop||0),left:d.left+(f.pageXOffset||c.support.boxModel&&h.scrollLeft||b.scrollLeft)-(h.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(a)return this.each(function(x){c.offset.setOffset(this,a,x)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d,e=b.offsetParent,f=b.ownerDocument,h=f.documentElement,l=f.body;d=(f=f.defaultView)?f.getComputedStyle(b,null):b.currentStyle;
+for(var k=b.offsetTop,o=b.offsetLeft;(b=b.parentNode)&&b!==l&&b!==h;){if(c.offset.supportsFixedPosition&&d.position==="fixed")break;d=f?f.getComputedStyle(b,null):b.currentStyle;k-=b.scrollTop;o-=b.scrollLeft;if(b===e){k+=b.offsetTop;o+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&xb.test(b.nodeName))){k+=parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}e=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&d.overflow!=="visible"){k+=
+parseFloat(d.borderTopWidth)||0;o+=parseFloat(d.borderLeftWidth)||0}d=d}if(d.position==="relative"||d.position==="static"){k+=l.offsetTop;o+=l.offsetLeft}if(c.offset.supportsFixedPosition&&d.position==="fixed"){k+=Math.max(h.scrollTop,l.scrollTop);o+=Math.max(h.scrollLeft,l.scrollLeft)}return{top:k,left:o}};c.offset={initialize:function(){var a=t.body,b=t.createElement("div"),d,e,f,h=parseFloat(c.css(a,"marginTop"))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",
+height:"1px",visibility:"hidden"});b.innerHTML="<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>";a.insertBefore(b,a.firstChild);d=b.firstChild;e=d.firstChild;f=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=e.offsetTop!==5;this.doesAddBorderForTableAndCells=
+f.offsetTop===5;e.style.position="fixed";e.style.top="20px";this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15;e.style.position=e.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==h;a.removeChild(b);c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.css(a,
+"marginTop"))||0;d+=parseFloat(c.css(a,"marginLeft"))||0}return{top:b,left:d}},setOffset:function(a,b,d){var e=c.css(a,"position");if(e==="static")a.style.position="relative";var f=c(a),h=f.offset(),l=c.css(a,"top"),k=c.css(a,"left"),o=e==="absolute"&&c.inArray("auto",[l,k])>-1;e={};var x={};if(o)x=f.position();l=o?x.top:parseInt(l,10)||0;k=o?x.left:parseInt(k,10)||0;if(c.isFunction(b))b=b.call(a,d,h);if(b.top!=null)e.top=b.top-h.top+l;if(b.left!=null)e.left=b.left-h.left+k;"using"in b?b.using.call(a,
+e):f.css(e)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),e=Ia.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.css(a,"marginTop"))||0;d.left-=parseFloat(c.css(a,"marginLeft"))||0;e.top+=parseFloat(c.css(b[0],"borderTopWidth"))||0;e.left+=parseFloat(c.css(b[0],"borderLeftWidth"))||0;return{top:d.top-e.top,left:d.left-e.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||t.body;a&&!Ia.test(a.nodeName)&&
+c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(e){var f=this[0],h;if(!f)return null;if(e!==B)return this.each(function(){if(h=fa(this))h.scrollTo(!a?e:c(h).scrollLeft(),a?e:c(h).scrollTop());else this[d]=e});else return(h=fa(f))?"pageXOffset"in h?h[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&h.document.documentElement[d]||h.document.body[d]:f[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();
+c.fn["inner"+b]=function(){return this[0]?parseFloat(c.css(this[0],d,"padding")):null};c.fn["outer"+b]=function(e){return this[0]?parseFloat(c.css(this[0],d,e?"margin":"border")):null};c.fn[d]=function(e){var f=this[0];if(!f)return e==null?null:this;if(c.isFunction(e))return this.each(function(l){var k=c(this);k[d](e.call(this,l,k[d]()))});if(c.isWindow(f))return f.document.compatMode==="CSS1Compat"&&f.document.documentElement["client"+b]||f.document.body["client"+b];else if(f.nodeType===9)return Math.max(f.documentElement["client"+
+b],f.body["scroll"+b],f.documentElement["scroll"+b],f.body["offset"+b],f.documentElement["offset"+b]);else if(e===B){f=c.css(f,d);var h=parseFloat(f);return c.isNaN(h)?f:h}else return this.css(d,typeof e==="string"?e:e+"px")}})})(window);
diff --git a/lib/jquery.hotkeys-0.7.10.js b/lib/jquery.hotkeys-0.7.10.js
new file mode 100644 (file)
index 0000000..d0939fa
--- /dev/null
@@ -0,0 +1,99 @@
+/*
+ * jQuery Hotkeys Plugin
+ * Copyright 2010, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ * Based upon the plugin by Tzury Bar Yochay:
+ * https://github.com/tzuryby/jquery.hotkeys
+ *
+ * Original idea by:
+ * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
+*/
+
+(function(jQuery){
+       
+       jQuery.hotkeys = {
+               version: "0.8",
+
+               specialKeys: {
+                       8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
+                       20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
+                       37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", 
+                       96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
+                       104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", 
+                       112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", 
+                       120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
+               },
+       
+               shiftNums: {
+                       "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", 
+                       "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", 
+                       ".": ">",  "/": "?",  "\\": "|"
+               }
+       };
+
+       function keyHandler( handleObj ) {
+               // Only care when a possible input has been specified
+               if ( typeof handleObj.data !== "string" ) {
+                       return;
+               }
+               
+               var origHandler = handleObj.handler,
+                       keys = handleObj.data.toLowerCase().split(" ");
+       
+               handleObj.handler = function( event ) {
+                       // Don't fire in text-accepting inputs that we didn't directly bind to
+                       if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
+                                event.target.type === "text") ) {
+                               return;
+                       }
+                       
+                       // Keypress represents characters, not special keys
+                       var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
+                               character = String.fromCharCode( event.which ).toLowerCase(),
+                               key, modif = "", possible = {};
+
+                       // check combinations (alt|ctrl|shift+anything)
+                       if ( event.altKey && special !== "alt" ) {
+                               modif += "alt+";
+                       }
+
+                       if ( event.ctrlKey && special !== "ctrl" ) {
+                               modif += "ctrl+";
+                       }
+                       
+                       // TODO: Need to make sure this works consistently across platforms
+                       if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
+                               modif += "meta+";
+                       }
+
+                       if ( event.shiftKey && special !== "shift" ) {
+                               modif += "shift+";
+                       }
+
+                       if ( special ) {
+                               possible[ modif + special ] = true;
+
+                       } else {
+                               possible[ modif + character ] = true;
+                               possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
+
+                               // "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
+                               if ( modif === "shift+" ) {
+                                       possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
+                               }
+                       }
+
+                       for ( var i = 0, l = keys.length; i < l; i++ ) {
+                               if ( possible[ keys[i] ] ) {
+                                       return origHandler.apply( this, arguments );
+                               }
+                       }
+               };
+       }
+
+       jQuery.each([ "keydown", "keyup", "keypress" ], function() {
+               jQuery.event.special[ this ] = { add: keyHandler };
+       });
+
+})( jQuery );
\ No newline at end of file
deleted file mode 100644 (file)
index fbd71c71ec7ceed73a06f0e9447e46bc48b4e5e4..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * jQuery Hotkeys Plugin
- * Copyright 2010, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- *
- * Based upon the plugin by Tzury Bar Yochay:
- * http://github.com/tzuryby/hotkeys
- *
- * Original idea by:
- * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/
-*/
-
-(function(jQuery){
-       
-       jQuery.hotkeys = {
-               version: "0.8",
-
-               specialKeys: {
-                       8: "backspace", 9: "tab", 13: "return", 16: "shift", 17: "ctrl", 18: "alt", 19: "pause",
-                       20: "capslock", 27: "esc", 32: "space", 33: "pageup", 34: "pagedown", 35: "end", 36: "home",
-                       37: "left", 38: "up", 39: "right", 40: "down", 45: "insert", 46: "del", 
-                       96: "0", 97: "1", 98: "2", 99: "3", 100: "4", 101: "5", 102: "6", 103: "7",
-                       104: "8", 105: "9", 106: "*", 107: "+", 109: "-", 110: ".", 111 : "/", 
-                       112: "f1", 113: "f2", 114: "f3", 115: "f4", 116: "f5", 117: "f6", 118: "f7", 119: "f8", 
-                       120: "f9", 121: "f10", 122: "f11", 123: "f12", 144: "numlock", 145: "scroll", 191: "/", 224: "meta"
-               },
-       
-               shiftNums: {
-                       "`": "~", "1": "!", "2": "@", "3": "#", "4": "$", "5": "%", "6": "^", "7": "&", 
-                       "8": "*", "9": "(", "0": ")", "-": "_", "=": "+", ";": ": ", "'": "\"", ",": "<", 
-                       ".": ">",  "/": "?",  "\\": "|"
-               }
-       };
-
-       function keyHandler( handleObj ) {
-               // Only care when a possible input has been specified
-               if ( typeof handleObj.data !== "string" ) {
-                       return;
-               }
-               
-               var origHandler = handleObj.handler,
-                       keys = handleObj.data.toLowerCase().split(" ");
-       
-               handleObj.handler = function( event ) {
-                       // Don't fire in text-accepting inputs that we didn't directly bind to
-                       if ( this !== event.target && (/textarea|select/i.test( event.target.nodeName ) ||
-                                event.target.type === "text") ) {
-                               return;
-                       }
-                       
-                       // Keypress represents characters, not special keys
-                       var special = event.type !== "keypress" && jQuery.hotkeys.specialKeys[ event.which ],
-                               character = String.fromCharCode( event.which ).toLowerCase(),
-                               key, modif = "", possible = {};
-
-                       // check combinations (alt|ctrl|shift+anything)
-                       if ( event.altKey && special !== "alt" ) {
-                               modif += "alt+";
-                       }
-
-                       if ( event.ctrlKey && special !== "ctrl" ) {
-                               modif += "ctrl+";
-                       }
-                       
-                       // TODO: Need to make sure this works consistently across platforms
-                       if ( event.metaKey && !event.ctrlKey && special !== "meta" ) {
-                               modif += "meta+";
-                       }
-
-                       if ( event.shiftKey && special !== "shift" ) {
-                               modif += "shift+";
-                       }
-
-                       if ( special ) {
-                               possible[ modif + special ] = true;
-
-                       } else {
-                               possible[ modif + character ] = true;
-                               possible[ modif + jQuery.hotkeys.shiftNums[ character ] ] = true;
-
-                               // "$" can be triggered as "Shift+4" or "Shift+$" or just "$"
-                               if ( modif === "shift+" ) {
-                                       possible[ jQuery.hotkeys.shiftNums[ character ] ] = true;
-                               }
-                       }
-
-                       for ( var i = 0, l = keys.length; i < l; i++ ) {
-                               if ( possible[ keys[i] ] ) {
-                                       return origHandler.apply( this, arguments );
-                               }
-                       }
-               };
-       }
-
-       jQuery.each([ "keydown", "keyup", "keypress" ], function() {
-               jQuery.event.special[ this ] = { add: keyHandler };
-       });
-
-})( jQuery );
\ No newline at end of file
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..05c90b4506c0d3df04f1e001b673dd68bd33bc30
--- /dev/null
@@ -0,0 +1 @@
+jquery.hotkeys-0.7.10.js
\ No newline at end of file
index 0185856..0a17377 120000 (symlink)
@@ -1 +1 @@
-jquery-1.4.3.min.js
\ No newline at end of file
+jquery-1.4.4.js
\ No newline at end of file
diff --git a/lib/jquery.sparkline-1.5.1.js b/lib/jquery.sparkline-1.5.1.js
new file mode 100644 (file)
index 0000000..1c35b5f
--- /dev/null
@@ -0,0 +1,1050 @@
+/**
+*
+* jquery.sparkline.js
+*
+* v1.5.1
+* (c) Splunk, Inc 
+* Contact: Gareth Watts (gareth@splunk.com)
+* http://omnipotent.net/jquery.sparkline/
+*
+* Generates inline sparkline charts from data supplied either to the method
+* or inline in HTML
+* 
+* Compatible with Internet Explorer 6.0+ and modern browsers equipped with the canvas tag
+* (Firefox 2.0+, Safari, Opera, etc)
+*
+* License: New BSD License
+* 
+* Copyright (c) 2010, Splunk Inc.
+* All rights reserved.
+* 
+* Redistribution and use in source and binary forms, with or without modification, 
+* are permitted provided that the following conditions are met:
+* 
+*     * Redistributions of source code must retain the above copyright notice, 
+*       this list of conditions and the following disclaimer.
+*     * Redistributions in binary form must reproduce the above copyright notice, 
+*       this list of conditions and the following disclaimer in the documentation 
+*       and/or other materials provided with the distribution.
+*     * Neither the name of Splunk Inc nor the names of its contributors may 
+*       be used to endorse or promote products derived from this software without 
+*       specific prior written permission.
+* 
+* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
+* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
+* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
+* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
+* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
+* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
+* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
+* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+* 
+*
+* Usage: 
+*  $(selector).sparkline(values, options)
+*
+* If values is undefined or set to 'html' then the data values are read from the specified tag:
+*   <p>Sparkline: <span class="sparkline">1,4,6,6,8,5,3,5</span></p>
+*   $('.sparkline').sparkline();
+* There must be no spaces in the enclosed data set
+*
+* Otherwise values must be an array of numbers or null values
+*    <p>Sparkline: <span id="sparkline1">This text replaced if the browser is compatible</span></p>
+*    $('#sparkline1').sparkline([1,4,6,6,8,5,3,5])
+*    $('#sparkline2').sparkline([1,4,6,null,null,5,3,5])
+*
+* For line charts, x values can also be specified:
+*   <p>Sparkline: <span class="sparkline">1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5</span></p>
+*    $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ])
+*
+* Supported options:
+*   lineColor - Color of the line used for the chart
+*   fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart
+*   width - Width of the chart - Defaults to 3 times the number of values in pixels
+*   height - Height of the chart - Defaults to the height of the containing element
+*   chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied
+*   chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied
+*   chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax
+*   chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied
+*   chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied
+*   composite - If true then don't erase any existing chart attached to the tag, but draw
+*           another chart over the top - Note that width and height are ignored if an
+*           existing chart is detected.
+*
+* There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default),
+* 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box'
+*    line - Line chart.  Options:
+*       spotColor - Set to '' to not end each line in a circular spot
+*       minSpotColor - If set, color of spot at minimum value
+*       maxSpotColor - If set, color of spot at maximum value
+*       spotRadius - Radius in pixels
+*       lineWidth - Width of line in pixels
+*       normalRangeMin 
+*       normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal"
+*                      or expected range of values
+*       normalRangeColor - Color to use for the above bar
+*       defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart
+*
+*   bar - Bar chart.  Options:
+*       barColor - Color of bars for postive values
+*       negBarColor - Color of bars for negative values
+*       zeroColor - Color of bars with zero values
+*       nullColor - Color of bars with null values - Defaults to omitting the bar entirely
+*       barWidth - Width of bars in pixels
+*       colorMap - Optional mappnig of values to colors to override the *BarColor values above
+*                  can be an Array of values to control the color of individual bars
+*       barSpacing - Gap between bars in pixels
+*       zeroAxis - Centers the y-axis around zero if true
+*
+*   tristate - Charts values of win (>0), lose (<0) or draw (=0)
+*       posBarColor - Color of win values
+*       negBarColor - Color of lose values
+*       zeroBarColor - Color of draw values
+*       barWidth - Width of bars in pixels
+*       barSpacing - Gap between bars in pixels
+*       colorMap - Optional mappnig of values to colors to override the *BarColor values above
+*                  can be an Array of values to control the color of individual bars
+*
+*   discrete - Options:
+*       lineHeight - Height of each line in pixels - Defaults to 30% of the graph height
+*       thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor
+*       thresholdColor
+*
+*   bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ...
+*       options:
+*       targetColor - The color of the vertical target marker
+*       targetWidth - The width of the target marker in pixels
+*       performanceColor - The color of the performance measure horizontal bar
+*       rangeColors - Colors to use for each qualitative range background color
+*
+*   pie - Pie chart. Options:
+*       sliceColors - An array of colors to use for pie slices
+*       offset - Angle in degrees to offset the first slice - Try -90 or +90
+*
+*   box - Box plot. Options:
+*       raw - Set to true to supply pre-computed plot points as values
+*             values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier
+*             When set to false you can supply any number of values and the box plot will
+*             be computed for you.  Default is false.
+*       showOutliers - Set to true (default) to display outliers as circles
+*       outlierIRQ - Interquartile range used to determine outliers.  Default 1.5
+*       boxLineColor - Outline color of the box
+*       boxFillColor - Fill color for the box
+*       whiskerColor - Line color used for whiskers
+*       outlierLineColor - Outline color of outlier circles
+*       outlierFillColor - Fill color of the outlier circles
+*       spotRadius - Radius of outlier circles
+*       medianColor - Line color of the median line
+*       target - Draw a target cross hair at the supplied value (default undefined)
+*      
+*   
+*       
+*   Examples:
+*   $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false });
+*   $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 });
+*   $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }):
+*   $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' });
+*   $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' });
+*   $('#pie').sparkline([1,1,2], { type:'pie' });
+*/
+
+
+(function($) {
+
+    // Provide a cross-browser interface to a few simple drawing primitives
+    $.fn.simpledraw = function(width, height, use_existing) {
+        if (use_existing && this[0].vcanvas) return this[0].vcanvas;
+        if (width==undefined) width=$(this).innerWidth();
+        if (height==undefined) height=$(this).innerHeight();
+        if ($.browser.hasCanvas) {
+            return new vcanvas_canvas(width, height, this);
+        } else if ($.browser.msie) {
+            return new vcanvas_vml(width, height, this);
+        } else {
+            return false;
+        }
+    };
+
+    var pending = [];
+
+    $.fn.sparkline = function(uservalues, options) {
+        var options = $.extend({
+            type : 'line',
+            lineColor : '#00f',
+            fillColor : '#cdf',
+            defaultPixelsPerValue : 3,
+            width : 'auto', 
+            height : 'auto',
+            composite : false
+        }, options ? options : {});
+        
+        return this.each(function() {
+            var render = function() {
+                var values = (uservalues=='html' || uservalues==undefined) ? $(this).text().split(',') : uservalues;
+
+                var width = options.width=='auto' ? values.length*options.defaultPixelsPerValue : options.width;
+                if (options.height == 'auto') {
+                    if (!options.composite || !this.vcanvas) {
+                        // must be a better way to get the line height
+                        var tmp = document.createElement('span');
+                        tmp.innerHTML = 'a';
+                        $(this).html(tmp);
+                        height = $(tmp).innerHeight();
+                        $(tmp).remove();
+                    }
+                } else {
+                    height = options.height;
+                }
+
+                $.fn.sparkline[options.type].call(this, values, options, width, height);
+            }
+            // jQuery 1.3.0 completely changed the meaning of :hidden :-/
+            if (($(this).html() && $(this).is(':hidden')) || ($.fn.jquery < "1.3.0" && $(this).parents().is(':hidden'))) {
+                pending.push([this, render]);
+            } else {
+                render.call(this);
+            }
+        });
+    };
+
+
+    $.sparkline_display_visible = function() {
+        for (var i=pending.length-1; i>=0; i--) {
+            var el = pending[i][0];
+            if ($(el).is(':visible') && !$(el).parents().is(':hidden')) {
+                pending[i][1].call(el);
+                pending.splice(i, 1);
+            }
+        }
+    };
+
+    $.fn.sparkline.line = function(values, options, width, height) {
+        var options = $.extend({
+            spotColor : '#f80',
+            spotRadius : 1.5,
+            minSpotColor : '#f80',
+            maxSpotColor : '#f80',
+            lineWidth: 1, 
+            normalRangeMin : undefined,
+            normalRangeMax : undefined,
+            normalRangeColor : '#ccc',
+            chartRangeMin : undefined,
+            chartRangeMax : undefined,
+            chartRangeMinX : undefined,
+            chartRangeMaxX : undefined
+        }, options ? options : {});
+
+        var xvalues = [], yvalues = [], yminmax = [];
+        for (i=0; i<values.length; i++) {
+            var v = values[i];
+            var isstr = typeof(values[i])=='string';
+            var isarray = typeof(values[i])=='object' && values[i] instanceof Array;
+            var sp = isstr && values[i].split(':');
+            if (isstr && sp.length == 2) { // x:y
+                xvalues.push(Number(sp[0]));
+                yvalues.push(Number(sp[1]));
+                yminmax.push(Number(sp[1]));
+            } else if (isarray) {
+                xvalues.push(values[i][0]);
+                yvalues.push(values[i][1]);
+                yminmax.push(values[i][1]);
+            } else {
+                xvalues.push(i);
+                if (values[i]===null || values[i]=='null') {
+                    yvalues.push(null);
+                } else {
+                    yvalues.push(Number(values[i]));
+                    yminmax.push(Number(values[i]));
+                }
+            }
+        }
+        if (options.xvalues) {
+            xvalues = options.xvalues;
+        }
+
+        var maxy = Math.max.apply(Math, yminmax);
+        var maxyval = maxy;
+        var miny = Math.min.apply(Math, yminmax);
+        var minyval = miny;
+
+        var maxx = Math.max.apply(Math, xvalues);
+        var maxxval = maxx;
+        var minx = Math.min.apply(Math, xvalues);
+        var minxval = minx;
+
+        if (options.normalRangeMin!=undefined) {
+            if (options.normalRangeMin<miny)
+                miny = options.normalRangeMin;
+            if (options.normalRangeMax>maxy)
+                maxy = options.normalRangeMax;
+        }
+        if (options.chartRangeMin!=undefined && (options.chartRangeClip ||  options.chartRangeMin<miny)) {
+            miny = options.chartRangeMin;
+        }
+        if (options.chartRangeMax!=undefined && (options.chartRangeClip || options.chartRangeMax>maxy)) {
+            maxy = options.chartRangeMax;
+        }
+        if (options.chartRangeMinX!=undefined && (options.chartRangeClipX || options.chartRangeMinX<minx)) {
+            minx = options.chartRangeMinX;
+        }
+        if (options.chartRangeMaxX!=undefined && (options.chartRangeClipX || options.chartRangeMaxX>maxx)) {
+            maxx = options.chartRangeMaxX;
+        }
+        var rangex = maxx-minx == 0 ? 1 : maxx-minx;
+        var rangey = maxy-miny == 0 ? 1 : maxy-miny;
+        var vl = yvalues.length-1;
+
+        if (vl<1) {
+            this.innerHTML = '';
+            return;
+        }
+
+        var target = $(this).simpledraw(width, height, options.composite);
+        if (target) {
+            var canvas_width = target.pixel_width;
+            var canvas_height = target.pixel_height;
+            var canvas_top = 0;
+            var canvas_left = 0;
+
+            if (options.spotRadius && (canvas_width < (options.spotRadius*4) || canvas_height < (options.spotRadius*4))) {
+                options.spotRadius = 0;
+            }
+            if (options.spotRadius) {
+                // adjust the canvas size as required so that spots will fit
+                if (options.minSpotColor || (options.spotColor && yvalues[vl]==miny)) 
+                    canvas_height -= Math.ceil(options.spotRadius);
+                if (options.maxSpotColor || (options.spotColor && yvalues[vl]==maxy)) {
+                    canvas_height -= Math.ceil(options.spotRadius);
+                    canvas_top += Math.ceil(options.spotRadius);
+                }
+                if (options.minSpotColor || options.maxSpotColor && (yvalues[0]==miny || yvalues[0]==maxy)) {
+                    canvas_left += Math.ceil(options.spotRadius);
+                    canvas_width -= Math.ceil(options.spotRadius);
+                }
+                if (options.spotColor || (options.minSpotColor || options.maxSpotColor && (yvalues[vl]==miny||yvalues[vl]==maxy)))
+                    canvas_width -= Math.ceil(options.spotRadius);
+            }
+
+
+            canvas_height--;
+            if (options.normalRangeMin!=undefined) {
+                var ytop = canvas_top+Math.round(canvas_height-(canvas_height*((options.normalRangeMax-miny)/rangey)));
+                var height = Math.round((canvas_height*(options.normalRangeMax-options.normalRangeMin))/rangey);
+                target.drawRect(canvas_left, ytop, canvas_width, height, undefined, options.normalRangeColor);
+            }
+
+            var path = [];
+            var paths = [path];
+            for(var i=0, vlen=yvalues.length; i<vlen; i++) {
+                var x=xvalues[i], y=yvalues[i];
+                if (y===null) {
+                    if (i) {
+                        if (yvalues[i-1]!==null) {
+                            path = [];
+                            paths.push(path);
+                        }
+                    }
+                } else {
+                    if (y < miny) y=miny;
+                    if (y > maxy) y=maxy;
+                    if (!path.length) {
+                        // previous value was null
+                        path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)), canvas_top+canvas_height]);
+                    }
+                    path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)), canvas_top+Math.round(canvas_height-(canvas_height*((y-miny)/rangey)))]);
+                }
+            }
+            for(var i=0, plen=paths.length; i<plen; i++) {
+                path = paths[i];
+                if (!path.length)
+                    continue; // last value was null
+                if (options.fillColor) {
+                    path.push([path[path.length-1][0], canvas_top+canvas_height-1]);
+                    target.drawShape(path, undefined, options.fillColor);
+                    path.pop();
+                }
+                // if there's only a single point in this path, then we want to display it as a vertical line
+                // which means we keep path[0]  as is
+                if (path.length>2) {
+                    // else we want the first value 
+                    path[0] = [ path[0][0], path[1][1] ];
+                }
+                target.drawShape(path, options.lineColor, undefined, options.lineWidth);
+            }
+            if (options.spotRadius && options.spotColor) {
+                target.drawCircle(canvas_left+Math.round(xvalues[xvalues.length-1]*(canvas_width/rangex)),  canvas_top+Math.round(canvas_height-(canvas_height*((yvalues[vl]-miny)/rangey))), options.spotRadius, undefined, options.spotColor);
+            }
+            if (maxy!=minyval) {
+                if (options.spotRadius && options.minSpotColor) {
+                    var x = xvalues[yvalues.indexOf(minyval)];
+                    target.drawCircle(canvas_left+Math.round((x-minx)*(canvas_width/rangex)),  canvas_top+Math.round(canvas_height-(canvas_height*((minyval-miny)/rangey))), options.spotRadius, undefined, options.minSpotColor);
+                }
+                if (options.spotRadius && options.maxSpotColor) {
+                    var x = xvalues[yvalues.indexOf(maxyval)];
+                    target.drawCircle(canvas_left+Math.round((x-minx)*(canvas_width/rangex)),  canvas_top+Math.round(canvas_height-(canvas_height*((maxyval-miny)/rangey))), options.spotRadius, undefined, options.maxSpotColor);
+                }
+            }
+        } else {
+            // Remove the tag contents if sparklines aren't supported
+            this.innerHTML = '';
+        }
+    };
+
+    $.fn.sparkline.bar = function(values, options, width, height) {
+        var options = $.extend({
+            type : 'bar',
+            barColor : '#00f',
+            negBarColor : '#f44',
+            zeroColor: undefined,
+            nullColor: undefined,
+            zeroAxis : undefined,
+            barWidth : 4,
+            barSpacing : 1,
+            chartRangeMax: undefined,
+            chartRangeMin: undefined,
+            chartRangeClip: false,
+            colorMap : undefined
+        }, options ? options : {});
+
+        var width = (values.length * options.barWidth) + ((values.length-1) * options.barSpacing);
+        var num_values = [];
+        for(var i=0, vlen=values.length; i<vlen; i++) {
+            if (values[i]=='null' || values[i]===null) {
+                values[i] = null;
+            } else {
+                values[i] = Number(values[i]);
+                num_values.push(Number(values[i]));
+            }
+        }
+        var max = Math.max.apply(Math, num_values);
+        var min = Math.min.apply(Math, num_values);
+        if (options.chartRangeMin!=undefined && (options.chartRangeClip || options.chartRangeMin<min)) {
+            min = options.chartRangeMin;
+        }
+        if (options.chartRangeMax!=undefined && (options.chartRangeClip || options.chartRangeMax>max)) {
+            max = options.chartRangeMax;
+        }
+        if (options.zeroAxis == undefined) options.zeroAxis = min<0;
+        var range = max-min == 0 ? 1 : max-min;
+
+        if ($.isArray(options.colorMap)) {
+            var colorMapByIndex = options.colorMap;
+            var colorMapByValue = null;
+        } else {
+            var colorMapByIndex = null;
+            var colorMapByValue = options.colorMap;
+        }
+
+        var target = $(this).simpledraw(width, height, options.composite);
+        if (target) {
+            var canvas_width = target.pixel_width;
+            var canvas_height = target.pixel_height;
+            var yzero = min<0 && options.zeroAxis ? canvas_height-Math.round(canvas_height * (Math.abs(min)/range))-1 : canvas_height-1;
+
+            for(var i=0, vlen=values.length; i<vlen; i++) {
+                var x = i*(options.barWidth+options.barSpacing);
+                var val = values[i];
+                if (val===null) {
+                    if (options.nullColor) {
+                        color = options.nullColor;
+                        val = (options.zeroAxis && min<0) ? 0 : min;
+                        var height = 1;
+                        var y = (options.zeroAxis && min<0) ? yzero : canvas_height - height;
+                    } else {
+                        continue;
+                    }
+                } else {
+                    if (val < min) val=min;
+                    if (val > max) val=max;
+                    var color = (val < 0) ? options.negBarColor : options.barColor;
+                    if (options.zeroAxis && min<0) {
+                        var height = Math.round(canvas_height*((Math.abs(val)/range)))+1;
+                        var y = (val < 0) ? yzero : yzero-height;
+                    } else {
+                        var height = Math.round(canvas_height*((val-min)/range))+1;
+                        var y = canvas_height-height;
+                    }
+                    if (val==0 && options.zeroColor!=undefined) {
+                        color = options.zeroColor;
+                    }
+                    if (colorMapByValue && colorMapByValue[val]) {
+                        color = colorMapByValue[val];
+                    } else if (colorMapByIndex && colorMapByIndex.length>i) {
+                        color = colorMapByIndex[i];
+                    }
+                    if (color===null) {
+                        continue;
+                    }
+                }
+                target.drawRect(x, y, options.barWidth-1, height-1, color, color);
+            }
+        } else {
+            // Remove the tag contents if sparklines aren't supported
+            this.innerHTML = '';
+        }
+    };
+
+    $.fn.sparkline.tristate = function(values, options, width, height) {
+        values = $.map(values, Number);
+        var options = $.extend({
+            barWidth : 4,
+            barSpacing : 1,
+            posBarColor: '#6f6',
+            negBarColor : '#f44',
+            zeroBarColor : '#999',
+            colorMap : {}
+        }, options);
+
+        var width = (values.length * options.barWidth) + ((values.length-1) * options.barSpacing);
+
+        if ($.isArray(options.colorMap)) {
+            var colorMapByIndex = options.colorMap;
+            var colorMapByValue = null;
+        } else {
+            var colorMapByIndex = null;
+            var colorMapByValue = options.colorMap;
+        }
+
+        var target = $(this).simpledraw(width, height, options.composite);
+        if (target) {
+            var canvas_width = target.pixel_width;
+            var canvas_height = target.pixel_height;
+            var half_height = Math.round(canvas_height/2);
+
+            for(var i=0, vlen=values.length; i<vlen; i++) {
+                var x = i*(options.barWidth+options.barSpacing);
+                if (values[i] < 0) {
+                    var y = half_height;
+                    var height = half_height-1;
+                    var color = options.negBarColor;
+                } else if (values[i] > 0) {
+                    var y = 0;
+                    var height = half_height-1;
+                    var color = options.posBarColor;
+                } else {
+                    var y = half_height-1;
+                    var height = 2;
+                    var color = options.zeroBarColor;
+                }
+                if (colorMapByValue && colorMapByValue[values[i]]) {
+                    color = colorMapByValue[values[i]];
+                } else if (colorMapByIndex && colorMapByIndex.length>i) {
+                    color = colorMapByIndex[i];
+                }
+                if (color===null) {
+                    continue;
+                }
+                target.drawRect(x, y, options.barWidth-1, height-1, color, color);
+            }
+        } else {
+            // Remove the tag contents if sparklines aren't supported
+            this.innerHTML = '';
+        }
+    };
+
+    $.fn.sparkline.discrete = function(values, options, width, height) {
+        values = $.map(values, Number);
+        var options = $.extend({
+            lineHeight: 'auto',
+            thresholdColor: undefined,
+            thresholdValue : 0,
+            chartRangeMax: undefined,
+            chartRangeMin: undefined,
+            chartRangeClip: false
+        }, options);
+
+        width = options.width=='auto' ? values.length*2 : width;
+        var interval = Math.floor(width / values.length);
+
+        var target = $(this).simpledraw(width, height, options.composite);
+        if (target) {
+            var canvas_width = target.pixel_width;
+            var canvas_height = target.pixel_height;
+            var line_height = options.lineHeight == 'auto' ? Math.round(canvas_height * 0.3) : options.lineHeight;
+            var pheight = canvas_height - line_height;
+            var min = Math.min.apply(Math, values);
+            var max = Math.max.apply(Math, values);
+            if (options.chartRangeMin!=undefined && (options.chartRangeClip || options.chartRangeMin<min)) {
+                min = options.chartRangeMin;
+            }
+            if (options.chartRangeMax!=undefined && (options.chartRangeClip  || options.chartRangeMax>max)) {
+                max = options.chartRangeMax;
+            }
+            var range = max-min;
+
+            for(var i=0, vlen=values.length; i<vlen; i++) {
+                var val = values[i];
+                if (val < min) val=min;
+                if (val > max) val=max;
+                var x = (i*interval);
+                var ytop = Math.round(pheight-pheight*((val-min)/range));
+                target.drawLine(x, ytop, x, ytop+line_height, (options.thresholdColor && val < options.thresholdValue) ? options.thresholdColor : options.lineColor);
+            }
+        }  else {
+            // Remove the tag contents if sparklines aren't supported
+            this.innerHTML = '';
+        }
+                
+    };
+
+    $.fn.sparkline.bullet = function(values, options, width, height) {
+        values = $.map(values, Number);
+        // target, performance, range1, range2, range3
+        var options = $.extend({
+            targetColor : 'red',
+            targetWidth : 3, // width of the target bar in pixels
+            performanceColor : 'blue',
+            rangeColors : ['#D3DAFE', '#A8B6FF', '#7F94FF' ],
+            base : undefined // set this to a number to change the base start number
+        }, options);
+
+        
+        width = options.width=='auto' ? '4.0em' : width;
+
+        var target = $(this).simpledraw(width, height, options.composite);
+        if (target && values.length>1) {
+            var canvas_width = target.pixel_width-Math.ceil(options.targetWidth/2);
+            var canvas_height = target.pixel_height;
+
+            var min = Math.min.apply(Math, values);
+            var max = Math.max.apply(Math, values);
+            if (options.base == undefined) {
+                var min = min < 0 ? min : 0;
+            } else {
+                min = options.base;
+            }
+            var range = max-min;
+
+            // draw range values
+            for(i=2, vlen=values.length; i<vlen; i++) {
+                var rangeval = parseInt(values[i]);
+                var rangewidth = Math.round(canvas_width*((rangeval-min)/range));
+                target.drawRect(0, 0, rangewidth-1, canvas_height-1, options.rangeColors[i-2], options.rangeColors[i-2]);
+            }
+
+            // draw the performance bar
+            var perfval = parseInt(values[1]);
+            var perfwidth = Math.round(canvas_width*((perfval-min)/range));
+            target.drawRect(0, Math.round(canvas_height*0.3), perfwidth-1, Math.round(canvas_height*0.4)-1, options.performanceColor, options.performanceColor);
+
+            // draw the target linej
+            var targetval = parseInt(values[0]);
+            var x = Math.round(canvas_width*((targetval-min)/range)-(options.targetWidth/2));
+            var targettop = Math.round(canvas_height*0.10);
+            var targetheight = canvas_height-(targettop*2);
+            target.drawRect(x, targettop, options.targetWidth-1, targetheight-1, options.targetColor, options.targetColor);
+        }  else {
+            // Remove the tag contents if sparklines aren't supported
+            this.innerHTML = '';
+        }
+    };
+
+    $.fn.sparkline.pie = function(values, options, width, height) {
+        values = $.map(values, Number);
+        var options = $.extend({
+            sliceColors : ['#f00', '#0f0', '#00f']
+        }, options);
+
+        width = options.width=='auto' ? height : width;
+
+        var target = $(this).simpledraw(width, height, options.composite);
+        if (target && values.length>1) {
+            var canvas_width = target.pixel_width;
+            var canvas_height = target.pixel_height;
+                
+            var radius = Math.floor(Math.min(canvas_width, canvas_height)/2);
+            var total = 0;
+            for(var i=0, vlen=values.length; i<vlen; i++)
+                total += values[i];
+            var next = 0;
+            if (options.offset) {
+                next += (2*Math.PI)*(options.offset/360);
+            }
+            var circle = 2*Math.PI;
+            for(var i=0, vlen=values.length; i<vlen; i++) {
+                var start = next;
+                var end = next;
+                if (total > 0) {  // avoid divide by zero
+                    end = next + (circle*(values[i]/total));
+                }
+                target.drawPieSlice(radius, radius, radius, start, end, undefined, options.sliceColors[i % options.sliceColors.length]);
+                next = end;
+            }
+        }
+    };
+
+    function quartile(values, q) {
+        if (q==2) {
+            var vl2 = Math.floor(values.length/2);
+            return values.length % 2 ? values[vl2] : (values[vl2]+values[vl2+1])/2;
+        } else {
+            var vl4 = Math.floor(values.length/4);
+            return values.length % 2 ? (values[vl4*q]+values[vl4*q+1])/2 : values[vl4*q];
+        }
+    };
+
+    $.fn.sparkline.box = function(values, options, width, height) {
+        values = $.map(values, Number);
+        var options = $.extend({
+            raw: false,
+            boxLineColor: 'black',
+            boxFillColor: '#cdf',
+            whiskerColor: 'black',
+            outlierLineColor: '#333',
+            outlierFillColor: 'white',
+            medianColor: 'red',
+            showOutliers: true,
+            outlierIQR: 1.5,
+            spotRadius: 1.5,
+            target: undefined,
+            targetColor: '#4a2',
+            chartRangeMax: undefined,
+            chartRangeMin: undefined
+        }, options);
+
+        width = options.width=='auto' ? '4.0em' : width;
+
+        minvalue = options.chartRangeMin==undefined ? Math.min.apply(Math, values) : options.chartRangeMin;
+        maxvalue = options.chartRangeMax==undefined ? Math.max.apply(Math, values) : options.chartRangeMax;
+        var target = $(this).simpledraw(width, height, options.composite);
+        if (target && values.length>1) {
+            var canvas_width = target.pixel_width;
+            var canvas_height = target.pixel_height;
+            if (options.raw) {
+                if (options.showOutliers && values.length>5) {
+                    var loutlier=values[0], lwhisker=values[1], q1=values[2], q2=values[3], q3=values[4], rwhisker=values[5], routlier=values[6];
+                } else {
+                    var lwhisker=values[0], q1=values[1], q2=values[2], q3=values[3], rwhisker=values[4];
+                }
+            } else {
+                values.sort(function(a, b) { return a-b; });
+                var q1 = quartile(values, 1);
+                var q2 = quartile(values, 2);
+                var q3 = quartile(values, 3);
+                var iqr = q3-q1;
+                if (options.showOutliers) {
+                    var lwhisker=undefined, rwhisker=undefined;
+                    for(var i=0, vlen=values.length; i<vlen; i++) {
+                        if (lwhisker==undefined && values[i] > q1-(iqr*options.outlierIQR))
+                            lwhisker = values[i];
+                        if (values[i] < q3+(iqr*options.outlierIQR))
+                            rwhisker = values[i];
+                    }
+                    var loutlier = values[0];
+                    var routlier = values[values.length-1];
+                } else {
+                    var lwhisker = values[0];
+                    var rwhisker = values[values.length-1];
+                }
+            }
+
+            var unitsize = canvas_width / (maxvalue-minvalue+1);
+            var canvas_left = 0;
+            if (options.showOutliers) {
+                canvas_left = Math.ceil(options.spotRadius);
+                canvas_width -= 2*Math.ceil(options.spotRadius);
+                var unitsize = canvas_width / (maxvalue-minvalue+1);
+                if (loutlier < lwhisker)
+                    target.drawCircle((loutlier-minvalue)*unitsize+canvas_left, canvas_height/2, options.spotRadius, options.outlierLineColor, options.outlierFillColor);
+                if (routlier > rwhisker)
+                    target.drawCircle((routlier-minvalue)*unitsize+canvas_left, canvas_height/2, options.spotRadius, options.outlierLineColor, options.outlierFillColor);
+            }
+
+            // box
+            target.drawRect(
+                Math.round((q1-minvalue)*unitsize+canvas_left),
+                Math.round(canvas_height*0.1),
+                Math.round((q3-q1)*unitsize), 
+                Math.round(canvas_height*0.8), 
+                options.boxLineColor, 
+                options.boxFillColor);
+            // left whisker
+            target.drawLine(
+                Math.round((lwhisker-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height/2), 
+                Math.round((q1-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height/2), 
+                options.lineColor);
+            target.drawLine(
+                Math.round((lwhisker-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height/4), 
+                Math.round((lwhisker-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height-canvas_height/4), 
+                options.whiskerColor);
+            // right whisker
+            target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height/2), 
+                Math.round((q3-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height/2), 
+                options.lineColor);
+            target.drawLine(
+                Math.round((rwhisker-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height/4), 
+                Math.round((rwhisker-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height-canvas_height/4), 
+                options.whiskerColor);
+            // median line
+            target.drawLine(
+                Math.round((q2-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height*0.1),
+                Math.round((q2-minvalue)*unitsize+canvas_left), 
+                Math.round(canvas_height*0.9),
+                options.medianColor);
+            if (options.target) {
+                var size = Math.ceil(options.spotRadius);
+                target.drawLine(
+                    Math.round((options.target-minvalue)*unitsize+canvas_left), 
+                    Math.round((canvas_height/2)-size), 
+                    Math.round((options.target-minvalue)*unitsize+canvas_left), 
+                    Math.round((canvas_height/2)+size), 
+                    options.targetColor);
+                target.drawLine(
+                    Math.round((options.target-minvalue)*unitsize+canvas_left-size), 
+                    Math.round(canvas_height/2), 
+                    Math.round((options.target-minvalue)*unitsize+canvas_left+size), 
+                    Math.round(canvas_height/2), 
+                    options.targetColor);
+            }
+        }  else {
+            // Remove the tag contents if sparklines aren't supported
+            this.innerHTML = '';
+        }
+    };
+
+
+    // IE doesn't provide an indexOf method for arrays :-(
+    if (!Array.prototype.indexOf) {
+        Array.prototype.indexOf = function(entry) {
+            for(var i=0, vlen=this.length; i<vlen; i++) {
+                if (this[i] == entry)
+                    return i;
+            }
+            return -1;
+        }
+    }
+
+    // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier
+    // This is accessible as $(foo).simpledraw()
+
+    if ($.browser.msie && !document.namespaces['v']) {
+        document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML');
+    }
+
+    if ($.browser.hasCanvas == undefined) {
+        var t = document.createElement('canvas');
+        $.browser.hasCanvas = t.getContext!=undefined;
+    }
+
+    var vcanvas_base = function(width, height, target) {
+    };
+
+    vcanvas_base.prototype = {
+        init : function(width, height, target) {
+            this.width = width;
+            this.height = height;
+            this.target = target;
+            if (target[0]) target=target[0];
+            target.vcanvas = this;
+        },
+
+        drawShape : function(path, lineColor, fillColor, lineWidth) {
+            alert('drawShape not implemented');
+        },
+
+        drawLine : function(x1, y1, x2, y2, lineColor, lineWidth) {
+            return this.drawShape([ [x1,y1], [x2,y2] ], lineColor, lineWidth);
+        },
+
+        drawCircle : function(x, y, radius, lineColor, fillColor) {
+            alert('drawCircle not implemented');
+        },
+
+        drawPieSlice : function(x, y, radius, startAngle, endAngle, lineColor, fillColor) {
+            alert('drawPieSlice not implemented');
+        },
+
+        drawRect : function(x, y, width, height, lineColor, fillColor) {
+            alert('drawRect not implemented');
+        },
+
+        getElement : function() {
+            return this.canvas;
+        },
+
+        _insert : function(el, target) {
+            $(target).html(el);
+        }
+    };
+
+    var vcanvas_canvas = function(width, height, target) {
+        return this.init(width, height, target);
+    };
+
+    vcanvas_canvas.prototype = $.extend(new vcanvas_base, {
+        _super : vcanvas_base.prototype,
+
+        init : function(width, height, target) {
+            this._super.init(width, height, target);
+            this.canvas = document.createElement('canvas');
+            if (target[0]) target=target[0];
+            target.vcanvas = this;
+            $(this.canvas).css({ display:'inline-block', width:width, height:height, verticalAlign:'top' });
+            this._insert(this.canvas, target);
+            this.pixel_height = $(this.canvas).height();
+            this.pixel_width = $(this.canvas).width();
+            this.canvas.width = this.pixel_width;
+            this.canvas.height = this.pixel_height;
+            $(this.canvas).css({width: this.pixel_width, height: this.pixel_height});
+        },
+
+        _getContext : function(lineColor, fillColor, lineWidth) {
+            var context = this.canvas.getContext('2d');
+            if (lineColor != undefined)
+                context.strokeStyle = lineColor;
+            context.lineWidth = lineWidth==undefined ? 1 : lineWidth;
+            if (fillColor != undefined)
+                context.fillStyle = fillColor;
+            return context;
+        },
+
+        drawShape : function(path, lineColor, fillColor, lineWidth) {
+            var context = this._getContext(lineColor, fillColor, lineWidth);
+            context.beginPath();
+            context.moveTo(path[0][0]+0.5, path[0][1]+0.5);
+            for(var i=1, plen=path.length; i<plen; i++) {
+                context.lineTo(path[i][0]+0.5, path[i][1]+0.5); // the 0.5 offset gives us crisp pixel-width lines
+            }
+            if (lineColor != undefined) {
+                context.stroke();
+            }
+            if (fillColor != undefined) {
+                context.fill();
+            }
+        },
+
+        drawCircle : function(x, y, radius, lineColor, fillColor) {
+            var context = this._getContext(lineColor, fillColor);
+            context.beginPath();
+            context.arc(x, y, radius, 0, 2*Math.PI, false);
+            if (lineColor != undefined) {
+                context.stroke();
+            }
+            if (fillColor != undefined) {
+                context.fill();
+            }
+        }, 
+
+        drawPieSlice : function(x, y, radius, startAngle, endAngle, lineColor, fillColor) {
+            var context = this._getContext(lineColor, fillColor);
+            context.beginPath();
+            context.moveTo(x, y);
+            context.arc(x, y, radius, startAngle, endAngle, false);
+            context.lineTo(x, y);
+            context.closePath();
+            if (lineColor != undefined) {
+                context.stroke();
+            }
+            if (fillColor) {
+                context.fill();
+            }
+        },
+
+        drawRect : function(x, y, width, height, lineColor, fillColor) {
+            return this.drawShape([ [x,y], [x+width, y], [x+width, y+height], [x, y+height], [x, y] ], lineColor, fillColor);
+        }
+        
+    });
+
+    var vcanvas_vml = function(width, height, target) {
+        return this.init(width, height, target);
+    };
+
+    vcanvas_vml.prototype = $.extend(new vcanvas_base, {
+        _super : vcanvas_base.prototype,
+
+        init : function(width, height, target) {
+            this._super.init(width, height, target);
+            if (target[0]) target=target[0];
+            target.vcanvas = this;
+            this.canvas = document.createElement('span');
+            $(this.canvas).css({ display:'inline-block', position: 'relative', overflow:'hidden', width:width, height:height, margin:'0px', padding:'0px', verticalAlign: 'top'});
+            this._insert(this.canvas, target);
+            this.pixel_height = $(this.canvas).height();
+            this.pixel_width = $(this.canvas).width();
+            this.canvas.width = this.pixel_width;
+            this.canvas.height = this.pixel_height;;
+            var groupel = '<v:group coordorigin="0 0" coordsize="'+this.pixel_width+' '+this.pixel_height+'"'
+                    +' style="position:absolute;top:0;left:0;width:'+this.pixel_width+'px;height='+this.pixel_height+'px;"></v:group>';
+            this.canvas.insertAdjacentHTML('beforeEnd', groupel);
+            this.group = $(this.canvas).children()[0];
+        },
+
+        drawShape : function(path, lineColor, fillColor, lineWidth) {
+            var vpath = [];
+            for(var i=0, plen=path.length; i<plen; i++) {
+                vpath[i] = ''+(path[i][0])+','+(path[i][1]);
+            }
+            var initial = vpath.splice(0,1);
+            lineWidth = lineWidth == undefined ? 1 : lineWidth;
+            var stroke = lineColor == undefined ? ' stroked="false" ' : ' strokeWeight="'+lineWidth+'" strokeColor="'+lineColor+'" ';
+            var fill = fillColor == undefined ? ' filled="false"' : ' fillColor="'+fillColor+'" filled="true" ';
+            var closed = vpath[0] == vpath[vpath.length-1] ? 'x ' : '';
+            var vel = '<v:shape coordorigin="0 0" coordsize="'+this.pixel_width+' '+this.pixel_height+'" '
+                + stroke
+                + fill
+                +' style="position:absolute;left:0px;top:0px;height:'+this.pixel_height+'px;width:'+this.pixel_width+'px;padding:0px;margin:0px;" '
+                +' path="m '+initial+' l '+vpath.join(', ')+' '+closed+'e">'
+                +' </v:shape>';
+             this.group.insertAdjacentHTML('beforeEnd', vel);
+        },
+
+        drawCircle : function(x, y, radius, lineColor, fillColor) {
+            x -= radius+1;
+            y -= radius+1;
+            var stroke = lineColor == undefined ? ' stroked="false" ' : ' strokeWeight="1" strokeColor="'+lineColor+'" ';
+            var fill = fillColor == undefined ? ' filled="false"' : ' fillColor="'+fillColor+'" filled="true" ';
+            var vel = '<v:oval '
+                + stroke
+                + fill
+                +' style="position:absolute;top:'+y+'px; left:'+x+'px; width:'+(radius*2)+'px; height:'+(radius*2)+'px"></v:oval>';
+            this.group.insertAdjacentHTML('beforeEnd', vel);
+            
+        },
+        
+        drawPieSlice : function(x, y, radius, startAngle, endAngle, lineColor, fillColor) {
+            if (startAngle == endAngle) {
+                return;  // VML seems to have problem when start angle equals end angle.
+            }
+            if ((endAngle - startAngle) == (2*Math.PI)) {
+                startAngle = 0.0;  // VML seems to have a problem when drawing a full circle that doesn't start 0
+                endAngle = (2*Math.PI);
+            }
+
+            var startx = x + Math.round(Math.cos(startAngle) * radius);
+            var starty = y + Math.round(Math.sin(startAngle) * radius);
+            var endx = x + Math.round(Math.cos(endAngle) * radius);
+            var endy = y + Math.round(Math.sin(endAngle) * radius);
+
+            // Prevent very small slices from being mistaken as a whole pie
+            if (startx==endx && starty==endy && (endAngle-startAngle) < Math.PI)
+                return;
+
+            var vpath = [  x-radius, y-radius, x+radius, y+radius, startx, starty, endx, endy ]; 
+            var stroke = lineColor == undefined ? ' stroked="false" ' : ' strokeWeight="1" strokeColor="'+lineColor+'" ';
+            var fill = fillColor == undefined ? ' filled="false"' : ' fillColor="'+fillColor+'" filled="true" ';
+            var vel = '<v:shape coordorigin="0 0" coordsize="'+this.pixel_width+' '+this.pixel_height+'" '
+                + stroke
+                + fill
+                +' style="position:absolute;left:0px;top:0px;height:'+this.pixel_height+'px;width:'+this.pixel_width+'px;padding:0px;margin:0px;" '
+                +' path="m '+x+','+y+' wa '+vpath.join(', ')+' x e">'
+                +' </v:shape>';
+             this.group.insertAdjacentHTML('beforeEnd', vel);
+        },
+
+        drawRect : function(x, y, width, height, lineColor, fillColor) {
+            return this.drawShape( [ [x, y], [x, y+height], [x+width, y+height], [x+width, y], [x, y] ], lineColor, fillColor);
+        }
+    });
+
+})(jQuery);
deleted file mode 100644 (file)
index 1c35b5f0a2b31910fca005334d359984ddde915f..0000000000000000000000000000000000000000
+++ /dev/null
-/**
-*
-* jquery.sparkline.js
-*
-* v1.5.1
-* (c) Splunk, Inc 
-* Contact: Gareth Watts (gareth@splunk.com)
-* http://omnipotent.net/jquery.sparkline/
-*
-* Generates inline sparkline charts from data supplied either to the method
-* or inline in HTML
-* 
-* Compatible with Internet Explorer 6.0+ and modern browsers equipped with the canvas tag
-* (Firefox 2.0+, Safari, Opera, etc)
-*
-* License: New BSD License
-* 
-* Copyright (c) 2010, Splunk Inc.
-* All rights reserved.
-* 
-* Redistribution and use in source and binary forms, with or without modification, 
-* are permitted provided that the following conditions are met:
-* 
-*     * Redistributions of source code must retain the above copyright notice, 
-*       this list of conditions and the following disclaimer.
-*     * Redistributions in binary form must reproduce the above copyright notice, 
-*       this list of conditions and the following disclaimer in the documentation 
-*       and/or other materials provided with the distribution.
-*     * Neither the name of Splunk Inc nor the names of its contributors may 
-*       be used to endorse or promote products derived from this software without 
-*       specific prior written permission.
-* 
-* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 
-* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 
-* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 
-* SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
-* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 
-* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
-* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 
-* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
-* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-* 
-*
-* Usage: 
-*  $(selector).sparkline(values, options)
-*
-* If values is undefined or set to 'html' then the data values are read from the specified tag:
-*   <p>Sparkline: <span class="sparkline">1,4,6,6,8,5,3,5</span></p>
-*   $('.sparkline').sparkline();
-* There must be no spaces in the enclosed data set
-*
-* Otherwise values must be an array of numbers or null values
-*    <p>Sparkline: <span id="sparkline1">This text replaced if the browser is compatible</span></p>
-*    $('#sparkline1').sparkline([1,4,6,6,8,5,3,5])
-*    $('#sparkline2').sparkline([1,4,6,null,null,5,3,5])
-*
-* For line charts, x values can also be specified:
-*   <p>Sparkline: <span class="sparkline">1:1,2.7:4,3.4:6,5:6,6:8,8.7:5,9:3,10:5</span></p>
-*    $('#sparkline1').sparkline([ [1,1], [2.7,4], [3.4,6], [5,6], [6,8], [8.7,5], [9,3], [10,5] ])
-*
-* Supported options:
-*   lineColor - Color of the line used for the chart
-*   fillColor - Color used to fill in the chart - Set to '' or false for a transparent chart
-*   width - Width of the chart - Defaults to 3 times the number of values in pixels
-*   height - Height of the chart - Defaults to the height of the containing element
-*   chartRangeMin - Specify the minimum value to use for the Y range of the chart - Defaults to the minimum value supplied
-*   chartRangeMax - Specify the maximum value to use for the Y range of the chart - Defaults to the maximum value supplied
-*   chartRangeClip - Clip out of range values to the max/min specified by chartRangeMin and chartRangeMax
-*   chartRangeMinX - Specify the minimum value to use for the X range of the chart - Defaults to the minimum value supplied
-*   chartRangeMaxX - Specify the maximum value to use for the X range of the chart - Defaults to the maximum value supplied
-*   composite - If true then don't erase any existing chart attached to the tag, but draw
-*           another chart over the top - Note that width and height are ignored if an
-*           existing chart is detected.
-*
-* There are 7 types of sparkline, selected by supplying a "type" option of 'line' (default),
-* 'bar', 'tristate', 'bullet', 'discrete', 'pie' or 'box'
-*    line - Line chart.  Options:
-*       spotColor - Set to '' to not end each line in a circular spot
-*       minSpotColor - If set, color of spot at minimum value
-*       maxSpotColor - If set, color of spot at maximum value
-*       spotRadius - Radius in pixels
-*       lineWidth - Width of line in pixels
-*       normalRangeMin 
-*       normalRangeMax - If set draws a filled horizontal bar between these two values marking the "normal"
-*                      or expected range of values
-*       normalRangeColor - Color to use for the above bar
-*       defaultPixelsPerValue - Defaults to 3 pixels of width for each value in the chart
-*
-*   bar - Bar chart.  Options:
-*       barColor - Color of bars for postive values
-*       negBarColor - Color of bars for negative values
-*       zeroColor - Color of bars with zero values
-*       nullColor - Color of bars with null values - Defaults to omitting the bar entirely
-*       barWidth - Width of bars in pixels
-*       colorMap - Optional mappnig of values to colors to override the *BarColor values above
-*                  can be an Array of values to control the color of individual bars
-*       barSpacing - Gap between bars in pixels
-*       zeroAxis - Centers the y-axis around zero if true
-*
-*   tristate - Charts values of win (>0), lose (<0) or draw (=0)
-*       posBarColor - Color of win values
-*       negBarColor - Color of lose values
-*       zeroBarColor - Color of draw values
-*       barWidth - Width of bars in pixels
-*       barSpacing - Gap between bars in pixels
-*       colorMap - Optional mappnig of values to colors to override the *BarColor values above
-*                  can be an Array of values to control the color of individual bars
-*
-*   discrete - Options:
-*       lineHeight - Height of each line in pixels - Defaults to 30% of the graph height
-*       thesholdValue - Values less than this value will be drawn using thresholdColor instead of lineColor
-*       thresholdColor
-*
-*   bullet - Values for bullet graphs msut be in the order: target, performance, range1, range2, range3, ...
-*       options:
-*       targetColor - The color of the vertical target marker
-*       targetWidth - The width of the target marker in pixels
-*       performanceColor - The color of the performance measure horizontal bar
-*       rangeColors - Colors to use for each qualitative range background color
-*
-*   pie - Pie chart. Options:
-*       sliceColors - An array of colors to use for pie slices
-*       offset - Angle in degrees to offset the first slice - Try -90 or +90
-*
-*   box - Box plot. Options:
-*       raw - Set to true to supply pre-computed plot points as values
-*             values should be: low_outlier, low_whisker, q1, median, q3, high_whisker, high_outlier
-*             When set to false you can supply any number of values and the box plot will
-*             be computed for you.  Default is false.
-*       showOutliers - Set to true (default) to display outliers as circles
-*       outlierIRQ - Interquartile range used to determine outliers.  Default 1.5
-*       boxLineColor - Outline color of the box
-*       boxFillColor - Fill color for the box
-*       whiskerColor - Line color used for whiskers
-*       outlierLineColor - Outline color of outlier circles
-*       outlierFillColor - Fill color of the outlier circles
-*       spotRadius - Radius of outlier circles
-*       medianColor - Line color of the median line
-*       target - Draw a target cross hair at the supplied value (default undefined)
-*      
-*   
-*       
-*   Examples:
-*   $('#sparkline1').sparkline(myvalues, { lineColor: '#f00', fillColor: false });
-*   $('.barsparks').sparkline('html', { type:'bar', height:'40px', barWidth:5 });
-*   $('#tristate').sparkline([1,1,-1,1,0,0,-1], { type:'tristate' }):
-*   $('#discrete').sparkline([1,3,4,5,5,3,4,5], { type:'discrete' });
-*   $('#bullet').sparkline([10,12,12,9,7], { type:'bullet' });
-*   $('#pie').sparkline([1,1,2], { type:'pie' });
-*/
-
-
-(function($) {
-
-    // Provide a cross-browser interface to a few simple drawing primitives
-    $.fn.simpledraw = function(width, height, use_existing) {
-        if (use_existing && this[0].vcanvas) return this[0].vcanvas;
-        if (width==undefined) width=$(this).innerWidth();
-        if (height==undefined) height=$(this).innerHeight();
-        if ($.browser.hasCanvas) {
-            return new vcanvas_canvas(width, height, this);
-        } else if ($.browser.msie) {
-            return new vcanvas_vml(width, height, this);
-        } else {
-            return false;
-        }
-    };
-
-    var pending = [];
-
-    $.fn.sparkline = function(uservalues, options) {
-        var options = $.extend({
-            type : 'line',
-            lineColor : '#00f',
-            fillColor : '#cdf',
-            defaultPixelsPerValue : 3,
-            width : 'auto', 
-            height : 'auto',
-            composite : false
-        }, options ? options : {});
-        
-        return this.each(function() {
-            var render = function() {
-                var values = (uservalues=='html' || uservalues==undefined) ? $(this).text().split(',') : uservalues;
-
-                var width = options.width=='auto' ? values.length*options.defaultPixelsPerValue : options.width;
-                if (options.height == 'auto') {
-                    if (!options.composite || !this.vcanvas) {
-                        // must be a better way to get the line height
-                        var tmp = document.createElement('span');
-                        tmp.innerHTML = 'a';
-                        $(this).html(tmp);
-                        height = $(tmp).innerHeight();
-                        $(tmp).remove();
-                    }
-                } else {
-                    height = options.height;
-                }
-
-                $.fn.sparkline[options.type].call(this, values, options, width, height);
-            }
-            // jQuery 1.3.0 completely changed the meaning of :hidden :-/
-            if (($(this).html() && $(this).is(':hidden')) || ($.fn.jquery < "1.3.0" && $(this).parents().is(':hidden'))) {
-                pending.push([this, render]);
-            } else {
-                render.call(this);
-            }
-        });
-    };
-
-
-    $.sparkline_display_visible = function() {
-        for (var i=pending.length-1; i>=0; i--) {
-            var el = pending[i][0];
-            if ($(el).is(':visible') && !$(el).parents().is(':hidden')) {
-                pending[i][1].call(el);
-                pending.splice(i, 1);
-            }
-        }
-    };
-
-    $.fn.sparkline.line = function(values, options, width, height) {
-        var options = $.extend({
-            spotColor : '#f80',
-            spotRadius : 1.5,
-            minSpotColor : '#f80',
-            maxSpotColor : '#f80',
-            lineWidth: 1, 
-            normalRangeMin : undefined,
-            normalRangeMax : undefined,
-            normalRangeColor : '#ccc',
-            chartRangeMin : undefined,
-            chartRangeMax : undefined,
-            chartRangeMinX : undefined,
-            chartRangeMaxX : undefined
-        }, options ? options : {});
-
-        var xvalues = [], yvalues = [], yminmax = [];
-        for (i=0; i<values.length; i++) {
-            var v = values[i];
-            var isstr = typeof(values[i])=='string';
-            var isarray = typeof(values[i])=='object' && values[i] instanceof Array;
-            var sp = isstr && values[i].split(':');
-            if (isstr && sp.length == 2) { // x:y
-                xvalues.push(Number(sp[0]));
-                yvalues.push(Number(sp[1]));
-                yminmax.push(Number(sp[1]));
-            } else if (isarray) {
-                xvalues.push(values[i][0]);
-                yvalues.push(values[i][1]);
-                yminmax.push(values[i][1]);
-            } else {
-                xvalues.push(i);
-                if (values[i]===null || values[i]=='null') {
-                    yvalues.push(null);
-                } else {
-                    yvalues.push(Number(values[i]));
-                    yminmax.push(Number(values[i]));
-                }
-            }
-        }
-        if (options.xvalues) {
-            xvalues = options.xvalues;
-        }
-
-        var maxy = Math.max.apply(Math, yminmax);
-        var maxyval = maxy;
-        var miny = Math.min.apply(Math, yminmax);
-        var minyval = miny;
-
-        var maxx = Math.max.apply(Math, xvalues);
-        var maxxval = maxx;
-        var minx = Math.min.apply(Math, xvalues);
-        var minxval = minx;
-
-        if (options.normalRangeMin!=undefined) {
-            if (options.normalRangeMin<miny)
-                miny = options.normalRangeMin;
-            if (options.normalRangeMax>maxy)
-                maxy = options.normalRangeMax;
-        }
-        if (options.chartRangeMin!=undefined && (options.chartRangeClip ||  options.chartRangeMin<miny)) {
-            miny = options.chartRangeMin;
-        }
-        if (options.chartRangeMax!=undefined && (options.chartRangeClip || options.chartRangeMax>maxy)) {
-            maxy = options.chartRangeMax;
-        }
-        if (options.chartRangeMinX!=undefined && (options.chartRangeClipX || options.chartRangeMinX<minx)) {
-            minx = options.chartRangeMinX;
-        }
-        if (options.chartRangeMaxX!=undefined && (options.chartRangeClipX || options.chartRangeMaxX>maxx)) {
-            maxx = options.chartRangeMaxX;
-        }
-        var rangex = maxx-minx == 0 ? 1 : maxx-minx;
-        var rangey = maxy-miny == 0 ? 1 : maxy-miny;
-        var vl = yvalues.length-1;
-
-        if (vl<1) {
-            this.innerHTML = '';
-            return;
-        }
-
-        var target = $(this).simpledraw(width, height, options.composite);
-        if (target) {
-            var canvas_width = target.pixel_width;
-            var canvas_height = target.pixel_height;
-            var canvas_top = 0;
-            var canvas_left = 0;
-
-            if (options.spotRadius && (canvas_width < (options.spotRadius*4) || canvas_height < (options.spotRadius*4))) {
-                options.spotRadius = 0;
-            }
-            if (options.spotRadius) {
-                // adjust the canvas size as required so that spots will fit
-                if (options.minSpotColor || (options.spotColor && yvalues[vl]==miny)) 
-                    canvas_height -= Math.ceil(options.spotRadius);
-                if (options.maxSpotColor || (options.spotColor && yvalues[vl]==maxy)) {
-                    canvas_height -= Math.ceil(options.spotRadius);
-                    canvas_top += Math.ceil(options.spotRadius);
-                }
-                if (options.minSpotColor || options.maxSpotColor && (yvalues[0]==miny || yvalues[0]==maxy)) {
-                    canvas_left += Math.ceil(options.spotRadius);
-                    canvas_width -= Math.ceil(options.spotRadius);
-                }
-                if (options.spotColor || (options.minSpotColor || options.maxSpotColor && (yvalues[vl]==miny||yvalues[vl]==maxy)))
-                    canvas_width -= Math.ceil(options.spotRadius);
-            }
-
-
-            canvas_height--;
-            if (options.normalRangeMin!=undefined) {
-                var ytop = canvas_top+Math.round(canvas_height-(canvas_height*((options.normalRangeMax-miny)/rangey)));
-                var height = Math.round((canvas_height*(options.normalRangeMax-options.normalRangeMin))/rangey);
-                target.drawRect(canvas_left, ytop, canvas_width, height, undefined, options.normalRangeColor);
-            }
-
-            var path = [];
-            var paths = [path];
-            for(var i=0, vlen=yvalues.length; i<vlen; i++) {
-                var x=xvalues[i], y=yvalues[i];
-                if (y===null) {
-                    if (i) {
-                        if (yvalues[i-1]!==null) {
-                            path = [];
-                            paths.push(path);
-                        }
-                    }
-                } else {
-                    if (y < miny) y=miny;
-                    if (y > maxy) y=maxy;
-                    if (!path.length) {
-                        // previous value was null
-                        path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)), canvas_top+canvas_height]);
-                    }
-                    path.push([canvas_left+Math.round((x-minx)*(canvas_width/rangex)), canvas_top+Math.round(canvas_height-(canvas_height*((y-miny)/rangey)))]);
-                }
-            }
-            for(var i=0, plen=paths.length; i<plen; i++) {
-                path = paths[i];
-                if (!path.length)
-                    continue; // last value was null
-                if (options.fillColor) {
-                    path.push([path[path.length-1][0], canvas_top+canvas_height-1]);
-                    target.drawShape(path, undefined, options.fillColor);
-                    path.pop();
-                }
-                // if there's only a single point in this path, then we want to display it as a vertical line
-                // which means we keep path[0]  as is
-                if (path.length>2) {
-                    // else we want the first value 
-                    path[0] = [ path[0][0], path[1][1] ];
-                }
-                target.drawShape(path, options.lineColor, undefined, options.lineWidth);
-            }
-            if (options.spotRadius && options.spotColor) {
-                target.drawCircle(canvas_left+Math.round(xvalues[xvalues.length-1]*(canvas_width/rangex)),  canvas_top+Math.round(canvas_height-(canvas_height*((yvalues[vl]-miny)/rangey))), options.spotRadius, undefined, options.spotColor);
-            }
-            if (maxy!=minyval) {
-                if (options.spotRadius && options.minSpotColor) {
-                    var x = xvalues[yvalues.indexOf(minyval)];
-                    target.drawCircle(canvas_left+Math.round((x-minx)*(canvas_width/rangex)),  canvas_top+Math.round(canvas_height-(canvas_height*((minyval-miny)/rangey))), options.spotRadius, undefined, options.minSpotColor);
-                }
-                if (options.spotRadius && options.maxSpotColor) {
-                    var x = xvalues[yvalues.indexOf(maxyval)];
-                    target.drawCircle(canvas_left+Math.round((x-minx)*(canvas_width/rangex)),  canvas_top+Math.round(canvas_height-(canvas_height*((maxyval-miny)/rangey))), options.spotRadius, undefined, options.maxSpotColor);
-                }
-            }
-        } else {
-            // Remove the tag contents if sparklines aren't supported
-            this.innerHTML = '';
-        }
-    };
-
-    $.fn.sparkline.bar = function(values, options, width, height) {
-        var options = $.extend({
-            type : 'bar',
-            barColor : '#00f',
-            negBarColor : '#f44',
-            zeroColor: undefined,
-            nullColor: undefined,
-            zeroAxis : undefined,
-            barWidth : 4,
-            barSpacing : 1,
-            chartRangeMax: undefined,
-            chartRangeMin: undefined,
-            chartRangeClip: false,
-            colorMap : undefined
-        }, options ? options : {});
-
-        var width = (values.length * options.barWidth) + ((values.length-1) * options.barSpacing);
-        var num_values = [];
-        for(var i=0, vlen=values.length; i<vlen; i++) {
-            if (values[i]=='null' || values[i]===null) {
-                values[i] = null;
-            } else {
-                values[i] = Number(values[i]);
-                num_values.push(Number(values[i]));
-            }
-        }
-        var max = Math.max.apply(Math, num_values);
-        var min = Math.min.apply(Math, num_values);
-        if (options.chartRangeMin!=undefined && (options.chartRangeClip || options.chartRangeMin<min)) {
-            min = options.chartRangeMin;
-        }
-        if (options.chartRangeMax!=undefined && (options.chartRangeClip || options.chartRangeMax>max)) {
-            max = options.chartRangeMax;
-        }
-        if (options.zeroAxis == undefined) options.zeroAxis = min<0;
-        var range = max-min == 0 ? 1 : max-min;
-
-        if ($.isArray(options.colorMap)) {
-            var colorMapByIndex = options.colorMap;
-            var colorMapByValue = null;
-        } else {
-            var colorMapByIndex = null;
-            var colorMapByValue = options.colorMap;
-        }
-
-        var target = $(this).simpledraw(width, height, options.composite);
-        if (target) {
-            var canvas_width = target.pixel_width;
-            var canvas_height = target.pixel_height;
-            var yzero = min<0 && options.zeroAxis ? canvas_height-Math.round(canvas_height * (Math.abs(min)/range))-1 : canvas_height-1;
-
-            for(var i=0, vlen=values.length; i<vlen; i++) {
-                var x = i*(options.barWidth+options.barSpacing);
-                var val = values[i];
-                if (val===null) {
-                    if (options.nullColor) {
-                        color = options.nullColor;
-                        val = (options.zeroAxis && min<0) ? 0 : min;
-                        var height = 1;
-                        var y = (options.zeroAxis && min<0) ? yzero : canvas_height - height;
-                    } else {
-                        continue;
-                    }
-                } else {
-                    if (val < min) val=min;
-                    if (val > max) val=max;
-                    var color = (val < 0) ? options.negBarColor : options.barColor;
-                    if (options.zeroAxis && min<0) {
-                        var height = Math.round(canvas_height*((Math.abs(val)/range)))+1;
-                        var y = (val < 0) ? yzero : yzero-height;
-                    } else {
-                        var height = Math.round(canvas_height*((val-min)/range))+1;
-                        var y = canvas_height-height;
-                    }
-                    if (val==0 && options.zeroColor!=undefined) {
-                        color = options.zeroColor;
-                    }
-                    if (colorMapByValue && colorMapByValue[val]) {
-                        color = colorMapByValue[val];
-                    } else if (colorMapByIndex && colorMapByIndex.length>i) {
-                        color = colorMapByIndex[i];
-                    }
-                    if (color===null) {
-                        continue;
-                    }
-                }
-                target.drawRect(x, y, options.barWidth-1, height-1, color, color);
-            }
-        } else {
-            // Remove the tag contents if sparklines aren't supported
-            this.innerHTML = '';
-        }
-    };
-
-    $.fn.sparkline.tristate = function(values, options, width, height) {
-        values = $.map(values, Number);
-        var options = $.extend({
-            barWidth : 4,
-            barSpacing : 1,
-            posBarColor: '#6f6',
-            negBarColor : '#f44',
-            zeroBarColor : '#999',
-            colorMap : {}
-        }, options);
-
-        var width = (values.length * options.barWidth) + ((values.length-1) * options.barSpacing);
-
-        if ($.isArray(options.colorMap)) {
-            var colorMapByIndex = options.colorMap;
-            var colorMapByValue = null;
-        } else {
-            var colorMapByIndex = null;
-            var colorMapByValue = options.colorMap;
-        }
-
-        var target = $(this).simpledraw(width, height, options.composite);
-        if (target) {
-            var canvas_width = target.pixel_width;
-            var canvas_height = target.pixel_height;
-            var half_height = Math.round(canvas_height/2);
-
-            for(var i=0, vlen=values.length; i<vlen; i++) {
-                var x = i*(options.barWidth+options.barSpacing);
-                if (values[i] < 0) {
-                    var y = half_height;
-                    var height = half_height-1;
-                    var color = options.negBarColor;
-                } else if (values[i] > 0) {
-                    var y = 0;
-                    var height = half_height-1;
-                    var color = options.posBarColor;
-                } else {
-                    var y = half_height-1;
-                    var height = 2;
-                    var color = options.zeroBarColor;
-                }
-                if (colorMapByValue && colorMapByValue[values[i]]) {
-                    color = colorMapByValue[values[i]];
-                } else if (colorMapByIndex && colorMapByIndex.length>i) {
-                    color = colorMapByIndex[i];
-                }
-                if (color===null) {
-                    continue;
-                }
-                target.drawRect(x, y, options.barWidth-1, height-1, color, color);
-            }
-        } else {
-            // Remove the tag contents if sparklines aren't supported
-            this.innerHTML = '';
-        }
-    };
-
-    $.fn.sparkline.discrete = function(values, options, width, height) {
-        values = $.map(values, Number);
-        var options = $.extend({
-            lineHeight: 'auto',
-            thresholdColor: undefined,
-            thresholdValue : 0,
-            chartRangeMax: undefined,
-            chartRangeMin: undefined,
-            chartRangeClip: false
-        }, options);
-
-        width = options.width=='auto' ? values.length*2 : width;
-        var interval = Math.floor(width / values.length);
-
-        var target = $(this).simpledraw(width, height, options.composite);
-        if (target) {
-            var canvas_width = target.pixel_width;
-            var canvas_height = target.pixel_height;
-            var line_height = options.lineHeight == 'auto' ? Math.round(canvas_height * 0.3) : options.lineHeight;
-            var pheight = canvas_height - line_height;
-            var min = Math.min.apply(Math, values);
-            var max = Math.max.apply(Math, values);
-            if (options.chartRangeMin!=undefined && (options.chartRangeClip || options.chartRangeMin<min)) {
-                min = options.chartRangeMin;
-            }
-            if (options.chartRangeMax!=undefined && (options.chartRangeClip  || options.chartRangeMax>max)) {
-                max = options.chartRangeMax;
-            }
-            var range = max-min;
-
-            for(var i=0, vlen=values.length; i<vlen; i++) {
-                var val = values[i];
-                if (val < min) val=min;
-                if (val > max) val=max;
-                var x = (i*interval);
-                var ytop = Math.round(pheight-pheight*((val-min)/range));
-                target.drawLine(x, ytop, x, ytop+line_height, (options.thresholdColor && val < options.thresholdValue) ? options.thresholdColor : options.lineColor);
-            }
-        }  else {
-            // Remove the tag contents if sparklines aren't supported
-            this.innerHTML = '';
-        }
-                
-    };
-
-    $.fn.sparkline.bullet = function(values, options, width, height) {
-        values = $.map(values, Number);
-        // target, performance, range1, range2, range3
-        var options = $.extend({
-            targetColor : 'red',
-            targetWidth : 3, // width of the target bar in pixels
-            performanceColor : 'blue',
-            rangeColors : ['#D3DAFE', '#A8B6FF', '#7F94FF' ],
-            base : undefined // set this to a number to change the base start number
-        }, options);
-
-        
-        width = options.width=='auto' ? '4.0em' : width;
-
-        var target = $(this).simpledraw(width, height, options.composite);
-        if (target && values.length>1) {
-            var canvas_width = target.pixel_width-Math.ceil(options.targetWidth/2);
-            var canvas_height = target.pixel_height;
-
-            var min = Math.min.apply(Math, values);
-            var max = Math.max.apply(Math, values);
-            if (options.base == undefined) {
-                var min = min < 0 ? min : 0;
-            } else {
-                min = options.base;
-            }
-            var range = max-min;
-
-            // draw range values
-            for(i=2, vlen=values.length; i<vlen; i++) {
-                var rangeval = parseInt(values[i]);
-                var rangewidth = Math.round(canvas_width*((rangeval-min)/range));
-                target.drawRect(0, 0, rangewidth-1, canvas_height-1, options.rangeColors[i-2], options.rangeColors[i-2]);
-            }
-
-            // draw the performance bar
-            var perfval = parseInt(values[1]);
-            var perfwidth = Math.round(canvas_width*((perfval-min)/range));
-            target.drawRect(0, Math.round(canvas_height*0.3), perfwidth-1, Math.round(canvas_height*0.4)-1, options.performanceColor, options.performanceColor);
-
-            // draw the target linej
-            var targetval = parseInt(values[0]);
-            var x = Math.round(canvas_width*((targetval-min)/range)-(options.targetWidth/2));
-            var targettop = Math.round(canvas_height*0.10);
-            var targetheight = canvas_height-(targettop*2);
-            target.drawRect(x, targettop, options.targetWidth-1, targetheight-1, options.targetColor, options.targetColor);
-        }  else {
-            // Remove the tag contents if sparklines aren't supported
-            this.innerHTML = '';
-        }
-    };
-
-    $.fn.sparkline.pie = function(values, options, width, height) {
-        values = $.map(values, Number);
-        var options = $.extend({
-            sliceColors : ['#f00', '#0f0', '#00f']
-        }, options);
-
-        width = options.width=='auto' ? height : width;
-
-        var target = $(this).simpledraw(width, height, options.composite);
-        if (target && values.length>1) {
-            var canvas_width = target.pixel_width;
-            var canvas_height = target.pixel_height;
-                
-            var radius = Math.floor(Math.min(canvas_width, canvas_height)/2);
-            var total = 0;
-            for(var i=0, vlen=values.length; i<vlen; i++)
-                total += values[i];
-            var next = 0;
-            if (options.offset) {
-                next += (2*Math.PI)*(options.offset/360);
-            }
-            var circle = 2*Math.PI;
-            for(var i=0, vlen=values.length; i<vlen; i++) {
-                var start = next;
-                var end = next;
-                if (total > 0) {  // avoid divide by zero
-                    end = next + (circle*(values[i]/total));
-                }
-                target.drawPieSlice(radius, radius, radius, start, end, undefined, options.sliceColors[i % options.sliceColors.length]);
-                next = end;
-            }
-        }
-    };
-
-    function quartile(values, q) {
-        if (q==2) {
-            var vl2 = Math.floor(values.length/2);
-            return values.length % 2 ? values[vl2] : (values[vl2]+values[vl2+1])/2;
-        } else {
-            var vl4 = Math.floor(values.length/4);
-            return values.length % 2 ? (values[vl4*q]+values[vl4*q+1])/2 : values[vl4*q];
-        }
-    };
-
-    $.fn.sparkline.box = function(values, options, width, height) {
-        values = $.map(values, Number);
-        var options = $.extend({
-            raw: false,
-            boxLineColor: 'black',
-            boxFillColor: '#cdf',
-            whiskerColor: 'black',
-            outlierLineColor: '#333',
-            outlierFillColor: 'white',
-            medianColor: 'red',
-            showOutliers: true,
-            outlierIQR: 1.5,
-            spotRadius: 1.5,
-            target: undefined,
-            targetColor: '#4a2',
-            chartRangeMax: undefined,
-            chartRangeMin: undefined
-        }, options);
-
-        width = options.width=='auto' ? '4.0em' : width;
-
-        minvalue = options.chartRangeMin==undefined ? Math.min.apply(Math, values) : options.chartRangeMin;
-        maxvalue = options.chartRangeMax==undefined ? Math.max.apply(Math, values) : options.chartRangeMax;
-        var target = $(this).simpledraw(width, height, options.composite);
-        if (target && values.length>1) {
-            var canvas_width = target.pixel_width;
-            var canvas_height = target.pixel_height;
-            if (options.raw) {
-                if (options.showOutliers && values.length>5) {
-                    var loutlier=values[0], lwhisker=values[1], q1=values[2], q2=values[3], q3=values[4], rwhisker=values[5], routlier=values[6];
-                } else {
-                    var lwhisker=values[0], q1=values[1], q2=values[2], q3=values[3], rwhisker=values[4];
-                }
-            } else {
-                values.sort(function(a, b) { return a-b; });
-                var q1 = quartile(values, 1);
-                var q2 = quartile(values, 2);
-                var q3 = quartile(values, 3);
-                var iqr = q3-q1;
-                if (options.showOutliers) {
-                    var lwhisker=undefined, rwhisker=undefined;
-                    for(var i=0, vlen=values.length; i<vlen; i++) {
-                        if (lwhisker==undefined && values[i] > q1-(iqr*options.outlierIQR))
-                            lwhisker = values[i];
-                        if (values[i] < q3+(iqr*options.outlierIQR))
-                            rwhisker = values[i];
-                    }
-                    var loutlier = values[0];
-                    var routlier = values[values.length-1];
-                } else {
-                    var lwhisker = values[0];
-                    var rwhisker = values[values.length-1];
-                }
-            }
-
-            var unitsize = canvas_width / (maxvalue-minvalue+1);
-            var canvas_left = 0;
-            if (options.showOutliers) {
-                canvas_left = Math.ceil(options.spotRadius);
-                canvas_width -= 2*Math.ceil(options.spotRadius);
-                var unitsize = canvas_width / (maxvalue-minvalue+1);
-                if (loutlier < lwhisker)
-                    target.drawCircle((loutlier-minvalue)*unitsize+canvas_left, canvas_height/2, options.spotRadius, options.outlierLineColor, options.outlierFillColor);
-                if (routlier > rwhisker)
-                    target.drawCircle((routlier-minvalue)*unitsize+canvas_left, canvas_height/2, options.spotRadius, options.outlierLineColor, options.outlierFillColor);
-            }
-
-            // box
-            target.drawRect(
-                Math.round((q1-minvalue)*unitsize+canvas_left),
-                Math.round(canvas_height*0.1),
-                Math.round((q3-q1)*unitsize), 
-                Math.round(canvas_height*0.8), 
-                options.boxLineColor, 
-                options.boxFillColor);
-            // left whisker
-            target.drawLine(
-                Math.round((lwhisker-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height/2), 
-                Math.round((q1-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height/2), 
-                options.lineColor);
-            target.drawLine(
-                Math.round((lwhisker-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height/4), 
-                Math.round((lwhisker-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height-canvas_height/4), 
-                options.whiskerColor);
-            // right whisker
-            target.drawLine(Math.round((rwhisker-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height/2), 
-                Math.round((q3-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height/2), 
-                options.lineColor);
-            target.drawLine(
-                Math.round((rwhisker-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height/4), 
-                Math.round((rwhisker-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height-canvas_height/4), 
-                options.whiskerColor);
-            // median line
-            target.drawLine(
-                Math.round((q2-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height*0.1),
-                Math.round((q2-minvalue)*unitsize+canvas_left), 
-                Math.round(canvas_height*0.9),
-                options.medianColor);
-            if (options.target) {
-                var size = Math.ceil(options.spotRadius);
-                target.drawLine(
-                    Math.round((options.target-minvalue)*unitsize+canvas_left), 
-                    Math.round((canvas_height/2)-size), 
-                    Math.round((options.target-minvalue)*unitsize+canvas_left), 
-                    Math.round((canvas_height/2)+size), 
-                    options.targetColor);
-                target.drawLine(
-                    Math.round((options.target-minvalue)*unitsize+canvas_left-size), 
-                    Math.round(canvas_height/2), 
-                    Math.round((options.target-minvalue)*unitsize+canvas_left+size), 
-                    Math.round(canvas_height/2), 
-                    options.targetColor);
-            }
-        }  else {
-            // Remove the tag contents if sparklines aren't supported
-            this.innerHTML = '';
-        }
-    };
-
-
-    // IE doesn't provide an indexOf method for arrays :-(
-    if (!Array.prototype.indexOf) {
-        Array.prototype.indexOf = function(entry) {
-            for(var i=0, vlen=this.length; i<vlen; i++) {
-                if (this[i] == entry)
-                    return i;
-            }
-            return -1;
-        }
-    }
-
-    // Setup a very simple "virtual canvas" to make drawing the few shapes we need easier
-    // This is accessible as $(foo).simpledraw()
-
-    if ($.browser.msie && !document.namespaces['v']) {
-        document.namespaces.add('v', 'urn:schemas-microsoft-com:vml', '#default#VML');
-    }
-
-    if ($.browser.hasCanvas == undefined) {
-        var t = document.createElement('canvas');
-        $.browser.hasCanvas = t.getContext!=undefined;
-    }
-
-    var vcanvas_base = function(width, height, target) {
-    };
-
-    vcanvas_base.prototype = {
-        init : function(width, height, target) {
-            this.width = width;
-            this.height = height;
-            this.target = target;
-            if (target[0]) target=target[0];
-            target.vcanvas = this;
-        },
-
-        drawShape : function(path, lineColor, fillColor, lineWidth) {
-            alert('drawShape not implemented');
-        },
-
-        drawLine : function(x1, y1, x2, y2, lineColor, lineWidth) {
-            return this.drawShape([ [x1,y1], [x2,y2] ], lineColor, lineWidth);
-        },
-
-        drawCircle : function(x, y, radius, lineColor, fillColor) {
-            alert('drawCircle not implemented');
-        },
-
-        drawPieSlice : function(x, y, radius, startAngle, endAngle, lineColor, fillColor) {
-            alert('drawPieSlice not implemented');
-        },
-
-        drawRect : function(x, y, width, height, lineColor, fillColor) {
-            alert('drawRect not implemented');
-        },
-
-        getElement : function() {
-            return this.canvas;
-        },
-
-        _insert : function(el, target) {
-            $(target).html(el);
-        }
-    };
-
-    var vcanvas_canvas = function(width, height, target) {
-        return this.init(width, height, target);
-    };
-
-    vcanvas_canvas.prototype = $.extend(new vcanvas_base, {
-        _super : vcanvas_base.prototype,
-
-        init : function(width, height, target) {
-            this._super.init(width, height, target);
-            this.canvas = document.createElement('canvas');
-            if (target[0]) target=target[0];
-            target.vcanvas = this;
-            $(this.canvas).css({ display:'inline-block', width:width, height:height, verticalAlign:'top' });
-            this._insert(this.canvas, target);
-            this.pixel_height = $(this.canvas).height();
-            this.pixel_width = $(this.canvas).width();
-            this.canvas.width = this.pixel_width;
-            this.canvas.height = this.pixel_height;
-            $(this.canvas).css({width: this.pixel_width, height: this.pixel_height});
-        },
-
-        _getContext : function(lineColor, fillColor, lineWidth) {
-            var context = this.canvas.getContext('2d');
-            if (lineColor != undefined)
-                context.strokeStyle = lineColor;
-            context.lineWidth = lineWidth==undefined ? 1 : lineWidth;
-            if (fillColor != undefined)
-                context.fillStyle = fillColor;
-            return context;
-        },
-
-        drawShape : function(path, lineColor, fillColor, lineWidth) {
-            var context = this._getContext(lineColor, fillColor, lineWidth);
-            context.beginPath();
-            context.moveTo(path[0][0]+0.5, path[0][1]+0.5);
-            for(var i=1, plen=path.length; i<plen; i++) {
-                context.lineTo(path[i][0]+0.5, path[i][1]+0.5); // the 0.5 offset gives us crisp pixel-width lines
-            }
-            if (lineColor != undefined) {
-                context.stroke();
-            }
-            if (fillColor != undefined) {
-                context.fill();
-            }
-        },
-
-        drawCircle : function(x, y, radius, lineColor, fillColor) {
-            var context = this._getContext(lineColor, fillColor);
-            context.beginPath();
-            context.arc(x, y, radius, 0, 2*Math.PI, false);
-            if (lineColor != undefined) {
-                context.stroke();
-            }
-            if (fillColor != undefined) {
-                context.fill();
-            }
-        }, 
-
-        drawPieSlice : function(x, y, radius, startAngle, endAngle, lineColor, fillColor) {
-            var context = this._getContext(lineColor, fillColor);
-            context.beginPath();
-            context.moveTo(x, y);
-            context.arc(x, y, radius, startAngle, endAngle, false);
-            context.lineTo(x, y);
-            context.closePath();
-            if (lineColor != undefined) {
-                context.stroke();
-            }
-            if (fillColor) {
-                context.fill();
-            }
-        },
-
-        drawRect : function(x, y, width, height, lineColor, fillColor) {
-            return this.drawShape([ [x,y], [x+width, y], [x+width, y+height], [x, y+height], [x, y] ], lineColor, fillColor);
-        }
-        
-    });
-
-    var vcanvas_vml = function(width, height, target) {
-        return this.init(width, height, target);
-    };
-
-    vcanvas_vml.prototype = $.extend(new vcanvas_base, {
-        _super : vcanvas_base.prototype,
-
-        init : function(width, height, target) {
-            this._super.init(width, height, target);
-            if (target[0]) target=target[0];
-            target.vcanvas = this;
-            this.canvas = document.createElement('span');
-            $(this.canvas).css({ display:'inline-block', position: 'relative', overflow:'hidden', width:width, height:height, margin:'0px', padding:'0px', verticalAlign: 'top'});
-            this._insert(this.canvas, target);
-            this.pixel_height = $(this.canvas).height();
-            this.pixel_width = $(this.canvas).width();
-            this.canvas.width = this.pixel_width;
-            this.canvas.height = this.pixel_height;;
-            var groupel = '<v:group coordorigin="0 0" coordsize="'+this.pixel_width+' '+this.pixel_height+'"'
-                    +' style="position:absolute;top:0;left:0;width:'+this.pixel_width+'px;height='+this.pixel_height+'px;"></v:group>';
-            this.canvas.insertAdjacentHTML('beforeEnd', groupel);
-            this.group = $(this.canvas).children()[0];
-        },
-
-        drawShape : function(path, lineColor, fillColor, lineWidth) {
-            var vpath = [];
-            for(var i=0, plen=path.length; i<plen; i++) {
-                vpath[i] = ''+(path[i][0])+','+(path[i][1]);
-            }
-            var initial = vpath.splice(0,1);
-            lineWidth = lineWidth == undefined ? 1 : lineWidth;
-            var stroke = lineColor == undefined ? ' stroked="false" ' : ' strokeWeight="'+lineWidth+'" strokeColor="'+lineColor+'" ';
-            var fill = fillColor == undefined ? ' filled="false"' : ' fillColor="'+fillColor+'" filled="true" ';
-            var closed = vpath[0] == vpath[vpath.length-1] ? 'x ' : '';
-            var vel = '<v:shape coordorigin="0 0" coordsize="'+this.pixel_width+' '+this.pixel_height+'" '
-                + stroke
-                + fill
-                +' style="position:absolute;left:0px;top:0px;height:'+this.pixel_height+'px;width:'+this.pixel_width+'px;padding:0px;margin:0px;" '
-                +' path="m '+initial+' l '+vpath.join(', ')+' '+closed+'e">'
-                +' </v:shape>';
-             this.group.insertAdjacentHTML('beforeEnd', vel);
-        },
-
-        drawCircle : function(x, y, radius, lineColor, fillColor) {
-            x -= radius+1;
-            y -= radius+1;
-            var stroke = lineColor == undefined ? ' stroked="false" ' : ' strokeWeight="1" strokeColor="'+lineColor+'" ';
-            var fill = fillColor == undefined ? ' filled="false"' : ' fillColor="'+fillColor+'" filled="true" ';
-            var vel = '<v:oval '
-                + stroke
-                + fill
-                +' style="position:absolute;top:'+y+'px; left:'+x+'px; width:'+(radius*2)+'px; height:'+(radius*2)+'px"></v:oval>';
-            this.group.insertAdjacentHTML('beforeEnd', vel);
-            
-        },
-        
-        drawPieSlice : function(x, y, radius, startAngle, endAngle, lineColor, fillColor) {
-            if (startAngle == endAngle) {
-                return;  // VML seems to have problem when start angle equals end angle.
-            }
-            if ((endAngle - startAngle) == (2*Math.PI)) {
-                startAngle = 0.0;  // VML seems to have a problem when drawing a full circle that doesn't start 0
-                endAngle = (2*Math.PI);
-            }
-
-            var startx = x + Math.round(Math.cos(startAngle) * radius);
-            var starty = y + Math.round(Math.sin(startAngle) * radius);
-            var endx = x + Math.round(Math.cos(endAngle) * radius);
-            var endy = y + Math.round(Math.sin(endAngle) * radius);
-
-            // Prevent very small slices from being mistaken as a whole pie
-            if (startx==endx && starty==endy && (endAngle-startAngle) < Math.PI)
-                return;
-
-            var vpath = [  x-radius, y-radius, x+radius, y+radius, startx, starty, endx, endy ]; 
-            var stroke = lineColor == undefined ? ' stroked="false" ' : ' strokeWeight="1" strokeColor="'+lineColor+'" ';
-            var fill = fillColor == undefined ? ' filled="false"' : ' fillColor="'+fillColor+'" filled="true" ';
-            var vel = '<v:shape coordorigin="0 0" coordsize="'+this.pixel_width+' '+this.pixel_height+'" '
-                + stroke
-                + fill
-                +' style="position:absolute;left:0px;top:0px;height:'+this.pixel_height+'px;width:'+this.pixel_width+'px;padding:0px;margin:0px;" '
-                +' path="m '+x+','+y+' wa '+vpath.join(', ')+' x e">'
-                +' </v:shape>';
-             this.group.insertAdjacentHTML('beforeEnd', vel);
-        },
-
-        drawRect : function(x, y, width, height, lineColor, fillColor) {
-            return this.drawShape( [ [x, y], [x, y+height], [x+width, y+height], [x+width, y], [x, y] ], lineColor, fillColor);
-        }
-    });
-
-})(jQuery);
new file mode 120000 (symlink)
index 0000000000000000000000000000000000000000..3d5fca8a545a70e62206ef3930fe78b9ff2fb1ac
--- /dev/null
@@ -0,0 +1 @@
+jquery.sparkline-1.5.1.js
\ No newline at end of file
diff --git a/src/Y/modules/metaclass.js b/src/Y/modules/metaclass.js
deleted file mode 100644 (file)
index d4fdc85..0000000
+++ /dev/null
@@ -1,322 +0,0 @@
-// Inspired by John Resig's "Simple Class Inheritence" -- http://ejohn.org/blog/simple-javascript-inheritance/
-/*
-Metaprogramming API
-
-Events
-- "create" -- Fired when a new class instance is created. Data: self
-- "destroy" -- Fired when an instance is destoryed. Data: self
-- "init" -- Fired when the initialiser is invoked. Note that subclasses of the listened class will fire this event. Data: self
-- "subclass" -- Fired when a new subclass is created. Data: parent, self, body
-
-Customization Protocols
-- init() -- Initialiser; fires "init" event.
-- destroy() -- Should clean up resources and release weak references; fires "destroy" event.
-- extended(name, child, body) -- Called when a new subclass is created. Returns new child class.
-
-Class Methods
-- subclass(name, body) -- Fires "subclass" event.
-- fabricate() -- Generates a new class instance but does not inistialise it.
-- instantiate([args...])
-- methods()
-- properties()
-
-Note: Metaprogramming events cannot depend on Class.
-*/
-
-function ClassEvent(type, data, instance, cls){
-    this.data = data || {};
-    extend(this, this.data);
-    
-    this.type = type;
-    this.cls = cls;
-    this.instance = instance;
-}
-
-function ClassEmitter(target, parent){
-    var self    = target.__emitter__ = this
-    ,   queues  = self.queues = {};
-    self.target = target;
-    
-    // parent = (parent && parent.__emitter__) || parent;
-    if (parent && parent !== target) self.parent = parent;
-    
-    function getQueue(evt){
-        if ( !queues[evt] )
-            queues[evt] = [];
-        return queues[evt];
-    }
-    
-    this.addEventListener = target.addEventListener = addEventListener;
-    function addEventListener(evt, fn){
-        getQueue(evt).push(fn);
-        return target;
-    }
-    
-    this.removeEventListener = target.removeEventListener = removeEventListener;
-    function removeEventListener(evt, fn){
-        var q = getQueue(evt)
-        ,   idx = q.indexOf(fn);
-        if (idx !== -1) q.splice(idx, 1);
-        return target;
-    }
-    
-    this.fire = target.fire = fire;
-    function fire(type, instance, data){
-        var inst = instance || this
-        ,   evt = new ClassEvent(type, data, inst, target);
-        
-        for (var i=0, q=getQueue(evt.type), L=q.length; i<L; i++)
-            q[i].call(evt.target, evt);
-        
-        if (self.parent) self.parent.fire(type, instance, data);
-        
-        return evt;
-    }
-    
-}
-
-
-
-var KNOWN_CLASSES = {};
-
-// Private delegating constructor -- must be defined for every
-// new class to prevent shared state. All construction is
-// actually done in the init method.
-function _Class() {
-    var cls = arguments.callee
-    ,   instance = this;
-    
-    // Not subclassing
-    if ( cls.caller !== Y.Class.fabricate ) {
-        new ClassEmitter(this, cls);
-        cls.fire('create', instance);
-        if ( instance.init )
-            return instance.init.apply(instance, arguments);
-    }
-    
-    return instance;
-}
-
-
-/**
- * Creates a new class. All classes inherit from Y.Class, and therefore support
- * metaprogramming hooks and mixins.
- * 
- * @param {String} className Name of the Class.
- * 
- * @param {Type} [Parent] Parent class for subclassing. If Parent is a subclass of Y.Class
- * itself, the new class will inherit directly from Parent. Otherwise, members will be
- * copied off the prototype of Parent before applying any new instance members, but the
- * new class will not respond to instanceof from Parent.
- * 
- * @param {Object} [members] Instance members to add to the new class's prototype; a class
- * constructor can be supplied as `init`.
- * 
- * @return {Class} A new Class.
- */
-function Class(className, Parent, members){
-    var ClassFactory  = arguments.callee
-    ,   SuperClass = ClassFactory
-    ,   prototype  = this
-    ;
-    
-    if ( !members && !isFunction(Parent) ) {
-        members = Parent;
-        Parent  = null;
-    }
-    members = members || {};
-    Parent  = Parent  || Object.getPrototypeOf(members).constructor;
-    if (Parent == ClassFactory) Parent = Object;
-    var parentMembers = Parent.prototype;
-    
-    if (Parent.prototype instanceof ClassFactory) {
-        SuperClass = Parent;
-        prototype  = Parent.fabricate();
-        parentMembers = {};
-    }
-    
-    if ( !(prototype instanceof ClassFactory) )
-        return new ClassFactory(Parent, members);
-    
-    // Creates a new function with the appropriate name
-    // based on the className.
-    var NewClass, 
-    constructor = [
-        'var '+className,
-        (''+_Class).replace('_Class', className),
-        'NewClass = '+className, ''
-    ].join(';\n');
-    eval(constructor);
-    NewClass.prototype.toString = function(){ return this.className+"()"; };
-    
-    // Copy Class statics
-    for (var k in ClassFactory)
-        NewClass[k] = ClassFactory[k];
-    
-    // Copy parent methods, then add new instance methods
-    for (var k in parentMembers)
-        prototype[k] = parentMembers[k];
-    for (var k in members)
-        prototype[k] = members[k];
-    
-    prototype.constructor = NewClass;
-    NewClass.prototype = prototype;
-    
-    // Fix Constructors
-    NewClass.constructor = SuperClass;
-    var init = prototype.init
-    ,   initWrapper = function(){
-            var instance = this;
-            
-            if (init) {
-                var result = init.apply(instance, arguments);
-                if (result) instance = result;
-            }
-            
-            NewClass.fire('init', instance);
-            return instance;
-        };
-    initWrapper.__wraps__ = init;
-    NewClass.init = prototype.init = initWrapper;
-    
-    // Finalize
-    NewClass.className = prototype.className = className;
-    KNOWN_CLASSES[className] = NewClass;
-    
-    var ParentEmitter = (Parent.__emitter__ ? Parent : ClassFactory);
-    new ClassEmitter(NewClass, ParentEmitter);
-    ParentEmitter.fire('subclass', 
-        NewClass, {
-            className : className,
-            parent    : Parent,
-            child     : NewClass,
-            members   : members
-        });
-    
-    return NewClass;
-}
-
-// Decorate with emitter methods
-new ClassEmitter(Class);
-
-Y.Class = 
-Y.subclass = Class;
-
-/* Class Methods */
-
-/**
- * Create a new instance and run delegate constructor if it exists.
- * Unlike the keyword `new`, instantiate can be applied.
- */
-Class.instantiate = 
-    function(){
-        var instance = this.fabricate();
-        if ( instance.init )
-            instance.init.apply(instance, arguments);
-        return instance;
-    };
-    
-/**
- * Create new instance, but do not run the delegate constructor.
- */
-Class.fabricate = 
-    function(){
-        var Cls = this;
-        return new Cls();
-    };
-
-/**
- * Class method of Classes, not to be confused with Y.subclass, which is a static method.
- */
-Class.subclass = 
-    function(className, members){
-        return new Class(className, this, members);
-    };
-
-/**
-`mixin` handles the common work involved in, well, "mixing it in" to a class: 
-copying the right methods and wrapping the constructor, as well as handling a
-couple of common options.
-
-Methods to be mixed into another class should attach to your Mixin's prototype; 
-if a prototype.init method is present, it will be wrapped along with the class's 
-default init method, ensuring they both run--the class first--with the correct 
-arguments. 
-
-Any Mixin you write should be a subclass of `Class`. If it possesses an init 
-method (that is, `Mixin.init` NOT `Mixin.prototype.init`), it should take a 
-class instance (such as the class prototype) and an options object. It may 
-modify the class instance if it wishes, but its return will be ignored. This
-method will run prior to the contents of your Mixin's prototype being copied
-onto (or over the contents of) the object. Methods (other than init) attached 
-to your Mixin itself will be ignored.
-
-`mixin` Options:
-- Bool proto: Whether to extend the prototype of the class, or the body. This 
-option will not be passed to your Mixin, but you will get the correct object 
-(an instance or the prototype) when invoked.
-- Bool duplicate: Whether to create a new subclass to mix into. This option will 
-not be passed to your Mixin.
-- Array init_args: Array to use as the arguments to init if `options.proto` is 
-false.
-
-Examples:
-
-// Given:
-var Dict = new Class({ ... });
-var Trackable = { ... };
-
-// Make class Trackable
-mixin( Trackable, Dict, { proto: true } ); 
-mixin( Trackable, Dict ); // Will be autodetected if `cls` is a Function and has a prototype
-
-// Make Trackable a copy of the class
-var TrackableDict = mixin( Trackable, Dict, { duplicate: true } );
-var TrackableDict = new mixin( Trackable, Dict ); // Assumes a request for a new instance should duplicate the class
-
-// Make instance Trackable
-mixin( Trackable, new Dict(), { proto: false } );
-mixin( Trackable, new Dict() ); // Will be autodetected if `cls` is not a Function
-
-// Make static class methods trackable
-mixin( Trackable, Dict, { proto: false } ); // You must force `mixin` to ignore the prototype
-
-
-*/
-function mixin( Mixin, Cls, options ){
-    options = Y({
-        proto     : (isFunction(Cls) && Cls.prototype),
-        override  : true,
-        methodize : false
-    }, options );
-    
-    var mproto = Y(Mixin.prototype).clone()
-    ,   target = options.proto ? Cls.prototype : Cls;
-    
-    // TODO: Metaprogramming protocols
-    
-    // Wrap the constructor so we run on initialization
-    // if ( mproto.init instanceof Function )
-    //     target.init = (target.init || ops.nop).fork(mp.init, true);
-    
-    // Extend class with mixin contents!
-    delete mproto['init'];
-    Y(target).extend( mproto );
-    
-    return Cls;
-}
-Y.mixin = mixin;
-
-
-
-Y.bindAll = bindAll;
-function bindAll(o){
-    for (var k in o)
-        if (isFunction(o[k])) o[k] = o[k].bind(o);
-    return o;
-}
-
-
-
-function YBase(){}
-YBase = Y.YBase = new Class("YBase");
diff --git a/src/Y/modules/old-y.event.js b/src/Y/modules/old-y.event.js
deleted file mode 100644 (file)
index e211432..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-function YEvent(type, target, trigger, data){
-    this.data = data || {};
-    // Y.extend(this, this.data);
-    
-    this.type = type;
-    this.target = target || trigger;
-    this.trigger = trigger || target;
-}
-
-function YEmitter(target, parent){
-    this.queues = {};
-    this.target = target; // || this;
-    
-    if (parent) {
-        parent = parent.__emitter__ || parent;
-        if (parent !== target) this.parent = parent;
-    }
-    
-    Y.bindAll(this);
-    
-    // target.addEventListener = addEventListener;
-    // target.removeEventListener = removeEventListener;
-    // target.fire = fire;
-    // target.dispatchEvent = dispatchEvent;
-    
-}
-
-YEmitter.prototype.getQueue =
-function(evt){
-    if ( !this.queues[evt] )
-        this.queues[evt] = [];
-    return this.queues[evt];
-};
-
-YEmitter.prototype.addEventListener =
-function(evt, fn){
-    this.getQueue(evt).push(fn);
-    return this;
-};
-
-YEmitter.prototype.removeEventListener =
-function(evt, fn){
-    var q = this.getQueue(evt)
-    ,   idx = q.indexOf(fn);
-    if (idx !== -1) q.splice(idx, 1);
-    return this;
-};
-
-YEmitter.prototype.fire =
-function(type, instance, data){
-    instance = instance || this;
-    var evt = new YEvent(type, data, instance, target);
-    this.dispatchEvent(evt);
-    return evt;
-};
-
-// XXX: does not handle degenerate or recursive event dispatch
-YEmitter.prototype.dispatchEvent =
-function(evt){
-    for (var i=0, q=this.getQueue(evt.type), L=q.length; i<L; i++)
-        q[i].call(evt.target, evt);
-        
-    if (this.parent) this.parent.dispatchEvent(evt);
-    
-    return evt;
-};
-
-
diff --git a/src/Y/modules/simpleclass.js b/src/Y/modules/simpleclass.js
deleted file mode 100644 (file)
index c0851ba..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-function subclass(Parent, Child, body){
-    
-    // Prototype passed:
-    // - all 3 arguments supplied
-    // - Parent is an object
-    // - Child is a function
-    // - body is an object literal
-    var proto = Y.extend(Parent, { constructor:Child }, body);
-    Child.prototype = proto;
-    return Child;
-    
-    
-    // Superclass passed:
-    // - all 3 arguments supplied
-    // - Parent is a function
-    // - Child is a function
-    // - body is an object literal
-    Child.constructor = Parent;
-    return subclass(new Parent(), Child, body);
-    
-    
-    var args = arguments, nargs = args.length;
-    switch (args.length) {
-        case 2:
-            // subclass(Array, { [methods] })
-            if ( !Y.isFunction(Child) )
-                body = Child;
-                if ( Y.isFunction(Parent) )
-                    Child = function(){ Parent.apply(this, arguments); };
-                else
-                    Child = function(){  }
-        default: break;
-    }
-}
diff --git a/src/Y/modules/y.plugin-arch.js b/src/Y/modules/y.plugin-arch.js
deleted file mode 100644 (file)
index e05b110..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-
-Y.reduce = reduce;
-Y.attr   = attr;
-Y.extend = extend;
-
-Y.isFunction = isFunction;
-Y.isString = isString;
-Y.isNumber = isNumber;
-Y.isPlainObject = isPlainObject;
-
-
-
-
-function doPhase(phase, o, newY, args){
-    var ps      = Y.plugins.slice(0) // prevent mutation under iteration
-    ,   pslen   = ps.length
-    ,   capture = (phase === 'capture')
-    ;
-    
-    for ( var i=0, plugin=ps[i]; i<pslen; plugin=ps[++i] ) {
-        if ( !(phase in plugin) )
-            continue;
-        
-        // XXX: Should we clone args on each call to prevent mutation?
-        var r = plugin[phase](o, newY, args);
-        
-        if (r) {
-            // If this is the capture phase, we just matched a plugin,
-            // so we should return without running the bubbling phase
-            if (capture)
-                return r;
-            else
-                o = r;
-        }
-    }
-    
-    // If this is the capture phase, we should bubble to call as
-    // no plugins matched or we would have returned above.
-    if (capture)
-        return doPhase('call', o, newY, args);
-    else
-        return o;
-}
-
-/**
- * Creates a Y wrapper around its input.
- */
-function Y(o){
-    var A = arguments
-    ,   newY = (this instanceof Y);
-    
-    // Passthrough nulls
-    if (o === undefined || o === null)
-        return newY ? this : o;
-    
-    // Don't re-wrap Y-objects
-    if ( o.__y__ || o instanceof YBase )
-        return newY ? Y(o.end()) : o;
-    
-    // Invoke plugins
-    var _o = o
-    ,   args = slice.call(A, 0);
-    
-    // Capture phase, which will bubble to `call` if necessary
-    o = doPhase('capture', o, newY, args);
-    
-    // Post-processing phase
-    o = doPhase('finally', o, newY, args);
-    
-    // Wrap as generic object if nothing matched
-    if (o !== _o || o._o)
-        return o;
-    else
-        return new Y.YObject(o);
-}
-
-Y.plugins = [];
-Y.plugins.byName = {};
-
-/**
- * @param {Object|Function} plugin should either be a function to be used as `call`, or an object
- * with some set of methods from:
- *  - call: Invoked during bubbling to process input. Any non-false-y return value will be passed
- *      along as the Y() return value. All plugins with a `call` method will be invoked during
- *      bubbling, so non-matching plugins should not return a value.
- *  - capture: Invoked before bubbling to process input. A non-false-y return value will be
- *      returned as the Y() return value. All plugins with a `capture` method will be invoked during
- *      capture, and any truth-y response will prevent bubbling. It is therefore critical non-
- *      matching plugins do not return a value.
- *  - finally: Invoked after capture and/or bubbling to post-process the result. Any non-false-y
- *      return value will be passed along as the Y() return value.
- * Methods are invoked with:
- *  - {Object} o: The current return value (or input)
- *  - {Boolean} newY: Whether `Y()` was invoked with the `new` keyword.
- *  - {Array} args: The original arguments, converted to an array.
- */
-Y.plugin = function(plugin){
-    if ( isFunction(plugin) )
-        plugin = { 'call':plugin, 'name':plugin.name };
-    
-    plugin.name = plugin.name || plugin.className;
-    
-    // Register plugin
-    Y.plugins.push(plugin);
-    if (plugin.name) Y.plugins.byName[plugin.name] = plugin;
-    
-    return plugin;
-};
-
-// Y( arguments, start=0, stop=arguments.length )
-// Cast `arguments` object to a real Array, optionally slicing at specified delimiters
-Y.plugin({
-    'capture': function(o, newY, args){
-        if ( o.prototype === undefined
-                 && isNumber(o.length)
-                 && !isArray(o)
-                 && o.constructor === _Object )
-            return slice.call(o, args[1] || 0, args[2] || o.length);
-    }
-});
-
-Y.plugin({
-    'finally': function(o, newY, args){
-        return (newY ? Y(o) : o);
-    }
-});
-
-// Merge Arrays or Objects
-// Y([0,1], [2,3], [4,5])   -> [0,1,2,3,4,5]
-// Y({foo:1}, {bar:2})      -> { foo:1, bar:2 }
-Y.plugin({
-    'capture': function(o, newY, args){
-        if ((args.length > 1) && ( args.every(isArray) || args.every(isPlainObject) ))
-            return extend.apply(this, args);
-    }
-});
-
-// Convenience of Y(Y.range())
-Y.plugin({
-    'capture': function(o, newY, args){
-        if ( (args.length > 1) && args.every(isNumber) )
-            return Y.range.apply(this, A);
-    }
-});
-
-
-// We got random stuff: wrap an Array of it
-Y.plugin({
-    'capture': function(o, newY, args){
-        if (args.length > 1)
-            return new Y.YArray(args);
-    }
-});
-
-function getYType(o){
-    var name   = type_of(o)
-    ,   yname  = 'Y' + name.charAt(0).toUpperCase() + name.slice(1);
-    return Y[yname];
-}
-
-// Builtin type-specific wrappers
-Y.plugin({
-    'call' : function(o, newY, args){
-        var YType = getYType(o);
-        if ( YType && YType !== Y.YObject || YType !== Y.YBase )
-            return new YType(o);
-    }
-});
-
-
diff --git a/src/Y/modules/y.polyevent.js b/src/Y/modules/y.polyevent.js
deleted file mode 100644 (file)
index 81cca2b..0000000
+++ /dev/null
@@ -1,203 +0,0 @@
-(function(){
-
-function PolyEvent(){
-    
-}
-
-/**
- * @param defaultEvent Subclass of PolyEvent to act as the default event for calls to fire().
- * @param target Target object, as with @see{EventDispatcher}.
- */
-function PolyEventDispatcher(target) {
-    this._listeners = {};
-    this._match_cache = {};
-    this._target = target || this;
-}
-
-function getEventCls(subEvent, triggerType) {
-    return PolyEvent;
-}
-
-function addEventListener(type, listener) {
-    // trace(this+'.addEventListener( '+type+' )');
-    if ( !(type in this._listeners) )
-        this._listeners[type] = [];
-    this._listeners[type].push(listener);
-}
-
-function removeEventListener(type, listener) {
-    // trace(this+'.removeEventListener( '+type+' )');
-    
-    if ( !this._listeners[type] ) return;
-    
-    var idx = this._listeners[type].indexOf(listener);
-    if ( idx == -1 ) return;
-    
-    this._listeners[type].splice(idx, 1);
-}
-
-function hasEventListener(type) {
-    return !!(this._listeners[type] && this._listeners[type].length > 0);
-}
-
-function fire( triggerType, data, async, Cls ) {
-    data = data || {};
-    /*trace(this+'.fire( triggerType='+triggerType+', data='+data+', Cls='+Cls+' ) matches:');*/
-    var self = this,
-        dispatch = async ? this.dispatchEventAsync : this.dispatchEvent;
-    this.getMatchingEvents( triggerType+'' )
-        .forEach(function(subEvent) {
-            /*trace("  -", subEvent);*/
-            var EvtCls = Cls || self.getEventCls(subEvent, triggerType);
-            dispatch(new EvtCls(subEvent, triggerType, data));
-        });
-}
-
-function fireAsync( triggerType, data, Cls ) {
-    this.fire( triggerType, data, true, Cls );
-}
-
-function dispatchEvent( event ) {
-    if ( (event == undefined) || !(event.type in this._listeners) )
-        return false;
-    
-    var self = this;
-    this._listeners[event.type]
-        .slice(0)
-        .forEach(function(listener) {
-            listener.call( self._target, event );
-        });
-    return true;
-}
-
-function dispatchEventAsync( event ) {
-    setTimeout( dispatchEvent, 0, event );
-    return true;
-}
-
-
-// Private methods
-poly_dispatcher function targetListener(evt) {
-    dispatchEvent(evt);
-}
-
-function comb( L, n ) {
-    if (n <= 0)
-        return null;
-        
-    else if (n == 1)
-        return L.map(function (v) { return [v]; });
-        
-    else
-        return Basis.reduce( L, function ( acc, v, i ) {
-            return acc.concat(comb(L.slice(i+1), n-1)
-                .map(function ( suffix ) {
-                    return [v].concat(suffix);
-                }));
-        }, [] );
-}
-
-function powerset( L, n=-1 ) {
-    n = n !== -1 ? n : L.length;
-    var p = [];
-    for (var i=1; i < n+1; ++i)
-        p = p.concat( comb(L,i) );
-    return p;
-}
-
-function propertyset( T ) {
-    if ( !T || !T.length )
-        return [];
-    else
-        return unique(Basis.reduce(T, function( acc, t ) { 
-             return acc.concat( shove(t.split('-'), t) );
-        }, []).concat( T, powerset(T).map(joiner) ));
-}
-
-// 1. compose a string S into tokens
-// 2. separate the tokens with properties (T) from the plain tokens (TP)
-// 3. find the property set P = p(T)
-// 4. merge the powersets of t+P for t in T as PS
-// 5. return PS+event
-
-/**
- * Returns an array of all events which match the given event.  
- * @param event
- */     
-function getMatchingEvents( event, base_event ) {
-    base_event = base_event || '';
-    if ( this._match_cache[event] === undefined ) {
-        
-        // Segregate event groups in a manner worthy of strict scrutiny
-        var seg = Basis.reduce( event.split('.'),  
-            function( seg, token ) {
-                if (base_event === '') base_event = token;
-                if (token.indexOf('-') != -1)
-                    seg.special.push(token);
-                else
-                    seg.plain.push(token);
-                return seg;
-            }, { plain: [], special: [] });
-        
-        // Calculate the correct powerset for each event-group
-        var evtset;
-        if ( !seg.special.length )
-            evtset = powerset( seg.plain ).map(sorter).map(joiner);
-        else {
-            evtset = Basis.reduce( propertyset( seg.special ),
-                function( acc, t ) {
-                    return acc.concat( 
-                            powerset( seg.plain.concat([ t ]) )
-                                .map(sorter)
-                                .map(joiner) );
-                }, [] );
-        }
-        // Remove invalid permutations and duplicates
-        this._match_cache[event] =
-            unique( 
-                evtset
-                    .filter(function( v ) { 
-                        return v.indexOf(base_event) === 0; 
-                    }) )
-            .reverse();
-        
-        
-        // Always notify 'all'
-        this._match_cache[event].push('all');
-    }
-    
-//            trace("getMatchingEvents( event="+event+", base_event="+base_event+" ) --> [ "+_match_cache[event].join(",\n  ")+" ]");
-    return _match_cache[event];
-}
-
-var _prefixes = [ 'state', 'core', 'chrome', 'video', 'share' ];
-var _suffixes = [ 'user', 'auto' ];
-
-function cmp( a, b ) {
-    var a_suffix = _suffixes.indexOf(a) !== -1;
-    var b_suffix = _suffixes.indexOf(b) !== -1;
-    var a_prefix = _prefixes.indexOf(a) !== -1;
-    var b_prefix = _prefixes.indexOf(b) !== -1;
-    if (a_prefix === b_prefix && a_suffix === b_suffix)
-        return 0;
-    else if (a_prefix || b_suffix)
-        return -1;
-    else
-        return 1;
-}
-
-function shove( A, v ) { A.push(v); return A; }
-function sorter( A ) { A.sort(cmp); return A; }
-function joiner( A ) { return A.join('.'); }
-
-function unique( A ) {
-    return Basis.reduce(A, function( acc, v ) {
-        return (acc.indexOf(v) == -1) ? shove(acc, v) : acc;
-    }, [] );
-}
-
-function toString() {
-    return '[PolyEventDispatcher target='+_target+']';
-}
-
-})();
\ No newline at end of file
index 769cab3..1acfcbe 100644 (file)
@@ -5,59 +5,62 @@ var core = require('Y/core')
 ,   op = { // XXX: Make these function statements?
     
     // comparison
-    cmp:    function(x,y){  return x == y ? 0 : (x > y ? 1 : -1); },
-    eq:     function(x,y){  return x == y; },
-    ne:     function(x,y){  return x != y; },
-    gt:     function(x,y){  return x  > y; },
-    ge:     function(x,y){  return x >= y; },
-    lt:     function(x,y){  return x  < y; },
-    le:     function(x,y){  return x <= y; },
+    cmp       : function(x,y){  return x == y ? 0 : (x > y ? 1 : -1); },
+    eq        : function(x,y){  return x == y; },
+    ne        : function(x,y){  return x != y; },
+    gt        : function(x,y){  return x  > y; },
+    ge        : function(x,y){  return x >= y; },
+    lt        : function(x,y){  return x  < y; },
+    le        : function(x,y){  return x <= y; },
     
     // math
-    add:    function(x,y){  return x  + y; },
-    sub:    function(x,y){  return x  - y; },
-    mul:    function(x,y){  return x  * y; },
-    div:    function(x,y){  return x  / y; },
-    flrdiv: function(x,y){  return Math.floor(x / y); },
-    mod:    function(x,y){  return x  % y; },
+    add       : function(x,y){  return x  + y; },
+    sub       : function(x,y){  return x  - y; },
+    mul       : function(x,y){  return x  * y; },
+    div       : function(x,y){  return x  / y; },
+    flrdiv    : function(x,y){  return Math.floor(x / y); },
+    mod       : function(x,y){  return x  % y; },
     
     // logic
-    and:    function(x,y){  return x && y; },
-    or:     function(x,y){  return x || y; },
-    xor:    function(x,y){  return x != y; },
-    not:    function(x){    return !x; },
-    neg:    function(x){    return -x; },
+    and       : function(x,y){  return x && y; },
+    or        : function(x,y){  return x || y; },
+    xor       : function(x,y){  return x != y; },
+    not       : function(x){    return !x; },
+    neg       : function(x){    return -x; },
     
     // bitwise
-    bitnot: function(x){    return ~x; },
-    bitand: function(x,y){  return x  & y; },
-    bitor:  function(x,y){  return x  | y; },
-    bitxor: function(x,y){  return x  ^ y; },
-    lshift: function(x,y){  return x << y; },
-    rshift: function(x,y){  return x >> y; },
-    zrshift: function(x,y){ return x >>> y; },
+    bitnot    : function(x){    return ~x; },
+    bitand    : function(x,y){  return x  & y; },
+    bitor     : function(x,y){  return x  | y; },
+    bitxor    : function(x,y){  return x  ^ y; },
+    lshift    : function(x,y){  return x << y; },
+    rshift    : function(x,y){  return x >> y; },
+    zrshift   : function(x,y){  return x >>> y; },
     
     // values
-    nop:    function(x){},
-    I:      function(x){       return x; },
-    K:      function(k){       return function(){ return k; }; },
-    nth:    function(n){       return function(){ return arguments[n]; }; },
-    val:    function(def,o){   return o !== undefined ? o : def; },
-    ok:     function(o){       return o !== undefined && o !== null; },
+    nop       : function(x){},
+    I         : function(x){       return x; },
+    K         : function(k){       return function(){ return k; }; },
+    nth       : function(n){       return function(){ return arguments[n]; }; },
+    val       : function(def,o){   return o !== undefined ? o : def; },
+    ok        : function(o){       return o !== undefined && o !== null; },
     
     // reduce-ordered values & accessors
-    khas:    function(k,o){     return k in o; },
-    kget:    function(k,o){     return o[k] },
-    defkget: function(def,k,o){ return (k in o ? o[k] : def); },
-    vkset:   function(o,v,k){   if (o && k !== undefined){ o[k] = v; } return o; },
+    khas      : function(k,o){     return k in o; },
+    kget      : function(k,o){     return o[k] },
+    defkget   : function(def,k,o){ return (k in o ? o[k] : def); },
+    thisget   : function(k){       return this[k] },
+    vkset     : function(o,v,k){   if (o && k !== undefined){ o[k] = v; } return o; },
     
     // curry-ordered values & accessors
-    has:     function(o,k){     return k in o; },
-    get:     function(o,k){     return o[k] },
-    getdef:  function(o,k,def){ return (k in o ? o[k] : def); },
-    set:     core.set,  // set(  o, key, value, def )
-    attr:    core.attr, // attr( o, key, value, def )
-    method: function(name){
+    has       : function(o,k){     return k in o; },
+    get       : function(o,k){     return o[k] },
+    getdef    : function(o,k,def){ return (k in o ? o[k] : def); },
+    kvset     : function(o,k,v){   if (o && k !== undefined){ o[k] = v; } return o; },
+    thiskvset : function(k,v){     if (k !== undefined){ this[k] = v; }   return this; },
+    set       : core.set,  // set(  o, key, value, def )
+    attr      : core.attr, // attr( o, key, value, def )
+    method    : function(name){
         var args = slice.call(arguments,1);
         return function(obj){
             if (obj && obj[name])
index f0af263..00c3e13 100644 (file)
@@ -45,13 +45,34 @@ YCollection.subclass('YArray', function(YArray){
     function size(){
         return this._o.length;
     };
+    
     Object.defineProperty(this, 'length', { 'get':size });
     
+    // Convenience getters for index 0-9
+    var thisget   = op.thisget
+    ,   thiskvset = op.thiskvset ;
+    for (var i=0; i<10; i++)
+        Object.defineProperty(this, i, {
+            'get' : thisget.partial(i),
+            'set' : thiskvset.partial(i)
+        });
+    
+    
     this['toString'] =
     function toString(){
         return "Y[" + arrayToString.call(this._o) + "]";
     };
     
+    /**
+     * @return The first not-undefined value in the Array.
+     */
+    this['first'] =
+    function first(){
+        for (var i=0, A = this._o, L=A.length, v=A[i]; i<L; v=A[++i])
+            if (v !== undefined)
+                return v;
+    };
+    
     this['last'] =
     function last(){
         var A = this._o, L = A.length;
@@ -78,12 +99,14 @@ YCollection.subclass('YArray', function(YArray){
     this['remove'] =
     function remove(v){
         var L = arguments.length;
-        if (L == 1) {
+        if (L === 1) {
             var idx = this.indexOf(v);
-            if ( idx != -1 )
+            if ( idx !== -1 )
                 this.splice(idx, 1);
         } else if (L > 1)
-            slice.call(arguments,0).forEach(this.remove, this);
+            slice.call(arguments,0).forEach(function(v){
+                this.remove(v);
+            }, this);
         return this;
     };
     
@@ -147,4 +170,3 @@ YCollection.subclass('YArray', function(YArray){
     
     return this;
 });
-
index 7124871..b332334 100644 (file)
@@ -86,7 +86,7 @@ function methodize(fn) {
     return wraps(m, fn);
 }
 
-function genericize( fn ) {
+function genericize(fn) {
     fn = fn.toFunction();
     var g = fn.__genericized__
     ,   m = fn.__methodized__  ;
index 5bed958..b8e9f83 100644 (file)
@@ -1,5 +1,5 @@
 //#ensure "jquery"
-//#ensure "jquery.sparkline.min"
+//#ensure "jquery.sparkline"
 var Y = require('Y').Y
 ,
 
index 16d6f83..14e3713 100644 (file)
@@ -110,19 +110,23 @@ Y.subclass('QuadTree', {
     
     remove : function remove(region){
         var trees =
-            this.leaves(
-                region.x1,region.y1, region.x2,region.y2,
-                function(trees, regions, tree){
-                    Y(regions).remove(region);
-                    
-                    if ( !trees[tree.depth] )
-                        trees[tree.depth] = [];
-                    trees[tree.depth].push();
-                    
-                    return trees;
-                }, []);
+        this.leaves(region.x1,region.y1, region.x2,region.y2,
+            function(trees, regions, tree){
+                Y(regions).remove(region);
+                
+                // var d = tree.depth;
+                // if ( trees.length < d )
+                //     trees.length = d;
+                // if ( !trees[d] )
+                //     trees[d] = [];
+                // 
+                // trees[d].push(tree);
+                
+                return trees;
+            }, []);
         
-        Y(trees.pop()).invoke('_balance');
+        // Figure out what needs to be balanced (start at the bottom)
+        // Y(trees.pop()).invoke('_balance');
         
         return region;
     },
index 9178463..5d10793 100644 (file)
@@ -4,13 +4,15 @@ var Y = require('Y').Y
 ,   defaults =
 exports['defaults'] = {
     ui : {
-        showGridCoords : false,
-        showCountdown  : false
+        createGridCanvas : 1,
+        createGridTable  : 0,
+        showGridCoords   : 0,
+        showCountdown    : 1
     },
     pathing : { 
-        overlayAIPaths    : false,
-        overlayPathmap    : false,
-        traceTrajectories : false
+        overlayAIPaths    : 0,
+        overlayPathmap    : 0,
+        traceTrajectories : 0
     }
 };
 
index 7f806aa..5014f4a 100644 (file)
@@ -37,7 +37,6 @@ Circle.subclass('Explosion', {
                         .fill(color)
                         .animate(duration, { 'radius':ringEnd }, options)
                         .appendTo(prev);
-            // prev.layer.css({ 'top':'50%', 'left':'50%' });
         }, this);
     },
     
index 88e558b..af6ccf8 100644 (file)
@@ -21,31 +21,32 @@ exports['Game'] =
 Y.subclass('Game', {
     overlayPathmap : false,
     
+    gameover      : false,
+    gameoverDelay : 1000,
+    
+    
     
     init : function initGame(viewport){
         Y.bindAll(this);
         
         this.byId = {};
-        this.active   = new Y.YArray();
-        this.units    = new Y.YArray();
-        this.bullets  = new Y.YArray();
+        this.active     = new Y.YArray();
+        this.units      = new Y.YArray();
+        this.bullets    = new Y.YArray();
         this.animations = new Y.YArray();
-        this.viewport = $(viewport || GRID_ELEMENT);
         
+        this.viewport = $(viewport || GRID_ELEMENT);
         this.loop = new EventLoop(this, FRAME_RATE);
         
         this.root = 
         this.grid = 
             new Grid(COLUMNS,ROWS, REF_SIZE)
                 .appendTo(this.viewport);
-        
         this.level =
             new Level(this, COLUMNS*REF_SIZE, ROWS*REF_SIZE)
                 .appendTo(this.root);
-        
         this.pathmap = this.level.pathmap;
         
-        
         Thing.addEventListener('create',  this.addUnit);
         Thing.addEventListener('destroy', this.killUnit);
         
@@ -55,6 +56,8 @@ Y.subclass('Game', {
     },
     
     destroy : function destroy(){
+        Thing.removeEventListener('create',  this.addUnit);
+        Thing.removeEventListener('destroy', this.killUnit);
         this.stop();
         this.resetGlobals();
     },
@@ -79,7 +82,8 @@ Y.subclass('Game', {
      * Main Event Loop.
      */
     tick : function tick(evt){
-        var d = evt.data;
+        var d = evt.data
+        ,   self = this;
         
         NOW      = d.now;
         ELAPSED  = d.elapsed;
@@ -96,14 +100,19 @@ Y.subclass('Game', {
         
         this.draw();
         
-        if ( this.player.dead ) {
-            this.fire('lose', this.player);
-            this.stop();
-            
-        } else if ( !this.units.filter('_.align !== 1 && !_.dead'.lambda()).size() ) {
-            this.fire('win', this.player);
-            this.stop();
-        }
+        if ( this.gameover )
+            return;
+        
+        if ( this.player.dead )
+            this.gameover = 'lose';
+        else if ( !this.units.filter('_.align !== 1 && !_.dead'.lambda()).size() )
+            this.gameover = 'win';
+        
+        if ( this.gameover )
+            setTimeout(function(){
+                self.fire(self.gameover, self.player);
+                self.stop();
+            }, this.gameoverDelay);
         
     },
     
@@ -160,8 +169,6 @@ Y.subclass('Game', {
         if (unit instanceof Event)
             unit = unit.trigger;
         
-        // console.log('killUnit(', unit, ')');
-        
         delete this.byId[unit.id];
         this.active.remove(unit);
         this.pathmap.removeBlocker(unit);
index ac0e6e4..8e3f3a3 100644 (file)
@@ -55,9 +55,14 @@ Thing.subclass('Wall', {
     },
     
     toString : function(){
-        var loc = this.loc
-        ,   x1 = loc.x, y1 = loc.y
-        ,   x2 = x1+this.width, y2 = y1 + this.height;
+        var bb = this.boundingBox
+        ,   x1,y1, x2,y2;
+        if (bb){
+            x1 = bb.x1; y1 = bb.y1;
+            x2 = bb.x2; y2 = bb.y2;
+        } else {
+            x1=y1=x2=y2=NaN;
+        }
         return this.className+'['+x1+','+y1+', '+x2+','+y2+'](w='+this.width+', h='+this.height+')';
     }
 });
index b6541bc..d609c96 100644 (file)
@@ -15,9 +15,12 @@ exports['Bullet'] =
 Thing.subclass('Bullet', {
     traceTrajectories : true,
     
-    explDuration : 750,
-    explStart    : 1.0,
-    explEnd      : 1.5,
+    explosions : {
+        timeBase : 400,     // base duration (ms)
+        timeInc  : 25 / 6,  // add 25ms per 6px of radius
+        start    : 1.0,     // ratio of explosion start radius to obj size
+        end      : 1.5      // ratio of explosion end radius to obj size
+    },
     
     
     
@@ -75,52 +78,54 @@ Thing.subclass('Bullet', {
     },
     
     act : function act(){
-        if (!this.dead)
-            this.move();
+        if (!this.dead) this.move();
         return this;
     },
     
     move : function move(){
-        var to = this.trajectory.step( ELAPSED );
-        
-        if (!this.dead)
-            this.game.moveUnitTo(this, to.x, to.y);
-        
+        // We test twice because the process of calculating the trajectory
+        // could result in a collision, killing the bullet
+        if (!this.dead) var to = this.trajectory.step( ELAPSED );
+        if (!this.dead) this.game.moveUnitTo(this, to.x, to.y);
         return this;
     },
     
     onCollide : function onCollide(evt){
         var unit = evt.trigger
+        ,   hitAWall = unit instanceof Wall
         ,   trj = this.trajectory;
         
-        if ( this.dead || unit instanceof Wall && trj.bounces <= this.bounceLimit )
+        if ( this.dead || hitAWall && trj.bounces <= this.bounceLimit )
             return;
         
         unit.dealDamage(this.stats.power, this);
-        
         this.destroy();
         trj.halt = true;
         
         // Trigger explosion
-        var loc   = this.loc, uloc = unit.loc
-        ,   x = math.lerp(0.5,loc.x,uloc.x)
-        ,   y = math.lerp(0.5,loc.y,uloc.y)
-        
+        var x, y, loc = this.loc, uloc = unit.loc
         ,   bsize = Math.max(this.width, this.height)
         ,   asize = Math.max(unit.width, unit.height)
         
-        ,   duration = this.explDuration
+        ,   ex    = this.explosions
         ,   start = bsize, end = bsize
         ;
         
+        if (hitAWall) {
+            x = loc.x;
+            y = loc.y;
+        } else {
+            x = math.lerp(0.5,loc.x,uloc.x);
+            y = math.lerp(0.5,loc.y,uloc.y);
+        }
+        
         if ( unit.dead && asize >= bsize )
             end = asize;
         
-        start = this.explStart * start;
-        end   = this.explEnd   * end;
-        this.game.addAnimation(
-            new Explosion(start, end, duration)
-                .position(x,y) );
+        var dur = ex.timeBase + ex.timeInc*end;
+        start = ex.start * start;
+        end   = ex.end   * end;
+        this.game.addAnimation(new Explosion(start, end, dur).position(x,y));
     },
     
     render : function render(parent){
index 153099a..3e143d7 100644 (file)
@@ -1,5 +1,5 @@
 //#ensure "jquery"
-//#ensure "jquery.hotkeys.min"
+//#ensure "jquery.hotkeys"
 
 var Y    = require('Y').Y
 ,   Tank = require('tanks/thing/tank').Tank
@@ -66,7 +66,7 @@ Tank.subclass('PlayerTank', {
             this.shoot(action.x, action.y);
         
         else if ( this.activeKeys.size() )
-            this.move();
+            this.playerMove();
         
         return this;
     },
@@ -79,7 +79,19 @@ Tank.subclass('PlayerTank', {
         });
     },
     
-    move : function move(){
+    playerMove : function playerMove(){
+        var dir = this.activeKeys
+            .unique()
+            .sort()
+            .join(' ');
+        
+        if (!dir) return;
+        
+        // @see Tank.move()
+        this.move(this.loc.moveByDir(dir, REF_SIZE));
+    },
+    
+    _move : function move(){
         var dir = this.activeKeys
             .unique()
             .sort()
@@ -90,7 +102,7 @@ Tank.subclass('PlayerTank', {
         var toLoc = this.loc.moveByDir(dir, (this.stats.move * SQUARETH))
         
         ,   x = toLoc.x, y = toLoc.y
-        ,   bb = this.boundingBox.relocate(x,y)
+        ,   bb = this.boundingBox.relocated(x,y)
         
         ,   blockers = this.game.pathmap.get(bb.x1,bb.y1, bb.x2,bb.y2).remove(this)
         ;
index b35b859..ec1eeee 100644 (file)
@@ -10,6 +10,7 @@ var Y          = require('Y').Y
 
 ,   isBullet = Y.is(Bullet)
 ,   BULLET_MOVE_PER_FRAME = MS_PER_FRAME * Bullet.prototype.stats.move*REF_SIZE/1000
+,   _X = 0, _Y = 1
 ,
 
 
@@ -272,12 +273,10 @@ Thing.subclass('Tank', function(Tank){
      */
     this['move'] =
     function move(x,y){
-        var bb = this.boundingBox
-        ,   w2 = bb.width/2, h2 = bb.height/2
-        ,   x2 = x-w2,  y2 = y-h2
-        ;
-        this.trajectory = new Trajectory(this, bb.x1,bb.y1, x2,y2, this.stats.move*REF_SIZE/1000);
-        return this.moveByAngle( this.angleTo(x,y), x2,y2 );
+        if (x instanceof Array) { y=x[_Y]; x=x[_X]; }
+        var loc = this.loc;
+        this.trajectory = new Trajectory(this, loc.x,loc.y, x,y, this.stats.move*REF_SIZE/1000);
+        return this.moveByAngle(this.angleTo(x,y), x,y);
     };
     
     /** 
@@ -287,24 +286,24 @@ Thing.subclass('Tank', function(Tank){
     this['moveByAngle'] =
     function moveByAngle(theta, targetX,targetY){
         var abs = Math.abs
-        ,   bb  = this.boundingBox, w2 = bb.width/2, h2 = bb.height/2
-        ,   loc = this.loc, mid = bb.midpoint
+        ,   bb  = this.boundingBox
+        ,   loc = this.loc
         ,   to  = loc.moveByAngle(theta, this.stats.move * SQUARETH)
+        ,   x = to.x, y = to.y
         ;
         
         // Don't overshoot the target
-        if ( targetX !== undefined && abs(loc.x-to.x) > abs(loc.x-targetX) )
-            to.setXY(targetX, to.y);
+        if ( targetX !== undefined && abs(loc.x-x) > abs(loc.x-targetX) )
+            x = targetX;
         
-        if ( targetY !== undefined && abs(loc.y-to.y) > abs(loc.y-targetY) )
-            to.setXY(to.x, targetY);
+        if ( targetY !== undefined && abs(loc.y-y) > abs(loc.y-targetY) )
+            y = targetY;
         
-        var nbb = bb.relocated(to.x,to.y)
-        ,   blockers = this.game.pathmap.get(nbb.x1,nbb.y1, nbb.x2,nbb.y2).remove(this)
-        ;
+        var nbb = bb.relocated(x,y)
+        ,   blockers = this.game.pathmap.get(nbb.x1,nbb.y1, nbb.x2,nbb.y2).remove(this);
         
         if ( !blockers.size() )
-            this.game.moveUnitTo(this, to.x, to.y);
+            this.game.moveUnitTo(this, x,y);
         
         return this;
     };
index 5087f2c..7424f5c 100644 (file)
@@ -1,5 +1,6 @@
 var Y = require('Y').Y
 ,   Rect = require('ezl/shape').Rect
+,   config = require('tanks/config').values
 ,
 
 Grid =
@@ -7,10 +8,12 @@ exports['Grid'] =
 Rect.subclass('Grid', {
     _cssClasses : 'ezl layer shape rect grid',
     
-    lineWidth : 0.5,
     strokeStyle : '#6E6E6E',
-    createTableGrid : false,
-    createCanvasGrid : true,
+    lineWidth   : 0.5,
+    
+    createGridTable  : config.ui.createGridTable,
+    createGridCanvas : config.ui.createGridCanvas,
+    
     
     
     init : function init(cols,rows, side){
@@ -30,7 +33,7 @@ Rect.subclass('Grid', {
         ,   h    =  this.canvasHeight
         ;
         
-        if ( this.createTableGrid ) {
+        if ( this.createGridTable ) {
             var tbody = $('<tbody/>');
             Y(0, rows).forEach(function(y){
                 var row = $('<tr class="row row'+y+'" />').appendTo(tbody);
@@ -51,7 +54,7 @@ Rect.subclass('Grid', {
         } else
             this.table = null;
         
-        if ( this.createCanvasGrid ) {
+        if ( this.createGridCanvas ) {
             ctx.lineWidth   = this.lineWidth;
             ctx.strokeStyle = this.strokeStyle;
             
index 7e4a084..b9043d0 100644 (file)
@@ -1,5 +1,5 @@
 //#ensure "jquery"
-//#ensure "jquery.hotkeys.min"
+//#ensure "jquery.hotkeys"
 
 require("Y/modules/y.kv");
 
@@ -9,6 +9,8 @@ var Y            = require('Y').Y
 ,   Game         = require('tanks/game').Game
 ,   Tank         = require('tanks/thing').Tank
 ,   FpsSparkline = require('ezl/loop').FpsSparkline
+
+,   updateTimer  = null
 ;
 
 qkv = Y(window.location.search.slice(1)).fromKV();
@@ -112,7 +114,7 @@ function setupUI(){
     
     
     LBT.root.draw();
-    setInterval(updateInfo, 1000);
+    updateTimer = setInterval(updateInfo, 1000);
     
     updateInfo();
     
@@ -126,6 +128,10 @@ function teardownUI(){
     $(document).unbind('keydown', pauseGame);
     
     $('#welcome, #pause, #gameover').hide();
+    if (updateTimer !== null) {
+        clearInterval(updateTimer);
+        updateTimer = null;
+    }
 }
 
 
index 62c799f..b552bb9 100644 (file)
@@ -16,7 +16,7 @@
 <script src="build/Y/types/number.js" type="text/javascript"></script>
 <script src="build/Y.js" type="text/javascript"></script>
 <script src="build/jquery.js" type="text/javascript"></script>
-<script src="build/jquery.sparkline.min.js" type="text/javascript"></script>
+<script src="build/jquery.sparkline.js" type="text/javascript"></script>
 <script src="build/Y/modules/y.event.js" type="text/javascript"></script>
 <script src="build/ezl/util.js" type="text/javascript"></script>
 <script src="build/ezl/loop/fps.js" type="text/javascript"></script>
@@ -41,8 +41,8 @@
 <script src="build/ezl/shape/rect.js" type="text/javascript"></script>
 <script src="build/ezl/shape.js" type="text/javascript"></script>
 <script src="build/ezl.js" type="text/javascript"></script>
-<script src="build/jquery.hotkeys.min.js" type="text/javascript"></script>
 <script src="build/tanks/globals.js" type="text/javascript"></script>
+<script src="build/jquery.hotkeys.js" type="text/javascript"></script>
 <script src="build/ezl/util/binaryheap.js" type="text/javascript"></script>
 <script src="build/ezl/util/astar.js" type="text/javascript"></script>
 <script src="build/tanks/config.js" type="text/javascript"></script>
@@ -51,8 +51,8 @@
 <script src="build/tanks/ui/config.js" type="text/javascript"></script>
 <script src="build/tanks/thing/thing.js" type="text/javascript"></script>
 <script src="build/tanks/map/trajectory.js" type="text/javascript"></script>
-<script src="build/tanks/map/wall.js" type="text/javascript"></script>
 <script src="build/tanks/ui/grid.js" type="text/javascript"></script>
+<script src="build/tanks/map/wall.js" type="text/javascript"></script>
 <script src="build/tanks/fx/explosion.js" type="text/javascript"></script>
 <script src="build/tanks/thing/bullet.js" type="text/javascript"></script>
 <script src="build/tanks/thing/tank.js" type="text/javascript"></script>
index 237ac71..8a59783 100644 (file)
@@ -11,7 +11,7 @@ COLS = w/PPU; COLS2 = COLS/2;
 ROWS = h/PPU; ROWS2 = ROWS/2;
 
 grid = new Grid( COLS, ROWS, PPU ).appendTo(plot);
-grid.createTableGrid = false;
+grid.createGridTable = false;
 grid.lineWidth = 1.0;
 grid.strokeStyle = '#E0E0E0'; //'#EEEEEE'; //
 grid.draw();
index 3ea753a..8fc9afa 100644 (file)
@@ -19,7 +19,7 @@ $(function(){
     ROWS = h/REF_SIZE; ROWS2 = ROWS/2;
     
     grid = new Grid( COLS, ROWS, REF_SIZE ).appendTo(el);
-    grid.createTableGrid = false;
+    grid.createGridTable = false;
     grid.lineWidth = 1.0;
     grid.strokeStyle = '#E0E0E0'; //'#EEEEEE'; //