/********     (c) Copyright 2012 Readyforce     ********/
/*        Compiled at: 2012-02-04T21:55:14+00:00       */
/*******************************************************/

/*!
 * 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);

$(window).bind('focus', function() { 

    // ensure that you don't do shit in SUDO mode back on a page that you loaded
    // before you sudo'd as a user.
    var sudo_user_check = false;
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf('rf_session') == 0 && c.indexOf('sudo_user_id') > 0) sudo_user_check=true; 
    }

    if (typeof(sudo_user) == 'undefined') sudo_user = sudo_user_check;

    if (sudo_user == false && sudo_user_check == true && sudo_confirm == false) { 
        sudo_confirm = true;
        var status = window.confirm("WARNING: You are currently in SUDO mode. Click OK to un-sudo and Cancel to do nothing.");

        // OK clicked
        if (status) { 
            $.ajax({
                url:      "/rf/sudo/logout/1",
                type:     "GET",
                success:  function() { window.alert("Successfully logged out of sudo mode"); }, 
                error:    function() { window.alert("Unable to un-sudo."); }
            });
        }
    }
});

sudo_confirm = false;

/**
 * Common RF js.
 */
var RF =  {

    /**
     * A list of enumerated consts for the RF object.
     */
    Constants: {
        DEBUG: true,
        DEFAULT_INPUT_KEY: 'di'
    },

    /**
     * Namespace for any of our globals to go
     */
    Globals: { },

    /**
     * Initializes the RF library.
     * This method is called NOT at document ready, but inline at the bottom
     * of the file.
     *
     * @return void
     */
    init: function() {

        // run this at document ready. 
        $(document).ready(function() { 
            RF.Form.init();
            RF.initMessages();
        });
    },

    /**
     * Displays messages found in the X-Json header of all AJAX requests - system wide
     *
     * Format is:
     * {"messages":{
     *   "error":   ["Error 1","Error 2"],
     *   "success": ["Success 1","Success 2"],
     *   "info":    ["Info 1","Info 2"],
     *   "warning": ["Warning 1","Warning 2"]
     * }}
     */
    initMessages: function() {
        /**
         * Finds a possible message container from a list. First one that exists will be used. body is the last resort
         */
        function findMessageContainer() {
            var selectors = ['div.page-container', 'body'];
            for (var i in selectors) {
                var selector = selectors[i];
                if ($(selector).length > 0) {
                    return $(selector);
                }
            }
            return null;
        };

        var message_container = findMessageContainer();
        if(!message_container) return;

        message_container.ajaxComplete(function(e, xhr, settings) {
            var json;
            try { json = $.parseJSON(xhr.getResponseHeader('X-Json')) } catch(e) {}
            if(!json || !json.messages) return;

            for(var type in json.messages) {
                for(var i in json.messages[type]) {
                    var message = json.messages[type][i];
                    $(this).prepend('<p class="'+type+'">'+message+'<a class="alert-close"></a></p>');
                }
            }
        });
    },

    initAnalytics: function() {
        $('.ga-track').click(function(e) {
            // if the event doest have a button attribute then it probably means it's not a real mouse/keyboard click event
            // this is needed because tabs receive an automated click event on the first tab, and we dont want to track that
            if(typeof(e.button) == 'undefined')
              return;

            RF.gaTrackEventForElement($(this));
        });

        $('.ga-track-delay').click(function(e) {
            // if the event doest have a button attribute then it probably means it's not a real mouse/keyboard click event
            // this is needed because tabs receive an automated click event on the first tab, and we dont want to track that
            if(typeof(e.button) == 'undefined')
              return;

            RF.gaTrackEventForElement($(this));

            // this method is recommended by Google: http://support.google.com/googleanalytics/bin/answer.py?hl=en-GB&answer=55527
            var href = $(this).attr('href');
            setTimeout('document.location = "' + href + '"', 100);

            e.preventDefault();
            return false;
        });
    },

    gaTrackEventForElement: function (el) {
        RF.gaTrackEvent(el.attr('data-category'), el.attr('data-action'), el.attr('data-opt-label'));
    },

    gaTrackEvent: function(category, action, label) {
        if (typeof _gaq == 'undefined')
            return;
        RF.log('gaTrackEvent(' + category +', '+ action +', '+ label + ')');
        _gaq.push(['_trackEvent', category, action, label]);
    },

    /**
     * Checks to see if we are currently in debug mode. Returns true if we are,
     * false if we aren't.
     *
     * @return boolean
     */
    isDebug: function() {

        // look in both the Consts, and for a debug class in the body (we
        // do this so we can make a debug bookmarklet on live)
        //
        if (RF.Constants.DEBUG || document.body.className.match(/(^|\s)debug($|\s)/)) {
            return true;
        }
        return false;
    },

    /**
     * Logs the arguments if we are in debug mode, or else ignores the call.
     *
     * @param  mixed obj  An object to log, can also support multiple arguments
     *                    i.e. log(foo, bar, cat) each of which will be logged. 
     * @return void
     */
    log: function() {

        if (!RF.isDebug()) {
            return;
        }

        if (typeof(console) == 'undefined') {
            return;
        }

        var args = arguments;
        for (var i=0; i<args.length; i++) { 
            console.log(args[i]);
        }
    },

    /**
     * logs to the event log (via the event_log_model).
     * @param the vent type name, e.g. 'view_requisition'
     * @param attributes hash, e.g. { 'candidate_id': 1234, 'requisition_id': 4321 }
     * @param callback that gets called with the AJAX response.
     */
    logEvent: function(eventTypeName, attributes, numEvents, callback) {
        if (!eventTypeName) {
            return;
        }

        $.ajax({
            'url': '/rf/event_log/logP',
            'type': 'POST',
            'dataType': 'json',
            'async': false,
            'data': {
                'type': eventTypeName,
                'attributes': attributes,
                'numEvents': numEvents
            },
            'success': function(response) {
                if (typeof(callback) == 'function') {
                    callback(response);
                }
            }
        });
    },

    /**
     * The basic timer object,
     */
    timer: function() {

        /**
         * Method that's called to start the timer.
         *
         * @param callback    function  A function to be executed
         * @param seconds     number    The interval for which the callback should be
         *                              fired, in seconds.
         * @param call_once   boolean   Flag for if the callback should be fired on each
         *                              interval or only at the first instance.
         * @return void
         */
        this.start = function(callback, seconds, call_once) {
            var d           = new Date();
            this.start_time = d.getTime();
            this.isInterval = !Boolean(call_once);

            if ($.isFunction(callback)) {
                if (this.isInterval) {
                    this.t = setInterval(callback, seconds*1000);
                } else {
                    this.t = setTimeout(callback, seconds * 1000);
                }
            }
        }

        /**
         * Method that stops the current timer, and halts any callbacks
         *
         * @return float The elapsed time since start, in seconds
         */
        this.stop = function() {
            if (this.isInterval) {
                clearInterval(this.t);
            }

            var d = new Date();
            this.stop_time = d.getTime();
            return (this.start_time - this.stop_time)/1000;
        }

        /**
         * Method that resets this instance of the timer.
         *
         * @return void
         */
        this.reset = function() {
            this.stop();
            this.isInterval = null;
            this.start_time = null;
            this.stop_time  = null;
        }

        /**
         * Method to check in on the timer and see the elapsed time
         * since it start() was called.
         *
         * @return float  The elapsed time since start, in seconds
         */
        this.read = function() {
            var d = new Date();
            return ( d.getTime() - this.start_time )/1000;
        }
    },

    /**
     * Method that sets the default text for an input element, as well
     * as setting up listeners on the element so that on click the default
     * text is remove, and on blur, if the input is empty, returns the
     * default text.
     *
     * TODO: this should get moved.
     *
     * @param e     string: the selector of the element (or an element).
     * @param text  string: the default text
     * @param replace bool: toggle to replace the text on blur if empty
     *                      (default is true)
     * @param clear   bool: toggle to clear the default value on submit
     *                      of the form (default is true)
     * @return void
     */
    setDefaultText: function(selector, text, replace, clear) {
        var selected = $(selector);
        if (selected.length == 0) {
            return;
        }

        // incase we got back more than one
        var elements = [];
        if (selected.length == 1) {
            elements = [selected];
        }
        else {
            elements = selected;
        }

        for (var i=0; i < selected.length; i++) {
            var element = $(selected[i]);

            if (typeof(replace) == 'undefined') {
                replace = true;
            }

            if (typeof(clear) == 'undefined') {
                clear = true;
            }


            // store the data and set the default text in the element.
            // $.data is good in that it doesn't cause references to gang up.
            $.data(element.get(0),
                   RF.Constants.DEFAULT_INPUT_KEY,
                   text);

            // set the value of the field, but only if it's empty...
            if (element.val() == '') {
                element.val(text);
            }

            // attach the clear event.
            element.focus(function(e) {
                var d = $.data(this, RF.Constants.DEFAULT_INPUT_KEY);
                if (d == undefined || d == '') {
                    return;
                }

                if (d == this.value) {
                    this.value = '';
                    return;
                }
            });

            // If we want to attach the on-blur handler...
            if (replace) {
                element.blur(function(e) {
                    if (this.value != '') {
                        return;
                    }
                    this.value = $.data(this, RF.Constants.DEFAULT_INPUT_KEY);
                });
            }


            element.attr('clearOnSubmit', clear);
        }

        // register the clear-default-text handler
        $(selected[0]).closest('form').submit(function (){
            RF.clearFormDefaults(this);
        });

    },



    /**
     * Callback method for setDefaultText that gets called onSubmit of the
     * elements form. Here we run through all the inputs and if their value
     * matches the default value, empty it out before submission
     *
     * @param e: The HTML form element
     * @return void
     */
    clearFormDefaults: function(e) {
        var f = $(e);
        var inputs = f.find('input[clearOnSubmit="true"]').each(function(i) {
            if (this.value == $.data(this, RF.Constants.DEFAULT_INPUT_KEY)) {
                this.value = '';
            }
        });
    },

    /**
     * Our own presentation of parseInt, that also will strip out commas,
     * and yank out any words following the int value
     *
     * @param str
     * @return int
     */
    parseInt: function(str) {
        if (str == null) {
            return 0;
        }

        if (!isNaN(str)) {
            return str;
        }

        str = str.trim();
        if (str.indexOf(' ')) {
            str = str.split(' ')[0];
        }

        str = str.replace(',', '');
        return parseInt(str);
    },

    open_dropdown: function(dropdown_element, dropdown_trigger) {
        dropdown_element.fadeIn(200);
    },

    close_dropdown: function(dropdown_element, dropdown_trigger) {
        dropdown_element.fadeOut(200);
    },

    /**
     * RF.UI namespace.
     */
    UI: {

        /**
         * Array of callbacks to be called at the end of the RF.UI.init::
         * These will be called initially on window.load, if they're not contained
         * in the contexts_to_skip selectors. 
         * 
         * They'll also be re-fired whenever RF.UI.init is recalled, and will be 
         * passed in the current context as the first argument. 
         * 
         * @return array
         */
        deferred_queue: [], 

        /**
         * Similar to the delayed callbacks, these are a series of callbacks that shall
         * be called on document.ready(), or immediately after RF.UI.init()
         *
         * They'll also be re-fired whenever RF.UI.init is recalled, and will be 
         * passed in the current context as the first argument. 
         * 
         * @return array
         */
        init_callbacks: [], 

        /**
         * the key we'll use to identify initialized elements.
         *
         * @return string
         */
        init_attr_key: "ui.init", 

        /**
         * A selector of HTML elements for whom we'll defer auto-wiring up on.
         *
         * @return array
         */
        contexts_to_skip: ['.tab-pane:hidden', '.panel.collapsed'], 

        /**
         * Method that verifies if a given element has or should be initialized.
         *
         * @param  element  jquery element
         * @return bool
         */
        checkInit: function(element, has_context) {
            // already init'd
            //
            if (element.data(RF.UI.init_attr_key) == 'true') {
                return false;
            }
            
            // off limits for now
            //
            if (element.parents(RF.UI.contexts_to_skip.join(',')).length > 0) {
                return false;
            }
            return true;
        }, 

        /**
         * Method that marks an element as loaded
         * 
         * @param  element  Element  The HTML element to mark
         * @return void
         */
        setInit: function(element) { 
            element.data(RF.UI.init_attr_key, 'true');
        },

        /**
         * Method that marks an element as unloaded
         *
         * @param  element  Element  The HTML element to mark
         * @return void
         */
        unsetInit: function(element) {
            element.removeData(RF.UI.init_attr_key);
        },

        /**
         * Initializes the RF.UI object. Here's were we run through
         * and do a bunch of auto-magic attachment of buttons, dropdowns,
         * tabs and what not.
         *
         * We're initially firing this on document.ready, with portions
         * being delayed until window.load, however that will be overridden
         * when providing a context.
         *
         * We're keeping track of which elements have been init'ed by tagging
         * them with a jquery data 'un.init' entry, and not re-init'ing elements
         * on later calls.
         *
         * @param  context  Element   An optional HTML element that we'll narrow
         *                            the focus to. Note, when called with a context,
         *                            any of the delayed methods (to be called in
         *                            window.load) will be called in-line instead.
         * @return void
         */
        init: function(context) {

            // if there's no context, then we'll set it to be from the document node.
            // Subtlety: notice the NOT operator here...
            //
            var has_context = !(context == $('body') || typeof(context) == 'undefined');
            if (!has_context) {
                context = $('body');
            }

            /**
             * Method that contains any events that need to be deferred either on
             * window.load, (or for something that loads later) following the rest
             * of init()
             *
             * @return void
             */
            function deferred_routines() {
                if (RF.UI.deferred_queue.length > 0) { 
                    for (var i=0; i<RF.UI.deferred_queue.length; i++) { 
                        if (has_context) { 
                            RF.UI.deferred_queue[i].call(this, context);
                        } else { 
                            RF.UI.deferred_queue[i].call();
                        }
                    }
                }
            }

            // auto-wire up any call-links
            //
            context.find('.call-link').each(function(i, e) {
                var link = $(e);
                if (!RF.UI.checkInit(link, has_context))
                    return;

                link.click(function(e) {
                    $.ajax({
                        url:     link.attr('href'),
                        success: function(data) {
                            var content = $(data);
                            RF.modal.open({
                                'content': content,
                                'event':   e
                            })
                        }
                    });
                    return false;
                });
                RF.UI.setInit(link);
            });

            // wire up these actions, across the page.
            //
            context.find(".button.inactive").click(function() {
                return false;
            });

            context.find("a.dropdown").each(function(i,e) {
                var link = $(e);
                if (!RF.UI.checkInit(link, has_context))
                    return;

                link.click(function() {
                    $('#' + link.attr('data-panel-id')).fadeIn(200, function() {
                        /// if panel contains a form then focus its first input
                        $(this).find("form :input:visible:enabled:first").focus();
                    });
                    return false;
                });
                RF.UI.setInit(link);
            });

            $("a.cancel").each(function(i,e) {
                var link = $(e);
                if (!RF.UI.checkInit(link, has_context))
                    return;

                link.click(function() {
                    var p = $(this).parent().parent();
                    p.fadeOut(200);
                    $("a.dropdown[data-panel-id='"+p.get(0).id+"']").removeClass('inactive');
                    $("div.overlay").fadeOut(200);
                    return false;
                });
                RF.UI.setInit(link);
            });

            $("a.close").each(function(i,e) {
                var link = $(e);
                if (!RF.UI.checkInit(link, has_context))
                    return;

                link.click(function() {
                    RF.modal.close();
                    $(this).closest('.panel').fadeOut(200);
                    return false;
                });
                RF.UI.setInit(link);
            });

            // if this is being fired on document.ready, then let's delay the
            // deferred_routines until window.load (so things are fully drawn).
            //
            if (!has_context) {
                $(window).load(function() {
                    RF.log("RF.UI.init:: Window.load firing...");
                    deferred_routines();
                });
            } else {
                deferred_routines();
            }

        },

        /**
         * The standard opening and collapsing panel mechanism. 
         * 
         * For the panel to work, you should have the following basic structure: 
         *  <div class="panel">
         *      <div class="header">
         *        { header content (stays visible)
         *      </div>
         *      <div class="body">
         *        { body content (collapsible)
         *      </div>
         *  </div>
         * 
         * From there, we wire up any clicks on the header to open or close the 
         * body panel. Panels with the "expanded" class will be set to open by 
         * default, otherwise they'll be closed at document.ready(). Any .icon
         * classes in the header will also be given .open and .closed classes, 
         * based on the state. 
         * 
         * Once the mechanism has been wired up, you can also trigger the open
         * and close events remotely on the panel element, as they're bound there. 
         */
        panel: {

            init: function(context) { 

                var has_context = !(context == $('body') && typeof(context) != 'undefined');
                // RF.log('RF.UI.panel.init:: Calling init in context ' + context.getUID());

                // for each of the panel containers that have a .header child, 
                // let's run across them and wire them up with their open/close 
                // behaviors. 
                //
                context.find('.panel>.header').each(function(i, el) {
                    var header    = $(el);
                    var container = header.closest('.panel');

                    // if this has already been init'd, pass
                    //
                    if (!RF.UI.checkInit(container, has_context)) { 
                        return;
                    }

                    // if this panel has no body, then we're done, also. 
                    //
                    if (container.find('.body').length == 0) { 
                        return;
                    }

                    var opened = container.hasClass('expanded');

                    // bind the open and close events to the container
                    //
                    container.bind('open', function(e) { 
                        opened        = true;
                        var container = $(e.target); 
                        var header    = container.find('.header');
                        var body      = container.find('.body');
                        body.slideDown('fast', function() {
                            container.removeClass('collapsed').addClass('expanded');
                            header.find('.closed.icon').hide();
                            header.find('.open.icon').show();
                            RF.UI.init(body);
                        });
                    });

                    container.bind('close', function(e) { 
                        opened        = false;
                        var container = $(e.target);
                        var header    = container.find('.header');
                        var body      = container.find('.body');
                        body.slideUp('fast', function() {
                            header.find('.closed.icon').show();
                            header.find('.open.icon').hide();
                            container.removeClass('expanded').addClass('collapsed');
                        });
                    });

                    header.children().css({cursor: 'pointer'});
                    header.click(function(e){ 
                        // if you're clicking on a link in the header, let that pass through. 
                        //
                        var target  = $(this);
                        if (target.is('a')) {
                            return true; 
                        } 

                        if (opened) { 
                            container.trigger('close', target);
                        } else { 
                            container.trigger('open', target);
                        }
                        return false;
                    });

                    
                    // now let's go ahead and run "open" or "close" on the panel. 
                    // TODO: not the most elegant solution here... 
                    //
                    if (container.hasClass('expanded')) {
                        container.trigger('open');
                    } else { 
                        container.trigger('close');
                    }
    
                    // mark it as done.   
                    //
                    RF.UI.setInit(container);
                    
                });
            }
        }, 

        /**
         * The pagination mechanism.
         *
         * the pattern is to have a div with lots of <a>'s that are links to pages:
         * So your code should look something like:
         *
         * <div class="paginator" style="margin-bottom: 1px;">
         *      <a class="prev page" href="javascript: ">&#8592;</a>
         *      <? for( $i = $pageMin; $i <= $pageMax; $i++ ) : ?>
         *         <a class="page <?= $i == $page ? 'selected' : null ?>" href="javascript: "><?= $i ?></a>
         *         <? endfor ?>
         *         <a class="next page" href="javascript: ">&#8594;</a>
         *  </div>
         *
         * there's a partial view that generates this for you: views/partials/paginator
         *
         * on init we wireUp the links to call the supplied callback with the selected page number
         *
         */
        paginator: {
            init: function(args) {
                var paginator = this;

                paginator = $.extend({ 
                    anchor: null, 
                    onPaginate: function() {},
                    currentPage: 1
                }, args);

                if (!paginator.anchor) {
                    throw new exception("need the pagination anchor");
                }

                var anchor = $(args.anchor);
                anchor.find('.page').each(function(i, pageLink) {
                    var pageLink = $(pageLink);
                    
                    // previous
                    if (pageLink.hasClass('prev')) {
                        pageLink.click(function() {
                            RF.UI.paginator.changePage(
                                (RF.UI.paginator.getCurrentPage(anchor) - 1) > 0 ? RF.UI.paginator.getCurrentPage(anchor) - 1 : 1,
                                paginator.anchor,
                                paginator.onPaginate
                            );
                        });
                    }
                    // next
                    else if (pageLink.hasClass('next')) {
                        pageLink.click(function() { 
                            RF.UI.paginator.changePage(
                                (RF.UI.paginator.getCurrentPage(anchor) + 1),
                                paginator.anchor,
                                paginator.onPaginate
                            );
                        });
                    }
                    // direct numeric links
                    else {
                        pageLink.click(function() { 
                            RF.UI.paginator.changePage(
                                parseInt(pageLink.text(), 10),
                                paginator.anchor,
                                paginator.onPaginate
                            );
                        });
                    }
                });
            },


            changePage: function(newPage, anchor, callback) {
                var currentPage = RF.UI.paginator.getCurrentPage(anchor);
                if (currentPage == newPage) {
                    return;
                }

                $(anchor).find('.page[page="' + currentPage + '"]').removeClass('current');
                $(anchor).find('.page[page="' + newPage + '"]').addClass('current');

                callback.apply(null, [newPage]);
            },

            getCurrentPage: function(anchor) {
                return parseInt( $(anchor).find('.current.page').attr('page'), 10);
            }
        },


        /**
         * The tabs mechanism.
         *
         * For the tabs, the pattern is to have a .tab-container element that
         * holds both the .tabs (in an unordered list), as well as a series
         * of .tab-pane elements (div, table, other block).
         *
         * So your code should look something like:
         *
         *  <div class="tab-container">
         *      <ul class="tabs">
         *      <li><a href="#foo">foo</a></li>
         *      </ul>
         *
         *      <div id="foo" class="tab-pane">
         *          {tab content}
         *      </div>
         *  </div>
         *
         * On init we'll wire up the relative anchors in the tabs to show the pane
         * with the id they're referencing.
         *
         * For tabs that are loaded in dynamically, the href in your anchor should
         * be a local URL that we'll fetch the content from and shove it in the DOM
         * in it's own tab-pane div with an appropriate "ajax-tab" class. While
         * fetching this content we put up a loading pane for a good user experience.
         *
         *  <ul class="tabs">
         *      <li><a href="/rf/foo">foo</a></li>
         *      <li><a href="/rf/bar" rel="cache">bar</a></li>
         *      ...
         *
         * Notice, that wen we provide a rel=cache attribute, we'll cache the
         * tab-pane's content and re-use it for the remainder of the page life.
         * 
         * You can also provide a 'selected' attribute on a given tab's anchor
         * and on load, we'll open that tab. 
         * 
         * <ul class="tabs">
         *    <li><a href="#one">First Tab</a></li>
         *    <li>a selected="true"  href="#two">Opened!</a></li>
         *    ...
         */
        tabs: {

            /**
             * Initializes any tabs on the page.
             *
             * @param  args  mixed  If called with an argument of a particular
             *                      tab container selector, we'll wire up only that
             *                      group of tabs.
             * @return void
             */
            init: function(args) {

                var has_context = true;
                var containers  = null;
                var init_attr_key = "tab.init";

                // one tab, or all tabs?
                //

                if (typeof(args) == 'undefined') {
                    // RF.log("RF.UI.tabs::init: Setting up tabs... (global)");
                    containers = $('.tab-container');
                    has_context = false;

                } else if ('target' in args) {
                    // RF.log("RF.UI.tabs::init: Calling init on single tab container.");
                    containers = $(args.target);

                // or a group of tabs of a given context?
                //
                } else if ('context' in args) {
                    var context = $(args.context);
                    containers = context.find('.tab-container');
                    // RF.log("RF.UI.tabs::init: Calling init on context " + context.getUID() + ".");

                // otherwise do the normal thing, and apply to all tabs.
                //
                } else {
                    RF.log("RF.UI.tabs::init: Unable to determine context...");
                    return;
                }

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

                // no tabs, move along.
                //
                if (containers.length == 0) {
                    return;
                }

                // run through each tab-container and set it up
                var RFTabs = this;
                containers.each(function(index, element) {

                    var container = $(element);

                    // see if it's already init'ed
                    //
                    if (container.data(init_attr_key) == 'true') {
                        return;
                    }

                    // if there's no context, defer anything in these elements, they'll
                    // be wired up later.
                    //
                    if (!has_context && container.parents(RF.UI.contexts_to_skip.join(',')).length > 0) {
                        return
                    }
                    
                    container.find('.tab-pane').hide().css({visibility: 'visible'});
                    if (container.is(":hidden")) {
                        container.show();
                    }

                    // wire up the click event.
                    //
                    container.find('.tabs a').click(function(e) {
                        var anchor = $(this);
                        RF.UI.tabs.openTab.apply(anchor, [e]);
                        if (typeof(RFTabs.hooks.onOpenTab) == "function") {
                            RFTabs.hooks.onOpenTab.apply(RFTabs, [anchor, container.find('div.selected-tab-pane')]);
                        }
                    });

                    // if the caller specified a tab to start with, open that
                    //
                    var tab_to_open = false; 

                    // first, look for a hash in the URL. It takes precedence. 
                    //
                    var hash = document.location.hash;
                    if (hash != '' && container.find('.tabs a[href='+hash+']').length> 0) {
                        tab_to_open = container.find('.tabs a[href='+hash+']');    
                        tab_to_open.focus();

                    // if nothing was there, look for a selected=true attr on one of the 
                    // tab anchors. 
                    //
                    } else if (container.find('.tabs a[selected="true"]').length > 0) {
                        tab_to_open = container.find('.tabs a[selected="true"]');
                    
                    // or, finally, just go get the first one. 
                    //
                    } else {
                        tab_to_open = container.find('.tabs a:first');
                    }

                    // trigger the tab. 
                    //
                    tab_to_open.trigger('click');

                    container.data(init_attr_key, 'true');

                });
            },

            /**
             * accepts a function(anchor, tabPane) that is called
             * when a tab is opened.
             */
            onOpenTab: function(f) {
                if (!this.hooks) {
                    this.hooks = {};
                }
                this.hooks.onOpenTab = f;
            },

            /**
             * Handler to open a tab's associated content pane. On open we'll
             * run through all the tabs, hide any that are open, remove any
             * that came in via ajax, and then open (or fetch) the tab associated
             * with the current click action.
             *
             * @return void
             */
            openTab: function(e) {

                var anchor    = $(e.target);
                var id        = anchor.getUID();
                var container = anchor.closest('.tab-container');

                // reset everything.
                //
                container.find('.tab-pane').each(function(index, element) {
                    var tab = $(element).hide();
                    tab.removeClass('selected-tab-pane');

                    // if this is an ajax-tab, kill it.
                    //
                    if (tab.hasClass('ajax-tab')) {
                        tab.remove();
                    }
                });

                container.find('.tabs li').removeClass('active');
                anchor.parent('li').addClass('active');

                // if this tab has local content, then let's display it and
                // call it a day.
                //
                if (anchor.attr('href').charAt(0) == '#') {
                    var id = anchor.attr('href');
                    var tab = container.find(id);
                    tab.fadeIn('fast', function(e) {

                        // if there's a callback for the tab, then let's fire it
                        // on completion of the fade in.
                        //
                        tab.trigger('onOpenTab');

                        // and also re-run the init for any new elements.
                        //
                        RF.UI.init(tab);


                        // this should be safe for non-modal occassions
                        if (RF.modal.is_open) {
                            RF.modal.center();
                        }
                    });
                    tab.addClass('selected-tab-pane');

                    if (e) { e.preventDefault(); }
                    return false;
                }


                // otherwise this tab's content needs to be loaded in ajax-ically
                // so first, let's create the container.
                //
                var tab   = $('<div class="tab-pane">' + '</div>');
                var cache = (anchor.attr('rel') == 'cache');

                container.append(tab);
                tab.addClass('selected-tab-pane');

                // bring down the loading panel, but have it auto-hide after 3 seconds
                // (in the event that the content doesn't load...)
                //
                RF.UI.showLoadingPanel({ element: tab, callback: function() { 
                    setTimeout(function() { 
                        RF.UI.hideLoadingPanel({ 
                            element: tab,
                            remove:  true
                        });
                    }, 3000)
                }});

                $.ajax({
                    url:      anchor.attr('href'),
                    context:  tab,
                    dataType: 'html',
                    success:  function(data) {
                        tab.html(data).css({visibility: 'visible'});
                        RF.UI.hideLoadingPanel({
                            element: tab,
                            remove:  true
                        });
                    },

                    error:    function() {
                        RF.log('RF.UI.tabs: Error load page ' + href);
                    }
                });

                // if the tab is cache-able, then we'll re-write the anchor's to look
                // like they're local. Otherwise, let's add the identifying ajax-tab
                // class so we'll know to clear them out later.
                //
                if (!cache) {
                    tab.addClass('ajax-tab');
                } else {
                    anchor.attr('href', '#'+tab.getUID());
                }

                // and also re-run the init for any new elements.
                //
                RF.UI.init(tab);

                if (e) { e.preventDefault() };
                return false;
            }

        },

        /**
         * Method that overlays a "loading" pane over the given element.
         *
         * @param object args {
         *  element: mixed:  The element to cover (req'd). Can be either
         *                   an HTML element, a jquery'd element, or a jquery
         *                   selector of the element. Also allowed is an array
         *                   of elements,
         *
         *  content: string: The optional HTML content to display in the
         *                   loader. If none is provided a generic
         *                   "loading" message will be used.
         *
         *  callback:        Optional callback method to be fired on completion
         *                   of bringing up the pane
         *
         * }
         */
        showLoadingPanel: function(args) {

            // set some valid defaults.
            //
            args = $.extend({ content: null, callback: null }, args);

            // run through all the elements if this is an array of them.
            // note, the callbacks will be firing one at a time.
            // TODO: we might want to do these in bulk and have a single
            // callback later.
            //
            if ($.isArray(args.element)) {
                for (var i=0; i<args.element.length; i++) {
                    RF.UI.showLoadingPanel(args.element[i], args.content, args.callback);
                }
                return;
            }

            var e  = $(args.element)

            // nothing to do if you can't find the element.
            //
            if (e.length == 0) {
                RF.log("RF.UI.showLoadingPanel: Unable to find elment");
                return;
            }

            // pull the dimensions for the given element.
            // NOTE: there's issues here if the page hasn't fully rendered yet...
            // TODO: do we maybe want to poll the page after this to reset?
            //
            var w = e.outerWidth();
            var h = e.outerHeight();
            var o = e.offset();

            // no width, nothing to do here. 
            //
            if (w==0) 
                return;

            // check for loader.
            // NOTE: we're *NOT* resetting the content here. Maybe we should?
            //
            if (e.data('loader_id') != null) {
                var pane = $('#' + e.data('loader_id'));
                if (pane.length > 0) {

                    // just in case things have moved, reset the positioning
                    // and sizing to where the element is now.
                    //
                    pane.css({
                        top:    o.top  + 'px',
                        left:   o.left + 'px',
                        width:  e.width(),
                        height: e.height()
                    });

                    pane.fadeIn('fast', args.callback);
                    return;
                }
            }

            // create the pane and it's content.
            // TODO: do we want to jquery-ize this incoming content?
            //
            if (args.content == null) {
                content = "<h2>Loading...</h2>";
            } else {
                content = args.content;
            }

            var l = $('<div class="loader">' + content + '</div>');

            // what we're doing here now is setting a data value on the element
            // with an identifier for the tag. This allows us to put the loader
            // HTML to the bottom of the DOM, and gives us an easy way to find
            // it later to close it.
            //
            e.data('loader_id', l.getUID());

            l.css({
                top:    o.top  + 'px',
                left:   o.left + 'px',
                width:  e.width(),
                height: e.height()
            }).hide();

            // bring it into view, and fire the callback off on completion
            //
            $('body').append(l);
            l.fadeIn('fast', args.callback);
        },

        /**
         * Method that hides (and optionally removes) the loading pane.
         *
         * @param object args{
         *  element: mixed:  The element to cover (req'd). Can be either
         *                   an HTML element, a jquery'd element, or a jquery
         *                   selector of the element.
         *
         *  remove: boolean: Toggle for removing the loader from the dom on
         *                   completion. Default is true, meaning it shall be removed.
         *
         *  callback: func:  Optional callback method to be fired on completion
         *                   of bringing up the pane
         * }
         * @return void
         */
        hideLoadingPanel: function(args) {

            // provide some sane defaults.
            //
            args = $.extend({ remove: true, callback: null }, args);

            // run through all the elements if this is an array of them.
            // note, the callbacks will be firing one at a time.
            // TODO: Again, we might want to do these in bulk and have a single
            // callback later, but I'm lazy.
            //
            if ($.isArray(args.element)) {
                for (var i=0; i<args.element.length; i++) {
                    RF.UI.hideLoadingPanel({
                        element:  args.element[i],
                        remove:   args.remove,
                        callback: args.callback
                    });
                }
                return;
            }


            // look for all the exit cases first.
            //
            var e = $(args.element);
            if (e.length == 0) {
                RF.log('RF.UI.hideLoadingPanel: Unable to find element');
                return;
            }

            if (e.data('loader_id') == null) {
                RF.log('RF.UI.hideLoadingPanel: No loader_id associated with element');
                return;
            }

            var l = $('#' + e.data('loader_id'));
            if (l.length == 0) {
                RF.log('RF.UI.hideLoadingPanel: Unable to find loader ' +  e.data('loader_id'));
                return;
            }

            l.fadeOut('fast', args.callback);

            // remove the loader from the DOM, if needed.
            // TODO: this should really be moved into the callback above.
            //
            if (args.remove) {
                l.remove();
            }
        },

        // TODO: replace all calls to this with the showLoadingPanel method
        // above.
        // show/hides a loading indicator over the anchor. The anchor has to be
        // position: relative for this to work, so we set it in this function.
        loading: function(anchor, showHide) {

            // don't do this, instead do some absolute positioning based on the abs positioning of the anchor
            anchor = $(anchor).css({'position': 'relative'});

            if (!anchor || !showHide) {
                RF.log('no actions or dom to occlude, exiting early');
            }

            var loadingIndicator = anchor.find('.loading-indicator');
            if (loadingIndicator.length < 1) {
                loadingIndicator = $('<div>')
                    .addClass('loading-indicator')
                    .append($('<img src="/rf/assets/images/spinners/loader-snake-trans.gif">'))
                ;
                anchor.append(loadingIndicator);
            }

            if (showHide == 'show') {
                loadingIndicator.append().show();
            }
            else if (showHide == 'hide') {
                loadingIndicator.hide();
            }
        },

        /**
         * UI pattern for setting up infinite scrolling to a list (a la new 
         * twitter/facebook). How this works is, when the bottom of a list 
         * gets on screen we async'ly fetch more data and add it into the list. 
         * 
         * For now, this is still based on the idea of "pagination", and on 
         * appending to the list, we'll place each new "page" in a div with a
         * corresponding  'ifs_page_3' class on it.  Other forms of infinite 
         * scrolling use a "last item id" parameter, but this seemed a little 
         * easier to integrate. In the event that the list has updated, we're
         * depending on each item in the list to have a data-id attr and we'll
         * filter out dupes on the client side. 
         * 
         * There's an optional callback param, that gets called once the new
         * items are inserted into the DOM, but before the new page container
         * is visible. 
         * 
         * You can also call force_update() to, at any time, check to see 
         * if we need to fetch more data or not. (i.e. if you filter or change
         * the list size). 

         * example: var ifs = RF.UI.infiniteScroll(data);
         *          ifs.force_update();
         * 
         * And, finally, if there's no data left in the list, send down an
         * EOL: true in the json, and we'll stop fetching. 
         * 
         * @param args object { 
         *      container:       (Req'd) jQ object or selector of the list
         *      url:             (Req'd) URL to fetch new data from. Each request 
         *                       will add on a "page" param to the url.
         *                       i.e. /foo/page/ => /foo/page/2
         *      callback:        Optional callback that's fired after content is
         *                       fetched but before it's visible. 
         *      loading_content: Optional HTML content to display below the list
         *                       during loading. 
         */
        infiniteScroll: function(args) { 
             
            var container = $(args.container);

            var defaults = {
                loading_content: "<h2 class='subhead'><img src='/rf/assets/images/spinners/loader-horizontal.gif' /> &nbsp;Loading...</h2>", 
                callback:         null,
                id_attr:         "data-id"
            }

            var page  = 1;
            var EOL   = false;
            var opts  = $.extend(defaults, args);

            /**
             * The method that does the lifting. If we detect that we're in
             * range, fires off a call to get more content and appends it 
             * to the container.
             */ 
            function force_update() {

                // we're already done. 
                // 
                if (EOL) { 
                    return; 
                }

                // not there yet. 
                //
                if (container.offset().top + container.outerHeight() > $(window).scrollTop() + $(window).height()) {
                    return;
                }

                // already fetching 
                // 
                if ($('.ifs_loader').length > 0) { 
                    // RF.log("infiniteScroll: Already fetching...");
                    return;
                }

                // add in the loading content
                //
                var loader = $(opts.loading_content);
                loader.addClass('ifs_loader');
                container.append(loader);

                // increment the page we're on, and go fetch the content
                //
                page++;
                $.ajax({ 
                    url:      opts.url + page, 
                    context:  container, 
                    dataType: 'json',
                    success:  function(data) { 

                        // end of line flynn, shut it down. 
                        //
                        if (typeof(data.EOL) != 'undefined' && data.EOL) { 
                            EOL = true;
                            return;
                        }

                        // container for this page, hidden initially
                        //
                        var new_item_container = $('<div class="ifs_page_'+page+'"></div>');
                        new_item_container.hide();

                        // run through the new content and append them. 
                        //
                        $(data.content).each(function(i, e) { 
                            var item = $(e);

                            // filter out any dupes here on the client side. 
                            //
                            if (container.find("div["+opts.id_attr+"="+item.attr(opts.id_attr) + "]").length > 0) {
                                // RF.log('found duplicate, skipping');
                                return;
                            }
                            new_item_container.append(item);
                        });

                        container.append(new_item_container);

                        // if there's a callback, fire it. 
                        //
                        if ($.isFunction(opts.callback)) {
                            opts.callback.call(new_item_container, opts);
                        }

                        // we're ready, ditch the loader, show the new page. 
                        //
                        loader.remove();
                        new_item_container.show();
                        
                        // and in case *that* didn't get enough content, call it again
                        //
                        force_update();
                    } 
                });
            };
            
            // expose the force_update so callers have access to it. 
            //
            this.force_update = force_update;

            // bind the scroll method to the window.scroll event. 
            //
            $(window).scroll(force_update);
            
            // and then let's fire one off initially, in the event it's a short 
            // page. 
            //
            force_update();
            return this;
        }, 

        /**
         * UI for generating a tool tip.
         *
         * Usage: var t = new RF.UI.tooltip({element: $('#foo'),
         *                                   content: 'I LIKE TURTLES'});
         *
         * @param args object {
         *     element:     The selector or element that triggers the hover
         *     content:     A string of HTML content that displays in the tooltip
         *     source:      An (optional) HTML element to get pulled out of the DOM
         *                  and placed into the tooltip.
         *     hover_time:  Seconds the tip should stay visible after mouseout 
         *                  (in ms). 
         * }
         * @return void
         */
        tooltip: function(args) {
            var hover_time = 330; 
            var timeout, content, tip;
            var element = $(args.element);

            if (element.length == 0) {
                RF.log("Unable to find element " + args.element);
                return;
            }

            // now get the content. If it's from a source element, we'll yank
            // it out of the DOM and display it...
            //
            if (typeof(args.source) != 'undefined') {
                var content_e = $(args.source);
                content = content_e.clone();
                content_e.remove();
            } else {
                content = args.content;
            }

            // set the timeout length, if it was passed in. 
            //
            if (typeof(args.hover_time) != 'undefined') { 
                hover_time = args.hover_time;
            }
            
            // the tooltip node. 
            //
            tip = $("<div class='tooltip'></div>");

            // sometimes the content is text, sometimes it's markup. Sometimes
            // we need to pass forward the wide class. 
            //
            var jq_content = $(content);
            if (jq_content.length > 0 && jq_content.hasClass('wide')) { 
                tip.addClass('wide');
            }

            // hide it and shove it in the DOM
            //
            tip.html(content).hide();
            $('body').append(tip);
            
            // the common close method. 
            //
            function close_tooltip(e) { 
                timeout = setTimeout(function() {
                    tip.fadeOut('fast');
                }, hover_time);
            }
            
            // wire up the hovering on the element
            //
            element.hover(function(e) {
                clearTimeout(timeout);
                var a = $(this);
                tip.css({
                    position: 'absolute',
                    top:  a.offset().top + a.height() - 15,
                    left: a.offset().left + a.width() - 5
                }).fadeIn('fast');

                var tipLeft      = tip.offset().left;
                var tipRightEdge = tipLeft + tip.outerWidth();

                if (tipRightEdge > $(window).width()) {
                    tip.css({ left: tipLeft - ( tipRightEdge - $(window).width()) });
                }

            }, function(e) {
                close_tooltip(e);
            });

            // and extend the close on mouse out of the tip
            // (and delay it on mousenter)
            //
            tip.mouseout(function(e) {
                close_tooltip(e);
            }).mouseenter(function(e) { 
                clearTimeout(timeout);
            });
        },

        /**
         * the on-hover actions mechanism, args is a named-arguments hash:
         * args: {
         *    'anchor': $('div.someDivWithRelativePosition'),
         *    'actions': {
         *        'edit': function() { doSomeEditing(); },
         *        'delete': function() { doSomeDeleting(); }
         *    },
         *    'position': {
         *        // can put any combination of 'top', 'left', 'bottom', 'right'. default is bottom right, 5px
         *        'bottom': '5px',
         *        'right': '5px',
         *    }
         * }
         * or you can call it with { anchor: someElement, remove: true } to turn them off.
         */
        hoverActions: function(args) {
            if (!args.anchor) {
                RF.log('no anchor... quitting early');
            }

            var anchor = $(args.anchor);
            var actions = args.actions;
            var position = args.position;

            if (args.remove) {
                anchor.find('.hover-actions').remove();
                return;
            }

            // check if this anchor already has some actions DOM, in which
            // case we'll just update that one.
            var actionsDOM = anchor.find('.hover-actions');
            if (actionsDOM.length < 1) {
                actionsDOM = $('<div>').addClass('hover-actions');
                anchor.append(actionsDOM);
            }

            // clear out old actions, put in new put in the actions
            actionsDOM.empty();
            for (var actionName in actions) {
                actionsDOM.append(
                    $('<span>')
                        .addClass('small button action')
                        .text(actionName)
                        .click(actions[actionName])
                );
            }

            // set the position, using default if none passed in
            if (!position) {
                position = {
                    'bottom': '5px',
                    'right': '5px'
                };
            }
            actionsDOM.css(position);

            anchor.hover(
                function() { anchor.addClass('hover'); actionsDOM.show(); },
                function() { anchor.removeClass('hover'); actionsDOM.hide(); }
            );

        }, 

        /**
         * UI tool for keeping the header portion of the table fixed, as the table
         * scrolls down. It works by making a copy of the thead portion of the table,
         * and positioning it fixed at the top of the DOM. 
         * 
         * I've also written this to play nice with the tablesort plugin. 
         * 
         * @param table: Either a selector, or a table element
         */
        FixedTable: function(table) { 
            var table = $(table); 
            
            var fixed_table = table.find('thead'); 
            var cloned      = table.clone().empty();
            var width       = table.outerWidth();

            // NOTE: the rows are getting fixed here, so they shan't resize after this. 
            //
            fixed_table.find('th').each(function(i, e) { 
                $(e).css({width: $(e).width()}).getUID();
            });

            // position the fixed tableheader
            //
            cloned.addClass("fixedtableheader").css({
                "position": "fixed",
                "top":      "0",
                "left":     table.offset().left
            }).append(fixed_table.clone()).width(width).hide().appendTo($("body"));

            // store these
            //
            var cloned_th = cloned.find('th');
            var source_th = fixed_table.find('th'); 

            // we want to carry the click event back over to the source TH. 
            //
            cloned_th.each(function(i, e) { 
                var th = $(e);
                var id = th.attr('id');
                th.attr({"id": '', 
                         "data-orig-id": id});

                th.click(function(e) { 
                    $('#' + id).trigger('click');
                });
            });

            // we're going to bind to the tablesorter sortEnd event, to repaint
            // the CSS from all the source TH's to the copied ones. 
            //
            table.bind({sortEnd: function() { 
                cloned_th.each(function(i, e) { 
                    $(cloned_th.get(i)).attr('class', $(source_th.get(i)).attr('class'));
                });
            }});

            // hook up the scrolling mechanism. 
            //
            $(window).scroll(function() {
                if ($.browser.msie && $.browser.version == "6.0") {
                        cloned.css({
                        "position": "absolute",
                        "top":      $(window).scrollTop(),
                        "left":     table.offset().left
                    });
                } else { 
                    cloned.css({
                        "position": "fixed",
                        "top":      "0",
                        "left":     table.offset().left - $(window).scrollLeft()
                    });
                }

                var scroll_top  = $(window).scrollTop();
                var element_top = (fixed_table.length) ? fixed_table.offset().top : 0;
                if (scroll_top > element_top && scroll_top <= (element_top + table.height() - fixed_table.height())) { 
                    cloned.show();
                } else {
                    cloned.hide();
                }
            });
        },

        /**
         *  Similar to the FixedTable widget, this takes any element and fixes it to the top.
         *  An optional hash allows finer CSS positioning when more than one element is positioned
         */
        ScrollFix: function (el, args) {
            var el = $(el);
            var css = args || {};
            var cloned = el.clone();
            if (cloned.attr("id")) {
                cloned.attr({"id": "", "data-orig-id": el.attr("id")});
                cloned.addClass(el.attr('id'));
            }
            cloned.addClass('scrollfix');
            cloned.find('*').each(function (i, e) {
                var e = $(e);
                if (e.attr("id")) {
                    e.addClass(e.attr("id"));
                    e.attr({"id": ""});
                }
            });

            if (!css.width) { css.width = el.parent().width(); }
            if (!css.top) { css.top = 0; }
            cloned.css(css).hide().appendTo($('body'));
            $(window).scroll(function () {
                if ($.browser.msie && $.browser.version == "6.0") {
                    cloned.css({
                        "position": "absolute",
                        "top":      $(window).scrollTop() - el.parent().scrollTop() + css.top,
                        "left":     el.offset().left
                    });
                } else { 
                    cloned.css({
                        "position": "fixed",
                        "top":      css.top,
                        "left":     el.offset().left - $(window).scrollLeft()
                    });
                }

                var scroll_top  = $(window).scrollTop();
                var element_top = el.offset().top;
                if (scroll_top > (element_top - css.top)) {
                    cloned.show();
                } else {
                    cloned.hide();
                }
            });
        }
    },
    Form: {
        
        /**
         * Setup for the form object. 
         */
        init: function() { 

            // first, let's setup any filter checkbox controls. 
            //
            $('.filter_checkbox_control').each(function(i, e) { 
                var container = $(e); 

                // setup a behavior on change of the inputs
                // When the 'all' item is checked, have it turn on all of them. Likewise, 
                // when 'all' is unchecked, let's turn everything off...
                //
                $('.all', container).change(function(e) {
                    var all = $(this);
                    if (all.is(':checked')) { 
                        container.find('input[type=checkbox]').each(function(i, e) {
                            $(e).attr('checked', 'checked');
                        });
                    } else { 
                        container.find('input[type=checkbox]').each(function(i, e) {
                            $(e).attr('checked', false);
                        });
                    }
                });

                // and, if any of the others get turned off, then let's turn off all
                //
                container.find('input[type=checkbox]').change(function(e) {
                    if (!$(this).is(':checked')) { 
                        container.find('.all').attr('checked', false);
                    }
                });
                
            });
        }
    }
}

/**
 * Handle the delayed routines
 */
RF.UI.deferred_queue.push(function(context) { 

    var has_context = false;

    // set the context in an object literal for the tabs...
    //
    if (typeof(context) == 'undefined') {
        context = $('body');
        RF.UI.tabs.init();
    } else { 
        RF.UI.tabs.init({context: context});
        has_context = true;
    }

    // initialize the panels. 
    //
    RF.UI.panel.init(context);

    // wire up any other meters
    //
    context.find('.match-meter').each(function(i, e) {
        var meter  = $(e);
        if (!RF.UI.checkInit(meter. has_context))
            return;
        var pct    = meter.attr('data-match-score');
        var bar    = meter.find('.inner-bar');
        var carrot = meter.find('.carrot');
        var offset = (bar.width() * (pct *.01));
        carrot.animate({left: Math.round(offset)});
        RF.UI.setInit(meter);
    });

    // zebra stripe any of the "listing" tables. 
    //
    context.find("table.listing tr:nth-child(odd)").addClass("odd");

    // progress meters
    //
    context.find('div.progress').each(function(i, e) {
        var prog  = $(this);
        if (!RF.UI.checkInit(prog, has_context))
            return;
        var pct   = prog.attr('data-req-percent');
        var inner = prog.find('.inner');
        var bar   = prog.find('.bar').animate({
            width:  inner.width() * (pct * .01)
        });
        RF.UI.setInit(prog);
    });
});




/**
 *  Modal dialog opener. Note that anything in the content with a rel="close" 
 *  will be wired up to close the modal, and pass in whatever "return" value the same
 *  element has to the onClose hook.
 *  @param args map: {
 *      'content': Any argument to $() that will work inside an append(),
 *                 e.g. '#some-id', '.some-class', or '<div>blah</div>'
 *                 NOTE: any content in the container that has the
 *                 attribute rel="close" will get auto-wired up to close
 *                 the modal.
 *
 *      'onShow':  Function that's run after the modal is shown.
 *
 *      'onClose': Function that's run when the user tries to close the modal. If it returns false, modal doesn't close. 
 *                 IMPORTANT: if nothing/null is returned, the modal WILL close.
 *
 *      'event':   Triggering event that opened the modal
 * 
 *      'closable': When set to false, will omit the closer
 *
 *      'skin': A css class to use for style overriding 
 *      
 *      'top': A pixel value to use instead of vertical centering
 *
 *      'left': A pixel value to use instead of horizontal centering 
 *  }
 */

RF.modal = {
    
    is_open: false,

    hooks: {
        'onShow': 'run when the modal finishes loading',
        'onClose': 'run when the modal is closed'
    },
    
    defaults: {
        skin: 'simple',
        top: null,
        left: null,
        closable: true,
        resizeable: true,
        absolutePosition: false,
        minWidth: 0,
        minHeight: 0
    },
    
    // Gets set with arguments passed in to open()
    settings: {},
     
    open: function(args) {

        var rfModal = this;

        for (var event in this.hooks) {
            this[event] = (typeof(args[event]) == 'function' ? args[event] : function() {});
        }
        
        // Merge args passed in with the defaults
        this.settings = $.extend({}, this.defaults, args);

        // Make the overlay div if it doesn't exist already
        if (this.overlay == null) {
            this.overlay = $('<div>').addClass("overlay");
            $('body').append(this.overlay);
        }

        // make the scaffolding modal if it doesn't exist
        if (this.scaffolding == null) {
            this.scaffolding = $('<div>').addClass('modal-scaffolding modal ' + this.settings.skin);
            $('body').append(this.scaffolding);
        }

        // make the closing button if it doesn't exist
        if (this.settings.closable) {
            this.closer = $('<div>').addClass("modal-closer").attr('title', "Close");
            this.scaffolding.append(this.closer);
            this.closer.click(function() { rfModal.close(); });
        }

        if (this.content_area == null) { 
            // now let's set the content area up. This will be where we put
            // the content
            this.content_area = $('<div class="modal-content"></div>');
            this.scaffolding.append(this.content_area);
        }

        // jquery-ize the content.
        this.content = $(this.settings.content);

        // place the content into the scaffolding
        // We're doing this inside the content_area now so we don't
        // blow away the close controls on re-use
        this.content_area.html(this.content);
        this.center();

        // Hide any flash chunks on the page
        $('object').css('visibility', 'hidden');
        $('.modal-scaffolding object').css('visibility', 'visible');

        // let's run through anything in the content area with a rel="close"
        // and attach the close event to it if we haven't already
        var closeBtns = $('.modal-content [rel=close]');
        closeBtns.each(function(key, val) {
            var close = $(val);
            close.click(function(e) {
                RF.modal.close(e, close.attr('return'));
                if (e) {
                    e.preventDefault();
                }
            });
        });


        // show everything.
        this.overlay.fadeIn(250);
        this.scaffolding.fadeIn(250, function() {
            rfModal.onShow.apply();

            // if we're passing a group of elements including text-nodes
            // then this will actually fail.
            // TODO: begs the question of, do we need to do this?
            //
            try { rfModal.content.show(); } catch(ex) { RF.log(ex); }

            rfModal.center();
        });

        $(window).resize(function() { 
            if (RF.modal.is_open && RF.modal.settings.resizeable) {
                RF.modal.center();
            }
        });

        // Close the modal if the ESC key is pressed
        $(document).keydown(function(e) {
            if (e.keyCode === 27) {
                e.preventDefault();
                rfModal.close();
                
                $(this).unbind(e);
            }
        });

        if (args.event) {
            args.event.preventDefault();
        }
        
        this.is_open = true;
    },

    // separate function to calc the width of the modal and re-center,
    // so it can be used in caller code to be used after events (e.g. ajax request)
    center: function() {

        if (!this.scaffolding) {
            return;
        }

        var widthPadding = 20;
        var heightPadding = 100;

        // if too wide, shrink
        if (this.scaffolding.outerWidth() > $(window).width()) {
            this.scaffolding.width($(window).width() - widthPadding);
        }

        if (this.scaffolding.outerHeight() > $(window).height()) {
            this.scaffolding.height($(window).height() - heightPadding);
        }

        if (this.settings.minWidth > 0 && this.scaffolding.width() < this.settings.minWidth) { 
            this.scaffolding.width(this.settings.minWidth);
        }

        if (this.settings.minHeight > 0 && this.scaffolding.height() < this.settings.minHeight) { 
            this.scaffolding.height(this.settings.minHeight);
        }
        
        // Use positioning settings if passed in
        var topVal = this.settings.top || (($(window).height() / 2) - (this.scaffolding.outerHeight() / 2));
        var leftVal = this.settings.left || (($(window).width() / 2) - (this.scaffolding.width() / 2));

        if (topVal < 10) topVal = 10;
        if (leftVal < 10) leftVal = 10;

        this.scaffolding.css({
            'top': topVal,
            'left': leftVal,
            'z-index': this.overlay.css('z-index') + 1,
            'position': (this.settings.absolutePosition) ? 'absolute' : 'fixed'
        });


        if (this.settings.closable) { 
            this.closer.css('z-index', this.scaffolding.css('z-index') + 1);
        }
    },

    /**
     * Swaps out content without closing and reopening
     *
     * @param content - Jqueryized html elements
     * @return void
     */
    update_content: function(content){
        this.content_area.empty();
        this.content_area.append(content);
        this.center();
    },

    /**
     * Closes the currently opened modal
     *
     * @param e the click event
     * @return void
     */
    close: function(e, returnVal) {

        // don't barf, no matter what.
        try {
            var self = this;

            // the onClose hook needs to explicitly return false to cancel closing,
            // this is because historically the onClose hook didn't have this ability.
            // Ergo, all uses of the onClose hook didn't return anything, and just testing
            // for the truth value of void would end up returning false, so we triple-equals false.
            returnVal = this.onClose.apply(this, [returnVal]);
            if (returnVal === false) {
                return;
            }

            if (this.settings.closable) {
                this.closer.fadeOut(200);
            }

            this.scaffolding.fadeOut(200);
            this.overlay.fadeOut(200, function() {

                // Null out objects since js in ajaxed-in content wasn't
                // being parsed with multiple modal calls on one page
                self.closer = null;
                self.scaffolding = null;
                self.content = null;
                self.content_area = null;

                $('.modal-scaffolding').remove();


                // Show any previously-hidden flash chunks
                $('object').css('visibility', 'visible');
            });
            
            this.is_open = false;
        } catch (ex) {
            RF.log(ex);
        }
        if (e) {
            e.preventDefault();
        }
    }
};


$('document').ready(function () {

    // This goes first because we want the GA click handler to be registered first
    RF.initAnalytics();

    // fire off the RF.UI.init on ready...
    RF.UI.init();

    // Click event for success/warning/error alert boxes
    $('a.alert-close').live('click', function(e) {
        $(this).parent().fadeOut(200);
        e.preventDefault();
    });
    
    // notifications...
    $('a#message_link.notifications').click(function(e) {
        $.ajax({
            'url': '/rf/community/getFeedItemNotifications',
            'type': 'POST',
            'dataType': 'html',
            'data': null,
            'success': function(response) {
                
                var h = $('#header .user-controls');
                var nt = $('div#feed-item-notifications');
                var h_offset = h.offset();
                nt.attr('left', h_offset.left);
                nt.show();
                nt.html(response);
                $('#header #message_link .new-indicator').remove();
                $('body').click(function(e) {
                    nt.hide();
                   $('body').unbind('click'); 
                });
            }
        });
        e.preventDefault();
    });
    
});

RF.init();

/**
 * Additions to jquery
 * TODO: should these be here, in separate files?
 *
 */

/**
 * getUID:
 * Generates a unique ID on a given jquery-ized element
 *
 * $('#has-id').getUID()  => "has-id"
 * $('<div>').getUID()    =>  sets id attribute to "jQ-uid-1" and returns it
 *
 * @return string the ID of the element
 */
(function($) {
    var uid = 0;
    $.getUID = function() {
        uid++;
        return 'jQ-uid-'+uid;
    };

    $.fn.getUID = function() {
        if(!this.length) {
            return 0;
        }
        var fst = this.first(), id = fst.attr('id');
        if(!id) {
            id = $.getUID();
            fst.attr('id', id);
        }
        return id;
    }
})(jQuery);

/**
 * extend jquery to have an onPressEnter event.
 */
$.fn.onPressEnter = function(x) {
    return this.each(function() {
        $(this).keyup(function(e) {
            if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
                x.apply(e.target, [e, $(this)]);
                e.preventDefault();
                return false;
            }
            else {
                return true;
            }
        });
    });
};


