function method(o,f){return function(){return f.apply(o,arguments);}}
function Class(base,props){var cls=function(){if(this.__init__){this.__init__.apply(this,arguments);}}
if(base){for(var key in base){cls[key]=base[key];}}
for(var key in props){cls[key]=props[key];}
cls.prototype=cls;return cls;}
var Browser={isIE:navigator.appName.toLowerCase().indexOf("microsoft")!=-1,isIE6:navigator.appName.toLowerCase().indexOf("microsoft")!=-1&&!window.XMLHttpRequest,isFirefox:navigator.userAgent.toLowerCase().indexOf("firefox")!=-1,isGecko:navigator.product=='Gecko',isSafari:navigator.vendor&&navigator.vendor.toLowerCase().indexOf('apple')!=-1}
function $A(pseudo){var real=[];for(var i=0;i<pseudo.length;i++){real.push(pseudo[i]);}
return real;}
function $(){var elements=[];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=function(destination,source){for(property in source){destination[property]=source[property];}
return destination;}
Object.optextend=function(destination,source){for(property in source){if(destination[property]==undefined){destination[property]=source[property];}}
return destination;}
Function.prototype.bind=function(object){var method=this;var oldArguments=$A(arguments).slice(1);return function(){var newArguments=$A(arguments);return method.apply(object,oldArguments.concat(newArguments));};}
function copy(obj,props){if(!props){return;}
for(var key in props){obj[key]=props[key];}}
var DOM={Div:function(par,abs,show){var div=document.createElement("div");if(!show)
div.style.display="none";if(abs)
div.style.position="absolute";if(par)
par.appendChild(div);return div;},Span:function(par,abs,show){var span=document.createElement("span");if(!show)
span.style.display="none";if(abs)
span.style.position="absolute";if(par)
par.appendChild(span);return span;},place:function(el,x,y,w,h){if(el.__place__)
el.__place__(x,y,w,h);else{if(x!=undefined)
el.style.left=x+"px";if(y!=undefined)
el.style.top=y+"px";if(w!=undefined)
el.style.width=w+"px";if(h!=undefined)
el.style.height=h+"px";}},getPos:function(obj){var curleft=0;var curtop=0;if(obj.offsetParent){while(obj.offsetParent){curleft+=obj.offsetLeft;curtop+=obj.offsetTop;obj=obj.offsetParent;}}
else if(obj.x){curleft+=obj.x;curtop+=obj.y;}
pos={'x':curleft,'y':curtop};return pos;},getScroll:function(obj){var x=0,y=0;while(obj.parentNode){x+=obj.scrollLeft;y+=obj.scrollTop;obj=obj.parentNode;}
return{'x':x,'y':y};},getObjClient:function(obj){var x=0,y=0;while(obj.offsetParent){x+=obj.offsetLeft;y+=obj.offsetTop;x-=obj.scrollLeft;y-=obj.scrollTop;obj=obj.offsetParent;}
return{'x':x,'y':y};},getHeight:function(el){return el.offsetHeight;},getWidth:function(el){return el.offsetWidth;},show:function(el,visibility){if(el.__show__)
el.__show__();else{if(visibility)
el.style.visibility="";else
el.style.display="";}
return el;},hide:function(el,visibility){if(el.__hide__)
el.__hide__();else{if(visibility)
el.style.visibility="hidden";else
el.style.display="none";}
return el;},_creator:function(tagname){return function(attrs){el=document.createElement(tagname);copy(el,attrs);for(var i=1;i<arguments.length;i++){if(typeof(arguments[i])=="string")
el.appendChild(document.createTextNode(arguments[i]));else if(arguments[i].__element__)
el.appendChild(arguments[i].__element__);else
el.appendChild(arguments[i]);}
return el;};},addNodes:function(el){for(var i=1;i<arguments.length;i++){if(typeof(arguments[i])=="string")
el.appendChild(document.createTextNode(arguments[i]));else if(arguments[i].__element__)
el.appendChild(arguments[i].__element__);else
el.appendChild(arguments[i]);}
return el;},removeNodes:function(el){for(var i=1;i<arguments.length;i++){if(arguments[i].__element__)
el.removeChild(arguments[i].__element__);else
el.removeChild(arguments[i]);}
return el;},_creatorTxt:function(content){return document.createTextNode(content);},style:function(attrs,el){if(el.__element__)
copy(el.__element__.style,attrs);else
copy(el.style,attrs);return el;},setTxt:function(el,txt){if(el.__element__)
el=el.__element__;if(el.firstChild)
el.firstChild.data=txt;else
el.appendChild(document.createTextNode(txt));},getTxt:function(el){if(el.__element__)
el=el.__element__;if(el.firstChild)
return el.firstChild.data;else
return"";},childByType:function(el,typ){if(el.__element__)
el=el.__element__;for(var child=el.firstChild;child;child=child.nextSibling){if(child.tagName==typ)
return child;}
return null;},childrenByType:function(el,typ){if(el.__element__)
el=el.__element__;var children=[];for(var child=el.firstChild;child;child=child.nextSibling){if(child.tagName==typ)
children.push(child);}
return children;},styleDiv:{},setSelectText:function(el,value){for(var i=0;i<el.length;i++){if(el.options[i].text==value){el.selectedIndex=i;return;}}},setSelectValue:function(el,value){for(var i=0;i<el.length;i++){if(el.options[i].value==value){el.selectedIndex=i;return;}}},getSelectText:function(el){return el.options[el.selectedIndex].text;},getSelectValue:function(el){return el.options[el.selectedIndex].value;},getSelect:function(el){return DOM.getSelectValue(el)||DOM.getSelectText(el);}};SPAN=DOM._creator("span");DIV=DOM._creator("div");TABLE=DOM._creator("table");FORM=DOM._creator("form");THEAD=DOM._creator("thead");TBODY=DOM._creator("tbody");TR=DOM._creator("tr");TD=DOM._creator("td");TH=DOM._creator("th");HR=DOM._creator("hr");BR=DOM._creator("br");INPUT=DOM._creator("input");TEXTAREA=DOM._creator("textarea");TXT=DOM._creatorTxt;P=DOM._creator("p");SELECT=DOM._creator("select");OPTION=DOM._creator("option");IMG=DOM._creator("img");LABEL=DOM._creator("label");A=DOM._creator("a");BUTTON=DOM._creator("button");document.getElementsByClassName=function(className,parentElement){var children=(parentElement||document.body).getElementsByTagName('*');var elements=[];var regex=new RegExp("(^|\\s)"+className+"(\\s|$)");children=$A(children);for(var i=0;i<children.length;i++){var child=children[i];if(child.className.match(regex))
elements.push(child);}
return elements;}
PNGLoader=Class(null,{__init__:function(dir){this.dir=dir;},load:function(src,width,height,opts,stretch){if(Browser.isIE6){var span=SPAN(opts);span.style.width=width+'px';span.style.height=height+'px';span.style.display='inline-block';if(stretch)
span.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.dir+src+"', sizingMethod='scale')";else
span.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.dir+src+"', sizingMethod='crop')";return span;}
else{var img=IMG(opts);img.width=width;img.height=height;img.src=this.dir+src;return img;}},setsource:function(png,src,stretch){if(Browser.isIE6){if(stretch)
png.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.dir+src+"', sizingMethod='scale')";else
png.style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(src='"+this.dir+src+"', sizingMethod='crop')";}
else
png.src=this.dir+src;}});Control=Class(null,{_x:0,_y:0,_w:0,_h:0,__element__:null,__parentcontrol__:null,__parentelement__:null,__visibility__:false,__init__:function(par){if(par){if(par.__element__!==undefined){this.__parentcontrol__=par;this.__parentelement__=par.__element__;}
else
this.__parentelement__=$(par);}
else{this.__parentelement__=document.body;}
this._visible=false;},__place__:function(x,y,w,h){var oldw=this._w;var oldh=this._h;var changed=false;if(x!=undefined){if(x!=this._x)
changed=true;this._x=x;}
if(y!=undefined){if(y!=this._y)
changed=true;this._y=y;}
if(w!=undefined){if(w!=this._w)
changed=true;this._w=w;}
if(h!=undefined){if(h!=this._h)
changed=true;this._h=h;}
if(!changed)
return false;if((oldw!=this._w||oldh!=this.h)&&this.__resize__)
this.__resize__(oldw,oldh);if(this.__element__)
DOM.place(this.__element__,x,y,w,h);return true;},__show__:function(){if(!this._visible){DOM.show(this.__element__,this.__visibility__);this._visible=true;return true;}
return false;},__hide__:function(){if(this._visible){DOM.hide(this.__element__,this.__visibility__);this._visible=false;return true;}
return false;},appendChild:function(child){if(child.__element__)
this.__element__.appendChild(child.__element__);else
this.__element__.appendChild(child);},removeChild:function(child){if(child.__element__)
this.__element__.removeChild(child.__element__);else
this.__element__.removeChild(child);}});if(!window.Event){var Event=new Object();}
copy(Event,{KEY_BACKSPACE:8,KEY_TAB:9,KEY_RETURN:13,KEY_ESC:27,KEY_PGUP:33,KEY_PGDOWN:34,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)));},stopPropagation:function(evt){if(evt.stopPropagation)
evt.stopPropagation();else
evt.cancelBubble=true;},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));},mwDelta:function(event){var delta=0;if(event.wheelDelta){delta=event.wheelDelta/-120;if(window.opera)
delta=-delta;}
else if(event.detail){delta=event.detail/3;}
return delta;},stop:function(event){if(event.preventDefault){event.preventDefault();event.stopPropagation();}else{event.returnValue=false;event.cancelBubble=true;}
return false;},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++){if(Event.observers[i])
Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i]=null;}
Event.observers=false;},observe:function(element,name,object,func,useCapture){useCapture=useCapture||false;if(name=='keypress'&&(navigator.appVersion.match(/Konqueror|Safari|KHTML/)||element.attachEvent))
name='keydown';cb=function(evt){evt=evt||window.event;return func.call(object,evt);};this._observeAndCache(element,name,cb,useCapture);},unobserveAll:function(element){for(var i=0;i<Event.observers.length;i++){var entry=Event.observers[i];if(entry&&entry[0]==element){Event.stopObserving.apply(this,Event.observers[i]);Event.observers[i]=null;}}},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',window,Event.unloadCache,false);var Util={getWindowSize:function(){var w,h;if(Browser.isIE){w=document.documentElement.clientWidth;h=document.documentElement.clientHeight;if(h==0)
h=document.body.clientHeight;}
else{w=window.innerWidth;h=window.innerHeight;}
return{'w':w,'h':h};},fixdrag:function(img){if(Browser.isIE){img.ondragstart=function(evt){evt=evt||event;evt.returnValue=false;return false;}}},unfixdrag:function(img){if(Browser.isIE){img.ondragstart=null;}},now:function(){var n=new Date();return n.getTime();},ScreenSizer:Class(null,{__init__:function(control){this.control=control;this.check();Event.observe(window,'resize',this,this.check);},check:function(){var size=Util.getWindowSize();if(this.control._w!=size.w||this.control._h!=size.h)
DOM.place(this.control,undefined,undefined,size.w,size.h);}})}
var Debug={vformat:function(fmtstring,args){var argptr=0;var curpos=0;var next;var buffer="";while(true){next=fmtstring.indexOf("%",curpos);if(next==-1){buffer+=fmtstring.substr(curpos);break;}
buffer+=fmtstring.substr(curpos,next-curpos);var arg=fmtstring.substr(next,2);curpos=next+2;if(arg=="%%")
buffer+="%";else if(arg=="%s"){var val=args[argptr++];if(val==null)
buffer+="null";else if(val==undefined)
buffer+="undefined";else
buffer+=val.toString();}}
return buffer;},format:function(){var args=$A(arguments);var fmtstring=args.shift();return Debug.vformat(fmtstring,args);},log:function(){},info:function(){},warn:function(){},error:function(){},profile:function(title){},profileEnd:function(){},trace:function(){}}
if(window.console){Debug.log=console.info;Debug.info=console.info;Debug.warn=console.warn;Debug.error=console.error;Debug.profile=console.profile;Debug.profileEnd=console.profileEnd;Debug.trace=console.trace;}
Object.extend(String.prototype,{__repr__:function(){return'"'+this.replace(/\\/g,'\\\\').replace(/"/g,'\\\"').replace(/\r/g,"\\r").replace(/\n/g,"\\n")+'"';},format:function(){var idx=0,toidx;var argidx=0,fmt;var result='';while(true){toidx=this.indexOf('%',idx);if(toidx<0){break;}
result+=this.substring(idx,toidx);fmt=this[toidx+1];switch(fmt){case'%':result+='%';break;case's':result+=str(arguments[argidx++]);break;case'r':result+=repr(arguments[argidx++]);break;}
idx=toidx+2;}
result+=this.substring(idx);return result;}});Number.prototype.__repr__=Number.prototype.toString;Boolean.prototype.__repr__=Boolean.prototype.toString;Object.optextend(Array.prototype,{max:function(){var highest=this[0];for(var i=1;i<this.length;i++){if(this[i]>highest){highest=this[i];}}
return highest;},min:function(){var lowest=this[0];for(var i=1;i<this.length;i++){if(this[i]<lowest){lowest=this[i];}}
return lowest;},indexOf:function(elem){for(var i=0;i<this.length;i++){if(this[i]==elem){return i;}}
return-1;},extend:function(other){for(var i=0;i<other.length;i++){this.push(other[i]);}},__repr__:function(){var ret="[";for(var i=0;i<this.length;i++){if(i!=0){ret+=",";}
ret+=repr(this[i]);}
ret+="]";return ret;}});function dump(obj){var ret='{';var first=true;for(var key in obj){if(first){first=false;}
else{ret+=', ';}
ret+=repr(key)+': '+repr(obj[key]);}
ret+='}';return ret;}
function repr(obj){if(obj===undefined){return'undefined';}
else if(obj==null){return'null';}
else if(obj.__repr__){return obj.__repr__();}
return dump(obj);}
function unrepr(s){try{return eval('('+s+')');}
catch(err){return null;}}
function str(obj){if(obj===undefined){return'';}
else if(obj==null){return'';}
else if(obj.toString){return obj.toString();}
else{return repr(obj);}}
var Cookie={set:function(name,value,expires,path,domain,secure){Cookie.setRaw(name,escape(repr(value)),expires,path,domain,secure);},setRaw:function(name,value,expires,path,domain,secure){var curCookie=name+'="'+value+'"'+
((expires)?"; expires="+expires.toGMTString():"")+
((path)?"; path="+path:"")+
((domain)?"; domain="+domain:"")+
((secure)?"; secure":"");document.cookie=curCookie;},get:function(name,def){ret=Cookie.getRaw(name);if(ret===null)
return def;ret=unrepr(unescape(ret));if(ret===null)
return def;return ret;},getRaw:function(name){var dc=document.cookie;var prefix=name+"=";var begin=dc.indexOf("; "+prefix);if(begin==-1){begin=dc.indexOf(prefix);if(begin!=0)
return null;}
else
begin+=2;var end=document.cookie.indexOf(";",begin);if(end==-1)
end=dc.length;return dc.substring(begin+prefix.length+1,end-1);},keys:function(){var dc=document.cookie;var ret=[];var begin=0;var end=0;while(true){end=dc.indexOf("=",begin);if(end!=-1)
ret.push(dc.substring(begin,end));begin=dc.indexOf("; ",end);if(begin==-1||end==-1)
break;begin+=2;}
return ret;},remove:function(name,path,domain){document.cookie=name+"="+
((path)?"; path="+path:"")+
((domain)?"; domain="+domain:"")+"; expires=Thu, 01-Jan-70 00:00:01 GMT";},removeall:function(){var k=Cookie.keys();for(var i=0;i<k.length;i++)
Cookie.remove(k[i]);},enabled:function(){if(navigator.cookieEnabled)
return true;if(typeof navigator.cookieEnabled=="undefined"){document.cookie="testcookie";if(document.cookie.indexOf("testcookie")>=0)
return true;}
return false;}};var Tween=Class(null,{__init__:function(target,prop,suffix,algo,begin,end,period,obj,onChange,onStop){this.target=target;this.prop=prop;this.suffix=suffix||'';this.algo=algo;this.begin=begin;this.end=end;this.period=period;this.obj=obj;this.onChange=onChange;this.onStop=onStop;this.value=begin;this.running=false;},setValue:function(val){if(this.target)
this.target[this.prop]=val+this.suffix;this.value=val;if(this.onChange)
this.onChange.call(this.obj,val);},start:function(){this._starttime=new Date().getTime();this.setValue(this.begin);this.running=true;},step:function(){var t=new Date().getTime()-this._starttime;if(t>=this.period)
this.stop();else{var val=this.algo(t,this.begin,this.end-this.begin,this.period);this.setValue(val);}},stop:function(){this.setValue(this.end);if(this.onStop)
this.onStop.call(this.obj);this.running=false;}});var Tweener=Class(null,{__init__:function(interval){this.interval=interval;this.active=false;this.tweens=[];},run:function(tween){this.tweens.push(tween);tween.start();if(!this.active){this.active=true;this.tick();}},tick:function(){for(var i=0;i<this.tweens.length;i++)
this.tweens[i].step();var running=[];for(var i=0;i<this.tweens.length;i++)
if(this.tweens[i].running)
running.push(this.tweens[i]);this.tweens=running;if(running.length>0)
window.setTimeout(method(this,this.tick),this.interval);else
this.active=false;}});var TweenAlgorithm={backEaseIn:function(t,b,c,d,a,p){var s=1.70158;return c*(t/=d)*t*((s+1)*t-s)+b;},backEaseOut:function(t,b,c,d,a,p){var s=1.70158;return c*((t=t/d-1)*t*((s+1)*t+s)+1)+b;},backEaseInOut:function(t,b,c,d,a,p){var s=1.70158;if((t/=d/2)<1)
return c/2*(t*t*(((s*=(1.525))+1)*t-s))+b;return c/2*((t-=2)*t*(((s*=(1.525))+1)*t+s)+2)+b;},elasticEaseIn:function(t,b,c,d,a,p){if(t==0)
return b;if((t/=d)==1)
return b+c;if(!p)p=d*.3;if(!a||a<Math.abs(c)){a=c;var s=p/4;}
else
var s=p/(2*Math.PI)*Math.asin(c/a);return-(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;},elasticEaseOut:function(t,b,c,d,a,p){if(t==0)
return b;if((t/=d)==1)
return b+c;if(!p)
p=d*.3;if(!a||a<Math.abs(c)){a=c;var s=p/4;}
else
var s=p/(2*Math.PI)*Math.asin(c/a);return(a*Math.pow(2,-10*t)*Math.sin((t*d-s)*(2*Math.PI)/p)+c+b);},elasticEaseInOut:function(t,b,c,d,a,p){if(t==0)
return b;if((t/=d/2)==2)
return b+c;if(!p)
var p=d*(.3*1.5);if(!a||a<Math.abs(c)){var a=c;var s=p/4;}
else
var s=p/(2*Math.PI)*Math.asin(c/a);if(t<1)
return-.5*(a*Math.pow(2,10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p))+b;return a*Math.pow(2,-10*(t-=1))*Math.sin((t*d-s)*(2*Math.PI)/p)*.5+c+b;},bounceEaseOut:function(t,b,c,d){if((t/=d)<(1/2.75)){return c*(7.5625*t*t)+b;}
else if(t<(2/2.75)){return c*(7.5625*(t-=(1.5/2.75))*t+.75)+b;}
else if(t<(2.5/2.75)){return c*(7.5625*(t-=(2.25/2.75))*t+.9375)+b;}
else{return c*(7.5625*(t-=(2.625/2.75))*t+.984375)+b;}},bounceEaseIn:function(t,b,c,d){return c-TweenAlgorithm.bounceEaseOut(d-t,0,c,d)+b;},bounceEaseInOut:function(t,b,c,d){if(t<d/2)
return TweenAlgorithm.bounceEaseIn(t*2,0,c,d)*.5+b;else
return TweenAlgorithm.bounceEaseOut(t*2-d,0,c,d)*.5+c*.5+b;},strongEaseInOut:function(t,b,c,d){return c*(t/=d)*t*t*t*t+b;},regularEaseIn:function(t,b,c,d){return c*(t/=d)*t+b;},regularEaseOut:function(t,b,c,d){return-c*(t/=d)*(t-2)+b;},regularEaseInOut:function(t,b,c,d){if((t/=d/2)<1)
return c/2*t*t+b;return-c/2*((--t)*(t-2)-1)+b;},strongEaseIn:function(t,b,c,d){return c*(t/=d)*t*t*t*t+b;},strongEaseOut:function(t,b,c,d){return c*((t=t/d-1)*t*t*t*t+1)+b;},strongEaseInOut:function(t,b,c,d){if((t/=d/2)<1)
return c/2*t*t*t*t*t+b;return
c/2*((t-=2)*t*t*t*t+2)+b;}};var Ajax={request:function(callback){var http_request=false;if(!Browser.isIE){http_request=new XMLHttpRequest();}
else if(window.ActiveXObject){try{http_request=new ActiveXObject("Msxml2.XMLHTTP");}
catch(e){try{http_request=new ActiveXObject("Microsoft.XMLHTTP");}
catch(e){}}}
if(http_request){http_request.onreadystatechange=function(){if(http_request.readyState==4){var data,stat,stattxt;try{data=http_request.responseText;stat=http_request.status;stattxt=http_request.statusText;xml=http_request.responseXML;}
catch(e){data=null;stat=0;stattxt='Network error';xml=null;}
callback(data,stat,stattxt,xml);}};}
return http_request;},get:function(url,callback){var req=Ajax.request(callback);if(!req)
return false;req.open('GET',url,true);req.send(null);return true;},post:function(url,data,callback){var req=Ajax.request(callback);if(!req)
return false;req.open('POST',url,true);req.setRequestHeader('Content-Type','application/x-www-form-urlencoded');req.send(data);return true;},encode:function(params){var data='';for(var i=0;i<params.length;i++){if(i!=0)
data+="&";data+=params[i][0]+"="+encodeURIComponent(params[i][1]);}
return data;}};Form=Class(null,{__init__:function(name,submiturl,cancelurl,elStatus,elForm){this.submiturl=submiturl;this.cancelurl=cancelurl;this.sendText='Sending...';this.elStatus=elStatus||$('submitstatus');this.elForm=elForm||document.forms[name];Event.observe(this.elForm,'submit',this,this.submit);if(cancelurl)
Event.observe($("cancel"),'click',this,this.cancel);if(!elStatus)
this.elForm.elements[0].focus();},set:function(name,value){var el=this.element(name);if(!el)
return false;if(el.type.search('select')>=0){for(var i=0;i<el.length;i++){if(el.options[i].value==value){el.selectedIndex=i;return;}}}
else if(el.type.search('checkbox')>=0)
el.checked=value;else{el.value=value!=null?value:'';}},element:function(name){ret=this.elForm.elements[name];if(!ret){for(var i=0;i<this.elForm.elements.length;i++){if(this.elForm.elements[i].name==name)
return this.elForm.elements[i];}}
return ret;},disable:function(name,disabled){var el=this.element(name);el.disabled=disabled;if(Browser.isIE)
if(disabled)
el.style.className="disabled";else
el.style.className="";},val:function(name){return this._val(this.element(name));},_val:function(el){if(el.type.search('select')>=0){if(el.type.search('one')>=0)
return this.selectedValue(el);else{if(el.getAttribute('multiple')!=null)
return this.getValues(el);else
return this.selectedValue(el);}}
else if(el.type.search('checkbox')>=0)
return el.checked;else
return el.value;},selectall:function(name){var el=this.element(name);for(var i=0;i<el.options.length;i++)
el.options[i].selected=true;},getValues:function(el){var ret=[];for(var i=0;i<el.options.length;i++){if(el.options[i].selected)
ret.push(el.options[i].value);}
return ret;},selectedValue:function(el){var selected=el.options[el.selectedIndex];if(selected.value!=undefined)
return""+selected.value;return""+selected.text;},response:function(data,stat){if(stat==200)
this.submitted(data);else
this.failed(data,stat);},cancel:function(evt){if(evt.preventDefault)
evt.preventDefault();window.location=this.cancelurl;return false;},extract:function(){var f=this.elForm;var parms={};for(var i=0;i<f.elements.length;i++){var el=f.elements[i];if(el.type=='radio'){if(el.checked)
parms[el.name]=el.value;}
else if(el.type!='submit'&&el.type!='button')
parms[el.name]=this._val(el);}
return parms;},flatten:function(input){var output=[];for(var key in input){var val=input[key];if(typeof(val)=='object'){for(var c=0;c<val.length;c++)
output.push([key,val[c]]);}
else if(typeof(val)=='boolean'){if(val)
output.push([key,val]);}
else
output.push([key,val]);}
return output;},submit:function(evt){if(evt.preventDefault)
evt.preventDefault();var params=this.extract();params=this.validate(params);if(params){DOM.setTxt(this.elStatus,this.sendText);params=this.flatten(params);var data='';for(var i=0;i<params.length;i++){if(i!=0)
data+="&";data+=params[i][0]+"="+encodeURIComponent(params[i][1]);}
Ajax.post(this.submiturl,data,method(this,this.response));}
return false;},validate:function(parms){return parms;},setstatus:function(stat){DOM.setTxt(this.elStatus,stat);return null;},submitted:function(data){DOM.setTxt(this.elStatus,"Done");},failed:function(data,stat){DOM.setTxt(this.elStatus,"Failed ("+stat+")");},clearErrors:function(){var f=this.elForm;for(var i=0;i<f.elements.length;i++)
f.elements[i].className='';},setError:function(name){this.element(name).className='error';}});MapIcon=Class(Control,{northing:0,easting:0,hsx:undefined,hsy:undefined,__init__:function(){Control.__init__.call(this);},added:function(map){},__place__:function(x,y,w,h){if(x!==undefined&&y!==undefined)
Control.__place__.call(this,x-this.hsx,y-this.hsy,w,h);else
Control.__place__.call(this,undefined,undefined,w,h);}});GutterMapIcon=Class(MapIcon,{gutter:null});MapTile=Class(Control,{loaded:false,__init__:function(par){Control.__init__.call(this,par);this.par=par;this.__element__=document.createElement("img");this.__parentelement__.appendChild(this.__element__);this.__element__.style.position="absolute";Event.observe(this.__element__,'load',this,this.onload);Event.observe(this.__element__,'error',this,this.onerror);Event.observe(this.__element__,'abort',this,this.onabort);this.baseUrl="http://0.bmaps.snitch.co.nz/";},onload:function(){if(this.__element__.width!=500||this.__element__.height!=500){this.baseUrl="http://1.bmaps.snitch.co.nz/";this.loaded=false;}},onerror:function(){this.baseUrl="http://1.bmaps.snitch.co.nz/";this.loaded=false;},onabort:function(){this.loaded=false;},setImage:function(n,e,source){if(source=='e1000')
this.__element__.src=this.baseUrl+"1000.0/"+n+"/"+e+".jpg";else if(source=='e200')
this.__element__.src=this.baseUrl+"200.0/"+n+"/"+e+".jpg";else if(source=='e50')
this.__element__.src=this.baseUrl+"50.0/"+n+"/"+e+".jpg";else if(source=='e10')
this.__element__.src=this.baseUrl+"10.0/"+n+"/"+e+".jpg";else if(source=='e2')
this.__element__.src=this.baseUrl+"2.0/"+n+"/"+e+".jpg";else if(source=='e0.4')
this.__element__.src=this.baseUrl+"0.4/"+n+"/"+e+".jpg";this.loaded=true;},clrImage:function(){this.__element__.src="/static/loading.gif";this.loaded=false;},remove:function(par){Event.unobserveAll(this.__element__);par.removeChild(this.__element__);}});MapPanel=Class(Control,{northing:0,easting:0,tileSize:500,vpw:0,vph:0,_tilesW:0,_tilesH:0,_maxW:0,_maxH:0,sliding:false,__init__:function(par){Control.__init__.call(this,par);this.__element__=DOM.Div(this.__parentelement__,true);this.__element__.style.background="#AAA";this.__element__.style.overflow="visible";DOM.show(this.__element__);this._tiles={};this.source='e50';this.setScale(50);this.setCursorNormal();},inTile:function(val){return Math.floor(val/this.tileSize);},loadVisibleTiles:function(){var sx=this.inTile(-this.x);var sy=this.inTile(-this.y);var ex=this.inTile(this.vpw-this.x);var ey=this.inTile(this.vph-this.y);var n,e,tile;for(var y=sy;y<=ey;y++){for(var x=sx;x<=ex;x++){var key=x+","+y;if(!this._tiles[key]){tile=new MapTile(this);n=this.northing-(y*this.stepSize);e=this.easting+(x*this.stepSize);this.placeImage(tile,n,e);tile.setImage(n,e,this.source);this._tiles[key]=tile;}
else if(!this._tiles[key].loaded){tile=this._tiles[key];n=this.northing-(y*this.stepSize);e=this.easting+(x*this.stepSize);this.placeImage(tile,n,e);tile.setImage(n,e,this.source);}}}},setSource:function(source){this.source=source;},tileError:function(){this.setScale(this.scale);},setScale:function(scale){this.scale=scale;this.stepSize=this.scale*this.tileSize;for(var key in this._tiles){var tile=this._tiles[key];tile.remove(this.__element__);}
this._tiles={};this.northing=this.easting=0;},centerAt:function(n,e){var targetE=e-((this._w/2)*this.scale);var targetN=n+((this._h/2)*this.scale);if(!this.northing){this.easting=Math.round(targetE/this.stepSize)*this.stepSize;this.northing=Math.round(targetN/this.stepSize)*this.stepSize;}
var vpl=e-((this.vpw/2)*this.scale);var vpt=n+((this.vph/2)*this.scale);this.x=Math.round((this.easting-vpl)/this.scale);this.y=Math.round((vpt-this.northing)/this.scale);this.loadVisibleTiles();DOM.place(this,this.x,this.y);},getCenter:function(){if(this.northing==0)
return null;var c={};c.e=this.easting+(((this.vpw/2)-this.x)*this.scale);c.n=this.northing-(((this.vph/2)-this.y)*this.scale);return c;},translateMousepos:function(x,y){var c={};c.e=this.easting+((x-this.x)*this.scale);c.n=this.northing-((y-this.y)*this.scale);return c;},translateCoord:function(c){var x,y;x=(c[1]-this.easting)/this.scale+this.x;y=(this.northing-c[0])/this.scale+this.y;return[x,y];},setCursorMoving:function(){if(Browser.isGecko&&!Browser.isSafari)
this.__element__.style.cursor="-moz-grabbing";else
this.__element__.style.cursor="url(/static/grabbing.cur), move";},setCursorNormal:function(){if(Browser.isGecko&&!Browser.isSafari)
this.__element__.style.cursor="-moz-grab";else
this.__element__.style.cursor="url(/static/grab.cur), default";},setCursorDraw:function(){this.__element__.style.cursor="crosshair";},updateViewportSize:function(vpw,vph){this.vpw=vpw;this.vph=vph;this.loadVisibleTiles();},move:function(dx,dy){this.x+=Math.round(dx);this.y+=Math.round(dy);if(!this.sliding)
this.loadVisibleTiles();DOM.place(this,this.x,this.y);},placeImage:function(img,n,e){var y=Math.round((this.northing-n)/this.scale);var x=Math.round((e-this.easting)/this.scale);DOM.place(img,x,y);},slideStart:function(){this.sliding=true;},slideStop:function(){this.sliding=false;this.loadVisibleTiles();}});Gutter=Class(Control,{__init__:function(par){Control.__init__.call(this,par);this.__element__=DOM.Div(this.__parentelement__,true);this.__element__.style.overflow='hidden';this.left=DOM.style({'position':'absolute','zIndex':'5'},png.load('gutter.png',10,10,true));this.right=DOM.style({'position':'absolute','zIndex':'5'},png.load('gutter.png',10,10,true));this.top=DOM.style({'position':'absolute','zIndex':'5'},png.load('gutter.png',10,10,true));this.bottom=DOM.style({'position':'absolute','zIndex':'5'},png.load('gutter.png',10,10,true));DOM.addNodes(this,this.left,this.right,this.top,this.bottom);DOM.show(this.__element__);},placeImage:function(gutterImg,offx,offy,normalImg){var cx=(this._w/2);var cy=(this._h/2);var x=cx+offx;var y=cy+offy;if(x<=10||x>=(this._w-10-normalImg._w)||y-normalImg._h<=10||y>=(this._h-10)){var imgx,imgy;if(x==cx){imgx=x;if(y-normalImg._h<=10)
imgy=0;else
imgy=this._h-gutterImg._h;}
else{var gradient=offy/offx;var threshold=this._h/this._w;if(gradient<threshold&&gradient>-threshold){if(offx<0){imgx=0;offx=-cx+10;}
else{imgx=this._w-gutterImg._w;offx=cx-10;}
imgy=Math.round(cy+(offx*gradient));}
else{if(offy<0){imgy=0;offy=-cy+10;}
else{imgy=this._h-gutterImg._h;offy=cy-10;}
imgx=Math.round(cx+(offy/gradient));}
if(imgy>this._h-gutterImg._h)
imgy=this._h-gutterImg._h;if(imgy<0)
imgy=0;if(imgx>this._w-gutterImg._w)
imgx=this._w-gutterImg._w;if(imgx<0)
imgx=0;}
DOM.place(gutterImg,imgx,imgy);DOM.show(gutterImg);return true;}
else{DOM.hide(gutterImg);return false;}},__place__:function(x,y,w,h){Control.__place__.call(this,x,y,w,h);DOM.place(this.top,0,-10,this._w,20);DOM.place(this.bottom,0,this._h-10,this._w,10);DOM.place(this.left,0,10,10,this._h-20);DOM.place(this.right,this._w-10,10,10,this._h-20);if(Browser.isIE){png.setsource(this.top,'gutter.png',true);png.setsource(this.left,'gutter.png',true);png.setsource(this.right,'gutter.png',true);png.setsource(this.bottom,'gutter.png',true);}}});ViewPort=Class(Control,{mouseDown:false,grabX:0,grabY:0,__init__:function(par){Control.__init__.call(this,par);this.__element__=DOM.Div(this.__parentelement__,true);this.__element__.style.overflow="hidden";DOM.show(this.__element__);Event.observe(this.__element__,'mousedown',this,this.mousedown);Event.observe(this.__element__,'mousemove',this,this.mousemove);Event.observe(document,'mouseup',this,this.mouseup);this.lastAccepted=null;this.lastMouseUp=0;this.evGap=0;this.offX=0;this.offY=0;},trapMouseEvents:function(target){this.mouseEventTarget=target;},mousedown:function(evt){Event.stop(evt);var x=Event.pointerX(evt)-this.offX;var y=Event.pointerY(evt)-this.offY;if(this.mouseEventTarget&&this.mouseEventTarget.onMouseDown(evt,x,y))
return false;this.mouseDown=true;this.grabX=evt.pageX||evt.screenX;this.grabY=evt.pageY||evt.screenY;this.cbSlideStart();this.lastAccepted=new Date();return false;},updateOffset:function(x,y){this.offX=x;this.offY=y;},mouseup:function(evt){if(this.mouseEventTarget&&this.mouseEventTarget.onMouseUp(evt))
return false;if(this.mouseDown){this.mouseDown=false;this.cbSlideStop();var now=new Date();if(now-this.lastMouseUp<=500){this.cbDoubleClick(Event.pointerX(evt)-this.offX,Event.pointerY(evt)-this.offY);this.lastMouseUp=0;}
else
this.lastMouseUp=now;return false;}},mousemove:function(evt){if(this.mouseEventTarget&&this.mouseEventTarget.onMouseMove(evt))
return false;if(this.mouseDown){var now=new Date();if(now-this.lastAccepted<this.evGap)
return false;this.lastAccepted=now;var x=evt.pageX||evt.screenX;var y=evt.pageY||evt.screenY;var deltaX=x-this.grabX;var deltaY=y-this.grabY;this.grabX=x;this.grabY=y;this.cbSlide(deltaX,deltaY);var fin=new Date();this.evGap=(fin-now)*2;return false;}}});function fixTransDiv(div){div.style.background='#fff';div.style.filter='alpha(opacity = 0)';}
function unfixTransDiv(div){div.style.background='';div.style.filter='';}
Zoom=Class(Control,{__init__:function(par){Control.__init__.call(this,par);this.__element__=DOM.style({'zIndex':'5'},DOM.Div(this.__parentelement__,true,true));this.cb=par;this.body=DOM.style({'position':'absolute'},png.load("zoombody.png",40,220,{'title':'Zoom'}));DOM.place(this.body,0,0);DOM.addNodes(this,this.body);this.handle=DOM.style({'zIndex':'10','cursor':'move'},DOM.Div(this.__element__,true,true));DOM.place(this.handle,0,0,40,12);Event.observe(this.handle,'mousedown',this,this.onHandleMouseDown);this.zoomin=DOM.style({'zIndex':'10','cursor':'pointer'},DOM.Div(this.__element__,true,true));DOM.place(this.zoomin,13,18,14,14);this.zoomout=DOM.style({'zIndex':'10','cursor':'pointer'},DOM.Div(this.__element__,true,true));DOM.place(this.zoomout,13,197,14,14);Event.observe(this.zoomin,'mouseup',this,this.onZoomIn);Event.observe(this.zoomout,'mouseup',this,this.onZoomOut);Event.observe(this.__element__,'mousedown',this,this.swallow);if(Browser.isIE){fixTransDiv(this.handle);fixTransDiv(this.zoomin);fixTransDiv(this.zoomout);}
this.active=[];this.activeDiv=[];for(var counter=1;counter<=6;counter++){var activeDiv=DOM.style({'zIndex':'10'},DOM.Div(this.__element__,true,true));var active=DOM.style({'position':'absolute'},png.load("zoomactive"+counter+".png",40,25));DOM.addNodes(activeDiv,active);DOM.hide(active);DOM.place(active,0,0,40,25);DOM.place(activeDiv,0,40+(counter-1)*25,40,25);this.active.push(active);this.activeDiv.push(activeDiv);Event.observe(activeDiv,'mousedown',this,this.activeMouseDownCB(counter-1));}
this.slider=DOM.style({'position':'absolute','zIndex':'15'},png.load("zoomslider.png",30,10));Event.observe(this.slider,'mousedown',this,this.onSliderMouseDown);DOM.addNodes(this,this.slider);this.scale=3;this.updateScale();this.sliderCursorNormal();},activeMouseDownCB:function(idx){return function(evt){this.onActiveMouseDown(evt,idx);};},onActiveMouseDown:function(evt,idx){if(idx==this.scale){this.onSliderMouseDown(evt);}
else{this.setScale(idx);}},onHandleMouseDown:function(evt){this.cb.viewport.trapMouseEvents(this);this.grabX=evt.pageX||evt.screenX;this.grabY=evt.pageY||evt.screenY;this.moveControl=true;},onSliderMouseDown:function(evt){this.sliderCursorMoving();this.cb.viewport.trapMouseEvents(this);this.grabY=evt.pageY||evt.screenY;this.moveControl=false;},onMouseMove:function(evt){var x=evt.pageX||evt.screenX;var y=evt.pageY||evt.screenY;if(this.moveControl){var deltaX=x-this.grabX;var deltaY=y-this.grabY;this.grabX=x;this.grabY=y;DOM.place(this,this._x+deltaX,this._y+deltaY);}
else{var deltaY=Math.round((y-this.grabY)/25);var tentScale=this.scale+deltaY;if(tentScale<0)
tentScale=0;if(tentScale>5)
tentScale=5;DOM.place(this.slider,5,47+(tentScale*25));}
Event.stop(evt);return true;},onMouseUp:function(evt){this.cb.viewport.trapMouseEvents(null);if(!this.moveControl){this.sliderCursorNormal();var y=evt.pageY||evt.screenY;var deltaY=Math.round((y-this.grabY)/25);var tentScale=this.scale+deltaY;if(tentScale<0)
tentScale=0;if(tentScale>5)
tentScale=5;if(tentScale!=this.scale)
this.setScale(tentScale);}
Event.stop(evt);return true;},sliderCursorMoving:function(){if(Browser.isGecko&&!Browser.isSafari){this.slider.style.cursor="-moz-grabbing";this.body.style.cursor="-moz-grabbing";for(var counter=0;counter<this.activeDiv.length;counter++)
this.activeDiv[counter].style.cursor="-moz-grabbing";}
else{this.slider.style.cursor="url(/static/grabbing.cur), move";this.body.style.cursor="url(/static/grabbing.cur), move";for(var counter=0;counter<this.activeDiv.length;counter++)
this.activeDiv[counter].style.cursor="url(/static/grabbing.cur), move";}},sliderCursorNormal:function(){if(Browser.isGecko&&!Browser.isSafari){this.slider.style.cursor="-moz-grab";for(var counter=0;counter<this.activeDiv.length;counter++){if(counter==this.scale)
this.activeDiv[counter].style.cursor="-moz-grab";else
this.activeDiv[counter].style.cursor="pointer";}}
else{this.slider.style.cursor="url(/static/grab.cur), default";for(var counter=0;counter<this.activeDiv.length;counter++){if(counter==this.scale)
this.activeDiv[counter].style.cursor="url(/static/grab.cur), default";else
this.activeDiv[counter].style.cursor="pointer";}}
this.body.style.cursor="";},onZoomIn:function(evt){if(this.scale>0)
this.setScale(this.scale-1);return Event.stop(evt);},swallow:function(evt){return Event.stop(evt);},onZoomOut:function(evt){if(this.scale<5)
this.setScale(this.scale+1);return Event.stop(evt);},setScale:function(scale){this.scale=scale;this.cb.onZoomCB(scale);this.updateScale();this.sliderCursorNormal();},updateScale:function(){for(var counter=0;counter<this.active.length;counter++){if(counter==this.scale){DOM.show(this.active[counter]);if(Browser.isIE)
unfixTransDiv(this.activeDiv[counter]);}
else{DOM.hide(this.active[counter]);if(Browser.isIE)
fixTransDiv(this.activeDiv[counter]);}}
DOM.place(this.slider,5,47+(this.scale*25));},__place__:function(x,y){Control.__place__.call(this,x,y,40,220);}});ScrollingMap=Class(Control,{scale:50,maxId:0,mapscales:[{'source':'e0.4','scale':0.4,'title':'40cm/px'},{'source':'e2','scale':2,'title':'2m/px'},{'source':'e10','scale':10,'title':'10m/px'},{'source':'e50','scale':50,'title':'50m/px'},{'source':'e200','scale':200,'title':'200m/px'},{'source':'e1000','scale':1000,'title':'1km/px'}],__init__:function(par,prefs,zoomUpdateCBs,noGutter){Control.__init__.call(this,par);this.__element__=DOM.style({'background':'#82aedd'},DOM.Div(this.__parentelement__,true));this.scaleImg=png.load("scale50.png",70,40,{'title':'50m/px'});this.scaleImg.style.position="absolute";this.scaleImg.style.zIndex="5";this.zoom=new Zoom(this);this.icons={};if(noGutter){this.viewport=new ViewPort(this);}
else{this.gutterIcons={};this.gutter=new Gutter(this);this.viewport=new ViewPort(this.gutter);this.gutter.key="gutter";}
DOM.addNodes(this.viewport,this.scaleImg,this.zoom);this.panel=new MapPanel(this.viewport);DOM.show(this.__element__);this.viewport.__resize__=method(this,this.vpResize);this.viewport.cbSlideStart=method(this,this.slideStart);this.viewport.cbSlide=method(this,this.slide);this.viewport.cbSlideStop=method(this,this.slideStop);this.viewport.cbDoubleClick=method(this,this.doubleClick);this.prefs=prefs;this.zoomUpdateCBs=zoomUpdateCBs;this.overlays=[];},addOverlay:function(overlay,x,y){var ov=[overlay,x,y];this.overlays.push(ov);DOM.addNodes(this.viewport,overlay);return ov;},__place__:function(x,y,w,h){Control.__place__.call(this,x,y,w,h);if(this.gutter)
DOM.place(this.gutter,0,0,this._w,this._h);DOM.place(this.viewport,0,0,this._w,this._h);DOM.place(this.scaleImg,12,this._h-45);DOM.place(this.zoom,20,20);if(this.places)
this.places.updateOffset(x,y);this.viewport.updateOffset(x,y);for(var i=0;i<this.overlays.length;i++){var ox=this.overlays[i][1],oy=this.overlays[i][2];if(ox<0)
ox+=w;if(oy<0)
oy+=h;DOM.place(this.overlays[i][0],ox,oy);}},vpResize:function(){c=this.panel.getCenter();if(c==null)
c=this.prefs.center;this.panel.updateViewportSize(this.viewport._w,this.viewport._h);this.panel.centerAt(c.n,c.e);this.updateIcons();if(this.places)
this.places.resize(this.viewport._w,this.viewport._h);},slideStart:function(){this._centeredOn=null;this.panel.setCursorMoving();var p=this.panel.translateMousepos(this.viewport.grabX,this.viewport.grabY);Debug.log("Pos %s %s",p.n,p.e);},slide:function(dx,dy){this.panel.move(dx,dy);if(this.prefs.livegutter)
this.liveUpdateGutter();},slideStop:function(){var c=this.panel.getCenter();this.panel.setCursorNormal();this.prefs.currentCenter=c;if(!this.prefs.livegutter)
this.liveUpdateGutter();if(this.places)
this.places.redraw();},doubleClick:function(x,y){this._centeredOn=null;var c=this.panel.translateMousepos(x,y);this.centerAt(c.n,c.e);},onZoomCB:function(zoomScale){var mapscale=this.mapscales[zoomScale];this.panel.setSource(mapscale.source);this.setScale(mapscale.scale);png.setsource(this.scaleImg,"scale"+mapscale.scale+".png");this.scaleImg.title=mapscale.title;},setScale:function(scale){for(var i=0;i<this.zoomUpdateCBs.length;i++)
this.zoomUpdateCBs[i](false);this.scale=scale;var c=this.panel.getCenter();this.panel.setScale(scale);if(this._centeredOn){var northing=this._centeredOn.northing;var easting=this._centeredOn.easting;northing+=this.scale*(this._centeredOn._h/2);easting+=this.scale*(this._centeredOn._w/2);this.panel.centerAt(Math.round(northing),Math.round(easting));}
else
this.panel.centerAt(c.n,c.e);for(var i=0;i<this.zoomUpdateCBs.length;i++)
this.zoomUpdateCBs[i](true);this.updateIcons();if(this.places)
this.places.redraw();},centerAt:function(n,e){if(this.prefs.animate){this.animateTo(n,e);return;}
this.panel.centerAt(n,e);this.prefs.currentCenter={'n':n,'e':e};this.updateIcons();if(this.places)
this.places.redraw();},centerOn:function(icon){this._centeredOn=icon;if(icon){var northing=icon.northing;var easting=icon.easting;northing+=this.scale*(icon._h/2);easting+=this.scale*(icon._w/2);this.centerAt(Math.round(northing),Math.round(easting));}},animateTo:function(n,e){this.panel.slideStart();var cur=this.panel.getCenter();this.dy=(n-cur.n)/this.scale;this.dx=(cur.e-e)/this.scale;this.counter=10;window.setTimeout(method(this,this.animate),50);},animate:function(){var dx=this.dx/3;var dy=this.dy/3;if(this.counter>3){this.dx-=dx;this.dy-=dy;}
this.slide(dx,dy);if(--this.counter<=0){this.prefs.currentCenter=this.panel.getCenter();this.panel.slideStop();this.updateIcons();if(this.places)
this.places.redraw();}
else
window.setTimeout(method(this,this.animate),50);},addIcon:function(icon){DOM.addNodes(this.panel,icon);var id=this.getId();icon.mapid=id;if(icon.gutter){DOM.addNodes(this.gutter,icon.gutter);this.gutterIcons[id]=icon;icon.gutter.added(this);}
this.icons[id]=icon;icon.added(this);this.updateIcon(icon);},updateIcon:function(icon){var ingutter=false;if(icon.gutter){var c=this.panel.getCenter();if(!c)
return;var offx=(icon.easting-c.e)/this.scale;var offy=(c.n-icon.northing)/this.scale;ingutter=this.gutter.placeImage(icon.gutter,offx,offy,icon);}
if(ingutter)
DOM.hide(icon);else{if(icon.gutter)
DOM.show(icon);this.panel.placeImage(icon,icon.northing,icon.easting);}},updateIcons:function(){for(var id in this.icons)
this.updateIcon(this.icons[id]);},liveUpdateGutter:function(){for(var id in this.gutterIcons)
this.updateIcon(this.gutterIcons[id]);},removeIcon:function(icon){DOM.removeNodes(this.panel,icon);if(icon.gutter){DOM.removeNodes(this.gutter,icon.gutter);delete this.gutterIcons[icon.mapid];}
delete this.icons[icon.mapid];if(icon===this._centeredOn)
this._centeredOn=null;},getId:function(){this.maxId++;return this.maxId;},mark:false});Tab=Class(null,{__init__:function(name,btnimg,title,pane){this.name=name;this.btnimg=DOM.style({'zIndex':'25','position':'absolute','cursor':'pointer'},png.load(btnimg,95,35,{'title':title}));if(pane)
this.pane=pane;else
this.pane=DOM.style({'background':'#fff'},DOM.Div(null,true,false));Event.observe(this.btnimg,'click',this,this.onClick);},onClick:function(evt){this.panel.showTab(this);},interact:function(dointeract){if(this.pane.interact)
this.pane.interact(dointeract);}});Panel=Class(Control,{__init__:function(par){Control.__init__.call(this,par);this.__element__=DOM.Div(this.__parentelement__,true,true);this.btnselected=DOM.style({'zIndex':'20','position':'absolute'},png.load('panel/selected.png',5,35));this.btnbg=DOM.style({'zIndex':'20','position':'absolute'},png.load('panel/bg.png',1,1,null,true));DOM.addNodes(this.__element__,this.btnbg,this.btnselected);this.activetab=null;this.tabs=[];},add:function(tab){this.tabs.push(tab);tab.panel=this;DOM.addNodes(this.__element__,tab.btnimg,tab.pane);if(!this.activetab)
this.activetab=tab;},interact:function(dointeract){this.activetab.interact(dointeract);},showTab:function(tab){if(this.activetab&&this.activetab!=tab)
this.activetab.interact(false);this.activetab=tab;if(this.visible){DOM.place(this);this.activetab.interact(true);}
else{map.showPanel();}},show:function(){this.visible=true;},hide:function(){this.visible=false;},__place__:function(x,y,w,h){Control.__place__.call(this,x,y,w,h);DOM.place(this.btnbg,0,0,105,this._h);png.setsource(this.btnbg,'panel/bg.png',true);if(this.activetab.disabled)
this.activetab=this.tabs[0];var y=6;for(var i=0;i<this.tabs.length;i++){var tab=this.tabs[i];if(tab.disabled){DOM.hide(tab.pane);DOM.hide(tab.btnimg);}
else{DOM.place(tab.btnimg,5,y);DOM.show(tab.btnimg);DOM.place(tab.pane,105,0,this._w-105,this._h);if(tab==this.activetab){DOM.show(tab.pane);DOM.place(this.btnselected,99,y);}
else
DOM.hide(tab.pane);y+=39;}}}});H2=DOM._creator("h2");parseDate=function(string){var regexp="([0-9]{2})-([0-9]{2})-([0-9]{4})"+" "+"([0-9]{2}):([0-9]{2}):([0-9]{2})";var d=string.match(new RegExp(regexp));var date=new Date(d[3],d[2]-1,d[1],d[4],d[5],d[6]);if(d[3]){date.setMonth(d[2]-1);}
return date}
ValidUrl=function(string){var RegexUrl=/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;return RegexUrl.test(string);}
Feature=Class(MapIcon,{hsx:7,hsy:7,__visibility__:true,__init__:function(iconsrc,altsrc,icontype,map,title,info,nFeatures){MapIcon.__init__.call(this);this.iconsrc=iconsrc;this.altsrc=altsrc;this.icontype=icontype;this.title=title;this.info=info;this.map=map;this.grey=nFeatures%2==0;this.createElement();Event.observe(this.__element__,'click',this,this.onClick);Event.observe(this.__element__,'mousedown',this,this.onMouseDown);map.addIcon(this);},createElement:function(){this.__element__=DOM.style({'position':'absolute','zIndex':'1','cursor':'pointer','visibility':'hidden'},png.load('features/'+this.iconsrc,14,14));},createEntry:function(){this.entry=DIV(null,DOM.style({'padding':'10px'},DIV(null,this.entryIcon=DOM.style({'cssFloat':'right','styleFloat':'right','marginLeft':'3px','marginBottom':'3px','cursor':'pointer'},png.load('panel/item/'+this.iconsrc,14,14)),this.entryTitle=DOM.style({'fontWeight':'bold','display':'block'},SPAN(null,this.title)),this.entryInfo=DOM.style({},SPAN(null,this.info)))));if(this.grey)
DOM.style({'background':'#f3f3f3'},this.entry);Event.observe(this.entryIcon,'click',this,this.onClick);return this.entry;},setIcon:function(icon){png.setsource(this.__element__,'features/'+icon)
png.setsource(this.entry,'features/item/'+icon)},createBubble:function(){return SPAN(null,this.info);},onClick:function(evt){this.click(this);return Event.stop(evt);},onMouseDown:function(evt){return Event.stop(evt);},remove:function(){this.map.removeIcon(this);},update:function(data){this.mark=true;this.id=data[0];this.northing=data[1];this.easting=data[2];this.title=data[3];this.info=data[4];this.startDate=data[5];this.endDate=data[6];this.visible=data[7];dtnow=new Date()
if(!((this.visible==null||this.visible)&&(this.startDate==null||parseDate(this.startDate)<=dtnow)&&(this.endDate==null||parseDate(this.endDate)>dtnow))){this.setIcon(this.altsrc);}
else
this.setIcon(this.iconsrc);DOM.setTxt(this.entryTitle,this.title);DOM.setTxt(this.entryInfo,this.info);this.__element__.title=this.title;this.map.updateIcon(this);DOM.show(this);}});AdFeature=Class(Feature,{__init__:function(iconsrc,altsrc,icontype,map,title,info,nFeatures){var parts=this.fulltitle=title.split(',');this.iconw=parseInt(parts[0]);this.iconh=parseInt(parts[1]);this.externalIcon=false;this.iconsrc=altsrc=parts[2];if(ValidUrl(this.iconsrc))
this.externalIcon=true;title=parts.slice(3).join(',');Feature.__init__.call(this,this.iconsrc,altsrc,icontype,map,title,info,nFeatures);this.hsx=parseInt(this.iconw/2);this.hsy=parseInt(this.iconh/2);},setIcon:function(icon){},createElement:function(){var imageSrc=this.iconsrc
var pngloader=externalpng
if(!this.externalIcon){imageSrc='features/'+imageSrc;pngloader=png;}
this.__element__=DOM.style({'position':'absolute','zIndex':'1','cursor':'pointer','visibility':'hidden'},pngloader.load(imageSrc,this.iconw,this.iconh));},createEntry:function(){this.entryInfo=SPAN();var imageSrc=this.iconsrc
var pngloader=externalpng;if(!this.externalIcon){imageSrc='panel/item/'+this.iconsrc;pngloader=png;}
this.entry=DIV(null,DOM.style({'padding':'10px'},DIV(null,this.entryIcon=DOM.style({'cssFloat':'right','styleFloat':'right','marginLeft':'3px','marginBottom':'3px','cursor':'pointer'},pngloader.load(imageSrc,14,14,'',true)),this.entryTitle=DOM.style({'fontWeight':'bold','display':'block'},SPAN(null,this.title)),this.trueEntryInfo=DOM.style({},SPAN(null)))));this.trueEntryInfo.innerHTML=this.info;if(this.grey)
DOM.style({'background':'#f3f3f3'},this.entry);Event.observe(this.entryIcon,'click',this,this.onClick);return this.entry;},createBubbleContent:function(){var span=SPAN();span.innerHTML=this.info;return span;},update:function(data){var record=data.slice(0);var parts=record[3].split(',');record[3]=parts.slice(3).join(',');Feature.update.call(this,record);this.trueEntryInfo.innerHTML=this.info;}});FeatureGroup=Class(null,{__init__:function(featureclass,src,altsrc,featuretype,map,title,nFeatures){this.iconsrc=src;this.altsrc=altsrc;this.featuretype=featuretype;this.map=map;this.features={};this.featureclass=featureclass;this.title=title;this.container=DIV(null,DOM.style({'background':'#CCC','marginBottom':'5px'},DIV(null,DOM.style({'paddingLeft':'3px','paddingRight':'3px','fontWeight':'bold'},DIV(null,title)))),DOM.style({'marginTop':'5px'},DIV(null,DOM.style({'cssFloat':'right','styleFloat':'right','marginLeft':'3px','marginBottom':'3px'},png.load('panel/item/trafficflow.png',14,14)),this.dir1name=DOM.style({'fontWeight':'bold','marginLeft':'5px'},DIV()))),this.dir1contents=DOM.style({'paddingLeft':'5px'},DIV()),this.dir1total=DOM.style({'marginBottom':'3px','marginLeft':'5px','fontWeight':'bold'},DIV(null,'Total: ')),DOM.style({'marginTop':'5px'},DIV(null,DOM.style({'cssFloat':'right','styleFloat':'right','marginLeft':'3px','marginBottom':'3px'},png.load('panel/item/trafficflow.png',14,14)),this.dir2name=DOM.style({'fontWeight':'bold','marginLeft':'5px'},DIV()))),this.dir2contents=DOM.style({'paddingLeft':'5px'},DIV()),this.dir2total=DOM.style({'marginBottom':'15px','marginLeft':'5px','fontWeight':'bold'},DIV(null,'Total: ')));},setIcon:function(icon){},remove:function(){},update:function(data){this.mark=true;var records=data[2];var dirset=false;var dir1time=0;var dir2time=0;var froms=[];var tos=[];var segments=[];for(var i=0;i<records.length;i++){var record=records[i];var id=record[0];var feature=this.features[id];if(!feature){feature=new this.featureclass(this.iconsrc,this.altsrc,this.icontype,this.map,record[3],record[4],0);this.features[id]=feature;DOM.addNodes(this.dir1contents,feature.dir1entry);if(this.dir2contents.firstChild)
this.dir2contents.insertBefore(feature.dir2entry,this.dir2contents.firstChild);else
DOM.addNodes(this.dir2contents,feature.dir2entry);feature.click=this.click;}
feature.update(record);if(!dirset){DOM.setTxt(this.dir1name,feature.dir1name);DOM.setTxt(this.dir2name,feature.dir2name);dirset=true;}
dir1time+=feature.dir1time;dir2time+=feature.dir2time;var parts=feature.title.split(' - ');froms.push(parts[0]);tos.push(parts[1]);segments.push(feature);}
DOM.setTxt(this.dir1total,'Total: '+fmtseconds(dir1time));DOM.setTxt(this.dir2total,'Total: '+fmtseconds(dir2time));this.froms=froms;this.tos=tos;this.segments=segments;},createEntry:function(){this.entry=this.container;return this.container;}});FeaturePane=Class(Control,{__init__:function(headname,headdesc,iconsrc){Control.__init__.call(this);this.__element__=DOM.style({'background':'#fff'},DOM.Div(null,true,false));var header=DOM.style({'padding':'5px'},DIV(null,DOM.style({'cssFloat':'left','styleFloat':'left','marginRight':'10px'},png.load('panel/header/'+iconsrc,38,38)),DOM.style({'fontSize':'14px','fontWeight':'bold','marginBottom':'0px'},H2(null,headname)),DOM.style({'fontSize':'12px','display':'block','marginBottom':'10px'},SPAN(null,headdesc))));DOM.addNodes(this.__element__,header);this.scroll=DOM.style({'overflow':'hidden'},DOM.Div(this.__element__,true,true));this.contents=DOM.style({'padding':'0px'},DOM.Div(this.scroll,false,true));},__place__:function(x,y,w,h){Control.__place__.call(this,x,y,w,h);DOM.place(this.scroll,0,50,this._w,this._h-50);},interact:function(dointeract){if(dointeract)
this.scroll.style.overflow='auto';else
this.scroll.style.overflow='hidden';}});FeatureHandler=Class(null,{featureclass:Feature,featuregroup:FeatureGroup,__init__:function(map,featuretype,headname,headdesc,iconsrc){this.map=map;this.pane=new FeaturePane(headname,headdesc,iconsrc);this.tab=new Tab(featuretype,'panel/'+iconsrc,headdesc,this.pane);this.features={};this.iconsrc=iconsrc;this.altsrc='gs-'+iconsrc;this.featuretype=featuretype;this.obClick=[];this.contents=this.pane.contents;this.nFeatures=0;},observeClick:function(ob){this.obClick[this.obClick.length]=ob;},clear:function(){for(var key in this.features)
this.features[key].mark=false;},sweep:function(){var keys=[];for(var key in this.features)
keys.push(key);for(var i=0;i<keys.length;i++){var feature=this.features[keys[i]];if(!feature.mark){DOM.removeNodes(this.contents,feature.entry);if(feature.remove)
feature.remove();delete this.features[keys[i]];this.nFeatures-=1;}}},process:function(records){for(var i=0;i<records.length;i++){var record=records[i];var id=record[0];var feature=this.features[id];if(!feature){if(record.length==3){feature=new this.featuregroup(this.featureclass,this.iconsrc,this.altsrc,this.featuretype,this.map,record[1],this.nFeatures);}
else{feature=new this.featureclass(this.iconsrc,this.altsrc,this.featuretype,this.map,record[3],record[4],this.nFeatures);}
DOM.addNodes(this.contents,feature.createEntry());feature.click=method(this,this.featureclick);this.features[id]=feature;this.nFeatures+=1;}
feature.update(record);}},unselect:function(){for(var key in this.features)
this.features[key].unselectEntry();},select:function(feature){for(var key in this.app.features){if(this.app.features[key]!==this)
this.app.features[key].unselect();}
for(var key in this.features){if(this.features[key]!==feature)
this.features[key].unselectEntry();}
feature.selectEntry();},featureclick:function(feature){var handled=false;for(var i=0;i<this.obClick.length;i++)
if(this.obClick[i](feature))
handled=true;if(handled)
return;var b=new Bubble(feature.title,feature.info);b.sizeToContent();b.northing=feature.northing;b.easting=feature.easting;this.map.addIcon(b);DOM.show(b);this.map.centerOn(b);}});AdHandler=Class(FeatureHandler,{featureclass:AdFeature,__init__:function(map,featuretype,mainhandler){this.map=map;this.features={};this.featuretype=featuretype;this.obClick=[];this.mainhandler=mainhandler;this.contents=mainhandler.pane.contents;this.nFeatures=0;},featureclick:function(feature){var handled=false;for(var i=0;i<this.obClick.length;i++)
if(this.obClick[i](feature))
handled=true;if(handled)
return;var b=new Bubble(feature.title,feature.createBubbleContent());b.sizeToHtmlContent(200);b.northing=feature.northing;b.easting=feature.easting;this.map.addIcon(b);DOM.show(b);this.map.centerOn(b);},process:function(records){this.nFeatures=this.mainhandler.nFeatures;FeatureHandler.process.call(this,records);this.mainhandler.nFeatures=this.nFeatures;}});function fmtseconds(seconds){var ret='';if(seconds>60){var minutes=parseInt(seconds/60);ret+=minutes+"m ";seconds-=(minutes*60);}
ret+=seconds+"s";return ret;}
levelnames={6:'No Data',5:'Free Flowing',4:'Moderate',3:'Heavy',2:'Congested',1:'Stopped'};CameraFeature=Class(Feature,{createEntry:function(){this.entry=DIV(null,DOM.style({'padding':'10px'},DIV(null,this.entryIcon=DOM.style({'cssFloat':'right','styleFloat':'right','marginLeft':'3px','marginBottom':'3px','cursor':'pointer'},png.load('panel/item/'+this.iconsrc,14,14)),this.entryTitle=DOM.style({'fontWeight':'normal','display':'block'},SPAN(null,this.title)))));this.entryInfo=DIV();if(this.grey)
DOM.style({'background':'#f3f3f3'},this.entry);Event.observe(this.entryIcon,'click',this,this.onClick);return this.entry;},getImgSource:function(){var parts=this.info.split(',');if(parts.length==3)
return parts[2]+'&timestamp='+parseInt(new Date()/1);return null;},createBubbleContent:function(){var parts=this.info.split(',');if(parts.length==3){this.imgWidth=parseInt(parts[0]);this.imgHeight=parseInt(parts[1]);return IMG({'width':parts[0],'height':parts[1],'src':this.getImgSource()});}
else{window.open(this.info);return null;}}});TrafficFeature=Class(Feature,{hsx:13,hsy:11,createElement:function(){this.__element__=DOM.style({'position':'absolute','zIndex':'2','cursor':'pointer','width':'26px','height':'26px','visibility':'hidden'},DIV());var bg=DOM.style({'position':'absolute','zIndex':'1','left':'0px','top':'0px'},png.load('flow/blank.png',26,26));this.dir1img=DOM.style({'position':'absolute','zIndex':'2','left':'0px','top':'0px'},png.load('flow/blank.png',26,26));this.dir2img=DOM.style({'position':'absolute','zIndex':'2','left':'0px','top':'0px'},png.load('flow/blank.png',26,26));this.dir1entry=DIV(null);this.dir2entry=DIV(null);DOM.addNodes(this,bg,this.dir1img,this.dir2img);},update:function(data){this.mark=true;var idx=0;this.id=data[idx++];this.northing=data[idx++];this.easting=data[idx++];this.title=data[idx++];this.dir1segment=data[idx++];this.dir1name=data[idx++];this.dir1level=data[idx++];this.dir1dir=data[idx++];this.dir2segment=data[idx++];this.dir2name=data[idx++];this.dir2level=data[idx++];this.dir2dir=data[idx++];this.dir1time=data[idx++];this.dir2time=data[idx++];if(data.length>=idx+4){this.hasSpeed=true;this.dir1speed=data[idx++];this.dir2speed=data[idx++];this.dir1qual=data[idx++];this.dir2qual=data[idx++];}
this.title=this.dir1segment;this.info='';png.setsource(this.dir1img,'flow/flow_'+this.dir1dir+'_'+this.dir1level+'.png');png.setsource(this.dir2img,'flow/flow_'+this.dir2dir+'_'+this.dir2level+'.png');this.info1=levelnames[this.dir1level]+', ['+fmtseconds(this.dir1time)+']';this.info2=levelnames[this.dir2level]+', ['+fmtseconds(this.dir2time)+']';this.dir1=this.dir1name+': '+this.info1;this.dir2=this.dir2name+': '+this.info2;if(this.hasSpeed){this.dir1entry.innerHTML=this.dir1segment+':<br/><div style="margin-left: 20px">'+this.renderLevel(this.dir1level,this.info1+' '+this.dir1speed+'km/h ('+this.dir1qual+')</div>');this.dir2entry.innerHTML=this.dir2segment+':<br/><div style="margin-left: 20px">'+this.renderLevel(this.dir2level,this.info2+' '+this.dir2speed+'km/h ('+this.dir2qual+')</div>');}
else{this.dir1entry.innerHTML=this.dir1segment+':<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+this.renderLevel(this.dir1level,this.info1);this.dir2entry.innerHTML=this.dir2segment+':<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'+this.renderLevel(this.dir2level,this.info2);}
this.__element__.title=this.dir1name+' - '+levelnames[this.dir1level]+', '+this.dir2name+' - '+levelnames[this.dir2level];this.map.updateIcon(this);DOM.show(this);},createBubbleContent:function(){var lev1,lev2;var ret=TABLE({'cellSpacing':'0','cellPadding':'0'},TBODY(null,TR(null,TD(null,this.dir1name),lev1=TD(null)),TR(null,TD(null,this.dir2name),lev2=TD(null))));if(this.hasSpeed){lev1.innerHTML=this.renderLevel(this.dir1level,this.info1+' '+this.dir1speed+'km/h ('+this.dir1qual+')');lev2.innerHTML=this.renderLevel(this.dir2level,this.info2+' '+this.dir2speed+'km/h ('+this.dir2qual+')');}
else{lev1.innerHTML=this.renderLevel(this.dir1level,this.info1);lev2.innerHTML=this.renderLevel(this.dir2level,this.info2);}
return ret;},renderLevel:function(level,info){if(level==1)
return'<b style="text-decoration: underline">'+info+'</b>';else if(level==2)
return'<b style="color: #F00">'+info+'</b>';else if(level==3)
return'<b style="color: #F80">'+info+'</b>';else if(level==4)
return'<b style="color: #BB0">'+info+'</b>';else if(level==5)
return'<b style="color: #0A0">'+info+'</b>';else
return info;}});CalcExpr=Class(null,{__init__:function(par,grey,first){this.__element__=DOM.style({'padding':'5px'},DIV());this.groups={};this.roadparts={};this.par=par;if(!first){this.remove=DOM.style({'cursor':'pointer','cssFloat':'right','styleFloat':'right','marginRight':'10px'},png.load('panel/remove.png',16,16));Event.observe(this.remove,'click',this,this.onRemove);DOM.addNodes(this.__element__,this.remove);}
var tbl=TABLE(null,TBODY(null,TR(null,TD(null,'Road'),TD(null,this.road=SELECT())),TR(null,TD(null,'From'),TD(null,this.from=SELECT())),TR(null,TD(null,'To'),TD(null,this.to=SELECT())),TR(null,TD(null,'Time'),TD(null,this.time=SPAN(null,'')))));DOM.addNodes(this.__element__,tbl);if(grey)
DOM.style({'background':'#f3f3f3'},this.__element__);Event.observe(this.road,'change',this,this.updateRoadparts);Event.observe(this.from,'change',this.par,this.par.calculate);Event.observe(this.to,'change',this.par,this.par.calculate);},onRemove:function(evt){this.par.remove(this);},trySelect:function(el,value){for(var i=0;i<el.options.length;i++)
if(DOM.getTxt(el.options[i])==value){el.selectedIndex=i;return true;}
return false;},getSelect:function(el){if(el.selectedIndex>=0)
return DOM.getTxt(el.options[el.selectedIndex]);return null;},updateRoadparts:function(){var road=this.getSelect(this.road);var selFrom=this.getSelect(this.from);var selTo=this.getSelect(this.to);var fromParent=this.from.parentNode;var toParent=this.to.parentNode;fromParent.removeChild(this.from);toParent.removeChild(this.to);DOM_Clear(this.from);DOM_Clear(this.to);if(road){var parts=this.roadparts[road];for(var i=0;i<parts.length;i++){this.from.appendChild(OPTION(null,parts[i]));this.to.appendChild(OPTION(null,parts[i]));}}
this.trySelect(this.from,selFrom);this.trySelect(this.to,selTo);fromParent.appendChild(this.from);toParent.appendChild(this.to);},update:function(roadparts,groups){var selRoad=this.getSelect(this.road);var roadParent=this.road.parentNode;roadParent.removeChild(this.road);DOM_Clear(this.road);for(var road in roadparts)
this.road.appendChild(OPTION(null,road));this.trySelect(this.road,selRoad);roadParent.appendChild(this.road);this.roadparts=roadparts;this.groups=groups;this.updateRoadparts();},calculate:function(){var selRoad=this.getSelect(this.road);if(!selRoad){DOM.setTxt(this.time,'---');return 0;}
var group=this.groups[selRoad];var frm=this.from.selectedIndex;var to=this.to.selectedIndex;var total=0;if(frm<to)
for(var i=frm;i<to;i++)
total+=group.segments[i].dir1time;else
for(var i=to;i<frm;i++)
total+=group.segments[i].dir2time;DOM.setTxt(this.time,fmtseconds(total));return total;}});function DOM_Clear(el){while(el.firstChild)
el.removeChild(el.firstChild);}
CalculatorPane=Class(FeaturePane,{__init__:function(){FeaturePane.__init__.call(this,'Journey Calculator','calculate journey time','calculator.png');this.roadparts={};this.expressions=[];this.expressions.push(new CalcExpr(this,true,true));DOM.addNodes(this.contents,this.expressions[0].__element__);this.total=DOM.style({'marginLeft':'5px'},SPAN(null,'Total: '));this.add=DOM.style({'cursor':'pointer','cssFloat':'right','styleFloat':'right','marginRight':'10px'},png.load('panel/add.png',16,16));Event.observe(this.add,'click',this,this.onAdd);DOM.addNodes(this.contents,this.add,this.total);},update:function(features){var roadparts={};var groups={};for(var key in features){var group=features[key];var title=group.title.replace(/(^[^/(]+).*$/,'$1');var parts=$A(group.froms);parts.push(group.tos[group.tos.length-1]);roadparts[title]=parts;groups[title]=group;}
this.roadparts=roadparts;this.groups=groups;for(var i=0;i<this.expressions.length;i++)
this.expressions[i].update(roadparts,groups);this.calculate();},calculate:function(){total=0;for(var i=0;i<this.expressions.length;i++)
total+=this.expressions[i].calculate();DOM.setTxt(this.total,'Total: '+fmtseconds(total));},onAdd:function(evt){var newexpr=new CalcExpr(this,(this.expressions.length%2)==0,false);newexpr.update(this.roadparts,this.groups);this.expressions.push(newexpr);this.contents.insertBefore(newexpr.__element__,this.add);return Event.stop(evt);},remove:function(expr){DOM.removeNodes(this.contents,expr.__element__);var ex=[];for(var i=0;i<this.expressions.length;i++){if(this.expressions[i]!==expr)
ex.push(this.expressions[i]);}
this.expressions=ex;this.calculate();}});TrafficHandler=Class(FeatureHandler,{featureclass:TrafficFeature,featuregroup:FeatureGroup,__init__:function(map,featuretype,headname,headdesc,iconsrc){FeatureHandler.__init__.call(this,map,featuretype,headname,headdesc,iconsrc);this.calculatorPane=new CalculatorPane();this.calculator=new Tab('calculate','panel/calculate.png','Journey Calculator',this.calculatorPane);},featureclick:function(feature){var handled=false;for(var i=0;i<this.obClick.length;i++)
if(this.obClick[i](feature))
handled=true;if(handled)
return;var b=new Bubble(feature.title,feature.createBubbleContent());b.sizeToHtmlContent();b.northing=feature.northing;b.easting=feature.easting;this.map.addIcon(b);DOM.show(b);this.map.centerOn(b);},sweep:function(){FeatureHandler.sweep.call(this);this.calculatorPane.update(this.features);this.calculator.disabled=(this.nFeatures==0);this.tab.disabled=(this.nFeatures==0);}});CameraHandler=Class(FeatureHandler,{featureclass:CameraFeature,featuregroup:FeatureGroup,__init__:function(map,featuretype,headname,headdesc,iconsrc){FeatureHandler.__init__.call(this,map,featuretype,headname,headdesc,iconsrc);this.bubbles=[];},featureclick:function(feature){var handled=false;for(var i=0;i<this.obClick.length;i++)
if(this.obClick[i](feature))
handled=true;if(handled)
return;var content=feature.createBubbleContent();if(content){var b=new Bubble(feature.title,content);if(feature.imgWidth)
b.sizeToFixed(feature.imgWidth,feature.imgHeight);else
b.sizeToHtmlContent();b.northing=feature.northing;b.easting=feature.easting;b.feature=feature;this.map.addIcon(b);DOM.show(b);}
b.cbOnClose=method(this,this.bubbleClosed);this.bubbles.push(b);this.map.centerOn(b);},bubbleClosed:function(b){var bubbles=[];for(var i=0;i<this.bubbles.length;i++)
if(this.bubbles[i]!==b)
bubbles.push(b);this.bubbles=bubbles;},sweep:function(){FeatureHandler.sweep.call(this);this.tab.disabled=(this.nFeatures==0);for(var i=0;i<this.bubbles.length;i++)
this.bubbles[i].content.src=this.bubbles[i].feature.getImgSource();}});Updater=Class(null,{__init__:function(map,prefix,interval){this.handlers={};this.map=map;this.prefix=prefix||'';this.id=window.setInterval(method(this,this.poll),interval||60000);},registerHandler:function(handler){this.handlers[handler.featuretype]=handler;},response:function(resp){resp=eval(resp);this.run(resp);},poll:function(){var region=Cookie.get('viewregion','auckland');Ajax.get(this.prefix+'/'+region,method(this,this.response));},run:function(data){for(var key in this.handlers)
this.handlers[key].clear();for(var i=0;i<data.length;i++){var typ=data[i][0];if(this.handlers[typ])
this.handlers[typ].process(data[i][1]);}
for(key in this.handlers)
this.handlers[key].sweep();DOM.place(map.panel);}});Bubble=Class(MapIcon,{hsx:0,hsy:0,__init__:function(title,content){MapIcon.__init__.call(this);this.__element__=DOM.style({'zIndex':'15'},DOM.Div(null,true,false));this.bl=DOM.style({'position':'absolute'},png.load('bubble/bl.png',40,43));this.br=DOM.style({'position':'absolute'},png.load('bubble/br.png',6,6));this.tl=DOM.style({'position':'absolute'},png.load('bubble/tl.png',6,18));this.tr=DOM.style({'position':'absolute'},png.load('bubble/tr.png',6,18));this.bottom=DOM.style({'position':'absolute','lineHeight':'1px'},png.load('bubble/bottom.png',1,3,null,true));this.close=DOM.style({'position':'absolute','cursor':'pointer'},png.load('bubble/close.png',10,18));this.left=DOM.style({'position':'absolute'},png.load('bubble/left.png',6,1,null,true));this.right=DOM.style({'position':'absolute'},png.load('bubble/right.png',6,1,null,true));this.titlebg=DOM.style({'position':'absolute'},png.load('bubble/title.png',1,18,null,true));this.contentbg=DOM.style({'position':'absolute'},png.load('bubble/content.png',1,1,null,true));DOM.addNodes(this,this.bl,this.br,this.tl,this.tr,this.bottom,this.close,this.left,this.right,this.titlebg,this.contentbg);Event.observe(this.close,'mousedown',this,this.onMouseDown);Event.observe(this.close,'click',this,this.onClose);this.title=title;this.content=content;this.divTitle=DOM.style({'position':'absolute','color':'#FFF','left':'7px','top':'2px'},DIV(null,this.title));this.divContent=DOM.style({'position':'absolute','color':'#000','left':'7px','top':'20px'},DIV(null,this.content));DOM.addNodes(this,this.divTitle,this.divContent);},added:function(map){this.map=map;},sizeToFixed:function(w,h){DOM.place(this,undefined,undefined,w+12,h+40+18+4);},sizeToContent:function(){var tmp=DOM.style({'visibility':'hidden','position':'absolute'},SPAN());DOM.addNodes(map.__element__,tmp);tmp.innerHTML=this.title;var titleReqWidth=DOM.getWidth(tmp)+20;DOM.place(tmp,undefined,undefined,titleReqWidth);tmp.innerHTML=this.content;var contentReqHeight=DOM.getHeight(tmp)+40+18+4;DOM.removeNodes(map.__element__,tmp);DOM.place(this,undefined,undefined,titleReqWidth+7,contentReqHeight);},sizeToHtmlContent:function(forceW){var tmp=DOM.style({'visibility':'hidden','position':'absolute'},SPAN());DOM.addNodes(map.__element__,tmp);tmp.innerHTML=this.title;var titleReqWidth=DOM.getWidth(tmp)+7+20;DOM.removeNodes(map.__element__,tmp);DOM.removeNodes(this.divContent,this.content);DOM.addNodes(map.__element__,this.content);var contentReqWidth,contentReqHeight;if(forceW){if(forceW<titleReqWidth)
forceW=titleReqWidth;var oldp=this.content.style.position;this.content.style.position='absolute';DOM.place(this.content,undefined,undefined,forceW);contentReqWidth=forceW;contentReqHeight=DOM.getHeight(this.content)+40+18+4;this.content.style.position=oldp;}
else{contentReqWidth=DOM.getWidth(this.content)+12;contentReqHeight=DOM.getHeight(this.content)+40+18+4;}
DOM.removeNodes(map.__element__,this.content);DOM.addNodes(this.divContent,this.content);DOM.place(this,undefined,undefined,titleReqWidth>contentReqWidth?titleReqWidth:contentReqWidth,contentReqHeight);},centerMap:function(map){var northing=this.northing,easting=this.easting;northing+=map.panel.scale*(this._h/2);easting+=map.panel.scale*(this._w/2);map.centerAt(Math.round(northing),Math.round(easting));},onMouseDown:function(evt){return Event.stop(evt);},onClose:function(evt){if(this.cbOnClose)
this.cbOnClose(this);this.map.removeIcon(this);},__resize__:function(oldw,oldh){DOM.place(this.tl,3,0);DOM.place(this.tr,this._w-6,0);DOM.place(this.bl,0,this._h-43);DOM.place(this.br,this._w-6,this._h-43);DOM.place(this.close,this._w-16,0);DOM.place(this.left,3,18,6,this._h-18-43);png.setsource(this.left,'bubble/left.png',true);DOM.place(this.right,this._w-6,18,6,this._h-18-43);png.setsource(this.right,'bubble/right.png',true);DOM.place(this.titlebg,9,0,this._w-9-6-10,18);png.setsource(this.titlebg,'bubble/title.png',true);DOM.place(this.bottom,40,this._h-40,this._w-40-6,3);png.setsource(this.bottom,'bubble/bottom.png',true);DOM.place(this.contentbg,9,18,this._w-9-6,this._h-40-18);png.setsource(this.contentbg,'bubble/content.png',true);this.hsx=4;this.hsy=this._h-4;},__place__:function(x,y,w,h){if(x!==undefined&&y!==undefined)
Control.__place__.call(this,x-this.hsx,y-this.hsy,w,h);else
Control.__place__.call(this,undefined,undefined,w,h);}});Lookup=Class(null,{__init__:function(map){this.map=map;this.pane=new FeaturePane('Street Lookup','Find addresses','streetlookup.png');this.tab=new Tab('lookup','panel/streetlookup.png','Street Lookup',this.pane);this.links=[];var btnSubmit,btnClear;var table=TABLE({'cellpadding':2,'cellspacing':2,'border':0},TBODY(null,TR(null,TD(null,"Number"),TD(null,this.txtNumber=INPUT({'size':10}))),TR(null,TD(null,"Street"),TD(null,this.txtStreet=INPUT({'size':15}))),TR(null,TD(null,"Suburb"),TD(null,this.txtSuburb=INPUT({'size':15}))),TR(null,TD(),TD(null,btnSubmit=INPUT({'type':'button','value':'Search'}),btnClear=INPUT({'type':'button','value':'Clear'})))));Event.observe(this.txtNumber,'keydown',this,this.submitEnter);Event.observe(this.txtStreet,'keydown',this,this.submitEnter);Event.observe(this.txtSuburb,'keydown',this,this.submitEnter);Event.observe(btnSubmit,'click',this,this.submit);Event.observe(btnClear,'click',this,this.clear);this.err=DOM.style({'color':'#F00'},SPAN(null,""));var d=DOM.style({'padding':'5px'},DIV());DOM.addNodes(d,table,HR(),this.err,BR());DOM.addNodes(this.pane.contents,d);this.contents=DOM.style({'padding':'5px'},DIV());DOM.addNodes(this.pane.contents,this.contents);},submitEnter:function(evt){var keycode=evt.keyCode||evt.which;if(keycode==13){this.submit();return Event.stop(evt);}},makerefine:function(num,st,sub){return function(evt){this.refine(num,st,sub);return Event.stop(evt);};},clearResults:function(msg){DOM.setTxt(this.err,msg);for(var i=0;i<this.links.length;i++)
this.contents.removeChild(this.links[i]);this.links=[];},results:function(data,stat,stattxt){if(stat!=200){DOM.setTxt(this.err,"Error - "+stat+" ("+stattxt+")");return;}
var ret=eval(data);if(ret[0]){var street=ret[1]+" "+ret[2];var suburb=ret[3];var b=new Bubble('Address lookup',street+'\n'+suburb);b.sizeToContent();b.northing=ret[4];b.easting=ret[5];this.map.addIcon(b);DOM.show(b);this.map.centerOn(b);}
else{this.clearResults(ret[1]);var refine=ret[2];for(var i=0;i<refine.length;i++){var link=document.createElement("a");link.setAttribute("href","refine");Event.observe(link,'click',this,this.makerefine(refine[i][0],refine[i][1],refine[i][2]));link.appendChild(document.createTextNode(refine[i][0]+" "+refine[i][1]+", "+refine[i][2]));this.contents.appendChild(link);var br=document.createElement("br");this.contents.appendChild(br);this.links.push(br);this.links.push(link);}}},submit:function(){this.refine(this.txtNumber.value,this.txtStreet.value,this.txtSuburb.value);},refine:function(num,st,sub){this.txtNumber.value=num;this.txtStreet.value=st;this.txtSuburb.value=sub;Ajax.post("/addrsearch",Ajax.encode([['number',num],['street',st],['suburb',sub]]),method(this,this.results));},clear:function(){this.txtNumber.value="";this.txtStreet.value="";this.txtSuburb.value="";this.clearResults("");this.txtNumber.focus();}});externalpng=new PNGLoader('');png=new PNGLoader('/static/');tween=new Tweener(50);var regions={'auckland':{'n':5921034,'e':1757539},'wellington':{'n':5427150,'e':1748940},'christchurch':{'n':5179600,'e':1570700},'tauranga':{'n':5823162,'e':1878722},'hamilton':{'n':5816106,'e':1800819},'dunedin':{'n':4916925,'e':1406680}};Prefs=Class(null,{center:{'n':5921034,'e':1757539},animate:true,__init__:function(par){this.load();},load:function(){this.currentCenter=this.center=regions[Cookie.get('viewregion','auckland')];this.activetab=Cookie.get("activetab","advisory");}});App=Class(Control,{panel:null,__init__:function(par,updaterPrefix){Control.__init__.call(this,par);this.__element__=DOM.style({'overflow':'hidden'},DOM.Div(this.__parentelement__,true,true));this.prefs=new Prefs(this);this.scm=new ScrollingMap(this,this.prefs,[],true);var linzcopyright=DOM.style({'position':'absolute'},png.load('linzcopyright.png',254,13,{'title':'Data sourced from LINZ. Crown copyright reserved.'}));this.scm.addOverlay(linzcopyright,5,-13);this.panelexpand=DOM.style({'position':'absolute','cursor':'pointer','zIndex':'100'},png.load('panel/open.png',20,50,{'title':'Show panel'}));this.panelcontract=DOM.style({'position':'absolute','cursor':'pointer','zIndex':'100'},png.load('panel/close.png',20,50,{'title':'Hide panel'}));DOM.hide(this.panelcontract,true);Event.observe(this.panelexpand,'click',this,this.onPanelExpandClick);Event.observe(this.panelcontract,'click',this,this.onPanelExpandClick);this.swallowMD(this.panelexpand);this.swallowMD(this.panelcontract);this.scm.addOverlay(this.panelexpand,-125,100);this.scm.addOverlay(this.panelcontract,-125,100);this.panel=new Panel(this);var general=new FeatureHandler(this.scm,'advisory','General','advisory information','generaladvisory.png');this.panel.add(general.tab);var traffic=new TrafficHandler(this.scm,'traffic','Traffic','Traffic Flow','trafficflow.png');this.panel.add(traffic.tab);this.panel.add(traffic.calculator);var incidents=new FeatureHandler(this.scm,'incident','Incidents','traffic incidents','incidents.png');this.panel.add(incidents.tab);var roadworks=new FeatureHandler(this.scm,'roadworks','Roadworks','planned road work','roadworks.png');this.panel.add(roadworks.tab);var crashes=new FeatureHandler(this.scm,'crash','Crashes','crashes on road','crash.png');this.panel.add(crashes.tab);var events=new FeatureHandler(this.scm,'event','Events','in the area','events.png');this.panel.add(events.tab);var lookup=new Lookup(this.scm);this.panel.add(lookup.tab);var cameras=new CameraHandler(this.scm,'camera','Traffic Cams','3rd party cameras','camera.png');this.panel.add(cameras.tab);var ads=new AdHandler(this.scm,'ad',general);if(updaterPrefix=='/admin'){var admin=new AdminHandler(this,this.scm,'edit','Edit Features','Edit existing features','edit.png');this.panel.add(admin.edit);this.panel.add(admin.create);roadworks.observeClick(method(admin.editPane,admin.editPane.featureClicked));incidents.observeClick(method(admin.editPane,admin.editPane.featureClicked));crashes.observeClick(method(admin.editPane,admin.editPane.featureClicked));events.observeClick(method(admin.editPane,admin.editPane.featureClicked));general.observeClick(method(admin.editPane,admin.editPane.featureClicked));ads.observeClick(method(admin.editPane,admin.editPane.featureClicked));}
this.panelPos=0;this.updater=new Updater(this.scm,updaterPrefix);this.updater.registerHandler(general);this.updater.registerHandler(traffic);this.updater.registerHandler(incidents);this.updater.registerHandler(roadworks);this.updater.registerHandler(crashes);this.updater.registerHandler(events);this.updater.registerHandler(cameras);this.updater.registerHandler(ads);this.updater.poll();},swallowMD:function(el){Event.observe(el,'mousedown',window,function(evt){return Event.stop(evt);});},onPanelExpandClick:function(evt){if(this.panel.visible)
this.hidePanel();else
this.showPanel();},showPanel:function(tab){tween.run(new Tween(null,null,null,TweenAlgorithm.regularEaseOut,0,220,500,this,function(val){this.panelPos=val;DOM.place(this);},function(){this.panel.interact(true);}));DOM.show(this.panelcontract,true);DOM.hide(this.panelexpand,true);this.panel.visible=true;},hidePanel:function(){tween.run(new Tween(null,null,null,TweenAlgorithm.regularEaseOut,220,0,500,this,function(val){this.panelPos=val;DOM.place(this);}));this.panel.interact(false);DOM.hide(this.panelcontract,true);DOM.show(this.panelexpand,true);this.panel.visible=false;},openAddress:function(street,suburb,n,e,lat,lon){var icon=new DetailIcon(null,new LayoutFixed(null,'lookup.png',48,48,[SPAN(null,street),SPAN(null,suburb),SPAN(null,'Lat: '+lat.toFixed(5)),SPAN(null,'Lon: '+lon.toFixed(5))]));icon.northing=n;icon.easting=e;this.scm.addIcon(icon);this.scm.centerAt(icon.northing,icon.easting);},__place__:function(x,y,w,h){Control.__place__.call(this,x,y,w,h);DOM.place(this.panel,this._w-this.panelPos-105,0,105+220,this._h);DOM.place(this.scm,0,0,this._w-this.panelPos,this._h);var pos=DOM.getPos(this.__parentelement__);this.scm.viewport.updateOffset(pos.x,pos.y);}});function setregion(evt,region){Cookie.set("viewregion",region);var pos=regions[region];map.scm.centerAt(pos.n,pos.e);map.updater.poll();return Event.stop(evt);}
function loginvalidate(parms){return parms;}
function loginsubmitted(data){ret=eval(data);if(ret[0]){if(ret[3]==-1)
window.location='/admin.html';else{winMenu=window.open("/personal.html","tstmenu",'toolbar=0,scrollbars=1,location=0,statusbar=1,menubar=0,resizable=1,width=450,height=490');DOM.setTxt($('loggedInName'),'Hi '+ret[1]+' '+ret[2]+',');DOM.show($('loggedInDiv'));DOM.hide($('loggedOutDiv'));}}
else
DOM.setTxt($('submitstatus'),ret[1]);}
function logout(evt){if(window.winMenu){winMenu.close();winMenu=null;}}
function openmenu(evt){winMenu=window.open("/personal.html","tstmenu",'toolbar=0,scrollbars=1,location=0,statusbar=1,menubar=0,resizable=1,width=450,height=490');return Event.stop(evt);}
function init(){if(document.forms['login']){loginForm=new Form('login','dologin',undefined,$('submitstatus'));loginForm.validate=loginvalidate;loginForm.submitted=loginsubmitted;}
if($('dologout'))
Event.observe($('dologout'),'click',window,logout);if($('openmenu'))
Event.observe($('openmenu'),'click',window,openmenu);Event.observe($('Image25'),'click',window,function(evt){return setregion(evt,'auckland');});Event.observe($('Image26'),'click',window,function(evt){return setregion(evt,'hamilton');});Event.observe($('Image27'),'click',window,function(evt){return setregion(evt,'tauranga');});Event.observe($('Image28'),'click',window,function(evt){return setregion(evt,'wellington');});Event.observe($('Image29'),'click',window,function(evt){return setregion(evt,'christchurch');});Event.observe($('Image30'),'click',window,function(evt){return setregion(evt,'dunedin');});Event.observe($('fullscreen'),'click',window,function(evt){if(map.fullscreen){DOM.place($('map'),undefined,undefined,880,390);DOM.place(map,undefined,undefined,880,390);if($('banner').scrollIntoView)
$('banner').scrollIntoView(true);map.fullscreen=false;}
else{var size=Util.getWindowSize();DOM.place($('map'),undefined,undefined,880,size.h-30);DOM.place(map,undefined,undefined,880,size.h-30);if($('map').scrollIntoView)
$('map').scrollIntoView(true);map.fullscreen=true;}
return Event.stop(evt);});map=new App($('map'));DOM.place(map,undefined,undefined,880,390);}
function init(){if(document.forms['login']){loginForm=new Form('login','dologin',undefined,$('submitstatus'));loginForm.validate=loginvalidate;loginForm.submitted=loginsubmitted;}
if($('dologout'))
Event.observe($('dologout'),'click',window,logout);if($('openmenu'))
Event.observe($('openmenu'),'click',window,openmenu);Event.observe($('Image25'),'click',window,function(evt){return setregion(evt,'auckland');});Event.observe($('Image26'),'click',window,function(evt){return setregion(evt,'hamilton');});Event.observe($('Image27'),'click',window,function(evt){return setregion(evt,'tauranga');});Event.observe($('Image28'),'click',window,function(evt){return setregion(evt,'wellington');});Event.observe($('Image29'),'click',window,function(evt){return setregion(evt,'christchurch');});Event.observe($('Image30'),'click',window,function(evt){return setregion(evt,'dunedin');});Event.observe($('fullscreen'),'click',window,function(evt){if(map.fullscreen){DOM.place($('map'),undefined,undefined,880,390);DOM.place(map,undefined,undefined,880,390);if($('banner').scrollIntoView)
$('banner').scrollIntoView(true);map.fullscreen=false;}
else{var size=Util.getWindowSize();DOM.place($('map'),undefined,undefined,880,size.h-30);DOM.place(map,undefined,undefined,880,size.h-30);if($('map').scrollIntoView)
$('map').scrollIntoView(true);map.fullscreen=true;}
return Event.stop(evt);});map=new App($('map'));DOM.place(map,undefined,undefined,880,390);}