/*!
 * jQuery JavaScript Library v1.4.2
 * 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: Sat Feb 13 22:33:48 2010 -0500
 */
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(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 X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i?
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r=
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype,
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f],
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]===
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&&
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();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 e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);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===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
a,b)})},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 f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
w)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 Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(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(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ",
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ",
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}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(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i=
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
c.inArray(c(this).val(),u)>=0});if(!u.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,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
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:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!=
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===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 originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;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=s.documentElement;d=s.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&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)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,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this,
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){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=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,
isImmediatePropagationStopped:Y};var Da=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){}},Ea=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?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});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)return na("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)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}};
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=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(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.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 fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}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 f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,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]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.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(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector,
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}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){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",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){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[];
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length-
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=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,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]=
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[];
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=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 h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||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,h,l){return!!k(l[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,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m=
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m=
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>";
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
(function(){var g=s.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(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/,
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},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){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},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,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===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 Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)?
a:b+"></"+d+">"},F={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,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._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!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).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,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}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,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);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(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):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),f=d.html();d.replaceWith(a.call(this,b,f))});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){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length===
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!==
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});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||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).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,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},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,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},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:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)?
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B=
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x);
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status===
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b===
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional;
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing=
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration===
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+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);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},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=J(),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 f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,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()},stop:function(){clearInterval(W);W=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};c.fn.offset="getBoundingClientRect"in s.documentElement?
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle;
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||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;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;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.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.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(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset":
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);


//----------------------------------------------------------------------------------------------------
// Must be included after jQuery is defined
//----------------------------------------------------------------------------------------------------

//----------------------------------------------------------------------------------------------------
// jQuery function for sliding and toggling together.  Used for hints.
jQuery.fn.slideFadeToggle = function(speed, easing, callback) {
    return this.animate({opacity: 'toggle', height: 'toggle'}, speed, easing, callback); 
};

/**
 * Ajax Queue Plugin
 * 
 * Homepage: http://jquery.com/plugins/project/ajaxqueue
 * Documentation: http://docs.jquery.com/AjaxQueue
 *
 *  WBH Note: This plugin is used on one line of jquery-autocomplete for its ability to abort a previously
 *  made AJAX request.  And that's it.  Worth the trouble of including everywhere?  Undecided.
 */

/**

<script>
$(function(){
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxQueue({
		url: "test.php",
		success: function(html){ jQuery("ul").append(html); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
	jQuery.ajaxSync({
		url: "test.php",
		success: function(html){ jQuery("ul").append("<b>"+html+"</b>"); }
	});
});
</script>
<ul style="position: absolute; top: 5px; right: 5px;"></ul>

 */
/*
 * Queued Ajax requests.
 * A new Ajax request won't be started until the previous queued 
 * request has finished.
 */

/*
 * Synced Ajax requests.
 * The Ajax request will happen as soon as you call this method, but
 * the callbacks (success/error/complete) won't fire until all previous
 * synced requests have been completed.
 */


(function($) {
	
	var ajax = $.ajax;
	
	var pendingRequests = {};
	
	var synced = [];
	var syncedData = [];
	
	$.ajax = function(settings) {
		// create settings for compatibility with ajaxSetup
		settings = jQuery.extend(settings, jQuery.extend({}, jQuery.ajaxSettings, settings));
		
		var port = settings.port;
		
		switch(settings.mode) {
		case "abort": 
			if ( pendingRequests[port] ) {
				pendingRequests[port].abort();
			}
			return pendingRequests[port] = ajax.apply(this, arguments);
		case "queue": 
			var _old = settings.complete;
			settings.complete = function(){
				if ( _old )
					_old.apply( this, arguments );
				jQuery([ajax]).dequeue("ajax" + port );;
			};
		
			jQuery([ ajax ]).queue("ajax" + port, function(){
				ajax( settings );
			});
			return;
		case "sync":
			var pos = synced.length;
	
			synced[ pos ] = {
				error: settings.error,
				success: settings.success,
				complete: settings.complete,
				done: false
			};
		
			syncedData[ pos ] = {
				error: [],
				success: [],
				complete: []
			};
		
			settings.error = function(){ syncedData[ pos ].error = arguments; };
			settings.success = function(){ syncedData[ pos ].success = arguments; };
			settings.complete = function(){
				syncedData[ pos ].complete = arguments;
				synced[ pos ].done = true;
		
				if ( pos == 0 || !synced[ pos-1 ] )
					for ( var i = pos; i < synced.length && synced[i].done; i++ ) {
						if ( synced[i].error ) synced[i].error.apply( jQuery, syncedData[i].error );
						if ( synced[i].success ) synced[i].success.apply( jQuery, syncedData[i].success );
						if ( synced[i].complete ) synced[i].complete.apply( jQuery, syncedData[i].complete );
		
						synced[i] = null;
						syncedData[i] = null;
					}
			};
		}
		return ajax.apply(this, arguments);
	};
	
})(jQuery);

/*
 * Autocomplete - jQuery plugin 1.0.2
 *
 * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
 *
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * Revision: $Id: jquery.autocomplete.js 5751 2008-06-26 20:12:49Z joern.zaefferer $
 *
 */

;(function($) {
	
$.fn.extend({
	autocomplete: function(urlOrData, options) {
		var isUrl = typeof urlOrData == "string";
		options = $.extend({}, $.Autocompleter.defaults, {
			url: isUrl ? urlOrData : null,
			data: isUrl ? null : urlOrData,
			delay: isUrl ? $.Autocompleter.defaults.delay : 10,
			max: options && !options.scroll ? 10 : 150,
			lastSubmittedData: ''
		}, options);
		
		// if highlight is set to false, replace it with a do-nothing function
		options.highlight = options.highlight || function(value) { return value; };
		
		// if the formatMatch option is not specified, then use formatItem for backwards compatibility
		options.formatMatch = options.formatMatch || options.formatItem;
		
		return this.each(function() {
			new $.Autocompleter(this, options);
		});
	},
	result: function(handler) {
		return this.bind("result", handler);
	},
	search: function(handler) {
		return this.trigger("search", [handler]);
	},
	flushCache: function() {
		return this.trigger("flushCache");
	},
	setOptions: function(options){
		return this.trigger("setOptions", [options]);
	},
	unautocomplete: function() {
		return this.trigger("unautocomplete");
	}
});

$.Autocompleter = function(input, options) {

	var KEY = {
		UP: 38,
		DOWN: 40,
		DEL: 46,
		TAB: 9,
		RETURN: 13,
		ESC: 27,
		COMMA: 188,
		PAGEUP: 33,
		PAGEDOWN: 34,
		BACKSPACE: 8
	};

	// Create $ object for input element
	var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);

	var timeout;
	var previousValue = "";
	var cache = $.Autocompleter.Cache(options);
	var hasFocus = 0;
	var lastKeyPressCode;
	var config = {
		mouseDownOnSelect: false
	};
	var select = $.Autocompleter.Select(options, input, selectCurrent, config);
	
	var blockSubmit;
	
	// prevent form submit in opera when selecting with return key
	$.browser.opera && $(input.form).bind("submit.autocomplete", function() {
		if (blockSubmit) {
			blockSubmit = false;
			return false;
		}
	});
	
	// only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
	$input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
		// track last key pressed
		lastKeyPressCode = event.keyCode;
		switch(event.keyCode) {
		
			case KEY.UP:
				event.preventDefault();
				if ( select.visible() ) {
					select.prev();
				} else {
					onChange(0, true);
				}
				break;
				
			case KEY.DOWN:
				event.preventDefault();
				if ( select.visible() ) {
					select.next();
				} else {
					onChange(0, true);
				}
				break;
				
			case KEY.PAGEUP:
				event.preventDefault();
				if ( select.visible() ) {
					select.pageUp();
				} else {
					onChange(0, true);
				}
				break;
				
			case KEY.PAGEDOWN:
				event.preventDefault();
				if ( select.visible() ) {
					select.pageDown();
				} else {
					onChange(0, true);
				}
				break;
			
			// matches also semicolon
			case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
			case KEY.TAB:
			case KEY.RETURN:
				if( selectCurrent() ) {
					// stop default to prevent a form submit, Opera needs special handling
					event.preventDefault();
					blockSubmit = true;
					return false;
				}
				break;
				
			case KEY.ESC:
				select.hide();
				break;
				
			default:
				clearTimeout(timeout);
				timeout = setTimeout(onChange, options.delay);
				break;
		}
	}).focus(function(){
		// track whether the field has focus, we shouldn't process any
		// results if the field no longer has focus
		hasFocus++;
	}).blur(function() {
		hasFocus = 0;
		if (!config.mouseDownOnSelect) {
			hideResults();
		}
	}).click(function() {
		// show select when clicking in a focused field
		if ( hasFocus++ > 1 && !select.visible() ) {
			onChange(0, true);
		}
	}).bind("search", function() {
		// TODO why not just specifying both arguments?
		var fn = (arguments.length > 1) ? arguments[1] : null;
		function findValueCallback(q, data) {
			var result;
			if( data && data.length ) {
				for (var i=0; i < data.length; i++) {
					if( data[i].result.toLowerCase() == q.toLowerCase() ) {
						result = data[i];
						break;
					}
				}
			}
			if( typeof fn == "function" ) fn(result);
			else $input.trigger("result", result && [result.data, result.value]);
		}
		$.each(trimWords($input.val()), function(i, value) {
			request(value, findValueCallback, findValueCallback);
		});
	}).bind("flushCache", function() {
		cache.flush();
	}).bind("setOptions", function() {
		$.extend(options, arguments[1]);
		// if we've updated the data, repopulate
		if ( "data" in arguments[1] )
			cache.populate();
	}).bind("unautocomplete", function() {
		select.unbind();
		$input.unbind();
		$(input.form).unbind(".autocomplete");
	});
	
	
	function selectCurrent() {
		var selected = select.selected();
		if( !selected )
			return false;
		
		var v = selected.result;
		previousValue = v;
		
		if ( options.multiple ) {
			var words = trimWords($input.val());
			if ( words.length > 1 ) {
				v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v;
			}
			v += options.multipleSeparator;
		}
		
		$input.val(v);
		hideResultsNow();
		$input.trigger("result", [selected.data, selected.value]);
		if (options.submitOnSelect) {
			$input.parent().submit();
		}
		return true;
	}
	
	function onChange(crap, skipPrevCheck) {
		if( lastKeyPressCode == KEY.DEL ) {
			select.hide();
			return;
		}
		
		var currentValue = $input.val();
		
		if ( !skipPrevCheck && currentValue == previousValue )
			return;
		
		previousValue = currentValue;
		
		currentValue = lastWord(currentValue);
		if ( currentValue.length >= options.minChars) {
			$input.addClass(options.loadingClass);
			if (!options.matchCase)
				currentValue = currentValue.toLowerCase();
			request(currentValue, receiveData, hideResultsNow);
		} else {
			stopLoading();
			select.hide();
		}
	};
	
	function trimWords(value) {
		if ( !value ) {
			return [""];
		}
		var words = value.split( options.multipleSeparator );
		var result = [];
		$.each(words, function(i, value) {
			if ( $.trim(value) )
				result[i] = $.trim(value);
		});
		return result;
	}
	
	function lastWord(value) {
		if ( !options.multiple )
			return value;
		var words = trimWords(value);
		return words[words.length - 1];
	}
	
	// fills in the input box w/the first match (assumed to be the best match)
	// q: the term entered
	// sValue: the first matching result
	function autoFill(q, sValue){
		// autofill in the complete box w/the first match as long as the user hasn't entered in more data
		// if the last user key pressed was backspace, don't autofill
		if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
			// fill in the value (keep the case the user has typed)
			$input.val($input.val() + sValue.substring(lastWord(previousValue).length));
			// select the portion of the value not typed by the user (so the next character will erase)
			$.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length);
		}
	};

	function hideResults() {
		clearTimeout(timeout);
		timeout = setTimeout(hideResultsNow, 200);
	};

	function hideResultsNow() {
		var wasVisible = select.visible();
		select.hide();
		clearTimeout(timeout);
		stopLoading();
		if (options.mustMatch) {
			// call search and run callback
			$input.search(
				function (result){
					// if no value found, clear the input box
					if( !result ) {
						if (options.multiple) {
							var words = trimWords($input.val()).slice(0, -1);
							$input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
						}
						else
							$input.val( "" );
					}
				}
			);
		}
		if (wasVisible)
			// position cursor at end of input field
			$.Autocompleter.Selection(input, input.value.length, input.value.length);
	};

	function receiveData(q, data) {
		if ( data && data.length && hasFocus ) {
			stopLoading();
			select.display(data, q);
			autoFill(q, data[0].value);
			select.show();
		} else {
			hideResultsNow();
		}
	};

	function request(term, success, failure) {
		if (!options.matchCase)
			term = term.toLowerCase();
		var data = cache.load(term);
		// recieve the cached data
		if (data && data.length) {
			success(term, data);
		// if an AJAX url has been supplied, try loading the data now
		} else if( (typeof options.url == "string") && (options.url.length > 0) && (options.lastSubmittedData != term)){
			// Ensure we won't resubmit this under any circumstances (such as a double click) if the user hasn't changed their query term 
			options.lastSubmittedData = term;
			
			var extraParams = {
				timestamp: +new Date()
			};
			$.each(options.extraParams, function(key, param) {
				extraParams[key] = typeof param == "function" ? param() : param;
			});
			
			$.ajax({
				// try to leverage ajaxQueue plugin to abort previous requests
				mode: "abort",
				// limit abortion to this input
				port: "autocomplete" + input.name,
				dataType: options.dataType,
				url: options.url,
				data: $.extend({
					q: lastWord(term),
					limit: options.max
				}, extraParams),
				success: function(data) {
					var parsed = options.parse && options.parse(data) || parse(data);
					cache.add(term, parsed);
					success(term, parsed);
				}
			});
		} else {
			// if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
			select.emptyList();
			failure(term);
		}
	};
	
	function parse(data) {
		var parsed = [];
		var rows = data.split("\n");
		for (var i=0; i < rows.length; i++) {
			var row = $.trim(rows[i]);
			if (row) {
				row = row.split("|");
				parsed[parsed.length] = {
					data: row,
					value: row[0],
					result: options.formatResult && options.formatResult(row, row[0]) || row[0]
				};
			}
		}
		return parsed;
	};

	function stopLoading() {
		$input.removeClass(options.loadingClass);
	};

};

$.Autocompleter.defaults = {
	inputClass: "ac_input",
	resultsClass: "ac_results",
	loadingClass: "ac_loading",
	minChars: 1,
	delay: 400,
	matchCase: false,
	matchSubset: true,
	matchContains: false,
	cacheLength: 10,
	max: 100,
	mustMatch: false,
	extraParams: {},
	selectFirst: true,
	formatItem: function(row) { return row[0]; },
	formatMatch: null,
	autoFill: false,
	width: 0,
	multiple: false,
	submitOnSelect:false,
	multipleSeparator: ", ",
	highlight: function(value, term) {
		return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "<strong>$1</strong>");
	},
    scroll: true,
    scrollHeight: 180
};

$.Autocompleter.Cache = function(options) {

	var data = {};
	var length = 0;
	
	function matchSubset(s, sub) {
		if (!options.matchCase) 
			s = s.toLowerCase();
		var i = s.indexOf(sub);
		if (i == -1) return false;
		return i == 0 || options.matchContains;
	};
	
	function add(q, value) {
		if (length > options.cacheLength){
			flush();
		}
		if (!data[q]){ 
			length++;
		}
		data[q] = value;
	}
	
	function populate(){
		if( !options.data ) return false;
		// track the matches
		var stMatchSets = {},
			nullData = 0;

		// no url was specified, we need to adjust the cache length to make sure it fits the local data store
		if( !options.url ) options.cacheLength = 1;
		
		// track all options for minChars = 0
		stMatchSets[""] = [];
		
		// loop through the array and create a lookup structure
		for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
			var rawValue = options.data[i];
			// if rawValue is a string, make an array otherwise just reference the array
			rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
			
			var value = options.formatMatch(rawValue, i+1, options.data.length);
			if ( value === false )
				continue;
				
			var firstChar = value.charAt(0).toLowerCase();
			// if no lookup array for this character exists, look it up now
			if( !stMatchSets[firstChar] ) 
				stMatchSets[firstChar] = [];

			// if the match is a string
			var row = {
				value: value,
				data: rawValue,
				result: options.formatResult && options.formatResult(rawValue) || value
			};
			
			// push the current match into the set list
			stMatchSets[firstChar].push(row);

			// keep track of minChars zero items
			if ( nullData++ < options.max ) {
				stMatchSets[""].push(row);
			}
		};

		// add the data items to the cache
		$.each(stMatchSets, function(i, value) {
			// increase the cache size
			options.cacheLength++;
			// add to the cache
			add(i, value);
		});
	}
	
	// populate any existing data
	setTimeout(populate, 25);
	
	function flush(){
		data = {};
		length = 0;
	}
	
	return {
		flush: flush,
		add: add,
		populate: populate,
		load: function(q) {
			if (!options.cacheLength || !length)
				return null;
			/* 
			 * if dealing w/local data and matchContains than we must make sure
			 * to loop through all the data collections looking for matches
			 */
			if( !options.url && options.matchContains ){
				// track all matches
				var csub = [];
				// loop through all the data grids for matches
				for( var k in data ){
					// don't search through the stMatchSets[""] (minChars: 0) cache
					// this prevents duplicates
					if( k.length > 0 ){
						var c = data[k];
						$.each(c, function(i, x) {
							// if we've got a match, add it to the array
							if (matchSubset(x.value, q)) {
								csub.push(x);
							}
						});
					}
				}				
				return csub;
			} else 
			// if the exact item exists, use it
			if (data[q]){
				return data[q];
			} else
			if (options.matchSubset) {
				for (var i = q.length - 1; i >= options.minChars; i--) {
					var c = data[q.substr(0, i)];
					if (c) {
						var csub = [];
						$.each(c, function(i, x) {
							if (matchSubset(x.value, q)) {
								csub[csub.length] = x;
							}
						});
						return csub;
					}
				}
			}
			return null;
		}
	};
};

$.Autocompleter.Select = function (options, input, select, config) {
	var CLASSES = {
		ACTIVE: "ac_over"
	};
	
	var listItems,
		active = -1,
		data,
		term = "",
		needsInit = true,
		element,
		list;
	
	// Create results
	function init() {
		if (!needsInit)
			return;
		element = $("<div/>")
		.hide()
		.addClass(options.resultsClass)
		.css("position", "absolute")
		.appendTo(document.body);
	
		list = $("<ul/>").appendTo(element).mouseover( function(event) {
			if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
	            active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
			    $(target(event)).addClass(CLASSES.ACTIVE);            
	        }
		}).click(function(event) {
			$(target(event)).addClass(CLASSES.ACTIVE);
			select();
			// TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
			input.focus();
			return false;
		}).mousedown(function() {
			config.mouseDownOnSelect = true;
		}).mouseup(function() {
			config.mouseDownOnSelect = false;
		});
		
		if( options.width > 0 )
			element.css("width", options.width);
			
		needsInit = false;
	} 
	
	function target(event) {
		var element = event.target;
		while(element && element.tagName != "LI")
			element = element.parentNode;
		// more fun with IE, sometimes event.target is empty, just ignore it then
		if(!element)
			return [];
		return element;
	}

	function moveSelect(step) {
		listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
		movePosition(step);
        var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
        if(options.scroll) {
            var offset = 0;
            listItems.slice(0, active).each(function() {
				offset += this.offsetHeight;
			});
            if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
                list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
            } else if(offset < list.scrollTop()) {
                list.scrollTop(offset);
            }
        }
	};
	
	function movePosition(step) {
		active += step;
		if (active < 0) {
			active = listItems.size() - 1;
		} else if (active >= listItems.size()) {
			active = 0;
		}
	}
	
	function limitNumberOfItems(available) {
		return options.max && options.max < available
			? options.max
			: available;
	}
	
	function fillList() {
		list.empty();
		var max = limitNumberOfItems(data.length);
		for (var i=0; i < max; i++) {
			if (!data[i])
				continue;
			var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
			if ( formatted === false )
				continue;
			var li = $("<li/>").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
			$.data(li, "ac_data", data[i]);
		}
		listItems = list.find("li");
		if ( options.selectFirst ) {
			listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
			active = 0;
		}
		// apply bgiframe if available
		if ( $.fn.bgiframe )
			list.bgiframe();
	}
	
	return {
		display: function(d, q) {
			init();
			data = d;
			term = q;
			fillList();
		},
		next: function() {
			moveSelect(1);
		},
		prev: function() {
			moveSelect(-1);
		},
		pageUp: function() {
			if (active != 0 && active - 8 < 0) {
				moveSelect( -active );
			} else {
				moveSelect(-8);
			}
		},
		pageDown: function() {
			if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
				moveSelect( listItems.size() - 1 - active );
			} else {
				moveSelect(8);
			}
		},
		hide: function() {
			element && element.hide();
			listItems && listItems.removeClass(CLASSES.ACTIVE);
			active = -1;
		},
		visible : function() {
			return element && element.is(":visible");
		},
		current: function() {
			return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
		},
		show: function() {
			var offset = $(input).offset();
			element.css({
				width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
				top: offset.top + input.offsetHeight,
				left: offset.left
			}).show();
            if(options.scroll) {
                list.scrollTop(0);
                list.css({
					maxHeight: options.scrollHeight,
					overflow: 'auto'
				});
				
                if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
					var listHeight = 0;
					listItems.each(function() {
						listHeight += this.offsetHeight;
					});
					var scrollbarsVisible = listHeight > options.scrollHeight;
                    list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
					if (!scrollbarsVisible) {
						// IE doesn't recalculate width when scrollbar disappears
						listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
					}
                }
                
            }
		},
		selected: function() {
			var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
			return selected && selected.length && $.data(selected[0], "ac_data");
		},
		emptyList: function (){
			list && list.empty();
		},
		unbind: function() {
			element && element.remove();
		}
	};
};

$.Autocompleter.Selection = function(field, start, end) {
	if( field.createTextRange ){
		var selRange = field.createTextRange();
		selRange.collapse(true);
		selRange.moveStart("character", start);
		selRange.moveEnd("character", end);
		selRange.select();
	} else if( field.setSelectionRange ){
		field.setSelectionRange(start, end);
	} else {
		if( field.selectionStart ){
			field.selectionStart = start;
			field.selectionEnd = end;
		}
	}
	field.focus();
};

})(jQuery);

/* Copyright (c) 2006 Brandon Aaron (http://brandonaaron.net)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) 
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * jQueryLastChangedDatejQuery
 * jQueryRevjQuery
 *
 * Version 2.1.1
 */

(function(jQuery){

/**
 * The bgiframe is chainable and applies the iframe hack to get 
 * around zIndex issues in IE6. It will only apply itself in IE6 
 * and adds a class to the iframe called 'bgiframe'. The iframe
 * is appeneded as the first child of the matched element(s) 
 * with a tabIndex and zIndex of -1.
 * 
 * By default the plugin will take borders, sized with pixel units,
 * into account. If a different unit is used for the border's width,
 * then you will need to use the top and left settings as explained below.
 *
 * NOTICE: This plugin has been reported to cause perfromance problems
 * when used on elements that change properties (like width, height and
 * opacity) a lot in IE6. Most of these problems have been caused by 
 * the expressions used to calculate the elements width, height and 
 * borders. Some have reported it is due to the opacity filter. All 
 * these settings can be changed if needed as explained below.
 *
 * @example jQuery('div').bgiframe();
 * @before <div><p>Paragraph</p></div>
 * @result <div><iframe class="bgiframe".../><p>Paragraph</p></div>
 *
 * @param Map settings Optional settings to configure the iframe.
 * @option String|Number top The iframe must be offset to the top
 * 		by the width of the top border. This should be a negative 
 *      number representing the border-top-width. If a number is 
 * 		is used here, pixels will be assumed. Otherwise, be sure
 *		to specify a unit. An expression could also be used. 
 * 		By default the value is "auto" which will use an expression 
 * 		to get the border-top-width if it is in pixels.
 * @option String|Number left The iframe must be offset to the left
 * 		by the width of the left border. This should be a negative 
 *      number representing the border-left-width. If a number is 
 * 		is used here, pixels will be assumed. Otherwise, be sure
 *		to specify a unit. An expression could also be used. 
 * 		By default the value is "auto" which will use an expression 
 * 		to get the border-left-width if it is in pixels.
 * @option String|Number width This is the width of the iframe. If
 *		a number is used here, pixels will be assume. Otherwise, be sure
 * 		to specify a unit. An experssion could also be used.
 *		By default the value is "auto" which will use an experssion
 * 		to get the offsetWidth.
 * @option String|Number height This is the height of the iframe. If
 *		a number is used here, pixels will be assume. Otherwise, be sure
 * 		to specify a unit. An experssion could also be used.
 *		By default the value is "auto" which will use an experssion
 * 		to get the offsetHeight.
 * @option Boolean opacity This is a boolean representing whether or not
 * 		to use opacity. If set to true, the opacity of 0 is applied. If
 *		set to false, the opacity filter is not applied. Default: true.
 * @option String src This setting is provided so that one could change 
 *		the src of the iframe to whatever they need.
 *		Default: "javascript:false;"
 *
 * @name bgiframe
 * @type jQuery
 * @cat Plugins/bgiframe
 * @author Brandon Aaron (brandon.aaron@gmail.com || http://brandonaaron.net)
 */
jQuery.fn.bgIframe = jQuery.fn.bgiframe = function(s) {
	// This is only for IE6
	if ( jQuery.browser.msie && /6.0/.test(navigator.userAgent) ) {
		s = jQuery.extend({
			top     : 'auto', // auto == .currentStyle.borderTopWidth
			left    : 'auto', // auto == .currentStyle.borderLeftWidth
			width   : 'auto', // auto == offsetWidth
			height  : 'auto', // auto == offsetHeight
			opacity : true,
			src     : 'javascript:false;'
		}, s || {});
		var prop = function(n){return n&&n.constructor==Number?n+'px':n;},
		    html = '<iframe class="bgiframe"frameborder="0"tabindex="-1"src="'+s.src+'"'+
		               'style="display:block;position:absolute;z-index:-1;'+
			               (s.opacity !== false?'filter:Alpha(Opacity=\'0\');':'')+
					       'top:'+(s.top=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderTopWidth)||0)*-1)+\'px\')':prop(s.top))+';'+
					       'left:'+(s.left=='auto'?'expression(((parseInt(this.parentNode.currentStyle.borderLeftWidth)||0)*-1)+\'px\')':prop(s.left))+';'+
					       'width:'+(s.width=='auto'?'expression(this.parentNode.offsetWidth+\'px\')':prop(s.width))+';'+
					       'height:'+(s.height=='auto'?'expression(this.parentNode.offsetHeight+\'px\')':prop(s.height))+';'+
					'"/>';
		return this.each(function() {
			if ( jQuery('> iframe.bgiframe', this).length == 0 )
				this.insertBefore( document.createElement(html), this.firstChild );
		});
	}
	return this;
};

})(jQuery);

/**
 * Cookie plugin
 *
 * Copyright (c) 2006 Klaus Hartl (stilbuero.de)
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 */

/**
 * Create a cookie with the given name and value and other optional parameters.
 *
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Set the value of a cookie.
 * @example $.cookie('the_cookie', 'the_value', { expires: 7, path: '/', domain: 'jquery.com', secure: true });
 * @desc Create a cookie with all available options.
 * @example $.cookie('the_cookie', 'the_value');
 * @desc Create a session cookie.
 * @example $.cookie('the_cookie', null);
 * @desc Delete a cookie by passing null as value. Keep in mind that you have to use the same path and domain
 *       used when the cookie was set.
 *
 * @param String name The name of the cookie.
 * @param String value The value of the cookie.
 * @param Object options An object literal containing key/value pairs to provide optional cookie attributes.
 * @option Number|Date expires Either an integer specifying the expiration date from now on in days or a Date object.
 *                             If a negative value is specified (e.g. a date in the past), the cookie will be deleted.
 *                             If set to null or omitted, the cookie will be a session cookie and will not be retained
 *                             when the the browser exits.
 * @option String path The value of the path atribute of the cookie (default: path of page that created the cookie).
 * @option String domain The value of the domain attribute of the cookie (default: domain of page that created the cookie).
 * @option Boolean secure If true, the secure attribute of the cookie will be set and the cookie transmission will
 *                        require a secure protocol (like HTTPS).
 * @type undefined
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */

/**
 * Get the value of a cookie with the given name.
 *
 * @example $.cookie('the_cookie');
 * @desc Get the value of a cookie.
 *
 * @param String name The name of the cookie.
 * @return The value of the cookie.
 * @type String
 *
 * @name $.cookie
 * @cat Plugins/Cookie
 * @author Klaus Hartl/klaus.hartl@stilbuero.de
 */
jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};

(function(jQuery){function toIntegersAtLease(n)
{return n<10?'0'+n:n;}
Date.prototype.toJSON=function(date)
{return this.getUTCFullYear()+'-'+
toIntegersAtLease(this.getUTCMonth())+'-'+
toIntegersAtLease(this.getUTCDate());};var escapeable=/["\\\x00-\x1f\x7f-\x9f]/g;var meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'}
jQuery.quoteString=function(string)
{if(escapeable.test(string))
{return'"'+string.replace(escapeable,function(a)
{var c=meta[a];if(typeof c==='string'){return c;}
c=a.charCodeAt();return'\\u00'+Math.floor(c/16).toString(16)+(c%16).toString(16);})+'"'}
return'"'+string+'"';}
jQuery.toJSON=function(o,compact)
{var type=typeof(o);if(type=="undefined")
return"undefined";else if(type=="number"||type=="boolean")
return o+"";else if(o===null)
return"null";if(type=="string")
{return jQuery.quoteString(o);}
if(type=="object"&&typeof o.toJSON=="function")
return o.toJSON(compact);if(type!="function"&&typeof(o.length)=="number")
{var ret=[];for(var i=0;i<o.length;i++){ret.push(jQuery.toJSON(o[i],compact));}
if(compact)
return"["+ret.join(",")+"]";else
return"["+ret.join(", ")+"]";}
if(type=="function"){throw new TypeError("Unable to convert object of type 'function' to json.");}
ret=[];for(var k in o){var name;var type=typeof(k);if(type=="number")
name='"'+k+'"';else if(type=="string")
name=jQuery.quoteString(k);else
continue;val=jQuery.toJSON(o[k],compact);if(typeof(val)!="string"){continue;}
if(compact)
ret.push(name+":"+val);else
ret.push(name+": "+val);}
return"{"+ret.join(", ")+"}";}
jQuery.compactJSON=function(o)
{return jQuery.toJSON(o,true);}
jQuery.evalJSON=function(src)
{return eval("("+src+")");}
jQuery.secureEvalJSON=function(src)
{var filtered=src;filtered=filtered.replace(/\\["\\\/bfnrtu]/g,'@');filtered=filtered.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']');filtered=filtered.replace(/(?:^|:|,)(?:\s*\[)+/g,'');if(/^[\],:{}\s]*jQuery/.test(filtered))
return eval("("+src+")");else
throw new SyntaxError("Error parsing JSON, source is not valid.");}})(jQuery);

﻿/*
 *
 *	jQuery Timer plugin v0.1
 *		Matt Schmidt [http://www.mattptr.net]
 *
 *	Licensed under the BSD License:
 *		http://mattptr.net/license/license.txt
 *
 */
 
 jQuery.timer = function (interval, callback)
 {
 /**
  *
  * timer() provides a cleaner way to handle intervals  
  *
  *	@usage
  * $.timer(interval, callback);
  *
  *
  * @example
  * $.timer(1000, function (timer) {
  * 	alert("hello");
  * 	timer.stop();
  * });
  * @desc Show an alert box after 1 second and stop
  * 
  * @example
  * var second = false;
  *	$.timer(1000, function (timer) {
  *		if (!second) {
  *			alert('First time!');
  *			second = true;
  *			timer.reset(3000);
  *		}
  *		else {
  *			alert('Second time');
  *			timer.stop();
  *		}
  *	});
  * @desc Show an alert box after 1 second and show another after 3 seconds
  *
  * 
  */

	var interval = interval || 100;

	if (!callback)
		return false;
	
	_timer = function (interval, callback) {
		this.stop = function () {
			clearInterval(self.id);
		};
		
		this.internalCallback = function () {
			callback(self);
		};
		
		this.reset = function (val) {
			if (self.id)
				clearInterval(self.id);
			
			var val = val || 100;
			this.id = setInterval(this.internalCallback, val);
		};
		
		this.interval = interval;
		this.id = setInterval(this.internalCallback, this.interval);
		
		var self = this;
	};
	
	return new _timer(interval, callback);
 };

(function($){$().ajaxSend(function(a,xhr,s){xhr.setRequestHeader("Accept","text/javascript, text/html, application/xml, text/xml, */*");});})(jQuery);(function($){$.fn.reset=function(){return this.each(function(){if(typeof this.reset=='function'||(typeof this.reset=='object'&&!this.reset.nodeType))
this.reset();});};$.fn.enable=function(){return this.each(function(){this.disabled=false;});};$.fn.disable=function(){return this.each(function(){this.disabled=true;});};})(jQuery);(function($){$.extend({fieldEvent:function(el,obs){var field=el[0]||el,e='change';if(field.type=='radio'||field.type=='checkbox')e='click';else if(obs&&field.type=='text'||field.type=='textarea')e='keyup';return e;}});$.fn.extend({delayedObserver:function(delay,callback){var el=$(this);if(typeof window.delayedObserverStack=='undefined')window.delayedObserverStack=[];if(typeof window.delayedObserverCallback=='undefined'){window.delayedObserverCallback=function(stackPos){observed=window.delayedObserverStack[stackPos];if(observed.timer)clearTimeout(observed.timer);observed.timer=setTimeout(function(){observed.timer=null;observed.callback(observed.obj,observed.obj.formVal());},observed.delay*1000);observed.oldVal=observed.obj.formVal();}}
window.delayedObserverStack.push({obj:el,timer:null,delay:delay,oldVal:el.formVal(),callback:callback});var stackPos=window.delayedObserverStack.length-1;if(el[0].tagName=='FORM'){$(':input',el).each(function(){var field=$(this);field.bind($.fieldEvent(field,delay),function(){observed=window.delayedObserverStack[stackPos];if(observed.obj.formVal()==observed.obj.oldVal)return;else window.delayedObserverCallback(stackPos);});});}else{el.bind($.fieldEvent(el,delay),function(){observed=window.delayedObserverStack[stackPos];if(observed.obj.formVal()==observed.obj.oldVal)return;else window.delayedObserverCallback(stackPos);});};},formVal:function(){var el=this[0];if(el.tagName=='FORM')return this.serialize();if(el.type=='checkbox'||self.type=='radio')return this.filter('input:checked').val()||'';else return this.val();}});})(jQuery);(function($){$.fn.extend({visualEffect:function(o){e=o.replace(/\_(.)/g,function(m,l){return l.toUpperCase()});return eval('$(this).'+e+'()');},appear:function(speed,callback){return this.fadeIn(speed,callback);},blindDown:function(speed,callback){return this.show('blind',{direction:'vertical'},speed,callback);},blindUp:function(speed,callback){return this.hide('blind',{direction:'vertical'},speed,callback);},blindRight:function(speed,callback){return this.show('blind',{direction:'horizontal'},speed,callback);},blindLeft:function(speed,callback){this.hide('blind',{direction:'horizontal'},speed,callback);return this;},dropOut:function(speed,callback){return this.hide('drop',{direction:'down'},speed,callback);},dropIn:function(speed,callback){return this.show('drop',{direction:'up'},speed,callback);},fade:function(speed,callback){return this.fadeOut(speed,callback);},fadeToggle:function(speed,callback){return this.animate({opacity:'toggle'},speed,callback);},fold:function(speed,callback){return this.hide('fold',{},speed,callback);},foldOut:function(speed,callback){return this.show('fold',{},speed,callback);},grow:function(speed,callback){return this.show('scale',{},speed,callback);},highlight:function(speed,callback){return this.show('highlight',{},speed,callback);},puff:function(speed,callback){return this.hide('puff',{},speed,callback);},pulsate:function(speed,callback){return this.show('pulsate',{},speed,callback);},shake:function(speed,callback){return this.show('shake',{},speed,callback);},shrink:function(speed,callback){return this.hide('scale',{},speed,callback);},squish:function(speed,callback){return this.hide('scale',{origin:['top','left']},speed,callback);},slideUp:function(speed,callback){return this.hide('slide',{direction:'up'},speed,callback);},slideDown:function(speed,callback){return this.show('slide',{direction:'up'},speed,callback);},switchOff:function(speed,callback){return this.hide('clip',{},speed,callback);},switchOn:function(speed,callback){return this.show('clip',{},speed,callback);}});})(jQuery);

// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

// A place to store global variables for now; potentially a base for all Bonanzle JS code eventually.
var Bonanzle = {};

function setCookieDomain(domainStr) {
	Bonanzle['cookie_domain'] = domainStr
}

//----------------------------------------------------------------------------
function isInternetExplorer() {
  return navigator.appName == "Microsoft Internet Explorer";
}

//----------------------------------------------------------------------------
function isIE6() {
	if(isInternetExplorer()) {
		var index = navigator.userAgent.indexOf('MSIE');
		if (index == -1) return false;
		return (parseInt(navigator.userAgent.substring(index+'MSIE'.length+1)) == 6);
	}
	return false;
}

//----------------------------------------------------------------------------
function isIE7() {
	if(isInternetExplorer()) {
		var index = navigator.userAgent.indexOf('MSIE');
		if (index == -1) return false;
		return (parseInt(navigator.userAgent.substring(index+'MSIE'.length+1)) == 7);
	}
	return false;
}

//----------------------------------------------------------------------------
function isSafari() {
  var detect = navigator.userAgent.toLowerCase();
  var place = detect.indexOf('safari') + 1;
  if (place){
     return true;
  }
  return false;
}

//----------------------------------------------------------------------------
function isFirefox() {
  var detect = navigator.userAgent.toLowerCase();
  var place = detect.indexOf('firefox') + 1;
  if (place){
     return true;
  }
  return false;
}

// -----------------------------------------------------------------------------
// e.g., attachCharacterCount('#order_resolution_title', 65, '#charaters');
function attachCharacterCount(jq_text_field_selector, max_characters, jq_output_field_selector) {
	$j(jq_output_field_selector).html(max_characters);
	$j(jq_text_field_selector).keyup(function() { $j(jq_output_field_selector).html(max_characters - $j(jq_text_field_selector).val().length) });
}

// -----------------------------------------------------------------------------
function elementExists(element_id) {
	return ($j('#' + element_id).length > 0 ? true : false);
}

// -----------------------------------------------------------------------------
function classOf(o) {
	return {}.toString.call(o).slice(8, -1);
}

// -----------------------------------------------------------------------------
function playSound( url ){   
  $j('#sound_element').html("<embed src='"+url+"' hidden=true autostart=true loop=false>");
}

// -----------------------------------------------------------------------------
function playSoundLoop( url ){   
  $j('#sound_element').html("<embed src='"+url+"' hidden=true autostart=true loop=true>");
}

// -----------------------------------------------------------------------------
function stopSoundLoop( ){
  $j('#sound_element').html("");
}

// -----------------------------------------------------------------------------
// Use to put variables into a SHARED cookie (a hash in a cookie). Will probably
// only work with simple data objects (string, numbers, booleans, etc.). Works 
// just like Rails companion function of the same name.
function set_json_subcookie(cookie_name, key, val) 
{
	if (val == null /* or undefined */) 
  {
    return null;
  }
	
	var cookie_obj = get_json_cookie(cookie_name);
	
	cookie_obj[key] = val;
	
	set_json_cookie(cookie_name, cookie_obj);
	
	return val;
}

// -----------------------------------------------------------------------------
// Use to get variables from a SHARED cookie (a hash in a cookie). Will probably 
// only work with simple data objects (string, numbers, booleans, etc.). Works 
// just like Rails companion function of the same name.
function get_json_subcookie(cookie_name, key) 
{
	var cookie_val = get_json_cookie(cookie_name);
	
	if (cookie_val)
  {
		return cookie_val[key];
	}
	
	return null;
}

// -----------------------------------------------------------------------------
// Use to put variables into a cookie. Will probably only work with simple data 
// objects (string, numbers, booleans, etc.). Works just like Rails companion 
// function of the same name.
function set_json_cookie(cookie_name, val) 
{
	if (val == null /* or undefined */) 
  {
    return null;
  }
	
	jQuery.cookie(cookie_name, jQuery.toJSON(val), { expires: 10 * 365.25, path: '/', domain: Bonanzle['cookie_domain'] });
	
	return val;
}

// -----------------------------------------------------------------------------
// Use to get variables from a cookie. Will probably only work with simple data 
// objects (string, numbers, booleans, etc.). Works just like Rails companion 
// function of the same name.
function get_json_cookie(cookie_name) 
{
	var result = {};
	var cookie_val = jQuery.cookie(cookie_name);
	if (cookie_val)
  {
  	try
  	{
			// See note below.
			//result = jQuery.evalJSON(cookie_val);

			// WBH 2/17/10:
			// CGI::escape is used by Rails to get cookies ready to be sent as headers.  This translates any spaces into "+" signs.
			// Because the default #to_json method for hashes includes spaces between key and value, this means that any JSON
			// array will have + signs in it.  Unfortunately, jQuery's evalJSON does not seem to appreciate these plus signs.
			// So we translate them back into spaces before trying to eval the jSON.  Let's hope plus signs weren't going to be
			// important to any value!
			// Another option would be to update Rails' JSON encoder not to include spaces between k/v in the first place, but
			// that seems like a backwards way to solve the problem.  Also possible:  to instruct CGI::escape to use %20 rather
			// than + to encode spaces...
			var spaced_cookie_val = cookie_val.replace(/\+/g, ' ');
			result = jQuery.evalJSON(spaced_cookie_val);
		} catch(e) { }
	}
	
	return result;
}

// -----------------------------------------------------------------------------
function clear_cookie(cookieName) {
	jQuery.cookie(cookieName, null, { path: '/', domain: Bonanzle['cookie_domain'] });
}

// -----------------------------------------------------------------------------
// Please... somebody... show me a better way to make this happen.  jQuery doc
// is weirdly sparse on the topic of setting position 
function setPosition(element, ulXPos, ulYPos)
{
  if(element)
  {
    element.style.top = ulYPos + "px";
    element.style.left = ulXPos + "px";
  }
}

// -----------------------------------------------------------------------------
// RTFN
function setVisible(element,visible)
{
  if(visible)
  {
    element.show();
  }
  else
  {
    element.hide();
  }
}

// -----------------------------------------------------------------------------
// For absolutely positioned elements, any ancestors that are either absolutely
// positioned, relatively positioned, or fixed positioned will add their position
// to the specified element's absolute position as an offset - this function 
// determines the offset that would be added so we can actually do absolute 
// positioning on the given element, regardless of its ancestors.
// 
// I think this does the same thing as Prototype's Position.cumulativeOffset();
function getCumulativeOffsetPos(element, relativeTo)
{
  var relativePos = [ 0, 0 ];
  var parentEl    = element;
  var relativeEl = $j(relativeTo).get(0); // handle whether they passed in raw element or jq element
  while (parentEl)
  {
    relativePos[0] += parentEl.offsetLeft;
    relativePos[1] += parentEl.offsetTop;
    
    parentEl = parentEl.offsetParent

		// If the user specified an element they want to find out position relative to,
		// stop once we've factored in everything up to that eleement
		if(parentEl == relativeEl) break;
  }
  
  return relativePos;
}

// -----------------------------------------------------------------------------
// Position a vertically popping element on the same X coord as anchorEl, factoring
// in whether the pop would leave the element off the right side of the screen
function positionVerticalPop(anchorEl, elToPop) {
	var rawEl = $j(anchorEl).get(0);
	var pos = getCumulativeOffsetPos(rawEl);
	var rightEdge = pos[0] + $j(elToPop).width();
	var rightEdgeOverflow = Math.max(0, (rightEdge+15)-$j(document).width());
	var anchorWidth = $j(anchorEl).width();
	elToPop.css('right','').css('left','');

	if(rightEdgeOverflow > 0) {
		// If this elements would have gone outside the dimensions of our screen, then position its right edge against the anchorEl
		var rightPos = ($j(document).width()-pos[0]);
		elToPop.css('right', (rightPos-anchorWidth) + "px");
	} else {
		elToPop.css('left', pos[0] + 'px');
	}

}

// -----------------------------------------------------------------------------
// Creates a new (Prototype extended) DOM element, with the given parent and 
// set of attributes given (as a hash)
function createDOMElement(el_type, parent, attributes)
{
  var element = $(document.createElement(el_type || 'div'));

  if (parent)
  {
    parent.appendChild(element);
  }
  
  if (attributes)
  {
    $H(attributes).each(function(pair) { element.setAttribute(pair.key, pair.value); });  
  }

  return element;
}

//----------------------------------------------------------------------------
// Remove all child nodes from the given element
function removeAllChildren(element)
{
	element = $(element);
	
	if (element != null)
	{
		while (element.hasChildNodes()) 
		{
			element.removeChild(element.firstChild);
		}
	}
}

//----------------------------------------------------------------------------
// Select an option from a select drop down by its value
function selectSortOptionByValue(jSelectElement, valueToSelect)
{
	selectElement = jSelectElement[0];
	
	for(i=0;i<selectElement.length;i++)
	{
		if(selectElement.options[i].value == valueToSelect)
		{
			selectElement.selectedIndex = i
			break;
		}
	}
}

//----------------------------------------------------------------------------
// Destroy all jQuery draggable and droppable objects connected to any descendants
// of the given element - this is necessary when replacing the given element's
// innerHTML/content, as the handlers will not otherwise get removed and may cause
// problems in the future if elements with the same ID are created.
function destroyDragDropHandlers(parent_el_id)
{
//  $j("#" + parent_el_id + " .ui-droppable").droppable("destroy");
//  $j("#" + parent_el_id + " .ui-draggable").draggable("destroy");
}

//----------------------------------------------------------------------------
// Tests if the given position is in the target element.
function isInElement(position, target_el_id)
{
  var targetElement = $j('#' + target_el_id); 
  var offset = targetElement.offset();
  if (position.top  < offset.top  || position.top  > offset.top  + targetElement.height() ||
      position.left < offset.left || position.left > offset.left + targetElement.width())
  {
    return false;
  } 
  
  return true;
}

//----------------------------------------------------------------------------
// Shows a dynamically generate wait panel overlay (spinner + "Please Wait.." 
// text) over the element with the given id.  Note that, since the generated
// wait panel is appended to the given element, ajax calls that update the given
// element will hide the wait panel when they replace that element's html, so 
// there is no need to manually hide the wait panel once the ajax updater ends.
// Params:
//  el_id => The DOM id of the element to show the wait panel over.
//  text  => Optional text to use instead of the default "Please Wait..."
function showWaitPanel(el_id, text, widthHackAdd, heightHackAdd)
{
  var attachToEl = $j(el_id);
  
  var waitPanel = $j("<div class='WaitPanel'>").append(
    $j("<div class='WaitElementsContainer'>").append(
      $j("<div class='WaitSpinner'>").append($j("<img src='/images/spinners/indicator_medium.gif' />"))
    ).append(
      $j("<div class='WaitText'>")
    )
  );
  
  attachToEl.prepend(waitPanel);
    
  // Position spinner centered vertically
  heightHackAdd = ( heightHackAdd ? heightHackAdd : 0);
  waitPanel.find(".WaitSpinner").css("margin-top", (attachToEl.outerHeight() / 2) + heightHackAdd + "px");
  
  // Add text node
  waitPanel.find(".WaitText").html(text ? text : "Please Wait...");

  // Size wait panel to size of attached element
  // Note: updated on 4/20:  using outer width instead of inner.  Unless we want to go to the trouble of
  // positioning the left inside of the border, using innerWidth means that there will be uncovered (by wait panel) 
  // gaps on the right and bottom of bordered elements
  widthHackAdd = ( widthHackAdd ? widthHackAdd : 0 );
  waitPanel.height(attachToEl.outerHeight());
  waitPanel.width(attachToEl.outerWidth()+widthHackAdd);

}

//----------------------------------------------------------------------------
// Hide (destroy) any wait panels being displayed over the given element id.
function hideWaitPanel(el_id)
{
  $j(el_id + " .WaitPanel").remove();
}

//----------------------------------------------------------------------------
// Show dynamically created HTML over the element specified
// Params:
//  el_id => The DOM id of the element to show the wait panel over.
//  text  => Optional text to use instead of the default "Please Wait..."
function showHTMLPanel(el_id, elements, el_class)
{
  var attachToEl = $j("#" + el_id);
  
  var waitPanel = $j("<div class='GenericPanel " + el_class + "'>").append(
    $j("<div>").prepend(elements)
  );
  
  attachToEl.prepend(waitPanel);
      
  // Size wait panel to size of attached element
  $j("#" + el_id + " .GenericPanel").height(attachToEl.innerHeight());
  $j("#" + el_id + " .GenericPanel").width(attachToEl.innerWidth());
}

//----------------------------------------------------------------------------
// Hide (destroy) any generic HTML panels being displayed over the given element id.
function hideHTMLPanel(el_id)
{
  $j("#" + el_id + " .GenericPanel").remove();
}

//----------------------------------------------------------------------------
// Set a callback to get called when window is blurred
function setWindowBlurFunction(callback) {
  if(isInternetExplorer()) {
    document.onfocusout = function() { 
      callback();
    };
  }
  else {
    window.document.onblur = function() { 
      callback();
    };
  }
}

//----------------------------------------------------------------------------
// Set a callback to get called when window is focused
function setWindowFocusFunction(callback) {
  if(isInternetExplorer()) {
    document.onfocusin = function() { 
      callback();
    };
  }
  else {
    window.document.onfocus = function() { 
      callback();
    };
  }
  
}

//----------------------------------------------------------------------------
// Takes a string and returns the digit nested within using a regular expression
function extractDigitFromString(el_id) 
{
  var regex = /\d+/;
  res = ( (match = regex.exec(el_id)) ? match[0] : null);  
  return res;
}

//----------------------------------------------------------------------------
// Takes a selector string and returns the ID of the element found with that selector string
function extractIDFromSelector(el_id) 
{
  el = $j(el_id);
  return $j(el_id).attr('id');
}

//----------------------------------------------------------------------------
// Takes a selector string and returns the ID of the element found with that selector string
function moveElementToElement(move_element, to_element, relative_to)
{
  to_element_bare = $j(to_element).get(0);
  to_pos = getCumulativeOffsetPos(to_element_bare, relative_to);
  if((to_pos[0] + $j(move_element).width()) > 950) {
    to_pos[0] = 950 - $j(move_element).width();
  } 
  $j(move_element).css('left', to_pos[0]).css('top', to_pos[1]);
}

//----------------------------------------------------------------------------
// Make sized_element the same dimensions as model_element
function sizeElementToElement(sized_element, model_element) {
  $j(sized_element).width($j(model_element).width());
  $j(sized_element).height($j(model_element).height());
}

//----------------------------------------------------------------------------
// Copy value to element
function copyValueToElement(guessIndex, copyValue, selectorOfCopyToElement, append, appendString) {
  if(append) {
    appendString = $j(selectorOfCopyToElement).val() + (appendString ? appendString + "\n\n" : "");
    $j(selectorOfCopyToElement).val(appendString + copyValue);
  }
  else {
    $j(selectorOfCopyToElement).val(copyValue);
  }
  
  $j('#extended_item_info_upc').val($j('#guessUPC' + guessIndex).val())
  $j('#extended_item_info_isbn').val($j('#guessISBN' + guessIndex).val());
  $j('#extended_item_info_mpn').val($j('#guessMPN' + guessIndex).val());
}

//----------------------------------------------------------------------------
// Convert any text smileys in the given string to images and return the 
// resulting string.
function change_smilies_to_images(message)
{
	function replace_smiley(str, p1, p2, p3, offset, s)
	{
		var img = "smile_1.png";
		switch (p3)
		{
		//case ')': img= "smile_1.png"; break;
		case 'D': img = "smile_7.png"; break;
		case '(': img = "smile_5.png"; break;
		}
		// JS regexes don't have zero-width lookbehind assertions, so p1 is actually the 
		// space before the smiley that was matched, so it should be included in the result
		return p1 + '<img src="/images/emoticons/' + img + '" alt="' + p2 + '" />';
	}
	return message.replace(/(^|\s)(\:\-?(\)|D|\())(?=$|\s|\?|\.|\,|)/g, replace_smiley);
}

//----------------------------------------------------------------------------
function useSmallVersions()
{
  return (screen && screen.width && screen.height && ((screen.width == 800) && (screen.height == 600)));
}

//-----------------------------------------------------------------------------
function itemTagDone(response, hide_el_name) 
{
  $j(hide_el_name).hide();
  var json = jQuery.evalJSON(response.responseText);
  if(json) 
  {
    $j('#' + json.tag_name).attr('class', json.is_set ? 'tagSelect' : 'tagUnselect');
  }
  else 
  {
    $j('#itemTagList').html('<li>Error tagging this item</li>');
  }
}

//-----------------------------------------------------------------------------
function itemAddToHandPicked(response, update_element) {
  $j('#' + update_element).html(response.responseText);
}

//-----------------------------------------------------------------------------
function copyToClipboard(flashClient) {
  $j('.copyLink').removeClass("selected");
  $j(flashClient.domElement).addClass("selected");
}

//-----------------------------------------------------------------------------
function scrollWinTo(selector){
  $j('html, body').animate({
    scrollTop: $j(selector).offset().top
   }, 500);
}

function cacheJavascriptTest() {
	return true;
}

jQuery.fn.reverse = function() {
  return this.pushStack(this.get().reverse(), arguments);
};


/// <reference path="jquery-intellisense.js" />
//------------------------------------------------------------------------------
focusHandler = function() 
{
  //----------------------------------------------------------------------------
  // Internal prototype
	_focusHandler = function () 
	{
	  this.blurCallbacks    = new Array();
	  this.focusCallbacks   = new Array();
	  this.blurred          = false;
	  
	  //--------------------------------------------------------------------------
	  this.addBlurCallback = function(callback)
	  {
  	 this.blurCallbacks.push(callback);
	  };
	  
	  //--------------------------------------------------------------------------
	  this.addFocusCallback = function(callback)
	  {
  	  this.focusCallbacks.push(callback);
	  };
	  
	  //--------------------------------------------------------------------------
	  this.callBlurs = function()
	  {
      for(var i=0;i<self.blurCallbacks.length;i++) {
        self.blurCallbacks[i]();
      }
	  };
	  
	  //--------------------------------------------------------------------------
	  this.callFocuses = function()
	  {
      for(var i=0;i<self.focusCallbacks.length;i++) {
        self.focusCallbacks[i]();
      }
	  };
	  
	  var self = this;
	};

	theFocusHandler = new _focusHandler()
  setWindowBlurFunction(theFocusHandler.callBlurs);
	setWindowFocusFunction(theFocusHandler.callFocuses);

	return theFocusHandler;
};


/// <reference path="jquery-intellisense.js" />

//------------------------------------------------------------------------------
userPopTextHandler = function(container_selector, output_selector)
{
  //----------------------------------------------------------------------------
  // Internal prototype
	_userPopTextHandler = function (container_selector, output_selector) 
	{
	  this.flash            = true;
	  this.blurred          = false;
	  this.page_title       = document.title;
	  this.messages_queued  = Array();
	  this.output_selector  = output_selector;
	  this.container_selector = container_selector
	  this.current_text     = null;
	  
	  //--------------------------------------------------------------------------
	  // Start the user pop message updater, with the given interval
	  this.start = function(update_interval)
	  {
	    self.read_messages(function()
	    {
	      self.timer = jQuery.timer(update_interval, function(timer) 
        {
          self.read_messages(null);
        });
      });      
	  };
	  
	  //--------------------------------------------------------------------------
	  // Read the latest messages, calling the given callback when done
	  this.read_messages = function(callback)
	  {
	    // No need to grab more messages if user is looking at one currently...
	    if(!this.current_text && (jQuery('#quickTextHeaderReply').css('display') == 'none'))
	    {
	      jQuery.ajax({
	        type: "GET",
	        dataType: "json",
	        cache: false,
	        url: '/handlers/user_pop_text/read', 
	        success: function(json) {
	          if(!json) return;
	          
	          // Load all the messages onto our queue of messages
	          for (var i = 0; i < json.length; i++) {
              self.messages_queued.push(json[i]);  
            }
            
            if(self.messages_queued.length > 0) {
              self.messages_queued.reverse();  // Reverse array so we can pop elements off of it in chronological order
              jQuery(self.container_selector).show('slow'); // Make sure the user can see the message
              self.show_message(self.messages_queued.pop()); // And show it
            }
            
            if (callback != null) {
              callback();
            }
          }
        });
       }	
    };
    
    //--------------------------------------------------------------------------
	  // Take a json object (as returned by UserPopTextReadHandler) and make it into HTML with "reply" and "close" buttons
	  // TODO: Hide the message after a set amount of time, per user preferences
    this.show_message = function(json_message) 
    {
       var div = jQuery('<div>');
       function bindDoneWithCurrent() { return function() { return self.done_with_current() }; }
       function bindMarkReadHandler() { return function () { return self.mark_as_read(bindDoneWithCurrent()) };  }
       function bindReplyHandler(e) { return function (e) { return self.reply(e) };  }
       previous_message_content = ( json_message.reply_body ? "<div>" + change_smilies_to_images(json_message.reply_body) + "</div>" : '' );
       this_message_content = change_smilies_to_images(json_message.content)
       out_string = null; 

		   if(json_message.custom_intro) {
		    out_string = jQuery("<div name='message_id_" + json_message.id + "'>");
		    out_string.html(json_message.time_in_words + ' <strong style="color:white">' + json_message.custom_intro + '</strong>: <strong>' + this_message_content + '</strong> ');
		   } else {
		    out_string = jQuery("<div id='message_from_" + json_message.from_id + "' name='message_id_" + json_message.id + "'>");
		    out_string.html(previous_message_content + json_message.time_in_words + '<a class="userLink" href="/users/' + json_message.from_id + '/profile">' + json_message.from + '</a> ' + (json_message.reply_body ? 'replied' : 'said') + ': <strong>' + this_message_content + '</strong> ');
		   }	

		   if(!json_message.not_repliable) {
				  out_string.append(jQuery("<a href='#'>Reply</a>").click(bindReplyHandler(jQuery(this))));
		   }

		   out_string.append(jQuery("<a href='#'>Close</a>").click(bindMarkReadHandler()));
       div.append(out_string);        
       self.current_text = json_message;  // Save the current message being shown so when we close window we know who to mark as read
        
       if(self.flash) {
          self.flash_new_message();
       }
      
      // Se the object we created here to be shown in the output element
      jQuery(self.output_selector).html(div);
    };

    //--------------------------------------------------------------------------
	  // Post a quick text message to the DB
    this.post_message = function(to_id, reply_message_id, content, callback)
    {
      jQuery.ajax({
        type: "POST",
        dataType: "json",
        cache: false,
        url: '/user_pop_texts/post_quick_text', 
        data: { to_id: to_id, reply_message_id: reply_message_id, content: content }, 
        complete: function(json) {
          jQuery('#quickTextPostSpinner').hide();
          // TODO: tell user that the message was successfully sent.
          // Difficult because of the multiple places quick texts can be sent from
        },
        success: function() {
          if(callback) {
            callback();
          }
        }
     });
    };
    
    //--------------------------------------------------------------------------
	  // Mark a message as having been seen so we know to stop repeatedly showing it.
	  // This avoids needing to ascertain whether a message might have been displayed immediately before a user
	  // changes pages
    this.mark_as_read = function(callback)
    {
      jQuery.ajax({
        type: "GET",
        dataType: "json",
        cache: false,
        url: '/handlers/user_pop_text/close', 
        data: { quick_text_id: self.current_text.id },
        complete: function(json) {
         self.current_text = null; 
         if(callback) {
          callback();
         }
        }
      });
    };
    
    //-----------------------------------------------------------------------------
    // When a user is done reading message, they might see another message, or we might hide the UserPopText container
    // altogether if there are no more messages left
    this.done_with_current = function() 
    {
    	self.initialize_reply();
    	
      if(self.messages_queued.length > 0) {
         self.show_message(self.messages_queued.pop());
       }
       else {
         jQuery(self.output_selector).html('');
         jQuery(self.container_selector).hide('slow');
       }
    };
    
    //-----------------------------------------------------------------------------
    // If user clicks "reply" button in UserPop container, setup the form to respond to whatever user sent the 
    // quick text that had been getting read
    this.reply = function(event) 
    {
      self.mark_as_read(); // Mark the quick text as read so we won't see it again after refresh
      from_id = extractDigitFromString(jQuery(event.target).parent().attr('id')); // Extract user that sent message from the div we setup when showing the user pop text
      reply_id = extractDigitFromString(jQuery(event.target).parent().attr('name')); // Extract user that sent message from the div we setup when showing the user pop text
  
      // Show the form
      jQuery('#quickTextHeaderReply').show(); 
			jQuery('#quickTextHeaderReply .quick_text_to_id').val(from_id); 
			jQuery('#quickTextHeaderReply .quick_reply_to_message_id').val(reply_id);
      jQuery(self.output_selector).html(jQuery('#quickTextHeaderReply'));
      jQuery('#quickTextHeaderReply .quick_text_close').click(function() { $j('#baseQuickTextElement').parent().parent().parent().hide('slow') });
    };

    //-----------------------------------------------------------------------------
    // Eventually, we'll change the title bar to let a user know when a message has been received
    this.flash_new_message = function() {
      if(self.blurred) {
          document.title = "New quick-text - " + self.page_title
      }
    };

    //-----------------------------------------------------------------------------
    // Record whether window is or isn't blurred so we know whether to flash new message
    this.window_blur = function(isBlurred) {
      self.blurred = isBlurred;
      if(!self.blurred) {
        document.title = self.page_title;
      }
    };
    
    //-----------------------------------------------------------------------------
    // Clear out all reply fields, and set up event handlers so reply will work in the future
    this.initialize_reply = function() { 
     // Copy the reply back to the bottom for future usage, and re-initialize it.
			$j('#quickTextHeaderReplyContainer').html($j('#quickTextHeaderReply'));
      $j('#quickTextHeaderReply #quickTextPostSpinner').hide(); // we're done spining
      $j('#quickTextHeaderReply .quick_reply_to_message_id').val(''); // clear out the message being replied to
      $j('#quickTextHeaderReply .quick_text_content').val(''); // clear out the reply text
			$j('#quickTextHeaderReply').hide();  // and hide the container itself
      
      // Hook up callback if user chooses to respond to a quick text
			$j('#quickTextHeaderReply .quick_text .sendButton').unbind();
			$j('#quickTextHeaderReply .quick_text .sendButton').click(function() {
				$j('#quickTextHeaderReply #quickTextPostSpinner').show(); 
				self.post_message($j('#quickTextHeaderReply .quick_text_to_id').val(), 
						$j('#quickTextHeaderReply .quick_reply_to_message_id').val(),
						$j('#quickTextHeaderReply .quick_text_content').val(), 
						self.done_with_current());
			});
				
    }

    var self = this;
	};

	
	return new _userPopTextHandler(container_selector, output_selector);
};


// This is a class for keeping track of the currently latent spinners in a page,
// and activating the appropriate spinner 
SPINNER_MANAGER =
{
  nowSpinning : new Array(),
  registeredSpinnerElements : new Array(),
  
  //-----------------------------------------------------------------------------
  // Desc:        Add this spinner to the list of spinners that might get activated when
  //							an element broadcasts that its spinner should start
  // Param				element 	- The spinner element that has had a list of associated activating elements
	registerListener : function(element)
	{	
	  // Loop through currently registered spinners to make sure this isn't a duplicate  
    if(SPINNER_MANAGER.registeredSpinnerElements[element.id] != null)
    {
    	alert("Error: Trying to register a spinner with an ID that's already been registered")
		}
		else
		{
			SPINNER_MANAGER.registeredSpinnerElements[element.id] = element;
		}
	},	
	
  //-----------------------------------------------------------------------------
  // Desc:        Remove all listeners from the spinner manager
	clearAllListeners : function()
	{
	 registeredSpinnerElements.clear();
  },

  //-----------------------------------------------------------------------------
  // Desc:  See if any of our spinner listeners would be
  //        activated by the elementActivating DOM element.  If so, activate it.
  spinSpinner : function(elementActivatingID)
  {
    var spinnerToSpin = SPINNER_MANAGER.findAssociatedSpinner(elementActivatingID);
    
    if(spinnerToSpin)
    {
      SPINNER_HELPER.startSpinner(spinnerToSpin);
      //alert("found spinner " + thisSpinner.id + " listening to " + thisSpinner.associator.activatingElementIDs[j])
    }   
  },

  //-----------------------------------------------------------------------------
  // Desc:  Loop through our spinner listeners and see if any of them would be
  //        activated by the elementActivating DOM element.  If so, activate it.
  stopSpinner : function(elementActivatingID)
  {
    var spinnerToSpin = SPINNER_MANAGER.findAssociatedSpinner(elementActivatingID);
    
    if(spinnerToStop)
    {
      SPINNER_HELPER.stopSpinner(spinnerToSpin);      
    }
  },   
  
    //-----------------------------------------------------------------------------
  // Desc:  Find the spinner DOM element associated with a given element ID
  findAssociatedSpinner : function(elementActivatingID)
  {
      // Index of the spinner that has been activated by the elementActivating
    var activatedSpinner = null;
    
    for(i in SPINNER_MANAGER.registeredSpinnerElements) // && activatedSpinner < 0;i++)
    { 
      thisSpinner = SPINNER_MANAGER.registeredSpinnerElements[i];
      if(thisSpinner.associator.activatingElementIDs[elementActivatingID] == true)
      {
      	activatedSpinner = thisSpinner;
      	break;
			}
    }

    return activatedSpinner;
  }
  
};

//-----------------------------------------------------------------------------
// Desc:  SPINNER_HELPER handles individual operations that happen on spinners 
SPINNER_HELPER = 
{
  startSpinner : function(spinnerElement)
  {
  	spinnerElement.style.visibility= "visible";
		spinnerElement.style.display="inline";    
  },
  
  stopSpinner : function(spinnerElement)
  {
  	spinnerElement.style.visibility= "hidden";
		spinnerElement.style.display="none";    
  },
  
  positionSpinner : function(spinnerElement,positionType)
  {
    // TODO: positionSpinner
  }
};

//-----------------------------------------------------------------------------
// Desc:  SPINNER_ASSOCIATOR is a Javascript class that associates listener DOM elements
//        with itself.  Coupled with the SPINNER_MANAGER, this allows an arbitrary
//        element to say that its spinner should start, and have the correct spinner
//        element do so.  
SPINNER_ASSOCIATOR = 
{
  activatingElementIDs : new Array(),
  
  //-----------------------------------------------------------------------------
  // Desc:  Associate with this spinner a new element that we'll be listening to 
  addActivatingElementID : function(elementID)
  {
  	// Check if this elementID already is in our activatingID array/hash  
    if(SPINNER_ASSOCIATOR.activatingElementIDs[elementID] != null)
    {
    	alert("Error: Trying to associate a spinner with an ID that's already been associated")
		}
		else
		{
			SPINNER_ASSOCIATOR.activatingElementIDs[elementID] = true;
		}    
  },
  
  //-----------------------------------------------------------------------------
  // Desc:  Provide hookups such that this hashmap can be used like an object 
  createObject : function()
  {
    this.activatingElementIDs = SPINNER_ASSOCIATOR.activatingElementIDs;
    this.addActivatingElementID = SPINNER_ASSOCIATOR.addActivatingElementID;
  }

};

//-----------------------------------------------------------------------------
// Desc:  Associate a listened element with a spinning element.  When the listened
//        element says that it wants spinning to begin, we'll look for any spinners
//        that have the ID of that element.  This function creates the associations that
//        make that magic happen 
function invokeSpinnerOnClick(elementClicked,spinnerElement)
{
  if(spinnerElement.associator == null)
  {
    // Add an ad hoc property to the spinner DOM element
    spinnerElement.associator = new SPINNER_ASSOCIATOR.createObject();
  }
  
  //for(i in listenerElementID)
  {
    spinnerElement.associator.addActivatingElementID(elementClicked.id)
    elementClicked.onclick = "SPINNER_MANAGER.spinSpinner(this.id);" + elementClicked.onclick; 
  //alert(spinnerElement.mySpinner.activatingElementIDs[0])
  }
}

//-----------------------------------------------------------------------------
// Plan B:  This is unrelated to pretty much all of the above.  It is used when 
// simplicity is sought over syntatic lovability.
function spinElement(spinnerElement)
{
	SPINNER_HELPER.startSpinner(spinnerElement);
}

function stopSpinElement(spinnerElement)
{
	SPINNER_HELPER.stopSpinner(spinnerElement);
}


/*
    http://www.JSON.org/json2.js
    2009-09-29
    See http://www.JSON.org/js.html
*/
// Create a JSON object only if one does not already exist. We create the
// methods in a closure to avoid creating global variables.

if (!this.JSON) {
    this.JSON = {};
}

(function () {
    function f(n) {
        return n < 10 ? '0' + n : n;
    }

    if (typeof Date.prototype.toJSON !== 'function') {
        Date.prototype.toJSON = function (key) {
            return isFinite(this.valueOf()) ?
                   this.getUTCFullYear()   + '-' +
                 f(this.getUTCMonth() + 1) + '-' +
                 f(this.getUTCDate())      + 'T' +
                 f(this.getUTCHours())     + ':' +
                 f(this.getUTCMinutes())   + ':' +
                 f(this.getUTCSeconds())   + 'Z' : null;
        };

        String.prototype.toJSON =
        Number.prototype.toJSON =
        Boolean.prototype.toJSON = function (key) {
            return this.valueOf();
        };
    }

    var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
        gap,
        indent,
        meta = {    // table of character substitutions
            '\b': '\\b',
            '\t': '\\t',
            '\n': '\\n',
            '\f': '\\f',
            '\r': '\\r',
            '"' : '\\"',
            '\\': '\\\\'
        },
        rep;


    function quote(string) {
        escapable.lastIndex = 0;
        return escapable.test(string) ?
            '"' + string.replace(escapable, function (a) {
                var c = meta[a];
                return typeof c === 'string' ? c :
                    '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
            }) + '"' :
            '"' + string + '"';
    }


    function str(key, holder) {
        var i,          // The loop counter.
            k,          // The member key.
            v,          // The member value.
            length,
            mind = gap,
            partial,
            value = holder[key];

        if (value && typeof value === 'object' &&
                typeof value.toJSON === 'function') {
            value = value.toJSON(key);
        }

        if (typeof rep === 'function') {
            value = rep.call(holder, key, value);
        }

        switch (typeof value) {
        case 'string':
            return quote(value);

        case 'number':
            return isFinite(value) ? String(value) : 'null';

        case 'boolean':
        case 'null':
            return String(value);

        case 'object':
            if (!value) {
                return 'null';
            }

            gap += indent;
            partial = [];

            if (Object.prototype.toString.apply(value) === '[object Array]') {
                length = value.length;
                for (i = 0; i < length; i += 1) {
                    partial[i] = str(i, value) || 'null';
                }

                v = partial.length === 0 ? '[]' :
                    gap ? '[\n' + gap +
                            partial.join(',\n' + gap) + '\n' +
                                mind + ']' :
                          '[' + partial.join(',') + ']';
                gap = mind;
                return v;
            }

            if (rep && typeof rep === 'object') {
                length = rep.length;
                for (i = 0; i < length; i += 1) {
                    k = rep[i];
                    if (typeof k === 'string') {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            } else {

                for (k in value) {
                    if (Object.hasOwnProperty.call(value, k)) {
                        v = str(k, value);
                        if (v) {
                            partial.push(quote(k) + (gap ? ': ' : ':') + v);
                        }
                    }
                }
            }

            v = partial.length === 0 ? '{}' :
                gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' +
                        mind + '}' : '{' + partial.join(',') + '}';
            gap = mind;
            return v;
        }
    }

    if (typeof JSON.stringify !== 'function') {
        JSON.stringify = function (value, replacer, space) {
            var i;
            gap = '';
            indent = '';

            if (typeof space === 'number') {
                for (i = 0; i < space; i += 1) {
                    indent += ' ';
                }
            } else if (typeof space === 'string') {
                indent = space;
            }

            rep = replacer;
            if (replacer && typeof replacer !== 'function' &&
                    (typeof replacer !== 'object' ||
                     typeof replacer.length !== 'number')) {
                throw new Error('JSON.stringify');
            }

            return str('', {'': value});
        };
    }

    if (typeof JSON.parse !== 'function') {
        JSON.parse = function (text, reviver) {
            var j;
            function walk(holder, key) {
                var k, v, value = holder[key];
                if (value && typeof value === 'object') {
                    for (k in value) {
                        if (Object.hasOwnProperty.call(value, k)) {
                            v = walk(value, k);
                            if (v !== undefined) {
                                value[k] = v;
                            } else {
                                delete value[k];
                            }
                        }
                    }
                }
                return reviver.call(holder, key, value);
            }
            cx.lastIndex = 0;
            if (cx.test(text)) {
                text = text.replace(cx, function (a) {
                    return '\\u' +
                        ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
                });
            }

            if (/^[\],:{}\s]*$/.
test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
                j = eval('(' + text + ')');
                return typeof reviver === 'function' ?
                    walk({'': j}, '') : j;
            }
            throw new SyntaxError('JSON.parse');
        };
    }
}());


/* This serves as the parent class for all types of sweetBarSections, including:  "community,"
* "friend," "history," "notification," and "question."
*
* Responsibilities of this class include:
* 1) Hold all of the data that is common to all section classes
* 2) Create and manage the tidbits for the sections
* 3) Assist in determining what should be in the popup box when this section's icon is clicked
* 4) Render expanded version of tidbits, if this section has been expanded by user
* 5) Save updates to this section in cookies, and reload them from cookies upon being created (when cookie data exists)
*
 */

(function($) {
	sweetBarSection = function(options) {
		// IF CHANGING THIS:  Be sure to change UserSweetBarSetting as well
		MAX_TIDBITS_SHOWN = 10;

		this.type = options.type;
		this.manager = options.manager;
		this.cookiespace = options.cookiespace;
		this.hintText = options.hintText;
		this.container = this.icon = null;
		this.tidbits = new Array(); // Array of tidbits, with newest tidbits at beginning of array
		this.deletedTidbitIds = new Array();
		this.parentDiv = "sb_inner_container";
		this.contents = null;
		this.contentsStale = true;
		this.fullyLoaded = false;
		this.initialized = false;
		this.showState = SB_SHOW_STATE_MINIMIZED;
		this.currentlyLoading = this.autoPopNewContent = false;
		 
		//-----------------------------------------------------------------------------
		// 1. Create a container to hold this sweet bar section.
		this.createMe = function() {
			var myDiv = $("<div id='" + this.type + "_container' class='section_container' lang='" + this.hintText + "'>").appendTo($('#' + this.parentDiv));
			this.container = myDiv;
		};

		//-----------------------------------------------------------------------------
		this.getSectionType = function() {
			return this.type;
		};

		//-----------------------------------------------------------------------------
		// Create icon for the sectoin, reconsitute its tidbits from cookie if possible,
		// and render the section in the appropriate manner for its showState.
		this.createInternals = function(railsPackedTidbits) {
			// Set showState before createMyIcon so that createMyIcon can modify it manually (ie, in the case of bar_option) if desired.
			this.showState = get_json_subcookie(this.cookiespace + "_main", 'shst') || SB_SHOW_STATE_MINIMIZED;
			this.autoPopNewContent = get_json_subcookie(this.cookiespace + "_main", 'apop') || false; 
			this.createMyIcon();

			// Load tidbits from packed Rails elements
			// Must be done before we call the showStateChange, which will render all tidbits if expanded
			for(var i=0;i<railsPackedTidbits.length;i++) {
				packedTidbitEl = railsPackedTidbits[i];
				this.constructTidbitFromPackedEl(packedTidbitEl);
			}

			this.postInitializeCallback();
			this.handleShowStateChange(); // Must be called after we've set this.container and this.showState

			this.initialized = true;
		};

		//-----------------------------------------------------------------------------
		// When rendering popup window, this appends all of the links that are common to all sections
		this.appendStandards = function(list) {
			list.append($('<li>').html('<hr />'));

			if(this.getHasOutlinedTidbits()) {
				var allReadLink = $('<li><a id="sb_mark_all_read" href="javascript:void(0)">Mark all above as read</a></li>');
				list.append(allReadLink);
				allReadLink.click(function() { self.markAllTidbitsRead(this); });
			}

			// AHHH yes... *this* was why C++ was a grotesque non-DRY language that I hate...
			var expandLink = $('<li><a id="sb_expand" href="javascript:void(0)">Expand</a></li>');
			list.append(expandLink);
			expandLink.click(function() {	self.manager.requestExpandSection(this);	});

			var minimizeLink = $('<li><a id="sb_minimize" href="javascript:void(0)">Minimize</a></li>');
			list.append(minimizeLink);
			minimizeLink.click(function() {	self.manager.requestMinimizeSection(this);	});

			var hideLink = $('<li><a id="sb_hide" href="javascript:void(0)">Hide</a></li>');
			list.append(hideLink);
			hideLink.click(function() {	self.manager.requestHideSection(this);	});
		};

		//-----------------------------------------------------------------------------
		// Record in our stored data that a tidbit has been deleted or seen
		this.markTidbitOnServer = function(tidbit_to_mark, marking_type) {
			if(!tidbit_to_mark || !marking_type) return;

			jQuery.ajax({type: "GET", dataType: "json", cache: false, url: '/switchboard/mark_as',
				data: { "section_type": this.type, "tidbit_ids": tidbit_to_mark.id, "mark_as": marking_type },
				complete: function(json) {
				}
			});
		};

		//-----------------------------------------------------------------------------
		// When we successfully receive an update from jquery-barManager (which invokes updates),
		// we'll generically save into cookies the data returned, then we'll render those elements
		// to the extent that the update would change what's visible on the user's screen
		this.processUpdate = function(jsonArray, processedAt) {
			// Mark all tidbits so we can find out which ones might be in cookie array but not in JSON update for whatever reason
			for(var i=0;i<this.tidbits.length;i++) {	this.tidbits[i].foundInUpdate = false;	}

			// Process update
			this.saveJsonUpdates(jsonArray);

			// Delete any tidbits that were in memory/cookies but were not returned in our jsonArray.  There is no hope for them.
			// Would certainly be nice to find a more beautiful way to detect the delta between memory tidbits and database tidbits.
			for(var i=0;i<this.tidbits.length;i++) {
				if(!this.tidbits[i].foundInUpdate) {
					this.deleteTidbit(this.tidbits[i]);
				}
			}

			this.render();
			this.manager.refreshPopIfFocusedOnMe(this.type);
			this.lastUpdate = processedAt;

			// Assumption is that if we're calling process update, then we have all the data we need up to the time this
			// update was called.  Possible situation in which this would not be true:  if somehow the tidbit array
			// got deleted but our updateTime didn't...
		};

		//-----------------------------------------------------------------------------
		// Make sure that all rendered elements show consistently with the interal data of this section
		this.render = function() {
			var outlinedTidbit = this.getFirstOutlinedTidbit();
			if(this.showState == SB_SHOW_STATE_EXPANDED) {
				this.renderExpandedElements();
			} else if(this.showState == SB_SHOW_STATE_MINIMIZED && outlinedTidbit) {
				this.icon.addClass('outlined');
			}

			// If this section automatically pops new tidbits, and we have a new tidbit, then ask bar manager to pop it
			// (unless something else is already popped)
			if(this.autoPopNewContent && outlinedTidbit) {
				this.manager.requestAutoPop(this, outlinedTidbit);
			}
		};

		//-----------------------------------------------------------------------------
		// If this section's showSttate is expanded, then render the tidbits.
		// This is in this parent class because of the assumption that all tidbits are essentially
		// consistent:  they all have an id and pic, and they call call the barManager to get more
		// data when they're clicked upon.
		this.renderExpandedElements = function() {
			var afterElId = this.getSectionIconId(); // First element should be positioned after our icon
			for(var i=0;i<this.tidbits.length;i++) {
				tidbit = this.tidbits[i];
				if(!tidbit.rendered) {
					tidbitIcon = $("<img id='" + tidbit.getIconId() + "' class='tidbit " + (tidbit.outlined ? 'outlined' : '') + "' src='" + tidbit.pic + "' title='" + this.getTidbitIconHoverText(tidbit) + "'>")
					$('#' + afterElId).after(tidbitIcon);
					tidbitIcon.click(function() { self.manager.clickTidbit(this) });
					tidbit.rendered = true;
				}
				afterElId = tidbit.getIconId();
			}
		};

		//-----------------------------------------------------------------------------
		// Add a cookike element to our tidbits array
		this.constructTidbitFromPackedEl = function(packedEl) {
			var tidbit = new sweetBarTidbit({});
			tidbit.unpackElement(packedEl);
			tidbit.section = this;
			this.addTidbitToArray(tidbit);
		};

		//-----------------------------------------------------------------------------
		// Take a given JSON object returned from the update, and save it in our cookie array.
		// Also, remember the time this happened so we can optimize the amount of data we're requesting
		// in our updates.
		this.saveToSection = function(jsonEl) {
			var tidbit = null;
			for(var i=0;i<Math.min(this.tidbits.length, MAX_TIDBITS_SHOWN);i++) {
				var thisTid = this.tidbits[i];
				if(thisTid.id == jsonEl.id) {
					thisTid.foundInUpdate = true;
					var jsonNewer = jsonEl.dateStamp && thisTid.dateStamp && (jsonEl.dateStamp > thisTid.dateStamp);
					if(thisTid.isFullyLoaded() && !jsonNewer) {
						return;  // it's already been added
					} else {
						tidbit = thisTid; // it's present, but not fully loaded (i.e., cuz it came from packed element), so let's update it
						break;
					}
				}
			}

			// Update or add our tidbit
			if(tidbit) {
				tidbit.updateFromObject($.extend({}, jsonEl, {'dataSource':'ajax'}));
			} else {
				tidbit = new sweetBarTidbit($.extend({}, jsonEl, {'rendered':false, 'dataSource':'ajax','section':this,'foundInUpdate':true}));
				// Add in order of datestamp:
				this.addTidbitToArray(tidbit);
			}
		};

		//-----------------------------------------------------------------------------
		// Newest tidbits are inserted at beginning of array
		this.addTidbitToArray = function(newTidbit) {
			var added = false;
			// Tidbits without datestamp will be added to the end of array (least recent)
			if(newTidbit.dateStamp == null || this.tidbits.length == 0) {
				this.tidbits.push(newTidbit);
				return;
			}

			for(var i=0;i<this.tidbits.length;i++) {
				// If the new tidbit is newer (= higher datestamp) than the tidbit we're looking at, insert it in front of that tidbit:
				var thisTid = this.tidbits[i];
				if(thisTid.dateStamp && newTidbit.dateStamp > thisTid.dateStamp) {
					this.tidbits.splice(i,0,newTidbit);
					added = true;
					break;
				}
			}

			if(!added) { this.tidbits.push(newTidbit); }
		};

		//-----------------------------------------------------------------------------
		// Go through the array of objects returned, and process (=save) each of them.
		this.saveJsonUpdates = function(jsonArray) {
			for(var i=0;i<jsonArray.length;i++) {
				var jsonEl = jsonArray[i];
				if(!this.deletedTidbitIds[jsonEl]) {
					this.saveToSection(jsonEl);
				}
			}
		};

		//-----------------------------------------------------------------------------
		this.deleteTidbit = function(tidbit) {
			var foundTidbitToDelete = null;
			var foundTidbitIndex = null;
			for(var i=0;i<this.tidbits.length;i++) {
				if(this.tidbits[i].id == tidbit.id) {
					foundTidbitIndex = i;
					foundTidbitToDelete = this.tidbits[i];
					break;
				}
			}

			if(foundTidbitToDelete) {
				var deletedId = foundTidbitToDelete.id;
				foundTidbitToDelete.killOutline(false);
				this.markTidbitOnServer(foundTidbitToDelete, 'deleted');
				this.deletedTidbitIds[deletedId] = true; // remember the deleted tidbit in case there was an update in progress that wants to re-add this tidbit
				this.tidbits.splice(foundTidbitIndex,1); // Remove one element from array
				$('#' + foundTidbitToDelete.getIconId()).remove();
				delete foundTidbitToDelete; // probably superfluous, this ain't C++ (well, not exactly)
				this.manager.closePopIfTidbitDeleted();
			}
		};

		//-----------------------------------------------------------------------------
		// Figure out what to do when the user chooses to change the show state of a section
		this.handleShowStateChange = function() {
			var containerClass = null;
			set_json_subcookie(this.cookiespace + "_main", 'shst', this.showState);

			switch(this.showState) {
				case SB_SHOW_STATE_HIDDEN: containerClass = 'hidden';
					break;
				case SB_SHOW_STATE_MINIMIZED: containerClass = 'minimized';
					this.container.children('.tidbit').hide();
					break;
				case SB_SHOW_STATE_EXPANDED: containerClass = 'expanded';
					this.container.children('.tidbit').show();
					break;
			}

			this.container.removeClass('hidden').removeClass('minimized').removeClass('expanded');
			this.container.addClass(containerClass);
			this.render();

			// TODO: Call UserSweetBarSettingsController#update_show_state_ajax
			if(!this.initialized) {
				// $.ajax();
			}
		};

		//-----------------------------------------------------------------------------
		this.sbExpand = function() {
			this.showState = SB_SHOW_STATE_EXPANDED;
			this.handleShowStateChange();
		};

		//-----------------------------------------------------------------------------
		this.sbMinimize = function() {
			this.showState = SB_SHOW_STATE_MINIMIZED;
			this.handleShowStateChange();
		};

		//-----------------------------------------------------------------------------
		this.sbHide = function() {
			this.showState = SB_SHOW_STATE_HIDDEN;
			this.handleShowStateChange();
		};

		//-----------------------------------------------------------------------------
		this.ajaxPopResult = function(loadTarget) {
			this.manager.requestAjaxLoad(this, loadTarget);
			this.content = "<table><tr><td><img src='" + this.manager.settings.baseImagePath + "/sweet_bar/horiziontal_wait.gif'> </td><td>Loading content... </td></tr></table>";
			return this.content;
		};		

		//-----------------------------------------------------------------------------
		// Return what should be shown by this sweetBarSection when the sweetBarSection icon is clicked on
		this.getPopListContents = function() {
			// If we don't regenerate list contents, then replacing the HTML means are elements are no longer bound to events.
			// HMM..!
			if(!this.fullyLoaded) {
				this.contents = this.ajaxPopResult('popList');
			}
			else {
				this.contents = this.createPopListContents();
			}

			return this.contents;
		};

		//-----------------------------------------------------------------------------
		// Handle notification that the pop list for this section has been seen by the user
		this.popListOpened = function() {
			// Tough call here... but if they specifically indicated they wanted messaged to be flashed when new,
			// it probably makes sense to keep them highlighted until they've specifically been read.  Otherwise,
			// user could be confused if three are new, they click on one, then can't remember the other two that
			// were new...
			
		};

		//-----------------------------------------------------------------------------
		this.markAllTidbitsRead = function() {
			var readTidbitString = '';

			for(var i=0;i<this.tidbits.length;i++) {
				var thisTidbit = this.tidbits[i];
				if(thisTidbit.outlined) {
					thisTidbit.killOutline(false);
					readTidbitString += thisTidbit.id + ",";
				}
			}

			if(readTidbitString.length > 0) {
				jQuery.ajax({type: "GET", dataType: "json", cache: false, url: '/sweet_bars/mark_as',
					data: { "section_type": this.type, "tidbit_ids": readTidbitString, "mark_as": 'read' }
				});
			}
		};

		//-----------------------------------------------------------------------------
		this.getRefreshTidbitContent = function(tidbit) {
			return this.getTidbitContent(tidbit);
		};

		//-----------------------------------------------------------------------------
		this.getHasOutlinedTidbits = function() {
			var hasEm = false;
			for(var i=0;i<this.tidbits.length;i++) {
				if(this.tidbits[i].outlined) {
					hasEm = true;
					break;
				}
			}
			return hasEm;
		};

		//-----------------------------------------------------------------------------
		this.getTidbitContent = function(tidbit) {
			return this.getTidbitSpecificContent(tidbit);
		};


		//-----------------------------------------------------------------------------
		// Take an HTML element and determine which tidbit object it corresponds to
		this.getTidbitFromIcon = function(tidbitEl) {
			for(var i=0;i<this.tidbits.length;i++) {
				if(this.tidbits[i].getIconId() == tidbitEl.attr('id')) {
					return this.tidbits[i];
				}
			}
			return null;
		};

		//-----------------------------------------------------------------------------
		// Given an element that is a child inside a tidbit container, return the tidbit that
		// element corresponds to
		this.getTidbitFromChildEl = function(childEl) {
			result = null;
			childEl = $(childEl);

			// Ensure we're dealing with the container for the tidbit, rather than some random kid of the container
			if(childEl.attr('class').indexOf('tidbit_container') == -1) {
				childEl = $(childEl.parents("div[class*='tidbit_container']").get(0));
			}

			for(var i=0;i<this.tidbits.length;i++) {
				if(this.tidbits[i].getContainerId() == childEl.attr('id')) {
					result = this.tidbits[i];
					break;
				}
			}

			return result;
		};

		//-----------------------------------------------------------------------------
		// Returned first outlined tidbit, if one exists
		this.getFirstOutlinedTidbit = function() {
			var outlinedTidbit = null;
			for(var i=0;i<this.tidbits.length;i++) {
				if(this.tidbits[i].outlined) {
					outlinedTidbit = this.tidbits[i];
					break;
				}
			}
			return outlinedTidbit;
		};

		//-----------------------------------------------------------------------------
		this.getSectionContainerId = function() {
			return 'section_' + this.type;
		};

		//-----------------------------------------------------------------------------
		this.getSectionIconId = function() {
			return 'section_icon_' + this.type;
		};

		//-----------------------------------------------------------------------------
		this.getImageBasePath = function() {
			return this.manager.settings.baseImagePath;
		};

		// Initialize sweetBarSection
		var self = this;
		var parent = this;
		this.createMe();
	};

})(jQuery);

/* TODO: Document
 */

(function($) {
	sweetBarTidbit = function(options) {

		this.rendered = options.rendered || false;
		this.id = options.id || null;
		this.content = options.content || null;
		this.from = options.from || null;
		this.pic = options.pic || null;
		this.dataSource = options.dataSource || null;
		this.brief = options.brief || null;
		this.section = options.section || null;
		this.dateStamp = options.dateStamp || null;
		this.outlined = options.outlined || false;
		this.fullyLoaded = options.fullyLoaded || false;
		this.foundInUpdate = options.foundInUpdate || false;
		this.prevContent = options.prevContent || null;

		//-----------------------------------------------------------------------------
		this.getSectionType = function() {
			return this.section.type;
		};

		//-----------------------------------------------------------------------------
		this.updateFromObject = function(updateObject) {
			$.extend(this, updateObject);
			if(!this.content || this.content.length == 0) {
				this.content = this.brief;
			}
		};

		//-----------------------------------------------------------------------------
		this.unpackElement = function(packedEl) {
			$.extend(this, packedEl);
			this.dataSource = 'packed_rails_object';
			//this.content = this.brief;
		};

		//-----------------------------------------------------------------------------
		this.isFullyLoaded = function() {
			return this.dataSource == 'ajax' || !this.section.popUsesAjax() || this.fullyLoaded;
		};

		//-----------------------------------------------------------------------------
		this.killOutline = function(markReadOnServer) {
			if(this.outlined) {
				if(markReadOnServer) this.section.markTidbitOnServer(this, 'read');

				// Ensure that the new tidbit icon doesn't exist in the list
				$('#' + this.getTidbitNewIconId()).remove();

				this.outlined = false;
				switch(this.section.showState) {
					case SB_SHOW_STATE_MINIMIZED:
						if(!this.section.getHasOutlinedTidbits()) {
							this.section.icon.removeClass('outlined');
						}
						break;
					case SB_SHOW_STATE_EXPANDED: $('#' + this.getIconId()).removeClass('outlined'); break;
				}
			}
		};

		//-----------------------------------------------------------------------------
		// Each tidbit will have a unique ID.  This function describes what that unique ID should be.
		this.getIconId = function() {
			return "tidbit_" + this.section.type + "_" + this.id;
		};

		//-----------------------------------------------------------------------------
		// Each tidbit will have a unique ID.  This function describes what that unique ID should be.
		this.getContainerId = function() {
			return "tidbit_container_" + this.section.type + "_" + this.id;
		};

		//-----------------------------------------------------------------------------
		// Each tidbit will have a unique ID.  This function describes what that unique ID should be.
		this.getPopListLinkId = function() {
			return "tidbit_anchor_" + this.section.type + "_" + this.id;
		};

		//-----------------------------------------------------------------------------
		this.getTidbitNewIconId = function() {
			return 'tid_newicon_' + this.section.type + "_" + this.id;
		};

		//-----------------------------------------------------------------------------
		this.getNewTidbitIcon = function() {
			return "<img id='" + this.getTidbitNewIconId() + "' class='newtid_icon' src='" + this.section.manager.settings.baseImagePath + "/sweet_bar/new.png' title='This message not seen yet'>";
		};

		// Initialize sweetBarTidbit
		// var self = this;
		// this.createMe();
	};

})(jQuery);

/**
 * This class does a few things.
 * It would be more MVC-ish if it were broken into one class that handles knowing about/updating all the sections, and another class
 * that handles the popup window.  But right now it's just one big mother.
 *
 * 1) Initializes all sections in this.sectionList array
 * 2) Manages this.popContainer, which will contain either options for a clicked-upon section, or content from a clicked-upon tidbit
 * 3) Handle jQuery timer updates, and delegate the JSON returned to the appropriate class
 * 4) Figure out what to do when a tidbit or section icon is clicked upon.  Since this class is the omnipotent seciton holder, it can
 *    map clicked elements to their corresponding section.  Then it can call that sections' event handler.
 */
SB_SHOW_STATE_HIDDEN = 0;
SB_SHOW_STATE_MINIMIZED = 1;
SB_SHOW_STATE_EXPANDED = 2;

(function($){
	$.sectionManager = function(allParams) {
		var defaults = {
			'innerContainer':'sb_inner_container',
			'baseImagePath':'/images',
			'enable':false,
			'currentUserPic':null
		};

		this.settings = $.extend({}, defaults, allParams.options);
		this.lastUpdate = null; this.resizeTimer = null;
		this.activeTidbit = null;
		this.timeUntilFirstUpdate = 15;	this.baseUpdateInterval = 30;	this.emptyUpdateIncrement = 2;	this.longestUpdateInterval = 60;
		this.popContainer = null;			// Holds the element that will be used to show content that gets popped from sweetBar
		this.popContainerBorder = this.popContainerFrame = this.popContainerCloseIcon = this.popTip = null;
		this.popFromElId = null;
		this.updatingAll = false;
		this.myWidth = null;
		this.ajaxLoadTarget = null;
		this.hiddenUnlessNewUpdates = false;
		this.blurred = false; this.page_title = null;
		this.barContainers = "#sb_outer_container, #sb_top_border, #sb_inner_container, #sb_color_container"; 
		this.sectionList = new Array(	{'cookie':'bo', 'name':'bar_option', 'klass':sbSectionBarOption, 'hintText': 'Switchboard Options'},
																	{'cookie':'cmty', 'name':'community', 'klass':sbSectionCommunity, 'hintText': 'Quick Text Conversations'},
																 	{'cookie':'hsty', 'name':'history', 'klass':sbSectionHistory, 'hintText': 'Visited Items History'},
																	{'cookie':'qu', 'name':'roundtables', 'klass':sbSectionRoundtable, 'hintText': 'Roundtable Questions'},
																	{'cookie':'note', 'name':'notification', 'klass':sbSectionNotification, 'hintText': 'Notifications'});
		this.sections = new Array();	// Holds the array of sweetBarSection classes being managed, in the format 'sectionName':instantiated class

		//-----------------------------------------------------------------------------
		// 1. Create a container that will be used by all sections as the popup container -- this assumes
		// we won't want multiple sections popping content at the same time.  I think that'd be a mess.
		this.initializeSelf = function() {
			if(this.hiddenUnlessNewUpdates || !this.settings.enable) $(this.barContainers).hide();

			this.resizeContainer();

			$(window).bind('resize', function() {
				self.resizeContainer();
				// Firebug calls this "useless" due to syntax error:
				//if (self.resizeTimer) clearTimeout(self.resizeTimer);
				//self.resizeTimer = setTimeout(self.resizeContainer(), 100);
			});

			// Need a way to hide popup when area outside of it is clicked, but not sure how to do it yet.  Putting click on body means that any click
			// anywhere hides popper.
			//$('body').click(function() { self.hideAndUnselectPop() });
			this.popTip = $("<div id='sb_hint_popper'>").appendTo($('#' + this.settings.innerContainer));			
			this.popContainerFrame = $("<div id='sb_pop_container_outer'>").appendTo($('#' + this.settings.innerContainer));
			this.popContainerHeaderText = $("<div id='pop_header_text'>").appendTo(this.popContainerFrame);
			this.popContainer = $("<div id='sb_pop_container'>").appendTo(this.popContainerFrame);
			this.popContainerBorder = $("<div id='sb_pop_container_bottom_border'>").appendTo($('#' + this.settings.innerContainer));
			this.popContainerCloseIcon = $("<div id='sb_pop_container_close_icon'>").appendTo(this.popContainerFrame);
			this.popContainerCloseIcon.click(function() {
				self.userClosedActivePopup();
			});

			this.updateInterval = get_json_subcookie('swtbr', 'ui') || this.baseUpdateInterval;
			var now = new Date();
			this.lastUpdate = get_json_subcookie('swtbr', 'lu') || (now.getTime()/1000);
		};

		//-----------------------------------------------------------------------------
		// 2. Create classes fore each section, using the this.sectionList array, above.
		this.initializeSections = function(allParams) {
			// Don't know of a way to use $.each since it enters scope of anonymous function where I can no longer
			// set/read properties of this class (other than those passed into anon function from array being looped)
			for(var i=0;i<this.sectionList.length;i++) {
				var val = this.sectionList[i];
				if(get_json_subcookie('sb'+val.cookie+'_main','shst') == 0) {
					continue;
				}

				sweetBarConstructionParams = {'type':val.name, 'manager':this, 'hintText': val.hintText, 'cookiespace':'sb'+val.cookie};

				// Using extend with .extend(subclass, parentclass) means that all of the parentClass' methods/objects will be merged into the
				// subclass (and that object will be saved in our section hash).  This is important because the event handlers that are setup
				// in the subclasses make reference to "self," where "self" needs to have access to methods from both the subclass and parent
				// class.  That will only be the case with this ordering.
				// The drawback of merging the parent into the subclass is that if a method exists in both, it will be the parent's method that takes
				// precedence.  Not sure how to get around that one yet (to give expected behavior of subclass method taking precedence). 
				switch(val.klass) {
					case sbSectionBarOption: this.sections[val.name] = $.extend(new sbSectionBarOption(), new sweetBarSection(sweetBarConstructionParams)); break;
					case sbSectionCommunity:	this.sections[val.name] = $.extend(new sbSectionCommunity({'currentUserPic':this.settings.currentUserPic}), new sweetBarSection(sweetBarConstructionParams)); break;
					case sbSectionHistory:	this.sections[val.name] = $.extend(new sbSectionHistory(), new sweetBarSection(sweetBarConstructionParams)); break;
					case sbSectionRoundtable:	this.sections[val.name] = $.extend(new sbSectionRoundtable(), new sweetBarSection(sweetBarConstructionParams)); break;
					case sbSectionNotification:	this.sections[val.name] = $.extend(new sbSectionNotification(), new sweetBarSection(sweetBarConstructionParams)); break;
				}

				this.sections[val.name].createInternals(allParams[val.name] || []);
			}

			$('.section_icon').hover(function() {
				if(!self.getPopIsVisible()) {
					var container = $(this).parent();
					self.popTip.html($(container).attr('lang')).show();
					positionVerticalPop($(container), $(self.popTip));
				}
			},
			function() {
				self.popTip.hide();
			});
		};

		//-----------------------------------------------------------------------------
		// Start updates that are delgated to each section.  Eventually we'll adjust the update timer
		// per the amount of activity that's happening with the user.
		this.startUpdates = function() {
			var firstUpdateSeconds = null;
			if(this.lastUpdate && this.updateInterval) {
				var now = new Date();
				// First update will occur at the longer of 2 seconds or the last update+update interval minus current time
				firstUpdateSeconds = Math.max(2, ((this.lastUpdate+this.updateInterval)-(now.getTime()/1000)));
			} else {
				firstUpdateSeconds = this.updateInterval;
			}

			// If cookie tells us to update now, we'll do it!  Used for stuff like regrabbing after settings changed.
			if(get_json_subcookie('swtbr', 'update_all')) {
				this.updatingAll = true;
				firstUpdateSeconds = 0;
			}

			$.timer(firstUpdateSeconds*1000, function (timer) {
				var updateArray = {};

				$.ajax({
					type: 'GET',
					url: '/switchboard/update_all',
					cache: false,
					dataType:'json',
					success: function(json) {
						if(!json) return;
						
						// Let each section handle its own update. This assumes that the jSOn returned will be of the format
						// { "community" => { hash of community data}, "history" => { hash of history data}, etc.
						// There are further assumptions about what the various data hashes will contain.  You can read about those
						// in the processUpdate comments.
						var foundUpdate = false;
						for(var i=0;i<self.sectionList.length;i++) {
							var val = self.sections[self.sectionList[i].name];
							if(val && json[val.type]) {
								foundUpdate = true;
								val.processUpdate(json[val.type], json.processedAt);
							}
						}

						if(self.updatingAll) {
							self.updatingAll = false;
							set_json_subcookie('swtbr', 'update_all', false);
						}
						
						self.setUpdateInterval(foundUpdate);
						var now = new Date();	set_json_subcookie('swtbr', 'lu', now.getTime()/1000);
					}
				});

				var newInterval = self.updateInterval || self.baseUpdateInterval;
				timer.reset(newInterval*1000);
			});
		};

		//-----------------------------------------------------------------------------
		// In a better architected world, this would exist inside sweetBarSection, but since it would be initialized
		// in that class, the tidbits contained therein would know only of the base class sweetBarSection.
		// Err, I just confused myself with this comment.  At any rate, flawed call sequence was:
		// processUpdate (sbSection) -> saveJsonUpdates (sbSection) -> saveTidbitsToCookie (sbTidbit) -> getCookieKnowsEnoughToLoad
		// where getCookieKnowsEnoughToLoad was coming up in ERROR because the section known to the tidbit did not include
		// the sublcass information.  
		this.requestAjaxLoad = function(section, ajaxTarget) {
			if(!section.currentlyLoading) {
				this.ajaxLoadTarget = ajaxTarget;
				section.currentlyLoading = true;
				additionalParams = '';
				if(section.getAjaxLoadParams) additionalParams = section.getAjaxLoadParams();

				$.ajax({
						type: 'GET',
						url: '/switchboard/load_one_section',
						cache: false,
						data: 'section_type=' + encodeURIComponent(section.type) + '&' + additionalParams,
						dataType:'json',
						success: function(json) {
							if(!json) return; 
							var updatedType = json.updatedType;
							var updateSection = self.sections[updatedType];
							updateSection.processUpdate(json[updatedType], json.processedAt);
							updateSection.currentlyLoading = false;
							updateSection.fullyLoaded = true;
							if(self.ajaxLoadTarget == 'popList') {
								self.popInLocation(updateSection.getPopListContents(), updateSection.icon, updateSection.hintText);
								updateSection.popListOpened();
							}
						}
				});
			}
		};

		//-----------------------------------------------------------------------------
		// Depending on whether any content was found to update, we'll lengthen or shorten the time between our AJAX updates
		this.setUpdateInterval = function(foundUpdate) {
			var originalInterval = this.updateInterval;

			if(!foundUpdate) {
				this.updateInterval = Math.min(this.longestUpdateInterval, this.updateInterval+this.emptyUpdateIncrement);
			} else {
				this.updateInterval = this.baseUpdateInterval;
			}

			if(originalInterval != this.updateInterval) {
				set_json_subcookie('swtbr', 'ui', this.updateInterval);
			}
		};

		//-----------------------------------------------------------------------------
		// Called by sweetBarSection via its containing icon's onclick event.
		// Intention is to pop up the options for the section
		this.clickSectionIcon = function(clickedIconEl) {
			var section = this.getSectionOfContainerEl(clickedIconEl);

			if(this.popContainer.attr('lang') == section.getSectionContainerId() && this.getPopIsVisible()) {
				this.userClosedActivePopup();
			}
			else {
				// Otherwise, pop it in the right location
				this.popInLocation(section.getPopListContents(), clickedIconEl, section.hintText);
				this.popContainer.attr('lang', section.getSectionContainerId()); // and remember we popped it, until we store this in the popper itself.
			}
		};

		//-----------------------------------------------------------------------------
		this.refreshPopIfFocusedOnMe = function(sectionType) {
			if(this.getPopIsVisible() && this.poppedSectionType() == sectionType) {
				var tidbit = section = null;
				if(tidbit = this.getPoppedTidbit()) {
					var newContent = this.sections[sectionType].getRefreshTidbitContent(tidbit);
					if(newContent) {
						this.popContainer.html(newContent); // This assumes that everything else in popInLocation is superfluous, since we're merely refreshing...
					}
				// If a tidbit isn't popped, we assume that we must be showing the pop list.  So let's refresh it.
				} else if(section = this.sections[sectionType]) {
					this.popInLocation(section.getPopListContents(), section.icon, section.hintText);
				}
			}
		};

		//-----------------------------------------------------------------------------
		// Take the contentToPop content and position it above anchorEl.
		// NOTE: Because this function replaces HTML wholesale, bound events are an endangered species
		// (i.e., they're lost every time we call this).  For memory's sake, this function should probably
		// find some way to unbind all associated elements before replacing the HTML.
		this.popInLocation = function(contentToPop, anchorEl, titleText) {
			if(this.hiddenUnlessNewUpdates) $(this.barContainers).show();
			self.popTip.hide();

			if(this.getPopIsVisible()) {
				$('#' + this.settings.innerContainer + ' .selected').each(function() { $(this).removeClass('selected') });
			}

			// Set title text
			$('#sb_pop_container_outer #pop_header_text').html(titleText);

			// Remember who popped us
			this.popFromElId = $(anchorEl).attr('id');
			$(anchorEl).addClass('selected');

			// Get position information about who popped us, make sure we don't run off screen
			var rawEl = $(anchorEl).get(0);
			var pos = getCumulativeOffsetPos(rawEl);
			var rightEdge = pos[0] + this.popContainerFrame.width();
			var rightEdgeOverflow = Math.max(0, (rightEdge+15)-$(document).width());
			var anchorWidth = $(anchorEl).width()+3;
			this.popContainerFrame.css('right','').css('left','');
			this.popContainerBorder.css('right','').css('left','');
			if(rightEdgeOverflow > 0) {
				// If this elements would have gone outside the dimensions of our screen, then position its right edge against the anchorEl
				var rightPos = ($(document).width()-pos[0])-2;
				this.popContainerFrame.css('right', (rightPos-anchorWidth) + "px"); // 4 must be the 2px padding around icon
				this.popContainerBorder.css('right', rightPos + "px").css("margin-left", 0);
			} else {
				this.popContainerFrame.css('left', pos[0]+1 + 'px');
				this.popContainerBorder.css('left', pos[0]+1 + 'px').css("margin-left", anchorWidth + "px");
			}

			// Populate pop container and show it
			this.popContainer.html(contentToPop);
			this.popContainerFrame.show();
			this.popContainerBorder.show();
			this.popContainerCloseIcon.show();

		};

		//-----------------------------------------------------------------------------
		// Handle a tidbit being clicked
		this.clickTidbit = function(tidbitEl) {
			var jqTidbit = $(tidbitEl);
			var section = this.getSectionOfContainerEl(jqTidbit);
			var tidbit = section.getTidbitFromIcon(jqTidbit);

			if(this.popContainer.attr('lang') == tidbit.getIconId() && this.getPopIsVisible()) {
				this.hideAndUnselectPop();
			}
			else {
				this.showTidbit(tidbit, jqTidbit);
			}
		};

		//-----------------------------------------------------------------------------
		this.clickTidbitInPoplist = function(section, clickedEl) {
			var foundTidbit = null;
			for(var i=0;i<section.tidbits.length;i++) {
				if(section.tidbits[i].getPopListLinkId() == $(clickedEl).attr('id')) {
					foundTidbit = section.tidbits[i];
					break;
				}
			}
			
			this.showTidbit(foundTidbit, $('#' + this.popFromElId));
		};

		//-----------------------------------------------------------------------------
		this.showTidbit = function(tidbit, attachToEl) {
			var section = tidbit.section;
			section.tidbitWasClicked(tidbit);
			tidbit.killOutline(true);
			var tbContent = section.getTidbitContent(tidbit);
			this.popInLocation(tbContent, attachToEl, section.hintText);
			this.popContainer.attr('lang', tidbit.getIconId());
		};

		//-----------------------------------------------------------------------------
		// Some section has been set to autopop tidbits when new content comes in, and new content has come in.
		this.requestAutoPop = function(section, tidbit) {
			if(!this.getPopIsVisible()) {
				var attachTo = null;
				if(section.showState == SB_SHOW_STATE_MINIMIZED) {
					attachTo = section.icon;
				} else {
					attachTo = $('#' + tidbit.getIconId());
				}

				// Update title bar to reflect this autopopped update
				if(this.blurred) {
					this.page_title = document.title;
					document.title = "New Switchboard Update Recevied - " + this.page_title; 
				}

				// Similar to showTidbit, except we didn't click the tidbit, and we won't remove the outline since we
				// can't be sure if user will see this before they visit another page
				var tbContent = section.getTidbitContent(tidbit);
				this.popInLocation(tbContent, attachTo, section.hintText);
				this.popContainer.attr('lang', tidbit.getIconId());
			}
		};

		//-----------------------------------------------------------------------------
		// Handle user clicking "Expand" for a section
		this.requestExpandSection = function(requestingEl) {
			if(this.isShowingMinimized()) {
				set_json_subcookie('swtbr','shst', SB_SHOW_STATE_EXPANDED); // Eek! Magic number alert!  What is this, remedial programming?  No, it's just Javascript where files can't cross-communicate easily.
				this.resizeContainer();
			}
			section = this.getSectionOfPopdivEl(requestingEl);
			this.hideAndUnselectPop();
			section.sbExpand();
			this.saveAllCookiesToDb();
		};

		//-----------------------------------------------------------------------------
		// Handle user clicking "Hide" for a section
		this.requestHideSection = function(requestingEl) {
			section = this.getSectionOfPopdivEl(requestingEl);
			this.hideAndUnselectPop();
			section.sbHide();
			this.saveAllCookiesToDb();
		};

		//-----------------------------------------------------------------------------
		// Handle user clicking "Minimize" for a section
		this.requestMinimizeSection = function(requestingEl) {
			section = this.getSectionOfPopdivEl(requestingEl);
			this.hideAndUnselectPop();
			section.sbMinimize();
			this.saveAllCookiesToDb();
		};

		//-----------------------------------------------------------------------------
		this.saveAllCookiesToDb = function()  {
			$.ajax({type: 'POST',	url: '/user_sweet_bar_settings/sync_settings_to_cookies'});
		};

		//-----------------------------------------------------------------------------
		this.getPopIsVisible = function() {
			return this.popContainerFrame.css('display') == 'block'
		};

		//-----------------------------------------------------------------------------
		this.hideAndUnselectPop = function() {
			$('#' + this.popFromElId).removeClass('selected');
			this.popContainerFrame.hide('fast');
			this.popContainerBorder.hide();
			this.popContainerCloseIcon.hide();

			if(this.hiddenUnlessNewUpdates) {
				if(!this.sectionsHaveNewStuff()) $(this.barContainers).hide('fast');
			}
		};

		//-----------------------------------------------------------------------------
		this.userClosedActivePopup = function() {
			var hTidbit = this.getPoppedTidbit();
			if(hTidbit && hTidbit.section.killTidbitOutline) {
				hTidbit.section.killTidbitOutline(hTidbit);
			}

			this.hideAndUnselectPop();
		};

		//-----------------------------------------------------------------------------
		this.userClosedMyPopup = function(tidbitOrSection) {
			if(this.poppedSectionType() == tidbitOrSection.getSectionType()) {
				this.userClosedActivePopup();
			}
		};

		//-----------------------------------------------------------------------------
		// If the pop container was showing a tidbit that no longer exists, close it.
		this.closePopIfTidbitDeleted = function() {
			if(this.getPopIsVisible() && !this.getIsShowingPoppedList() && !this.getPoppedTidbit()) {
				this.hideAndUnselectPop();
			}
		};

		//-----------------------------------------------------------------------------
		// Get the section of an element that is a child of the sections section_container element
		// This should include all elements associated with this section, unless the elements were
		// placed inside of the popDiv (in which case, we use getSectionOfPopdivEl)
		this.getSectionOfContainerEl = function(el) {
			relativeEl = $($(el).parents("div[class*='section_container']").get(0));

			myTypeName = relativeEl.attr('id');
			myTypeName = myTypeName.slice(0, myTypeName.indexOf('_container'));

			return this.getSectionFromName(myTypeName);
		};

		//-----------------------------------------------------------------------------
		// Return the tidbit corresponding to the popped container
		this.getPoppedTidbit = function() {
			var foundTidbit = null;
			var activeSection = null;
			var popTitle = this.popContainer.attr('lang');
			if(activeSection = this.getSectionFromName(this.poppedSectionType())) {
				for(var i=0;i<activeSection.tidbits.length;i++) {
					if(activeSection.tidbits[i].getIconId() == popTitle) {
						foundTidbit = activeSection.tidbits[i];
						break;
					}
				}
			}
			return foundTidbit;
		};

		//-----------------------------------------------------------------------------
		// Returns true if the popper is showing a section's tidbit list
		this.getIsShowingPoppedList = function() {
			var result = false;
			if(this.getPopIsVisible()) {
				var popTitle = this.popContainer.attr('lang');
				if(popTitle && popTitle.indexOf('section_') == 0) {
					result = true;
				}
			}
			return result;
		};

		//-----------------------------------------------------------------------------
		// Get the section corresponding to an element that is within a popped window
		this.getSectionOfPopdivEl = function(el) {
			relativeEl = $($(el).parents("ul[id*='_links']").get(0));
			myTypeName = relativeEl.attr('id');
			myTypeName = myTypeName.slice(0, myTypeName.indexOf('_links'));

			return this.getSectionFromName(myTypeName);
		};

		//-----------------------------------------------------------------------------
		// Take a name, return an element from our sections array, where the name passed in
		// matches the name of the section.
		// Note:  this is a function because it used to be more complicated.
		this.getSectionFromName = function(name) {
			return this.sections[name];
		};

		//-----------------------------------------------------------------------------
		this.poppedSectionType = function() {
			var result = null;
			if(this.getPopIsVisible()) {
				popTitle = this.popContainer.attr('lang');
				if(popTitle.indexOf('tidbit_') == 0) {
					// Assumption: format of tidbit title is "tidbit_sectionname_tidbitid"
					popTitle = popTitle.slice("tidbit_".length, popTitle.length);
					result = popTitle.slice(0, popTitle.indexOf('_'));
				}
				else {
					result = popTitle.slice(popTitle.indexOf("_")+1, popTitle.length);
				}
			}
			return result;
		};

		//-----------------------------------------------------------------------------
		// Make the sweetbar sized to our browser window
		this.resizeContainer = function() {
			this.myWidth = (this.isShowingMinimized() ? 210 : Math.max($(document).width(), 950));
			$('#sb_outer_container').css('width', this.myWidth);
			$('#sb_top_border').css('width', $('#sb_outer_container').width()-30+2);
			$('#sb_inner_container').css('width', $('#sb_outer_container').width()-30);
			$('#sb_color_container').css('width', $('#sb_outer_container').width()-30+1);

		};

		//-----------------------------------------------------------------------------
		this.isShowingMinimized = function() {
			return (get_json_subcookie('swtbr','shst') == SB_SHOW_STATE_MINIMIZED);
		};

		//-----------------------------------------------------------------------------
		this.updateHiddenUnlessNewUpdates = function() {
			this.hiddenUnlessNewUpdates = get_json_subcookie('swtbr','hidxcpt');

			if(this.hiddenUnlessNewUpdates && !this.sectionsHaveNewStuff()) {
				$(this.barContainers).hide();
			}
			else {
				$(this.barContainers).show();
			}
		};

		//-----------------------------------------------------------------------------
		// Returns true if any section has outlined content
		this.sectionsHaveNewStuff = function() {
			var sectionsHaveNewStuff = false;
			for(var i=0;i<this.sectionList.length;i++) {
				var sectionName = this.sectionList[i].name;
				if(this.sections[sectionName] && this.sections[sectionName].getHasOutlinedTidbits()) {
					sectionsHaveNewStuff = true;
					break;
				}
			}

			return sectionsHaveNewStuff;
		};

		//-----------------------------------------------------------------------------
		this.window_blur = function(windowIsBlurred) {
			this.blurred = windowIsBlurred;

			if(!this.blurred && this.page_title) {
				document.title = this.page_title;
				this.page_title = null;
			}
		};

		// Call the section initializer
		var self = this;
		if(get_json_subcookie('swtbr','shst') != SB_SHOW_STATE_HIDDEN && this.settings.enable) { // Unless it's hidden, initialize it
			this.hiddenUnlessNewUpdates = get_json_subcookie('swtbr','hidxcpt');
			this.initializeSelf();
			this.initializeSections(allParams);

			// Start update timer
			this.startUpdates();			
		}

		return self;
	};

})(jQuery);



/* Possible types:
  community
  friend
  history
  notification
  question
 */

(function($) {
	sbSectionBarOption = function(options) {
		//-----------------------------------------------------------------------------
		this.createMyIcon = function() {
			this.icon = $('<img id="' + this.getSectionIconId() + '" class="section_icon" src="' + this.manager.settings.baseImagePath + '/sweet_bar/bar_option.png">').appendTo(this.container);
			this.icon.click(function() { self.manager.clickSectionIcon(this); });
			this.showState = 2; //SB_SHOW_STATE_EXPANDED;
		};

		//-----------------------------------------------------------------------------
		this.postInitializeCallback = function() {
			this.fullyLoaded = true;
		};

		//-----------------------------------------------------------------------------
		// Return what should be shown by this sweetBarSection when the sweetBarSection icon is clicked on
		this.createPopListContents = function() {
			var list = $('<ul id="bar_option_links">');

			// AHHH yes... *this* was why C++ was a grotesque non-DRY language that I hate...
			var configureLink = $('<li><a id="sb_configure" href="/switchboard/configure_settings">Customize Switchboard</a></li>');
			list.append(configureLink);

			var hideExceptNewLink = $('<li><a id="sb_configure" href="javascript:void(0)">Hide Switchboard except when new messages received</a></li>');
			list.append(hideExceptNewLink);
			hideExceptNewLink.click(function() { self.hideExceptNew(); });

			//resizeLink = $('<a id="sb_resize" href="#">').html('Resize expanded sections');
			//list.append($('<li>').html(resizeLink));
			//resizeLink.click(function() {	self.manager.requestExpand(this);	});

			var helpLink = $('<li><a id="sb_help" href="/site_help/general/switchboard">Help</a></li>');
			list.append(helpLink);
			helpLink.click(function() {	self.manager.requestExpand(this);	});

			return list;
		};

		//-----------------------------------------------------------------------------
		this.hideExceptNew = function() {
			set_json_subcookie('swtbr','hidxcpt',true);
			this.manager.userClosedActivePopup();
			this.manager.saveAllCookiesToDb();
			this.manager.updateHiddenUnlessNewUpdates();
		};

		//-----------------------------------------------------------------------------
		this.getTidbitContent = function(tidbit) {
			
		};

		var self = this;
	};
})(jQuery);

/* Possible types:
  community
  friend
  history
  notification
  question
 */

(function($) {
	sbSectionCommunity = function(options) {
		this.insertContentContainer = null;
		this.currentUserPic = options.currentUserPic || null;
		this.truncateContent = true;
		this.notRepliable = false;

		//-----------------------------------------------------------------------------
		this.createMyIcon = function() {
			this.icon = $('<img id="' + this.getSectionIconId() + '" src="' + this.manager.settings.baseImagePath + '/sweet_bar/comments.png" class="section_icon">').appendTo(this.container);
			this.icon.click(function() { self.manager.clickSectionIcon(this); });
		};

		//-----------------------------------------------------------------------------
		this.postInitializeCallback = function() {
		};

		//-----------------------------------------------------------------------------
		// Return what should be shown by this sweetBarSection when the sweetBarSection icon is clicked on
		this.createPopListContents = function() {
			var list = $('<ul id="community_links">');
			for(var i=this.tidbits.length;i>0;i--) {
				var tidbit = this.tidbits[i-1];
				var date = new Date(tidbit.dateStamp);
				var newImg = (tidbit.outlined ? tidbit.getNewTidbitIcon() : '');
				var lineText = "Conversation with " + tidbit.from + ": " + this.getBriefText(tidbit) + "&nbsp;";
				var liEl = $('<li>').html(newImg + lineText).appendTo(list);
				var clickEl = $("<a id='" + tidbit.getPopListLinkId() + "' href='javascript:void(0)'>View</a>").appendTo(liEl);
				clickEl.click(function(){ self.manager.clickTidbitInPoplist(self, this) });
			}
			if(this.tidbits.length == 0) {
				$("<span class='none_found'>No quick texts found</span>").appendTo(list);
			}
			this.appendStandards(list);
			
			return list;
		};

		//-----------------------------------------------------------------------------
		this.getCookieKnowsEnoughToLoad = function(tidbit) {
			// Can only be fully loaded via AJAX, since it might have parent messages we need to load (and not enough space to
			// save that detail in cookie)
			return false;
		};

		//-----------------------------------------------------------------------------
		// This attempts to get what should be the contents for a given tidbit.  It may do any of the following:
		// 1) Make an AJAX call to go grab the content, with a callback to populate content when the call completes.  In this case, it will just return "Please wait..." text
		// 2) If we can ascertain that the tidbit is already popped up onscreen (by the presence of its unique container), then we'll just modify
		//    HTML within the container that this updated tidbit might have changed.
		// 3) If the tidbit hasn't yet been created, we create it and return its HTML.
		this.getTidbitSpecificContent = function(tidbit) {
			if(!tidbit.isFullyLoaded() && this.popUsesAjax()) {
				return this.ajaxPopResult();
			}
			else {
				var returnedContent = null;
				if($('#' + tidbit.getContainerId()).get(0) && self.manager.getPopIsVisible()) { // Looks like it is already created and hanging out onscreen.
					// Change as little as possible, so we don't interfere with potential forms/inputs that the user may have invoked since this
					// tidbit was initially rendered and displayed. 
					var myContainer = $('#' + tidbit.getContainerId());
					myContainer.find('#tidbit_inner_content').html(this.renderContentArray(tidbit));
					myContainer.find('#response_message').html('');
					returnedContent = null;
				} else { // It hasn't been created, so create it:
					var content =	"<div id='" + tidbit.getContainerId() + "' class='community_tidbit tidbit_container'>";
					content += "<div id='tidbit_inner_content'>";
					content += this.renderContentArray(tidbit);
					content += "</div>";

					content += "<div class='response_options' id='qt_response_options_" + tidbit.id + "'>";

					if(!this.notRepliable) {
						content += 	"  <a class='reply_link' href='javascript:void(0)'>Reply</a> | ";
					}

					content += "  <a class='delete_link' href='javascript:void(0)'>Delete</a> | " +
							"<a class='more_text_link' href='javascript:void(0)'>More options</a> " +
							"</div>" +
							"<div class='more_link_options'>" +
							"  <a class='close_text_link' href='javascript:void(0)'>Close this message</a> | " +
							"  <a class='mark_spam_link' href='javascript:void(0)'>Mark as spam</a>" +															
							"</div>" +
							"<div class='inserted_content'></div>" +
						"</div>"; // <!-- community_tidbit -->

					returnedContent = $(content);
					returnedContent.find('.response_options').show(); // Ensure this is shown if it was hidden after a reply/delete click and then the box got closed
					returnedContent.find('.reply_link').click(function() { self.clickReply(this); $(this).parent().hide(); });
					returnedContent.find('.delete_link').click(function() { self.clickDelete(this); $(this).parent().hide(); });
					returnedContent.find('.more_text_link').click(function() { $(this).parent().siblings('.more_link_options').show() });
					returnedContent.find('.close_text_link').click(function() { self.manager.userClosedActivePopup(); });
					returnedContent.find('.mark_spam_link').click(function() { if(confirm("Are you sure you want to mark this as spam?  This should only be used if you receive a quick text message that is particularly promotional or otherwise undesired.")) { self.clickSpam(this); $(this).parent().html('Message marked as spam.  Thanks for reporting.  You may now delete this quick text message.'); } });
				}

				return returnedContent;
			}
		};

		//-----------------------------------------------------------------------------
		this.renderContentArray = function(tidbit) {
			var tidbitMessages = tidbit.content;
			var renderContainer = '';
			for(var i=0;i<tidbitMessages.length;i++) {
				var thisMessage = tidbitMessages[i];
				if(thisMessage.nr) this.notRepliable = true;

				renderContainer +=
					"<div class='replied_to_message'>" +
					"  <a href='/users/profile/" + thisMessage.from + "'><img class='stock' style='float:left' src='" + thisMessage.pic + "'></a>" +
					"  <p class='tidbit_comment'><span class='tidbit_preface'><a href='/users/profile/" + thisMessage.from + "'>" + thisMessage.from + "</a> said:</span><br>" +
					"  <span id='tidbit_inner_content'>" + thisMessage.msg + "</span></p>" +
					"</div>";
			}
			return renderContainer;
		};

		//-----------------------------------------------------------------------------
		this.getTidbitIconHoverText = function(tidbit) {
			var pstDate = " on some past date";
			if(tidbit.dateStamp) {
				pstDate = new Date(tidbit.dateStamp*1000);
				pstDate = " on " + pstDate.toLocaleDateString() + " at " + pstDate.toLocaleTimeString();
			}
			return "Quick text from "+ tidbit.from + pstDate;
		};

		//-----------------------------------------------------------------------------
		// Called during serialization to translate this tidbits essence into something we can store in a cookie
		this.getBriefText = function(tidbit) {
			var briefText = "Conversation with " + tidbit.from;

			var mostRecentMessageObject = tidbit.content[tidbit.content.length-1];
			if(mostRecentMessageObject) {
				briefText = mostRecentMessageObject.msg.substr(0, 35) + (mostRecentMessageObject.msg.length > 35 ? "..." : "");
			}

			return briefText;
		};

		//-----------------------------------------------------------------------------
		this.clickDelete = function(clickedEl) {
			var tidbitObject = this.getTidbitFromChildEl(clickedEl);
			this.deleteTidbit(tidbitObject);
			jQuery.ajax({type: "POST", dataType: "json", cache: false, url: '/user_pop_texts/mark_as',
				data: { id: tidbitObject.id, mark: 'receiver_deleted' },
				complete: function(json) {
					//self.manager.userClosedMyPopup(self);
				}
			});
		};

		//-----------------------------------------------------------------------------
		this.clickSpam = function(clickedEl) {
			var tidbitObject = this.getTidbitFromChildEl(clickedEl);
			this.markTidbitOnServer(tidbitObject, 'spam');
		};

		//-----------------------------------------------------------------------------
		this.clickReply = function(el) {
			var tidbit = this.getTidbitFromChildEl(el);
			this.insertContentContainer = $('#' + tidbit.getContainerId() + ' .inserted_content');
			var lastQt = tidbit.content[tidbit.content.length-1];

			var content = "<form id='quick_text_form' onsubmit='return false;'>" +
				"<table><tr><td><img style='float:left' class='stock' src='" + this.currentUserPic + "'></td>" +
				"<td><p class='tidbit_comment'><span class='tidbit_preface'>You respond:<span></p>" +
				"<textarea class='quick_text_content' /></td></tr></table>" +
				"<input type='hidden' class='quick_reply_to_message_id' value='" + lastQt.id + "'/>" +
				"<input class='button26 sendButton' onclick=\"$j('#qt_response_" + tidbit.id +"').show();\" value='Send' type='submit' /> " +
				"<img src='" + this.getImageBasePath() + "/spinner.gif' id='qt_response_" + tidbit.id + "' class='hiddenSpinner' style='float:right' />" +
				"<a class='close_link' href='javascript:void(0)' onclick='jQuery(this).parents(\".inserted_content\").empty(); jQuery(\"#qt_response_options_" + tidbit.id + "\").show();'>Close</a>" +
			"</form>"

			var createdContent = $(content).appendTo(this.insertContentContainer);
			$('.quick_text_content').focus();

			$('#sb_outer_container #quick_text_form .sendButton').click(function() {
				jQuery.ajax({type: "POST", dataType: "JSON", cache: false, url: '/user_pop_texts/post_quick_text',
					data: { reply_message_id: $('#sb_outer_container #quick_text_form .quick_reply_to_message_id').val(), content: $('#sb_outer_container #quick_text_form .quick_text_content').val() },
					complete: function(json) {
						self.insertContentContainer.html("<span id='response_message'>Message responded to!</span>");
						self.manager.userClosedMyPopup(self);
					}, success: function() {
					}
				});
			});
		};

		//-----------------------------------------------------------------------------
		// To be overridden if desired, for example, if tidbit needs to be marked as read.
		this.tidbitWasClicked = function(tidbit) {
		};

		//-----------------------------------------------------------------------------
		this.popUsesAjax = function() {
			return true;
		};

		//-----------------------------------------------------------------------------
		// If user invoked this tidbit to be closed, then we know they've read it.  So mark it as read if it's
		// still outlined at this point.
		this.killTidbitOutline = function(tidbit) {
			if(tidbit.outlined) {
				tidbit.killOutline(true);
			}
		};

		var self = this;
	};
})(jQuery);

/* Possible types:
  community
  friend
  history
  notification
  question
 */

(function($) {
	sbSectionHistory = function(options) {
		this.truncateContent = false;

		//-----------------------------------------------------------------------------
		// 
		this.createMyIcon = function() {
			this.icon = $('<img id="' + this.getSectionIconId() + '" src="' + this.manager.settings.baseImagePath + '/sweet_bar/history.png" class="section_icon">').appendTo(this.container);
			this.icon.click(function() { self.manager.clickSectionIcon(this); });
		};

		//-----------------------------------------------------------------------------
		this.postInitializeCallback = function() {
		};

		//-----------------------------------------------------------------------------
		// Return what should be shown by this sweetBarSection when the sweetBarSection icon is clicked on
		this.createPopListContents = function() {
			var list = $('<ul id="history_links">');
			for(var i=this.tidbits.length;i>0;i--) {
				var thisTid = this.tidbits[i-1];

				list.append($('<li>').html("<a href='/booths/" + thisTid.boothId + "/items/" + thisTid.itemId + "'>" + thisTid.content + "</a>"));
			}
			if(this.tidbits.length == 0) {
				$("<span class='none_found'>No previously visited items found</span>").appendTo(list);
			}

			this.appendStandards(list);

			return list;
		};

		//-----------------------------------------------------------------------------
		this.getAjaxLoadParams = function() {
			var additionalParams = "item_ids=";
			for(var i=0;i<this.tidbits.length;i++) {
				additionalParams += this.tidbits[i].id + ","
			}
			return additionalParams;
		};

		//-----------------------------------------------------------------------------
		this.getCookieKnowsEnoughToLoad = function(tidbit) {
			return false;
		};

		//-----------------------------------------------------------------------------
		this.getTidbitSpecificContent = function(tidbit) {
			if(!tidbit.isFullyLoaded() && this.popUsesAjax()) {
				return this.ajaxPopResult();
			}
			else {
				var content =	"<div id='" + tidbit.getContainerId() + "' class='history_tidbit tidbit_container'>" +
					"  <img class='item_history_image_icon' src='" + tidbit.pic + "'>" +
					"  <a class='title_link' href='/booths/" + tidbit.boothId + "/items/" + tidbit.itemId + "'>" + tidbit.content + "</a><br> " +
					"  Sold by <a class='seller_link' href='/users/profile/" + tidbit.boothId + "'>" + tidbit.from + "</a><br> " +
					"  <a class='remove_link' href='javascript:void(0)'>Remove from history</a>" +
					"</div>";

				var newContent = $(content);
				$(newContent).children('.remove_link').click(function() { self.clickDelete(this) });
				return newContent;
			}
		};

		//-----------------------------------------------------------------------------
		this.clickDelete = function(clickedEl) {
			var clickedTidbit = this.getTidbitFromChildEl(clickedEl);
			this.deleteTidbit(clickedTidbit);
		};

		//-----------------------------------------------------------------------------
		this.getTidbitIconHoverText = function(tidbit) {
			var pstDate = " on some past date";
			if(tidbit.dateStamp) {
				pstDate = new Date(tidbit.dateStamp*1000);
				pstDate = " on " + pstDate.toLocaleDateString() + " at " + pstDate.toLocaleTimeString();
			}
			return "Item visited" + pstDate;
		};

		//-----------------------------------------------------------------------------
		// To be overridden if desired, for example, if tidbit needs to be marked as read.
		this.tidbitWasClicked = function(tidbit) {
		};

		//-----------------------------------------------------------------------------
		this.popUsesAjax = function() {
			return true;
		};

		var self = this;
	};
})(jQuery);

/* 
 */

(function($) {
	sbSectionRoundtable = function(options) {
		this.insertContentContainer = null;
		this.truncateContent = true;

		//-----------------------------------------------------------------------------
		this.createMyIcon = function() {
			this.icon = $('<img id="' + this.getSectionIconId() + '" src="' + this.manager.settings.baseImagePath + '/sweet_bar/female_user_help.png" class="section_icon">').appendTo(this.container);
			this.icon.click(function() { self.manager.clickSectionIcon(this); });
		};

		//-----------------------------------------------------------------------------
		this.postInitializeCallback = function() {
		};

		//-----------------------------------------------------------------------------
		// Return what should be shown by this sweetBarSection when the sweetBarSection icon is clicked on
		this.createPopListContents = function() {
			var list = $('<ul id="roundtables_links">');
			for(var i=this.tidbits.length;i>0;i--) {
				var tidbit = this.tidbits[i-1];
				var newImg = (tidbit.outlined ? tidbit.getNewTidbitIcon() : '');
				var liEl = $('<li>').html(newImg + tidbit.from + " wonders: " + this.getBriefText(tidbit) + ' ').appendTo(list);
				var clickEl = $("<a id='" + tidbit.getPopListLinkId() + "' href='javascript:void(0)'>View</a>").appendTo(liEl);
				clickEl.click(function(){ self.manager.clickTidbitInPoplist(self, this) });
			}
			if(this.tidbits.length == 0) {
				$("<span class='none_found'>No recent questions found</span>").appendTo(list);
			}

			this.appendStandards(list);
			
			return list;
		};

		//-----------------------------------------------------------------------------
		this.getCookieKnowsEnoughToLoad = function(tidbit) {
			// Can only be fully loaded via AJAX, since it might have parent messages we need to load (and not enough space to
			// save that detail in cookie)
			return false;
		};

		//-----------------------------------------------------------------------------
		// This attempts to get what should be the contents for a given tidbit.  It may do any of the following:
		// 1) Make an AJAX call to go grab the content, with a callback to populate content when the call completes.  In this case, it will just return "Please wait..." text
		// 2) If we can ascertain that the tidbit is already popped up onscreen (by the presence of its unique container), then we'll just modify
		//    HTML within the container that this updated tidbit might have changed.
		// 3) If the tidbit hasn't yet been created, we create it and return its HTML.
		this.getTidbitSpecificContent = function(tidbit) {
			if(!tidbit.isFullyLoaded() && this.popUsesAjax()) {
				return this.ajaxPopResult();
			}
			else {
				var content =	"<div id='" + tidbit.getContainerId() + "' class='roundtables_tidbit tidbit_container'>";
				content += "<div id='tidbit_inner_content'>" +
   								 "  <div class='replied_to_message'>" +
									 "    <img class='stock' style='float:left' src='" + tidbit.pic + "'>" +
									 "    <p class='tidbit_comment'><span class='tidbit_preface'>" + tidbit.from + " wonders:</span><br>" +
									 "    <span id='tidbit_inner_content'>" + tidbit.content + "</span></p>" +
									 "  </div>" +
				           "</div>";

				content +=
						"<a class='view_link' href='/roundtable_questions/" + tidbit.id + "'>View and respond</a> " +
						"<div class='inserted_content'></div>" +
					"</div>"; // <!-- roundtable_tidbit -->

				returnedContent = $(content);
				
				return returnedContent;
			}
		};

		//-----------------------------------------------------------------------------
		this.getTidbitIconHoverText = function(tidbit) {
			var pstDate = " on some past date";
			if(tidbit.dateStamp) {
				pstDate = new Date(tidbit.dateStamp*1000);
				pstDate = " on " + pstDate.toLocaleDateString() + " at " + pstDate.toLocaleTimeString();
			}
			return "Roundtable question from "+ tidbit.from + pstDate;
		};

		//-----------------------------------------------------------------------------
		// Called during serialization to translate this tidbits essence into something we can store in a cookie
		this.getBriefText = function(tidbit) {
			return tidbit.content.substr(0, 40) + (tidbit.content.length > 40 ? "..." : '');
		};

		//-----------------------------------------------------------------------------
		// To be overridden if desired, for example, if tidbit needs to be marked as read.
		this.tidbitWasClicked = function(tidbit) {			
		};

		//-----------------------------------------------------------------------------
		this.popUsesAjax = function() {
			return true;
		};

		var self = this;
	};
})(jQuery);

/* 
 */

(function($) {
	sbSectionNotification = function(options) {
		this.insertContentContainer = null;
		this.truncateContent = true;

		//-----------------------------------------------------------------------------
		this.createMyIcon = function() {
			this.icon = $('<img id="' + this.getSectionIconId() + '" src="' + this.manager.settings.baseImagePath + '/sweet_bar/notifications.png" class="section_icon">').appendTo(this.container);
			this.icon.click(function() { self.manager.clickSectionIcon(this); });
		};

		//-----------------------------------------------------------------------------
		this.postInitializeCallback = function() {
		};

		//-----------------------------------------------------------------------------
		// Return what should be shown by this sweetBarSection when the sweetBarSection icon is clicked on
		this.createPopListContents = function() {
			var list = $('<ul id="notification_links">');
			for(var i=this.tidbits.length;i>0;i--) {
				var tidbit = this.tidbits[i-1];
				var newImg = (tidbit.outlined ? tidbit.getNewTidbitIcon() : '');
				var briefText = this.getBriefText(tidbit) + ' ';
				var liEl = $('<li>').html(newImg + briefText).appendTo(list);
				var clickEl = $("<a id='" + tidbit.getPopListLinkId() + "' href='javascript:void(0)'>More details</a>").appendTo(liEl);
				clickEl.click(function(){ self.manager.clickTidbitInPoplist(self, this) });
			}
			if(this.tidbits.length == 0) {
				$("<span class='none_found'>No recent notifications found</span>").appendTo(list);
			}

			this.appendStandards(list);
			
			return list;
		};

		//-----------------------------------------------------------------------------
		this.getCookieKnowsEnoughToLoad = function(tidbit) {
			// Can only be fully loaded via AJAX, since it might have parent messages we need to load (and not enough space to
			// save that detail in cookie)
			return false;
		};

		//-----------------------------------------------------------------------------
		// This attempts to get what should be the contents for a given tidbit.  It may do any of the following:
		// 1) Make an AJAX call to go grab the content, with a callback to populate content when the call completes.  In this case, it will just return "Please wait..." text
		// 2) If we can ascertain that the tidbit is already popped up onscreen (by the presence of its unique container), then we'll just modify
		//    HTML within the container that this updated tidbit might have changed.
		// 3) If the tidbit hasn't yet been created, we create it and return its HTML.
		this.getTidbitSpecificContent = function(tidbit) {
			if(!tidbit.isFullyLoaded() && this.popUsesAjax()) {
				return this.ajaxPopResult();
			}
			else {
				var content =	"<div id='" + tidbit.getContainerId() + "' class='notification_tidbit tidbit_container'>";
				content += "<div id='tidbit_inner_content'>" +
   								 "  <div class='replied_to_message'>" +
									 "    <a href='" + tidbit.link + "'><img class='stock' style='float:left' src='" + tidbit.pic + "'></a>" +
									 "    <p class='tidbit_comment'><span class='tidbit_preface'>From " + tidbit.from + ":</span><br>" +
									 "    <span id='tidbit_inner_content'>" + tidbit.content + "</span></p>" +
									 "  </div>" +
				           "</div>";

				content +=
						"<a class='view_link' href='" + tidbit.link + "'>" + tidbit.linkText + "</a> " +
						" or <a class='delete_link' href='javascript:void(0)'>delete this notification</a>" +
						"<div class='inserted_content'></div>" +
					"</div>"; // <!-- inquisitive_tidbit -->

				var returnedContent = $(content);
				$(returnedContent).children('.delete_link').click(function() { self.clickDelete(this) });
				
				return returnedContent;
			}
		};

		//-----------------------------------------------------------------------------
		this.clickDelete = function(clickedEl) {
			var clickedTidbit = this.getTidbitFromChildEl(clickedEl);
			this.deleteTidbit(clickedTidbit);
		};	

		//-----------------------------------------------------------------------------
		this.getTidbitIconHoverText = function(tidbit) {
			var pstDate = " on some past date";
			if(tidbit.dateStamp) {
				pstDate = new Date(tidbit.dateStamp*1000);
				pstDate = " on " + pstDate.toLocaleDateString() + " at " + pstDate.toLocaleTimeString();
			}
			return "Notification from "+ tidbit.from + pstDate;
		};

		//-----------------------------------------------------------------------------
		// Called during serialization to translate this tidbits essence into something we can store in a cookie
		this.getBriefText = function(tidbit) {
			if(!tidbit || !tidbit.content) return '[Event has ended]';
			return tidbit.content.substr(0, 35) + (tidbit.content.length > 35 ? "..." : "");
		};

		//-----------------------------------------------------------------------------
		// To be overridden if desired, for example, if tidbit needs to be marked as read.
		this.tidbitWasClicked = function(tidbit) {			
		};

		//-----------------------------------------------------------------------------
		this.popUsesAjax = function() {
			return true;
		};

		var self = this;
	};
})(jQuery);

/*
 * jQuery UI 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI
 */
jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7.2",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/*
 * jQuery UI Draggable 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Draggables
 *
 * Depends:
 *	ui.core.js
 */
(function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode){return false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(b,c,d){d=d||this._uiHash();a.ui.plugin.call(this,b,[c,d]);if(b=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(b){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,offset:this.positionAbs}}}));a.extend(a.ui.draggable,{version:"1.7.2",eventPrefix:"drag",defaults:{addClasses:true,appendTo:"parent",axis:false,cancel:":input,option",connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false}});a.ui.plugin.add("draggable","connectToSortable",{start:function(c,e){var d=a(this).data("draggable"),f=d.options,b=a.extend({},e,{item:d.element});d.sortables=[];a(f.connectToSortable).each(function(){var g=a.data(this,"sortable");if(g&&!g.options.disabled){d.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",c,b)}})},stop:function(c,e){var d=a(this).data("draggable"),b=a.extend({},e,{item:d.element});a.each(d.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;d.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(c);this.instance.options.helper=this.instance.options._helper;if(d.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",c,b)}})},drag:function(c,f){var e=a(this).data("draggable"),b=this;var d=function(i){var n=this.offset.click.top,m=this.offset.click.left;var g=this.positionAbs.top,k=this.positionAbs.left;var j=i.height,l=i.width;var p=i.top,h=i.left;return a.ui.isOver(g+n,k+m,p,h,j,l)};a.each(e.sortables,function(g){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(b).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return f.helper[0]};c.target=this.instance.currentItem[0];this.instance._mouseCapture(c,true);this.instance._mouseStart(c,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;e._trigger("toSortable",c);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}if(this.instance.currentItem){this.instance._mouseDrag(c)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",c,this.instance._uiHash(this.instance));this.instance._mouseStop(c,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}e._trigger("fromSortable",c);e.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(c,d){var b=a("body"),e=a(this).data("draggable").options;if(b.css("cursor")){e._cursor=b.css("cursor")}b.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._cursor){a("body").css("cursor",d._cursor)}}});a.ui.plugin.add("draggable","iframeFix",{start:function(b,c){var d=a(this).data("draggable").options;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop+f.scrollSpeed}else{if(d.pageY-c.overflowOffset.top<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop-f.scrollSpeed}}}if(!f.axis||f.axis!="y"){if((c.overflowOffset.left+c.scrollParent[0].offsetWidth)-d.pageX<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft+f.scrollSpeed}else{if(d.pageX-c.overflowOffset.left<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft-f.scrollSpeed}}}}else{if(!f.axis||f.axis!="x"){if(d.pageY-a(document).scrollTop()<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-f.scrollSpeed)}else{if(a(window).height()-(d.pageY-a(document).scrollTop())<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+f.scrollSpeed)}}}if(!f.axis||f.axis!="y"){if(d.pageX-a(document).scrollLeft()<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-f.scrollSpeed)}else{if(a(window).width()-(d.pageX-a(document).scrollLeft())<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+f.scrollSpeed)}}}}if(b!==false&&a.ui.ddmanager&&!f.dropBehaviour){a.ui.ddmanager.prepareOffsets(c,d)}}});a.ui.plugin.add("draggable","snap",{start:function(c,d){var b=a(this).data("draggable"),e=b.options;b.snapElements=[];a(e.snap.constructor!=String?(e.snap.items||":data(draggable)"):e.snap).each(function(){var g=a(this);var f=g.offset();if(this!=b.element[0]){b.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(b,c){var e=a(this).data("draggable").options;var d=a.makeArray(a(e.stack.group)).sort(function(g,f){return(parseInt(a(g).css("zIndex"),10)||e.stack.min)-(parseInt(a(f).css("zIndex"),10)||e.stack.min)});a(d).each(function(f){this.style.zIndex=e.stack.min+f});this[0].style.zIndex=e.stack.min+d.length}});a.ui.plugin.add("draggable","zIndex",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("zIndex")){e._zIndex=b.css("zIndex")}b.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._zIndex){a(c.helper).css("zIndex",d._zIndex)}}})})(jQuery);;/*
 * jQuery UI Droppable 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Droppables
 *
 * Depends:
 *	ui.core.js
 *	ui.draggable.js
 */
(function(a){a.widget("ui.droppable",{_init:function(){var c=this.options,b=c.accept;this.isover=0;this.isout=1;this.options.accept=this.options.accept&&a.isFunction(this.options.accept)?this.options.accept:function(e){return e.is(b)};this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight};a.ui.ddmanager.droppables[this.options.scope]=a.ui.ddmanager.droppables[this.options.scope]||[];a.ui.ddmanager.droppables[this.options.scope].push(this);(this.options.addClasses&&this.element.addClass("ui-droppable"))},destroy:function(){var b=a.ui.ddmanager.droppables[this.options.scope];for(var c=0;c<b.length;c++){if(b[c]==this){b.splice(c,1)}}this.element.removeClass("ui-droppable ui-droppable-disabled").removeData("droppable").unbind(".droppable")},_setData:function(b,c){if(b=="accept"){this.options.accept=c&&a.isFunction(c)?c:function(e){return e.is(c)}}else{a.widget.prototype._setData.apply(this,arguments)}},_activate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.addClass(this.options.activeClass)}(b&&this._trigger("activate",c,this.ui(b)))},_deactivate:function(c){var b=a.ui.ddmanager.current;if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}(b&&this._trigger("deactivate",c,this.ui(b)))},_over:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.addClass(this.options.hoverClass)}this._trigger("over",c,this.ui(b))}},_out:function(c){var b=a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("out",c,this.ui(b))}},_drop:function(c,d){var b=d||a.ui.ddmanager.current;if(!b||(b.currentItem||b.element)[0]==this.element[0]){return false}var e=false;this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var f=a.data(this,"droppable");if(f.options.greedy&&a.ui.intersect(b,a.extend(f,{offset:f.element.offset()}),f.options.tolerance)){e=true;return false}});if(e){return false}if(this.options.accept.call(this.element[0],(b.currentItem||b.element))){if(this.options.activeClass){this.element.removeClass(this.options.activeClass)}if(this.options.hoverClass){this.element.removeClass(this.options.hoverClass)}this._trigger("drop",c,this.ui(b));return this.element}return false},ui:function(b){return{draggable:(b.currentItem||b.element),helper:b.helper,position:b.position,absolutePosition:b.positionAbs,offset:b.positionAbs}}});a.extend(a.ui.droppable,{version:"1.7.2",eventPrefix:"drop",defaults:{accept:"*",activeClass:false,addClasses:true,greedy:false,hoverClass:false,scope:"default",tolerance:"intersect"}});a.ui.intersect=function(q,j,o){if(!j.offset){return false}var e=(q.positionAbs||q.position.absolute).left,d=e+q.helperProportions.width,n=(q.positionAbs||q.position.absolute).top,m=n+q.helperProportions.height;var g=j.offset.left,c=g+j.proportions.width,p=j.offset.top,k=p+j.proportions.height;switch(o){case"fit":return(g<e&&d<c&&p<n&&m<k);break;case"intersect":return(g<e+(q.helperProportions.width/2)&&d-(q.helperProportions.width/2)<c&&p<n+(q.helperProportions.height/2)&&m-(q.helperProportions.height/2)<k);break;case"pointer":var h=((q.positionAbs||q.position.absolute).left+(q.clickOffset||q.offset.click).left),i=((q.positionAbs||q.position.absolute).top+(q.clickOffset||q.offset.click).top),f=a.ui.isOver(i,h,p,g,j.proportions.height,j.proportions.width);return f;break;case"touch":return((n>=p&&n<=k)||(m>=p&&m<=k)||(n<p&&m>k))&&((e>=g&&e<=c)||(d>=g&&d<=c)||(e<g&&d>c));break;default:return false;break}};a.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(e,g){var b=a.ui.ddmanager.droppables[e.options.scope];var f=g?g.type:null;var h=(e.currentItem||e.element).find(":data(droppable)").andSelf();droppablesLoop:for(var d=0;d<b.length;d++){if(b[d].options.disabled||(e&&!b[d].options.accept.call(b[d].element[0],(e.currentItem||e.element)))){continue}for(var c=0;c<h.length;c++){if(h[c]==b[d].element[0]){b[d].proportions.height=0;continue droppablesLoop}}b[d].visible=b[d].element.css("display")!="none";if(!b[d].visible){continue}b[d].offset=b[d].element.offset();b[d].proportions={width:b[d].element[0].offsetWidth,height:b[d].element[0].offsetHeight};if(f=="mousedown"){b[d]._activate.call(b[d],g)}}},drop:function(b,c){var d=false;a.each(a.ui.ddmanager.droppables[b.options.scope],function(){if(!this.options){return}if(!this.options.disabled&&this.visible&&a.ui.intersect(b,this,this.options.tolerance)){d=this._drop.call(this,c)}if(!this.options.disabled&&this.visible&&this.options.accept.call(this.element[0],(b.currentItem||b.element))){this.isout=1;this.isover=0;this._deactivate.call(this,c)}});return d},drag:function(b,c){if(b.options.refreshPositions){a.ui.ddmanager.prepareOffsets(b,c)}a.each(a.ui.ddmanager.droppables[b.options.scope],function(){if(this.options.disabled||this.greedyChild||!this.visible){return}var e=a.ui.intersect(b,this,this.options.tolerance);var g=!e&&this.isover==1?"isout":(e&&this.isover==0?"isover":null);if(!g){return}var f;if(this.options.greedy){var d=this.element.parents(":data(droppable):eq(0)");if(d.length){f=a.data(d[0],"droppable");f.greedyChild=(g=="isover"?1:0)}}if(f&&g=="isover"){f.isover=0;f.isout=1;f._out.call(f,c)}this[g]=1;this[g=="isout"?"isover":"isout"]=0;this[g=="isover"?"_over":"_out"].call(this,c);if(f&&g=="isout"){f.isout=0;f.isover=1;f._over.call(f,c)}})}}})(jQuery);;/*
 * jQuery UI Effects 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/
 */
jQuery.effects||(function(d){d.effects={version:"1.7.2",save:function(g,h){for(var f=0;f<h.length;f++){if(h[f]!==null){g.data("ec.storage."+h[f],g[0].style[h[f]])}}},restore:function(g,h){for(var f=0;f<h.length;f++){if(h[f]!==null){g.css(h[f],g.data("ec.storage."+h[f]))}}},setMode:function(f,g){if(g=="toggle"){g=f.is(":hidden")?"show":"hide"}return g},getBaseline:function(g,h){var i,f;switch(g[0]){case"top":i=0;break;case"middle":i=0.5;break;case"bottom":i=1;break;default:i=g[0]/h.height}switch(g[1]){case"left":f=0;break;case"center":f=0.5;break;case"right":f=1;break;default:f=g[1]/h.width}return{x:f,y:i}},createWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent()}var g={width:f.outerWidth(true),height:f.outerHeight(true),"float":f.css("float")};f.wrap('<div class="ui-effects-wrapper" style="font-size:100%;background:transparent;border:none;margin:0;padding:0"></div>');var j=f.parent();if(f.css("position")=="static"){j.css({position:"relative"});f.css({position:"relative"})}else{var i=f.css("top");if(isNaN(parseInt(i,10))){i="auto"}var h=f.css("left");if(isNaN(parseInt(h,10))){h="auto"}j.css({position:f.css("position"),top:i,left:h,zIndex:f.css("z-index")}).show();f.css({position:"relative",top:0,left:0})}j.css(g);return j},removeWrapper:function(f){if(f.parent().is(".ui-effects-wrapper")){return f.parent().replaceWith(f)}return f},setTransition:function(g,i,f,h){h=h||{};d.each(i,function(k,j){unit=g.cssUnit(j);if(unit[0]>0){h[j]=unit[0]*f+unit[1]}});return h},animateClass:function(h,i,k,j){var f=(typeof k=="function"?k:(j?j:null));var g=(typeof k=="string"?k:null);return this.each(function(){var q={};var o=d(this);var p=o.attr("style")||"";if(typeof p=="object"){p=p.cssText}if(h.toggle){o.hasClass(h.toggle)?h.remove=h.toggle:h.add=h.toggle}var l=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.addClass(h.add)}if(h.remove){o.removeClass(h.remove)}var m=d.extend({},(document.defaultView?document.defaultView.getComputedStyle(this,null):this.currentStyle));if(h.add){o.removeClass(h.add)}if(h.remove){o.addClass(h.remove)}for(var r in m){if(typeof m[r]!="function"&&m[r]&&r.indexOf("Moz")==-1&&r.indexOf("length")==-1&&m[r]!=l[r]&&(r.match(/color/i)||(!r.match(/color/i)&&!isNaN(parseInt(m[r],10))))&&(l.position!="static"||(l.position=="static"&&!r.match(/left|top|bottom|right/)))){q[r]=m[r]}}o.animate(q,i,g,function(){if(typeof d(this).attr("style")=="object"){d(this).attr("style")["cssText"]="";d(this).attr("style")["cssText"]=p}else{d(this).attr("style",p)}if(h.add){d(this).addClass(h.add)}if(h.remove){d(this).removeClass(h.remove)}if(f){f.apply(this,arguments)}})})}};function c(g,f){var i=g[1]&&g[1].constructor==Object?g[1]:{};if(f){i.mode=f}var h=g[1]&&g[1].constructor!=Object?g[1]:(i.duration?i.duration:g[2]);h=d.fx.off?0:typeof h==="number"?h:d.fx.speeds[h]||d.fx.speeds._default;var j=i.callback||(d.isFunction(g[1])&&g[1])||(d.isFunction(g[2])&&g[2])||(d.isFunction(g[3])&&g[3]);return[g[0],i,h,j]}d.fn.extend({_show:d.fn.show,_hide:d.fn.hide,__toggle:d.fn.toggle,_addClass:d.fn.addClass,_removeClass:d.fn.removeClass,_toggleClass:d.fn.toggleClass,effect:function(g,f,h,i){return d.effects[g]?d.effects[g].call(this,{method:g,options:f||{},duration:h,callback:i}):null},show:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._show.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"show"))}},hide:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))){return this._hide.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"hide"))}},toggle:function(){if(!arguments[0]||(arguments[0].constructor==Number||(/(slow|normal|fast)/).test(arguments[0]))||(d.isFunction(arguments[0])||typeof arguments[0]=="boolean")){return this.__toggle.apply(this,arguments)}else{return this.effect.apply(this,c(arguments,"toggle"))}},addClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{add:g},f,i,h]):this._addClass(g)},removeClass:function(g,f,i,h){return f?d.effects.animateClass.apply(this,[{remove:g},f,i,h]):this._removeClass(g)},toggleClass:function(g,f,i,h){return((typeof f!=="boolean")&&f)?d.effects.animateClass.apply(this,[{toggle:g},f,i,h]):this._toggleClass(g,f)},morph:function(f,h,g,j,i){return d.effects.animateClass.apply(this,[{add:h,remove:f},g,j,i])},switchClass:function(){return this.morph.apply(this,arguments)},cssUnit:function(f){var g=this.css(f),h=[];d.each(["em","px","%","pt"],function(j,k){if(g.indexOf(k)>0){h=[parseFloat(g),k]}});return h}});d.each(["backgroundColor","borderBottomColor","borderLeftColor","borderRightColor","borderTopColor","color","outlineColor"],function(g,f){d.fx.step[f]=function(h){if(h.state==0){h.start=e(h.elem,f);h.end=b(h.end)}h.elem.style[f]="rgb("+[Math.max(Math.min(parseInt((h.pos*(h.end[0]-h.start[0]))+h.start[0],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[1]-h.start[1]))+h.start[1],10),255),0),Math.max(Math.min(parseInt((h.pos*(h.end[2]-h.start[2]))+h.start[2],10),255),0)].join(",")+")"}});function b(g){var f;if(g&&g.constructor==Array&&g.length==3){return g}if(f=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(g)){return[parseInt(f[1],10),parseInt(f[2],10),parseInt(f[3],10)]}if(f=/rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(g)){return[parseFloat(f[1])*2.55,parseFloat(f[2])*2.55,parseFloat(f[3])*2.55]}if(f=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(g)){return[parseInt(f[1],16),parseInt(f[2],16),parseInt(f[3],16)]}if(f=/#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(g)){return[parseInt(f[1]+f[1],16),parseInt(f[2]+f[2],16),parseInt(f[3]+f[3],16)]}if(f=/rgba\(0, 0, 0, 0\)/.exec(g)){return a.transparent}return a[d.trim(g).toLowerCase()]}function e(h,f){var g;do{g=d.curCSS(h,f);if(g!=""&&g!="transparent"||d.nodeName(h,"body")){break}f="backgroundColor"}while(h=h.parentNode);return b(g)}var a={aqua:[0,255,255],azure:[240,255,255],beige:[245,245,220],black:[0,0,0],blue:[0,0,255],brown:[165,42,42],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgrey:[169,169,169],darkgreen:[0,100,0],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkviolet:[148,0,211],fuchsia:[255,0,255],gold:[255,215,0],green:[0,128,0],indigo:[75,0,130],khaki:[240,230,140],lightblue:[173,216,230],lightcyan:[224,255,255],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightyellow:[255,255,224],lime:[0,255,0],magenta:[255,0,255],maroon:[128,0,0],navy:[0,0,128],olive:[128,128,0],orange:[255,165,0],pink:[255,192,203],purple:[128,0,128],violet:[128,0,128],red:[255,0,0],silver:[192,192,192],white:[255,255,255],yellow:[255,255,0],transparent:[255,255,255]};d.easing.jswing=d.easing.swing;d.extend(d.easing,{def:"easeOutQuad",swing:function(g,h,f,j,i){return d.easing[d.easing.def](g,h,f,j,i)},easeInQuad:function(g,h,f,j,i){return j*(h/=i)*h+f},easeOutQuad:function(g,h,f,j,i){return -j*(h/=i)*(h-2)+f},easeInOutQuad:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h+f}return -j/2*((--h)*(h-2)-1)+f},easeInCubic:function(g,h,f,j,i){return j*(h/=i)*h*h+f},easeOutCubic:function(g,h,f,j,i){return j*((h=h/i-1)*h*h+1)+f},easeInOutCubic:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h+f}return j/2*((h-=2)*h*h+2)+f},easeInQuart:function(g,h,f,j,i){return j*(h/=i)*h*h*h+f},easeOutQuart:function(g,h,f,j,i){return -j*((h=h/i-1)*h*h*h-1)+f},easeInOutQuart:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h+f}return -j/2*((h-=2)*h*h*h-2)+f},easeInQuint:function(g,h,f,j,i){return j*(h/=i)*h*h*h*h+f},easeOutQuint:function(g,h,f,j,i){return j*((h=h/i-1)*h*h*h*h+1)+f},easeInOutQuint:function(g,h,f,j,i){if((h/=i/2)<1){return j/2*h*h*h*h*h+f}return j/2*((h-=2)*h*h*h*h+2)+f},easeInSine:function(g,h,f,j,i){return -j*Math.cos(h/i*(Math.PI/2))+j+f},easeOutSine:function(g,h,f,j,i){return j*Math.sin(h/i*(Math.PI/2))+f},easeInOutSine:function(g,h,f,j,i){return -j/2*(Math.cos(Math.PI*h/i)-1)+f},easeInExpo:function(g,h,f,j,i){return(h==0)?f:j*Math.pow(2,10*(h/i-1))+f},easeOutExpo:function(g,h,f,j,i){return(h==i)?f+j:j*(-Math.pow(2,-10*h/i)+1)+f},easeInOutExpo:function(g,h,f,j,i){if(h==0){return f}if(h==i){return f+j}if((h/=i/2)<1){return j/2*Math.pow(2,10*(h-1))+f}return j/2*(-Math.pow(2,-10*--h)+2)+f},easeInCirc:function(g,h,f,j,i){return -j*(Math.sqrt(1-(h/=i)*h)-1)+f},easeOutCirc:function(g,h,f,j,i){return j*Math.sqrt(1-(h=h/i-1)*h)+f},easeInOutCirc:function(g,h,f,j,i){if((h/=i/2)<1){return -j/2*(Math.sqrt(1-h*h)-1)+f}return j/2*(Math.sqrt(1-(h-=2)*h)+1)+f},easeInElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h<Math.abs(m)){h=m;var j=k/4}else{var j=k/(2*Math.PI)*Math.asin(m/h)}return -(h*Math.pow(2,10*(i-=1))*Math.sin((i*l-j)*(2*Math.PI)/k))+f},easeOutElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l)==1){return f+m}if(!k){k=l*0.3}if(h<Math.abs(m)){h=m;var j=k/4}else{var j=k/(2*Math.PI)*Math.asin(m/h)}return h*Math.pow(2,-10*i)*Math.sin((i*l-j)*(2*Math.PI)/k)+m+f},easeInOutElastic:function(g,i,f,m,l){var j=1.70158;var k=0;var h=m;if(i==0){return f}if((i/=l/2)==2){return f+m}if(!k){k=l*(0.3*1.5)}if(h<Math.abs(m)){h=m;var j=k/4}else{var j=k/(2*Math.PI)*Math.asin(m/h)}if(i<1){return -0.5*(h*Math.pow(2,10*(i-=1))*Math.sin((i*l-j)*(2*Math.PI)/k))+f}return h*Math.pow(2,-10*(i-=1))*Math.sin((i*l-j)*(2*Math.PI)/k)*0.5+m+f},easeInBack:function(g,h,f,k,j,i){if(i==undefined){i=1.70158}return k*(h/=j)*h*((i+1)*h-i)+f},easeOutBack:function(g,h,f,k,j,i){if(i==undefined){i=1.70158}return k*((h=h/j-1)*h*((i+1)*h+i)+1)+f},easeInOutBack:function(g,h,f,k,j,i){if(i==undefined){i=1.70158}if((h/=j/2)<1){return k/2*(h*h*(((i*=(1.525))+1)*h-i))+f}return k/2*((h-=2)*h*(((i*=(1.525))+1)*h+i)+2)+f},easeInBounce:function(g,h,f,j,i){return j-d.easing.easeOutBounce(g,i-h,0,j,i)+f},easeOutBounce:function(g,h,f,j,i){if((h/=i)<(1/2.75)){return j*(7.5625*h*h)+f}else{if(h<(2/2.75)){return j*(7.5625*(h-=(1.5/2.75))*h+0.75)+f}else{if(h<(2.5/2.75)){return j*(7.5625*(h-=(2.25/2.75))*h+0.9375)+f}else{return j*(7.5625*(h-=(2.625/2.75))*h+0.984375)+f}}}},easeInOutBounce:function(g,h,f,j,i){if(h<i/2){return d.easing.easeInBounce(g,h*2,0,j,i)*0.5+f}return d.easing.easeOutBounce(g,h*2-i,0,j,i)*0.5+j*0.5+f}})})(jQuery);;/*
 * jQuery UI Effects Drop 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Drop
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.drop=function(b){return this.queue(function(){var e=a(this),d=["position","top","left","opacity"];var i=a.effects.setMode(e,b.options.mode||"hide");var h=b.options.direction||"left";a.effects.save(e,d);e.show();a.effects.createWrapper(e);var f=(h=="up"||h=="down")?"top":"left";var c=(h=="up"||h=="left")?"pos":"neg";var j=b.options.distance||(f=="top"?e.outerHeight({margin:true})/2:e.outerWidth({margin:true})/2);if(i=="show"){e.css("opacity",0).css(f,c=="pos"?-j:j)}var g={opacity:i=="show"?1:0};g[f]=(i=="show"?(c=="pos"?"+=":"-="):(c=="pos"?"-=":"+="))+j;e.animate(g,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){e.hide()}a.effects.restore(e,d);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Explode 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Explode
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.explode=function(b){return this.queue(function(){var k=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;var e=b.options.pieces?Math.round(Math.sqrt(b.options.pieces)):3;b.options.mode=b.options.mode=="toggle"?(a(this).is(":visible")?"hide":"show"):b.options.mode;var h=a(this).show().css("visibility","hidden");var l=h.offset();l.top-=parseInt(h.css("marginTop"),10)||0;l.left-=parseInt(h.css("marginLeft"),10)||0;var g=h.outerWidth(true);var c=h.outerHeight(true);for(var f=0;f<k;f++){for(var d=0;d<e;d++){h.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-d*(g/e),top:-f*(c/k)}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:g/e,height:c/k,left:l.left+d*(g/e)+(b.options.mode=="show"?(d-Math.floor(e/2))*(g/e):0),top:l.top+f*(c/k)+(b.options.mode=="show"?(f-Math.floor(k/2))*(c/k):0),opacity:b.options.mode=="show"?0:1}).animate({left:l.left+d*(g/e)+(b.options.mode=="show"?0:(d-Math.floor(e/2))*(g/e)),top:l.top+f*(c/k)+(b.options.mode=="show"?0:(f-Math.floor(k/2))*(c/k)),opacity:b.options.mode=="show"?1:0},b.duration||500)}}setTimeout(function(){b.options.mode=="show"?h.css({visibility:"visible"}):h.css({visibility:"visible"}).hide();if(b.callback){b.callback.apply(h[0])}h.dequeue();a("div.ui-effects-explode").remove()},b.duration||500)})}})(jQuery);;/*
 * jQuery UI Effects Highlight 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Highlight
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.highlight=function(b){return this.queue(function(){var e=a(this),d=["backgroundImage","backgroundColor","opacity"];var h=a.effects.setMode(e,b.options.mode||"show");var c=b.options.color||"#ffff99";var g=e.css("backgroundColor");a.effects.save(e,d);e.show();e.css({backgroundImage:"none",backgroundColor:c});var f={backgroundColor:g};if(h=="hide"){f.opacity=0}e.animate(f,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(h=="hide"){e.hide()}a.effects.restore(e,d);if(h=="show"&&a.browser.msie){this.style.removeAttribute("filter")}if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Pulsate 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Pulsate
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.pulsate=function(b){return this.queue(function(){var d=a(this);var g=a.effects.setMode(d,b.options.mode||"show");var f=b.options.times||5;var e=b.duration?b.duration/2:a.fx.speeds._default/2;if(g=="hide"){f--}if(d.is(":hidden")){d.css("opacity",0);d.show();d.animate({opacity:1},e,b.options.easing);f=f-2}for(var c=0;c<f;c++){d.animate({opacity:0},e,b.options.easing).animate({opacity:1},e,b.options.easing)}if(g=="hide"){d.animate({opacity:0},e,b.options.easing,function(){d.hide();if(b.callback){b.callback.apply(this,arguments)}})}else{d.animate({opacity:0},e,b.options.easing).animate({opacity:1},e,b.options.easing,function(){if(b.callback){b.callback.apply(this,arguments)}})}d.queue("fx",function(){d.dequeue()});d.dequeue()})}})(jQuery);;/*
 * jQuery UI Effects Scale 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Scale
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.puff=function(b){return this.queue(function(){var f=a(this);var c=a.extend(true,{},b.options);var h=a.effects.setMode(f,b.options.mode||"hide");var g=parseInt(b.options.percent,10)||150;c.fade=true;var e={height:f.height(),width:f.width()};var d=g/100;f.from=(h=="hide")?e:{height:e.height*d,width:e.width*d};c.from=f.from;c.percent=(h=="hide")?g:100;c.mode=h;f.effect("scale",c,b.duration,b.callback);f.dequeue()})};a.effects.scale=function(b){return this.queue(function(){var g=a(this);var d=a.extend(true,{},b.options);var j=a.effects.setMode(g,b.options.mode||"effect");var h=parseInt(b.options.percent,10)||(parseInt(b.options.percent,10)==0?0:(j=="hide"?0:100));var i=b.options.direction||"both";var c=b.options.origin;if(j!="effect"){d.origin=c||["middle","center"];d.restore=true}var f={height:g.height(),width:g.width()};g.from=b.options.from||(j=="show"?{height:0,width:0}:f);var e={y:i!="horizontal"?(h/100):1,x:i!="vertical"?(h/100):1};g.to={height:f.height*e.y,width:f.width*e.x};if(b.options.fade){if(j=="show"){g.from.opacity=0;g.to.opacity=1}if(j=="hide"){g.from.opacity=1;g.to.opacity=0}}d.from=g.from;d.to=g.to;d.mode=j;g.effect("size",d,b.duration,b.callback);g.dequeue()})};a.effects.size=function(b){return this.queue(function(){var c=a(this),n=["position","top","left","width","height","overflow","opacity"];var m=["position","top","left","overflow","opacity"];var j=["width","height","overflow"];var p=["fontSize"];var k=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"];var f=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"];var g=a.effects.setMode(c,b.options.mode||"effect");var i=b.options.restore||false;var e=b.options.scale||"both";var o=b.options.origin;var d={height:c.height(),width:c.width()};c.from=b.options.from||d;c.to=b.options.to||d;if(o){var h=a.effects.getBaseline(o,d);c.from.top=(d.height-c.from.height)*h.y;c.from.left=(d.width-c.from.width)*h.x;c.to.top=(d.height-c.to.height)*h.y;c.to.left=(d.width-c.to.width)*h.x}var l={from:{y:c.from.height/d.height,x:c.from.width/d.width},to:{y:c.to.height/d.height,x:c.to.width/d.width}};if(e=="box"||e=="both"){if(l.from.y!=l.to.y){n=n.concat(k);c.from=a.effects.setTransition(c,k,l.from.y,c.from);c.to=a.effects.setTransition(c,k,l.to.y,c.to)}if(l.from.x!=l.to.x){n=n.concat(f);c.from=a.effects.setTransition(c,f,l.from.x,c.from);c.to=a.effects.setTransition(c,f,l.to.x,c.to)}}if(e=="content"||e=="both"){if(l.from.y!=l.to.y){n=n.concat(p);c.from=a.effects.setTransition(c,p,l.from.y,c.from);c.to=a.effects.setTransition(c,p,l.to.y,c.to)}}a.effects.save(c,i?n:m);c.show();a.effects.createWrapper(c);c.css("overflow","hidden").css(c.from);if(e=="content"||e=="both"){k=k.concat(["marginTop","marginBottom"]).concat(p);f=f.concat(["marginLeft","marginRight"]);j=n.concat(k).concat(f);c.find("*[width]").each(function(){child=a(this);if(i){a.effects.save(child,j)}var q={height:child.height(),width:child.width()};child.from={height:q.height*l.from.y,width:q.width*l.from.x};child.to={height:q.height*l.to.y,width:q.width*l.to.x};if(l.from.y!=l.to.y){child.from=a.effects.setTransition(child,k,l.from.y,child.from);child.to=a.effects.setTransition(child,k,l.to.y,child.to)}if(l.from.x!=l.to.x){child.from=a.effects.setTransition(child,f,l.from.x,child.from);child.to=a.effects.setTransition(child,f,l.to.x,child.to)}child.css(child.from);child.animate(child.to,b.duration,b.options.easing,function(){if(i){a.effects.restore(child,j)}})})}c.animate(c.to,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(g=="hide"){c.hide()}a.effects.restore(c,i?n:m);a.effects.removeWrapper(c);if(b.callback){b.callback.apply(this,arguments)}c.dequeue()}})})}})(jQuery);;/*
 * jQuery UI Effects Shake 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Shake
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.shake=function(b){return this.queue(function(){var e=a(this),l=["position","top","left"];var k=a.effects.setMode(e,b.options.mode||"effect");var n=b.options.direction||"left";var c=b.options.distance||20;var d=b.options.times||3;var g=b.duration||b.options.duration||140;a.effects.save(e,l);e.show();a.effects.createWrapper(e);var f=(n=="up"||n=="down")?"top":"left";var p=(n=="up"||n=="left")?"pos":"neg";var h={},o={},m={};h[f]=(p=="pos"?"-=":"+=")+c;o[f]=(p=="pos"?"+=":"-=")+c*2;m[f]=(p=="pos"?"-=":"+=")+c*2;e.animate(h,g,b.options.easing);for(var j=1;j<d;j++){e.animate(o,g,b.options.easing).animate(m,g,b.options.easing)}e.animate(o,g,b.options.easing).animate(h,g/2,b.options.easing,function(){a.effects.restore(e,l);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}});e.queue("fx",function(){e.dequeue()});e.dequeue()})}})(jQuery);;/*
 * jQuery UI Effects Slide 1.7.2
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Effects/Slide
 *
 * Depends:
 *	effects.core.js
 */
(function(a){a.effects.slide=function(b){return this.queue(function(){var e=a(this),d=["position","top","left"];var i=a.effects.setMode(e,b.options.mode||"show");var h=b.options.direction||"left";a.effects.save(e,d);e.show();a.effects.createWrapper(e).css({overflow:"hidden"});var f=(h=="up"||h=="down")?"top":"left";var c=(h=="up"||h=="left")?"pos":"neg";var j=b.options.distance||(f=="top"?e.outerHeight({margin:true}):e.outerWidth({margin:true}));if(i=="show"){e.css(f,c=="pos"?-j:j)}var g={};g[f]=(i=="show"?(c=="pos"?"+=":"-="):(c=="pos"?"-=":"+="))+j;e.animate(g,{queue:false,duration:b.duration,easing:b.options.easing,complete:function(){if(i=="hide"){e.hide()}a.effects.restore(e,d);a.effects.removeWrapper(e);if(b.callback){b.callback.apply(this,arguments)}e.dequeue()}})})}})(jQuery);;