/*
 * jQuery JavaScript Library v1.3.2
 * http://jquery.com/
 *
 * Copyright (c) 2009 John Resig
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 *
 * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
 * Revision: 6246
 */
(function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(F))}var E="";o.each(F||this,function(){o.each(this.childNodes,function(){if(this.nodeType!=8){E+=this.nodeType!=1?this.nodeValue:o.fn.text([this])}})});return E},wrapAll:function(E){if(this[0]){var F=o(E,this[0].ownerDocument).clone();if(this[0].parentNode){F.insertBefore(this[0])}F.map(function(){var G=this;while(G.firstChild){G=G.firstChild}return G}).append(this)}return this},wrapInner:function(E){return this.each(function(){o(this).contents().wrapAll(E)})},wrap:function(E){return this.each(function(){o(this).wrapAll(E)})},append:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.appendChild(E)}})},prepend:function(){return this.domManip(arguments,true,function(E){if(this.nodeType==1){this.insertBefore(E,this.firstChild)}})},before:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this)})},after:function(){return this.domManip(arguments,false,function(E){this.parentNode.insertBefore(E,this.nextSibling)})},end:function(){return this.prevObject||o([])},push:[].push,sort:[].sort,splice:[].splice,find:function(E){if(this.length===1){var F=this.pushStack([],"find",E);F.length=0;o.find(E,this[0],F);return F}else{return this.pushStack(o.unique(o.map(this,function(G){return o.find(E,G)})),"find",E)}},clone:function(G){var E=this.map(function(){if(!o.support.noCloneEvent&&!o.isXMLDoc(this)){var I=this.outerHTML;if(!I){var J=this.ownerDocument.createElement("div");J.appendChild(this.cloneNode(true));I=J.innerHTML}return o.clean([I.replace(/ jQuery\d+="(?:\d+|null)"/g,"").replace(/^\s*/,"")])[0]}else{return this.cloneNode(true)}});if(G===true){var H=this.find("*").andSelf(),F=0;E.find("*").andSelf().each(function(){if(this.nodeName!==H[F].nodeName){return}var I=o.data(H[F],"events");for(var K in I){for(var J in I[K]){o.event.add(this,K,I[K][J],I[K][J].data)}}F++})}return E},filter:function(E){return this.pushStack(o.isFunction(E)&&o.grep(this,function(G,F){return E.call(G,F)})||o.multiFilter(E,o.grep(this,function(F){return F.nodeType===1})),"filter",E)},closest:function(E){var G=o.expr.match.POS.test(E)?o(E):null,F=0;return this.map(function(){var H=this;while(H&&H.ownerDocument){if(G?G.index(H)>-1:o(H).is(E)){o.data(H,"closest",F);return H}H=H.parentNode;F++}})},not:function(E){if(typeof E==="string"){if(f.test(E)){return this.pushStack(o.multiFilter(E,this,true),"not",E)}else{E=o.multiFilter(E,this)}}var F=E.length&&E[E.length-1]!==g&&!E.nodeType;return this.filter(function(){return F?o.inArray(this,E)<0:this!=E})},add:function(E){return this.pushStack(o.unique(o.merge(this.get(),typeof E==="string"?o(E):o.makeArray(E))))},is:function(E){return !!E&&o.multiFilter(E,this).length>0},hasClass:function(E){return !!E&&this.is("."+E)},val:function(K){if(K===g){var E=this[0];if(E){if(o.nodeName(E,"option")){return(E.attributes.value||{}).specified?E.value:E.text}if(o.nodeName(E,"select")){var I=E.selectedIndex,L=[],M=E.options,H=E.type=="select-one";if(I<0){return null}for(var F=H?I:0,J=H?I+1:M.length;F<J;F++){var G=M[F];if(G.selected){K=o(G).val();if(H){return K}L.push(K)}}return L}return(E.value||"").replace(/\r/g,"")}return g}if(typeof K==="number"){K+=""}return this.each(function(){if(this.nodeType!=1){return}if(o.isArray(K)&&/radio|checkbox/.test(this.type)){this.checked=(o.inArray(this.value,K)>=0||o.inArray(this.name,K)>=0)}else{if(o.nodeName(this,"select")){var N=o.makeArray(K);o("option",this).each(function(){this.selected=(o.inArray(this.value,N)>=0||o.inArray(this.text,N)>=0)});if(!N.length){this.selectedIndex=-1}}else{this.value=K}}})},html:function(E){return E===g?(this[0]?this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g,""):null):this.empty().append(E)},replaceWith:function(E){return this.after(E).remove()},eq:function(E){return this.slice(E,+E+1)},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments),"slice",Array.prototype.slice.call(arguments).join(","))},map:function(E){return this.pushStack(o.map(this,function(G,F){return E.call(G,F,G)}))},andSelf:function(){return this.add(this.prevObject)},domManip:function(J,M,L){if(this[0]){var I=(this[0].ownerDocument||this[0]).createDocumentFragment(),F=o.clean(J,(this[0].ownerDocument||this[0]),I),H=I.firstChild;if(H){for(var G=0,E=this.length;G<E;G++){L.call(K(this[G],H),this.length>1||G>0?I.cloneNode(true):I)}}if(F){o.each(F,z)}}return this;function K(N,O){return M&&o.nodeName(N,"table")&&o.nodeName(O,"tr")?(N.getElementsByTagName("tbody")[0]||N.appendChild(N.ownerDocument.createElement("tbody"))):N}}};o.fn.init.prototype=o.fn;function z(E,F){if(F.src){o.ajax({url:F.src,async:false,dataType:"script"})}else{o.globalEval(F.text||F.textContent||F.innerHTML||"")}if(F.parentNode){F.parentNode.removeChild(F)}}function e(){return +new Date}o.extend=o.fn.extend=function(){var J=arguments[0]||{},H=1,I=arguments.length,E=false,G;if(typeof J==="boolean"){E=J;J=arguments[1]||{};H=2}if(typeof J!=="object"&&!o.isFunction(J)){J={}}if(I==H){J=this;--H}for(;H<I;H++){if((G=arguments[H])!=null){for(var F in G){var K=J[F],L=G[F];if(J===L){continue}if(E&&L&&typeof L==="object"&&!L.nodeType){J[F]=o.extend(E,K||(L.length!=null?[]:{}),L)}else{if(L!==g){J[F]=L}}}}}return J};var b=/z-?index|font-?weight|opacity|zoom|line-?height/i,q=document.defaultView||{},s=Object.prototype.toString;o.extend({noConflict:function(E){l.$=p;if(E){l.jQuery=y}return o},isFunction:function(E){return s.call(E)==="[object Function]"},isArray:function(E){return s.call(E)==="[object Array]"},isXMLDoc:function(E){return E.nodeType===9&&E.documentElement.nodeName!=="HTML"||!!E.ownerDocument&&o.isXMLDoc(E.ownerDocument)},globalEval:function(G){if(G&&/\S/.test(G)){var F=document.getElementsByTagName("head")[0]||document.documentElement,E=document.createElement("script");E.type="text/javascript";if(o.support.scriptEval){E.appendChild(document.createTextNode(G))}else{E.text=G}F.insertBefore(E,F.firstChild);F.removeChild(E)}},nodeName:function(F,E){return F.nodeName&&F.nodeName.toUpperCase()==E.toUpperCase()},each:function(G,K,F){var E,H=0,I=G.length;if(F){if(I===g){for(E in G){if(K.apply(G[E],F)===false){break}}}else{for(;H<I;){if(K.apply(G[H++],F)===false){break}}}}else{if(I===g){for(E in G){if(K.call(G[E],E,G[E])===false){break}}}else{for(var J=G[0];H<I&&K.call(J,H,J)!==false;J=G[++H]){}}}return G},prop:function(H,I,G,F,E){if(o.isFunction(I)){I=I.call(H,F)}return typeof I==="number"&&G=="curCSS"&&!b.test(E)?I+"px":I},className:{add:function(E,F){o.each((F||"").split(/\s+/),function(G,H){if(E.nodeType==1&&!o.className.has(E.className,H)){E.className+=(E.className?" ":"")+H}})},remove:function(E,F){if(E.nodeType==1){E.className=F!==g?o.grep(E.className.split(/\s+/),function(G){return !o.className.has(F,G)}).join(" "):""}},has:function(F,E){return F&&o.inArray(E,(F.className||F).toString().split(/\s+/))>-1}},swap:function(H,G,I){var E={};for(var F in G){E[F]=H.style[F];H.style[F]=G[F]}I.call(H);for(var F in G){H.style[F]=E[F]}},css:function(H,F,J,E){if(F=="width"||F=="height"){var L,G={position:"absolute",visibility:"hidden",display:"block"},K=F=="width"?["Left","Right"]:["Top","Bottom"];function I(){L=F=="width"?H.offsetWidth:H.offsetHeight;if(E==="border"){return}o.each(K,function(){if(!E){L-=parseFloat(o.curCSS(H,"padding"+this,true))||0}if(E==="margin"){L+=parseFloat(o.curCSS(H,"margin"+this,true))||0}else{L-=parseFloat(o.curCSS(H,"border"+this+"Width",true))||0}})}if(H.offsetWidth!==0){I()}else{o.swap(H,G,I)}return Math.max(0,Math.round(L))}return o.curCSS(H,F,J)},curCSS:function(I,F,G){var L,E=I.style;if(F=="opacity"&&!o.support.opacity){L=o.attr(E,"opacity");return L==""?"1":L}if(F.match(/float/i)){F=w}if(!G&&E&&E[F]){L=E[F]}else{if(q.getComputedStyle){if(F.match(/float/i)){F="float"}F=F.replace(/([A-Z])/g,"-$1").toLowerCase();var M=q.getComputedStyle(I,null);if(M){L=M.getPropertyValue(F)}if(F=="opacity"&&L==""){L="1"}}else{if(I.currentStyle){var J=F.replace(/\-(\w)/g,function(N,O){return O.toUpperCase()});L=I.currentStyle[F]||I.currentStyle[J];if(!/^\d+(px)?$/i.test(L)&&/^\d/.test(L)){var H=E.left,K=I.runtimeStyle.left;I.runtimeStyle.left=I.currentStyle.left;E.left=L||0;L=E.pixelLeft+"px";E.left=H;I.runtimeStyle.left=K}}}}return L},clean:function(F,K,I){K=K||document;if(typeof K.createElement==="undefined"){K=K.ownerDocument||K[0]&&K[0].ownerDocument||document}if(!I&&F.length===1&&typeof F[0]==="string"){var H=/^<(\w+)\s*\/?>$/.exec(F[0]);if(H){return[K.createElement(H[1])]}}var G=[],E=[],L=K.createElement("div");o.each(F,function(P,S){if(typeof S==="number"){S+=""}if(!S){return}if(typeof S==="string"){S=S.replace(/(<(\w+)[^>]*?)\/>/g,function(U,V,T){return T.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?U:V+"></"+T+">"});var O=S.replace(/^\s+/,"").substring(0,10).toLowerCase();var Q=!O.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!O.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||O.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!O.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!O.indexOf("<td")||!O.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!O.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||!o.support.htmlSerialize&&[1,"div<div>","</div>"]||[0,"",""];L.innerHTML=Q[1]+S+Q[2];while(Q[0]--){L=L.lastChild}if(!o.support.tbody){var R=/<tbody/i.test(S),N=!O.indexOf("<table")&&!R?L.firstChild&&L.firstChild.childNodes:Q[1]=="<table>"&&!R?L.childNodes:[];for(var M=N.length-1;M>=0;--M){if(o.nodeName(N[M],"tbody")&&!N[M].childNodes.length){N[M].parentNode.removeChild(N[M])}}}if(!o.support.leadingWhitespace&&/^\s/.test(S)){L.insertBefore(K.createTextNode(S.match(/^\s*/)[0]),L.firstChild)}S=o.makeArray(L.childNodes)}if(S.nodeType){G.push(S)}else{G=o.merge(G,S)}});if(I){for(var J=0;G[J];J++){if(o.nodeName(G[J],"script")&&(!G[J].type||G[J].type.toLowerCase()==="text/javascript")){E.push(G[J].parentNode?G[J].parentNode.removeChild(G[J]):G[J])}else{if(G[J].nodeType===1){G.splice.apply(G,[J+1,0].concat(o.makeArray(G[J].getElementsByTagName("script"))))}I.appendChild(G[J])}}return E}return G},attr:function(J,G,K){if(!J||J.nodeType==3||J.nodeType==8){return g}var H=!o.isXMLDoc(J),L=K!==g;G=H&&o.props[G]||G;if(J.tagName){var F=/href|src|style/.test(G);if(G=="selected"&&J.parentNode){J.parentNode.selectedIndex}if(G in J&&H&&!F){if(L){if(G=="type"&&o.nodeName(J,"input")&&J.parentNode){throw"type property can't be changed"}J[G]=K}if(o.nodeName(J,"form")&&J.getAttributeNode(G)){return J.getAttributeNode(G).nodeValue}if(G=="tabIndex"){var I=J.getAttributeNode("tabIndex");return I&&I.specified?I.value:J.nodeName.match(/(button|input|object|select|textarea)/i)?0:J.nodeName.match(/^(a|area)$/i)&&J.href?0:g}return J[G]}if(!o.support.style&&H&&G=="style"){return o.attr(J.style,"cssText",K)}if(L){J.setAttribute(G,""+K)}var E=!o.support.hrefNormalized&&H&&F?J.getAttribute(G,2):J.getAttribute(G);return E===null?g:E}if(!o.support.opacity&&G=="opacity"){if(L){J.zoom=1;J.filter=(J.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(K)+""=="NaN"?"":"alpha(opacity="+K*100+")")}return J.filter&&J.filter.indexOf("opacity=")>=0?(parseFloat(J.filter.match(/opacity=([^)]*)/)[1])/100)+"":""}G=G.replace(/-([a-z])/ig,function(M,N){return N.toUpperCase()});if(L){J[G]=K}return J[G]},trim:function(E){return(E||"").replace(/^\s+|\s+$/g,"")},makeArray:function(G){var E=[];if(G!=null){var F=G.length;if(F==null||typeof G==="string"||o.isFunction(G)||G.setInterval){E[0]=G}else{while(F){E[--F]=G[F]}}}return E},inArray:function(G,H){for(var E=0,F=H.length;E<F;E++){if(H[E]===G){return E}}return -1},merge:function(H,E){var F=0,G,I=H.length;if(!o.support.getAll){while((G=E[F++])!=null){if(G.nodeType!=8){H[I++]=G}}}else{while((G=E[F++])!=null){H[I++]=G}}return H},unique:function(K){var F=[],E={};try{for(var G=0,H=K.length;G<H;G++){var J=o.data(K[G]);if(!E[J]){E[J]=true;F.push(K[G])}}}catch(I){F=K}return F},grep:function(F,J,E){var G=[];for(var H=0,I=F.length;H<I;H++){if(!E!=!J(F[H],H)){G.push(F[H])}}return G},map:function(E,J){var F=[];for(var G=0,H=E.length;G<H;G++){var I=J(E[G],G);if(I!=null){F[F.length]=I}}return F.concat.apply([],F)}});var C=navigator.userAgent.toLowerCase();o.browser={version:(C.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[0,"0"])[1],safari:/webkit/.test(C),opera:/opera/.test(C),msie:/msie/.test(C)&&!/opera/.test(C),mozilla:/mozilla/.test(C)&&!/(compatible|webkit)/.test(C)};o.each({parent:function(E){return E.parentNode},parents:function(E){return o.dir(E,"parentNode")},next:function(E){return o.nth(E,2,"nextSibling")},prev:function(E){return o.nth(E,2,"previousSibling")},nextAll:function(E){return o.dir(E,"nextSibling")},prevAll:function(E){return o.dir(E,"previousSibling")},siblings:function(E){return o.sibling(E.parentNode.firstChild,E)},children:function(E){return o.sibling(E.firstChild)},contents:function(E){return o.nodeName(E,"iframe")?E.contentDocument||E.contentWindow.document:o.makeArray(E.childNodes)}},function(E,F){o.fn[E]=function(G){var H=o.map(this,F);if(G&&typeof G=="string"){H=o.multiFilter(G,H)}return this.pushStack(o.unique(H),E,G)}});o.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(E,F){o.fn[E]=function(G){var J=[],L=o(G);for(var K=0,H=L.length;K<H;K++){var I=(K>0?this.clone(true):this).get();o.fn[F].apply(o(L[K]),I);J=J.concat(I)}return this.pushStack(J,E,G)}});o.each({removeAttr:function(E){o.attr(this,E,"");if(this.nodeType==1){this.removeAttribute(E)}},addClass:function(E){o.className.add(this,E)},removeClass:function(E){o.className.remove(this,E)},toggleClass:function(F,E){if(typeof E!=="boolean"){E=!o.className.has(this,F)}o.className[E?"add":"remove"](this,F)},remove:function(E){if(!E||o.filter(E,[this]).length){o("*",this).add([this]).each(function(){o.event.remove(this);o.removeData(this)});if(this.parentNode){this.parentNode.removeChild(this)}}},empty:function(){o(this).children().remove();while(this.firstChild){this.removeChild(this.firstChild)}}},function(E,F){o.fn[E]=function(){return this.each(F,arguments)}});function j(E,F){return E[0]&&parseInt(o.curCSS(E[0],F,true),10)||0}var h="jQuery"+e(),v=0,A={};o.extend({cache:{},data:function(F,E,G){F=F==l?A:F;var H=F[h];if(!H){H=F[h]=++v}if(E&&!o.cache[H]){o.cache[H]={}}if(G!==g){o.cache[H][E]=G}return E?o.cache[H][E]:H},removeData:function(F,E){F=F==l?A:F;var H=F[h];if(E){if(o.cache[H]){delete o.cache[H][E];E="";for(E in o.cache[H]){break}if(!E){o.removeData(F)}}}else{try{delete F[h]}catch(G){if(F.removeAttribute){F.removeAttribute(h)}}delete o.cache[H]}},queue:function(F,E,H){if(F){E=(E||"fx")+"queue";var G=o.data(F,E);if(!G||o.isArray(H)){G=o.data(F,E,o.makeArray(H))}else{if(H){G.push(H)}}}return G},dequeue:function(H,G){var E=o.queue(H,G),F=E.shift();if(!G||G==="fx"){F=E[0]}if(F!==g){F.call(H)}}});o.fn.extend({data:function(E,G){var H=E.split(".");H[1]=H[1]?"."+H[1]:"";if(G===g){var F=this.triggerHandler("getData"+H[1]+"!",[H[0]]);if(F===g&&this.length){F=o.data(this[0],E)}return F===g&&H[1]?this.data(H[0]):F}else{return this.trigger("setData"+H[1]+"!",[H[0],G]).each(function(){o.data(this,E,G)})}},removeData:function(E){return this.each(function(){o.removeData(this,E)})},queue:function(E,F){if(typeof E!=="string"){F=E;E="fx"}if(F===g){return o.queue(this[0],E)}return this.each(function(){var G=o.queue(this,E,F);if(E=="fx"&&G.length==1){G[0].call(this)}})},dequeue:function(E){return this.each(function(){o.dequeue(this,E)})}});
/*
 * Sizzle CSS Selector Engine - v0.9.3
 *  Copyright 2009, The Dojo Foundation
 *  Released under the MIT, BSD, and GPL Licenses.
 *  More information: http://sizzlejs.com/
 */
(function(){var R=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g,L=0,H=Object.prototype.toString;var F=function(Y,U,ab,ac){ab=ab||[];U=U||document;if(U.nodeType!==1&&U.nodeType!==9){return[]}if(!Y||typeof Y!=="string"){return ab}var Z=[],W,af,ai,T,ad,V,X=true;R.lastIndex=0;while((W=R.exec(Y))!==null){Z.push(W[1]);if(W[2]){V=RegExp.rightContext;break}}if(Z.length>1&&M.exec(Y)){if(Z.length===2&&I.relative[Z[0]]){af=J(Z[0]+Z[1],U)}else{af=I.relative[Z[0]]?[U]:F(Z.shift(),U);while(Z.length){Y=Z.shift();if(I.relative[Y]){Y+=Z.shift()}af=J(Y,af)}}}else{var ae=ac?{expr:Z.pop(),set:E(ac)}:F.find(Z.pop(),Z.length===1&&U.parentNode?U.parentNode:U,Q(U));af=F.filter(ae.expr,ae.set);if(Z.length>0){ai=E(af)}else{X=false}while(Z.length){var ah=Z.pop(),ag=ah;if(!I.relative[ah]){ah=""}else{ag=Z.pop()}if(ag==null){ag=U}I.relative[ah](ai,ag,Q(U))}}if(!ai){ai=af}if(!ai){throw"Syntax error, unrecognized expression: "+(ah||Y)}if(H.call(ai)==="[object Array]"){if(!X){ab.push.apply(ab,ai)}else{if(U.nodeType===1){for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&(ai[aa]===true||ai[aa].nodeType===1&&K(U,ai[aa]))){ab.push(af[aa])}}}else{for(var aa=0;ai[aa]!=null;aa++){if(ai[aa]&&ai[aa].nodeType===1){ab.push(af[aa])}}}}}else{E(ai,ab)}if(V){F(V,U,ab,ac);if(G){hasDuplicate=false;ab.sort(G);if(hasDuplicate){for(var aa=1;aa<ab.length;aa++){if(ab[aa]===ab[aa-1]){ab.splice(aa--,1)}}}}}return ab};F.matches=function(T,U){return F(T,null,null,U)};F.find=function(aa,T,ab){var Z,X;if(!aa){return[]}for(var W=0,V=I.order.length;W<V;W++){var Y=I.order[W],X;if((X=I.match[Y].exec(aa))){var U=RegExp.leftContext;if(U.substr(U.length-1)!=="\\"){X[1]=(X[1]||"").replace(/\\/g,"");Z=I.find[Y](X,T,ab);if(Z!=null){aa=aa.replace(I.match[Y],"");break}}}}if(!Z){Z=T.getElementsByTagName("*")}return{set:Z,expr:aa}};F.filter=function(ad,ac,ag,W){var V=ad,ai=[],aa=ac,Y,T,Z=ac&&ac[0]&&Q(ac[0]);while(ad&&ac.length){for(var ab in I.filter){if((Y=I.match[ab].exec(ad))!=null){var U=I.filter[ab],ah,af;T=false;if(aa==ai){ai=[]}if(I.preFilter[ab]){Y=I.preFilter[ab](Y,aa,ag,ai,W,Z);if(!Y){T=ah=true}else{if(Y===true){continue}}}if(Y){for(var X=0;(af=aa[X])!=null;X++){if(af){ah=U(af,Y,X,aa);var ae=W^!!ah;if(ag&&ah!=null){if(ae){T=true}else{aa[X]=false}}else{if(ae){ai.push(af);T=true}}}}}if(ah!==g){if(!ag){aa=ai}ad=ad.replace(I.match[ab],"");if(!T){return[]}break}}}if(ad==V){if(T==null){throw"Syntax error, unrecognized expression: "+ad}else{break}}V=ad}return aa};var I=F.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(T){return T.getAttribute("href")}},relative:{"+":function(aa,T,Z){var X=typeof T==="string",ab=X&&!/\W/.test(T),Y=X&&!ab;if(ab&&!Z){T=T.toUpperCase()}for(var W=0,V=aa.length,U;W<V;W++){if((U=aa[W])){while((U=U.previousSibling)&&U.nodeType!==1){}aa[W]=Y||U&&U.nodeName===T?U||false:U===T}}if(Y){F.filter(T,aa,true)}},">":function(Z,U,aa){var X=typeof U==="string";if(X&&!/\W/.test(U)){U=aa?U:U.toUpperCase();for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){var W=Y.parentNode;Z[V]=W.nodeName===U?W:false}}}else{for(var V=0,T=Z.length;V<T;V++){var Y=Z[V];if(Y){Z[V]=X?Y.parentNode:Y.parentNode===U}}if(X){F.filter(U,Z,true)}}},"":function(W,U,Y){var V=L++,T=S;if(!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("parentNode",U,V,W,X,Y)},"~":function(W,U,Y){var V=L++,T=S;if(typeof U==="string"&&!U.match(/\W/)){var X=U=Y?U:U.toUpperCase();T=P}T("previousSibling",U,V,W,X,Y)}},find:{ID:function(U,V,W){if(typeof V.getElementById!=="undefined"&&!W){var T=V.getElementById(U[1]);return T?[T]:[]}},NAME:function(V,Y,Z){if(typeof Y.getElementsByName!=="undefined"){var U=[],X=Y.getElementsByName(V[1]);for(var W=0,T=X.length;W<T;W++){if(X[W].getAttribute("name")===V[1]){U.push(X[W])}}return U.length===0?null:U}},TAG:function(T,U){return U.getElementsByTagName(T[1])}},preFilter:{CLASS:function(W,U,V,T,Z,aa){W=" "+W[1].replace(/\\/g,"")+" ";if(aa){return W}for(var X=0,Y;(Y=U[X])!=null;X++){if(Y){if(Z^(Y.className&&(" "+Y.className+" ").indexOf(W)>=0)){if(!V){T.push(Y)}}else{if(V){U[X]=false}}}}return false},ID:function(T){return T[1].replace(/\\/g,"")},TAG:function(U,T){for(var V=0;T[V]===false;V++){}return T[V]&&Q(T[V])?U[1]:U[1].toUpperCase()},CHILD:function(T){if(T[1]=="nth"){var U=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(T[2]=="even"&&"2n"||T[2]=="odd"&&"2n+1"||!/\D/.test(T[2])&&"0n+"+T[2]||T[2]);T[2]=(U[1]+(U[2]||1))-0;T[3]=U[3]-0}T[0]=L++;return T},ATTR:function(X,U,V,T,Y,Z){var W=X[1].replace(/\\/g,"");if(!Z&&I.attrMap[W]){X[1]=I.attrMap[W]}if(X[2]==="~="){X[4]=" "+X[4]+" "}return X},PSEUDO:function(X,U,V,T,Y){if(X[1]==="not"){if(X[3].match(R).length>1||/^\w/.test(X[3])){X[3]=F(X[3],null,null,U)}else{var W=F.filter(X[3],U,V,true^Y);if(!V){T.push.apply(T,W)}return false}}else{if(I.match.POS.test(X[0])||I.match.CHILD.test(X[0])){return true}}return X},POS:function(T){T.unshift(true);return T}},filters:{enabled:function(T){return T.disabled===false&&T.type!=="hidden"},disabled:function(T){return T.disabled===true},checked:function(T){return T.checked===true},selected:function(T){T.parentNode.selectedIndex;return T.selected===true},parent:function(T){return !!T.firstChild},empty:function(T){return !T.firstChild},has:function(V,U,T){return !!F(T[3],V).length},header:function(T){return/h\d/i.test(T.nodeName)},text:function(T){return"text"===T.type},radio:function(T){return"radio"===T.type},checkbox:function(T){return"checkbox"===T.type},file:function(T){return"file"===T.type},password:function(T){return"password"===T.type},submit:function(T){return"submit"===T.type},image:function(T){return"image"===T.type},reset:function(T){return"reset"===T.type},button:function(T){return"button"===T.type||T.nodeName.toUpperCase()==="BUTTON"},input:function(T){return/input|select|textarea|button/i.test(T.nodeName)}},setFilters:{first:function(U,T){return T===0},last:function(V,U,T,W){return U===W.length-1},even:function(U,T){return T%2===0},odd:function(U,T){return T%2===1},lt:function(V,U,T){return U<T[3]-0},gt:function(V,U,T){return U>T[3]-0},nth:function(V,U,T){return T[3]-0==U},eq:function(V,U,T){return T[3]-0==U}},filter:{PSEUDO:function(Z,V,W,aa){var U=V[1],X=I.filters[U];if(X){return X(Z,W,V,aa)}else{if(U==="contains"){return(Z.textContent||Z.innerText||"").indexOf(V[3])>=0}else{if(U==="not"){var Y=V[3];for(var W=0,T=Y.length;W<T;W++){if(Y[W]===Z){return false}}return true}}}},CHILD:function(T,W){var Z=W[1],U=T;switch(Z){case"only":case"first":while(U=U.previousSibling){if(U.nodeType===1){return false}}if(Z=="first"){return true}U=T;case"last":while(U=U.nextSibling){if(U.nodeType===1){return false}}return true;case"nth":var V=W[2],ac=W[3];if(V==1&&ac==0){return true}var Y=W[0],ab=T.parentNode;if(ab&&(ab.sizcache!==Y||!T.nodeIndex)){var X=0;for(U=ab.firstChild;U;U=U.nextSibling){if(U.nodeType===1){U.nodeIndex=++X}}ab.sizcache=Y}var aa=T.nodeIndex-ac;if(V==0){return aa==0}else{return(aa%V==0&&aa/V>=0)}}},ID:function(U,T){return U.nodeType===1&&U.getAttribute("id")===T},TAG:function(U,T){return(T==="*"&&U.nodeType===1)||U.nodeName===T},CLASS:function(U,T){return(" "+(U.className||U.getAttribute("class"))+" ").indexOf(T)>-1},ATTR:function(Y,W){var V=W[1],T=I.attrHandle[V]?I.attrHandle[V](Y):Y[V]!=null?Y[V]:Y.getAttribute(V),Z=T+"",X=W[2],U=W[4];return T==null?X==="!=":X==="="?Z===U:X==="*="?Z.indexOf(U)>=0:X==="~="?(" "+Z+" ").indexOf(U)>=0:!U?Z&&T!==false:X==="!="?Z!=U:X==="^="?Z.indexOf(U)===0:X==="$="?Z.substr(Z.length-U.length)===U:X==="|="?Z===U||Z.substr(0,U.length+1)===U+"-":false},POS:function(X,U,V,Y){var T=U[2],W=I.setFilters[T];if(W){return W(X,V,U,Y)}}}};var M=I.match.POS;for(var O in I.match){I.match[O]=RegExp(I.match[O].source+/(?![^\[]*\])(?![^\(]*\))/.source)}var E=function(U,T){U=Array.prototype.slice.call(U);if(T){T.push.apply(T,U);return T}return U};try{Array.prototype.slice.call(document.documentElement.childNodes)}catch(N){E=function(X,W){var U=W||[];if(H.call(X)==="[object Array]"){Array.prototype.push.apply(U,X)}else{if(typeof X.length==="number"){for(var V=0,T=X.length;V<T;V++){U.push(X[V])}}else{for(var V=0;X[V];V++){U.push(X[V])}}}return U}}var G;if(document.documentElement.compareDocumentPosition){G=function(U,T){var V=U.compareDocumentPosition(T)&4?-1:U===T?0:1;if(V===0){hasDuplicate=true}return V}}else{if("sourceIndex" in document.documentElement){G=function(U,T){var V=U.sourceIndex-T.sourceIndex;if(V===0){hasDuplicate=true}return V}}else{if(document.createRange){G=function(W,U){var V=W.ownerDocument.createRange(),T=U.ownerDocument.createRange();V.selectNode(W);V.collapse(true);T.selectNode(U);T.collapse(true);var X=V.compareBoundaryPoints(Range.START_TO_END,T);if(X===0){hasDuplicate=true}return X}}}}(function(){var U=document.createElement("form"),V="script"+(new Date).getTime();U.innerHTML="<input name='"+V+"'/>";var T=document.documentElement;T.insertBefore(U,T.firstChild);if(!!document.getElementById(V)){I.find.ID=function(X,Y,Z){if(typeof Y.getElementById!=="undefined"&&!Z){var W=Y.getElementById(X[1]);return W?W.id===X[1]||typeof W.getAttributeNode!=="undefined"&&W.getAttributeNode("id").nodeValue===X[1]?[W]:g:[]}};I.filter.ID=function(Y,W){var X=typeof Y.getAttributeNode!=="undefined"&&Y.getAttributeNode("id");return Y.nodeType===1&&X&&X.nodeValue===W}}T.removeChild(U)})();(function(){var T=document.createElement("div");T.appendChild(document.createComment(""));if(T.getElementsByTagName("*").length>0){I.find.TAG=function(U,Y){var X=Y.getElementsByTagName(U[1]);if(U[1]==="*"){var W=[];for(var V=0;X[V];V++){if(X[V].nodeType===1){W.push(X[V])}}X=W}return X}}T.innerHTML="<a href='#'></a>";if(T.firstChild&&typeof T.firstChild.getAttribute!=="undefined"&&T.firstChild.getAttribute("href")!=="#"){I.attrHandle.href=function(U){return U.getAttribute("href",2)}}})();if(document.querySelectorAll){(function(){var T=F,U=document.createElement("div");U.innerHTML="<p class='TEST'></p>";if(U.querySelectorAll&&U.querySelectorAll(".TEST").length===0){return}F=function(Y,X,V,W){X=X||document;if(!W&&X.nodeType===9&&!Q(X)){try{return E(X.querySelectorAll(Y),V)}catch(Z){}}return T(Y,X,V,W)};F.find=T.find;F.filter=T.filter;F.selectors=T.selectors;F.matches=T.matches})()}if(document.getElementsByClassName&&document.documentElement.getElementsByClassName){(function(){var T=document.createElement("div");T.innerHTML="<div class='test e'></div><div class='test'></div>";if(T.getElementsByClassName("e").length===0){return}T.lastChild.className="e";if(T.getElementsByClassName("e").length===1){return}I.order.splice(1,0,"CLASS");I.find.CLASS=function(U,V,W){if(typeof V.getElementsByClassName!=="undefined"&&!W){return V.getElementsByClassName(U[1])}}})()}function P(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1&&!ac){T.sizcache=Y;T.sizset=W}if(T.nodeName===Z){X=T;break}T=T[U]}ad[W]=X}}}function S(U,Z,Y,ad,aa,ac){var ab=U=="previousSibling"&&!ac;for(var W=0,V=ad.length;W<V;W++){var T=ad[W];if(T){if(ab&&T.nodeType===1){T.sizcache=Y;T.sizset=W}T=T[U];var X=false;while(T){if(T.sizcache===Y){X=ad[T.sizset];break}if(T.nodeType===1){if(!ac){T.sizcache=Y;T.sizset=W}if(typeof Z!=="string"){if(T===Z){X=true;break}}else{if(F.filter(Z,[T]).length>0){X=T;break}}}T=T[U]}ad[W]=X}}}var K=document.compareDocumentPosition?function(U,T){return U.compareDocumentPosition(T)&16}:function(U,T){return U!==T&&(U.contains?U.contains(T):true)};var Q=function(T){return T.nodeType===9&&T.documentElement.nodeName!=="HTML"||!!T.ownerDocument&&Q(T.ownerDocument)};var J=function(T,aa){var W=[],X="",Y,V=aa.nodeType?[aa]:aa;while((Y=I.match.PSEUDO.exec(T))){X+=Y[0];T=T.replace(I.match.PSEUDO,"")}T=I.relative[T]?T+"*":T;for(var Z=0,U=V.length;Z<U;Z++){F(T,V[Z],W)}return F.filter(X,W)};o.find=F;o.filter=F.filter;o.expr=F.selectors;o.expr[":"]=o.expr.filters;F.selectors.filters.hidden=function(T){return T.offsetWidth===0||T.offsetHeight===0};F.selectors.filters.visible=function(T){return T.offsetWidth>0||T.offsetHeight>0};F.selectors.filters.animated=function(T){return o.grep(o.timers,function(U){return T===U.elem}).length};o.multiFilter=function(V,T,U){if(U){V=":not("+V+")"}return F.matches(V,T)};o.dir=function(V,U){var T=[],W=V[U];while(W&&W!=document){if(W.nodeType==1){T.push(W)}W=W[U]}return T};o.nth=function(X,T,V,W){T=T||1;var U=0;for(;X;X=X[V]){if(X.nodeType==1&&++U==T){break}}return X};o.sibling=function(V,U){var T=[];for(;V;V=V.nextSibling){if(V.nodeType==1&&V!=U){T.push(V)}}return T};return;l.Sizzle=F})();o.event={add:function(I,F,H,K){if(I.nodeType==3||I.nodeType==8){return}if(I.setInterval&&I!=l){I=l}if(!H.guid){H.guid=this.guid++}if(K!==g){var G=H;H=this.proxy(G);H.data=K}var E=o.data(I,"events")||o.data(I,"events",{}),J=o.data(I,"handle")||o.data(I,"handle",function(){return typeof o!=="undefined"&&!o.event.triggered?o.event.handle.apply(arguments.callee.elem,arguments):g});J.elem=I;o.each(F.split(/\s+/),function(M,N){var O=N.split(".");N=O.shift();H.type=O.slice().sort().join(".");var L=E[N];if(o.event.specialAll[N]){o.event.specialAll[N].setup.call(I,K,O)}if(!L){L=E[N]={};if(!o.event.special[N]||o.event.special[N].setup.call(I,K,O)===false){if(I.addEventListener){I.addEventListener(N,J,false)}else{if(I.attachEvent){I.attachEvent("on"+N,J)}}}}L[H.guid]=H;o.event.global[N]=true});I=null},guid:1,global:{},remove:function(K,H,J){if(K.nodeType==3||K.nodeType==8){return}var G=o.data(K,"events"),F,E;if(G){if(H===g||(typeof H==="string"&&H.charAt(0)==".")){for(var I in G){this.remove(K,I+(H||""))}}else{if(H.type){J=H.handler;H=H.type}o.each(H.split(/\s+/),function(M,O){var Q=O.split(".");O=Q.shift();var N=RegExp("(^|\\.)"+Q.slice().sort().join(".*\\.")+"(\\.|$)");if(G[O]){if(J){delete G[O][J.guid]}else{for(var P in G[O]){if(N.test(G[O][P].type)){delete G[O][P]}}}if(o.event.specialAll[O]){o.event.specialAll[O].teardown.call(K,Q)}for(F in G[O]){break}if(!F){if(!o.event.special[O]||o.event.special[O].teardown.call(K,Q)===false){if(K.removeEventListener){K.removeEventListener(O,o.data(K,"handle"),false)}else{if(K.detachEvent){K.detachEvent("on"+O,o.data(K,"handle"))}}}F=null;delete G[O]}}})}for(F in G){break}if(!F){var L=o.data(K,"handle");if(L){L.elem=null}o.removeData(K,"events");o.removeData(K,"handle")}}},trigger:function(I,K,H,E){var G=I.type||I;if(!E){I=typeof I==="object"?I[h]?I:o.extend(o.Event(G),I):o.Event(G);if(G.indexOf("!")>=0){I.type=G=G.slice(0,-1);I.exclusive=true}if(!H){I.stopPropagation();if(this.global[G]){o.each(o.cache,function(){if(this.events&&this.events[G]){o.event.trigger(I,K,this.handle.elem)}})}}if(!H||H.nodeType==3||H.nodeType==8){return g}I.result=g;I.target=H;K=o.makeArray(K);K.unshift(I)}I.currentTarget=H;var J=o.data(H,"handle");if(J){J.apply(H,K)}if((!H[G]||(o.nodeName(H,"a")&&G=="click"))&&H["on"+G]&&H["on"+G].apply(H,K)===false){I.result=false}if(!E&&H[G]&&!I.isDefaultPrevented()&&!(o.nodeName(H,"a")&&G=="click")){this.triggered=true;try{H[G]()}catch(L){}}this.triggered=false;if(!I.isPropagationStopped()){var F=H.parentNode||H.ownerDocument;if(F){o.event.trigger(I,K,F,true)}}},handle:function(K){var J,E;K=arguments[0]=o.event.fix(K||l.event);K.currentTarget=this;var L=K.type.split(".");K.type=L.shift();J=!L.length&&!K.exclusive;var I=RegExp("(^|\\.)"+L.slice().sort().join(".*\\.")+"(\\.|$)");E=(o.data(this,"events")||{})[K.type];for(var G in E){var H=E[G];if(J||I.test(H.type)){K.handler=H;K.data=H.data;var F=H.apply(this,arguments);if(F!==g){K.result=F;if(F===false){K.preventDefault();K.stopPropagation()}}if(K.isImmediatePropagationStopped()){break}}}},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(H){if(H[h]){return H}var F=H;H=o.Event(F);for(var G=this.props.length,J;G;){J=this.props[--G];H[J]=F[J]}if(!H.target){H.target=H.srcElement||document}if(H.target.nodeType==3){H.target=H.target.parentNode}if(!H.relatedTarget&&H.fromElement){H.relatedTarget=H.fromElement==H.target?H.toElement:H.fromElement}if(H.pageX==null&&H.clientX!=null){var I=document.documentElement,E=document.body;H.pageX=H.clientX+(I&&I.scrollLeft||E&&E.scrollLeft||0)-(I.clientLeft||0);H.pageY=H.clientY+(I&&I.scrollTop||E&&E.scrollTop||0)-(I.clientTop||0)}if(!H.which&&((H.charCode||H.charCode===0)?H.charCode:H.keyCode)){H.which=H.charCode||H.keyCode}if(!H.metaKey&&H.ctrlKey){H.metaKey=H.ctrlKey}if(!H.which&&H.button){H.which=(H.button&1?1:(H.button&2?3:(H.button&4?2:0)))}return H},proxy:function(F,E){E=E||function(){return F.apply(this,arguments)};E.guid=F.guid=F.guid||E.guid||this.guid++;return E},special:{ready:{setup:B,teardown:function(){}}},specialAll:{live:{setup:function(E,F){o.event.add(this,F[0],c)},teardown:function(G){if(G.length){var E=0,F=RegExp("(^|\\.)"+G[0]+"(\\.|$)");o.each((o.data(this,"events").live||{}),function(){if(F.test(this.type)){E++}});if(E<1){o.event.remove(this,G[0],c)}}}}}};o.Event=function(E){if(!this.preventDefault){return new o.Event(E)}if(E&&E.type){this.originalEvent=E;this.type=E.type}else{this.type=E}this.timeStamp=e();this[h]=true};function k(){return false}function u(){return true}o.Event.prototype={preventDefault:function(){this.isDefaultPrevented=u;var E=this.originalEvent;if(!E){return}if(E.preventDefault){E.preventDefault()}E.returnValue=false},stopPropagation:function(){this.isPropagationStopped=u;var E=this.originalEvent;if(!E){return}if(E.stopPropagation){E.stopPropagation()}E.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=u;this.stopPropagation()},isDefaultPrevented:k,isPropagationStopped:k,isImmediatePropagationStopped:k};var a=function(F){var E=F.relatedTarget;while(E&&E!=this){try{E=E.parentNode}catch(G){E=this}}if(E!=this){F.type=F.data;o.event.handle.apply(this,arguments)}};o.each({mouseover:"mouseenter",mouseout:"mouseleave"},function(F,E){o.event.special[E]={setup:function(){o.event.add(this,F,a,E)},teardown:function(){o.event.remove(this,F,a)}}});o.fn.extend({bind:function(F,G,E){return F=="unload"?this.one(F,G,E):this.each(function(){o.event.add(this,F,E||G,E&&G)})},one:function(G,H,F){var E=o.event.proxy(F||H,function(I){o(this).unbind(I,E);return(F||H).apply(this,arguments)});return this.each(function(){o.event.add(this,G,E,F&&H)})},unbind:function(F,E){return this.each(function(){o.event.remove(this,F,E)})},trigger:function(E,F){return this.each(function(){o.event.trigger(E,F,this)})},triggerHandler:function(E,G){if(this[0]){var F=o.Event(E);F.preventDefault();F.stopPropagation();o.event.trigger(F,G,this[0]);return F.result}},toggle:function(G){var E=arguments,F=1;while(F<E.length){o.event.proxy(G,E[F++])}return this.click(o.event.proxy(G,function(H){this.lastToggle=(this.lastToggle||0)%F;H.preventDefault();return E[this.lastToggle++].apply(this,arguments)||false}))},hover:function(E,F){return this.mouseenter(E).mouseleave(F)},ready:function(E){B();if(o.isReady){E.call(document,o)}else{o.readyList.push(E)}return this},live:function(G,F){var E=o.event.proxy(F);E.guid+=this.selector+G;o(document).bind(i(G,this.selector),this.selector,E);return this},die:function(F,E){o(document).unbind(i(F,this.selector),E?{guid:E.guid+this.selector+F}:null);return this}});function c(H){var E=RegExp("(^|\\.)"+H.type+"(\\.|$)"),G=true,F=[];o.each(o.data(this,"events").live||[],function(I,J){if(E.test(J.type)){var K=o(H.target).closest(J.data)[0];if(K){F.push({elem:K,fn:J})}}});F.sort(function(J,I){return o.data(J.elem,"closest")-o.data(I.elem,"closest")});o.each(F,function(){if(this.fn.call(this.elem,H,this.fn.data)===false){return(G=false)}});return G}function i(F,E){return["live",F,E.replace(/\./g,"`").replace(/ /g,"|")].join(".")}o.extend({isReady:false,readyList:[],ready:function(){if(!o.isReady){o.isReady=true;if(o.readyList){o.each(o.readyList,function(){this.call(document,o)});o.readyList=null}o(document).triggerHandler("ready")}}});var x=false;function B(){if(x){return}x=true;if(document.addEventListener){document.addEventListener("DOMContentLoaded",function(){document.removeEventListener("DOMContentLoaded",arguments.callee,false);o.ready()},false)}else{if(document.attachEvent){document.attachEvent("onreadystatechange",function(){if(document.readyState==="complete"){document.detachEvent("onreadystatechange",arguments.callee);o.ready()}});if(document.documentElement.doScroll&&l==l.top){(function(){if(o.isReady){return}try{document.documentElement.doScroll("left")}catch(E){setTimeout(arguments.callee,0);return}o.ready()})()}}}o.event.add(l,"load",o.ready)}o.each(("blur,focus,load,resize,scroll,unload,click,dblclick,mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave,change,select,submit,keydown,keypress,keyup,error").split(","),function(F,E){o.fn[E]=function(G){return G?this.bind(E,G):this.trigger(E)}});o(l).bind("unload",function(){for(var E in o.cache){if(E!=1&&o.cache[E].handle){o.event.remove(o.cache[E].handle.elem)}}});(function(){o.support={};var F=document.documentElement,G=document.createElement("script"),K=document.createElement("div"),J="script"+(new Date).getTime();K.style.display="none";K.innerHTML='   <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>';var H=K.getElementsByTagName("*"),E=K.getElementsByTagName("a")[0];if(!H||!H.length||!E){return}o.support={leadingWhitespace:K.firstChild.nodeType==3,tbody:!K.getElementsByTagName("tbody").length,objectAll:!!K.getElementsByTagName("object")[0].getElementsByTagName("*").length,htmlSerialize:!!K.getElementsByTagName("link").length,style:/red/.test(E.getAttribute("style")),hrefNormalized:E.getAttribute("href")==="/a",opacity:E.style.opacity==="0.5",cssFloat:!!E.style.cssFloat,scriptEval:false,noCloneEvent:true,boxModel:null};G.type="text/javascript";try{G.appendChild(document.createTextNode("window."+J+"=1;"))}catch(I){}F.insertBefore(G,F.firstChild);if(l[J]){o.support.scriptEval=true;delete l[J]}F.removeChild(G);if(K.attachEvent&&K.fireEvent){K.attachEvent("onclick",function(){o.support.noCloneEvent=false;K.detachEvent("onclick",arguments.callee)});K.cloneNode(true).fireEvent("onclick")}o(function(){var L=document.createElement("div");L.style.width=L.style.paddingLeft="1px";document.body.appendChild(L);o.boxModel=o.support.boxModel=L.offsetWidth===2;document.body.removeChild(L).style.display="none"})})();var w=o.support.cssFloat?"cssFloat":"styleFloat";o.props={"for":"htmlFor","class":"className","float":w,cssFloat:w,styleFloat:w,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",tabindex:"tabIndex"};o.fn.extend({_load:o.fn.load,load:function(G,J,K){if(typeof G!=="string"){return this._load(G)}var I=G.indexOf(" ");if(I>=0){var E=G.slice(I,G.length);G=G.slice(0,I)}var H="GET";if(J){if(o.isFunction(J)){K=J;J=null}else{if(typeof J==="object"){J=o.param(J);H="POST"}}}var F=this;o.ajax({url:G,type:H,dataType:"html",data:J,complete:function(M,L){if(L=="success"||L=="notmodified"){F.html(E?o("<div/>").append(M.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(E):M.responseText)}if(K){F.each(K,[M.responseText,L,M])}}});return this},serialize:function(){return o.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?o.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password|search/i.test(this.type))}).map(function(E,F){var G=o(this).val();return G==null?null:o.isArray(G)?o.map(G,function(I,H){return{name:F.name,value:I}}):{name:F.name,value:G}}).get()}});o.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(E,F){o.fn[F]=function(G){return this.bind(F,G)}});var r=e();o.extend({get:function(E,G,H,F){if(o.isFunction(G)){H=G;G=null}return o.ajax({type:"GET",url:E,data:G,success:H,dataType:F})},getScript:function(E,F){return o.get(E,null,F,"script")},getJSON:function(E,F,G){return o.get(E,F,G,"json")},post:function(E,G,H,F){if(o.isFunction(G)){H=G;G={}}return o.ajax({type:"POST",url:E,data:G,success:H,dataType:F})},ajaxSetup:function(E){o.extend(o.ajaxSettings,E)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:function(){return l.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest()},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(M){M=o.extend(true,M,o.extend(true,{},o.ajaxSettings,M));var W,F=/=\?(&|$)/g,R,V,G=M.type.toUpperCase();if(M.data&&M.processData&&typeof M.data!=="string"){M.data=o.param(M.data)}if(M.dataType=="jsonp"){if(G=="GET"){if(!M.url.match(F)){M.url+=(M.url.match(/\?/)?"&":"?")+(M.jsonp||"callback")+"=?"}}else{if(!M.data||!M.data.match(F)){M.data=(M.data?M.data+"&":"")+(M.jsonp||"callback")+"=?"}}M.dataType="json"}if(M.dataType=="json"&&(M.data&&M.data.match(F)||M.url.match(F))){W="jsonp"+r++;if(M.data){M.data=(M.data+"").replace(F,"="+W+"$1")}M.url=M.url.replace(F,"="+W+"$1");M.dataType="script";l[W]=function(X){V=X;I();L();l[W]=g;try{delete l[W]}catch(Y){}if(H){H.removeChild(T)}}}if(M.dataType=="script"&&M.cache==null){M.cache=false}if(M.cache===false&&G=="GET"){var E=e();var U=M.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+E+"$2");M.url=U+((U==M.url)?(M.url.match(/\?/)?"&":"?")+"_="+E:"")}if(M.data&&G=="GET"){M.url+=(M.url.match(/\?/)?"&":"?")+M.data;M.data=null}if(M.global&&!o.active++){o.event.trigger("ajaxStart")}var Q=/^(\w+:)?\/\/([^\/?#]+)/.exec(M.url);if(M.dataType=="script"&&G=="GET"&&Q&&(Q[1]&&Q[1]!=location.protocol||Q[2]!=location.host)){var H=document.getElementsByTagName("head")[0];var T=document.createElement("script");T.src=M.url;if(M.scriptCharset){T.charset=M.scriptCharset}if(!W){var O=false;T.onload=T.onreadystatechange=function(){if(!O&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){O=true;I();L();T.onload=T.onreadystatechange=null;H.removeChild(T)}}}H.appendChild(T);return g}var K=false;var J=M.xhr();if(M.username){J.open(G,M.url,M.async,M.username,M.password)}else{J.open(G,M.url,M.async)}try{if(M.data){J.setRequestHeader("Content-Type",M.contentType)}if(M.ifModified){J.setRequestHeader("If-Modified-Since",o.lastModified[M.url]||"Thu, 01 Jan 1970 00:00:00 GMT")}J.setRequestHeader("X-Requested-With","XMLHttpRequest");J.setRequestHeader("Accept",M.dataType&&M.accepts[M.dataType]?M.accepts[M.dataType]+", */*":M.accepts._default)}catch(S){}if(M.beforeSend&&M.beforeSend(J,M)===false){if(M.global&&!--o.active){o.event.trigger("ajaxStop")}J.abort();return false}if(M.global){o.event.trigger("ajaxSend",[J,M])}var N=function(X){if(J.readyState==0){if(P){clearInterval(P);P=null;if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}}else{if(!K&&J&&(J.readyState==4||X=="timeout")){K=true;if(P){clearInterval(P);P=null}R=X=="timeout"?"timeout":!o.httpSuccess(J)?"error":M.ifModified&&o.httpNotModified(J,M.url)?"notmodified":"success";if(R=="success"){try{V=o.httpData(J,M.dataType,M)}catch(Z){R="parsererror"}}if(R=="success"){var Y;try{Y=J.getResponseHeader("Last-Modified")}catch(Z){}if(M.ifModified&&Y){o.lastModified[M.url]=Y}if(!W){I()}}else{o.handleError(M,J,R)}L();if(X){J.abort()}if(M.async){J=null}}}};if(M.async){var P=setInterval(N,13);if(M.timeout>0){setTimeout(function(){if(J&&!K){N("timeout")}},M.timeout)}}try{J.send(M.data)}catch(S){o.handleError(M,J,null,S)}if(!M.async){N()}function I(){if(M.success){M.success(V,R)}if(M.global){o.event.trigger("ajaxSuccess",[J,M])}}function L(){if(M.complete){M.complete(J,R)}if(M.global){o.event.trigger("ajaxComplete",[J,M])}if(M.global&&!--o.active){o.event.trigger("ajaxStop")}}return J},handleError:function(F,H,E,G){if(F.error){F.error(H,E,G)}if(F.global){o.event.trigger("ajaxError",[H,F,G])}},active:0,httpSuccess:function(F){try{return !F.status&&location.protocol=="file:"||(F.status>=200&&F.status<300)||F.status==304||F.status==1223}catch(E){}return false},httpNotModified:function(G,E){try{var H=G.getResponseHeader("Last-Modified");return G.status==304||H==o.lastModified[E]}catch(F){}return false},httpData:function(J,H,G){var F=J.getResponseHeader("content-type"),E=H=="xml"||!H&&F&&F.indexOf("xml")>=0,I=E?J.responseXML:J.responseText;if(E&&I.documentElement.tagName=="parsererror"){throw"parsererror"}if(G&&G.dataFilter){I=G.dataFilter(I,H)}if(typeof I==="string"){if(H=="script"){o.globalEval(I)}if(H=="json"){I=l["eval"]("("+I+")")}}return I},param:function(E){var G=[];function H(I,J){G[G.length]=encodeURIComponent(I)+"="+encodeURIComponent(J)}if(o.isArray(E)||E.jquery){o.each(E,function(){H(this.name,this.value)})}else{for(var F in E){if(o.isArray(E[F])){o.each(E[F],function(){H(F,this)})}else{H(F,o.isFunction(E[F])?E[F]():E[F])}}}return G.join("&").replace(/%20/g,"+")}});var m={},n,d=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];function t(F,E){var G={};o.each(d.concat.apply([],d.slice(0,E)),function(){G[this]=F});return G}o.fn.extend({show:function(J,L){if(J){return this.animate(t("show",3),J,L)}else{for(var H=0,F=this.length;H<F;H++){var E=o.data(this[H],"olddisplay");this[H].style.display=E||"";if(o.css(this[H],"display")==="none"){var G=this[H].tagName,K;if(m[G]){K=m[G]}else{var I=o("<"+G+" />").appendTo("body");K=I.css("display");if(K==="none"){K="block"}I.remove();m[G]=K}o.data(this[H],"olddisplay",K)}}for(var H=0,F=this.length;H<F;H++){this[H].style.display=o.data(this[H],"olddisplay")||""}return this}},hide:function(H,I){if(H){return this.animate(t("hide",3),H,I)}else{for(var G=0,F=this.length;G<F;G++){var E=o.data(this[G],"olddisplay");if(!E&&E!=="none"){o.data(this[G],"olddisplay",o.css(this[G],"display"))}}for(var G=0,F=this.length;G<F;G++){this[G].style.display="none"}return this}},_toggle:o.fn.toggle,toggle:function(G,F){var E=typeof G==="boolean";return o.isFunction(G)&&o.isFunction(F)?this._toggle.apply(this,arguments):G==null||E?this.each(function(){var H=E?G:o(this).is(":hidden");o(this)[H?"show":"hide"]()}):this.animate(t("toggle",3),G,F)},fadeTo:function(E,G,F){return this.animate({opacity:G},E,F)},animate:function(I,F,H,G){var E=o.speed(F,H,G);return this[E.queue===false?"each":"queue"](function(){var K=o.extend({},E),M,L=this.nodeType==1&&o(this).is(":hidden"),J=this;for(M in I){if(I[M]=="hide"&&L||I[M]=="show"&&!L){return K.complete.call(this)}if((M=="height"||M=="width")&&this.style){K.display=o.css(this,"display");K.overflow=this.style.overflow}}if(K.overflow!=null){this.style.overflow="hidden"}K.curAnim=o.extend({},I);o.each(I,function(O,S){var R=new o.fx(J,K,O);if(/toggle|show|hide/.test(S)){R[S=="toggle"?L?"show":"hide":S](I)}else{var Q=S.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),T=R.cur(true)||0;if(Q){var N=parseFloat(Q[2]),P=Q[3]||"px";if(P!="px"){J.style[O]=(N||1)+P;T=((N||1)/R.cur(true))*T;J.style[O]=T+P}if(Q[1]){N=((Q[1]=="-="?-1:1)*N)+T}R.custom(T,N,P)}else{R.custom(T,S,"")}}});return true})},stop:function(F,E){var G=o.timers;if(F){this.queue([])}this.each(function(){for(var H=G.length-1;H>=0;H--){if(G[H].elem==this){if(E){G[H](true)}G.splice(H,1)}}});if(!E){this.dequeue()}return this}});o.each({slideDown:t("show",1),slideUp:t("hide",1),slideToggle:t("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(E,F){o.fn[E]=function(G,H){return this.animate(F,G,H)}});o.extend({speed:function(G,H,F){var E=typeof G==="object"?G:{complete:F||!F&&H||o.isFunction(G)&&G,duration:G,easing:F&&H||H&&!o.isFunction(H)&&H};E.duration=o.fx.off?0:typeof E.duration==="number"?E.duration:o.fx.speeds[E.duration]||o.fx.speeds._default;E.old=E.complete;E.complete=function(){if(E.queue!==false){o(this).dequeue()}if(o.isFunction(E.old)){E.old.call(this)}};return E},easing:{linear:function(G,H,E,F){return E+F*G},swing:function(G,H,E,F){return((-Math.cos(G*Math.PI)/2)+0.5)*F+E}},timers:[],fx:function(F,E,G){this.options=E;this.elem=F;this.prop=G;if(!E.orig){E.orig={}}}});o.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(o.fx.step[this.prop]||o.fx.step._default)(this);if((this.prop=="height"||this.prop=="width")&&this.elem.style){this.elem.style.display="block"}},cur:function(F){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var E=parseFloat(o.css(this.elem,this.prop,F));return E&&E>-10000?E:parseFloat(o.curCSS(this.elem,this.prop))||0},custom:function(I,H,G){this.startTime=e();this.start=I;this.end=H;this.unit=G||this.unit||"px";this.now=this.start;this.pos=this.state=0;var E=this;function F(J){return E.step(J)}F.elem=this.elem;if(F()&&o.timers.push(F)&&!n){n=setInterval(function(){var K=o.timers;for(var J=0;J<K.length;J++){if(!K[J]()){K.splice(J--,1)}}if(!K.length){clearInterval(n);n=g}},13)}},show:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.show=true;this.custom(this.prop=="width"||this.prop=="height"?1:0,this.cur());o(this.elem).show()},hide:function(){this.options.orig[this.prop]=o.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(H){var G=e();if(H||G>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var E=true;for(var F in this.options.curAnim){if(this.options.curAnim[F]!==true){E=false}}if(E){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(o.css(this.elem,"display")=="none"){this.elem.style.display="block"}}if(this.options.hide){o(this.elem).hide()}if(this.options.hide||this.options.show){for(var I in this.options.curAnim){o.attr(this.elem.style,I,this.options.orig[I])}}this.options.complete.call(this.elem)}return false}else{var J=G-this.startTime;this.state=J/this.options.duration;this.pos=o.easing[this.options.easing||(o.easing.swing?"swing":"linear")](this.state,J,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};o.extend(o.fx,{speeds:{slow:600,fast:200,_default:400},step:{opacity:function(E){o.attr(E.elem.style,"opacity",E.now)},_default:function(E){if(E.elem.style&&E.elem.style[E.prop]!=null){E.elem.style[E.prop]=E.now+E.unit}else{E.elem[E.prop]=E.now}}}});if(document.documentElement.getBoundingClientRect){o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}var G=this[0].getBoundingClientRect(),J=this[0].ownerDocument,F=J.body,E=J.documentElement,L=E.clientTop||F.clientTop||0,K=E.clientLeft||F.clientLeft||0,I=G.top+(self.pageYOffset||o.boxModel&&E.scrollTop||F.scrollTop)-L,H=G.left+(self.pageXOffset||o.boxModel&&E.scrollLeft||F.scrollLeft)-K;return{top:I,left:H}}}else{o.fn.offset=function(){if(!this[0]){return{top:0,left:0}}if(this[0]===this[0].ownerDocument.body){return o.offset.bodyOffset(this[0])}o.offset.initialized||o.offset.initialize();var J=this[0],G=J.offsetParent,F=J,O=J.ownerDocument,M,H=O.documentElement,K=O.body,L=O.defaultView,E=L.getComputedStyle(J,null),N=J.offsetTop,I=J.offsetLeft;while((J=J.parentNode)&&J!==K&&J!==H){M=L.getComputedStyle(J,null);N-=J.scrollTop,I-=J.scrollLeft;if(J===G){N+=J.offsetTop,I+=J.offsetLeft;if(o.offset.doesNotAddBorder&&!(o.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(J.tagName))){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}F=G,G=J.offsetParent}if(o.offset.subtractsBorderForOverflowNotVisible&&M.overflow!=="visible"){N+=parseInt(M.borderTopWidth,10)||0,I+=parseInt(M.borderLeftWidth,10)||0}E=M}if(E.position==="relative"||E.position==="static"){N+=K.offsetTop,I+=K.offsetLeft}if(E.position==="fixed"){N+=Math.max(H.scrollTop,K.scrollTop),I+=Math.max(H.scrollLeft,K.scrollLeft)}return{top:N,left:I}}}o.offset={initialize:function(){if(this.initialized){return}var L=document.body,F=document.createElement("div"),H,G,N,I,M,E,J=L.style.marginTop,K='<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>';M={position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"};for(E in M){F.style[E]=M[E]}F.innerHTML=K;L.insertBefore(F,L.firstChild);H=F.firstChild,G=H.firstChild,I=H.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(G.offsetTop!==5);this.doesAddBorderForTableAndCells=(I.offsetTop===5);H.style.overflow="hidden",H.style.position="relative";this.subtractsBorderForOverflowNotVisible=(G.offsetTop===-5);L.style.marginTop="1px";this.doesNotIncludeMarginInBodyOffset=(L.offsetTop===0);L.style.marginTop=J;L.removeChild(F);this.initialized=true},bodyOffset:function(E){o.offset.initialized||o.offset.initialize();var G=E.offsetTop,F=E.offsetLeft;if(o.offset.doesNotIncludeMarginInBodyOffset){G+=parseInt(o.curCSS(E,"marginTop",true),10)||0,F+=parseInt(o.curCSS(E,"marginLeft",true),10)||0}return{top:G,left:F}}};o.fn.extend({position:function(){var I=0,H=0,F;if(this[0]){var G=this.offsetParent(),J=this.offset(),E=/^body|html$/i.test(G[0].tagName)?{top:0,left:0}:G.offset();J.top-=j(this,"marginTop");J.left-=j(this,"marginLeft");E.top+=j(G,"borderTopWidth");E.left+=j(G,"borderLeftWidth");F={top:J.top-E.top,left:J.left-E.left}}return F},offsetParent:function(){var E=this[0].offsetParent||document.body;while(E&&(!/^body|html$/i.test(E.tagName)&&o.css(E,"position")=="static")){E=E.offsetParent}return o(E)}});o.each(["Left","Top"],function(F,E){var G="scroll"+E;o.fn[G]=function(H){if(!this[0]){return null}return H!==g?this.each(function(){this==l||this==document?l.scrollTo(!F?H:o(l).scrollLeft(),F?H:o(l).scrollTop()):this[G]=H}):this[0]==l||this[0]==document?self[F?"pageYOffset":"pageXOffset"]||o.boxModel&&document.documentElement[G]||document.body[G]:this[0][G]}});o.each(["Height","Width"],function(I,G){var E=I?"Left":"Top",H=I?"Right":"Bottom",F=G.toLowerCase();o.fn["inner"+G]=function(){return this[0]?o.css(this[0],F,false,"padding"):null};o.fn["outer"+G]=function(K){return this[0]?o.css(this[0],F,false,K?"margin":"border"):null};var J=G.toLowerCase();o.fn[J]=function(K){return this[0]==l?document.compatMode=="CSS1Compat"&&document.documentElement["client"+G]||document.body["client"+G]:this[0]==document?Math.max(document.documentElement["client"+G],document.body["scroll"+G],document.documentElement["scroll"+G],document.body["offset"+G],document.documentElement["offset"+G]):K===g?(this.length?o.css(this[0],J):null):this.css(J,typeof K==="string"?K:K+"px")}})})();

/*=====================================
=======================================
	PLUGINS THAT ARE IN THIS FILE:
	trace 		  	= function
	Json		  	= object
	JSON		  	= object
	textPlus	  	= jQuery plugin
	jCarouselLite 	= jQuery plugin
	url 		  	= jQuery plugin
	ui				= jQuery plugin
	ui.draggable	= jQuery plugin
=======================================
=======================================*/

/******************************
	HOME MADE FUNCTIONS
*******************************/
/*	OPEN A DEBUG WINDOW - minified trace.js */
function trace(b){var c="trace";var d="clearTrace";if(!document.getElementById(c)){var e=document.createElement('div');e.id=c;e.style.position="fixed";e.style.top="10px";e.style.left="10px";e.style.opacity=".8";e.style.filter="alpha(opacity=80)";e.style.width="300px";e.style.minHeight="20px";e.style.maxHeight="300px";e.style.overflow="auto";e.style.backgroundColor="#000000";e.style.border="5px solid #f1f1f1";e.style.MozBorderRadius="10px";e.style.color="#f1f1f1";e.style.textAlign="left";e.style.padding="15px";e.style.zIndex="3000";document.body.appendChild(e);var a=document.createElement('a');a.id=d;a.className="clear";a.style.display="block";a.style.margin="0 0 5px";a.style.cursor="pointer";e.appendChild(a)}var f=document.getElementById(c);f.innerHTML+="<hr>\n";f.innerHTML+="<code>"+b+"</code>";var g=document.getElementById(d);g.innerHTML="close";g.onclick=function(){document.body.removeChild(f)}}
		  
/*******************************
	NATIVE JAVSCRIPT EXTENSIONS
*******************************/
/*--------------------------
	Date Object Extensions
	Adapted from Lawrence O'Sullivan
	http://www.digital-web.com/articles/javascript_date_object_with_user_methods/
	Posted March 4, 2008
--------------------------*/
// Self-explanatory
Date.prototype.copy=function(){return new Date(this.getTime());};
// The number of days in the month
Date.prototype.lastday=function(){var d=new Date(this.getFullYear(),this.getMonth()+1,0);return d.getDate();};
// Compare functions
Date.prototype.getDaysBetween=function(d){var d2;if(arguments.length==0){d2=new Date();}else if(d instanceof Date){d2=new Date(d.getTime());}else if(typeof d=="string"){d2=new Date(d);}else if(arguments.length>=3){var dte=[0,0,0,0,0,0];for(var i=0;i<arguments.length;i++){dte[i]=arguments[i];}
d2=new Date(dte[0],dte[1],dte[2],dte[3],dte[4],dte[5]);}else if(typeof d=="number"){d2=new Date(d);}else{return null;}
if(d2=="Invalid Date")
return null;d2.setHours(this.getHours(),this.getMinutes(),this.getSeconds(),this.getMilliseconds());var diff=d2.getTime()-this.getTime();return(diff)/this.msPERDAY;};
Date.prototype.getMonthsBetween=function(d){var sDate,eDate;var d1=this.getFullYear()*12+this.getMonth();var d2=d.getFullYear()*12+d.getMonth();var sign;var months=0;if(this==d){months=0;}else if(d1==d2){months=(d.getDate()-this.getDate())/this.lastday();}else{if(d1<d2){sDate=this;eDate=d;sign=1;}else{sDate=d;eDate=this;sign=-1;}
var sAdj=sDate.lastday()-sDate.getDate();var eAdj=eDate.getDate();var adj=(sAdj+eAdj)/sDate.lastday()-1;months=Math.abs(d2-d1)+adj;months=(months*sign)}
return months;};
Date.prototype.getYearsBetween=function(d){var months=this.getMonthsBetween(d);return months/12;};
Date.prototype.getAge=function(){var today=new Date();return this.getYearsBetween(today).toFixed(2);};
Date.prototype.getDayOfYear=function(){var start=new Date(this.getFullYear(),0,0);return this.getDaysBetween(start)*-1;};

/*******************************
	JSON HELPERS
********************************/
/* 	METHODS:
		Json.urlEncode(str)
		Json.urlDecode(str);
---------------------------------------------------*/
var Json={urlEncode:function(str){return escape(str)},urlDecode:function(str){return unescape(str.replace(/\+/g," "))}}

/*  DOWNLOAD: http://www.json.org/json2.js
	DATE ON CODE: 2009-04-16
	METHODS:
		JSON.stringify(value, replacer, space);
		JSON.parse(text, reviver);
---------------------------------------------------*/
if(!this.JSON){JSON={}}(function(){function f(n){return n<10?'0'+n:n}if(typeof Date.prototype.toJSON!=='function'){Date.prototype.toJSON=function(key){return this.getUTCFullYear()+'-'+f(this.getUTCMonth()+1)+'-'+f(this.getUTCDate())+'T'+f(this.getUTCHours())+':'+f(this.getUTCMinutes())+':'+f(this.getUTCSeconds())+'Z'};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==='string'?c:'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==='object'&&typeof value.toJSON==='function'){value=value.toJSON(key)}if(typeof rep==='function'){value=rep.call(holder,key,value)}switch(typeof value){case'string':return quote(value);case'number':return isFinite(value)?String(value):'null';case'boolean':case'null':return String(value);case'object':if(!value){return'null'}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==='[object Array]'){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||'null'}v=partial.length===0?'[]':gap?'[\n'+gap+partial.join(',\n'+gap)+'\n'+mind+']':'['+partial.join(',')+']';gap=mind;return v}if(rep&&typeof rep==='object'){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==='string'){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?': ':':')+v)}}}}v=partial.length===0?'{}':gap?'{\n'+gap+partial.join(',\n'+gap)+'\n'+mind+'}':'{'+partial.join(',')+'}';gap=mind;return v}}if(typeof JSON.stringify!=='function'){JSON.stringify=function(value,replacer,space){var i;gap='';indent='';if(typeof space==='number'){for(i=0;i<space;i+=1){indent+=' '}}else if(typeof space==='string'){indent=space}rep=replacer;if(replacer&&typeof replacer!=='function'&&(typeof replacer!=='object'||typeof replacer.length!=='number')){throw new Error('JSON.stringify');}return str('',{'':value})}}if(typeof JSON.parse!=='function'){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==='object'){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return'\\u'+('0000'+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,'@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,']').replace(/(?:^|:|,)(?:\s*\[)+/g,''))){j=eval('('+text+')');return typeof reviver==='function'?walk({'':j},''):j}throw new SyntaxError('JSON.parse');}}}());



/*******************************
	HOME MADE JQUERY PLUGINS
********************************/
/*	jQuery Plugin Text Plus
	(c) 2009 Drew Robinson (drewrobinson.com)
	::For use with jQuery 1.3*
-------------------------------------------------*/
(function(jQuery) {
	jQuery.fn.textPlus = function(options){
		var opts = $.extend(jQuery.fn.textPlus.defaults, options);
		return this.each(function(i){
			var t = jQuery(this);
			t.css({'overflow':'hidden','overflow-x':'hidden','overflow-y':'hidden','scroll':'no-scroll'});
			var w = t.width() || opts.minWidth;
			var h = "";
	
			t.focus(function(e){
				$("body").append("<div class='temp' style='display:block;float:left;position:absolute;left:-9999px;'></div>");
				$(".temp").css('width',w+"px");
			});
			
			t.keyup(function(e){
				var val = t.val().replace(/\n/g,'<br/>');	
				$(".temp").html(val);
				h = $(".temp").height();
				if (h<opts.minHeight) h = opts.minHeight;
				t.css('height',(parseInt(h)+25)+"px");
				if(opts.maxChars){cropVal();}
			});
			
			t.blur(function(e){
				$(".temp").remove();
			});
			
			function cropVal(){
				var l = t.val().length;
				var str = String(t.val());
				var sub = str.substring(0,opts.maxChars);
				if(l>=opts.maxChars){t.val(sub);}			
			};
			
		}); 
	};
	//SET DEFAULTS
	$.fn.textPlus.defaults = {minHeight: '20',minWidth:'390',maxChars:'1025'}; 
})(jQuery);



/*******************************
	EXTERNAL JQUERY PLUGINS
********************************/
/*	jCarouselLite - jQuery plugin to navigate images/any
	content in a carousel style widget.
	make a carousel from lists $(elem).jCarouselLite();
------------------------------------------------------------*/
(function($){$.fn.jCarouselLite=function(o){o=$.extend({btnPrev:null,btnNext:null,btnGo:null,mouseWheel:false,auto:null,speed:200,easing:null,vertical:false,circular:true,visible:3,start:0,scroll:1,beforeStart:null,afterEnd:null},o||{});return this.each(function(){var b=false,animCss=o.vertical?"top":"left",sizeCss=o.vertical?"height":"width";var c=$(this),ul=$("ul",c),tLi=$("li",ul),tl=tLi.size(),v=o.visible;if(o.circular){ul.prepend(tLi.slice(tl-v-1+1).clone()).append(tLi.slice(0,v).clone());o.start+=v}var f=$("li",ul),itemLength=f.size(),curr=o.start;c.css("visibility","visible");f.css({overflow:"hidden",float:o.vertical?"none":"left"});ul.css({margin:"0",padding:"0",position:"relative","list-style-type":"none","z-index":"1"});c.css({overflow:"hidden",position:"relative","z-index":"2",left:"0px"});var g=o.vertical?height(f):width(f);var h=g*itemLength;var j=g*v;f.css({width:f.width(),height:f.height()});ul.css(sizeCss,h+"px").css(animCss,-(curr*g));c.css(sizeCss,j+"px");if(o.btnPrev)$(o.btnPrev).click(function(){return go(curr-o.scroll)});if(o.btnNext)$(o.btnNext).click(function(){return go(curr+o.scroll)});if(o.btnGo)$.each(o.btnGo,function(i,a){$(a).click(function(){return go(o.circular?o.visible+i:i)})});if(o.mouseWheel&&c.mousewheel)c.mousewheel(function(e,d){return d>0?go(curr-o.scroll):go(curr+o.scroll)});if(o.auto)setInterval(function(){go(curr+o.scroll)},o.auto+o.speed);function vis(){return f.slice(curr).slice(0,v)};function go(a){if(!b){if(o.beforeStart)o.beforeStart.call(this,vis());if(o.circular){if(a<=o.start-v-1){ul.css(animCss,-((itemLength-(v*2))*g)+"px");curr=a==o.start-v-1?itemLength-(v*2)-1:itemLength-(v*2)-o.scroll}else if(a>=itemLength-v+1){ul.css(animCss,-((v)*g)+"px");curr=a==itemLength-v+1?v+1:v+o.scroll}else curr=a}else{if(a<0||a>itemLength-v)return;else curr=a}b=true;ul.animate(animCss=="left"?{left:-(curr*g)}:{top:-(curr*g)},o.speed,o.easing,function(){if(o.afterEnd)o.afterEnd.call(this,vis());b=false});if(!o.circular){$(o.btnPrev+","+o.btnNext).removeClass("disabled");$((curr-o.scroll<0&&o.btnPrev)||(curr+o.scroll>itemLength-v&&o.btnNext)||[]).addClass("disabled")}}return false}})};function css(a,b){return parseInt($.css(a[0],b))||0};function width(a){return a[0].offsetWidth+css(a,'marginLeft')+css(a,'marginRight')};function height(a){return a[0].offsetHeight+css(a,'marginTop')+css(a,'marginBottom')}})(jQuery);

/*  JQUERY URL PARSER 1.0.1
	DOCUMENTATION = http://projects.allmarkedup.com/jquery_url_parser/
	DOWNLOAD 	  = http://plugins.jquery.com/project/url_parser
--------------------------------------------------------------------------*/
jQuery.url=function(){var segments={};var parsed={};var options={url:window.location,strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};var parseUri=function(){str=decodeURI(options.url);var m=options.parser[options.strictMode?"strict":"loose"].exec(str);var uri={};var i=14;while(i--){uri[options.key[i]]=m[i]||""}uri[options.q.name]={};uri[options.key[12]].replace(options.q.parser,function($0,$1,$2){if($1){uri[options.q.name][$1]=$2}});return uri};var key=function(key){if(!parsed.length){setUp()}if(key=="base"){if(parsed.port!==null&&parsed.port!==""){return parsed.protocol+"://"+parsed.host+":"+parsed.port+"/"}else{return parsed.protocol+"://"+parsed.host+"/"}}return(parsed[key]==="")?null:parsed[key]};var param=function(item){if(!parsed.length){setUp()}return(parsed.queryKey[item]===null)?null:parsed.queryKey[item]};var setUp=function(){parsed=parseUri();getSegments()};var getSegments=function(){var p=parsed.path;segments=[];segments=parsed.path.length==1?{}:(p.charAt(p.length-1)=="/"?p.substring(1,p.length-1):path=p.substring(1)).split("/")};return{setMode:function(mode){strictMode=mode=="strict"?true:false;return this},setUrl:function(newUri){options.url=newUri===undefined?window.location:newUri;setUp();return this},segment:function(pos){if(!parsed.length){setUp()}if(pos===undefined){return segments.length}return(segments[pos]===""||segments[pos]===undefined)?null:segments[pos]},attr:key,param:param}}();

/*	jQuery UI 1.7
	Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
	Dual licensed under the MIT (MIT-LICENSE.txt)
	and GPL (GPL-LICENSE.txt) licenses.
	http://docs.jquery.com/UI
------------------------------------------------------------*/
jQuery.ui||(function(c){var i=c.fn.remove,d=c.browser.mozilla&&(parseFloat(c.browser.version)<1.9);c.ui={version:"1.7",plugin:{add:function(k,l,n){var m=c.ui[k].prototype;for(var j in n){m.plugins[j]=m.plugins[j]||[];m.plugins[j].push([l,n[j]])}},call:function(j,l,k){var n=j.plugins[l];if(!n||!j.element[0].parentNode){return}for(var m=0;m<n.length;m++){if(j.options[n[m][0]]){n[m][1].apply(j.element,k)}}}},contains:function(k,j){return document.compareDocumentPosition?k.compareDocumentPosition(j)&16:k!==j&&k.contains(j)},hasScroll:function(m,k){if(c(m).css("overflow")=="hidden"){return false}var j=(k&&k=="left")?"scrollLeft":"scrollTop",l=false;if(m[j]>0){return true}m[j]=1;l=(m[j]>0);m[j]=0;return l},isOverAxis:function(k,j,l){return(k>j)&&(k<(j+l))},isOver:function(o,k,n,m,j,l){return c.ui.isOverAxis(o,n,j)&&c.ui.isOverAxis(k,m,l)},keyCode:{BACKSPACE:8,CAPS_LOCK:20,COMMA:188,CONTROL:17,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,INSERT:45,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SHIFT:16,SPACE:32,TAB:9,UP:38}};if(d){var f=c.attr,e=c.fn.removeAttr,h="http://www.w3.org/2005/07/aaa",a=/^aria-/,b=/^wairole:/;c.attr=function(k,j,l){var m=l!==undefined;return(j=="role"?(m?f.call(this,k,j,"wairole:"+l):(f.apply(this,arguments)||"").replace(b,"")):(a.test(j)?(m?k.setAttributeNS(h,j.replace(a,"aaa:"),l):f.call(this,k,j.replace(a,"aaa:"))):f.apply(this,arguments)))};c.fn.removeAttr=function(j){return(a.test(j)?this.each(function(){this.removeAttributeNS(h,j.replace(a,""))}):e.call(this,j))}}c.fn.extend({remove:function(){c("*",this).add(this).each(function(){c(this).triggerHandler("remove")});return i.apply(this,arguments)},enableSelection:function(){return this.attr("unselectable","off").css("MozUserSelect","").unbind("selectstart.ui")},disableSelection:function(){return this.attr("unselectable","on").css("MozUserSelect","none").bind("selectstart.ui",function(){return false})},scrollParent:function(){var j;if((c.browser.msie&&(/(static|relative)/).test(this.css("position")))||(/absolute/).test(this.css("position"))){j=this.parents().filter(function(){return(/(relative|absolute|fixed)/).test(c.curCSS(this,"position",1))&&(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}else{j=this.parents().filter(function(){return(/(auto|scroll)/).test(c.curCSS(this,"overflow",1)+c.curCSS(this,"overflow-y",1)+c.curCSS(this,"overflow-x",1))}).eq(0)}return(/fixed/).test(this.css("position"))||!j.length?c(document):j}});c.extend(c.expr[":"],{data:function(l,k,j){return !!c.data(l,j[3])},focusable:function(k){var l=k.nodeName.toLowerCase(),j=c.attr(k,"tabindex");return(/input|select|textarea|button|object/.test(l)?!k.disabled:"a"==l||"area"==l?k.href||!isNaN(j):!isNaN(j))&&!c(k)["area"==l?"parents":"closest"](":hidden").length},tabbable:function(k){var j=c.attr(k,"tabindex");return(isNaN(j)||j>=0)&&c(k).is(":focusable")}});function g(m,n,o,l){function k(q){var p=c[m][n][q]||[];return(typeof p=="string"?p.split(/,?\s+/):p)}var j=k("getter");if(l.length==1&&typeof l[0]=="string"){j=j.concat(k("getterSetter"))}return(c.inArray(o,j)!=-1)}c.widget=function(k,j){var l=k.split(".")[0];k=k.split(".")[1];c.fn[k]=function(p){var n=(typeof p=="string"),o=Array.prototype.slice.call(arguments,1);if(n&&p.substring(0,1)=="_"){return this}if(n&&g(l,k,p,o)){var m=c.data(this[0],k);return(m?m[p].apply(m,o):undefined)}return this.each(function(){var q=c.data(this,k);(!q&&!n&&c.data(this,k,new c[l][k](this,p))._init());(q&&n&&c.isFunction(q[p])&&q[p].apply(q,o))})};c[l]=c[l]||{};c[l][k]=function(o,n){var m=this;this.namespace=l;this.widgetName=k;this.widgetEventPrefix=c[l][k].eventPrefix||k;this.widgetBaseClass=l+"-"+k;this.options=c.extend({},c.widget.defaults,c[l][k].defaults,c.metadata&&c.metadata.get(o)[k],n);this.element=c(o).bind("setData."+k,function(q,p,r){if(q.target==o){return m._setData(p,r)}}).bind("getData."+k,function(q,p){if(q.target==o){return m._getData(p)}}).bind("remove",function(){return m.destroy()})};c[l][k].prototype=c.extend({},c.widget.prototype,j);c[l][k].getterSetter="option"};c.widget.prototype={_init:function(){},destroy:function(){this.element.removeData(this.widgetName).removeClass(this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").removeAttr("aria-disabled")},option:function(l,m){var k=l,j=this;if(typeof l=="string"){if(m===undefined){return this._getData(l)}k={};k[l]=m}c.each(k,function(n,o){j._setData(n,o)})},_getData:function(j){return this.options[j]},_setData:function(j,k){this.options[j]=k;if(j=="disabled"){this.element[k?"addClass":"removeClass"](this.widgetBaseClass+"-disabled "+this.namespace+"-state-disabled").attr("aria-disabled",k)}},enable:function(){this._setData("disabled",false)},disable:function(){this._setData("disabled",true)},_trigger:function(l,m,n){var p=this.options[l],j=(l==this.widgetEventPrefix?l:this.widgetEventPrefix+l);m=c.Event(m);m.type=j;if(m.originalEvent){for(var k=c.event.props.length,o;k;){o=c.event.props[--k];m[o]=m.originalEvent[o]}}this.element.trigger(m,n);return !(c.isFunction(p)&&p.call(this.element[0],m,n)===false||m.isDefaultPrevented())}};c.widget.defaults={disabled:false};c.ui.mouse={_mouseInit:function(){var j=this;this.element.bind("mousedown."+this.widgetName,function(k){return j._mouseDown(k)}).bind("click."+this.widgetName,function(k){if(j._preventClickEvent){j._preventClickEvent=false;k.stopImmediatePropagation();return false}});if(c.browser.msie){this._mouseUnselectable=this.element.attr("unselectable");this.element.attr("unselectable","on")}this.started=false},_mouseDestroy:function(){this.element.unbind("."+this.widgetName);(c.browser.msie&&this.element.attr("unselectable",this._mouseUnselectable))},_mouseDown:function(l){l.originalEvent=l.originalEvent||{};if(l.originalEvent.mouseHandled){return}(this._mouseStarted&&this._mouseUp(l));this._mouseDownEvent=l;var k=this,m=(l.which==1),j=(typeof this.options.cancel=="string"?c(l.target).parents().add(l.target).filter(this.options.cancel).length:false);if(!m||j||!this._mouseCapture(l)){return true}this.mouseDelayMet=!this.options.delay;if(!this.mouseDelayMet){this._mouseDelayTimer=setTimeout(function(){k.mouseDelayMet=true},this.options.delay)}if(this._mouseDistanceMet(l)&&this._mouseDelayMet(l)){this._mouseStarted=(this._mouseStart(l)!==false);if(!this._mouseStarted){l.preventDefault();return true}}this._mouseMoveDelegate=function(n){return k._mouseMove(n)};this._mouseUpDelegate=function(n){return k._mouseUp(n)};c(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate);(c.browser.safari||l.preventDefault());l.originalEvent.mouseHandled=true;return true},_mouseMove:function(j){if(c.browser.msie&&!j.button){return this._mouseUp(j)}if(this._mouseStarted){this._mouseDrag(j);return j.preventDefault()}if(this._mouseDistanceMet(j)&&this._mouseDelayMet(j)){this._mouseStarted=(this._mouseStart(this._mouseDownEvent,j)!==false);(this._mouseStarted?this._mouseDrag(j):this._mouseUp(j))}return !this._mouseStarted},_mouseUp:function(j){c(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate);if(this._mouseStarted){this._mouseStarted=false;this._preventClickEvent=(j.target==this._mouseDownEvent.target);this._mouseStop(j)}return false},_mouseDistanceMet:function(j){return(Math.max(Math.abs(this._mouseDownEvent.pageX-j.pageX),Math.abs(this._mouseDownEvent.pageY-j.pageY))>=this.options.distance)},_mouseDelayMet:function(j){return this.mouseDelayMet},_mouseStart:function(j){},_mouseDrag:function(j){},_mouseStop:function(j){},_mouseCapture:function(j){return true}};c.ui.mouse.defaults={cancel:null,distance:1,delay:0}})(jQuery);;/*

/*	jQuery UI Draggable 1.7
	Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
	Dual licensed under the MIT (MIT-LICENSE.txt)
	and GPL (GPL-LICENSE.txt) licenses.
	http://docs.jquery.com/UI/Draggables
	Depends:
	ui.core.js
--------------------------------------------------------------*/
(function(a){a.widget("ui.draggable",a.extend({},a.ui.mouse,{_init:function(){if(this.options.helper=="original"&&!(/^(?:r|a|f)/).test(this.element.css("position"))){this.element[0].style.position="relative"}(this.options.addClasses&&this.element.addClass("ui-draggable"));(this.options.disabled&&this.element.addClass("ui-draggable-disabled"));this._mouseInit()},destroy:function(){if(!this.element.data("draggable")){return}this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy()},_mouseCapture:function(b){var c=this.options;if(this.helper||c.disabled||a(b.target).is(".ui-resizable-handle")){return false}this.handle=this._getHandle(b);if(!this.handle){return false}return true},_mouseStart:function(b){var c=this.options;this.helper=this._createHelper(b);this._cacheHelperProportions();if(a.ui.ddmanager){a.ui.ddmanager.current=this}this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.element.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};a.extend(this.offset,{click:{left:b.pageX-this.offset.left,top:b.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(b);this.originalPageX=b.pageX;this.originalPageY=b.pageY;if(c.cursorAt){this._adjustOffsetFromHelper(c.cursorAt)}if(c.containment){this._setContainment()}this._trigger("start",b);this._cacheHelperProportions();if(a.ui.ddmanager&&!c.dropBehaviour){a.ui.ddmanager.prepareOffsets(this,b)}this.helper.addClass("ui-draggable-dragging");this._mouseDrag(b,true);return true},_mouseDrag:function(b,d){this.position=this._generatePosition(b);this.positionAbs=this._convertPositionTo("absolute");if(!d){var c=this._uiHash();this._trigger("drag",b,c);this.position=c.position}if(!this.options.axis||this.options.axis!="y"){this.helper[0].style.left=this.position.left+"px"}if(!this.options.axis||this.options.axis!="x"){this.helper[0].style.top=this.position.top+"px"}if(a.ui.ddmanager){a.ui.ddmanager.drag(this,b)}return false},_mouseStop:function(c){var d=false;if(a.ui.ddmanager&&!this.options.dropBehaviour){d=a.ui.ddmanager.drop(this,c)}if(this.dropped){d=this.dropped;this.dropped=false}if((this.options.revert=="invalid"&&!d)||(this.options.revert=="valid"&&d)||this.options.revert===true||(a.isFunction(this.options.revert)&&this.options.revert.call(this.element,d))){var b=this;a(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){b._trigger("stop",c);b._clear()})}else{this._trigger("stop",c);this._clear()}return false},_getHandle:function(b){var c=!this.options.handle||!a(this.options.handle,this.element).length?true:false;a(this.options.handle,this.element).find("*").andSelf().each(function(){if(this==b.target){c=true}});return c},_createHelper:function(c){var d=this.options;var b=a.isFunction(d.helper)?a(d.helper.apply(this.element[0],[c])):(d.helper=="clone"?this.element.clone():this.element);if(!b.parents("body").length){b.appendTo((d.appendTo=="parent"?this.element[0].parentNode:d.appendTo))}if(b[0]!=this.element[0]&&!(/(fixed|absolute)/).test(b.css("position"))){b.css("position","absolute")}return b},_adjustOffsetFromHelper:function(b){if(b.left!=undefined){this.offset.click.left=b.left+this.margins.left}if(b.right!=undefined){this.offset.click.left=this.helperProportions.width-b.right+this.margins.left}if(b.top!=undefined){this.offset.click.top=b.top+this.margins.top}if(b.bottom!=undefined){this.offset.click.top=this.helperProportions.height-b.bottom+this.margins.top}},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var b=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0])){b.left+=this.scrollParent.scrollLeft();b.top+=this.scrollParent.scrollTop()}if((this.offsetParent[0]==document.body)||(this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&a.browser.msie)){b={top:0,left:0}}return{top:b.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:b.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var b=this.element.position();return{top:b.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:b.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else{return{top:0,left:0}}},_cacheMargins:function(){this.margins={left:(parseInt(this.element.css("marginLeft"),10)||0),top:(parseInt(this.element.css("marginTop"),10)||0)}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var e=this.options;if(e.containment=="parent"){e.containment=this.helper[0].parentNode}if(e.containment=="document"||e.containment=="window"){this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,a(e.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(a(e.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top]}if(!(/^(document|window|parent)$/).test(e.containment)&&e.containment.constructor!=Array){var c=a(e.containment)[0];if(!c){return}var d=a(e.containment).offset();var b=(a(c).css("overflow")!="hidden");this.containment=[d.left+(parseInt(a(c).css("borderLeftWidth"),10)||0)+(parseInt(a(c).css("paddingLeft"),10)||0)-this.margins.left,d.top+(parseInt(a(c).css("borderTopWidth"),10)||0)+(parseInt(a(c).css("paddingTop"),10)||0)-this.margins.top,d.left+(b?Math.max(c.scrollWidth,c.offsetWidth):c.offsetWidth)-(parseInt(a(c).css("borderLeftWidth"),10)||0)-(parseInt(a(c).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,d.top+(b?Math.max(c.scrollHeight,c.offsetHeight):c.offsetHeight)-(parseInt(a(c).css("borderTopWidth"),10)||0)-(parseInt(a(c).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}else{if(e.containment.constructor==Array){this.containment=e.containment}}},_convertPositionTo:function(f,h){if(!h){h=this.position}var c=f=="absolute"?1:-1;var e=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,g=(/(html|body)/i).test(b[0].tagName);return{top:(h.top+this.offset.relative.top*c+this.offset.parent.top*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(g?0:b.scrollTop()))*c)),left:(h.left+this.offset.relative.left*c+this.offset.parent.left*c-(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():g?0:b.scrollLeft())*c))}},_generatePosition:function(e){var h=this.options,b=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&a.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,i=(/(html|body)/i).test(b[0].tagName);if(this.cssPosition=="relative"&&!(this.scrollParent[0]!=document&&this.scrollParent[0]!=this.offsetParent[0])){this.offset.relative=this._getRelativeOffset()}var d=e.pageX;var c=e.pageY;if(this.originalPosition){if(this.containment){if(e.pageX-this.offset.click.left<this.containment[0]){d=this.containment[0]+this.offset.click.left}if(e.pageY-this.offset.click.top<this.containment[1]){c=this.containment[1]+this.offset.click.top}if(e.pageX-this.offset.click.left>this.containment[2]){d=this.containment[2]+this.offset.click.left}if(e.pageY-this.offset.click.top>this.containment[3]){c=this.containment[3]+this.offset.click.top}}if(h.grid){var g=this.originalPageY+Math.round((c-this.originalPageY)/h.grid[1])*h.grid[1];c=this.containment?(!(g-this.offset.click.top<this.containment[1]||g-this.offset.click.top>this.containment[3])?g:(!(g-this.offset.click.top<this.containment[1])?g-h.grid[1]:g+h.grid[1])):g;var f=this.originalPageX+Math.round((d-this.originalPageX)/h.grid[0])*h.grid[0];d=this.containment?(!(f-this.offset.click.left<this.containment[0]||f-this.offset.click.left>this.containment[2])?f:(!(f-this.offset.click.left<this.containment[0])?f-h.grid[0]:f+h.grid[0])):f}}return{top:(c-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():(i?0:b.scrollTop())))),left:(d-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(a.browser.safari&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:b.scrollLeft())))}},_clear:function(){this.helper.removeClass("ui-draggable-dragging");if(this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval){this.helper.remove()}this.helper=null;this.cancelHelperRemoval=false},_trigger:function(b,c,d){d=d||this._uiHash();a.ui.plugin.call(this,b,[c,d]);if(b=="drag"){this.positionAbs=this._convertPositionTo("absolute")}return a.widget.prototype._trigger.call(this,b,c,d)},plugins:{},_uiHash:function(b){return{helper:this.helper,position:this.position,absolutePosition:this.positionAbs,offset:this.positionAbs}}}));a.extend(a.ui.draggable,{version:"1.7",eventPrefix:"drag",defaults:{addClasses:true,appendTo:"parent",axis:false,cancel:":input,option",connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,delay:0,distance:1,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false}});a.ui.plugin.add("draggable","connectToSortable",{start:function(c,e){var d=a(this).data("draggable"),f=d.options,b=a.extend({},e,{item:d.element});d.sortables=[];a(f.connectToSortable).each(function(){var g=a.data(this,"sortable");if(g&&!g.options.disabled){d.sortables.push({instance:g,shouldRevert:g.options.revert});g._refreshItems();g._trigger("activate",c,b)}})},stop:function(c,e){var d=a(this).data("draggable"),b=a.extend({},e,{item:d.element});a.each(d.sortables,function(){if(this.instance.isOver){this.instance.isOver=0;d.cancelHelperRemoval=true;this.instance.cancelHelperRemoval=false;if(this.shouldRevert){this.instance.options.revert=true}this.instance._mouseStop(c);this.instance.options.helper=this.instance.options._helper;if(d.options.helper=="original"){this.instance.currentItem.css({top:"auto",left:"auto"})}}else{this.instance.cancelHelperRemoval=false;this.instance._trigger("deactivate",c,b)}})},drag:function(c,f){var e=a(this).data("draggable"),b=this;var d=function(i){var n=this.offset.click.top,m=this.offset.click.left;var g=this.positionAbs.top,k=this.positionAbs.left;var j=i.height,l=i.width;var p=i.top,h=i.left;return a.ui.isOver(g+n,k+m,p,h,j,l)};a.each(e.sortables,function(g){this.instance.positionAbs=e.positionAbs;this.instance.helperProportions=e.helperProportions;this.instance.offset.click=e.offset.click;if(this.instance._intersectsWith(this.instance.containerCache)){if(!this.instance.isOver){this.instance.isOver=1;this.instance.currentItem=a(b).clone().appendTo(this.instance.element).data("sortable-item",true);this.instance.options._helper=this.instance.options.helper;this.instance.options.helper=function(){return f.helper[0]};c.target=this.instance.currentItem[0];this.instance._mouseCapture(c,true);this.instance._mouseStart(c,true,true);this.instance.offset.click.top=e.offset.click.top;this.instance.offset.click.left=e.offset.click.left;this.instance.offset.parent.left-=e.offset.parent.left-this.instance.offset.parent.left;this.instance.offset.parent.top-=e.offset.parent.top-this.instance.offset.parent.top;e._trigger("toSortable",c);e.dropped=this.instance.element;e.currentItem=e.element;this.instance.fromOutside=e}if(this.instance.currentItem){this.instance._mouseDrag(c)}}else{if(this.instance.isOver){this.instance.isOver=0;this.instance.cancelHelperRemoval=true;this.instance.options.revert=false;this.instance._trigger("out",c,this.instance._uiHash(this.instance));this.instance._mouseStop(c,true);this.instance.options.helper=this.instance.options._helper;this.instance.currentItem.remove();if(this.instance.placeholder){this.instance.placeholder.remove()}e._trigger("fromSortable",c);e.dropped=false}}})}});a.ui.plugin.add("draggable","cursor",{start:function(c,d){var b=a("body"),e=a(this).data("draggable").options;if(b.css("cursor")){e._cursor=b.css("cursor")}b.css("cursor",e.cursor)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._cursor){a("body").css("cursor",d._cursor)}}});a.ui.plugin.add("draggable","iframeFix",{start:function(b,c){var d=a(this).data("draggable").options;a(d.iframeFix===true?"iframe":d.iframeFix).each(function(){a('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1000}).css(a(this).offset()).appendTo("body")})},stop:function(b,c){a("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});a.ui.plugin.add("draggable","opacity",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("opacity")){e._opacity=b.css("opacity")}b.css("opacity",e.opacity)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._opacity){a(c.helper).css("opacity",d._opacity)}}});a.ui.plugin.add("draggable","scroll",{start:function(c,d){var b=a(this).data("draggable");if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!="HTML"){b.overflowOffset=b.scrollParent.offset()}},drag:function(d,e){var c=a(this).data("draggable"),f=c.options,b=false;if(c.scrollParent[0]!=document&&c.scrollParent[0].tagName!="HTML"){if(!f.axis||f.axis!="x"){if((c.overflowOffset.top+c.scrollParent[0].offsetHeight)-d.pageY<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop+f.scrollSpeed}else{if(d.pageY-c.overflowOffset.top<f.scrollSensitivity){c.scrollParent[0].scrollTop=b=c.scrollParent[0].scrollTop-f.scrollSpeed}}}if(!f.axis||f.axis!="y"){if((c.overflowOffset.left+c.scrollParent[0].offsetWidth)-d.pageX<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft+f.scrollSpeed}else{if(d.pageX-c.overflowOffset.left<f.scrollSensitivity){c.scrollParent[0].scrollLeft=b=c.scrollParent[0].scrollLeft-f.scrollSpeed}}}}else{if(!f.axis||f.axis!="x"){if(d.pageY-a(document).scrollTop()<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()-f.scrollSpeed)}else{if(a(window).height()-(d.pageY-a(document).scrollTop())<f.scrollSensitivity){b=a(document).scrollTop(a(document).scrollTop()+f.scrollSpeed)}}}if(!f.axis||f.axis!="y"){if(d.pageX-a(document).scrollLeft()<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()-f.scrollSpeed)}else{if(a(window).width()-(d.pageX-a(document).scrollLeft())<f.scrollSensitivity){b=a(document).scrollLeft(a(document).scrollLeft()+f.scrollSpeed)}}}}if(b!==false&&a.ui.ddmanager&&!f.dropBehaviour){a.ui.ddmanager.prepareOffsets(c,d)}}});a.ui.plugin.add("draggable","snap",{start:function(c,d){var b=a(this).data("draggable"),e=b.options;b.snapElements=[];a(e.snap.constructor!=String?(e.snap.items||":data(draggable)"):e.snap).each(function(){var g=a(this);var f=g.offset();if(this!=b.element[0]){b.snapElements.push({item:this,width:g.outerWidth(),height:g.outerHeight(),top:f.top,left:f.left})}})},drag:function(u,p){var g=a(this).data("draggable"),q=g.options;var y=q.snapTolerance;var x=p.offset.left,w=x+g.helperProportions.width,f=p.offset.top,e=f+g.helperProportions.height;for(var v=g.snapElements.length-1;v>=0;v--){var s=g.snapElements[v].left,n=s+g.snapElements[v].width,m=g.snapElements[v].top,A=m+g.snapElements[v].height;if(!((s-y<x&&x<n+y&&m-y<f&&f<A+y)||(s-y<x&&x<n+y&&m-y<e&&e<A+y)||(s-y<w&&w<n+y&&m-y<f&&f<A+y)||(s-y<w&&w<n+y&&m-y<e&&e<A+y))){if(g.snapElements[v].snapping){(g.options.snap.release&&g.options.snap.release.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=false;continue}if(q.snapMode!="inner"){var c=Math.abs(m-e)<=y;var z=Math.abs(A-f)<=y;var j=Math.abs(s-w)<=y;var k=Math.abs(n-x)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m-g.helperProportions.height,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s-g.helperProportions.width}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n}).left-g.margins.left}}var h=(c||z||j||k);if(q.snapMode!="outer"){var c=Math.abs(m-f)<=y;var z=Math.abs(A-e)<=y;var j=Math.abs(s-x)<=y;var k=Math.abs(n-w)<=y;if(c){p.position.top=g._convertPositionTo("relative",{top:m,left:0}).top-g.margins.top}if(z){p.position.top=g._convertPositionTo("relative",{top:A-g.helperProportions.height,left:0}).top-g.margins.top}if(j){p.position.left=g._convertPositionTo("relative",{top:0,left:s}).left-g.margins.left}if(k){p.position.left=g._convertPositionTo("relative",{top:0,left:n-g.helperProportions.width}).left-g.margins.left}}if(!g.snapElements[v].snapping&&(c||z||j||k||h)){(g.options.snap.snap&&g.options.snap.snap.call(g.element,u,a.extend(g._uiHash(),{snapItem:g.snapElements[v].item})))}g.snapElements[v].snapping=(c||z||j||k||h)}}});a.ui.plugin.add("draggable","stack",{start:function(b,c){var e=a(this).data("draggable").options;var d=a.makeArray(a(e.stack.group)).sort(function(g,f){return(parseInt(a(g).css("zIndex"),10)||e.stack.min)-(parseInt(a(f).css("zIndex"),10)||e.stack.min)});a(d).each(function(f){this.style.zIndex=e.stack.min+f});this[0].style.zIndex=e.stack.min+d.length}});a.ui.plugin.add("draggable","zIndex",{start:function(c,d){var b=a(d.helper),e=a(this).data("draggable").options;if(b.css("zIndex")){e._zIndex=b.css("zIndex")}b.css("zIndex",e.zIndex)},stop:function(b,c){var d=a(this).data("draggable").options;if(d._zIndex){a(c.helper).css("zIndex",d._zIndex)}}})})(jQuery);;




/*---------------------------------------
	BRIEF DOCUMENT STRUCTURE OVERVIEW
-----------------------------------------*/
/*	1. object initializers
	2. home made jquery plugins
*/

/*--------------------------------------------------------------------------
	WESEED'S TOP LEVEL OBJECT INITIALIZER NAMES (alphabetically ordered)
----------------------------------------------------------------------------*/
var Validation,
	Validating,
	ValidatingHelper;

/* VALIDATION OBJECT */
Validation = {
	"__errorDefaults": {
		errorMsgBesideLbl: false,  	  // put the error message beside the label if false then put the error message beside the input
		errorBorders:      true,  	  // put a border around the error input if true
		errorMsg:          "default", // the error message, required is the default
		errorPosX:         "right",	  // place the message to the right or left of the field (field being the input or the label)
		errorPosY:		   "",		  // place the message to the top or bottom of the field (field being the input or the label)
		errorPosXAdjust:   0,		  // give a number to this if you need to adjust the x coordinate value of the error message
		errorPosYAdjust:   0		  // give a number to this if you need to adjust the y coordinate value of the error message
	},
		
	'create': function(o) {
		$("form.validateForm, div.validateForm").createFormValidation(o);
	},
	
	'fromServer': function(o) {
			o 	 = o 	  || {};
		var	data = o.data || false,
			form = o.form || false;
		if (!form) { return false; }
		form.createFormValidation(data); // {"fieldErrors":{"title":"You have already created this song. Please try another."}}
	},
	
	"removeErrorMessages": function() {
		$("i.errorLbl").remove();
		$("i.frmFldError, input.frmFldError, textarea.frmFldError").removeClass("frmFldError");
		$("div.errorMsgsWrap").remove();
		this.removeFlag();
	},
	
	"removeFlag": function() {
		this.flag = false;
	},

	"main":function(o) {
		this.flag 		 		  = false;
		this.arrFields 	 		  = o.arrFields;
		this.arrValidationFields  = o.arrValidationFields || this.arrValidationFields;
		this.frm 		 		  = o.frm;
		this.submitBtn	 		  = o.submitBtn;
		this.frmOptions  		  = o.frmOptions;
		this.onchange			  = o.onchange || false;
		this.errorMsgsNoFadeOut	  = this.frmOptions.errorMsgsNoFadeOut || false;
		this.errorMsgsFadeOutTime = this.frmOptions.errorMsgsFadeOutTime || 3000;
		this.frmAjax	 		  = this.frmOptions.ajax || false;
		this.errorStyle2 		  = this.frmOptions.errorStyle2 || false;
		this.errorMsgsWrap 		  = $("#errorMsgsWrap_"+this.frm.attr("id")) || false;
		this.errorMsgsArray 	  = [];
		this.vFromServer 	  	  = (o.fromServer) ? o.fromServer : false;
		return this.validateForm();
	},
	
	"flagOccured": function(errorMsg) {
		this.flag 	  = true;
		this.errorMsg = errorMsg;
		if (this.errorStyle2) {
			this.createErrorLblsAndBorders2();
		} else {
			this.createErrorLblsAndBorders();
		}
	},

	"validateForm": function() {
		var frm 	  	 = this.frm,
			arrFields	 = this.arrFields,
			arrFieldsRev = arrFields.get().reverse(), // to give focus to the first inputs
			field,
			arrFrmValAtt,
			vResult,
			validatingMethod;
		$.each(arrFieldsRev, function(i, val) {
			field = $(this);
			Validation.field = field;
			if (field.is(":visible") && field.is(":enabled")) {
				arrFrmValAtt = field.attr("validation").split("_");
				for (var j in arrFrmValAtt) {
					if (arrFrmValAtt[j] == "fromServer" && Boolean(Validation.vFromServer)) { // for server side validation
						for (var k in Validation.vFromServer.serverFieldErrors) {
							if (field[0].name.toLowerCase() == k.toLowerCase()) {
								/* SERVER SIDE VALIDATION
								   field[0] = the element with fromServer validation attribute value
								   k 		= the field name that the server spit back
								   Validation.vFromServer.serverFieldErrors[k] = the error message from the server
								*/
								Validating.fromServer(Validation.vFromServer.serverFieldErrors[k]);
							}
						}
					} else { // for client side validation
						if (arrFrmValAtt[j] != "fromServer") {
							validatingMethod = Validating[arrFrmValAtt[j]];
							if (typeof validatingMethod != "undefined" && validatingMethod()) { // if it is a key and the return value is true
								break;
							}
						}
					}
				}
			}
		});
		
		// FOR ERROR STYLE 2
		if (this.errorStyle2) {
			$.each(this.arrValidationFields, function(i, val) {
				$(this).unbind("change.createFormValidation");
			});
			if (!this.flag) { this.errorMsgsWrap.remove(); }
			if ( this.flag) {
				this.insertErrorMsgs();
				this.errorField.unbind("change.createFormValidation");
				this.errorField.bind("change.createFormValidation", function() { // ADDING ON CHANGE EVENT
					var frm 	  	= Validation.frm,
						frmId	  	= frm.attr("id"),
						submitBtn 	= Validation.submitBtn,
						arrFields 	= $(this),						
						frmOptions  = frm.returnJsonObject("jsonValidationOptions"),
						json 	  	= {'frm':frm, 'arrFields':arrFields, 'submitBtn':submitBtn, 'frmOptions':frmOptions, 'onchange':true};
					Validation.main(json);
				});
			} else {
				this.insertErrorMsgs(false);
			}
		}
		
		// no flag so submit that sucka!
		if (!this.flag && !this.onchange) {
			this.removeErrorMessages();
			if (this.frmAjax) {
				return false;
			} else { /* submit the form if it isn't ajax. */
				this.frm.unbind("submit.createFormValidation");
				this.frm.submit();
			}
		} else {
			return false; // there was a flag so don't submit it.
		}
	},
	
	"insertErrorMsgs": function(insertErrorMsgs) {
			insertErrorMsgs 		= (typeof insertErrorMsgs == "undefined") ? true : false;
		var frm 	  				= this.frm,
			field	  				= this.field,
			frmId    	 			= frm.attr("id"),
			errorMsgsWrap 			= this.errorMsgsWrap,
			errorMsgsArrayFormatted = this.errorMsgsArray.reverse().toString().replace(/<\/li>,/g, "</li>"); // I don't remember why I'm doing a replace?
			
		if (insertErrorMsgs) {
			if (!errorMsgsWrap.length) {
				this.createErrorMsgWrap(frmId);
				errorMsgsWrap = this.errorMsgsWrap;
			}
			this.populateErrorMsgWrap(errorMsgsWrap, errorMsgsArrayFormatted);
		} else {
			this.errorMsgsArray = [];
			errorMsgsWrap.fadeOut(function() {
				$(this).find("ul").html("");
				$(this).remove();
			});
		}
	},
	
	"populateErrorMsgWrap": function(errorMsgsWrap, errorMsgsArrayFormatted, submitButton, errorMsgsFadeOutTime) {
		submitButton 		 = arguments[2] || false;
		errorMsgsFadeOutTime = arguments[3] || this.errorMsgsFadeOutTime;
		
		
		errorMsgsWrap.find("ul:first").html(errorMsgsArrayFormatted);
		
		if (!Boolean(submitButton)) {
			this.errorMsgY = this.errorMsgY - errorMsgsWrap.height();
		} else {
			this.errorMsgX = submitButton.offset().left - 75;
			this.errorMsgY = submitButton.offset().top - submitButton.height() - errorMsgsWrap.height() - 25;
		}
		
		errorMsgsWrap.css({'top':this.errorMsgY, 'left':this.errorMsgX});
		if (!this.errorMsgsNoFadeOut) {
			TO = setTimeout( function() {
				errorMsgsWrap.fadeOut(function() {
					$(this).find("ul").html("");
					$(this).remove();
				});
			}, errorMsgsFadeOutTime);
		}
	},
	
	"createErrorMsgWrap": function(frmId) {
		$("body").append('<div class="errorMsgsWrap" id="errorMsgsWrap_'+frmId+'">' 							+
							 '<a href="javascript:;" class="errorMsgClose" title="close error message">X</a>' 	+
							 '<ul></ul>' 																		+
						 '</div>');
		this.errorMsgsWrap = $("#errorMsgsWrap_"+frmId);
		var errorMsgsWrap  = this.errorMsgsWrap;
		errorMsgsWrap.fadeIn();
		errorMsgsWrap.find("a.errorMsgClose").click(function() {
			$(this).parent().fadeOut(function() {
				var me = $(this);
				me.find("ul").html("");
				me.remove();
			});
		});
	},
	
	"createErrorLblsAndBorders2": function() { // FOR ERROR STYLE 2
		var field	 	 	= this.field,
			fieldId  	 	= field.attr("id") || "noLblId",
			lbl      	 	= $("label[for='"+fieldId+"']"),
			frmOptions 	 	= this.frmOptions,
			fieldOptions 	= field.returnJsonObject("jsonValidationOptions"),
			yPos  	 	 	= (field.attr("type") == "checkbox") ? 25 : 16,
			yAdj		 	= frmOptions.errorPosYAdjust 	|| 0,			
			xAdj		 	= frmOptions.errorPosXAdjust 	|| 0,			
			lblTextOffForm  = frmOptions.lblTextOff   || false,
			lblTextOffField = fieldOptions.lblTextOff || false,
			lblTextOnField  = (lblTextOffForm && fieldOptions.lblTextOn) ? true : false,
			lblText, errorMsg;
			
			yAdj = fieldOptions.errorPosYAdjust  || yAdj;
			xAdj = fieldOptions.errorPosXAdjust  || xAdj;
		
		if (!lblTextOffForm && !lblTextOffField || lblTextOnField) {
			lblText	= fieldOptions.errorMsg || lblText;
			lblText	= $.trim(lbl.text().replace("*",""));
			lblText = (lblText.charAt(lblText.length-1) == ":" || lblText.length === 0) ? lblText : lblText + ":";
			lblText = lblText+" "+this.errorMsg;
		} else {
			lblText = this.errorMsg;
		}
		
		errorMsg = fieldOptions.errorMsg || lblText;
		
		//this.errorMsgsArray.push("<li>"+errorMsg+"</li>"); 	// for all error messages in the errorMsgsWrap div
		this.errorMsgsArray[0] = "<li>"+errorMsg+"</li>"; 		// for one error message in the errorMsgsWrap div
		this.errorMsgY  = field.offset().top - 27 - yPos + yAdj;
		this.errorMsgX  = field.offset().left - 15 + xAdj;
		this.errorField = field;
		field.focus().select();
	},

	"createErrorLblsAndBorders": function() {
		var frm 			= this.frm,
			field			= this.field,
			frmId       	= frm.attr("id"),
			fieldId     	= field.attr("id"),
			frmAndFieldId 	= frmId+fieldId,
			lbl         	= $("label[for='"+fieldId+"']"),
			o				= {},
			frmOptions		= this.frmOptions,
			fieldOptions	= field.returnJsonObject("jsonValidationOptions"),
			error,
			xWidth,
			xHeight,
			errorWidth,
			xPos,
			yPos,
			errorMsgBesideLbl,
			errorMsg,
			isCheckbox, isSelect, is4Sides, css4sides, cbW, cbH, cbX, cbY, brd;

		/* custom options
		   to override the default you would give the html element an attribute of options and set it equal to the json object
		   e.g., {errorMsgBesideLbl:false, errorBorders:false, errorMsg:'error message', errorPosX:'left', errorPosY:'top', errorPosXAdjust:20, errorPosYAdjust:20}
		*/
		// build main options before element iteration
		$.extend(o, this.__errorDefaults, frmOptions, fieldOptions);

		field.focus().select();

		errorMsgBesideLbl = (!lbl.attr('for')) ? false : o.errorMsgBesideLbl;		// if there is no for attribute then don't show the error message label
		errorMsg 		  = (o.errorMsg == "default") ? this.errorMsg : o.errorMsg;	// if there is jsonValidationOptions="{errorMsg:'custom message'}" then overide the default error message 
		
		if (o.errorBorders) { // if you want borders around the input where the error occurred
			isCheckbox = (field.attr("type") == "checkbox") 		  ? true: false;
			isSelect   = (field[0].tagName.toLowerCase() == "select") ? true: false;
			if (isCheckbox || isSelect) {
				for (var j=1; j < 5; j++) {
					is4Sides = ($("i#"+frmAndFieldId+"_"+j).length) ? true : false;
					if (is4Sides) { break; }
				}
				if (!is4Sides) { // if element doesn't exists
					cbW = 0;
					cbH = (isCheckbox) ? field.innerHeight() - 2 : field.innerHeight();
					cbX = field.offset().left;
					cbY = field.offset().top;
					brd = "left";
					this.createBorderSide(cbW, cbH, cbX, cbY, brd, frmAndFieldId, 1); // LEFT
					
					cbH = (isCheckbox) ? field.innerHeight() - 2 : field.innerHeight();
					cbX = (isCheckbox) ? (field.offset().left + field.innerWidth()) - 1 : (field.offset().left + field.innerWidth()) + 1;
					this.createBorderSide(cbW, cbH, cbX, cbY, brd, frmAndFieldId, 2); // RIGHT
					
					cbH = 0;
					cbW = (isCheckbox) ? field.innerWidth() - 2 : field.innerWidth();
					cbX = field.offset().left;
					brd = "top";
					this.createBorderSide(cbW, cbH, cbX, cbY, brd, frmAndFieldId, 3); // TOP
					
					cbY = (isCheckbox) ? (field.offset().top + field.innerHeight()) - 1 : (field.offset().top + field.innerHeight()) + 1;
					this.createBorderSide(cbW, cbH, cbX, cbY, brd, frmAndFieldId, 4); // BOTTOM
				}
			} else {
				field.addClass("frmFldError");
			}
		}

		if (!$("#"+frmAndFieldId).length) { // if label doesn't already exist
			if (errorMsg) {
				$("body").append('<i class="errorLbl" id="'+frmAndFieldId+'">'+errorMsg+'</i>');
				error  	   = $("i#"+frmAndFieldId);
				errorWidth = error.width();
			} else {
				errorWidth = 0;
			}
			if (errorMsgBesideLbl) {
				switch (o.errorPosX) {
					case "right":
						xWidth = lbl.width() + 5;
						errorWidth = 0;
						break;
					case "left":
						xWidth = -($("#"+frmAndFieldId).width() + 2);
						break;
					default:
						xWidth = 0;
						// do nothing
				}				
				switch (o.errorPosY) {
					case "top":
						xHeight = -(lbl.height() - 8);
						break;
					case "bottom":
						xHeight = lbl.height() + 2;
						break;
					default:
						xHeight = 3;
						// do nothing
				}
				xPos = (lbl.offset().left + xWidth)  + (o.errorPosXAdjust + errorWidth) || lbl.offset().left + xWidth;
				yPos = (lbl.offset().top  + xHeight) + o.errorPosYAdjust 			    || lbl.offset().top  + xHeight;

			} else {
				switch (o.errorPosX) {
					case "right":
						xWidth = field.width() + 18;
						errorWidth = 0;
						break;
					case "left":
						xWidth = -($("#"+frmAndFieldId+"").width() + 5);
						break;
					default:
						xWidth = 0;
						// do nothing
				}				
				switch (o.errorPosY) {
					case "top":
						xHeight = -(20);
						break;
					case "bottom":
						xHeight = field.height() + 10;
						break;
					default:
						xHeight = 0;
						// do nothing
				}
				xPos = (field.offset().left + xWidth)  + (o.errorPosXAdjust + errorWidth) || field.offset().left + xWidth;
				yPos = (field.offset().top  + xHeight) + o.errorPosYAdjust 				  || field.offset().top  + xHeight;
			}

			// result
			$("#"+frmAndFieldId).css({ left:xPos, top:yPos });
		}
	},
	
	"createBorderSide": function(cbW, cbH, cbX, cbY, brd, frmAndFieldId, j) {
		var css4sides = 'width:'+cbW+'px; height:'+cbH+'px; left:'+cbX+'px; top:'+cbY+'px; border-'+brd+':none !important';
		$("body").append('<i class="errorLbl frmFldError" id="'+frmAndFieldId+'_'+j+'" style="'+css4sides+'"></i>');
	}
};

Validation.removeFlag(); // initialize the flag, set it to false;


/* VALIDATING OBJECT - IMPORTANT required method needs to be first then the rest of the methods are in alphabetical order */
Validating = {
	"required": function() {
		var field = Validation.field;
		if ($.trim(field.val()) === "" || field.hasClass("placeholder")) {
			Validation.flagOccured('required');
			return true;
		}
	},
	"alphanumeric": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		var reg = new RegExp(/^[0-9a-zA-Z]+$/);
		if (!reg.test(field.val())) {
			Validation.flagOccured('only numbers and letters');
			return true;
		}
	},
	"alphanumericAndSpaces": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		var reg = new RegExp(/^[0-9a-zA-Z ]+$/);
		if (!reg.test(field.val())) {
			Validation.flagOccured('only numbers, letters and spaces');
			return true;
		}
	},
	"checked": function() {
		var field = Validation.field;
		if (field[0].checked === false) {			
			Validation.flagOccured('required');
			return true;
		}
	},
	"currency": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		var vChars = "0123456789.,$";
		for (var i = 0; i < field.val().length; i++) {
			if (vChars.indexOf(field.val().charAt(i)) == -1) {
				Validation.flagOccured('only numbers (0-9), dollar sign, commas and a period are allowed');
				return true;
			}
		}
	},
	"email": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		var reg = new RegExp(/^(("[\w\-\s]+")|([\w\-\+]+(?:\.[\w\-]+)*)|("[\w\-\s]+")([\w\-]+(?:\.[\w\-]+)*))(@((?:[\w\-]+\.)*\w[\w\-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
		if (!reg.test(field.val())) {
			Validation.flagOccured('invalid email');
			return true;
		}
	},
	"length": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		var pLength 	= 10,
			o 			= field.returnJsonObject("jsonValidationOptions"),
			charLength 	= o.charLength || false;
		pLength = (charLength) ? charLength : pLength; // if you need the max characters to be higher then 10 then specify it on the element like this jsonValidationOptions="{'charLength':20}"
		if (field.val().length < pLength) {
			Validation.flagOccured('at least '+pLength+' characters required');
			return true;
		}
	},
	"match": function() {
		var field 	  = Validation.field,
			arrFields = Validation.arrValidationFields,
			testConfirmField;
		if (field.val() === "") { return false; }
		
		var arrValidationAttr = field.attr("validation").split("_"),
			matchX,
			arrConfirms = [];
			
		$.each(arrValidationAttr, function(i, val) {
			if (val == "match") {
				matchX = arrValidationAttr[i + 1]; // example match1
			}
		});

		$.each(arrFields, function(i, val) {
			arrValidationAttr = $(this).attr("validation").split("_");
			for (var j in arrValidationAttr) {
				if (arrValidationAttr[j] == matchX) {
					arrConfirms.push($(this));
				}
			}
		});
		
		testConfirmField = Validation.field.attr("id") == arrConfirms[1].attr("id");
		testConfirmField = (arrConfirms[1].attr("validation").indexOf("required") == -1) ? true : testConfirmField;
		
		if (arrConfirms[0].val() != arrConfirms[1].val() && testConfirmField) {
			Validation.field = arrConfirms[1]; // special case.
			Validation.flagOccured('your fields did not match');
			return true;
		}
	},
	"maxLength": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		var pLength 	= 30,
			o 			= field.returnJsonObject("jsonValidationOptions"),
			maxLength 	= o.maxLength || false;
		pLength = (maxLength) ? maxLength : pLength; // if you need a custom maxLength jsonValidationOptions="{'maxLength':20}"
		if (field.val().length > pLength) {
			Validation.flagOccured('only '+pLength+' characters allowed');
			return true;
		}
	},
	"maxNumber": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
 		
 		var	o 	= field.returnJsonObject("jsonValidationOptions"),
			max = o.maxNumber || 10000000;
 		
		if (!(ValidatingHelper.stripCommas(field.val()) <= max)) {
			Validation.flagOccured(ValidatingHelper.addCommas(max)+' is the maximum amount');
			return true;
		}
	},
	"minimumAge": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		
		var o 			= field.returnJsonObject("jsonValidationOptions"),
			minimumAge 	= o.minimumAge || 13, 		// Children's Online Privacy Protection Act, must be 13 or over
			now 		= new Date(),
	      	fldDate  	= field.val().split('-'), 	// format must be: yyyy-mm-dd
	      	born, years, base, myAge, frmAndMeId;
	      
		if (fldDate.length == 3) { // if it is a date.
			born  = new Date(fldDate[0], fldDate[1]*1-1, fldDate[2]);
			years = new Date(now.getTime() - born.getTime());
			base  = new Date(0);
			myAge = (years.getFullYear()-1) - base.getFullYear();
			if (myAge < minimumAge) {
				Validation.flagOccured('you must be '+minimumAge+' or over');
				return true;
			}
		}
	},
	"number": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		if (isNaN(ValidatingHelper.stripCommas(field.val()))) { // isNaN() checks if a value is not a number
			Validation.flagOccured('only numeric values');
			return true;
		}
	},
	"phone": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; } 					// If it is blank that is ok if it is required, the required() will pick it up.
		var digits = "0123456789",									// Declaring required variables
			phoneNumberDelimiters = "()-. ",						// non-digit characters which are allowed in phone numbers
			validWorldPhoneChars = phoneNumberDelimiters + "+",		// characters which are allowed in international phone numbers (a leading + is OK)
			minDigitsInIPhoneNumber = 10;							// Minimum no of digits in an international phone no.

		function isInteger(s) {   
			for (var i = 0; i < s.length; i++) {   
				// Check that current character is number.
				var c = s.charAt(i);
				if (((c < "0") || (c > "9"))) { return true; }
			}
			// All characters are numbers.
			return true;
		}

		function stripCharsInBag(s, bag) {
			var returnString = "";
			// Search through string's characters one by one. If character is not in bag, append to returnString.
			for (var i = 0; i < s.length; i++) {   
				// Check that current character isn't whitespace.
				var c = s.charAt(i);
				if (bag.indexOf(c) == -1) { returnString += c; }
			}
			return returnString;
		}

		function checkInternationalPhone(strPhone) {
			s = stripCharsInBag(strPhone,validWorldPhoneChars);
			return (isInteger(s) && s.length >= minDigitsInIPhoneNumber);
		}

		if (checkInternationalPhone(field.val())===false) {
			Validation.flagOccured('invalid phone');
			return true;
		}
	},
	"positiveWholeNumber": function() {
		var field = Validation.field;
		var val = field.val();
		if (val === "") { return false; }
		val = ValidatingHelper.stripCommas(val);
		
		//var regNeg = new RegExp(/^\s*(\+|-)?\d+\s*$/); 	// allow negative numbers
 		//var regPos = new RegExp(/^[1-9]+[0-9]*$/);			// no negative numbers or zero

		if (isNaN(val) || (Number(val) % 1 != 0) || Number(val) <= 0) {
			Validation.flagOccured('only positive whole numbers');
			return true;
		}
	},
	"selected": function() {
		var field = Validation.field;
		if (field[0].selectedIndex === 0) {
			Validation.flagOccured('must select one');
			return true;
		}
	},
	"zip": function() {
		var field = Validation.field;
		if (field.val() === "") { return false; }
		var temp,
			valid 		= "0123456789-",
			hyphencount = 0,
			vFldValue 	= field.val();

		if (vFldValue.length != 5 && vFldValue.length != 10) {
			Validation.flagOccured('invalid zip code. 5 digit or 5 digit + 4. e.g., 12345 or 12345-6789');
			return true;
		}	
		for (var i=0; i < vFldValue.length; i++) {
			temp = "" + vFldValue.substring(i, i+1);
			if (temp == "-") {
				hyphencount++;
			}
			if (valid.indexOf(temp) == "-1") {
				Validation.flagOccured('invalid characters in your zip code');
				return true;
			}
			if ((hyphencount > 1) || ((vFldValue.length==10) && "" + vFldValue.charAt(5) != "-")) {
				Validation.flagOccured('hyphen is needed with extended zip code.  e.g., 12345-6789');
				return true;
			}
		}
	},	
	"fromServer": function(msg) {
		var field = Validation.field;
		Validation.flagOccured(msg);
		return true;
	}
};

/* VALIDATING HELPER OBJECT - (useful functions that involve text or numbers) */
ValidatingHelper = {
	"addCommas": function(nStr) {
		nStr 	+= '';
		var x    = nStr.split('.'),
			x1   = x[0],
			x2   = x.length > 1 ? '.' + x[1] : '',
			rgx  = /(\d+)(\d{3})/;
		while (rgx.test(x1)) {
			x1 = x1.replace(rgx, '$1' + ',' + '$2');
		}
		return x1 + x2;
	},
	"stripCommas":function(str) {
	    var re = /,/g;
	    return str ? str.replace(re,"") : str;
	}
};

/*---------------------
	FORM VALIDATION
-----------------------*/
(function($){
	// BIND INTO STACK
	$.extend($.fn, {
		// Determine the objects position in the cache, if any
		cachePosition: function(){
			return $.data(this[0]);
		},
		
		// Allow the user to splice an event into a specific position in the event cache 
		bindIntoStack: function(pos, type, func){
			return this.each(function(){
				var namespaces = type.split("."),	// Explode out namespaces, if any
					evType = namespaces.shift(),	// Grab the actual type
					el = $(this),					// Use the jQuery reference to the first element instead of the domElement
					position = el.cachePosition();	// Get the location of the element in the cache.
				
				if (!position) { return; }			// If we have a position, we can access the cache, which holds the jQuery event stack.
					
				var cache = $.cache[ position ];	// Grab a reference to the cache so we can do some sanity checks

				el.bind(type, func);				// Now we need to bind the new function to the call stack through jQuery

				if (!cache ||						// If we don't have the a pre-existing event cache, bind the function as a new entry and exit
					!cache.events || 
					!cache.events[ evType ]) { return;	}
					
				var events = cache.events[ evType ],// Grab a copy of the events cache for the given type
					fromExpando = [],				// [stackPosition => uuidIDInjQueryCache, ...]
					toReplace = null,				// A copy of the function we'll be replacing, if any
					i = 0;
					
				$.each(events, function(k){
					fromExpando.push(k);
					if (i == pos) { toReplace = this; } // If the positions are equal, this is the function we want to replace
					++i;
				});
				
				if (!toReplace) { return; }	 		// If the position in the stack has not yet been reached, there's no slicing to be done

				var newPos = fromExpando.pop();		// The position we'll be placing in
				
				// Perform the actual position swap in the cache
				if (typeof $.cache[ position ].events[ evType ][ fromExpando[pos] ] != "undefined") {
					$.cache[ position ].events[ evType ][ fromExpando[pos] ] = $.cache[ position ].events[ evType ][ newPos ];
				}
				$.cache[ position ].events[ evType ][ newPos ] = toReplace;
			});
			
			// return this; // you can't get here
		}
	});
	
	/* return eval-ed content of an element's attribute (needs to be a js object in the attribute) */
	$.fn.returnJsonObject = function(htmlAttr) {
		if(!this || !this[0]){return false;}
		var meAttr = $(this).attr(htmlAttr);
		return (meAttr) ? eval('(' + meAttr + ')') : false;
	};
	
	$.fn.createFormValidation = function(o) {
		if(!this || !this[0]){return false;}
			o		   		  = o || {};
		var	serverError		  = o.errorMessages || false, // server error
			serverFieldErrors = o.fieldErrors   || false; // for server side validation
		
		$(this).each(function(i, val) {
			var frm 	  	 = $(this),
				frmId	  	 = frm.attr("id"),
				submitBtn 	 = o.submitButton || frm.find(".submitButton"),
				arrFields 	 = frm.find("input[validation], textarea[validation], select[validation]"),
				frmOptions   = frm.returnJsonObject("jsonValidationOptions"),
				json 	  	 = {'frm':frm, 'arrFields':arrFields, 'arrValidationFields':arrFields, 'submitBtn':submitBtn, 'frmOptions':frmOptions},
				errorStyle2  = frmOptions.errorStyle2  || false,
				noKeyupEvent = frmOptions.noKeyupEvent || false;

			if (Boolean(serverError)) { // server error messages
				var errorMsgsArray = [],
					errorMsgsArrayFormatted;
				for (var j in serverError) {
					if (serverError.hasOwnProperty(j)) {
						errorMsgsArray.push("<li>"+serverError[j]+"</li>");
					}
				}
				Validation.createErrorMsgWrap("serverError");
				errorMsgsArrayFormatted = errorMsgsArray.toString().replace(/<\/li>,/g, "</li>"); // I don't remember why I'm doing a replace?
				Validation.populateErrorMsgWrap(Validation.errorMsgsWrap, errorMsgsArrayFormatted, submitBtn, 4500);
				return false;
			}
			
			if (Boolean(serverFieldErrors)) { // for server side validation
				fromServer = {'fromServer':{'serverFieldErrors':serverFieldErrors}};
				$.extend(json, fromServer);
				return Validation.main(json);
			}
			
			if (typeof submitBtn[0] == "undefined") { return false; } // no submit button so don't bind. 
			
			if (frm[0].tagName.toLowerCase() == "form") {	// IF $(this) IS A FORM
				frm.unbind("submit.createFormValidation");
				frm.bindIntoStack(0, "submit.createFormValidation", function(){
					return Validation.main(json);
				});
			}
			
			submitBtn.unbind("mouseup.createFormValidation");
			submitBtn.bind("mouseup.createFormValidation", function(){
				/*  * if Validation.flag == false, it returns true and submits the form.
					* if Validation.flag == true, it returns false and doesn't submit the form.
					* if Validation.flag == false && Validation.frmAjax == true, it returns false
					      and doesn't submit the form. Meaning that, there were no errors but
					      Validation.frmOptions.ajax was set to true in the jsonValidationOptions
					      form tag attribute. Then in some other js method the ajax call is made
					      right after the code if (Validation.flag) { return false }
					      which is located in the same method.
				*/
				Validation.main(json);
			});
			
			if (!noKeyupEvent) {
				frm.unbind("keyup.createFormValidation");
				frm.bind("keyup.createFormValidation", function(e) {
					if(e.keyCode == 13 && e.target.tagName.toLowerCase() == "input") {
						Validation.main(json);
					}
				});
			}
			
			// Validate Form Attach On Change To Flds
			if (!errorStyle2) {
				$.each(arrFields, function(i, val) {
					var field 	  = $(this),
						fieldJson = field.returnJsonObject("jsonValidationOptions"),
						me, meId, frmAndMeId;
					
					field.unbind("change.createFormValidation");
					field.bind("change.createFormValidation", function() {
						me 			= $(this);
						meId 		= me.attr("id");
						frmAndMeId  = frmId + meId;
						me.removeClass("frmFldError");
						$("i#"+frmAndMeId).remove();
						for (var j=1; j < 5; j++) {
							$("i#"+frmAndMeId+"_"+j).remove();
						}
						
						// not used very often, only when you set another fields value and then have to force the change event to happen on that field.
						if (fieldJson && fieldJson.fireChangeOnField) {
							frm.find("[name='"+fieldJson.fireChangeOnField+"']").trigger('change.createFormValidation');
						}
					});
				});
			}
		});
	};
})(jQuery);

// Copyright 2007 Google, Inc.
// This sample code is under the Apache2 license, see
// http://www.apache.org/licenses/LICENSE-2.0 for license details.
/**
 * @fileoverview Wrapper for Time Tracking
 */

/**
 * @class Time Tracking component.
 *     This class encapsulates all logic for time tracking on a particular
 *     page. Time tracking could be for any object within a page or the page
 *     itself.
 *
 * @param {Array.<Number>} arg1 Optional array that represents the bucket
 * @constructor
 */
var TimeTracker = function(opt_bucket) {
  if (opt_bucket) {
    this.bucket_ = opt_bucket.sort(this.sortNumber); 
  } else {
    this.bucket_ = TimeTracker.DEFAULT_BUCKET;
  }
};

TimeTracker.prototype.startTime_;
TimeTracker.prototype.stopTime_;
TimeTracker.prototype.bucket_;
TimeTracker.DEFAULT_BUCKET = [100, 500, 1500, 2500, 5000];

/**
 * Calculates time difference between start and stop
 * @return {Number} The time difference between start and stop
 */
TimeTracker.prototype._getTimeDiff = function() {
  return (this.stopTime_ - this.startTime_);
};

/**
 * Helper function to sort an Array of numbers
 * @param {Number} arg1 The first number
 * @param {Number} arg2 The second number
 * @return {Number} The difference used to sort
 */
TimeTracker.prototype.sortNumber = function(a, b) {
  return (a - b);
}

/**
 * Records the start time
 * @param {Number} arg1 Optional start time specified by user
 */
TimeTracker.prototype._recordStartTime = function(opt_time) {
  if (opt_time != undefined) {
    this.startTime_ = opt_time;
  } else {
    this.startTime_ = (new Date()).getTime();
  }
};

/**
 * Records the stop time
 * @param {Number} arg1 Optional stop time specified by user
 */
TimeTracker.prototype._recordEndTime = function(opt_time) {
  if (opt_time != undefined) {
    this.stopTime_ = opt_time;
  } else {
    this.stopTime_ = (new Date()).getTime();
  }
};

/**
 * Tracks the event. Calculates time and sends information to
 * the event tracker passed
 * @param {Object} arg1 GA tracker created by user
 * @param {String} arg2 Optional event object name
 * @param {String} arg3 Optional event label
 */
TimeTracker.prototype._track = function(tracker,
                                        opt_event_obj_name,
                                        opt_event_label) {
  var eventTracker;
  if (opt_event_obj_name != undefined && opt_event_obj_name.length != 0) {
    eventTracker = tracker._createEventTracker(opt_event_obj_name);
  } else {
    eventTracker = tracker._createEventTracker('TimeTracker');
  }

  var i;
  var bucketString;
  for(i = 0; i < this.bucket_.length; i++) {
    if ((this._getTimeDiff()) < this.bucket_[i]) {
      if (i == 0) {
        bucketString = "0-" + (this.bucket_[0]);
        break;
      } else {
        bucketString = this.bucket_[i - 1] + "-" + (this.bucket_[i] - 1);
        break;
      }
    }
  }
  if (!bucketString) {
    bucketString = this.bucket_[i - 1] + "+";
  }
  eventTracker._trackEvent(bucketString, opt_event_label, this._getTimeDiff());
};

/**
 * Sets the bucket for histogram generation in GA
 * @param {Array.<Number>} The bucket array
 */
TimeTracker.prototype._setHistogramBuckets = function(buckets_array) {
  this.bucket_ = buckets_array.sort(this.sortNumber);
};


// NOTE: THIS FILE IS DEPRECATED.

/*---------------------------------------
	BRIEF DOCUMENT STRUCTURE OVERVIEW
-----------------------------------------*/
/*	[G1] set weseed CONSTANTS
	[G2] hash helper for direct linking
	[G3] object initializers
	[G4] object prototypes
	[G5] homemade jquery plugins
	[G6] attach events to elements when dom loads
*/

/*-----------------------------------------------------------------------
	[G0] WESEED URLS (to ease the pain of transition)
-------------------------------------------------------------------------*/
var URL = {
	"account": {
		"accountPages":/^\/signup|^\/login/,
		"logout":"/logout",
		"signup":"/signup-post"
	},
	"common": {
		"modalFrame" : "/common/modal-frame/"
	},
	"company": {
		"topCompanyActivity":function(id) {
			return "/feed/company_trade/" + id;
		}
	},
	"learn": {
		"topicComplete": function(levelSlug,topicSlug) {
			return "/learn/"+levelSlug+"/"+topicSlug+"/completed/";
		}
	},
	"portfolio": {
		"addFundsModal":function(url) {
			return url+"?modal";
		},
		"base":"/portfolio"
	},
	"signup": {
		"between13and17message":"/authentication/sign_up_between_13_and_17_message",
		"thankYouMessage":"/authentication/sign_up_thank_you",
		"under13message":"/authentication/sign_up_under_13_message"
	}
};
/*-------------------------------------------------------------------------------------------------------
	[G2] Self-Invoking Function - so if a person copies or bookmarks the link the right section will show.
---------------------------------------------------------------------------------------------------------
(function(){ 
	var hash = window.location.hash;
	if ($.trim(hash.split('#')[1]) !== "") {
		hash = Json.urlDecode(hash);
		var hashSplit1 = hash.split('#')[1];
		if (hashSplit1.indexOf("{") === -1) { return false; }
		var	json = JSON.parse(hashSplit1),
			newBodyElement;
		if (typeof json.href !== 'undefined' && json.href !== ''){
			// prevents jQuery errors
			newBodyElement = document.createElement("body");
			if($.browser.msie) {
				document.appendChild(newBodyElement);
			} else {
				document.body = newBodyElement;
			}
			window.location = json.href;
		}
	}
})();*/

/*--------------------------------------------------------------------------
	[G3] WESEED'S TOP LEVEL OBJECT INITIALIZER NAMES (alphabetically ordered)
----------------------------------------------------------------------------*/
var CB,				// CB means callback. Object used in $.fn.submitForm
	Cookie,			// Helper methods for working with cookies
	EventHandler,	// Where we attach our events to dom objects/elements
	Strings,		// Helper methods when dealing with strings
	WeSeed;			// Various methods in WeSeed namespace
var BrightCove = {};// Global brightcove namespace (deprecated)

/*--------------------
	COOKIE MONSTER
----------------------*/
Cookie = {
	create:function(name,value,days) {
		var expires, date;
		if (days) {
			date	= new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			expires = "; expires="+date.toGMTString();
		} else {
			expires = "";
		}
		document.cookie = name+"="+value+expires+"; path=/";
	},
	read:function(name) {
		var nameEQ = name + "=";
		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(nameEQ) === 0) {
				return c.substring(nameEQ.length,c.length);
			}
		}
		return false;
	},
	erase:function(name) {
		this.create(name,"",-1);
	},
	eraseAll:function() {
		var cookieString = document.cookie;
		var cookies = cookieString.split(";");
		for (i=0; i < cookies.length; i++) {
			var cookie = unescape(cookies[i].split("=")[0]);
			var date = new Date();
			date.setTime(date.getTime()-1*24*60*60*1000);
			document.cookie = cookie += "=; expires=" + date.toGMTString() +"; path=/";
		}
	}
};

/*-----------------------------
	CUSTOM CALLBACK METHODS
-------------------------------*/
CB = {
	"main": function(me, frm, jsonMe, callback, data) {
		this.me		= me;
		this.frm	= frm;
		this.jsonMe = jsonMe;
		this.flag   = false;
		this.TO		= false;
		this.data   = (typeof data != "undefined") ? data : false;
		callback();
	},
	"accountReset": {
		"before": function() {
			if (Validation.flag) { CB.flag = true; return false; }
		},
		"after": function() {
			if (CB.data.error) {
				Validation.fromServer({"data":CB.data, "form":CB.frm});
				return false;
			} else {
				CB.frm.find("input:text").val('');
				CB.frm.find("input:checkbox").attr("checked","");
				$("p.dynLoadingSmall").showRemoveAjaxMsg({"cssClass":"dynMsgMsg", "txt":CB.data.successMessages[0], "xPos":-100, "timeout":4000});
			}
		}
	},
	"accountAddFunds": {
		"before": function() {
			if (Validation.flag) { CB.flag = true; return false; }
		},
		"after": function() {
			if (CB.data.error) {
				Validation.fromServer({"data":CB.data, "form":CB.frm});
				return false;
			} else {
				CB.frm.find("input:text").val('');
				$("p.dynLoadingSmall").showRemoveAjaxMsg({"cssClass":"dynMsgMsg", "txt":CB.data.successMessages[0], "xPos":-100, "timeout":4000});
				
				// alert any listeners
				$(window).trigger("weseed.accountAddFunds.success");
			}
		}
	},	
	"eduSubcribeToEmail": {
		"before": function() {
			if (Validation.flag) { CB.flag = true; return false; }
		},
		"after": function() {
			CB.frm.slideUp("slow");
			setTimeout(function() {
					CB.frm.prev().find("a").fadeOut(function() {
						$(this).replaceWith("<strong>Thank you for subscribing. The e-letter is coming your way!</strong>");
					});
				}, 500);
		}
	},	
	"groupCreate": {
		"before": function() {
			if (CB.frm.find("div.cashBalance").length) {
				CB.frm.find("div.cashBalance label:lt(4)").click(function() {
					$('#cashBalanceOther').change();
				});
			}
			if (Validation.flag) { CB.flag = true; return false; }
		},
		"after": function() {
			if (CB.data.error) {
				CB.me.showRemoveAjaxMsg({cssClass:"dynMsgError", txt:CB.data.errorMessages[0]});
				//Validation.fromServer({"data":CB.data, "form":CB.frm});
				return false;
			} else {
				$("p.dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgMsg", txt:CB.data.successMessages[0]});
				window.location = "/group/" + $.trim(CB.data.attributes.groupSlug) + "/invite-members";
				//console.log(CB);
			}
		}
	},
	"portfolioCreate": {
		"before": function() {
			if (Validation.flag) { CB.flag = true; return false; }
		},
		"after": function() {
			var data = CB.data;
			
			if (data.error) {
				Validation.fromServer({"data":data, "form":CB.frm});
				return false;
			} else {
				CB.me.showRemoveAjaxMsg({cssClass:"dynMsgMsg", txt:data.successMessages[0], xPos:-278, yPos:-20});
				$("#portfolioManager").find(".iClose").click();
				window.location = "/portfolio";
			}
		}
	},
	"portfolioEdit": {
		"before": function() {
			if (Validation.flag) { CB.flag = true; return false; }
		},
		"after": function() {
			if (CB.data.error) {
				Validation.fromServer({"data":CB.data, "form":CB.frm});
				return false;
			} else {
				$("#portfolioManager").find(".iClose").click();
				window.location = "/portfolio";
			}
		}
	}
};

/*--------------------------
	EVENT HANDLER OBJECT (Router)
----------------------------*/
EventHandler = {
	// WHERE THE MAGIC HAPPENS
	onload:function() {
		// contains events that are bound on every page load, only once.
		Validation.create();
		
		// Load the page-specific events based on the <body> ID
		/*if($("body").attr("id") && this.page[$("body").attr("id")]) {
			this.page[$("body").attr("id")]();
		}*/
		
		// COMMENTING (#areaCompanies, #areaGroup) - ON LOAD only
		//$("form.frmPostUpdate .btnSubmitFeedBack").saveFeedGossip();
		
		// Side panel window shades
		
		// Sign-Up message
		// WeSeed.showSignUpMsgAfterXClicks();
		
		//$.sortListDropDownOnLoad();
		
		// Search Controls
		$("form.mainSearchForm").weseedSuggest();

		// load the ubiquitous bindings
		this.actions();
		
		// Facebook Connect
		//WeSeed.fb._init();
		
		// HISTORY MANAGER
		// HistoryManager.__click.click = true;
		// 		WeSeed.checkHashInterval = window.setInterval( HistoryManager.loadHistoryHash, 100 );		
	},
	actions:function(){
		// contains global events that should be continuously bound on every change
		// use as sparingly as possible.

		// Autogrow Textarea - global
		$(".commentPostForm textarea").textPlus();
		$(".pComment textarea").textPlus();

		// sortListDropDown - global
		$("ul.listSortDD > li > a").sortListDropDown($(".listSortDD .list"));
		
		// add style classes to account for lack of [type=""] CSS selector
		// support
		$.upgradeIE6();
		
		// follow portfolio button
		//$(".btnFollowPortfolio").followPortfolio();
		
		// #areaProfile - needs rebinding after refresh
		var managerLink = $(".btnPortfolioManager").attr("href");
		$(".btnPortfolioManager").createModal({modalId:"portfolioManager", method:managerLink, callback:{method:'modalPortfolioManager'}});
	
		// Join network/group button
		$(".btnJoinNetwork").joinNetwork();
		
		// Trade Button
		this.tradeIt();
		
		WeSeed.fairPriceRating();
		
		// List-module form plugin
		$(".listModuleFrm").listModuleFrm();
		
		// Used: #areaSocial - secContent, #areaProfile
		$("a.createGroupTeam").createModal({modalId:"createGroupTeamModal", method:"/group/0/new", callback:{method:'modalGroupsAndTeams'}});
		
		$("a.external").externalLink();

		this.prompts();		// Site lock-down messages
		this.commenting();	// COMMENTING (#areaCompanies, #areaGroup
	},
	page:{
		areaCompanies:function(){
			// actions
			//$("ul#rateMe").rateCompanyWrap(); // UL THAT HOLDS THE RATING STARS
			// carousels
			//var visible = 5;
			/*if($("#memberScroller li").length > visible){
				$("#memberScroller .scrollerMiniWrapper").unbind().jCarouselLite({
					btnNext: "#memberScroller .btnRight",
					btnPrev: "#memberScroller .btnLeft",
					visible: visible,
					scroll: 3,
					speed: 400
				});
			} else {
				$("#memberScroller ul").addClass("noScroll");
				$("#memberScroller .btnLeft").addClass("hide");
				$("#memberScroller .btnRight").addClass("hide");
			}
			if($("#companyScroller li").length > visible){
				$("#companyScroller .scrollerMiniWrapper").unbind().jCarouselLite({
					btnNext: "#companyScroller .btnRight",
					btnPrev: "#companyScroller .btnLeft",
					visible: visible,
					scroll: 3,
					speed: 400
				});
			} else {
				$("#companyScroller ul").addClass("noScroll");
				$("#companyScroller .btnLeft").addClass("hide");
				$("#companyScroller .btnRight").addClass("hide");
			}*/
			/* Load the WeSeedToday videos if there's an object loaded 
			if(typeof brightCoveJson != "undefined") {
				$("#WeSeedToday").getWeSeedToday({"brightCoveJson":brightCoveJson});
			}*/
		},
		areaContests:function() {
			if($(".contestForm").length) {
				WeSeed.Controller.contests.fbla();
			}
		},
		areaEducators:function(){
			Validation.create();
			$('a.openUpToggle, img.openUpToggle').openUpToggle();
			$("form.subscribeForm a.actionBtn").submitForm();
			
			// Track external file clicks
			$(".fileDownload").click(function(e) {
				var o = { "category" : $("body").attr("id"),
						  "action"	 : "File download",
						  "label"	 : $(this).find("img").attr("alt") };
				WeSeed.trackEvent(o);
			});
			EventHandler.policies();

			$("#StateChooser").submit(function(e) {
				e.preventDefault();
				if(Validation.flag) {
					return false;
				}
				var state = $("#StateChooser [name=standardsSlug] option:selected").val();
				var grade = $("#StateChooser [name=standardsGrade] option:selected").val();
				window.location.href = "/education/standards/"+state+"/grade"+grade;
			});
			
			$("ul.thumbnails a").createModal({ modalId    : "modalPhotoViewer",
											   modalClass : "modal modalPhotoViewer",
											   method     : "/modal/photoViewer.html?ajax=true",
											   callback   : {method:'photoViewer'}
											 });

			$("ul.thumbnails a").click(function() {
				if(!$("#modalPhotoViewer").length){
					$("ul.thumbnails a").removeClass("sel");
					$(this).addClass("sel");
				}
			});
		},
		areaFeedback:function(){
			// Validation.create();
			// temporary fix/hack to get form spring to work.
			var fixFormSpring = function() {
				$("div.formSpring input[disabled='']").removeAttr("disabled");
			};
			setInterval(fixFormSpring, 1000);
		},
		areaGlossary:function(){
			// filteringNav
			$("div.filteringBlocks > a").filteringBlocksControls();	// FILTERING
																	// BLOCKS
																	// AND
																	// CONTENT
		},
		areaGroup: function() {
			// Remind user they are not on their own profile
			if($("#portfolioMsg").length){
				$("#portfolioMsg .closeBtnWrapper").click(function(){
					Cookie.create("portfolioMsg","off","360");
					$("#portfolioMsg").slideUp(function(){ $(this).remove(); });
				});
			}
			if(Cookie.read("portfolioMsg") &&  Cookie.read("portfolioMsg") === "off"){
				$("#portfolioMsg").remove();
			} else {
				$("#portfolioMsg").removeClass("hide");
			}
			
			$("a.btnApproval").btnApproval();
			
			// Flag profile
			//$("#flagProfile").flagGossip();
			//$("#flagProfile").modalMini($("#mFrmFlagComment"),{xPos:-150});	// FLAG GOSSIP
			
			$("#lnkInviteMembersInstructions").createModal({modalId:"modalGroupInviteInstructions", method:"/classroom-instructions"});
			
			if($("body").hasClass("compose")) {
				WeSeed.messages.sendMessageInit($("#compose_form"));
			}
			if($("body").hasClass("invite-members")) {
				// invite group members - secContent
				$("#membersQuickSearch").membersQuickSearch();
				$("#mGroupInviteMembers .btnSubmitMembers").membersSendInvite({frm:$("#inviteMembers")});
			}
			
			if($("body").hasClass("feed")) {
				// autogrow the comment area
				$(".new-comment-form textarea").textPlus();
				// enable placeholder text management
				$(".new-comment-form textarea").resetTxtField();
			}
		},
		areaLearn:function(){
			WeSeed.learn._init();
		},
		areaProfile:function(){
			// actions
			//$("#statusTxt").editStatus();
			// sortListDropDown
			$("a.groupTabDD").sortListDropDown(false,{toggleClass:"iArrowDown,iArrowRight", ddClass:".groupTabDDWindow"});
			
			// show portfolio message once
			if($("#portfolioMsg").length){
				$("#portfolioMsg .closeBtnWrapper").click(function(){
					Cookie.create("portfolioMsg","off","360");
					$("#portfolioMsg").slideUp(function(){ $(this).remove(); });
				});
			}
			if(Cookie.read("portfolioMsg") &&  Cookie.read("portfolioMsg") === "off"){
				$("#portfolioMsg").remove();
			} else {
				$("#portfolioMsg").removeClass("hide");
			}
			
			/*if(typeof brightCoveJson == "object") {
				$("#WeSeedToday").getWeSeedToday({"brightCoveJson":brightCoveJson});
			}*/
			
			$("#lnkShowWeSocialHelp").weSocialHelpTabs();
			
			// I want to know when stuff happens!
			$(window).bind("weseed.trade.closeOnSuccess",function(e,data) {
				if($("body").hasClass("index") || $("body").hasClass("passions") || $("body").hasClass("performance")) {
					window.location.reload();
				}
			});
			
			if($("body").hasClass("compose")) {
				WeSeed.messages.sendMessageInit($("#compose_form"));
			}
			if($("body").hasClass("adjust-funds")) {
				Validation.create();
				$("#mPortAddFunds a.actionBtn").submitForm();
			}
			if($("body").hasClass("notifications")) {
				$("#pendingTasksForm a.btnApproval").btnApproval();
			
			}
		},
		areaSEM:function() {
			WeSeed.Controller.SEM.landing();
		},
		areaSignup:function() {
			if($.isFunction(WeSeed.Controller.areaSignup[$("body").attr("class")])) {
				WeSeed.Controller.areaSignup[$("body").attr("class")]();
			}
		},
		areaSocial:function(){
			// weSocial
			if (!Cookie.read("weSocialFirstTimerFalse")) {
				Cookie.create("weSocialFirstTimerFalse", true, 360);
			}
			// $("#WeSeedToday").getWeSeedToday({"brightCoveJson":brightCoveJson});
			
			$("#lnkShowWeSocialHelp").weSocialHelpTabs();
		}
	},
	commenting:function() {
		// COMMENTING (#areaCompanies, #areaGroup
		
		// saveFeedGossip
		$("a.showCommentForm").showCommentForm();
		//$("form.frmPostComment .btnSubmit").saveComment();
		
		//$(".lnkFlagGossip").flagGossip();
		//$(".lnkFlagGossip").modalMini($("#mFrmFlagComment"),{xPos:-150});				// FLAG
																						// GOSSIP
		// load secondary content on load
		//$("a.editGossip").editGossip();
		// $("a.deleteGossip").deleteGossip();
		
		//$("a.editComment").editComment({url:"/editComment.html?ajax=true"});
		//$("a.deleteComment").deleteComment();
		
		// show additional comments
		WeSeed.comments.expandHiddenComments($("a.expandComments"));
	},
	/*modalAddPartner:function() {
		Validation.create();
		$("#frmAddPartner a.actionBtn").submitForm();
		
		$("#partnerFirstName")[0].focus();
	},*/
	modalGroupsAndTeams:function() { // create group - modal
		Validation.create();
		$("#createGroupTeam").addFundsLabelEvents();
		$("#createGroupTeam a.actionBtn").submitForm();
		$("#createGroupTeam").groupClosedCreate();		
		this.policies();
	},
	/*modalGift:function() {
		$(".giftCompanySearch").giftCompanySearch();						// gift
																			// portfolio
																			// modal
		$("a.sendGift").bind  ("click",function(){ $(this).giftSend(); });	// Send
																			// Gift
	},*/
	modalPortfolioManager:function() {	// portfolio manager - modal
		Validation.create();
		$("#editPortfolio").find("input[name='default']").editPortfolioDefaults();
		$("#newPortfolio a.actionBtn").submitForm();
		$("#editPortfolio a.actionBtn").submitForm();
		$("#editPortfolio a.actionBtn").focus();
	},
	modalSignInUp:function(o) {
		Validation.create();
		
		// Destroy the confirmation notification if it exists (unlikely: user
		// sees message, closes modal, and re-opens on same page.)
		$("#modalSignIn .reSendNotice").remove();
		
		// Disable the login button after submit
		$("form.frmSignIn").bind("submit",function(e) {
			$(this).find(":submit").disable().text("Please wait...");
		});
		
		//$("#frmSignInModal").login(o);
		$("#frmSignInModal .weRemMe .txt").popup($("#frmSignInModal .popup"));
		
		$("#frmForgotPasswordModal").forgotPassword();
		
		$("#modalSignIn .signInBtn").signUpInSwitcher({frm:"#frmSignInModal"});
		$("#modalSignIn .forgotPasswordBtn").signUpInSwitcher({frm:"#frmForgotPasswordModal"});
	},
	"photoViewer":function() {
		var modal      = $("#modalPhotoViewer"),
			wrap	   = modal.find("table.photo"),
			img        = wrap.find("img"),
			buttons    = modal.find("div.buttons a"),
			thumbnails = $("ul.thumbnails a.sel").parents("ul:eq(0)").find("a"),
			ie7orLess  = ($.browser.msie && $.browser.version <= 7) ? true : false;
		
		function getAndSetImageName() {
			var photo = $("ul.thumbnails a.sel img").css("background-image").split('/images')[1].replace(')', '').replace('"', '');
			photo = '/images'+photo.replace(".", "-orignal.");
			img.attr("src",photo);
			wrap.addClass("preLoader");
			img.load(function() {
				if (ie7orLess) {
					modal.width(img.width()+40);
				}
				modal.centerOnScreen();
				wrap.removeClass("preLoader");
			});
		}
		
		if(ie7orLess || thumbnails.length == 1) {
			buttons.remove();
		} else {		
			buttons.click(function() {
				var me			= $(this),
					a			= $("ul.thumbnails a.sel"),
					ul			= a.parents("ul:eq(0)"),
					anchors		= ul.find("a"),
					directionA	= (me.hasClass("next")) ? a.parent().next() : a.parent().prev(),
					num;			
				a.removeClass("sel");
				if (directionA.length) {
					directionA.find("a").addClass("sel");
				} else {
					num = (me.hasClass("next")) ? 0 : anchors.length-1; 
					anchors.eq(num).addClass("sel");
				}	
				getAndSetImageName();
			});
		}
		
		getAndSetImageName();
	},
	policies:function() {
		// signup module, signup modal, signup base
		$("a.lnkTermsOfService").createModal({modalId:"modalTermsOfService", modalClass:"modal modalPolicy", method:"/terms-of-use"});
		$("a.lnkPrivacyPolicy").createModal({modalId:"modalPrivacyPolicy", modalClass:"modal modalPolicy", method:"/privacy-policy"});
	},
	prompts:function() {
		$(".lnkLoginIndicator, .btnBuyItLock").modalMini($("#modalMiniLoginIndicator"),{xPos:-40});
		$(".siteLockDown").modalMini($("#modalMiniLoginIndicator"),{xPos:-40});
		//$(".editPrivacyIndicator").modalMini($("#modalMiniEditPrivacyIndicator"),{xPos:-40});
	},
	tradeIt:function() {
		// Used: reset search, search controls, search suggest (home page),
		// secondary content, #areaCompanies
		// Because it's an external object, wait some time before accessing it.
		
		if($(".btnBuyIt").length && typeof Trade != "undefined") {
			Trade.bind($("a.btnBuyIt"));
		}
	}
};

/*-----------------------------------------------------------
	STRINGS OBJECT - (useful functions that involve text)
-------------------------------------------------------------*/
Strings = {
	isEmail:function(s) {
		 // too simple
		 // var reg = new
			// RegExp(/^[0-9a-zA-Z]+@[0-9a-zA-Z]+[\.]{1}[0-9a-zA-Z]+[\.]?[0-9a-zA-Z]+$/);
		 // super complex - allows sending to IP addresses
		 var reg = new RegExp(/^(("[\w\-\s]+")|([\w\-]+(?:\.[\w\-]+)*)|("[\w\-\s]+")([\w\-]+(?:\.[\w\-]+)*))(@((?:[\w\-]+\.)*\w[\w\-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
		 return reg.test(s);
	},
	milliToTime:function(ms){
		function two(x)   { return ((x>9)?"":"0")+x; }
		function three(x) { return ((x>99)?"":"0")+((x>9)?"":"0")+x; }
		
		var sec = Math.floor(ms/1000);
			ms  = ms % 1000;
		var	t   = three(ms);

		var min = Math.floor(sec/60);
			sec = sec % 60;
			t   = two(sec); /* + ":" + t */

		var hr  = Math.floor(min/60);
			min = min % 60;
			t   = two(min) + ":" + t;
		
		/*
		 * var day = Math.floor(hr/60) hr = hr % 60 t = two(hr) + ":" + t t =
		 * day + ":" + t
		 */

		return t;
	},
	stripCommas:function(str) {
	    var re = /,/g;
	    return str?str.replace(re,""):str;
	},
	truncate:function(o) {
		if(!o || !o.string) {return false;}
		if(!o.length) {return o.string; }
		if(o.string.length > o.length) {
			var newStr = o.string.substr(0,o.length-3)+"...";
			if(o.tooltip) { 
				newStr = "<span title=\""+o.string+"\">"+newStr+"</span>";
			}
		
			return newStr;			
		} else {
			return o.string;
		}
	}
};

/*-------------------------------------------------------------
	v1.0 - WeSeed - (c) 2008 WeSeed. All rights reserved.
-------------------------------------------------------------*/
WeSeed = { // WeSeed name space
	ieMakeNewHash: function() {
        try {
			var doc = document.getElementById("historyFrame").contentWindow.document;
			doc.open("<html></html>");
			doc.write("<html><head><scri" + "pt type=\"text/javascript\">parent.onFrameLoaded("+ JSON.stringify(window.location.hash.split("#")[1]) + ");</scri" + "pt></head><body></body></html>");
			doc.close();
		} catch(err) {
			// trace(err);
		}
    },
	comments: {
		expandHiddenComments:function(elems) {
			elems.unbind("click.expandComments");
			elems.bind("click.expandComments",function(){
				var elem = $(this);
				
				elem.closest(".mChats").find(".mComment:hidden").slideDown();
			});
		}/*,
		showLinkFields:function() {
			$("form.frmPostComment .linkPost:hidden").show();
		}*/
	},
	"fairPriceRating": function() {
		// Fair-price explanation balloon - #areaCompanies,
		// #mPassTopCompanies, #areaMyCompanies
		var fprLight = $(".light");
		
		function header(light) {
			return '<h4>Fair Price Rating</h4>' +
					 '<div class="fprLightWrap"><img class="light fair-price-mini '+light+'" alt="fair price rating" src="/images/backgrounds/blank.gif"><span>'+light.toUpperCase()+'</span></div>';
		}
		
		if (fprLight.length) {
			var fpr = function(o) {	
				WeSeed.wordBalloonBody = "";
							
				if(o.fprLight.hasClass("green")) {
					WeSeed.wordBalloonBody = header("green")												+
											'<p>'															+
											'Based on our analysis of the company\'s financials, '			+
											'this stock is trading at a price that seems fair.'				+
											'</p>';
				} else if (o.fprLight.hasClass("yellow")) {
					WeSeed.wordBalloonBody = header("yellow")												+
											'<p>'															+
											'Based on our analysis of the company\'s financials, '			+
											'this stock price is about 10% outside what\'s accepted '		+
											'as the "fair price" range. Might be worth doing some '			+
											'digging on the company pages and our '							+
											'<a href="/learn/">Learn section</a>.'							+
											'</p>';
				} else if (o.fprLight.hasClass("red")) {
					WeSeed.wordBalloonBody = header("red")													+
											'<p>'															+
											'Based on our analysis of the company\'s financials, '			+
											'this stock price is more than 10% above or below what\'s '		+
											'accepted as the "fair price" range. Do some digging and '		+
											'see if you can figure out what\'s up.'							+
											'</p>';
				}	
			};
			fprLight.each(function() {
				$(this).wordBalloonSmall({"xPos":16, "yPos":-10, "hover":true, "keepCloseBtn":true,
										  "mouseOverCallback":fpr,
										  "mouseOverCallbackOptions":{"fprLight":$(this)}
										});
			});
		}
	},
	fb: {
		_init:function() {
			// This can be considered the WeSeed Facebook Signup controller
			var wsfb;
			if(WSFB.hasInstance()) {
				// Don't reassign the delegate if it already exists.
				wsfb = WSFB.getInstance();
			} else {
				wsfb = WSFB.getInstance(this);
			}
			
			$(".fb-connect").click(function(e) {
				wsfb.connectAccount();
			});
		}
	},
	isLoggedIn:function() {
		return ($("#modalSignIn").length === 0);
	},
	learn: {
		_init:function() {
			//$(".showFullText").toggleFullText();
			
			this.reportCardTabs.bind();
			this.quizTabs.bind();
			this.quiz.bind();
			
			$(".masterTopic.lock").modalMini($("#learnLock1"));
		},
		quiz:{
			/* Manages the quiz posting and grading */
			bind:function(){
				$(".restartQuizPrompt").modalMini($("#restartQuizPrompt"));
				$(".restartQuiz").click(function(){
					WeSeed.learn.quiz.restartQuiz();
				});
				$(".getResults").click(function() {
					WeSeed.learn.quiz.getScore();
				});
			},
			getScore:function(o) {
				// TODO: Serialize questions into JSON object { qId : aId }
				var scoreWrapper = $("#score");
				var form = $("#quiz");
				var levelSlug = $("#learnLessonsContentContainer").attr("rel");
				var quizResultJson = JSON.stringify(form.serializeHash());
				if(quizResultJson!=='{}'){
				    $(".quizQuestions").hide();
					// TODO: Send to server
					$.post(form.attr("action"),{'quizResultJson':quizResultJson},function(data) {
						// TODO: Print results, $(".afterResults").show()
						scoreWrapper.empty().append(data).fadeIn();
						scoreWrapper.find(".restartQuiz").click(function(){
							WeSeed.learn.quiz.restartQuiz();
						});
						// TODO: put score value into the submit button
						$(".afterResults").show();
					});
					scoreWrapper.ajaxPreloader({"preLoader":"dynLoadingMedium"});
				}else{
					$(".getResults").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"Please answer a quiz question before continuing."});
				}
			},
			restartQuiz:function() {
				var form = $("#quiz")[0].reset();
				$("#score").hide();
				
				// GoTo the first QuizTab
				WeSeed.learn.quizTabs.goTo(1);
			}
		},
		quizTabs:{
			/* Supports toggling through the quiz questions */
			bind:function(){
				var tabs = $(".questionTabs a");
				var selClass = "sel";
				var contents;
				var target;
				
				tabs.click(function(){
					var targetClass = $(this).attr("rel");
					var contents = $(this).closest(".lessonContent").find("div.quizQuestions");
					var target = contents.filter("."+targetClass);
					WeSeed.switchTab({
						'me'		:	this,
						'tabs'		:	tabs.selector,
						'contents'	:	contents.selector,
						'target'	:	target.get(0),
						'selClass'	:	selClass
					});
					
					
					return false;
				});
				
				$("a.nextQuestion").click(function() {
					WeSeed.learn.quizTabs.next();
					return false;
				});
				
				$(".prevQuestion").click(function() {
					WeSeed.learn.quizTabs.prev();
					return false;
				});
			},
			goTo:function(index){
				var tabs = $(".questionTabs a");
				var selClass = "sel";
				var me = tabs.get(Number(index));
				if(!me) { return false; }
				var contents = $(me).closest(".lessonContent").find("div.quizQuestions");
				var target = contents.filter("."+$(me).attr("rel"));
				
				WeSeed.switchTab({
					'me'		: me,
					'tabs'		: tabs.selector,
					'contents'	: contents,
					'target'	: target.get(0),
					'selClass'	: selClass
				
				});
				if(index > 1) { // show reset button
					$(".restartQuizPrompt").show();
				}
				if(index <= 1) { // hide reset button
					$(".restartQuizPrompt").hide();
				}
				return false;
			},
			next:function(){
				var tabs = $(".questionTabs a");
				var selClass = "sel";
				var index = tabs.index(tabs.filter(".sel"))+1;
				var me = tabs.get(index);
				var contents = $(me).closest(".lessonContent").find("div.quizQuestions");
				var target = contents.filter("."+$(me).attr("rel"));
				
				WeSeed.switchTab({
					'me'		: me,
					'tabs'		: tabs.selector,
					'contents'	: contents,
					'target'	: target.get(0),
					'selClass'	: selClass
				
				});
				
				if(index > 1) { // show reset button
					$(".restartQuizPrompt").show();
				}
				return false;
			},
			prev:function(){
				var tabs = $(".questionTabs a");
				var selClass = "sel";
				var index = tabs.index(tabs.filter(".sel"))-1;
				var me = tabs.get(index);
				var contents = $(me).closest(".lessonContent").find("div.quizQuestions");
				var target = contents.filter("."+$(me).attr("rel"));

				WeSeed.switchTab({
					'me'		: me,
					'tabs'		: tabs.selector,
					'contents'	: contents,
					'target'	: target.get(0),
					'selClass'	: selClass
				
				});
				
				if(index <= 1) { // hide reset button
					$(".restartQuizPrompt").hide();
				}
				return false;
			}
		},
		reportCardTabs:{
			/*
			 * The level-based shades in the report card box on the left of the
			 * screen
			 */
			bind:function(){
				var tabs = $("div.reportCard h4 a");
				var contents = "div.reportCard .profilePanels > div";
				var selClass = "open";
				
				tabs.click(function(){
					var target = $(this).closest(".profilePanels").children("div");
				
					WeSeed.switchTab({
						'me'		:	this,
						'tabs'		:	tabs.selector,
						'contents'	:	contents,
						'target'	:	target.get(0),
						'selClass'	:	selClass
					});
						
				});
			},
			goToLevel:function(levelClass) {
				var tabs = $("div.reportCard h4 a");
				var contents = "div.reportCard .profilePanels > div";
				var selClass = "open";
				var meParent = $("div.reportCard ."+levelClass);
				var me = meParent.find("h4 a");
				var target = meParent.children("div");
				
				WeSeed.switchTab({
					'me'		: me.get(0),
					'tabs'		: tabs.selector,
					'contents'	: contents,
					'target'	: target.get(0),
					'selClass'	: selClass
				});
			}
		},
		showGlossaryTerm:function(o) {
			/*
			 * Opens a glossary term from the list on the right hand side of the
			 * screen Options: term : (String) : the glossary term to open
			 * toggle : (Boolean) : Whether or not to close the requested term
			 * if it is open
			 */
				o = o || {};
			var term = o.term || '';
			var toggle = (typeof o.toggle === "undefined") ? true : o.toggle;
			var terms = $("div.glossary li");
			var matched = terms.find("a").filter(function() { return $(this).text().toLowerCase() === term.toLowerCase(); }).closest("li");
			
			terms.not(matched).removeClass("open").find(".definition").hide();
			if(matched) {
				if(toggle) {
					matched.toggleClass("open");
					matched.children(".definition").toggle();
				} else { 
					matched.addClass("open");
					matched.children(".definition").show();
				}
			}
		}
	},
	messages: {
		composeSearch:function(field, o) {
			if(!field) { return false; }
			
				o = o || {};
			var results		= o.results		|| field.siblings(".searchResults");
			var resultSelector = o.resultSelector || ".item";
			var recipient	= o.recipient	|| field.siblings(".recipient");
			var clearBtn	= o.clearBtn	|| field.siblings(".iClearField");
			var action		= o.action		|| "/mailcenter/composeSearch.html?ajax=true&searchCriteria=";
			
			// text-navigation
			field.bind("keydown.composeSearch",function(e){
				var me = $(this);
				var sel = results.find(".sel");
				var key = e.keyCode;
				
				if((key === 38 || key === 40) && !sel.length) {
					results.find(".item:first").addClass("sel");
					return false;
				}
				if(key === 40) {
					if(sel.next(".item").length) {
						sel.removeClass("sel");
						sel.next(".item").addClass("sel");
					}
					
					return false;
				}
				if(key === 38) {
					if(sel.prev(".item").length) {
						sel.removeClass("sel");
						sel.prev(".item").addClass("sel");
					}
					
					return false;
				}
				if(key === 13) {
					sel.click();
					
					return false;
				}
			
			});
			
			// perform the search when the user types
			field.bind("keyup.composeSearch",function(e){
				var me = $(this);					
				var key = e.keyCode;
				
				// only search on useful inputs
				// keys in order: backspace, escape, delete, alphanumericish
				if (key != 8 && key != 27 && key != 46 && !(key >= 48 && key <= 111)) { 
					return false; 
				}
				
				if(key === 27) {
					// escape
					me.val('');
				}
				
				clearTimeout(WeSeed.quickSearchTO);
				WeSeed.quickSearchTO = setTimeout(function(){
					var searchString = me.val();
					
					if(searchString.length > 0) {
						$.get(action+escape(searchString), function(data) {
							results.empty().prepend(data);
							if(results.is(":hidden")) {
								results.slideDown("fast");
							}
							results.find(resultSelector+":first").addClass("sel");
						});
					}
					else {
						results.slideUp("fast",function(){ results.empty(); });
					}
				},150);
			});
			
			// clone the user into the dom on selection, and empty the results
			// (important!!)
			results.bind("click.composeSearch",function(e) {
				var clicked = $(e.target);
				
				if(clicked.hasClass("item")) {
					// empty the recipient box to be safe.
					recipient.empty();
					// hide the text input
					field.hide();
					// show the recipient box
					recipient.show();
					// create a clone of the result and fade it in
					var newClicked = clicked.clone().hide().appendTo(recipient);
					newClicked.fadeIn();
					// hide the results and empty the element
					results.fadeOut("normal",function(){ results.empty(); });
					// Show the remove button
					clearBtn.show();
					field.val('');
					
					// focus on the subject field
					field.closest("form").find(":text[name='subject']").focus();
				}
			});
			
			// resign the keyboard-selected item when the mouse enters.
			results.bind("mouseenter.giftAddCompany",function(e){
				results.find(".sel").removeClass("sel");
			});
			// reassign a keyboard-navigatable item when the mouse leaves
			results.bind("mouseleave.giftAddCompany",function(e){
				var lastElement = $(e.target);
				lastElement.closest(".item").addClass("sel");
			});
			
			// let the user remove the recipient and clear the form
			clearBtn.bind("click.composeSearch",function(e){
				clearBtn.hide();
				
				recipient.find(".item").fadeOut("normal",function() {
					recipient.empty().hide();
					field.show();
				});
			});
		},
		sendMessageInit:function(frm){
			if(!frm) { return false; }
			Validation.create();
			
			var btn = frm.find(".sendMessage");
			var action = frm.attr("action");
			var parent = ".row";

			this.composeSearch(frm.find("#composeSearch"));
			
			frm.submit(function(){
				if (Validation.flag) { return false; } // Validation.flag
														// declaried in
														// formValidation.js
				
				// just to be safe, empty the search results.
				frm.find(".searchResults").empty();
				
				// data fields
				var frmData = {
					recepient_id	: frm.find("[name='recepient_id']").val(),
					recepient_type	: frm.find("[name='recepient_type']").val(),
					subject			: frm.find("[name='subject']").val(),
					body			: frm.find("[name='body']").val()
				};
						
				if(!(frmData.recepient_id && frmData.recepient_type)) {
					btn.showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"Please choose a recipient"});
					return false;
				}
				
				$.post(action,frmData,function(data){
					if(data==="success") {
						$(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgMsg", txt:"Message sent successfully"});
						
						// WeSeed.messages.toggleReply(frm.closest(parent).find(".toggleMessage"));
						if(frm.hasClass("reply")) { 
							WeSeed.messages.toggleMessage(frm.closest(parent).find(".toggleMessage")); 
						} else {
							window.location.reload();
						}
					} else {
						$(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:data});
					}
				});				
				
				btn.ajaxPreloader();
				
				return false;
			});
		},
		toggleMessage:function(me,o){
			if(!me) { return false; }
			
				o = o || {};
			var json		= me.getJsonAttr();
			var messageId	= o.messageId || json.messageId;
			var parent		= o.parent	  ?  me.closest(o.parent) : me.closest(".row");
			
			var snippet		= parent.find(".snippet");
			var body		= parent.find(".fullText");
			var envelope	= parent.find(".iconS");
			var boldText	= parent.find(".bold");
			
			if(body.children().length) { 
				// remove the message, show the snippet
				body.fadeOut("fast",function(){body.empty();});
				snippet.show();
			} else {
				// load the message, hide the snippet
				$.get(me.attr("href"),json.data,function(data){
					body.append(data).hide().fadeIn();
					snippet.hide();
					// decrement the notifications badge
					if(json.increment && envelope.hasClass("iUnreadMessage")) {
						if(Number($(json.increment).text()) > 0) { 
							$(json.increment).text(Number($.trim($(json.increment+":eq(0)").text()))-1);
						}
					}
					// mark the message as read
					boldText.removeClass("bold");
					envelope.removeClass("iUnreadMessage").addClass("iInbox");
				});	
				
				envelope.ajaxPreloader({visibility:"visible",yPos:-10});
			}
		},
		toggleReply:function(me,o){
			if(!me) { return false; }
			
				o = o || {};
			var parent		= o.parent		?	me.closest(o.parent) : me.closest(".row");
			//var messageId	= o.messageId	||	me.getJsonAttr().messageId;
			
			var reply		= parent.find(".reply");
			var replyIcon	= parent.find(".iReply");
			
			if(reply.is(":hidden")) { 
				$.get(me.attr("href"),function(data){
					$(".dynLoadingSmall").remove();
					reply.append(data).hide().fadeIn();
					me.addClass("sel");
					// bind the reply form
					WeSeed.messages.sendMessageInit(reply);
					EventHandler.prompts();
				});
				
				replyIcon.ajaxPreloader({visibility:"visible",yPos:-10});

			} else {
				reply.fadeOut("fast",function(){reply.empty();});
				me.removeClass("sel");
			}
			
		}
	},
	/*
	reloadProfilePanel:function(){
		// Reloads the profile menu and keeps the correct item selected.
		var cpSection = ($(".secContent:visible").length) ? "&cpSection=" + $(".secContent:visible").attr("id") : ''; 
				
		$("#profilePanel").load("/portfolio/userPortfolioList.html?ajax=true"+cpSection,function(){
			EventHandler.actions();
		});	
	},
	*/
	// showFinancialChart:function(o){
	// 			o					= o || '';
	// 		var symbol				= $(o).attr('rel').split("|")[0],
	// 			company				= $(o).attr('rel').split("|")[1],
	// 			chartModal			= $("#chart"),
	// 			chartHeader			= chartModal.find("> h4"),
	// 			chartClose			= chartModal.find("> a.closeBtnWrapper"),
	// 			calendar			= chartModal.find("#div-CustomTimeframe"),
	// 			chartWrap			= chartModal.find("#div-chartWrapper"),
	// 			chart				= chartWrap.find("#div-chart"),
	// 			chartTabs			= chartWrap.find("#div-chartTabs"),
	// 			chartTabsAs			= chartTabs.find("> a"),
	// 			chartTabsSelectedId;
	// 		
	// 		chartModal.empty();
	// 		chartModal.prepend('<a href="javascript:;" class="closeBtnWrapper"><img src="/images/backgrounds/blank.gif" class="iClose iconS" alt=\"Close icon\" /></a><h4>'+company+'<small>Price ($)</small></h4>');
	// 		chartHeader.html(company+'<small>Price ($)</small>');
	// 		
	// 		// following is so we can have mulitple charts
	// 		chartWrap.remove();
	// 		calendar.remove();
	// 		// there three are from WSOD script file
	// 		// (http://www.peak6.wallst.com/api/chart/advancedchart.asp)
	// 		_symbol = symbol;
	// 		initPage();				
	// 		loadChart({days:30});
	// 		// remove new calendar and menu html and insert the original so we keep
	// 		// the events (the calendar and menu)
	// 		chartTabsSelectedId = chartModal.find("#div-chartTabs > a.selected").attr("id");
	// 		chartModal.find("#div-chartTabs").remove();
	// 		chartModal.find("#div-CustomTimeframe").remove();
	// 		chartTabs.appendTo(chartModal.find("#div-chartWrapper"));
	// 		chartTabsAs.removeClass("selected");
	// 		chartTabs.find("#"+chartTabsSelectedId).addClass("selected");
	// 		calendar.appendTo(chartModal);
	// 		// rest of it
	// 		$("#chart").nBox();
	// 		WeSeed.trackEvent({category:$("body").attr("id"), action:"createModal", label:"Show Graph"});
	// 		return false;
	// 	},
	switchTab:function(o){
		/*
		 * Generic tab switching interface. Params: "me" - the clicked tab
		 * "tabs" - an array of all tabs "target" - the content corresponding to
		 * "me" "contents" - an array of all contents "selClass" - the CSS class
		 * to be applied to "me"
		 */
		if(!o){ return false; }
		
		var me = $(o.me);
		var tabs = $(o.tabs);
		var contents = (o.contents) ? $(o.contents) : $("#tabContent div");
		var target = $(o.target);
		var selClass = o.selClass || "sel";
		
		if(!target.length) { return false; }
		if(!me.length) { return false; }
		
		tabs.removeClass(selClass);
		me.addClass(selClass);
		contents.hide();
		target.show();
	},
	tasks:{ // Used in the profile notifications page
		toggleTask:function(me,o){
			if(!me) { return false; }
			
				o = o || {};
			var parent		= o.parent	  ?  me.closest(o.parent) : me.closest(".row");
			
			// var snippet = parent.find(".snippet");
			var body		= parent.find(".fullText");
			var envelope	= parent.find(".iconS");
			var boldText	= parent.find(".bold");
			
			if(body.is(":visible")) { 
				// remove the message, show the snippet
				body.fadeOut("fast");
				// snippet.show();
			} else {
				body.fadeIn();
			}
		}
	},
	url:function(){ // Returns the URL of the current host, appending the port if necessary.
		var url = "http://"+$.url.attr("host");
		
		if($.url.attr("port")) {
			url += ":"+$.url.attr("port");
		}
		return url;
	},
	weSocialCloseHelpTabs:function() { 
		$("#tabContent").hide();
		$("#howWeWorkTabMenu a").removeClass("open"); 
		$("#tabContent div").removeClass("open"); 
	},
	
	trackEvent:function(o) {
		if(!o){return false;}
		if(!o.category || !o.action){return false;}
		
		// Google Analytics Event Tracking
		try {
			// trace(o.category+"|"+o.action+"|"+o.label+"|"+o.value);
			pageTracker._trackEvent(o.category,o.action,o.label,o.value);
		}catch(e) {
			// trace(e);
		}
	},
	trackPage:function(o) {
		if(!o){return false;}
		if(!o.page){return false;}
		if($.browser.msie) {
			o.page = (o.page.replace(WeSeed.url(),""));
		}
		try {
			pageTracker._trackPageview(o.page);
			// trace(o.page);
		} catch(e) {
			// trace(e);
		}
	},
	trackTime:{
		start:function() {
			try {
				WeSeed.timeTracker = new TimeTracker(['10','10000','20000','40000','60000','80000','100000','120000','140000','160000','180000','200000']);
				WeSeed.timeTracker._recordStartTime();
				// trace('go!');
			} catch(e) {
				// trace(e);
			}
		},
		stop:function(category, label) {
			try {
				if(!category) { category = undefined; }
				if(!label) { label = "Signup Time"; }
				WeSeed.timeTracker._recordEndTime();
				WeSeed.timeTracker._track(pageTracker, category, label);
				// trace(WeSeed.timeTracker._getTimeDiff());
			} catch(e) {
				// trace(e);
			}
		}
	},
	// load Sign In Panel
	signIn:function(o) {
		EventHandler.modalSignInUp(o);
		//var wsfb = WSFB.getInstance();
		
		WeSeed.trackEvent({"category":$("body").attr("id"), "action":"createModal", "label":"Sign In Modal"});
		$("#modalSignIn").nBox();
		$("#modalSignIn .signInBtn").click(); // displays the correct form (refactor plz!)
		
		$("#frmSignInModal").find("input:visible:eq(0)").focus();
		
		return false;
	},
	// load Forgot Password Panel
	forgotPassword:function() {
		EventHandler.modalSignInUp();
		
		WeSeed.trackEvent({"category":$("body").attr("id"), "action":"createModal", "label":"Forgot Password Modal"});
		$("#modalSignIn").nBox();
		$("#modalSignIn .forgotPasswordBtn").click(); // displays the correct form (refactor plz!)
		
		$("#frmForgotPasswordModal").find("input:visible:eq(0)").focus();
		return false;
	}
};

/*---------------------------------------
	[G3.8.1] WeSeed Views (Generic)
-----------------------------------------*/
WeSeed.View = {};
/*WeSeed.View.TodaysTopCompanies = function(elem, delegate) {
	if(!elem) { return false; }
	this.delegate = delegate || {};
	this.elem = elem;
	this.resetCarouselOptions();
	
	// init the carousel
	elem.unbind().jCarouselLite(this.carouselOptions);
	
	var ref = this;
	// loadCompanyStats
	elem.find("a").click(function(e) {
		e.preventDefault();
		
		if($.isFunction(ref.delegate.didClickCompany)) {
			ref.delegate.didClickCompany(e.target);
		}
		
		ref.showCompanyStats(e);
	});
	
	// watch for trade completions
	$(window).bind("weseed.trade.success",function(e,data) {
		ref.loadCompanyStats(data.id,data.ticker);
	});
};
WeSeed.View.TodaysTopCompanies.prototype = {
	"showCompanyStats":function(e) {
		var target = $(e.currentTarget);
		
		// leave it alone if it's already selected
		if(target.parent().hasClass("sel")) { return false; }
		
		var selectedSymbol = target.parent().attr("id").split('-')[1];
		
		target.parent().siblings().removeClass("sel");
		target.parent().siblings().andSelf().filter("#topCompanyIcon-"+selectedSymbol).addClass("sel");
		
		$("#companyStats > :visible").hide();
		var newStats = $("#companyStats > #topCompanyStats-"+selectedSymbol).show();
		var selectedId = newStats.find(".companyId").text();
		
		if(newStats.find(".loading").length) {
			this.loadCompanyStats(selectedId,selectedSymbol);
		}
		
		WeSeed.trackEvent({"category":$("body").attr("id"),"action":"Top Companies Widget","label":newStats.find("h4 > a").text()});
	},
	"loadCompanyStats":function(id,symbol) {
		var newStats = $("#companyStats > #topCompanyStats-"+symbol);
		
		$.get(URL.company.topCompanyActivity(id),{},function(json) {
			var activity = newStats.find(".activity").empty();
			
			if(json.attributes.feedEvents.length === 0) {
				activity.append($("<li>No recent activity</li>"));
			}
			
			$.each(json.attributes.feedEvents,function(i, val) {
				activity.append($("<li>"+val+"</li>"));
			});
		},"json");
	},
	"expireCompanyStats":function(symbol) {
		var stats = $("#companyStats > #topCompanyStats-"+symbol).find(".activity").html(
			"<li class=\"loading\">Loading Data...<br/><img alt=\"Loading Bar\" src=\"/images/icons/loadingBar.gif\"/></li>"
		);
	},
	// getters/setters
	"setCarouselOptions":function(carouselOptions) {
		$.extend(this.carouselOptions,carouselOptions);
	},
	"resetCarouselOptions":function() {
		this.carouselOptions = {
			btnNext: this.elem.parent().find(".scrollRight"),
			btnPrev: this.elem.parent().find(".scrollLeft"),
			visible: 2,
			scroll: 2,
			speed: 400
		};
	}
};*/

WeSeed.View.VideoPlayerPopUp = function(elem, delegate) {
	if(!elem) { return false; }
	this.elem = elem;
	this.delegate = delegate || {};
	this.resetAnimationOptions();
	
	var ref = this;
	elem.find(".closeBtnWrapper").click(function(e) {
		e.preventDefault();
		ref._alertDelegate("didClickCloseButton",function() {
			ref.close();
		});
	});
};
WeSeed.View.VideoPlayerPopUp.prototype = {
	"close":function() {
		var ref = this;
		if(this.elem.is(":hidden")) {
			ref._alertDelegate("didClose");
			return;
		}
		
		this.elem.find(".videoPlayer div").hide();		
		this.elem.animate(this.animationOptions.start, this.animationOptions.duration, this.animationOptions.tween, function() {
			ref.elem.hide();
			ref._alertDelegate("didClose");
		});
	},
	"open":function() {
		var ref = this;
		if(this.elem.is(":visible")) {
			ref._alertDelegate("didOpen");
			return;
		}
		
		this.elem.css(this.animationOptions.start);
		this.elem.show();
		this.elem.animate(this.animationOptions.end, this.animationOptions.duration, this.animationOptions.tween, function() {
			ref.elem.find(".videoPlayer div").show();
			ref._alertDelegate("didOpen");
		});
	},
	// event delegation
	"_respondsTo":function(event) {
		return $.isFunction(this.delegate[event]);
	},
	"_alertDelegate":function(event,alternate) {
		if($.isFunction(this.delegate[event])) {
			this.delegate[event]();
		} else if($.isFunction(alternate)) {
			alternate();
		}
	},
	// getters/setters
	"setAnimationOptions":function(animationOptions) {
		$.extend(this.animationOptions,animationOptions);
	},
	"resetAnimationOptions":function() {
		this.animationOptions = {
			start:{
				"height":"300px",
				"opacity":"0"
			},
			end:{
				"height":"485px",
				"opacity":"1"
			},
			duration:400,
			tween:"linear"
		};
	},
	"setDelegate":function(delegate) {
		this.delegate = delegate;
	}

};

/*---------------------------------------
	[G3.8.1] WeSeed Controllers
-----------------------------------------*/
WeSeed.Controller = {};
WeSeed.Controller.areaLandingPage = {
	"returning": function() {
		var elems = {
			"portfolioSummary" : $("#portfolioSummary .wrap"),
			"addFundsButton"	: $(".deposit-button")
		};
		
		var addFundsModal = null;
		
		function refreshPortfolioSummary() {
			var oldSummary = elems.portfolioSummary.html();
			elems.portfolioSummary.html("<h2>Loading...</h2>");
			
			WeSeed.Manager.Portfolio.getSummaryHtml({
				"onError" : function() {
					// silent fail.
					elems.portfolioSummary.html(oldSummary);
				},
				"onSuccess" : function(newSummary) {
					elems.portfolioSummary.html(newSummary);
				},
				"onComplete" : function() {
					// refresh the add funds button
					bindDepositModal($(elems.addFundsButton.selector));
				}
			});
		}
		
		function bindDepositModal(button) {
			button.createModal({
				"modalId"	: "DepositCashModal", 
				"method"	: URL.portfolio.addFundsModal(button.attr("href")),
				"callback"	: function() {
					addFundsModal = $("#DepositCashModal");
					Validation.create();
					$("#DepositCashModal a.actionBtn").submitForm();
				}
			});
		}
		
		bindDepositModal(elems.addFundsButton);
		
		// I want to know when stuff happens!
		$(window).bind("weseed.trade.closeOnSuccess",function(e,data) {
			if($(".zero-state").length) {
				window.location.reload();
			}
		});
		
		$(window).bind("weseed.trade.success",function(e,data) {
			if(!$(".zero-state").length) {
				refreshPortfolioSummary();
			}
		});
		
		$(window).bind("weseed.accountAddFunds.success",function(e,data) {
			if(addFundsModal) {
				addFundsModal.find(".iClose").click();
			}
			refreshPortfolioSummary();
		});
	}
};

WeSeed.Controller.areaSignup = {
	"signup-form":function() {
		var elems = {
			"classroomPasswordSection"	: $(".classroomSection"),
			"classroomPasswordRadios"	: $("input[name='classRoomGroupSelection']"),
			"classroomPasswordInput"	: $(".classroomSection .inputArea")
		};
		
		Validation.create();
		EventHandler.policies();
		//$("#frmSignUpBase").signup();
		$("#frmSignUpBase .dobLink").popup($("#frmSignUpBase .whyDob"));
		$("#frmSignUpBase .classroomLink").popup($("#frmSignUpBase .whatIsAClassroomGroup"));
		
		// handle the classroom password
		elems.classroomPasswordRadios.bind  ("click.classroomPasswordToggle", function() {
			var me = $(this);
			if ($.trim(me.val()) === "yes") {
				elems.classroomPasswordInput.slideDown();
			} else {
				elems.classroomPasswordInput.slideUp();
			}
		});
	
		//var wsfb = WSFB.getInstance();

		function parseDate(datestr) {
			// datestr formatting possibilities:
			// "December 29, 1984"
			// "December 29"
			// null
			
			if(datestr === null) { return; }
			
			var datearr = Strings.stripCommas(datestr).split(' ');
			var month = (new Date()).monthFromString(datearr[0]) + 1;
			var day = datearr[1];
			var year = datearr[2];
			
			$("[name='month'] option:eq("+month+")").attr("selected","selected");
			$("[name='day'] option:eq("+day+")").attr("selected","selected");
			$("[name='year'] option[value='"+year+"']").attr("selected","selected");
		}
		
		// var fbDelegate = {
		// 	didSetCurrentUser:function(currentUser) {
		// 		var first_name = currentUser.info.first_name;
		// 		var last_name  = currentUser.info.last_name;
		// 		var birthday   = currentUser.info.birthday;
		// 	
		// 		$("[name='user.firstName']").val(first_name);
		// 		$("[name='user.lastName']").val(last_name);
		// 		parseDate(birthday);
		// 	},
		// 	isConnected:function() {
		// 		$(".fbconnected").show();
		// 		$(".fbdisconnected").hide();
		// 		wsfb.getCurrentUser(); 
		// 		wsfb.parse();
		// 		if(!WeSeed.isLoggedIn()) {
		// 			wsfb.checkWSAccountStatus();
		// 		}
		// 		$(".signOutBtn").click(function(e) {
		// 			e.preventDefault();
		// 			WSFB.getInstance().logout();
		// 		});
		// 		$(".fb-logout").click(function(e) {
		// 			e.preventDefault();
		// 			wsfb.logout();
		// 		});
		// 	},
		// 	isNotConnected:function() {
		// 		wsfb.parse();
		// 		$(".fbconnected").hide();
		// 		$(".fbdisconnected").show();
		// 		$(".fb-logout").unbind("click");
		// 		if($("form.frmSignUp").length) {
		// 			$("form.frmSignUp")[0].reset();
		// 		}
		// 	}
		// };
		
		//wsfb.setDelegate(fbDelegate);
		WeSeed.trackTime.start();
		$("input:visible:eq(0)").focus(); // put the cursor in the first textbox
	},
	"first-purchase":function() {
		var elems = {
			"tabs"		: $("#firstPurchaseTabs .top li"),
			"contents"	: $("#firstPurchaseTabs .mid")
		};

		$(window).bind("weseed.trade.closeOnSuccess",function(e,data) {
			window.location = "/portfolio/?firstTime=true";
		});
		
		$("form.inlineSearchForm").weseedSearch();
		
		$(elems.tabs).click(function() {
			var target = elems.contents.get(elems.tabs.index($(this)));
			
			WeSeed.switchTab({
				'me'		:	this,
				'tabs'		:	elems.tabs.selector,
				'contents'	:	elems.contents.selector,
				'target'	:	target
			});
		});
	},
	"starting-balance":function() {
		// This is the conversion & Congratulations page.
		Validation.create();
		$("#startingBalance").addFundsLabelEvents();
	}
};

WeSeed.Controller.contests = {
	"bpa-landing":function() {
		// Track external file clicks
		$(".fileDownload").click(function(e) {
			var o = { "category"	: $("body").attr("id"),
					  "action"		: "File download",
					  "label"		: $(this).text() };
					  
			WeSeed.trackEvent(o);
		});
	},
	"fbla":function() {
		var frm = $("#fblaContestForm");
		var submitButton = frm.find(".submitButton");
		var modalDefaults = {
			auto: true,
			modalId: "lightbox",
			modalClass:	"modal",
			preloader: submitButton
		};
	
		// The contest form (with file uploads)
		var mpf = new WeSeed.Model.multiPartForm({"frm":frm});

		var delegate = {
			"onSubmit":function() {
				$().createModal($.extend({},modalDefaults,{ 
								body:		"<p class=\"dynLoadingSmallText\">Saving...</p>",
								hideNbox:	false
				}));
				$("#lightbox .iClose").hide();
			},
			"onError":function(errs) {
				var message = "<h2>We're sorry, we couldn't send your submission.</h2>";
				
				for(var i=0; i<errs.length; i++) {
					switch(errs[i].code) {
						case -100: // no data error (prematurely triggered by firefox)
							return false;
						case -101: // parse error (catastrophic)
							message += "<p>Please try again later, or <br/>enter by mail using the instructions at the bottom of this page.</p>";
							break;
						default:
							message += errs[i].msg;
					}
				}
			
				$().createModal(
					$.extend({},modalDefaults,{ 
						body:			message,
						hideNbox:		true
				   }));
							   
				$("#lightbox .iClose").show();
			},
			"onSuccess":function(json) {
				$().createModal($.extend({},modalDefaults,{ 
							//method:			"/contests/submitSuccess.html?ajax=true",
							body: 			json.attributes.successMessage, 
							hideNbox:		true
				}));
				mpf.resetForm();
				$("#lightbox .iClose").show();
			}
		};
		
		mpf.setDelegate(delegate);
		
		frm.find("input:file").fileInputAdder();
		
		// Track external file clicks
		$(".fileDownload").click(function(e) {
			var o = { "category"	: $("body").attr("id"),
					  "action"		: "File download",
					  "label"		: $(this).text() };
					  
			WeSeed.trackEvent(o);
		});
	}
};
WeSeed.Controller.SEM = {
	"landing":function() {
		var playerDelegate = {
			"didClickCloseButton":function() {
				if(typeof manager == "Object") {
					manager.stopVideo();
				}
				player.close();
			}
		};
		var managerDelegate = {
			"onContentLoad": function() {
				if(!manager.isPlaying()) {
					manager.playVideo();
				}
			},
			"onMenuEvent": function(evt) {
				WeSeed.trackEvent({	"category"	: $("body").attr("id"),
									"action"	: evt.type,
									"label"		: manager.getCurrentVideo().displayName});
			},
			"onMediaEvent": P6.Manager.Brightcove.trackEvent
		};		
		
		var player = new WeSeed.View.VideoPlayerPopUp($("#videoPlayer"),playerDelegate);
		var manager = null;
		// Set video animation options
		player.setAnimationOptions({
			"end":{
				"height":"475px",
				"opacity":"1"
			}
		});
		
		// video.open
		$(".video").click(function(e) {
			e.preventDefault();
			vidId = BrightCove[$(this).attr("rel")];
			vidLink = $(this).attr("href");
			P6.Manager.Brightcove.fetchCurrentPlayer(function(bcplayer) {
				manager = bcplayer;
				manager.playVideo(vidId);
				manager.setVideoLink(WeSeed.url() + vidLink);
			},managerDelegate);
			
			player.open();
		});
	}
};


/*---------------------------------------
	[G3.8.2] WeSeed Managers
-----------------------------------------*/
WeSeed.Manager = {};
WeSeed.Manager.Portfolio = {};
WeSeed.Manager.Portfolio.getSummaryHtml = function(delegate) {
	var href = "/portfolio/summary";
	
	$.ajax({
		"type"	:"GET",
		"dataType"	:"html",
		"cache"	:false,
		"url"	:href,
		"complete" : function (XMLHttpRequest, textStatus) {
			if($.isFunction(delegate.onComplete)) {
				delegate.onComplete(textStatus);
			}
		},
		"error"	:function(XMLHttpRequest, textStatus, errorThrown) {
			if($.isFunction(delegate.onError)) {
				delegate.onError(textStatus);
			}
		},
		"success":function(data,textStatus) {
			if($.isFunction(delegate.onSuccess)) {
				delegate.onSuccess(data);
			}
		}
	});
};

/*---------------------------------------
	[G3.8.2] WeSeed Models
-----------------------------------------*/
WeSeed.Model = {};
/*
 * Multipart Form Handler Manages submission of mixed binary/ascii data
 * asynchronously Expects return data to be of JSON format
 * 
 * Dependencies - jQuery 1.3+ - formValidation.js
 * 
 * Constructor options: - frm (jQuery) the form element we're acting on -
 * successUrl (String) the URL of the content to display on success - delegate
 * (Object) dictionary of callback methods - parseError (String) message to
 * display if return data cannot be parsed
 */ 
WeSeed.Model.multiPartForm = function(o) {
	var frm				= o.frm,
		delegate		= o.delegate || {},
		submitButton	= frm.find(".submitButton");
	
	function onSubmit() {
		if (Validation.flag) { return false; }
		
		if ($.isFunction(delegate.onSubmit)) {
			delegate.onSubmit();
		}
	}
	
	function onResponse(returnData) {
		returnData = returnData.trim();
		var json;
		if (returnData === null || returnData.length === 0 || returnData == "null") {
			/*
			* if($.isFunction(delegate.onError)) {
			* delegate.onError([{"code":-100, "msg":"No data was returned"}]); }
			*/
			return false;
		}

		try {
			json = JSON.parse(returnData);
		} catch(e) {
			if($.isFunction(delegate.onError)) { 
				delegate.onError([{"code":-101, "msg":e}]); 
			}
			return false;
		}

		if($.isFunction(delegate.onResponse)) {
			delegate.onResponse(json);
		} else {
			if(!json.error) {
				if($.isFunction(delegate.onSuccess)) {
					delegate.onSuccess(json);
				}
			} else if(json.fieldErrors) {
				if ($.isFunction(delegate.onFieldErrors)) {
					delegate.onFieldErrors();
				} else {
					Validation.fromServer({"data":json, "form":frm});
				}
			} else if(json.errorMessages) {
				var errs = [];
				for(var i=0; i<json.errorMessages.length; i++) {
					errs.push({"code":-102, "msg":json.errorMessages[i]});
				}
				delegate.onError(errs);
			} else {
				if($.isFunction(delegate.onError)) {
					delegate.onError([{"code":-900, "msg":"An unknown error has occurred."}]);
				}
			}
		}
	}
	
	function resetForm() {
		frm[0].reset();
		return frm;
	}
	
	(function init() {
		Validation.create();
		
		frm.attr("enctype","multipart/form-data"); 
		
		// This is a multipart form, so it'll have to go through an iFrame
		if(!$("#binarySubmit").length) {
			$(document.body).append('<iframe id="binarySubmit" name="binarySubmit" class="hide"></iframe>'); // lazy
		}
		
		frm.attr("target","binarySubmit"); // send to the iframe
	
		// Bind the form submission
		frm.bind("submit.multiPartForm", function(event){
			onSubmit();
		});
		
		// Bind the onload event for the iFrame
		$('iframe#binarySubmit').load(function(){
			var returnData = $(this).contents().text();
			onResponse(returnData);
		});
	})();
	
	return {
		"resetForm":function() {
			return resetForm();
		},
		
		// getters/setters
		"frm":function() {
			return frm;
		},
		"setDelegate":function(val) {
			delegate = val; // val is an object
		}
	};
};

/*---------------------------------------
	[G4] NATIVE OBJECT PROTOTYPE METHODS
-----------------------------------------*/
// String
String.prototype.trim  = function() { return this.replace(/^\s+|\s+$/g,""); };
String.prototype.ltrim = function() { return this.replace(/^\s+/,""); };
String.prototype.rtrim = function() { return this.replace(/\s+$/,""); };

// Date
Date.prototype.daysInMonth = function(month, year) {
	return 32 - new Date(year, month, 32).getDate();
};
Date.prototype.monthFromString = function(month) {
	switch(month.toLowerCase()) {
		case "january":
		case "jan":
			return 0;
		case "february":
		case "feb":
			return 1;
		case "march":
		case "mar":
			return 2;
		case "april":
		case "apr":
			return 3;
		case "may":
			return 4;
		case "june":
		case "jun":
			return 5;
		case "july":
		case "jul":
			return 6;
		case "august":
		case "aug":
			return 7;
		case "september":
		case "sept":
			return 8;
		case "october":
		case "oct":
			return 9;
		case "november":
		case "nov":
			return 10;
		case "december":
		case "dec":
			return 11;
		default:
			return;
	}
};

/* Pretty Date Prototype
 * Contains code from:
 * * JavaScript Pretty Date
 * * Copyright (c) 2008 John Resig (jquery.com)
 * * Licensed under the MIT license.
 */
// Takes an ISO time and returns a string representing how
// long ago the date represents.
// If date is greater than 31 days, a simple UTC representation will be returned.
Date.prototype.prettyDate = function() {
	var nowTime = (new Date()).getTime();
	var thenTime = this.getTime();
	var diff = (nowTime - thenTime) / 1000;
	var day_diff = Math.floor(diff / 86400);
		
	if ( isNaN(day_diff) || day_diff < 0 || day_diff >= 31 ) {
		return this.toUTCString();
	}
			
	return day_diff == 0 && (
			diff < 60 && "just now" ||
			diff < 120 && "1 minute ago" ||
			diff < 3600 && Math.floor( diff / 60 ) + " minutes ago" ||
			diff < 7200 && "1 hour ago" ||
			diff < 86400 && Math.floor( diff / 3600 ) + " hours ago") ||
		day_diff == 1 && "Yesterday" ||
		day_diff < 7 && day_diff + " days ago" ||
		day_diff < 31 && Math.ceil( day_diff / 7 ) + " weeks ago";
};

/*--------------------
	[G5] HOMEMADE JQUERY PLUGINS
----------------------*/
(function($){
	/*-----------------------------
		ADD FUNDS LABEL EVENTS
	-------------------------------*/
	$.fn.addFundsLabelEvents = function() {
		if(!this || !this[0]){return false;}
		var frm = $(this).closest("form");
		var presetLabels = $(this).find("label:not(.cashBalanceOther)");
		var customLabel = $(this).find("label.cashBalanceOther");
		var customRadio = customLabel.find("input");
		var cashBalanceCustomText = frm.find("input[name='cashBalanceOther']");
		var radios		= frm.find(":radio");
		
		// when a radio button is clicked, add the active class to the parent
		radios.unbind("click.cashBalance");
		radios.bind  ("click.cashBalance", function() {
			if($(this).is(":checked")) {
				frm.find("tr.sel").removeClass("sel");
				$(this).closest("tr").addClass("sel");
			}
		});
		
		// When a radio button label is clicked, empty the value of the custom
		presetLabels.unbind("click.cashBalance");
		presetLabels.bind  ("click.cashBalance", function(){
			cashBalanceCustomText.val("");
			// return false;
		});
		
		// when the other label is clicked, focus on the custom textbox
		customLabel.unbind("click.cashBalanceOther");
		customLabel.bind  ("click.cashBalanceOther", function(){
			cashBalanceCustomText.focus();		
			// return false;
		});
		
		// make sure the custom radio button is selected.
		cashBalanceCustomText.focus(function() {
			customRadio.filter(":not(:checked)").attr("checked","checked").trigger("click");
		});
		
		// copy the text value to the correct radio button
		cashBalanceCustomText.unbind("keyup.cashBalanceOther");
		cashBalanceCustomText.bind  ("keyup.cashBalanceOther", function(){
			customRadio.val(Strings.stripCommas($(this).val()));
			// return false;
		});
		
		// Here we're extending the formValidation functionality
		Validating.cashBalanceOther = function() {
			if(customRadio.is(":checked")) {
				return Validating.required();
			}
			return false;
		};

		cashBalanceCustomText.attr("validation",cashBalanceCustomText.attr("validation") + "_cashBalanceOther");
	};
	
	/*-----------------------------
		CREATE MODAL VIA AJAX
	-------------------------------*/
	$.fn.createModal = function(o) {
		if(!this || !this[0]){return false;}		
		if ($(this).hasClass('lnkLoginIndicator') || $(this).hasClass('siteLockDown') || $(this).hasClass('editPrivacyIndicator')) {
			return false;
		}
		
			o = o || {};
		var	modalId		= o.modalId		|| "",
			modalClass	= o.modalClass	|| "modal",
			method		= o.method		|| "",
			body		= o.body		|| "",
			callback	= o.callback	|| false,
			href		= o.href		|| false,
			auto		= o.auto		|| false,
			preloader   = o.preloader	|| $("#Header div.logo"),
			json		= o.json		|| {},
			hideNbox	= o.hideNbox	|| false,
			parentJson  = o.parentJson  || false;
		
		// MODAL FRAMEWORK DATA
		var data = {
			modalId:			modalId,
			modalClass:			modalClass
		};
				
		function createModal(preloader, json) {
			var btn  = preloader;
			if (typeof arguments[1] === "undefined") {
				json = btn.getJsonAttr() || {};
				if (href) {
					method = btn.attr('href')+"&ajax=true";
				}
				if (Boolean(parentJson)) {
					json = parentJson.getJsonAttr() || {};
				}
			}
			var modal = $("#"+modalId);
			
			var onModalLoad = function(data) {
				var modalFrame = data;
				
				var success = function(data) {
					if(!modal.length) {
						$("body").append(modalFrame);
						modal = $(modal.selector);
					} 
					modal.find(".body").html(data);
					if(!$("#coverMe:visible").length) {
						modal.nBox({removeTarget:true,hideNbox:hideNbox});
					} else {
						modal.centerOnScreen();
						modal.find(".iClose:first").click(function() { modal.remove(); });
						// set the z-index to be higher than the rest.
						modal.css("z-index",$(".modal:visible").length+2000);
					}
					modal.fadeIn();
					if (callback) {
						if($.isFunction(callback)) {
							callback();
						} else if($.isFunction(EventHandler[callback.method])) {
							EventHandler[callback.method]();
						}
					}							
					// EVENT TRACKING
					WeSeed.trackEvent({category:$("body").attr("id"), action:"createModal", label:btn.text()});
				};
				
				if(method.length) {
					// LOAD MODAL CONTENT
					$.ajax({
						type:	"GET",
						url:	method,
						data:	json.data,
						error:	function() { $(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"failed - please try again"}); },
						success:success
					});
					preloader.ajaxPreloader();
				} else {
					success(body);
				}
			};
			
			if(!modal.length) {
				// LOAD MODAL FRAMEWORK
				$.ajax({
					type:	"POST",
					url:	URL.common.modalFrame,
					data:	data,
					error:	function() { $(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"failed - please try again"}); },
					success:onModalLoad
				});
				preloader.ajaxPreloader();
			} else {
				onModalLoad('');
			}
			
			return false;
		}
		
		if (!auto) {
			$(this).unbind("click.createModal");
			$(this).bind  ("click.createModal", function(){
				createModal($(this));
				return false;
			});
		} else {
			createModal(preloader, json);
		}
		
		return this;
	};
		
	/*--------------------
		AJAX PRELOADER
	----------------------*/
	$.fn.ajaxPreloader = function(o) {
		if(!this || !this[0]){return false;}
		o = o || {}; // o stands for options
		var target		= $(this);
		var xPos		= o.xPos || 0;
		var yPos		= ($.browser.msie && o.yPosIE) ? o.yPosIE || -1 : o.yPos || -1;
		var visibility	= o.visibility || "hidden";
		var hide		= o.hide || false;
		var preLoader	= o.preLoader || "dynLoadingSmall"; // or dynLoadingMedium
		var cssObj = {
	        position: "absolute",
	        left: (target.offset().left) + xPos,
			top:  (target.offset().top)  + yPos
	    };
		$("body").append('<p class="'+preLoader+'">Loading...</p>');
		var zIndex = o.zIndex || false;
		if (zIndex) {
			$.extend(cssObj, {"zIndex":zIndex});
		}
		$("."+preLoader).css(cssObj);
		if (hide === true) {
			target.hide();
		} else {
			target.css("visibility",visibility);
		}
		$("."+preLoader).ajaxStop(function() {
			$(this).remove();
			if (hide === true) {
				target.show();
			} else {
				target.css("visibility","visible");
			}
		});
	};
	
	/*-------------------------------
		CENTER OBJECT ON SCREEN
		attach an element to center on screen $(elem).centerOnScreen();
	---------------------------------*/
	$.fn.centerOnScreen = function(o){
		if(!this || !this[0]){return false;}
		o = o || {};
		var xOffset = o.x || 0; // x parameter will add to the left position after centering
		var yOffset = o.y || 0; // y parameter will add to the top position after centering
		var disableVertical   = (o.disableVertical) || false;
		var disableHorizontal = (o.disableHorizontal) || false; 
		var $this   = this[0];
		var yScroll = self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
		var windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
		var windowWidth  = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
		if (!disableVertical) { $this.style.top = (yScroll + ((windowHeight - $this.offsetHeight) / 2) + yOffset) + "px"; }
		if (!disableHorizontal) { $this.style.left = ((windowWidth / 2) - ($this.offsetWidth / 2) + xOffset) + "px"; }
	};

	/*-----------------------------------------
		DISABLE A ctrElements button (used in $.fn.signup)
	------------------------------------------*/
	$.fn.disableButtonToggle = function(o) {
		if(!this || !this[0]){return false;}
			o			= o				|| {};
		var text		= o.text		|| "Loading",
			unbinder	= o.unbinder	|| 'click', // took out after cover
			enable		= o.enable		|| false,
			removeCover = o.removeCover || false;
		
		if (removeCover) { $("div.disabledCover").remove(); return this; }
		
		var	btn			= $(this),
			btnLblHide  = btn.find(".btnLabel span.hide"),
			btnLbl		= (btnLblHide.length) ? btnLblHide.text() : btn.find(".btnLabel").text(),
			tagName		= this[0].tagName.toLowerCase(),
			id			= tagName + $(tagName).index(this[0]),
			cover		= $("#"+id);
				
		if (!enable) {
			btn.addClass("btnDisabled "+id).find(".btnLabel").text(text).append('<span class="hide">'+btnLbl+'</span>');
		} else {
			cover.remove();
			btn.removeClass("btnDisabled "+id).find(".btnLabel").html(btnLbl);
		}
		
		var x	   = btn.offset().left,
			y	   = btn.offset().top,
			width  = btn.outerWidth(),
			height = btn.outerHeight();
			
		var css = {
	        left:   x,
			top:    y,
			width:  width,
			height: height
	    };
		
		if (!enable) {
			$("body").append('<div class="disabledCover" id="'+id+'"></div>');
			$("div.disabledCover").css(css);
		}
		
		return this;
	};
	
	// uh, much simpler versions
	$.fn.disable = function() {
		this.attr("disabled","disabled");
		this.addClass("btnDisabled");
		return this;
	};
	
	$.fn.enable = function() {
		this.removeAttr("disabled");
		this.removeClass("btnDisabled");
		return this;
	};
	
	/*-----------------------------------------
		EDIT PORTFOLIO
	------------------------------------------*/
	$.fn.editPortfolioDefaults = function() {
		if(!this || !this[0]){return false;}
		
		// default portfolio must be public
		var defaultBtns = $(this);
		defaultBtns.click(function() {
			$(":checkbox[name^='isPublic']").removeAttr("disabled");
			$(":checkbox[name^='delete']").removeAttr("disabled");
			if($(this).is(":checked")) {
				$(this).closest("tr").find(":checkbox[name^='isPublic']").attr({disabled:"disabled",checked:"checked"});
				$(this).closest("tr").find(":checkbox[name^='delete']").attr({disabled:"disabled",checked:""});
				WeSeed.defaultPortfolio = $(this).closest("tr").find("input[type='text']").val();
			}
		});
	};

	/*----------------------------------
		EXTEND FORM
		Intended to provide the functionality
		of the $.extend function for the object
		array returned from the serializeArray()
		function
	-----------------------------------*/
	$.extendForm = function(arr,o) {
		if(!arr || !$.isArray(arr)) { return false; }
		if(!o) { return arr; }
		
		$.each(o,function(i,val){
			var p = {};
			eval("$.extend(p,{name: '"+i+"', value: '"+val+"'})");
			arr.push(p);
		});
	};
	
	/*----------------------------------
		EXTERNAL LINK
		For handling target="_blank" anchors
		while maintaining XHTML Strict
		validation
	------------------------------------*/
	$.fn.externalLink = function() {
		if(!this || !this[0]){return false;}
		
		$(this).unbind("click.externalLink");
		$(this).bind("click.externalLink", function(e) {
			var url = $(this).attr("href");
			
			WeSeed.trackEvent({"category":$("body").attr("id"),"action":"External Link","label":url});
			
			window.open(url);
			return false;
		});
	};
	
	/*----------------------------------
		IS AWESOME
		Will return true if the browser supports 
		webkit's css transitions (chrome/safari)
	------------------------------------
	$.isAwesome = function() {
		return (typeof document.body.style.WebkitTransition != "undefined");
	};*/
	
	/*----------------------------------
		SAFE-SLIDE DOWN
		defaults to fadeIn if browser is
		IE and version <= 7
	----------------------------------*/
	$.fn.safeSlideDown = function(speed, callback) {
		if(!speed) { speed = "normal"; }
		if(!callback) { callback = null; }
	
		if($.browser.msie && $.browser.version <= 7.0) { 
			return $(this).fadeIn(speed, callback); 
		} else { 
			return $(this).slideDown(speed, callback); 
		}  
	};
	
	/*----------------------------------
		SAFE-SLIDE UP
		defaults to fadeOut if browser is
		IE and version <= 7
	----------------------------------*/
	$.fn.safeSlideUp = function(speed, callback) {
		if(!speed) { speed = "normal"; }
		if(!callback) { callback = null; }
	
		if($.browser.msie && $.browser.version <= 7.0) { 
			return $(this).fadeOut(speed, callback); 
		} else { 
			return $(this).slideUp(speed, callback); 
		}  
	};
	
	// "Like-Gmail" file input adder
	$.fn.fileInputAdder = function() {
		if(!this || !this[0]){return false;}
		
		$(this).unbind("change.fileInputAdder");
		$(this).bind  ("change.fileInputAdder", function(e){
			$(this).next(":file").addClass("show");
		});
		
		return this;
	};
	
	/*----------------------------------
		FILTERING BLOCKS AND CONTENT ~ ex: static/glossary.html
	------------------------------------*/
	$.fn.filteringBlocksControls = function(o) {		
		if(!this || !this[0]){return false;}
		
		$(this).unbind("click.filteringBlocksControls");
		$(this).bind  ("click.filteringBlocksControls", function(){
			var me			= $(this);
			var targetId	= me.attr('id').split('_')[1];
			
			// select the current block
			me.parent(".filteringBlocks").find("a").removeClass("sel");
			me.addClass("sel");
			
			if ( targetId != "all") {
				$(".filteringContent > div").hide();
				$("#"+targetId).fadeIn();
			} else {
				$(".filteringContent > div").fadeIn();
			}
		});
	};

	/*----------------------
		JOIN/LEAVE NETWORK
	------------------------*/
	$.fn.joinNetwork = function(o) {
		if(!this || !this[0]){return false;}
		
		if ($(this).hasClass('lnkLoginIndicator') || $(this).hasClass('siteLockDown')) {
			return false;
		}
		
		o = o || {};		
		$(this).unbind("click.joinNetwork");
		$(this).bind  ("click.joinNetwork", function(){
			var me			= $(this);
			var json	    = me.getJsonAttr();
			var inNetwork   = (me.html().search(/leave/i) != -1) ? true : false;
			var method		= (inNetwork) ? "/network/leaveNetwork.html?ajax=true" : "/network/joinNetwork.html?ajax=true";
			var deleteMe    = (typeof json.deleteMe  ===  "undefined") ? false : me.parents('tr:eq(0)');
			var replaceMe   = (typeof json.replaceMe ===  "undefined") ? false : true;
			var msg         = (typeof json.pending !=  "undefined") ? json.pending : json.msg;
			var returnJson  = (typeof json.returnJson ===  "undefined") ? false : true;
			var reload		= (typeof json.reload === "undefined") ? false : true;
				method		= (typeof json.action  !=  "undefined") ? json.action : method;
			var text;
			$.ajax({
				type:    "GET",
				url:     method,
				data:    json.data,
				error:   function(a,b,c){ $(".dynLoadingSmall").showRemoveAjaxMsg({ cssClass:"dynMsgError", txt:"failed - please try again. "+b+" "+c }); },
				success: function(data) {
					if (returnJson) {
						var jData = JSON.parse(data);

						if(jData.errorMsg) {
							$(".dynLoadingSmall").showRemoveAjaxMsg({ cssClass:"dynMsgError", txt:jData.errorMsg[0] });
						} else {
							$(".dynLoadingSmall").showRemoveAjaxMsg({ cssClass:"dynMsgMsg", txt:jData.successMsg });
							me.replaceWith('<span class="following">'+jData.replaceTxt+'</span>');
						}
					} else {
						if (replaceMe) {
							me.replaceWith('<span class="following">'+msg+'</span>');
							$(".dynLoadingSmall").showRemoveAjaxMsg({txt:msg, xPos:-35});
						}
						if (deleteMe) {
							deleteMe.fadeOut();
							WeSeed.timeout = setTimeout(function(){ deleteMe.remove(); },2500);						
						}
					}
					if (reload) {
						window.location.reload(true);
					}
				}
			});
			me.ajaxPreloader({yPos:-15});
			return false;
		});
	};
	
	/*----------------------------------
		CREATE CLOSED GROUP
	------------------------------------*/
	$.fn.groupClosedCreate = function(o) {		
		if(!this || !this[0]){return false;}

		var me = $(this), // me is the form
			cb = me.find("#frmGroup_classroom"),
			radioClosedGroup = me.find(".radioset input[type='radio']").not("#frmGroupEdit_user_security_closed");
		
		radioClosedGroup.click(function(){
			$("#frmGroup_classroom").attr("checked","");
			$("#btnSchoolNextStep").addClass("hide");
			$("#btnCreateGroup").removeClass("hide");
		});
		
		cb.click(function(){
			if($(this).is(":checked")){
				$("#frmGroupEdit_user_security_closed").attr("checked","checked");
				$("#btnSchoolNextStep").removeClass("hide");
				$("#btnCreateGroup").addClass("hide");
			} else {
				$("#btnSchoolNextStep").addClass("hide");
				$("#btnCreateGroup").removeClass("hide");
			}
		});
				
		me.find("#btnSchoolNextStep").click(function(){
			if (Validation.flag) { return false; }
			$("#groupStep1").fadeOut( function() {
				$("#groupStep2").fadeIn();
			});
		});
		
		me.find("#groupStep2 .lnkBack").click(function(){
			$("#groupStep2").fadeOut( function() {
				Validation.removeErrorMessages();
				$("#groupStep1").fadeIn();
			});
		});
		
		// preselect private classroom group is the cb is preselected.
		if (cb.is(":checked")) {
			cb.click();
			cb.attr("checked","checked");
		} 
	};

	/*----------------------
		FORGOT PASSWORD MODAL
	------------------------*/
	$.fn.forgotPassword = function(o) {
		if(!this || !this[0]){return false;}
			o		= o			|| {};
		var	frm		= $(this),
			frmId	= frm.attr("id"),
			url		= o.url   || "",
			btn		= frm.find(".btnForgotPassword"),
			me, eMsg;
		
		
		frm.unbind("submit.forgotPassword");
		frm.bind  ("submit.forgotPassword", function(){
			if (Validation.flag) { return false; }
			me = $(this);
			$.ajax({
				type: "POST",
				url:  "/authentication/forgot_password_post",
				cache: false,
				data: {
					fpEmail: $("#" + frmId + " input[name='fpEmail']").val()
				},
				error: function(){
					$(".dynLoadingSmall").showRemoveAjaxMsg({ cssClass:"dynMsgError", txt:"failed - please try again" });
				},
				success: function(data){
					data = $.trim(data);
					$("#" + frmId + " .msgError").remove();
					$("#" + frmId + " .msgMsg").remove();					
					if (data != "success") {
						eMsg = (data.toLowerCase().match("account disabled")) ? "Account Disabled" : "Your email was not found in the system. <br/>Please try another."; 
						$("#" + frmId + " h2:first").after('<div class="msgError hide">'+eMsg+'</div>');							
						$("#" + frmId + " .msgError").fadeIn();
						$("#" + frmId + " .msgError").removeClass("hide");
					}else {
						$("#" + frmId + " h2:first").after('<div class="msgMsg hide">Your password has been reset and sent to the email address you provided.<br/>Please try signing in with your new password.</div>');
						$("#" + frmId + " .msgMsg").fadeIn();
						$("#" + frmId + " .msgMsg").removeClass("hide");
					}
				},
				complete: function() {
					if( $(".msgMsg").length ) {
						btn.disableButtonToggle({'text':'Password Sent', 'unbinder':'click.forgotPassword'});
						btn.bind("click.forgotPassword", function(){ return false; } );
						return false;
					}
				}
			});
			btn.ajaxPreloader({xPos:20, yPos:-13});
			return false;
		});
	};
	
	/*--------------------------
		WESEED'S MAIN SEARCH
	----------------------------*/
	$.fn.weseedSearch = function(o) {
		if(!this || !this[0]){return false;}
		
		// APPEND THE CONTAINERS TO THE BODY
		$("body").append('<div id="suggestResults"></div>');
		$("body").append('<dl id="searchSuggestWrap"></dl>');
		
		var srchResults = $("#suggestResults"),
			ssWrap		= $("#searchSuggestWrap"),
			srchFlds	= $(this).find("input[name='q']");
		
		// positioning plugin
		var setMyCoords = function(elem, options) {
			if(!elem || !elem[0]){return false;}
			
				options = options || {};
			var me		= elem,
				xAdj	= options.xAdj || 0,
				yAdj	= options.yAdj || 0,
				srchFld = options.srchFld,
				offset  = srchFld.offset(),
				jsonCSS;
			
			var gTop  = (srchFld.attr("id") === "globalSearchFld" && me.hasClass("suggest_globalSearchFld")) ? -1: 0,
				gLeft = (srchFld.attr("id") === "globalSearchFld" && me.hasClass("suggest_globalSearchFld")) ? 10: 0;
				gLeft = (srchFld.attr("id") === "globalSearchFld" && me.hasClass("results_globalSearchFld")) ? 38: gLeft;
			
			jsonCSS = {
					      top:  (offset.top + srchFld.height() + 18 + yAdj + gTop) + 'px',
					      left: (offset.left - 48 + xAdj + gLeft) + 'px'
				      };
				  
			me.css(jsonCSS);			
			//return elem;
		};
		
		// removing irrelevant class
		$.fn.removeSrchFldClass = function() {
			if(!this || !this[0]){return false;}
			var me  = $(this),
				who = (me.attr("id") === "suggestResults") ? "results_": "suggest_";
			srchFlds.each(function(j, val2) {
				me.removeClass(who+$(val2).attr("id"));
			});
			return me;
		};
		
		$(window).resize(function() {
			var srchResultsFld	= $("#"+srchResults.attr("class").split("_")[1]),
				ssWrapFld		= $("#"+ssWrap.attr("class").split("_")[1]);
			
			setMyCoords(srchResults,{"srchFld":srchResultsFld});
			setMyCoords(ssWrap,{"srchFld":ssWrapFld, "xAdj":26});
		});
		
		// this is a form with a class of mainSearchForm
		$(this).each(function(i, val) {
				o			= o || {};
			var frm			= $(this),
				srchFld		= frm.find("input[name='q']"),
				srchFldId = srchFld.attr("id"),
				goBtn		= frm.find("a.btnGo"),
				timeout;
				goBtn		= (goBtn.length) ? goBtn : false;
			
			srchFld.resetTxtField({"include":($("#areaLandingPage").hasClass("returning")) ? "label" : null});
			
			// this is only on the global search
			if (goBtn) {
				goBtn.unbind("click.weseedSearch");
				goBtn.bind  ("click.weseedSearch",function(){
					frm.trigger('submit.weseedSearch');
				});
			}
			
			// START ATTACHING EVENTS
			frm.unbind("submit.weseedSearch");
			frm.bind  ("submit.weseedSearch", function(){
				if ($.trim(srchFld.val()) === "") { return false; }
				
				srchResults.hide().removeSrchFldClass().addClass("results_"+srchFldId);
				setMyCoords(srchResults,{"srchFld":srchFld});
				
				var me				= $(this), // is the form
					goBtn			= me.find(".btnGo"),
					srchTxtBoxLbl	= me.find("label.overFld");
				
				$.ajax({
					type: "POST",
					url:  frm.attr("action"),
					data: {
						fromAction: 'search',
						q: srchFld.val()
					},
					error: function() {
						$(".dynLoadingSmall").showRemoveAjaxMsg({ cssClass:"dynMsgError", txt:"failed - please try again" });
					},
					success: function(data){
						srchResults.html(data).show();
						ssWrap.hide();
						// attach events
						EventHandler.actions();
						srchResults.find(".searchClose").click(function(){
							$(this).hide();
							srchFld.val('');
							srchFld.blur();
							srchTxtBoxLbl.show();
							srchResults.slideUp();
							return false;
						});
					},
					complete: function() {
						goBtn.enable();
					}
				});
				goBtn.disable();
				//goBtn.ajaxPreloader({xPos:8, yPos:-5, yPosIE:2});
				return false;
			});
			
			// text-navigation
			srchFld.unbind("focus.weseedSearch");
			srchFld.bind  ("focus.weseedSearch",function(e){
				ssWrap.hide();
				ssWrap.removeSrchFldClass().addClass("suggest_"+srchFldId);				
				setMyCoords(ssWrap,{"srchFld":srchFld, "xAdj":26});
			});
			
			// text-navigation
			srchFld.unbind("blur.weseedSearch");
			srchFld.bind  ("blur.weseedSearch",function(e){
				WeSeed.srchTO = setTimeout(function() {
					ssWrap.hide();
					ssWrap.empty();
				}, 200);
			});
			
			// text-navigation
			srchFld.unbind("keyup.weseedSearch");
			srchFld.bind  ("keyup.weseedSearch",function(e){
				var me			= $(this),
					sel			= ssWrap.find(".sel"),
					key			= e.keyCode,
					resultsList = "",
					arrResults;
				
				if(me.val().length === 0) {
					ssWrap.hide();
					return false;
				}			
				
				// left or right arrow
				if(key === 37 || key === 39) {
					return false;
				}
				
				// escape
				if(key === 27) {
					if(ssWrap.is(":hidden")) {
						me.val('');
					} else {
						ssWrap.hide();
					}
					return false;
				}
				
				// arrow up or down
				if((key === 38 || key === 40) && !sel.length) {
					ssWrap.find("dd:first").addClass("sel");
					me.val(ssWrap.find("dd.sel").text());
					return false;
				}

				// arrow down
				if(key === 40) {
					if(sel.next("dd").length) {
						sel.removeClass("sel");
						sel.next("dd").addClass("sel");
						me.val(ssWrap.find("dd.sel").text());
					}
					return false;
				}

				// arrow up
				if(key === 38) {
					if(sel.prev("dd").length) {
						sel.removeClass("sel");
						sel.prev("dd").addClass("sel");
						me.val(ssWrap.find("dd.sel").text());
					}
					return false;
				}
				
				// enter
				if(key === 13) {
					ssWrap.hide();
					return false;
				}	
				
				// only search on useful inputs
				// keys in order: backspace, escape, delete, alphanumericish
				if (key != 8 && key != 27 && key != 46 && !(key >= 48 && key <= 111)) { 
					return false;
				}
				
				clearTimeout(timeout);
				timeout = setTimeout(function(){
					$.get("/search/suggest", {"q":srchFld.val(),"limit":10}, function(data) {
						arrResults = data; // data is an array
						if (!arrResults.length) { ssWrap.hide().empty(); return false; }
					
						for (var i in arrResults) {
							if (arrResults.hasOwnProperty(i)) {
								resultsList += '<dd>' + arrResults[i] + '</dd>';
							}
						}
					
						if (srchResults.hasClass("results_"+me.attr("id"))) {					
							srchResults.hide();
						}
						ssWrap.show().html(resultsList);
					
					
						// attach events
						ssWrap.find("dd").click(function(){
							ssWrap.hide();
							me.val($(this).text());
							frm.trigger('submit.weseedSearch');
						});
					
						ssWrap.mouseenter(function(e){
							$(this).find(".sel").removeClass("sel");
						});
						ssWrap.mouseleave(function(e){
							$(e.target).closest("dd").addClass("sel");
						});
					},"json");
				},150);
			});
		});
	};

	/* omg when can I refactor */
	$.fn.weseedSuggest = function(o) {
		if(!this || !this[0]){return false;}
		
		// APPEND THE CONTAINERS TO THE BODY
		$("body").append('<div id="suggestResults"></div>');
		$("body").append('<dl id="searchSuggestWrap"></dl>');
		
		var srchResults = $("#suggestResults"),
			ssWrap		= $("#searchSuggestWrap"),
			srchFlds	= $(this).find("input[name='q']");
		
		// positioning plugin
		var setMyCoords = function(elem, options) {
			if(!elem || !elem[0]){return false;}
			
				options = options || {};
			var me		= elem,
				xAdj	= options.xAdj || 0,
				yAdj	= options.yAdj || 0,
				srchFld = options.srchFld,
				offset  = srchFld.offset(),
				jsonCSS;
			
			var gTop  = (srchFld.attr("id") === "globalSearchFld" && me.hasClass("suggest_globalSearchFld")) ? -1: 0,
				gLeft = (srchFld.attr("id") === "globalSearchFld" && me.hasClass("suggest_globalSearchFld")) ? 10: 0;
				gLeft = (srchFld.attr("id") === "globalSearchFld" && me.hasClass("results_globalSearchFld")) ? 38: gLeft;
			
			jsonCSS = {
					      top:  (offset.top + srchFld.height() + 18 + yAdj + gTop) + 'px',
					      left: (offset.left - 48 + xAdj + gLeft) + 'px'
				      };
				  
			me.css(jsonCSS);			
			//return elem;
		};
		
		// removing irrelevant class
		$.fn.removeSrchFldClass = function() {
			if(!this || !this[0]){return false;}
			var me  = $(this),
				who = (me.attr("id") === "suggestResults") ? "results_": "suggest_";
			srchFlds.each(function(j, val2) {
				me.removeClass(who+$(val2).attr("id"));
			});
			return me;
		};
		
		$(window).resize(function() {
			var srchResultsFld	= $("#"+srchResults.attr("class").split("_")[1]),
				ssWrapFld		= $("#"+ssWrap.attr("class").split("_")[1]);
			
			setMyCoords(srchResults,{"srchFld":srchResultsFld});
			setMyCoords(ssWrap,{"srchFld":ssWrapFld, "xAdj":26});
		});
		
		// this is a form with a class of mainSearchForm
		$(this).each(function(i, val) {
				o			= o || {};
			var frm			= $(this),
				srchFld		= frm.find("input[name='q']"),
				srchFldId = srchFld.attr("id"),
				goBtn		= frm.find("a.btnGo"),
				timeout;
				goBtn		= (goBtn.length) ? goBtn : false;
			
			srchFld.resetTxtField({"include":($("#areaLandingPage").hasClass("returning")) ? "label" : null});
			
			// this is only on the global search
			if (goBtn) {
				goBtn.unbind("click.weseedSearch");
				goBtn.bind  ("click.weseedSearch",function(){
					frm.trigger('submit.weseedSearch');
				});
			}
			
			// text-navigation
			srchFld.unbind("focus.weseedSearch");
			srchFld.bind  ("focus.weseedSearch",function(e){
				ssWrap.hide();
				ssWrap.removeSrchFldClass().addClass("suggest_"+srchFldId);				
				setMyCoords(ssWrap,{"srchFld":srchFld, "xAdj":26});
			});
			
			// text-navigation
			srchFld.unbind("blur.weseedSearch");
			srchFld.bind  ("blur.weseedSearch",function(e){
				WeSeed.srchTO = setTimeout(function() {
					ssWrap.hide();
					ssWrap.empty();
				}, 200);
			});
			
			// text-navigation
			srchFld.unbind("keyup.weseedSearch");
			srchFld.bind  ("keyup.weseedSearch",function(e){
				var me			= $(this),
					sel			= ssWrap.find(".sel"),
					key			= e.keyCode,
					resultsList = "",
					arrResults;
				
				if(me.val().length === 0) {
					ssWrap.hide();
					return false;
				}			
				
				// left or right arrow
				if(key === 37 || key === 39) {
					return false;
				}
				
				// escape
				if(key === 27) {
					if(ssWrap.is(":hidden")) {
						me.val('');
					} else {
						ssWrap.hide();
					}
					return false;
				}
				
				// arrow up or down
				if((key === 38 || key === 40) && !sel.length) {
					ssWrap.find("dd:first").addClass("sel");
					me.val(ssWrap.find("dd.sel").text());
					return false;
				}

				// arrow down
				if(key === 40) {
					if(sel.next("dd").length) {
						sel.removeClass("sel");
						sel.next("dd").addClass("sel");
						me.val(ssWrap.find("dd.sel").text());
					}
					return false;
				}

				// arrow up
				if(key === 38) {
					if(sel.prev("dd").length) {
						sel.removeClass("sel");
						sel.prev("dd").addClass("sel");
						me.val(ssWrap.find("dd.sel").text());
					}
					return false;
				}
				
				// enter
				if(key === 13) {
					ssWrap.hide();
					return false;
				}	
				
				// only search on useful inputs
				// keys in order: backspace, escape, delete, alphanumericish
				if (key != 8 && key != 27 && key != 46 && !(key >= 48 && key <= 111)) { 
					return false;
				}
				
				clearTimeout(timeout);
				timeout = setTimeout(function(){
					$.get("/search/suggest", {"q":srchFld.val(),"limit":10}, function(data) {
						arrResults = data; // data is an array
						if (!arrResults.length) { ssWrap.hide().empty(); return false; }
					
						for (var i in arrResults) {
							if (arrResults.hasOwnProperty(i)) {
								resultsList += '<dd>' + arrResults[i] + '</dd>';
							}
						}
					
						if (srchResults.hasClass("results_"+me.attr("id"))) {					
							srchResults.hide();
						}
						ssWrap.show().html(resultsList);
					
					
						// attach events
						ssWrap.find("dd").click(function(){
							ssWrap.hide();
							me.val($(this).text());
						});
					
						ssWrap.mouseenter(function(e){
							$(this).find(".sel").removeClass("sel");
						});
						ssWrap.mouseleave(function(e){
							$(e.target).closest("dd").addClass("sel");
						});
					},"json");
				},150);
			});
		});
	};

	/*---------------------------------
	LOAD VIDEO QUICK LIST 
	Author::Drew Robinson
	----------------------------------
	$.fn.videoQuickList = function(o) {
		$("#videoListUL").empty().show();
		var quickList = $("#videoListUL");
		var quickListItems = "";
		for(var v=0; v < o.brightcoveVideos.length; v++){
			  var playsTotal = (BrightCove.videoObject.brightcoveVideos[v].playsTotal === null)?"0":BrightCove.videoObject.brightcoveVideos[v].playsTotal;
			  var lastChild  = (v===(BrightCove.videoObject.brightcoveVideos.length-1)) ? 'class="last-child"' : '';
			  var duration   = Strings.milliToTime(BrightCove.videoObject.brightcoveVideos[v].length);
		
			  quickListItems += '<li '+lastChild+'><a href="/video/?videoId='			+
								o.brightcoveVideos[v].id									+
								'" rel="'													+
								o.brightcoveVideos[v].id									+
								'" title="'													+
								o.brightcoveVideos[v].shortDescription						+
								'" class="video-link">'	+
								o.brightcoveVideos[v].shortDescription						+
								'</a></li>';
		
		}
		quickListItems += "";
		quickList.html(quickListItems);
		$("[rel='"+BrightCove.videoObject.firstPlayId+"']").addClass("sel");
	};*/
	
	// $.fn.getWeSeedToday = function(o) {
	// 		if(!this || !this[0]){return false;}
	// 			o = o || {};
	// 		var playlistRefId = o.playlistRefId || "20";
	// 		var brightCoveJson = o.brightCoveJson || false;
	// 		var parent = $(this);
	// 		
	// 		var loadVideo = function(json){
	// 			BrightCove.videoObject = json.brightcoveVideos[0];
	// 			BrightCove.weSeedToday = BrightCove.videoObject.id;
	// 			var duration = Strings.milliToTime(BrightCove.videoObject.length);
	// 			var viewsString = (BrightCove.videoObject.playsTotal) ? BrightCove.videoObject.playsTotal+" views" : "";
	// 
	// 			$('<p>'+BrightCove.videoObject.shortDescription+'<br/>'										+
	// 					'<small class="floatR more hide"><a href="/video/?videoId='+BrightCove.videoObject.id+'">'	+
	// 					'more videos</a></small><small class="duration">'									+
	// 					duration + '</small> <small class="views">'											+
	// 					viewsString																			+
	// 					'</small></p>').appendTo(parent.find('li:first'));
	// 		};
	// 
	// 		if(brightCoveJson && brightCoveJson.brightcoveVideos) {
	// 			loadVideo(brightCoveJson);
	// 		} else {
	// 			$.getJSON("/videoJSON.html?videoLineupId="+playlistRefId,{},loadVideo);
	// 		}
	// 	};
	
	/*-----------------------------------------------
		Invite Members: Add member to invite list
		Called from membersQuickSearch()
	------------------------------------------------*/
	$.fn.membersAddInvite = function() {
		if(!this || !this[0]){return false;}
		var results = $(this);
		
		results.find("li").live("click.membersAddInvite",function(){
			var userId = $(this).find("input[name='userId']").val();
			// has this company already been added to the gift list?
			var existingUser = $("#inviteMembers .wrapper li input[value='"+userId+"']");
			if(existingUser.length || $(this).hasClass("invited")) {
				
			} else {
				$(this).appendTo($("#inviteMembers .wrapper"))
						.find(".action").removeClass("iAdd").addClass("iTrash");
			}
		});
		
		results.bind("mouseenter.membersAddInvite",function(e){
			results.find(".sel").removeClass("sel");
		});
		results.bind("mouseleave.membersAddInvite",function(e){
			var lastElement = $(e.target);
			lastElement.closest("li").addClass("sel");
		});
		
		$("#inviteMembers .wrapper li .action").live("click.removeUser",function(){
			$(this).closest("li").remove();
		});
	};
	
	/*-----------------------------------------------
		Members Quick Search (for Group Invites)
		!! This should be integrated with the RSS search, Gift Company search
	-------------------------------------------------*/
	$.fn.membersQuickSearch = function(){
		if(!this || !this[0]){return false;}
		
		var me = $(this);
		var go = me.siblings("#goButton");
		var results = $("#mGroupInviteMembers .searchResults");
		var clearButton = me.siblings(".rssQuickSearchClear");
		var emptyMessage = results.html();
		
		var groupId = me.getJsonAttr().groupId;
		var groupSlug = me.getJsonAttr().groupSlug;
		var action = "/group/"+groupSlug+"/member-quick-search?groupId="+groupId+"&searchString=";
		
		me.focus();
		
		// live-bind to the returned objects
		results.membersAddInvite();

		// text-navigation
		me.bind("keydown.membersQuickSearch",function(e){
			var sel = results.find(".sel");
			var key = e.keyCode;
			
			if((key === 38 || key === 40) && !sel.length) {
				results.find("li:first").addClass("sel");
				return false;
			}
			if(key === 13 && sel.length) { // enter
				sel.removeClass("sel");
				if(sel.prev("li").length) {
					sel.prev("li").addClass("sel");
				} else {
					sel.next("li").addClass("sel");
				}
				sel.click();
				
				return false;
			}
			if(key === 27) { // escape
				clearButton.click();
			}
			if(key === 38) { // up
				if(sel.prev("li").length) {
					sel.removeClass("sel");
					sel.prev("li").addClass("sel");
				}
				
				return false;
			}
			if(key === 40) { // down
				if(sel.next("li").length) {
					sel.removeClass("sel");
					sel.next("li").addClass("sel");
				}
				
				return false;
			}
		});
				
		me.closest("form").bind("submit",function(e) {
			e.preventDefault();
			clearButton.show().ajaxPreloader({yPos:-10,xPos:2,yPosIE:1});
			
			// clearTimeout(WeSeed.quickSearchTO);
			// WeSeed.quickSearchTO = setTimeout(function(){
				var searchString = me.val();
				
				if(searchString.length > 0) {
					me.siblings(".iconS").show();
					$.get(action+escape(searchString), function(data) {
						results.empty().prepend(data);
						results.find("li:first").addClass("sel");
						
						if(results.find("li").length === 0) {
						
							// If the user has typed an email address, let them
							// add it to the list.
							if(Strings.isEmail(searchString)) {
								$("#mGroupInviteMembers .searchResults .quickSearch").append(
									"<li><input type=\"hidden\" value=\""+searchString+"\" name=\"emailInvites[]\"/>"+
									"<img height=\"16\" width=\"16\" class=\"iconS iAdd action\" src=\"/images/backgrounds/blank.gif\" alt=\"Add icon\"/>"+
									"<img height=\"40\" width=\"40\" style=\"background: url(/images/default/email-40x40.png) no-repeat scroll 50% 50%;\" alt=\"Invite user by email\" src=\"/images/backgrounds/blank.gif\"/>"+
									"<span class=\"name\"><small>Send email to:</small>"+Strings.truncate({string: searchString, length:16, tooltip:true})+"</span></li>"						
								).find("li").click();
								clearButton.click();
							}
						
						}
						// highlight the matched Strings using external
						// $.highlight plugin
						// if(false){ $("#mGroupInviteMembers .searchResults
						// label").each(function() { $.highlight(this,
						// searchString.toUpperCase()); }); }
					});
				}
				else {
					results.empty().prepend(emptyMessage);
					clearButton.hide();
					$(".dynLoadingSmall").remove();
				}
			// },150);
		});
				
		clearButton.unbind("click.rssCompanySearchClear");
		clearButton.bind  ("click.rssCompanySearchClear",function(){
			$(this).siblings(":text").val('');
			results.empty().prepend(emptyMessage);
			$(this).hide();
		});
	};
	
	/*-----------------------------------------------
		SEND INVITE TO MEMBERS (groups and teams)
		Bound to submit button.
	------------------------------------------------*/
	$.fn.membersSendInvite = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {};
		var me = $(this);
		var frm = o.frm || me.closest("form");
		if(!frm || !frm.length){return false;}
		
		frm.submit(function(){
			if(frm.serializeArray().length <= 1) {
				return false;
			}
			
			me.unbind("click");
		
			// AJAX CALL
			$.post(frm.attr("action"),frm.serializeArray(),function(json){
				if(json.successMsg) { 
					frm.find(".wrapper li").fadeOut("normal",function(){$(this).remove();});
					$(".rssQuickSearchClear").click();
					me.showRemoveAjaxMsg({ cssClass: "dynMsgMsg", txt: json.successMsg, yPos:25});
					// me.siblings(".responseMsg").text("Invitations were sent
					// successfully").fadeIn();
				} else {
					me.showRemoveAjaxMsg({ cssClass: "dynMsgError", txt: "Your invitations could not be sent", timeout:4000, yPos:25});
					// me.siblings(".responseMsg").text(data).fadeIn();
				}
				
				me.click(function(){
					frm.submit();
				});
				
			},"json");
			
			return false;
		});
		
		me.click(function(){
			frm.submit();
		});		
	};
	
	/*
	 * Adds an external email address to the list of group invites.
	 */
	$.fn.nonMembersSendInvite = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {};
		var me = $(this);
		var frm = o.frm || me.closest("form");
		if(!frm || !frm.length){return false;}
		
		var groupId = frm.find("input[name='groupId']");
		var emailInvites = frm.find("textarea");

		frm.submit(function(){
			if(emailInvites.val().length === 0) {
				return false;
			}

			
			var arr = [];
			arr.push({ name:'groupId', value:groupId.val()});
			
			try {
				// parse the email addresses from the textarea
				var emailInvitesArray = emailInvites.val().split(",");
				
				$.each(emailInvitesArray,function(i,val){
					val = $.trim(val);
					if(Strings.isEmail(val)) {
						arr.push({ name:'emailInvites', value: val });
					}
				});
				
				if(arr.length <= 1) { throw "No email addresses found"; }
			} catch(e) {
				me.showRemoveAjaxMsg({ cssClass: "dynMsgError", txt: "Please enter valid email addresses separated by commas."});
			}
			
			me.unbind("click");
		
			// AJAX CALL
			$.post("/group/sendInvites.html?ajax=true",arr,function(data){
				if(data==="success"){
					emailInvites.val('');
					me.showRemoveAjaxMsg({ cssClass: "dynMsgMsg", txt: arr.length-1 + " invitations sent successfully."});
						
				} else {
					me.showRemoveAjaxMsg({ cssClass: "dynMsgError", txt:data });
				}
				
				me.click(function(){
					frm.submit();
				});
				
			});
			
			me.ajaxPreloader();
			return false;
		});
		
		me.click(function(){
			frm.submit();
		});		
	};
	
	$.fn.editGossip = function(o) {
	
		if(!this || !this[0]){return false;}
		var btn				= $(this);
			o				= o					|| {};
		var page			= o.page			|| $(this).attr("page");
		var url				= o.url				|| $(this).attr("href");
		var publicationId	= o.publicationId	|| $(this).attr("rel");
		var editWrapper		= ".mChatsEdit_"+publicationId;
		
		btn.unbind("click.editGossip");
		btn.bind  ("click.editGossip", function(){
			if($(editWrapper).is(":empty")){
				$(editWrapper).load(url,function(){
					$(this).prev().hide();
					$(this).find(".btnCancel").click(function(){
						$(editWrapper).hide();
						$(editWrapper).prev().show();
					});
					$(this).find(".btnSubmitFeedBack").click(function() {
						if($.trim($(this).parents("form").find("textarea:eq(0)").val()) === ""){
							return false;
						}
						var $this = $(this);
						var serialArray = $this.parents("form").serializeArray();
						$.post("/saveGossip.html?ajax=true",serialArray,function(data){
							$this.parents(".secondary .wrap").load("/"+page+"?ajax=true",{publicationId:publicationId},function(){
								//EventHandler.secContentAll();
							});
						});
						$(this).ajaxPreloader({yPos:-10,xPos:2});
						return false;
					});
				});
			} else {
				$(editWrapper).prev().hide();
				$(editWrapper).show();
			}
			return false;
		});
		
	};
	
	/*
	 * $.fn.deleteGossip = function(o) { if(!this || !this[0]){return false;}
	 * var btn = $(this); var o = o || {}; var returnTo = o.returnTo ||
	 * $("#backLink").attr("href");
	 * 
	 * btn.unbind("click.deleteGossip"); btn.bind ("click.deleteGossip",
	 * function(e){ var url = o.url || $(this).attr("href");
	 * 
	 * $.get(url+"&ajax=true",paramArray,function(){ window.location = returnTo;
	 * }); $(this).ajaxPreloader({yPos:-10,xPos:2}); }); };
	 */
	
	/*--------------------------
		FEED GOSSIP SAVE BUTTON
		- needs to be integrated with saveGossip.
	----------------------------
	$.fn.saveFeedGossip = function(o) {
		if(!this || !this[0]){return false;}
		
		if ($(this).hasClass('editPrivacyIndicator')) {
			return false;
		}
		
			o	= o		|| {};
		var btns = $(this),
			url  = o.url || "";
		
		btns.unbind("click.saveFeedGossip");
		btns.bind  ("click.saveFeedGossip", function(){
			var btn = $(this);
			var frm = btn.closest("form");
			var primary = frm.parents(".secContent").find(".primary");
			
			// var url = o.url || $(this).attr("href");
			// var page = o.page || $(this).attr("page");
			if(frm.find("textarea").val().length === 0) { return false; }
			
			$.post(frm.attr("action"),frm.serializeArray(),function(data){
				frm.find("textarea:eq(0)").val('');
				primary.prepend(data);
				primary.find(".emptyWrapper").remove();
				if(!$.browser.msie){ primary.find("div:eq(0)").hide().slideDown(); }
				WeSeed.timeout = setTimeout(function(){
					$("#errorMessages").remove();
				},2500);
				//EventHandler.secContentAll();
			});
			$(this).ajaxPreloader({yPos:-10,xPos:2});
			return false;
		});
	};*/
	
	/*--------------------------
		COMMENTS SAVE BUTTON
	----------------------------*/
	$.fn.showCommentForm = function(o) {
		if(!this || !this[0]){return false;}
		var me = $(this);
		
		if ($(this).hasClass('lnkLoginIndicator') || $(this).hasClass('siteLockDown') || $(this).hasClass('editPrivacyIndicator')) {
			return false;
		}
		
		// $(".commentPostForm textarea").blur(function(){
		// 			// $(this).closest(".commentPostForm").slideUp("fast");
		// 		});
		me.unbind("click.showCommentForm");
		me.bind("click.showCommentForm", function(){
			var formID = "#"+$(this).attr("href").split("#")[1];
			if(!$(formID).is(":visible")){
				$(formID).slideDown("fast");
				$(formID + " textarea:eq(0)").focus();
			} else {
				$(formID).slideUp("fast");
				$(formID + " textarea:eq(0)").focus();
			}
			return false;
		});
	};
	
	/*$.fn.saveComment = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {};
		$(this).each(function(){
			var btn			= $(this);
			var pubid		= btn.attr("href").split("#")[1];
			var frm			= $(this).closest("form")										|| $("#commentForm"+pubid).find("form");
			var wrapper		= frm.parent().siblings(".commentsWrapper")						|| $("#commentsWrapper"+pubid);
			var commentCnt		= wrapper.siblings(".mComment").find("span[id^='commentNum']")	||$("#commentNum"+pubid);
			var textarea	= frm.find("textarea:eq(0)");
			
			btn.unbind("click.saveComment");
			btn.bind  ("click.saveComment", function(){
				if(textarea.val() === ""){
					return false;
				}

				$.post("/comments",frm.serializeArray(),function(data){
					textarea.val('');
					wrapper.append(data);
					// wrapper.find(".empty").remove();
					if(!$.browser.msie){ wrapper.find(".mComment:last").hide().slideDown(); }
					var newCount = Number(commentCnt.text())+1;
					commentCnt.text(newCount);
					EventHandler.commenting();
				});
				$(this).ajaxPreloader({yPos:-10,xPos:2});
				return false;
			});
		});
		
	};*/
	
	/*$.fn.editComment = function(o) {
	
		if(!this || !this[0]){return false;}
		var btns				= $(this);
			o					= o					|| {};
		
		btns.unbind("click.editComment");
		btns.bind  ("click.editComment", function(){
		
			var url				= o.url				|| $(this).attr("href");
			// var page = o.page || $(this).attr("page");
			// var publicationId = o.publicationId || $(this).attr("pubid");
			var commentId				= o.commentId			|| $(this).attr("rel");
			var commentWrapper	= $(this).closest(".mComment");
			var editWrapper		= commentWrapper.next() || $(".mCommentEdit_"+commentId);

			if($(editWrapper).is(":empty")){
				editWrapper.load(url,{publicationId:commentId},function(){
					EventHandler.commenting();
					commentWrapper.hide();
					$(this).find(".btnCancel").click(function(){
						editWrapper.hide();
						editWrapper.prev().show();
					});
					$(this).find(".btnSubmitFeedBack").click(function(){
						var btn = $(this);
						if(btn.closest("form").find("textarea:eq(0)").val() === ""){
							return false;
						}
						var serialArray = $(this).parents("form").serializeArray();
						$.post("/saveComment.html?ajax=true",serialArray,function(data){
							commentWrapper.replaceWith(data);
							editWrapper.remove();
							EventHandler.commenting();
						});
						return false;
					});
				});
			} else {
				commentWrapper.hide();
				editWrapper.show();
			}
			$(this).ajaxPreloader({yPos:-10,xPos:2});
			return false;
		});
		
	};*/
	
	/* $.fn.deleteComment = function(o) {
		if(!this || !this[0]){return false;}
			o		= o || {};
		var btns = $(this);
		
		btns.unbind("click.deleteComment");
		btns.bind  ("click.deleteComment", function(){
			var btn = $(this);
			var url				= o.url				|| $(this).attr("href");
			// var page = o.page || $(this).attr("page");
			// var publicationId = o.publicationId || $(this).attr("pubid");
			var commentId				= o.commentId			|| $(this).attr("rel");
			var wrapper			= btn.closest(".commentsWrapper");
			var commentCnt		= wrapper.siblings(".mComment").find("span[id^='commentNum']");
			// var commentCnt = btn.closest(".mChats").find(".mComment
			// span[id^='commentNum']");

			$.post(url,function(data){
				if($.browser.msie){
					btn.closest(".mComment").hide();
				} else { 
					btn.closest(".mComment").slideUp(600,function(){$(this).remove();});
				}
				var newCount = Number(commentCnt.text())-1;
					commentCnt.text(newCount);
				// EventHandler.secContentAll();
			});
			$(this).ajaxPreloader({yPos:-10,xPos:2});
			return false;
		});
	}; */
	
	/*----------------
		MODAL MINI
	------------------*/		
	$.fn.modalMini = function(target, o) {
		if(!this || !this[0]){return false;}
			o = o || {}; // o stands for options
		var xPos = o.xPos || 2,
			yPos = o.yPos || 5;
		
		switch($(this).hasClass()) {
			case 'lnkLoginIndicator': case 'siteLockDown':
				target = $('#modalMiniLoginIndicator');
				break;
		}		

		$(this).unbind("click.modalMini");
		$(this).bind  ("click.modalMini", function(e){
			e.preventDefault();
			
			var trigger = $(this);
			var posTop = trigger.offset().top;
			if (posTop < target.height()){
				posTop = target.height();
			} else if (posTop + target.height() > $("body").height()){
				posTop = posTop - (target.height()/2);
			}
			var posLeft = trigger.offset().left;
			
			if (posLeft < target.width()){
				posLeft = target.width();
			} else if (posLeft + target.width() > $("body").width()){
				posLeft = ($("body").width() - (target.width()/2)) - 125;
			}
			if (target.attr("id") != WeSeed.mmId && target.is(":visible")) {
				target.fadeOut();
				return false;
			}
			if (WeSeed.mmTop === posTop && WeSeed.mmLeft === posLeft && target.is(":visible")) {
				target.fadeOut();
				return false;
			}
			$("body").append(target);
			target.css({top:posTop + (trigger.height()+yPos), left:(posLeft + (((trigger.width()/2)) - (target.width()/2)) + xPos)});
			target.fadeIn();
			WeSeed.mmTop  = posTop;
			WeSeed.mmLeft = posLeft;
			WeSeed.mmId   = target.attr("id");
			return false;
		});
		
		target.find(".iClose").click(function()    { target.fadeOut(); return false; });
		target.find(".btnCancel").click(function() { target.fadeOut(); return false; });
		target.find(".lnkCancel").click(function() { target.fadeOut(); return false; });
		return this;
	};
	
	/*-------------------------------
		NBOX OVERLAY
		Be sure to style #coverMe in your css with opacity settings to your liking
	---------------------------------*/
	$.fn.nBoxHide = function(target, o){
		if(!this || !this[0]){return false;}
			o = o||{};
		var autoHide = o.autoHide || false;
		var removeTarget = o.removeTarget || false;
		$(this).click(function(){
			if (removeTarget) {
				target.remove();
			} else {
				target.hide(); // now that we are creating modals via ajax
			}
			Validation.removeErrorMessages();
			
			$("#coverMe").fadeOut(function(){				
				$(this).remove();
				$("#wordBalloonSmall").hide();
			});
			$(window).unbind("resize.nBox");

		});
		if (autoHide) {
			if (removeTarget) {
				target.remove();
			} else {
				target.hide();
			}

			$("#coverMe").fadeOut(function(){
				$(this).remove();
				$("#wordBalloonSmall").hide();
			});
			$(window).unbind("resize.nBox");
		}
	};
	
	$.fn.nBox = function(o){
			o = o || {};
		var a = this,
			thisId = a.attr("id"),
			b = o.width,
			c,
			d,
			hideNbox		  = o.hideNbox		   || false,
			removeTarget  = o.removeTarget || false,
			coverMe			  = $("#coverMe").length;
		
		if (!coverMe) {
			$("body").prepend("<div id='coverMe'></div>");
		}
		var calculateSize = function() {
			c=window.innerHeight||document.body.clientHeight||document.documentElement.clientHeight;
			if (c < $(window).height()) {
				c = $(window).height();
			}
			d=(document.height>c)?document.height:c;
		};
		calculateSize();
		var e = "100%";
		$("#coverMe").height(d).width(e).fadeIn();
		
		if (!coverMe) {
			$(window).unbind("resize.nBox");
			$(window).bind("resize.nBox",function(){
				calculateSize();
				$("#coverMe").height(d).width(e);
				a.centerOnScreen();
			});
		}
		
		a.css({width:b});
		a.fadeIn();
		a.centerOnScreen();
		
		if (!coverMe) {
			$("#"+thisId+" .iClose:eq(0)").nBoxHide($(this), {removeTarget:removeTarget});
			$("#"+thisId+" .btnCancel").nBoxHide($(this), {removeTarget:removeTarget});
		} else {
			$("#"+thisId+" .iClose:eq(0)").unbind("click");
			$("#"+thisId+" .btnCancel").unbind("click");
			$("#"+thisId+" .iClose:eq(0),#"+thisId+" .btnCancel").click(function() {
				$("#"+thisId).fadeOut(function() {
					if (removeTarget) {
						WeSeed.TO = setTimeout( function() {
							$("#"+thisId).remove();	
						}, 300);
					}
				});
			});
		}
		
		if (!coverMe) {
			if (!hideNbox) {
				$("#coverMe").nBoxHide($("#"+thisId+""), {removeTarget:removeTarget});
			}
		} else {
			if (!hideNbox) {
				$("#coverMe").unbind("click");
				$("#coverMe:eq(0)").click(function() {
					$("#"+thisId).fadeOut(function() {
						$("#coverMe").nBoxHide($(".modal:visible"), {removeTarget:removeTarget});
						if (removeTarget) {
							WeSeed.TO = setTimeout( function() {
								$("#"+thisId).remove();	
							}, 300);
						}
					});
				});
			}
		}
		// make sure new modals appear over an existing modal
		if ($(".modal").css("display") != "none") {
			var lastModal = ($(".modal").length)-2;
			if(lastModal>0) {
				lastModalZIndex = parseInt($(".modal:eq("+lastModal+")").css("z-index"), 10);
				$(this).css("z-index", lastModalZIndex+1);
			}else {
				$(this).css("z-index", 2001);
			}
		}
		
		Validation.removeErrorMessages();
	};
	
	/*-------------------------------------------------
		POP-UP (one step smaller than mini-modal)
		 - used in remember me explanation
	-------------------------------------------------*/	
	$.fn.popup = function(target, o){
		if(!this || !this[0]){return false;}		
			o = o||{};
		
		function hideTarget(target) {
			if (target.is(":visible")) {
				target.fadeOut();
			} else {
				target.fadeIn();
			}
		}
		
		// remember me txt
		$(this).unbind("click.popup");
		$(this).bind  ("click.popup", function(){
			hideTarget(target);
			return false;
		});
		
		// iClose
		target.find(".iCloseSec, .closeBtnWrapper").unbind("click.iClose");
		target.find(".iCloseSec, .closeBtnWrapper").bind  ("click.iClose", function(){
			hideTarget(target);
			return false;
		});
	};
	
	/*---------------------------
		REMOVE ALERT MESSAGES
	-----------------------------*/
	$.removeStaticAlertMsgs = function() {		
		var timeout = setTimeout(function(){
			$(".msgMsg, .msgAlert, .msgError, .msgSystem").fadeOut(function(){
				$(this).remove();
			});
		}, 5000);
	};

	/*-------------------------------
		Reset Text Field
		uses the default label text
		unless o.include is set, then it shows/hides
		the preceding label.
	---------------------------------*/
	$.fn.resetTxtField = function(o){
			o = o || {};
		// use a label positioned on top of the text box
		if(o.include && o.include==="label"){
			$(this).each(function(){
				this.rem = this.value;
				if(this.rem){ $(this).prev().hide(); }
				$(this).focus(function(){
					if($(this).val()===this.rem){ 
						$(this).val(this.rem); 
						//$(this).keydown(function() {
							$(this).prev().hide();
						//});						
					} else if ($(this).val()==="") {
						//$(this).keydown(function() {
							$(this).prev().hide(); 
						//});
					}
				});
				$(this).blur(function(){
					if($(this).val()===""){
						$(this).prev().show();
					}
				});
			});
		} else {
			// use the starting text value as a placeholder
			$(this).each(function(){
				this.rem = this.value;
				$(this).addClass("placeholder");
				$(this).focus(function(){
					if($(this).val()===this.rem){ $(this).val("").removeClass("placeholder"); }
				});
				$(this).blur(function(){
					if($(this).val()===""){ $(this).addClass("placeholder").val(this.rem); }
				});
			});
		}
	};
		
	/*------------------------------------------------
		Serialize hash
		turns a form into a JSON object in the format
		of { name : value, name2 : value2, ... }
		WARNING! half-baked. Only works with radio buttons, single-line text inputs.
	-------------------------------------------------*/
	$.fn.serializeHash = function() {
		if(!this){ return false; }
		
		var form = this.find("input:radio:checked, input:text");
		var map = {};
		
		$.each(form,function() {
			eval('$.extend(map,{\''+$(this).attr("name")+'\': \''+$(this).attr("value")+'\'})');
		});
		
		return map;
	};
	
	$.fn.setCookieTips = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {};
		var cookieTimespan = o.cookieTimespan || '';				
		
		$(this).unbind("click.cookieTips");
		$(this).bind  ("click.cookieTips", function(){
			var cookieName = $(this).attr("href").split("#")[1];
			$(this).parent().slideUp(function() {
				// No expiration date will expire at the end of the session
				Cookie.create(cookieName, true, cookieTimespan);
			});
		});
		return this;
	};
	
	/*-----------------------------------
		SHOW THEN REMOVE AJAX MESSAGE
	-------------------------------------*/
	$.fn.showRemoveAjaxMsg = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {}; // o stands for options
		var me				= $(this);
		var xPos     = o.xPos || -45;
		var yPos     = o.yPos || -65;
		var cssClass = o.cssClass || "dynMsgMsg";
		var txt      = o.txt || "success!";
		var timeout  = o.timeout || 2000;
		var cssObj = {
	        position: "absolute",
	        left: (me.offset().left) + xPos,
			top:  (me.offset().top)  + yPos
	    };
		var msg = $('<p class="'+cssClass+'">'+txt+'</p>').appendTo($("body"));
		msg.css(cssObj);	
		window.pMsgTimeout = setTimeout( function() { msg.fadeOut(500); }, timeout);
		window.pMsgTimeout = setTimeout( function() { msg.remove(); }, timeout + 1500);
	};
	
	/*------------------------------------
		Toggle Full / Truncated Text Link
	--------------------------------------
	$.fn.toggleFullText = function() {
		if(!this || !this[0]){return false;}

		var trigger = $(this);
		var truncatedText = trigger.prevAll(".truncatedText:first");
		var fullText = trigger.prevAll(".fullText:first");
		
		// $(this).unbind("click.toggleFullText");
		$(this).bind  ("click.toggleFullText", function(){
			if(fullText.is(":hidden")) {
				truncatedText.hide();
				fullText.show();
				trigger.text('(hide)');
			} else {
				fullText.hide();
				truncatedText.show();
				trigger.text('Read more...');
			}
		});
	};*/
	
	/*---------------------------
		WE SOCIAL HELP TABS
		Author::Drew Robinson
	----------------------------*/
	$.fn.weSocialHelpTabs = function() {		
		if(!this || !this[0]){return false;}

		$("#tabContent a.closeBtnWrapper").click(function(){
			var me = $(this);
			me.hide();
			me.parent("#tabContent").slideToggle();
			$("#lnkShowWeSocialHelp").removeClass("sel");
			$("#howWeWorkTabMenu a").removeClass("open"); 
			$("#tabContent div").removeClass("open");
		});
		
		function switchTabs(me){
			var myId = me.attr("href").split('#')[1];
			if (me.hasClass("open")){
				$("#howWeWorkTabMenu a").removeClass("open");
				$(".btnWeSocialHelp").removeClass("open");
				$("#tabContent div").removeClass("open");
				$("#tabContent").hide();
			} else {
				$("#tabContent a.closeBtnWrapper").show();
				$("#howWeWorkTabMenu a").removeClass("open");
				$(".btnWeSocialHelp").removeClass("open");
				$("#tabContent div").removeClass("open");
				me.addClass("open");
				$("#"+myId).addClass("open");
				$("#tabContent").fadeIn();
			}
		}
		
		// to view
		$("#howWeWorkTabMenu a").unbind("click.weSocialHelpTabs");
		$("#howWeWorkTabMenu a").bind("click.weSocialHelpTabs", function(){
			var me = $(this);
			switchTabs(me);
			return false;
		});
		
		$("#areaSocial #lnkShowWeSocialHelp").unbind("click.lnkShowWeSocialHelp");
		$("#areaSocial #lnkShowWeSocialHelp").bind("click.lnkShowWeSocialHelp", function(){
			Cookie.erase("hideWeSocialHelp");
			var openTab = 'howToBeSocialTab';
			
			$("#tabContent").show();
			$("a[href*='"+openTab+"']").addClass("open");
			$("#"+openTab).addClass("open");
			$("#weSocialBanner, #howWeWorkTabMenu").slideDown();
			
			me = $(this);
			me.slideUp("fast");
		});
		
		$("#areaProfile #lnkShowWeSocialHelp").unbind("click.lnkShowWeSocialHelp");
		$("#areaProfile #lnkShowWeSocialHelp").bind("click.lnkShowWeSocialHelp", function(){
			if(!$("#tabContent").is(":visible")){
				$(this).addClass("sel");
				$("#tabContent").slideDown();
				$(this).children("img").removeClass("iHelp");
				$(this).children("img").addClass("iClose");
			} else {
				$("#tabContent").slideUp();
				$(this).children("img").addClass("iHelp");
				$(this).children("img").removeClass("iClose");
				$(this).removeClass("sel");
			}
		});
	};

	
	/*---------------------------
		WESEED SIGN UP BUTTON
	-----------------------------*/
	$.fn.signup = function(o) {
		if(!this || !this[0]){return false;}
		
			o							= o || {};
		var frm						= $(this),
			frmWrap					= frm.find("> div.wrap:first"),
			btn						= frm.find(".submitButton"),
			frmParent			= frm.parent(),
			goToURL					= o.goToURL		|| "/",
			promocode			= o.promocode	|| null,
			dob			= frm.find("input[name='dateOfBirth']"),
			dateSelects = frm.find("select[name='month'], select[name='day'], select[name='year']"),
			modal;
		
		frm.populateDateFieldFromDropDowns('dateOfBirth');
		
		// date of birth validation for new privacy specifications
		dob.unbind("click.signup");
		dob.bind  ("click.signup", function() {
			var me		  = $(this),
				date  = me.val().split("-"),
				born  = new Date(date[0], date[1]*1-1, date[2]),
				myAge = born.getAge(),
				data, firstName;
				
			WeSeed.ageViolation = true;
						
			if (myAge >= 13 && myAge < 18 && !WeSeed.between13and17) { 
				
				$().createModal({auto:true, modalId:"between13and17", modalClass:"modal modalSignupMessage", preloader:$(dateSelects[2]), method:URL.signup.between13and17message});
				WeSeed.between13and17 = true;
				
			} else if (myAge < 13) { // UNDER 13
				Validation.removeErrorMessages();
				data = frm.serializeArray();
				frmParent.find("form:not(form.frmSignUp)").fadeOut(function() { $(this).remove(); });
				$(".step1-messages").fadeOut(400,function() {
					$(".step2-messages").show();
				});
				
				frmWrap.fadeOut(function() {
					frm.addClass("under13Message");
					$(this).load(URL.signup.under13message, data, function() {
						$(this).find(".external").externalLink();
						firstName = $.trim(data[0].value);
						Cookie.create("signupUnder13", firstName);
						if (firstName !== "") {
							$(this).find("h2:first strong").html(" "+firstName);
						}
						$(this).fadeIn();
						
						WeSeed.trackEvent({"category":$("body").attr("id"),"action":"Warning Message","label":"Under 13 Attempted Signup"});
						WeSeed.trackPage({"page":URL.signup.under13message});
					});
				});
			} else {
				WeSeed.ageViolation = false;
			}
		});
		
		frm.unbind("submit.signup");
		frm.bind  ("submit.signup", function() {
			if (Validation.flag) { return false; }
			
			dob.trigger('click.signup');
			if (WeSeed.ageViolation) { return false; }
			
			WeSeed.trackTime.stop(undefined,"Signup Time");
			btn.disableButtonToggle();
			
			return false;
		});
	};
	
	/*--------------------------
		SIGN UP/IN SWITCHER
	----------------------------*/
	$.fn.signUpInSwitcher = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {};
		var frm       = o.frm || "#frmSignInModal",
			modal     = $("#modalSignIn"),
			forms		  = modal.find("form"),
			switchers = $("#modalSignIn .switchersButtons"),
			a		  = switchers.find("a");

		$(this).unbind("click.signUpInSwitcher");
		$(this).bind  ("click.signUpInSwitcher", function(){
			Validation.removeErrorMessages();
			// Set the width of the parent modal
			var newWidth = $(frm).css("width");
				newWidth = parseInt(newWidth, 10) + 30;
			// $("#modalSignIn").width(newWidth);
			
			forms.hide();
			a.hide();
			modal.hide();
			
			WeSeed.suiTO = setTimeout( function() {
				$(frm).show();
				modal.show().centerOnScreen();
				$(frm).find("input:eq(0)").focus();
				
				switch ($(frm).attr("id")) {
					case "frmSignInModal":
						switchers.find("a.forgotPasswordBtn").show();
						break;
					case "frmForgotPasswordModal":
						switchers.find("a.signInBtn").show();
						break;
					/*
					 * case "frmSignUpModal":
					 * switchers.find("a.signInBtn").show(); break;
					 */
				}
				
			}, 1);
			
			return false;
		});
	};
	
	/*--------------------------
		SORT LIST DROP DOWNS
	----------------------------*/
	$.fn.sortListDropDown = function(target, o) {
		if(!this || !this[0]){return false;}
			o				= o || {};
		var ddClass		= o.ddClass || target;
		
		$(this).each(function(){
			var me				= $(this);
			var target			= target || me.next();
			// sort list...
			me.unbind("click.sortListDropDown");
			me.bind  ("click.sortListDropDown", function(){
				var ddMenu = $(this).next();
				$(ddClass).each(function() {
					if ($(this).text() != ddMenu.text()) {
						$(this).hide();
					}
				});				
				
				if (target.is(":hidden")) {
					target.slideDown("fast");
					WeSeed.trackEvent({"category":$("body").attr("id"),"action":"Drop-Down List","label":me.text()});
				} else {
					target.slideUp("fast");
				}
				return false;
			});
			
			// sort list...
			me.unbind("mouseenter.sortListDropDown");
			me.bind  ("mouseenter.sortListDropDown", function () {
				clearTimeout(WeSeed.listSortTO);
			});		
			
			me.unbind("mouseleave.sortListDropDown");
			me.bind  ("mouseleave.sortListDropDown", function (event) {
				if(!target){ target = me.next(); }
				event.stopPropagation();
				WeSeed.listSortTO = setTimeout( function() {
					$(ddClass).slideUp("fast");
					target.slideUp("fast");
				}, 250);
			});
			
			// drop down options container
			target.unbind("mouseenter.sortListDropDownOptions");
			target.bind  ("mouseenter.sortListDropDownOptions", function () {
				clearTimeout(WeSeed.listSortTO);
				target.show();
			});		
			
			target.unbind("mouseleave.sortListDropDownOptions");
			target.bind  ("mouseleave.sortListDropDownOptions", function (event) {
				event.stopPropagation();
				WeSeed.listSortTO = setTimeout( function() {
					$(ddClass).slideUp("fast");
					target.slideUp("fast");
				}, 250);
			});
			
		});
	};
	
	/*----------------
		UPGRADE IE6
	------------------*/
	$.upgradeIE6 = function() {
		if(!($.browser.msie && Number($.browser.version)<7)){ return false; }
		$("input[type='text']").addClass("text");
		$("input[type='password']").addClass("password");
		$("input[type='file']").addClass("file");
		$("input[type='radio']").addClass("radio");
		$("input[type='checkbox']").addClass("checkbox");
	};
	
	/*--------------------------------
		Pop Up WordBalloon - Small
	----------------------------------*/	
	$.fn.wordBalloonSmall = function(o){
		if(!this || !this[0]){return false;}
			o = o || {};
		var me			 = $(this),	
			txt			 = o.txt			  || "",
			yPos			 = o.yPos				  || 2,
			xPos			 = o.xPos			  || '',
			width			 = o.width				  || 235,
			fontSize		 = o.fontSize		  || "100%",
			delay			 = o.delay					  || 100,
			domId			 = o.domId			  || false,
			hover			 = o.hover			  || false,
			keepCloseBtn = o.keepCloseBtn || false,
			resultsClass = o.resultsClass || 'wordBalloonSmall',
			mouseOutCallback			  = o.mouseOutCallback			    || false,
			mouseOverCallback			  = o.mouseOverCallback			|| false,
			mouseClickCallback			  = o.mouseClickCallback		    || false,
			mouseOutCallbackOptions   = o.mouseOutCallbackOptions   || {},
			mouseOverCallbackOptions  = o.mouseOverCallbackOptions  || {},			
			mouseClickCallbackOptions = o.mouseClickCallbackOptions || {},			
			results;
		
		if (!$("#"+resultsClass).length) {
			$("body").append('<div id="'+resultsClass+'" class="'+resultsClass+'"></div>');
		}
		results = $("#"+resultsClass);
		
		function posi(trigger){
			var posTop  = trigger.offset().top  + (yPos),
				posLeft = trigger.offset().left + (xPos),
				posTot  = trigger.offset().top  + trigger.offset().left;
		
			if (domId){
				txt = $("#"+domId).html() || txt;
			} else if (trigger.attr("title")){
				txt = trigger.attr("title");
			} else {
				txt = WeSeed.wordBalloonBody;
			}
			//txt = (txt.trim() == "<p></p>") ? WeSeed.wordBalloonBody : txt; 
			var close = (hover && !keepCloseBtn) ? '' : '<a href="javascript:;" class="iClose" title="Close"><img src="/images/backgrounds/blank.gif" alt="Close" class="iClose iconS"/></a>';
			var html  = close									+
					  '<div class="top bg">'				+
					  '    <div class="inner bg">'			+
					  '								<div class="content bg">'	+
											txt						+
					  '					    </div>'						+
					  '	   </div>'							+
					  '</div>';	
				  
			results.html(html);
			results.css({width:width, fontSize:fontSize});
			results.css({top:posTop - (results.height()-10), left:posLeft - (results.width()-78)});
			
			if (posTot != WeSeed.wbPosTot) {
				posTot = WeSeed.wbPosTot;				
				results.show();
			} else {
				if (!hover) {
					if (results.is(":visible")) {
						results.hide();
					} else {
						results.show();
					}
				}
			}
			results.find("> .iClose").click(function(){ $("."+resultsClass).hide(); WeSeed.wbPosTot = false; return false; }); 
		}
		
		if (hover) {
			me.unbind("mouseover.wordBalloonSmall");
			me.bind  ("mouseover.wordBalloonSmall", function() {
				if (mouseOverCallback) { mouseOverCallback(mouseOverCallbackOptions); }
				if(WeSeed.wordBalloonBody && WeSeed.wordBalloonBody.length) {
					posi($(this));
				}
				return false;
			});		
			
			me.unbind("mouseout.wordBalloonSmall");
			me.bind  ("mouseout.wordBalloonSmall", function(e) {
				if (mouseOutCallback) { mouseOutCallback(mouseOutCallbackOptions); }
				setTimeout(function(){					
					if (!$(e.relatedTarget).parents("#wordBalloonSmall:eq(0)").length) {
						results.hide();
					}
				},50);
				// WeSeed.wbPosTot = $(this).offset().top +
				// $(this).offset().left;
				return false;
			});
		} else {
			me.unbind("click.wordBalloonSmall");
			me.bind  ("click.wordBalloonSmall", function(){
				if (mouseClickCallback) { mouseClickCallback(mouseClickCallbackOptions); }
				posi($(this));
				WeSeed.wbPosTot = $(this).offset().top + $(this).offset().left;
				return false;
			});
		}
		
		// results is the word balloon
		results.unbind("mouseout.wordBalloonSmall");
		results.bind  ("mouseout.wordBalloonSmall", function() {
			$(this).hide();
		});
		
		results.unbind("mouseover.wordBalloonSmall");
		results.bind  ("mouseover.wordBalloonSmall", function() {
			if(WeSeed.wordBalloonBody && WeSeed.wordBalloonBody.length) {
				$(this).show();
			}
		});
		
		return this;
	};
	
	/*--------------------------------
		MUTUAL FRIENDS OPENER
	----------------------------------
	$.fn.openSocialModule = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {};
		
		$(this).unbind("click.openSocialModule");
		$(this).bind  ("click.openSocialModule", function() {
			var me			= $(this);
			var jsonMe		= me.getJsonAttr();
			var json   = jsonMe.data;
			var target		= me.parents(".socialModule").find(jsonMe.target);
			
			target.animate({ "height":"toggle", "opacity": "toggle"}, "slow");
			
			$.ajax({
				type:	"POST",
				url:	jsonMe.action,
				data:	json,
				error:	function() { $(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"failed - please try again"}); },
				success:function(data) {
					target.html(data);
				}
			});
			me.ajaxPreloader();
		});
	}; */
	
	$.fn.openUpToggle = function(o) {
		if(!this || !this[0]){return false;}
		
		$(this).unbind("click.openUp");
		$(this).bind  ("click.openUp", function(o) {
			var me							= $(this),
				json					= me.getJsonAttr(),
				toggleClass = json.toggleClass || false;
				target			= json.target;
			target = (target.indexOf("$")) ? $(target) : eval(target);
			
			if(target.is(":hidden")) {
				target.slideDown();
			} else {
				Validation.removeErrorMessages();
				target.slideUp();
			}
			
			if (toggleClass) {
				if (me.hasClass(json.closeClass)) {
					me.removeClass(json.closeClass).addClass(json.openClass);
				} else {
					me.removeClass(json.openClass).addClass(json.closeClass);
				}
			}
		});
		
		return this;
	};

	/*--------------------------------
		BUTTON APPROVAL [Pending Tasks]
	----------------------------------*/
	$.fn.btnApproval = function(o) {
		if(!this || !this[0]){return false;}
			o = o || {};
		
		$(this).unbind("click.approvalAction");
		$(this).bind  ("click.approvalAction", function(e) {
			e.preventDefault();
			
			var me			= $(this);
			var json		= me.getJsonAttr();
			var wrap		= me.closest(".row");
			var form	= me.closest("form");
			var reload	= (typeof json.reload === "undefined") ? false : true;
			// var size = wrap.siblings('.row').size();
			// var count = wrap.siblings('dd:hidden').size();
			
			$.ajax({
				type:	"POST",
				url:	json.action,
				data:	json.data,
				error:	function() { $(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"failed - please try again"}); },
				success:function(data) {
					if(data==="success") {
						$(".dynLoadingSmall").showRemoveAjaxMsg({ txt:json.msg });	
						// if(size===count){wrap.parents("div:eq(0)").append("<strong>No
						// more pending approvals.</strong>");}
						
						if(wrap.siblings().length === 0) {
							form.fadeOut("fast",function(){form.siblings(".emptyWrapper").show();});
						} else {
							wrap.fadeOut("normal",function(){ wrap.remove(); });
						}
						
						//if(reload) {
							window.location.reload();
						//}
						
						// load the profile panel again
						//WeSeed.reloadProfilePanel();
						
						// load Networks/Groups/Teams list
						// setTimeout(function(){
						// 							$("ul.userGroups a.groupTabDD").loadMenuList();
						// 						},1500);
					} else {
						// error
						$(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:data});
					}
				}
			});
			
			me.ajaxPreloader();
		});
	};
	
	/*---------------------------
		RETURNS EVAL-ED CONTENT OF 
		AN ELEMENT'S JSON ATTRIBUTE
	-----------------------------*/	
	$.fn.getJsonAttr = function() {
		if(!this || !this[0]){return false;}
		
		var json = $(this).attr("json");
		return (json) ? eval('(' + json + ')') : false;
	};
	
	/*---------------------------
		LIST MODULE FORM
	-----------------------------*/
	$.fn.listModuleFrm = function(o) {
		if(!this || !this[0]){return false;}
		
		var form					= $(this);
		var btn						= form.find(".btnListModule");
		var cbAll				= form.find(".checkAll");
		var twoTier		= (form.hasClass("twoTier")) ? true: false;
		var checkboxes		= form.find("input[type='checkbox'][name]");
		
		// cbAll.unbind("click.listModuleCheckAll"); COMMENTED OUT BECAUSE ALL
		// INSTANCES (currently) LIVE IN SECCONTENT - WILL NOT BE DOUBLE-BOUND
		cbAll.bind  ("click.listModuleCheckAll", function(o) {
			var me  = $(this);
			// var frm = me.parents("form:eq(0)");
			// var checkboxes = frm.find("input[type='checkbox'][name]");
			var cb;
			if (me.attr("checked") === false) {
				checkboxes.each(function() {
					cb = $(this);
					cb.attr("checked",false);
				});
				$(".row").removeClass("sel"); // remove row class
			} else {
				checkboxes.each(function() {
					cb = $(this);
					if (!cb.attr("disabled")) {
						cb.attr("checked",true);
					}
				});
				$(".row").addClass("sel"); // add row class
			}
		});
		
		// checkboxes.unbind("click.listModuleSelectRow");
		checkboxes.bind  ("click.listModuleSelectRow",function() {
			var me		= $(this);
			var row = (twoTier) ? me.parents("tr:eq(1)").find("table.sub") : me.closest(".row");

			row.toggleClass("sel");
		});
		
		// btn.unbind("click.listModuleBtn"); 
		btn.bind  ("click.listModuleBtn", function(o) {
			o.preventDefault();
			var me			  = $(this);
			var cbChecked = form.find("input[type='checkbox'][name]:checked");
			var cbAll	  = form.find(".checkAll");
			var jsonMe		  = me.getJsonAttr();
			var json	  = form.serializeArray();
			$.extendForm(json, jsonMe.data);
			var wrapMain;
			var wrapSub;
			var reload	  = jsonMe.reload || o.reload || false;
			var cb;
			
			// make sure something is selected
			if (!cbChecked.length) {
				me.showRemoveAjaxMsg({xPos:-15, txt:'Please select one.'});
				return false;
			}

			$.ajax({
				type:    "POST",
				url:     jsonMe.action,
				cache:   false,
				data:    json,
				error:   function() { $(".dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"failed - please try again"}); },
				success: function(data) {
					cbChecked.each(function() {
						cb  = $(this);
						if (twoTier) {
							wrapMain = cb.closest(".row");
							wrapSub  = wrapMain.find("table.sub");							
							if (jsonMe.actionType === "delete") { 
								if (wrapSub.length > 1 && cb.parents(".wrapMulti:eq(0)").find("input[type='checkbox']:checked").length != wrapSub.length) {
									cb.parents("table.sub:eq(0)").fadeOut("fast", function() { cb.parents("table.sub:eq(0)").remove(); }, 500);
								} else {
									wrapMain.fadeOut("fast", function() { wrapMain.remove(); });
								}
							}
						} else {
				            wrapMain = cb.closest(".row");                        
                            if (jsonMe.actionType === "delete") {    // delete
								if($(".paging").length) {
									// paginated list; reload content
									reload = true;
								}
								else {
									wrapMain.fadeOut("fast", function() { 
										wrapMain.remove();
									});
								}
                            }
						}
						cb.attr("checked",false);
						cbAll.attr("checked",false);
					});
					
					$(".dynLoadingSmall").showRemoveAjaxMsg({ txt:jsonMe.msg });
					
					if(reload) { 
						window.location.reload();
					} else if(checkboxes.length === cbChecked.length) {
						form.fadeOut("fast",function(){form.siblings(".emptyWrapper").show();});			
					}
					/*
					if(jsonMe.reloadProfilePanel) {
						WeSeed.reloadProfilePanel();
					}
					*/
					if(jsonMe.increment) {
						if(Number($(jsonMe.increment).text()) > 0) { 
							$(jsonMe.increment).text(Number($.trim($(jsonMe.increment+":eq(0)").text()))-cbChecked.length);
						}
					}
				}
			});
			me.ajaxPreloader();
			
		});
	};
	
	// EXAMPLE: SIGN UP - POPULATING DATE OF BIRTH
	$.fn.populateDateFieldFromDropDowns = function(dateFldName) {
		if(!this || !this[0]) {return false;}

		var frm			 = $(this),
		    monthSel			 = frm.find("select[name='month']"),
		    daySel				 = frm.find("select[name='day']"),
		    yearSel				 = frm.find("select[name='year']"),
		    dateSelects  = $([monthSel[0],daySel[0],yearSel[0]]),
		    dateFld		 = frm.find("input[name='"+dateFldName+"']");
		
		function createDate() {
			// Grab the date values from the drop-downs
			var day = daySel.find("option:selected").val();
			var month = monthSel.find("option:selected").val();
			var year = yearSel.find("option:selected").val();
			
			dateFld.val(year+"-"+month+"-"+day);
		}
		
		var updateDaysInMonth = function() {
			var month	= monthSel.find("option:selected").val();
			var year	= (yearSel.find("option:selected").val().length) ? yearSel.find("option:selected").val() : (new Date()).getFullYear();
			var daysInMonth = (new Date()).daysInMonth(month-1, year);
			
			// add any missing days
			for(var i = daySel.find("option").length; i <= daysInMonth; i++) {
				$("<option value=\""+i+"\">"+i+"</option>").appendTo(daySel);
			}
			
			// before removing, make sure something stays selected
			if(daySel.find("option").filter(":gt("+daysInMonth+")").is(":selected")) {
				daySel.find("option:eq("+daysInMonth+")").attr("selected","selected");
			}
			
			// remove any extra days
			daySel.find("option").filter(":gt("+daysInMonth+")").remove();
		};

		dateSelects.bind("change.populateDate",function(event) {
			if(!$(this).is(daySel.selector)) {
				updateDaysInMonth();
			}
			createDate();
		});
	};
	
	/*-----------------
		SUBMIT FORM
	-------------------*/
	$.fn.submitForm = function(o) {
		if(!this || !this[0]){return false;}
		
		$(this).unbind("click.submitForm");
		$(this).bind  ("click.submitForm", function(o) {
				o					= o || {};
			var me					= $(this),
			    frm				= me.parents("form:eq(0)"),
			    jsonMe				= me.getJsonAttr(),
			    json			= frm.serializeArray(),
			    actionType			= jsonMe.actionType || "submit",
			    callbackBefore		= jsonMe.callbackBefore || false,
			    callbackAfter			= jsonMe.callbackAfter || false,
			    successMsg						= jsonMe.successMsg || false,
			    returnJSON						= jsonMe.returnJSON || false;
			
			$.extendForm(json, jsonMe.data);
			
			if (actionType === "delete" && !confirm("Are you sure you want to Delete?")) {
				return false;
			}
			
			// if there is a before custom method
			if (callbackBefore) {
				CB.main(me, frm, jsonMe, callbackBefore);
				if (CB.flag) { return false; }
			}
			
			$.ajax({
				type:    "POST",
				url:     jsonMe.action,
				cache:   false,
				data:    json,
				error:   function() { $("p.dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgError", txt:"failed - please try again"}); },
				success: function(data) {
					if (successMsg) {
						$("p.dynLoadingSmall").showRemoveAjaxMsg({cssClass:"dynMsgMsg", txt:jsonMe.successMsg});
					}
					
					data = (returnJSON) ? JSON.parse(data) : data;
					
					if (callbackAfter) {
						CB.main(me, frm, jsonMe, callbackAfter, data);
					}
				}
			});
			me.ajaxPreloader();
			
		});
	};
})(jQuery);

/*---------------------------------------------
	[G6] LOAD WHEN DOM IS READY - whatever dude!
-----------------------------------------------*/
$(function(){
	EventHandler.onload();	// attach events
	P6.WeSeed.Router.init();
});

/* Console.log for IE */
if(typeof(console)!="object") {
	var console = {
		"log":function(a) {
			if(typeof(this.logUL)=="undefined") {
				this.logUL = $("<ul id=\"ConsoleLogDiv\"></ul>").appendTo($("body"));
				this.hide();
			}
			this.logUL.append("<li>"+(new Date()).toString()+": <em>"+a.toString()+"</em></li>");
		},
		"show":function() {
			if(typeof(this.logUL)!="undefined") {
				this.logUL.show();
			}
		},
		"hide":function() {
			if(typeof(this.logUL)!="undefined") {
				this.logUL.hide();
			}
		}
	};
}

/*----------------------------------------
	TRADE OBJECT
	(c) 2009 PEAK6 
	Author: Nate Racklyeft 
	
	Version:	1.4 - WS 3 Compatibility
	
	Requires:	jQuery 1.3+
				Facebook Connect js API
				Form Validation Plugin
				Strings object
				WeSeed.fb object
				WeSeed.trackTime
				addFundsLabelEvents plugin
				centerOnScreen plugin
				nBox plugin
				nBoxhide plugin
				
	Feature Notes:
	 - Event triggers:
		"weseed.trade.begin"		- triggered when the trade ticket html is loaded into the page
		"weseed.trade.success"		- triggered when a trade is completed.
----------------------------------------*/

var Trade = function() {
	// Enforce object singleton
	if(Trade.__instance instanceof Trade) {
		return Trade.__instance;
	} else {
		Trade.__instance = this;
	}
	
	// instance variables
	this.version = "1.3";
	
	this.cash_balance = 0;
	this.comingFromStep0 = false;
	this.company_id = null;
	this.company_name = null;
	this.currentStep = null;
	this.more_reasons = null;
	this.netWorth = null;
	this.portId = null;
	this.portName = null;
	this.quantity = null;
	//this.reason_id = null;
	//this.reason_text = null;
	//this.save_twitter = null;
	this.send_fb = false;
	//this.send_tweet = null;
	this.ticker = null;
	this.trade_type = 1; // 1 = buy, 2 = sell
	
	this.actions = {
		"frame":	"/trade/frame",
		"step0":	"/trade/step0",
		"step1":	"/trade/step1",
		"step2":	"/trade/comment",
		"step3":	"/trade/complete"
	};
	
	this.elems = {
		"closeBtn":		$("#modalBuy .iClose"),
		"frame":		$("#modalBuy .body"),
		"modal":		$("#modalBuy"),
		"trigger":		null,
		/* The following will require refresh after ajax content is loaded */
		/* frame */
		"company_name":	$("#companyName"),
		//"header":		$("#mBuyCoHeader"),
		//"portfolioName":$("#tradingIn"),
		"portId":		$("input[name='portId']"),
		"step0":		$("#modalBuy .step0"),
		"step1":		$("#modalBuy .step1"),
		"step2":		$("#modalBuy .step2"),
		"step3":		$("#modalBuy .step3"),
		"ticker":		$("#companyTicker"),
		/* step 0 */
		"portfolioSelector":$("#ttPortfolioSelector"),
		/* step 1 */
		"quantity":		$("#quantity"),
		"trade_type":	$("input[name='trade_type']"), 
		/* step 2 */
		"cash_balance":	$("input[name='cash_balance']"),
		"more_reasons": $("#more_reasons"),
		//"reason_id":	$("#modalBuy input[name='reason_id']"),
		//"save_twitter":	$("#modalBuy input[name='save_twitter']:checked"),
		//"send_tweet":	$("#modalBuy input[name='send_tweet']:checked"),
		"send_fb":		$("input[name='send_fb']:checked"),
		/* step 3 */
		"netWorth":		$(".net-worth")
	};
	
	// sub-elements
	this.elems.step0cancel = this.elems.step0.find(".cancel");
	this.elems.step0next = this.elems.step0.find(".lnkContinue");
	this.elems.step1cancel = this.elems.step1.find(".cancel");
	this.elems.step1next = this.elems.step1.find(".btnBuy");
	this.elems.step2cancel = this.elems.step2.find(".cancel");
	this.elems.step2next = this.elems.step2.find(".btnConfirmOrder");
	this.elems.step2back = this.elems.step2.find(".lnkOrderModify");
	this.elems.step3cancel = this.elems.step3.find(".cancel");
	this.elems.step3next = this.elems.step3.find(".lnkContinue");
	this.elems.step3back2 = this.elems.step3.find(".lnkOrderModify");
	this.elems.step3back = this.elems.step3.find(".lnkConfirmModify");
	
	// function prototypes
	// + Void bind(targets);
	// - String nextStep();
	// - Void close;
	// - Void release;
	// - Void load;
	// - Void loadError;
	// - Void frame;
	// - Void step1;
	// - Void step2;
	// - Void step3;
	// + FB object

	// Make the modal draggable
	//this.elems.modal.draggable();
};

Trade.bind = function(targets) {
	//trace("binding");
	// bind the page elements to the starting action
	// prevent duplicate bindings
	targets.unbind("click.tradeIt"); 
	
	// bind the targets
	targets.bind("click.tradeIt",function() {
		Trade.__instance = null; // just in case - clicking outside the lightbox doesn't call Trade.release()
		var trade = new Trade(); // Create a new instance
		WeSeed.trackTime.start();
		
		// set the target element
		trade.elems.trigger = $(this);
		
		// set the company_id
		trade.company_id = trade.elems.trigger.attr("name");
			
		// bind the modal's close button
		trade.close(trade.elems.closeBtn);
		
		// prepare and show the (empty) modal - it's important for the user to have instant feedback.
		trade.elems.frame.empty();
		trade.elems.modal.show();
		trade.elems.modal.nBox();
		
		// make the first ajax call
		var data = {"company_id":trade.company_id};
		trade.load(trade.actions.frame,data,trade.frame);
		
		trade.elems.modal.ajaxPreloader({preLoader:"dynLoadingMedium", "hide":false, "visibility":"visible", yPos:-15, xPos:-5});
	});
	
	// init fb
	//WeSeed.fb._init();
};

Trade.prototype.close = function(elem) {
	elem.nBoxHide(this.elems.modal);
	elem.click(function() { 
		if(Trade.__instance instanceof Trade) {
			Trade.__instance.release(); 
		}
	});
};

Trade.prototype.release = function() {
	//trace("releasing");
	this.elems.frame.empty();
	Trade.__instance = null;
};

Trade.prototype.nextStep = function() {
	switch(this.currentStep) {
		case null:
			return "frame";
		case "frame":
			if(this.comingFromStep0) {
				return "step0";
			}
			return "step1";
		default:
			return this.currentStep.substring(0,4)+(Number(this.currentStep.substring(4,5))+1);
	}
};

Trade.prototype.load = function(action,data,callback) {
	var trade = new Trade(); // singleton
	$.ajax({
		"type":		"POST",
		"url":		action,
		"data":		data,
		"error":	function(XMLHttpRequest, textStatus, errorThrown) {
			trade.loadError(trade.elems[trade.currentStep],trade.elems[trade.nextStep()]);
		},
		"success":	function(data) {
			callback(data);
			// set the current step to next
			trade.currentStep = trade.nextStep();
			// Track page view (for goal analytics)
			WeSeed.trackPage({page:'/trade/'+trade.currentStep});
		}
	});
};

Trade.prototype.loadError = function(fromStep,toStep) {
	// intro case
	if(!toStep.length) { toStep = fromStep; }
	
	var trade = new Trade(); // singleton

	var errorText = "<div class=\"header\">We're sorry! We can't complete your trade right now.</div><p>Please try again later.</p> <div class=\"btns\"><a class=\"button-2 button lnkContinue\" href=\"javascript:;\">continue</a></div>";
	
	// Hide fromStep
	fromStep.filter(":not(.body)").hide();
	// Insert the error header
	//trade.elems.header.html(errorHeader);
	// Insert the error html
	toStep.html(errorText);
	// Bind the close button
	trade.close(toStep.find(".lnkContinue"));
	// Show the error html, and focus on the close button (for easy enter key closability)
	toStep.fadeIn("fast", function(){$(".lnkContinue:visible:first").focus();}); 
};

Trade.prototype.frame = function(data) {
	//trace("callback A");
	var trade = new Trade(); // singleton

	// On successful load of the frame
	// blind faith in AHAH
	trade.elems.frame.html(data);
		
	// populate the frame elements via selector refresh
	trade.elems.step0 = $(trade.elems.step0.selector);
	trade.elems.step1 = $(trade.elems.step1.selector);
	trade.elems.step2 = $(trade.elems.step2.selector);
	trade.elems.step3 = $(trade.elems.step3.selector);
	//trade.elems.header = $(trade.elems.header.selector);
	//trade.elems.portfolioName = $(trade.elems.portfolioName.selector);
	trade.elems.portId = $(trade.elems.portId.selector);
	trade.elems.ticker = $(trade.elems.ticker.selector);
	trade.elems.company_name = $(trade.elems.company_name.selector);
	
	// populate the iVars
	trade.ticker = trade.elems.ticker.text();
	trade.company_name = trade.elems.company_name.text();
	
	// alert any listeners
	$(window).trigger("weseed.trade.begin",[{ "id" : trade.company_id,"ticker": trade.ticker, "companyName" : trade.company_name} ]);
	
	// prep data
	var frmData = {"company_id":trade.company_id};
	
	// run step 0 if there are multi-portfolios
	if (trade.elems.step0.length) {
		trade.comingFromStep0 = true;
		// load step 0
		trade.load(trade.actions.step0,frmData,trade.step0);
	} else {
		// skip to step 1
		// load the portfolio ID
		trade.portId = trade.elems.portId.val();
		// prep the data
		$.extend(frmData, {"portId":trade.portId});
		// load step 1
		trade.load(trade.actions.step1,frmData,trade.step1);
	}		
};

Trade.prototype.step0 = function(data) {
	//trace("callback B");
	var trade = new Trade();
	// drop in the AHAH goodness
	trade.elems.step0.html(data);
	trade.elems.frame.fadeIn("fast");
	
	// refresh the elements
	trade.elems.portfolioSelector = $(trade.elems.portfolioSelector.selector);
	trade.elems.step0next = $(trade.elems.step0next.selector);
	trade.elems.step0cancel = $(trade.elems.step0cancel.selector);
	 
	trade.elems.portfolioSelector.focus();
	// Bind the enter key to click the continue button
	trade.elems.portfolioSelector.bind("keydown",function(e) {
		if(e.keyCode == 13) {
			trade.elems.step0next.click();
		}
		return false;
	});
	
	// bind the cancel button
	trade.close(trade.elems.step0cancel);
	
	// bind the continue button to head to step 1
	trade.elems.step0next.click(function() {
		// set the iVars
		trade.portId = trade.elems.portfolioSelector.find("option:selected").val();
		trade.portName = $.trim(trade.elems.portfolioSelector.find("option:selected").text());

		// prep the data
		var frmData = {
			"portId":trade.portId,
			"company_id":trade.company_id
		};
		trade.load(trade.actions.step1,frmData,trade.step1);
	});
};

Trade.prototype.step1 = function(data) {
	//trace("callback C");
	var trade = new Trade();
	
	trade.elems.step0.fadeOut("fast");
	// drop in the AHAH goodness
	trade.elems.step1.hide().html(data);
	trade.elems.frame.filter(":hidden").fadeIn("fast"); // if not already
	
	// refresh the elements
	trade.elems.quantity = $(trade.elems.quantity.selector);
	trade.elems.step1cancel = $(trade.elems.step1cancel.selector);
	trade.elems.step1next = $(trade.elems.step1next.selector);
	trade.elems.trade_type = $(trade.elems.trade_type.selector);
	
	// Initialize Form Validation
	Validation.create();
	
	setTimeout( function() {
		trade.elems.step1.fadeIn("fast",function(){
			trade.elems.modal.centerOnScreen();
			trade.elems.quantity.focus();
		});
	}, 700);
	
	// bind the cancel button
	trade.close(trade.elems.step1cancel);
	
	// bind the enter key on the quantity box
	trade.elems.quantity.bind("keyup",function(e){
		if(e.keyCode == 13 && !Validation.flag) {
			trade.elems.step1next.click();
			return false;
		}
	});
	
	// Change the buy/sell text as needed
	trade.elems.trade_type.bind("click",function() {
		if($(this).val() == "1") {
			trade.elems.step1next.text("Buy");
		} else {
			trade.elems.step1next.text("Sell");
		}
	})
	
	// Bind the Buy/Sell WeShares button
	trade.elems.step1next.click(function() {
		// Form Validation check!
		if(Validation.flag) { return false; }
		
		// load the iVars
		trade.quantity = trade.elems.quantity.val();
		trade.trade_type = $(trade.elems.trade_type.selector).filter(":checked").val();
		
		// prep the data
		var frmData = {
			company_id:    trade.company_id,
			trade_type:    trade.trade_type,
			quantity:      trade.quantity,
			portId:		   trade.portId
		};
		trade.load(trade.actions.step2,frmData,trade.step2);
		$(this).ajaxPreloader({xPos:10, yPos:-8});
	});
};

Trade.prototype.step2 = function(data) {
	//trace("callback D");
	var trade = new Trade();
	
	trade.elems.step1.hide();
	//trade.elems.header.text("confirm your fake order");
	trade.elems.step2.hide().html(data).fadeIn("fast");
	
	// refresh the selectors on new elements
	trade.elems.step2cancel = $(trade.elems.step2cancel.selector);
	trade.elems.step2next = $(trade.elems.step2next.selector);
	trade.elems.step2back = $(trade.elems.step2back.selector);
	//trade.elems.reason_id = $(trade.elems.reason_id.selector);
	trade.elems.more_reasons = $(trade.elems.more_reasons.selector);
	
	// enable placeholder text management
	trade.elems.more_reasons.resetTxtField();
	
	// use textPlus to limit characters and auto-grow (#refactor#)
	trade.elems.more_reasons.filter("textarea").textPlus();
	trade.elems.step2cancel.focus();
	trade.elems.step2next.focus();
	
	// twitter interaction
	trade.twitterForm($("#twitterForm"));
	// facebook interaction
	Trade.fb._init();
	
	// bind the cancel button
	trade.close(trade.elems.step2cancel);
	
	// bind the back button
	trade.elems.step2back.click(function() {
		trade.elems.step2.fadeOut("fast",function() {
			trade.elems.step1.fadeIn("fast",function(){
				trade.elems.modal.centerOnScreen();
			});
			trade.elems.step2.empty();
		}, 500);
	});
	
	// bind the confirm button
	trade.elems.step2next.click(function() {
		// refresh selectors
		//trade.elems.save_twitter = $(trade.elems.save_twitter.selector);
		trade.elems.send_fb = $(trade.elems.send_fb.selector);
		//trade.elems.send_tweet = $(trade.elems.send_tweet.selector);
		// load the iVars
		//trade.reason_id = trade.elems.reason_id.filter(":checked").val();
		trade.more_reasons = (trade.elems.more_reasons.hasClass("placeholder")) ? '' : trade.elems.more_reasons.val();
		//trade.save_twitter = (trade.elems.save_twitter.length) ? trade.elems.save_twitter.val() : "";
		//trade.send_tweet = (trade.elems.send_tweet.length) ? trade.elems.send_tweet.val() : "";
		trade.send_fb = (trade.elems.send_fb.filter(":visible:checked").length);
		
		// prep the data
		var frmData = {
			"company_id":		trade.company_id,
			"trade_type":		trade.trade_type,
			"quantity":			trade.quantity,
			"reason_id":		'',
			//"save_twitter":		trade.save_twitter,
			//"send_tweet":		trade.send_tweet,
			"twitter_username":	$("#modalBuy input[name='twitter_username']").val(),
			"twitter_password":	$("#modalBuy input[name='twitter_password']").val(),
			"more_reasons":		trade.more_reasons,
			"portId":			trade.portId,
			"cash_balance": 	trade.cash_balance 
		};

		trade.load(trade.actions.step3,frmData,trade.step3);
		$(this).ajaxPreloader({xPos:10, yPos:-8});
	});
};

Trade.prototype.step3 = function(data) {
	//trace("callback E");
	var trade = new Trade();
	
	//trade.elems.portfolioName.hide();
	trade.elems.step2.fadeOut("fast");
	//trade.elems.header.html("&nbsp;");
	trade.elems.step3.html(data).hide();
	
	// refresh selectors for new DOM
	trade.elems.step3cancel = $(trade.elems.step3cancel.selector);
	trade.elems.step3back = $(trade.elems.step3back.selector);
	trade.elems.step3back2 = $(trade.elems.step3back2.selector);
	trade.elems.step3next = $(trade.elems.step3next.selector);
	trade.elems.netWorth  = $(trade.elems.netWorth.selector);
	
	setTimeout( function() {
		//trade.elems.header.hide();
		trade.elems.step3.fadeIn("fast",function(){trade.elems.step3next.focus();});
		trade.close(trade.elems.step3next);
	}, 400);

	// EXCEPTIONS
	if (trade.elems.step3.find("#FundsException").length || trade.elems.step3cancel.length || trade.elems.step3back.length || trade.elems.step3back2.length) {
		// Form Validation Plugin initialization
		Validation.create();
		
		// .step3.empty() removes need to unbind click event
		trade.elems.step3.find(".btnAddFundsModal").bind("click.btnAddFunds",function(){
			// Form Validation Plugin - options found on form elements.
			if(Validation.flag) { return false; }
			
			trade.cash_balance = $(trade.elems.cash_balance.selector).val();
			trade.elems.step3.fadeOut("fast");
			// resubmit the hidden step2 content (crazy, right?)
			trade.elems.step2next.click();
		});
		
		// bind the cancel button
		trade.close(trade.elems.step3cancel);
		trade.elems.step3cancel.focus();
		
		// bind the back button
		trade.elems.step3back.click(function() {
			trade.elems.step3.fadeOut("fast",function(){
				trade.elems.step2.fadeIn("fast",function(){
					trade.elems.modal.centerOnScreen();
				});
				trade.elems.step3.empty();
			}, 500);
		});
		trade.elems.step3back2.click(function() {
			trade.elems.step3.fadeOut("fast",function() {
				trade.elems.step1.fadeIn("fast",function(){
					trade.elems.modal.centerOnScreen();
				});
				trade.elems.step2.empty();
				trade.elems.step3.empty();
			}, 500);
		});
	} else { // SUCCESSFUL TRADE
		trade.netWorth = trade.elems.netWorth.text();								
		// post to facebook
		Trade.fb.post();
		WeSeed.trackTime.stop(undefined,"Trade Time");
		
		// alert any listeners
		$(window).trigger("weseed.trade.success",
			[{
				"id"			: trade.company_id,
				"ticker"		: trade.ticker, 
				"companyName"	: trade.company_name, 
				"type"			: trade.trade_type, 
				"quantity"		: trade.quantity
			}]
		);
		
		trade.elems.step3next.click(function() {
			$(window).trigger("weseed.trade.closeOnSuccess",
				[{
					"id"			: trade.company_id,
					"ticker"		: trade.ticker, 
					"companyName"	: trade.company_name, 
					"type"			: trade.trade_type, 
					"quantity"		: trade.quantity
				}]
			);
		});
	}
};

Trade.prototype.twitterForm = function(elem) {
	elem.find(".showOptions").bind("click.twitterForm",function(){
		var options = elem.find(".options");
		
		if(options.is(":visible")){
			options.hide(); 
			//elem.find(".twitterCheckbox input[name='send_tweet']").attr({checked:'checked',disabled:''});
		} else {
			options.show(); 
			//elem.find(".twitterCheckbox input[name='send_tweet']").attr({checked:'',disabled:'disabled'});
		}
	});
};

Trade.fb = {
	_init:function() {
		WSFB.getInstanceAndRefresh(this);
	},
	post:function() {
		var trade = new Trade(); // singleton
		if(!trade.send_fb) { return false; }
		
		var status = (trade.trade_type == 1) ? "owner" : "seller";
		var imgsrc = "http://www.weseed.com/images/dynamic/company/"+trade.ticker.substr(0,1).toLowerCase()+"/"+trade.ticker.toLowerCase()+"/"+trade.ticker.toLowerCase()+"-60x60.png";
		//var company_logo = "<img src=\""+imgsrc+"\"/>";
		var imghref = "http://www.weseed.com/companyDetail.html?companyId="+trade.company_id;
		
		// The label (which could be in the form of a question) that appears above the text box on the Feed form
		var user_message_prompt = "What do you want to tell your friends about this trade?";
		// populate suggested text in the text box. The user can then edit it before posting
		var user_message = $.trim(trade.more_reasons);
		
		var feed_template = 154574331022; // old template:  95375346022
		var template_data = {
			"status":status,
			"shares":trade.quantity,
			"weshares":"shares",
			"ticker":trade.company_name,
			"images":[{"src":imgsrc,"href":imghref}],
			"sitelink":WeSeed.url(),
			"networth":trade.netWorth
		};
		try {
			var wsfb = WSFB.getInstance();
			wsfb.newFeedPost({
				"template"		: feed_template,
				"data"			: template_data,
				"message"		: user_message,
				"prompt"		: user_message_prompt,
				"callback"		: this.postComplete
			});
		} catch(e) {
		}
	},
	// delegate methods
	didCompletePost:function(postId, exception, data) {
		// data: {"user_message": "" }
		
	},
	didLogin:function() {
		$(".fbdisconnected").hide();
		$(".fbconnected").show();
		
		WSFB.getInstance().getCurrentUser();
		
		//WSFB.getInstance().parse();
	},
	didSetCurrentUser:function(currentUser) {
		var fbname = currentUser.info.first_name + "'s";
		$(".fb-name").text(fbname);
	},
	didLogout:function() {
		//trace("logout");
		$(".fbconnected").hide();
		$(".fbdisconnected").show();
		
		//WSFB.getInstance().parse();
		return true;
	}	
};

/*
	Contains WSFB and WSFBUser
*/
/*----------------------------------------
	WSFBUser OBJECT
	(WeSeed Facebook Connect User)
	(c) 2009 PEAK6 
	Author: Nate Racklyeft 
	
	Version:	0.1.1 - currentUser null fix
	
	Requires:	jQuery 1.3+
				Facebook Connect js API
				Strings object
				WSFB object
----------------------------------------*/

// Constructor
//  - userinfo : Object : FB API response from the users.getInfo method (http://wiki.developers.facebook.com/index.php/Users.getInfo)
//  * Note: the getInfo call returns an array. This function only accepts a single object 
var WSFBUser = function(info) {
	// store the info object
	this.info = info;
	
};
/*----------------------------------------
	WSFB OBJECT
	(WeSeed Facebook Connect Manager)
	(c) 2009 PEAK6 
	Author: Nate Racklyeft 
	
	Version:	0.4.2 - better failure when Facebook is blocked
	
	Requires:	jQuery 1.3+
				Facebook Connect js API
				Strings object
				WSFBUser object
----------------------------------------*/

var WSFB = function(delegate) {
	if(typeof FB == "undefined") {
		return false;
	}
	
	/******* Settings *******/
	this.apiKey = "cc5b1f4d1ab32f6fea530e5422364380";
	// The fields to retrieve from the Users.getInfo call. See: http://wiki.developers.facebook.com/index.php/Users.getInfo
	this.userInfoFields = [
		"first_name",
		"last_name",
		"birthday",
		"current_location",
		"pic_square_with_logo",
		"profile_url"
	];
	// The URL to our cross-domain communication channel
	this.xdChannelUrl = WeSeed.url()+"/fbconnect/xd_receiver.htm";
	this.URL = {
		"login":"/fbconnect/loginUser.html",
		"connectUser":"/fbconnect/connectUser.html",
		"disconnectUser":"/fbconnect/disconnectUser.html"
	};
	
	this.setDelegate(delegate);
	
	// Fire up the Connect instance
	FB.init(this.apiKey,this.xdChannelUrl,{
		"ifUserConnected":this.isConnected,
		"ifUserNotConnected":this.isNotConnected
	});
	
	WSFB.__instance = this;
	return WSFB.__instance;
};

WSFB.prototype = {
	// methods
	"getCurrentUser":function() {
		var wsfb = WSFB.getInstance();
	
		if(typeof wsfb.currentUser == "undefined" || wsfb.currentUser === null) {
			wsfb.api = FB.Facebook.apiClient;
			FB.Facebook.apiClient.users_getInfo(wsfb.api.get_session().uid,wsfb.userInfoFields,wsfb.didSetCurrentUser);
		} else {
			if($.isFunction(wsfb.delegate.didSetCurrentUser)) {
				wsfb.delegate.didSetCurrentUser(wsfb.currentUser); 
			}
		}
	},
	"checkWSAccountStatus":function() {
		var wsfb = WSFB.getInstance();
		$.ajax({
			type:	"GET",
			url:	wsfb.URL.login,
			dataType: "json",
			error:	function() {
				if($.isFunction(wsfb.delegate.didNotFindWSAccount)) {
					wsfb.delegate.didNotFindWSAccount();
				}
			},
			success:function(data) {
				if(data.error) {
					if($.isFunction(wsfb.delegate.didNotFindWSAccount)) {
						wsfb.delegate.didNotFindWSAccount();
					}
				} else {
					if($.isFunction(wsfb.delegate.didFindWSAccount)) {
						wsfb.delegate.didFindWSAccount();
					}
				}
			}
		});
	},
	"connectAccount":function() {
		var wsfb = WSFB.getInstance();
		
		function connectUser() {
			$.ajax({
				type:	"GET",
				url:	wsfb.URL.connectUser,
				dataType: "json",
				error:	function() {
					if($.isFunction(wsfb.delegate.didNotConnectAccount)) {
						wsfb.delegate.didNotConnectAccount();
					}
				},
				success:function(data) {
					if(data.error) {
						if($.isFunction(wsfb.delegate.didNotConnectAccount)) {
							wsfb.delegate.didNotConnectAccount();
						}
					} else {
						if($.isFunction(wsfb.delegate.didConnectAccount)) {
							wsfb.delegate.didConnectAccount();
						}
					}
				}
			});
		}
		
		FB.Bootstrap.requireFeatures(["Connect"],function() {
			FB.Connect.requireSession(connectUser);
		});
	},
	"disconnectAccount":function() {
		var wsfb = WSFB.getInstance();
		$.ajax({
			type:	"GET",
			url:	wsfb.URL.disconnectUser,
			dataType: "json",
			error:	function() {
				if($.isFunction(wsfb.delegate.didNotDisconnectAccount)) {
					wsfb.delegate.didNotDisconnectAccount();
				}
			},
			success:function(data) {
				if(data.error) {
					if($.isFunction(wsfb.delegate.didNotDisconnectAccount)) {
						wsfb.delegate.didNotDisconnectAccount();
					}
				} else {
					if($.isFunction(wsfb.delegate.didDisconnectAccount)) {
						wsfb.delegate.didDisconnectAccount();
					}
				}
			}
		});
	},
	// responses
	"isConnected":function() {
		var wsfb = WSFB.getInstance();
	
		if($.isFunction(wsfb.delegate.isConnected)) {
			wsfb.delegate.isConnected();
		}
	},
	"isNotConnected":function() {
		var wsfb = WSFB.getInstance();
		
		if($.isFunction(wsfb.delegate.isNotConnected)) {
			wsfb.delegate.isNotConnected();
		}
	}
};

WSFB.prototype.login = function() {
	var wsfb = this;
	
	FB.Bootstrap.requireFeatures(["Connect"],function() {
		FB.Connect.requireSession(wsfb.didLogin);
	});
};

WSFB.prototype.logout = function() {
	var wsfb = this;
	function onLogout(result) {
		if($.isFunction(wsfb.delegate.didLogout)) {
			wsfb.delegate.didLogout(result);
		}
	}

	FB.Connect.logout(onLogout);
};

WSFB.prototype.newFeedPost = function(o) {
	var wsfb = this;
	/* Feed Dialog Options can be found here: http://wiki.developers.facebook.com/index.php/JS_API_M_FB.Connect.ShowFeedDialog */
	var callback = o.callback || function(postId, exception, data) {
		if($.isFunction(wsfb.delegate.didCompletePost)) {
			wsfb.delegate.didCompletePost(postId, exception, data);
		}
	};

	FB.Connect.showFeedDialog(o.template, o.data, o.target, o.body, null, 
		FB.RequireConnect.promptConnect, callback, o.prompt, {"value":o.message});
};

WSFB.prototype.didSetCurrentUser = function(result) {
	var wsfb = WSFB.getInstance();
	wsfb.currentUser = new WSFBUser(result[0]);
	
	if($.isFunction(wsfb.delegate.didSetCurrentUser)) {
		wsfb.delegate.didSetCurrentUser(wsfb.currentUser); 
	}
};

WSFB.prototype.didLogin = function() {
	var wsfb = WSFB.getInstance();
	
	if($.isFunction(wsfb.delegate.didLogin)) {
		wsfb.delegate.didLogin();
	}
};

WSFB.prototype.didLogout = function() {
	var wsfb = WSFB.getInstance();
	
	wsfb.currentUser = null;
	
	if($.isFunction(wsfb.delegate.didLogout)) {
		wsfb.delegate.didLogout();
	}
};

// Shortcut functions
WSFB.prototype.parse = function() {
	var wsfb = WSFB.getInstance();
	
	FB.ensureInit(function() {
		FB.XFBML.Host.parseDomTree();
	});
};

WSFB.prototype.checkConnection = function() {
	var wsfb = WSFB.getInstance();
	
	FB.Bootstrap.requireFeatures(["Connect"],function() {
		FB.Connect.ifUserConnected(wsfb.didLogin,wsfb.didLogout);
	});
};

WSFB.getInstanceAndRefresh = function(delegate) {
	if(WSFB.hasInstance()) {
		WSFB.getInstance(delegate).checkConnection();
	} else {
		WSFB.getInstance(delegate);
	}
};
WSFB.hasInstance = function() {
	if(this.__instance instanceof WSFB) {
		return true;
	} else {
		return false;
	}
};

// Getters & Setters
WSFB.getInstance = function(delegate) {
	if(WSFB.__instance instanceof WSFB) {
		if(delegate) {
			WSFB.__instance.setDelegate(delegate);
		}
		return WSFB.__instance;
	} else {
		return new WSFB(delegate);
	}
};

WSFB.prototype.setDelegate = function(delegate) {
	this.delegate = $.extend({}, WSFB.DEFAULT_DELEGATE, delegate);
};


/* 
 * Contains the default settings for convenience to the developers
 * Please change the values before using in any other context (aside from WeSeed).
 */
WSFB.DEFAULT_DELEGATE = {
	didConnectAccount:function() {
		this.isConnected();
	},
	didDisconnectAccount:function() {
		WSFB.getInstance().logout();
	},
	didNotDisconnectAccount:function() {
		$(".fb-disconnect").showRemoveAjaxMsg({txt:"We could not disconnect your account at this time."});
	},
	didNotFindWSAccount:function() {
		$(".fbdisconnected").hide();
		$(".fbconnected").show();
	},
	didFindWSAccount:function() {
		if(!WeSeed.isLoggedIn()) {
			if(!window.location.href.replace(WeSeed.url(),"").match(URL.account.accountPages)) {
				window.location.reload();
			} else {
				window.location = URL.portfolio.base;
			}
		}
	},
	isConnected:function() {
		$(".fbconnected").show();
		$(".fbdisconnected").hide();
		
		var wsfb = WSFB.getInstance();
		wsfb.parse();
		if(!WeSeed.isLoggedIn()) {
			wsfb.checkWSAccountStatus();
		}
		
		$(".signOutBtn").click(function(e) {
			e.preventDefault();
			WSFB.getInstance().logout();
		});
		
		$(".fb-logout").click(function(e) {
			e.preventDefault();
			wsfb.logout();
		});
		
		$(".fb-disconnect").click(function(e) {
			e.preventDefault();
			wsfb.disconnectAccount();
		});
	},
	isNotConnected:function() {
		WSFB.getInstance().parse();
		$(".fbconnected").hide();
		$(".fbdisconnected").show();
		$(".fb-logout").unbind("click");
		$(".fb-disconnect").unbind("click");
	},
	didLogin:function() {
		this.isConnected();
	},
	didLogout:function(result) {
		if(WeSeed.isLoggedIn()) {
			window.location = URL.account.logout;
		} else {
			this.isNotConnected();
		}
	}
};

// object initializers for javascript MVC
var P6						= {};
	P6.Manager				= {};
	P6.View					= {};
	P6.WeSeed				= {};
	P6.WeSeed.Model 		= {};
	P6.WeSeed.Manager 		= {}; 
	P6.WeSeed.View 			= {};
	P6.WeSeed.Controller 	= {};

P6.WeSeed.Router = {
	"init": function() {
		var area = $("body").attr("id").replace("area",''),
			page = $("body").attr("class");

		if(typeof P6.WeSeed.Controller.Application == "function") {
			P6.WeSeed.Controller.Application();
		}

		if (typeof P6.WeSeed.Controller[area] == "object") {
			if(typeof P6.WeSeed.Controller[area].init == "function") {
				P6.WeSeed.Controller[area].init();
			}		
			if(typeof P6.WeSeed.Controller[area][page] == "function") {
				P6.WeSeed.Controller[area][page]();
			} 
		} else {
			// use global.js as a backup only!
			if(area && EventHandler.page["area"+area]) {
				EventHandler.page["area"+area]();
			}
		}
	}
};

P6.WeSeed.Model.Group = function() { };
P6.WeSeed.Model.Group.loadCreateForm = function(delegate) {
	$.ajax({
			type: "POST",
			url:  "/modal/createGroup.html?ajax=true",
			data: {"type":"group", "selectPrivateGroup":true},
			success: function(data) {
				delegate.didLoadContent(data);
			}
		  });
};

/*----------------------------------------
	FinViz Company Chart API for WeSeed
 	(c) 2010 PEAK6 
	For questions contact Nate Racklyeft
	
	Version:	0.1
	
	Requires:	jQuery 1.3+
		
	Chart size is 340px x 700px
----------------------------------------*/

P6.WeSeed.Manager.CompanyChart = {
	"_dateParam":function(unit) {
		switch(unit) {
			case "month":
				return "m";
				break;
			case "week":
				return "w";
				break;
			default: // day
				return "d";				
		}
	},
	"getChartUrl":function(symbol,dateUnit) {
		return "http://finviz.com/chart.ashx?t=" + symbol.toUpperCase() + "&ty=l&ta=0&p="+ this._dateParam(dateUnit) +"&s=l";
	}
};

/*----------------------------------------
	Google GeoMap Visualization Wrapper for WeSeed
 	(c) 2009 PEAK6 
	For questions contact Nate Racklyeft 
	
	Version:	1.1
	
	Requires:	jQuery 1.3+
				Google JS API Loader
				
	Options:
		data			Object		required
		delegate		Object
----------------------------------------*/

P6.WeSeed.Manager.Geomap = function(data,delegate) {
	// enforce requirements
	if(!data || typeof data != 'object' || !google) {
		return false;
	}
	this.data = data;
	this.delegate = delegate || {};
	this.setOptions({});
	
	var ref = this;
	// load the gviz geomap api
	google.load('visualization', '1', {'packages': ['geomap'], 'callback': function() { ref._initMap(); }});
};

P6.WeSeed.Manager.Geomap.prototype = {
	"_initMap":function() {
		this.table = this._parseMapData();
		if(!this.table && $.isFunction(this.delegate.onError)) {
			this.delegate.onError('Data could not be parsed.');
		}
		if($.isFunction(this.delegate.onMapReady)) {
			this.delegate.onMapReady();
		}
	},
	"_parseMapData":function() {
		if(!this.data || !this.data.length) {
			return false;
		}
		
		var table = new google.visualization.DataTable();
		table.addColumn('string', 'Region');
		table.addColumn('number', 'Companies');
		table.addRows(this.data.length);
		try {
			// parse data object and inject into DataTable
			jQuery.each(this.data,function(i) { // array
				table.setValue(i,0,this.name);
				table.setValue(i,1,this.companies);
			});
		} catch(e) {
			return false;
		}
		return table;
	},
	"_registerEvents":function() {
		var ref = this;
		
		google.visualization.events.addListener(ref.geomap, 'drawingDone', function() {
			if($.isFunction(ref.delegate.onDrawingDone)) {
				ref.delegate.onDrawingDone();
			}
		});
		google.visualization.events.addListener(ref.geomap, 'select', function() {
			if($.isFunction(ref.delegate.didSelect)) {
				ref.delegate.didSelect();
			}
		});
		google.visualization.events.addListener(ref.geomap, 'regionClick', function(object) {
			if($.isFunction(ref.delegate.onRegionClick)) {
				ref.delegate.onRegionClick(object);
			}
		});
	},
	// "public" methods
	"draw":function(container) {
		if(!(this.table instanceof google.visualization.DataTable)) {
			return false;
		}
		this.geomap = new google.visualization.GeoMap(container);
		this._registerEvents();
		this.geomap.draw(this.table, this.options);
	},
	"getValueAtSelectionAndColumn":function(col) {
		return this.table.getValue(this.getSelection()[0].row,col);
	},
	"getSelection":function() {
		return this.geomap.getSelection();
	},
	// getters and setters
	"setDelegate" : function(delegate) {
		this.delegate = delegate || {};
	},
	"setOptions":function(options) {
		var defaultOptions = {
			'dataMode'	: 'regions',
			'width'		: '960px',
			'height'	: '600px',
			'showLegend': false,
			'colors'	: [0xBCDD8D]
		}

		this.options = jQuery.extend({},defaultOptions, options);
	}
};

/*----------------------------------------
	Google Search API Wrapper for WeSeed
 	(c) 2010 PEAK6 
	For questions contact Nate Racklyeft 
	
	Version:	0.1
	
	Requires:	jQuery 1.3+
				Google JS API Loader
				
	Options:
		data			Object		required
		delegate		Object
		
	Reference:
		http://code.google.com/apis/ajaxsearch/documentation/reference.html
----------------------------------------*/

P6.WeSeed.Manager.GoogleSearch = function(delegate) {
	// enforce requirements
	if(typeof google == "undefined") {
		return false;
	}
	this.delegate = delegate || {};
	//this.setOptions({});
	
	var ref = this;
	// load the gviz geomap api
	google.load('search', '1', {'nocss' : true, 'callback': function() { ref._init(); }});
};

P6.WeSeed.Manager.GoogleSearch.prototype = {
	"_init":function() {
		var ref = this;
		ref.newsSearch = new google.search.NewsSearch();
		ref.newsSearch.setSearchCompleteCallback(null, function() { ref._onSearchComplete(); });
		
		// set the results length to large (8 results)
		ref.newsSearch.setResultSetSize(google.search.Search.LARGE_RESULTSET);
		
		// turn off the HTML generation
		ref.newsSearch.setNoHtmlGeneration();
		
		if($.isFunction(this.delegate.onSearchLoad)) {
			this.delegate.onSearchLoad();
		}
	},
	"_onSearchComplete":function() {
		if($.isFunction(this.delegate.onSearchComplete)) {
			this.delegate.onSearchComplete(this.newsSearch.results);
		}
	},
	"getAttribution":function() {
		return this.newsSearch.getAttribution();
	},
	"getBranding":function(opt_element,opt_orientation) {
		return google.search.Search.getBranding(opt_element,opt_orientation);
	},
	"getCursor":function() {
		return this.newsSearch.cursor;
	},
	"search":function(query) {
		this.newsSearch.execute(query);
	}
}

P6.WeSeed.Manager.StaticContent = (function() {
	var uniqueInstance;
	
	function constructor() {
		function loadContent(o) {
			var url		 = o.url 	  || "",
				data	 = o.data 	  || {},
				delegate = o.delegate || {};
	
			$.ajax({
				type: "POST",
				url:  url,
				data: data,
				success: function(data) {
					if ($.isFunction(delegate.didLoadContent)) {
						delegate.didLoadContent(data);
					}
				}
			 });
		}
	
		return {
			"loadPrivacyPolicy":function(o) {
				return loadContent({
					"url"     :	"/static/privacyPolicy.html?ajax=true",
					"delegate":	o.delegate
				});
			},
			"loadTermsOfUse":function(o) {
				return loadContent({
					"url"     :	"/static/termsOfUse.html?ajax=true",
					"delegate":	o.delegate
				});
			}
		};
	}
	
	return {
		"getInstance": function() {
			if(!uniqueInstance) {
				uniqueInstance = constructor();
			}
			return uniqueInstance;
		}
	};
})();

if(typeof(P6)!='object') { P6 = {}; }
if(typeof(P6.Manager)!='object') { P6.Manager = {}; }
/*----------------------------------------
	BRIGHTCOVE API MANAGER
 	(c) 2009 PEAK6 
	For questions contact Nate Racklyeft 
	
	Version:	1.0.1 - changed namespace 
	
	Requires:	jQuery 1.3+
----------------------------------------*/
P6.Manager.Brightcove = {};
P6.Manager.Brightcove.fetchCurrentPlayer = function(callback,delegate) {
	if(P6.Manager.Brightcove.__currentPlayer) {
		if(delegate) {
			P6.Manager.Brightcove.__currentPlayer.setDelegate(delegate);
		}
		callback(P6.Manager.Brightcove.__currentPlayer);
	} else {
		P6.Manager.Brightcove.init(callback,delegate);
	}
};
P6.Manager.Brightcove.init = function(callback,delegate) {
	onTemplateLoaded = function(experienceID) {
		P6.Manager.Brightcove.__currentPlayer = new P6.Manager.Brightcove.Player(experienceID,delegate);
		callback(P6.Manager.Brightcove.__currentPlayer);
	};
	if(typeof(brightcove)!='object') {
		$.get("http://admin.brightcove.com/js/BrightcoveExperiences.js",null,null,"script");
	}
	if(typeof(APIModules)!='object') {
		$.get("http://admin.brightcove.com/js/APIModules_all.js",null,null,"script");
	}
};

P6.Manager.Brightcove.Player = function(experienceID,delegate) {
	this.bcExp = brightcove.getExperience(experienceID);
	this.modExp = this.bcExp.getModule(APIModules.EXPERIENCE);
	this.modCon = this.bcExp.getModule(APIModules.CONTENT);
	this.modMenu = this.bcExp.getModule(APIModules.MENU);
	this.modVP = this.bcExp.getModule(APIModules.VIDEO_PLAYER);
	this.modSocial = this.bcExp.getModule(APIModules.SOCIAL);
	
	this.delegate = delegate || {};
	
	var ref = this;
	this.modExp	.addEventListener(BCExperienceEvent.TEMPLATE_READY, 	function(evt) { ref.onTemplateReady(evt); });
	this.modExp	.addEventListener(BCExperienceEvent.CONTENT_LOAD, 		function(evt) { ref.onContentLoad(evt); });
    this.modCon	.addEventListener(BCContentEvent.VIDEO_LOAD, 			function(evt) { ref.onVideoLoad(evt); }); 
	this.modMenu.addEventListener(BCMenuEvent.SEND_EMAIL_CLICK, 		function(evt) { ref.onMenuEvent(evt); });
	this.modVP	.addEventListener(BCMediaEvent.PLAY, 					function(evt) { ref.onMediaEvent(evt); });
	this.modVP	.addEventListener(BCMediaEvent.BEGIN, 					function(evt) { ref.onMediaEvent(evt); });
	this.modVP	.addEventListener(BCMediaEvent.COMPLETE, 				function(evt) { ref.onMediaEvent(evt); });
	this.modVP	.addEventListener(BCMediaEvent.STOP, 					function(evt) { ref.onMediaEvent(evt); });
	this.modVP	.addEventListener(BCMediaEvent.BUFFER_BEGIN, 			function(evt) { ref.onMediaEvent(evt); });
};

P6.Manager.Brightcove.Player.prototype = {
	"closeMenuPage" :function() {
		return this.modMenu.closeMenuPage();
	},
	"cueVideo" : function(vid, property) {
		var property = property || "id";
		return this.modVP.cueVideo(vid, property);
	},
	"isPlaying" : function() {
		return this.modVP.isPlaying();
	},
	"loadVideo" : function(vid, property) {
		var property = property || "id";
		return this.modVP.loadVideo(vid, property);
	},
	"playVideo" : function(vid, property) {
		vid = vid || false;
		this.closeMenuPage();
		if(!vid && !this.modVP.isPlaying()) {
			return this.modVP.play();
		}
		if(vid && !this.modVP.getCurrentVideo()) {
			return this.loadVideo(vid, property);
		}
		if(vid && this.modVP.getCurrentVideo().id == vid && !this.modVP.isPlaying()) {
			return this.modVP.play();
		}
		if(vid && this.modVP.getCurrentVideo().id != vid) {
			return this.loadVideo(vid, property);
		}
	},
	"setVideoLink" : function(link) {
		return this.modSocial.setLink(link);
	},
	"stopVideo" : function() {
		return this.modVP.stop();
	},
	// delegate notifications
	"onTemplateReady" : function (evt){
		if($.isFunction(this.delegate.onTemplateReady)) {
			this.delegate.onTemplateReady(evt);
		}
		this.templateReady = true;
	},
	"onContentLoad" : function (evt){
		if($.isFunction(this.delegate.onContentLoad)) {
			this.delegate.onContentLoad(evt);
		}
		this.contentReady = true;
	},
	"onVideoLoad" : function (evt){
		if($.isFunction(this.delegate.onVideoLoad)) {
			this.delegate.onVideoLoad(evt);
		}
		this.videoLoad = true;
	},
	"onMenuEvent" : function (evt) {
		if($.isFunction(this.delegate.onMenuEvent)) {
			this.delegate.onMenuEvent(evt);
		}
	},
	"onMediaEvent" : function (evt) {
		if($.isFunction(this.delegate.onMediaEvent)) {
			this.delegate.onMediaEvent(evt);
		}
	},
	// getters & setters
	"setDelegate" : function(delegate) {
		this.delegate = delegate || {};
	},
	"getCurrentVideo" : function() {
		return this.modVP.getCurrentVideo();
	}
};

P6.Manager.Brightcove.trackEvent = function(evt){
	var o = {	"category"	: $("body").attr("id"),
				"action"	: evt.type,
				"label"		: evt.media.displayName};
	
	if(evt.position > 0) {
		o.value = evt.position;
	}
	WeSeed.trackEvent(o);
};

/*----------------------------------------
	WeSeed Modals
 	(c) 2009 PEAK6 
	For questions contact Judd Younce 
	
	Version:	1.1 - updates to structure
	
	Requires:	jQuery 1.3+
				jQuery.fn.centerOnScreen
				
	Options:
		modalId			String		required
		classNames		Array
		delegate		Object
		body			String
		preloader		Boolean
		closeButton		Boolean
----------------------------------------*/

P6.WeSeed.View.Modal = function(o,delegate) {
	if(!o.modalId) { return false; }
	this.setOptions(o);
	this.setDelegate(delegate);
	this.elem = $(this.options.modalId);
	
	if (!this.elem.length) {
		this.create();  // lazy add the modal
	}
	
	this.setBody(this.options.body);
	this.setClasses(this.options.classNames);
};

P6.WeSeed.View.Modal.defaults = {
	"body"			: "",
	"classNames"	: [],
	"preloader"		: true,
	"closeButton"	: true
};

P6.WeSeed.View.Modal.prototype = {
	"create":function() {
		var modalFrame = '<div id="' + this.options.modalId + '" class="modal">' +
						     '<div class="bodyWrap">'	   				 +						         
						         '<div class="body">'					 +
						         '</div>'								 +
						     '</div>'									 +
						 '</div>';		
		
		this.elem = $(modalFrame).appendTo($("body"));
		if (this.options.preloader)   { this.addPreloader();   }		
		if (this.options.closeButton) { this.addCloseButton(); }
	},
	"open":function(animation) {
		animation = animation || "show";
		this.elem[animation]();
		this.centerOnScreen();
	},
	"close":function(animation) {
		animation = animation || "hide";
		this.elem[animation]();
	},
	"destroy":function() {
		this.elem.remove();
	},
	"centerOnScreen":function() {
		this.elem.centerOnScreen();
	},
	"removePreloader":function() {
		this.elem.find("div.bodyWrap").removeClass("preloader");
	},
	"addPreloader":function() {
		this.elem.find("div.bodyWrap").addClass("preloader");
	},
	"addCloseButton":function() {
		var me = this;
		this.elem.find("div.bodyWrap").prepend('<a href="javascript:;" title="close me" class="closeBtnWrapper"><img src="/images/backgrounds/blank.gif" class="iClose iconS" /></a>');
		this.elem.find("a.closeBtnWrapper").bind("click.closeMe", function(event) {
			if($.isFunction(me.delegate.didClickCloseButton)) {
				me.delegate.didClickCloseButton(event);
			} else{
				me.close();
			}
		});
	},
	"removeCloseButton":function() {
		this.elem.find("a.closeBtnWrapper").remove();
	},
	"isOpen":function() {
		return this.elem.is(":visible");
	},
	"resetForm":function() {
		this.elem.find("form")[0].reset();
	},
	"toggle":function(animation) {
		if (this.isOpen()) {
			this.close("fadeOut");
		} else {
			this.open("fadeIn");
		}
	},
	// getters/setters
	"getBody":function() {
		if(!this.elem) { return false; }
		return this.elem.find("div.bodyWrap > div.body").html();
	},
	"setBody":function(body) {
		if(!this.elem) { return false; }

		this.elem.find("div.bodyWrap > div.body").empty().append(body);
	},
	"addClass":function(className) {
		if(!this.elem) { return false; }
		this.elem.addClass(className);
	},
	"setClasses":function(classNames) {
		// wipes out all current classes
		
		if(typeof classNames.join != "function") { return false; }
		this.classNames = classNames;
		this.addClass(classNames.join());
	},
	"setDelegate":function(delegate) {
		this.delegate = delegate || {};
	},
	"setOptions":function(options) {
		if(typeof options != "object") { return false; }
		this.options = $.extend({},P6.WeSeed.View.Modal.defaults,options);
	}
};


P6.WeSeed.Controller.Application = function(){
	// Flash bar: bind close button.
	if($(".tipsBar").length) {
		$(".tipsBar .close").click(function() {
			$(this).closest(".tipsBar").slideUp("fast");
		});
	}
};

P6.WeSeed.Controller.Companies = {
	"init":function() {
		this.chart();
	},
	"feed":function() {
		// autogrow the comment area
		$(".new-comment-form textarea").textPlus();
		// enable placeholder text management
		$(".new-comment-form textarea").resetTxtField();
		// disable submit button on new buzz
		$(".new-comment-form").submit(function(e) {
			$(this).find("[type=submit]").disable().text("Posting...");
		});
		// disable submit button on new comment
		$(".commentPostForm").submit(function(e) {
			$(this).find("[type=submit]").disable().text("Saving...");
		});
	},
	"financials":function() {
	// Company finance help
		var openBalloon = null;
		// clicking on the help icon brings up the balloon
		$("#FinancialsTable .iQuestion").click(function(e) {
			openBalloon = $(this).siblings(".wordBalloonSmall").show();
		});
		// leaving focus of the help cell hides the balloon.
		$("#FinancialsTable .question-box").parent().mouseleave(function(e) {
			if(openBalloon) {
				openBalloon.hide();
			}
		});
	},
	"news":function() {
		var search,		// holds the instance of the Google Search Manager
			newsList	= $(".news-list"),
			template	= newsList.find(".template"),
			loader		= newsList.find(".loader"),
			cSymbol		= $(".company-info .symbol").text(),
			cName		= $(".company-info .name").text();
		
		function printResults(results) {
			//console.log(results);
			if(results.length) { 
				loader.fadeOut("fast",function() { $(this).remove(); });
				
				for (var i = results.length - 1; i >= 0; i--){
					var result = results[i];
					var article = template.clone(true);

					article.find(".title").html(result.titleNoFormatting).attr("href","/external/index?frame_src="+result.url+"&page_title="+escape(result.titleNoFormatting));
					article.find(".date").text("("+(new Date(result.publishedDate)).prettyDate()+", "+result.publisher+")");
					article.find(".content").html(result["content"]);
					if(typeof result.image == "object") {
						article.find(".article-image").attr("title",result.image.publisher).attr("href",result.image.originalContextUrl)
							.find("img").attr("src",result.image.tbUrl).attr("alt",result.image.publisher);
					} else {
						article.find(".article-image").hide();
					}
					
					article.removeClass("template").insertAfter(template);
				};
			} else {
				loader.empty().html("<p>Sorry, we couldn't find any news for "+cName+" at this time.");
			}
			
			var attribution = search.getAttribution();
			
			if(attribution != null) {
				newsList.find(".attribution").prepend(attribution).show();
			} else {
				newsList.find(".attribution").prepend(search.getBranding()).show();
			}
			
			var cursor = search.getCursor();
			
			if(cursor) {
				newsList.find(".attribution").find(".more-results").attr("href",cursor.moreResultsUrl);
			} else {
				newsList.find(".attribution").find(".more-results").hide();
			}
		}

		search = new P6.WeSeed.Manager.GoogleSearch({
			"onSearchLoad":function() {
				//trace("search api loaded successfully");
				search.search(cSymbol + " " + cName);
			},
			"onSearchComplete":function(results) {
				//trace("search returned "+results.length+" results");
				printResults(results);
			}
		});
	},
	"chart":function() {
		var openAnchors = $(".show-chart");
		var chartModal = new P6.WeSeed.View.Modal({
			"modalId":"ChartModal"
		});
		var modalBody;
		var symbol;
		
		function chartBody(dateUnit) {
			if(typeof modalBody == "undefined") {
				modalBody = $("<div></div>");
				modalBody.append("<div id=\"LiveTabs\"><ul></ul></div>");
				modalBody.find("ul")
							.append("<li class=\"left day\"><a href=\"#day\">Daily</a></li>")
							.append("<li class=\"mid week\"><a href=\"#week\">Weekly</a></li>")
							.append("<li class=\"right month\"><a href=\"#month\">Monthly</a></li>");		
				modalBody.append("<div class=\"graph\"></div>");
				
				chartModal.setBody(modalBody);
			}
			// bind the tabs
			modalBody.find("#LiveTabs a").click(switchTab);
			
			// select the current tab
			modalBody.find("li")
				.removeClass("sel")
				.filter("."+dateUnit)
					.addClass("sel");
			
			// add the correct image
			modalBody.find(".graph > img").css({
				"position":"absolute"
			}).fadeOut(400,function(){
				$(this).remove();
			});
			
			$("<img />").appendTo(modalBody.find(".graph:first"))
					.attr("alt",symbol+" stock price by "+dateUnit)
					.attr("src",P6.WeSeed.Manager.CompanyChart.getChartUrl(symbol,dateUnit));

			return modalBody;
		}
		
		function switchTab(evt) {
			var dateUnit = $(this).attr("href").split("#")[1];
			chartBody(dateUnit);
		}
		
		openAnchors.click(function(e) {
			e.preventDefault();
			
			symbol = $(this).attr("href").split('#')[1].split('-')[0];
			
			chartBody("day");
			chartModal.open();
		});
		
	}
}

P6.WeSeed.Controller.Home = {
	"faq":function() {
		$("#questions li > a").click(function(e) {
			var question = $(this).closest("li");
			e.preventDefault();
			question.toggleClass("active");
		});
	}
};

P6.WeSeed.Controller.Login = {
	"sign_in":function() {
		// Disable the login button after submit
		$("form.frmSignIn").bind("submit",function(e) {
			$(this).find(":submit").disable().text("Please wait...");
		});
		
		$("input:visible:eq(0)").focus(); // keyboard navigation FTW!
		
		// LEGACY (eww...)
		$("#frmForgotPasswordBase").forgotPassword();
		$(".weRemMe").each(function() {
			$(this).find(".txt").popup($(this).find(".popup"));
		});
	}
};

P6.WeSeed.Controller.Markets = {
	"live-results":function() {
		var sortSelect = $("select[name='sort']");
		var ref = this;
		
		sortSelect.change(function(e) {
			$(this).find(":selected").text("Loading...");
			var sortValue = $(this).find(":selected").val();
			ref._loadSortURL(sortValue);
		});
	},
	"love":function() {
		// variables
		var elems = {
			"subMarketLabel"	: $("#SubMarket"),
			"menuButton"		: $("#CategoryList .button"),
			"menu"				: $("#CategoryList .menu"),
			"menuLink"			: $("#CategoryList .menu a"),
			"sortSelect"		: $("select[name='sort']")
		};
		var ref = this;
		
		function showLoadingText() {
			elems.subMarketLabel.html("<em>Loading...</em>");
		}
	
		// open the menu
		elems.menuButton.click(function(e) {
			elems.menu.toggle();
		});
		
		// sub-category change
		elems.menuLink.click(function(e) {
			elems.menu.hide();
			showLoadingText();
		});
		
		// sort change
		elems.sortSelect.change(function(e) {
			var sortValue = $(this).find(":selected").val();
			elems.menu.hide();
			showLoadingText();
			ref._loadSortURL(sortValue);
		});
	},
	"international":function() {
		var mapElement = $("#GeoMap");
		
		if(typeof mapData != 'object') {
			mapElement.find(".loading").text("Failed to find map data.");
			return false;
		}
		
		var mapDelegate = {
			"didSelect":function() {
				var region = geomap.getValueAtSelectionAndColumn(0);
				mapElement.find(".loading").remove();
				mapElement.append("<div class=\"loading\">Loading results for "+region+"...</div>");
			},
			"onError":function(text) {
				mapElement.find(".loading").remove();
				mapElement.append("<div class=\"loading\">"+text+"</div>");
			},
			"onMapReady":function() {
				geomap.draw(mapElement[0]);
			},
			"onRegionClick":function(obj) {
				// obj.region == "US", for example
				setTimeout(function() {
					window.location = $.url.attr("source") + "/" + obj.region
				},100);
			}
		}
		
		var geomap = new P6.WeSeed.Manager.Geomap(mapData,mapDelegate);
	},
	"united-states": function() {
		var mapElement = $("#GeoMap");
		
		if(typeof mapData != 'object') {
			mapElement.find(".loading").text("Failed to find map data.");
			return false;
		}
		
		var mapDelegate = {
			"didSelect":function() {
				var region = geomap.getValueAtSelectionAndColumn(0);
				mapElement.find(".loading").remove();
				mapElement.append("<div class=\"loading\">Loading results for "+region+"...</div>");
			},
			"onError":function(text) {
				mapElement.find(".loading").remove();
				mapElement.append("<div class=\"loading\">"+text+"</div>");
			},
			"onMapReady":function() {
				geomap.setOptions({
					"region":"US"
				});
				geomap.draw(mapElement[0]);
			},
			"onRegionClick":function(obj) {
				// obj.region == "US-NJ" (new jersey) for example
				setTimeout(function() {
					window.location = $.url.attr("source").replace(/\/$/,'') + '/' + obj.region.replace('US-','')
				},100);
			}
		}
		
		var geomap = new P6.WeSeed.Manager.Geomap(mapData,mapDelegate);
	},
	"_loadSortURL": function(sortValue) {
		var url = null;
		if($.url.attr("source").indexOf('sort=') >= 0) {
			url = $.url.attr("source").replace(/sort=[a-z]*/i,"sort="+sortValue);
		} else {
			url = $.url.attr("source") + (($.url.attr("query") === null) ? "?" : "&") + "sort=" + sortValue;
		}
		window.location = url;
	}
};

P6.WeSeed.Controller.MyCompanies = {
	"init":function() {
		// Graph support
		P6.WeSeed.Controller.Companies.chart();
	},
	"index":function() {
		var btnClicked,
			elems,
			playerDelegate,
			manager,
			managerDelegate,
			player,
			tipBox,
			topCompanies;
		
		// watch for trade completions
		$(window).bind("weseed.trade.closeOnSuccess", function(e, data) {
			//$("#modalBuy div.step3 a.lnkContinue").remove();
			setTimeout(function(){
				window.location.reload(true);
			},500);
		});
			
		$("#areaMyCompanies div.tipsBar a.closeMe").setCookieTips();
		$("#areaMyCompanies div.tipBox a.closeMe").setCookieTips({"cookieTimespan":360});
		
		playerDelegate = {
			"didClickCloseButton": function() {
				if(typeof manager == "Object") {
					manager.stopVideo();
				}
				player.close();
			}
		};
		
		managerDelegate = {
			"onContentLoad": function() {
				if(!manager.isPlaying()) {
					manager.playVideo();
				}
			},
			"onMenuEvent": function(evt) {
				WeSeed.trackEvent({	"category" : $("body").attr("id"),
									"action"   : evt.type,
									"label"	   : manager.getCurrentVideo().displayName});
			},
			"onMediaEvent": function(e) {
				P6.Manager.Brightcove.trackEvent(e);
				if (e.type == BCMediaEvent.BEGIN) {
					tipBox = btnClicked.parents("div.tipBox:eq(0)");
					if (tipBox.length) {
						tipBox.find("> a.closeMe").click();
					}
				}
			}
		};		
		
		player  = new WeSeed.View.VideoPlayerPopUp($("#videoPlayer"), playerDelegate);
		manager = null;
		
		// Set video animation options
		player.setAnimationOptions({
			"end": {
				"height":"542px",
				"opacity":"1"
			}
		});
		
		// OPEN DAT VIDEO!
		$(".video").click(function(e) {
			e.preventDefault();
			btnClicked	= $(e.target);
			vidId		= BrightCove[$(this).attr("rel")];
			vidLink		= $(this).attr("href");
			P6.Manager.Brightcove.fetchCurrentPlayer(function(bcplayer) {
				manager = bcplayer;
				manager.playVideo(vidId);
				manager.setVideoLink(WeSeed.url() + vidLink);
			}, managerDelegate);
			player.open();
		});
		
		this.news();
	},
	"news":function() {
		var search,		// holds the instance of the Google Search Manager
			companies	= $(".myCompanyLineup"),
			newsList,
			template,
			loader,
			cSymbol,
			cName,
			index = 0;

		function printResults(results) {
			if(results.length) { 
				var articlesToShow = (results.length > 3) ? 3 : results.length;
				loader.remove();
				
				for (var i = articlesToShow - 1; i >= 0; i--){
					var result = results[i];
					var article = template.clone(true);

					article.find(".title").html(result.titleNoFormatting).attr("href","/external/index?frame_src="+result.url+"&page_title="+escape(result.titleNoFormatting));
					article.find(".date").html((new Date(result.publishedDate)).prettyDate()+"<br/>"+result.publisher);
					
					article.removeClass("template").insertAfter(template);
				};
			} else {
				loader.empty().html("Sorry, we couldn't find any news for "+cName+" at this time.");
			}

			doSearch();
		}
		
		function doSearch() {
			var company = companies.eq(index);
			
			if(company.length) {
				index ++;
				newsList	= company.find(".myCompanyLineupNews"),
				template	= newsList.find(".template"),
				loader		= newsList.find(".loader"),
				cSymbol		= company.find(".myCompanyLineupInfo .symbol").text(),
				cName		= company.find(".myCompanyLineupInfo .name").text();
				
				search.search(cSymbol + " " + cName);
			}
		}

		search = new P6.WeSeed.Manager.GoogleSearch({
			"onSearchLoad":function() {
				//trace("search api loaded successfully");
				doSearch();
			},
			"onSearchComplete":function(results) {
				//trace("search returned "+results.length+" results");
				printResults(results);
			}
		});
	}
};

P6.WeSeed.Controller.Search = {
	"home":function() {
		this._validateSearch();
	},
	"index":function() {
		this._videoOfTheDay();
		this._validateSearch();
	},
	"videos":function() {
		var videoList = $("#videoListUL");
		var manager = null;
		
		// define the Brightcove manager delegate methods
		var managerDelegate = {
			"onContentLoad": function() {
				if(!manager.isPlaying()) {
					manager.playVideo();
				}
			},
			"onMenuEvent": function(evt) {
				WeSeed.trackEvent({	"category"	: $("body").attr("id"),
									"action"	: evt.type,
									"label"		: manager.getCurrentVideo().displayName});
			},
			"onMediaEvent": P6.Manager.Brightcove.trackEvent
		};
		
		// build the video list
		BrightCove.videoObject.firstPlayId = isNaN($.url.param("videoId")) ? BrightCove.videoObject.brightcoveVideos[0].id : $.url.param("videoId");
		$.fn.videoQuickList(BrightCove.videoObject);
		
		// Play a video
		function playVideo(videoId, videoLink) {
			videoList.find(".video-link").removeClass("sel");
			videoList.find("[rel='"+videoId+"']").addClass("sel");
			manager.playVideo(videoId);
			manager.setVideoLink(videoLink);
		}
		
		// initialize the player + play the first video
		P6.Manager.Brightcove.fetchCurrentPlayer(function(bcplayer) {
			manager = bcplayer;
			manager.playVideo(BrightCove.videoObject.firstPlayId);
			manager.setVideoLink($.url.attr("source"));
			
			// bind the list links
			videoList.click(function(e){
				e.preventDefault();
				var target = $(e.target);
				if(target.hasClass("video-link")) {
					var videoId = target.attr("rel");
					var videoLink = WeSeed.url() + target.attr("href");
					playVideo(videoId,videoLink);
				}
			});
		},managerDelegate);
	},
	"_validateSearch":function() {
		// prevent searches of the placeholder text value
		$("#frmSearchSuggest").submit(function(e) {
			var searchBox = $(this).find("[name='q']");
			if(searchBox.hasClass("placeholder")) {
				e.preventDefault();
				searchBox.focus();
			}
		});
	},
	"_videoOfTheDay":function() {
		if(videoID == null) {
			return false;
		}
		
		var playerDelegate = {
			"didClickCloseButton":function() {
				if(typeof manager == "Object") {
					manager.stopVideo();
				}
				player.close();
			}
		};
		var managerDelegate = {
			"onContentLoad": function() {
				if(!manager.isPlaying()) {
					manager.playVideo();
				}
			},
			"onMenuEvent": function(evt) {
				WeSeed.trackEvent({	"category"	: $("body").attr("id"),
									"action"	: evt.type,
									"label"		: manager.getCurrentVideo().displayName});
			},
			"onMediaEvent": P6.Manager.Brightcove.trackEvent
		};		
		
		var player = new WeSeed.View.VideoPlayerPopUp($("#videoPlayer"),playerDelegate);
		var manager = null;
		// Set video animation options
		player.setAnimationOptions({
			"start":{
				"opacity":"0"
			},
			"end":{
				"opacity":"1"
			}
		});
		
		// video.open
		$("#miniVOD").click(function(e) {
			e.preventDefault();
			vidId = videoID;
			vidLink = '';
			P6.Manager.Brightcove.fetchCurrentPlayer(function(bcplayer) {
				manager = bcplayer;
				manager.playVideo(vidId);
				manager.setVideoLink(WeSeed.url() + vidLink);
			},managerDelegate);
			
			player.open();
			$("#videoPlayer").nBox();
		});
	}
};

P6.WeSeed.Controller.LandingPage = {
	"returning":function() {
		this.news();
	},
	"news":function() {
		var search,
			companies	= $("#myTopMovers > li"),
			newsList,
			template,
			loader,
			cSymbol,
			cName,
			index = 0;

		function printResults(results) {
			if(results.length) { 
				var articlesToShow = (results.length > 2) ? 2 : results.length;
				loader.remove();
				
				for (var i = articlesToShow - 1; i >= 0; i--){
					var result = results[i];
					var article = template.clone(true);
					
					article.find(".title").html(result.titleNoFormatting).attr("href","/external/index?frame_src="+result.url+"&page_title="+escape(result.titleNoFormatting));
					article.find(".date").html((new Date(result.publishedDate)).prettyDate()+" via "+result.publisher);
					
					article.removeClass("template").insertAfter(template);
				};
			} else {
				loader.empty().html("Sorry, we couldn't find any news for "+cName+" at this time.");
			}

			doSearch();
		}
		
		function doSearch() {
			var company = companies.eq(index);
			
			if(company.length) {
				index ++;
				newsList	= company.find(".ruhpRecentNews"),
				template	= newsList.find(".template"),
				loader		= newsList.find(".loader"),
				cSymbol		= company.find(".ruhp_symbol").text(),
				cName		= company.find(".ruhp_name").text();
				
				search.search(cSymbol + " " + cName);
			}
		}

		search = new P6.WeSeed.Manager.GoogleSearch({
			"onSearchLoad":function() {
				//trace("search api loaded successfully");
				doSearch();
			},
			"onSearchComplete":function(results) {
				//trace("search returned "+results.length+" results");
				printResults(results);
			}
		});
	}
};