
var Prototype={Version:'1.4.0',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(property in source){destination[property]=source[property];}
return destination;}
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;}}
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;return function(event){return __method.call(object,event||window.event);}}
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;i<arguments.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(){setInterval(this.onTimerEvent.bind(this),this.frequency*1000);},onTimerEvent:function(){if(!this.currentlyExecuting){try{this.currentlyExecuting=true;this.callback();}finally{this.currentlyExecuting=false;}}}}
function $(){var elements=new Array();for(var i=0;i<arguments.length;i++){var element=arguments[i];if(typeof element=='string')
element=document.getElementById(element);if(arguments.length==1)
return element;elements.push(element);}
return elements;}
Object.extend(String.prototype,{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(eval);},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[0].nodeValue:'';},toQueryParams:function(){var pairs=this.match(/^\??(.*)$/)[1].split('&');return pairs.inject({},function(params,pairString){var pair=pairString.split('=');params[pair[0]]=pair[1];return params;});},toArray:function(){return this.split('');},camelize:function(){var oStringList=this.split('-');if(oStringList.length==1)return oStringList[0];var camelizedString=this.indexOf('-')==0?oStringList[0].charAt(0).toUpperCase()+oStringList[0].substring(1):oStringList[0];for(var i=1,len=oStringList.length;i<len;i++){var s=oStringList[i];camelizedString+=s.charAt(0).toUpperCase()+s.substring(1);}
return camelizedString;},inspect:function(){return"'"+this.replace('\\','\\\\').replace("'",'\\\'')+"'";}});String.prototype.parseQuery=String.prototype.toQueryParams;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;}},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=true;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(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;},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.collect(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(value>=(result||value))
result=value;});return result;},min:function(iterator){var result;this.each(function(value,index){value=(iterator||Prototype.K)(value,index);if(value<=(result||value))
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.collect(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.collect(Prototype.K);},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){iterator(value=collections.pluck(index));return value;});},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;i<iterable.length;i++)
results.push(iterable[i]);return results;}}
Object.extend(Array.prototype,Enumerable);Array.prototype._reverse=Array.prototype.reverse;Object.extend(Array.prototype,{_each:function(iterator){for(var i=0;i<this.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!=undefined||value!=null;});},flatten:function(){return this.inject([],function(array,value){return array.concat(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;i<this.length;i++)
if(this[i]==object)return i;return-1;},reverse:function(inline){return(inline!==false?this:this.toArray())._reverse();},shift:function(){var result=this[0];for(var i=0;i<this.length-1;i++)
this[i]=this[i+1];this.length--;return result;},inspect:function(){return'['+this.map(Object.inspect).join(', ')+']';}});var Hash={_each:function(iterator){for(key in this){var value=this[key];if(typeof value=='function')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($H(this),function(mergedHash,pair){mergedHash[pair.key]=pair.value;return mergedHash;});},toQueryString:function(){return this.map(function(pair){return pair.map(encodeURIComponent).join('=');}).join('&');},inspect:function(){return'#<Hash:{'+this.map(function(pair){return pair.map(Object.inspect).join(': ');}).join(', ')+'}>';}}
function $H(object){var hash=Object.extend({},object||{});Object.extend(hash,Enumerable);Object.extend(hash,Hash);return hash;}
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;do{iterator(value);value=value.succ();}while(this.include(value));},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 ActiveXObject('Msxml2.XMLHTTP')},function(){return new ActiveXObject('Microsoft.XMLHTTP')},function(){return new XMLHttpRequest()})||false;},activeRequestCount:0}
Ajax.Responders={responders:[],_each:function(iterator){this.responders._each(iterator);},register:function(responderToAdd){if(!this.include(responderToAdd))
this.responders.push(responderToAdd);},unregister:function(responderToRemove){this.responders=this.responders.without(responderToRemove);},dispatch:function(callback,request,transport,json){this.each(function(responder){if(responder[callback]&&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,parameters:''}
Object.extend(this.options,options||{});},responseIsSuccess:function(){return this.transport.status==undefined||this.transport.status==0||(this.transport.status>=200&&this.transport.status<300);},responseIsFailure:function(){return!this.responseIsSuccess();}}
Ajax.Request=Class.create();Ajax.Request.Events=['Uninitialized','Loading','Loaded','Interactive','Complete'];Ajax.Request.prototype=Object.extend(new Ajax.Base(),{initialize:function(url,options){this.transport=Ajax.getTransport();this.setOptions(options);this.request(url);},request:function(url){var parameters=this.options.parameters||'';if(parameters.length>0)parameters+='&_=';try{this.url=url;if(this.options.method=='get'&&parameters.length>0)
this.url+=(this.url.match(/\?/)?'&':'?')+parameters;Ajax.Responders.dispatch('onCreate',this,this.transport);this.transport.open(this.options.method,this.url,this.options.asynchronous);if(this.options.asynchronous){this.transport.onreadystatechange=this.onStateChange.bind(this);setTimeout((function(){this.respondToReadyState(1)}).bind(this),10);}
this.setRequestHeaders();var body=this.options.postBody?this.options.postBody:parameters;this.transport.send(this.options.method=='post'?body:null);}catch(e){this.dispatchException(e);}},setRequestHeaders:function(){var requestHeaders=['X-Requested-With','XMLHttpRequest','X-Prototype-Version',Prototype.Version];if(this.options.method=='post'){requestHeaders.push('Content-type','application/x-www-form-urlencoded');if(this.transport.overrideMimeType)
requestHeaders.push('Connection','close');}
if(this.options.requestHeaders)
requestHeaders.push.apply(requestHeaders,this.options.requestHeaders);for(var i=0;i<requestHeaders.length;i+=2)
this.transport.setRequestHeader(requestHeaders[i],requestHeaders[i+1]);},onStateChange:function(){var readyState=this.transport.readyState;if(readyState!=1)
this.respondToReadyState(this.transport.readyState);},header:function(name){try{return this.transport.getResponseHeader(name);}catch(e){}},evalJSON:function(){try{return eval(this.header('X-JSON'));}catch(e){}},evalResponse:function(){try{return eval(this.transport.responseText);}catch(e){this.dispatchException(e);}},respondToReadyState:function(readyState){var event=Ajax.Request.Events[readyState];var transport=this.transport,json=this.evalJSON();if(event=='Complete'){try{(this.options['on'+this.transport.status]||this.options['on'+(this.responseIsSuccess()?'Success':'Failure')]||Prototype.emptyFunction)(transport,json);}catch(e){this.dispatchException(e);}
if((this.header('Content-type')||'').match(/^text\/javascript/i))
this.evalResponse();}
try{(this.options['on'+event]||Prototype.emptyFunction)(transport,json);Ajax.Responders.dispatch('on'+event,this,transport,json);}catch(e){this.dispatchException(e);}
if(event=='Complete')
this.transport.onreadystatechange=Prototype.emptyFunction;},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.containers={success:container.success?$(container.success):$(container),failure: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,object){this.updateContent();onComplete(transport,object);}).bind(this);this.request(url);},updateContent:function(){var receiver=this.responseIsSuccess()?this.containers.success:this.containers.failure;var response=this.transport.responseText;if(!this.options.evalScripts)
response=response.stripScripts();if(receiver){if(this.options.insertion){new this.options.insertion(receiver,response);}else{Element.update(receiver,response);}}
if(this.responseIsSuccess()){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.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);}});document.getElementsByClassName=function(className,parentElement){var children=($(parentElement)||document.body).getElementsByTagName('*');return $A(children).inject([],function(elements,child){if(child.className.match(new RegExp("(^|\\s)"+className+"(\\s|$)")))
elements.push(child);return elements;});}
if(!window.Element){var Element=new Object();}
Object.extend(Element,{visible:function(element){return $(element).style.display!='none';},toggle:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);Element[Element.visible(element)?'hide':'show'](element);}},hide:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='none';}},show:function(){for(var i=0;i<arguments.length;i++){var element=$(arguments[i]);element.style.display='';}},remove:function(element){element=$(element);element.parentNode.removeChild(element);},update:function(element,html){$(element).innerHTML=html.stripScripts();setTimeout(function(){html.evalScripts()},10);},getHeight:function(element){element=$(element);return element.offsetHeight;},classNames:function(element){return new Element.ClassNames(element);},hasClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).include(className);},addClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).add(className);},removeClassName:function(element,className){if(!(element=$(element)))return;return Element.classNames(element).remove(className);},cleanWhitespace:function(element){element=$(element);for(var i=0;i<element.childNodes.length;i++){var node=element.childNodes[i];if(node.nodeType==3&&!/\S/.test(node.nodeValue))
Element.remove(node);}},empty:function(element){return $(element).innerHTML.match(/^\s*$/);},scrollTo:function(element){element=$(element);var x=element.x?element.x:element.offsetLeft,y=element.y?element.y:element.offsetTop;window.scrollTo(x,y);},getStyle:function(element,style){element=$(element);var value=element.style[style.camelize()];if(!value){if(document.defaultView&&document.defaultView.getComputedStyle){var css=document.defaultView.getComputedStyle(element,null);value=css?css.getPropertyValue(style):null;}else if(element.currentStyle){value=element.currentStyle[style.camelize()];}}
if(window.opera&&['left','top','right','bottom'].include(style))
if(Element.getStyle(element,'position')=='static')value='auto';return value=='auto'?null:value;},setStyle:function(element,style){element=$(element);for(name in style)
element.style[name.camelize()]=style[name];},getDimensions:function(element){element=$(element);if(Element.getStyle(element,'display')!='none')
return{width:element.offsetWidth,height:element.offsetHeight};var els=element.style;var originalVisibility=els.visibility;var originalPosition=els.position;els.visibility='hidden';els.position='absolute';els.display='';var originalWidth=element.clientWidth;var originalHeight=element.clientHeight;els.display='none';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';if(window.opera){element.style.top=0;element.style.left=0;}}},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='';}},makeClipping:function(element){element=$(element);if(element._overflow)return;element._overflow=element.style.overflow;if((Element.getStyle(element,'overflow')||'visible')!='hidden')
element.style.overflow='hidden';},undoClipping:function(element){element=$(element);if(element._overflow)return;element.style.overflow=element._overflow;element._overflow=undefined;}});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){if(this.element.tagName.toLowerCase()=='tbody'){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(this.toArray().concat(classNameToAdd).join(' '));},remove:function(classNameToRemove){if(!this.include(classNameToRemove))return;this.set(this.select(function(className){return className!=classNameToRemove;}).join(' '));},toString:function(){return this.toArray().join(' ');}}
Object.extend(Element.ClassNames.prototype,Enumerable);var Field={clear:function(){for(var i=0;i<arguments.length;i++)
$(arguments[i]).value='';},focus:function(element){$(element).focus();},present:function(){for(var i=0;i<arguments.length;i++)
if($(arguments[i]).value=='')return false;return true;},select:function(element){$(element).select();},activate:function(element){element=$(element);element.focus();if(element.select)
element.select();}}
var Form={serialize:function(form){var elements=Form.getElements($(form));var queryComponents=new Array();for(var i=0;i<elements.length;i++){var queryComponent=Form.Element.serialize(elements[i]);if(queryComponent)
queryComponents.push(queryComponent);}
return queryComponents.join('&');},getElements:function(form){form=$(form);var elements=new Array();for(tagName in Form.Element.Serializers){var tagElements=form.getElementsByTagName(tagName);for(var j=0;j<tagElements.length;j++)
elements.push(tagElements[j]);}
return elements;},getInputs:function(form,typeName,name){form=$(form);var inputs=form.getElementsByTagName('input');if(!typeName&&!name)
return inputs;var matchingInputs=new Array();for(var i=0;i<inputs.length;i++){var input=inputs[i];if((typeName&&input.type!=typeName)||(name&&input.name!=name))
continue;matchingInputs.push(input);}
return matchingInputs;},disable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.blur();element.disabled='true';}},enable:function(form){var elements=Form.getElements(form);for(var i=0;i<elements.length;i++){var element=elements[i];element.disabled='';}},findFirstElement:function(form){return Form.getElements(form).find(function(element){return element.type!='hidden'&&!element.disabled&&['input','select','textarea'].include(element.tagName.toLowerCase());});},focusFirstElement:function(form){Field.activate(Form.findFirstElement(form));},reset:function(form){$(form).reset();}}
Form.Element={serialize:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter){var key=encodeURIComponent(parameter[0]);if(key.length==0)return;if(parameter[1].constructor!=Array)
parameter[1]=[parameter[1]];return parameter[1].map(function(value){return key+'='+encodeURIComponent(value);}).join('&');}},getValue:function(element){element=$(element);var method=element.tagName.toLowerCase();var parameter=Form.Element.Serializers[method](element);if(parameter)
return parameter[1];}}
Form.Element.Serializers={input:function(element){switch(element.type.toLowerCase()){case'submit':case'hidden':case'password':case'text':return Form.Element.Serializers.textarea(element);case'checkbox':case'radio':return Form.Element.Serializers.inputSelector(element);}
return false;},inputSelector:function(element){if(element.checked)
return[element.name,element.value];},textarea:function(element){return[element.name,element.value];},select:function(element){return Form.Element.Serializers[element.type=='select-one'?'selectOne':'selectMany'](element);},selectOne:function(element){var value='',opt,index=element.selectedIndex;if(index>=0){opt=element.options[index];value=opt.value;if(!value&&!('value'in opt))
value=opt.text;}
return[element.name,value];},selectMany:function(element){var value=new Array();for(var i=0;i<element.length;i++){var opt=element.options[i];if(opt.selected){var optValue=opt.value;if(!optValue&&!('value'in opt))
optValue=opt.text;value.push(optValue);}}
return[element.name,value];}}
var $F=Form.Element.getValue;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();if(this.lastValue!=value){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(){var elements=Form.getElements(this.element);for(var i=0;i<elements.length;i++)
this.registerCallback(elements[i]);},registerCallback:function(element){if(element.type){switch(element.type.toLowerCase()){case'checkbox':case'radio':Event.observe(element,'click',this.onElementEvent.bind(this));break;case'password':case'text':case'textarea':case'select-one':case'select-multiple':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,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;}},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;i<Event.observers.length;i++){Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i][0]=null;}
Event.observers=false;},observe:function(element,name,observer,useCapture){var element=$(element);useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))
name='keydown';this._observeAndCache(element,name,observer,useCapture);},stopObserving:function(element,name,observer,useCapture){var 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){element.detachEvent('on'+name,observer);}}});Event.observe(window,'unload',Event.unloadCache,false);var Position={includeScrollOffsets:false,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){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;},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);},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;},clone:function(source,target){source=$(source);target=$(target);target.style.position='absolute';var offsets=this.cumulativeOffset(source);target.style.top=offsets[1]+'px';target.style.left=offsets[0]+'px';target.style.width=source.offsetWidth+'px';target.style.height=source.offsetHeight+'px';},page:function(forElement){var valueT=0,valueL=0;var element=forElement;do{valueT+=element.offsetTop||0;valueL+=element.offsetLeft||0;if(element.offsetParent==document.body)
if(Element.getStyle(element,'position')=='absolute')break;}while(element=element.offsetParent);element=forElement;do{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]||{})
source=$(source);var p=Position.page(source);target=$(target);var delta=[0,0];var parent=null;if(Element.getStyle(target,'position')=='absolute'){parent=Position.offsetParent(target);delta=Position.page(parent);}
if(parent==document.body){delta[0]-=document.body.offsetLeft;delta[1]-=document.body.offsetTop;}
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;}}
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];}}

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.collectTextNodesIgnoreClass=function(element,ignoreclass){var children=$(element).childNodes;var text='';var classtest=new RegExp('^([^ ]+ )*'+ignoreclass+'( [^ ]+)*$','i');for(var i=0;i<children.length;i++){if(children[i].nodeType==3){text+=children[i].nodeValue;}else{if((!children[i].className.match(classtest))&&children[i].hasChildNodes())
text+=Element.collectTextNodesIgnoreClass(children[i],ignoreclass);}}
return text;}
Element.setStyle=function(element,style){element=$(element);for(k in style)element.style[k.camelize()]=style[k];}
Element.setContentZoom=function(element,percent){Element.setStyle(element,{fontSize:(percent/100)+'em'});if(navigator.appVersion.indexOf('AppleWebKit')>0)window.scrollBy(0,0);}
Element.getOpacity=function(element){var opacity;if(opacity=Element.getStyle(element,'opacity'))
return parseFloat(opacity);if(opacity=(Element.getStyle(element,'filter')||'').match(/alpha\(opacity=(.*)\)/))
if(opacity[1])return parseFloat(opacity[1])/100;return 1.0;}
Element.setOpacity=function(element,value){element=$(element);if(value==1){Element.setStyle(element,{opacity:(/Gecko/.test(navigator.userAgent)&&!/Konqueror|Safari|KHTML/.test(navigator.userAgent))?0.999999:null});if(/MSIE/.test(navigator.userAgent))
Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});}else{if(value<0.00001)value=0;Element.setStyle(element,{opacity:value});if(/MSIE/.test(navigator.userAgent))
Element.setStyle(element,{filter:Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')+'alpha(opacity='+value*100+')'});}}
Element.getInlineOpacity=function(element){return $(element).style.opacity||'';}
Element.childrenWithClassName=function(element,className){return $A($(element).getElementsByTagName('*')).select(function(c){return Element.hasClassName(c,className)});}
Array.prototype.call=function(){var args=arguments;this.each(function(f){f.apply(this,args)});}
var Effect={tagifyText:function(element){var tagifyStyle='position:relative';if(/MSIE/.test(navigator.userAgent))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}));});}};var Effect2=Effect;Effect.Transitions={}
Effect.Transitions.linear=function(pos){return pos;}
Effect.Transitions.sinoidal=function(pos){return(-Math.cos(pos*Math.PI)/2)+0.5;}
Effect.Transitions.reverse=function(pos){return 1-pos;}
Effect.Transitions.flicker=function(pos){return((-Math.cos(pos*Math.PI)/4)+0.75)+Math.random()/4;}
Effect.Transitions.wobble=function(pos){return(-Math.cos(pos*Math.PI*(9*pos))/2)+0.5;}
Effect.Transitions.pulse=function(pos){return(Math.floor(pos*10)%2==0?(pos*10-Math.floor(pos*10)):1-(pos*10-Math.floor(pos*10)));}
Effect.Transitions.none=function(pos){return 0;}
Effect.Transitions.full=function(pos){return 1;}
Effect.Queue={effects:[],_each:function(iterator){this.effects._each(iterator);},interval:null,add:function(effect){var timestamp=new Date().getTime();switch(effect.options.queue){case'front':this.effects.findAll(function(e){return e.state=='idle'}).each(function(e){e.startOn+=effect.finishOn;e.finishOn+=effect.finishOn;});break;case'end':timestamp=this.effects.pluck('finishOn').max()||timestamp;break;}
effect.startOn+=timestamp;effect.finishOn+=timestamp;this.effects.push(effect);if(!this.interval)
this.interval=setInterval(this.loop.bind(this),40);},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();this.effects.invoke('loop',timePos);}}
Object.extend(Effect.Queue,Enumerable);Effect.Base=function(){};Effect.Base.prototype={position:null,setOptions:function(options){this.options=Object.extend({transition:Effect.Transitions.sinoidal,duration:1.0,fps:25.0,sync:false,from:0.0,to:1.0,delay:0.0,queue:'parallel'},options||{});},start:function(options){this.setOptions(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.Queue.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.Queue.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(){return'#<Effect:'+$H(this).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.Opacity=Class.create();Object.extend(Object.extend(Effect.Opacity.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);if(/MSIE/.test(navigator.userAgent)&&(!this.element.hasLayout))
Element.setStyle(this.element,{zoom:1});var options=Object.extend({from:Element.getOpacity(this.element)||0.0,to:1.0},arguments[1]||{});this.start(options);},update:function(position){Element.setOpacity(this.element,position);}});Effect.MoveBy=Class.create();Object.extend(Object.extend(Effect.MoveBy.prototype,Effect.Base.prototype),{initialize:function(element,toTop,toLeft){this.element=$(element);this.toTop=toTop;this.toLeft=toLeft;this.start(arguments[3]);},setup:function(){Element.makePositioned(this.element);this.originalTop=parseFloat(Element.getStyle(this.element,'top')||'0');this.originalLeft=parseFloat(Element.getStyle(this.element,'left')||'0');},update:function(position){Element.setStyle(this.element,{top:this.toTop*position+this.originalTop+'px',left:this.toLeft*position+this.originalLeft+'px'});}});Effect.Scale=Class.create();Object.extend(Object.extend(Effect.Scale.prototype,Effect.Base.prototype),{initialize:function(element,percent){this.element=$(element)
var options=Object.extend({scaleX:true,scaleY:true,scaleContent:true,scaleFromCenter:false,scaleMode:'box',scaleFrom:100.0,scaleTo:percent},arguments[2]||{});this.start(options);},setup:function(){this.restoreAfterFinish=this.options.restoreAfterFinish||false;this.elementPositioning=Element.getStyle(this.element,'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=Element.getStyle(this.element,'font-size')||'100%';['em','px','%'].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)
Element.setStyle(this.element,{fontSize:this.fontSize*currentScale+this.fontSizeType});this.setDimensions(this.dims[0]*currentScale,this.dims[1]*currentScale);},finish:function(position){if(this.restoreAfterFinish)Element.setStyle(this.element,this.originalStyle);},setDimensions:function(height,width){var d={};if(this.options.scaleX)d.width=width+'px';if(this.options.scaleY)d.height=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';}}
Element.setStyle(this.element,d);}});Effect.Highlight=Class.create();Object.extend(Object.extend(Effect.Highlight.prototype,Effect.Base.prototype),{initialize:function(element){this.element=$(element);var options=Object.extend({startcolor:'#ffff99'},arguments[1]||{});this.start(options);},setup:function(){if(Element.getStyle(this.element,'display')=='none'){this.cancel();return;}
this.oldStyle={backgroundImage:Element.getStyle(this.element,'background-image')};Element.setStyle(this.element,{backgroundImage:'none'});if(!this.options.endcolor)
this.options.endcolor=Element.getStyle(this.element,'background-color').parseColor('#ffffff');if(!this.options.restorecolor)
this.options.restorecolor=Element.getStyle(this.element,'background-color');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){Element.setStyle(this.element,{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(){Element.setStyle(this.element,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));}});Effect.Fade=function(element,hidden){var oldOpacity=Element.getInlineOpacity(element);var options=Object.extend({from:Element.getOpacity(element)||1.0,to:0.0,afterFinishInternal:function(effect){with(Element){if(effect.options.to!=0)return;hide(effect.element);setStyle(effect.element,{opacity:oldOpacity});if(hidden){hidden(effect.element);}}}},arguments[1]||{});return new Effect.Opacity(element,options);}
Effect.Appear=function(element){var options=Object.extend({from:(Element.getStyle(element,'display')=='none'?0.0:Element.getOpacity(element)||0.0),to:1.0,beforeSetup:function(effect){with(Element){setOpacity(effect.element,effect.options.from);show(effect.element);}}},arguments[1]||{});return new Effect.Opacity(element,options);}
Effect.Puff=function(element){element=$(element);var oldStyle={opacity:Element.getInlineOpacity(element),position:Element.getStyle(element,'position')};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){with(Element){setStyle(effect.effects[0].element,{position:'absolute'});}},afterFinishInternal:function(effect){with(Element){hide(effect.effects[0].element);setStyle(effect.effects[0].element,oldStyle);}}},arguments[1]||{}));}
Effect.BlindUp=function(element){element=$(element);Element.makeClipping(element);return new Effect.Scale(element,0,Object.extend({scaleContent:false,scaleX:false,restoreAfterFinish:true,afterFinishInternal:function(effect){with(Element){[hide,undoClipping].call(effect.element);}}},arguments[1]||{}));}
Effect.BlindDown=function(element){element=$(element);var oldHeight=Element.getStyle(element,'height');var elementDimensions=Element.getDimensions(element);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){with(Element){makeClipping(effect.element);setStyle(effect.element,{height:'0px'});show(effect.element);}},afterFinishInternal:function(effect){with(Element){undoClipping(effect.element);setStyle(effect.element,{height:oldHeight});}}},arguments[1]||{}));}
Effect.SwitchOff=function(element){element=$(element);var oldOpacity=Element.getInlineOpacity(element);return new Effect.Appear(element,{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){with(Element){[makePositioned,makeClipping].call(effect.element);}},afterFinishInternal:function(effect){with(Element){[hide,undoClipping,undoPositioned].call(effect.element);setStyle(effect.element,{opacity:oldOpacity});}}})}});}
Effect.DropOut=function(element){element=$(element);var oldStyle={top:Element.getStyle(element,'top'),left:Element.getStyle(element,'left'),opacity:Element.getInlineOpacity(element)};return new Effect.Parallel([new Effect.MoveBy(element,100,0,{sync:true}),new Effect.Opacity(element,{sync:true,to:0.0})],Object.extend({duration:0.5,beforeSetup:function(effect){with(Element){makePositioned(effect.effects[0].element);}},afterFinishInternal:function(effect){with(Element){[hide,undoPositioned].call(effect.effects[0].element);setStyle(effect.effects[0].element,oldStyle);}}},arguments[1]||{}));}
Effect.Shake=function(element){element=$(element);var oldStyle={top:Element.getStyle(element,'top'),left:Element.getStyle(element,'left')};return new Effect.MoveBy(element,0,20,{duration:0.05,afterFinishInternal:function(effect){new Effect.MoveBy(effect.element,0,-40,{duration:0.1,afterFinishInternal:function(effect){new Effect.MoveBy(effect.element,0,40,{duration:0.1,afterFinishInternal:function(effect){new Effect.MoveBy(effect.element,0,-40,{duration:0.1,afterFinishInternal:function(effect){new Effect.MoveBy(effect.element,0,40,{duration:0.1,afterFinishInternal:function(effect){new Effect.MoveBy(effect.element,0,-20,{duration:0.05,afterFinishInternal:function(effect){with(Element){undoPositioned(effect.element);setStyle(effect.element,oldStyle);}}})}})}})}})}})}});}
Effect.SlideDown=function(element){element=$(element);Element.cleanWhitespace(element);var oldInnerBottom=Element.getStyle(element.firstChild,'bottom');var elementDimensions=Element.getDimensions(element);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){with(Element){makePositioned(effect.element);makePositioned(effect.element.firstChild);if(window.opera)setStyle(effect.element,{top:''});makeClipping(effect.element);setStyle(effect.element,{height:'0px'});show(element);}},afterUpdateInternal:function(effect){with(Element){setStyle(effect.element.firstChild,{bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});}},afterFinishInternal:function(effect){with(Element){undoClipping(effect.element);undoPositioned(effect.element.firstChild);undoPositioned(effect.element);setStyle(effect.element.firstChild,{bottom:oldInnerBottom});}}},arguments[1]||{}));}
Effect.SlideUp=function(element){element=$(element);Element.cleanWhitespace(element);var oldInnerBottom=Element.getStyle(element.firstChild,'bottom');return new Effect.Scale(element,0,Object.extend({scaleContent:false,scaleX:false,scaleMode:'box',scaleFrom:100,restoreAfterFinish:true,beforeStartInternal:function(effect){with(Element){makePositioned(effect.element);makePositioned(effect.element.firstChild);if(window.opera)setStyle(effect.element,{top:''});makeClipping(effect.element);show(element);}},afterUpdateInternal:function(effect){with(Element){setStyle(effect.element.firstChild,{bottom:(effect.dims[0]-effect.element.clientHeight)+'px'});}},afterFinishInternal:function(effect){with(Element){[hide,undoClipping].call(effect.element);undoPositioned(effect.element.firstChild);undoPositioned(effect.element);setStyle(effect.element.firstChild,{bottom:oldInnerBottom});}}},arguments[1]||{}));}
Effect.Squish=function(element){return new Effect.Scale(element,window.opera?1:0,{restoreAfterFinish:true,beforeSetup:function(effect){with(Element){makeClipping(effect.element);}},afterFinishInternal:function(effect){with(Element){hide(effect.element);undoClipping(effect.element);}}});}
Effect.Grow=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransistion: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(element)};var dims=Element.getDimensions(element);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.MoveBy(element,initialMoveY,initialMoveX,{duration:0.01,beforeSetup:function(effect){with(Element){hide(effect.element);makeClipping(effect.element);makePositioned(effect.element);}},afterFinishInternal:function(effect){new Effect.Parallel([new Effect.Opacity(effect.element,{sync:true,to:1.0,from:0.0,transition:options.opacityTransition}),new Effect.MoveBy(effect.element,moveY,moveX,{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){with(Element){setStyle(effect.effects[0].element,{height:'0px'});show(effect.effects[0].element);}},afterFinishInternal:function(effect){with(Element){[undoClipping,undoPositioned].call(effect.effects[0].element);setStyle(effect.effects[0].element,oldStyle);}}},options))}});}
Effect.Shrink=function(element){element=$(element);var options=Object.extend({direction:'center',moveTransistion: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(element)};var dims=Element.getDimensions(element);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.MoveBy(element,moveY,moveX,{sync:true,transition:options.moveTransition})],Object.extend({beforeStartInternal:function(effect){with(Element){[makePositioned,makeClipping].call(effect.effects[0].element)}},afterFinishInternal:function(effect){with(Element){[hide,undoClipping,undoPositioned].call(effect.effects[0].element);setStyle(effect.effects[0].element,oldStyle);}}},options));}
Effect.Pulsate=function(element){element=$(element);var options=arguments[1]||{};var oldOpacity=Element.getInlineOpacity(element);var transition=options.transition||Effect.Transitions.sinoidal;var reverser=function(pos){return transition(1-Effect.Transitions.pulse(pos))};reverser.bind(transition);return new Effect.Opacity(element,Object.extend(Object.extend({duration:3.0,from:0,afterFinishInternal:function(effect){Element.setStyle(effect.element,{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(element);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){with(Element){[hide,undoClipping].call(effect.element);setStyle(effect.element,oldStyle);}}});}},arguments[1]||{}));}

function initLightbox()
{var anchors=document.getElementsByClassName("lightbox");for(var i=0;i<anchors.length;++i){var anchor=anchors[i];Event.observe(anchor,"click",showLightBox);}}
function showLightBox(event)
{var anchor=Event.element(event);new Ajax.Request(anchor.href,{onSuccess:function(req){$('spotlightbox').innerHTML=req.responseText;center('box');new Effect.Appear($('box'));}});Event.stop(event);}
function hideLightBox()
{new Effect.Fade($('box'));Element.hide('overlay');return false;}
function center(element)
{var width=0;var height=0;var docElement=document.documentElement;var docBody=document.body;var overlay=$('overlay');element=$(element);if(typeof(window.innerWidth)=='number'){width=window.innerWidth;height=window.innerHeight;}else if(docElement&&(docElement.clientWidth||docElement.clientHeight)){width=docElement.clientWidth;height=docElement.clientHeight;}
else if(docBody&&(docBody.clientWidth||docBody.clientHeight)){width=docBody.clientWidth;height=docBody.clientHeight;}
element.style.position='absolute';element.style.zIndex=99;var scrollY=0;if(docElement&&docElement.scrollTop){scrollY=docElement.scrollTop;}else if(docBody&&docBody.scrollTop){scrollY=docBody.scrollTop;}else if(window.pageYOffset){scrollY=window.pageYOffset;}else if(window.scrollY){scrollY=window.scrollY;}
overlay.style.width=width+"px";overlay.style.height=height+scrollY+"px";var elementDimensions=Element.getDimensions(element);var setX=(width-elementDimensions.width)/2;var setY=(height-elementDimensions.height)/2+scrollY;setX=(setX<0)?0:setX;setY=(setY<0)?0:setY;element.style.left=setX+"px";element.style.top=setY+"px";}

function getPdMarkerRevisionInfo(){var cr="<br/>";var s="1.99e 05/05/06 - fixed zoomed tooltip positioning &amp; non-centered marker graphics."+cr+"1.99d 05/01/06 - fixed display &amp; blink when defining .transparent."+cr+"1.99c 04/25/06 - added display and blink."+cr+"1.99b 04/21/06 - added 'Powered By' version &amp; marker count display."+cr+"1.99a 04/18/06 - revised for Google Maps API Version 2, GMap2 required."+cr+"0.99c 01/30/06 - added setDetailWinClass and resetDetailWinClass."+cr+"0.99a 10/12/05 - now handles maps in containers with undefined widths"+cr+"define a div with id 'pdmarkerwork' to reduce flicker"+cr+"0.99  10/03/05 - added setImageEnabled, allowLeftTooltips (global)"+cr+"0.98  09/30/05 - fixed zoomToMarkers"+cr+"0.97  09/24/05 - added setHoverImage, setShowDetailOnClick, setDetailWinHTML, showDetailWin, closeDetailWin"+cr+"0.96  09/22/05 - added setTooltipHiding, getTooltipHiding"+cr+"0.95  09/20/05 - handle zoom for lingering tooltips mouseOutEnabled(false) "+"disables setImage and restoreImage"+cr+"0.94  09/20/05 - added setTooltipClass and resetTooltipClass"+cr+"0.93  09/19/05 - added slopPercentage [optional] parameter to zoomToMarkers"+cr+"0.92  09/18/05 - added getMouseOutEnabled, setMouseOutEnabled"+cr+"0.91  09/17/05 - fixed setOpacity";return s;}
function getPdMarkerVersion(){return getPdMarkerRevisionInfo().substring(0,15);}
function getPdMarkerShortVersion(){return getPdMarkerRevisionInfo().substring(0,5);}
var APIkey="";function getGoogleMapsVersion(){var i,a,b,c;var v="unknown";if(document.getElementsByTagName)
for(i=0;(a=document.getElementsByTagName("script")[i]);i++)
if(a.getAttribute("src"))
{b=a.getAttribute("src");c=b.indexOf("/mapfiles/maps");d=b.indexOf("http://maps.google.com/maps?file=api");e=b.indexOf("key=");if(c>0)
v=parseFloat(b.substring(c+14));if(d>=0)
if(e>0)
APIkey=b.substring(e+4);}
return v;}
function latLongToPixel(map,coord,zoom){var topLeft=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GLatLng(0,0),true),map.getZoom());var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(coord,map.getZoom());return new GPoint(point.x-topLeft.x,point.y-topLeft.y);}
var pdMarkerExtList=[];function PdMarkerAddToExtList(marker){pdMarkerExtList.push(marker);}
function PdMarkerRemoveFromExtList(id){for(var i=0;i<pdMarkerExtList.length;i++)
if(pdMarkerExtList[i].internalId==id)
pdMarkerExtList.splice(i,1);}
function PdMarkerFindInExtList(id){for(var i=0;i<pdMarkerExtList.length;i++)
if(pdMarkerExtList[i].internalId==id)
return pdMarkerExtList[i];}
function PdMarkerClose(id){for(var i=0;i<pdMarkerExtList.length;i++)
if(pdMarkerExtList[i].internalId==id)
{pdMarkerExtList[i].closeDetailWin();pdMarkerExtList.splice(i,1);}}
function PdMarkerBlinkOnOff(id){var marker=PdMarkerFindInExtList(id);if(marker)
{if(!marker.blinking)return;marker.blinkOn=!marker.blinkOn;marker.display(marker.blinkOn);setTimeout("PdMarkerBlinkOnOff("+marker.getId()+");",marker.blinkSpeed);}}
function isPdMarker(a){if(a.isMarker)
return true;return false;}
function getPdMarkerCount(a){if(a.pdMarkers)
return a.pdMarkers.length;return 0;}
GMap2.prototype.getMarkerById=function(id){var count=getPdMarkerCount(this);for(var i=0;i<count;i++)
if(isPdMarker(this.pdMarkers[i]))
if(this.pdMarkers[i].internalId==id)
{this.cursor=i;return this.pdMarkers[i];}
return null;}
GMap2.prototype.getFirstMarker=function(){var count=getPdMarkerCount(this);for(var i=0;i<count;i++)
if(isPdMarker(this.pdMarkers[i]))
{this.cursor=i;return this.pdMarkers[i];}
return null;}
GMap2.prototype.getNextMarker=function(){var count=getPdMarkerCount(this);if(count>0)
if(this.cursor>=0)
for(var i=this.cursor+1;i<count;i++)
if(isPdMarker(this.pdMarkers[i]))
{this.cursor=i;return this.pdMarkers[i];}
return null;}
GMap2.prototype.getNthMarker=function(nTh){var count=getPdMarkerCount(this);for(var i=0;i<count;i++)
if(isPdMarker(this.pdMarkers[i]))
{nTh--;if(nTh==0)
{this.cursor=i;return this.pdMarkers[i];}}
return null;}
GMap2.prototype.getMarkerCount=function(){return getPdMarkerCount(this);}
GMap2.prototype.boxMap=function(center,span){var spec=this.spec;var zoom=spec.getLowestZoomLevel(center,span,this.viewSize);this.centerAndZoom(new GPoint(center.x,center.y),zoom);}
GMap2.prototype.zoomToMarkers=function(slopPercentage,heightOffsetPct){var count=0;var thePoint,x,y,minX,maxX,minY,maxY,span;var marker=this.getFirstMarker();while(marker!=null)
{thePoint=marker.getPoint();x=thePoint.lat();y=thePoint.lng();if(count==0)
{minX=x;maxX=x;minY=y;maxY=y;}
else
{if(x<minX)minX=x;if(x>maxX)maxX=x;if(y<minY)minY=y;if(y>maxY)maxY=y;}
marker=this.getNextMarker();count++;}
if(count==1)
this.setCenter(new GLatLng(x,y),this.getZoom());else if(count>1)
{var center=new GLatLng((minX+maxX)/2,(minY+maxY)/2)
span=new GSize(Math.abs(maxX-minX),Math.abs(maxY-minY));slopWid=0;slopHgt=0;if(typeof slopPercentage!="undefined")
{slopWid=span.width*slopPercentage/200;slopHgt=span.height*slopPercentage/200;span.width*=1+slopPercentage/100;span.height*=1+slopPercentage/100;}
deltaHgt=0;if(typeof heightOffsetPct!="undefined")
{deltaHgt=span.height*heightOffsetPct/100;center=new GLatLng(center.lat()+deltaHgt,center.lng());}
var bounds=new GLatLngBounds(new GLatLng(minX-slopHgt,minY-slopWid),new GLatLng(maxX+slopHgt,maxY+slopWid));var zoom=this.getBoundsZoomLevel(bounds);this.setCenter(center,zoom);}}
function shorten(x){var factor=1000000
return Math.round(x*factor)/factor;}
function poweredByClick(map){var center=map.getCenter();var span=map.getBounds().toSpan();var zoom=map.getZoom();var url="http://maps.google.com/maps?ll="+center.lat()+","+center.lng()+"&spn="+shorten(span.lat())+","+shorten(span.lng())+"&z="+zoom+"&key="+APIkey;document.location=url;}
function poweredByMouseover(map){var marker=map.getFirstMarker();var bounds=map.getBounds();var visibleCount=0;var totalCount=0;while(marker!=null){var point=marker.getPoint();if(bounds.contains(point))
visibleCount++;totalCount=totalCount+1;marker=map.getNextMarker();}
var title=map.poweredByTitle+" ("+visibleCount+" markers of "+totalCount+" visible)"
map.poweredByObj.setAttribute("title",title);map.poweredByObj.setAttribute("alt",title);}
function getPoweredBy(map){try{var tooltip="GMap "+getGoogleMapsVersion()+" & PdMarker "+getPdMarkerShortVersion();map.poweredByTitle=tooltip;var b=document.createElement("img");b.setAttribute("src","http://www.google.com/intl/en_ALL/mapfiles/transparent.gif");b.setAttribute("width",62);b.setAttribute("alt",tooltip);b.setAttribute("title",tooltip);b.setAttribute("height",30);b.style.display="block";b.style.position="absolute";b.style.left="2px";b.style.bottom="0px";b.style.width="62px";b.style.height="30px";b.style.cursor="pointer";b.style.zIndex=600001;b.onclick=function(){poweredByClick(map);};b.onmouseover=function(){poweredByMouseover(map);};map.getPane(G_MAP_FLOAT_PANE).parentNode.parentNode.appendChild(b);return b;}
catch(e){}
return true;}
function setPoweredBy(map){getGoogleMapsVersion();if(!map.poweredByObj)
map.poweredByObj=getPoweredBy(map);}
function PdMarkerNamespace(){var userAgent=navigator.userAgent.toLowerCase();var n4=(document.layers);var n6=(document.getElementById&&!document.all);var ie=(document.all);var o6=(userAgent.indexOf("opera")!=-1);var safari=(userAgent.indexOf("safari")!=-1);var msie=(userAgent.indexOf("msie")!=-1)&&(userAgent.indexOf("opera")==-1);var nextMarkerId=10;var permitLeft=true;icon=new GIcon();icon.shadow="http://www.google.com/mapfiles/shadow50.png";icon.iconSize=new GSize(20,34);icon.shadowSize=new GSize(37,34);icon.iconAnchor=new GPoint(9,34);icon.infoWindowAnchor=new GPoint(9,2);icon.infoShadowAnchor=new GPoint(18,25);icon.image="http://www.google.com/mapfiles/marker.png";function PdMarker(a,b,tooltip){this.inheritFrom=GMarker;if(typeof b=="undefined")
b=icon;this.inheritFrom(a,b);if(typeof tooltip!="undefined")
this.pendingTitle=tooltip;else
this.pendingTitle="";this.internalId=nextMarkerId;nextMarkerId+=1;this.zIndexSaved=false;this.oldImagePath="";this.pendingCursor="";this.percentOpacity=70;this.mouseOutEnabled=true;this.setImageOn=true;this.hidingEnabled=true;this.showDetailOnClick=true;this.detailOpen=false;this.userData="";}
PdMarker.prototype=new GMarker(new GLatLng(1,1));function addMarkerToMapList(map,marker){try{if(map.pdMarkers.length);}
catch(e){map.pdMarkers=new Array();}
map.pdMarkers.push(marker);}
function removeMarkerFromMapList(map,marker){var id=marker.internalId;for(var i=0;i<map.pdMarkers.length;i++)
if(map.pdMarkers[i].internalId==id)
{map.pdMarkers.splice(i,1);return;}}
PdMarker.prototype.initialize=function(a){if(typeof a=="GMap")
{GLog.write("PdMarker requires GMap2");return;}
addMarkerToMapList(a,this);try
{GMarker.prototype.initialize.call(this,a);this.isMarker=true;if(this.pendingTitle.length>0)
this.setTitle(this.pendingTitle);if(this.pendingCursor.length>0)
this.setCursor(this.pendingCursor);this.map=a;setPoweredBy(a);GEvent.bindDom(this,"mouseover",this,this.onMouseOver);GEvent.bindDom(this,"mouseout",this,this.onMouseOut);GEvent.bindDom(this,"click",this,this.onClick);GEvent.bind(this.map,"zoomend",this,this.reZoom);}
catch(e){alert("PdMarker initialize error: "+e);}}
PdMarker.prototype.allowLeftTooltips=function(a){permitLeft=a;}
PdMarker.prototype.reZoom=function(){var didSet=false;if(this.tooltipObject)
if(this.tooltipObject.style.display=="block")
{setTTPosition(this);didSet=true;}
if(this.detailObject)
{if(!didSet)
setTTPosition(this);this.detailObject.style.top=this.ttTop+"px";this.detailObject.style.left=this.ttLeft+"px";}}
PdMarker.prototype.setId=function(id){this.internalId=id;}
PdMarker.prototype.getId=function(){return this.internalId;}
PdMarker.prototype.setName=function(a){this.name=a;}
PdMarker.prototype.getName=function(){if(this.name)
return this.name;else
return null;}
PdMarker.prototype.setUserData=function(a){this.userData=a;}
PdMarker.prototype.getUserData=function(){if(this.userData)
return this.userData;else
return"";}
PdMarker.prototype.setUserData2=function(a){this.userData2=a;}
PdMarker.prototype.getUserData2=function(){if(this.userData2)
return this.userData2;else
return"";}
PdMarker.prototype.setImageEnabled=function(a){this.setImageOn=a;}
var PdMIN="";var PdMIA="";function PdCompPdMIN(marker){}
PdMarker.prototype.setImage=function(a){var msFilter='progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+a+'")';if(this.mouseOutEnabled&&this.setImageOn)
{PdCompPdMIN(this);try{if(this.oldImagePath.length==0)
eval("this.oldImagePath = "+PdMIN+".src");if(msie)
eval(PdMIN+".style.filter = msFilter");else
eval(PdMIN+".src = a");}
catch(e){}}}
PdMarker.prototype.restoreImage=function(){if(this.mouseOutEnabled&&this.setImageOn&&this.oldImagePath.length>0)
{var a=this.oldImagePath;this.setImage(a);this.oldImagePath="";}}
PdMarker.prototype.display=function(a){PdCompPdMIN(this);var b="";if(!a)
{this.hideTooltip();this.closeDetailWin();b="none";}
try{var count=2;if(this.getIcon().transparent)
count=3;for(i=0;i<count;i++)
eval(PdMIA+"["+i+"].style.display = b;");}
catch(e){}}
PdMarker.prototype.blink=function(a,b){if(a)
{this.blinkOn=true;marker.blinkSpeed=b;if(!this.blinking)
{this.blinking=a;PdMarkerAddToExtList(this);PdMarkerBlinkOnOff(this.getId());}}
else
{this.blinking=a;this.display(true);PdMarkerRemoveFromExtList(this);}}
PdMarker.prototype.setIcon=function(a){this.remove();this.icon=a;this.initialize(this.map);this.redraw(true);}
PdMarker.prototype.setMarkerZIndex=function(a){if(!this.zIndexSaved)
{this.zIndexSaved=true;this.oldZIndex=eval(PdMIN+".style.zIndex");}
eval(PdMIN+".style.zIndex = a")
this.redraw(true);}
PdMarker.prototype.topMarkerZIndex=function(){this.setMarkerZIndex(600000);}
PdMarker.prototype.restoreMarkerZIndex=function(){if(this.zIndexSaved)
{this.zIndexSaved=false;eval(PdMIN+".style.zIndex = this.oldZIndex")
this.redraw(true);}}
PdMarker.prototype.onInfoWindowOpen=function(){this.hideTooltip();GMarker.prototype.onInfoWindowOpen.call(this);}
PdMarker.prototype.setHoverImage=function(a){this.hoverImage=a;}
var inMouseOver=false;PdMarker.prototype.onMouseOver=function(){if(inMouseOver)
return;inMouseOver=true;if(this.hoverImage)
this.setImage(this.hoverImage);if(!this.detailOpen)
this.showTooltip();inMouseOver=false;}
PdMarker.prototype.onMouseOut=function(){if(this.hoverImage)
this.restoreImage();if(!this.detailOpen)
if(this.mouseOutEnabled)
this.hideTooltip();}
PdMarker.prototype.setMouseOutEnabled=function(a){this.mouseOutEnabled=a;}
PdMarker.prototype.getMouseOutEnabled=function(){return this.mouseOutEnabled;}
PdMarker.prototype.setTooltipHiding=function(a){this.hidingEnabled=a;}
PdMarker.prototype.getTooltipHiding=function(){return this.hidingEnabled;}
PdMarker.prototype.setTitle=function(a){this.tooltipText="";PdCompPdMIN(this);try{eval(PdMIN+".title = a");}
catch(e){this.pendingTitle=a;}}
PdMarker.prototype.setCursor=function(a){PdCompPdMIN(this);try{eval(PdMIN+".style.cursor = a");}
catch(e){this.pendingCursor=a;}}
PdMarker.prototype.setTooltipClass=function(a){this.pendingClassName=a;if(this.tooltipObject)
{var showing=(this.tooltipObject.style.display!="none");this.deleteObjects();if(this.tooltipRaw)
this.setTooltipNoResize(this.tooltipRaw);if(showing)
this.showTooltip();}
else
if(this.tooltipRaw)
this.setTooltipNoResize(this.tooltipRaw);}
PdMarker.prototype.resetTooltipClass=function(){this.setTooltipClass("markerTooltip");}
PdMarker.prototype.getTooltip=function(){try{return this.tooltipRaw;}
catch(e)
{return"";}}
PdMarker.prototype.setTooltipNoResize=function(a){this.setTitle("");var ttClass="markerTooltip";if(this.pendingClassName)
ttClass=this.pendingClassName;this.tooltipRaw=a;this.tooltipText="<div class='"+ttClass+"'>"+a+"</div>";if(this.tooltipObject)
this.tooltipObject.innerHTML=this.tooltipText;}
PdMarker.prototype.setTooltip=function(a){this.setTooltipNoResize(a);this.deleteObjects();}
PdMarker.prototype.showTooltip=function(){if(this.tooltipText)
{if(!this.tooltipObject)
initTooltip(this);setTTPosition(this);this.tooltipObject.style.display="block";}}
PdMarker.prototype.hideTooltip=function(){if(this.tooltipObject)
if(this.hidingEnabled)
this.tooltipObject.style.display="none";}
PdMarker.prototype.onClick=function(a){if(this.showDetailOnClick&&this.detailWinHTML)
this.showDetailWin();}
PdMarker.prototype.setShowDetailOnClick=function(a){this.showDetailOnClick=a;}
PdMarker.prototype.setDetailWinHTML=function(a){this.detailWinHTML=a;}
PdMarker.prototype.setDetailWinClass=function(a){this.pendingDetailClassName=a;}
PdMarker.prototype.resetDetailWinClass=function(){this.setDetailWinClass("markerDetail");}
PdMarker.prototype.showDetailWin=function(){if(this.detailOpen)
{this.closeDetailWin();return;}
this.hideTooltip();this.setMouseOutEnabled(false);var winClass="markerDetail";if(this.pendingWinClassName)
winClass=this.pendingWinClassName;var html="<table><tr><td>"+this.detailWinHTML+"<\/td><td valign='top'><a class='markerDetailClose' href='javascript:PdMarkerClose("+this.internalId+")'><img src='http://www.google.com/mapfiles/close.gif' width='14' height='13'><\/a><\/td><\/tr><\/table>";html="<div class='"+winClass+"'>"+html+"</div>";this.detailOpen=true;if(!this.tooltipText)
{this.ttWidth=150;this.ttHeight=30;setTTPosition(this);}
initDetailWin(this,this.ttTop,this.ttLeft,html);PdMarkerAddToExtList(this);}
PdMarker.prototype.closeDetailWin=function(){this.detailOpen=false;if(this.detailObject)
{this.setMouseOutEnabled(true);this.onMouseOut();this.map.getPane(G_MAP_FLOAT_PANE).removeChild(this.detailObject);this.detailObject=null;}}
PdMarker.prototype.deleteObjects=function(){if(this.tooltipObject)
{this.map.getPane(G_MAP_FLOAT_PANE).removeChild(this.tooltipObject);this.tooltipObject=null;}
if(this.detailObject)
{this.map.getPane(G_MAP_FLOAT_PANE).removeChild(this.detailObject);this.detailObject=null;}}
PdMarker.prototype.remove=function(a){removeMarkerFromMapList(this.map,this);PdMarkerRemoveFromExtList(this.getId());GMarker.prototype.remove.call(this);this.deleteObjects();}
PdMarker.prototype.setOpacity=function(b){if(b<0)
b=0;if(b>=100)
b=100;var c=b/100;this.percentOpacity=b;var d=document.getElementById(this.objId);if(d)
{if(typeof(d.style.filter)=='string'){d.style.filter='alpha(opacity:'+b+')';}
if(typeof(d.style.KHTMLOpacity)=='string'){d.style.KHTMLOpacity=c;}
if(typeof(d.style.MozOpacity)=='string'){d.style.MozOpacity=c;}
if(typeof(d.style.opacity)=='string'){d.style.opacity=c;}}}
PdMarker.prototype.setOpacityNew=function(b){setObjOpacity(this.objId);this.percentOpacity=b;}
function setObjOpacity(objId,b){if(b<0)
b=0;if(b>=100)
b=100;var c=b/100;var d=document.getElementById(objId);if(d)
{if(typeof(d.style.filter)=='string'){d.style.filter='alpha(opacity:'+b+')';}
if(typeof(d.style.KHTMLOpacity)=='string'){d.style.KHTMLOpacity=c;}
if(typeof(d.style.MozOpacity)=='string'){d.style.MozOpacity=c;}
if(typeof(d.style.opacity)=='string'){d.style.opacity=c;}}}
function idToElemId(id){return"ttobj"+id;}
function initTooltip(theObj){theObj.objId=idToElemId(theObj.internalId);theObj.anchorLatLng=theObj.point;var b=document.createElement('span');theObj.tooltipObject=b;b.setAttribute('id',theObj.objId);b.innerHTML=theObj.tooltipText;var c=document.body;var d=document.getElementById("pdmarkerwork");if(d)
c=d;c.appendChild(b);b.style.position="absolute";b.style.bottom="5px";b.style.left="5px";b.style.zIndex=1;if(theObj.percentOpacity)
theObj.setOpacity(theObj.percentOpacity);var tempObj=document.getElementById(theObj.objId);theObj.ttWidth=tempObj.offsetWidth;theObj.ttHeight=tempObj.offsetHeight;c.removeChild(b);b.style.zIndex=600000;b.style.bottom="";b.style.left="";theObj.map.getPane(G_MAP_FLOAT_PANE).appendChild(b);}
function initDetailWin(theObj,top,left,html){theObj.detailId="detail"+theObj.internalId;var b=document.createElement('span');theObj.detailObject=b;b.setAttribute('id',theObj.detailId);b.innerHTML=html;b.style.display="block";b.style.position="absolute";b.style.top=top+"px";b.style.left=left+"px";b.style.zIndex=600001;map=theObj.map;map.getPane(G_MAP_FLOAT_PANE).appendChild(b);}
function setTTPosition(theObj){var gap=5;var map=theObj.map;var pt=theObj.getPoint();var ttPos=latLongToPixel(map,pt,map.getZoom());var theIcon=theObj.getIcon();ttPos.y-=Math.floor(theIcon.iconAnchor.y/2);var rightSide=true;var bounds=map.getBounds();var boundsSpan=bounds.toSpan();var longSpan=boundsSpan.lng();var mapWidth=map.getSize().width;var tooltipWidthInDeg=(theObj.ttWidth+theIcon.iconSize.width+6)/mapWidth*longSpan;if(pt.lng()+tooltipWidthInDeg>bounds.getNorthEast().lng()&&permitLeft)
rightSide=false;if(rightSide)
{ttPos.y-=Math.floor(theObj.ttHeight/2);ttPos.x+=(theIcon.iconSize.width-theIcon.iconAnchor.x)+gap;}
else
{ttPos.y-=Math.floor(theObj.ttHeight/2);ttPos.x-=(theIcon.iconAnchor.x+theObj.ttWidth)+gap;}
theObj.ttLeft=ttPos.x;theObj.ttTop=ttPos.y;if(theObj.tooltipObject)
{theObj.tooltipObject.style.left=ttPos.x+"px";theObj.tooltipObject.style.top=ttPos.y+"px";}}
function makeInterface(a){var b=a||window;b.PdMarker=PdMarker;}
makeInterface();}
PdMarkerNamespace();

var gPI=(Math.atan2(1,1)*4.0);function ID(id){return document.getElementById(id);}
elementHasAttr=function(element,attr){return false;}
if(document.documentElement.hasAttribute)
elementHasAttr=function(element,attr){return element.hasAttribute(attr);};else
elementHasAttr=function(element,attr){return element.getAttribute(attr)!=null;};function hideShowElement(elementID)
{var element=ID(elementID);if(element.style.display=="none")
element.style.display='block';else
element.style.display='none';}
function getFirstElementByTagName(parent,tagName)
{var elements=parent.getElementsByTagName(tagName);if(elements.length>0){var firstChild=elements[0].firstChild;if(firstChild)
return firstChild.nodeValue;}
return null;}
function getAttrFromFirstElementByTagName(parent,tagName,attr)
{var elements=parent.getElementsByTagName(tagName);if(elements.length>0){return elements[0].getAttribute(attr);}
return null;}
function getArgs()
{var args=new Array();var decoded=decodeURI(window.location.search);var query=decoded.substring(1);var params=query.split('&');for(var i=0;i<params.length;++i){var loc=params[i].indexOf('=');if(loc>0){var key=params[i].substring(0,loc);var val=params[i].substring(loc+1);args[key]=val;}}
return args;}
function onMouseClick(e)
{if(event.button==2){var m=_m.map;var b=m.getRelativeClickPoint(e,m.container);var ll=toMapPoint(b.x,(m.viewSize.height-b.y));}}
function toMapPoint(screenX,screenY)
{var m=_m.map;var b=m.getBoundsLatLng();var mapX=(((b.maxX-b.minX)/m.viewSize.width)*screenX)+b.minX;var mapY=(((b.maxY-b.minY)/m.viewSize.height)*screenY)+
b.minY;return new _Point(mapX,mapY);}
function DocLoader(){}
DocLoader.prototype.onload=function(doc){};DocLoader.prototype.onerror=function(){};DocLoader.prototype.onprogress=function(state,status){};DocLoader.prototype.req=null;DocLoader.prototype.load=function(uri)
{new Ajax.Request(uri,{onComplete:this._success.bind(this),onFailure:this.onerror.bind(this)});};DocLoader.prototype._success=function(req)
{this.onload(req.responseXML,req.responseText);}
function roundMiles(miles)
{var temp=Math.round(miles*100.0);if(temp<10){return"0.0"+temp;}
if(temp<100){return"0."+temp;}
temp=temp+"";return temp.substring(0,temp.length-2)+"."+temp.substring(temp.length-2);}
function degreeToRadian(deg)
{return deg*(gPI/180);}
function computeDistance(p1,p2)
{var r=3963.1;var lat1=degreeToRadian(p1.y);var lon1=degreeToRadian(p1.x);var lat2=degreeToRadian(p2.y);var lon2=degreeToRadian(p2.x);return Math.acos(Math.cos(lat1)*Math.cos(lon1)*Math.cos(lat2)*Math.cos(lon2)+
Math.cos(lat1)*Math.sin(lon1)*Math.cos(lat2)*Math.sin(lon2)+
Math.sin(lat1)*Math.sin(lat2))*r;}
GMarker.prototype.setMarkerHtml=function(html)
{this.html=html;};GMarker.prototype.openWithHtml=function()
{this.openInfoWindowHtml(this.html);};function debug(msg)
{var d=ID("debug");if(d){d.innerHTML+=msg+"<br/>";}}
function clearDebug()
{var d=ID("debug");if(d){d.innerHTML="";}}

var gMap=null;GEvent.addDomListener(window,"unload",GUnload);function init()
{var mapBody=ID("mapBody");mapBody.innerHTML="";gMap=new GMap2(mapBody);gMap.addControl(new GLargeMapControl());gMap.addControl(new GMapTypeControl());gMap.addControl(new GOverviewMapControl());gMap.setCenter(new GLatLng(38.897473,-77.029473),12);gMap.enableContinuousZoom();GEvent.addDomListener(window,"resize",resize);resize();}
function resize()
{var map=gMap;var infoPanel=ID("infoPanel");var mapBody=ID("mapBody");var header=ID("header");var searchPanel=ID("searchPanel");var mainNavBar=ID("mainNavBar");var windowWidth=(window.innerWidth)?window.innerWidth:document.documentElement.clientWidth;var windowHeight=(window.innerHeight)?window.innerHeight:document.documentElement.clientHeight;var width=windowWidth-infoPanel.offsetWidth-infoPanel.offsetLeft-20;var height=windowHeight-(header.offsetHeight+
searchPanel.offsetHeight+
mainNavBar.offsetHeight+
searchPanel.offsetTop);mapBody.style.width=Math.abs(width)+"px";mapBody.style.height=Math.abs(height)+"px";infoPanel.style.height=Math.abs(height)+"px";mainNavBar.style.width=Math.abs(windowWidth-infoPanel.offsetLeft-22)+"px";map.checkResize();return true;}

function Alert(link,title)
{this.link=link;this.title=title;this.anchor=document.createElement("a");this.anchor.setAttribute("href",this.link);this.anchor.innerHTML=this.title;this.anchor.style.display="none";ID("alerts").appendChild(this.anchor);}
Alert.prototype.show=function()
{Effect.Appear(this.anchor);}
Alert.prototype.hide=function(callback)
{Effect.Fade(this.anchor,callback);}
function AlertList(alerts)
{this.alerts=alerts;this.active=0;this.alerts.splice(this.alerts.length-1,1);if(this.alerts.length>1){this.alerts[this.active].show();setTimeout(this.toggle.bind(this),7000);}
else if(this.alerts.length==1){this.alerts[this.active].show();}}
AlertList.prototype.toggle=function()
{this.alerts[this.active].hide(this._toggleShow.bind(this));}
AlertList.prototype._toggleShow=function()
{++this.active;if(this.active>=this.alerts.length){this.active=0;}
this.alerts[this.active].show();setTimeout(this.toggle.bind(this),7000);}

var gStations=[];var gInfoPanel=null;GEvent.addDomListener(window,"unload",metroCleanup);GEvent.addDomListener(window,"load",loadAlerts);function metroInit()
{init();window.queries=new Array();window.qindex=0;gInfoPanel=new InfoPanel();gMap.closeInfoWindow();gMap.setCenter(new GLatLng(38.897473,-77.029473),gMap.getZoom());gInfoPanel.clearInfo();var args=getArgs();for(query in args){if(query.match(/^q/)){var addr=args[query];window.queries.push(addr);}}
loadStations();loadTracks();GEvent.addListener(gMap,'zoomend',onMapZoom);initLightbox();}
function loadAlerts()
{var loader=new DocLoader();loader.onload=function(xml,txt){try{new AlertList(window.eval("("+txt+")"));}catch(e){debug("loadingAlerts: "+e);}};loader.load("/metro/alert");}
function metroCleanup()
{for(var i=0;i<gStations.length;++i){gStations[i].cleanup();}
gStations=null;gInfoPanel=null;gMap=null;}
function linkToPage()
{var linkURL="http://"+window.location.host+"/?"+gInfoPanel.serialize();if(window.location!=linkURL){window.location=linkURL;}}
function loadUrl(url)
{gInfoPanel.clearInfo();ID("loaderFrame").src=url;return false;}
window.loadVPage=function(queryData)
{if(!gMap){metroInit();}
var runFirstSearch=function(){if(window.qindex<window.queries.length){Station.search(window.queries[window.qindex++]);}};if(queryData){runFirstSearch=function(){ID('query').value=queryData.form.q.q;var markers=queryData.overlays.markers;var totalMarkers=queryData.overlays.markers.length;if(totalMarkers){var center=new GLatLng(queryData.viewport.center.lat,queryData.viewport.center.lng);var point=new GLatLng(queryData.overlays.markers[0].lat,queryData.overlays.markers[0].lng);var markers=queryData.overlays.markers;var dist=computeDistance(center,point);var closestPoint=point;for(var i=1;i<10&&markers[i];++i){point=new GLatLng(markers[i].lat,markers[i].lng);var checkDist=computeDistance(center,point);if(checkDist<dist){closestPoint=point;dist=checkDist;}}
point=closestPoint;var query={}
query.q=queryData;locateNearestStation(point,function(station,entrance,distance,query){var location=gInfoPanel.addLocation(point,query,roundMiles(distance),station,totalMarkers);location.showDetails();gMap.setCenter(point,gMap.getZoom());},ID('query').value);}
else{if(queryData.panel){gInfoPanel.showInfo(queryData.panel);}
else{gInfoPanel.showInfo("Query Not Found!  Please try to refine your search");}}
hideThrobber();if(window.qindex<window.queries.length){Station.search(window.queries[window.qindex++]);}};}
var checkSearch=function(){if(gStations&&gStations.length==86){runFirstSearch();}
else{setTimeout(checkSearch,50);}};setTimeout(checkSearch,10);};function updateThrobberMsg(msg)
{ID("throbberInfo").innerHTML=msg;}
function showThrobber(msg)
{ID("throbber").style.display="block";ID("throbberInfo").innerHTML=msg;}
function hideThrobber()
{ID("throbber").style.display="none";}
function runExampleQuery()
{Station.search(ID('exampleSearch').firstChild.nodeValue);}
function locateNearestStation(point,foundStation,query)
{var sdist=computeDistance(point,gStations[0].latlng);var dist=0;var sindex=0;var eindex=-1;var stationCount=gStations.length;for(var i=1;i<stationCount;++i){var station=gStations[i];var entrances=station.entrances;var entranceCount=entrances.length;dist=computeDistance(point,station.latlng);if(dist<sdist){sdist=dist;sindex=i;eindex=-1;}
if(entranceCount>0){for(var j=0;j<entranceCount;++j){var entrance=entrances[j];dist=computeDistance(point,entrance.latlng);if(dist<sdist){sdist=dist;sindex=i;eindex=j;}}}}
foundStation(gStations[sindex],eindex,sdist,query);}

var cLineWidth=5;var cOpacity=1.0;var gColorMap=[];gColorMap['red']='#FF0000';gColorMap['green']='#00FF00';gColorMap['blue']='#0000FF';gColorMap['orange']='#FF7E4B';gColorMap['yellow']='#F0FE0B';var gIconMap=[];gIconMap[0]=createIcon("/images/ns_smaller.png",9,9);gIconMap[1]=createIcon("/images/ts_smaller.png",15,15);gIconMap[2]=createIcon("/images/ns_smallest.png",5,5);GMarker.prototype.openStationInfo=function()
{if(this.html==""){var loader=new DocLoader();var marker=this;loader.onload=function(xml,txt){marker.setMarkerHtml(txt);marker.openWithHtml();};if(this.stationId){loader.load("/metro/station_info/"+this.stationId);}
else if(this.entranceId){loader.load("/metro/entrance_info/"+this.entranceId);}
return false;}
this.openWithHtml();return true;}
function createIcon(path,w,h)
{var icon=new GIcon();icon.image=path;icon.iconSize=new GSize(w,h);icon.iconAnchor=new GPoint(5,5);icon.infoWindowAnchor=new GPoint(5,1);return icon;}
function Entrance(id,address,latlng)
{this.id=id;this.address=address;this.latlng=latlng;}
Entrance.prototype={id:0,address:"",latlng:null,marker:null,cleanup:function(){this.marker=null;this.latlng=null;},show:function(){if(!this.marker){this.marker=new PdMarker(this.latlng,gIconMap[2]);this.marker.entranceId=this.id;setTimeout(this.init.bind(this),0);GEvent.bind(this.marker,"click",this.marker,GMarker.prototype.openStationInfo);gMap.addOverlay(this.marker);}},init:function(){this.marker.setTooltip(this.address);this.marker.setTooltipClass("station-tooltip");this.marker.setOpacity(70);this.marker.html="";},hide:function(remove){if(this.marker){if(remove){gMap.removeOverlay(this.marker);}
this.marker=null;}}};function Station(id,name,latlng,color,transfer,link,tooltip,address,entrances)
{this.id=id;this.name=name;this.latlng=latlng;this.color=color;this.transfer=transfer;this.link=link;this.tooltip=tooltip;this.address=address;this.entrances=entrances;}
Station.search=function(query)
{ID("information").innerHTML="";showThrobber("Searching...");ID("loaderFrame").src="/metro/local_search?path="+encodeURIComponent(query);};Station.prototype={id:0,name:"",color:"",link:"",address:"",latlng:null,tooltip:"",entrances:[],marker:null,cleanup:function(){this.marker=null;this.latlng=null;for(var i=0;i<this.entrances.length;++i){this.entrances[i].cleanup();}
this.entrances=null;},show:function(zoom,i){if(!this.marker){this.marker=new PdMarker(this.latlng,gIconMap[this.transfer]);setTimeout(this.init.bind(this),0);this.marker.stationId=this.id;GEvent.bind(this.marker,"click",this.marker,GMarker.prototype.openStationInfo);gMap.addOverlay(this.marker);}
if(zoom>14){setTimeout(this.showEntrances.bind(this),0);}},init:function(){this.marker.setTooltip(this.tooltip);this.marker.setTooltipClass("station-tooltip");this.marker.setOpacity(70);this.marker.html="";},hide:function(remove){if(this.marker){if(remove){gMap.removeOverlay(this.marker);}
this.marker=null;}
this.hideEntrances(remove);},showEntrances:function(){for(var i=0;i<this.entrances.length;++i){this.entrances[i].show();}},hideEntrances:function(remove){for(var i=0;i<this.entrances.length;++i){this.entrances[i].hide(remove);}},showDetails:function(){this.marker.openStationInfo();}};Station.getById=function(id)
{return gStations[id];}
Station.showById=function(id)
{var station=Station.getById(id);station.showDetails();}
Station.hideById=function(id)
{var station=Station.getById(id);station.hide();}
function loadStations()
{var loader=new DocLoader();loader.onload=function(xmlNil,jsonTxt,loader)
{gStations=window.eval("("+jsonTxt+")");displayStations(0,gMap.getZoom());};showThrobber("Loading...");loader.load("/metro/station_list");}
function onMapZoom(oldLevel,newLevel)
{if(oldLevel!=newLevel){showThrobber("Zooming...");if(newLevel>14){for(var i=0;i<gStations.length;++i){gStations[i].showEntrances();}}
else if(oldLevel>14){function hideEntrances(index){for(var i=0;i<10&&index<gStations.length;++i){gStations[index++].hideEntrances(true);}
if(index<gStations.length){setTimeout(function(){hideEntrances(index)},0);}}
setTimeout(function(){hideEntrances(0)},0);}
hideThrobber();}}
function displayStations(index,zoom)
{var length=gStations.length;for(var count=0;count<30&&index<length;++count){gStations[index].show(zoom);++index;}
if(index<length){setTimeout(function(){displayStations(index,zoom);},0);}}
function loadTracks()
{var trackLoader=new DocLoader();updateThrobberMsg("Loading Tracks...");trackLoader.onload=function(xmlNil,jsonTxt,loader)
{try{if(!jsonTxt.length){setTimeout(loadTracks,100);return;}
var trackData=window.eval("("+jsonTxt+")");var showTrack=function(color,data)
{gMap.addOverlay(new GPolyline(data[color],gColorMap[color],cLineWidth,cOpacity));};showTrack("orange",trackData);showTrack("red",trackData);showTrack("blue",trackData);showTrack("green",trackData);showTrack("yellow",trackData);trackData=null;hideThrobber();}catch(e){alert(e+"\n=>\n"+jsonTxt);}};showThrobber("Loading Track Data");trackLoader.load("/metro/all_track_data");}

function Location(point,id,dest,distance,station,totalMarkers)
{this.id=id;this.dest=dest;this.distance=distance;this.station=station;this.totalMarkers=totalMarkers;this.marker=new PdMarker(point);this.marker.setTooltip(this.dest);this.marker.setTooltipClass("station-tooltip");this.marker.setMarkerHtml(this.getDetails());GEvent.bind(this.marker,"click",this.marker,GMarker.prototype.openWithHtml);gMap.addOverlay(this.marker);}
Location.prototype.showDetails=function()
{this.marker.openWithHtml();};Location.prototype.toString=function()
{return"{station:'"+this.station.name+"',dest:'"+this.dest+"'}";};Location.prototype.cleanup=function()
{var infoWindow=gMap.getInfoWindow();if(infoWindow){var p1=infoWindow.getPoint();var p2=this.marker.getPoint();if(p1.x==p2.x&&p1.y==p2.y){gMap.closeInfoWindow();}}
gMap.removeOverlay(this.marker);};Location.prototype.getDetails=function()
{return"<div style='width: 12em; style: font-size: small'><p>"+this.dest+" is <b>"+this.distance+"</b> miles from <br/>"+"<a href=\"javascript:Station.showById("+(this.station.id-1)+")\">"+
this.station.name+"</a></p></div>";};Location.prototype.pulsate=function()
{Effect.Pulsate($('location-'+this.id));};Location.prototype.serialize=function()
{return encodeURI(this.dest);};function InfoPanel()
{this.locations=[];}
InfoPanel.prototype.getLocationById=function(id)
{return this.locations[id];}
InfoPanel.prototype.addLocation=function(point,dest,dist,station,totalMarkers)
{var location=this.locationExists(point,dest);if(location){location.pulsate();return location;}
location=new Location(point,this.locations.length,dest,dist,station,totalMarkers);this.locations.push(location);this.redrawLocationList();return location;};InfoPanel.prototype.locationExists=function(point,dest)
{for(var i=0;i<this.locations.length;++i){var location=this.locations[i];if(location.dest==dest){return this.locations[i];}}
return null;};InfoPanel.prototype.removeLocationById=function(id)
{for(var i=0;i<this.locations.length;++i){var loc=this.locations[i];if(loc.id==id){var el=$("location-"+id);Effect.Fade(el,Element.remove);this.locations.splice(i,1);loc.cleanup();break;}}};InfoPanel.removeLocationById=function(id)
{gInfoPanel.removeLocationById(id);};InfoPanel.prototype.redrawLocationList=function()
{var locationArea=ID("locations");if(this.locations.length==0){locationArea.style.display="none";return;}
var output;output="<ul id='locationsList'>";for(var i=this.locations.length-1;i>=0;--i){var loc=this.locations[i];output+="<li id='location-"+loc.id+"'><div><a title=\""+loc.dest+" is "+loc.distance+" miles from "+loc.station.name+"\""+" href='javascript:InfoPanel.showLocationById("+loc.id+")'>"+loc.dest+"</a>"+"<a class='removeLocationMark' href='javascript:InfoPanel.removeLocationById("+i+")'>x</a><br/>"+
loc.distance+" miles from "+"<a href='javascript:Station.showById("+(loc.station.id-1)+")'>"+loc.station.name+"</a>"
+this.certainty(loc.totalMarkers)+"</div></li>";}
locationArea.innerHTML=output+"</ul>";locationArea.style.display="block";};InfoPanel.prototype.certainty=function(markers)
{var level=(1/markers)*100;var out="<span title='Search Certainty: "+Math.round(level)+"%'>&nbsp;";if(level==100){out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";}
else if(level>75){out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star_grey.gif'/>";}
else if(level>50){out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star_grey.gif'/>";out+="<img src='/images/star_grey.gif'/>";}
else if(level>25){out+="<img src='/images/star.gif'/>";out+="<img src='/images/star.gif'/>";out+="<img src='/images/star_grey.gif'/>";out+="<img src='/images/star_grey.gif'/>";out+="<img src='/images/star_grey.gif'/>";}
else{out+="<img src='/images/star.gif'/>";out+="<img src='/images/star_grey.gif'/>";out+="<img src='/images/star_grey.gif'/>";out+="<img src='/images/star_grey.gif'/>";out+="<img src='/images/star_grey.gif'/>";}
return out+"</span>";};InfoPanel.prototype.showInfo=function(msg)
{ID('information').innerHTML="<p>"+msg+"</p>";};InfoPanel.prototype.clearInfo=function(msg)
{if(msg){ID('information').innerHTML=msg;}
else{ID('information').innerHTML='<div id="searchExample">Example Search: <a href="javascript:runExampleQuery()" id="exampleSearch" class="example">1250 Connecticut Ave NW, DC 20037</a></div>';}}
InfoPanel.showLocationById=function(id)
{var location=gInfoPanel.getLocationById(id);location.showDetails();};InfoPanel.prototype.serialize=function()
{var args="q0="+this.locations[0].serialize();for(var i=1;i<this.locations.length;++i){args+="&q"+i+"="+this.locations[i].serialize();}
return args;};InfoPanel.about=function()
{var loader=new DocLoader();loader.onload=function(xml,txt){ID("information").innerHTML=txt;};loader.load("/metro/about");};

(function(){var m={'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"':'\\"','\\':'\\\\'},s={array:function(x){var a=['['],b,f,i,l=x.length,v;for(i=0;i<l;i+=1){v=x[i];f=s[typeof v];if(f){v=f(v);if(typeof v=='string'){if(b){a[a.length]=',';}
a[a.length]=v;b=true;}}}
a[a.length]=']';return a.join('');},'boolean':function(x){return String(x);},'null':function(x){return"null";},number:function(x){return isFinite(x)?String(x):'null';},object:function(x){if(x){if(x instanceof Array){return s.array(x);}
var a=['{'],b,f,i,v;for(i in x){v=x[i];f=s[typeof v];if(f){v=f(v);if(typeof v=='string'){if(b){a[a.length]=',';}
a.push(s.string(i),':',v);b=true;}}}
a[a.length]='}';return a.join('');}
return'null';},string:function(x){if(/["\\\x00-\x1f]/.test(x)){x=x.replace(/([\x00-\x1f\\"])/g,function(a,b){var c=m[b];if(c){return c;}
c=b.charCodeAt();return'\\u00'+
Math.floor(c/16).toString(16)+
(c%16).toString(16);});}
return'"'+x+'"';}};Object.prototype.toJSONString=function(){return s.object(this);};Array.prototype.toJSONString=function(){return s.array(this);};})();String.prototype.parseJSON=function(){try{return!(/[^,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]/.test(this.replace(/"(\\.|[^"\\])*"/g,'')))&&eval('('+this+')');}catch(e){return false;}};
