function MarkerManager(map,opt_opts){var me=this;me.map_=map;me.mapZoom_=map.getZoom();me.projection_=map.getCurrentMapType().getProjection();opt_opts=opt_opts||{};me.tileSize_=MarkerManager.DEFAULT_TILE_SIZE_;var mapTypes=map.getMapTypes();var mapMaxZoom=mapTypes[0].getMaximumResolution();for(var i=0;i<mapTypes.length;i++){var mapTypeMaxZoom=mapTypes[i].getMaximumResolution();if(mapTypeMaxZoom>mapMaxZoom){mapMaxZoom=mapTypeMaxZoom;}}
me.maxZoom_=opt_opts.maxZoom||mapMaxZoom;me.trackMarkers_=opt_opts.trackMarkers;me.show_=opt_opts.show||true;var padding;if(typeof opt_opts.borderPadding==="number"){padding=opt_opts.borderPadding;}else{padding=MarkerManager.DEFAULT_BORDER_PADDING_;}
me.swPadding_=new GSize(-padding,padding);me.nePadding_=new GSize(padding,-padding);me.borderPadding_=padding;me.gridWidth_=[];me.grid_=[];me.grid_[me.maxZoom_]=[];me.numMarkers_=[];me.numMarkers_[me.maxZoom_]=0;GEvent.bind(map,"moveend",me,me.onMapMoveEnd_);me.removeOverlay_=function(marker){map.removeOverlay(marker);me.shownMarkers_--;};me.addOverlay_=function(marker){if(me.show_){map.addOverlay(marker);me.shownMarkers_++;}};me.resetManager_();me.shownMarkers_=0;me.shownBounds_=me.getMapGridBounds_();}
MarkerManager.DEFAULT_TILE_SIZE_=1024;MarkerManager.DEFAULT_BORDER_PADDING_=100;MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE=256;MarkerManager.prototype.resetManager_=function(){var me=this;var mapWidth=MarkerManager.MERCATOR_ZOOM_LEVEL_ZERO_RANGE;for(var zoom=0;zoom<=me.maxZoom_;++zoom){me.grid_[zoom]=[];me.numMarkers_[zoom]=0;me.gridWidth_[zoom]=Math.ceil(mapWidth/me.tileSize_);mapWidth<<=1;}};MarkerManager.prototype.clearMarkers=function(){var me=this;me.processAll_(me.shownBounds_,me.removeOverlay_);me.resetManager_();};MarkerManager.prototype.getTilePoint_=function(latlng,zoom,padding){var pixelPoint=this.projection_.fromLatLngToPixel(latlng,zoom);return new GPoint(Math.floor((pixelPoint.x+padding.width)/this.tileSize_),Math.floor((pixelPoint.y+padding.height)/this.tileSize_));};MarkerManager.prototype.addMarkerBatch_=function(marker,minZoom,maxZoom){var mPoint=marker.getPoint();marker.MarkerManager_minZoom=minZoom;if(this.trackMarkers_){GEvent.bind(marker,"changed",this,this.onMarkerMoved_);}
var gridPoint=this.getTilePoint_(mPoint,maxZoom,GSize.ZERO);for(var zoom=maxZoom;zoom>=minZoom;zoom--){var cell=this.getGridCellCreate_(gridPoint.x,gridPoint.y,zoom);cell.push(marker);gridPoint.x=gridPoint.x>>1;gridPoint.y=gridPoint.y>>1;}};MarkerManager.prototype.isGridPointVisible_=function(point){var me=this;var vertical=me.shownBounds_.minY<=point.y&&point.y<=me.shownBounds_.maxY;var minX=me.shownBounds_.minX;var horizontal=minX<=point.x&&point.x<=me.shownBounds_.maxX;if(!horizontal&&minX<0){var width=me.gridWidth_[me.shownBounds_.z];horizontal=minX+width<=point.x&&point.x<=width-1;}
return vertical&&horizontal;};MarkerManager.prototype.onMarkerMoved_=function(marker,oldPoint,newPoint){var me=this;var zoom=me.maxZoom_;var changed=false;var oldGrid=me.getTilePoint_(oldPoint,zoom,GSize.ZERO);var newGrid=me.getTilePoint_(newPoint,zoom,GSize.ZERO);while(zoom>=0&&(oldGrid.x!==newGrid.x||oldGrid.y!==newGrid.y)){var cell=me.getGridCellNoCreate_(oldGrid.x,oldGrid.y,zoom);if(cell){if(me.removeFromArray_(cell,marker)){me.getGridCellCreate_(newGrid.x,newGrid.y,zoom).push(marker);}}
if(zoom===me.mapZoom_){if(me.isGridPointVisible_(oldGrid)){if(!me.isGridPointVisible_(newGrid)){me.removeOverlay_(marker);changed=true;}}else{if(me.isGridPointVisible_(newGrid)){me.addOverlay_(marker);changed=true;}}}
oldGrid.x=oldGrid.x>>1;oldGrid.y=oldGrid.y>>1;newGrid.x=newGrid.x>>1;newGrid.y=newGrid.y>>1;--zoom;}
if(changed){me.notifyListeners_();}};MarkerManager.prototype.removeMarker=function(marker){var me=this;var zoom=me.maxZoom_;var changed=false;var point=marker.getPoint();var grid=me.getTilePoint_(point,zoom,GSize.ZERO);while(zoom>=0){var cell=me.getGridCellNoCreate_(grid.x,grid.y,zoom);if(cell){me.removeFromArray_(cell,marker);}
if(zoom===me.mapZoom_){if(me.isGridPointVisible_(grid)){me.removeOverlay_(marker);changed=true;}}
grid.x=grid.x>>1;grid.y=grid.y>>1;--zoom;}
if(changed){me.notifyListeners_();}
me.numMarkers_[marker.MarkerManager_minZoom]--;};MarkerManager.prototype.addMarkers=function(markers,minZoom,opt_maxZoom){var maxZoom=this.getOptMaxZoom_(opt_maxZoom);for(var i=markers.length-1;i>=0;i--){this.addMarkerBatch_(markers[i],minZoom,maxZoom);}
this.numMarkers_[minZoom]+=markers.length;};MarkerManager.prototype.getOptMaxZoom_=function(opt_maxZoom){return opt_maxZoom||this.maxZoom_;};MarkerManager.prototype.getMarkerCount=function(zoom){var total=0;for(var z=0;z<=zoom;z++){total+=this.numMarkers_[z];}
return total;};MarkerManager.prototype.getMarker=function(lat,lng,zoom){var me=this;var mPoint=new GLatLng(lat,lng);var gridPoint=me.getTilePoint_(mPoint,zoom,GSize.ZERO);var marker=new GMarker(mPoint);var cellArray=me.getGridCellNoCreate_(gridPoint.x,gridPoint.y,zoom);if(cellArray!=undefined){for(var i=0;i<cellArray.length;i++)
{if(lat==cellArray[i].getLatLng().lat()&&lng==cellArray[i].getLatLng().lng())
{marker=cellArray[i];}}}
return marker;};MarkerManager.prototype.addMarker=function(marker,minZoom,opt_maxZoom){var me=this;var maxZoom=this.getOptMaxZoom_(opt_maxZoom);me.addMarkerBatch_(marker,minZoom,maxZoom);var gridPoint=me.getTilePoint_(marker.getPoint(),me.mapZoom_,GSize.ZERO);if(me.isGridPointVisible_(gridPoint)&&minZoom<=me.shownBounds_.z&&me.shownBounds_.z<=maxZoom){me.addOverlay_(marker);me.notifyListeners_();}
this.numMarkers_[minZoom]++;};GBounds.prototype.containsPoint=function(point){var outer=this;return(outer.minX<=point.x&&outer.maxX>=point.x&&outer.minY<=point.y&&outer.maxY>=point.y);};MarkerManager.prototype.getGridCellCreate_=function(x,y,z){var grid=this.grid_[z];if(x<0){x+=this.gridWidth_[z];}
var gridCol=grid[x];if(!gridCol){gridCol=grid[x]=[];return(gridCol[y]=[]);}
var gridCell=gridCol[y];if(!gridCell){return(gridCol[y]=[]);}
return gridCell;};MarkerManager.prototype.getGridCellNoCreate_=function(x,y,z){var grid=this.grid_[z];if(x<0){x+=this.gridWidth_[z];}
var gridCol=grid[x];return gridCol?gridCol[y]:undefined;};MarkerManager.prototype.getGridBounds_=function(bounds,zoom,swPadding,nePadding){zoom=Math.min(zoom,this.maxZoom_);var bl=bounds.getSouthWest();var tr=bounds.getNorthEast();var sw=this.getTilePoint_(bl,zoom,swPadding);var ne=this.getTilePoint_(tr,zoom,nePadding);var gw=this.gridWidth_[zoom];if(tr.lng()<bl.lng()||ne.x<sw.x){sw.x-=gw;}
if(ne.x-sw.x+1>=gw){sw.x=0;ne.x=gw-1;}
var gridBounds=new GBounds([sw,ne]);gridBounds.z=zoom;return gridBounds;};MarkerManager.prototype.getMapGridBounds_=function(){var me=this;return me.getGridBounds_(me.map_.getBounds(),me.mapZoom_,me.swPadding_,me.nePadding_);};MarkerManager.prototype.onMapMoveEnd_=function(){var me=this;me.objectSetTimeout_(this,this.updateMarkers_,0);};MarkerManager.prototype.objectSetTimeout_=function(object,command,milliseconds){return window.setTimeout(function(){command.call(object);},milliseconds);};MarkerManager.prototype.visible=function(){return this.show_?true:false;};MarkerManager.prototype.isHidden=function(){return!this.show_;};MarkerManager.prototype.show=function(){this.show_=true;this.refresh();};MarkerManager.prototype.hide=function(){this.show_=false;this.refresh();};MarkerManager.prototype.toggle=function(){this.show_=!this.show_;this.refresh();};MarkerManager.prototype.refresh=function(){var me=this;if(me.shownMarkers_>0){me.processAll_(me.shownBounds_,me.removeOverlay_);}
if(me.show_){me.processAll_(me.shownBounds_,me.addOverlay_);}
me.notifyListeners_();};MarkerManager.prototype.updateMarkers_=function(){var me=this;me.mapZoom_=this.map_.getZoom();var newBounds=me.getMapGridBounds_();if(newBounds.equals(me.shownBounds_)&&newBounds.z===me.shownBounds_.z){return;}
if(newBounds.z!==me.shownBounds_.z){me.processAll_(me.shownBounds_,me.removeOverlay_);if(me.show_){me.processAll_(newBounds,me.addOverlay_);}}else{me.rectangleDiff_(me.shownBounds_,newBounds,me.removeCellMarkers_);if(me.show_){me.rectangleDiff_(newBounds,me.shownBounds_,me.addCellMarkers_);}}
me.shownBounds_=newBounds;me.notifyListeners_();};MarkerManager.prototype.notifyListeners_=function(){GEvent.trigger(this,"changed",this.shownBounds_,this.shownMarkers_);};MarkerManager.prototype.processAll_=function(bounds,callback){for(var x=bounds.minX;x<=bounds.maxX;x++){for(var y=bounds.minY;y<=bounds.maxY;y++){this.processCellMarkers_(x,y,bounds.z,callback);}}};MarkerManager.prototype.processCellMarkers_=function(x,y,z,callback){var cell=this.getGridCellNoCreate_(x,y,z);if(cell){for(var i=cell.length-1;i>=0;i--){callback(cell[i]);}}};MarkerManager.prototype.removeCellMarkers_=function(x,y,z){this.processCellMarkers_(x,y,z,this.removeOverlay_);};MarkerManager.prototype.addCellMarkers_=function(x,y,z){this.processCellMarkers_(x,y,z,this.addOverlay_);};MarkerManager.prototype.rectangleDiff_=function(bounds1,bounds2,callback){var me=this;me.rectangleDiffCoords_(bounds1,bounds2,function(x,y){callback.apply(me,[x,y,bounds1.z]);});};MarkerManager.prototype.rectangleDiffCoords_=function(bounds1,bounds2,callback){var minX1=bounds1.minX;var minY1=bounds1.minY;var maxX1=bounds1.maxX;var maxY1=bounds1.maxY;var minX2=bounds2.minX;var minY2=bounds2.minY;var maxX2=bounds2.maxX;var maxY2=bounds2.maxY;var x,y;for(x=minX1;x<=maxX1;x++){for(y=minY1;y<=maxY1&&y<minY2;y++){callback(x,y);}
for(y=Math.max(maxY2+1,minY1);y<=maxY1;y++){callback(x,y);}}
for(y=Math.max(minY1,minY2);y<=Math.min(maxY1,maxY2);y++){for(x=Math.min(maxX1+1,minX2)-1;x>=minX1;x--){callback(x,y);}
for(x=Math.max(minX1,maxX2+1);x<=maxX1;x++){callback(x,y);}}};MarkerManager.prototype.removeFromArray_=function(array,value,opt_notype){var shift=0;for(var i=0;i<array.length;++i){if(array[i]===value||(opt_notype&&array[i]===value)){array.splice(i--,1);shift++;}}
return shift;};MooTools.More={'version':'1.2.3.1'};Fx.Elements=new Class({Extends:Fx.CSS,initialize:function(elements,options){this.elements=this.subject=$$(elements);this.parent(options);},compute:function(from,to,delta){var now={};for(var i in from){var iFrom=from[i],iTo=to[i],iNow=now[i]={};for(var p in iFrom)iNow[p]=this.parent(iFrom[p],iTo[p],delta);}
return now;},set:function(now){for(var i in now){var iNow=now[i];for(var p in iNow)this.render(this.elements[i],p,iNow[p],this.options.unit);}
return this;},start:function(obj){if(!this.check(obj))return this;var from={},to={};for(var i in obj){var iProps=obj[i],iFrom=from[i]={},iTo=to[i]={};for(var p in iProps){var parsed=this.prepare(this.elements[i],p,iProps[p]);iFrom[p]=parsed.from;iTo[p]=parsed.to;}}
return this.parent(from,to);}});var Accordion=Fx.Accordion=new Class({Extends:Fx.Elements,options:{display:0,show:false,height:true,width:false,opacity:true,fixedHeight:false,fixedWidth:false,wait:false,alwaysHide:false,trigger:'click',initialDisplayFx:true},initialize:function(){var params=Array.link(arguments,{'container':Element.type,'options':Object.type,'togglers':$defined,'elements':$defined});this.parent(params.elements,params.options);this.togglers=$$(params.togglers);this.container=document.id(params.container);this.previous=-1;if(this.options.alwaysHide)this.options.wait=true;if($chk(this.options.show)){this.options.display=false;this.previous=this.options.show;}
if(this.options.start){this.options.display=false;this.options.show=false;}
this.effects={};if(this.options.opacity)this.effects.opacity='fullOpacity';if(this.options.width)this.effects.width=this.options.fixedWidth?'fullWidth':'offsetWidth';if(this.options.height)this.effects.height=this.options.fixedHeight?'fullHeight':'scrollHeight';for(var i=0,l=this.togglers.length;i<l;i++)this.addSection(this.togglers[i],this.elements[i]);this.elements.each(function(el,i){if(this.options.show===i){this.fireEvent('active',[this.togglers[i],el]);}else{for(var fx in this.effects)el.setStyle(fx,0);}},this);if($chk(this.options.display))this.display(this.options.display,this.options.initialDisplayFx);},addSection:function(toggler,element){toggler=document.id(toggler);element=document.id(element);var test=this.togglers.contains(toggler);this.togglers.include(toggler);this.elements.include(element);var idx=this.togglers.indexOf(toggler);toggler.addEvent(this.options.trigger,this.display.bind(this,idx));if(this.options.height)element.setStyles({'padding-top':0,'border-top':'none','padding-bottom':0,'border-bottom':'none'});if(this.options.width)element.setStyles({'padding-left':0,'border-left':'none','padding-right':0,'border-right':'none'});element.fullOpacity=1;if(this.options.fixedWidth)element.fullWidth=this.options.fixedWidth;if(this.options.fixedHeight)element.fullHeight=this.options.fixedHeight;element.setStyle('overflow','hidden');if(!test){for(var fx in this.effects)element.setStyle(fx,0);}
return this;},display:function(index,useFx){useFx=$pick(useFx,true);index=($type(index)=='element')?this.elements.indexOf(index):index;if((this.timer&&this.options.wait)||(index===this.previous&&!this.options.alwaysHide))return this;this.previous=index;var obj={};this.elements.each(function(el,i){obj[i]={};var hide=(i!=index)||(this.options.alwaysHide&&(el.offsetHeight>0));this.fireEvent(hide?'background':'active',[this.togglers[i],el]);for(var fx in this.effects)obj[i][fx]=hide?0:el[this.effects[fx]];},this);return useFx?this.start(obj):this.set(obj);}});var Asset={javascript:function(source,properties){properties=$extend({onload:$empty,document:document,check:$lambda(true)},properties);var script=new Element('script',{src:source,type:'text/javascript'});var load=properties.onload.bind(script),check=properties.check,doc=properties.document;delete properties.onload;delete properties.check;delete properties.document;script.addEvents({load:load,readystatechange:function(){if(['loaded','complete'].contains(this.readyState))load();}}).set(properties);if(Browser.Engine.webkit419)var checker=(function(){if(!$try(check))return;$clear(checker);load();}).periodical(50);return script.inject(doc.head);},css:function(source,properties){return new Element('link',$merge({rel:'stylesheet',media:'screen',type:'text/css',href:source},properties)).inject(document.head);},image:function(source,properties){properties=$merge({onload:$empty,onabort:$empty,onerror:$empty},properties);var image=new Image();var element=document.id(image)||new Element('img');['load','abort','error'].each(function(name){var type='on'+name;var event=properties[type];delete properties[type];image[type]=function(){if(!image)return;if(!element.parentNode){element.width=image.width;element.height=image.height;}
image=image.onload=image.onabort=image.onerror=null;event.delay(1,element,element);element.fireEvent(name,element,1);};});image.src=element.src=source;if(image&&image.complete)image.onload.delay(1);return element.set(properties);},images:function(sources,options){options=$merge({onComplete:$empty,onProgress:$empty,onError:$empty,properties:{}},options);sources=$splat(sources);var images=[];var counter=0;return new Elements(sources.map(function(source){return Asset.image(source,$extend(options.properties,{onload:function(){options.onProgress.call(this,counter,sources.indexOf(source));counter++;if(counter==sources.length)options.onComplete();},onerror:function(){options.onError.call(this,counter,sources.indexOf(source));counter++;if(counter==sources.length)options.onComplete();}}));}));}};Fx.Slide=new Class({Extends:Fx,options:{mode:'vertical'},initialize:function(element,options){this.addEvent('complete',function(){this.open=(this.wrapper['offset'+this.layout.capitalize()]!=0);if(this.open&&Browser.Engine.webkit419)this.element.dispose().inject(this.wrapper);},true);this.element=this.subject=document.id(element);this.parent(options);var wrapper=this.element.retrieve('wrapper');this.wrapper=wrapper||new Element('div',{styles:$extend(this.element.getStyles('margin','position'),{overflow:'hidden'})}).wraps(this.element);this.element.store('wrapper',this.wrapper).setStyle('margin',0);this.now=[];this.open=true;},vertical:function(){this.margin='margin-top';this.layout='height';this.offset=this.element.offsetHeight;},horizontal:function(){this.margin='margin-left';this.layout='width';this.offset=this.element.offsetWidth;},set:function(now){this.element.setStyle(this.margin,now[0]);this.wrapper.setStyle(this.layout,now[1]);return this;},compute:function(from,to,delta){return[0,1].map(function(i){return Fx.compute(from[i],to[i],delta);});},start:function(how,mode){if(!this.check(how,mode))return this;this[mode||this.options.mode]();var margin=this.element.getStyle(this.margin).toInt();var layout=this.wrapper.getStyle(this.layout).toInt();var caseIn=[[margin,layout],[0,this.offset]];var caseOut=[[margin,layout],[-this.offset,0]];var start;switch(how){case'in':start=caseIn;break;case'out':start=caseOut;break;case'toggle':start=(layout==0)?caseIn:caseOut;}
return this.parent(start[0],start[1]);},slideIn:function(mode){return this.start('in',mode);},slideOut:function(mode){return this.start('out',mode);},hide:function(mode){this[mode||this.options.mode]();this.open=false;return this.set([-this.offset,0]);},show:function(mode){this[mode||this.options.mode]();this.open=true;return this.set([0,this.offset]);},toggle:function(mode){return this.start('toggle',mode);}});Element.Properties.slide={set:function(options){var slide=this.retrieve('slide');if(slide)slide.cancel();return this.eliminate('slide').store('slide:options',$extend({link:'cancel'},options));},get:function(options){if(options||!this.retrieve('slide')){if(options||!this.retrieve('slide:options'))this.set('slide',options);this.store('slide',new Fx.Slide(this,this.retrieve('slide:options')));}
return this.retrieve('slide');}};Element.implement({slide:function(how,mode){how=how||'toggle';var slide=this.get('slide'),toggle;switch(how){case'hide':slide.hide(mode);break;case'show':slide.show(mode);break;case'toggle':var flag=this.retrieve('slide:flag',slide.open);slide[flag?'slideOut':'slideIn'](mode);this.store('slide:flag',!flag);toggle=true;break;default:slide.start(how,mode);}
if(!toggle)this.eliminate('slide:flag');return this;}});var SimpleTabs=new Class({Implements:[Events,Options],options:{show:0,selector:'.tab-tab',classWrapper:'tab-wrapper',classMenu:'tab-menu',classContainer:'tab-container',onSelect:function(toggle,container,index){toggle.addClass('tab-selected');container.setStyle('display','');},onDeselect:function(toggle,container,index){toggle.removeClass('tab-selected');container.setStyle('display','none');},onRequest:function(toggle,container,index){container.addClass('tab-ajax-loading');},onComplete:function(toggle,container,index){container.removeClass('tab-ajax-loading');},onFailure:function(toggle,container,index){container.removeClass('tab-ajax-loading');},onAdded:Class.empty,getContent:null,ajaxOptions:{},cache:true},initialize:function(element,options){this.element=$(element);this.setOptions(options);this.selected=null;this.build();},build:function(){this.tabs=[];this.menu=new Element('ul',{'class':this.options.classMenu});this.wrapper=new Element('div',{'class':this.options.classWrapper});this.element.getElements(this.options.selector).each(function(el){var content=el.get('href')||(this.options.getContent?this.options.getContent.call(this,el):el.getNext());this.addTab(el.innerHTML,el.title||el.innerHTML,content);},this);this.element.empty().adopt(this.menu,this.wrapper);if(this.tabs.length)this.select(this.options.show);},addTab:function(text,title,content){var grab=$(content);var container=(grab||new Element('div')).setStyle('display','none').addClass(this.options.classContainer).inject(this.wrapper);var pos=this.tabs.length;var evt=(this.options.hover)?'mouseenter':'click';var tab={container:container,toggle:new Element('li').grab(new Element('a',{href:'#',title:title}).grab(new Element('span',{html:text}))).addEvent(evt,this.onClick.bindWithEvent(this,[pos])).inject(this.menu)};if(!grab&&$type(content)=='string')tab.url=content;this.tabs.push(tab);return this.fireEvent('onAdded',[tab.toggle,tab.container,pos]);},onClick:function(evt,index){this.select(index);return false;},select:function(index){if(this.selected===index||!this.tabs[index])return this;if(this.ajax)this.ajax.cancel().removeEvents();var tab=this.tabs[index];var params=[tab.toggle,tab.container,index];if(this.selected!==null){var current=this.tabs[this.selected];if(this.ajax&&this.ajax.running)this.ajax.cancel();params.extend([current.toggle,current.container,this.selected]);this.fireEvent('onDeselect',[current.toggle,current.container,this.selected]);}
this.fireEvent('onSelect',params);if(tab.url&&(!tab.loaded||!this.options.cache)){this.ajax=this.ajax||new Request.HTML();this.ajax.setOptions({url:tab.url,method:'get',update:tab.container,onFailure:this.fireEvent.pass(['onFailure',params],this),onComplete:function(resp){tab.loaded=true;this.fireEvent('onComplete',params);}.bind(this)}).setOptions(this.options.ajaxOptions);this.ajax.send();this.fireEvent('onRequest',params);}
this.selected=index;return this;}});Element.implement({externalize:function(opts){var options={title:true,titleText:'New window'}
$extend(options,opts);this.getElements('a[href^="http://"]').each(function(anchor){var href=anchor.get('href');if(href.contains(window.location.host)){return;}
if(options.title){anchor.titleAppend(options.titleText);}
anchor.addEvent('click',function(e){new Event(e).stop();window.open(href);});});},titleAppend:function(toAppend){var title=this.get('title');this.set('title',[title,toAppend].join(' '));}});var MultiPoly=new Class({initialize:function(map){this.map=map;this.polys=new Hash();this.shown=false;},show:function(){if(this.shown){return;}
this.polys.each(function(poly,key){this.map.addOverlay(key,poly);},this);this.shown=true;},hide:function(){if(!this.shown){return;}
this.polys.each(function(poly,key){this.map.removeOverlay(key);},this);this.shown=false;}});Element.Events.hashchange={onAdd:function(){var hash=self.location.hash;var hashchange=function(){if(hash==self.location.hash)return;else hash=self.location.hash;var value=(hash.indexOf('#')==0?hash.substr(1):hash);window.fireEvent('hashchange',value);document.fireEvent('hashchange',value);};if("onhashchange"in window){window.onhashchange=hashchange;}else{hashchange.periodical(50);}}};var WhsUrl=new Class({Implements:[Events,Options],options:{baseKeynames:['map'],hashKeynames:['site','poi']},initialize:function(url,options){this.setOptions(options);this.parts=new Hash();if($defined(url)){this.setUrl(url);}
this.settingHashOurSelves=false;this.inTransaction=false;window.addEvent('hashchange',function(){if(!this.settingHashOurSelves){this.updateFromHash();this.fireEvent('hashchange');}}.bind(this));},begin:function(){this.inTransaction=true;},commit:function(){var hp=this.getHashPath();hp=hp=='/'?'':'#'+hp;this.inTransaction=false;this.settingHashOurSelves=true;window.location.hash=hp;this.settingHashOurSelves=false;},setUrl:function(url){this.url=url;parse=parseUri(url);this.setPath(parse.path);},setPath:function(path){var key=false;var parts={};path.replace(/^#/,'').split(/\//).filter(function(v){return v!='';}).each(function(v){if(key){parts[key]=v;key=false;}else{key=v;}},this);this.parts=new Hash(parts);},getSiteKey:function(){if(this.parts.has('site')){return DjangoModel.key({model:'map.site',pk:this.parts.get('site')});}},getPoiKey:function(){if(this.parts.has('poi')){return DjangoModel.key({model:'map.locationcontent',pk:this.parts.get('poi')});}},getPath:function(keynames){var bits=[];keynames.each(function(keyname){if(this.parts.has(keyname)){bits.push(keyname);bits.push(this.parts.get(keyname));}},this);return'/'+bits.join('/');},getBasePath:function(){return this.getPath(this.options.baseKeynames);},getHashPath:function(){return this.getPath(this.options.hashKeynames);},setHashKey:function(key,val){if(this.parts.get(key)==val){return;}
this.parts.set(key,val);if(!this.inTransaction){this.commit();}},unsetHashKey:function(key){if(this.parts.has(key)){this.parts.erase(key);window.location.hash='#'+this.getHashPath();if(!this.inTransaction){this.commit();}}},clearHash:function(){this.options.hashKeynames.each(function(keyname){this.parts.erase(keyname);},this);this.commit();},updateFromHash:function(){this.setPath(window.location.hash);}});function parseUri(str){var o=parseUri.options,m=o.parser[o.strictMode?"strict":"loose"].exec(str),uri={},i=14;while(i--)uri[o.key[i]]=m[i]||"";uri[o.q.name]={};uri[o.key[12]].replace(o.q.parser,function($0,$1,$2){if($1)uri[o.q.name][$1]=$2;});return uri;};parseUri.options={strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};var Key=new Class({Implements:[Events,Options],options:{toggleClosedSelector:'div.toggleClosed',toggleOpenSelector:'div.toggleOpen',openClass:'open',closedClass:'closed',openInitially:false},initialize:function(map,container,pane,options){this.setOptions(options);this.map=map;this.container=$(container);this.pane=$(pane);this.isOpen=null;this.filter=new Filter(new Element('ul').inject(this.pane),this.map);this.toggleClosed=this.container.getElement(this.options.toggleClosedSelector);this.toggleOpen=this.container.getElement(this.options.toggleOpenSelector);this.hint=new Fx.Morph(this.toggleClosed,{link:'chain',duration:1500});this.build();},build:function(){if(this.options.openInitially){this.open();}else{this.close();}
this.toggleClosed.addEvent('click',function(){this.open();}.bind(this));this.toggleOpen.addEvent('click',function(){this.close();}.bind(this));},showHint:function(){this.hint.start({'width':17});(function(){this.hint.start({'width':13});}).delay(3000,this);},open:function(){this.container.removeClass(this.options.closedClass);this.container.addClass(this.options.openClass);this.pane.setStyle('display','');this.toggleClosed.setStyle('display','none');this.toggleOpen.setStyle('display','');this.isOpen=true;this.fireEvent('open');},close:function(){this.container.removeClass(this.options.openClass);this.container.addClass(this.options.closedClass);this.pane.setStyle('display','none');this.toggleClosed.setStyle('display','');this.toggleOpen.setStyle('display','none');this.isOpen=false;this.fireEvent('close');}});var Filter=new Class({Implements:[Options],options:{itemElement:'li',itemClass:'layerFilter'},initialize:function(container,map,options){this.setOptions(options);this.container=container;this.map=map;this.layers=map.layers;this.filters=new Hash();this.layers.each(this.addLayer,this);},addLayer:function(layer){if(!layer.locative){return;}
var cat=layer.fields.get('category');if(cat){var key=cat.pk;var icon=cat.fields.icon;}else{var icon=layer.fields.config.fields.icon;var key=layer.key;}
if(this.filters.has(key)){var filter=this.filters.get(key);filter.addLayer(layer);}else{this.addFilter(layer,key,this.map.getIcon(icon));}},addFilter:function(layer,key,icon){var el=new Element(this.options.itemElement).addClass(this.options.itemClass);this.filters.set(key,new LayerFilter(el,key,[layer],icon,{text:layer.getKeyDescription()}));el.inject(this.container);}});var LayerFilter=new Class({Implements:[Events,Options],options:{defaultIcon:G_DEFAULT_ICON,text:'Enable layer',on:true,disabledText:"Not available at this zoom level",disabledClass:'disabled',idPrefix:'layerFilter-'},initialize:function(container,key,layers,icon,options){this.setOptions(options);this.container=$(container);this.key=key;this.layers=[];this.icon=!!icon?icon:this.options.defaultIcon;this.enabled=false;this.built=false;layers.each(this.addLayer.bind(this));this.buildElements();this.addEvents();},addLayer:function(layer){var chk=this.ensureEnabledState.bind(this);layer.addEvent('update',chk);layer.addEvent('activate',chk);layer.addEvent('deactivate',chk);this.layers.push(layer);this.ensureEnabledState();},buildElements:function(){var id=[this.options.idPrefix,this.key].join('');this.checkbox=new Element('input',{type:'checkbox',id:id,checked:this.options.on});this.label=new Element('label',{'for':id,text:this.options.text})
this.disabledInfo=new Element('span',{text:this.options.disabledText});var imageWrapper=new Element('span',{"class":"imgwrapper"});this.image=new Element('img',{'src':this.icon.image}).inject(imageWrapper);this.container.grab(imageWrapper).grab(this.checkbox).grab(this.label).grab(this.disabledInfo);this.built=true;this.ensureEnabledState();},addEvents:function(){this.checkbox.addEvent('click',function(e){if(this.checkbox.get('checked')){this.layers.each(function(layer){layer.unhide();});}else{this.layers.each(function(layer){layer.hide();});}}.bind(this));},disable:function(){this.enabled=false;this.container.addClass(this.options.disabledClass);this.checkbox.set('disabled',true);this.disabledInfo.setStyle('display','');},enable:function(){this.enabled=true;this.container.removeClass(this.options.disabledClass);this.checkbox.set('disabled',false);this.disabledInfo.setStyle('display','none');},ensureEnabledState:function(){if(!this.built){return;}
var enabled=false;this.layers.each(function(layer){enabled=enabled||(layer.zoomWithinRange()&&layer.items&&(layer.items.getLength()>0));});if(enabled&&!this.enabled){this.enable();}
if(!enabled){this.disable();}}});SimpleTabs.implement({unhide:function(idx){var tab=this.tabs[idx];tab.hidden=false;tab.toggle.setStyle('display','');}})
var WhsTabs=new Class({Extends:SimpleTabs,initialize:function(element,options){this.parent(element,options);this.mainTabs=this.tabs.slice();this.siteTabs=[];this.selectedSite=null;},selectSite:function(site){if(this.selectedSite==site){return};if(this.selectedSite){this.element.removeClass(this.selectedSite.slug);}
this.element.addClass(site.slug);this.selectedSite=site;this.hideMainTabs();this.removeSiteTabs();this.siteTabs=[];site.getInfo().each(function(info){this.addSiteTab(info);},this);this.select(this.siteTabs[0]);},reset:function(){if(this.selectedSite){this.element.removeClass(this.selectedSite.slug);}
this.selectedSite=null;this.removeSiteTabs();this.showMainTabs();this.select(0)},showMainTabs:function(){this.mainTabs.each(function(tab,idx){this.showTab(idx);},this);},hideMainTabs:function(){this.mainTabs.each(function(tab,idx){this.hideTab(idx);},this);},removeSiteTabs:function(){this.siteTabs.each(function(idx){this.removeTab(idx);},this);},addSiteTab:function(info){this.addTab(info.name,null,info.details);var lastIdx=this.tabs.length-1;this.siteTabs.push(lastIdx);},hideTab:function(idx){var tab=this.tabs[idx];tab.hidden=true;tab.container.setStyle('display','none');tab.toggle.setStyle('display','none');},showTab:function(idx){var tab=this.tabs[idx];tab.hidden=false;tab.toggle.setStyle('display','');},removeTab:function(idx){var tab=this.tabs[idx];tab.container.destroy();tab.toggle.destroy();}});var IconManager=new Class({initialize:function(map,icondata){this.map=map;this.icondata=icondata;this.dataHash=new Hash();this.icons=new Hash();this.initIcons();},initIcons:function(){this.icondata.each(function(idata){this.dataHash.set(idata.pk,idata);},this);this.icondata.each(function(idata){this.initIcon(idata.pk);},this);},initIcon:function(key){if(this.icons.has(key)){return;}
var idata=this.dataHash.get(key);var copy=G_DEFAULT_ICON;if(idata.fields.parent){this.initIcon(idata.fields.parent);copy=this.icons.get(idata.fields.parent);}
this.icons.set(key,this.createIcon(idata.fields,copy));},createIcon:function(f,copy){copy=$defined(copy)?copy:G_DEFAULT_ICON;var icon=new GIcon(copy,f.foreground_image);icon.iconSize=new GSize(f.foreground_width,f.foreground_height);if(f.shadow_image){icon.shadow=f.shadow_image;icon.shadowSize=new GSize(f.shadow_width,f.shadow_height);}
if(f.icon_anchor_x||f.icon_anchor_y){var x=!!f.icon_anchor_x?f.icon_anchor_x:6;var y=!!f.icon_anchor_y?f.icon_anchor_y:34;icon.iconAnchor=new GPoint(x,y);}
return icon;},getIcon:function(iconName){return this.icons.get(iconName,G_DEFAULT_ICON);}});var DjangoModel=new Class({initialize:function(map,data){this.map=map;this.pk=data.pk;this.key=DjangoModel.key(data);this.model=data.model;this.fields=new Hash(data.fields);},update:function(data){this.fields.extend(data.fields);}});DjangoModel.key=function(data){return[data.model,data.pk].join('-');};var Site=new Class({Extends:DjangoModel,initialize:function(map,data){this.parent(map,data);this.layers=new Hash();this.boundaryFilled=new MultiPoly(this.map);this.boundaryTransparent=new MultiPoly(this.map);this.center=Map.geojson.pointToLatLong(this.fields.default_center);this.defaultZoom=this.fields.default_zoom;this.slug=this.fields.slug;this.boundaryMinZoom=this.fields.boundary_min_zoom;this.boundaryCloseUpZoom=this.fields.boundary_close_up_zoom;this.needsUpdate=false;this.boundaryLoaded=false;},update:function(data){this.parent(data);return;if(!this.boundaryLoaded){this.initPolys();this.checkBoundaryZoom(null,this.map.gmap.getZoom());}},initPolys:function(){var f=this.fields;if(!f.boundary){return;}
var filledPolygons=Map.geojson.multiPolygonToPolygons(f.boundary,f);var oldFillOpacity=f.boundary_fill_opacity;var oldStrokeWeight=f.boundary_stroke_weight;f.boundary_stroke_weight=f.boundary_close_up_stroke_weight;f.boundary_fill_opacity=0;f.boundary_fill_opacity=0;var transPolygons=Map.geojson.multiPolygonToPolygons(f.boundary,f);var filledKeyStem=this.key+'-boundary';var transKeyStem=this.key+'-transboundary';filledPolygons.each(function(poly,idx){this.boundaryFilled.polys.set(filledKeyStem+'-'+idx,poly);},this);transPolygons.each(function(poly,idx){this.boundaryTransparent.polys.set(transKeyStem+'-'+idx,poly);},this);this.boundaryLoaded=true;this.needsUpdate=false;},init:function(){this.map.addEvent('zoomend',this.checkBoundaryZoom.bind(this));this.map.addEvent('moveend',this.checkNeedsUpdate.bind(this));},checkBoundaryZoom:function(bounds,newlevel){if(!this.boundaryLoaded){return;}
if(newlevel<this.boundaryMinZoom){this.setHidden();return;}
if(newlevel>this.boundaryCloseUpZoom){this.setTransparent();return;}
this.setFilled();},checkNeedsUpdate:function(bounds,newlevel){if(newlevel>=this.boundaryMinZoom&&!this.boundaryLoaded){this.needsUpdate=true;}},setHidden:function(){this.boundaryTransparent.hide()
this.boundaryFilled.hide();},setFilled:function(){this.boundaryTransparent.hide()
this.boundaryFilled.show();},setTransparent:function(){this.boundaryFilled.hide();this.boundaryTransparent.show()},addLayer:function(layer){this.layers.set(layer.fields.category.pk,layer);},getMainInfo:function(){if(this.fields.details){var mainContent=this.fields.details;}else if(this.fields.intro){var mainContent=this.fields.intro;}else{var mainContent='<h2>Site details</h2><p>Content will go here</p>';}
return{name:this.fields.name,details:new Element('div',{html:mainContent})};},getInfo:function(){var infos=[this.getMainInfo()];this.layers.each(function(layer,slug){if(!layer.locative&&layer.category&&!layer.empty()){infos.push({'name':layer.category.fields.name,details:layer.infoContent()});}},this);return infos;}});var ContentItem=new Class({Extends:DjangoModel,initialize:function(map,data,layer){this.parent(map,data);this.layer=layer;this.locative=false;}});var LocationContent=new Class({Extends:ContentItem,initialize:function(map,data,layer){this.parent(map,data,layer);this.locative=true;this.marker=null;},getMarker:function(){if(!this.locative){return false;}
if(!this.marker){this.marker=this.createMarker();}
return this.marker;},createMarker:function(icon){icon=$defined(icon)?icon:this.getIcon()
var latlng=Map.geojson.pointToLatLong(this.fields.location);if(!latlng){return false;}
var marker=new GMarker(latlng,{icon:icon,title:this.name});GEvent.addListener(marker,'click',function(){marker.openInfoWindow(this.getIw(),{maxWidth:this.getMaxInfoWindowWidth()});}.bind(this));return marker;},getMaxInfoWindowWidth:function(){if(this.fields.max_info_window_width){return this.fields.max_info_window_width;}
return this.map.fields.max_info_window_width;},getIcon:function(){return this.map.getIcon(this.layer.icon);},getIw:function(){var d=new Element('div').set('html',this.getIwHtml());d.addClass('infoPopup');d.addClass('content');this.layer.classes.each(function(c){d.addClass(c);})
if($defined(d.externalize)){d.externalize();}
return d;},getIwHtml:function(){var display='<h3>'+this.fields.name+'</h3>';if(this.fields.intro){display+=this.fields.intro;}
return display;},highlight:function(){}});var NaptanCategory=new Class({Extends:DjangoModel,initialize:function(map,data){this.parent(map,data);this.icon=this.fields.icon;},isTrain:function(){return this.pk=='RSE'||this.pk=='RLY';},getInfoLinks:function(){var nre='<a href="http://www.nationalrail.co.uk/">National Rail Enquiries</a>';var tl='<a href="http://www.travelinesw.com/">Traveline</a>';if(this.isTrain()){return[nre,tl];}else{return[tl];}}});var NaptanStopPoint=new Class({Extends:LocationContent,initialize:function(map,data,layer){this.parent(map,data,layer);this.category=new NaptanCategory(this.map,this.fields.stop_type);},getIwHtml:function(){var f=this.fields;var display=[f.common_name,f.locality];if(f.direction!='NA'){display.push(f.direction)}
display.push(this.getLinks());return['<p>',display.join(' '),'</p>'].join('');},getLinks:function(){var links=this.category.getInfoLinks();if(this.fields.naptan_code){links.push(['<a href="http://www.mytraveline.mobi/departureboard?stopCode=',this.fields.naptan_code,'">View bus time information</a>',].join(''));}
if(this.fields.is_south_west_trains){links.push('<a href="http://www.southwesttrains.co.uk/">South West Trains</a>');}
return['<ul class="links"><li>',links.join("</li><li>"),'</li></ul>'].join('');}})
var NaptanContent=new Class({Extends:LocationContent,initialize:function(map,data,layer){this.parent(map,data,layer);this.stopPoint=new NaptanStopPoint(map,data.fields.stop_point,layer);this.marker=this.stopPoint.createMarker(this.getIcon());},getIcon:function(){return this.map.getIcon(this.stopPoint.category.icon);}});var GtbsMember=new Class({Extends:LocationContent,getIwHtml:function(){var f=this.fields;var display=[f.name,f.type,f.area];if(f.website){var link=[' <a href="',f.website,'">',f.website,'</a>'];display.push(link.join(''))}
return['<p>',display.join(' '),'</p>'].join('');}});var PolylineItem=new Class({Extends:LocationContent,getPolylines:function(){return Map.geojson.multiLineToPolylines(this.getPolylineData(),this.getPolylineOptions());}});var NationalTrail=new Class({Extends:PolylineItem,getPolylineOptions:function(){return this.fields;},getPolylineData:function(){return this.fields.polyline;}});var SustransRoute=new Class({Extends:PolylineItem,getPolylineOptions:function(){return this.fields.route_type.fields;},getPolylineData:function(){return this.fields.polylines;},getIwHtml:function(){var display=[['<h3>','Cycle route: ',this.fields.route_type.fields.name,'</h3>'].join('')];if(this.fields.name){display.push(['<p>',this.fields.name,'</p>'].join(''));}
if(this.fields.characteristic){var c=this.fields.characteristic;display.push(['<p>',c.fields.type,' - ',c.fields.name,'</p>'].join(''));}
display.push('<p><a href="http://www.sustrans.org.uk/">Sustrans website</a></p>');return display.join('');}});var BusRoute=new Class({Extends:SustransRoute,getPolylineOptions:function(){return this.fields;},getIwHtml:function(){var display=[['<h3>','Bus route: ',this.fields.name,'</h3>'].join('')];if(this.fields.intro){display.push(['<div>',this.fields.intro,'</div>'].join(''));}
display.push('<p><a href="http://www.travelinesw.com">Traveline</a></p>');return display.join('');}});var SelectorAccordion=new Class({Extends:Accordion,options:{toggleSelector:'h2',elementSelector:'div.poiListWrapper'},initialize:function(container,options){this.setOptions(options);this.siteIdMap=new Hash();container=$(container);toggles=container.getElements(this.options.toggleSelector);toggles.each(function(toggler,idx){var url=new WhsUrl(toggler.getElement('a').get('href'));var siteId=url.parts.get('site');this.siteIdMap.set(siteId,idx);},this);elements=container.getElements(this.options.elementSelector);this.parent(toggles,elements,container,options);},display:function(index,useFx){useFx=$pick(useFx,true);index=($type(index)=='element')?this.elements.indexOf(index):index;if((this.timer&&this.options.wait)||(index===this.previous&&!this.options.alwaysHide))return this;var lastIndex=this.previous;this.previous=index;var obj={};this.elements.each(function(el,i){obj[i]={};var hide=(i!=index)||(this.options.alwaysHide&&(el.offsetHeight>0));if(i==lastIndex){this.fireEvent('background',[this.togglers[i],el]);}
if(i==index){this.fireEvent('active',[this.togglers[i],el]);}
for(var fx in this.effects)obj[i][fx]=hide?0:el[this.effects[fx]];},this);return useFx?this.start(obj):this.set(obj);},displaySite:function(siteId){var idx=this.siteIdMap.get(siteId);if(idx==this.previous){return;}
this.display(idx);},getSiteKey:function(toggler){var url=new WhsUrl(toggler.getElement('a').get('href'));var siteId=url.parts.get('site');return DjangoModel.key({model:'map.site',pk:siteId});}});var Messages=new Class({Implements:[Events,Options],options:{clear:false,windowClass:'messageWindow'},initialize:function(container,options){this.setOptions(options);this.container=$(container);this.messageWindow=new Element('div',{'class':this.options.windowClass});this.messageWindow.inject(this.container);this.messages=[];},message:function(textOrHtml,classname){classname=$defined(classname)?classname:'info';this.messages.push([textOrHtml,classname]);if(this.options.clear){this.messageWindow.empty();}
new Element('p',{'html':textOrHtml,'class':classname}).inject(this.messageWindow,'top');}});var PoiEvent=new Class({initialize:function(evt,map){this.event=evt;this.toggleLink=false;var el=$(this.event.target);if(el.hasClass('toggleLink')||el.getParent().hasClass('toggleLink')){this.toggleLink=true;return;}
if(!el.hasClass('poiLink')){this.poiEvent=false;return;}
this.poiEvent=true;this.id=new WhsUrl(el.get('href')).parts.poi;this.key=DjangoModel.key({model:'map.locationcontent',pk:this.id});this.item=map.items.get(this.key);}});var Layer=new Class({Extends:DjangoModel,Implements:[Events],initialize:function(map,data){this.parent(map,data);this.items=new Hash();this.markers=new Hash();this.active=false;this.hidden=false;this.built=false;this.bounds=this.map.gmap.getBounds();this.zoom=this.map.gmap.getZoom();this.needsUpdate=false;this.classes=[];this.locativeTypes=["sustrans_routes","naptan_category","gtbs_members","point_content","naptan_content","bus_routes","national_trails"];this.name=this.fields.name;this.locative=this.locativeTypes.contains(this.fields.type);if(!this.locative&&this.fields.has('category')){this.locative=this.locativeTypes.contains(this.fields.category.fields.type);}
var siteId=this.fields.get('site');this.hasSite=!!siteId;this.category=null;if(this.fields.has('category')){this.category=this.fields.get('category');}
this.minZoom=this.fields.config.fields.min_zoom;this.maxZoom=this.fields.config.fields.max_zoom;this.itemZoom=this.fields.config.fields.item_zoom;this.icon=this.fields.config.fields.icon?this.fields.config.fields.icon:this.fields.icon;},build:function(){this.initClasses();this.buildItems();this.addOverlays();this.addMapEvents();},empty:function(){return this.items.getLength()==0;},update:function(data){this.parent(data);this.buildItems();if(!this.locative)return;if(this.zoomWithinRange()){this.addOverlays();}
this.fireEvent('update',[this]);},buildItems:function(){if(!this.fields.has('items')){return;}
this.fields.items.each(function(item){var content=new Map.modelCtors[item.model](this.map,item,this);this.items.set(content.key,content);},this);this.built=true;},addOverlays:function(){},showOverlays:function(){},hideOverlays:function(){},addMapEvents:function(){this.map.addEvent('change',function(bounds,zoomLevel){if(this.hidden){return;}
var inRange=this.zoomWithinRange(zoomLevel);if(this.active&&!inRange){this.deactivate();}else if(!this.active&&inRange){this.activate();}
this.calcNeedsUpdate(bounds,inRange);}.bind(this));},calcNeedsUpdate:function(bounds,inRange){if(this.fields.type=='site_category'||!inRange){return;}
if(!this.bounds.containsBounds(bounds)){this.needsUpdate=true;this.bounds=bounds;}
if(!this.built&&inRange){this.needsUpdate=true;}},getSiteKey:function(){var siteId=this.fields.get('site_id');return DjangoModel.key({model:'map_site',pk:siteId});},activate:function(){if(this.hidden){return false;}
this.active=true;this.showOverlays();this.fireEvent('activate',[this]);},deactivate:function(){this.active=false;this.hideOverlays();this.fireEvent('deactivate',[this]);},hide:function(){this.hidden=true;this.deactivate();this.fireEvent('hide',[this]);},unhide:function(){this.hidden=false;this.activate();this.fireEvent('unhide',[this]);},zoomWithinRange:function(zoomLevel){zoomLevel=$defined(zoomLevel)?zoomLevel:this.map.gmap.getZoom();return zoomLevel<=this.maxZoom&&zoomLevel>=this.minZoom;},infoContent:function(){var elements=[];this.items.each(function(item){elements.push(new Element('div').grab(new Element('h3',{'html':item.fields.name})).grab(new Element('div',{'html':item.fields.intro})))});var el=new Element('div').adopt(elements);return el;},getKeyDescription:function(){var cat=this.fields.get('category')
if(!!cat){return this.fields.category.fields.name;}else{return this.fields.description;}},initClasses:function(){if(this.hasSite){this.classes.push(this.map.getSite(this.fields.site).fields.slug);}
if(this.category){this.classes.push(this.category.pk);}}});var MarkerLayer=new Class({Extends:Layer,initialize:function(map,data){this.parent(map,data);this.manager=new MarkerManager(this.map.gmap);this.build();},addOverlays:function(){this.items.each(function(item){if(!item.locative||this.markers.has(item.key)){return;}
var marker=item.getMarker();if(marker){this.map.items.set(item.key,item);this.markers.set(item.key,marker);this.manager.addMarker(marker,this.minZoom);}},this);},showOverlays:function(){if(this.manager&&this.manager.isHidden()){this.manager.show();}},hideOverlays:function(){if(this.manager&&!this.manager.isHidden()){this.manager.hide();}}});var PolylineLayer=new Class({Extends:Layer,initialize:function(map,data){this.parent(map,data);this.polylines=new Hash();this.build();this.polylinesBuilt=false;this.bounds=null;},addOverlays:function(){if(!this.zoomWithinRange()||this.polylinesBuilt||this.items.getLength()==0){return;}
this.items.each(function(item){item.getPolylines().each(function(poly,idx){var key=[item.key,idx].join('-');if(this.polylines.has(key)){return;}
this.polylines.set(key,poly);this.map.addOverlay(key,poly);GEvent.addListener(poly,'click',function(latlng){this.map.gmap.openInfoWindow(latlng,item.getIw())}.bind(this))},this);},this);this.needsUpdate=false;},showOverlays:function(){this.addOverlays();this.polylines.each(function(poly){if(poly.isHidden()){poly.show();}});},hideOverlays:function(){this.polylines.each(function(poly){if(!poly.isHidden()){poly.hide();}});},calcNeedsUpdate:function(bounds,inRange){if(!inRange){this.bounds=null;return;}
if(!this.bounds||!this.bounds.containsBounds(bounds)){this.needsUpdate=true;this.bounds=bounds;}},checkVisibility:function(){var mapBounds=this.map.getBounds();this.polylines.each(function(poly){var polyBounds=poly.getBounds();if(mapBounds.intersects(polyBounds)){poly.hide();}else{poly.show();}},this);}});var Map=new Class({Implements:[Events,Options],options:{keyWrapper:'keyWrapper',keyDiv:'key',poiDiv:'poi',infoDiv:'info',keyClosedWidth:731,keyOpenWidth:461},initialize:function(map,options,initialData){this.setOptions(options);this.map=$(map);this.poi=null;this.gmap=null;this.urls=null;this.setup=false;this.layers=new Hash();this.center=null;this.overlays=new Hash();this.sites=new Hash();this.items=new Hash();this.iconManager=null;this.mapInitialized=false;this.sitesInitialized=false;this.layersInitialized=false;this.iconsInitialized=false;this.userSetMapType=false;this.initialMapType=null;this.closeUpMapType=null;this.closeUpZoomTrigger=null;this.userMapTypeChangeHandle=null;this.hashPresent=false;this.selectedSite=null;if($defined(initialData)){this.fields=new Hash(initialData.fields);}
this.initUrls();this.fetch();this.initHashState();if($defined(initialData)){this.initGmap();}
this.initPoi();this.initTabs();window.addEvent('unload',function(){GUnload()});},initUrls:function(){var loc=window.location;if(loc.pathname=='/'){var initialPath='/map/json/';var updatePath='/map/jsonupdate/';var basePath='/';}else{var els=loc.pathname.split(/\//);this.mapId=parseInt(els[1]);var basePath='/map/'+this.mapId+'/';var initialPath=basePath+'json';var updatePath=basePath+'jsonupdate';}
this.urls={base:[loc.protocol,'//',loc.host,basePath].join(''),initial:[loc.protocol,'//',loc.host,initialPath].join(''),update:[loc.protocol,'//',loc.host,updatePath].join('')};},initHashState:function(){this.hashPresent=!!window.location.hash;this.stateUrl=new WhsUrl();if(!this.hashPresent){return;}
this.stateUrl.setPath(window.location.hash);this.stateUrl.addEvent('hashchange',this.updateStateFromUrl.bind(this));},initGmap:function(){var mf=this.fields;this.gmap=new GMap2(this.map);this.initialMapType=eval(mf.initial_map_type);this.closeUpMapType=eval(mf.closeup_map_type);this.closeUpZoomTrigger=mf.closeup_zoom_trigger;var ui=this.gmap.getDefaultUI();ui.keyboard=mf.add_keyboard_handler;ui.zoom.scrollwheel=mf.enable_scroll_wheel_zoom;ui.zoom.doubleclick=mf.enable_doubleclick_zoom;ui.maptypes.normal=mf.show_normal_map;ui.maptypes.satellite=mf.show_satellite_map;ui.maptypes.hybrid=mf.show_hybrid_map;ui.maptypes.physical=mf.show_physical_map;ui.controls.largemapcontrol3d=false;ui.controls.scalecontrol=true;this.gmap.setUI(ui);var leftControlOffset=new GControlPosition(G_ANCHOR_TOP_LEFT,new GSize(20,10));this.gmap.addControl(new GLargeMapControl3D(),leftControlOffset);this.gmap.setMapType(this.initialMapType);var center=Map.geojson.pointToLatLong(mf.default_center);this.gmap.setCenter(center,mf.default_zoom);this.manager=new MarkerManager(this.gmap);this.mapInitialized=true;this.gmap.savePosition();this.addUserMapTypeChangeEvent();this.initSiteTiles();},initSiteTiles:function(){var copyright=new GCopyright(1,new GLatLngBounds(new GLatLng(-90,-180),new GLatLng(90,180)),0," ");var copyrightCollection=new GCopyrightCollection('Chart');copyrightCollection.addCopyright(copyright);var tilelayer=new GTileLayer(copyrightCollection);tilelayer.getTileUrl=function(a,z){var url='/map/tiles/'+z+'/'+a.x+'/'+a.y+'.png';return url;}
tilelayer.isPng=function(){return true;};tilelayer.getOpacity=function(){return 1;};tilelayer.minResolution=function(){return 10;};tilelayer.maxResolution=function(){return 18;};var overlay=new GTileLayerOverlay(tilelayer);this.gmap.addOverlay(overlay);},addMapEvents:function(){GEvent.addListener(this.gmap,'zoomend',function(oldLevel,newLevel){var bounds=this.gmap.getBounds();this.fireEvent('zoomend',[bounds,newLevel]);this.fireEvent('change',[bounds,newLevel]);this.setEnsureMapTypeTimeOut();this.updateIfRequired();}.bind(this));GEvent.addListener(this.gmap,'moveend',function(){var args=[this.gmap.getBounds(),this.gmap.getZoom()];this.fireEvent('moveend',args);this.fireEvent('change',args);this.updateIfRequired();}.bind(this));},addUserMapTypeChangeEvent:function(){this.userMapTypeChangeHandle=GEvent.addListener(this.gmap,'maptypechanged',function(){this.userSetMapType=true;}.bind(this));},setEnsureMapTypeTimeOut:function(){if(this.ensureMapTypeTimeout){$clear(this.ensureMapTypeTimeout);}
this.ensureMapTypeTimeout=this.ensureMapType.delay(300,this);},ensureMapType:function(){if(this.userSetMapType){return;}
this.isCloseUp=this.gmap.getZoom()>=this.closeUpZoomTrigger;var currentType=this.gmap.getCurrentMapType();if(this.isCloseUp&&currentType!=this.closeUpMapType){this.setMapType(this.closeUpMapType);}
if(!this.isCloseUp&&currentType!=this.initialMapType){this.setMapType(this.initialMapType);}},setMapType:function(mapType){if(this.userMapTypeChangeHandle){GEvent.removeListener(this.userMapTypeChangeHandle);}
this.gmap.setMapType(mapType);this.addUserMapTypeChangeEvent();},updateIfRequired:function(){var layerIds=[];this.layers.each(function(layer){if(layer.needsUpdate){layerIds.push(layer.pk);}});var siteIds=[];this.sites.each(function(site){if(site.needsUpdate){siteIds.push(site.pk);}});var params={};var fetch=false;if(layerIds.length>0){fetch=true;params.layers=layerIds.join(',');}
if(siteIds.length>0){fetch=true;params.sites=siteIds.join(',');}
this.fetch(params);},initPoi:function(){this.poi=new SelectorAccordion(this.options.poiDiv,{elementSelector:'div.poiSlider',display:-1,alwaysHide:false,duration:200,opacity:false});this.poi.togglers.each(function(toggler){toggler.addEvent('click',function(e){if(toggler.hasClass('active')){var siteKey=this.poi.getSiteKey(toggler);this.selectSite(siteKey);new Event(e).stop();}}.bind(this));},this);this.poi.addEvents({active:function(toggler,element){var url=new WhsUrl(toggler.getElement('a').get('href'));var siteId=url.parts.get('site');var siteKey=DjangoModel.key({model:'map.site',pk:siteId});toggler.addClass('active').getParent().addClass('active');var siteSelect=function(){this.selectSite(siteKey);this.poi.removeEvent('complete',siteSelect);}.bind(this);this.poi.addEvent('complete',siteSelect);}.bind(this),background:function(toggler,element){toggler.removeClass('active').getParent().removeClass('active');}.bind(this)});this.poi.container.addEvents({click:function(e){var evt=new PoiEvent(new Event(e),this);if(evt.toggleLink){evt.event.stop();return;}
if(!evt.poiEvent){return;}
evt.event.stop();this.selectPoi(evt.key);}.bind(this),mouseover:function(e){var evt=new PoiEvent(new Event(e),this);if(!evt.poiEvent){return;}
evt.item.highlight();}.bind(this)});this.fireEvent('poiInit',[this.poi]);},initTabs:function(){this.info=new WhsTabs(this.options.infoDiv,{selector:'h2.tabHeading'});},selectSite:function(key){var site=this.sites.get(key);var center=site.center;this.gmap.setCenter(center,site.defaultZoom);this.info.selectSite(site);if(this.selectedSite!=key){this.poi.displaySite(site.pk);this.stateUrl.begin();this.stateUrl.setHashKey('site',site.pk);this.stateUrl.unsetHashKey('poi');this.stateUrl.commit();}
this.selectedSite=key;},selectPoi:function(key){var item=this.items.get(key);if(this.gmap.getZoom()!=item.layer.itemZoom){this.gmap.setCenter(item.marker.center,item.layer.itemZoom);(function(){GEvent.trigger(item.marker,'click');}).delay(200);}else{GEvent.trigger(item.marker,'click');}
this.stateUrl.setHashKey('poi',item.pk);},reset:function(){this.info.reset();this.selectedSite=null;this.poi.display(-1);this.gmap.returnToSavedPosition();this.stateUrl.clearHash();},initKey:function(){this.key=new Key(this,this.options.keyWrapper,this.options.keyDiv);var centerDelta=this.options.keyClosedWidth-this.options.keyOpenWidth;this.key.addEvents({open:function(){var newCenter=this.getNewCenter(centerDelta);this.map.getParent().getParent().addClass('open');this.gmap.setCenter(newCenter);}.bind(this),close:function(){var newCenter=this.getNewCenter(-centerDelta);this.map.getParent().getParent().removeClass('open');this.gmap.setCenter(newCenter);}.bind(this)});this.fireEvent('keyInit',[this.key]);},getNewCenter:function(delta){var gm=this.gmap;var zoom=gm.getZoom();var pt=gm.fromLatLngToContainerPixel(gm.getCenter(),zoom);var newpt=new GPoint(pt.x+delta,pt.y);return gm.fromContainerPixelToLatLng(newpt,zoom);},fetch:function(params){if(!this.sitesInitialized){this.initialReq=new Request.JSON({url:this.urls.initial,onSuccess:this.update.bind(this),noCache:true}).get();return;}else if(!this.updateReq){this.updateReq=new Request.JSON({url:this.urls.update,onSuccess:this.update.bind(this),link:'cancel'});}
params=$extend(this.getMapQueryParams(),params);this.updateReq.get(params);},update:function(maps){if(!maps||maps.length==0)return;var map;maps.each(function(m){map=m;});if(!this.gmap){this.initGmap(map);}
this.updateSites(map.fields.sites);if(!this.iconsInitialized){this.initIcons(map.fields.icons);}
this.updateLayers(map.fields.maplayers);if(!this.setup){this.addMapEvents();this.initKey();this.setup=true;if(this.hashPresent){this.updateStateFromUrl();}}},updateStateFromUrl:function(){if(this.stateUrl.parts.has('site')){this.selectSite(this.stateUrl.getSiteKey());}
if(this.stateUrl.parts.has('poi')){(function(){this.selectPoi(this.stateUrl.getPoiKey());}.bind(this)).delay(100);}},updateSites:function(sites){if(!sites){return}
sites.each(function(sitedata){var key=DjangoModel.key(sitedata);if(!this.sites.has(key)){var site=new Site(this,sitedata);this.sites.set(key,site);}else{var site=this.sites.get(key);site.update(sitedata);}},this);this.sitesInitialized=true;},updateLayers:function(maplayers){maplayers.each(function(layerdata){var bounds=this.gmap.getBounds();var zoom=this.gmap.getZoom();var key=DjangoModel.key(layerdata);if(!this.layers.has(key)){if(layerdata.fields.type=='national_trails'||layerdata.fields.type=='sustrans_routes'||layerdata.fields.type=='bus_routes'){var layer=new PolylineLayer(this,layerdata);}else{var layer=new MarkerLayer(this,layerdata);}
this.layers.set(key,layer);if(layer.hasSite){var siteKey=DjangoModel.key({model:'map.site',pk:layer.fields.site});this.sites.get(siteKey).addLayer(layer);}}else{var layer=this.layers.get(key);layer.update(layerdata);}},this)
this.layersInitialized=true;},getMapQueryParams:function(){if(!this.gmap){return{zoom:this.fields.default_zoom};}
var bounds=this.gmap.getBounds()
return{zoom:this.gmap.getZoom(),ne:bounds.getNorthEast().toUrlValue(),sw:bounds.getSouthWest().toUrlValue()}},hasOverlay:function(key){this.overlays.has(key);},addOverlay:function(key,overlay){this.overlays.set(key,overlay);this.gmap.addOverlay(overlay);},addMarkers:function(markers,minZoom){markers.each(function(marker,key){if(!this.overlays.has(key)){this.overlays.set(key,marker);this.manager.addMarker(marker,minZoom);}},this);},removeMarker:function(key){if(!this.overlays.has(key)){return;}
var overlay=this.overlays.get(key);this.overlays.erase(key);this.manager.removeMarker(overlay);},removeOverlay:function(key){if(!this.overlays.has(key)){return;}
var overlay=this.overlays.get(key);this.overlays.erase(key);this.gmap.removeOverlay(overlay);},initIcons:function(icondata){this.iconManager=new IconManager(this,icondata);this.iconsInitialized=true;},getIcon:function(iconName){return this.iconManager.getIcon(iconName);},getSite:function(siteId){var key=DjangoModel.key({model:'map.site',pk:siteId});return this.sites.get(key);}});Map.geojson={pointToLatLong:function(point){eval('var p = '+point);if(typeof p=='undefined'||!p){return false;}
return new GLatLng(p.coordinates[1],p.coordinates[0]);},multiPolygonToPolygons:function(poly,opts){return Map.geojson.multiToGmap(poly,function(latlngs){return new GPolygon(latlngs,opts.boundary_stroke_color,opts.boundary_stroke_weight,opts.boundary_stroke_opacity,opts.boundary_fill_color,opts.boundary_fill_opacity);},true);},multiLineToPolylines:function(poly,opts){return poly.map(function(encoded){return new GPolyline.fromEncoded($extend({points:encoded.encoded_points,levels:encoded.encoded_levels,zoomFactor:32,numLevels:4},opts));});},multiToGmap:function(poly,ctor,deep){eval('var mp = '+poly);var overlays=[];for(var i=0;i<mp.coordinates.length;i++){var latlngs=[];if(deep){var collection=mp.coordinates[i][0];}else{var collection=mp.coordinates[i];}
var latlngs=collection.map(function(point){return new GLatLng(point[1],point[0]);});overlays.push(ctor(latlngs));}
return overlays;}};Map.modelCtors={'map.content':ContentItem,'map.locationcontent':LocationContent,'map.naptancontent':NaptanContent,'map.naptanstoppoint':NaptanStopPoint,'map.gtbsmember':GtbsMember,'map.nationaltrail':NationalTrail,'sustrans.route':SustransRoute,'busroute.busroute':BusRoute}
var IE=Browser.Engine.trident;var IE6=(navigator.userAgent.toLowerCase().indexOf('msie 6')!=-1)&&(navigator.userAgent.toLowerCase().indexOf('msie 7')==-1);Element.implement({ddFix:function(){DD_belatedPNG.fixPng(this);this.shape=this.getNext('shape');if(!this.shape){this.shape=this.getPrevious('shape');}
return this;},ddHide:function(){if(typeof this.shape!='undefined'){this.shape.setStyle('display','none');}
return this;},ddShow:function(){if(typeof this.shape=='undefined'||!this.shape){this.ddFix();}
this.shape.setStyle('display','');return this;}});(function(){var url=new WhsUrl();url.setPath(window.location.pathname);if(url.parts.has('site')){window.location=[window.location.protocol,'//',window.location.host,url.getBasePath(),'#',url.getHashPath()].join('');}})();(function(){var loader=function(){$$('body').removeClass('nojs');if(typeof initialMapData!='undefined'){var map=new Map('map',{},initialMapData[0]);}else{var map=new Map('map');}
$('header').getElements('a.site').addEvent('click',function(e){var evt=new Event(e).stop();var url=new WhsUrl($(evt.target).get('href'));var siteId=url.parts.get('site');map.poi.displaySite(siteId);});$('siteToggle-home').addEvent('click',function(e){new Event(e).stop();map.reset();});var img=new Asset.image('/media/images/accordion_open_sprite.png',{});var myVerticalSlide=new Fx.Slide('logos',{mode:'vertical',link:'chain',duration:1200,transition:Fx.Transitions.Pow.easeOut,onStart:function(){$('l_toggle').toggleClass('open');}});myVerticalSlide.toggle();$('l_toggle').addEvent('click',function(e){new Event(e).stop();myVerticalSlide.toggle();});SqueezeBox.initialize({size:{x:800,y:400},classWindow:'content'});$('footer').getElements('a[rel=boxed]').each(function(el){el.addEvent('click',function(e){new Event(e).stop();var href=el.href.replace(/\/content\//,'/ajaxcontent/');SqueezeBox.open(href);});});$('feedback_butt').addEvent('click',function(e){new Event(e).stop();var href=$('feedback_butt').href.replace(/\/content\//,'/ajaxcontent/');SqueezeBox.open(href);});if(false&&typeof DD_belatedPNG!='undefined'){DD_belatedPNG.fixPng($('rightTop'));map.addEvents({keyInit:function(key){DD_belatedPNG.fixPng(key.toggleClosed);key.addEvents({open:function(key){DD_belatedPNG.fixPng(key.toggleOpen);}});}});var poi=map.poi;var toggleClones=new Hash();poi.container.getElements('li.site').each(function(element,idx){var h2=element.getElement('h2');var clone=h2.clone().addClass('active').addClass('clone').setStyle('display','none').inject(element,'top');toggleClones.set(h2.get('text'),clone);h2.ddFix();h2.getElement('span').ddFix();});poi.addEvents({active:function(toggle,element){var clone=toggleClones.get(toggle.get('text'));if(clone){toggle.ddHide().setStyle('display','none');clone.setStyle('display','').ddShow();}},background:function(toggle,element){var clone=toggleClones.get(toggle.get('text'));if(clone){clone.ddHide().setStyle('display','none');toggle.setStyle('display','').ddShow();}}});}}
window.addEvent('domready',loader);})()
var SqueezeBox={presets:{onOpen:$empty,onClose:$empty,onUpdate:$empty,onResize:$empty,onMove:$empty,onShow:$empty,onHide:$empty,size:{x:600,y:450},sizeLoading:{x:200,y:150},marginInner:{x:20,y:20},marginImage:{x:50,y:75},handler:false,target:null,closable:true,closeBtn:true,zIndex:65555,overlayOpacity:0.7,classWindow:'',classOverlay:'',overlayFx:{},resizeFx:{},contentFx:{},parse:false,parseSecure:false,shadow:true,document:null,ajaxOptions:{}},initialize:function(presets){if(this.options)return this;this.presets=$merge(this.presets,presets);this.doc=this.presets.document||document;this.options={};this.setOptions(this.presets).build();this.bound={window:this.reposition.bind(this,[null]),scroll:this.checkTarget.bind(this),close:this.close.bind(this),key:this.onKey.bind(this)};this.isOpen=this.isLoading=false;return this;},build:function(){this.overlay=new Element('div',{id:'sbox-overlay',styles:{display:'none',zIndex:this.options.zIndex}});this.win=new Element('div',{id:'sbox-window',styles:{display:'none',zIndex:this.options.zIndex+2}});if(this.options.shadow){if(Browser.Engine.webkit420){this.win.setStyle('-webkit-box-shadow','0 0 10px rgba(0, 0, 0, 0.7)');}else if(!Browser.Engine.trident4){var shadow=new Element('div',{'class':'sbox-bg-wrap'}).inject(this.win);var relay=function(e){this.overlay.fireEvent('click',[e]);}.bind(this);['n','ne','e','se','s','sw','w','nw'].each(function(dir){new Element('div',{'class':'sbox-bg sbox-bg-'+dir}).inject(shadow).addEvent('click',relay);});}}
this.content=new Element('div',{id:'sbox-content'}).inject(this.win);this.closeBtn=new Element('a',{id:'sbox-btn-close',href:'#'}).inject(this.win);this.fx={overlay:new Fx.Tween(this.overlay,$merge({property:'opacity',onStart:Events.prototype.clearChain,duration:250,link:'cancel'},this.options.overlayFx)).set(0),win:new Fx.Morph(this.win,$merge({onStart:Events.prototype.clearChain,unit:'px',duration:1000,transition:Fx.Transitions.Expo.easeOut,link:'cancel',unit:'px'},this.options.resizeFx)),content:new Fx.Tween(this.content,$merge({property:'opacity',duration:250,link:'cancel'},this.options.contentFx)).set(0)};$(this.doc.body).adopt(this.overlay,this.win);},assign:function(to,options){return($(to)||$$(to)).addEvent('click',function(){return!SqueezeBox.fromElement(this,options);});},open:function(subject,options){this.initialize();if(this.element!=null)this.trash();this.element=$(subject)||false;this.setOptions($merge(this.presets,options||{}));if(this.element&&this.options.parse){var obj=this.element.getProperty(this.options.parse);if(obj&&(obj=JSON.decode(obj,this.options.parseSecure)))this.setOptions(obj);}
this.url=((this.element)?(this.element.get('href')):subject)||this.options.url||'';this.assignOptions();var handler=handler||this.options.handler;if(handler)return this.setContent(handler,this.parsers[handler].call(this,true));var ret=false;return this.parsers.some(function(parser,key){var content=parser.call(this);if(content){ret=this.setContent(key,content);return true;}
return false;},this);},fromElement:function(from,options){return this.open(from,options);},assignOptions:function(){this.overlay.set('class',this.options.classOverlay);this.win.set('class',this.options.classWindow);if(Browser.Engine.trident4)this.win.addClass('sbox-window-ie6');},close:function(e){var stoppable=($type(e)=='event');if(stoppable)e.stop();if(!this.isOpen||(stoppable&&!$lambda(this.options.closable).call(this,e)))return this;this.fx.overlay.start(0).chain(this.toggleOverlay.bind(this));this.win.setStyle('display','none');this.fireEvent('onClose',[this.content]);this.trash();this.toggleListeners();this.isOpen=false;return this;},trash:function(){this.element=this.asset=null;this.content.empty();this.options={};this.removeEvents().setOptions(this.presets).callChain();},onError:function(){this.asset=null;this.setContent('string',this.options.errorMsg||'An error occurred');},setContent:function(handler,content){if(!this.handlers[handler])return false;this.content.className='sbox-content-'+handler;this.applyTimer=this.applyContent.delay(this.fx.overlay.options.duration,this,this.handlers[handler].call(this,content));if(this.overlay.retrieve('opacity'))return this;this.toggleOverlay(true);this.fx.overlay.start(this.options.overlayOpacity);return this.reposition();},applyContent:function(content,size){if(!this.isOpen&&!this.applyTimer)return;this.applyTimer=$clear(this.applyTimer);this.hideContent();if(!content){this.toggleLoading(true);}else{if(this.isLoading)this.toggleLoading(false);this.fireEvent('onUpdate',[this.content],20);}
if(content){if(['string','array'].contains($type(content)))this.content.set('html',content);else if(!this.content.hasChild(content))this.content.adopt(content);}
this.callChain();if(!this.isOpen){this.toggleListeners(true);this.resize(size,true);this.isOpen=true;this.fireEvent('onOpen',[this.content]);}else{this.resize(size);}},resize:function(size,instantly){this.showTimer=$clear(this.showTimer||null);var box=this.doc.getSize(),scroll=this.doc.getScroll();this.size=$merge((this.isLoading)?this.options.sizeLoading:this.options.size,size);var to={width:this.size.x,height:this.size.y,left:(scroll.x+(box.x-this.size.x-this.options.marginInner.x)/2).toInt(),top:(scroll.y+(box.y-this.size.y-this.options.marginInner.y)/2).toInt()};this.hideContent();if(!instantly){this.fx.win.start(to).chain(this.showContent.bind(this));}else{this.win.setStyles(to).setStyle('display','');this.showTimer=this.showContent.delay(50,this);}
return this.reposition();},toggleListeners:function(state){var fn=(state)?'addEvent':'removeEvent';this.closeBtn[fn]('click',this.bound.close);this.overlay[fn]('click',this.bound.close);this.doc[fn]('keydown',this.bound.key)[fn]('mousewheel',this.bound.scroll);this.doc.getWindow()[fn]('resize',this.bound.window)[fn]('scroll',this.bound.window);},toggleLoading:function(state){this.isLoading=state;this.win[(state)?'addClass':'removeClass']('sbox-loading');if(state)this.fireEvent('onLoading',[this.win]);},toggleOverlay:function(state){var full=this.doc.getSize().x;this.overlay.setStyle('display',(state)?'':'none');this.doc.body[(state)?'addClass':'removeClass']('body-overlayed');if(state){this.scrollOffset=this.doc.getWindow().getSize().x-full;this.doc.body.setStyle('margin-right',this.scrollOffset);}else{this.doc.body.setStyle('margin-right','');}},showContent:function(){if(this.content.get('opacity'))this.fireEvent('onShow',[this.win]);this.fx.content.start(1);},hideContent:function(){if(!this.content.get('opacity'))this.fireEvent('onHide',[this.win]);this.fx.content.cancel().set(0);},onKey:function(e){switch(e.key){case'esc':this.close(e);case'up':case'down':return false;}},checkTarget:function(e){return this.content.hasChild(e.target);},reposition:function(){var size=this.doc.getSize(),scroll=this.doc.getScroll(),ssize=this.doc.getScrollSize();this.overlay.setStyles({width:ssize.x+'px',height:ssize.y+'px'});this.win.setStyles({left:(scroll.x+(size.x-this.win.offsetWidth)/2-this.scrollOffset).toInt()+'px',top:(scroll.y+(size.y-this.win.offsetHeight)/2).toInt()+'px'});return this.fireEvent('onMove',[this.overlay,this.win]);},removeEvents:function(type){if(!this.$events)return this;if(!type)this.$events=null;else if(this.$events[type])this.$events[type]=null;return this;},extend:function(properties){return $extend(this,properties);},handlers:new Hash(),parsers:new Hash()};SqueezeBox.extend(new Events($empty)).extend(new Options($empty)).extend(new Chain($empty));SqueezeBox.parsers.extend({image:function(preset){return(preset||(/\.(?:jpg|png|gif)$/i).test(this.url))?this.url:false;},clone:function(preset){if($(this.options.target))return $(this.options.target);if(this.element&&!this.element.parentNode)return this.element;var bits=this.url.match(/#([\w-]+)$/);return(bits)?$(bits[1]):(preset?this.element:false);},ajax:function(preset){return(preset||(this.url&&!(/^(?:javascript|#)/i).test(this.url)))?this.url:false;},iframe:function(preset){return(preset||this.url)?this.url:false;},string:function(preset){return true;}});SqueezeBox.handlers.extend({image:function(url){var size,tmp=new Image();this.asset=null;tmp.onload=tmp.onabort=tmp.onerror=(function(){tmp.onload=tmp.onabort=tmp.onerror=null;if(!tmp.width){this.onError.delay(10,this);return;}
var box=this.doc.getSize();box.x-=this.options.marginImage.x;box.y-=this.options.marginImage.y;size={x:tmp.width,y:tmp.height};for(var i=2;i--;){if(size.x>box.x){size.y*=box.x/size.x;size.x=box.x;}else if(size.y>box.y){size.x*=box.y/size.y;size.y=box.y;}}
size.x=size.x.toInt();size.y=size.y.toInt();this.asset=$(tmp);tmp=null;this.asset.width=size.x;this.asset.height=size.y;this.applyContent(this.asset,size);}).bind(this);tmp.src=url;if(tmp&&tmp.onload&&tmp.complete)tmp.onload();return(this.asset)?[this.asset,size]:null;},clone:function(el){if(el)return el.clone();return this.onError();},adopt:function(el){if(el)return el;return this.onError();},ajax:function(url){var options=this.options.ajaxOptions||{};this.asset=new Request.HTML($merge({method:'get',evalScripts:false},this.options.ajaxOptions)).addEvents({onSuccess:function(resp){this.applyContent(resp);if(options.evalScripts!==null&&!options.evalScripts)$exec(this.asset.response.javascript);this.fireEvent('onAjax',[resp,this.asset]);this.asset=null;}.bind(this),onFailure:this.onError.bind(this)});this.asset.send.delay(10,this.asset,[{url:url}]);},iframe:function(url){this.asset=new Element('iframe',$merge({src:url,frameBorder:0,width:this.options.size.x,height:this.options.size.y},this.options.iframeOptions));if(this.options.iframePreload){this.asset.addEvent('load',function(){this.applyContent(this.asset.setStyle('display',''));}.bind(this));this.asset.setStyle('display','none').inject(this.content);return false;}
return this.asset;},string:function(str){return str;}});SqueezeBox.handlers.url=SqueezeBox.handlers.ajax;SqueezeBox.parsers.url=SqueezeBox.parsers.ajax;SqueezeBox.parsers.adopt=SqueezeBox.parsers.clone;
