/*
Copyright (c) 2009, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 3.0.0
build: 1549
*/
(function(){var I={},B=new Date().getTime(),A,E,H=function(){if(window.addEventListener){return function(M,L,K,J){M.addEventListener(L,K,(!!J));};}else{if(window.attachEvent){return function(L,K,J){L.attachEvent("on"+K,J);};}else{return function(){};}}}(),F=function(){if(window.removeEventListener){return function(M,L,K,J){M.removeEventListener(L,K,!!J);};}else{if(window.detachEvent){return function(L,K,J){L.detachEvent("on"+K,J);};}else{return function(){};}}}(),D=function(){YUI.Env.windowLoaded=true;YUI.Env.DOMReady=true;F(window,"load",D);},C={"io.xdrReady":1,"io.xdrResponse":1},G=Array.prototype.slice;if(typeof YUI==="undefined"||!YUI){YUI=function(O,N,M,L,J){var K=this,R=arguments,Q,P=R.length;if(!(K instanceof YUI)){return new YUI(O,N,M,L,J);}else{K._init();for(Q=0;Q<P;Q++){K._config(R[Q]);}K._setup();return K;}};}YUI.prototype={_config:function(N){N=N||{};var O=this.config,L,K,J,M;M=O.modules;for(L in N){if(M&&L=="modules"){J=N[L];for(K in J){if(J.hasOwnProperty(K)){M[K]=J[K];}}}else{if(L=="win"){O[L]=N[L].contentWindow||N[L];O.doc=O[L].document;}else{O[L]=N[L];}}}},_init:function(){var J="3.0.0",K=this;if(J.indexOf("@")>-1){J="test";}K.version=J;K.Env={mods:{},cdn:"http://yui.yahooapis.com/"+J+"/build/",bootstrapped:false,_idx:0,_used:{},_attached:{},_yidx:0,_uidx:0,_loaded:{}};K.Env._loaded[J]={};if(YUI.Env){K.Env._yidx=(++YUI.Env._yidx);K.Env._guidp=("yui_"+J+"-"+K.Env._yidx+"-"+B).replace(/\./g,"_");K.id=K.stamp(K);I[K.id]=K;}K.constructor=YUI;K.config={win:window||{},doc:document,debug:true,useBrowserConsole:true,throwFail:true,bootstrap:true,fetchCSS:true,base:function(){var L,M,O,N;M=document.getElementsByTagName("script");for(O=0;O<M.length;O=O+1){N=M[O].src.match(/^(.*)yui\/yui[\.\-].*js(\?.*)?$/);L=N&&N[1];if(L){break;}}return L||K.Env.cdn;}(),loaderPath:"loader/loader-min.js"};},_setup:function(J){this.use("yui-base");},applyTo:function(P,O,L){if(!(O in C)){this.log(O+": applyTo not allowed","warn","yui");return null;}var K=I[P],N,J,M;if(K){N=O.split(".");J=K;for(M=0;M<N.length;M=M+1){J=J[N[M]];if(!J){this.log("applyTo not found: "+O,"warn","yui");}}return J.apply(K,L);}return null;},add:function(K,M,J,L){YUI.Env.mods[K]={name:K,fn:M,version:J,details:L||{}};return this;},_attach:function(K,O){var T=YUI.Env.mods,L=this.Env._attached,Q,P=K.length,M,N,R,S,J;for(Q=0;Q<P;Q=Q+1){M=K[Q];N=T[M];if(!L[M]&&N){L[M]=true;R=N.details;S=R.requires;J=R.use;if(S){this._attach(this.Array(S));}if(N.fn){N.fn(this);}if(J){this._attach(this.Array(J));}}}},use:function(){if(this._loading){this._useQueue=this._useQueue||new this.Queue();this._useQueue.add(G.call(arguments,0));return this;}var K=this,U=G.call(arguments,0),Z=YUI.Env.mods,b=K.Env._used,V,O=U[0],M=false,X=U[U.length-1],W=K.config.bootstrap,P,R,N,Q=[],J=[],S=K.config.fetchCSS,T=function(d){if(b[d]){return;}var Y=Z[d],c,e,a;if(Y){b[d]=true;e=Y.details.requires;a=Y.details.use;}else{if(!YUI.Env._loaded[K.version][d]){Q.push(d);}else{b[d]=true;}}if(e){if(K.Lang.isString(e)){T(e);}else{for(c=0;c<e.length;c=c+1){T(e[c]);}}}J.push(d);},L;if(typeof X==="function"){U.pop();}else{X=null;}L=function(Y){Y=Y||{success:true,msg:"not dynamic"};if(X){X(K,Y);}if(K.fire){K.fire("yui:load",K,Y);}K._loading=false;if(K._useQueue&&K._useQueue.size()&&!K._loading){K.use.apply(K,K._useQueue.next());}};if(O==="*"){U=[];for(P in Z){if(Z.hasOwnProperty(P)){U.push(P);}}if(X){U.push(X);}return K.use.apply(K,U);}if(K.Loader){M=true;V=new K.Loader(K.config);V.require(U);V.ignoreRegistered=true;V.allowRollup=false;V.calculate(null,(S)?null:"js");U=V.sorted;}N=U.length;for(R=0;R<N;R=R+1){T(U[R]);}N=Q.length;if(N){Q=K.Object.keys(K.Array.hash(Q));}if(W&&N&&K.Loader){K._loading=true;V=new K.Loader(K.config);V.onSuccess=L;V.onFailure=L;V.onTimeout=L;V.context=K;V.attaching=U;V.require((S)?Q:U);V.insert(null,(S)?null:"js");}else{if(W&&N&&K.Get&&!K.Env.bootstrapped){K._loading=true;U=K.Array(arguments,0,true);K.Get.script(K.config.base+K.config.loaderPath,{onEnd:function(){K._loading=false;K.Env.bootstrapped=true;K._attach(["loader"]);K.use.apply(K,U);}});return K;}else{if(N){}K._attach(J);L();}}return K;},namespace:function(){var J=arguments,N=null,L,K,M;for(L=0;L<J.length;L=L+1){M=(""+J[L]).split(".");N=this;for(K=(M[0]=="YAHOO")?1:0;K<M.length;K=K+1){N[M[K]]=N[M[K]]||{};N=N[M[K]];}}return N;},log:function(){},error:function(K,J){if(this.config.throwFail){throw (J||new Error(K));}else{this.message(K,"error");}return this;},guid:function(J){var K=this.Env._guidp+(++this.Env._uidx);return(J)?(J+K):K;},stamp:function(L,M){if(!L){return L;}var J=(typeof L==="string")?L:L._yuid;if(!J){J=this.guid();if(!M){try{L._yuid=J;}catch(K){J=null;}}}return J;}};A=YUI.prototype;for(E in A){YUI[E]=A[E];}YUI._init();H(window,"load",D);YUI.Env.add=H;YUI.Env.remove=F;})();YUI.add("yui-base",function(B){function A(){this._init();this.add.apply(this,arguments);}A.prototype={_init:function(){this._q=[];},next:function(){return this._q.shift();},add:function(){B.Array.each(B.Array(arguments,0,true),function(C){this._q.push(C);},this);return this;},size:function(){return this._q.length;}};B.Queue=A;(function(){B.Lang=B.Lang||{};var R=B.Lang,G="array",I="boolean",D="date",M="error",S="function",H="number",K="null",F="object",O="regexp",N="string",C=Object.prototype.toString,P="undefined",E={"undefined":P,"number":H,"boolean":I,"string":N,"[object Function]":S,"[object RegExp]":O,"[object Array]":G,"[object Date]":D,"[object Error]":M},J=/^\s+|\s+$/g,Q="";R.isArray=function(L){return R.type(L)===G;};R.isBoolean=function(L){return typeof L===I;};R.isFunction=function(L){return R.type(L)===S;};R.isDate=function(L){return R.type(L)===D;};R.isNull=function(L){return L===null;};R.isNumber=function(L){return typeof L===H&&isFinite(L);};R.isObject=function(T,L){return(T&&(typeof T===F||(!L&&R.isFunction(T))))||false;};R.isString=function(L){return typeof L===N;};R.isUndefined=function(L){return typeof L===P;};R.trim=function(L){try{return L.replace(J,Q);}catch(T){return L;}};R.isValue=function(T){var L=R.type(T);
switch(L){case H:return isFinite(T);case K:case P:return false;default:return !!(L);}};R.type=function(L){return E[typeof L]||E[C.call(L)]||(L?F:K);};})();(function(){var C=B.Lang,D=Array.prototype,E=function(M,J,L){var I=(L)?2:B.Array.test(M),H,G,F;if(I){try{return D.slice.call(M,J||0);}catch(K){F=[];for(H=0,G=M.length;H<G;H=H+1){F.push(M[H]);}return F;}}else{return[M];}};B.Array=E;E.test=function(H){var F=0;if(C.isObject(H)){if(C.isArray(H)){F=1;}else{try{if("length" in H&&!("tagName" in H)&&!("alert" in H)&&(!B.Lang.isFunction(H.size)||H.size()>1)){F=2;}}catch(G){}}}return F;};E.each=(D.forEach)?function(F,G,H){D.forEach.call(F||[],G,H||B);return B;}:function(G,I,J){var F=(G&&G.length)||0,H;for(H=0;H<F;H=H+1){I.call(J||B,G[H],H,G);}return B;};E.hash=function(H,G){var K={},F=H.length,J=G&&G.length,I;for(I=0;I<F;I=I+1){K[H[I]]=(J&&J>I)?G[I]:true;}return K;};E.indexOf=(D.indexOf)?function(F,G){return D.indexOf.call(F,G);}:function(F,H){for(var G=0;G<F.length;G=G+1){if(F[G]===H){return G;}}return -1;};E.numericSort=function(G,F){return(G-F);};E.some=(D.some)?function(F,G,H){return D.some.call(F,G,H);}:function(G,I,J){var F=G.length,H;for(H=0;H<F;H=H+1){if(I.call(J,G[H],H,G)){return true;}}return false;};})();(function(){var D=B.Lang,C="__",E=function(H,G){var F=G.toString;if(D.isFunction(F)&&F!=Object.prototype.toString){H.toString=F;}};B.merge=function(){var G=arguments,I={},H,F=G.length;for(H=0;H<F;H=H+1){B.mix(I,G[H],true);}return I;};B.mix=function(F,O,H,N,L,M){if(!O||!F){return F||B;}if(L){switch(L){case 1:return B.mix(F.prototype,O.prototype,H,N,0,M);case 2:B.mix(F.prototype,O.prototype,H,N,0,M);break;case 3:return B.mix(F,O.prototype,H,N,0,M);case 4:return B.mix(F.prototype,O,H,N,0,M);default:}}var K=M&&D.isArray(F),J,I,G;if(N&&N.length){for(J=0,I=N.length;J<I;++J){G=N[J];if(G in O){if(M&&D.isObject(F[G],true)){B.mix(F[G],O[G]);}else{if(!K&&(H||!(G in F))){F[G]=O[G];}else{if(K){F.push(O[G]);}}}}}}else{for(J in O){if(M&&D.isObject(F[J],true)){B.mix(F[J],O[J]);}else{if(!K&&(H||!(J in F))){F[J]=O[J];}else{if(K){F.push(O[J]);}}}}if(B.UA.ie){E(F,O);}}return F;};B.cached=function(H,F,G){F=F||{};return function(L,K){var J=(K)?Array.prototype.join.call(arguments,C):L,I=F[J];if(!(J in F)||(G&&F[J]==G)){F[J]=H.apply(H,arguments);}return F[J];};};})();(function(){B.Object=function(H){var G=function(){};G.prototype=H;return new G();};var E=B.Object,D=undefined,C=function(J,I){var H=(I===2),F=(H)?0:[],G;for(G in J){if(H){F++;}else{if(J.hasOwnProperty(G)){F.push((I)?J[G]:G);}}}return F;};E.keys=function(F){return C(F);};E.values=function(F){return C(F,1);};E.size=function(F){return C(F,2);};E.hasKey=function(G,F){return(F in G);};E.hasValue=function(G,F){return(B.Array.indexOf(E.values(G),F)>-1);};E.owns=function(G,F){return(G.hasOwnProperty(F));};E.each=function(J,I,K,H){var G=K||B,F;for(F in J){if(H||J.hasOwnProperty(F)){I.call(G,J[F],F,J);}}return B;};E.getValue=function(J,I){var H=B.Array(I),F=H.length,G;for(G=0;J!==D&&G<F;G=G+1){J=J[H[G]];}return J;};E.setValue=function(L,J,K){var I=B.Array(J),H=I.length-1,F,G=L;if(H>=0){for(F=0;G!==D&&F<H;F=F+1){G=G[I[F]];}if(G!==D){G[I[F]]=K;}else{return D;}}return L;};})();B.UA=function(){var F=function(J){var K=0;return parseFloat(J.replace(/\./g,function(){return(K++==1)?"":".";}));},I=navigator,H={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0,caja:I.cajaVersion,secure:false,os:null},E=I&&I.userAgent,G=B.config.win.location,D=G&&G.href,C;H.secure=D&&(D.toLowerCase().indexOf("https")===0);if(E){if((/windows|win32/i).test(E)){H.os="windows";}else{if((/macintosh/i).test(E)){H.os="macintosh";}}if((/KHTML/).test(E)){H.webkit=1;}C=E.match(/AppleWebKit\/([^\s]*)/);if(C&&C[1]){H.webkit=F(C[1]);if(/ Mobile\//.test(E)){H.mobile="Apple";}else{C=E.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/);if(C){H.mobile=C[0];}}C=E.match(/AdobeAIR\/([^\s]*)/);if(C){H.air=C[0];}}if(!H.webkit){C=E.match(/Opera[\s\/]([^\s]*)/);if(C&&C[1]){H.opera=F(C[1]);C=E.match(/Opera Mini[^;]*/);if(C){H.mobile=C[0];}}else{C=E.match(/MSIE\s([^;]*)/);if(C&&C[1]){H.ie=F(C[1]);}else{C=E.match(/Gecko\/([^\s]*)/);if(C){H.gecko=1;C=E.match(/rv:([^\s\)]*)/);if(C&&C[1]){H.gecko=F(C[1]);}}}}}}return H;}();(function(){var F=["yui-base"],D,I=B.config,H=YUI.Env.mods,G,E;B.use.apply(B,F);if(I.core){D=I.core;}else{D=[];G=["get","loader","yui-log","yui-later"];for(E=0;E<G.length;E++){if(H[G[E]]){D.push(G[E]);}}}B.use.apply(B,D);})();},"3.0.0");YUI.add("get",function(A){(function(){var C=A.UA,B=A.Lang,E="text/javascript",F="text/css",D="stylesheet";A.Get=function(){var M={},K=0,U=false,W=function(a,X,b){var Y=b||A.config.win,c=Y.document,e=c.createElement(a),Z;for(Z in X){if(X[Z]&&X.hasOwnProperty(Z)){e.setAttribute(Z,X[Z]);}}return e;},T=function(Y,Z,X){var a={id:A.guid(),type:F,rel:D,href:Y};if(X){A.mix(a,X);}return W("link",a,Z);},S=function(Y,Z,X){var a={id:A.guid(),type:E,src:Y};if(X){A.mix(a,X);}return W("script",a,Z);},N=function(c){var X=M[c],Y,a,g,e,j,b,Z,f;if(X){Y=X.nodes;a=Y.length;g=X.win.document;e=g.getElementsByTagName("head")[0];if(X.insertBefore){j=L(X.insertBefore,c);if(j){e=j.parentNode;}}for(b=0;b<a;b=b+1){Z=Y[b];if(Z.clearAttributes){Z.clearAttributes();}else{for(f in Z){delete Z[f];}}e.removeChild(Z);}}X.nodes=[];},P=function(Y,Z,X){return{tId:Y.tId,win:Y.win,data:Y.data,nodes:Y.nodes,msg:Z,statusText:X,purge:function(){N(this.tId);}};},O=function(b,a,X){var Y=M[b],Z;if(Y&&Y.onEnd){Z=Y.context||Y;Y.onEnd.call(Z,P(Y,a,X));}},V=function(a,Z){var X=M[a],Y;if(X.timer){clearTimeout(X.timer);}if(X.onFailure){Y=X.context||X;X.onFailure.call(Y,P(X,Z));}O(a,Z,"failure");},L=function(X,a){var Y=M[a],Z=(B.isString(X))?Y.win.document.getElementById(X):X;if(!Z){V(a,"target node not found: "+X);}return Z;},I=function(a){var X=M[a],Z,Y;if(X.timer){clearTimeout(X.timer);}X.finished=true;if(X.aborted){Z="transaction "+a+" was aborted";V(a,Z);return;}if(X.onSuccess){Y=X.context||X;X.onSuccess.call(Y,P(X));}O(a,Z,"OK");},Q=function(Z){var X=M[Z],Y;if(X.onTimeout){Y=X.context||X;X.onTimeout.call(Y,P(X));
}O(Z,"timeout","timeout");},H=function(Z,c){var Y=M[Z],b,g,f,e,a,X,i;if(Y.timer){clearTimeout(Y.timer);}if(Y.aborted){b="transaction "+Z+" was aborted";V(Z,b);return;}if(c){Y.url.shift();if(Y.varName){Y.varName.shift();}}else{Y.url=(B.isString(Y.url))?[Y.url]:Y.url;if(Y.varName){Y.varName=(B.isString(Y.varName))?[Y.varName]:Y.varName;}}g=Y.win;f=g.document;e=f.getElementsByTagName("head")[0];if(Y.url.length===0){I(Z);return;}X=Y.url[0];if(!X){Y.url.shift();return H(Z);}if(Y.timeout){Y.timer=setTimeout(function(){Q(Z);},Y.timeout);}if(Y.type==="script"){a=S(X,g,Y.attributes);}else{a=T(X,g,Y.attributes);}J(Y.type,a,Z,X,g,Y.url.length);Y.nodes.push(a);if(Y.insertBefore){i=L(Y.insertBefore,Z);if(i){i.parentNode.insertBefore(a,i);}}else{e.appendChild(a);}if((C.webkit||C.gecko)&&Y.type==="css"){H(Z,X);}},G=function(){if(U){return;}U=true;var X,Y;for(X in M){if(M.hasOwnProperty(X)){Y=M[X];if(Y.autopurge&&Y.finished){N(Y.tId);delete M[X];}}}U=false;},R=function(Y,X,Z){Z=Z||{};var c="q"+(K++),a,b=Z.purgethreshold||A.Get.PURGE_THRESH;if(K%b===0){G();}M[c]=A.merge(Z,{tId:c,type:Y,url:X,finished:false,nodes:[]});a=M[c];a.win=a.win||A.config.win;a.context=a.context||a;a.autopurge=("autopurge" in a)?a.autopurge:(Y==="script")?true:false;if(Z.charset){a.attributes=a.attributes||{};a.attributes.charset=Z.charset;}setTimeout(function(){H(c);},0);return{tId:c};},J=function(Z,e,d,Y,c,b,X){var a=X||H;if(C.ie){e.onreadystatechange=function(){var f=this.readyState;if("loaded"===f||"complete"===f){e.onreadystatechange=null;a(d,Y);}};}else{if(C.webkit){if(Z==="script"){e.addEventListener("load",function(){a(d,Y);});}}else{e.onload=function(){a(d,Y);};e.onerror=function(f){V(d,f+": "+Y);};}}};return{PURGE_THRESH:20,_finalize:function(X){setTimeout(function(){I(X);},0);},abort:function(Y){var Z=(B.isString(Y))?Y:Y.tId,X=M[Z];if(X){X.aborted=true;}},script:function(X,Y){return R("script",X,Y);},css:function(X,Y){return R("css",X,Y);}};}();})();},"3.0.0");YUI.add("yui-log",function(A){(function(){var D=A,F="yui:log",B="undefined",C={debug:1,info:1,warn:1,error:1},E;D.log=function(I,Q,G,O){var H=D,P=H.config,K=false,N,L,J,M;if(P.debug){if(G){N=P.logExclude;L=P.logInclude;if(L&&!(G in L)){K=1;}else{if(N&&(G in N)){K=1;}}}if(!K){if(P.useBrowserConsole){J=(G)?G+": "+I:I;if(typeof console!=B&&console.log){M=(Q&&console[Q]&&(Q in C))?Q:"log";console[M](J);}else{if(typeof opera!=B){opera.postError(J);}}}if(H.fire&&!O){if(!E){H.publish(F,{broadcast:2,emitFacade:1});E=1;}H.fire(F,{msg:I,cat:Q,src:G});}}}return H;};D.message=function(){return D.log.apply(D,arguments);};})();},"3.0.0",{requires:["yui-base"]});YUI.add("yui-later",function(A){(function(){var B=A.Lang,C=function(K,E,L,G,H){K=K||0;E=E||{};var F=L,J=A.Array(G),I,D;if(B.isString(L)){F=E[L];}if(!F){}I=function(){F.apply(E,J);};D=(H)?setInterval(I,K):setTimeout(I,K);return{id:D,interval:H,cancel:function(){if(this.interval){clearInterval(D);}else{clearTimeout(D);}}};};A.later=C;B.later=C;})();},"3.0.0",{requires:["yui-base"]});YUI.add("yui",function(A){},"3.0.0",{use:["yui-base","get","yui-log","yui-later"]});
function clearForm() {
if(document.getElementById('search').value=='Search for Service'){
document.getElementById('search').value='';
}
if(document.getElementById('where').value=='Where?'){
document.getElementById('where').value='';
}
}

function clearSearchForm() {
if(search_form1.search.value=='Search for Service'){
search_form1.search.value='';
}
if(search_form1.where.value=='Where?'){
search_form1.where.value='';
}
}

function search_form_text_click(textinput) {
if(textinput.name=='search' && textinput.value=='Search for Service') { textinput.value=''; }
else if(textinput.name=='area' && textinput.value=='Where?') { textinput.value=''; }
else if(textinput.name=='where' && textinput.value=='Where?') { textinput.value=''; }
}

function ajaxLoader(url,id) {
el = document.getElementById(id);
if (el.innerHTML == ''){
Element.show(id);
el.innerHTML = '<div class="loading">Loading...</div>';
if (document.getElementById) {
var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
}
if (x) {
x.onreadystatechange = function() {
if (x.readyState == 4 && x.status == 200) {
el = document.getElementById(id);
el.innerHTML = x.responseText;
}
}
x.open("GET", url, true);
x.send(null);

}
}else{
Element.hide(id);
el.innerHTML = '';

}
}

function ajaxFormSubmit(url,formId,responseId){
var formRef=document.getElementById(formId);
var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
if (x) {

var postData ="company_email="+encodeURI(formRef.company_email.value)+
"&key="+encodeURI(formRef.key.value)+
"&your_name="+encodeURI(formRef.your_name.value)+
"&your_email="+encodeURI(formRef.your_email.value)+
"&subject="+encodeURI(formRef.subject.value)+
"&your_message="+encodeURI(formRef.your_message.value);

x.onreadystatechange = function() {
if (x.readyState == 4 && x.status == 200) {
result = x.responseText;
document.getElementById(responseId).innerHTML = result;
}/*else {
alert('There was a problem with the request.'+x.readyState+' '+x.status+' ');
}*/
};
x.open('POST', url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.setRequestHeader("Content-length", postData.length);
x.setRequestHeader("Connection", "close");
x.send(postData);
}

}

function ajaxPostForm(url,postData,responseId){

var x = (window.ActiveXObject) ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest();
if (x) {

x.onreadystatechange = function() {
if (x.readyState == 4 && x.status == 200) {
result = x.responseText;
document.getElementById(responseId).innerHTML = result;
}/*else {
alert('There was a problem with the request.'+x.readyState+' '+x.status+' ');
}*/
};
x.open('POST', url, true);
x.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
x.setRequestHeader("Content-length", postData.length);
x.setRequestHeader("Connection", "close");
x.send(postData);
}

}

var XMLHttp=null;
var target_area;

function GetXmlHttpObject(handler) {
var objXmlHttp = null;
if(navigator.userAgent.indexOf("MSIE")>=0) {
var strName="Msxml2.XMLHTTP";
if (navigator.appVersion.indexOf("MSIE 5.5")>=0) {
strName="Microsoft.XMLHTTP";
}
try {
objXmlHttp=new ActiveXObject(strName);
objXmlHttp.onreadystatechange=handler;
return objXmlHttp;
}catch(e){
//alert("Error. Scripting for ActiveX might be disabled");
return;
}
}else if(navigator.userAgent.indexOf("Mozilla")>=0 || navigator.userAgent.indexOf("Opera")>=0) {
objXmlHttp=new XMLHttpRequest();
objXmlHttp.onload=handler;
objXmlHttp.onerror=handler;
return objXmlHttp;
}
}

function show_hide(id) {
if(document.getElementById(id).style.display == "none"){
document.getElementById(id).style.display = "block";
}else{
document.getElementById(id).style.display = "none";
}
}
function relDropdown(container) {
show_hide('related-cats-footer');
show_hide('related-areas-footer');
}
function bookmarksite(){
 var urlAddress = "http://www.smilelocal.com";
 var pageName = "Smile Local Business Directory";
 if (document.all){
window.external.AddFavorite(urlAddress,pageName);
 } else if (window.sidebar){
window.sidebar.addPanel(pageName, urlAddress, "");
 }
}

/**
 * bt_c2c_popup
 *
 * This function displays the BT click to call popup
 *
 * @return void
 */
function bt_c2c_popup(e) {
if (e.stopPropagation) {
e.stopPropagation();
}
if (typeof(e.cancelBubble) != "undefined") {
e.cancelBubble = true;
}
if (e.preventDefault) {
e.preventDefault();
}
if (window.event) {
window.event.cancelBubble = true;
}
if (e.target && e.target.tagName == 'A') {
var href = e.target.href;
} else if (e.currentTarget && e.currentTarget.tagName == 'A') {
var href = e.currentTarget.href;
} else if (e.rangeParent && e.rangeParent.tagName == 'A') {
var href = e.rangeParent.href;
} else if (e.originalTarget && e.originalTarget.tagName == 'A') {
var href = e.originalTarget.href;
} else if (e.srcElement) {
var el = e.srcElement;
while(el && el.tagName != 'A') {
el = el.parentNode;
}
var href = el.href;
}
if (href) {
// Chrome includes the Location bar and window title bar in the width/height, so if it's Chrome, we have to compensate for this.
window_height = 410;
window_width = 430;
var popup_window = window.open(href, "bt_c2c_popup_window", "location=0, status=1, scrollbars=0, width=" + window_width + ", height=" + window_height);
return false;
}
return true;
}

/**
 * get_c2c_links
 *
 * This function gets all the click to call links
 *
 * @return Array The click to call links
 */
function get_c2c_links(c2c_class, c2c_tag) {
var links = new Array();
if (c2c_tag) {
var divs = document.body.getElementsByTagName(c2c_tag);
for (var i = 0; i < divs.length; i++) {
if (divs[i].className == c2c_class) {
links.push(divs[i].getElementsByTagName('a')[0]);
}
}
} else {
var as = document.body.getElementsByTagName('a');

for (var i = 0; i < as.length; i++) {
if (as[i].className == c2c_class) {
links.push(as[i]);
}
}
}
return links;
}

/**
 * set_c2c_events
 *
 * This function sets all the click to call links to have an event
 *
 * @return Array The click to call links
 */
function set_c2c_events(c2c_class, c2c_tag) {
var links = get_c2c_links(c2c_class, c2c_tag);
for (var i = 0; i < links.length; i++) {
if (links[i].addEventListener) {
links[i].addEventListener('click', bt_c2c_popup, true);
} else if (links[i].attachEvent) {
links[i].attachEvent('onclick', bt_c2c_popup);
}
}
}

/**
 * national_ads
 *
 * This method creates a block to populate the national ads section, with the TRT iframe.
 *
 * @return void
 */
function national_ads() {
 width = 468;
 height = 60;
 category_input = document.getElementById('search');
 if (category_input == undefined) {
 return;
 }
 key = category_input.value;
 nat_div = document.getElementById('nat_ads');

 if (nat_div != undefined && key.length > 0) {
// nat_div.style.width = '705px';
// nat_div.style.background = '#FC0 url(../../images/pri-l-bot.png) no-repeat bottom left';
// nat_div.style.padding = '0 0 4px';
// nat_div.style.margin = '0 0 12px 7px';
// nat_div.style.clear = 'both';
h3 = document.createElement('h3');
h3.appendChild(document.createTextNode("Category Sponsor"));
nat_div.appendChild(h3);
ad_wrap = document.createElement('div');
ad_wrap.setAttribute('id', 'ad-wrap');
nat_div.appendChild(ad_wrap);
iframe = document.createElement('iframe');
iframe.src = "http://adserver.adtech.de/adiframe/3.0/937/3240936/0/1/ADTECH;target=_blank;key=" + key;
iframe.width = width;
iframe.height = height;
iframe.scrolling = "No";
script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'http://adserver.adtech.de/addyn/3.0/937/3240936/0/1/ADTECH;loc=700;target=_blank;key=' + key;
iframe.setAttribute('frameBorder', '0');
iframe.setAttribute('marginHeight', '0');
iframe.setAttribute('marginWidth', '0');
// because IE6 is a pain...
iframe.style.cssText = 'border-width:0;padding:0;margin:0 118px;display:block;';
ad_wrap.appendChild(iframe);
 }
}
var man = null;
var lady = null;
var manIncrement = -1;
var ladyIncrement = +1;

function doMove() {
man.style.top = parseInt(man.style.top)+manIncrement+'px';
lady.style.top = parseInt(lady.style.top)+ladyIncrement+'px';
if (man.style.top === '290px'){manIncrement = +1;}
if (man.style.top === '310px'){manIncrement = -1;}
if (lady.style.top === '19px'){ladyIncrement = +1;}
if (lady.style.top === '41px'){ladyIncrement = -1;}
setTimeout(doMove,125);
}

function init() {
man = document.getElementById('man');
lady = document.getElementById('lady');
if(man && lady){
man.style.top = '300px';
lady.style.top = '26px';
doMove();
}
}

function detectBrowser() {
var browser = navigator.appName
//if (browser != "Microsoft Internet Explorer"){init();}
init();
}

window.onload = detectBrowser;
/* Prototype JavaScript framework, version 1.5.0
 * (c) 2005-2007 Sam Stephenson
 *
 * Prototype is freely distributable under the terms of an MIT-style license.
 * For details, see the Prototype web site: http://prototype.conio.net/
 *
/*--------------------------------------------------------------------------*/

var Prototype = {
 Version: '1.5.0',
 BrowserFeatures: {
 XPath: !!document.evaluate
 },

 ScriptFragment: '(?:<script.*?>)((\n|\r|.)*?)(?:<\/script>)',
 emptyFunction: function() {},
 K: function(x) { return x }
}

var Class = {
 create: function() {
 return function() {
 this.initialize.apply(this, arguments);
 }
 }
}

var Abstract = new Object();

Object.extend = function(destination, source) {
 for (var property in source) {
 destination[property] = source[property];
 }
 return destination;
}

Object.extend(Object, {
 inspect: function(object) {
 try {
 if (object === undefined) return 'undefined';
 if (object === null) return 'null';
 return object.inspect ? object.inspect() : object.toString();
 } catch (e) {
 if (e instanceof RangeError) return '...';
 throw e;
 }
 },

 keys: function(object) {
 var keys = [];
 for (var property in object)
 keys.push(property);
 return keys;
 },

 values: function(object) {
 var values = [];
 for (var property in object)
 values.push(object[property]);
 return values;
 },

 clone: function(object) {
 return Object.extend({}, object);
 }
});

Function.prototype.bind = function() {
 var __method = this, args = $A(arguments), object = args.shift();
 return function() {
 return __method.apply(object, args.concat($A(arguments)));
 }
}

Function.prototype.bindAsEventListener = function(object) {
 var __method = this, args = $A(arguments), object = args.shift();
 return function(event) {
 return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
 }
}

Object.extend(Number.prototype, {
 toColorPart: function() {
 var digits = this.toString(16);
 if (this < 16) return '0' + digits;
 return digits;
 },

 succ: function() {
 return this + 1;
 },

 times: function(iterator) {
 $R(0, this, true).each(iterator);
 return this;
 }
});

var Try = {
 these: function() {
 var returnValue;

 for (var i = 0, length = arguments.length; i < length; i++) {
 var lambda = arguments[i];
 try {
 returnValue = lambda();
 break;
 } catch (e) {}
 }

 return returnValue;
 }
}

/*--------------------------------------------------------------------------*/

var PeriodicalExecuter = Class.create();
PeriodicalExecuter.prototype = {
 initialize: function(callback, frequency) {
 this.callback = callback;
 this.frequency = frequency;
 this.currentlyExecuting = false;

 this.registerCallback();
 },

 registerCallback: function() {
 this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
 },

 stop: function() {
 if (!this.timer) return;
 clearInterval(this.timer);
 this.timer = null;
 },

 onTimerEvent: function() {
 if (!this.currentlyExecuting) {
 try {
 this.currentlyExecuting = true;
 this.callback(this);
 } finally {
 this.currentlyExecuting = false;
 }
 }
 }
}
String.interpret = function(value){
 return value == null ? '' : String(value);
}

Object.extend(String.prototype, {
 gsub: function(pattern, replacement) {
 var result = '', source = this, match;
 replacement = arguments.callee.prepareReplacement(replacement);

 while (source.length > 0) {
 if (match = source.match(pattern)) {
 result += source.slice(0, match.index);
 result += String.interpret(replacement(match));
 source = source.slice(match.index + match[0].length);
 } else {
 result += source, source = '';
 }
 }
 return result;
 },

 sub: function(pattern, replacement, count) {
 replacement = this.gsub.prepareReplacement(replacement);
 count = count === undefined ? 1 : count;

 return this.gsub(pattern, function(match) {
 if (--count < 0) return match[0];
 return replacement(match);
 });
 },

 scan: function(pattern, iterator) {
 this.gsub(pattern, iterator);
 return this;
 },

 truncate: function(length, truncation) {
 length = length || 30;
 truncation = truncation === undefined ? '...' : truncation;
 return this.length > length ?
 this.slice(0, length - truncation.length) + truncation : this;
 },

 strip: function() {
 return this.replace(/^\s+/, '').replace(/\s+$/, '');
 },

 stripTags: function() {
 return this.replace(/<\/?[^>]+>/gi, '');
 },

 stripScripts: function() {
 return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
 },

 extractScripts: function() {
 var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
 var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
 return (this.match(matchAll) || []).map(function(scriptTag) {
 return (scriptTag.match(matchOne) || ['', ''])[1];
 });
 },

 evalScripts: function() {
 return this.extractScripts().map(function(script) { return eval(script) });
 },

 escapeHTML: function() {
 var div = document.createElement('div');
 var text = document.createTextNode(this);
 div.appendChild(text);
 return div.innerHTML;
 },

 unescapeHTML: function() {
 var div = document.createElement('div');
 div.innerHTML = this.stripTags();
 return div.childNodes[0] ? (div.childNodes.length > 1 ?
 $A(div.childNodes).inject('',function(memo,node){ return memo+node.nodeValue }) :
 div.childNodes[0].nodeValue) : '';
 },

 toQueryParams: function(separator) {
 var match = this.strip().match(/([^?#]*)(#.*)?$/);
 if (!match) return {};

 return match[1].split(separator || '&').inject({}, function(hash, pair) {
 if ((pair = pair.split('='))[0]) {
 var name = decodeURIComponent(pair[0]);
 var value = pair[1] ? decodeURIComponent(pair[1]) : undefined;

 if (hash[name] !== undefined) {
 if (hash[name].constructor != Array)
 hash[name] = [hash[name]];
 if (value) hash[name].push(value);
 }
 else hash[name] = value;
 }
 return hash;
 });
 },

 toArray: function() {
 return this.split('');
 },

 succ: function() {
 return this.slice(0, this.length - 1) +
 String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
 },

 camelize: function() {
 var parts = this.split('-'), len = parts.length;
 if (len == 1) return parts[0];

 var camelized = this.charAt(0) == '-'
 ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
 : parts[0];

 for (var i = 1; i < len; i++)
 camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);

 return camelized;
 },

 capitalize: function(){
 return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
 },

 underscore: function() {
 return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
 },

 dasherize: function() {
 return this.gsub(/_/,'-');
 },

 inspect: function(useDoubleQuotes) {
 var escapedString = this.replace(/\\/g, '\\\\');
 if (useDoubleQuotes)
 return '"' + escapedString.replace(/"/g, '\\"') + '"';
 else
 return "'" + escapedString.replace(/'/g, '\\\'') + "'";
 }
});

String.prototype.gsub.prepareReplacement = function(replacement) {
 if (typeof replacement == 'function') return replacement;
 var template = new Template(replacement);
 return function(match) { return template.evaluate(match) };
}

String.prototype.parseQuery = String.prototype.toQueryParams;

var Template = Class.create();
Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
Template.prototype = {
 initialize: function(template, pattern) {
 this.template = template.toString();
 this.pattern = pattern || Template.Pattern;
 },

 evaluate: function(object) {
 return this.template.gsub(this.pattern, function(match) {
 var before = match[1];
 if (before == '\\') return match[2];
 return before + String.interpret(object[match[3]]);
 });
 }
}

var $break = new Object();
var $continue = new Object();

var Enumerable = {
 each: function(iterator) {
 var index = 0;
 try {
 this._each(function(value) {
 try {
 iterator(value, index++);
 } catch (e) {
 if (e != $continue) throw e;
 }
 });
 } catch (e) {
 if (e != $break) throw e;
 }
 return this;
 },

 eachSlice: function(number, iterator) {
 var index = -number, slices = [], array = this.toArray();
 while ((index += number) < array.length)
 slices.push(array.slice(index, index+number));
 return slices.map(iterator);
 },

 all: function(iterator) {
 var result = true;
 this.each(function(value, index) {
 result = result && !!(iterator || Prototype.K)(value, index);
 if (!result) throw $break;
 });
 return result;
 },

 any: function(iterator) {
 var result = false;
 this.each(function(value, index) {
 if (result = !!(iterator || Prototype.K)(value, index))
 throw $break;
 });
 return result;
 },

 collect: function(iterator) {
 var results = [];
 this.each(function(value, index) {
 results.push((iterator || Prototype.K)(value, index));
 });
 return results;
 },

 detect: function(iterator) {
 var result;
 this.each(function(value, index) {
 if (iterator(value, index)) {
 result = value;
 throw $break;
 }
 });
 return result;
 },

 findAll: function(iterator) {
 var results = [];
 this.each(function(value, index) {
 if (iterator(value, index))
 results.push(value);
 });
 return results;
 },

 grep: function(pattern, iterator) {
 var results = [];
 this.each(function(value, index) {
 var stringValue = value.toString();
 if (stringValue.match(pattern))
 results.push((iterator || Prototype.K)(value, index));
 })
 return results;
 },

 include: function(object) {
 var found = false;
 this.each(function(value) {
 if (value == object) {
 found = true;
 throw $break;
 }
 });
 return found;
 },

 inGroupsOf: function(number, fillWith) {
 fillWith = fillWith === undefined ? null : fillWith;
 return this.eachSlice(number, function(slice) {
 while(slice.length < number) slice.push(fillWith);
 return slice;
 });
 },

 inject: function(memo, iterator) {
 this.each(function(value, index) {
 memo = iterator(memo, value, index);
 });
 return memo;
 },

 invoke: function(method) {
 var args = $A(arguments).slice(1);
 return this.map(function(value) {
 return value[method].apply(value, args);
 });
 },

 max: function(iterator) {
 var result;
 this.each(function(value, index) {
 value = (iterator || Prototype.K)(value, index);
 if (result == undefined || value >= result)
 result = value;
 });
 return result;
 },

 min: function(iterator) {
 var result;
 this.each(function(value, index) {
 value = (iterator || Prototype.K)(value, index);
 if (result == undefined || value < result)
 result = value;
 });
 return result;
 },

 partition: function(iterator) {
 var trues = [], falses = [];
 this.each(function(value, index) {
 ((iterator || Prototype.K)(value, index) ?
 trues : falses).push(value);
 });
 return [trues, falses];
 },

 pluck: function(property) {
 var results = [];
 this.each(function(value, index) {
 results.push(value[property]);
 });
 return results;
 },

 reject: function(iterator) {
 var results = [];
 this.each(function(value, index) {
 if (!iterator(value, index))
 results.push(value);
 });
 return results;
 },

 sortBy: function(iterator) {
 return this.map(function(value, index) {
 return {value: value, criteria: iterator(value, index)};
 }).sort(function(left, right) {
 var a = left.criteria, b = right.criteria;
 return a < b ? -1 : a > b ? 1 : 0;
 }).pluck('value');
 },

 toArray: function() {
 return this.map();
 },

 zip: function() {
 var iterator = Prototype.K, args = $A(arguments);
 if (typeof args.last() == 'function')
 iterator = args.pop();

 var collections = [this].concat(args).map($A);
 return this.map(function(value, index) {
 return iterator(collections.pluck(index));
 });
 },

 size: function() {
 return this.toArray().length;
 },

 inspect: function() {
 return '#<Enumerable:' + this.toArray().inspect() + '>';
 }
}

Object.extend(Enumerable, {
 map: Enumerable.collect,
 find: Enumerable.detect,
 select: Enumerable.findAll,
 member: Enumerable.include,
 entries: Enumerable.toArray
});
var $A = Array.from = function(iterable) {
 if (!iterable) return [];
 if (iterable.toArray) {
 return iterable.toArray();
 } else {
 var results = [];
 for (var i = 0, length = iterable.length; i < length; i++)
 results.push(iterable[i]);
 return results;
 }
}

Object.extend(Array.prototype, Enumerable);

if (!Array.prototype._reverse)
 Array.prototype._reverse = Array.prototype.reverse;

Object.extend(Array.prototype, {
 _each: function(iterator) {
 for (var i = 0, length = this.length; i < length; i++)
 iterator(this[i]);
 },

 clear: function() {
 this.length = 0;
 return this;
 },

 first: function() {
 return this[0];
 },

 last: function() {
 return this[this.length - 1];
 },

 compact: function() {
 return this.select(function(value) {
 return value != null;
 });
 },

 flatten: function() {
 return this.inject([], function(array, value) {
 return array.concat(value && value.constructor == Array ?
 value.flatten() : [value]);
 });
 },

 without: function() {
 var values = $A(arguments);
 return this.select(function(value) {
 return !values.include(value);
 });
 },

 indexOf: function(object) {
 for (var i = 0, length = this.length; i < length; i++)
 if (this[i] == object) return i;
 return -1;
 },

 reverse: function(inline) {
 return (inline !== false ? this : this.toArray())._reverse();
 },

 reduce: function() {
 return this.length > 1 ? this : this[0];
 },

 uniq: function() {
 return this.inject([], function(array, value) {
 return array.include(value) ? array : array.concat([value]);
 });
 },

 clone: function() {
 return [].concat(this);
 },

 size: function() {
 return this.length;
 },

 inspect: function() {
 return '[' + this.map(Object.inspect).join(', ') + ']';
 }
});

Array.prototype.toArray = Array.prototype.clone;

function $w(string){
 string = string.strip();
 return string ? string.split(/\s+/) : [];
}

if(window.opera){
 Array.prototype.concat = function(){
 var array = [];
 for(var i = 0, length = this.length; i < length; i++) array.push(this[i]);
 for(var i = 0, length = arguments.length; i < length; i++) {
 if(arguments[i].constructor == Array) {
 for(var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
 array.push(arguments[i][j]);
 } else {
 array.push(arguments[i]);
 }
 }
 return array;
 }
}
var Hash = function(obj) {
 Object.extend(this, obj || {});
};

Object.extend(Hash, {
 toQueryString: function(obj) {
 var parts = [];

 this.prototype._each.call(obj, function(pair) {
 if (!pair.key) return;

 if (pair.value && pair.value.constructor == Array) {
 var values = pair.value.compact();
 if (values.length < 2) pair.value = values.reduce();
 else {
 key = encodeURIComponent(pair.key);
 values.each(function(value) {
 value = value != undefined ? encodeURIComponent(value) : '';
 parts.push(key + '=' + encodeURIComponent(value));
 });
 return;
 }
 }
 if (pair.value == undefined) pair[1] = '';
 parts.push(pair.map(encodeURIComponent).join('='));
 });

 return parts.join('&');
 }
});

Object.extend(Hash.prototype, Enumerable);
Object.extend(Hash.prototype, {
 _each: function(iterator) {
 for (var key in this) {
 var value = this[key];
 if (value && value == Hash.prototype[key]) continue;

 var pair = [key, value];
 pair.key = key;
 pair.value = value;
 iterator(pair);
 }
 },

 keys: function() {
 return this.pluck('key');
 },

 values: function() {
 return this.pluck('value');
 },

 merge: function(hash) {
 return $H(hash).inject(this, function(mergedHash, pair) {
 mergedHash[pair.key] = pair.value;
 return mergedHash;
 });
 },

 remove: function() {
 var result;
 for(var i = 0, length = arguments.length; i < length; i++) {
 var value = this[arguments[i]];
 if (value !== undefined){
 if (result === undefined) result = value;
 else {
 if (result.constructor != Array) result = [result];
 result.push(value)
 }
 }
 delete this[arguments[i]];
 }
 return result;
 },

 toQueryString: function() {
 return Hash.toQueryString(this);
 },

 inspect: function() {
 return '#<Hash:{' + this.map(function(pair) {
 return pair.map(Object.inspect).join(': ');
 }).join(', ') + '}>';
 }
});

function $H(object) {
 if (object && object.constructor == Hash) return object;
 return new Hash(object);
};
ObjectRange = Class.create();
Object.extend(ObjectRange.prototype, Enumerable);
Object.extend(ObjectRange.prototype, {
 initialize: function(start, end, exclusive) {
 this.start = start;
 this.end = end;
 this.exclusive = exclusive;
 },

 _each: function(iterator) {
 var value = this.start;
 while (this.include(value)) {
 iterator(value);
 value = value.succ();
 }
 },

 include: function(value) {
 if (value < this.start)
 return false;
 if (this.exclusive)
 return value < this.end;
 return value <= this.end;
 }
});

var $R = function(start, end, exclusive) {
 return new ObjectRange(start, end, exclusive);
}

var Ajax = {
 getTransport: function() {
 return Try.these(
 function() {return new XMLHttpRequest()},
 function() {return new ActiveXObject('Msxml2.XMLHTTP')},
 function() {return new ActiveXObject('Microsoft.XMLHTTP')}
 ) || false;
 },

 activeRequestCount: 0
}

Ajax.Responders = {
 responders: [],

 _each: function(iterator) {
 this.responders._each(iterator);
 },

 register: function(responder) {
 if (!this.include(responder))
 this.responders.push(responder);
 },

 unregister: function(responder) {
 this.responders = this.responders.without(responder);
 },

 dispatch: function(callback, request, transport, json) {
 this.each(function(responder) {
 if (typeof responder[callback] == 'function') {
 try {
 responder[callback].apply(responder, [request, transport, json]);
 } catch (e) {}
 }
 });
 }
};

Object.extend(Ajax.Responders, Enumerable);

Ajax.Responders.register({
 onCreate: function() {
 Ajax.activeRequestCount++;
 },
 onComplete: function() {
 Ajax.activeRequestCount--;
 }
});

Ajax.Base = function() {};
Ajax.Base.prototype = {
 setOptions: function(options) {
 this.options = {
 method: 'post',
 asynchronous: true,
 contentType: 'application/x-www-form-urlencoded',
 encoding: 'UTF-8',
 parameters: ''
 }
 Object.extend(this.options, options || {});

 this.options.method = this.options.method.toLowerCase();
 if (typeof this.options.parameters == 'string')
 this.options.parameters = this.options.parameters.toQueryParams();
 }
}

Ajax.Request = Class.create();
Ajax.Request.Events =
 ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

Ajax.Request.prototype = Object.extend(new Ajax.Base(), {
 _complete: false,

 initialize: function(url, options) {
 this.transport = Ajax.getTransport();
 this.setOptions(options);
 this.request(url);
 },

 request: function(url) {
 this.url = url;
 this.method = this.options.method;
 var params = this.options.parameters;

 if (!['get', 'post'].include(this.method)) {
 // simulate other verbs over post
 params['_method'] = this.method;
 this.method = 'post';
 }

 params = Hash.toQueryString(params);
 if (params && /Konqueror|Safari|KHTML/.test(navigator.userAgent)) params += '&_='

 // when GET, append parameters to URL
 if (this.method == 'get' && params)
 this.url += (this.url.indexOf('?') > -1 ? '&' : '?') + params;

 try {
 Ajax.Responders.dispatch('onCreate', this, this.transport);

 this.transport.open(this.method.toUpperCase(), this.url,
 this.options.asynchronous);

 if (this.options.asynchronous)
 setTimeout(function() { this.respondToReadyState(1) }.bind(this), 10);

 this.transport.onreadystatechange = this.onStateChange.bind(this);
 this.setRequestHeaders();

 var body = this.method == 'post' ? (this.options.postBody || params) : null;

 this.transport.send(body);

 /* Force Firefox to handle ready state 4 for synchronous requests */
 if (!this.options.asynchronous && this.transport.overrideMimeType)
 this.onStateChange();

 }
 catch (e) {
 this.dispatchException(e);
 }
 },

 onStateChange: function() {
 var readyState = this.transport.readyState;
 if (readyState > 1 && !((readyState == 4) && this._complete))
 this.respondToReadyState(this.transport.readyState);
 },

 setRequestHeaders: function() {
 var headers = {
 'X-Requested-With': 'XMLHttpRequest',
 'X-Prototype-Version': Prototype.Version,
 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
 };

 if (this.method == 'post') {
 headers['Content-type'] = this.options.contentType +
 (this.options.encoding ? '; charset=' + this.options.encoding : '');

 /* Force "Connection: close" for older Mozilla browsers to work
 * around a bug where XMLHttpRequest sends an incorrect
 * Content-length header. See Mozilla Bugzilla #246651.
 */
 if (this.transport.overrideMimeType &&
 (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
 headers['Connection'] = 'close';
 }

 // user-defined headers
 if (typeof this.options.requestHeaders == 'object') {
 var extras = this.options.requestHeaders;

 if (typeof extras.push == 'function')
 for (var i = 0, length = extras.length; i < length; i += 2)
 headers[extras[i]] = extras[i+1];
 else
 $H(extras).each(function(pair) { headers[pair.key] = pair.value });
 }

 for (var name in headers)
 this.transport.setRequestHeader(name, headers[name]);
 },

 success: function() {
 return !this.transport.status
 || (this.transport.status >= 200 && this.transport.status < 300);
 },

 respondToReadyState: function(readyState) {
 var state = Ajax.Request.Events[readyState];
 var transport = this.transport, json = this.evalJSON();

 if (state == 'Complete') {
 try {
 this._complete = true;
 (this.options['on' + this.transport.status]
 || this.options['on' + (this.success() ? 'Success' : 'Failure')]
 || Prototype.emptyFunction)(transport, json);
 } catch (e) {
 this.dispatchException(e);
 }

 if ((this.getHeader('Content-type') || 'text/javascript').strip().
 match(/^(text|application)\/(x-)?(java|ecma)script(;.*)?$/i))
 this.evalResponse();
 }

 try {
 (this.options['on' + state] || Prototype.emptyFunction)(transport, json);
 Ajax.Responders.dispatch('on' + state, this, transport, json);
 } catch (e) {
 this.dispatchException(e);
 }

 if (state == 'Complete') {
 // avoid memory leak in MSIE: clean up
 this.transport.onreadystatechange = Prototype.emptyFunction;
 }
 },

 getHeader: function(name) {
 try {
 return this.transport.getResponseHeader(name);
 } catch (e) { return null }
 },

 evalJSON: function() {
 try {
 var json = this.getHeader('X-JSON');
 return json ? eval('(' + json + ')') : null;
 } catch (e) { return null }
 },

 evalResponse: function() {
 try {
 return eval(this.transport.responseText);
 } catch (e) {
 this.dispatchException(e);
 }
 },

 dispatchException: function(exception) {
 (this.options.onException || Prototype.emptyFunction)(this, exception);
 Ajax.Responders.dispatch('onException', this, exception);
 }
});

Ajax.Updater = Class.create();

Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), {
 initialize: function(container, url, options) {
 this.container = {
 success: (container.success || container),
 failure: (container.failure || (container.success ? null : container))
 }

 this.transport = Ajax.getTransport();
 this.setOptions(options);

 var onComplete = this.options.onComplete || Prototype.emptyFunction;
 this.options.onComplete = (function(transport, param) {
 this.updateContent();
 onComplete(transport, param);
 }).bind(this);

 this.request(url);
 },

 updateContent: function() {
 var receiver = this.container[this.success() ? 'success' : 'failure'];
 var response = this.transport.responseText;

 if (!this.options.evalScripts) response = response.stripScripts();

 if (receiver = $(receiver)) {
 if (this.options.insertion)
 new this.options.insertion(receiver, response);
 else
 receiver.update(response);
 }

 if (this.success()) {
 if (this.onComplete)
 setTimeout(this.onComplete.bind(this), 10);
 }
 }
});

Ajax.PeriodicalUpdater = Class.create();
Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), {
 initialize: function(container, url, options) {
 this.setOptions(options);
 this.onComplete = this.options.onComplete;

 this.frequency = (this.options.frequency || 2);
 this.decay = (this.options.decay || 1);

 this.updater = {};
 this.container = container;
 this.url = url;

 this.start();
 },

 start: function() {
 this.options.onComplete = this.updateComplete.bind(this);
 this.onTimerEvent();
 },

 stop: function() {
 this.updater.options.onComplete = undefined;
 clearTimeout(this.timer);
 (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
 },

 updateComplete: function(request) {
 if (this.options.decay) {
 this.decay = (request.responseText == this.lastText ?
 this.decay * this.options.decay : 1);

 this.lastText = request.responseText;
 }
 this.timer = setTimeout(this.onTimerEvent.bind(this),
 this.decay * this.frequency * 1000);
 },

 onTimerEvent: function() {
 this.updater = new Ajax.Updater(this.container, this.url, this.options);
 }
});
function $(element) {
 if (arguments.length > 1) {
 for (var i = 0, elements = [], length = arguments.length; i < length; i++)
 elements.push($(arguments[i]));
 return elements;
 }
 if (typeof element == 'string')
 element = document.getElementById(element);
 return Element.extend(element);
}

if (Prototype.BrowserFeatures.XPath) {
 document._getElementsByXPath = function(expression, parentElement) {
 var results = [];
 var query = document.evaluate(expression, $(parentElement) || document,
 null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
 for (var i = 0, length = query.snapshotLength; i < length; i++)
 results.push(query.snapshotItem(i));
 return results;
 };
}

document.getElementsByClassName = function(className, parentElement) {
 if (Prototype.BrowserFeatures.XPath) {
 var q = ".//*[contains(concat(' ', @class, ' '), ' " + className + " ')]";
 return document._getElementsByXPath(q, parentElement);
 } else {
 var children = ($(parentElement) || document.body).getElementsByTagName('*');
 var elements = [], child;
 for (var i = 0, length = children.length; i < length; i++) {
 child = children[i];
 if (Element.hasClassName(child, className))
 elements.push(Element.extend(child));
 }
 return elements;
 }
};

/*--------------------------------------------------------------------------*/

if (!window.Element)
 var Element = new Object();

Element.extend = function(element) {
 if (!element || _nativeExtensions || element.nodeType == 3) return element;

 if (!element._extended && element.tagName && element != window) {
 var methods = Object.clone(Element.Methods), cache = Element.extend.cache;

 if (element.tagName == 'FORM')
 Object.extend(methods, Form.Methods);
 if (['INPUT', 'TEXTAREA', 'SELECT'].include(element.tagName))
 Object.extend(methods, Form.Element.Methods);

 Object.extend(methods, Element.Methods.Simulated);

 for (var property in methods) {
 var value = methods[property];
 if (typeof value == 'function' && !(property in element))
 element[property] = cache.findOrStore(value);
 }
 }

 element._extended = true;
 return element;
};

Element.extend.cache = {
 findOrStore: function(value) {
 return this[value] = this[value] || function() {
 return value.apply(null, [this].concat($A(arguments)));
 }
 }
};

Element.Methods = {
 visible: function(element) {
 return $(element).style.display != 'none';
 },

 toggle: function(element) {
 element = $(element);
 Element[Element.visible(element) ? 'hide' : 'show'](element);
 return element;
 },

 hide: function(element) {
 $(element).style.display = 'none';
 return element;
 },

 show: function(element) {
 $(element).style.display = '';
 return element;
 },

 remove: function(element) {
 element = $(element);
 element.parentNode.removeChild(element);
 return element;
 },

 update: function(element, html) {
 html = typeof html == 'undefined' ? '' : html.toString();
 $(element).innerHTML = html.stripScripts();
 setTimeout(function() {html.evalScripts()}, 10);
 return element;
 },

 replace: function(element, html) {
 element = $(element);
 html = typeof html == 'undefined' ? '' : html.toString();
 if (element.outerHTML) {
 element.outerHTML = html.stripScripts();
 } else {
 var range = element.ownerDocument.createRange();
 range.selectNodeContents(element);
 element.parentNode.replaceChild(
 range.createContextualFragment(html.stripScripts()), element);
 }
 setTimeout(function() {html.evalScripts()}, 10);
 return element;
 },

 inspect: function(element) {
 element = $(element);
 var result = '<' + element.tagName.toLowerCase();
 $H({'id': 'id', 'className': 'class'}).each(function(pair) {
 var property = pair.first(), attribute = pair.last();
 var value = (element[property] || '').toString();
 if (value) result += ' ' + attribute + '=' + value.inspect(true);
 });
 return result + '>';
 },

 recursivelyCollect: function(element, property) {
 element = $(element);
 var elements = [];
 while (element = element[property])
 if (element.nodeType == 1)
 elements.push(Element.extend(element));
 return elements;
 },

 ancestors: function(element) {
 return $(element).recursivelyCollect('parentNode');
 },

 descendants: function(element) {
 return $A($(element).getElementsByTagName('*'));
 },

 immediateDescendants: function(element) {
 if (!(element = $(element).firstChild)) return [];
 while (element && element.nodeType != 1) element = element.nextSibling;
 if (element) return [element].concat($(element).nextSiblings());
 return [];
 },

 previousSiblings: function(element) {
 return $(element).recursivelyCollect('previousSibling');
 },

 nextSiblings: function(element) {
 return $(element).recursivelyCollect('nextSibling');
 },

 siblings: function(element) {
 element = $(element);
 return element.previousSiblings().reverse().concat(element.nextSiblings());
 },

 match: function(element, selector) {
 if (typeof selector == 'string')
 selector = new Selector(selector);
 return selector.match($(element));
 },

 up: function(element, expression, index) {
 return Selector.findElement($(element).ancestors(), expression, index);
 },

 down: function(element, expression, index) {
 return Selector.findElement($(element).descendants(), expression, index);
 },

 previous: function(element, expression, index) {
 return Selector.findElement($(element).previousSiblings(), expression, index);
 },

 next: function(element, expression, index) {
 return Selector.findElement($(element).nextSiblings(), expression, index);
 },

 getElementsBySelector: function() {
 var args = $A(arguments), element = $(args.shift());
 return Selector.findChildElements(element, args);
 },

 getElementsByClassName: function(element, className) {
 return document.getElementsByClassName(className, element);
 },

 readAttribute: function(element, name) {
 element = $(element);
 if (document.all && !window.opera) {
 var t = Element._attributeTranslations;
 if (t.values[name]) return t.values[name](element, name);
 if (t.names[name]) name = t.names[name];
 var attribute = element.attributes[name];
 if(attribute) return attribute.nodeValue;
 }
 return element.getAttribute(name);
 },

 getHeight: function(element) {
 return $(element).getDimensions().height;
 },

 getWidth: function(element) {
 return $(element).getDimensions().width;
 },

 classNames: function(element) {
 return new Element.ClassNames(element);
 },

 hasClassName: function(element, className) {
 if (!(element = $(element))) return;
 var elementClassName = element.className;
 if (elementClassName.length == 0) return false;
 if (elementClassName == className ||
 elementClassName.match(new RegExp("(^|\\s)" + className + "(\\s|$)")))
 return true;
 return false;
 },

 addClassName: function(element, className) {
 if (!(element = $(element))) return;
 Element.classNames(element).add(className);
 return element;
 },

 removeClassName: function(element, className) {
 if (!(element = $(element))) return;
 Element.classNames(element).remove(className);
 return element;
 },

 toggleClassName: function(element, className) {
 if (!(element = $(element))) return;
 Element.classNames(element)[element.hasClassName(className) ? 'remove' : 'add'](className);
 return element;
 },

 observe: function() {
 Event.observe.apply(Event, arguments);
 return $A(arguments).first();
 },

 stopObserving: function() {
 Event.stopObserving.apply(Event, arguments);
 return $A(arguments).first();
 },

 // removes whitespace-only text node children
 cleanWhitespace: function(element) {
 element = $(element);
 var node = element.firstChild;
 while (node) {
 var nextNode = node.nextSibling;
 if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
 element.removeChild(node);
 node = nextNode;
 }
 return element;
 },

 empty: function(element) {
 return $(element).innerHTML.match(/^\s*$/);
 },

 descendantOf: function(element, ancestor) {
 element = $(element), ancestor = $(ancestor);
 while (element = element.parentNode)
 if (element == ancestor) return true;
 return false;
 },

 scrollTo: function(element) {
 element = $(element);
 var pos = Position.cumulativeOffset(element);
 window.scrollTo(pos[0], pos[1]);
 return element;
 },

 getStyle: function(element, style) {
 element = $(element);
 if (['float','cssFloat'].include(style))
 style = (typeof element.style.styleFloat != 'undefined' ? 'styleFloat' : 'cssFloat');
 style = style.camelize();
 var value = element.style[style];
 if (!value) {
 if (document.defaultView && document.defaultView.getComputedStyle) {
 var css = document.defaultView.getComputedStyle(element, null);
 value = css ? css[style] : null;
 } else if (element.currentStyle) {
 value = element.currentStyle[style];
 }
 }

 if((value == 'auto') && ['width','height'].include(style) && (element.getStyle('display') != 'none'))
 value = element['offset'+style.capitalize()] + 'px';

 if (window.opera && ['left', 'top', 'right', 'bottom'].include(style))
 if (Element.getStyle(element, 'position') == 'static') value = 'auto';
 if(style == 'opacity') {
 if(value) return parseFloat(value);
 if(value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
 if(value[1]) return parseFloat(value[1]) / 100;
 return 1.0;
 }
 return value == 'auto' ? null : value;
 },

 setStyle: function(element, style) {
 element = $(element);
 for (var name in style) {
 var value = style[name];
 if(name == 'opacity') {
 if (value == 1) {
 value = (/Gecko/.test(navigator.userAgent) &&
 !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? 0.999999 : 1.0;
 if(/MSIE/.test(navigator.userAgent) && !window.opera)
 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
 } else if(value === '') {
 if(/MSIE/.test(navigator.userAgent) && !window.opera)
 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'');
 } else {
 if(value < 0.00001) value = 0;
 if(/MSIE/.test(navigator.userAgent) && !window.opera)
 element.style.filter = element.getStyle('filter').replace(/alpha\([^\)]*\)/gi,'') +
 'alpha(opacity='+value*100+')';
 }
 } else if(['float','cssFloat'].include(name)) name = (typeof element.style.styleFloat != 'undefined') ? 'styleFloat' : 'cssFloat';
 element.style[name.camelize()] = value;
 }
 return element;
 },

 getDimensions: function(element) {
 element = $(element);
 var display = $(element).getStyle('display');
 if (display != 'none' && display != null) // Safari bug
 return {width: element.offsetWidth, height: element.offsetHeight};

 // All *Width and *Height properties give 0 on elements with display none,
 // so enable the element temporarily
 var els = element.style;
 var originalVisibility = els.visibility;
 var originalPosition = els.position;
 var originalDisplay = els.display;
 els.visibility = 'hidden';
 els.position = 'absolute';
 els.display = 'block';
 var originalWidth = element.clientWidth;
 var originalHeight = element.clientHeight;
 els.display = originalDisplay;
 els.position = originalPosition;
 els.visibility = originalVisibility;
 return {width: originalWidth, height: originalHeight};
 },

 makePositioned: function(element) {
 element = $(element);
 var pos = Element.getStyle(element, 'position');
 if (pos == 'static' || !pos) {
 element._madePositioned = true;
 element.style.position = 'relative';
 // Opera returns the offset relative to the positioning context, when an
 // element is position relative but top and left have not been defined
 if (window.opera) {
 element.style.top = 0;
 element.style.left = 0;
 }
 }
 return element;
 },

 undoPositioned: function(element) {
 element = $(element);
 if (element._madePositioned) {
 element._madePositioned = undefined;
 element.style.position =
 element.style.top =
 element.style.left =
 element.style.bottom =
 element.style.right = '';
 }
 return element;
 },

 makeClipping: function(element) {
 element = $(element);
 if (element._overflow) return element;
 element._overflow = element.style.overflow || 'auto';
 if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden')
 element.style.overflow = 'hidden';
 return element;
 },

 undoClipping: function(element) {
 element = $(element);
 if (!element._overflow) return element;
 element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
 element._overflow = null;
 return element;
 }
};

Object.extend(Element.Methods, {childOf: Element.Methods.descendantOf});

Element._attributeTranslations = {};

Element._attributeTranslations.names = {
 colspan: "colSpan",
 rowspan: "rowSpan",
 valign: "vAlign",
 datetime: "dateTime",
 accesskey: "accessKey",
 tabindex: "tabIndex",
 enctype: "encType",
 maxlength: "maxLength",
 readonly: "readOnly",
 longdesc: "longDesc"
};

Element._attributeTranslations.values = {
 _getAttr: function(element, attribute) {
 return element.getAttribute(attribute, 2);
 },

 _flag: function(element, attribute) {
 return $(element).hasAttribute(attribute) ? attribute : null;
 },

 style: function(element) {
 return element.style.cssText.toLowerCase();
 },

 title: function(element) {
 var node = element.getAttributeNode('title');
 return node.specified ? node.nodeValue : null;
 }
};

Object.extend(Element._attributeTranslations.values, {
 href: Element._attributeTranslations.values._getAttr,
 src: Element._attributeTranslations.values._getAttr,
 disabled: Element._attributeTranslations.values._flag,
 checked: Element._attributeTranslations.values._flag,
 readonly: Element._attributeTranslations.values._flag,
 multiple: Element._attributeTranslations.values._flag
});

Element.Methods.Simulated = {
 hasAttribute: function(element, attribute) {
 var t = Element._attributeTranslations;
 attribute = t.names[attribute] || attribute;
 return $(element).getAttributeNode(attribute).specified;
 }
};

// IE is missing .innerHTML support for TABLE-related elements
if (document.all && !window.opera){
 Element.Methods.update = function(element, html) {
 element = $(element);
 html = typeof html == 'undefined' ? '' : html.toString();
 var tagName = element.tagName.toUpperCase();
 if (['THEAD','TBODY','TR','TD'].include(tagName)) {
 var div = document.createElement('div');
 switch (tagName) {
 case 'THEAD':
 case 'TBODY':
 div.innerHTML = '<table><tbody>' + html.stripScripts() + '</tbody></table>';
 depth = 2;
 break;
 case 'TR':
 div.innerHTML = '<table><tbody><tr>' + html.stripScripts() + '</tr></tbody></table>';
 depth = 3;
 break;
 case 'TD':
 div.innerHTML = '<table><tbody><tr><td>' + html.stripScripts() + '</td></tr></tbody></table>';
 depth = 4;
 }
 $A(element.childNodes).each(function(node){
 element.removeChild(node)
 });
 depth.times(function(){ div = div.firstChild });

 $A(div.childNodes).each(
 function(node){ element.appendChild(node) });
 } else {
 element.innerHTML = html.stripScripts();
 }
 setTimeout(function() {html.evalScripts()}, 10);
 return element;
 }
};

Object.extend(Element, Element.Methods);

var _nativeExtensions = false;

if(/Konqueror|Safari|KHTML/.test(navigator.userAgent))
 ['', 'Form', 'Input', 'TextArea', 'Select'].each(function(tag) {
 var className = 'HTML' + tag + 'Element';
 if(window[className]) return;
 var klass = window[className] = {};
 klass.prototype = document.createElement(tag ? tag.toLowerCase() : 'div').__proto__;
 });

Element.addMethods = function(methods) {
 Object.extend(Element.Methods, methods || {});

 function copy(methods, destination, onlyIfAbsent) {
 onlyIfAbsent = onlyIfAbsent || false;
 var cache = Element.extend.cache;
 for (var property in methods) {
 var value = methods[property];
 if (!onlyIfAbsent || !(property in destination))
 destination[property] = cache.findOrStore(value);
 }
 }

 if (typeof HTMLElement != 'undefined') {
 copy(Element.Methods, HTMLElement.prototype);
 copy(Element.Methods.Simulated, HTMLElement.prototype, true);
 copy(Form.Methods, HTMLFormElement.prototype);
 [HTMLInputElement, HTMLTextAreaElement, HTMLSelectElement].each(function(klass) {
 copy(Form.Element.Methods, klass.prototype);
 });
 _nativeExtensions = true;
 }
}

var Toggle = new Object();
Toggle.display = Element.toggle;

/*--------------------------------------------------------------------------*/

Abstract.Insertion = function(adjacency) {
 this.adjacency = adjacency;
}

Abstract.Insertion.prototype = {
 initialize: function(element, content) {
 this.element = $(element);
 this.content = content.stripScripts();

 if (this.adjacency && this.element.insertAdjacentHTML) {
 try {
 this.element.insertAdjacentHTML(this.adjacency, this.content);
 } catch (e) {
 var tagName = this.element.tagName.toUpperCase();
 if (['TBODY', 'TR'].include(tagName)) {
 this.insertContent(this.contentFromAnonymousTable());
 } else {
 throw e;
 }
 }
 } else {
 this.range = this.element.ownerDocument.createRange();
 if (this.initializeRange) this.initializeRange();
 this.insertContent([this.range.createContextualFragment(this.content)]);
 }

 setTimeout(function() {content.evalScripts()}, 10);
 },

 contentFromAnonymousTable: function() {
 var div = document.createElement('div');
 div.innerHTML = '<table><tbody>' + this.content + '</tbody></table>';
 return $A(div.childNodes[0].childNodes[0].childNodes);
 }
}

var Insertion = new Object();

Insertion.Before = Class.create();
Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), {
 initializeRange: function() {
 this.range.setStartBefore(this.element);
 },

 insertContent: function(fragments) {
 fragments.each((function(fragment) {
 this.element.parentNode.insertBefore(fragment, this.element);
 }).bind(this));
 }
});

Insertion.Top = Class.create();
Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), {
 initializeRange: function() {
 this.range.selectNodeContents(this.element);
 this.range.collapse(true);
 },

 insertContent: function(fragments) {
 fragments.reverse(false).each((function(fragment) {
 this.element.insertBefore(fragment, this.element.firstChild);
 }).bind(this));
 }
});

Insertion.Bottom = Class.create();
Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), {
 initializeRange: function() {
 this.range.selectNodeContents(this.element);
 this.range.collapse(this.element);
 },

 insertContent: function(fragments) {
 fragments.each((function(fragment) {
 this.element.appendChild(fragment);
 }).bind(this));
 }
});

Insertion.After = Class.create();
Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), {
 initializeRange: function() {
 this.range.setStartAfter(this.element);
 },

 insertContent: function(fragments) {
 fragments.each((function(fragment) {
 this.element.parentNode.insertBefore(fragment,
 this.element.nextSibling);
 }).bind(this));
 }
});

/*--------------------------------------------------------------------------*/

Element.ClassNames = Class.create();
Element.ClassNames.prototype = {
 initialize: function(element) {
 this.element = $(element);
 },

 _each: function(iterator) {
 this.element.className.split(/\s+/).select(function(name) {
 return name.length > 0;
 })._each(iterator);
 },

 set: function(className) {
 this.element.className = className;
 },

 add: function(classNameToAdd) {
 if (this.include(classNameToAdd)) return;
 this.set($A(this).concat(classNameToAdd).join(' '));
 },

 remove: function(classNameToRemove) {
 if (!this.include(classNameToRemove)) return;
 this.set($A(this).without(classNameToRemove).join(' '));
 },

 toString: function() {
 return $A(this).join(' ');
 }
};

Object.extend(Element.ClassNames.prototype, Enumerable);
var Selector = Class.create();
Selector.prototype = {
 initialize: function(expression) {
 this.params = {classNames: []};
 this.expression = expression.toString().strip();
 this.parseExpression();
 this.compileMatcher();
 },

 parseExpression: function() {
 function abort(message) { throw 'Parse error in selector: ' + message; }

 if (this.expression == '') abort('empty expression');

 var params = this.params, expr = this.expression, match, modifier, clause, rest;
 while (match = expr.match(/^(.*)\[([a-z0-9_:-]+?)(?:([~\|!]?=)(?:"([^"]*)"|([^\]\s]*)))?\]$/i)) {
 params.attributes = params.attributes || [];
 params.attributes.push({name: match[2], operator: match[3], value: match[4] || match[5] || ''});
 expr = match[1];
 }

 if (expr == '*') return this.params.wildcard = true;

 while (match = expr.match(/^([^a-z0-9_-])?([a-z0-9_-]+)(.*)/i)) {
 modifier = match[1], clause = match[2], rest = match[3];
 switch (modifier) {
 case '#': params.id = clause; break;
 case '.': params.classNames.push(clause); break;
 case '':
 case undefined: params.tagName = clause.toUpperCase(); break;
 default: abort(expr.inspect());
 }
 expr = rest;
 }

 if (expr.length > 0) abort(expr.inspect());
 },

 buildMatchExpression: function() {
 var params = this.params, conditions = [], clause;

 if (params.wildcard)
 conditions.push('true');
 if (clause = params.id)
 conditions.push('element.readAttribute("id") == ' + clause.inspect());
 if (clause = params.tagName)
 conditions.push('element.tagName.toUpperCase() == ' + clause.inspect());
 if ((clause = params.classNames).length > 0)
 for (var i = 0, length = clause.length; i < length; i++)
 conditions.push('element.hasClassName(' + clause[i].inspect() + ')');
 if (clause = params.attributes) {
 clause.each(function(attribute) {
 var value = 'element.readAttribute(' + attribute.name.inspect() + ')';
 var splitValueBy = function(delimiter) {
 return value + ' && ' + value + '.split(' + delimiter.inspect() + ')';
 }

 switch (attribute.operator) {
 case '=': conditions.push(value + ' == ' + attribute.value.inspect()); break;
 case '~=': conditions.push(splitValueBy(' ') + '.include(' + attribute.value.inspect() + ')'); break;
 case '|=': conditions.push(
 splitValueBy('-') + '.first().toUpperCase() == ' + attribute.value.toUpperCase().inspect()
 ); break;
 case '!=': conditions.push(value + ' != ' + attribute.value.inspect()); break;
 case '':
 case undefined: conditions.push('element.hasAttribute(' + attribute.name.inspect() + ')'); break;
 default: throw 'Unknown operator ' + attribute.operator + ' in selector';
 }
 });
 }

 return conditions.join(' && ');
 },

 compileMatcher: function() {
 this.match = new Function('element', 'if (!element.tagName) return false; \
 element = $(element); \
 return ' + this.buildMatchExpression());
 },

 findElements: function(scope) {
 var element;

 if (element = $(this.params.id))
 if (this.match(element))
 if (!scope || Element.childOf(element, scope))
 return [element];

 scope = (scope || document).getElementsByTagName(this.params.tagName || '*');

 var results = [];
 for (var i = 0, length = scope.length; i < length; i++)
 if (this.match(element = scope[i]))
 results.push(Element.extend(element));

 return results;
 },

 toString: function() {
 return this.expression;
 }
}

Object.extend(Selector, {
 matchElements: function(elements, expression) {
 var selector = new Selector(expression);
 return elements.select(selector.match.bind(selector)).map(Element.extend);
 },

 findElement: function(elements, expression, index) {
 if (typeof expression == 'number') index = expression, expression = false;
 return Selector.matchElements(elements, expression || '*')[index || 0];
 },

 findChildElements: function(element, expressions) {
 return expressions.map(function(expression) {
 return expression.match(/[^\s"]+(?:"[^"]*"[^\s"]+)*/g).inject([null], function(results, expr) {
 var selector = new Selector(expr);
 return results.inject([], function(elements, result) {
 return elements.concat(selector.findElements(result || element));
 });
 });
 }).flatten();
 }
});

function $$() {
 return Selector.findChildElements(document, $A(arguments));
}
var Form = {
 reset: function(form) {
 $(form).reset();
 return form;
 },

 serializeElements: function(elements, getHash) {
 var data = elements.inject({}, function(result, element) {
 if (!element.disabled && element.name) {
 var key = element.name, value = $(element).getValue();
 if (value != undefined) {
 if (result[key]) {
 if (result[key].constructor != Array) result[key] = [result[key]];
 result[key].push(value);
 }
 else result[key] = value;
 }
 }
 return result;
 });

 return getHash ? data : Hash.toQueryString(data);
 }
};

Form.Methods = {
 serialize: function(form, getHash) {
 return Form.serializeElements(Form.getElements(form), getHash);
 },

 getElements: function(form) {
 return $A($(form).getElementsByTagName('*')).inject([],
 function(elements, child) {
 if (Form.Element.Serializers[child.tagName.toLowerCase()])
 elements.push(Element.extend(child));
 return elements;
 }
 );
 },

 getInputs: function(form, typeName, name) {
 form = $(form);
 var inputs = form.getElementsByTagName('input');

 if (!typeName && !name) return $A(inputs).map(Element.extend);

 for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
 var input = inputs[i];
 if ((typeName && input.type != typeName) || (name && input.name != name))
 continue;
 matchingInputs.push(Element.extend(input));
 }

 return matchingInputs;
 },

 disable: function(form) {
 form = $(form);
 form.getElements().each(function(element) {
 element.blur();
 element.disabled = 'true';
 });
 return form;
 },

 enable: function(form) {
 form = $(form);
 form.getElements().each(function(element) {
 element.disabled = '';
 });
 return form;
 },

 findFirstElement: function(form) {
 return $(form).getElements().find(function(element) {
 return element.type != 'hidden' && !element.disabled &&
 ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
 });
 },

 focusFirstElement: function(form) {
 form = $(form);
 form.findFirstElement().activate();
 return form;
 }
}

Object.extend(Form, Form.Methods);

/*--------------------------------------------------------------------------*/

Form.Element = {
 focus: function(element) {
 $(element).focus();
 return element;
 },

 select: function(element) {
 $(element).select();
 return element;
 }
}

Form.Element.Methods = {
 serialize: function(element) {
 element = $(element);
 if (!element.disabled && element.name) {
 var value = element.getValue();
 if (value != undefined) {
 var pair = {};
 pair[element.name] = value;
 return Hash.toQueryString(pair);
 }
 }
 return '';
 },

 getValue: function(element) {
 element = $(element);
 var method = element.tagName.toLowerCase();
 return Form.Element.Serializers[method](element);
 },

 clear: function(element) {
 $(element).value = '';
 return element;
 },

 present: function(element) {
 return $(element).value != '';
 },

 activate: function(element) {
 element = $(element);
 element.focus();
 if (element.select && ( element.tagName.toLowerCase() != 'input' ||
 !['button', 'reset', 'submit'].include(element.type) ) )
 element.select();
 return element;
 },

 disable: function(element) {
 element = $(element);
 element.disabled = true;
 return element;
 },

 enable: function(element) {
 element = $(element);
 element.blur();
 element.disabled = false;
 return element;
 }
}

Object.extend(Form.Element, Form.Element.Methods);
var Field = Form.Element;
var $F = Form.Element.getValue;

/*--------------------------------------------------------------------------*/

Form.Element.Serializers = {
 input: function(element) {
 switch (element.type.toLowerCase()) {
 case 'checkbox':
 case 'radio':
 return Form.Element.Serializers.inputSelector(element);
 default:
 return Form.Element.Serializers.textarea(element);
 }
 },

 inputSelector: function(element) {
 return element.checked ? element.value : null;
 },

 textarea: function(element) {
 return element.value;
 },

 select: function(element) {
 return this[element.type == 'select-one' ?
 'selectOne' : 'selectMany'](element);
 },

 selectOne: function(element) {
 var index = element.selectedIndex;
 return index >= 0 ? this.optionValue(element.options[index]) : null;
 },

 selectMany: function(element) {
 var values, length = element.length;
 if (!length) return null;

 for (var i = 0, values = []; i < length; i++) {
 var opt = element.options[i];
 if (opt.selected) values.push(this.optionValue(opt));
 }
 return values;
 },

 optionValue: function(opt) {
 // extend element because hasAttribute may not be native
 return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
 }
}

/*--------------------------------------------------------------------------*/

Abstract.TimedObserver = function() {}
Abstract.TimedObserver.prototype = {
 initialize: function(element, frequency, callback) {
 this.frequency = frequency;
 this.element = $(element);
 this.callback = callback;

 this.lastValue = this.getValue();
 this.registerCallback();
 },

 registerCallback: function() {
 setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
 },

 onTimerEvent: function() {
 var value = this.getValue();
 var changed = ('string' == typeof this.lastValue && 'string' == typeof value
 ? this.lastValue != value : String(this.lastValue) != String(value));
 if (changed) {
 this.callback(this.element, value);
 this.lastValue = value;
 }
 }
}

Form.Element.Observer = Class.create();
Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
 getValue: function() {
 return Form.Element.getValue(this.element);
 }
});

Form.Observer = Class.create();
Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), {
 getValue: function() {
 return Form.serialize(this.element);
 }
});

/*--------------------------------------------------------------------------*/

Abstract.EventObserver = function() {}
Abstract.EventObserver.prototype = {
 initialize: function(element, callback) {
 this.element = $(element);
 this.callback = callback;

 this.lastValue = this.getValue();
 if (this.element.tagName.toLowerCase() == 'form')
 this.registerFormCallbacks();
 else
 this.registerCallback(this.element);
 },

 onElementEvent: function() {
 var value = this.getValue();
 if (this.lastValue != value) {
 this.callback(this.element, value);
 this.lastValue = value;
 }
 },

 registerFormCallbacks: function() {
 Form.getElements(this.element).each(this.registerCallback.bind(this));
 },

 registerCallback: function(element) {
 if (element.type) {
 switch (element.type.toLowerCase()) {
 case 'checkbox':
 case 'radio':
 Event.observe(element, 'click', this.onElementEvent.bind(this));
 break;
 default:
 Event.observe(element, 'change', this.onElementEvent.bind(this));
 break;
 }
 }
 }
}

Form.Element.EventObserver = Class.create();
Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
 getValue: function() {
 return Form.Element.getValue(this.element);
 }
});

Form.EventObserver = Class.create();
Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), {
 getValue: function() {
 return Form.serialize(this.element);
 }
});
if (!window.Event) {
 var Event = new Object();
}

Object.extend(Event, {
 KEY_BACKSPACE: 8,
 KEY_TAB: 9,
 KEY_RETURN: 13,
 KEY_ESC: 27,
 KEY_LEFT: 37,
 KEY_UP: 38,
 KEY_RIGHT: 39,
 KEY_DOWN: 40,
 KEY_DELETE: 46,
 KEY_HOME: 36,
 KEY_END: 35,
 KEY_PAGEUP: 33,
 KEY_PAGEDOWN: 34,

 element: function(event) {
 return event.target || event.srcElement;
 },

 isLeftClick: function(event) {
 return (((event.which) && (event.which == 1)) ||
 ((event.button) && (event.button == 1)));
 },

 pointerX: function(event) {
 return event.pageX || (event.clientX +
 (document.documentElement.scrollLeft || document.body.scrollLeft));
 },

 pointerY: function(event) {
 return event.pageY || (event.clientY +
 (document.documentElement.scrollTop || document.body.scrollTop));
 },

 stop: function(event) {
 if (event.preventDefault) {
 event.preventDefault();
 event.stopPropagation();
 } else {
 event.returnValue = false;
 event.cancelBubble = true;
 }
 },

 // find the first node with the given tagName, starting from the
 // node the event was triggered on; traverses the DOM upwards
 findElement: function(event, tagName) {
 var element = Event.element(event);
 while (element.parentNode && (!element.tagName ||
 (element.tagName.toUpperCase() != tagName.toUpperCase())))
 element = element.parentNode;
 return element;
 },

 observers: false,

 _observeAndCache: function(element, name, observer, useCapture) {
 if (!this.observers) this.observers = [];
 if (element.addEventListener) {
 this.observers.push([element, name, observer, useCapture]);
 element.addEventListener(name, observer, useCapture);
 } else if (element.attachEvent) {
 this.observers.push([element, name, observer, useCapture]);
 element.attachEvent('on' + name, observer);
 }
 },

 unloadCache: function() {
 if (!Event.observers) return;
 for (var i = 0, length = Event.observers.length; i < length; i++) {
 Event.stopObserving.apply(this, Event.observers[i]);
 Event.observers[i][0] = null;
 }
 Event.observers = false;
 },

 observe: function(element, name, observer, useCapture) {
 element = $(element);
 useCapture = useCapture || false;

 if (name == 'keypress' &&
 (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
 || element.attachEvent))
 name = 'keydown';

 Event._observeAndCache(element, name, observer, useCapture);
 },

 stopObserving: function(element, name, observer, useCapture) {
 element = $(element);
 useCapture = useCapture || false;

 if (name == 'keypress' &&
 (navigator.appVersion.match(/Konqueror|Safari|KHTML/)
 || element.detachEvent))
 name = 'keydown';

 if (element.removeEventListener) {
 element.removeEventListener(name, observer, useCapture);
 } else if (element.detachEvent) {
 try {
 element.detachEvent('on' + name, observer);
 } catch (e) {}
 }
 }
});

/* prevent memory leaks in IE */
if (navigator.appVersion.match(/\bMSIE\b/))
 Event.observe(window, 'unload', Event.unloadCache, false);
var Position = {
 // set to true if needed, warning: firefox performance problems
 // NOT neeeded for page scrolling, only if draggable contained in
 // scrollable elements
 includeScrollOffsets: false,

 // must be called before calling withinIncludingScrolloffset, every time the
 // page is scrolled
 prepare: function() {
 this.deltaX = window.pageXOffset
 || document.documentElement.scrollLeft
 || document.body.scrollLeft
 || 0;
 this.deltaY = window.pageYOffset
 || document.documentElement.scrollTop
 || document.body.scrollTop
 || 0;
 },

 realOffset: function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.scrollTop || 0;
 valueL += element.scrollLeft || 0;
 element = element.parentNode;
 } while (element);
 return [valueL, valueT];
 },

 cumulativeOffset: function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;
 element = element.offsetParent;
 } while (element);
 return [valueL, valueT];
 },

 positionedOffset: function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;
 element = element.offsetParent;
 if (element) {
 if(element.tagName=='BODY') break;
 var p = Element.getStyle(element, 'position');
 if (p == 'relative' || p == 'absolute') break;
 }
 } while (element);
 return [valueL, valueT];
 },

 offsetParent: function(element) {
 if (element.offsetParent) return element.offsetParent;
 if (element == document.body) return element;

 while ((element = element.parentNode) && element != document.body)
 if (Element.getStyle(element, 'position') != 'static')
 return element;

 return document.body;
 },

 // caches x/y coordinate pair to use with overlap
 within: function(element, x, y) {
 if (this.includeScrollOffsets)
 return this.withinIncludingScrolloffsets(element, x, y);
 this.xcomp = x;
 this.ycomp = y;
 this.offset = this.cumulativeOffset(element);

 return (y >= this.offset[1] &&
 y < this.offset[1] + element.offsetHeight &&
 x >= this.offset[0] &&
 x < this.offset[0] + element.offsetWidth);
 },

 withinIncludingScrolloffsets: function(element, x, y) {
 var offsetcache = this.realOffset(element);

 this.xcomp = x + offsetcache[0] - this.deltaX;
 this.ycomp = y + offsetcache[1] - this.deltaY;
 this.offset = this.cumulativeOffset(element);

 return (this.ycomp >= this.offset[1] &&
 this.ycomp < this.offset[1] + element.offsetHeight &&
 this.xcomp >= this.offset[0] &&
 this.xcomp < this.offset[0] + element.offsetWidth);
 },

 // within must be called directly before
 overlap: function(mode, element) {
 if (!mode) return 0;
 if (mode == 'vertical')
 return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
 element.offsetHeight;
 if (mode == 'horizontal')
 return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
 element.offsetWidth;
 },

 page: function(forElement) {
 var valueT = 0, valueL = 0;

 var element = forElement;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;

 // Safari fix
 if (element.offsetParent==document.body)
 if (Element.getStyle(element,'position')=='absolute') break;

 } while (element = element.offsetParent);

 element = forElement;
 do {
 if (!window.opera || element.tagName=='BODY') {
 valueT -= element.scrollTop || 0;
 valueL -= element.scrollLeft || 0;
 }
 } while (element = element.parentNode);

 return [valueL, valueT];
 },

 clone: function(source, target) {
 var options = Object.extend({
 setLeft: true,
 setTop: true,
 setWidth: true,
 setHeight: true,
 offsetTop: 0,
 offsetLeft: 0
 }, arguments[2] || {})

 // find page position of source
 source = $(source);
 var p = Position.page(source);

 // find coordinate system to use
 target = $(target);
 var delta = [0, 0];
 var parent = null;
 // delta [0,0] will do fine with position: fixed elements,
 // position:absolute needs offsetParent deltas
 if (Element.getStyle(target,'position') == 'absolute') {
 parent = Position.offsetParent(target);
 delta = Position.page(parent);
 }

 // correct by body offsets (fixes Safari)
 if (parent == document.body) {
 delta[0] -= document.body.offsetLeft;
 delta[1] -= document.body.offsetTop;
 }

 // set position
 if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
 if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
 if(options.setWidth) target.style.width = source.offsetWidth + 'px';
 if(options.setHeight) target.style.height = source.offsetHeight + 'px';
 },

 absolutize: function(element) {
 element = $(element);
 if (element.style.position == 'absolute') return;
 Position.prepare();

 var offsets = Position.positionedOffset(element);
 var top = offsets[1];
 var left = offsets[0];
 var width = element.clientWidth;
 var height = element.clientHeight;

 element._originalLeft = left - parseFloat(element.style.left || 0);
 element._originalTop = top - parseFloat(element.style.top || 0);
 element._originalWidth = element.style.width;
 element._originalHeight = element.style.height;

 element.style.position = 'absolute';
 element.style.top = top + 'px';
 element.style.left = left + 'px';
 element.style.width = width + 'px';
 element.style.height = height + 'px';
 },

 relativize: function(element) {
 element = $(element);
 if (element.style.position == 'relative') return;
 Position.prepare();

 element.style.position = 'relative';
 var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
 var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);

 element.style.top = top + 'px';
 element.style.left = left + 'px';
 element.style.height = element._originalHeight;
 element.style.width = element._originalWidth;
 }
}

// Safari returns margins on body which is incorrect if the child is absolutely
// positioned. For performance reasons, redefine Position.cumulativeOffset for
// KHTML/WebKit only.
if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) {
 Position.cumulativeOffset = function(element) {
 var valueT = 0, valueL = 0;
 do {
 valueT += element.offsetTop || 0;
 valueL += element.offsetLeft || 0;
 if (element.offsetParent == document.body)
 if (Element.getStyle(element, 'position') == 'absolute') break;

 element = element.offsetParent;
 } while (element);

 return [valueL, valueT];
 }
}

Element.addMethods();
// script.aculo.us effects.js v1.7.0, Fri Jan 19 19:16:36 CET 2007

// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
// Contributors:
// Justin Palmer (http://encytemedia.com/)
// Mark Pilgrim (http://diveintomark.org/)
// Martin Bialasinki
// 
// script.aculo.us is freely distributable under the terms of an MIT-style license.
// For details, see the script.aculo.us web site: http://script.aculo.us/ 

// converts rgb() and #xxx to #xxxxxx format, 
// returns self (or first argument) if not convertable 
String.prototype.parseColor = function() { 
 var color = '#';
 if(this.slice(0,4) == 'rgb(') { 
 var cols = this.slice(4,this.length-1).split(','); 
 var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); 
 } else { 
 if(this.slice(0,1) == '#') { 
 if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); 
 if(this.length==7) color = this.toLowerCase(); 
 } 
 } 
 return(color.length==7 ? color : (arguments[0] || this)); 
}

/*--------------------------------------------------------------------------*/

Element.collectTextNodes = function(element) { 
 return $A($(element).childNodes).collect( function(node) {
 return (node.nodeType==3 ? node.nodeValue : 
 (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
 }).flatten().join('');
}

Element.collectTextNodesIgnoreClass = function(element, className) { 
 return $A($(element).childNodes).collect( function(node) {
 return (node.nodeType==3 ? node.nodeValue : 
 ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? 
 Element.collectTextNodesIgnoreClass(node, className) : ''));
 }).flatten().join('');
}

Element.setContentZoom = function(element, percent) {
 element = $(element); 
 element.setStyle({fontSize: (percent/100) + 'em'}); 
 if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
 return element;
}

Element.getOpacity = function(element){
 return $(element).getStyle('opacity');
}

Element.setOpacity = function(element, value){
 return $(element).setStyle({opacity:value});
}

Element.getInlineOpacity = function(element){
 return $(element).style.opacity || '';
}

Element.forceRerendering = function(element) {
 try {
 element = $(element);
 var n = document.createTextNode(' ');
 element.appendChild(n);
 element.removeChild(n);
 } catch(e) { }
};

/*--------------------------------------------------------------------------*/

Array.prototype.call = function() {
 var args = arguments;
 this.each(function(f){ f.apply(this, args) });
}

/*--------------------------------------------------------------------------*/

var Effect = {
 _elementDoesNotExistError: {
 name: 'ElementDoesNotExistError',
 message: 'The specified DOM element does not exist, but is required for this effect to operate'
 },
 tagifyText: function(element) {
 if(typeof Builder == 'undefined')
 throw("Effect.tagifyText requires including script.aculo.us' builder.js library");
 
 var tagifyStyle = 'position:relative';
 if(/MSIE/.test(navigator.userAgent) && !window.opera) tagifyStyle += ';zoom:1';
 
 element = $(element);
 $A(element.childNodes).each( function(child) {
 if(child.nodeType==3) {
 child.nodeValue.toArray().each( function(character) {
 element.insertBefore(
 Builder.node('span',{style: tagifyStyle},
 character == ' ' ? String.fromCharCode(160) : character), 
 child);
 });
 Element.remove(child);
 }
 });
 },
 multiple: function(element, effect) {
 var elements;
 if(((typeof element == 'object') || 
 (typeof element == 'function')) && 
 (element.length))
 elements = element;
 else
 elements = $(element).childNodes;
 
 var options = Object.extend({
 speed: 0.1,
 delay: 0.0
 }, arguments[2] || {});
 var masterDelay = options.delay;

 $A(elements).each( function(element, index) {
 new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
 });
 },
 PAIRS: {
 'slide': ['SlideDown','SlideUp'],
 'blind': ['BlindDown','BlindUp'],
 'appear': ['Appear','Fade']
 },
 toggle: function(element, effect) {
 element = $(element);
 effect = (effect || 'appear').toLowerCase();
 var options = Object.extend({
 queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
 }, arguments[2] || {});
 Effect[element.visible() ? 
 Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
 }
};

var Effect2 = Effect; // deprecated

/* ------------- transitions ------------- */

Effect.Transitions = {
 linear: Prototype.K,
 sinoidal: function(pos) {
 return (-Math.cos(pos*Math.PI)/2) + 0.5;
 },
 reverse: function(pos) {
 return 1-pos;
 },
 flicker: function(pos) {
 return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
 },
 wobble: function(pos) {
 return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
 },
 pulse: function(pos, pulses) { 
 pulses = pulses || 5; 
 return (
 Math.round((pos % (1/pulses)) * pulses) == 0 ? 
 ((pos * pulses * 2) - Math.floor(pos * pulses * 2)) : 
 1 - ((pos * pulses * 2) - Math.floor(pos * pulses * 2))
 );
 },
 none: function(pos) {
 return 0;
 },
 full: function(pos) {
 return 1;
 }
};

/* ------------- core effects ------------- */

Effect.ScopedQueue = Class.create();
Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), {
 initialize: function() {
 this.effects = [];
 this.interval = null;
 },
 _each: function(iterator) {
 this.effects._each(iterator);
 },
 add: function(effect) {
 var timestamp = new Date().getTime();
 
 var position = (typeof effect.options.queue == 'string') ? 
 effect.options.queue : effect.options.queue.position;
 
 switch(position) {
 case 'front':
 // move unstarted effects after this effect 
 this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
 e.startOn += effect.finishOn;
 e.finishOn += effect.finishOn;
 });
 break;
 case 'with-last':
 timestamp = this.effects.pluck('startOn').max() || timestamp;
 break;
 case 'end':
 // start effect after last queued effect has finished
 timestamp = this.effects.pluck('finishOn').max() || timestamp;
 break;
 }
 
 effect.startOn += timestamp;
 effect.finishOn += timestamp;

 if(!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
 this.effects.push(effect);
 
 if(!this.interval) 
 this.interval = setInterval(this.loop.bind(this), 15);
 },
 remove: function(effect) {
 this.effects = this.effects.reject(function(e) { return e==effect });
 if(this.effects.length == 0) {
 clearInterval(this.interval);
 this.interval = null;
 }
 },
 loop: function() {
 var timePos = new Date().getTime();
 for(var i=0, len=this.effects.length;i<len;i++) 
 if(this.effects[i]) this.effects[i].loop(timePos);
 }
});

Effect.Queues = {
 instances: $H(),
 get: function(queueName) {
 if(typeof queueName != 'string') return queueName;
 
 if(!this.instances[queueName])
 this.instances[queueName] = new Effect.ScopedQueue();
 
 return this.instances[queueName];
 }
}
Effect.Queue = Effect.Queues.get('global');

Effect.DefaultOptions = {
 transition: Effect.Transitions.sinoidal,
 duration: 1.0, // seconds
 fps: 60.0, // max. 60fps due to Effect.Queue implementation
 sync: false, // true for combining
 from: 0.0,
 to: 1.0,
 delay: 0.0,
 queue: 'parallel'
}

Effect.Base = function() {};
Effect.Base.prototype = {
 position: null,
 start: function(options) {
 this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
 this.currentFrame = 0;
 this.state = 'idle';
 this.startOn = this.options.delay*1000;
 this.finishOn = this.startOn + (this.options.duration*1000);
 this.event('beforeStart');
 if(!this.options.sync)
 Effect.Queues.get(typeof this.options.queue == 'string' ? 
 'global' : this.options.queue.scope).add(this);
 },
 loop: function(timePos) {
 if(timePos >= this.startOn) {
 if(timePos >= this.finishOn) {
 this.render(1.0);
 this.cancel();
 this.event('beforeFinish');
 if(this.finish) this.finish(); 
 this.event('afterFinish');
 return; 
 }
 var pos = (timePos - this.startOn) / (this.finishOn - this.startOn);
 var frame = Math.round(pos * this.options.fps * this.options.duration);
 if(frame > this.currentFrame) {
 this.render(pos);
 this.currentFrame = frame;
 }
 }
 },
 render: function(pos) {
 if(this.state == 'idle') {
 this.state = 'running';
 this.event('beforeSetup');
 if(this.setup) this.setup();
 this.event('afterSetup');
 }
 if(this.state == 'running') {
 if(this.options.transition) pos = this.options.transition(pos);
 pos *= (this.options.to-this.options.from);
 pos += this.options.from;
 this.position = pos;
 this.event('beforeUpdate');
 if(this.update) this.update(pos);
 this.event('afterUpdate');
 }
 },
 cancel: function() {
 if(!this.options.sync)
 Effect.Queues.get(typeof this.options.queue == 'string' ? 
 'global' : this.options.queue.scope).remove(this);
 this.state = 'finished';
 },
 event: function(eventName) {
 if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
 if(this.options[eventName]) this.options[eventName](this);
 },
 inspect: function() {
 var data = $H();
 for(property in this)
 if(typeof this[property] != 'function') data[property] = this[property];
 return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
 }
}

Effect.Parallel = Class.create();
Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), {
 initialize: function(effects) {
 this.effects = effects || [];
 this.start(arguments[1]);
 },
 update: function(position) {
 this.effects.invoke('render', position);
 },
 finish: function(position) {
 this.effects.each( function(effect) {
 effect.render(1.0);
 effect.cancel();
 effect.event('beforeFinish');
 if(effect.finish) effect.finish(position);
 effect.event('afterFinish');
 });
 }
});

Effect.Event = Class.create();
Object.extend(Object.extend(Effect.Event.prototype, Effect.Base.prototype), {
 initialize: function() {
 var options = Object.extend({
 duration: 0
 }, arguments[0] || {});
 this.start(options);
 },
 update: Prototype.emptyFunction
});

Effect.Opacity = Class.create();
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 // make this work on IE on elements without 'layout'
 if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
 this.element.setStyle({zoom: 1});
 var options = Object.extend({
 from: this.element.getOpacity() || 0.0,
 to: 1.0
 }, arguments[1] || {});
 this.start(options);
 },
 update: function(position) {
 this.element.setOpacity(position);
 }
});

Effect.Move = Class.create();
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({
 x: 0,
 y: 0,
 mode: 'relative'
 }, arguments[1] || {});
 this.start(options);
 },
 setup: function() {
 // Bug in Opera: Opera returns the "real" position of a static element or
 // relative element that does not have top/left explicitly set.
 // ==> Always set top and left for position relative elements in your stylesheets 
 // (to 0 if you do not need them) 
 this.element.makePositioned();
 this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
 this.originalTop = parseFloat(this.element.getStyle('top') || '0');
 if(this.options.mode == 'absolute') {
 // absolute movement, so we need to calc deltaX and deltaY
 this.options.x = this.options.x - this.originalLeft;
 this.options.y = this.options.y - this.originalTop;
 }
 },
 update: function(position) {
 this.element.setStyle({
 left: Math.round(this.options.x * position + this.originalLeft) + 'px',
 top: Math.round(this.options.y * position + this.originalTop) + 'px'
 });
 }
});

// for backwards compatibility
Effect.MoveBy = function(element, toTop, toLeft) {
 return new Effect.Move(element, 
 Object.extend({ x: toLeft, y: toTop }, arguments[3] || {}));
};

Effect.Scale = Class.create();
Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), {
 initialize: function(element, percent) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({
 scaleX: true,
 scaleY: true,
 scaleContent: true,
 scaleFromCenter: false,
 scaleMode: 'box', // 'box' or 'contents' or {} with provided values
 scaleFrom: 100.0,
 scaleTo: percent
 }, arguments[2] || {});
 this.start(options);
 },
 setup: function() {
 this.restoreAfterFinish = this.options.restoreAfterFinish || false;
 this.elementPositioning = this.element.getStyle('position');
 
 this.originalStyle = {};
 ['top','left','width','height','fontSize'].each( function(k) {
 this.originalStyle[k] = this.element.style[k];
 }.bind(this));
 
 this.originalTop = this.element.offsetTop;
 this.originalLeft = this.element.offsetLeft;
 
 var fontSize = this.element.getStyle('font-size') || '100%';
 ['em','px','%','pt'].each( function(fontSizeType) {
 if(fontSize.indexOf(fontSizeType)>0) {
 this.fontSize = parseFloat(fontSize);
 this.fontSizeType = fontSizeType;
 }
 }.bind(this));
 
 this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
 
 this.dims = null;
 if(this.options.scaleMode=='box')
 this.dims = [this.element.offsetHeight, this.element.offsetWidth];
 if(/^content/.test(this.options.scaleMode))
 this.dims = [this.element.scrollHeight, this.element.scrollWidth];
 if(!this.dims)
 this.dims = [this.options.scaleMode.originalHeight,
 this.options.scaleMode.originalWidth];
 },
 update: function(position) {
 var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
 if(this.options.scaleContent && this.fontSize)
 this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
 this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
 },
 finish: function(position) {
 if(this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
 },
 setDimensions: function(height, width) {
 var d = {};
 if(this.options.scaleX) d.width = Math.round(width) + 'px';
 if(this.options.scaleY) d.height = Math.round(height) + 'px';
 if(this.options.scaleFromCenter) {
 var topd = (height - this.dims[0])/2;
 var leftd = (width - this.dims[1])/2;
 if(this.elementPositioning == 'absolute') {
 if(this.options.scaleY) d.top = this.originalTop-topd + 'px';
 if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
 } else {
 if(this.options.scaleY) d.top = -topd + 'px';
 if(this.options.scaleX) d.left = -leftd + 'px';
 }
 }
 this.element.setStyle(d);
 }
});

Effect.Highlight = Class.create();
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
 this.start(options);
 },
 setup: function() {
 // Prevent executing on elements not in the layout flow
 if(this.element.getStyle('display')=='none') { this.cancel(); return; }
 // Disable background image during the effect
 this.oldStyle = {};
 if (!this.options.keepBackgroundImage) {
 this.oldStyle.backgroundImage = this.element.getStyle('background-image');
 this.element.setStyle({backgroundImage: 'none'});
 }
 if(!this.options.endcolor)
 this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
 if(!this.options.restorecolor)
 this.options.restorecolor = this.element.getStyle('background-color');
 // init color calculations
 this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
 this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
 },
 update: function(position) {
 this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
 return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) });
 },
 finish: function() {
 this.element.setStyle(Object.extend(this.oldStyle, {
 backgroundColor: this.options.restorecolor
 }));
 }
});

Effect.ScrollTo = Class.create();
Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 this.start(arguments[1] || {});
 },
 setup: function() {
 Position.prepare();
 var offsets = Position.cumulativeOffset(this.element);
 if(this.options.offset) offsets[1] += this.options.offset;
 var max = window.innerHeight ? 
 window.height - window.innerHeight :
 document.body.scrollHeight - 
 (document.documentElement.clientHeight ? 
 document.documentElement.clientHeight : document.body.clientHeight);
 this.scrollStart = Position.deltaY;
 this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart;
 },
 update: function(position) {
 Position.prepare();
 window.scrollTo(Position.deltaX, 
 this.scrollStart + (position*this.delta));
 }
});

/* ------------- combination effects ------------- */

Effect.Fade = function(element) {
 element = $(element);
 var oldOpacity = element.getInlineOpacity();
 var options = Object.extend({
 from: element.getOpacity() || 1.0,
 to: 0.0,
 afterFinishInternal: function(effect) { 
 if(effect.options.to!=0) return;
 effect.element.hide().setStyle({opacity: oldOpacity}); 
 }}, arguments[1] || {});
 return new Effect.Opacity(element,options);
}

Effect.Appear = function(element) {
 element = $(element);
 var options = Object.extend({
 from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
 to: 1.0,
 // force Safari to render floated elements properly
 afterFinishInternal: function(effect) {
 effect.element.forceRerendering();
 },
 beforeSetup: function(effect) {
 effect.element.setOpacity(effect.options.from).show(); 
 }}, arguments[1] || {});
 return new Effect.Opacity(element,options);
}

Effect.Puff = function(element) {
 element = $(element);
 var oldStyle = { 
 opacity: element.getInlineOpacity(), 
 position: element.getStyle('position'),
 top: element.style.top,
 left: element.style.left,
 width: element.style.width,
 height: element.style.height
 };
 return new Effect.Parallel(
 [ new Effect.Scale(element, 200, 
 { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), 
 new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], 
 Object.extend({ duration: 1.0, 
 beforeSetupInternal: function(effect) {
 Position.absolutize(effect.effects[0].element)
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.hide().setStyle(oldStyle); }
 }, arguments[1] || {})
 );
}

Effect.BlindUp = function(element) {
 element = $(element);
 element.makeClipping();
 return new Effect.Scale(element, 0,
 Object.extend({ scaleContent: false, 
 scaleX: false, 
 restoreAfterFinish: true,
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping();
 } 
 }, arguments[1] || {})
 );
}

Effect.BlindDown = function(element) {
 element = $(element);
 var elementDimensions = element.getDimensions();
 return new Effect.Scale(element, 100, Object.extend({ 
 scaleContent: false, 
 scaleX: false,
 scaleFrom: 0,
 scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
 restoreAfterFinish: true,
 afterSetup: function(effect) {
 effect.element.makeClipping().setStyle({height: '0px'}).show(); 
 }, 
 afterFinishInternal: function(effect) {
 effect.element.undoClipping();
 }
 }, arguments[1] || {}));
}

Effect.SwitchOff = function(element) {
 element = $(element);
 var oldOpacity = element.getInlineOpacity();
 return new Effect.Appear(element, Object.extend({
 duration: 0.4,
 from: 0,
 transition: Effect.Transitions.flicker,
 afterFinishInternal: function(effect) {
 new Effect.Scale(effect.element, 1, { 
 duration: 0.3, scaleFromCenter: true,
 scaleX: false, scaleContent: false, restoreAfterFinish: true,
 beforeSetup: function(effect) { 
 effect.element.makePositioned().makeClipping();
 },
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
 }
 })
 }
 }, arguments[1] || {}));
}

Effect.DropOut = function(element) {
 element = $(element);
 var oldStyle = {
 top: element.getStyle('top'),
 left: element.getStyle('left'),
 opacity: element.getInlineOpacity() };
 return new Effect.Parallel(
 [ new Effect.Move(element, {x: 0, y: 100, sync: true }), 
 new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
 Object.extend(
 { duration: 0.5,
 beforeSetup: function(effect) {
 effect.effects[0].element.makePositioned(); 
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
 } 
 }, arguments[1] || {}));
}

Effect.Shake = function(element) {
 element = $(element);
 var oldStyle = {
 top: element.getStyle('top'),
 left: element.getStyle('left') };
 return new Effect.Move(element, 
 { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) {
 new Effect.Move(effect.element,
 { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) {
 effect.element.undoPositioned().setStyle(oldStyle);
 }}) }}) }}) }}) }}) }});
}

Effect.SlideDown = function(element) {
 element = $(element).cleanWhitespace();
 // SlideDown need to have the content of the element wrapped in a container element with fixed height!
 var oldInnerBottom = element.down().getStyle('bottom');
 var elementDimensions = element.getDimensions();
 return new Effect.Scale(element, 100, Object.extend({ 
 scaleContent: false, 
 scaleX: false, 
 scaleFrom: window.opera ? 0 : 1,
 scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
 restoreAfterFinish: true,
 afterSetup: function(effect) {
 effect.element.makePositioned();
 effect.element.down().makePositioned();
 if(window.opera) effect.element.setStyle({top: ''});
 effect.element.makeClipping().setStyle({height: '0px'}).show(); 
 },
 afterUpdateInternal: function(effect) {
 effect.element.down().setStyle({bottom:
 (effect.dims[0] - effect.element.clientHeight) + 'px' }); 
 },
 afterFinishInternal: function(effect) {
 effect.element.undoClipping().undoPositioned();
 effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
 }, arguments[1] || {})
 );
}

Effect.SlideUp = function(element) {
 element = $(element).cleanWhitespace();
 var oldInnerBottom = element.down().getStyle('bottom');
 return new Effect.Scale(element, window.opera ? 0 : 1,
 Object.extend({ scaleContent: false, 
 scaleX: false, 
 scaleMode: 'box',
 scaleFrom: 100,
 restoreAfterFinish: true,
 beforeStartInternal: function(effect) {
 effect.element.makePositioned();
 effect.element.down().makePositioned();
 if(window.opera) effect.element.setStyle({top: ''});
 effect.element.makeClipping().show();
 }, 
 afterUpdateInternal: function(effect) {
 effect.element.down().setStyle({bottom:
 (effect.dims[0] - effect.element.clientHeight) + 'px' });
 },
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping().undoPositioned().setStyle({bottom: oldInnerBottom});
 effect.element.down().undoPositioned();
 }
 }, arguments[1] || {})
 );
}

// Bug in opera makes the TD containing this element expand for a instance after finish 
Effect.Squish = function(element) {
 return new Effect.Scale(element, window.opera ? 1 : 0, { 
 restoreAfterFinish: true,
 beforeSetup: function(effect) {
 effect.element.makeClipping(); 
 }, 
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping(); 
 }
 });
}

Effect.Grow = function(element) {
 element = $(element);
 var options = Object.extend({
 direction: 'center',
 moveTransition: Effect.Transitions.sinoidal,
 scaleTransition: Effect.Transitions.sinoidal,
 opacityTransition: Effect.Transitions.full
 }, arguments[1] || {});
 var oldStyle = {
 top: element.style.top,
 left: element.style.left,
 height: element.style.height,
 width: element.style.width,
 opacity: element.getInlineOpacity() };

 var dims = element.getDimensions(); 
 var initialMoveX, initialMoveY;
 var moveX, moveY;
 
 switch (options.direction) {
 case 'top-left':
 initialMoveX = initialMoveY = moveX = moveY = 0; 
 break;
 case 'top-right':
 initialMoveX = dims.width;
 initialMoveY = moveY = 0;
 moveX = -dims.width;
 break;
 case 'bottom-left':
 initialMoveX = moveX = 0;
 initialMoveY = dims.height;
 moveY = -dims.height;
 break;
 case 'bottom-right':
 initialMoveX = dims.width;
 initialMoveY = dims.height;
 moveX = -dims.width;
 moveY = -dims.height;
 break;
 case 'center':
 initialMoveX = dims.width / 2;
 initialMoveY = dims.height / 2;
 moveX = -dims.width / 2;
 moveY = -dims.height / 2;
 break;
 }
 
 return new Effect.Move(element, {
 x: initialMoveX,
 y: initialMoveY,
 duration: 0.01, 
 beforeSetup: function(effect) {
 effect.element.hide().makeClipping().makePositioned();
 },
 afterFinishInternal: function(effect) {
 new Effect.Parallel(
 [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
 new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
 new Effect.Scale(effect.element, 100, {
 scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, 
 sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
 ], Object.extend({
 beforeSetup: function(effect) {
 effect.effects[0].element.setStyle({height: '0px'}).show(); 
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle); 
 }
 }, options)
 )
 }
 });
}

Effect.Shrink = function(element) {
 element = $(element);
 var options = Object.extend({
 direction: 'center',
 moveTransition: Effect.Transitions.sinoidal,
 scaleTransition: Effect.Transitions.sinoidal,
 opacityTransition: Effect.Transitions.none
 }, arguments[1] || {});
 var oldStyle = {
 top: element.style.top,
 left: element.style.left,
 height: element.style.height,
 width: element.style.width,
 opacity: element.getInlineOpacity() };

 var dims = element.getDimensions();
 var moveX, moveY;
 
 switch (options.direction) {
 case 'top-left':
 moveX = moveY = 0;
 break;
 case 'top-right':
 moveX = dims.width;
 moveY = 0;
 break;
 case 'bottom-left':
 moveX = 0;
 moveY = dims.height;
 break;
 case 'bottom-right':
 moveX = dims.width;
 moveY = dims.height;
 break;
 case 'center': 
 moveX = dims.width / 2;
 moveY = dims.height / 2;
 break;
 }
 
 return new Effect.Parallel(
 [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
 new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
 new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
 ], Object.extend({ 
 beforeStartInternal: function(effect) {
 effect.effects[0].element.makePositioned().makeClipping(); 
 },
 afterFinishInternal: function(effect) {
 effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
 }, options)
 );
}

Effect.Pulsate = function(element) {
 element = $(element);
 var options = arguments[1] || {};
 var oldOpacity = element.getInlineOpacity();
 var transition = options.transition || Effect.Transitions.sinoidal;
 var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
 reverser.bind(transition);
 return new Effect.Opacity(element, 
 Object.extend(Object.extend({ duration: 2.0, from: 0,
 afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
 }, options), {transition: reverser}));
}

Effect.Fold = function(element) {
 element = $(element);
 var oldStyle = {
 top: element.style.top,
 left: element.style.left,
 width: element.style.width,
 height: element.style.height };
 element.makeClipping();
 return new Effect.Scale(element, 5, Object.extend({ 
 scaleContent: false,
 scaleX: false,
 afterFinishInternal: function(effect) {
 new Effect.Scale(element, 1, { 
 scaleContent: false, 
 scaleY: false,
 afterFinishInternal: function(effect) {
 effect.element.hide().undoClipping().setStyle(oldStyle);
 } });
 }}, arguments[1] || {}));
};

Effect.Morph = Class.create();
Object.extend(Object.extend(Effect.Morph.prototype, Effect.Base.prototype), {
 initialize: function(element) {
 this.element = $(element);
 if(!this.element) throw(Effect._elementDoesNotExistError);
 var options = Object.extend({
 style: {}
 }, arguments[1] || {});
 if (typeof options.style == 'string') {
 if(options.style.indexOf(':') == -1) {
 var cssText = '', selector = '.' + options.style;
 $A(document.styleSheets).reverse().each(function(styleSheet) {
 if (styleSheet.cssRules) cssRules = styleSheet.cssRules;
 else if (styleSheet.rules) cssRules = styleSheet.rules;
 $A(cssRules).reverse().each(function(rule) {
 if (selector == rule.selectorText) {
 cssText = rule.style.cssText;
 throw $break;
 }
 });
 if (cssText) throw $break;
 });
 this.style = cssText.parseStyle();
 options.afterFinishInternal = function(effect){
 effect.element.addClassName(effect.options.style);
 effect.transforms.each(function(transform) {
 if(transform.style != 'opacity')
 effect.element.style[transform.style.camelize()] = '';
 });
 }
 } else this.style = options.style.parseStyle();
 } else this.style = $H(options.style)
 this.start(options);
 },
 setup: function(){
 function parseColor(color){
 if(!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
 color = color.parseColor();
 return $R(0,2).map(function(i){
 return parseInt( color.slice(i*2+1,i*2+3), 16 ) 
 });
 }
 this.transforms = this.style.map(function(pair){
 var property = pair[0].underscore().dasherize(), value = pair[1], unit = null;

 if(value.parseColor('#zzzzzz') != '#zzzzzz') {
 value = value.parseColor();
 unit = 'color';
 } else if(property == 'opacity') {
 value = parseFloat(value);
 if(/MSIE/.test(navigator.userAgent) && !window.opera && (!this.element.currentStyle.hasLayout))
 this.element.setStyle({zoom: 1});
 } else if(Element.CSS_LENGTH.test(value)) 
 var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/),
 value = parseFloat(components[1]), unit = (components.length == 3) ? components[2] : null;

 var originalValue = this.element.getStyle(property);
 return $H({ 
 style: property, 
 originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0), 
 targetValue: unit=='color' ? parseColor(value) : value,
 unit: unit
 });
 }.bind(this)).reject(function(transform){
 return (
 (transform.originalValue == transform.targetValue) ||
 (
 transform.unit != 'color' &&
 (isNaN(transform.originalValue) || isNaN(transform.targetValue))
 )
 )
 });
 },
 update: function(position) {
 var style = $H(), value = null;
 this.transforms.each(function(transform){
 value = transform.unit=='color' ?
 $R(0,2).inject('#',function(m,v,i){
 return m+(Math.round(transform.originalValue[i]+
 (transform.targetValue[i] - transform.originalValue[i])*position)).toColorPart() }) : 
 transform.originalValue + Math.round(
 ((transform.targetValue - transform.originalValue) * position) * 1000)/1000 + transform.unit;
 style[transform.style] = value;
 });
 this.element.setStyle(style);
 }
});

Effect.Transform = Class.create();
Object.extend(Effect.Transform.prototype, {
 initialize: function(tracks){
 this.tracks = [];
 this.options = arguments[1] || {};
 this.addTracks(tracks);
 },
 addTracks: function(tracks){
 tracks.each(function(track){
 var data = $H(track).values().first();
 this.tracks.push($H({
 ids: $H(track).keys().first(),
 effect: Effect.Morph,
 options: { style: data }
 }));
 }.bind(this));
 return this;
 },
 play: function(){
 return new Effect.Parallel(
 this.tracks.map(function(track){
 var elements = [$(track.ids) || $$(track.ids)].flatten();
 return elements.map(function(e){ return new track.effect(e, Object.extend({ sync:true }, track.options)) });
 }).flatten(),
 this.options
 );
 }
});

Element.CSS_PROPERTIES = $w(
 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' + 
 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
 'fontSize fontWeight height left letterSpacing lineHeight ' +
 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
 'right textIndent top width wordSpacing zIndex');
 
Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;

String.prototype.parseStyle = function(){
 var element = Element.extend(document.createElement('div'));
 element.innerHTML = '<div style="' + this + '"></div>';
 var style = element.down().style, styleRules = $H();
 
 Element.CSS_PROPERTIES.each(function(property){
 if(style[property]) styleRules[property] = style[property]; 
 });
 if(/MSIE/.test(navigator.userAgent) && !window.opera && this.indexOf('opacity') > -1) {
 styleRules.opacity = this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1];
 }
 return styleRules;
};

Element.morph = function(element, style) {
 new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || {}));
 return element;
};

['setOpacity','getOpacity','getInlineOpacity','forceRerendering','setContentZoom',
 'collectTextNodes','collectTextNodesIgnoreClass','morph'].each( 
 function(f) { Element.Methods[f] = Element[f]; }
);

Element.Methods.visualEffect = function(element, effect, options) {
 s = effect.gsub(/_/, '-').camelize();
 effect_class = s.charAt(0).toUpperCase() + s.substring(1);
 new Effect[effect_class](element, options);
 return $(element);
};

Element.addMethods();
//Parameters for popover_content div or direct to js for popover

function displayPopover(companyId,companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl, companyAddress, companyPostcode, fixurl, track, state,sms,map,website,email){
if(state=="smsmain"){
if(smsR&&!smsS){
displaySMSRForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(smsS&&!smsR){
displaySMSSForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(!smsS&&!smsR){
//This shouldn't ever happen
}else{
displaySMSMain(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}
}else if(state=="smsR"){
displaySMSRForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(state=="smsS"){
displaySMSSForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(state=="email"){
displayEmailForm(companyName, companyEmail, emailHash,fixurl,track);
}else if(state=="address"){
displayAddressForm(companyId,companyName, companyAddress, companyPostcode, companyUrl, companyNumber,fixurl);
}else{
//hide popover
return false;
}
displayContact(companyId,companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
return true;


}

function displaySMSMain(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html='<div class="popoversms">'+
'<div class="popovertitle">'+
'SMS listing services'+
'</div>'+
'<div class="popovermain">'+
'<b>Please select an SMS service:</b>'+
'<br />'+
'<br />'+
'<br /><button class="popoverbuttonleft" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsR\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');">Receive listing details</button><button class="popoverbuttonright" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\',\''+smsR+'\',\''+smsS+'\',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsS\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');" >Send SMS to company</button>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';
document.getElementById("popover_content").innerHTML = html;
}

function displaySMSRForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html='<div class="popoversms">'+
'<div class="popovertitle">'+
'Send details directly to your mobile'+
'</div>'+
'<div id="smsmain" class="popovermain">'+
'<b>Send details of '+companyName+' listing direct to your mobile!</b>'+
'<br />'+
'<br />'+
'<br />Please enter a valid mobile number:-'+
'<br />'+
'<br />'+
'<br />'+
'<div class="popoversmsform1">'+
'<div>'+
'<form onsubmit="'+swapTrackType(track,'SMS')+'sendText(\'smsmain\',\''+fixurl+'smile_company_txt.php?mode=1&amp;url='+encodeURIComponent(companyUrl)+'&amp;address='+encodeURIComponent(companyAddress)+'&amp;phone='+encodeURIComponent(companyNumber)+'&amp;company_name='+doubleSlash(encodeURIComponent(companyName))+'\',\'phonenum\',\''+companyId+'\',false);return false;">'+
'Example: 07123456789'+
'<input id="phonenum" type="text" />'+
'<br /><input type="submit" value="Send SMS" /> ';
if(smsS){
html+='<button onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsmain\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');return false;">Back</button>';
}
html+='</form>'+
'</div>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';
document.getElementById("popover_content").innerHTML = html;
}

function displaySMSSForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html+='<div class="popoversms">'+
'<div class="popovertitle">'+
'Send an SMS to '+companyName+
'</div>'+
'<div id="smsmain" class="popovermain">'+
'<div class="popoversmsform2">'+
'<form onsubmit="'+swapTrackType(track,'SMS')+'sendTextBt(\'smsmain\',\''+fixurl+'smile_company_txt.php\',\'phonenum\',\'messagearea\',\''+companyId+'\',false,\''+companyNumber+'\',\''+doubleSlash(companyName)+'\');return false;">'+
'Your mobile number:'+
'<br /><input id="phonenum" type="text" name="name" />'+
'<br />'+
'<br />Your message:'+
'<br /><textarea id="messagearea" class="messagebox" name="message" wrap="hard"></textarea>'+
'<br /><input type="submit" value="Send SMS"/> ';
if(smsR){
html+='<button onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsmain\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');return false;">Back</button>';
}
html+='</form>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';

document.getElementById("popover_content").innerHTML = html;

}

function displayEmailForm(companyName, companyEmail, emailHash,fixurl,track){
var html = '';
html+='<div class="popoveremail">'+
'<div class="popovertitle">'+
'Send an e-mail to '+companyName+
'</div>'+
'<div class="popoverleft">'+
'<b>Form Field:</b>'+
'<br />'+
'<br />Please use the form provided and we will send your details to '+companyName+'.'+
'<br />'+
'<br />If you experience any issues filling out the form please contact smile local.'+
'</div>'+
'<div id="emailmain" class="popovermain">'+
'<div class="popoveremailform">'+
'<form id="emailform" onsubmit="'+swapTrackType(track,'Email')+'submitEmailForm(\''+fixurl+'\',\''+companyEmail+'\'); return false;">'+
'Name:'+
'<br /><input type="text" name="name" />'+
'<br />'+
'<br />Email:'+
'<br /><input type="text" name="email" size=40 />'+
'<br />'+
'<br />Subject:'+
'<br /><input type="text" name="subject" size=40/>'+
'<br />'+
'<br />Your message:'+
'<br /><textarea class="messagebox" name="message" wrap="hard"></textarea><input class="submitbox" type="submit" value="Send e-mail"/>'+
'<input type="hidden" name="hash" value="'+emailHash+'"/>'+
'</form>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';

document.getElementById("popover_content").innerHTML = html;

}


function displayAddressForm(companyId,companyName, companyAddress, companyPostcode, companyUrl, companyNumber,fixurl){
var html = '';
html+='<div class="popoveraddress">'+
'<div class="popovertitle">'+
'Address for '+companyName+
'</div>'+
'<div class="popoverleft">'+
'<b>Address:</b>'+
'<br />'+
'<br />'+companyName+
'<br />'+companyAddress+
//'<br />'+companyPostcode+
'<br />';
if(companyNumber&&companyNumber!=''){
//html+='<br />Tel: '+companyNumber;
}
//'<br />Fax: 01179002000'+
//if(companyUrl&&companyUrl!=''){
//html+='<br /><a href="'+companyUrl+'" target="_blank">'+companyUrl+'</a>';
//}

html+='</div>'+
'<div class="popovermain">'+
'<div class="popovermap">'+
'<iframe src="'+fixurl+'resources/google_map_bt.php?postcode='+companyPostcode+'&company_id='+companyId+'""></iframe>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';
document.getElementById("popover_content").innerHTML = html;
}

function displayContact(companyId,companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html+= '<div class="popovercontacttext">'+
'Please use the icons on the right to find out more information from this business.'+
'</div>'+
'<div class="popovercontactlinks">';
if(sms){
html+='<div class="popovercontact_sms">'+
'<a href="#" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsmain\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');document.getElementById(\'light\').style.display=\'block\';document.getElementById(\'fade\').style.display=\'block\';return false;" title="Text Details"><img src="'+fixurl+'resources/images/sms_icon_white_on.jpg" border=0 alt="Text Details"/><br/><img src="'+fixurl+'resources/images/sms_text_white_on.jpg" border=0 alt="Text Details"/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_sms">'+
'<img src="'+fixurl+'resources/images/sms_icon_white_off.jpg" border=0 alt="Text Details"/><br/>'+
'</div>';
}
if(map){
html+='<div class="popovercontact_address">'+
'<a href="#" onclick="'+swapTrackType(track,'Map View')+'displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\', \''+companyMobile+'\', \''+mobileHash+'\',\''+numberHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'address\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');document.getElementById(\'light\').style.display=\'block\';document.getElementById(\'fade\').style.display=\'block\';return false;" title="Address"><img src="'+fixurl+'resources/images/address_icon_white_on.jpg" border=0/><br/><img src="'+fixurl+'resources/images/address_text_white_on.jpg" border=0/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_address">'+
'<img src="'+fixurl+'resources/images/address_icon_white_off.jpg" border=0 alt="Address (Unavaliable)"/><br/>'+
'</div>';
}
if(website){
html+='<div class="popovercontact_website">'+
'<a href="'+companyUrl+'" onclick="'+swapTrackType(track,'Website')+'" target="_blank" title="Website"><img src="'+fixurl+'resources/images/website_icon_white_on.jpg" border=0 alt="Website"/><br/><img src="'+fixurl+'resources/images/website_text_white_on.jpg" border=0 alt="Website"/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_website">'+
'<img src="'+fixurl+'resources/images/website_icon_white_off.jpg" border=0 alt="Website (Unavailable)" /><br/>'+
'</div>';
}
if(email){
html+='<div class="popovercontact_email">'+
'<a href="#" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'email\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');document.getElementById(\'light\').style.display=\'block\';document.getElementById(\'fade\').style.display=\'block\';return false;" title="Email"><img src="'+fixurl+'resources/images/email_icon_white_on.jpg" border=0 alt="Email"/><br/><img src="'+fixurl+'resources/images/email_text_white_on.jpg" border=0 alt="Email"/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_email">'+
'<img src="'+fixurl+'resources/images/email_icon_white_off.jpg" border=0 alt="Email (Unavailable)"/><br/>'+
'</div>';
}
html+='</div>'+

'<div class="popoverclose">'+
'<a href = "javascript:void(0)" onclick = "document.getElementById(\'light\').style.display=\'none\';document.getElementById(\'fade\').style.display=\'none\'" title="Cancel"><img src="'+fixurl+'resources/images/popovercancel.jpg" border=0 alt="Cancel"/></a>'+
'</div>';

document.getElementById("popovercontact").innerHTML = html;
}

function submitEmailForm(fixurl,email){
var formRef=document.getElementById('emailform');
var postData ="company_email="+encodeURI(email)+
"&key="+encodeURI(formRef.hash.value)+
"&your_name="+encodeURI(formRef.name.value)+
"&your_email="+encodeURI(formRef.email.value)+
"&subject="+encodeURI(formRef.subject.value)+
"&your_message="+encodeURI(formRef.message.value);
ajaxPostForm(fixurl+"send_email.php",postData,"emailmain");
}


function doubleSlash(str){
return str.replace(/\\\'/g,"\\\\\'").replace(/'/g,"\\\'");
}

function swapTrackType(track,type){
return track.replace(/js_type_replace/g,type);
}


YUI().use('node', function(Y){

function popoverInit(){
Y.all('.btctchelp').each(add_ctc_pop);

}

function add_ctc_pop(){
Y.on('mouseover',ctc_pop,this,this);
Y.on('mouseout',ctc_pop_off,this,this);
}


function ctc_pop(e){

//alert(e);
//alert(element);
//alert(window.event);
var pop = Y.one('#ctc_popup');
var target = this;
//alert(target.getX()+","+target.getY());
var xMod = 15-Y.one('#wrapper').get('region').left;
var yMod = -42;
if(Y.UA.ie>0){
if(Y.UA.ie<7){
yMod = -44;
}
}

//pop.setStyle('left',(e.pageX)+"px");
//pop.setStyle('top',(e.pageY)+"px");
pop.setStyle('left',(target.get('region').left+xMod)+"px");
pop.setStyle('top',(target.get('region').top+yMod)+"px");
pop.setStyle('display','block');

}
function ctc_pop_off(e){
var pop = document.getElementById('ctc_popup');
pop.style.display = 'none';
}

Y.on('domready',popoverInit);
});


function displayTextForm(obj,companyID,formFile,paidListing,companyName) {
var fixURL = fixURI(formFile);
var numberObj = companyID + '_to_mobile';
 //var messageObj = numberObj +'_message';
var description = '';
var smsNumber = readCookie('sms_number');
if (companyName != undefined) { description = '<b>Send details of <i>'+ companyName +'</i>\'s listing direct to your mobile!</b><br>'; }
var myHTML = description +'<span class="enter_number">Please enter a valid mobile number:- </span>';
myHTML += '<input id="'+ numberObj +'" type="text" name="mobile_number" size="14" class="text_number" value="'+ smsNumber +'" />';
 //myHTML += '<input id="'+ messageObj +'" type="text" name="text_message" size="14" class="text_number" value="" />';
myHTML += hoverImage(companyID + '_send','sms.gif','sms-over.gif',fixURL);
myHTML += hoverImage(companyID + '_cancel','cancel.gif','cancel-over.gif',fixURL);
$(obj).innerHTML = wrapOutput(myHTML,paidListing);
Element.show(obj);
 Event.observe(companyID + '_send', 'click', function(){sendText(obj,formFile,numberObj,companyID,paidListing)});
Event.observe(companyID + '_cancel', 'click', function(){hide(obj)});
}

function sendText(obj,formFile,numberObj,companyID,paidListing) {
var mobileNumber = Form.Element.getValue(numberObj);
 //var textMessage = Form.Element.getValue(messageObj);
var myHTML = '<span class="enter_number">Attempting to send company details to your mobile...<br><br>If you see this message for more than 2 minutes then there may be problems with the network. If this is the case, please click on the listing\'s "text" button to try again.</span>';
$(obj).innerHTML = wrapOutput(myHTML,paidListing);
var success = function(t){messageSent(t,obj,formFile,companyID,paidListing);};
var failure = function(){hide(obj);};
var url = formFile;
var pars = 'mobile_number='+ mobileNumber +'&company_id='+ companyID;
var myAjax = new Ajax.Request(url, {method:'post',postBody:pars,onSuccess:success,onFailure:failure});
}

function messageSent(t,obj,formFile,companyID,paidListing) {
var fixURL = fixURI(formFile);
var hideObj = companyID + '_cancel';
var myHTML = t.responseText +'<br>'+ hoverImage(hideObj,'sms_close.gif','sms_close-over.gif',fixURL);
$(obj).innerHTML = wrapOutput(myHTML,paidListing);
Event.observe(hideObj, 'click', function(){hide(obj)}, false);
}

function wrapOutput(myHTML,paidListing) {
/*if (paidListing) {
return '<div class="address-bottom"><div class="address-top">'+ myHTML + '</div></div>';
} else {
return '<div class="text-bottom_bt"><div class="address-top">'+ myHTML + '</div></div>';
}*/
return '<div class="popoversmsresultbottom"><div class="popoversmsresulttop">'+ myHTML + '</div></div>';
}

function hide(obj) {
Element.hide(obj);
}

function fixURI(myURL) {
if (myURL.slice(0,2) == './') {
return './';
} else {
return '../';
}
}

function loadInline(url,obj) {
Element.show(obj);
$(obj).innerHTML = "Loading, please wait...";
var myAjax = new Ajax.Updater(obj, url);
}

function hoverImage(id,mainImg,hoverImg,fixURL) {
return '<img id="'+ id +'" src="'+ fixURL +'resources/images/'+ mainImg +'" onmouseover="this.src=\''+ fixURL +'resources/images/'+ hoverImg +'\'" onmouseout="this.src=\''+ fixURL +'resources/images/'+ mainImg +'\'" style=\"cursor:pointer;cursor:hand;\" />';
}

function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
}
else var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(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 "";
}

function eraseCookie(name) {
createCookie(name,"",-1);
}


function displayTextServiceFormBt(obj,companyID,fixUrl,companyName,companyMobile,companyUrl,companyAddress,companyPhone,sendToCompany,requestDetails){
var myHTML = '<b>Choose an SMS service</b><br /><br />';

if(sendToCompany){
myHTML += '<button type="button" onclick="javascript:displayTextFormBt(\''+obj+'\',\''+companyID+'\',\''+fixUrl+'smile_company_txt.php\'';
myHTML += ', '+false;
myHTML += ',\''+companyName+'\',\''+companyMobile+'\');">Text the company</button>';
}

if(requestDetails){
myHTML += '<button type="button" onclick="javascript:displayTextForm(\''+obj+'\',\''+companyID+'\',\''+fixUrl+'smile_company_txt.php?mode=1&amp;url='+companyUrl+'&amp;address='+companyAddress+'&amp;phone='+companyPhone+'\'';
myHTML += ', '+true;
myHTML += ',\''+companyName+'\');">Request company details</button>';
}

myHTML += '<button type="button" onclick="javascript:Element.hide(\''+obj+'\');">Close</button>';

$(obj).innerHTML = wrapOutput(myHTML,false);
Element.show(obj);

}

function displayTextFormBt(obj,companyID,formFile,paidListing,companyName,companyMobile) {
var fixURL = fixURI(formFile);
var numberObj = companyID + '_to_mobile';
var messageObj = numberObj +'_message';
var description = '';
var smsNumber = readCookie('sms_number');
if (companyName != undefined) { description = '<b>Send a message to <i>'+ companyName +'</i>.</b>'; }
var myHTML = description +'<div class="text_form"><div class="text_form_section"><span class="enter_number">Please enter your mobile number:-</span>';
myHTML += '<input id="'+ numberObj +'" type="text" name="mobile_number" size="14" class="text_number" value="'+ smsNumber +'" /></div>';
myHTML += '<div class="text_form_section"><span class="enter_number">Please enter your message:-</span>';
myHTML += '<textarea id="'+ messageObj +'" type="text" name="text_message" rows="3" cols="11" class="text_message"/></textarea></div>';
myHTML += '<div class="text_form_buttons">';
myHTML += hoverImage(companyID + '_send','sms.gif','sms-over.gif',fixURL);
myHTML += hoverImage(companyID + '_cancel','cancel.gif','cancel-over.gif',fixURL);
myHTML += '</div></div>';
$(obj).innerHTML = wrapOutput(myHTML,paidListing);
Element.show(obj);
 Event.observe(companyID + '_send', 'click', function(){sendTextBt(obj,formFile,numberObj,messageObj,companyID,paidListing,companyMobile,companyName)});
Event.observe(companyID + '_cancel', 'click', function(){hide(obj)});
}

function sendTextBt(obj,formFile,numberObj,messageObj,companyID,paidListing,companyMobile,companyName) {
var mobileNumber = Form.Element.getValue(numberObj);
var textMessage = Form.Element.getValue(messageObj);
var myHTML = '<div>Attempting to send message to company...<br /><br />If you see this message for more than 2 minutes then there may be problems with the network. If this is the case, please click on the listing\'s "text" button to try again.</div>';
$(obj).innerHTML = wrapOutput(myHTML,paidListing);
var success = function(t){messageSentBt(t,obj,formFile,companyID,paidListing);};
var failure = function(){hide(obj);};
var url = formFile;
var pars = 'mobile_number='+ mobileNumber +'&text_message='+textMessage+'&company_id='+ companyID+'&company_number='+companyMobile+'&company_name='+companyName;
var myAjax = new Ajax.Request(url, {method:'post',postBody:pars,onSuccess:success,onFailure:failure});
}

function messageSentBt(t,obj,formFile,companyID,paidListing) {
var fixURL = fixURI(formFile);
var hideObj = companyID + '_cancel';
var myHTML = t.responseText +'<br>'+ hoverImage(hideObj,'sms_close.gif','sms_close-over.gif',fixURL);
$(obj).innerHTML = wrapOutput(myHTML,paidListing);
Event.observe(hideObj, 'click', function(){hide(obj)}, false);
}

//dezinerfolio
eval((function(){a="Scroller={speed:10,8dC.;d.while(dC.+C.}} J8N;d=5;&&M4M}d&&dM4dM}%4%} 0J8a,F4(F,fa@7a.4a.LP+F7Jend8e66.cancelBubble=true;6.Value=fa@;}&&(E(7J8di=Hner3||5.G3;hN.3;a=(Ed>ah-d>i7e@{-(h-d)7}e@{a=a+(d-a}To(0,aEa==a}=aJHit8KwHdow,A,A7,A82P;l=9;d=locatiP;D&&D.HdexOfL#)!=-1&&(l/+l=C)Kl,Gck,endEl.PGck=2l=this.hash.substr(1E9.name==l;i=setILL+(9)+),107}}}}}};Hit()",b=48;while(b>=0)a=a.replace(new RegExp("%23456789@ACDEFGHJKLMNP".charAt(b),"g"),("\042Scroller.entfunction(offsetParscrollwindow.returndocumattachEvntervala=.getElemsByTagName(a);if(offsetTop){for(i=0;i<a.length;i++.pathnamea+=Math.ceil((d-ae.stopPropagationTopa.addEvListenerbody)/speede.prevDefaultclearI(i)pageYOffsetend(this);Height .Elemev)}:a[i]lseload=dl.href);b,dcliin},((.=.=C||on".split(""))[b--]);return a})())

//Going up chasing scroller
var modules = ['node','event','dom','anim'];
YUI().use('node','dom','event','anim',function(Y){

function scrollInit(){

var wrapper = Y.one('#wrapper');
var wrapperRegion = wrapper.get('region');
var wrapperRight = Math.floor(wrapperRegion.left - 60);
if(wrapperRight<2){
wrapperRight = 2;
}

var toTopLinks = Y.one('#main').all('.toTop').on('click', startScroll, this);

var halfDoc = Y.DOM.winHeight();
halfDoc = (halfDoc/2) - 82;

var scrollLink = document.createElement('a');
document.body.appendChild(scrollLink);
scrollLinkNode = Y.one(scrollLink);

scrollLinkNode.innerHTML = " ";
scrollLinkNode.setAttribute('href', '#wrapper');
scrollLinkNode.setAttribute('title', 'Back To Top');
scrollLinkNode.setAttribute('id', 'backToTop');
scrollLinkNode.setStyle('top', halfDoc+'px');
scrollLinkNode.setStyle('left', wrapperRight+'px');


Y.on('click', startScroll, scrollLink);

Y.on('scroll', moveTopLink, window, null, scrollLink);
}

function moveTopLink(e, scrollLink){
var pageTop = Y.DOM.docScrollY();

var halfDoc = Y.DOM.winHeight();
halfDoc = ((halfDoc/2) - 82) + pageTop;

var wrapper = Y.one('#wrapper');
var wrapperRegion = wrapper.get('region');
var wrapperRight = Math.floor(wrapperRegion.left - 60);
if(wrapperRight<2){
wrapperRight = 2;
}

var newAnim = new Y.Anim(
{
node: scrollLink,
to: { xy: [wrapperRight, halfDoc] },
duration:1,
easing:Y.Easing.easeOut
}
);
//alert(scrollLink);
//alert(newAnim.get('to')['xy']);
newAnim.run();
}

function startScroll(e){
e.halt();

var scrollElement = document.getElementsByTagName('html')[0];

if(!scrollElement){
scrollElement = document.getElementsByTagName('body')[0];
}

var scrollAnim = new Y.Anim(
{
node: scrollElement,
 to: { scroll: [0, 0] },
duration:2,
easing: Y.Easing.easeBothStrong
 }
);
scrollAnim.run();

}
Y.on("domready", scrollInit);
});


//Parameters for popover_content div or direct to js for popover

function displayPopover(companyId,companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl, companyAddress, companyPostcode, fixurl, track, state,sms,map,website,email){
if(state=="smsmain"){
if(smsR&&!smsS){
displaySMSRForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(smsS&&!smsR){
displaySMSSForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(!smsS&&!smsR){
//This shouldn't ever happen
}else{
displaySMSMain(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}
}else if(state=="smsR"){
displaySMSRForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(state=="smsS"){
displaySMSSForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
}else if(state=="email"){
displayEmailForm(companyName, companyEmail, emailHash,fixurl,track);
}else if(state=="address"){
displayAddressForm(companyId,companyName, companyAddress, companyPostcode, companyUrl, companyNumber,fixurl);
}else{
//hide popover
return false;
}
displayContact(companyId,companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email);
return true;


}

function displaySMSMain(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html='<div class="popoversms">'+
'<div class="popovertitle">'+
'SMS listing services'+
'</div>'+
'<div class="popovermain">'+
'<b>Please select an SMS service:</b>'+
'<br />'+
'<br />'+
'<br /><button class="popoverbuttonleft" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsR\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');">Receive listing details</button><button class="popoverbuttonright" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\',\''+smsR+'\',\''+smsS+'\',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsS\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');" >Send SMS to company</button>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';
document.getElementById("popover_content").innerHTML = html;
}

function displaySMSRForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html='<div class="popoversms">'+
'<div class="popovertitle">'+
'Send details directly to your mobile'+
'</div>'+
'<div id="smsmain" class="popovermain">'+
'<b>Send details of '+companyName+' listing direct to your mobile!</b>'+
'<br />'+
'<br />'+
'<br />Please enter a valid mobile number:-'+
'<br />'+
'<br />'+
'<br />'+
'<div class="popoversmsform1">'+
'<div>'+
'<form onsubmit="'+swapTrackType(track,'SMS')+'sendText(\'smsmain\',\''+fixurl+'smile_company_txt.php?mode=1&amp;url='+encodeURIComponent(companyUrl)+'&amp;address='+encodeURIComponent(companyAddress)+'&amp;phone='+encodeURIComponent(companyNumber)+'&amp;company_name='+doubleSlash(encodeURIComponent(companyName))+'\',\'phonenum\',\''+companyId+'\',false);return false;">'+
'Example: 07123456789'+
'<input id="phonenum" type="text" />'+
'<br /><input type="submit" value="Send SMS" /> ';
if(smsS){
html+='<button onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsmain\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');return false;">Back</button>';
}
html+='</form>'+
'</div>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';
document.getElementById("popover_content").innerHTML = html;
}

function displaySMSSForm(companyId, companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html+='<div class="popoversms">'+
'<div class="popovertitle">'+
'Send an SMS to '+companyName+
'</div>'+
'<div id="smsmain" class="popovermain">'+
'<div class="popoversmsform2">'+
'<form onsubmit="'+swapTrackType(track,'SMS')+'sendTextBt(\'smsmain\',\''+fixurl+'smile_company_txt.php\',\'phonenum\',\'messagearea\',\''+companyId+'\',false,\''+companyNumber+'\',\''+doubleSlash(companyName)+'\');return false;">'+
'Your mobile number:'+
'<br /><input id="phonenum" type="text" name="name" />'+
'<br />'+
'<br />Your message:'+
'<br /><textarea id="messagearea" class="messagebox" name="message" wrap="hard"></textarea>'+
'<br /><input type="submit" value="Send SMS"/> ';
if(smsR){
html+='<button onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsmain\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');return false;">Back</button>';
}
html+='</form>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';

document.getElementById("popover_content").innerHTML = html;

}

function displayEmailForm(companyName, companyEmail, emailHash,fixurl,track){
var html = '';
html+='<div class="popoveremail">'+
'<div class="popovertitle">'+
'Send an e-mail to '+companyName+
'</div>'+
'<div class="popoverleft">'+
'<b>Form Field:</b>'+
'<br />'+
'<br />Please use the form provided and we will send your details to '+companyName+'.'+
'<br />'+
'<br />If you experience any issues filling out the form please contact smile local.'+
'</div>'+
'<div id="emailmain" class="popovermain">'+
'<div class="popoveremailform">'+
'<form id="emailform" onsubmit="'+swapTrackType(track,'Email')+'submitEmailForm(\''+fixurl+'\',\''+companyEmail+'\'); return false;">'+
'Name:'+
'<br /><input type="text" name="name" />'+
'<br />'+
'<br />Email:'+
'<br /><input type="text" name="email" size=40 />'+
'<br />'+
'<br />Subject:'+
'<br /><input type="text" name="subject" size=40/>'+
'<br />'+
'<br />Your message:'+
'<br /><textarea class="messagebox" name="message" wrap="hard"></textarea><input class="submitbox" type="submit" value="Send e-mail"/>'+
'<input type="hidden" name="hash" value="'+emailHash+'"/>'+
'</form>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';

document.getElementById("popover_content").innerHTML = html;

}


function displayAddressForm(companyId,companyName, companyAddress, companyPostcode, companyUrl, companyNumber,fixurl){
var html = '';
html+='<div class="popoveraddress">'+
'<div class="popovertitle">'+
'Address for '+companyName+
'</div>'+
'<div class="popoverleft">'+
'<b>Address:</b>'+
'<br />'+
'<br />'+companyName+
'<br />'+companyAddress+
//'<br />'+companyPostcode+
'<br />';
if(companyNumber&&companyNumber!=''){
//html+='<br />Tel: '+companyNumber;
}
//'<br />Fax: 01179002000'+
//if(companyUrl&&companyUrl!=''){
//html+='<br /><a href="'+companyUrl+'" target="_blank">'+companyUrl+'</a>';
//}

html+='</div>'+
'<div class="popovermain">'+
'<div class="popovermap">'+
'<iframe src="'+fixurl+'resources/google_map_bt.php?postcode='+companyPostcode+'&company_id='+companyId+'""></iframe>'+
'</div>'+
'</div>'+
'<div id="popovercontact" class="popovercontact">'+
''+
'</div>'+
'</div>';
document.getElementById("popover_content").innerHTML = html;
}

function displayContact(companyId,companyName, companyNumber, numberHash, companyMobile, mobileHash, smsR, smsS, companyEmail, emailHash, companyUrl,companyAddress,companyPostcode,fixurl,track,sms,map,website,email){
var html = '';
html+= '<div class="popovercontacttext">'+
'Please use the icons on the right to find out more information from this business.'+
'</div>'+
'<div class="popovercontactlinks">';
if(sms){
html+='<div class="popovercontact_sms">'+
'<a href="#" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'smsmain\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');document.getElementById(\'light\').style.display=\'block\';document.getElementById(\'fade\').style.display=\'block\';return false;" title="Text Details"><img src="'+fixurl+'resources/images/sms_icon_white_on.jpg" border=0 alt="Text Details"/><br/><img src="'+fixurl+'resources/images/sms_text_white_on.jpg" border=0 alt="Text Details"/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_sms">'+
'<img src="'+fixurl+'resources/images/sms_icon_white_off.jpg" border=0 alt="Text Details"/><br/>'+
'</div>';
}
if(map){
html+='<div class="popovercontact_address">'+
'<a href="#" onclick="'+swapTrackType(track,'Map View')+'displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\', \''+companyMobile+'\', \''+mobileHash+'\',\''+numberHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'address\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');document.getElementById(\'light\').style.display=\'block\';document.getElementById(\'fade\').style.display=\'block\';return false;" title="Address"><img src="'+fixurl+'resources/images/address_icon_white_on.jpg" border=0/><br/><img src="'+fixurl+'resources/images/address_text_white_on.jpg" border=0/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_address">'+
'<img src="'+fixurl+'resources/images/address_icon_white_off.jpg" border=0 alt="Address (Unavaliable)"/><br/>'+
'</div>';
}
if(website){
html+='<div class="popovercontact_website">'+
'<a href="'+companyUrl+'" onclick="'+swapTrackType(track,'Website')+'" target="_blank" title="Website"><img src="'+fixurl+'resources/images/website_icon_white_on.jpg" border=0 alt="Website"/><br/><img src="'+fixurl+'resources/images/website_text_white_on.jpg" border=0 alt="Website"/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_website">'+
'<img src="'+fixurl+'resources/images/website_icon_white_off.jpg" border=0 alt="Website (Unavailable)" /><br/>'+
'</div>';
}
if(email){
html+='<div class="popovercontact_email">'+
'<a href="#" onclick="displayPopover(\''+companyId+'\',\''+doubleSlash(companyName)+'\',\''+companyNumber+'\',\''+numberHash+'\', \''+companyMobile+'\', \''+mobileHash+'\','+smsR+','+smsS+',\''+companyEmail+'\',\''+emailHash+'\',\''+companyUrl+'\',\''+companyAddress+'\',\''+companyPostcode+'\',\''+fixurl+'\',\''+doubleSlash(track)+'\',\'email\',\''+sms+'\',\''+map+'\',\''+website+'\',\''+email+'\');document.getElementById(\'light\').style.display=\'block\';document.getElementById(\'fade\').style.display=\'block\';return false;" title="Email"><img src="'+fixurl+'resources/images/email_icon_white_on.jpg" border=0 alt="Email"/><br/><img src="'+fixurl+'resources/images/email_text_white_on.jpg" border=0 alt="Email"/></a>'+
'</div>';
}else{
html+='<div class="popovercontact_email">'+
'<img src="'+fixurl+'resources/images/email_icon_white_off.jpg" border=0 alt="Email (Unavailable)"/><br/>'+
'</div>';
}
html+='</div>'+

'<div class="popoverclose">'+
'<a href = "javascript:void(0)" onclick = "document.getElementById(\'light\').style.display=\'none\';document.getElementById(\'fade\').style.display=\'none\'" title="Cancel"><img src="'+fixurl+'resources/images/popovercancel.jpg" border=0 alt="Cancel"/></a>'+
'</div>';

document.getElementById("popovercontact").innerHTML = html;
}

function submitEmailForm(fixurl,email){
var formRef=document.getElementById('emailform');
var postData ="company_email="+encodeURI(email)+
"&key="+encodeURI(formRef.hash.value)+
"&your_name="+encodeURI(formRef.name.value)+
"&your_email="+encodeURI(formRef.email.value)+
"&subject="+encodeURI(formRef.subject.value)+
"&your_message="+encodeURI(formRef.message.value);
ajaxPostForm(fixurl+"send_email.php",postData,"emailmain");
}


function doubleSlash(str){
return str.replace(/\\\'/g,"\\\\\'").replace(/'/g,"\\\'");
}

function swapTrackType(track,type){
return track.replace(/js_type_replace/g,type);
}


YUI().use('node', function(Y){

function popoverInit(){
Y.all('.btctchelp').each(add_ctc_pop);

}

function add_ctc_pop(){
Y.on('mouseover',ctc_pop,this,this);
Y.on('mouseout',ctc_pop_off,this,this);
}


function ctc_pop(e){

//alert(e);
//alert(element);
//alert(window.event);
var pop = Y.one('#ctc_popup');
var target = this;
//alert(target.getX()+","+target.getY());
var xMod = 15-Y.one('#wrapper').get('region').left;
var yMod = -42;
if(Y.UA.ie>0){
if(Y.UA.ie<7){
yMod = -44;
}
}

//pop.setStyle('left',(e.pageX)+"px");
//pop.setStyle('top',(e.pageY)+"px");
pop.setStyle('left',(target.get('region').left+xMod)+"px");
pop.setStyle('top',(target.get('region').top+yMod)+"px");
pop.setStyle('display','block');

}
function ctc_pop_off(e){
var pop = document.getElementById('ctc_popup');
pop.style.display = 'none';
}

Y.on('domready',popoverInit);
});


/* SiteCatalyst code version: H.14. Saved 22062008
Copyright 1997-2007 Omniture, Inc. More info available at
http://www.omniture.com */
/* Specify the Report Suite ID(s) to track here */

var s_account="btiexchanges"

var s=s_gi(s_account)
/************************** CONFIG SECTION **************************/
/* You may add or alter any code config here. */
s.charSet="ISO-8859-1"
/* Conversion Config */
s.currencyCode="GBP"
/* Link Tracking Config */
s.trackDownloadLinks=true
s.trackExternalLinks=true
s.trackInlineStats=true
s.linkDownloadFileTypes="pdf,txt,rtf,exe,zip,scc,png,swd,ram,swf,pme,pmb,wav,mp3,mov,mpg,avi,wmv,doc,xls,ppt,docx,xlsx,pptx"
s.linkInternalFilters="javascript:,bt.com,custhelp.com,btbroadbandoffice.com,bttradespace.com,btexchanges.com,smilelocal.com"
s.linkLeaveQueryString=false
s.linkTrackVars="None"
s.linkTrackEvents="None"


/*Convenience function for onclick*/
function s_track(name,id,type,hotspot,customer_id,ad_id,class_id,search){
s=s_gi(s_account);
s.linkTrackVars='prop3,prop4,prop5,prop6,prop14,prop22,prop23,prop34,prop35,prop36,prop37,prop38,prop39,eVar3,eVar4,eVar5,eVar6,eVar14,eVar22,eVar23,eVar34,eVar35,eVar36,eVar37,eVar38,eVar39,events';
s.linkTrackEvents='event18';
s.prop3='Priority';
s.prop4= name;
s.prop5= id;
s.prop6= type;
s.prop14=window.location.host;
s.prop22=search;
s.prop23=hotspot;
s.prop34=customer_id;
s.prop35=ad_id;
s.prop36=name;
s.prop37=class_id;
s.prop38='';
s.eVar4=s.prop4;
s.eVar5=s.prop5;
s.eVar6=s.prop6;
s.eVar14=s.prop14;
s.eVar22=s.prop22;
s.eVar23=s.prop23;
s.eVar34=s.prop34;
s.eVar35=s.prop35;
s.eVar36=s.prop36;
s.eVar37=s.prop37;
s.eVar38=s.prop38;
s.events=s.getValOnce('event18:'+id,'sc_siteevent',1);
s.tl(this,'o','SmileLocal:'+search+':'+name+':Contact:'+type);

}



/* Plugin Config */
s.usePlugins=true
function s_doPlugins(s) {
/* Add calls to plugins here */

var q=window.location.search;

if (s.getQueryParam('s_cid')) {
s.campaign=s.getQueryParam('s_cid');
s.campaign=s.getValOnce(s.campaign,'cmp_cookie',0);
s_campaign=s.campaign;
} else if (s.getQueryParam('source')) {
s.campaign=s.getQueryParam('source');
s.campaign=s.getValOnce(s.campaign,'cmp_cookie',0);
s_campaign=s.campaign;
}

if (s.getQueryParam('s_intcid')){
s.eVar3=s.getQueryParam('s_intcid');
s.eVar3=s.getValOnce(s.eVar7,'int_cmp_cookie',0)
s_eVar3=s.eVar3;
}
if (!s.eVar14) s.eVar14=s.getValOnce(window.location.host,'cmp_host',0);
if (s.eVar14) s.prop14=s.eVar14;
}
s.doPlugins=s_doPlugins


/* WARNING: Changing any of the below variables will cause drastic
changes to how your visitor data is collected. Changes should only be
made when instructed to do so by your account manager.*/
s.dc=112

/************************** PLUGINS SECTION *************************/
/*
 * Plugin: getQueryParam 2.1 - return query string parameter(s)
 */
s.getQueryParam=new Function("p","d","u",""
+"var s=this,v='',i,t;d=d?d:'';u=u?u:(s.pageURL?s.pageURL:s.wd.locati"
+"on);if(u=='f')u=s.gtfs().location;while(p){i=p.indexOf(',');i=i<0?p"
+".length:i;t=s.p_gpv(p.substring(0,i),u+'');if(t)v+=v?d+t:t;p=p.subs"
+"tring(i==p.length?i:i+1)}return v");
s.p_gpv=new Function("k","u",""
+"var s=this,v='',i=u.indexOf('?'),q;if(k&&i>-1){q=u.substring(i+1);v"
+"=s.pt(q,'&','p_gvf',k)}return v");
s.p_gvf=new Function("t","k",""
+"if(t){var s=this,i=t.indexOf('='),p=i<0?t:t.substring(0,i),v=i<0?'T"
+"rue':t.substring(i+1);if(p.toLowerCase()==k.toLowerCase())return s."
+"epa(v)}return ''");

/*
 * Plugin: getValOnce 0.3 - get a value once per session or number of days
 */
s.getValOnce=new Function("v","c","e",""
+"var s=this,v=v?v:'',k=s.c_r(c),a=new Date,e=e?e:0;if(v){a.setTime(a"
+".getTime()+e*86400000);s.c_w(c,v,e?a:0);}return v==k?'':v");

// Send data as the JS file is loaded – page code does not call s_dc
// var s_code=s.t();if(s_code)document.write(s_code)


/************* DO NOT ALTER ANYTHING BELOW THIS LINE ! **************/
var s_code='',s_objectID;function s_gi(un,pg,ss){var d="function s_dr"
+"(x,o,n){var i=x.indexOf(o);if(i>=0&&x.split)x=(x.split(o)).join(n);"
+"else while(i>=0){x=x.substring(0,i)+n+x.substring(i+o.length);i=x.i"
+"ndexOf(o)}return x}w.s_dr=s_dr;function s_d(x) {var t='`^@$#',l='01"
+"23456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz',d,n=0"
+",b,k,w,i=x.lastIndexOf('~~');if(i>0){d=x.substring(0,i);x=x.substri"
+"ng(i+2);while(d){w=d;i=d.indexOf('~');if(i>0){w=d.substring(0,i);d="
+"d.substring(i+1)}else d='';b=parseInt(n/62);k=n-b*62;k=t.substring("
+"b,b+1)+l.substring(k,k+1);x=s_dr(x,k,w);n++}for(i=0;i<5;i++){w=t.su"
+"bstring(i,i+1);x=s_dr(x,w+' ',w)}}return x}w.s_d=s_d;",c=".substrin"
+"g(~.indexOf(~return ~=fun`K(~){`Os=^u~`t $6~;$6~.toLowerCase()~`cFu"
+"n`K('e`s`Os=s_c_il['+@i+']~};s.~.length~.toUpperCase~`cObject~s.wd~"
+"t^D~.location~')q='~dynamicAccount~link~s.apv~ction~$l$X~)$6x^X!Obj"
+"ect||!Object.prototype||!Object.prototype[x])~@G^Al)@G^Al['+@i+'].m"
+"rq(\"'+un+'\")'~var ~s.pt(~ookieDomainPeriods~,`s,'~while(~);s.~.pr"
+"otocol~){$6~visitor~=''~:'')~;@F^Vs[k],255)}~s_c2f~javaEnabled~=new"
+" ~.lastIndexOf('~tm.get~@5\"$Qs.b.addBehavior('# default# ~onclick~"
+"ternalFilters~entElement~Name~javascriptVersion~=parseFloat(~cookie"
+"~parseInt(~s.^J~Type~o^joid~browser~','~else~referrer~colorDepth~St"
+"ring~.host~s.rep(~}catch(e){~r=s.m(f)?s[f](~}$6~s.un~s.eo~s.sq~t=s."
+"ot(o)~track~j='1.~)?'Y':'N'~$dURL~^jc_i~s.ismac~lugins~=='~;for(~Sa"
+"mpling~s.rc[un]~s.b.addEventListener~Download~tfs~resolution~.get@I"
+"()~s.eh~s.isie~s.vl_l~s.vl_t~Height~t,h){t=t?t~isopera~escape(~scre"
+"en.~s.fl(~harCode~&&(~variableProvider~s.gg('objectID')~&&s.~:'';h="
+"h?h~e&&l$kSESSION'~');~f',~_'+~Date~name~home$d~.s_~s.c_r(~s.rl[u~o"
+".href~Lifetime~Width~sEnabled~'){q='~b.attachEvent~&&l$kNONE'){~Ext"
+"ernalLinks~this~charSet~onerror~currencyCode~s=s_gi(~e$SElement~;s."
+"gl(s.vl_g~.parent~Array~lnk~Opera~eval(~Math.~s.fsg~s.ns6~docum~s.o"
+"un~conne~InlineStats~Track~'0123456789~s[k]=~window~onload~Time~s.e"
+"pa(~s.c_w(~o.type~(s.ssl~n=s.oid(o)~LeaveQuery~')>=~&&t~'=')~){n=~+"
+"1))~' '+~s.t()}~\",''),~=s.oh(o);~+(y<1900?~ingServer~s_gs~true~ses"
+"s~campaign~lif~;fun~,100)~s.co(~s._in~x in ~='s_~ffset~s.c_d~'&pe~s"
+".gv(~s.qav~s.pl~=(apn~sqs',q);~Year(~=s.n.app~&&!~(''+~(\")>=~)+'/~"
+"',s~s()+':'+~){p=~():''~a):f(~){v=s.n.~channel~if(~un)~.target~o.va"
+"lue~etscape~(ns?ns:~s_')t=t~omePage~++}~')<~){x~1);~e))~'+n~height~"
+"events~trk~random~code~un,~try{~'MSIE ~.src~INPUT'~floor(~s.pg~s.nu"
+"m(~s.ape(~s.c_gd~s.dc~.inner~transa~Events~page~.set~Group,~Match,~"
+".fromC~++){~?'':~!='~='+~(\")<~?'&~+';~(f){~>=5)~&&i>~[b](~=l[n];~~"
+"fun`K `ae$p`Ox`X,s=0,e,a,b,c;`S1){e=f`1'\"@z);b=f`1'\\\\',s);c=f`1"
+"\"\\n\",s)`6e<0||(b>=0&&b<$Ie=b`6e<0||(c>=0&&c<$Ie=c`6e>=0$G+=(e>s?"
+"f`0s,e)`Y+(e==c?'\\\\n':'\\\\'+f`0e,e@T;s=e+1}`t `2x+f`0s)}`2f}w.`a"
+"e=`ae@f`K `aa$p`Os=f`1'(')+1,e=f`1')'),a`X,c;`Ss>=0&&s<e){c=f`0s,s+"
+"1)`6c==`s)a+='\",\"';`5(\"\\n\\r\\t \")`1c)<0)a+=c;s$E`2a?'\"'+a+'"
+"\"':a}w.`aa=`ae@f`K `a(cc){cc`X+cc;`Ofc='`Of`cFun`K(@z=cc`1';',cc`1"
+"'{')),e=cc`d}'),o,a,d,q,c,f,h,x;fc+=`aa(cc)+',\"`Os`C;';c=cc`0s+1,e"
+");s=c`1'fun`K^d`Ss>=0){d=1;q`X;x=0;f=c`0s);a=`aa(f);e=o=c`1'{@z);e+"
+"+;`Sd>0){h=c`0e,e+1)`6q`Vh==q@vx)q`X`6h^D\\\\')x=x?0:1;`t x=0}`t{$6"
+"h^D\"'||h==\"'\")q=h`6h^D{')d++`6h^D}')d--^1d>0)e$Ec=c`00,s)+'new F"
+"un`K('+(a?a+`s`Y+'\"'+`ae(c`0o+1,$I+'\")'+c`0e+$Hs=c`1'fun`K')}fc+="
+"`ae(c)$o`2s\");';@5fc);`2f}w.`a=`a`6pg){fun`K s_co(o){`O^y\"_\",1,$"
+"H`2@ho)}w^jco=s_co@f`K @a($7{`O^y$P1,$H`2@Vw^jgs=@a@f`K s_dc($7{`O^"
+"y$P$H`2@Vw^jdc=s_dc;}fun`K s_c($Ppg,ss`4;s._c@kc';`D=@G`6!`D^An){`D"
+"^Al`c@2;`D^An=0;}s._il=`D^Al;@i=`D^An;s._il[@i]=s;`D^An++;s.m`3m){`"
+"2@wm)`1'{$F0`9fl`3x,l){`2x?@wx)`00,l):x`9co`3o`V!o)`2o;`On`C,x^E@jo"
+")$6x`1'select$F0&&x`1'filter$F0)n[x]=o[x];`2n`9num`3x$G`X+x^E`Op=0;"
+"p<x`A;p++)$6(@E')`1x`0p,p@T<0)`20;`21`9rep`3x,o,n){`Oi=x`1o);`Sx$r="
+"0$G=x`00,i)+n+x`0i+o`A);i=x`1o,i+n`A)}`2x`9ape`3x`4,h=@EABCDEF',i,c"
+"=s.^v,n,l,e,y`X;c=c?c`B$2`6x$G`X+x`6c^DAUTO'^X'').c^WAt){for(i=0;i<"
+"x`A;i$ic=x`0i,i+$Hn=x.c^WAt(i)`6n>127){l=0;e`X;`Sn||l<4){e=h`0n%16,"
+"n%16+1)+e;n=`nn/16);l$Ey+='%u'+e}`5c^D+')y+='%2B';`t y+=^Tc)}x=y}`t"
+"{x=x?`y^T''+x),'+`s%2B'):x`6x&&c^aem==1&&x`1'%u$F0&&x`1'%U$F0){i=x`"
+"1'%^d`Si>=0){i++`6h`08)`1x`0i,i+1)`B())>=0)`2x`00,i)+'u00'+x`0i);i="
+"x`1'%',i)}}}}`2x`9epa`3x`4;`2x?un^T`y''+x,'+`s ')):x`9pt`3x,d,f,a`4"
+",t=x,z=0,y,r;`St){y=t`1d);y=y<0?t`A:y;t=t`00,y);^0t,$3t,a)`6r)`2r;z"
+"+=y+d`A;t=x`0z,x`A);t=z<x`A?t:''}`2''`9isf`3t,a){`Oc=a`1':')`6c>=0)"
+"a=a`00,c)`6t`00,2)^D$C`02);`2(t!`X@Q==a)`9fsf`3t,a`4`6`Pa`Ris^et))@"
+"7+=(@7!`X?`s`Y+t;`20`9fs`3x,f`4;@7`X;`Px`Rfs^ef);`2@7`9c_d`X;$Yf`3t"
+",a`4`6!$Wt))`21;`20`9c_gd`3`4,d=`D`F`x^h,n=s.fpC`Q,p`6!n)n=s.c`Q`6d"
+"@v@m@Sn?`nn):2;n=n>2?n:2;p=d`d.')`6p>=0){`Sp>=0&&n>1$1d`d.',p-$Hn--"
+"}@m=p>0&&`Pd,'.`sc_gd^e0)?d`0p):d}}`2@m`9c_r`3k`4;k=$Xk);`Oc=@Us.d."
+"`m,i=c`1@Uk+@R,e=i<0?i:c`1';',i),v=i<0$j@Jc`0i+2+k`A,e<0?c`A:$I;`2v"
+"$k[[B]]'?v:''`9c_w`3k,v,e`4,d=$Y(),l=s.`m^n,t;v`X+v;l=l?@wl)`B$2`6^"
+"c^st=(v!`X?`nl?l:0):-60)`6t){e`c^g;e$e@I(e^L+(t*1000))}^1k^ss.d.`m="
+"k+'`Lv!`X?v:'[[B]]')$o path=/;'+(^c?' expires$le.toGMT`w()$o'`Y+(d?"
+"' domain$ld$o'`Y;`2^kk)==v}`20`9eh`3o,e,r,f`4,b='s^fe+'^f@i,n=-1,l,"
+"i,x`6!^Ml)^Ml`c@2;l=^Ml^Ei=0;i<l`A&&n<0;i++`Vl[i].o==o&&l[i].e==e)n"
+"=i^1n<0@Si;l[n]`C}x$tx.o=o;x.e=e;f=r?x.b:f`6r||f$G.b=r?0:o[e];x.o[e"
+"]=f^1x.b$G.o[b]=x.b;`2b}`20`9cet`3f,a,t,o,b`4,r`6`J>=5^X!s.^S||`J>="
+"7))@5'$Q^0$3a)`zr=s.m(t)?s[t](e):t(e)}^d`t{$6^B^au`1$R4@P0)r=s.m(b)"
+"?s$sa):b(a);`t{^M(`D,'^w',0,o);^0$3a`Teh(`D,'^w',1)}}`2r`9g^Jet`3e`"
+"4;`2`o`9g^Joe`8;^M(@G,\"^w\",1`Te^J=1;`Oc=s.t()`6c)s.d.write(c`Te^J"
+"=0;`2@b'`Tg^Jfb`3a){`2@G`9g^Jf`3w`4,p=w@1,l=w`F;`o=w`6p&&p`F!=l&&p`"
+"F`x==l`x){`o=p;`2s.g^Jf(`o)}`2`o`9g^J`3`4`6!`o){`o=`D`6!s.e^J)`o=s."
+"cet('g^J^e`o,'g^Jet@z.g^Joe,'g^Jfb')}`2`o`9mrq`3u`4,l=^l],n,r;^l]=0"
+"`6l)for(n=0;n<l`A;n$ir$ts.mr(0,0,r.t,r.u,r.r)}`9mr`3@c,q,ta,u,rs`4,"
+"dc=$Z,t1=s.^6@Z,t2=s.^6@ZSecure,ns=s.`W`jspace,un=u?u:$Bs.f$7,unc=`"
+"y$P'_`s-'),r`C,l,imn@ki^f($7,im,b,e`6!rs){rs='http'+@M?'s'`Y+'://'+"
+"(t1?@M@Q2?t2:t1):($B@M?'102':unc))+'.'+($Z?$Z:112)+'.2o7.net')@yb/s"
+"s/'+^2+'/1/H.14/'+@c+'?[AQB]&ndh=1'+(q?q`Y+'&[AQE]'`6^N@v^B`V`J>5.5"
+")rs=^Vrs,4095);`t rs=^Vrs,2047)}^1s.d.images&&`J>=3^X!s.^S||`J>=7)^"
+"X@8<0||`J>=6.1)`V!s.rc)s.rc`C`6!^G){^G=1`6!s.rl)s.rl`C;^ln]`c@2;set"
+"@Iout('$6`N,750)}`t{l=^ln]`6l){r.t=ta;r.u=un;r.r=rs;l[l`A]=r;`2''}i"
+"mn+='^f^G;^G$Eim=`D[imn]`6!im)im=`D[imn]`cImage;im^jl=0;im.@H`cFun`"
+"K('e`s^u^jl=1`6`N);im$S=rs`6rs`1@n=@P0^X!ta||ta^D_self'||ta^D_top'|"
+"|(`D.^h@Qa==`D.^h))){b=e`c^g;`S!im^jl&&e^L-b^L<500)e`c^g}`2''}`2'<i"
+"m'+'g sr'+'c=\"'+rs+'\" width=1 $K=1 border=0 alt=\"\">'`9gg`3v`4`6"
+"!`D['s^fv])`D['s^fv]`X;`2`D['s^fv]`9glf`3t,a`Vt`00,2)^D$C`02);`Os=^"
+"u,v=s.gg(t)`6v)s[t]=v`9gl`3v`4`6$V)`Pv`Rgl^e0)`9gv`3v`4;`2s['vpm^fv"
+"]?s['vpv^fv]:(s[v]?s[v]`Y`9havf`3t,a`4,b=t`00,4),x=t`04),n=`nx),k='"
+"g^ft,m='vpm^ft,q=t,v=s.`I@DVars,e=s.`I@D$c;@F@ot)`6s.@3||^3){v=v?v+"
+"`s+^O+`s+^O2:''`6v@v`Pv`Ris^et))s[k]`X`6`E$L'&&e)@Fs.fs(s[k],e)}s[m"
+"]=0`6`E`WID`Gvid';`5`E^9^qg'`Z`5`E`u^qr'`Z`5`Evmk`Gvmt';`5`E^v^qce'"
+"`6s[k]&&s[k]`B()^DAUTO')@F'ISO8859-1';`5s[k]^aem==2)@F'UTF-8'}`5`E`"
+"W`jspace`Gns';`5`Ec`Q`Gcdp';`5`E`m^n`Gcl';`5`E^Y`Gvvp';`5`E^x`Gcc';"
+"`5`E$5`Gch';`5`E$b`KID`Gxact';`5`E@d`Gv0';`5`E^K`Gs';`5`E`v`Gc';`5`"
+"E`k`Gj';`5`E`b`Gv';`5`E`m^p`Gk';`5`E`r^o`Gbw';`5`E`r^Q`Gbh';`5`E@B`"
+"K`p`Gct';`5`E^i`Ghp';`5`Ep^C`Gp';`5$Wx)`Vb^Dprop`Gc$J;`5b^DeVar`Gv$"
+"J;`5b^Dhier^qh$J`Z^1s[k]@Q$k`I`j'@Q$k`I`p')@p+='&'+q+'`Ls[k]);`2''`"
+"9hav`3`4;@p`X;`P^P`Rhav^e0);`2@p`9lnf`3^R`7^b`7:'';`Ote=t`1@R`6t@Qe"
+">0&&h`1t`0te@T>=0)`2t`00,te);`2''`9ln`3h`4,n=s.`I`js`6n)`2`Pn`Rln^e"
+"h);`2''`9ltdf`3^R`7^b`7:'';`Oqi=h`1'?^dh=qi>=0?h`00,qi):h`6t&&h`0h`"
+"A-(t`A@T^D.'+t)`21;`20`9ltef`3^R`7^b`7:''`6t&&h`1t)>=0)`21;`20`9lt`"
+"3h`4,lft=s.`I^IFile`ps,lef=s.`IEx`h,@e=s.`IIn`h;@e=@e?@e:`D`F`x^h;h"
+"=h`7`6s.^6^ILinks&&lft&&`Plft`Rltd^eh))`2'd'`6s.^6^t^Xlef||@e)^X!le"
+"f||`Plef`Rlte^eh))^X!@e||!`P@e`Rlte^eh)))`2'e';`2''`9lc`8,b=^M(^u,"
+"\"`g\"`T@3=@h^u`Tt(`T@3=0`6b)`2^u$se);`2@b'`Tbc`8,f`6s.d^ad.all^ad."
+"all.cppXYctnr)return;^3=^z?^z:e$8;@5\"$Q$6^3^X^3.tag`j||^3.par`i||^"
+"3@1Nod$I@Vcatch$p}\"`Teo=0'`Toh`3o`4,l=`D`F,h=^m?^m:'',i,j,k,p;i=h`"
+"1':^dj=h`1'?^dk=h`1'/')`6h^Xi<0||(j>=0$rj)||(k>=0$rk))$1o`U&&o`U`A>"
+"1?o`U:(l`U?l`U`Y;i=l.path^h`d/^dh=(p?p+'//'`Y+(o`x?o`x:(l`x?l`x`Y)+"
+"(h`00,1)$k/'?l.path^h`00,i<0?0:i@y'`Y+h}`2h`9ot`3o){`Ot=o.tag`j;t=t"
+"@Q`B?t`B$2`6`ESHAPE')t`X`6t`V`E$T&&@L&&@L`B)t=@L`B();`5^m)t='A';}`2"
+"t`9oid`3o`4,^5,p,c,n`X,x=0`6t@v`q$1o`U;c=o.`g`6^m^X`EA'||`EAREA')^X"
+"!c||!p||p`7`1'javascript$F0))n@X`5c@S`ys.rep(`ys.rep@wc,\"\\r@W\"\\"
+"n@W\"\\t@W' `s^dx=2}`5$9^X`E$T||`ESUBMIT')@S$9;x=3}`5o$S&&`EIMAGE')"
+"n=o$S`6n){`q=^Vn@g;`qt=x}}`2`q`9rqf`3t,un`4,e=t`1@R,u=e>=0?`s+t`00,"
+"e)+`s:'';`2u&&u`1`s+un+`s)>=0?@Jt`0e@T:''`9rq`3un`4,c=un`1`s),v=^k'"
+"s_sq'),q`X`6c<0)`2`Pv,'&`srq^e$7;`2`Pun`Rrq',0)`9sqp`3t,a`4,e=t`1@R"
+",q=e<0$j@Jt`0e+1)`Tsqq[q]`X`6e>=0)`Pt`00,e)`R@s`20`9sqs`3$Pq`4;^4u["
+"un]=q;`20`9sq`3q`4,k@ksq',v=^kk),x,c=0;^4q`C;^4u`C;^4q[q]`X;`Pv,'&`"
+"ssqp',0);`P^2`R@sv`X^E@j^4u`M)^4q[^4u[x]]+=(^4q[^4u[x]]?`s`Y+x^E@j^"
+"4q`M&&^4q[x]^Xx==q||c<2)){v+=(v$n'`Y+^4q[x]+'`Lx);c$E`2@Kk,v,0)`9wd"
+"l`8,r=@b,b=^M(`D,\"@H\"),i,o,oc`6b)r=^u$se)^Ei=0;i<s.d.`Is`A;i$io=s"
+".d.`Is[i];oc=o.`g?\"\"+o.`g:\"\"`6(oc`1\"@a$m0||oc`1\"^joc@x0)&&oc`"
+"1\".tl$m0)^M(o,\"`g\",0,s.lc);}`2r^d`Ds`3`4`6`J>3^X!^N||!^B||`J$q`V"
+"s.b^a^r)s.^r('`g@z.bc);`5s.b&&^H)^H('click@z.bc,false);`t ^M(`D,'@H"
+"',0,`Dl)}`9vs`3x`4,v=s.`W^F,g=s.`W^F$fk@kvsn^f^2+(g?'^fg`Y,n=^kk),e"
+"`c^g,y=e.get@t);e$e@ty+10@Y1900:0))`6v){v*=100`6!n`V!@Kk,x,$I`20;n="
+"x^1n%10000>v)`20}`21`9dyasmf`3t,m`Vt&&m&&m`1t)>=0)`21;`20`9dyasf`3t"
+",m`4,i=t?t`1@R:-1,n,x`6i>=0&&m){`On=t`00,i),x=t`0i+1)`6`Px`Rdyasm^e"
+"m))`2n}`20`9uns`3`4,x=s.`HSele`K,l=s.`HList,m=s.`H$gn,i;^2=^2`7`6x&"
+"&l`V!m)m=`D`F`x`6!m.toLowerCase)m`X+m;l=l`7;m=m`7;n=`Pl,';`sdyas^em"
+")`6n)^2=n}i=^2`1`s`Tfun=i<0?^2:^2`00,i)`9sa`3un`4;^2=un`6!@A)@A=un;"
+"`5(`s+@A+`s)`1$7<0)@A+=`s+un;^2s()`9t`3`4,$M=1,tm`c^g,sed=Math&&@6$"
+"N?@6$U@6$N()*10000000000000):`e@I(),@c='s'+@6$U`e@I()/10800000)%10+"
+"sed,y=`e@t),vt=`e^g(@y'+`eMonth(@y'@Yy+1900:y)+@U`eHour$0`eMinute$0"
+"`eSeconds()+@U`eDay()+@U`e@IzoneO@l(),^J=s.g^J(),ta`X,q`X,qs`X@0`Tu"
+"ns()`6!s.td){`Otl=^J`F,a,o,i,x`X,c`X,v`X,p`X,bw`X,bh`X,^70',k=@K's_"
+"cc`s@b',0^8,hp`X,ct`X,pn=0,ps`6`w&&`w.prototype){^71'`6j.match){^72"
+"'`6tm$eUTC^g){^73'`6^N&&^B&&`J$q^74'`6pn.toPrecision){^75';a`c@2`6a"
+".forEach){^76';i=0;o`C;@5'$Qi`cIterator(o)`z}')`6i&&i.next)^77'}}}}"
+"^1`J>=4)x=^Uwidth+'x'+^U$K`6s.isns||s.^S`V`J>=3$4`b(^8`6`J>=4){c=^U"
+"pixelDepth;bw=`D$a^o;bh=`D$a^Q}}@q=s.n.p^C}`5^N`V`J>=4$4`b(^8;c=^U`"
+"v`6`J$q{bw=s.d.@9`i.o@l^o;bh=s.d.@9`i.o@l^Q`6!^B^ab){`fh$D^dhp=s.b."
+"isH$D(tl^8`z}\");`fclientCaps^dct=s.b.@B`K`p`z}\")}}}`t r`X^1@q)`Sp"
+"n<@q`A&&pn<30){ps=^V@q[pn].^h@g$o'`6p`1ps)<0)p+=ps;pn$Es.^K=x;s.`v="
+"c;s.`k=j;s.`b=v;s.`m^p=k;s.`r^o=bw;s.`r^Q=bh;s.@B`K`p=ct;s.^i=hp;s."
+"p^C=p;s.td=1^1s.useP^C)s.doP^C(s);`Ol=`D`F,r=^J.@9ent.`u`6!s.^9)s.^"
+"9=l`6!s.`u)s.`u=r`6s.@3||^3){`Oo=^3?^3:s.@3`6!o)`2'';`Op=@o'$d`j'),"
+"w=1,^5,@N,x=`qt,h,l,i,oc`6^3&&o==^3){`So@vn@Q$kBODY'){o=o.par`i?o.p"
+"ar`i:o@1Node`6!o)`2'';^5;@N;x=`qt}oc=o.`g?''+o.`g:''`6(oc`1\"@a@x0&"
+"&oc`1\"^joc$m0)||oc`1\".tl@x0)`2''}ta=n?o$8:1;h@Xi=h`1'?^dh=s.`I@O`"
+"w||i<0?h:h`00,i);l=s.`I`j?s.`I`j:s.ln(h);t=s.`I`p?s.`I`p`7:s.lt(h)`"
+"6t^Xh||l))q+=@n=@3^f(`Ed'||`Ee'?$Xt):'o')+(h?@nv1`Lh)`Y+(l?@nv2`Ll)"
+"`Y;`t $M=0`6s.^6@C`V!p$1@o'^9^dw=0}^5;i=o.sourceIndex`6^Z@S^Z;x=1;i"
+"=1^1p&&n@Q)qs='&pid`L^Vp,255))+(w$npidt$lw`Y+'&oid`L^Vn@g)+(x$noidt"
+"$lx`Y+'&ot`Lt)+(i$noi$li`Y}^1!$M@vqs)`2''`6s.p_r)s.p_r();`O$O`X`6$M"
+"^avs(sed))$O=s.mr(@c,(vt$nt`Lvt)`Y+s.hav()+q+(qs?qs:s.rq(^2)),ta`Ts"
+"q($M$jqs`T@3=^3=s.`I`j=s.`I`p=`D^jobjectID=s.ppu`X`6$V)`D^j@3=`D^je"
+"o=`D^j`I`j=`D^j`I`p`X;`2$O`9tl`3o,t,n`4;s.@3=@ho`T`I`p=t;s.`I`j=n;s"
+".t()`9ssl=(`D`F`U`7`1'https@P0`Td=@9ent;s.b=s.d.body;s.n=navigator;"
+"s.u=s.n.userAgent;@8=s.u`1'N$A6/^d`Oapn@u`j,v@uVersion,ie=v`1$R'),o"
+"=s.u`1'@4 '),i`6v`1'@4@P0||o>0)apn='@4';^N@r^DMicrosoft Internet Ex"
+"plorer'`Tisns@r^DN$A'`T^S@r^D@4'`Tismac=(s.u`1'Mac@P0)`6o>0)`J`ls.u"
+"`0o+6));`5ie>0){`J=`ni=v`0ie+5))`6`J>3)`J`li)}`5@8>0)`J`ls.u`0@8+10"
+"));`t `J`lv`Tem=0`6`w$h^W){i=^T`w$h^W(256))`B(`Tem=(i^D%C4%80'?2:(i"
+"^D%U0100'?1:0))}s.sa(un`Tvl_l='`WID,vmk,ppu,^v,`W`jspace,c`Q,`m^n,$"
+"d`j,^9,`u,^x';^P=^O+',^Y,$5,server,$d`p,$b`KID,purchaseID,@d,state,"
+"zip,$L,products,`I`j,`I`p'^E`On=1;n<51;n++)^P+=',prop$J+',eVar$J+',"
+"hier$J;^O2='^K,`v,`k,`b,`m^p,`r^o,`r^Q,@B`K`p,^i,p^C';^P+=`s+^O2;s."
+"vl_g=^P+',`W^F,`W^F$f`HSele`K,`HList,`H$g^6^ILinks,^6^t,^6@C,`I@O`w"
+",`I^IFile`ps,`IEx`h,`IIn`h,`I@DVars,`I@D$c,`I`js,@3';$V=pg@0)`6!ss)"
+"`Ds()}",
w=window,l=w.s_c_il,n=navigator,u=n.userAgent,v=n.appVersion,e=
v.indexOf('MSIE '),m=u.indexOf('Netscape6/'),a,i,s;if(un){un=
un.toLowerCase();if(l)for(i=0;i<l.length;i++){s=l[i];if(s._c=='s_c'){
if(s.oun==un)return s;else if(s.fs(s.oun,un)){s.sa(un);return s}}}}
eval(d);c=s_d(c);i=c.indexOf("function s_c(");eval(c.substring(0,i))
if(!un)return 0;c=c.substring(i);if(e>0){a=parseInt(i=v.substring(e
+5));if(a>3)a=parseFloat(i)}else if(m>0)a=parseFloat(u.substring(m+10)
);else a=parseFloat(v);if(a>=5&&v.indexOf('Opera')<0&&u.indexOf(
'Opera')<0){eval(c);return new s_c(un,pg,ss)}else s=s_c2f(c);return s(
un,pg,ss)}s_gi()
function init_gadlinks(){
var linkAreas = [];
linkAreas[0] = document.getElementById('related-cats-footer');
linkAreas[1] = document.getElementById('related-areas-footer');
linkAreas[2] = document.getElementById('more-options');
linkAreas[3] = document.getElementById('footerlinks');

var numAreas = linkAreas.length;

for(var i=0;i<numAreas;i++){
if(linkAreas[i] != null){
var links = linkAreas[i].getElementsByTagName('a');
var numLinks = links.length;

for(var j=0;j<numLinks;j++){
if(links[j].className.match('glink') != null){
links[j].onclick = onclick_gadlinks;
//alert(links[j].innerHTML);
}
}
}
}
document.cookie = 'glink=; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/'; //remove cookie
}

function onclick_gadlinks(e){
var date = new Date();
date.setDate(date.getDate() + 1);
document.cookie = 'glink='+escape(e.target.innerHTML)+'; expires='+date.toGMTString()+'; path=/';
}

window.onload = init_gadlinks;


