/*
 * Check for the existence of any nearmap namespaces. If they don't
 * exist then create them and assign the namespace to the global context.
 * If they do exist check that the global variables are of the correct
 * type. If they aren't the correct type report the error to the user
 * and stop loading.
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-18 11:49:21 +0800 (Thu, 18 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this,nearmap=window.nearmap;if(!nearmap){nearmap={};window.nearmap=nearmap}else{if(typeof nearmap!=="object"){throw new Error("The nearmap namespace must be an object. It is currently a "+typeof nearmap)}}if(!nearmap.threading){nearmap.threading={}}else{if(typeof nearmap.threading!=="object"){throw new Error("The nearmap.threading namespace must be an object. It is currently a "+typeof nearmap.threading)}}if(!nearmap.generics){nearmap.generics={}}else{if(typeof nearmap.generics!=="object"){throw new Error("The nearmap.generics namespace must be an object. It is currently a "+typeof nearmap.generics)}}if(!nearmap.client){nearmap.client={}}else{if(typeof nearmap.client!=="object"){throw new Error("The nearmap.client namespace must be an object. It is currently a "+typeof nearmap.client)}}if(!nearmap.lib){nearmap.lib={}}else{if(typeof nearmap.lib!=="object"){throw new Error("The nearmap.lib namespace must be an object. It is currently a "+typeof nearmap.lib)}}if(!nearmap.lib.math){nearmap.lib.math={}}else{if(typeof nearmap.lib.math!=="object"){throw new Error("The nearmap.lib.math namespace must be an object. It is currently a "+typeof nearmap.lib.math)}}if(!nearmap.lib.sprite){nearmap.lib.sprite={}}else{if(typeof nearmap.lib.sprite!=="object"){throw new Error("The nearmap.lib.sprite namespace must be an object. It is currently a "+typeof nearmap.lib.sprite)}}if(!nearmap.lib.history){nearmap.lib.history={}}else{if(typeof nearmap.lib.history!=="object"){throw new Error("The nearmap.lib.history namespace must be an object. It is currently a "+typeof nearmap.lib.history)}}if(!nearmap.lib.dragndrop){nearmap.lib.dragndrop={}}else{if(typeof nearmap.lib.dragndrop!=="object"){throw new Error("The nearmap.lib.dragndrop namespace must be an object. It is currently a "+typeof nearmap.lib.dragndrop)}}if(!nearmap.style){nearmap.style={}}else{if(typeof nearmap.style!=="object"){throw new Error("The nearmap.style namespace must be an object. It is currently a "+typeof nearmap.style)}}if(!nearmap.event){nearmap.event={}}else{if(typeof nearmap.event!=="object"){throw new Error("The nearmap.event namespace must be an object. It is currently a "+typeof nearmap.event)}}if(!nearmap.mobile){nearmap.mobile={}}else{if(typeof nearmap.mobile!=="object"){throw new Error("The nearmap.mobile namespace must be an object. It is currently a "+typeof nearmap.mobile)}}if(!nearmap.touch){nearmap.touch={}}else{if(typeof nearmap.touch!=="object"){throw new Error("The nearmap.touch namespace must be an object. It is currently a "+typeof nearmap.touch)}}if(!nearmap.overlay){nearmap.overlay={}}else{if(typeof nearmap.overlay!=="object"){throw new Error("The nearmap.overlay namespace must be an object. It is currently a "+typeof nearmap.overlay)}}if(!nearmap.maps){nearmap.maps={}}else{if(typeof nearmap.maps!=="object"){throw new Error("The nearmap.maps namespace must be an object. It is currently a "+typeof nearmap.maps)}}if(!nearmap.memory){nearmap.memory={}}else{if(typeof nearmap.memory!=="object"){throw new Error("The nearmap.memory namespace must be an object. It is currently a "+typeof nearmap.memory)}}if(!nearmap.http){nearmap.http={}}else{if(typeof nearmap.http!=="object"){throw new Error("The nearmap.http namespace must be an object. It is currently a "+typeof nearmap.http)}}if(!nearmap.dom){nearmap.dom={}}else{if(typeof nearmap.dom!=="object"){throw new Error("The nearmap.dom namespace must be an object. It is currently a "+typeof nearmap.dom)}}if(!nearmap.options){nearmap.options={}}else{if(typeof nearmap.options!=="object"){throw new Error("The nearmap.options namespace must be an object. It is currently a "+typeof nearmap.options)}}if(!nearmap.json){nearmap.json={}}else{if(typeof nearmap.json!=="object"){throw new Error("The nearmap.json namespace must be an object. It is currently a "+typeof nearmap.json)}}if(!nearmap.ajax){nearmap.ajax={}}else{if(typeof nearmap.ajax!=="object"){throw new Error("The nearmap.ajax namespace must be an object. It is currently a "+typeof nearmap.ajax)}}if(!nearmap.animation){nearmap.animation={}}else{if(typeof nearmap.animation!=="object"){throw new Error("The nearmap.animation namespace must be an object. It is currently a "+typeof nearmap.animation)}}})();/*
 * This module provides a set of wrappers for handling multi-threading.
 * Most existing JavaScript implementations are soley single threaded.
 * This module provides ways to fake multi-threading in a single threaded 
 * environment. 
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2010 Nearmap Pty
 * http://www.nearmap.com/license
 *
 * Date: 2010-03-12 13:53:00 +0800 (Fri, 12 Mar 2010)
 * Revision: 0.0.1
 */
(function(){var window=this;var nearmap=window.nearmap;var nmt=nearmap.threading;function later(functor){window.setTimeout(functor,0)}nmt.later=later})();/*
 * This module provides a set of standard data structures that are very useful
 * but not implemented in standard JavaScript implementations.
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2010 Nearmap Pty
 * http://www.nearmap.com/license
 *
 * Date: 2010-02-12 15:20:00 +0800 (Fri, 12 Feb 2010)
 * Revision: 0.0.1
 */
(function(){var window=this;var nearmap=window.nearmap;var nml=nearmap.lib;var nmg=nearmap.generics;function Dictionary(){var _allKeys=[];var _store={};function add(key,value){if(_store[key]===undefined){_allKeys.push(key)}_store[key]=value}function remove(key){var i=nml.ArrayHelper.indexOf(_allKeys,key);if(i<0){return false}_allKeys.splice(i,1);delete _store[key];return true}function exists(key){return _store[key]!==undefined?true:false}function getValue(key){return _store[key]||null}function clear(){_allKeys=[];_store={}}function getAllKeys(){return _allKeys.slice()}this.add=add;this.remove=remove;this.exists=exists;this.getValue=getValue;this.clear=clear;this.getAllKeys=getAllKeys}nmg.Dictionary=Dictionary})();/*
 * This module performs browser sniffing to determine the client information.
 * It will extract the users OS & browser type. Browser sniffing should only be 
 * used as a last resort! as it is easy to spoof the sniffing code by changing
 * the user agent.
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www.nearmap.com/license
 *
 * Date: 2009-11-15 20:21:00 +0800 (Sun, 15 Nov 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nmc=window.nearmap.client;function parseOS(){var ua=window.navigator.userAgent;return{windows:/\(Windows;/i.test(ua),mac:/\(Mac;/i.test(ua),linux:/\(Linux;/i.test(ua),iPhone:/\(iPhone;/i.test(ua),iPod:/\(iPod;/i.test(ua)}}function parseBrowser(){var ver;var verTkn;var ua=window.navigator.userAgent;var browsers={mozilla:/Gecko\//i.test(window.navigator.userAgent),chrome:/Chrome\//i.test(window.navigator.appVersion),safari:/AppleWebKit.+Version.+/i.test(window.navigator.appVersion),opera:/Opera/i.test(window.navigator.userAgent),msie:/MSIE/i.test(window.navigator.userAgent)};if(browsers.mozilla){ver=ua.match(/rv:(\d+[\.\d*]*)/);if(ver.length>1){verTkn=ver[1].split(".");browsers.majorVersion=verTkn[0]+"."+(verTkn.length>1?verTkn[1]:0);browsers.minorVersion=(verTkn.length>2?verTkn[2]:0)+(verTkn.length>3?"."+verTkn[3]:"")}else{browsers.majorVersion=0;browsers.minorVersion=0}}else{if(browsers.chrome){ver=window.navigator.appVersion.match(/Chrome\/(\d+[\.\d*]*)/);if(ver.length>1){verTkn=ver[1].split(".");browsers.majorVersion=verTkn[0]+"."+(verTkn.length>1?verTkn[1]:0);browsers.minorVersion=(verTkn.length>2?verTkn[2]:0)+(verTkn.length>3?"."+verTkn[3]:"")}else{browsers.majorVersion=0;browsers.minorVersion=0}}else{if(browsers.safari){ver=window.navigator.appVersion.match(/Version\/(\d+[\.\d*]*)/);if(ver.length>1){verTkn=ver[1].split(".");browsers.majorVersion=verTkn[0];browsers.minorVersion=(verTkn.length>1?verTkn[1]:0)+(verTkn.length>2?"."+verTkn[2]:"")}else{browsers.majorVersion=0;browsers.minorVersion=0}}else{if(browsers.opera){ver=ua.match(/Opera\/(\d+[\.\d*]*)/);if(ver.length>1){verTkn=ver[1].split(".");browsers.majorVersion=verTkn[0];browsers.minorVersion=verTkn[1]}else{browsers.majorVersion=0;browsers.minorVersion=0}}else{if(browsers.msie){ver=ua.match(/MSIE (\d+[\.\d*]*)/);if(ver.length>1){verTkn=ver[1].split(".");browsers.majorVersion=verTkn[0];browsers.minorVersion=verTkn[1]}else{browsers.majorVersion=0;browsers.minorVersion=0}}else{browsers.majorVersion=0;browsers.minorVersion=0}}}}}return browsers}nmc.os=parseOS();nmc.browser=parseBrowser()})();/*
 * This module provides an extended math library to the standard javascript math library.
 * Some of the additions include
 *
 * - Seeded psuedo random number generator
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-07-3 16:18:00 +0800 (Fri, 3 Jul 2009)
 * Revision: 0.0.1
 */
(function(){var window=this,nmm=window.nearmap.maps,nml=window.nearmap.lib,nmlm=window.nearmap.lib.math;function Random(seed){this.m=4294967296;this.a=1103515245;this.c=12345;this.state=seed?seed:Math.floor(Math.random()*(this.m-1));this.nextInt=function(){this.state=(this.a*this.state+this.c)%this.m;return this.state};this.nextFloat=function(){return this.nextInt()/(this.m-1)};this.nextRange=function(start,end){var rangeSize=end-start;var randomUnder1=this.nextInt()/this.m;return start+Math.floor(randomUnder1*rangeSize)};this.choice=function(array){return array[this.nextRange(0,array.length)]}}function rotatePoint(angle,point,origin,roundToPrecision){var theta=angle*nml.PI/180;var cos=Math.cos(theta);var sin=Math.sin(theta);var dx=point.x-origin.x;var dy=point.y-origin.y;var rp;var rx;var ry;dx*=100;dy*=100;origin.x*=100;origin.y*=100;rp=new nmm.Point(cos*dx-sin*dy+origin.x,sin*dx+cos*dy+origin.y);rp.x/=100;rp.y/=100;if(roundToPrecision&&typeof roundToPrecision==="function"){rp.x=roundToPrecision(rp.x);rp.y=roundToPrecision(rp.y)}return rp}nmlm.Random=Random;nmlm.rotatePoint=rotatePoint})();/*
 * These are helper methods that are extensions to the core javascript objects. They are sourced from the JSL
 * http://www.devpro.it/JSL/.
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-19 16:05:00 +0800 (Fri, 19 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nearmap=window.nearmap;var nml=nearmap.lib;var ajax=nearmap.ajax;var ArrayHelper={indexOf:function(arr,elt){var len=arr.length;var from=Number(arguments[2])||0;from=(from<0)?Math.ceil(from):Math.floor(from);if(from<0){from+=len}for(;from<len;from++){if(from in arr&&arr[from]===elt){return from}}return -1},find:function(arr,searchStr){var returnArray=false;for(var i=0;i<arr.length;i++){if(typeof(searchStr)=="function"){if(searchStr.test(arr[i])){if(!returnArray){returnArray=[]}returnArray.push(i)}}else{if(arr[i]===searchStr){if(!returnArray){returnArray=[]}returnArray.push(i)}}}return returnArray}};var StringHelper={sumUnicode:function(str){var sum=0;if(typeof str!=="string"){throw new Error("Unicode argument is invalid you must provide a string. You have used a "+(typeof str))}for(var i=0;i<str.length;i++){sum+=str.charCodeAt(i)}return sum}};var DateHelper={fromNearmapDateUTC:function(str){if(typeof str!=="string"){throw new Error("The date you wish to format must be a string it is currently: "+(typeof str))}if(str.length!==8){throw new Error("The nearmap date string you wish to parse must be 8 characters. It's current length is: "+str.length)}return new Date(Date.UTC(str.substring(0,4),(str.substring(4,6)-1),str.substring(6,8)))},toNearmapDateUTC:function(date){var dd;var mm;var yyyy;if(!(date instanceof Date)){return""}dd=date.getUTCDate();if(dd<10){dd="0"+dd}mm=date.getUTCMonth()+1;if(mm<10){mm="0"+mm}yyyy=date.getUTCFullYear();return yyyy.toString()+mm.toString()+dd.toString()},smallMonth:function(month){switch(month){case 0:return"Jan";case 1:return"Feb";case 2:return"Mar";case 3:return"Apr";case 4:return"May";case 5:return"Jun";case 6:return"Jul";case 7:return"Aug";case 8:return"Sep";case 9:return"Oct";case 10:return"Nov";case 11:return"Dec";default:return""}},smallDateUTC:function(date){return date.getUTCDate()+" "+DateHelper.smallMonth(date.getUTCMonth())+" "+date.getUTCFullYear()},dateExists:function(dates,find){var len=dates.length;var findMs=find.getTime();for(var i=0;i<len;i++){if(findMs-dates[i].getTime()===0){return true}}return false},dateListDifferent:function(arr1,arr2){var isDiff=false;var i;if(arr1||arr2){if((arr1&&!arr2)||(!arr1&&arr2)||(arr1.length!==arr2.length)){isDiff=true}else{i=0;while(!isDiff&&i<arr1.length){isDiff=!this.dateExists(arr2,arr1[i]);i++}}}return isDiff},sortUniqueAsc:function(dates){var sorted=[];var d;var dMs;var sortedMs;var tail;var len;for(var i=dates.length;i--;){d=dates[i];dMs=d.getTime();len=sorted.length;for(var j=0;j<len;j++){sortedMs=sorted[j].getTime();if(dMs===sortedMs){console.log("DUPE");break}else{if(sortedMs>dMs){tail=sorted.splice(j,sorted.length-j);sorted.push(d);sorted=sorted.concat(tail);break}}}if(j===len){sorted.unshift(d)}}return sorted},insertUniqueAsc:function(dates,newDate){var sortedDates=dates.slice(0,dates.length);var len=sortedDates.length;var newDateMs=newDate.getTime();if(len>0){for(var i=0;i<len;i++){timediff=sortedDates[i].getTime()-newDateMs;if(timediff===0){return sortedDates}if(timediff>=0){trailDates=sortedDates.splice(i,len-i);sortedDates.push(newDate);sortedDates=sortedDates.concat(trailDates);return sortedDates}if(i+1===len){sortedDates.push(newDate);return sortedDates}}}sortedDates[0]=newDate;return sortedDates},isDifferentDate:function(date1,date2){if((!date1&&date2)||(date1&&!date2)){return true}if(date1&&date2&&(date1.getTime()-date2.getTime()!==0)){console.log("2nd diff date1: %o | date2: %o",date1,date2);return true}return false}};var NumberHelper={isDecimal:function(num){return num%1?true:false}};function abortDownloads(){if(window.stop){window.stop()}else{if(document.execCommand){document.execCommand("Stop",false)}}ajax.clearTimers()}nml.ArrayHelper=ArrayHelper;nml.StringHelper=StringHelper;nml.DateHelper=DateHelper;nml.NumberHelper=NumberHelper;nml.abortDownloads=abortDownloads})();/*
 * This module provides the ability to manage the removal of dom elements
 * so that they don't leak memory in IE.
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www.nearmap.com/license
 *
 * Date: 2009-11-17 15:29:00 +0800 (Tue, 17 Nov 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nearmap=window.nearmap;var nme=nearmap.memory;var nmc=nearmap.client;function discardElement(element){if(element.parentNode){element.parentNode.removeChild(element)}if(nmc.browser.msie){element.outerHTML=""}}function discardBatchElements(elements,canvas){for(var i=elements.length-1;i--;){discardElement(elements[i],canvas)}}nme.discardElement=discardElement;nme.discardBatchElements=discardBatchElements})();/*
 * This module provides a bunch of css helper methods to make working with presentation the presentation layer
 * through javascript easier.
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-18 11:47:21 +0800 (Thu, 18 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nm=window.nearmap;var nmc=window.nearmap.client;var nms=window.nearmap.style;function getStyle(element,property,value){if(property in element){return property.style[property]}if(window.getComputedStyle){return window.getComputedStyle(element,null).getPropertyValue(property)}if(element.currentStyle){return element.currentStyle[property]}return null}function isClassMember(element,className){var classTkns;var i=0;if(!element.className&&typeof className==="string"){return false}if(element.className===className){return true}if(!element.className.test(/\s/)){return false}classTkns=element.className.split(/\s+/);while(i<classTkns.length){if(classTkns[i]===className){return true}i++}}function css(elm,prop,batch){var node;var batchStyle="";node=(typeof elm==="string"?window.document.getElementById(elm):elm);if(prop instanceof String){return getStyle(node,prop)}for(var p in prop){if(prop.hasOwnProperty(p)){if(batch){batchStyle+=p+":"+prop[p]+";"}else{node.style[p]=prop[p]}}}if(batch){node.style.cssText=batchStyle}return node}function applyOpacity(elm,opacity){var node,ieOpacity;node=typeof elm==="string"?window.document.getElementById(elm):elm;ieOpacity=+(opacity*100);node.style.opacity=opacity;node.style.filter="alpha(opacity="+ieOpacity+")"}function applyPngAlphaBg(elm,src,scale){var node;var filterStart;node=typeof elm==="string"?window.document.getElementById(elm):elm;if(nmc.browser.msie&&nmc.browser.majorVersion<=6){css(node,{filter:'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+src+'", sizingMethod="'+(scale?"scale":"image")+'")'})}else{css(node,{background:"url("+src+")"})}}function applyOpacityWithPngAlphaBg(elm,opacity,src,scale){var node,ieOpacity;node=typeof elm==="string"?window.document.getElementById(elm):elm;ieOpacity=+(opacity*100);node.style.opacity=opacity;node.style.filter="alpha(opacity="+ieOpacity+")";if(nmc.browser.msie&&nmc.browser.majorVersion<=6){node.style.filter+=' progid:DXImageTransform.Microsoft.AlphaImageLoader(src="'+src+'", sizingMethod="'+(scale?"scale":"image")+'")'}else{node.style.background="url("+src+")"}}function applyIE6Opacity(elm,opacity){var node,opFilter;node=typeof elm==="string"?window.document.getElementById(elm):elm;node.style.filter="progid:DXImageTransform.Microsoft.Alpha(opacity="+opacity+")"}function fixPngImage(elm,url,opacity){var node;node=typeof elm==="string"?window.document.getElementById(elm):elm;if(nmc.browser.msie&&nmc.browser.majorVersion<=6){applyPngAlphaBg(node,url);applyIE6Opacity(node.firstChild,opacity)}}function replaceIEPngTile(img){var node;if(nmc.browser.msie&&nmc.browser.majorVersion<=6){node=typeof img==="string"?window.document.getElementById(img):img;node.replaceTransparent=true}}nms.css=css;nms.isClassMember=isClassMember;nms.applyOpacity=applyOpacity;nms.applyOpacityWithPngAlphaBg=applyOpacityWithPngAlphaBg;nms.applyPngAlphaBg=applyPngAlphaBg;nms.fixPngImage=fixPngImage;nms.replaceIEPngTile=replaceIEPngTile})();/*
 * This module provides a cross browser implementation for dom event mechanisms.
 * It also provides methods to register custom events on arbitrary objects.
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-08 12:28:21 +0800 (Mon, 8 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nmev=window.nearmap.event;var nml=window.nearmap.lib;var nmd=window.nearmap.dom;var nmb=window.nearmap.browser;var lookupPrefix="element";var eventPrefix="event";var objList=[];var domList=[];var objEvents={};var domEvents={};var EventListener={source:null,handler:null,remove:null};var MouseButton={LEFT_BUTTON:1,RIGHT_BUTTON:2,MIDDLE_BUTTON:3};function normalizeWheelDelta(e){if(e.wheelDelta){return e.wheelDelta<0?-1:1}else{if(e.detail){return e.detail<0?1:-1}}return 0}function disableSelect(elm){if(typeof(elm.onselectstart)!=="undefined"){elm.onselectstart=preventDefault}else{elm.onmousedown=preventDefault}}function getMouseButton(event){if(!event.which&&event.button){switch(event.button){case 1:return MouseButton.LEFT_BUTTON;case 2:return MouseButton.RIGHT_BUTTON;case 4:return MouseButton.MIDDLE_BUTTON;default:return -1}}else{if(event.which){switch(event.which){case 1:return MouseButton.LEFT_BUTTON;case 2:return MouseButton.MIDDLE_BUTTON;case 3:return MouseButton.RIGHT_BUTTON}}else{throw new Exception("The mouse button event must be either the w3c or ie event object")}}}function getMockEvent(e){var mock={};if(e.clientX){mock.clientX=e.clientX}if(e.clientY){mock.clientY=e.clientY}if(e.screenY){mock.screenX=e.screenX}if(e.screenY){mock.screenY=e.screenY}if(e.target){mock.target=e.target}if(e.srcElement){mock.srcElement=e.srcElement}if(e.relatedTarget){mock.relatedTarget=e.relatedTarget}if(e.toElement){mock.toElement=e.toElement}if(e.wheelDelta){mock.wheelDelta=e.wheelDelta}if(e.detail){mock.detail=e.detail}if(e.which){mock.which=e.which}if(e.button){mock.button=e.button}return mock}function stopBubblingDom2(e){e=e||window.event;e.cancelBubble=true;if(e.stopPropagation){e.stopPropagation()}}function stopBubbling(e){stopBubblingDom2(e);return false}function preventDefault(e){e=e||window.event;e.returnValue=false;if(e.preventDefault){e.preventDefault()}return false}function getTarget(e){return e.target||e.srcElement}function getRelatedTarget(e){return e.relatedTarget||e.toElement}function createListener(source,handler,remove){return{source:source,handler:handler,remove:remove}}function validateEvent(event,handler){if(typeof event!=="string"){throw new Error("Event name must be a string")}if(typeof handler!=="function"){throw new Error("Event handler must be a function")}return true}function enqueueListener(list,eventQueue,source,event,handler){var key;var listener;var eventKey=eventPrefix+event;var objectKey;key=nml.ArrayHelper.indexOf(list,source);if(key===-1){key=list.length;objectKey=lookupPrefix+key;list[key]=source;eventQueue[objectKey]={};eventQueue[objectKey].length=0}else{objectKey=lookupPrefix+key}listener=createListener(source,handler,function testf(){var evQueue=eventQueue[objectKey][eventKey];for(var i=evQueue.length-1;i>=0;i--){if(evQueue[i]===listener){if(eventQueue===domEvents){removeDomListener(source,event,handler)}if(evQueue.length===1){delete eventQueue[objectKey][eventKey];eventQueue[objectKey].length--}else{evQueue.splice(i,1)}if(eventQueue[objectKey].length===0){eventQueue[objectKey]=undefined;list[key]=undefined}return}}});if(!eventQueue[objectKey][eventKey]){eventQueue[objectKey][eventKey]=[];eventQueue[objectKey].length++}eventQueue[objectKey][eventKey].push(listener);return listener}function addListener(source,event,handler){validateEvent(event,handler);return enqueueListener(objList,objEvents,source,event,handler)}function addDomListener(source,event,handler){function standard(){if(source.addEventListener){source.addEventListener(event,handler,false)}else{if(source.attachEvent){source.attachEvent("on"+event,handler)}else{source[event]=handler}}}function nonstandard(dom2,ie,original){if(dom2&&source.addEventListener){for(var p in dom2){if(dom2.hasOwnProperty(p)){source.addEventListener(dom2[p],handler,false)}}}else{if(ie&&source.attachEvent){source.attachEvent(ie,handler)}else{source[original]=handler}}}switch(event){case"mousewheel":nonstandard({firefox:"DOMMouseScroll",others:"mousewheel"},"on"+event,"on"+event);break;case"readystatechange":nonstandard(null,null,"on"+event);break;default:standard();break}return enqueueListener(domList,domEvents,source,event,handler)}function removeDomListener(source,event,handler){function standard(){if(source.removeEventListener){source.removeEventListener(event,handler,false)}else{if(source.detachEvent){source.detachEvent("on"+event,handler)}else{source[event]=null}}}function nonstandard(dom2,ie,original){if(source.removeEventListener){for(var p in dom2){if(dom2.hasOwnProperty(p)){source.removeEventListener(dom2[p],handler,false)}}}else{if(source.detachEvent){source.detachEvent(ie,handler)}else{source[original]=null}}}switch(event){case"mousewheel":nonstandard({firefox:"DOMMouseScroll",others:"mousewheel"},"on"+event,"on"+event);break;default:standard();break}}function removeListener(handle){var key;var eventList;var elmList;if(!handle){console.log("caller: %o",removeListener.caller);throw"Your must provide a handler to remove"}if(handle&&handle.remove&&typeof handle.remove==="function"){handle.remove()}if(nmd.isNode(handle.source)){key=nml.ArrayHelper.indexOf(domList,handle.source);eventList=domEvents;elmList=domList}else{key=nml.ArrayHelper.indexOf(objList,handle.source);eventList=objEvents;elmList=objList}}function batchRemoveListeners(handlers){for(var i=0;i<handlers.length;i++){removeListener(handlers[i])}}function clearListeners(source,event){var objKey=nml.ArrayHelper.indexOf(objList,source);var domKey=nml.ArrayHelper.indexOf(domList,source);if(objKey>=0){delete objEvents[lookupPrefix+objKey][eventPrefix+event]}if(domKey>=0){var evq=domEvents[lookupPrefix+domKey][eventPrefix+event];if(evq){for(var i=0;i<evq.length;i++){evq[i].remove()}delete domEvents[lookupPrefix+domKey][eventPrefix+event]}}}function clearCustomEvents(key){if(key>=0){delete objEvents[lookupPrefix+key];delete objList[key]}}function clearDomEvents(key){var queue;var evqs;if(key>=0){evqs=domEvents[lookupPrefix+key];if(evqs){for(var p in evqs){queue=evqs[p];for(var i=0;i<queue.length;i++){queue[i].remove()}}delete domEvents[lookupPrefix+key]}delete domList[key]}}function clearInstanceListeners(source){var objKey=nml.ArrayHelper.indexOf(objList,source);var domKey=nml.ArrayHelper.indexOf(domList,source);clearCustomEvents(objKey);clearDomEvents(domKey)}function clearNode(source){if(source.firstChild){clearNode(source.firstChild)}if(source.nextSibling){clearNode(source.nextSibling)}clearInstanceListeners(source)}function trigger(source,event){var key=nml.ArrayHelper.indexOf(objList,source),queuesKey,eventKey=eventPrefix+event,queue,listener,extraArgs;extraArgs=Array.apply(null,arguments).slice(2);if(key>-1){queuesKey=lookupPrefix+key;queue=objEvents[queuesKey][eventKey];if(queue){for(var i=0;i<queue.length;i++){listener=queue[i];listener.handler.apply(listener.source,extraArgs)}}}}function bind(source,event,object,method){}function bindDom(source,event,object,method){}function callback(object,method){if(typeof method!=="function"){throw new Exception("The method parameter must be a function")}return function(){method.apply(object,Array.prototype.slice.call(arguments))}}function callbackArgs(object,method){var extraArgs;if(typeof method!=="function"){throw new Exception("The method parameter must be a function")}extraArgs=Array.prototype.slice.call(arguments,2);return function(){method.apply(object,Array.prototype.slice.call(arguments).concat(extraArgs))}}function unload(){for(var i=objList.length-1;i>=0;i--){clearCustomEvents(i)}for(var j=domList.length-1;j>=0;j--){clearDomEvents(j)}}nmev.MouseButton=MouseButton;nmev.normalizeWheelDelta=normalizeWheelDelta;nmev.disableSelect=disableSelect;nmev.getMouseButton=getMouseButton;nmev.getMockEvent=getMockEvent;nmev.stopBubblingDom2=stopBubblingDom2;nmev.stopBubbling=stopBubbling;nmev.preventDefault=preventDefault;nmev.getTarget=getTarget;nmev.getRelatedTarget=getRelatedTarget;nmev.addListener=addListener;nmev.addDomListener=addDomListener;nmev.removeListener=removeListener;nmev.batchRemoveListeners=batchRemoveListeners;nmev.clearListeners=clearListeners;nmev.clearInstanceListeners=clearInstanceListeners;nmev.clearNode=clearNode;nmev.trigger=trigger;nmev.callback=callback;nmev.callbackArgs=callbackArgs;nmev.unload=unload})();/*
 * This module provides functionality to manipulate the DOM in a cross browser fashion
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-29 11:16:00 +0800 (Mon, 29 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nme=nearmap.memory;var nmc=nearmap.client;var nms=nearmap.style;var nmd=nearmap.dom;var nmev=nearmap.event;var nmo=nearmap.options;function create(elm,prop){var obj=document.createElement(elm);for(var p in prop){if(prop.hasOwnProperty(p)){obj[p]=prop[p]}}return obj}function insertAfter(parent,node,referenceNode){parent.insertBefore(node,referenceNode.nextSibling)}function topLeft(elm){var node=elm instanceof String?document.getElementById(elm):elm;if(!node){throw"You have not provided a valid element to topLeft()"}return{x:node.style.left?parseInt(node.style.left,10):0,y:node.style.top?parseInt(node.style.top,10):0}}function imageSize(img){return{height:img.height,width:img.width}}function contains(elm,child){var node;var isDesc=false;if(elm.contains){return elm.contains(child)}do{try{node=!node?child.parentNode:node.parentNode;if(elm===node){isDesc=true}}catch(e){node=null}}while(node&&node.nodeValue!=="body"&&!isDesc);return isDesc}function getWindowHeight(){if(typeof(window.innerHeight)=="number"){return window.innerHeight}else{if(document.documentElement&&document.documentElement.clientHeight){return document.documentElement.clientHeight}else{if(document.body&&document.body.clientHeight){return document.body.clientHeight}}}}function getWindowWidth(){if(typeof(window.innerWidth)==="number"){return window.innerWidth}else{if(document.documentElement&&document.documentElement.clientWidth){return document.documentElement.clientWidth}else{if(document.body&&document.body.clientWidth){return document.body.clientWidth}}}}function getWindowDimensions(){return{height:getWindowHeight(),width:getWindowWidth()}}function getBodyOffsetTop(elm){var node=elm instanceof String?document.getElementById(elm):elm;var offset=node.offsetTop;var parent=node.parentNode;var pos;while(parent&&parent.tagName.toLowerCase()!=="html"){pos=parent.style.position;if(pos&&(pos==="absolute"||pos==="relative")){offset+=parent.offsetTop}parent=parent.parentNode}return offset}function getBodyOffsetLeft(elm){var node=elm instanceof String?document.getElementById(elm):elm;var offset=node.offsetLeft;var parent=node.parentNode;var pos;while(parent&&parent.tagName.toLowerCase()!=="html"){pos=nms.css(parent,"position");if(pos&&(pos==="absolute"||pos==="relative")){offset+=parent.offsetLeft}parent=parent.parentNode}return offset}function getBodyOffset(elm){return{offsetTop:getBodyOffsetTop(elm),offsetLeft:getBodyOffsetLeft(elm)}}function isInput(nodeName){switch(nodeName.toLowerCase()){case"input":return true;case"select":return true;case"option":return true;case"textarea":return true;default:return false}}function getElementsByClassName(className,tag,elm){if(document.getElementsByClassName){getElementsByClassName=function(className,tag,elm){elm=elm||document;var elements=elm.getElementsByClassName(className),nodeName=(tag)?new RegExp("\\b"+tag+"\\b","i"):null,returnElements=[],current;for(var i=0,il=elements.length;i<il;i+=1){current=elements[i];if(!nodeName||nodeName.test(current.nodeName)){returnElements.push(current)}}return returnElements}}else{if(document.evaluate){getElementsByClassName=function(className,tag,elm){tag=tag||"*";elm=elm||document;var classes=className.split(" "),classesToCheck="",xhtmlNamespace="http://www.w3.org/1999/xhtml",namespaceResolver=(document.documentElement.namespaceURI===xhtmlNamespace)?xhtmlNamespace:null,returnElements=[],elements,node;for(var j=0,jl=classes.length;j<jl;j+=1){classesToCheck+="[contains(concat(' ', @class, ' '), ' "+classes[j]+" ')]"}try{elements=document.evaluate(".//"+tag+classesToCheck,elm,namespaceResolver,0,null)}catch(e){elements=document.evaluate(".//"+tag+classesToCheck,elm,null,0,null)}while((node=elements.iterateNext())){returnElements.push(node)}return returnElements}}else{getElementsByClassName=function(className,tag,elm){tag=tag||"*";elm=elm||document;var classes=className.split(" "),classesToCheck=[],elements=(tag==="*"&&elm.all)?elm.all:elm.getElementsByTagName(tag),current,returnElements=[],match;for(var k=0,kl=classes.length;k<kl;k+=1){classesToCheck.push(new RegExp("(^|\\s)"+classes[k]+"(\\s|$)"))}for(var l=0,ll=elements.length;l<ll;l+=1){current=elements[l];match=false;for(var m=0,ml=classesToCheck.length;m<ml;m+=1){match=classesToCheck[m].test(current.className);if(!match){break}}if(match){returnElements.push(current)}}return returnElements}}}return getElementsByClassName(className,tag,elm)}function isNode(o){return(typeof Node==="object"?o instanceof Node:typeof o==="object"&&typeof o.nodeType==="number"&&typeof o.nodeName==="string")}function Geometry(){function isFF2Wheel(mousewheel){return mousewheel&&nmc.browser.mozilla&&nmc.browser.majorVersion<1.9}function getDocPosX(e,mousewheel){return(isFF2Wheel(mousewheel)?e.screenX:(e.pageX?e.pageX:e.clientX))+document.body.scrollLeft}function getDocPosY(e,mousewheel){return(isFF2Wheel(mousewheel)?e.screenY:(e.pageY?e.pageY:e.clientY))+document.body.scrollTop}function getDocPos(e,mousewheel){return{x:getDocPosX(e,mousewheel),y:getDocPosY(e,mousewheel)}}this.getDocPosX=getDocPosX;this.getDocPosY=getDocPosY;this.getDocPos=getDocPos}var TooltipOptions={backgroundColor:"#004687",borderColor:"#fff",borderWidth:"1px",foregroundColor:"#fff",maxWidth:"auto",wait:500,cursorOffsetX:10,cursorOffsetY:15};function Tooltip(message,overElm,container,opts){var _popup;var _waitTimer;var _handlers=[];var _mouseupListener;function create(x,y){var tooltip=document.createElement("div");tooltip.innerHTML=message;nms.css(tooltip,{background:opts.backgroundColor,"border-style":"solid","border-width":opts.borderWidth,"border-color":opts.borderColor,color:opts.foregroundColor,padding:"0px 5px",position:"absolute",left:(x+opts.cursorOffsetX)+"px",top:(y+opts.cursorOffsetY)+"px","z-index":"2","max-width":opts.maxWidth},true);return tooltip}function show(x,y){_waitTimer=null;_popup=create(x,y);document.body.appendChild(_popup)}function hide(){if(_popup){nme.discardElement(_popup,container);_popup=null}}function setTooltipTimer(x,y){if(_waitTimer){window.clearTimeout(_waitTimer)}_waitTimer=window.setTimeout(function(){show(x,y)},opts.wait)}function onmousemove(e){var target;e=e||window.event;target=nmev.getTarget(e);if(!isInput(target.nodeName)&&!(/canceltooltip/.test(target.className))){hide();setTooltipTimer(e.clientX,e.clientY)}}function onmouseout(e){if(_waitTimer){window.clearTimeout(_waitTimer);_waitTimer=null;hide()}}this.remove=function(){hide();if(_waitTimer){window.clearTimeout(_waitTimer);_waitTimer=null}nmev.batchRemoveListeners(_handlers);_mouseupListener=null;_mousemoveListener=null};opts=nmo.Synchronize.fill(opts,TooltipOptions);_handlers.push(nmev.addDomListener(overElm,"mousemove",onmousemove));_handlers.push(nmev.addDomListener(overElm,"mouseout",onmouseout));_handlers.push(nmev.addDomListener(overElm,"mousedown",hide));_handlers.push(nmev.addDomListener(overElm,"mousewheel",hide));_handlers.push(nmev.addDomListener(document,"mousemove",hide))}nmd.create=create;nmd.insertAfter=insertAfter;nmd.topLeft=topLeft;nmd.imageSize=imageSize;nmd.getWindowHeight=getWindowHeight;nmd.getWindowWidth=getWindowWidth;nmd.getWindowDimensions=getWindowDimensions;nmd.getBodyOffsetTop=getBodyOffsetTop;nmd.getBodyOffsetLeft=getBodyOffsetLeft;nmd.getBodyOffset=getBodyOffset;nmd.isInput=isInput;nmd.isNode=isNode;nmd.contains=contains;nmd.getElementsByClassName=getElementsByClassName;nmd.Geometry=Geometry;nmd.Tooltip=Tooltip})();(function(){var window=this;var nmo=window.nearmap.options;var Synchronize={fill:function(instance,defaults){if(!instance){return defaults}else{for(var p in defaults){if(defaults.hasOwnProperty(p)&&instance[p]===undefined){instance[p]=defaults[p]}}return instance}},copy:function(from,to){if(!from||!to){throw new Exception("You must provide an object to copy from and to")}for(var p in from){if(from.hasOwnProperty(p)){to[p]=from[p]}}}};nmo.Synchronize=Synchronize})();(function(){var window=this,JSON=window.nearmap.json,reISO=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/,reMsAjax=/^\/Date\((d|-|.*)\)\/$/;function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof JSON.stringify!=="function"){JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else{if(typeof space==="string"){indent=space}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":value})}}if(typeof JSON.parse!=="function"){JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}JSON.dateStringToDate=function(dtString){var a=reISO.exec(dtString);if(a){return new Date(Date.UTC(+a[1],+a[2]-1,+a[3],+a[4],+a[5],+a[6]))}a=reMsAjax.exec(dtString);if(a){var b=a[1].split(/[-,.]/);return new Date(+b[0])}return null};JSON.parseWithDate=function(json){return JSON.parse(json,function(key,value){if(typeof value==="string"){var dt=JSON.dateStringToDate(value);return dt?dt:value}return value})};JSON.parseObjectWithDate=function(obj){var prop;if((typeof obj==="string")&&(/\/Date\((\d+)\)\//.test(obj))){return JSON.dateStringToDate(obj)}else{if(typeof obj!=="object"){return obj}}for(var p in obj){if(obj.hasOwnProperty(p)){prop=obj[p];if(prop instanceof Array){for(var i=prop.length;i--;){prop[i]=JSON.parseObjectWithDate(prop[i])}}else{obj[p]=JSON.parseObjectWithDate(prop)}}}return obj}}());/*
 * This module provides a way to create and manipulate ajax requests in a cross
 * browser fashion. Ajax GET requests can use a cache which is managed by this module.
 * The cache silo is very simple. It simply uses the url of the GET request as the key
 * and stores the results of the request as a property of the cache object using the key
 * as the property name. By default cache is enabled for all GET requests.
 *
 * NOTE: Helper methods which return parsed results will store the parsed result and NOT
 * the original content that was returned by the request. For instance the getJSON() method
 * stores the parsed JSON object and NOT the original JSON string.
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-07-07 16:42:00 +0800 (Tue, 7 Jul 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nml=nearmap.lib;var nmt=nearmap.threading;var nme=nearmap.memory;var ajax=nearmap.ajax;var json=nearmap.json;var nmo=nearmap.options;var nmev=nearmap.event;var factories;var factory;var cache={};var timers=[];var jsonpName=new Date().getTime();factories=[function(){return new XMLHttpRequest()},function(){return new ActiveXObject("Microsoft.XMLHTTP")},function(){return new ActiveXObject("MSXML2.XMLHTTP.3.0")},function(){return new ActiveXObject("MSXML2.XMLHTTP")}];var AjaxOptions={error:function(){alert("There was an error completing the ajax request. Please try again or contact an administrator")},creationError:function(){alert("Unfortunately there was an error creating the ajax request. Please ensure your browser supports ajax or update to the latest version.")},timeoutError:function(){alert("The ajax request has timed out. Please check your network settings and try again.")},timeoutLength:10000,useCache:true,withDate:false};function createXMLHttpRequest(){var i=0;var request;if(factory){return new factory()}while(factory===undefined&&!request&&i<factories.length){factory=factories[i];try{request=factory()}catch(e){factory=undefined}i++}if(!request){factory=null}return request}function getJSONP(url,callback,opts){var head=document.getElementsByTagName("head")[0];var frame=document.createElement("iframe");var done=false;var fname="jsonp"+jsonpName++;var successfname=fname+"success";var errorfname=fname+"error";var frameWindow;var frameDoc;var timeout;function cleanUp(){window.clearTimeout(timeout);removeTimer(timeout);frameWindow[successfname]=undefined;frameWindow[errorfname]=undefined;frameDoc.open();frameDoc.write("");frameDoc.close();nme.discardElement(frame)}function errorFunction(type){cleanUp();if(type==="TIMEOUT"){opts.timeoutError()}else{opts.error()}}opts=nmo.Synchronize.fill(opts,AjaxOptions);frame.style.display="none";head.appendChild(frame);frameWindow=frame.contentWindow||frame.contentDocument;frameDoc=frameWindow.document;if(!frameDoc){opts.error();return}frameDoc.open();frameWindow[successfname]=function(data){var parsedData=(opts.withDate?json.parseObjectWithDate(data):data);done=true;cache[url]=parsedData;nmt.later(function(){cleanUp();callback(data)})};frameWindow[errorfname]=function(state){if((!state||state==="complete")&&!done){done=true;nmt.later(errorFunction)}};timeout=window.setTimeout(function(){errorFunction("TIMEOUT")},opts.timeoutLength);timers.push(timeout);frameDoc.write('<html><head><script src="'+url.replace(/=\?/,"="+successfname)+'" onload="'+errorfname+'()" onreadystatechange="'+errorfname+'(this.readyState)"></script></head><body onload="'+errorfname+'()"></body></html>');frameDoc.close()}function getJSON(url,callback,opts){var request;var data;var requestTimer;opts=nmo.Synchronize.fill(opts,AjaxOptions);if(opts.useCache){data=cache[url];if(data){if(callback&&typeof callback==="function"){callback(data)}return}}if(/=\?/.test(url)){getJSONP(url,callback,opts);return}request=createXMLHttpRequest();if(request){request.onreadystatechange=function(){if(request.readyState===4){window.clearTimeout(requestTimer);if(request.status===200&&request.getResponseHeader("Content-Type")==="application/json"){data=json["parse"+(opts.withDate?"WithDate":"")](request.responseText);if(opts.useCache){cache[url]=data}if(callback&&typeof callback==="function"){callback(data)}}else{if(typeof opts.error==="function"){opts.error()}else{AjaxOptions.error()}}}};request.open("GET",url);requestTimer=window.setTimeout(function(){request.abort();opts.timeoutError();requestTimer=null},opts.timeoutLength);request.send(null);return request}else{if(typeof opts.creationError==="function"){opts.creationError()}else{AjaxOptions.creationError()}}return}function getHeaders(url,callback,opts){var headers={};var request;var requestTimer;opts=nmo.Synchronize.fill(opts,AjaxOptions);request=createXMLHttpRequest();if(request){request.onreadystatechange=function(){if(request.readyState===4){window.clearTimeout(requestTimer);if(request.status===200){}else{if(typeof opts.error==="function"){opts.error()}else{AjaxOptions.error()}}}};request.open("HEAD",url);requestTimer=window.setTimeout(function(){request.abort();opts.timeoutError();requestTimer=null},opts.timeoutLength);request.send(null)}else{if(typeof opts.creationError==="function"){opts.creationError()}else{AjaxOptions.creationError()}}return headers}function clearTimers(){for(var i=timers.length;i--;){window.clearTimeout(timers[i])}timers=[]}function removeTimer(timer){var i=nml.ArrayHelper.indexOf(timers,timer);if(i>=0){timers.splice(i,1)}}ajax.createXMLHttpRequest=createXMLHttpRequest;ajax.AjaxOptions=AjaxOptions;ajax.getJSON=getJSON;ajax.getHeaders=getHeaders;ajax.clearTimers=clearTimers})();/*
 * This module provides
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-07-07 16:42:00 +0800 (Tue, 7 Jul 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nma=window.nearmap.animation;function runAnimation(frames,length,handler,finished){var currentFrame=1;var frameTimespan=Math.ceil(length/frames);var reel;reel=window.setInterval(function(){currentFrame++;if(currentFrame<=frames){handler(currentFrame,frames)}if(currentFrame>=frames){window.clearInterval(reel);if(finished&&typeof finished==="function"){finished(currentFrame,frames)}}},frameTimespan);handler(currentFrame,frames);return reel}function runFixedAnimation(frames,length,handler,finished){var frameTimespan=Math.ceil(length/frames);var timers=[];var reel;for(var i=0;i<frames;i++){timers[i]=window.setTimeout(function(currentFrame){return function(){handler(currentFrame,frames);if(currentFrame===frames&&finished&&typeof finished==="function"){timers=[];finished(currentFrame,frames)}}}(i+1),frameTimespan*i)}return timers}function stopAnimation(reel){window.clearInterval(reel)}function stopFixedAnimation(timers){var len=timers.length;for(var i=0;i<len;i++){window.clearTimeout(timers[i])}}function runContinuousAnimation(interval,handler,finished,stop){var id;var startDate=new Date();var currentDate;if(typeof handler!=="function"){throw'The "handler" argument must be a function. It is currently '+(typeof handler)}if(typeof stop!=="function"){throw'The "stop" argument must be a function. It is currently '+(typeof stop)}id=window.setInterval(function(){currentDate=new Date();handler(startDate,currentDate);if(stop()){window.clearInterval(id);if(typeof finished==="function"){finished(startDate,currentDate)}}},interval)}nma.runAnimation=runAnimation;nma.runFixedAnimation=runFixedAnimation;nma.stopAnimation=stopAnimation;nma.stopFixedAnimation=stopFixedAnimation;nma.runContinuousAnimation=runContinuousAnimation})();/*
 * This module provides a set of library functions to handle mobile devices
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www.nearmap.com/license
 *
 * Date: 2009-11-15 20:25:00 +0800 (Sun, 15 Nov 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nmmob=window.nearmap.mobile;var apple={};nmmob.apple=apple})();/*
* This module provides a set of library functions to handle touch devices.
* It is a set of custom gestures and actions that pertain to a touch device.
*
* http://www.nearmap.com/
*
* Copyright (c) 2009 Nearmap Pty
* TODO: OUR LICENSE
* http://www.nearmap.com/license
*
* Date: 2009-11-15 20:26:00 +0800 (Sun, 15 Nov 2009)
* Revision: 0.0.1
*/
(function(){var window=this;var _ev=window.nearmap.event;var _tch=window.nearmap.touch;var _timers={};var _dblTapElapse=200;function deleteTimer(){var name=arguments[arguments.length-1];var timer=_timers[name];if(timer){window.clearTimeout(timer);delete _timers[name];return true}return false}function onePointDoubleTap(callback){if(!callback||typeof callback!=="function"){throw new Exception('You must provide a callback function for "onePointDoubleTap"')}return function(e){var timerName="onePointDoubleTap";if(e.touches.length!==1){if(_timers[timerName]){window.clearTimeout(_timers[timerName]);delete _timers[timerName]}}if(_timers[timerName]){delete _timers[timerName];callback(e);return _ev.preventDefault(e)}_timers[timerName]=window.setTimeout(_ev.callbackArgs(this,deleteTimer,timerName),_dblTapElapse)}}function twoPointDoubleTap(callback){var timerName="twoPointDoubleTap";if(!callback||typeof callback!=="function"){throw new Exception('You must provide a callback function for "onePointDoubleTap"')}function doubleTap(e){if(e.touches.length!==2){if(_timers[timerName]){window.clearTimeout(_timers[timerName]);delete _timers[timerName]}}if(_timers[timerName]){delete _timers[timerName];callback(e);return _ev.preventDefault(e)}_timers[timerName]=window.setTimeout(_ev.callbackArgs(this,deleteTimer,timerName),_dblTapElapse)}function removeDoubleTap(e){if(e.touches.length===0){window.clearTimeout(_timers[timerName]);delete _timers[timerName];_ev.removeListener(this.doubleTap);_ev.removeListener(this.removeDoubleTap);delete this.doubleTap;delete this.removeDoubleTap}}return function(e){if(e.touches.length===1){this.doubleTap=_ev.addDomListener(this,"touchstart",doubleTap);this.removeDoubleTap=_ev.addDomListener(this,"touchend",removeDoubleTap)}}}_tch.onePointDoubleTap=onePointDoubleTap;_tch.twoPointDoubleTap=twoPointDoubleTap})();/*
 * j history 0.6 - jQuery plugin allowing simple non-intrusive browser history
 * author: Jim Palmer; released under MIT license
 * collage of ideas from Taku Sano, Mikage Sawatari, david bloom and Klaus Hartl
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-11-16 10:30:00 +0800 (Mon, 16 Nov 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nml=nearmap.lib;var json=nearmap.json;var nmlh=nearmap.lib.history;var _cache="/mapfiles/state.html";var _stateBagId="__stateBag";var _frameId;var _isEnabled=false;var HistoryType={GENERIC:1,MAP:2};var MapHistoryState={latlng:undefined,zoom:undefined,mapType:undefined,tileDate:undefined};MapHistoryState.prototype=new HistoryState(HistoryType.MAP);function HistoryState(type){this.title="PhotoMaps by Nearmap";this.type=type}function create(id){var frameNode=document.createElement("div");if(typeof id!=="string"||id===""){throw"The id of the history frame must be a non empty string"}frameNode.innerHTML='<iframe id="'+id+'" src="'+_cache+'" style="border:0px; width:0px; height:0px; visibility:hidden;" />';document.body.appendChild(frameNode);_frameId=id;_isEnabled=true}function save(newState,title,oldState){var frame;var stateBag;if(!_isEnabled){throw"You must first enable the history module by calling nearmap.lib.history.create()"}if(!history.stack){history.stack={}}if(history._locked){return false}history.cursor=(new Date()).getTime().toString();frame=document.getElementById(_frameId);stateBag=frame.contentWindow.document.getElementById(_stateBagId);if(!stateBag.value&&oldState){stateBag.value=json.stringify(oldState)}frame.contentWindow.location.href=frame.contentWindow.location.href.split("?")[0]+"?"+history.cursor+"#"+history.cursor;window.setTimeout(function(){var stateBag=frame.contentWindow.document.getElementById(_stateBagId);stateBag.value=json.stringify(newState);frame.contentWindow.document.title=title;document.title=title},100)}nmlh.HistoryType=HistoryType;nmlh.HistoryState=HistoryState;nmlh.MapHistoryState=MapHistoryState;nmlh.create=create;nmlh.save=save})();/*
 * This module provides a cross browser implementation of drag and drop.
 * Internet Explorer already provides a set of drag events and these should be
 * used when available. This will ensure that IE remains snappy. Other browsers
 * will need to use a combination of the mousedown, mousemove and mouseup events.
 *
 * Copyright (c) 2010 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www.nearmap.com/license
 *
 * Date: 2010-01-29 14:49:00 +0800 (Fri, 1 Jan 2010)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nml=nearmap.lib;var nmc=nearmap.client;var nmev=nearmap.event;var nmls=nearmap.lib.sprite;function dragMouseMove(arg1,arg2){var elm;e=(arg2?arg1:window.event);opts=(arg2?arg2:arg1);elm=opts.elm;if(!elm.hasDragged){elm.hasDragged=true;opts.dragstart.apply(elm,[e])}opts.drag.apply(elm,[e]);return nmev.preventDefault(e)}function isDraggable(elm){var nodeName=elm.nodeName.toLowerCase();if(elm.isDraggable){return true}else{if(nodeName==="body"||nodeName==="html"){return false}else{return isDraggable(elm.parentNode)}}}function dragMouseDown(arg1,arg2){var elm=this;var e;var target;var opts;var mousemoveListener;var mouseupListener;e=(arg2?arg1:window.event);opts=(arg2?arg2:arg1);target=nmev.getTarget(e);if((!opts.mouseButton||(opts.mouseButton&&nmev.getMouseButton(e)===opts.mouseButton))&&isDraggable(target)&&(!opts.targetProp||target[opts.targetProp])){elm.mouseX=e.clientX;elm.mouseY=e.clientY;elm.hasDragged=false;mousemoveListener=nmev.addDomListener(document,"mousemove",nmev.callbackArgs(document,dragMouseMove,{elm:elm,dragstart:opts.dragstart,drag:opts.drag}));mouseupListener=nmev.addDomListener(document,"mouseup",function(e){nmev.removeListener(mousemoveListener);nmev.removeListener(mouseupListener);mousemoveListener=null;mouseupListener=null;opts.dragend.apply(elm,[e])});return nmev.preventDefault(e)}return true}function add(elm,dragstart,drag,dragend,mouseButton,targetProp){var obj=(typeof elm==="string"?document.getElementById(elm):elm);obj.isDraggable=true;obj.onmousedown=nmev.callbackArgs(obj,dragMouseDown,{dragstart:dragstart,drag:drag,dragend:dragend,mouseButton:mouseButton,targetProp:targetProp})}function remove(elm){var obj=(typeof elm==="string"?document.getElementById(elm):elm);obj.onmousedown=null;obj.isDraggable=false}nml.dragndrop.add=add;nml.dragndrop.remove=remove})();(function(){var window=this;var nmh=window.nearmap.http;function escapeHtml(str){var div=window.document.createElement("div");var text=window.document.createTextNode(str);div.appendChild(text);return div.innerHTML}nmh.escapeHtml=escapeHtml})();/*
 * Parse the required HttpRequest information for the current page load
 * and assign the result to the HttpRequest object in the nearmap namespace
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-18 10:28:00 +0800 (Thu, 18 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nm=window.nearmap;var nmh=window.nearmap.http;function HttpRequest(){}HttpRequest.prototype.parseKeyValuePairs=function(urlParams){var parms=urlParams.split("&");var pairs={};var pos;for(var i=0;i<parms.length;i++){pos=parms[i].indexOf("=");if(pos>0){pairs[parms[i].substring(0,pos)]=window.decodeURIComponent(parms[i].substring(pos+1))}}return pairs};HttpRequest.prototype.parseQueryString=function(url){var matches=(url||window.location.href).match(/\?(.+)/);return(matches&&matches.length>=2?this.parseKeyValuePairs(matches[1]):{})};HttpRequest.prototype.parseLocationQueryString=function(location){return this.parseKeyValuePairs((location||window.location).search.substring(1))};HttpRequest.prototype.parseHashString=function(url){return this.parseKeyValuePairs((url||window.location).hash.substring(1))};HttpRequest.prototype.getHostname=function(){return window.location.hostname};function HttpResponse(){}HttpResponse.prototype.formatUrl=function(host,qstr){var len=qstr.length;var hasQMark=false;var params="";for(var i=0;i<len;i++){if(!hasQMark){host+="?"+qstr[i];hasQMark=true}else{host+="&"+qstr[i]}}return host};nmh.HttpRequest=new HttpRequest();nmh.HttpResponse=new HttpResponse()})();/*
 * Handle javascript cookies. This includes create, edit & delete.
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-19 13:57:00 +0800 (Fri, 19 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nearmap=window.nearmap;var nml=nearmap.lib;var nmo=nearmap.options;var ONE_WEEK=604800;var ONE_DAY=86400;var CookieOptions={expireSeconds:ONE_WEEK,values:""};function Cookie(name,opts){var _expDate;var _pairs={};var _seperator="|";function parseKeyValues(){var values="";for(key in _pairs){if(_pairs.hasOwnProperty(key)){values=(values?values+_seperator:"")+key+"="+_pairs[key]}}return values}function parseValues(values){var tkns=values.split(_seperator),kv;for(var i=0;i<tkns.length;i++){kv=tkns[i].split("=");if(kv.length>=2){_pairs[kv[0]]=kv[1]}}}function formatCookie(){var expires="; expires="+_expDate.toGMTString();return name+"="+parseKeyValues()+expires+"; path=/"}this.setValue=function(key,value){_pairs[key]=value};this.removeValue=function(key){delete _pairs[key]};this.getValue=function(key){return _pairs[key]};this.getContent=function(){return opts&&opts.values?opts.values:null};this.getExpiry=function(){return _expDate};this.setExpiry=function(date){_expDate=date};this.remove=function(){_expDate=new Date();_expDate.setTime(-999999999);window.document.cookie=formatCookie()};this.save=function(){if(!_expDate){_expDate=new Date()}_expDate.setTime(_expDate.getTime()+(opts.expireSeconds*1000));window.document.cookie=formatCookie()};opts=nmo.Synchronize.fill(opts,CookieOptions);if(opts.values){parseValues(opts.values)}}Cookie.getCookie=function(name,expireSeconds){var nameEQ;var emptyIE;var ca;var c;var ck;if(document.cookie.length){nameEQ=name+"=";ca=document.cookie.split(";");for(var i=0;i<ca.length;i++){c=ca[i];while(c.charAt(0)==" "){c=c.substring(1,c.length)}if(c.indexOf(nameEQ)===0){return new Cookie(name,{values:c.substring(nameEQ.length,c.length),expireSeconds:expireSeconds})}else{if(new RegExp(name+"$").test(c)){return new Cookie(name,{expireSeconds:expireSeconds})}}}}return null};Cookie.cookiesEnabled=function(){var name="NEARMAPCOOKIESENABLED";var cookie=new Cookie(name);var enabled;var getCookie;cookie.save();enabled=(Cookie.getCookie(name)?true:false);cookie.setExpiry(new Date(0));cookie.save();return enabled};nearmap.http.Cookie=Cookie})();(function(){var window=this;var nearmap=window.nearmap;var nmm=nearmap.maps;var nml=nearmap.lib;function isNearMapDomain(){return(/.*nearmap.com/i).test(window.location.hostname)}nml.PI=3.14159265358979;nml.DEGREE_TO_RADIAN=nml.PI/180;nml.MS_IN_DAY=24*60*60*1000;nml.METER_TO_INCH=39.37;nmm.API_VERSION="0.1";nmm.API_VERSION_PATH="api"+nmm.API_VERSION;nmm.LATLNG_KEY="ll";nmm.ZOOM_KEY="z";nmm.MAPTYPE_KEY="t";nmm.TILE_DATE_KEY="nmd";nmm.TITLE_KEY="title";nmm.BOOKMARK_KEY="nmb";nmm.VISIT_KEY="nmv";nmm.EDITED_KEY="osme";nmm.DEBUG_KEY="db";nmm.MAX_HOSTS_KEY="mh";nmm.OUTPUT_KEY="output";nmm.ACCEPTED_KEY="a";nmm.LICENCE_KEY="l";nmm.SEARCH_QUERY_KEY="q";nmm.DEFAULT_ZOOM=3;nmm.DBL_CLICK_TIMEOUT=500;nmm.DEFAULT_TILE_SIZE=256;nmm.SESSION_COOKIE_EXPIRES=300000;nmm.SESSION_COOKIE_CHECK_BEFORE=60000;nmm.HOST=(isNearMapDomain()?window.location.hostname:"nearmap.com");nmm.HOST_URL=(window.location.protocol==="https:"?"https:":"http:")+"//"+(isNearMapDomain()?"":"www.")+nmm.HOST+"/";nmm.HOST_STRIP_FIRST_SUBDOMAIN=nmm.HOST.replace(/([a-z0-9\-]+\.)?([a-z0-9\-]+\.)*nearmap.com/i,"$2nearmap.com");nmm.TILE_INFO_URL_JSON=nmm.HOST_URL+"maps/x={X}&y={Y}&z={Z}&nmq=INFO&nmf=json";nmm.TILE_INFO_URL_JSONP=nmm.HOST_URL+"maps/x={X}&y={Y}&z={Z}&nmq=INFO&nmf=json&nmjsonp=?";nmm.DYNAMIC_LAYERS_URL_JSONP=nmm.HOST_URL+"maps/nmq=dynamiclayers&nmjsonp=?";nmm.DYNAMIC_LAYER_POINTS_URL_JSONP=nmm.HOST_URL+"maps/nmq=dynamiclayer&nmx={L}&nmjsonp=?";nmm.TRANSPARENT_GIF=nmm.HOST_URL+"img/transparent.gif";nmm.DUMMY_TILE=nmm.HOST_URL+"img/dummy-tile.gif";nmm.WRAP_TILE=nmm.HOST_URL+"img/wrap-tile.gif";nmm.GET_SESSION=nmm.HOST_URL+"maps/nmq=getsession"})();/*
 * Provides a set of api objects to represent the different coordinates systems used
 * in the map.
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www.nearmap.com/license
 *
 * Date: 2009-06-18 12:44:00 +0800 (Thu, 18 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nmm=window.nearmap.maps;function Point(x,y){this.x=x;this.y=y;this.equals=function(pnt){return x===pnt.x&&y===pnt.y};this.add=function(dx,dy){this.x+=dx;this.y+=dy};this.toString=function(){return this.x+","+this.y};this.copy=function(){return new Point(this.x,this.y)};if(typeof x!=="number"||typeof y!=="number"){throw new Error('The x & y points must be numbers, they are currently "'+(typeof x)+'" and "'+(typeof y)+'" respectively')}}Point.ORIGIN=new Point(0,0);function LatLng(lat,lng,unbounded){if(typeof(lat)!=="number"){lat=parseFloat(lat)}if(typeof(lng)!=="number"){lng=parseFloat(lng)}this.lat=function(){return lat};this.lng=function(){return lng};this.distanceFrom=function(other,radius){};this.toString=function(){return lat.toFixed(6)+","+lng.toFixed(6)};this.copy=function(unbounded){return new LatLng(this.lat(),this.lng(),unbounded)};if(!unbounded){if(lat<-90){lat=((lat+90)%180)+90}else{if(lat>90){lat=((lat-90)%180)-90}}if(lng<-180){lng=((lng+180)%360)+180}else{if(lng>180){lng=((lng-180)%360)-180}}}}LatLng.prototype.latRadians=function(){return this.lat()*nmm.DEGREE_TO_RADIAN};LatLng.prototype.lngRadians=function(){return this.lng()*nmm.DEGREE_TO_RADIAN};LatLng.prototype.equals=function(other){return(this.lat()===other.lat()&&this.lng()===other.lng())};LatLng.prototype.toUrlValue=function(precision){var factor;precision=precision&&(precision instanceof Number)&&precision>=1?Math.floor(precision):6;factor=Math.pow(10,precision);return(Math.round(this.lat()*factor)/factor)+","+(Math.round(this.lng()*factor)/factor)};LatLng.fromUrlValue=function(latlng){var latlngTkn;var lat;var lng;if(latlng&&typeof latlng==="string"){latlngTkn=latlng.split(/\s*,\s*/);if(latlngTkn.length<2){throw new Error('Invalid format lat & lng must be seperated by ","')}lat=parseFloat(latlngTkn[0]);lng=parseFloat(latlngTkn[1]);if(isNaN(lat)||isNaN(lng)){throw new Error("Invalid format lat & lng must be numbers")}return new nmm.LatLng(lat,lng,true)}else{throw new Error("You must provide a string to convert to a lat & lng")}};function LatLngBounds(sw,ne){this.getSouthWest=function(){return sw};this.getNorthEast=function(){return ne};this.extend=function(latlng){var nelat=ne.lat()<latlng.lat()?latlng.lat():ne.lat();var nelng=ne.lng()<latlng.lng()?latlng.lng():ne.lng();var swlat=sw.lat()>latlng.lat()?latlng.lat():sw.lat();var swlng=sw.lng()>latlng.lat()?latlng.lat():sw.lng();ne=new LatLng(nelat,nelng);sw=new LatLng(swlat,swlng)};this.toString=function(){return"("+sw.toString()+", "+ne.toString()+")"}}LatLngBounds.prototype.equals=function(other){var tsw=this.getSouthWest();var tne=this.getNorthEast();var osw=other.getSouthWest();var one=other.getNorthEast();return tsw.lat()===osw.lat()&&tsw.lng===osw.lat()&&tne.lat()===one.lat()&&tne.lng===one.lng()};LatLngBounds.prototype.containsLatLng=function(latlng){var fullLat=this.isFullLat();var fullLng=this.isFullLng();var tsw;var tne;var pointLat;var pointLng;var checkWrap;var block1;var block2;function inRange(from,to,point){return from<=point&&to>=point}if(fullLat&&fullLng){return true}tsw=this.getSouthWest();tne=this.getNorthEast();pointLat=latlng.lat();pointLng=latlng.lng();checkWrap=false;block1={sw:{lat:tsw.lat(),lng:tsw.lng()},ne:{lat:tne.lat(),lng:tne.lng()}};block2={sw:{lat:tsw.lat(),lng:tsw.lng()},ne:{lat:tne.lat(),lng:tne.lng()}};if(tne.lng()<tsw.lng()){block2.sw.lng=-180;block1.ne.lng=180;checkWrap=true}if(tsw.lat()>tne.lat()){block2.sw.lat=-90;block1.ne.lat=90;checkWrap=true}if(fullLat||inRange(block1.sw.lat,block1.ne.lat,pointLat)||(checkWrap&&inRange(block2.sw.lat,block2.ne.lat,pointLat))){if(fullLng||inRange(block1.sw.lng,block1.ne.lng,pointLng)||(checkWrap&&inRange(block2.sw.lng,block2.ne.lng,pointLng))){return true}}return false};LatLngBounds.prototype.intersects=function(other){var tsw=this.getSouthWest();var tne=this.getNorthEast();var osw=other.getSouthWest();var one=other.getNorthEast();if((tne.lat()>=one.lat()&&tsw.lat()<=one.lat())||(tne.lat()>=osw.lat()&&tsw.lat()<=osw.lat())){if((tne.lng()>=one.lng()&&tsw.lng()<=one.lng())||(tne.lng()>=osw.lng()&&tsw.lng()<=osw.lng())){return true}}return false};LatLngBounds.prototype.containsBounds=function(other){var tsw=this.getSouthWest();var tne=this.getNorthEast();var osw=other.getSouthWest();var one=other.getNorthEast();return this.containsLatLng(one)&&this.containsLatLng(osw)};LatLngBounds.prototype.toSpan=function(){var sw=this.getSouthWest();var ne=this.getNorthEast();return new LatLng(ne.lat()-sw.lat(),ne.lng()-sw.lng(),true)};LatLngBounds.prototype.isFullLat=function(){var sw=this.getSouthWest();var ne=this.getNorthEast();return sw.lat()===-90&&ne.lat()===90};LatLngBounds.prototype.isFullLng=function(){var sw=this.getSouthWest();var ne=this.getNorthEast();return sw.lng()===-180&&ne.lng()===180};LatLngBounds.prototype.isEmpty=function(){};LatLngBounds.prototype.getCenter=function(){var span=this.toSpan();var sw=this.getSouthWest();return new LatLng(sw.lat()+(span.lat()/2),sw.lng()+(span.lng()/2))};nmm.Point=Point;nmm.LatLng=LatLng;nmm.LatLngBounds=LatLngBounds})();(function(){var window=this;var nearmap=window.nearmap;var nmm=nearmap.maps;var nml=nearmap.lib;function Size(width,height){var unit="px";this.width=width;this.height=height;this.equals=function(other){if(other instanceof Size){return this.width===other.width&&this.height===other.width?true:false}else{return false}};this.copy=function(){return new Size(this.width,this.height)};this.toString=function(){return this.width+","+this.height};this.getWidthString=function(){return this.width+unit};this.getHeightString=function(){return this.height+unit}}var Projection={fromLatLngToPixel:function(latlng,zoom){},fromPixelToLatLng:function(pixel,zoom,unbounded){},tileCheckRange:function(tile,zoom,tilesize){},getWrapWidth:function(zoom){}};function MercatorProjection(zoomLevels){var MERCATOR_ORIGIN_SHIFT=nml.PI*6378137;var _worldTileDimensions;function calculateWorldTileDimensions(){var tileDimensions={};for(var i=0;i<=zoomLevels;i++){tileDimensions[i]=1<<i}return tileDimensions}function parseTileSize(tileSize){return tileSize&&tileSize.width&&tileSize.height?tileSize:(typeof tileSize==="number"?new nmm.Size(tileSize,tileSize):new nmm.Size(nmm.DEFAULT_TILE_SIZE,nmm.DEFAULT_TILE_SIZE))}function fromLatLngToPrecisePixel(latlng,zoom,tileSize){var scale;var tSize=parseTileSize(tileSize);var px,py;var mx,my;var worldShift;var resolution;var maxY;scale=getScale(zoom);maxY=scale*tSize.height;worldShift=MERCATOR_ORIGIN_SHIFT*2;resolution={x:worldShift/tSize.width/scale,y:worldShift/tSize.height/scale};mx=latlng.lng()*(MERCATOR_ORIGIN_SHIFT/180);my=Math.log(Math.tan((90+latlng.lat())*nml.PI/360))/(nml.PI/180)*(MERCATOR_ORIGIN_SHIFT/180);my=-my;px=(mx+MERCATOR_ORIGIN_SHIFT)/resolution.x;py=(my+MERCATOR_ORIGIN_SHIFT)/resolution.y;if(py<0){py=0}if(py===Infinity||py>=maxY){py=maxY-1}return{x:px,y:py}}function wrapX(maxX,x){var rem;if(x<0){rem=x%maxX;x=(rem!==0?maxX+rem:0)}else{x=(x>=maxX?x%maxX:x)}return x}function wrapY(maxY,y){var rem;if(y<0){rem=y%maxY;y=(rem!==0?maxY+rem:0)}else{y=(y>=maxY?y%maxY:y)}return y}function wrap(scale,x,y){return new nmm.Point(wrapX(scale.width,x),wrapY(scale.height,y))}function wrapTileCoordinates(zoom,tx,ty){var scale=1<<zoom;return wrap(new nmm.Size(scale,scale),tx,ty)}function wrapTileXCoordinate(zoom,tx){var scale=Math.pow(2,zoom);return wrapX(scale,tx)}function wrapTileYCoordinate(zoom,ty){var scale=Math.pow(2,zoom);return wrapY(scale,ty)}function wrapPixelCoordinates(scale,pixel,tileSize){return wrap(new nmm.Size(scale*tileSize.width,scale*tileSize.height),pixel.x,pixel.y)}function getWrapSize(zoom,tileSize){var dimension=_worldTileDimensions[zoom];return dimension*(tileSize?tileSize:nmm.DEFAULT_TILE_SIZE)}this.fromLatLngToPixel=function(latlng,zoom,tileSize){var pxPrecise=fromLatLngToPrecisePixel(latlng,zoom,tileSize);return new nmm.Point(Math.floor(pxPrecise.x),Math.floor(pxPrecise.y))};this.fromLatLngToTile=function(latlng,zoom,tileSize){var tSize=parseTileSize(tileSize);var pxPrecise;var tx,ty;pxPrecise=fromLatLngToPrecisePixel(latlng,zoom,tSize);tx=Math.floor(pxPrecise.x/tSize.width);ty=Math.floor(pxPrecise.y/tSize.height);return wrapTileCoordinates(zoom,tx,ty,tSize)};function getScale(zoom){var floorScale=Math.pow(2,Math.floor(zoom));var ceilScale=floorScale*2;var fraction=zoom%1;return floorScale+((ceilScale-floorScale)*fraction)}this.fromPixelToLatLng=function(pixel,zoom,unbounded,tileSize){var scale;var tSize=parseTileSize(tileSize);var px,py;var mx,my;var worldShift=MERCATOR_ORIGIN_SHIFT*2;var resolution;scale=getScale(zoom);resolution={x:worldShift/tSize.width/scale,y:worldShift/tSize.height/scale};if(!unbounded){pixel=wrapPixelCoordinates(scale,pixel,tSize)}mx=pixel.x*resolution.x-MERCATOR_ORIGIN_SHIFT;my=pixel.y*resolution.y-MERCATOR_ORIGIN_SHIFT;my=-my;lon=(mx/MERCATOR_ORIGIN_SHIFT)*180;lat=(my/MERCATOR_ORIGIN_SHIFT)*180;lat=180/nml.PI*(2*Math.atan(Math.exp(lat*nml.PI/180))-nml.PI/2);return new nmm.LatLng(lat,lon,unbounded)};this.fromTileToLatLng=function(tile,zoom,tileSize){var pxPnt;var tWrap;var tSize=parseTileSize(tileSize);tWrap=wrapTileCoordinates(zoom,tile.x,tile.y,tSize);pxPnt=new nmm.Point(tWrap.x*tSize.width,tWrap.y*tSize.height);return this.fromPixelToLatLng(pxPnt,zoom,false,tSize)};this.tileCheckRange=function(tile,zoom){var dimension=_worldTileDimensions[zoom];return tile.y>=0&&tile.y<dimension};this.getWrapWidth=function(zoom,tileWidth){return getWrapSize(zoom,tileWidth)};this.getWrapHeight=function(zoom,tileHeight){return getWrapSize(zoom,tileHeight)};this.wrapTileCoordinates=wrapTileCoordinates;this.wrapTileXCoordinate=wrapTileXCoordinate;this.wrapTileYCoordinate=wrapTileYCoordinate;_worldTileDimensions=calculateWorldTileDimensions()}nmm.Size=Size;nmm.Projection=Projection;nmm.MercatorProjection=MercatorProjection})();/*
 * Parse known values that browser map will use from the query string
 * of the current page load and assign the result to the nearmap namespace.
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * http://www.nearmap.com/license
 *
 * Date: 2009-06-18 10:28:00 +0800 (Thu, 18 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nearmap=window.nearmap;var nmm=nearmap.maps;var nmo=nearmap.options;var nml=nearmap.lib;var nmh=nearmap.http;var MapOutput={NORMAL:1,EMBED:2,EMBED_NOCONTROLS:3,SALES:4,IPHONE:5};var PermalinkOptions={zoom:undefined,latlng:undefined,sspn:undefined,date:undefined,mapTypeKey:undefined};var SearchQueryOptions={markerLocation:undefined,near:undefined,g:undefined};function SearchQuery(query,opts){opts=nmo.Synchronize.fill(opts,SearchQueryOptions);this.query=query;this.markerLocation=opts.markerLocation;this.near=opts.near;this.g=opts.g}function MapHttpRequest(url){var _qryStr=this.parseQueryString(url);var _searchQuery;function parseSearchQuery(queryStr){var split;var latlng;var query;if(!queryStr){return{}}split=queryStr.split("@");if(split.length!==2){return{}}try{latlng=nmm.LatLng.fromUrlValue(split[1])}catch(e){}if(!latlng){return{}}query=split[0]||queryStr;return new SearchQuery(query,{markerLocation:latlng})}this.getZoom=function(){return Math.abs(parseInt(_qryStr[nmm.ZOOM_KEY],10))};this.getLatLng=function(){var latlngStr=_qryStr[nmm.LATLNG_KEY];var latlng;try{latlng=nmm.LatLng.fromUrlValue(latlngStr);return latlng}catch(e){return null}};this.getMapType=function(){return nmm.MapType.getTypeByKey(_qryStr[nmm.MAPTYPE_KEY])};this.getTileDate=function(){var td;try{td=nml.DateHelper.fromNearmapDateUTC(_qryStr[nmm.TILE_DATE_KEY]);return td}catch(e){return null}};this.getDebug=function(){if(/([a-z0-9\-]+\.)+nearmap\.com$/.test(nmm.HOST)){return parseInt(_qryStr[nmm.DEBUG_KEY],10)}return 0};this.getDebugMaxHosts=function(){if(/([a-z0-9\-]+\.)+nearmap\.com$/.test(nmm.HOST)&&_qryStr[nmm.MAX_HOSTS_KEY]){return parseInt(_qryStr[nmm.MAX_HOSTS_KEY],10)}};this.getMapOutput=function(){var outputVal=_qryStr[nmm.OUTPUT_KEY];var outputStr=(outputVal||"").toLowerCase();var path=window.location.pathname;if(outputStr==="embed"){return MapOutput.EMBED}else{if(outputStr==="nocontrols"){return MapOutput.EMBED_NOCONTROLS}else{if(outputStr==="sales"){return MapOutput.SALES}else{if((outputStr==="iphone")||(/\/iphone\//.test(path))){return MapOutput.IPHONE}else{return MapOutput.NORMAL}}}}};this.getSearchQuery=function(){if(_searchQuery===undefined){_searchQuery=parseSearchQuery(_qryStr[nmm.SEARCH_QUERY_KEY])}return _searchQuery}}MapHttpRequest.prototype=nmh.HttpRequest;nmh.PermalinkOptions=PermalinkOptions;nmh.MapHttpRequest=MapHttpRequest;nmh.CurrentMapHttpRequest=new MapHttpRequest();nmh.MapOutput=MapOutput})();/*
 * Get the cookie required for browser map or create it if it doesn't exist.
 * Assign the map cookie to the nearmap.maps namespace for easy access
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-19 15:11:00 +0800 (Fri, 19 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nmh=window.nearmap.http;var nmm=window.nearmap.maps;var nml=window.nearmap.lib;var mapCookieName="NEARMAP20100127";var licenceCookieName="LICENCE";var LicenceType={PERSONAL:1,COMMERCIAL:2,GOVERNMENT:3,IMPLICIT:4};function MapCookie(cookie){this.getZoom=function(){return parseInt(cookie.getValue(nmm.ZOOM_KEY),10)};this.getLatLng=function(){var latlngStr=cookie.getValue(nmm.LATLNG_KEY),latlng;try{latlng=nmm.LatLng.fromUrlValue(latlngStr);return latlng}catch(e){return null}};this.getMapType=function(){return nmm.MapType.getTypeByKey(cookie.getValue(nmm.MAPTYPE_KEY))};this.getTileDate=function(){var td;try{td=nml.DateHelper.fromNearmapDateUTC(cookie.getValue(nmm.TILE_DATE_KEY))}catch(e){td=null}return td};this.getVisits=function(){var visits=parseInt(cookie.getValue(nmm.VISIT_KEY),10);return visits>0?visits:0};this.hasEdited=function(){return Boolean(cookie.getValue(nmm.EDITED_KEY))};this.setZoom=function(level){cookie.setValue(nmm.ZOOM_KEY,level)};this.setLatLng=function(latlng){cookie.setValue(nmm.LATLNG_KEY,(latlng.lat()+","+latlng.lng()))};this.setMapType=function(type){var mcode=nmm.MapType.Keys[type.getName(false)];if(mcode){cookie.setValue(nmm.MAPTYPE_KEY,mcode)}else{cookie.removeValue(nmm.MAPTYPE_KEY)}};this.setTileDate=function(date){if(!date||!(date instanceof Date)){cookie.removeValue(nmm.TILE_DATE_KEY)}else{cookie.setValue(nmm.TILE_DATE_KEY,nml.DateHelper.toNearmapDateUTC(date))}};this.IncVisit=function(){var visitCount=this.getVisits();if((visitCount===0)||(visitCount>1)){cookie.setValue(nmm.VISIT_KEY,visitCount+1)}};this.setEdited=function(){cookie.setValue(nmm.EDITED_KEY,1)};this.save=function(){cookie.save()};if(!cookie){cookie=nmh.Cookie.getCookie(mapCookieName);if(!cookie){cookie=new nmh.Cookie(mapCookieName);cookie.save()}}}function LicenceCookie(cookie){var _expireSeconds=62553600;this.setAccepted=function(accepted){cookie.setValue(nmm.ACCEPTED_KEY,(accepted?1:0))};this.getAccepted=function(){return parseInt(cookie.getValue(nmm.ACCEPTED_KEY),10)===1};this.setLicenceType=function(type){if(type){cookie.setValue(nmm.LICENCE_KEY,type)}};this.getLicenceType=function(){var lType=parseInt(cookie.getValue(nmm.LICENCE_KEY),10);if(isNaN(lType)){return null}for(var p in LicenceType){if(LicenceType.hasOwnProperty(p)&&LicenceType[p]===lType){return p}}return null};this.save=function(){cookie.save()};if(!cookie){cookie=nmh.Cookie.getCookie(licenceCookieName,_expireSeconds);if(!cookie){cookie=new nmh.Cookie(licenceCookieName,{expireSeconds:_expireSeconds});cookie.save()}}}var TileSession={get:function(){return nmh.Cookie.getCookie("nearmapsession")},createRequestUrl:function(){return nmm.HOST_URL+"maps/nmq=getsession&nmx="+(new Date()).getTime()},isAvailable:function(cookie){var content;if(!cookie){return true}content=cookie.getContent();if(content&&(/^session/.test(content))){return true}return false}};nmh.LicenceType=LicenceType;nmh.LicenceCookie=new LicenceCookie();nmh.MapCookie=new MapCookie();nmh.TileSession=TileSession})();(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nmm=window.nearmap.maps;var nme=window.nearmap.memory;var nmo=window.nearmap.options;var nml=window.nearmap.lib;var nms=window.nearmap.style;var nmev=window.nearmap.event;var nmlm=window.nearmap.lib.math;var nmh=window.nearmap.http;var nmc=nearmap.client;var HostOptions={protocol:"http://",hostPath:".nearmap.com/kh/v=nm&hl=en&x={X}&y={Y}&z={Z}",prefix:"web",nodes:(nmh.CurrentMapHttpRequest.getDebugMaxHosts()>=1?nmh.CurrentMapHttpRequest.getDebugMaxHosts():4)};HostOptions.createUrlFunction=function(opts){opts=nmo.Synchronize.fill(opts,HostOptions);return function(tile,zoom){var hostNum=(opts.nodes!==0?(tile.x+tile.y+zoom)%opts.nodes:"");return opts.protocol+opts.prefix+Math.abs(hostNum)+opts.hostPath}};var TileLayerOptions={opacity:1,isPng:false,tileUrlTemplate:HostOptions.createUrlFunction(),draggingCursor:"default",metaKey:""};var TileLayerInitilizationOptions={heading:0,layerIndex:0,tileSize:new nmm.Size(nmm.DEFAULT_TILE_SIZE,nmm.DEFAULT_TILE_SIZE),tileLoadHandler:function(e){this.style.visibility="visible"},tileErrorHandler:function(e){this.style.visibility="hidden"},downloadTiles:function(tileSet,downloadTimers,height,width,divOffset,tileSize,tileCheckRange,getTileUrl,isPng,opacity){var tileUrl;var tile;var point;for(var i=height;i--;){for(var j=width;j--;){tile=tileSet[i][j];if(tileCheckRange(tile.point,tile.zoom)){tileUrl=getTileUrl(tile.wrappedPoint,tile.zoom,tile.date);if(isPng&&opacity<1){nms.replaceIEPngTile(tile)}tile.src=tileUrl}else{tile.src=nmm.WRAP_TILE}}}}};function TileLayer(copyrights,minRes,maxRes,options){var _tileSet=[];var _timers={};var _substring="Vk52edzNRYKbGjF8Ur0WhmQlZs4wgipDETyL1oOMXIAvqtxJBuf7H36acCnS9P";var _proj;var _heading;var _tileSize;var _node;function differenceEngine(s,a){var offset=0;var result="";var alen=a.length;var v;var p;for(var i=0;i<alen;i++){v=parseInt(a.charAt(i),10);if(!isNaN(v)){offset+=v;p=s.charAt(offset%s.length);result+=p}}return result}function getSafeString(x,y,nmd){var arg=x.toString()+y.toString()+((3*x)+y).toString();if(nmd){arg+=nmd}return differenceEngine(_substring,arg)}function minResolution(){return minRes}function maxResolution(){return maxRes}function getTileUrl(point,zoom,date){var tileUrl;var nmDate;tileUrl=(typeof options.tileUrlTemplate==="function")?options.tileUrlTemplate(point,zoom):options.tileUrlTemplate;tileUrl=tileUrl.replace(/\{X\}/,point.x);tileUrl=tileUrl.replace(/\{Y\}/,point.y);tileUrl=tileUrl.replace(/\{Z\}/,zoom);if(/\{D\}/.test(tileUrl)){if(date){nmDate=nml.DateHelper.toNearmapDateUTC(date);tileUrl=tileUrl.replace(/\{D\}/,nmDate)}else{tileUrl=tileUrl.replace(/&nmd=\{D\}/,"")}}tileUrl+="&s="+getSafeString(point.x,point.y,nmDate);return tileUrl}function isPng(){return options.isPng}function getOpacity(){return options.opacity}function getCopyright(bounds,zoom){return copyrights.getCopyrightNotice(bounds,zoom)}function getMetaKey(){return options.metaKey}function getAxisTileCoordinates(tile,offset,heading){var axisOffset=nmlm.rotatePoint(heading,offset,nmm.Point.ORIGIN,Math.round);return new nmm.Point(tile.x+axisOffset.x,tile.y+axisOffset.y)}function hidePanShiftTile(tile,coords,wrapCoords,cssPos){var parent;if(tile.pngTimer){window.clearTimeout(tile.pngTimer)}if(tile.style.filter){tile.style.removeAttribute("filter")}tile.style[cssPos.direction]=cssPos.pxPnt;tile.isVertWrap=(wrapCoords.y===coords.y?false:true);tile.errored=false;if(tile.returned){parent=tile.parentNode;parent.tilesLoaded=parent.tilesLoaded>0?parent.tilesLoaded-1:0;parent.tilesReturned=parent.tilesReturned>0?parent.tilesReturned-1:0}tile.point=wrapCoords;tile.removeAttribute("src");tile.returned=false;tile.style.visibility="hidden"}function hideReorganizePanShiftTile(tile){var parent;var onload;onload=tile.onload;if(tile.style.filter){tile.style.removeAttribute("filter")}if(tile.returned){parent=tile.parentNode;if(!tile.errored){parent.tilesLoaded=parent.tilesLoaded>0?parent.tilesLoaded-1:0}parent.tilesReturned=parent.tilesReturned>0?parent.tilesReturned-1:0}if(nmc.browser.chrome||nmc.browser.safari){tile.src=nmm.DUMMY_TILE}if(tile.removeAttribute){tile.removeAttribute("src")}tile.errored=false;tile.returned=false;tile.style.visibility="hidden";tile.onload=onload}function loadPannedTile(tile,zoom,date,png,opacity){if(_proj.tileCheckRange(tile.point,zoom)){if(tile.style.visibility==="hidden"&&!tile.returned&&!tile.src){url=getTileUrl(tile.wrappedPoint,zoom,date);if(png&&opacity<1){nms.replaceIEPngTile(tile)}tile.src=url}}else{tile.src=nmm.WRAP_TILE}}function reloadTilesFast(zoom,date,rowStart,colStart,dx,dy){var rows=_tileSet.length;var cols=rows>0?_tileSet[0].length:0;var tileRow;var tile;var url;var png=isPng();var opacity=getOpacity();var r;var c;var inc;if(dy!==0){for(r=rowStart;r>=0&&r<rows;r-=dy){tileRow=_tileSet[r];for(c=0;c<cols;c++){loadPannedTile(tileRow[c],zoom,date,png,opacity)}}}if(dx!==0){inc=(dy===0?1:dy);for(c=colStart;c>=0&&c<cols;c-=dx){for(r=rowStart+dy;r>=0&&r<rows;r+=inc){loadPannedTile(_tileSet[r][c],zoom,date,png,opacity)}}}}function reloadAllTiles(zoom,date,png,opacity){return function(){var rows=_tileSet.length;var cols=(_tileSet[0]!==undefined?_tileSet[0].length:0);delete _timers.panDownloadTiles;for(var r=0;r<rows;r++){tileRow=_tileSet[r];for(var c=0;c<cols;c++){tile=tileRow[c];if(_proj.tileCheckRange(tile.point,zoom)){if(tile.style.visibility==="hidden"&&!tile.errored&&!tile.src){url=getTileUrl(tile.wrappedPoint,zoom,date);if(png){nms.replaceIEPngTile(tile)}tile.src=url}}else{tile.src=nmm.WRAP_TILE}}}}}function shiftHorizontal(zoom,rows,cols,shiftCols){var tileRow;var tile;var ORIGIN=nmm.Point.ORIGIN;for(var i=0;i<rows;i++){for(var j=0;j<shiftCols;j++){tileRow=_tileSet[i];tile=tileRow.shift();tileRow.push(tile);tile.point=nmlm.rotatePoint(-_heading,tile.point,ORIGIN,Math.round);tile.point.x+=cols;tile.point=nmlm.rotatePoint(_heading,tile.point,ORIGIN,Math.round);tile.wrappedPoint=tile.point.copy();tile.wrappedPoint.x=_proj.wrapTileXCoordinate(zoom,tile.wrappedPoint.x);hideReorganizePanShiftTile(tile);tile.style.left=(parseInt(tile.style.left,10)+(cols*_tileSize.width))+"px"}}}function unshiftHorizontal(zoom,rows,cols,unshiftCols){var tileRow;var tile;var ORIGIN=nmm.Point.ORIGIN;for(var i=0;i<rows;i++){for(var j=0;j<unshiftCols;j++){tileRow=_tileSet[i];tile=tileRow.pop();tileRow.unshift(tile);tile.point=nmlm.rotatePoint(-_heading,tile.point,ORIGIN,Math.round);tile.point.x-=cols;tile.point=nmlm.rotatePoint(_heading,tile.point,ORIGIN,Math.round);tile.wrappedPoint=tile.point.copy();tile.wrappedPoint.x=_proj.wrapTileXCoordinate(zoom,tile.wrappedPoint.x);hideReorganizePanShiftTile(tile);tile.style.left=(parseInt(tile.style.left,10)-(cols*_tileSize.width))+"px"}}}function shiftVertical(zoom,rows,cols,shiftRows){var tileRow;var tile;var ORIGIN=nmm.Point.ORIGIN;for(var s=0;s<shiftRows;s++){for(var i=1;i<rows;i++){tileRow=_tileSet[i-1];_tileSet[i-1]=_tileSet[i];_tileSet[i]=tileRow;if(i===1){for(var j=0;j<cols;j++){tile=tileRow[j];tile.point=nmlm.rotatePoint(-_heading,tile.point,ORIGIN,Math.round);tile.point.y+=rows;tile.point=nmlm.rotatePoint(_heading,tile.point,ORIGIN,Math.round);tile.wrappedPoint=tile.point.copy();tile.wrappedPoint.x=_proj.wrapTileXCoordinate(zoom,tile.wrappedPoint.x);hideReorganizePanShiftTile(tile);tile.style.top=(parseInt(tile.style.top,10)+(rows*_tileSize.height))+"px"}}}}}function unshiftVertical(zoom,rows,cols,unshiftRows){var tileRow;var tile;var newRowEnd=rows-2;var ORIGIN=nmm.Point.ORIGIN;for(var s=0;s<unshiftRows;s++){for(var i=newRowEnd;i>=0;i--){tileRow=_tileSet[i+1];_tileSet[i+1]=_tileSet[i];_tileSet[i]=tileRow;if(i===newRowEnd){for(var j=0;j<cols;j++){tile=tileRow[j];tile.point=nmlm.rotatePoint(-_heading,tile.point,ORIGIN,Math.round);tile.point.y-=rows;tile.point=nmlm.rotatePoint(_heading,tile.point,ORIGIN,Math.round);tile.wrappedPoint=tile.point.copy();tile.wrappedPoint.x=_proj.wrapTileXCoordinate(zoom,tile.wrappedPoint.x);hideReorganizePanShiftTile(tile);tile.style.top=(parseInt(tile.style.top,10)-(rows*_tileSize.height))+"px"}}}}}function stopDownloadTileTimers(){var timers=_timers.downloadTiles;for(var p in timers){if(timers.hasOwnProperty(p)){window.clearTimeout(timers[p]);delete timers[p]}}}this.initialize=function(zoom,tileDate,originTile,dimension,divOffset,proj,opts){var frag=document.createDocumentFragment();var height=dimension.height;var width=dimension.width;var tileRow;var tile;var point;var wrappedPoint;var position;stopDownloadTileTimers();opts=nmo.Synchronize.fill(opts,TileLayerInitilizationOptions);_tileSet=[];_heading=opts.heading;_tileSize=opts.tileSize;_proj=proj;_node=document.createElement("div");_node.layerIndex=opts.layerIndex;_node.tilesLoaded=0;_node.tilesReturned=0;frag.appendChild(_node);for(var i=0;i<height;i++){tileRow=[];position={y:divOffset.y+(i*_tileSize.height)};for(var j=0;j<width;j++){point=getAxisTileCoordinates(originTile,{x:j,y:i},_heading);wrappedPoint=point.copy();wrappedPoint.x=proj.wrapTileXCoordinate(zoom,wrappedPoint.x);wrappedPoint.y=proj.wrapTileYCoordinate(zoom,wrappedPoint.y);position.x=divOffset.x+(j*_tileSize.width);tile=TileLayer.createTile(point,wrappedPoint,zoom,tileDate,_tileSize,position,opts.tileLoadHandler,opts.tileErrorHandler);tileRow.push(tile);_node.appendChild(tile)}_tileSet[i]=tileRow}tileRow=null;tile=null;opts.downloadTiles(_tileSet,_timers.downloadTiles,height,width,divOffset,_tileSize,_proj.tileCheckRange,getTileUrl,isPng(),getOpacity());return frag};this.getTile=function(row,col){return _tileSet[row][col]};this.getNorthEastTile=function(){var northRow=_tileSet[0];return northRow&&northRow.length>0?northRow[northRow.length-1]:null};this.getSouthWestTile=function(){var southRow=_tileSet[_tileSet.length-1];return southRow&&southRow.length>0?southRow[0]:null};this.copyTileSet=function(){return _tileSet.slice()};this.reorganize=function(zoom,tileDate,directionX,directionY){var rows=_tileSet.length;var cols=_tileSet[0].length;var rowStart=0;var rowEnd=0;var colStart=0;var colEnd=0;var dx=(directionX!==0?directionX/Math.abs(directionX):0);var dy=(directionY!==0?directionY/Math.abs(directionY):0);if(directionX<0){colStart=cols+directionX;shiftHorizontal(zoom,rows,cols,Math.abs(directionX))}else{if(directionX>0){colStart=directionX-1;unshiftHorizontal(zoom,rows,cols,directionX)}}if(directionY<0){rowStart=rows+directionY;shiftVertical(zoom,rows,cols,Math.abs(directionY))}else{if(directionY>0){rowStart=directionY-1;unshiftVertical(zoom,rows,cols,directionY)}}reloadTilesFast(zoom,tileDate,rowStart,colStart,dx,dy)};this.clear=function(){var row;if(_timers.loadImages){window.clearTimeout(_timers.loadImages);delete _timers.loadImages}_node=null;for(var r=_tileSet.length;r--;){row=_tileSet[r];for(var c=row.length;c--;){row[c].onload=null;row[c].onerror=null}}_tileSet=[]};this.hide=function(){_node.style.display="none"};this.isHidden=function(){return _node.style.display==="none"};options=nmo.Synchronize.fill(options,TileLayerOptions);_timers.downloadTiles={};_timers.panDownloadTiles={};this.minResolution=minResolution;this.maxResolution=maxResolution;this.getTileUrl=getTileUrl;this.isPng=isPng;this.getOpacity=getOpacity;this.getCopyright=getCopyright;this.getMetaKey=getMetaKey}TileLayer.scaleTileSet=function(tileSet,scaledTileSize,divOffset){var width=scaledTileSize.width;var height=scaledTileSize.height;var offsetX=divOffset.x;var offsetY=divOffset.y;var cssText;var rowCssText;var row;var tile;var topPos;cssText="position: absolute;width:"+width+"px;height:"+height+"px;"+(nmm.debug?"border:solid 1px blue;":"");for(var i=tileSet.length;i--;){row=tileSet[i];rowCssText=cssText+"top:"+(offsetY+(height*i))+"px;";for(var j=row.length;j--;){tile=row[j];tile.style.cssText=rowCssText+"z-index:"+tile.zoom+";left:"+(offsetX+(width*j))+"px;visibility:"+(tile.style?tile.style.visibility:"hidden")+";"}}};TileLayer.createTile=function(point,wrappedPoint,zoom,tileDate,tileSize,position,tileLoadHandler,tileErrorHandler){var img=document.createElement("img");img.isMap=true;img.point=point;img.wrappedPoint=wrappedPoint;img.zoom=zoom;img.date=tileDate;img.alt="";img.galleryimg="no";img.style.cssText="position:absolute; visibility:hidden;width:"+tileSize.width+"px;height:"+tileSize.height+"px;z-index:"+zoom+";left:"+position.x+"px;top:"+position.y+"px;";img.onload=nmev.callback(img,tileLoadHandler);img.onerror=nmev.callback(img,tileErrorHandler);if(nmm.debug){img.style.border="solid 1px red"}return img};function Copyright(id,bounds,minZoom,text){this.id=id;this.bounds=bounds;this.minZoom=minZoom;this.text=text}function CopyrightCollection(prefix){var cpcol=[];function addCopyright(copyright){cpcol.push(copyright);nmev.trigger(this,"newcopyright",copyright)}function getCopyrights(bounds,zoom){var cpstr=[],cpr;for(var i=0;i<cpcol.length;i++){cpr=cpcol[i];if(zoom>=cpr.minZoom&&(cpr.bounds.containsBounds(bounds)||cpr.bounds.intersects(bounds))){cpstr.push(cpcol[i].text)}}return cpstr}function getCopyrightNotice(bounds,zoom){var cpr=getCopyrights(bounds,zoom);if(cpr.length===0){return null}return(typeof prefix==="string"?prefix+" ":"")+cpr.join(", ")}this.addCopyright=addCopyright;this.getCopyrights=getCopyrights;this.getCopyrightNotice=getCopyrightNotice;this.newcopyright=function(copyright){}}nmm.TileLayer=TileLayer;nmm.TileLayerOptions=TileLayerOptions;nmm.HostOptions=HostOptions;nmm.Copyright=Copyright;nmm.CopyrightCollection=CopyrightCollection})();/*
 * This module provides the ability to add overlay items onto the map.
 * Implemented overlay classes are:
 * - Marker
 * - Polyline
 * - TileLayerOverlay
 * - InfoWindow
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www.nearmap.com/license
 *
 * Date: 2009-11-17 15:29:00 +0800 (Tue, 17 Nov 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nmd=nearmap.dom;var nmov=nearmap.overlay;var nmm=nearmap.maps;var nmo=nearmap.options;var nms=nearmap.style;var nmev=nearmap.event;var nmc=nearmap.client;var nme=nearmap.memory;var nml=nearmap.lib;var nmls=nearmap.lib.sprite;var nmlm=nearmap.lib.math;var nma=nearmap.animation;var InfoWindowContent={createSearchResult:function(map,title,url,social){var that=this;var frag=document.createDocumentFragment();var titleWrap=document.createElement("h3");var contentWrap=document.createElement("div");var buttonWrap=document.createElement("div");var deleteButton=document.createElement("a");var shareButton;var shareLink;titleWrap.innerHTML=title;deleteButton.innerHTML="Delete";nms.css(titleWrap,{margin:"5px 30px 8px 8px",padding:"0px"},true);nms.css(contentWrap,{},true);nms.css(buttonWrap,{background:"#f0f0f0","border-top":"solid 1px #e4e4e4","font-size":"13px",padding:"10px"},true);nms.css(deleteButton,{color:"#0000ff",cursor:"pointer","text-decoration":"underline"},true);deleteButton.onclick=function(){if(shareButton){shareButton.onclick=null}deleteButton.onclick=null;that.closeInfoWindow();map.removeOverlay(that)};frag.appendChild(titleWrap);frag.appendChild(contentWrap);frag.appendChild(buttonWrap);if(url){if(social){shareButton=document.createElement("input");shareButton.type="submit";shareButton.value="Share";nms.css(shareButton,{"float":"right",position:"relative"},true);shareButton.onclick=function(){social.setUrl(url);social.open()};buttonWrap.appendChild(shareButton)}else{shareLink=document.createElement("a");shareLink.innerHTML="Share";shareLink.href=url;nms.css(shareLink,{color:"#0000ff","float":"right",position:"relative","text-decoration":"underline"},true);buttonWrap.appendChild(shareLink)}}buttonWrap.appendChild(deleteButton);return frag},createShareLocation:function(latlng,map,social){var _that=this;function onselecttext(e){this.focus();this.select()}function onsharesubmit(e){return nmev.preventDefault(e)}function ontitlekeyup(){var marker=arguments[arguments.length-2];var shareTextarea=arguments[arguments.length-1];var query=window.encodeURIComponent(this.value||"")+"@"+marker.getLatLng().toString();shareTextarea.value=map.generatePermalink({query:query});marker.state={title:this.value,shareurl:shareTextarea.value}}function oncopyclick(e){var shareTextArea=arguments[arguments.length-1];if(window.clipboardData.setData("Text",shareTextArea.value)){alert("Your marker location was copied to the clipboard")}else{alert("Your marker location couldn't be copied to the clipboard because you have disabled access")}}function ondeleteclick(e){_that.closeInfoWindow();map.removeOverlay(_that)}function createMoreButton(map,shareTextarea,social){var moreButton=document.createElement("input");moreButton.type="submit";moreButton.value="More";nms.css(moreButton,{position:"relative","float":"right"},true);moreButton.onclick=function(){map.getInfoWindow().hide();social.setUrl(shareTextarea.value);social.open()};return moreButton}function createNode(){var frag=document.createDocumentFragment();var shareForm=document.createElement("form");var inputWrap=document.createElement("div");var buttonWrap=document.createElement("div");var titleWrap=document.createElement("div");var titleLabel=document.createElement("label");var titleTextbox=document.createElement("input");var shareWrap=document.createElement("div");var shareLabel=document.createElement("label");var shareTextarea=document.createElement("textarea");var deleteButton=document.createElement("a");var mapTypeKey;var copy;mapTypeKey=nmm.MapType.Keys[map.getCurrentMapType().getName(false)];titleTextbox.id="nearmap-marker-title";titleTextbox.name="title";titleTextbox.type="text";titleTextbox.value=(_that.state&&_that.state.title)||"";titleLabel.innerHTML="Title:";titleLabel.htmlFor=titleTextbox.id;shareTextarea.id="nearmap-marker-shareurl";shareTextarea.name="shareurl";shareTextarea.innerHTML=(_that.state&&_that.state.shareurl)||map.generatePermalink({query:"@"+_that.getLatLng().toString(),latlng:latlng});shareLabel.innerHTML="Share:";shareLabel.htmlFor=shareTextarea.id;deleteButton.innerHTML="Delete";nms.css(inputWrap,{margin:"10px 10px"},true);nms.css(buttonWrap,{background:"#f0f0f0","border-top":"solid 1px #e4e4e4",padding:"10px 10px"},true);nms.css(titleWrap,{margin:"0px 0px 8px 0px"},true);nms.css(titleLabel,{color:"#004687","float":"left","font-weight":"bold",position:"relative",width:"4em"},true);nms.css(titleTextbox,{border:"solid 1px #ccc",padding:"2px 0px",width:"13em"},true);nms.css(shareLabel,{clear:"both",color:"#004687",display:"block","font-weight":"bold"},true);nms.css(shareTextarea,{border:"solid 1px #ccc",height:"100px",padding:"2px 0px",width:"240px"},true);nms.css(deleteButton,{background:"none",border:"none",color:"blue",cursor:"pointer","font-size":"12px","text-decoration":"underline"},true);shareForm.onsubmit=onsharesubmit;shareTextarea.onfocus=nmev.callback(shareTextarea,onselecttext);titleTextbox.onkeyup=nmev.callbackArgs(titleTextbox,ontitlekeyup,_that,shareTextarea);deleteButton.onclick=nmev.callbackArgs(deleteButton,ondeleteclick,_that,map);frag.appendChild(shareForm);shareForm.appendChild(inputWrap);shareForm.appendChild(buttonWrap);inputWrap.appendChild(titleWrap);inputWrap.appendChild(shareWrap);if(window.clipboardData){copy=document.createElement("a");copy.innerHTML="Copy";nms.css(copy,{color:"blue",cursor:"pointer","font-size":"12px","text-decoration":"underline"},true);copy.onclick=nmev.callbackArgs(copy,oncopyclick,shareTextarea);inputWrap.appendChild(copy)}titleWrap.appendChild(titleLabel);titleWrap.appendChild(titleTextbox);shareWrap.appendChild(shareLabel);shareWrap.appendChild(shareTextarea);if(social){buttonWrap.appendChild(createMoreButton(map,shareTextarea,social))}buttonWrap.appendChild(deleteButton);return frag}return createNode()}};function Overlay(){this.initialize=function(map){throw new Exception("Required Interface method not implemented: initialize")};this.remove=function(){throw new Exception("Required Interface method not implemented: remove")};this.copy=function(){throw new Exception("Required Interface method not implemented: copy")};this.redraw=function(force){throw new Exception("Required Interface method not implemented: redraw")};this.getKml=function(callback){throw new Exception("Required Interface method not implemented: getKml")}}Overlay.getZIndex=function(latitude){return latitude*-100000<<5};var MapPane={MAP_PANE:0,OVERLAY_LAYER_PANE:1,MARKER_SHADOW_PANE:2,MARKER_PANE:4,FLOAT_SHADOW_PANE:5,MARKER_MOUSE_TARGET_PANE:6,FLOAT_PANE:7};function Icon(copy,image){if(copy){nmo.Synchronize.copy(copy,this)}if(image){this.image=image}}Icon.DEFAULT_ICON=new Icon(null,nmm.HOST_URL+"img/default-marker-icon.png");Icon.DEFAULT_ICON.iconSize=new nmm.Size(30,34);Icon.DEFAULT_ICON.iconAnchor=new nmm.Point(-15,-34);Icon.DEFAULT_ICON.imageMap=[];Icon.DEFAULT_ICON.maxHeight=20;Icon.DEFAULT_ICON.dragCrossImage=nmm.HOST_URL+"img/default_drag_cross.png";Icon.DEFAULT_ICON.dragCrossSize=new nmm.Size(21,17);Icon.DEFAULT_ICON.dragCrossAnchor=new nmm.Point(-10,-6);Icon.DEFAULT_DRAGGABLE_ICON=new Icon(Icon.DEFAULT_ICON,nmm.HOST_URL+"img/default-draggable-marker-icon.png");Icon.DEFAULT_DRAGGABLE_ICON.iconSize=new nmm.Size(27,33);Icon.DEFAULT_DRAGGABLE_ICON.iconAnchor=new nmm.Point(-14,-33);var MarkerOptions={icon:Icon.DEFAULT_ICON,dragCrossMove:false,title:undefined,clickable:true,draggable:false,bouncy:true,bounceGravity:1,autoPan:true,zIndexProcess:function(){},hide:false};var LabeledMarkerOptions={labelText:"",labelClass:"",labelOffset:new nmm.Size(MarkerOptions.icon.iconAnchor.x+10,MarkerOptions.icon.iconAnchor.y+2),icon:MarkerOptions.icon,dragCrossMove:MarkerOptions.dragCrossMove,title:MarkerOptions.title,clickable:MarkerOptions.clickable,draggable:MarkerOptions.draggable,bouncy:MarkerOptions.draggable,bounceGravity:MarkerOptions.bounceGravity,autoPan:MarkerOptions.autoPan,zIndexProcess:MarkerOptions.zIndexProcess,hide:MarkerOptions.hide};var OverlayHelper={reposition:function(images,latlng,map,pixelOffset){var divPx=map.fromLatLngToDivPixel(latlng);var divOffsetPx;var image;divOffsetPx=(pixelOffset?new nmm.Point(divPx.x+pixelOffset.width,divPx.y+pixelOffset.height):divPx);for(var i=images.length;i--;){image=images[i];image.style.left=divOffsetPx.x+"px";image.style.top=divOffsetPx.y+"px"}return divPx},isInCenteredViewport:function(divPx,map){var tileContainer=map.getTileContainer();var size=map.getSize(true);var left=parseInt(tileContainer.style.left,10);var divCenter=Math.floor(size.width/2)-left;var mapType=map.getCurrentMapType();var sclTSize=mapType.getScaledTileSize();var halfPx=Math.floor(mapType.getProjection().getWrapWidth(map.getZoom(),sclTSize.width)/2);return Math.abs(divCenter-divPx.x)<=halfPx}};function Marker(latlng,opts){var _that=this;var _draggable;var _isInfoWindowOpen=false;var _infoWindowOpts=null;var _infoWindowDom=null;var _infoWindowHtml=null;var _infoWindowTabsDom=null;var _infoWindowTabsHtml=null;function copy(){}function getKml(callback){}function openInfoWindow(content,opts){bindInfoWindow(content,opts);this.map.openInfoWindow(latlng,content,opts);_isInfoWindowOpen=true}function openInfoWindowHtml(content,opts){bindInfoWindowHtml(content,opts);this.map.openInfoWindowHtml(latlng,content,opts);_isInfoWindowOpen=true}function openInfoWindowTabs(tabs,opts){bindInfoTabs(tabs,opts);this.map.openInfoWindowTabs(latlng,content,opts);_isInfoWindowOpen=true}function openInfoWindowTabsHtml(tabs,opts){bindInfoTabsHtml(tabs,opts);this.map.openInfoWindowTabsHtml(latlng,content,opts);_isInfoWindowOpen=true}function bindInfoWindow(content,opts){_infoWindowDom=content;_infoWindowOpts=opts}function bindInfoWindowHtml(content,opts){_infoWindowHtml=content;_infoWindowOpts=opts}function bindInfoWindowTabs(tabs,opts){_infoWindowTabs=content;_infoWindowOpts=opts}function bindInfoWindowTabsHtml(tabs,opts){_infoWindowTabsHtml=content;_infoWindowOpts=opts}function closeInfoWindow(){if(_isInfoWindowOpen){this.map.getInfoWindow().hide();_isInfoWindowOpen=false}}function setInfoWindowOpen(isOpen){_isInfoWindowOpen=isOpen}function showMapBlowup(opts){}function getIcon(){return this.opts.icon}function getTitle(){return this.opts.title}function getLatLng(){return latlng}function setLatLng(ll){latlng=ll}function enableDragging(){_draggable=true}function disableDragging(){_draggable=false}function draggable(){return this.opts.draggable}function draggingEnabled(){return _draggable}function setImage(url){}function hide(){this.foregroundImage.style.display="none";if(this.shadowImage){this.shadowImage.style.display="none"}}function show(){this.foregroundImage.style.display="";if(this.shadowImage){this.shadowImage.style.display=""}}function isHidden(){return this.foregroundImage.style.display==="none"}this.copy=copy;this.getKml=getKml;this.openInfoWindow=openInfoWindow;this.openInfoWindowHtml=openInfoWindowHtml;this.openInfoWindowTabs=openInfoWindowTabs;this.openInfoWindowTabsHtml=openInfoWindowTabsHtml;this.bindInfoWindow=bindInfoWindow;this.bindInfoWindowTabs=bindInfoWindowTabs;this.bindInfoWindowTabsHtml=bindInfoWindowTabsHtml;this.closeInfoWindow=closeInfoWindow;this.setInfoWindowOpen=setInfoWindowOpen;this.showMapBlowup=showMapBlowup;this.getIcon=getIcon;this.getTitle=getTitle;this.getLatLng=getLatLng;this.setLatLng=setLatLng;this.enableDragging=enableDragging;this.disableDragging=disableDragging;this.draggable=draggable;this.draggingEnabled=draggingEnabled;this.setImage=setImage;this.hide=hide;this.show=show;this.isHidden=isHidden;this.opts=nmo.Synchronize.fill(opts,MarkerOptions);this.speed=0;this.direction=1;this.bounceHeight=0.3;_draggable=this.opts.draggable}Marker.prototype=new Overlay();Marker.prototype.constructor=Marker;Marker.prototype.oninfowindowhidden=function(){this.setInfoWindowOpen(false)};Marker.prototype.oninfowindowredraw=function(){this.setInfoWindowOpen(false)};Marker.prototype.onmarkerclick=function(e){var latlng=this.getLatLng();var container;var clickedLatLng;e=e||window.event;container=this.map.getContainer();clickedLatLng=this.map.fromContainerPixelToLatLng(new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop));nmev.trigger(this.map,"click",this,clickedLatLng,latlng);nmev.trigger(this,"click",latlng);return nmev.stopBubbling(e)};Marker.prototype.onmarkerdblclick=function(e){nmev.trigger(this,"dblclick",this.getLatLng());return nmev.stopBubbling(e)};Marker.prototype.moveIcons=function(distance){var foregroundImage=this.foregroundImage;var shadowImage=this.shadowImage;var dragCrossImage=this.dragCrossImage;foregroundImage.style.left=(parseInt(foregroundImage.style.left,10)+distance.x)+"px";foregroundImage.style.top=(parseInt(foregroundImage.style.top,10)+distance.y)+"px";if(shadowImage){shadowImage.style.left=(parseInt(shadowImage.style.left,10)+distance.x)+"px";shadowImage.style.top=(parseInt(shadowImage.style.top,10)+distance.y)+"px"}if(dragCrossImage){dragCrossImage.style.left=(parseInt(dragCrossImage.style.left,10)+distance.x)+"px";dragCrossImage.style.top=(parseInt(dragCrossImage.style.top,10)+distance.y)+"px"}};Marker.prototype.positionDragCross=function(position){var icon=this.opts.icon;nms.css(this.dragCrossImage,{display:"",left:(position.x+icon.dragCrossAnchor.x)+"px",top:(position.y+icon.dragCrossAnchor.y)+"px","z-index":Overlay.getZIndex(this.getLatLng().lat())})};Marker.prototype.renderPickup=function(){var crossPx=this.map.fromLatLngToDivPixel(this.getLatLng());var icon=this.opts.icon;if(this.opts.dragCrossMove){this.dragCeil=parseInt(this.foregroundImage.style.top,10);this.dragFloor=this.dragCeil+icon.maxHeight-icon.iconAnchor.y;crossPx.y=this.dragFloor}else{this.dragFloor=parseInt(this.foregroundImage.style.top,10);this.dragCeil=this.dragFloor-icon.maxHeight;this.foregroundImage.style.top=(this.dragFloor-icon.maxHeight)+"px"}Marker.prototype.positionDragCross.call(this,crossPx)};Marker.prototype.animateMarkerFalling=function(startDate,currentDate){var top;var speed;speed=this.speed+(this.direction>0?this.opts.bounceGravity:this.opts.bounceGravity*2);top=parseInt(this.foregroundImage.style.top,10)+speed;if(top>this.dragFloor){top=this.dragFloor}if(top<this.dragCeil){top=this.dragCeil}if(top===this.dragFloor){_direction=-1;this.dragCeil=this.dragFloor-Math.floor((this.dragFloor-this.dragCeil)*this.bounceHeight);speed=speed*-1}if(top===this.dragCeil){this.direction=1;speed=0}this.foregroundImage.style.top=top+"px";this.speed=speed};Marker.prototype.markerDropEnd=function(){if(this.dragCrossImage){this.dragCrossImage.style.display="none"}this.direction=1;this.speed=0;this.foregroundImage.style.top=this.dragFloor+"px"};Marker.prototype.stopMarkerBounce=function(){var that=this;return function(){return that.dragCeil===that.dragFloor}};Marker.prototype.renderDrop=function(){var frameLength;if(this.opts.bouncy){frameLength=Math.floor(1000/24);nma.runContinuousAnimation(frameLength,nmev.callback(this,Marker.prototype.animateMarkerFalling),nmev.callback(this,Marker.prototype.markerDropEnd),Marker.prototype.stopMarkerBounce.call(this))}else{Marker.prototype.markerDropEnd.call(this)}};Marker.prototype.onmarkermousemove=function(e){var map=this.map;var latlng;var mapType;var proj;var tScale;var heading;var distMoved;var sclDistMoved;var rotatedDistMoved;this.moved=true;if(this.draggingEnabled()){e=e||window.event;mapType=map.getCurrentMapType();proj=mapType.getProjection();latlng=this.getLatLng();this.foregroundImage.style.cursor=nmls.CURSOR_PAN_DOWN.css;if(!this.latlngPx){Marker.prototype.renderPickup.call(this);this.latlngPx=proj.fromLatLngToPixel(latlng,map.getZoom(),mapType.getTileSize());nmev.trigger(this,"dragstart",latlng)}else{nmev.trigger(this,"drag",latlng)}heading=mapType.getHeading();tScale=mapType.getTileScale();distMoved=new nmm.Point(e.clientX-this.clientX,e.clientY-this.clientY);sclDistMoved=new nmm.Point(distMoved.x/tScale.x,distMoved.y/tScale.y);rotatedDistMoved=nmlm.rotatePoint(heading,sclDistMoved,nmm.Point.ORIGIN,Math.round);this.clientX=e.clientX;this.clientY=e.clientY;this.latlngPx.add(rotatedDistMoved.x,rotatedDistMoved.y);this.setLatLng(proj.fromPixelToLatLng(this.latlngPx,map.getZoom(),false,mapType.getTileSize()));this.dragCeil=this.dragCeil+distMoved.y;this.dragFloor=this.dragFloor+distMoved.y;Marker.prototype.moveIcons.call(this,distMoved);return nmev.preventDefault(e)}};Marker.prototype.onwindowmarkermouseup=function(e){e=e||window.event;if(this.opts.draggable&&this.moved){Marker.prototype.renderDrop.call(this);nmev.trigger(this,"dragend",this.getLatLng())}else{if(!this.moved){Marker.prototype.onmarkerclick.call(this,e)}}this.foregroundImage.style.cursor="pointer";nmev.removeListener(this.onwindowmarkermouseup);nmev.removeListener(this.onmarkermousemove);delete this.onwindowmarkermouseup;delete this.onmarkermousemove;delete this.latlngPx;delete this.clientX;delete this.clientY;delete this.moved;return nmev.preventDefault(e)};Marker.prototype.onmarkermousedown=function(e){e=e||window.event;if(nmev.getMouseButton(e)===nmev.MouseButton.LEFT_BUTTON){this.clientX=e.clientX;this.clientY=e.clientY;this.onmarkermousemove=nmev.addDomListener(document,"mousemove",nmev.callback(this,Marker.prototype.onmarkermousemove));this.onwindowmarkermouseup=nmev.addDomListener(document,"mouseup",nmev.callback(this,Marker.prototype.onwindowmarkermouseup))}nmev.trigger(this,"mousedown",this.getLatLng());nmev.stopBubbling(e);return nmev.preventDefault(e)};Marker.prototype.onmarkermouseup=function(e){nmev.trigger(this,"mouseup",this.getLatLng())};Marker.prototype.onmarkermouseover=function(e){nmev.trigger(this,"mouseover",this.getLatLng())};Marker.prototype.onmarkermouseout=function(e){nmev.trigger(this,"mouseout",this.getLatLng())};Marker.prototype.initialize=function(map){var opts=this.opts;var icon=opts.icon;var foregroundImage;var shadowImage;var dragCrossImage;var tooltip;var infoWindow;foregroundImage=document.createElement("div");shadowImage=null;dragCrossImage=document.createElement("div");infoWindow=map.getInfoWindow();nms.css(foregroundImage,{height:icon.iconSize.getHeightString(),width:icon.iconSize.getWidthString(),position:"absolute"},true);nms.applyPngAlphaBg(foregroundImage,icon.image);nms.css(dragCrossImage,{display:"none",height:icon.dragCrossSize.getHeightString(),width:icon.dragCrossSize.getWidthString(),position:"absolute"},true);nms.applyPngAlphaBg(dragCrossImage,icon.dragCrossImage);if(opts.title){tooltip=new nmd.Tooltip(opts.title,foregroundImage,map.getContainer())}if(opts.clickable){foregroundImage.style.cursor="pointer";foregroundImage.onmousedown=nmev.callback(this,Marker.prototype.onmarkermousedown);foregroundImage.onmouseup=nmev.callback(this,Marker.prototype.onmarkermouseup);foregroundImage.onclick=nmev.stopBubbling;foregroundImage.ondblclick=nmev.callback(this,Marker.prototype.onmarkerdblclick)}foregroundImage.onmouseover=nmev.callback(this,Marker.prototype.onmarkermouseover);foregroundImage.onmouseout=nmev.callback(this,Marker.prototype.onmarkermouseout);this.onmapsetcenter=nmev.addListener(map,"setcenter",nmev.callbackArgs(this,Marker.prototype.redraw,true));this.oninfowindowhidden=nmev.addListener(infoWindow,"hidden",nmev.callback(this,Marker.prototype.oninfowindowhidden));this.oninfowindowredraw=nmev.addListener(infoWindow,"redraw",nmev.callback(this,Marker.prototype.oninfowindowredraw));map.getPane(MapPane.MARKER_PANE).appendChild(foregroundImage);map.getPane(MapPane.MARKER_SHADOW_PANE).appendChild(dragCrossImage);this.infoWindow=infoWindow;this.foregroundImage=foregroundImage;this.shadowImage=shadowImage;this.dragCrossImage=dragCrossImage;this.tooltip=tooltip;this.map=map};Marker.prototype.redraw=function(force){var opts;var px;var foregroundImage;var shadowImage;var dragCrossImage;var latlng;var iconAnchor;if(!force){return}opts=this.opts;latlng=this.getLatLng();px=this.map.fromLatLngToDivPixel(latlng);foregroundImage=this.foregroundImage;shadowImage=this.shadowImage;dragCrossImage=this.dragCrossImage;iconAnchor=opts.icon.iconAnchor;foregroundImage.style.left=(px.x+iconAnchor.x)+"px";foregroundImage.style.top=(px.y+iconAnchor.y)+"px";foregroundImage.style.zIndex=Overlay.getZIndex(latlng.lat());if(shadowImage){}};Marker.prototype.remove=function(){var container=this.map.getContainer();var foregroundImage=this.foregroundImage;this.foregroundImage=null;foregroundImage.onmousedown=null;foregroundImage.onmouseup=null;foregroundImage.onclick=null;foregroundImage.ondblclick=null;foregroundImage.onmouseover=null;foregroundImage.onmouseout=null;nme.discardElement(foregroundImage,container);if(this.shadowImage){nme.discardElement(this.shadowImage,container);this.shadowImage=null}if(this.dragCrossImage){nme.discardElement(this.dragCrossImage,container);this.dragCrossImage=null}nmev.removeListener(this.onmapsetcenter);nmev.removeListener(this.oninfowindowhidden);nmev.removeListener(this.oninfowindowredraw);this.onmapsetcenter=null;this.oninfowindowhidden=null;this.oninfowindowredraw=null};function LabeledMarker(latlng,opts){Marker.apply(this,arguments);this.opts=nmo.Synchronize.fill(opts,LabeledMarkerOptions)}LabeledMarker.prototype=new Marker(new nmm.LatLng(0,0));LabeledMarker.prototype.constructor=LabeledMarker;LabeledMarker.prototype.initialize=function(map){var labelDiv;Marker.prototype.initialize.call(this,map);labelDiv=document.createElement("div");if(this.opts.labelClass){labelDiv.className=this.opts.labelClass}if(this.opts.clickable){labelDiv.style.cursor="pointer"}labelDiv.innerHTML=this.opts.labelText;labelDiv.style.position="absolute";nmev.disableSelect(labelDiv);map.getPane(MapPane.MARKER_PANE).appendChild(labelDiv);this.map=map;this.labelDiv=labelDiv};LabeledMarker.prototype.redraw=function(force){var opts;var px;var labelDiv;var z;var latlng;if(!force){return}Marker.prototype.redraw.call(this,force);opts=this.opts;latlng=this.getLatLng();px=this.map.fromLatLngToDivPixel(latlng);labelDiv=this.labelDiv;z=Overlay.getZIndex(latlng.lat());labelDiv.style.left=(px.x+opts.labelOffset.width)+"px";labelDiv.style.top=(px.y+opts.labelOffset.height)+"px";labelDiv.style.zIndex=z+1;labelDiv.style.color="#fff";labelDiv.style.fontSize="14px"};LabeledMarker.prototype.remove=function(force){nme.discardElement(this.labelDiv,this.map.getContainer());this.labelDiv=null;Marker.prototype.remove.call(this)};var MarkerManagerOptions={borderPadding:0,maxZoom:null,trackMarkers:false};function MarkerManager(map,opts){var _markers=[];var _timers={};function doRefresh(){var size=map.getSize(true);var zoom=map.getZoom();var mapType=map.getCurrentMapType();var proj=mapType.getProjection();var sclTSize=mapType.getScaledTileSize();var wrapWidth=proj.getWrapWidth(zoom,sclTSize.width);var wrapHeight=proj.getWrapHeight(zoom,sclTSize.height);delete _timers.refresh;refresh(wrapWidth<=size.width||wrapHeight<size.height)}function delayrefresh(){if(_markers.length>0){if(_timers.refresh){window.clearTimeout(_timers.refresh)}_timers.refresh=window.setTimeout(doRefresh,100)}}function getPaddedBounds(){var padding=opts.borderPadding;var bounds=map.getBounds();var mapType;var proj;var zoom;var sclTSize;var swpx,nepx;var sw,ne;var dimension;var wrapWidth;var wrapHeight;if(padding===0){return bounds}mapType=map.getCurrentMapType();proj=mapType.getProjection();zoom=map.getZoom();sclTSize=mapType.getScaledTileSize();wrapWidth=proj.getWrapWidth(zoom,sclTSize.width);wrapHeight=proj.getWrapHeight(zoom,sclTSize.height);swpx=proj.fromLatLngToPixel(bounds.getSouthWest(),zoom,sclTSize);nepx=proj.fromLatLngToPixel(bounds.getNorthEast(),zoom,sclTSize);swpx.x-=padding;swpx.y+=padding;nepx.x+=padding;nepx.y-=padding;if(nepx.y<0){nepx.y=0}if(swpx.y>=wrapHeight){swpx.y=wrapHeight-1}sw=proj.fromPixelToLatLng(swpx,zoom,false,sclTSize);ne=proj.fromPixelToLatLng(nepx,zoom,false,sclTSize);if(swpx.x<0){sw=new nmm.LatLng(sw.lat(),-180)}if(nepx.x>=wrapWidth){ne=new nmm.LatLng(ne.lat(),180)}return new nmm.LatLngBounds(sw,ne)}function shouldBeVisible(marker,minZoom,maxZoom,paddedBounds,currentZoom){return currentZoom>=minZoom&&currentZoom<=maxZoom&&paddedBounds.containsLatLng(marker.getLatLng())}function onsetcenter(){refresh(true)}function addMarkers(markers,minZoom,maxZoom){var len=markers.length;for(var i=0;i<len;i++){_markers.push({marker:markers[i],minZoom:minZoom,maxZoom:maxZoom,added:false})}}function addMarker(marker,minZoom,maxZoom){if(shouldBeVisible(marker,minZoom,maxZoom,getPaddedBounds(),map.getZoom())){map.addOverlay(marker)}_markers.push({marker:marker,minZoom:minZoom,maxZoom:maxZoom,added:true})}function refresh(force){var len=_markers.length;var paddedBounds=getPaddedBounds();var zoom=map.getZoom();var manageMarker;var marker;for(var i=0;i<len;i++){manageMarker=_markers[i];marker=manageMarker.marker;if(shouldBeVisible(marker,manageMarker.minZoom,manageMarker.maxZoom,paddedBounds,zoom)){if(!manageMarker.added){map.addOverlay(marker);manageMarker.added=true}else{marker.redraw(force)}}else{if(manageMarker.added){map.removeOverlay(marker);manageMarker.added=false}}}}function getMarkerCount(zoom){var cnt=0;var len=_markers.length;for(var i=0;i<len;i++){if(_markers[i].maxZoom<=zoom){cnt++}}return cnt}function clearMarkers(){var len=_markers.length;if(len>0){for(var i=0;i<len;i++){if(_markers[i].added){map.removeOverlay(_markers[i].marker)}}_markers=[]}}this.addMarkers=addMarkers;this.addMarker=addMarker;this.refresh=refresh;this.getMarkerCount=getMarkerCount;this.clearMarkers=clearMarkers;opts=nmo.Synchronize.fill(opts,MarkerManagerOptions);nmev.addListener(map,"setcenter",onsetcenter);nmev.addListener(map,"moveend",delayrefresh)}nmov.InfoWindowContent=InfoWindowContent;nmov.MapPane=MapPane;nmov.Icon=Icon;nmov.Overlay=Overlay;nmov.OverlayHelper=OverlayHelper;nmov.Marker=Marker;nmov.LabeledMarker=LabeledMarker;nmov.MarkerOptions=MarkerOptions;nmov.MarkerManagerOptions=MarkerManagerOptions;nmov.MarkerManager=MarkerManager})();/*
 * Class definitions for objects relating to the map type. Map types are a collection of TileLayers with some meta
 * information.
 *
 * http://nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-06-24 13:11:00 +0800 (Fri, 24 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var nearmap=window.nearmap;var nmm=nearmap.maps;var nmo=nearmap.options;var nml=nearmap.lib;var nmlm=nearmap.lib.math;var nmev=nearmap.event;var worldBounds;var prefix="&copy; "+new Date().getFullYear();var basecopyrights;var mvcopyrights;var errorMsg;errorMsg="We are sorry, but we don't have imagery at this zoom level for this region.<p>We are sorry, but we don't have imagery at this zoom level for this region.</p>";worldBounds=new nmm.LatLngBounds(new nmm.LatLng(-90,-180),new nmm.LatLng(90,180));basecopyrights=new nmm.CopyrightCollection(prefix);mvcopyrights=new nmm.CopyrightCollection(prefix);basecopyrights.addCopyright(new nmm.Copyright(1,worldBounds,0,"Nearmap"));mvcopyrights.addCopyright(new nmm.Copyright(2,worldBounds,0,"Nearmap"));var MapTypeOptions={shortName:null,urlArg:nmm.HOST_URL,maxResolution:null,minResolution:null,tileSize:256,tileScale:new nmm.Point(1,1),textColor:"#000",linkColor:"#7777cc",errorMessage:"",alt:"",radius:6378137,heading:0};function MapType(layers,projection,name,opts){var _that=this;var _maxRes=0;var _minRes=0;var _getMin=false;var _getMax=false;var _scaledTileSize;this.getSpanZoomLevel=function(center,span,viewSize){};this.getBoundsZoomLevel=function(bounds,viewSize){};this.getName=function(small){return small?opts.shortName:name};this.getProjection=function(){return projection};this.getTileSize=function(){return opts.tileSize};this.getTileScale=function(){return opts.tileScale};this.getScaledTileSize=function(){return _scaledTileSize};this.getTileLayers=function(){return layers};this.getTileLayerMetaKeys=function(){var keys=[];var len=layers.length;for(var i=0;i<len;i++){keys[i]=layers[i].getMetaKey()}return keys};this.getMinimumResolution=function(){return opts.minResolution};this.getMaximumResolution=function(){return opts.maxResolution};this.getTextColor=function(){return opts.textColor};this.getLinkColor=function(){return opts.linkColor};this.getErrorMessage=function(){return opts.errorMessage};this.getCopyrights=function(bounds,zoom){var cprstr="",lcpr;for(var i=0;i<layers.length;i++){lcpr=layers[i].getCopyright(bounds,zoom);if(lcpr&&cprstr.indexOf(lcpr)===-1){cprstr+=cprstr===""?lcpr:" "+lcpr}}return cprstr};this.getUrlArg=function(){return opts.urlArg};this.getAlt=function(){return opts.alt};this.getHeading=function(){return opts.heading};this.equals=function(obj){return(obj instanceof MapType)&&name===obj.getName(false)};this.hideAllTileLayers=function(){var layers=this.getTileLayers();var layer;for(var i=layers.length;i--;){layer=layers[i];layer.hide()}};this.hideTransparentLayers=function(){var layers=this.getTileLayers();var layer;for(var i=layers.length;i--;){layer=layers[i];if(layer.isPng()&&layer.getOpacity()<1){layer.hide()}}};this.getVisibleTileSets=function(){var visible=[];var layers=this.getTileLayers();var layer;for(var i=layers.length;i--;){layer=layers[i];if(!layer.isHidden()){visible.push(layer.copyTileSet())}}return visible};this.clearTileLayerTileSets=function(){var layers=this.getTileLayers();for(var i=layers.length;i--;){layers[i].clear()}};opts=nmo.Synchronize.fill(opts,MapTypeOptions);_scaledTileSize=new nmm.Size(opts.tileSize*opts.tileScale.x,opts.tileSize*opts.tileScale.y);if(!opts.shortName){opts.shortName=name}if(typeof opts.maxResolution!=="number"||opts.maxResolution<0){_getMax=true}if(typeof opts.minResolution!=="number"||opts.minResolution<0){_getMin=true}if(_getMax||_getMin){for(var i=0;i<layers.length;i++){if(_maxRes){_maxRes=layers[i].maxResolution();if(_maxRes>opts.maxResolution){opts.maxResolution=_maxRes}}if(_minRes){_minRes=layers[i].minResolution();if(_minRes>opts.minResolution){opts.minResolution=_minRes}}}}}MapType.PHOTO_MAP=new MapType([new nmm.TileLayer(basecopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=Vert"}),metaKey:"Vert"})],new nmm.MercatorProjection(24),"PHOTO_MAP",{shortName:"PhotoMap",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg});MapType.MULTI_VIEW_MAP=new MapType([new nmm.TileLayer(mvcopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=N"}),metaKey:"N___"})],new nmm.MercatorProjection(24),"MULTI_VIEW_MAP",{shortName:"Multiview",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.75),errorMessage:errorMsg,heading:0});MapType.MULTI_VIEW_NORTH_MAP=new MapType([new nmm.TileLayer(mvcopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=N"}),metaKey:"N___"})],new nmm.MercatorProjection(24),"MULTI_VIEW_NORTH_MAP",{shortName:"North",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.75),errorMessage:errorMsg,heading:0});MapType.MULTI_VIEW_EAST_MAP=new MapType([new nmm.TileLayer(mvcopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=E"}),metaKey:"E___"})],new nmm.MercatorProjection(24),"MULTI_VIEW_EAST_MAP",{shortName:"East",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.5),errorMessage:errorMsg,heading:90});MapType.MULTI_VIEW_SOUTH_MAP=new MapType([new nmm.TileLayer(mvcopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&&nml=S"}),metaKey:"S___"})],new nmm.MercatorProjection(24),"MULTI_VIEW_SOUTH_MAP",{shortName:"South",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.75),errorMessage:errorMsg,heading:180});MapType.MULTI_VIEW_WEST_MAP=new MapType([new nmm.TileLayer(mvcopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=W"}),metaKey:"W___"})],new nmm.MercatorProjection(24),"MULTI_VIEW_WEST_MAP",{shortName:"West",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.5),errorMessage:errorMsg,heading:270});MapType.SATELLITE_MAP=MapType.PHOTO_MAP;MapType.NORMAL_MAP=new MapType([new nmm.TileLayer(basecopyrights,1,24,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=Map_"+(nearmap.http.CurrentMapHttpRequest.getDebug()===4?"&nmg=1":"")}),metaKey:"Map_"})],new nmm.MercatorProjection(24),"NORMAL_MAP",{shortName:"Map",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg});MapType.HYBRID_MAP=new MapType([new nmm.TileLayer(basecopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=Vert"}),metaKey:"Vert"}),new nmm.TileLayer(basecopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nml=MapT"+(nearmap.http.CurrentMapHttpRequest.getDebug()===4?"&nmg=1":"")}),metaKey:"MapT",isPng:true,opacity:0})],new nmm.MercatorProjection(24),"HYBRID_MAP",{shortName:"StreetMap",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg});MapType.PHYSICAL_MAP=new MapType([new nmm.TileLayer(basecopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=Dem"}),metaKey:"Dem_"})],new nmm.MercatorProjection(24),"PHYSICAL_MAP",{shortName:"Terrain",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg});MapType.PHYSICAL_HYBRID_MAP=new MapType([new nmm.TileLayer(basecopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nmd={D}&nml=Dem"}),metaKey:"Dem_"}),new nmm.TileLayer(basecopyrights,1,22,{tileUrlTemplate:nmm.HostOptions.createUrlFunction({hostPath:"."+nmm.HOST_STRIP_FIRST_SUBDOMAIN+"/maps/hl=en&x={X}&y={Y}&z={Z}&nml=Map"}),metaKey:"MapT",isPng:true,opacity:0})],new nmm.MercatorProjection(24),"PHYSICAL_HYBRID_MAP",{shortName:"Terrain/Streetmap",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg});MapType.MAPMAKER_NORMAL_MAP=null;MapType.MAPMAKER_HYBRID_MAP=null;MapType.MOON_ELEVATION_MAP=null;MapType.MOON_VISIBLE_MAP=null;MapType.MARS_ELEVATION_MAP=null;MapType.MARS_VISIBLE_MAP=null;MapType.MARS_INFRARED_MAP=null;MapType.SKY_VISIBLE_MAP=null;MapType.SATELLITE_3D_MAP=null;MapType.DEFAULT_MAP_TYPES=[MapType.SATELLITE_MAP,MapType.HYBRID_MAP];MapType.MAPMAKER_MAP_TYPES=[MapType.MAPMAKER_NORMAL_MAP,MapType.SATELLITE_MAP,MapType.MAPMAKER_HYBRID_MAP];MapType.MOON_MAP_TYPES=[MapType.MOON_ELEVATION_MAP,MapType.MOON_VISIBLE_MAP];MapType.MARS_MAP_TYPES=[MapType.MARS_ELEVATION_MAP,MapType.MARS_VISIBLE_MAP,MapType.MARS_INFRARED_MAP];MapType.SKY_MAP_TYPES=[MapType.SKY_VISIBLE_MAP];MapType.Keys={PHOTO_MAP:"k",SATELLITE_MAP:"k",NORMAL_MAP:"m",HYBRID_MAP:"h",PHYSICAL_MAP:"p",PHYSICAL_HYBRID_MAP:"ph",MULTI_VIEW_MAP:"mv",MULTI_VIEW_NORTH_MAP:"n",MULTI_VIEW_EAST_MAP:"e",MULTI_VIEW_SOUTH_MAP:"s",MULTI_VIEW_WEST_MAP:"w"};MapType.getTypeByKey=function(key){var type;if(typeof key!=="string"){return}for(var p in MapType){if(MapType.hasOwnProperty(p)){if(MapType[p] instanceof MapType){type=MapType[p];if(type&&MapType.Keys[p]===key){return type}}}}};nmm.MapType=MapType;nmm.MapTypeOptions=MapTypeOptions})();(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nmm=nearmap.maps;var nmev=nearmap.event;var nmc=nearmap.client;function MapUIOptions(opt_size){var isSmall=(opt_size.width<400||opt_size.height<300||false);this.maptypes={normal:false,satellite:true,hybrid:true,physical:true};this.zoom={scrollwheel:true,doubleclick:true};this.keyboard=true;this.controls={largemapcontrol3d:!isSmall,smallzoomcontrol3d:isSmall,maptypecontrol:!isSmall,menumaptypecontrol:isSmall,scalecontrol:!isSmall}}var KeyboardKeys={PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,ARROW_LEFT:37,ARROW_UP:38,ARROW_RIGHT:39,ARROW_DOWN:40,NUMPAD_PLUS:107,NUMPAD_MINUS:109};function KeyboardHandler(map){var _listeners={};var _timers={};var _leftPressed=false;var _rightPressed=false;var _upPressed=false;var _downPressed=false;var _arrowPanDistance=20;function checkArrowPressed(){var dx=0;var dy=0;if(_timers.arrowKeyPan){window.clearTimeout(_timers.arrowKeyPan)}if(_leftPressed){dx-=_arrowPanDistance}if(_rightPressed){dx+=_arrowPanDistance}if(_upPressed){dy-=_arrowPanDistance}if(_downPressed){dy+=_arrowPanDistance}if(dx!==0||dy!==0){map.panBy(new nmm.Size(dx,dy),false);_timers.arrowKeyPan=window.setTimeout(checkArrowPressed,25)}else{delete _timers.arrowKeyPressed}}function onkeydown(e){var keyCode;var target;var nodeLowerCase;e=e||window.event;target=nmev.getTarget(e);nodeLowerCase=target.nodeName.toLowerCase();if(nodeLowerCase!=="input"&&nodeLowerCase!=="textarea"){if(!e.ctrlKey&&!e.altKey&&!e.shiftKey){keyCode=e.keyCode;if(keyCode===KeyboardKeys.PAGE_UP){map.panDirection(0,-1)}else{if(keyCode===KeyboardKeys.PAGE_DOWN){map.panDirection(0,1)}else{if(keyCode===KeyboardKeys.END){map.panDirection(1,0)}else{if(keyCode===KeyboardKeys.HOME){map.panDirection(-1,0)}else{if(keyCode===KeyboardKeys.NUMPAD_PLUS){map.zoomIn()}else{if(keyCode===KeyboardKeys.NUMPAD_MINUS){map.zoomOut()}else{if(nmc.browser.msie||nmc.browser.chrome||(nmc.browser.safari&&(nmc.browser.majorVersion>3||(nmc.browser.majorVersion===3&&nmc.browser.minorVersion>=1)))){if(keyCode===KeyboardKeys.ARROW_LEFT){_leftPressed=true}else{if(keyCode===KeyboardKeys.ARROW_UP){_upPressed=true}else{if(keyCode===KeyboardKeys.ARROW_RIGHT){_rightPressed=true}else{if(keyCode===KeyboardKeys.ARROW_DOWN){_downPressed=true}}}}}}}}}}}checkArrowPressed()}}}function onkeyup(e){var keyCode;var target;var nodeLowerCase;e=e||window.event;target=nmev.getTarget(e);nodeLowerCase=target.nodeName.toLowerCase();if(nodeLowerCase!=="input"&&nodeLowerCase!=="textarea"){keyCode=e.keyCode;if(keyCode===KeyboardKeys.ARROW_LEFT){_leftPressed=false}else{if(keyCode===KeyboardKeys.ARROW_UP){_upPressed=false}else{if(keyCode===KeyboardKeys.ARROW_RIGHT){_rightPressed=false}else{if(keyCode===KeyboardKeys.ARROW_DOWN){_downPressed=false}}}}if(!_leftPressed&&!_upPressed&&!_rightPressed&&!_downPressed){window.clearTimeout(_timers.arrowKeyPan);delete _timers.arrowKeyPan}}}function onkeypress(e){var dx=0;var dy=0;var keyCode;var target;var nodeLowerCase;e=e||window.event;target=nmev.getTarget(e);nodeLowerCase=target.nodeName.toLowerCase();if(nodeLowerCase!=="input"&&nodeLowerCase!=="textarea"){keyCode=e.keyCode;if(keyCode===KeyboardKeys.ARROW_LEFT){_leftPressed=true}else{if(keyCode===KeyboardKeys.ARROW_UP){_upPressed=true}else{if(keyCode===KeyboardKeys.ARROW_RIGHT){_rightPressed=true}else{if(keyCode===KeyboardKeys.ARROW_DOWN){_downPressed=true}}}}checkArrowPressed()}}function remove(){nmev.removeListener(_listeners.onkeydown);nmev.removeListener(_listeners.onkeyup);delete _listeners.onkeydown;delete _listeners.onkeyup}_listeners.onkeydown=nmev.addDomListener(document,"keydown",onkeydown);_listeners.onkeyup=nmev.addDomListener(document,"keyup",onkeyup);_listeners.onkeypress=nmev.addDomListener(document,"keypress",onkeypress);this.remove=remove}nmm.MapUIOptions=MapUIOptions;nmm.KeyboardHandler=KeyboardHandler;nmm.KeyboardKeys=KeyboardKeys})();/*
 * This provides a set of library function to create sprites. It is
 * especially useful for creating complicated sprites which have transparency
 * and getting them to work in a cross browser fashion.
 *
 * http://www.nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www..nearmap.com/license
 *
 * Date: 2009-11-18 4:11:00 +0800 (Wed, 18 Nov 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nml=nearmap.lib;var nmls=nearmap.lib.sprite;var nms=nearmap.style;var nmm=nearmap.maps;var nmc=nearmap.client;var BUTTONS={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/buttons.png",size:new nmm.Size(200,500)};var BUTTONS_VERTICAL={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/buttons-vertical.png",size:new nmm.Size(75,150)};var BUTTONS_BG={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/buttons-bg.png",size:new nmm.Size(1,1)};var PANEL_BACKGROUND={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/panel-bg.png",size:new nmm.Size(1,1)};var TIMELINE={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/sprite-timeline.png",size:new nmm.Size(270,98)};var TIMELINE_YEAR={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/timeline-year.png",size:new nmm.Size(270,21)};var SHADOW={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/scalebar-shadow.png",size:new nmm.Size(255,107)};var ZOOM={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/zoom.png",size:new nmm.Size(70,270)};var MAP_TOOLS={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/maptools.png",size:new nmm.Size(112,250)};var CURSOR_PAN_DOWN={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/pandown.cur"};CURSOR_PAN_DOWN.css="url("+CURSOR_PAN_DOWN.url+")"+(nmc.browser.chrome||nmc.browser.safari?" 10 10":"")+",auto";var CURSOR_MAP_OVER={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/mapover.cur"};CURSOR_MAP_OVER.css="url("+CURSOR_MAP_OVER.url+")"+(nmc.browser.chrome||nmc.browser.safari?" 10 10":"")+",auto";function createClippedSprite(sprite,size,offset,stretch){var frag=document.createDocumentFragment();var iconNode=document.createElement("span");var iconSprite=document.createElement("span");var seOffset;seOffset={x:offset.x+size.width,y:offset.y+size.height};nms.css(iconNode,{"float":"left",position:"relative",height:size.getHeightString(),width:size.getWidthString()},true);nms.css(iconSprite,{clip:"rect("+offset.y+"px "+seOffset.x+"px "+seOffset.y+"px "+offset.x+"px)",position:"absolute",left:"-"+offset.x+"px",top:"-"+offset.y+"px",height:(stretch&&stretch.y?seOffset.y:sprite.size.height)+"px",width:(stretch&&stretch.x?seOffset.x:sprite.size.width)+"px"},true);nms.applyPngAlphaBg(iconSprite,sprite.url,stretch);frag.appendChild(iconNode);iconNode.appendChild(iconSprite);return frag}nmls.BUTTONS=BUTTONS;nmls.BUTTONS_VERTICAL=BUTTONS_VERTICAL;nmls.BUTTONS_BG=BUTTONS_BG;nmls.PANEL_BACKGROUND=PANEL_BACKGROUND;nmls.TIMELINE=TIMELINE;nmls.TIMELINE_YEAR=TIMELINE_YEAR;nmls.SHADOW=SHADOW;nmls.ZOOM=ZOOM;nmls.MAP_TOOLS=MAP_TOOLS;nmls.CURSOR_PAN_DOWN=CURSOR_PAN_DOWN;nmls.CURSOR_MAP_OVER=CURSOR_MAP_OVER;nmls.createClippedSprite=createClippedSprite})();/*
 * Nearmap JavaScript Library v0.1
 * http://www.nearmap.com/
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://www.nearmap.com/license
 *
 * Date: 2009-06-08 12:28:21 +0800 (Mon, 8 Jun 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nmm=nearmap.maps;var nmg=nearmap.generics;var nml=nearmap.lib;var nmls=nearmap.lib.sprite;var nmlm=nearmap.lib.math;var nmh=nearmap.http;var nme=nearmap.memory;var nmev=nearmap.event;var nms=nearmap.style;var nmjson=nearmap.json;var ajax=nearmap.ajax;var nma=nearmap.animation;var nmo=nearmap.options;var nmd=nearmap.dom;var nmc=nearmap.client;var nmt=nearmap.touch;var nmov=nearmap.overlay;var TILE_BUFFER=3;var LEVEL_TIMEOUT=10000;var DEFAULT_LAT_LNG=new nmm.LatLng(-31.956967,115.87572);var _centerMarker;function showCenterPoint(map){var size=map.getSize(true);if(!_centerMarker){_centerMarker=document.createElement("div")}_centerMarker.isMap=true;nms.css(_centerMarker,{"background-color":"lime",height:"5px",width:"5px",position:"absolute",left:Math.floor(size.width/2)+"px",top:Math.floor(size.height/2)+"px","z-index":"999"},true);document.body.appendChild(_centerMarker)}function addDefaultControls(map){var shadow=new nmm.ShadowControl();var legal=new LegalControl();var output=nmh.CurrentMapHttpRequest.getMapOutput();var logo=(output===nmh.MapOutput.EMBED||output===nmh.MapOutput.EMBED_NOCONTROLS||output===nmh.MapOutput.IPHONE?new SmallLogoControl():new LargeLogoControl());var zoom;var coord;var requests;map.addControl(shadow);map.addControl(legal);map.addControl(logo);if(nmm.debug){zoom=new ZoomLevelControl();map.addControl(zoom);showCenterPoint(map)}if(nmm.debug>=2){coord=new TileCoordinateControl();map.addControl(coord)}if(nmm.debug>=3){requests=new RequestRateControl();map.addControl(requests)}}function ZoomLevelControl(printable,selectable){this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var zoomLevel=document.createElement("span");zoomLevel.innerHTML="zoom: "+map.getZoom();nms.css(zoomLevel,{"font-weight":"bold","font-size":"30px",color:"#ff0000"},true);nmev.addListener(map,"setcenter",function(){zoomLevel.innerHTML="zoom: "+map.getZoom()});map.getContainer().appendChild(zoomLevel);return zoomLevel};this.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,70))}}function ZoomLockControl(printable,selectable){var _boxWidth=100;var _boxHeight=60;var _node;var _animateTimers=[];var _map;function createInHorizontal(v,width){var line=document.createElement("div");nms.css(line,{background:"#ff0000",height:"2px",width:width+"px",position:"absolute",left:"0px"},true);line.style[v]="0px";return line}function createInVertical(h,height){var line=document.createElement("div");nms.css(line,{background:"#ff0000",width:"2px",height:height+"px",position:"absolute",top:"0px"},true);line.style[h]="0px";return line}function createOutHorizontal(v,width){var line=document.createElement("div");nms.css(line,{background:"#ff0000",height:"2px",width:width+"px",position:"absolute",left:"0px"},true);line.style[v==="top"?"bottom":"top"]="0px";return line}function createOutVertical(h,height){var line=document.createElement("div");nms.css(line,{background:"#ff0000",width:"2px",height:height+"px",position:"absolute",top:"0px"},true);line.style[h==="left"?"right":"left"]="0px";return line}function createCorner(h,v,hCorner,vCorner){var frag=document.createDocumentFragment();var corner=document.createElement("div");var width=8;var height=8;nms.css(corner,{height:height+"px",width:width+"px",position:"absolute"},true);corner.style[h]="0px";corner.style[v]="0px";corner.appendChild(hCorner(v,width));corner.appendChild(vCorner(h,height));return corner}function createBox(latlng,hCorner,vCorner){var box=document.createElement("div");var topLeft=createCorner("left","top",hCorner,vCorner);var topRight=createCorner("right","top",hCorner,vCorner);var bottomLeft=createCorner("left","bottom",hCorner,vCorner);var bottomRight=createCorner("right","bottom",hCorner,vCorner);var containerPx=_map.fromLatLngToContainerPixel(latlng);nms.css(box,{display:"none",height:_boxHeight+"px",width:_boxWidth+"px",position:"absolute",top:containerPx.y+"px",left:containerPx.x+"px"},true);box.appendChild(topLeft);box.appendChild(topRight);box.appendChild(bottomLeft);box.appendChild(bottomRight);return box}function hide(){_node.style.display="none"}function getZoomInScale(currentFrame,totalFrames){return currentFrame/totalFrames}function getZoomOutScale(currentFrame,totalFrames){var origin=0.3;return origin+((1-origin)*(totalFrames-currentFrame)/totalFrames)}function scaleBox(getScale){return function(currentFrame,totalFrames){var scale=getScale(currentFrame,totalFrames);var width=Math.floor(_boxWidth*scale);var height=Math.floor(_boxHeight*scale);nms.css(_node,{display:"block",height:height+"px",width:width+"px",marginTop:-Math.floor(height/2)+"px",marginLeft:-Math.floor(width/2)+"px"})}}function animate(latlng,hCorner,vCorner,getScale){var box=createBox(latlng,hCorner,vCorner);var numFrames=6;var length=480;_node.parentNode.replaceChild(box,_node);nme.discardElement(_node,_map.getContainer());_node=box;if(_animateTimers.length>0){nma.stopFixedAnimation(_animateTimers)}_animateTimers=nma.runFixedAnimation(numFrames,length,scaleBox(getScale),hide)}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){_map=map;_node=document.createElement("div");nms.css(_node,{display:"none"},true);map.getContainer().appendChild(_node);return _node};this.animateZoomIn=function(latlng){animate(latlng,createInHorizontal,createInVertical,getZoomInScale)};this.animateZoomOut=function(latlng){animate(latlng,createOutHorizontal,createOutVertical,getZoomOutScale)};this.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(100,100))}}function TileCoordinateControl(printable,selectable){function containermousemove(e,map,node){var mapType=map.getCurrentMapType();var proj=mapType.getProjection();var size=map.getSize(true);var zoom=map.getZoom();var tSize=mapType.getTileSize();var tScale=mapType.getTileScale();var centerPx=proj.fromLatLngToPixel(map.getCenter(),zoom,tSize);var heading=mapType.getHeading();var mousePx;var mouseTile;var wrapTile;var mouseOffsetPx;var rotatedMouseOffsetPx;e=e||window.event;mouseOffsetPx=new nmm.Point(e.clientX-(size.width/2),e.clientY-(size.height/2));mouseOffsetPx.x=Math.floor(mouseOffsetPx.x/tScale.x);mouseOffsetPx.y=Math.floor(mouseOffsetPx.y/tScale.y);rotatedMouseOffsetPx=nmlm.rotatePoint(heading,mouseOffsetPx,nmm.Point.ORIGIN,Math.round);mousePx=centerPx.copy();mousePx.add(rotatedMouseOffsetPx.x,rotatedMouseOffsetPx.y);mouseTile=new nmm.Point(Math.floor(mousePx.x/tSize),Math.floor(mousePx.y/tSize));wrapTile=proj.wrapTileCoordinates(zoom,mouseTile.x,mouseTile.y);node.innerHTML="["+wrapTile.x+"]["+wrapTile.y+"]"}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var node=document.createElement("span");var container=map.getContainer();nms.css(node,{"font-weight":"bold","font-size":"30px",color:"red"},true);nmev.addDomListener(container,"mousemove",nmev.callbackArgs(container,containermousemove,map,node));container.appendChild(node);return node};this.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,100))}}function RequestRateControl(printable,selectable){function processHeaders(headers){}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var frag=document.createDocumentFragment();var node=document.createElement("div");var rpsWrap=document.createElement("div");var rkbpsWrap=document.createElement("div");nms.css(node,{"font-weight":"bold","font-size":"30px",color:"red"},true);frag.appendChild(node);node.appendChild(rpsWrap);node.appendChild(rkbpsWrap);rpsWrap.innerHTML="r/ps: ";rkbpsWrap.innerHTML="r kb/ps: ";map.getContainer().appendChild(frag);ajax.getHeaders(nmm.GET_SESSION,processHeaders);return node};this.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,135))}}function LegalControl(printable,selectable){function onlinkmouseover(){this.style.borderBottomStyle="solid"}function onlinkmouseout(){this.style.borderBottomStyle="dotted"}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var link=document.createElement("a");link.href=nmm.HOST_URL+"legal";link.innerHTML="Legal";nms.css(link,{"border-bottom":"dotted 1px #fff",color:"#fff","font-size":"12px","line-height":"17px",margin:"0px 5px","text-decoration":"none","vertical-align":"bottom"},true);link.onmouseover=nmev.callback(link,onlinkmouseover);link.onmouseout=nmev.callback(link,onlinkmouseout);map.getContainer().appendChild(link);return link};this.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(10,10))}}function LargeLogoControl(printable,selectable){var _node;this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var sprite;_node=document.createElement("span");_node.isMap=true;sprite={url:nmm.HOST_URL+"img/nearmap_watermark.png",size:new nmm.Size(265,120)};nms.css(_node,{display:"inline-block",height:sprite.size.getHeightString(),width:sprite.size.getWidthString()},true);nms.applyPngAlphaBg(_node,sprite.url);map.getContainer().appendChild(_node);return _node};this.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_RIGHT,new nmm.Size(0,0))}}function SmallLogoControl(printable,selectable){var _node;this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var sprite;_node=document.createElement("span");sprite={url:nmm.HOST_URL+"img/logo-small-white.png",size:new nmm.Size(110,36)};nms.css(_node,{display:"inline-block",height:sprite.size.getHeightString(),width:sprite.size.getWidthString()},true);nms.applyPngAlphaBg(_node,sprite.url);map.getContainer().appendChild(_node);return _node};this.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_RIGHT,new nmm.Size(10,10))}}var InfoWindowOptions={selectedTab:0,maxWidth:300,noCloseOnClick:false,onOpenFn:null,onCloseFn:null,zoomLevel:19,mapType:nmm.MapType.PHOTO_MAP,maxContent:null,maxTitle:null,pixelOffset:new nmm.Size(0,0)};function InfoWindowTab(label,content){this.contentElem=content;this.name=label}function InfoWindow(){var _that=this;var _foregroundNode;var _backgroundNode;var _shadowNode;var _tabContainer;var _tabs;var _latlng;var _handlers=[];var _elements=[];var _contentContainers=[];var _opts;var _divPx;var _map;var _isAdded=false;var _clipContentBorders;var _tempClose=false;var _lastDrawn=null;function onmapclick(overlay,latlng,overlaylatlng){var limit=100;if(!_opts.noCloseOnClick&&!isHidden()&&(!overlay||overlay!==_that)&&(_lastDrawn&&new Date().getTime()-_lastDrawn.getTime()>limit)){hide()}}function onzoomstart(){if(!isHidden()){_tempClose=true}hide()}function onsetcenter(){redraw(true);if(_tempClose){show()}_tempClose=false}function selectTab(index){if(typeof index!=="number"){throw"The selectedTab index must be a number"}if(index<0||index>=_tabs.length){throw"You cannot select a tab that is out of the range of array bounds"}opts.selectedTab=index}function hide(){if(_foregroundNode){_foregroundNode.style.visibility="hidden"}if(_shadowNode){_shadowNode.style.visibility="hidden"}nmev.trigger(_that,"hidden")}function show(){if(_foregroundNode){_foregroundNode.style.visibility="visible"}if(_shadowNode){_shadowNode.style.visibility="visible"}}function isHidden(){return !_foregroundNode||_foregroundNode.style.visibility==="hidden"}function reset(latlng,tabs,size,offset,selectedTab){var newTabContainer;var tab;if(latlng){_latlng=latlng}if(tabs){_tabs=tabs;newTabContainer=document.createElement("div");for(var i=0;i<_tabs.length;i++){tab=_tabs[i];if(typeof tab.contentElem==="string"){newTabContainer.innerHTML+=tab.contentElem}else{newTabContainer.appendChild(tab.contentElem)}}if(_tabContainer){_tabContainer.parentNode.replaceChild(newTabContainer,_tabContainer)}_tabContainer=newTabContainer}if(size){_contentSize=size}if(offset){_opts.pixelOffset=offset}if(typeof selectedTab==="number"){this.selectTab(selectedTab)}}function getPoint(){return _latlng}function getPixelOffset(){return _opts.pixelOffset}function getSelectedTab(){return opts.selectedTab}function getTabs(){return _tabs}function getContentContainers(){}function enableMaximize(){}function disableMaximize(){}function maximize(){}function restore(){}function clipBorders(sides){return function(height){var side;var offset;var len;len=sides.length;for(var i=0;i<len;i++){side=sides[i];offset=side.offset;nms.css(side.element,{clip:"rect("+offset.y+"px "+(side.width+offset.x)+"px "+(height+offset.y)+"px "+offset.x+"px)",height:height+"px"})}nms.applyPngAlphaBg(side.element,side.sprite.url,true)}}function createTopBorder(width){var sprite=nmls.BUTTONS;var cornerSize=new nmm.Size(10,10);var frag=document.createDocumentFragment();var wrap=document.createElement("div");var leftCorner=nmls.createClippedSprite(sprite,cornerSize,new nmm.Point(60,150));var topBorder=nmls.createClippedSprite(sprite,new nmm.Size(width-(cornerSize.width*2),cornerSize.height),new nmm.Point(0,162),{x:true,y:false});var rightCorner=nmls.createClippedSprite(sprite,cornerSize,new nmm.Point(75,150));nms.css(wrap,{position:"relative",height:cornerSize.getHeightString(),width:width+"px"},true);nms.css(leftCorner.firstChild,{position:"absolute",top:"0px",left:"0px"});nms.css(topBorder.firstChild,{position:"absolute",top:"0px",left:cornerSize.getWidthString()});nms.css(rightCorner.firstChild,{position:"absolute",top:"0px",right:"0px"});frag.appendChild(wrap);wrap.appendChild(leftCorner);wrap.appendChild(topBorder);wrap.appendChild(rightCorner);return frag}function createMiddleContent(width){var vertSprite=nmls.BUTTONS_VERTICAL;var borderSize=new nmm.Size(10,1);var leftBorderOffset=new nmm.Point(0,0);var rightBorderOffset=new nmm.Point(15,0);var frag=document.createDocumentFragment();var borderWrap=document.createElement("div");var leftBorder=nmls.createClippedSprite(vertSprite,borderSize,leftBorderOffset,{x:false,y:true});var rightBorder=nmls.createClippedSprite(vertSprite,borderSize,rightBorderOffset,{x:false,y:true});var contentWrap=document.createElement("div");var close=nmls.createClippedSprite(nmls.BUTTONS,new nmm.Size(18,18),new nmm.Point(41,192));nms.css(borderWrap,{position:"relative",width:width+"px"},true);nms.css(leftBorder.firstChild,{position:"absolute",top:"0px",left:"0px"});nms.css(contentWrap,{background:"#fff",border:"solid 1px #c6c6c6",cursor:"default",margin:"0px 10px"},true);nms.css(rightBorder.firstChild,{position:"absolute",top:"0px",right:"0px"});nms.css(close.firstChild,{cursor:"pointer",overflow:"hidden",position:"absolute",right:"15px",top:"5px",zIndex:"1"});_clipContentBorders=clipBorders([{element:leftBorder.firstChild.firstChild,offset:leftBorderOffset,width:borderSize.width,sprite:vertSprite},{element:rightBorder.firstChild.firstChild,offset:rightBorderOffset,width:borderSize.width,sprite:vertSprite}]);_handlers.push(nmev.addDomListener(contentWrap,"mousedown",nmev.stopBubbling));_handlers.push(nmev.addDomListener(contentWrap,"mouseup",nmev.stopBubbling));_handlers.push(nmev.addDomListener(contentWrap,"click",nmev.stopBubblingDom2));_handlers.push(nmev.addDomListener(contentWrap,"dblclick",nmev.stopBubbling));_handlers.push(nmev.addDomListener(contentWrap,"mousewheel",nmev.stopBubbling));_handlers.push(nmev.addDomListener(close.firstChild,"click",hide));frag.appendChild(borderWrap);borderWrap.appendChild(leftBorder);borderWrap.appendChild(contentWrap);borderWrap.appendChild(rightBorder);contentWrap.appendChild(_tabContainer);contentWrap.appendChild(close);return frag}function createAnchor(width){var sprite=nmls.BUTTONS;var frag=document.createDocumentFragment();var borderHeight=10;var anchorSize=new nmm.Size(95,90);var cornerSize=new nmm.Size(10,borderHeight);var bottomWidth=width-anchorSize.width-cornerSize.width;var anchor=nmls.createClippedSprite(sprite,anchorSize,new nmm.Point(0,355));var anchorBottomBorder=nmls.createClippedSprite(sprite,new nmm.Size(bottomWidth,borderHeight),new nmm.Point(0,174));var anchorRightCorner=nmls.createClippedSprite(sprite,cornerSize,new nmm.Point(90,150));nms.css(anchor.firstChild,{overflow:"hidden",position:"absolute",bottom:"0px",left:"0px"});nms.css(anchorBottomBorder.firstChild,{overflow:"hidden",position:"absolute",bottom:(anchorSize.height-borderHeight)+"px",left:anchorSize.width+"px"});nms.css(anchorRightCorner.firstChild,{overflow:"hidden",position:"absolute",bottom:(anchorSize.height-borderHeight)+"px",left:(anchorSize.width+bottomWidth)+"px"});nmev.disableSelect(anchor.firstChild);frag.appendChild(anchor);frag.appendChild(anchorBottomBorder);frag.appendChild(anchorRightCorner);return frag}function create(floatPane,floatShadowPane){var floatFrag=document.createDocumentFragment();var shadowFrag=document.createDocumentFragment();var foregroundWrap=document.createElement("div");var infoWrap=document.createElement("div");_foregroundNode=document.createElement("div");_elements.push(_foregroundNode);nms.css(_foregroundNode,{position:"absolute",width:_opts.maxWidth+"px"},true);nms.css(foregroundWrap,{position:"absolute",bottom:"0px"},true);nms.css(infoWrap,{position:"absolute",bottom:"90px"},true);_handlers.push(nmev.addListener(_map,"zoomstart",onzoomstart));_handlers.push(nmev.addListener(_map,"setcenter",onsetcenter));_handlers.push(nmev.addListener(_map,"click",onmapclick));floatFrag.appendChild(_foregroundNode);_foregroundNode.appendChild(foregroundWrap);foregroundWrap.appendChild(infoWrap);foregroundWrap.appendChild(createAnchor(_opts.maxWidth));infoWrap.appendChild(createTopBorder(_opts.maxWidth));infoWrap.appendChild(createMiddleContent(_opts.maxWidth));floatPane.appendChild(floatFrag)}function initialize(map){_map=map;create(map.getPane(nmov.MapPane.FLOAT_PANE),map.getPane(nmov.MapPane.FLOAT_SHADOW_PANE));_isAdded=true}function redraw(force){if(force){_lastDrawn=new Date();_clipContentBorders(_tabContainer.parentNode.offsetHeight);_divPx=nmov.OverlayHelper.reposition(_elements,_latlng,_map,_opts.pixelOffset);_foregroundNode.style.zIndex=nmov.Overlay.getZIndex(_latlng.lat());nmev.trigger(_that,"redraw")}}function remove(){nmev.batchRemoveListeners(_handlers);_handlers=[];if(_foregroundNode){_foregroundNode.parentNode.removeChild(_foregroundNode)}if(_backgroundNode){_backgroundNode.parentNode.removeChild(_backgroundNode)}_isAdded=false}function isAdded(){return _isAdded}this.selectTab=selectTab;this.hide=hide;this.show=show;this.isHidden=isHidden;this.reset=reset;this.getPoint=getPoint;this.getPixelOffset=getPixelOffset;this.getSelectedTab=getSelectedTab;this.getTabs=getTabs;this.getContentContainers=getContentContainers;this.enableMaximize=enableMaximize;this.disableMaximize=disableMaximize;this.maximize=maximize;this.restore=restore;this.create=create;this.initialize=initialize;this.redraw=redraw;this.remove=remove;this.isAdded=isAdded;_opts=nmo.Synchronize.fill(_opts,InfoWindowOptions)}InfoWindow.prototype=new nmov.Overlay();function UIManager(map,container,backgroundColor,size,cntrlMng){var _panes={};var _tileContainer;var _garbageContainer;var _historyContainer;var _currentUI;var _keyboardHndlr;function createContainers(){var frag=document.createDocumentFragment();var tileContainerWrap=document.createElement("div");_tileContainer=document.createElement("div");_garbageContainer=document.createElement("div");_historyContainer=document.createElement("div");container.isMap=true;tileContainerWrap.isMap=true;nms.css(container,{backgroundColor:backgroundColor,overflow:"hidden",position:"relative",webkitUserSelect:"none"});if(size){container.style.height=size.getHeightString();container.style.width=size.getWidthString()}container.style.cursor=nmls.CURSOR_PAN_DOWN.css;container.style.cursor=nmls.CURSOR_MAP_OVER.css;nms.css(tileContainerWrap,{overflow:"hidden",height:"100%",width:"100%",position:"absolute",left:"0px",top:"0px"},true);nms.css(_tileContainer,{position:"absolute",left:"0px",top:"0px","z-index":"0"},true);nms.css(_garbageContainer,{position:"absolute",left:"0px",top:"0px","z-index":"0"},true);nms.css(_historyContainer,{position:"absolute",left:"0px",top:"0px","z-index":"0"},true);frag.appendChild(tileContainerWrap);tileContainerWrap.appendChild(_tileContainer);_tileContainer.appendChild(_garbageContainer);_tileContainer.appendChild(_historyContainer);container.appendChild(frag)}function createPanes(){var startZIndex=100;var dvMapPane=document.createElement("div");var dvOverlayLayerPane=document.createElement("div");var dvMarkerShadowPane=document.createElement("div");var dvMarkerPane=document.createElement("div");var dvFloatShadowPane=document.createElement("div");var dvMarkerMousePane=document.createElement("div");var dvFloatPane=document.createElement("div");_panes[nmov.MapPane.MAP_PANE]=dvMapPane;_panes[nmov.MapPane.OVERLAY_LAYER_PANE]=dvOverlayLayerPane;_panes[nmov.MapPane.MARKER_SHADOW_PANE]=dvMarkerShadowPane;_panes[nmov.MapPane.MARKER_PANE]=dvMarkerPane;_panes[nmov.MapPane.FLOAT_SHADOW_PANE]=dvFloatShadowPane;_panes[nmov.MapPane.MARKER_MOUSE_TARGET_PANE]=dvMarkerMousePane;_panes[nmov.MapPane.FLOAT_PANE]=dvFloatPane;nms.css(dvMapPane,{position:"absolute",left:"0px",top:"0px","z-index":startZIndex+nmov.MapPane.MAP_PANE},true);nms.css(dvOverlayLayerPane,{position:"absolute",left:"0px",top:"0px","z-index":startZIndex+nmov.MapPane.OVERLAY_LAYER_PANE},true);nms.css(dvMarkerShadowPane,{position:"absolute",left:"0px",top:"0px","z-index":startZIndex+nmov.MapPane.MARKER_SHADOW_PANE},true);nms.css(dvMarkerPane,{position:"absolute",left:"0px",top:"0px","z-index":startZIndex+nmov.MapPane.MARKER_PANE},true);nms.css(dvFloatShadowPane,{position:"absolute",left:"0px",top:"0px","z-index":startZIndex+nmov.MapPane.FLOAT_SHADOW_PANE},true);nms.css(dvMarkerMousePane,{position:"absolute",left:"0px",top:"0px","z-index":startZIndex+nmov.MapPane.MARKER_MOUSE_TARGET_PANE},true);nms.css(dvFloatPane,{position:"absolute",left:"0px",top:"0px","z-index":startZIndex+nmov.MapPane.FLOAT_PANE},true);_tileContainer.appendChild(dvMapPane);_tileContainer.appendChild(dvOverlayLayerPane);_tileContainer.appendChild(dvMarkerShadowPane);_tileContainer.appendChild(dvMarkerPane);_tileContainer.appendChild(dvFloatShadowPane);_tileContainer.appendChild(dvMarkerMousePane);_tileContainer.appendChild(dvFloatPane)}function getContainer(){return container}function getTileContainer(){return _tileContainer}function getGarbageContainer(){return _garbageContainer}function getHistoryContainer(){return _historyContainer}function getPane(pane){return _panes[pane]}function getDefaultUI(){return new nmm.MapUIOptions(new nmm.Size(400,300))}function clearMapTypes(){var mapTypes=map.getMapTypes();for(var i=mapTypes.length;i--;){map.removeMapType(mapTypes[i])}}function setUI(ui){cntrlMng.clear();clearMapTypes();if(ui.maptypes.normal){map.addMapType(nmm.MapType.NORMAL_MAP)}if(ui.maptypes.satellite){map.addMapType(nmm.MapType.SATELLITE_MAP)}if(ui.maptypes.hybrid){map.addMapType(nmm.MapType.HYBRID_MAP)}if(ui.maptypes.physical){map.addMapType(nmm.MapType.PHYSICAL_MAP)}if(ui.zoom.scrollwheel){map.enableScrollWheelZoom()}if(ui.zoom.doubleclick){map.enableDoubleClickZoom()}if(_keyboardHndlr){_keyboardHndlr.remove();_keyboardHndlr=null}if(ui.keyboard){_keyboardHndlr=new nmm.KeyboardHandler(map)}if(ui.controls.largemapcontrol3d){map.addControl(new nmm.SmallZoomControl3D())}if(ui.controls.smallzoomcontrol3d){map.addControl(new nmm.SmallZoomControl3D())}if(ui.controls.maptypecontrol){map.addControl(new nmm.ToggleAndRotateMapTypeViewControl())}if(ui.controls.menumaptypecontrol){map.addControl(new nmm.ToggleAndRotateMapTypeViewControl())}if(ui.controls.scalecontrol){map.addControl(new nmm.ScaleControl())}_currentUI=ui}function setUIToDefault(){setUI(getDefaultUI())}this.getContainer=getContainer;this.getTileContainer=getTileContainer;this.getGarbageContainer=getGarbageContainer;this.getHistoryContainer=getHistoryContainer;this.getPane=getPane;this.getDefaultUI=getDefaultUI;this.setUI=setUI;this.setUIToDefault=setUIToDefault;createContainers();createPanes()}function ControlManager(map){var _controls=[];var _centeredControls=[];function indexOfControl(list,control){for(var i=list.length;i--;){if(list[i].control===control){return i}}return -1}function hideCenteredControls(){for(var i=_centeredControls.length;i--;){_centeredControls[i].node.style.display="none"}}function repositionCenteredControls(){var cObj;for(var i=_centeredControls.length;i--;){cObj=_centeredControls[i];cObj.node.style.display="";cObj.position.apply(cObj.node)}}function addControl(control,position,relativeToControl){var node;var ctrlProp;var rInd;if(nml.ArrayHelper.indexOf(_controls,control)>=0){throw new Error("The control you are trying to add already exists in the map.")}if(!position){position=control.getDefaultPosition()}node=control.initialize(map);node.style.position="absolute";rInd=(relativeToControl?indexOfControl(_controls,relativeToControl):-1);if(rInd>=0){position.applyRelative(node,_controls[rInd].node)}else{position.apply(node)}ctrlProp={control:control,position:position,node:node};_controls.push(ctrlProp);if(position.anchor===nmm.ControlAnchor.ANCHOR_CENTER){_centeredControls.push(ctrlProp)}}function removeControl(control){var ctrlInd;var ctrlCntInd;var removedCenter=false;ctrlInd=indexOfControl(_controls,control);if(ctrlInd>=0){control.remove();_controls.splice(ctrlInd,1);ctrlCntInd=indexOfControl(_centeredControls,control);if(ctrlCntInd>=0){_centeredControls.splice(ctrlCntInd,1)}}}function clear(){var ctrlCntInd;var control;for(var i=_controls.length;i--;){control=_controls[i];if(typeof(control.remove)==="function"){_controls.splice(i,1);ctrlCntInd=indexOfControl(_centeredControls,control);if(ctrlCntInd>=0){_centeredControls.splice(ctrlCntInd,1)}}}}this.addControl=addControl;this.removeControl=removeControl;this.clear=clear;this.hideCenteredControls=hideCenteredControls;this.repositionCenteredControls=repositionCenteredControls}function OverlayManager(map){var _overlays=[];function addOverlay(overlay){overlay.initialize(map);overlay.redraw(true);_overlays.push(overlay)}function removeOverlay(overlay){var i=nml.ArrayHelper.indexOf(_overlays,overlay);if(i>=0){overlay.remove();nmev.trigger(map,"removeoverlay",overlay);_overlays.splice(i,1)}}function clearOverlays(){var len=_overlays.length;var overlay;for(var i=0;i<len;i++){overlay=_overlays[i];overlay.remove()}_overlays=[];nmev.trigger(map,"clearoverlays")}function hideMarkerPane(){var markerShadowPane=map.getPane(nmov.MapPane.MARKER_SHADOW_PANE);var markerPane=map.getPane(nmov.MapPane.MARKER_PANE);markerShadowPane.style.display="none";markerPane.style.display="none"}function showMarkerPane(){var markerShadowPane=map.getPane(nmov.MapPane.MARKER_SHADOW_PANE);var markerPane=map.getPane(nmov.MapPane.MARKER_PANE);markerShadowPane.style.display="";markerPane.style.display=""}this.addOverlay=addOverlay;this.removeOverlay=removeOverlay;this.clearOverlays=clearOverlays;this.hideMarkerPane=hideMarkerPane;this.showMarkerPane=showMarkerPane}function InfoWindowManager(map,overlayMng){var _infoWindow;var _infoWindowEnabled=true;function enableInfoWindow(){_infoWindowEnabled=true}function disableInfoWindow(){_infoWindowEnabled=false}function infoWindowEnabled(){return _infoWindowEnabled}function openInfoWindow(latlng,node,opts){var info;var infoNode;if(infoWindowEnabled()){info=getInfoWindow();info.reset(latlng,[new InfoWindowTab(null,node)],null,(opts&&opts.pixelOffset!==undefined?opts.pixelOffset:null),(opts&&opts.selectedTab!==undefined?opts.selectedTab:null));if(!info.isAdded()){overlayMng.addOverlay(info)}info.show();info.redraw(true)}}function openInfoWindowHtml(latlng,html,opts){var info;var infoNode;if(infoWindowEnabled()){info=getInfoWindow();info.reset(latlng,[new InfoWindowTab(null,html)],null,(opts&&opts.pixelOffset!==undefined?opts.pixelOffset:null),(opts&&opts.selectedTab!==undefined?opts.selectedTab:null));if(!info.isAdded()){overlayMng.addOverlay(info)}info.show();info.redraw(true)}}function openInfoWindowTabs(latlng,tabs,opts){}function openInfoWindowTabsHtml(latlng,tabs,opts){}function showMapBlowup(latlng,opts){}function updateInfoWindow(tabs,onupdate){}function updateCurrentTab(modifier,onupdate){}function closeInfoWindow(){var info;if(infoWindowEnabled()){info=getInfoWindow();info.remove()}}function getInfoWindow(){if(!_infoWindow){_infoWindow=new InfoWindow()}return _infoWindow}this.enableInfoWindow=enableInfoWindow;this.disableInfoWindow=disableInfoWindow;this.infoWindowEnabled=infoWindowEnabled;this.openInfoWindow=openInfoWindow;this.openInfoWindowHtml=openInfoWindowHtml;this.openInfoWindowTabs=openInfoWindowTabs;this.openInfoWindowTabsHtml=openInfoWindowTabsHtml;this.showMapBlowup=showMapBlowup;this.updateInfoWindow=updateInfoWindow;this.updateCurrentTab=updateCurrentTab;this.closeInfoWindow=closeInfoWindow;this.getInfoWindow=getInfoWindow}function TileInfoManager(map,mapStateManager){var _that=this;var _availableTileDates={};var _availableMapTypeTileDates=[];var _availableTileLayers=[];function checkLayerNewTileDates(currentTileLayerKeys,currentTileDates,newTileDates){var j;var key;var isDiff=false;var currentDates;var newDates;var currentDateList={};var newDateList={};for(var i=0;i<currentTileLayerKeys.length;i++){key=currentTileLayerKeys[i];currentDates=currentTileDates[key];newDates=newTileDates[key];currentDateList[key]=currentDates;newDateList[key]=newDates;if(!isDiff){isDiff=nml.DateHelper.dateListDifferent(currentDates,newDates)}}if(isDiff){nmev.trigger(map,"tiledatesupdated",currentDateList,newDateList)}}function checkNewTileLayers(currentTileLayerKeys,currentTileLayers,newTileLayers){var i=0;if(currentTileLayers.length!==newTileLayers.length){nmev.trigger(map,"tilelayersupdated",currentTileLayers,newTileLayers);return}while(i<currentTileLayerKeys.length){if(nml.ArrayHelper.indexOf(newTileLayers,currentTileLayers[i])===-1){nmev.trigger(map,"tilelayersupdated",currentTileLayers,newTileLayers);return}i++}}function mergeDateLists(mapTypeKeys,newLayerTileDates){var newMapTypeTileDates=[];var oldMapTypeTileDates;var mergedDates=[];var dates;for(var i=0;i<mapTypeKeys.length;i++){dates=newLayerTileDates[mapTypeKeys[i]];if(dates){mergedDates=mergedDates.concat(dates)}}newMapTypeTileDates=nml.DateHelper.sortUniqueAsc(mergedDates);if(nml.DateHelper.dateListDifferent(_availableMapTypeTileDates,newMapTypeTileDates)){oldMapTypeTileDates=_availableMapTypeTileDates.splice();_availableMapTypeTileDates=newMapTypeTileDates;nmev.trigger(map,"maptypetiledatesupdated",oldMapTypeTileDates,newMapTypeTileDates)}}function parseTileInfo(point,zoom,requiredLayers){return function(data){var layers;var layerDates;var newTileLayers;var currentTileLayerKeys;var availLayerNewTileDates;var layerNewTileDates;var currentMapType;var reqCnt=0;if(!data){throw"There is no tile info data to parse"}nmev.trigger(map,"tileinfoget",data,point,zoom);if(data.layers){layers=data.layers;newTileLayers=[];availLayerNewTileDates={};for(var p in layers){if(layers.hasOwnProperty(p)){if(requiredLayers&&nml.ArrayHelper.indexOf(requiredLayers,p)>=0){reqCnt++}layerNewTileDates=[];layerDates=layers[p];newTileLayers.push(p);for(var i=layerDates.length;i--;){layerNewTileDates[i]=layerDates[i]}availLayerNewTileDates[p]=layerNewTileDates}}if(!requiredLayers||(requiredLayers&&requiredLayers.length===reqCnt)){currentMapType=mapStateManager.getCurrentMapType();currentTileLayerKeys=currentMapType.getTileLayerMetaKeys();checkLayerNewTileDates(currentTileLayerKeys,_availableTileDates,availLayerNewTileDates);checkNewTileLayers(currentTileLayerKeys,_availableTileLayers,newTileLayers);mergeDateLists(currentTileLayerKeys,availLayerNewTileDates);_availableTileDates=availLayerNewTileDates;_availableTileLayers=newTileLayers}else{_that.get(new nmm.Point(Math.floor(point.x/2),Math.floor(point.y/2)),zoom-1,requiredLayers)}}}}function get(point,zoom,requiredLayers){var url;if(zoom>=0){url=nmm.TILE_INFO_URL_JSONP.replace(/\{Z\}/,zoom).replace(/\{X\}/,point.x).replace(/\{Y\}/,point.y);ajax.getJSON(url,parseTileInfo(point,zoom,requiredLayers),{withDate:true,error:function(){get({x:Math.floor(point.x/2),y:Math.floor(point.y/2)},zoom-1,requiredLayers)},timeoutError:function(){if(console&&console.log){console.log("Ajax JSONP timeout occured on TileInfo | x: %s | y: %s | z: %s",point.x,point.y,zoom)}}})}}function getAvailableTileDates(){return _availableTileDates}function getAvailableMapTypeTileDates(){return _availableMapTypeTileDates}function getAvailableTileLayers(){return _availableTileLayers}this.get=get;this.getAvailableTileDates=getAvailableTileDates;this.getAvailableMapTypeTileDates=getAvailableMapTypeTileDates;this.getAvailableTileLayers=getAvailableTileLayers;this.mergeDateLists=mergeDateLists}function SplashManager(container){var _splash;function remove(){if(_splash){nme.discardElement(_splash,container);_splash=null}}function create(mainHeading,subHeading,message){var logoUrl=nmm.HOST_URL+"img/nearmap-logo-large.png";var frag=document.createDocumentFragment();var splashWrap=document.createElement("div");var logoWrap=document.createElement("span");var headWrap=document.createElement("h1");var mainContentWrap=document.createElement("div");var subHeadingWrap=document.createElement("h2");var messageWrap=document.createElement("div");var logo;remove();_splash=document.createElement("div");logo=nmd.create("img",{src:logoUrl,alt:"Nearmap logo",height:"179",width:"472"});headWrap.innerHTML=mainHeading;subHeadingWrap.innerHTML=subHeading;messageWrap.innerHTML=message;nms.css(_splash,{background:"#fff",position:"absolute",top:"0px",left:"0px",width:"100%",height:"100%","z-index":"9999"},true);nms.css(splashWrap,{color:"#003465",margin:"80px 100px 0px 100px"},true);nms.css(logoWrap,{height:"179px",width:"472px",zoom:"1"},true);nms.fixPngImage(logoWrap,logoUrl,0);nms.css(headWrap,{margin:"20px 0px 15px 0px","font-style":"italic"},true);nms.css(mainContentWrap,{border:"dotted 1px #bfcad4",padding:"10px"},true);nms.css(subHeadingWrap,{color:"#003465","font-size":"1em",margin:"0px 0px 10px 0px"},true);frag.appendChild(_splash);_splash.appendChild(splashWrap);splashWrap.appendChild(logoWrap);splashWrap.appendChild(headWrap);splashWrap.appendChild(mainContentWrap);mainContentWrap.appendChild(subHeadingWrap);mainContentWrap.appendChild(messageWrap);logoWrap.appendChild(logo);container.appendChild(frag)}this.remove=remove;this.create=create}function SessionManager(container,splashMng){var _sessionimg;function createSessionImg(){_sessionimg=nmd.create("img",{alt:""});nms.css(_sessionimg,{position:"absolute",top:"0px",left:"-999px"},true);container.appendChild(_sessionimg)}function checkBusy(session,availableHandler,busyHandler){var available=nmh.TileSession.isAvailable(session);splashMng.remove();if(available&&availableHandler&&typeof availableHandler==="function"){availableHandler()}else{if(!available&&busyHandler&&typeof busyHandler==="function"){busyHandler()}}}function requestTileSessionCookie(availableHandler,busyHandler){var sessionThrottle=60000;var requestTime=new Date().getTime();if(!_sessionimg.requestTime||requestTime-_sessionimg.requestTime>sessionThrottle){_sessionimg.onload=function(){checkBusy(nmh.TileSession.get(),availableHandler,busyHandler)};if(busyHandler&&typeof busyHandler==="function"){_sessionimg.onerror=function(){_sessionimg.removeAttribute("src");createSplash("We're sorry.","We're currently having trouble communicating with the NearMap website. Please check your internet connection and try again.","If the problem persists please visit our <a href='http://forum.nearmap.com' title='NearMap support forum'>support forum</a>.")}}_sessionimg.requestTime=requestTime;_sessionimg.src=nmh.TileSession.createRequestUrl()}}function serversBusy(){return nmev.callbackArgs(this,splashMng.create,"Yes! You got here!","However, so did everyone else.","We're working hard to adjust the traffic, please connect to us again shortly")}function processSession(availableHandler,busyHandler){var session=nmh.TileSession.get();var now=new Date().getTime();if(!session||(_sessionimg.requestTime&&(now-_sessionimg.requestTime>nmm.SESSION_COOKIE_EXPIRES-nmm.SESSION_COOKIE_CHECK_BEFORE))){requestTileSessionCookie(availableHandler,busyHandler||serversBusy())}else{checkBusy(session,availableHandler,busyHandler||serversBusy())}}this.processSession=processSession;createSessionImg()}function TileHistoryManager(container,tileContainer,historyContainer,garbageContainer,sizeMng){var _history=new nmg.Dictionary();var _timers={};var _loadedTiles=[];var _chunkTimeout=100;function getHistoryKey(point,zoom){var key=point.x+"|"+point.y+"|"+zoom;return key}function addHistory(tile,mapType,addInvisible){var key=getHistoryKey(tile.wrappedPoint,tile.zoom);var isEmpty=false;var dateHistory;var dateKey;if(addInvisible||tile.style.visibility!=="hidden"){dateHistory=_history.getValue(key);dateKey=nml.DateHelper.toNearmapDateUTC(tile.date);if(!dateHistory){dateHistory=new nmg.Dictionary();_history.add(key,dateHistory);isEmpty=true}if(isEmpty||!dateHistory.exists(dateKey)){tile.tileSize=mapType.getTileSize();tile.tileScale=mapType.getTileScale();tile.projection=mapType.getProjection();tile.heading=mapType.getHeading();tile.initialTileSize=mapType.getTileSize();tile.mapType=mapType;dateHistory.add(dateKey,tile);return true}}nme.discardElement(tile,container);return false}function appendHistory(tile,mapType,addInvisible){if(addHistory(tile,mapType,addInvisible)){historyContainer.appendChild(tile)}}function addTileSetHistory(mapType,mapTypeContainer,tileSets){var len=tileSets.length;var hasTransparency=false;var layer;var row;var rlen;var clen;for(var l=len;l--;){layer=tileSets[l];rlen=layer.length;for(var r=0;r<rlen;r++){row=layer[r];clen=row.length;for(var c=0;c<clen;c++){appendHistory(row[c],mapType)}}}nme.discardElement(mapTypeContainer,container)}function clearHistory(){var replacement;if(historyContainer.childNodes.length>0){_loadedTiles=[];_history.clear();historyContainer.innerHTML=""}}function removeMaxScaleHistory(zoom,direction){var zoomInLimit=4;var zoomOutLimit=-4;var historyKeys=_history.getAllKeys();var dateHistory;var dateKeys;var tile;var key;var zx;for(var i=historyKeys.length;i--;){key=historyKeys[i];dateHistory=_history.getValue(key);if(dateHistory){dateKeys=dateHistory.getAllKeys();tile=dateHistory.getValue(dateKeys[0]);if(tile){zx=zoom-tile.zoom;if((direction>0&&zx>zoomInLimit)||(direction<0&&zx<zoomOutLimit)){removeDateHistory(dateHistory,key,null)}}}}}function remove(coordinateKey,date){var dateHistory=_history.getValue(coordinateKey);var dateKey=nml.DateHelper.toNearmapDateUTC(date);var tile;if(dateHistory){tile=dateHistory.getValue(dateKey);if(tile){nme.discardElement(tile,container);dateHistory.remove(dateKey);if(dateHistory.getAllKeys().length===0){_history.remove(coordinateKey)}}}}function removeDateHistory(dateHistory,historyKey,loadedTile){var allKeys=dateHistory.getAllKeys();var empty=true;var dateKey;var tile;for(var i=allKeys.length;i--;){dateKey=allKeys[i];tile=dateHistory.getValue(dateKey);if(tile!==loadedTile){nme.discardElement(tile,container);dateHistory.remove(dateKey)}else{empty=false}}if(empty){_history.remove(historyKey)}}function isOffset(tile,size,divOffset){var tileLeft=parseInt(tile.style.left,10)+divOffset.x;var tileTop=parseInt(tile.style.top,10)+divOffset.y;if(tileLeft+tile.width<0){return true}if(tileLeft>size.width){return true}if(tileTop+tile.height<0){return true}if(tileTop>size.height){return true}return false}function isObscured(loadedPoint,oldTile,tileOverlays,overlayKeys,loadedZoom,scale){var numTiles=Math.pow(2,scale);var numCovered=1;var covered=[];var coveredRow;var oldScaledX;var oldScaledY;var row;var col;var key;var overlay;var overlayScale;oldScaledX=oldTile.wrappedPoint.x*scale;oldScaledY=oldTile.wrappedPoint.y*scale;row=loadedPoint.y%oldScaledY;col=loadedPoint.x%oldScaledX;coveredRow=[];coveredRow[col]=1;covered[row]=coveredRow;for(var i=overlayKeys.length;i--;){key=overlayKeys[i];overlay=tileOverlays.getValue(key);if(overlay.zoom<=loadedZoom){overlayScale=Math.pow(2,loadedZoom-overlay.zoom);row=(overlayScale*overlay.y)%oldScaledY;col=(overlayScale*overlay.x)%oldScaledX;coveredRow=covered[row];if(!coveredRow){coveredRow=[];coveredRow[col]=1;covered[row]=coveredRow;numCovered++}else{if(!coveredRow[col]){coveredRow[col]=1;numCovered++}}if(numCovered===numTiles){return true}}}return false}function createTileChunk(){var maxProcess=10;var toProcess=(_loadedTiles.length<=maxProcess?_loadedTiles.length:maxProcess);var tiles=_loadedTiles.splice(0,toProcess);processTileChunk(tiles);if(_loadedTiles.length>0){_timers.processTileChunk=window.setTimeout(createTileChunk,_chunkTimeout)}else{delete _timers.processTileChunk}}function processLoadedTile(tile){_loadedTiles.push(tile);if(!_timers.processTileChunk){_timers.processTileChunk=window.setTimeout(createTileChunk,_chunkTimeout)}}function processTileChunk(tiles){var size=sizeMng.getSize();var divOffset=nmd.topLeft(tileContainer);var keys;var oldKey;var oldTile;var loadedTile;var loadedTileKey;var loadedZoom;var zx;var scale;var scaledX;var scaledY;var tileOverlays;var overlayKeys;var overlayKey;var dateHistory;var dateKeys;for(var i=tiles.length;i--;){loadedTile=tiles[i];loadedTileKey=getHistoryKey(loadedTile.wrappedPoint,loadedTile.zoom);keys=_history.getAllKeys();for(var k=keys.length;k--;){oldKey=keys[k];dateHistory=_history.getValue(oldKey);if(dateHistory){dateKeys=dateHistory.getAllKeys();oldTile=dateHistory.getValue(dateKeys[0]);loadedZoom=loadedTile.zoom;zx=loadedZoom-oldTile.zoom;scale=Math.pow(2,zx);if(scale===1){if(oldTile!==loadedTile&&oldTile.wrappedPoint.x===loadedTile.wrappedPoint.x&&oldTile.wrappedPoint.y===loadedTile.wrappedPoint.y){removeDateHistory(dateHistory,oldKey,loadedTile)}}else{if(scale<1){scaledX=Math.floor(oldTile.wrappedPoint.x*scale);scaledY=Math.floor(oldTile.wrappedPoint.y*scale);if(scaledX===loadedTile.wrappedPoint.x&&scaledY===loadedTile.wrappedPoint.y){removeDateHistory(dateHistory,oldKey,loadedTile)}}else{if(scale>1){if(isOffset(oldTile,size,divOffset)){removeDateHistory(dateHistory,oldKey,loadedTile)}else{scaledX=Math.floor(loadedTile.wrappedPoint.x/scale);scaledY=Math.floor(loadedTile.wrappedPoint.y/scale);if(scaledX===oldTile.wrappedPoint.x&&scaledY===oldTile.wrappedPoint.y){if(!oldTile.overlays){tileOverlays=new nmg.Dictionary();oldTile.overlays=tileOverlays}else{tileOverlays=oldTile.overlays}overlayKeys=tileOverlays.getAllKeys();overlayKey=getHistoryKey(loadedTile.wrappedPoint,loadedTile.zoom);if(overlayKeys.length===0){tileOverlays.add(overlayKey,{x:loadedTile.wrappedPoint.x,y:loadedTile.wrappedPoint.y,zoom:loadedTile.zoom})}else{if(isObscured(loadedTile.wrappedPoint,oldTile,tileOverlays,overlayKeys,loadedZoom,scale)){removeDateHistory(dateHistory,oldKey,loadedTile)}else{tileOverlays.add(overlayKey,{x:loadedTile.wrappedPoint.x,y:loadedTile.wrappedPoint.y,zoom:loadedTile.zoom})}}}}}}}}}}}function getHistory(){return _history}function exists(key){return _history.exists(key)}this.getHistoryKey=getHistoryKey;this.appendHistory=appendHistory;this.addTileSetHistory=addTileSetHistory;this.clearHistory=clearHistory;this.removeMaxScaleHistory=removeMaxScaleHistory;this.processLoadedTile=processLoadedTile;this.getHistory=getHistory;this.exists=exists;this.remove=remove}function SizeManager(container,map,mapStateMng,ctrlMng){var _size;var _lastsize;function getSize(useCachedSize){if(useCachedSize===undefined||useCachedSize){return _size}_size=new nmm.Size(container.offsetWidth,container.offsetHeight);return _size}function getDimensions(mapType){var sclTSize=mapType.getScaledTileSize();var size=getSize();return new nmm.Size(Math.ceil(size.width/sclTSize.width),Math.ceil(size.height/sclTSize.height))}function getBufferedDimensions(mapType){var sclTSize=mapType.getScaledTileSize();var size=getSize();return new nmm.Size(Math.floor(size.width/sclTSize.width)+TILE_BUFFER,Math.floor(size.height/sclTSize.height)+TILE_BUFFER)}function getBufferedSize(){var dmns=getBufferedDimensions();var sclTSize=map.getCurrentMapType().getScaledTileSize();return new nmm.Size(dmns.width*sclTSize.width,dmns.height*sclTSize.height)}function getResizeOffset(currentSize){var offsetX=0;var offsetY=0;if(_lastsize.width!==currentSize.width||_lastsize.height!==currentSize.height){offsetX=currentSize.width-_lastsize.width;offsetY=currentSize.height-_lastsize.height;_lastsize=currentSize.copy()}return{x:offsetX,y:offsetY}}this.getSize=getSize;this.getDimensions=getDimensions;this.getBufferedDimensions=getBufferedDimensions;this.getBufferedSize=getBufferedSize;this.getResizeOffset=getResizeOffset;_size=getSize(false);_lastsize=getSize(false)}function PanManager(map,container,tileContainer,mapStateMng,sizeMng,sessionMng){var _draggable=false;var _moveTimeout=300;var _listeners={};var _timers={};var _animations={};var _startX=null;var _startY=null;function clear(){for(var p in _timers){if(_timers.hasOwnProperty(p)){window.clearTimeout(_timers[p]);delete _timers[p]}}for(var a in _animations){if(_timers.hasOwnProperty(a)){nma.stopAnimation(_animations[a]);delete _animations[a]}}_startX=null;_startY=null}function onmoveend(){var mapType=mapStateMng.getCurrentMapType();var layers=mapType.getTileLayers();var tileInfoMng=mapStateMng.getTileInfoManager();delete _timers.moveend;mapStateMng.savePosition();tileInfoMng.get(mapStateMng.getCenterTile(),mapStateMng.getZoom(),[layers[0].getMetaKey()]);nmev.trigger(map,"moveend");sessionMng.processSession()}function panToInputPosition(e){var dx;var dy;e=e||window.event;dx=this.mouseX-e.clientX;dy=this.mouseY-e.clientY;if(dx!==0||dy!==0){this.mouseX=e.clientX;this.mouseY=e.clientY;panMap(dx,dy,true)}}function dragstart(e){this.style.cursor=nmls.CURSOR_PAN_DOWN.css;nmev.trigger(map,"dragstart")}function drag(e){panToInputPosition.apply(this,[e]);nmev.trigger(map,"drag")}function dragend(e){e=e||window.event;this.style.cursor=nmls.CURSOR_MAP_OVER.css;this.mouseX=null;this.mouseY=null;this.hasDragged=null;nmev.trigger(map,"dragend")}function containertouchstart(e){var touch;if(e.touches.length===1){touch=e.touches[0];this.mouseX=touch.clientX;this.mouseY=touch.clientY}}function containertouchend(e){delete this.mouseX;delete this.mouseY}function containertouchmove(e){if(e.touches.length===1){panToInputPosition.apply(this,[e.touches[0]]);nmev.trigger(map,"drag");return nmev.preventDefault(e)}if(e.touches.length===2&&map.pinchToZoomEnabled()){return nmev.preventDefault(e)}}function enableDragging(){if(!_listeners.dragndrop){_listeners.dragndrop=nml.dragndrop.add(container,dragstart,drag,dragend,nmev.MouseButton.LEFT_BUTTON,"isMap")}if(!_listeners.touchstart){_listeners.touchstart=nmev.addDomListener(container,"touchstart",containertouchstart)}if(!_listeners.touchend){_listeners.touchend=nmev.addDomListener(container,"touchend",containertouchend)}if(!_listeners.touchmove){_listeners.touchmove=nmev.addDomListener(container,"touchmove",containertouchmove)}_draggable=true}function disableDragging(){if(_listeners.dragndrop){nml.dragndrop.remove(_container);delete _listeners.dragndrop}if(_listeners.touchstart){nmev.removeListener(_listeners.touchstart);delete _listeners.touchstart}if(_listeners.touchend){nmev.removeListener(_listeners.touchend);delete _listeners.touchend}if(_listeners.touchmove){nmev.removeListener(_listeners.touchmove);delete _listeners.touchmove}_draggable=false}function draggingEnabled(){return _draggable}function reorganize(){var mapType=mapStateMng.getCurrentMapType();var divOffset=nmd.topLeft(tileContainer);var movedX=divOffset.x-_startX;var movedY=divOffset.y-_startY;var layers=mapType.getTileLayers();var vSize=sizeMng.getSize();var sclTSize=mapType.getScaledTileSize();var buffDimensions=sizeMng.getBufferedDimensions(mapType);var dimensions=sizeMng.getDimensions(mapType);var tlTile=layers[0].getTile(0,0);var tileOffset=nmd.topLeft(tlTile);var buffNw={x:tileOffset.x+divOffset.x,y:tileOffset.y+divOffset.y};var buffSe={x:tileOffset.x+(buffDimensions.width*sclTSize.width)-vSize.width+divOffset.x,y:tileOffset.y+(buffDimensions.height*sclTSize.height)-vSize.height+divOffset.y};var dx=0;var dy=0;var zoom;var tileDate;if(buffSe.x>(sclTSize.width*2)){dx=Math.ceil((buffSe.x-sclTSize.width)/sclTSize.width)}else{if(buffNw.x<-(sclTSize.width*2)){dx=-Math.ceil(Math.abs(buffNw.x+sclTSize.width)/sclTSize.width)}}if(buffSe.y>(sclTSize.height*2)){dy=Math.ceil((buffSe.y-sclTSize.height)/sclTSize.height)}else{if(buffNw.y<-(sclTSize.height*2)){dy=-Math.ceil(Math.abs(buffNw.y+sclTSize.height)/sclTSize.height)}}if(dx!==0||dy!==0){zoom=mapStateMng.getZoom();tileDate=mapStateMng.getTileDate();for(var i=0;i<layers.length;i++){layers[i].reorganize(zoom,tileDate,dx,dy)}}_startX=null;_startY=null}function panMap(dx,dy,loadTiles){var reorganizeTimeout=nmc.browser.msie?200:10;var mapType;var tileSize;var sclTSize;var zoom;var divOffset;var newDivOffset;var size;var vSize;if(!_timers.moveend){nmev.trigger(map,"movestart")}else{window.clearTimeout(_timers.moveend)}nmev.trigger(map,"move");mapType=mapStateMng.getCurrentMapType();tileSize=mapType.getTileSize();sclTSize=mapType.getScaledTileSize();zoom=mapStateMng.getZoom();divOffset=nmd.topLeft(tileContainer);newDivOffset={x:divOffset.x-dx,y:divOffset.y-dy};vSize=sizeMng.getSize();if(loadTiles){if(_timers.reorganize){window.clearTimeout(_timers.reorganize)}if(_startX===null&&_startY===null){_startX=divOffset.x;_startY=divOffset.y}_timers.reorganize=window.setTimeout(reorganize,reorganizeTimeout)}tileContainer.style.left=newDivOffset.x+"px";tileContainer.style.top=newDivOffset.y+"px";_timers.moveend=window.setTimeout(onmoveend,_moveTimeout);var tScale=mapType.getTileScale();var proj=mapType.getProjection();var heading=mapType.getHeading();var topLeftTile=mapType.getTileLayers()[0].getTile(0,0);var preciseCurrentTileSize=mapStateMng.getPreciseTileSizeAtRelativeScale(tileSize,topLeftTile.zoom,zoom);var zoomScale=preciseCurrentTileSize/tileSize;var topLeftPx=new nmm.Point(topLeftTile.point.x*tileSize*zoomScale,topLeftTile.point.y*tileSize*zoomScale);var offset={x:Math.floor(vSize.width/2)-newDivOffset.x-parseInt(topLeftTile.style.left,10),y:Math.floor(vSize.height/2)-newDivOffset.y-parseInt(topLeftTile.style.top,10)};offset.x/=tScale.x;offset.y/=tScale.y;offset=nmlm.rotatePoint(heading,offset,nmm.Point.ORIGIN,Math.round);var midPoint=Math.floor(tileSize/2);var nwTileOffset=nmlm.rotatePoint(heading,nmm.Point.ORIGIN,new nmm.Point(midPoint,midPoint));nwTileOffset.x=Math.floor(nwTileOffset.x*zoomScale);nwTileOffset.y=Math.floor(nwTileOffset.y*zoomScale);var tileCenterPx=new nmm.Point(topLeftPx.x+offset.x+nwTileOffset.x,topLeftPx.y+offset.y+nwTileOffset.y);var latlng=proj.fromPixelToLatLng(tileCenterPx,mapStateMng.getZoom(),true,tileSize);mapStateMng.updateCenterLatLng(latlng);return latlng}function panTo(center){throw"Map2.panTo not implemented exception"}function panBy(distance,animate,loadTiles){var frames=5;var length=205;var dxToGo=distance.width;var dyToGo=distance.height;var deltaRatio=1/frames;if(_animations.panBy){nma.stopFixedAnimation(_animations.panBy)}if(animate===undefined?true:animate){_animations.panBy=nma.runFixedAnimation(frames,length,function(currentFrame,totalFrames){var dx;var dy;if(currentFrame===totalFrames){dx=dxToGo;dy=dyToGo}else{dx=Math.floor(distance.width*deltaRatio);dy=Math.floor(distance.height*deltaRatio);dxToGo-=dx;dyToGo-=dy}panMap(dx,dy,(loadTiles===undefined?true:loadTiles))})}else{panMap(distance.width,distance.height,(loadTiles===undefined?true:loadTiles))}}function panDirection(dx,dy,animate){var size=sizeMng.getSize();var halfWidth=Math.floor(size.width/2);var halfHeight=Math.floor(size.height/2);var panX=halfWidth*dx;var panY=halfHeight*dy;panBy(new nmm.Size(panX,panY),animate)}enableDragging();this.clear=clear;this.enableDragging=enableDragging;this.disableDragging=disableDragging;this.draggingEnabled=draggingEnabled;this.panTo=panTo;this.panBy=panBy;this.panDirection=panDirection}function ZoomManager(map,container,tileContainer,zoomLockControl,mapStateMng,sizeMng,tileHistoryManager,panMng,uiMng){var _dblClickZoomEnabled=true;var _continuousZoomEnabled=false;var _scrollZoomEnabled=false;var _pinchZoomEnabled=true;var _isMapAnimating=false;var _listeners={};var _animations={};var _zoomFrom;var _zoomTo;function getMapCenterPixel(){var mapType=mapStateMng.getCurrentMapType();return mapType.getProjection().fromLatLngToPixel(mapStateMng.getCenter(),mapStateMng.getZoom(),mapType.getTileSize())}function getMouseMapPixel(mouseOffset,heading,scale){var centerPx=getMapCenterPixel();var mousePx;var rotatedMouseOffset;rotatedMouseOffset=nmlm.rotatePoint(heading,mouseOffset,nmm.Point.ORIGIN);if(scale){rotatedMouseOffset.x=Math.floor(rotatedMouseOffset.x/scale.x);rotatedMouseOffset.y=Math.floor(rotatedMouseOffset.y/scale.y)}mousePx=new nmm.Point(centerPx.x+rotatedMouseOffset.x,centerPx.y+rotatedMouseOffset.y);return mousePx}function getMouseCenterOffset(event,isScroll){var gmtry=new nmd.Geometry();var size=sizeMng.getSize();var mousePos;var cx;var cy;mousePos=gmtry.getDocPos(event,isScroll);cx=Math.floor(container.offsetLeft+(size.width/2));cy=Math.floor(container.offsetTop+(size.height/2));return new nmm.Point(mousePos.x-cx,mousePos.y-cy)}function zoomLockToInputPosition(pointerPosition,zoomLevel,isMouseWheel,showLockAnimation){var zoom=map.getZoom();var newZoom=zoom+zoomLevel;var mapType=map.getCurrentMapType();var proj=mapType.getProjection();var rotatedTileScale;var mouseOffset;var scaledMouseOffset;var scale;var pointerPx;var pointerLatLng;var centerPx;var cLatLng;mouseOffset=getMouseCenterOffset(pointerPosition,isMouseWheel);scale=Math.pow(2,zoomLevel);rotatedTileScale=nmlm.rotatePoint(mapType.getHeading(),mapType.getTileScale(),nmm.Point.ORIGIN);if(rotatedTileScale.x<0){rotatedTileScale.x*=-1}if(rotatedTileScale.y<0){rotatedTileScale.y*=-1}scaledMouseOffset=new nmm.Point(mouseOffset.x-Math.floor(mouseOffset.x/scale),mouseOffset.y-Math.floor(mouseOffset.y/scale));pointerPx=getMouseMapPixel(mouseOffset,mapType.getHeading(),rotatedTileScale);centerPx=getMouseMapPixel(scaledMouseOffset,mapType.getHeading(),rotatedTileScale);cLatLng=proj.fromPixelToLatLng(centerPx,zoom,true,mapType.getTileSize());pointerLatLng=proj.fromPixelToLatLng(pointerPx,zoom,true,mapType.getTileSize());if(newZoom>=mapType.getMinimumResolution()){if(newZoom<=mapType.getMaximumResolution()){if(showLockAnimation){if(zoomLevel>0){}else{}}map.setZoom(newZoom,cLatLng)}}return cLatLng}function getLockOffset(oldCenter,newCenter,zoom,tSize,scaleBy){var mapType=mapStateMng.getCurrentMapType();var tileScale=mapType.getTileScale();var proj=mapType.getProjection();var heading=mapType.getHeading();var offset;var oPx;var nPx;oPx=proj.fromLatLngToPixel(oldCenter,zoom,tSize);nPx=proj.fromLatLngToPixel(newCenter,zoom,tSize);offset=new nmm.Point(nPx.x-oPx.x,nPx.y-oPx.y);if(scaleBy>1){offset.x=offset.x*scaleBy;offset.y=offset.y*scaleBy}offset=nmlm.rotatePoint(-heading,offset,nmm.Point.ORIGIN);offset.x=Math.floor(offset.x*tileScale.x);offset.y=Math.floor(offset.y*tileScale.y);return offset}function zoomAnimateFinished(){var mapType=mapStateMng.getCurrentMapType();var downloadTiles=(_zoomTo<_zoomFrom?downloadTilesInwardStaircase:null);_zoomTo=Math.round(_zoomTo);map.setCenter(mapStateMng.getCenter(),_zoomTo,mapType,mapStateMng.getTileDate(),true,false,downloadTiles);_isMapAnimating=false;delete _animations.zoom;nmev.trigger(map,"zoomend",_zoomFrom,_zoomTo);mapStateMng.savePosition()}function applyScale(tile,position,size){tile.style.cssText="position:absolute;"+(nmm.debug?"border:solid 1px orange;":"")+"z-index:"+tile.zoom+";visibility:"+(tile.style?tile.style.visibility:"hidden")+";left:"+position.x+"px;top:"+position.y+"px;width:"+size.width+"px;height:"+size.height+"px;"}function scaleTiles(tileSet,scaledTileSize,divOffset){for(var i=tileSet.length-1;i>=0;i--){nmm.TileLayer.scaleTileSet(tileSet[i],scaledTileSize,divOffset)}}function scaleOldTiles(centerLatLng,updateZoomTo,divOffset,vCenter){var historyCnt=uiMng.getHistoryContainer();var tile=historyCnt.firstChild;var centerPx;var currentScaleTileSize;var mapType;var tScale;var tileOffset;var tileSet;var initialTileSize;var scale;var proj;var heading;while(tile){proj=tile.projection;heading=tile.heading;tScale=tile.tileScale;initialTileSize=tile.initialTileSize;currentScaleTileSize=mapStateMng.getTileSizeAtRelativeScale(tile.tileSize,tile.zoom,updateZoomTo);scale=currentScaleTileSize/tile.tileSize;centerPx=proj.fromLatLngToPixel(centerLatLng,tile.zoom,initialTileSize);centerPx.x=Math.floor(centerPx.x*scale);centerPx.y=Math.floor(centerPx.y*scale);tileOffset=mapStateMng.getDivOffsetAtRelativeScale(tile.point,centerPx,currentScaleTileSize,tScale,heading,divOffset,vCenter);applyScale(tile,tileOffset,{width:Math.floor(currentScaleTileSize*tScale.x),height:Math.floor(currentScaleTileSize*tScale.y)});tile=tile.nextSibling}}function getBrowserAnimationLength(){var frames;var length;if(nmc.browser.msie){if(nmc.browser.majorVersion>=8){frames=4;length=164}else{frames=6;length=246}}else{frames=6;length=246}return{frames:frames,length:length}}function downloadTilesInwardStaircase(tileSet,downloadTimers,height,width,divOffset,tileSize,tileCheckRange,getTileUrl,isPng,opacity){var tilesToLoad;var tileToLoadTimers=0;var maxTilesToLoad=5;var timerOffset=50;var size=map.getSize(true);var vCenter=new nmm.Point(size.width/2,size.height/2);var divOffsetCenterPx=new nmm.Point(vCenter.x-divOffset.x,vCenter.y-divOffset.y);var rows=height-1;var cols=width-1;var middleRow=Math.floor(rows/2);var middleCol=Math.floor(cols/2);var spiralRows;var spiralCols;var maxSteps;var minRow;var minCol;var maxRow;var maxCol;spiralRows=Math.ceil(height/2);spiralCols=Math.ceil(width/2);maxSteps=(spiralRows>spiralCols?spiralRows:spiralCols);for(var i=0;i<maxSteps;i++){tilesToLoad=[];minRow=0+i;maxRow=rows-i;minCol=0+i;maxCol=cols-i;for(var c=minCol;c<=maxCol;c++){if(minRow<=middleRow){tilesToLoad.push(tileSet[minRow][c])}if(minRow<maxRow&&maxRow>middleRow){tilesToLoad.push(tileSet[maxRow][c])}if(tilesToLoad.length>=maxTilesToLoad){downloadTimers[tileToLoadTimers]=window.setTimeout(mapStateMng.loadBatchTiles(tilesToLoad,tileCheckRange,getTileUrl,isPng,opacity,downloadTimers,tileToLoadTimers),timerOffset*tileToLoadTimers);tileToLoadTimers++;tilesToLoad=[]}}for(var r=minRow+1;r<maxRow;r++){if(minCol<=middleCol){tilesToLoad.push(tileSet[r][minCol])}if(minCol<maxCol&&maxCol>middleCol){tilesToLoad.push(tileSet[r][maxCol])}if(tilesToLoad.length>=maxTilesToLoad){downloadTimers[tileToLoadTimers]=window.setTimeout(mapStateMng.loadBatchTiles(tilesToLoad,tileCheckRange,getTileUrl,isPng,opacity,downloadTimers,tileToLoadTimers),timerOffset*tileToLoadTimers);tileToLoadTimers++;tilesToLoad=[]}}if(tilesToLoad.length>0){downloadTimers[tileToLoadTimers]=window.setTimeout(mapStateMng.loadBatchTiles(tilesToLoad,tileCheckRange,getTileUrl,isPng,opacity,downloadTimers,tileToLoadTimers),timerOffset*tileToLoadTimers);tileToLoadTimers++}}tilesToLoad=null}function getLockCenterLatLng(centerPx,offset,mapType,projection,tileScale,currentTileSize){var heading=mapType.getHeading();var scaledOffset;scaledOffset={x:offset.x/tileScale.x,y:offset.y/tileScale.y};scaledOffset=nmlm.rotatePoint(heading,scaledOffset,nmm.Point.ORIGIN,Math.round);centerPx.add(scaledOffset.x,scaledOffset.y);return projection.fromPixelToLatLng(centerPx,_zoomFrom,true,currentTileSize)}function zoomMap(step,latlng){var startZoom=mapStateMng.getZoom();var scaleBy;var mapType;var pivot;var recentering;var maxRes;var minRes;var zx;function scaleLayers(){var container=map.getContainer();var tScale=mapType.getTileScale();var tSize=mapType.getTileSize();var animationLength=getBrowserAnimationLength();var endSize=tSize*Math.pow(2,_zoomTo-_zoomFrom);var startSize=mapStateMng.getTileSizeAtRelativeScale(tSize,_zoomFrom,startZoom);var centerLatLng=map.getCenter();var distanceMoved=new nmm.Point(0,0);var direction=(step<0?-1:1);var scaleBy=Math.pow(2,step);var tileSets;var newCenterLatLng;var panOffset;_isMapAnimating=true;if(_animations.zoom){nma.stopFixedAnimation(_animations.zoom)}if(centerLatLng.equals(latlng)){panOffset=new nmm.Point(0,0)}else{panOffset=getLockOffset(centerLatLng,latlng,startZoom,tSize,scaleBy)}mapType.hideTransparentLayers();tileSets=mapType.getVisibleTileSets();_animations.zoom=nma.runFixedAnimation(animationLength.frames,animationLength.length,function(currentFrame,totalFrames){var prevZoom=map.getZoom();var updateZoomTo=startZoom+(currentFrame/totalFrames*step*Math.abs(_zoomTo-startZoom));var currentTileSize=mapStateMng.getTileSizeAtRelativeScale(tSize,_zoomFrom,updateZoomTo);var prevTileSize=mapStateMng.getTileSizeAtRelativeScale(tSize,_zoomFrom,prevZoom);var panScale=(prevTileSize!==0?currentTileSize/prevTileSize:0);var divOffset=nmd.topLeft(tileContainer);var tileScale=mapType.getTileScale();var heading=mapType.getHeading();var proj=mapType.getProjection();var size=sizeMng.getSize();var vCenter;var framePanOffset;var tileOffset;var centerPx;var scale;scale=currentTileSize/(zx>=0?Math.pow(2,zx)*tSize:tSize);if(scale===0){mapType.hideAllTileLayers();return}mapStateMng.updateZoom(updateZoomTo);if(step>0){framePanOffset=new nmm.Point(Math.round((panOffset.x*panScale))-panOffset.x,Math.round((panOffset.y*panScale))-panOffset.y)}else{framePanOffset=new nmm.Point(panOffset.x-Math.round((panOffset.x*panScale)),panOffset.y-Math.round(panOffset.y*panScale))}if(zx<0){centerPx=proj.fromLatLngToPixel(map.getCenter(true),_zoomFrom,tSize);centerPx.x=Math.floor(centerPx.x*scale);centerPx.y=Math.floor(centerPx.y*scale)}else{centerPx=proj.fromLatLngToPixel(map.getCenter(true),_zoomTo,tSize);centerPx.x=Math.floor(centerPx.x*scale);centerPx.y=Math.floor(centerPx.y*scale)}newCenterLatLng=getLockCenterLatLng(centerPx,framePanOffset,mapType,proj,tileScale,currentTileSize);mapStateMng.updateCenterLatLng(newCenterLatLng);vCenter={x:Math.floor(size.width/2),y:Math.floor(size.height/2)};tileOffset=mapStateMng.getDivOffsetAtRelativeScale(tileSets[0][0][0].point,centerPx,Math.floor(currentTileSize),tileScale,heading,divOffset,vCenter);scaleTiles(tileSets,new nmm.Size(currentTileSize*tScale.x,currentTileSize*tScale.y),tileOffset);scaleOldTiles(newCenterLatLng,updateZoomTo,divOffset,vCenter)},zoomAnimateFinished)}if(step===0){return}panMng.clear();if(startZoom%1===0){nml.abortDownloads();_zoomFrom=startZoom;_zoomTo=startZoom+step;nmev.trigger(map,"zoomstart",step,pivot,recentering)}else{_zoomTo=_zoomTo+step;nmev.trigger(map,"zooming")}mapType=map.getCurrentMapType();maxRes=mapType.getMaximumResolution();minRes=mapType.getMinimumResolution();if(_zoomTo>maxRes){_zoomTo=maxRes}if(_zoomTo<minRes){_zoomTo=minRes}zx=_zoomTo-_zoomFrom;if(arguments.length<2||!(latlng instanceof nmm.LatLng)){latlng=mapStateMng.getCenter()}tileHistoryManager.removeMaxScaleHistory(startZoom,step);scaleLayers()}function setZoom(level,latlng){var mapType=mapStateMng.getCurrentMapType();var minZ=mapType.getMinimumResolution();var maxZ=mapType.getMaximumResolution();var zoom=mapStateMng.getZoom();var dz;if(level<minZ){dz=minZ-zoom}else{if(level>maxZ){dz=maxZ-zoom}else{dz=level-zoom}}if(dz!==0){zoomMap(dz,latlng)}}function zoomIn(latlng,doCenter,doContinuousZoom){var oldLevel=mapStateMng.getZoom();if(mapStateMng.getCurrentMapType().getMaximumResolution()>oldLevel){zoomMap(1,latlng)}}function zoomOut(latlng,doContinuousZoom){var oldLevel=mapStateMng.getZoom();var newCenterLatLng;var bounds;var centerPx;var latlngPx;var offsetX;var offsetY;var tileSize;var mapType;var proj;var zoom;if(mapStateMng.getCurrentMapType().getMinimumResolution()<oldLevel){if(latlng){bounds=mapStateMng.getBounds();if(bounds.containsLatLng(latlng)){zoom=mapStateMng.getZoom();mapType=mapStateMng.getCurrentMapType();proj=mapType.getProjection();tileSize=mapType.getTileSize();centerPx=mapStateMng.getCenterPixel();latlngPx=proj.fromLatLngToPixel(latlng,zoom,tileSize);offsetX=centerPx.x-latlngPx.x;offsetY=centerPx.y-latlngPx.y;centerPx.add(offsetX,offsetY);newCenterLatLng=proj.fromPixelToLatLng(centerPx,zoom,true,tileSize)}}zoomMap(-1,newCenterLatLng)}}function enableDoubleClickZoom(){if(!_listeners.dblclickzoom){_listeners.dblclickzoom=nmev.addDomListener(container,"dblclick",ondblclick)}if(!_listeners.dblrightclickzoom){_listeners.dblrightclickzoom=nmev.addListener(map,"dblrightclick",ondblrightclick)}if(!_listeners.onepointdoubletapzoom){_listeners.onepointdoubletapzoom=nmev.addDomListener(container,"touchstart",nmt.onePointDoubleTap(containeronepointdbltap))}if(!_listeners.twopointdoubletapzoom){_listeners.twopointdoubletapzoom=nmev.addDomListener(container,"touchstart",nmt.twoPointDoubleTap(containertwopointdbltap))}_dblClickZoomEnabled=true}function disableDoubleClickZoom(){if(_listeners.dblclickzoom){nmev.removeListener(_listeners.dblclickzoom);delete _listeners.dblclickzoom}if(_listeners.dblrightclickzoom){nmev.removeListener(_listeners.dblrightclickzoom);delete _listeners.dblrightclickzoom}if(_listeners.onepointdoubletapzoom){nmev.removeListener(_listeners.onepointdoubletapzoom);delete _listeners.onepointdoubletapzoom}if(_listeners.twopointdoubletapzoom){nmev.removeListener(_listeners.twopointdoubletapzoom);delete _listeners.twopointdoubletapzoom}_dblClickZoomEnabled=false}function doubleClickZoomEnabled(){return _dblClickZoomEnabled}function enableContinuousZoom(){_continuousZoomEnabled=true}function disableContinuousZoom(){_continuousZoomEnabled=false}function continuousZoomEnabled(){return _continuousZoomEnabled}function enableScrollWheelZoom(){if(!_listeners.scrollwheelzoom){nmev.addDomListener(container,"mousewheel",containermousewheel)}_scrollZoomEnabled=true}function disableScrollWheelZoom(){if(_listeners.scrollwheelzoom){nmev.removeListener(_listeners.scrollwheelzoom);delete _listeners.scrollwheelzoom}_scrollZoomEnabled=false}function scrollWheelZoomEnabled(){return _scrollZoomEnabled}function enablePinchZoom(){if(!_listeners.containergestureend){_listeners.containergestureend=nmev.addDomListener(container,"gestureend",containergestureend)}_pinchZoomEnabled=true}function disablePinchZoom(){if(_listeners.containergestureend){nmev.removeListener(_listeners.containergestureend);delete _listeners.containergestureend}_pinchZoomEnabled=false}function pinchToZoomEnabled(){return _pinchZoomEnabled}function ondblclick(e){var clickLatLng;var target;e=e||window.event;target=nmev.getTarget(e);if(target.isMap){clickLatLng=zoomLockToInputPosition(e,1);nmev.trigger(map,"dblclick",null,clickLatLng)}}function ondblrightclick(overlay,latlng){zoomOut(latlng)}function containermousewheel(e){var target;var mapType;var wheelDelta;e=e||window.event;target=nmev.getTarget(e);if(target&&nmd.isInput(target.nodeName)){return}mapType=map.getCurrentMapType();wheelDelta=nmev.normalizeWheelDelta(e);zoomLockToInputPosition(e,wheelDelta,true,true);nmev.stopBubbling(e);return nmev.preventDefault(e)}function containergestureend(e){if(e.scale>1){map.zoomIn()}else{if(e.scale<1){map.zoomOut()}}}function containeronepointdbltap(e){var touch=e.touches[0];var tapLatLng=zoomLockToInputPosition(touch,1);return nmev.preventDefault(e)}function containertwopointdbltap(e){var touch=e.touches[1];var tapLatLng=zoomLockToInputPosition(touch,-1);return nmev.preventDefault(e)}enableDoubleClickZoom();enablePinchZoom();this.enableDoubleClickZoom=enableDoubleClickZoom;this.disableDoubleClickZoom=disableDoubleClickZoom;this.doubleClickZoomEnabled=doubleClickZoomEnabled;this.enableContinuousZoom=enableContinuousZoom;this.disableContinuousZoom=disableContinuousZoom;this.continuousZoomEnabled=disableContinuousZoom;this.enableScrollWheelZoom=enableScrollWheelZoom;this.disableScrollWheelZoom=disableScrollWheelZoom;this.scrollWheelZoomEnabled=scrollWheelZoomEnabled;this.enablePinchZoom=enablePinchZoom;this.disablePinchZoom=disablePinchZoom;this.pinchToZoomEnabled=pinchToZoomEnabled;this.setZoom=setZoom;this.zoomIn=zoomIn;this.zoomOut=zoomOut}function MapStateManager(map,mapTypes,container,tileContainer,historyContainer,sizeMng,sessionMng,tileHistoryMng,ctrlMng){var _that=this;var _tileInfoMng=new TileInfoManager(map,_that);var _zoom=0;var _prevZoom=_zoom;var _isLoaded=false;var _timers={};var _mapTypes=[];var _showingDate=null;var _tileDate;var _currentMapType;var _currentMapTypeContainer;var _centerLatLng;var _wrapYDivPx;function isMapTypeRegistered(type){for(var i=_mapTypes.length;i--;){if(_mapTypes[i]===type){return true}}return false}function registerMapTypes(){_mapTypes=mapTypes.slice()}function tilesAvailable(latlng,zoom,tileDate,mapType,getTileInfo,downloadTiles){createMapType(latlng,zoom,tileDate,mapType,getTileInfo,downloadTiles);savePosition();if(!_isLoaded){addDefaultControls(map);_isLoaded=true;nmev.trigger(map,"load")}}function checkBaseLayerLoaded(layerContainer){var allReturned=false;var numTiles=layerContainer.childNodes.length;if(layerContainer.tilesReturned>=numTiles){allReturned=true;if(layerContainer.tilesLoaded>=numTiles){layerContainer.tilesLoaded=numTiles;if(layerContainer.parentNode){tileHistoryMng.clearHistory()}}}return allReturned}function createBackFillTile(origPoint,origZoom,lastZoom,tileDate,mapType,getTileUrl){var zoom=lastZoom-1;var scale;var point;var key;var tScale;var tileSize;var stretchTileSize;var scaledTileSize;var position;var tile;var divOffset;var size;var vCenter;var proj;var centerPx;var heading;var dateHistory;if(zoom>=0){scale=Math.pow(2,origZoom-zoom);point={x:Math.floor(origPoint.x/scale),y:Math.floor(origPoint.y/scale)};key=tileHistoryMng.getHistoryKey(point,zoom);dateHistory=tileHistoryMng.getHistory().getValue(key);if(!dateHistory||!dateHistory.exists(nml.DateHelper.toNearmapDateUTC(tileDate))){size=sizeMng.getSize();vCenter={x:Math.floor(size.width/2),y:Math.floor(size.height/2)};tScale=mapType.getTileScale();tileSize=mapType.getTileSize();stretchTileSize=tileSize*scale;scaledTileSize=new nmm.Size(stretchTileSize*tScale.x,stretchTileSize*tScale.y);divOffset=nmd.topLeft(tileContainer);heading=mapType.getHeading();proj=mapType.getProjection();centerPx=proj.fromLatLngToPixel(getCenter(),origZoom,tileSize);position=getDivOffsetAtRelativeScale(point,centerPx,stretchTileSize,tScale,heading,divOffset,vCenter);tile=nmm.TileLayer.createTile(point,point,zoom,tileDate,scaledTileSize,position,onbackfilltileload,onbackfilltileerror(origPoint,origZoom,tileDate,mapType,getTileUrl));if(nmm.debug){tile.style.borderColor="lime"}tileHistoryMng.appendHistory(tile,mapType,true);tile.src=getTileUrl(point,zoom,tileDate)}}}function onbackfilltileload(e){this.style.visibility="visible";tileHistoryMng.processLoadedTile(this)}function onbackfilltileerror(origPoint,origZoom,tileDate,mapType,getTileUrl){return function(e){this.style.visibility="hidden";createBackFillTile(origPoint,origZoom,this.zoom,this.date,mapType,getTileUrl);tileHistoryMng.remove(tileHistoryMng.getHistoryKey(this.wrappedPoint,this.zoom),this.date)}}function ontileload(e){var cnt=this.parentNode;var loadHandler;var processLoadedTimeout=100;var src;if(!cnt||!this.src||this.src===nmm.DUMMY_TILE||(this.src===nmm.TRANSPARENT_GIF&&!this.replaceTransparent)){this.style.visibility="hidden";return}if(!this.replaceTransparent){this.style.visibility="visible"}if(cnt.layerIndex===0&&!this.returned){cnt.tilesLoaded++;cnt.tilesReturned++;checkBaseLayerLoaded(cnt);tileHistoryMng.processLoadedTile(this)}this.returned=true;if(this.replaceTransparent){src=this.src;loadHandler=this.onload;this.onload=null;this.src=nmm.TRANSPARENT_GIF;this.style.visibility="visible";nms.applyPngAlphaBg(this,src,true);window.setTimeout(function(tile,loadHandler){return function(){tile.onload=loadHandler}}(this,loadHandler),0)}}function ontileerror(mapType,getTileUrl){return function(e){var cnt=this.parentNode;this.style.visibility="hidden";if(!cnt){return}this.errored=true;if(cnt.layerIndex===0&&!this.returned){cnt.tilesReturned++;checkBaseLayerLoaded(cnt)}this.returned=true;createBackFillTile(this.wrappedPoint,this.zoom,this.zoom,this.date,mapType,getTileUrl)}}function getPreciseTileSizeAtRelativeScale(origSize,origZoom,newZoom){var baseZoom=Math.floor(newZoom);var baseZx=baseZoom-origZoom;var baseScale=Math.pow(2,baseZx);var baseTSize=origSize*baseScale;var ceilTSize=baseTSize*2;var fraction=newZoom%1;return baseTSize+((ceilTSize-baseTSize)*fraction)}function getTileSizeAtRelativeScale(origSize,origZoom,newZoom){return Math.floor(getPreciseTileSizeAtRelativeScale(origSize,origZoom,newZoom))}function getDivOffsetAtRelativeScale(point,centerPx,newTileSize,tileScale,heading,tileContainerOffset,vCenter){var wrapWidth;var centerOffset;var tilePx;var midPoint;var nwTileOffset;tilePx={x:point.x*newTileSize,y:point.y*newTileSize};midPoint=Math.floor(newTileSize/2);nwTileOffset=nmlm.rotatePoint(heading,nmm.Point.ORIGIN,new nmm.Point(midPoint,midPoint));centerOffset=new nmm.Point(Math.floor((tilePx.x-centerPx.x+nwTileOffset.x)),Math.floor((tilePx.y-centerPx.y+nwTileOffset.y)));centerOffset=nmlm.rotatePoint(-heading,centerOffset,nmm.Point.ORIGIN,Math.round);centerOffset.x*=tileScale.x;centerOffset.y*=tileScale.y;centerOffset.x=Math.floor(centerOffset.x+vCenter.x);centerOffset.y=Math.floor(centerOffset.y+vCenter.y);return new nmm.Point(centerOffset.x-tileContainerOffset.x,centerOffset.y-tileContainerOffset.y)}function createMapType(centerLatLng,zoom,tileDate,mapType,retrieveTileInfo,downloadTiles){var dmns;var centerPx;var cnrOffset;var tlCnrOffset;var divOffset;var cntTopLeftPx;var proj;var sclTSize;var tSize;var tScale;var centerTile;var topLeftTile;var bufTlPx;var layerContainer;var mapTypeContainer;var tlen;var tLayers;var layer;var size;var unscaledNthCPx;var scaledNthTlTile;var scaledNthTlPx;var nthPxOffset;var squareMidPoint;var midPoint;var rtPxOffset;var rtScaledNthPx;var vCenter;var wrapYMin;var offsetLeft;var offsetTop;var rotatedCornerOffset;var heading=mapType.getHeading();dmns=sizeMng.getBufferedDimensions(mapType);cnrOffset=new nmm.Point(Math.ceil(dmns.width/2)-1,Math.ceil(dmns.height/2)-1);rotatedCornerOffset=nmlm.rotatePoint(heading,cnrOffset,nmm.Point.ORIGIN,Math.round);tLayers=mapType.getTileLayers();tlen=tLayers.length;size=sizeMng.getSize(true);proj=mapType.getProjection();sclTSize=mapType.getScaledTileSize();tSize=mapType.getTileSize();tScale=mapType.getTileScale();centerLatLng=centerLatLng.copy(false);centerPx=proj.fromLatLngToPixel(centerLatLng,zoom,sclTSize);centerTile=new nmm.Point(Math.floor(centerPx.x/sclTSize.width),Math.floor(centerPx.y/sclTSize.height));topLeftTile=new nmm.Point(centerTile.x-rotatedCornerOffset.x,centerTile.y-rotatedCornerOffset.y);unscaledNthCPx=proj.fromLatLngToPixel(centerLatLng,zoom,tSize);scaledNthTlTile=new nmm.Point(centerTile.x-cnrOffset.x,centerTile.y-cnrOffset.y);scaledNthTlPx=new nmm.Point(scaledNthTlTile.x*sclTSize.width,scaledNthTlTile.y*sclTSize.height);nthPxOffset=new nmm.Point(unscaledNthCPx.x%tSize,unscaledNthCPx.y%tSize);squareMidPoint=Math.floor(tSize/2);midPoint=new nmm.Point(squareMidPoint,squareMidPoint);rtPxOffset=nmlm.rotatePoint(-heading,nthPxOffset,midPoint);rtScaledNthPx=new nmm.Point(Math.floor(((centerTile.x*tSize)+rtPxOffset.x)*tScale.x),Math.floor(((centerTile.y*tSize)+rtPxOffset.y)*tScale.y));vCenter=new nmm.Point(Math.floor(size.width/2),Math.floor(size.height/2));divOffset=new nmm.Point(scaledNthTlPx.x-rtScaledNthPx.x+vCenter.x,scaledNthTlPx.y-rtScaledNthPx.y+vCenter.y);offsetLeft=parseInt(tileContainer.style.left,10);offsetTop=parseInt(tileContainer.style.top,10);if(_currentMapType){divOffset.x-=offsetLeft;divOffset.y-=offsetTop}wrapYMin=(Math.floor(size.height/2)-centerPx.y)-offsetTop;_wrapYDivPx={min:wrapYMin,max:wrapYMin+proj.getWrapHeight(zoom,sclTSize.height)};_currentMapType=mapType;mapTypeContainer=document.createElement("div");nms.css(mapTypeContainer,{position:"absolute",top:"0px",left:"0px"},true);tileContainer.appendChild(mapTypeContainer);_currentMapTypeContainer=mapTypeContainer;for(var lcnt=0;lcnt<tlen;lcnt++){layer=tLayers[lcnt];layerContainer=layer.initialize(zoom,tileDate,topLeftTile,dmns,divOffset,proj,{heading:heading,tileSize:sclTSize,tileLoadHandler:ontileload,tileErrorHandler:ontileerror(mapType,layer.getTileUrl),layerIndex:lcnt,downloadTiles:downloadTiles||downloadTilesOutwardStaircase});mapTypeContainer.appendChild(layerContainer);if(lcnt===0&&retrieveTileInfo){_tileInfoMng.get(centerTile,zoom,[layer.getMetaKey()])}}}function loadBatchTiles(tilesToLoad,tileCheckRange,getTileUrl,isPng,opacity,timers,timerKey){return function(){var tile;var tileUrl;for(var i=tilesToLoad.length;i--;){tile=tilesToLoad[i];if(tileCheckRange(tile.point,tile.zoom)){tileUrl=getTileUrl(tile.wrappedPoint,tile.zoom,tile.date);if(isPng&&opacity<1){nms.replaceIEPngTile(tile)}tile.src=tileUrl}else{tile.src=nmm.WRAP_TILE}}delete timers[timerKey]}}function downloadTilesOutwardStaircase(tileSet,downloadTimers,height,width,divOffset,tileSize,tileCheckRange,getTileUrl,isPng,opacity){var tilesToLoad;var tileToLoadTimers=0;var maxTilesToLoad=5;var timerOffset=50;var size=sizeMng.getSize();var vCenter=new nmm.Point(size.width/2,size.height/2);var offsetLeft;var offsetTop;var divOffsetCenterPx;var centerTile;var spiralRows;var spiralCols;var maxSteps;var minRow;var minCol;var maxRow;var maxCol;offsetLeft=parseInt(tileContainer.style.left,10);offsetTop=parseInt(tileContainer.style.top,10);divOffsetCenterPx=new nmm.Point(vCenter.x-divOffset.x-offsetLeft,vCenter.y-divOffset.y-offsetTop);centerTile=new nmm.Point(Math.floor(divOffsetCenterPx.x/tileSize.width),Math.floor(divOffsetCenterPx.y/tileSize.height));spiralRows=Math.floor(height/2)+1;spiralCols=Math.floor(width/2)+1;maxSteps=(spiralRows>spiralCols?spiralRows:spiralCols);for(var i=0;i<maxSteps;i++){tilesToLoad=[];minRow=centerTile.y-i;maxRow=centerTile.y+i;minCol=centerTile.x-i;maxCol=centerTile.x+i;for(var c=minCol;c<=maxCol;c++){if(c>=0&&c<width){if(minRow>=0){tilesToLoad.push(tileSet[minRow][c])}if(minRow!==maxRow&&maxRow<height){tilesToLoad.push(tileSet[maxRow][c])}if(tilesToLoad.length>=maxTilesToLoad){downloadTimers[tileToLoadTimers]=window.setTimeout(loadBatchTiles(tilesToLoad,tileCheckRange,getTileUrl,isPng,opacity,downloadTimers,tileToLoadTimers),timerOffset*tileToLoadTimers);tilesToLoad=[];tileToLoadTimers++}}}for(var r=minRow+1;r<maxRow;r++){if(r>=0&&r<height){if(minCol>=0){tilesToLoad.push(tileSet[r][minCol])}if(minCol!==maxCol&&maxCol<width){tilesToLoad.push(tileSet[r][maxCol])}if(tilesToLoad.length>=maxTilesToLoad){downloadTimers[tileToLoadTimers]=window.setTimeout(loadBatchTiles(tilesToLoad,tileCheckRange,getTileUrl,isPng,opacity,downloadTimers,tileToLoadTimers),timerOffset*tileToLoadTimers);tilesToLoad=[];tileToLoadTimers++}}}if(tilesToLoad.length>0){downloadTimers[tileToLoadTimers]=window.setTimeout(loadBatchTiles(tilesToLoad,tileCheckRange,getTileUrl,isPng,opacity,downloadTimers,tileToLoadTimers),timerOffset*tileToLoadTimers);tilesToLoad=[];tileToLoadTimers++}}tilesToLoad=null}function getZoom(){return _zoom}function getCenter(unbounded){return unbounded?_centerLatLng:_centerLatLng.copy()}function getCenterPixel(unbounded){var mapType=getCurrentMapType();var proj=mapType.getProjection();var tileSize=mapType.getTileSize();var zoom=getZoom();return proj.fromLatLngToPixel(getCenter(unbounded),zoom,tileSize)}function getScaledCenterPixel(unbounded){var centerPx=getCenterPixel(unbounded);var mapType=getCurrentMapType();var tScale=mapType.getTileScale();centerPx.x=Math.floor(centerPx.x*tScale.x);centerPx.y=Math.floor(centerPx.y*tScale.y);return centerPx}function getCenterTile(unbounded){var px=getCenterPixel(unbounded);var mapType=getCurrentMapType();var tileSize=mapType.getTileSize();return new nmm.Point(Math.floor(px.x/tileSize),Math.floor(px.y/tileSize))}function getTileDate(){return _tileDate}function getShowingDate(){return _showingDate}function getMapTypes(){return _mapTypes}function getCurrentMapType(){return _currentMapType}function getBounds(){var size=sizeMng.getSize(true);var proj=_currentMapType.getProjection();var tScale=_currentMapType.getTileScale();var tSize=_currentMapType.getTileSize();var zoom=getZoom();var heading=_currentMapType.getHeading();var centerPx;var pxsw,pxse;var sw,se;var vCenter;var sclVCenter;var maxPx;vCenter=new nmm.Point(Math.floor(size.width/2),Math.floor(size.height/2));centerPx=proj.fromLatLngToPixel(getCenter(),zoom,tSize);maxPx=new nmm.Point(proj.getWrapWidth(zoom,tSize),proj.getWrapHeight(zoom,tSize));sclVCenter=new nmm.Point(Math.floor(vCenter.x/tScale.x),Math.floor(vCenter.y/tScale.y));sclVCenter=nmlm.rotatePoint(-heading,sclVCenter,nmm.Point.ORIGIN);sclVCenter.x=Math.abs(sclVCenter.x);sclVCenter.y=Math.abs(sclVCenter.y);pxsw=new nmm.Point(centerPx.x-sclVCenter.x,centerPx.y+sclVCenter.y);pxne=new nmm.Point(centerPx.x+sclVCenter.x,centerPx.y-sclVCenter.y);if(pxne.y<0){pxne.y=0}if(pxsw.y>=maxPx.y){pxsw.y=maxPx.y-1}sw=proj.fromPixelToLatLng(pxsw,zoom,false,tSize);ne=proj.fromPixelToLatLng(pxne,zoom,false,tSize);if(pxne.x-pxsw.x>=maxPx.x){sw=new nmm.LatLng(sw.lat(),-180);ne=new nmm.LatLng(ne.lat(),180)}return new nmm.LatLngBounds(sw,ne)}function getBoundsZoomLevel(bounds,size,minZoom){var ne=bounds.getNorthEast();var sw=bounds.getSouthWest();var proj=_currentMapType.getProjection();var zoom=(minZoom===undefined||minZoom<1?1:minZoom);var sclTSize=_currentMapType.getScaledTileSize();var nePx=proj.fromLatLngToPixel(ne,zoom,sclTSize);var swPx=proj.fromLatLngToPixel(sw,zoom,sclTSize);if(!size){size=sizeMng.getSize(true)}if(nePx.x-swPx.x<size.width&&swPx.y-nePx.y<size.height){return this.getBoundsZoomLevel(bounds,size,zoom+1)}else{return zoom-1}}function savePosition(){nmh.MapCookie.setZoom(getZoom());nmh.MapCookie.setLatLng(getCenter());nmh.MapCookie.setMapType(getCurrentMapType());nmh.MapCookie.setTileDate(getTileDate());nmh.MapCookie.save()}function returnToSavedPosition(){setCenter(nmh.MapCookie.getLatLng(),nmh.MapCookie.getZoom())}function setCenter(latlng,zoom,mapType,date,getTileInfo,forceOldRemove,downloadTiles){var oldMapType=getCurrentMapType();var session=nmh.TileSession.get();var oldDate=_tileDate;var location=_currentMapType?getCenter():null;var tileSets;if(_timers.cleanHistory){window.clearTimeout(_timers.cleanHistory)}if(!mapType&&_mapTypes.length>0){mapType=_mapTypes[0]}if(!isMapTypeRegistered(mapType)){throw new Error("You must register the map type before performing actions on it.")}if(arguments.length<5){getTileInfo=true}if(_isLoaded){tileSets=oldMapType.getVisibleTileSets();oldMapType.clearTileLayerTileSets();tileHistoryMng.addTileSetHistory(_currentMapType,_currentMapTypeContainer,tileSets)}if(forceOldRemove){tileHistoryMng.clearHistory()}_zoom=zoom;_prevZoom=_zoom;_tileDate=date&&date instanceof Date?date:null;_centerLatLng=latlng;sessionMng.processSession();tilesAvailable(latlng,zoom,date,mapType,getTileInfo,downloadTiles);if(oldMapType!==mapType){if(oldMapType){nmev.trigger(map,"maptypechanged")}}if((_tileDate&&!oldDate)||(!_tileDate&&oldDate)||(oldDate&&_tileDate&&oldDate.getTime()-_tileDate.getTime()!==0)){nmev.trigger(map,"tiledatechanged",oldDate,_tileDate)}nmev.trigger(map,"setcenter",location,latlng)}function setMapType(type){if(_currentMapType===type){return}if(!isMapTypeRegistered(type)){throw new Error("You can only set a map type that is known to the map. Use addMapType() to register the map type")}nml.abortDownloads();setCenter(getCenter(),getZoom(),type,getTileDate())}function setTileDate(newDate){var oldDate=getTileDate();if((newDate&&!oldDate)||(!newDate&&oldDate)||(newDate&&oldDate&&oldDate.getTime()-newDate.getTime()!==0)){nml.abortDownloads();setCenter(getCenter(),getZoom(),getCurrentMapType(),newDate,false)}}function addMapType(type){if(!isMapTypeRegistered(type)){_mapTypes.push(type);nmev.trigger(map,"addmaptype",type)}}function removeMapType(type){var i=nml.ArrayHelper.indexOf(_mapTypes,type);if(i>=0){_mapTypes.splice(i,1);nmev.trigger(map,"removemaptype",type)}}function isLoaded(){return _isLoaded}function updateZoom(zoom){_zoom=zoom}function updateCenterLatLng(latlng){_centerLatLng=latlng}function fromContainerPixelToLatLng(pixel){var proj=_currentMapType.getProjection();var tSize=_currentMapType.getTileSize();var tScale=_currentMapType.getTileScale();var zoom=getZoom();var size=sizeMng.getSize();var vCenter;var centerPx;var pointPx;var centerOffset;var pixelLatLng;vCenter=new nmm.Point(Math.floor(size.width/2),Math.floor(size.height/2));centerOffset=new nmm.Point(Math.floor((pixel.x-vCenter.x)/tScale.x),Math.floor((pixel.y-vCenter.y)/tScale.y));centerOffset=nmlm.rotatePoint(_currentMapType.getHeading(),centerOffset,nmm.Point.ORIGIN);centerPx=proj.fromLatLngToPixel(getCenter(),zoom,tSize);pointPx=centerPx.copy();pointPx.add(centerOffset.x,centerOffset.y);pixelLatLng=proj.fromPixelToLatLng(pointPx,zoom,false,tSize);return pixelLatLng}function fromLatLngToContainerPixel(latlng){var divPx=fromLatLngToDivPixel(latlng);var offset=nmd.topLeft(tileContainer);divPx.add(offset.x,offset.y);return divPx}function fromLatLngToDivPixel(latlng){var mapType=getCurrentMapType();var proj=mapType.getProjection();var tSize=mapType.getTileSize();var sclTSize=mapType.getScaledTileSize();var tScale=mapType.getTileScale();var zoom=getZoom();var worldPx=proj.fromLatLngToPixel(latlng,zoom,tSize);var centerPx=proj.fromLatLngToPixel(getCenter(),zoom,tSize);var divOffset=nmd.topLeft(tileContainer);var size=sizeMng.getSize(true);var vCenter=new nmm.Point(Math.floor(size.width/2),Math.floor(size.height/2));var centerDivOffset=new nmm.Point(vCenter.x-divOffset.x,vCenter.y-divOffset.y);var nthCenterOffset=new nmm.Point(centerPx.x-worldPx.x,centerPx.y-worldPx.y);var rotatedCenterOffset;var wrapWidth=proj.getWrapWidth(zoom,sclTSize.width);var wrapHeight=proj.getWrapWidth(zoom,sclTSize.height);rotatedCenterOffset=nmlm.rotatePoint(-_currentMapType.getHeading(),nthCenterOffset,nmm.Point.ORIGIN);rotatedCenterOffset.x=Math.floor(rotatedCenterOffset.x*tScale.x);rotatedCenterOffset.y=Math.floor(rotatedCenterOffset.y*tScale.y);divPx=new nmm.Point(centerDivOffset.x-rotatedCenterOffset.x,centerDivOffset.y-rotatedCenterOffset.y);if(divPx.x>wrapWidth&&divPx.x+divOffset.x>size.width){divPx.x-=wrapWidth}if(divPx.y<_wrapYDivPx.min){divPx.y+=(Math.ceil((_wrapYDivPx.min-divPx.y)/wrapHeight)*wrapHeight)}if(divPx.y>_wrapYDivPx.max){divPx.y-=(Math.ceil((divPx.y-_wrapYDivPx.max)/wrapHeight)*wrapHeight)}return divPx}function fromDivPixelToLatLng(pixel){}function checkResize(){var size=sizeMng.getSize(false);var resizeOffset=sizeMng.getResizeOffset(size);var centerPx;var mapType;var proj;var tSize;var tScale;var offset;var heading;var centerLatLng;if(resizeOffset.x!==0||resizeOffset.y!==0){mapType=getCurrentMapType();proj=mapType.getProjection();zoom=getZoom();tScale=mapType.getTileScale();tSize=mapType.getTileSize();heading=mapType.getHeading();offset={x:Math.round(resizeOffset.x/2/tScale.x),y:Math.round(resizeOffset.y/2/tScale.y)};offset=nmlm.rotatePoint(heading,offset,nmm.Point.ORIGIN,Math.round);centerPx=proj.fromLatLngToPixel(getCenter(),zoom,tSize);centerPx.add(offset.x,offset.y);centerLatLng=proj.fromPixelToLatLng(centerPx,zoom,false,tSize);ctrlMng.hideCenteredControls();nmev.trigger(map,"resizestart");if(nmm.debug){showCenterPoint(map)}setCenter(centerLatLng,zoom,mapType,getTileDate());ctrlMng.repositionCenteredControls();nmev.trigger(map,"resizeend")}}function getTileInfoManager(){return _tileInfoMng}function updateShowingDate(oldDates,newDates){var oldShowingDate=_showingDate;var newShowingDate=null;var showingChanged=false;var len=newDates.length;var currentMs;var surveyDate;var surveyDateMs;var i;if(len>0){if(!_tileDate){newShowingDate=newDates[len-1]}else{currentMs=_tileDate.getTime();i=len-1;while(i>=0&&!showingChanged){surveyDate=newDates[i];surveyDateMs=surveyDate.getTime();if(currentMs===surveyDateMs){newShowingDate=surveyDate;showingChanged=true}else{if(currentMs>surveyDateMs){newShowingDate=surveyDate;showingChanged=true}}i--}}}_showingDate=newShowingDate;if((_showingDate&&oldShowingDate&&_showingDate.getTime()!==oldShowingDate.getTime())||(!_showingDate&&oldShowingDate)||(_showingDate&&!oldShowingDate)){nmev.trigger(map,"showingdatechanged",oldShowingDate,_showingDate)}}function updateShowingDateOnTileDateChanged(){updateShowingDate(null,_tileInfoMng.getAvailableMapTypeTileDates())}this.getCurrentMapType=getCurrentMapType;this.getMapTypes=getMapTypes;this.setMapType=setMapType;this.addMapType=addMapType;this.removeMapType=removeMapType;this.getAvailableMapTypeTileDates=_tileInfoMng.getAvailableMapTypeTileDates;this.getZoom=getZoom;this.getCenter=getCenter;this.getCenterPixel=getCenterPixel;this.getScaledCenterPixel=getScaledCenterPixel;this.getCenterTile=getCenterTile;this.getTileDate=getTileDate;this.getShowingDate=getShowingDate;this.getBounds=getBounds;this.getBoundsZoomLevel=getBoundsZoomLevel;this.savePosition=savePosition;this.returnToSavedPosition=returnToSavedPosition;this.setCenter=setCenter;this.setTileDate=setTileDate;this.isLoaded=isLoaded;this.updateZoom=updateZoom;this.updateCenterLatLng=updateCenterLatLng;this.fromContainerPixelToLatLng=fromContainerPixelToLatLng;this.fromLatLngToContainerPixel=fromLatLngToContainerPixel;this.fromDivPixelToLatLng=fromDivPixelToLatLng;this.fromLatLngToDivPixel=fromLatLngToDivPixel;this.getPreciseTileSizeAtRelativeScale=getPreciseTileSizeAtRelativeScale;this.getTileSizeAtRelativeScale=getTileSizeAtRelativeScale;this.getDivOffsetAtRelativeScale=getDivOffsetAtRelativeScale;this.checkResize=checkResize;this.loadBatchTiles=loadBatchTiles;this.getTileInfoManager=getTileInfoManager;registerMapTypes();nmev.addListener(map,"maptypetiledatesupdated",updateShowingDate);nmev.addListener(map,"tiledatechanged",updateShowingDateOnTileDateChanged)}function MapEventManager(map,container,mapStateMng){var _that=this;var _dragCnt=0;var _panSpeed=50;var _listeners={};var _timers={};function showContextMenu(elm){var nodeName=elm.nodeName.toLowerCase();if(nodeName==="textarea"||(nodeName==="input"&&elm.type==="text")||(nodeName==="a"&&elm.href)){return true}else{if(nodeName==="body"||nodeName==="html"){return false}else{return showContextMenu(elm.parentNode)}}}function oncontextmenu(e){var dblclickTimeout=250;var target;var clickPoint;var latlng;e=e||window.event;target=nmev.getTarget(e);if(target.isMap){clickPoint=new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop);if(!_timers.singlerightclick){_timers.singlerightclick=window.setTimeout(function(clickPoint,target){return function(){delete _timers.singlerightclick;nmev.trigger(map,"singlerightclick",clickPoint,target,null)}}(clickPoint,target),dblclickTimeout)}else{window.clearTimeout(_timers.singlerightclick);delete _timers.singlerightclick;clickPoint=new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop);latlng=mapStateMng.fromContainerPixelToLatLng(clickPoint);nmev.trigger(map,"dblrightclick",null,latlng)}return false}return showContextMenu(target)}function containermouseover(e){nmev.trigger(map,"mouseover")}function containermouseout(e){}function containermousedown(e){var target;e=e||window.event;if(nmev.getMouseButton(e)===nmev.MouseButton.LEFT_BUTTON){target=nmev.getTarget(e);if(target.isMap){container.mouseDownX=e.clientX;container.mouseDownY=e.clientY}}}function containermouseup(e){var latlng;var containerPx;var target;e=e||window.event;target=nmev.getTarget(e);if(container.mouseDownX===e.clientX||container.mouseDownY===e.clientY){containerPx={x:e.clientX-container.offsetLeft,y:e.clientY-container.offsetTop};latlng=mapStateMng.fromContainerPixelToLatLng(containerPx);nmev.trigger(map,"click",null,latlng,null)}container.mouseDownX=null;container.mouseDownY=null}nmev.addDomListener(window,"resize",mapStateMng.checkResize);container.oncontextmenu=oncontextmenu;nmev.addDomListener(container,"mouseover",containermouseover);nmev.addDomListener(container,"mouseout",containermouseout);nmev.addDomListener(container,"mousedown",containermousedown);nmev.addDomListener(container,"mouseup",containermouseup)}function MapManager(map,container,opts){var _nearmapBarEnabled=false;var _tileContainer;var _zoomLockControl;var _uiMng;var _sizeMng;var _zoomMng;var _panMng;var _controlMng;var _overlayMng;var _infoWindowMng;var _tileHistoryMng;var _splashMng;var _sessionMng;var _mapStateMng;var _mapEventMng;opts=nmo.Synchronize.fill(opts,nmm.MapOptions);_zoomLockControl=new ZoomLockControl();_controlMng=new ControlManager(map);_uiMng=new UIManager(map,container,opts.backgroundColor,opts.size,_controlMng);_tileContainer=_uiMng.getTileContainer();_sizeMng=new SizeManager(container);_tileHistoryMng=new TileHistoryManager(container,_tileContainer,_uiMng.getHistoryContainer(),_uiMng.getGarbageContainer(),_sizeMng);_splashMng=new SplashManager(container);_sessionMng=new SessionManager(container,_splashMng);_mapStateMng=new MapStateManager(map,opts.mapTypes,container,_tileContainer,_uiMng.getHistoryContainer(),_sizeMng,_sessionMng,_tileHistoryMng,_controlMng);_overlayMng=new OverlayManager(map);_infoWindowMng=new InfoWindowManager(map,_overlayMng);_panMng=new PanManager(map,container,_tileContainer,_mapStateMng,_sizeMng,_sessionMng);_zoomMng=new ZoomManager(map,container,_tileContainer,_zoomLockControl,_mapStateMng,_sizeMng,_tileHistoryMng,_panMng,_uiMng);_mapEventMng=new MapEventManager(map,container,_mapStateMng);map.getContainer=_uiMng.getContainer;map.getTileContainer=_uiMng.getTileContainer;map.getBackfillContainer=_uiMng.getBackfillContainer;map.getPane=_uiMng.getPane;map.enableDragging=_panMng.enableDragging;map.disableDragging=_panMng.disableDragging;map.draggingEnabled=_panMng.draggingEnabled;map.enableDoubleClickZoom=_zoomMng.enableDoubleClickZoom;map.disableDoubleClickZoom=_zoomMng.disableDoubleClickZoom;map.doubleClickZoomEnabled=_zoomMng.doubleClickZoomEnabled;map.enableContinuousZoom=_zoomMng.enableContinuousZoom;map.disableContinuousZoom=_zoomMng.disableContinuousZoom;map.continuousZoomEnabled=_zoomMng.disableContinuousZoom;map.enableScrollWheelZoom=_zoomMng.enableScrollWheelZoom;map.disableScrollWheelZoom=_zoomMng.disableScrollWheelZoom;map.scrollWheelZoomEnabled=_zoomMng.scrollWheelZoomEnabled;map.enablePinchZoom=_zoomMng.enablePinchZoom;map.disablePinchZoom=_zoomMng.disablePinchZoom;map.pinchToZoomEnabled=_zoomMng.pinchToZoomEnabled;map.enableInfoWindow=_infoWindowMng.enableInfoWindow;map.disableInfoWindow=_infoWindowMng.disableInfoWindow;map.infoWindowEnabled=_infoWindowMng.infoWindowEnabled;map.getMapTypes=_mapStateMng.getMapTypes;map.getCurrentMapType=_mapStateMng.getCurrentMapType;map.setMapType=_mapStateMng.setMapType;map.addMapType=_mapStateMng.addMapType;map.removeMapType=_mapStateMng.removeMapType;map.getAvailableMapTypeTileDates=_mapStateMng.getAvailableMapTypeTileDates;map.getSize=_sizeMng.getSize;map.getZoom=_mapStateMng.getZoom;map.getTileDate=_mapStateMng.getTileDate;map.getShowingDate=_mapStateMng.getShowingDate;map.getCenter=_mapStateMng.getCenter;map.getBounds=_mapStateMng.getBounds;map.getBoundsZoomLevel=_mapStateMng.getBoundsZoomLevel;map.setCenter=_mapStateMng.setCenter;map.setTileDate=_mapStateMng.setTileDate;map.setZoom=_zoomMng.setZoom;map.zoomIn=_zoomMng.zoomIn;map.zoomOut=_zoomMng.zoomOut;map.panTo=_panMng.panTo;map.panBy=_panMng.panBy;map.panDirection=_panMng.panDirection;map.fromContainerPixelToLatLng=_mapStateMng.fromContainerPixelToLatLng;map.fromLatLngToContainerPixel=_mapStateMng.fromLatLngToContainerPixel;map.fromLatLngToDivPixel=_mapStateMng.fromLatLngToDivPixel;map.fromDivPixelToLatLng=_mapStateMng.fromDivPixelToLatLng;map.addControl=_controlMng.addControl;map.removeControl=_controlMng.removeControl;map.hideCenteredControls=_controlMng.hideCenteredControls;map.repositionCenteredControls=_controlMng.repositionCenteredControls;map.addOverlay=_overlayMng.addOverlay;map.removeOverlay=_overlayMng.removeOverlay;map.clearOverlays=_overlayMng.clearOverlays;map.openInfoWindow=_infoWindowMng.openInfoWindow;map.openInfoWindowHtml=_infoWindowMng.openInfoWindowHtml;map.openInfoWindowTabs=_infoWindowMng.openInfoWindowTabs;map.openInfoWindowTabsHtml=_infoWindowMng.openInfoWindowTabsHtml;map.showMapBlowup=_infoWindowMng.showMapBlowup;map.updateInfoWindow=_infoWindowMng.updateInfoWindow;map.updateCurrentTab=_infoWindowMng.updateCurrentTab;map.closeInfoWindow=_infoWindowMng.closeInfoWindow;map.getInfoWindow=_infoWindowMng.getInfoWindow;map.processSession=_sessionMng.processSession;map.getDefaultUI=_uiMng.getDefaultUI;map.setUI=_uiMng.setUI;map.setUIToDefault=_uiMng.setUIToDefault;map.addControl(_zoomLockControl);nmev.addListener(map,"zoomstart",_overlayMng.hideMarkerPane);nmev.addListener(map,"zoomend",_overlayMng.showMarkerPane)}var MapOptions={size:null,mapTypes:nmm.MapType.DEFAULT_MAP_TYPES,draggableCursor:"pointer",draggingCursor:"pointer",nearmapBarOptions:nmm.NearMapBarOptions,backgroundColor:"#ccc"};function Map2(container,opts){var _mapMng=new MapManager(this,container,opts);var _nearmapBarEnabled=false;function enableNearmapBar(){_nearmapBarEnabled=true}function disableNearmapBar(){_nearmapBarEnabled=false}this.getDragObject=function(){};this.getEarthInstance=function(callback){};this.enableNearmapBar=enableNearmapBar;this.disableNearmapBar=disableNearmapBar}Map2.prototype.generatePermalink=function(opts){var args=[];var mtKey;var mapType=(opts&&opts.mapType?opts.mapType:this.getCurrentMapType());var urlArg=mapType.getUrlArg();var latlng=(opts&&opts.latlng?opts.latlng:this.getCenter());var zoom=(opts&&opts.zoom?opts.zoom:this.getZoom());var surveyDates;var tileDate=(opts&&opts.tileDate?opts.tileDate:this.getTileDate());if(!urlArg){throw new Exception("You must provide a url argument to the permalink control")}if(opts&&opts.query){args.push(nmm.SEARCH_QUERY_KEY+"="+opts.query)}if(latlng){args.push(nmm.LATLNG_KEY+"="+latlng.toUrlValue())}if(zoom>0){args.push(nmm.ZOOM_KEY+"="+zoom)}mtKey=nmm.MapType.Keys[mapType.getName(false)];if(mtKey){args.push(nmm.MAPTYPE_KEY+"="+mtKey)}if(!tileDate){surveyDates=this.getAvailableMapTypeTileDates();if(surveyDates.length>0){tileDate=surveyDates[surveyDates.length-1]}}if(tileDate){args.push(nmm.TILE_DATE_KEY+"="+nml.DateHelper.toNearmapDateUTC(tileDate))}return nmh.HttpResponse.formatUrl(urlArg,args)};nmm.Map2=Map2;nmm.MapOptions=MapOptions;nmm.InfoWindowOptions=InfoWindowOptions;nmm.InfoWindowTab=InfoWindowTab;nmm.DEFAULT_LAT_LNG=DEFAULT_LAT_LNG})();/*
 * Module which defines the publicly avaiable controls and their options. These
 * controls can be added to the map using the Map.addControl() method.
 *
 * Copyright (c) 2009 Nearmap Pty
 * TODO: OUR LICENSE
 * http://docs.nearmap.com/license
 *
 * Date: 2009-07-27 10:11:00 +0800 (Mon, 27 Jul 2009)
 * Revision: 0.0.1
 */
(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nmm=nearmap.maps;var nmc=nearmap.client;var nms=nearmap.style;var nme=nearmap.memory;var nmo=nearmap.options;var nml=nearmap.lib;var nmls=nearmap.lib.sprite;var nmlh=nearmap.lib.history;var nmev=nearmap.event;var nmh=nearmap.http;var nmd=nearmap.dom;var ajax=nearmap.ajax;var nmov=nearmap.overlay;var nma=nearmap.animation;var ControlAnchor={ANCHOR_TOP_RIGHT:1,ANCHOR_BOTTOM_LEFT:2,ANCHOR_BOTTOM_RIGHT:3,ANCHOR_TOP_LEFT:4,ANCHOR_CENTER:5};function ControlPosition(anchor,offset){this.anchor=anchor;this.offset=offset||new nmm.Size(0,0)}ControlPosition.prototype.apply=function(elm){var container;if(this.anchor===ControlAnchor.ANCHOR_CENTER){container=elm.parentNode;elm.style.left=Math.floor((container.offsetWidth/2)-(elm.offsetWidth/2)+this.offset.width)+"px";elm.style.top=Math.floor((container.offsetHeight/2)-(elm.offsetHeight/2)+this.offset.height)+"px"}else{elm.style[this.xA()]=this.offset.getWidthString();elm.style[this.yA()]=this.offset.getHeightString()}};ControlPosition.prototype.applyRelative=function(elm,relativeTo){var container=elm.parentNode;var relH;var relV;var offsetH;var offsetV;if(this.anchor===ControlAnchor.ANCHOR_CENTER){elm.style.left=Math.floor((container.offsetWidth/2)-(elm.offsetWidth/2)+this.offset.width)+"px";elm.style.top=Math.floor((container.offsetHeight/2)-(elm.offsetHeight/2)+this.offset.height)+"px"}else{relH=(relativeTo.style.right?"right":"left");relV=(relativeTo.style.bottom?"bottom":"top");if(this.xA()==="left"){offsetH=relativeTo.offsetLeft+relativeTo.offsetWidth-container.offsetLeft}else{offsetH=relativeTo.offsetLeft-container.offsetLeft}if(this.yA()==="top"){offsetV=relativeTo.offsetTop+relativeTo.offsetHeight-container.offsetTop}else{offsetV=relativeTo.offsetTop-container.offsetTop}elm.style[relH]=(offsetH+this.offset.width)+"px";elm.style[relV]=(offsetV+this.offset.height)+"px"}};ControlPosition.prototype.xA=function(){switch(this.anchor){case 1:case 3:return"right";default:return"left"}};ControlPosition.prototype.yA=function(){switch(this.anchor){case 2:case 3:return"bottom";default:return"top"}};function Control(printable,selectable){this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){};this.getDefaultPosition=function(){}}function PanControl(printable,selectable){var _panSpeed=50;this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var domChain=document.createElement("div"),north=document.createElement("a"),east=document.createElement("a"),south=document.createElement("a"),west=document.createElement("a"),buttons=[north,east,south,west],lstnMouseUp,doPan;function up(){window.clearInterval(doPan);nmev.removeListener(lstnMouseUp)}function down(e){var d;e=e||window.event;if(e.button===0){switch(this){case north:d=new nmm.Size(0,_panSpeed);break;case east:d=new nmm.Size(-_panSpeed,0);break;case south:d=new nmm.Size(0,-_panSpeed);break;case west:d=new nmm.Size(_panSpeed,0);break}map.panBy(d);lstnMouseUp=nmev.addDomListener(window.document,"mouseup",up);doPan=window.setInterval(function(){map.panBy(d)},50)}nmev.stopBubbling(e)}function over(){switch(this){case north:this.style.background=nmm.sprites.maptools+" no-repeat 0 -50px";return;case east:this.style.background=nmm.sprites.maptools+" no-repeat -25px -99px";return;case south:this.style.background=nmm.sprites.maptools+" no-repeat 0 -75px";return;case west:this.style.background=nmm.sprites.maptools+" no-repeat 0 -99px";return}}function out(){this.style.background=null}nms.css(domChain,{background:"url("+nmls.MAP_TOOLS.url+") no-repeat",width:"44px",height:"44px",margin:"0px 0px 8px 0px",position:"relative"});nms.css(north,{cursor:"pointer",position:"absolute",left:"7px",top:"0px",display:"block",width:"30px",height:"14px"});nms.css(east,{cursor:"pointer",position:"absolute",left:"28px",top:"6px",display:"block",width:"16px",height:"30px"});nms.css(south,{cursor:"pointer",position:"absolute",left:"7px",top:"28px",display:"block",width:"30px",height:"14px"});nms.css(west,{cursor:"pointer",position:"absolute",left:"0px",top:"6px",display:"block",width:"16px",height:"30px"});for(var i=0;i<buttons.length;i++){nmev.addDomListener(buttons[i],"mousedown",down);nmev.addDomListener(buttons[i],"mouseover",over);nmev.addDomListener(buttons[i],"mouseout",out);nmev.addDomListener(buttons[i],"dblclick",nmev.stopBubbling)}domChain.appendChild(north);domChain.appendChild(east);domChain.appendChild(south);domChain.appendChild(west);return domChain};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))}}function ZoomInControl(printable,selectable){var _sprite=nmls.ZOOM;var _node;function onzoomclick(e,map){map.zoomIn()}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var spriteBtn=document.createElement("span");_node=document.createElement("a");_node.title="Zoom in";nms.css(_node,{cursor:"pointer",height:"18px",width:"18px",position:"relative"});nms.css(spriteBtn,{clip:"rect(0px 18px 18px 0px)",height:"18px",width:"18px",position:"absolute",left:"0px"});nms.applyPngAlphaBg(spriteBtn,_sprite.url);nmev.addDomListener(_node,"click",nmev.callbackArgs(_node,onzoomclick,map));_node.appendChild(spriteBtn);return _node};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))}}function ZoomOutControl(printable,selectable){var _node;var _sprite=nmls.ZOOM;function onzoomclick(e,map){map.zoomOut()}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var spriteBtn=document.createElement("span");_node=document.createElement("a");_node.title="Zoom out";nms.css(_node,{cursor:"pointer",height:"18px",width:"18px",position:"relative"});nms.css(spriteBtn,{clip:"rect(26px 18px 44px 0px)",height:"44px",width:"18px",position:"absolute",top:"-26px",left:"0px"});nms.applyPngAlphaBg(spriteBtn,_sprite.url);nmev.addDomListener(_node,"click",nmev.callbackArgs(_node,onzoomclick,map));_node.appendChild(spriteBtn);return _node};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))}}function ResetControl(printable,selectable){var _node;var _sprite=nmls.ZOOM;function onbuttonclick(e,map){map.setCenter(nmm.DEFAULT_LAT_LNG,nmm.DEFAULT_ZOOM,nmm.DEFAULT_MAP_TYPE,null)}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var spriteBtn=document.createElement("span");_node=document.createElement("a");_node.title="Show the whole world";nms.css(_node,{cursor:"pointer",height:"18px",width:"18px",position:"relative"});nms.css(spriteBtn,{clip:"rect(92px 18px 110px 0px)",height:"110px",width:"18px",position:"absolute",top:"-92px",left:"0px"});nms.applyPngAlphaBg(spriteBtn,_sprite.url);nmev.addDomListener(_node,"click",nmev.callbackArgs(_node,onbuttonclick,map));_node.appendChild(spriteBtn);return _node};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))}}function SmallZoomControl3D(printable,selectable){var _node;var _sprite=nmls.ZOOM;function createBackground(){var frag=document.createDocumentFragment();var borderTop=document.createElement("div");var middle=document.createElement("div");var borderBottom=document.createElement("div");nms.css(borderTop,{clip:"rect(50px 27px 56px 0px)",height:"56px",width:"27px",position:"absolute",top:"-50px",left:"0px"},true);nms.applyPngAlphaBg(borderTop,_sprite.url);nms.css(middle,{clip:"rect(0px 57px 67px 30px)",height:"67px",width:_sprite.size.getWidthString(),position:"absolute",top:"6px",left:"-30px"},true);nms.applyPngAlphaBg(middle,_sprite.url,true);nms.css(borderBottom,{clip:"rect(61px 27px 67px 0px)",height:"67px",width:"27px",position:"absolute",top:"12px",left:"0px"},true);nms.applyPngAlphaBg(borderBottom,_sprite.url);frag.appendChild(borderTop);frag.appendChild(middle);frag.appendChild(borderBottom);return frag}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var frag=document.createDocumentFragment();var zoomIn=new ZoomInControl(this.printable(),this.selectable());var zoomOut=new ZoomOutControl(this.printable(),this.selectable());var reset=new ResetControl(this.printable(),this.selectable());var zoomInNode=zoomIn.initialize(map);var zoomOutNode=zoomOut.initialize(map);var resetNode=reset.initialize(map);_node=document.createElement("div");nms.css(_node,{cursor:"default",height:"80px",width:"30px"},true);nms.css(zoomInNode,{position:"absolute",top:"5px",left:"4px"});nms.css(zoomOutNode,{position:"absolute",top:"30px",left:"4px"});nms.css(resetNode,{position:"absolute",top:"53px",left:"4px"});if(!this.selectable()){nmev.disableSelect(_node)}frag.appendChild(_node);_node.appendChild(createBackground());_node.appendChild(zoomInNode);_node.appendChild(zoomOutNode);_node.appendChild(resetNode);map.getContainer().appendChild(frag);return _node};this.getNode=function(){return _node};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(10,10))}}var SmallZoomControl=SmallZoomControl3D;function SliderControl(printable,selectable){this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var domChain=document.createElement("div"),sliderBgSprite=document.createElement("div"),sliderNotch=document.createElement("a"),sliderNotchSprite=document.createElement("span"),height=198,mapType=map.getCurrentMapType(),zoomLevels,notchHeight=5,notchTotHeight,notchTopPos,lstnSldMouseUp,lstnSldMouseMove;function sliderStop(slider){var zoomMove,sliderLevel;zoomMove=parseInt(slider.style.top,10)-slider.startY;sliderLevel=Math.ceil((height-parseInt(slider.style.top,10))/notchTotHeight);slider.style.top=(height-(sliderLevel*notchTotHeight))+"px";slider.style.background=nmm.sprites.maptools+" no-repeat -77px -104px";slider.startY=null;slider.lastY=null;map.setZoom(sliderLevel)}function mousemove(e){var zoomMove,ypos;e=e||window.event;zoomMove=e.clientY-sliderNotch.lastY;sliderNotch.lastY=e.clientY;ypos=(parseInt(sliderNotch.style.top,10)+zoomMove);if(zoomMove!==0&&ypos<sliderNotch.bounds.top){ypos=sliderNotch.bounds.top}else{if(zoomMove!==0&&ypos>sliderNotch.bounds.bottom){ypos=sliderNotch.bounds.bottom}}sliderNotch.style.top=ypos+"px";nmev.stopBubbling(e);return nmev.preventDefault(e)}function mouseup(e){sliderStop(sliderNotch);nmev.removeListener(lstnSldMouseUp);nmev.removeListener(lstnSldMouseMove)}function mousedown(e){e=e||window.event;if(nmev.getMouseButton(e)===nmev.MouseButton.LEFT_BUTTON){sliderNotch.style.background=nmm.sprites.maptools+" no-repeat -77px -79px";sliderNotch.startY=parseInt(sliderNotch.style.top,10);sliderNotch.lastY=e.clientY;lstnSldMouseUp=nmev.addDomListener(window.document,"mouseup",mouseup);lstnSldMouseMove=nmev.addDomListener(window.document,"mousemove",mousemove)}nmev.stopBubbling(e);return nmev.preventDefault(e)}function syncNotch(){notchTopPos=height-((map.getZoom())*notchTotHeight);sliderNotch.style.top=notchTopPos+"px"}zoomLevels=mapType.getMaximumResolution()-mapType.getMinimumResolution()+1;notchTotHeight=notchHeight+Math.floor((height-(zoomLevels*notchHeight))/zoomLevels);domChain.slider=sliderNotch;sliderNotch.slider=sliderNotch;sliderNotch.bounds={top:0,bottom:height-notchTotHeight};nms.css(domChain,{cursor:"default",height:height+"px",width:"16px",margin:"auto",position:"relative",textAlign:"center"});nms.css(sliderBgSprite,{clip:"rect(0px, 69px, "+height+"px, 53px)",height:height+"px",width:"69px",position:"absolute",left:"-52px",top:"0px"});nms.applyPngAlphaBg(sliderBgSprite,nmls.MAP_TOOLS.url);nms.css(sliderNotch,{cursor:"pointer",height:"9px",width:"23px",position:"absolute",left:"-2px"});nms.css(sliderNotchSprite,{clip:"rect(104px, 99px, 113px, 76px)",height:"113px",width:"99px",position:"absolute",left:"-77px",top:"-104px"});nms.applyPngAlphaBg(sliderNotchSprite,nmls.MAP_TOOLS.url);syncNotch();nmev.addDomListener(sliderNotch,"mousedown",mousedown);nmev.addDomListener(domChain,"dblclick",nmev.stopBubbling);nmev.addDomListener(domChain,"mousedown",nmev.stopBubbling);nmev.addListener(map,"zoomend",syncNotch);domChain.appendChild(sliderBgSprite);domChain.appendChild(sliderNotch);sliderNotch.appendChild(sliderNotchSprite);return domChain};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))}}function LargeMapControl3D(){this.printable=function(){return false};this.selectable=function(){return false};this.initialize=function(map){var chain=document.createElement("div"),pan=new PanControl(this.printable(),this.selectable()),zoomIn=new ZoomInControl(this.printable(),this.selectable()),zoomOut=new ZoomOutControl(this.printable(),this.selectable()),slider=new SliderControl(this.printable(),this.selectable());chain.appendChild(pan.initialize(map));chain.appendChild(zoomIn.initialize(map));chain.appendChild(slider.initialize(map));chain.appendChild(zoomOut.initialize(map));map.getContainer().appendChild(chain);return chain};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))}}var LargeMapControl=LargeMapControl3D;function MapTypeControl(useShortNames){function styleActiveButton(b,poverY,overY){var p=b.parentNode;p.style.background="url("+nmls.BUTTONS.url+") no-repeat right "+poverY;p.style.height="17px";p.style.marginLeft=p.previousSibling?"13px":"5px";p.style.display="inline-block";p.style.background="url("+nmls.BUTTONS.url+") no-repeat 0 "+overY;b.style.cursor="pointer";b.style.height="17px";b.style.display="inline-block";b.style.marginLeft="-5px";b.style.padding="0 8px";b.style.color="#fff";b.style.fontSize="11px"}function styleInactiveButton(b,outY){var p=b.parentNode;p.style.background="url("+nmls.BUTTONS.url+") no-repeat right 0";p.style.height="17px";p.style.marginLeft=p.previousSibling?"13px":"5px";p.style.display="inline-block";p.style.background="url("+nmls.BUTTONS.url+") no-repeat 0 "+outY;b.style.height="17px";b.style.display="inline-block";b.style.marginLeft="-5px";b.style.padding="0 8px";b.style.color="#333";b.style.fontSize="11px"}function styleHoverButton(b,poverY,overY){b.style.cursor="pointer";b.style.color="#fff";b.style.backgroundPosition="0 "+overY;b.parentNode.style.backgroundPosition="right "+poverY}function clearSelection(buttons,outY){for(var i=0;i<buttons.length;i++){styleInactiveButton(buttons[i],outY)}}this.useShortNames=Boolean(useShortNames);this.printable=function(){return true};this.selectable=function(){return false};this.initialize=function(map){var chain=document.createElement("div");var btn;var btnCnt;var evnt=nmev.Events;var outY="-18px";var overY="-58px";var poverY="-40px";var mapTypes=map.getMapTypes();var currentMapType=map.getCurrentMapType();var buttons=[];function click(e){if(!map.getCurrentMapType().equals(this.mapType)){map.setMapType(this.mapType);clearSelection(buttons,outY);styleActiveButton(this.firstChild,poverY,overY)}}function mouseover(e){e=e||window.event;styleHoverButton(this,poverY,overY);nmev.stopBubbling(e)}function mouseout(e){e=e||window.event;if(!map.getCurrentMapType().equals(this.parentNode.mapType)){styleInactiveButton(this,outY)}nmev.stopBubbling(e)}for(var i=0;i<mapTypes.length;i++){btn=document.createElement("a");btnCnt=document.createElement("span");btnCnt.innerHTML=mapTypes[i].getName(this.useShortNames);btn.appendChild(btnCnt);chain.appendChild(btn);if(currentMapType.equals(mapTypes[i])){styleActiveButton(btnCnt,poverY,overY)}else{styleInactiveButton(btnCnt,outY)}btn.onclick=click;btn.ondblclick=nmev.stopBubbling;btn.onmousedown=nmev.stopBubbling;btn.onmouseover=mouseover;btn.onmouseout=mouseout;btnCnt.onmouseover=mouseover;btnCnt.onmouseout=mouseout;btn.mapType=mapTypes[i];buttons[i]=btnCnt}map.getContainer().appendChild(chain);return chain};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(10,10))}}function ToggleAndRotateMapTypeViewControl(printable,selectable,useShortNames){var _that=this;var _relationships={};var _node;var _currentRequestId=0;var _listeners={};var _prevMapType;var _toggleRelationShipOrder=[];var _toggleRelationships={};var _toggleOnMapTypes=[];var _normalMapTypes=[];var _parentMapTypes=[];var _toggleButtons=[];var _normalButtons=[];var _parentButtons=[];function normalbtnmaptypechanged(normalBtn){var currentMapType=this.getCurrentMapType();if(currentMapType===normalBtn.mapType||isCurrentToggleOffState(currentMapType,normalBtn.mapType)){normalBtn.style.color="#089853"}else{normalBtn.style.color="#00284d"}}function ontogglebtnmaptypechanged(toggleBtn,toggleRelationship){var currentMapType=this.getCurrentMapType();if(isToggleOnRelationship(toggleRelationship,currentMapType)){toggleBtn.mapType=currentMapType;toggleBtn.style.color="#089853"}else{toggleBtn.style.color="#00284d"}}function linkbtnmouseover(e,map){this.style.color="#089853"}function linkbtnmouseout(e,map){var currentMapType=map.getCurrentMapType();if(currentMapType!==this.mapType&&!isCurrentToggleOffState(currentMapType,this.mapType)){this.style.color="#00284d"}}function ontogglebtnclick(e,map,toggleRelationship){var i=0;var j=0;var toggleOn=null;var toggleOff=null;var currentMapType=map.getCurrentMapType();while((!toggleOn||!toggleOff)&&i<toggleRelationship.length){if(toggleRelationship[i].on===currentMapType){toggleOn=toggleRelationship[i]}if(toggleRelationship[i].off===currentMapType){toggleOff=toggleRelationship[i]}i++}if(toggleOn){this.mapType=null;map.setMapType(toggleOn.off);return}if(!toggleOff){if(_prevMapType){toggleOff={on:isToggleOnState(this.mapType)?this.mapType:getToggleOnFromRelationship(toggleRelationship,_prevMapType)}}if(!toggleOff||!toggleOff.on){toggleOff=toggleRelationship[0]}}styleInactiveButtons();this.mapType=toggleOff.on;map.setMapType(toggleOff.on)}function onnormalbtnclick(e,map){var currentMapType=map.getCurrentMapType();var toggleOn;if(currentMapType!==this.mapType&&!isCurrentToggleOffState(currentMapType,this.mapType)){toggleOn=getToggleOn(currentMapType,this.mapType);styleInactiveButtons();map.setMapType(toggleOn||this.mapType)}}function parentbtnmouseover(e){var prntRel=_relationships[this.mapType.getName(false)];this.style.color="#089853";this.firstChild.nodeValue=prntRel.firstChild.getName(true)}function parentbtnmouseout(e){this.style.color="#00284d";this.firstChild.nodeValue=this.mapType.getName(true)}function parentbtnclick(e,map){var prntRel=_relationships[this.mapType.getName(false)];_prevMapType=map.getCurrentMapType();this.firstChild.nodeValue=this.mapType.getName(true);map.setMapType(prntRel.firstChild)}function clockwisemouseover(e){nms.css(this.firstChild,{clip:"rect(112px 38px 138px 0px)",height:"138px",top:"-112px"})}function clockwisemouseout(e){nms.css(this.firstChild,{clip:"rect(84px 38px 110px 0px)",height:"110px",top:"-84px"})}function anticlockwisemouseover(e){nms.css(this.firstChild,{clip:"rect(112px 78px 138px 40px)",height:"138px",top:"-112px",left:"-40px"})}function anticlockwisemouseout(e){nms.css(this.firstChild,{clip:"rect(84px 78px 110px 40px)",height:"110px",left:"-40px",top:"-84px"})}function clockwiseclick(e,parent,map,mapType){var prntRel,cwKey,cwChild;prntRel=_relationships[parent.getName(false)];cwKey=prntRel.children[mapType.getName(false)].clockwise.getName(false);cwChild=prntRel.children[cwKey];map.setMapType(cwChild.node)}function anticlockwiseclick(e,parent,map,mapType){var prntRel,acwKey,acwChild;prntRel=_relationships[parent.getName(false)];acwKey=prntRel.children[mapType.getName(false)].antiClockwise.getName(false);acwChild=prntRel.children[acwKey];map.setMapType(acwChild.node)}function toggleparentbtn(parentBtn,parentMapType){parentBtn.style.display=isChildActive(this.getCurrentMapType(),parentMapType)?"none":"block"}function getParentRelationship(key){var parent;parent=_relationships[key];if(!parent){parent={children:{}};_relationships[key]=parent}return parent}function hideChildButton(mapType,parentBtn,childBtn){if(this.getCurrentMapType().equals(mapType)){parentBtn.style.display="none";childBtn.style.display="inline";styleInactiveButtons()}else{childBtn.style.display="none"}}function ontilelayersupdated(oldTileLayers,newTileLayers,btnLst,parentBtn){var prntRel=_relationships[parentBtn.mapType.getName(false)];var children=prntRel.children;var relMapType;var metaKeys;for(var c in children){if(children.hasOwnProperty(c)){relMapType=children[c].node;if(children.hasOwnProperty(c)){metaKeys=relMapType.getTileLayerMetaKeys();for(var i=0;i<metaKeys.length;i++){if(nml.ArrayHelper.indexOf(newTileLayers,metaKeys[i])>=0){if(isChildActive(this.getCurrentMapType(),parentBtn.mapType)){parentBtn.style.display="none"}btnLst.style.visibility="visible";return}}}}}if((_prevMapType||prntRel.fallback)&&isChildActive(this.getCurrentMapType(),parentBtn.mapType)){this.setMapType(_prevMapType||prntRel.fallback)}btnLst.style.visibility="hidden"}function isToggleOnState(mapType){var group;for(var p in _toggleRelationships){if(_toggleRelationships.hasOwnProperty(p)){group=_toggleRelationships[p];for(var i=0;i<group.length;i++){if(group[i].on===mapType){return true}}}}return false}function isToggleOffState(mapType){var group;for(var p in _toggleRelationships){if(_toggleRelationships.hasOwnProperty(p)){group=_toggleRelationships[p];for(var i=0;i<group.length;i++){if(group[i].off===mapType){return true}}}}}function isCurrentToggleOffState(currentMapType,mapType){var group;for(var p in _toggleRelationships){if(_toggleRelationships.hasOwnProperty(p)){group=_toggleRelationships[p];for(var i=0;i<group.length;i++){if(group[i].on===currentMapType&&group[i].off===mapType){return true}}}}return false}function isCurrentToggleOnState(currentMapType,mapType){var group;if(currentMapType===mapType){for(var p in _toggleRelationships){if(_toggleRelationships.hasOwnProperty(p)){group=_toggleRelationships[p];for(var i=0;i<group.length;i++){if(group[i].on===currentMapType){return true}}}}}return false}function getToggleOn(currentMapType,selectedMapType){var togglePair;var rel;var isToggleOn;var toggleOnMapType;for(var p in _toggleRelationships){if(_toggleRelationships.hasOwnProperty(p)){toggleOn=toggleOff=false;if(_toggleRelationships.hasOwnProperty(p)){rel=_toggleRelationships[p];for(var i=0;i<rel.length;i++){togglePair=rel[i];if(togglePair.on===currentMapType){isToggleOn=true}if(togglePair.off===selectedMapType){toggleOnMapType=togglePair.on}if(isToggleOn&&toggleOnMapType){return toggleOnMapType}}}}}return null}function getToggleOnFromRelationship(relationship,offstate){var togglePair;var rel;var isToggleOn;var toggleOnMapType;for(var i=0;i<relationship.length;i++){togglePair=relationship[i];if(togglePair.off===offstate){return togglePair.on}}return null}function isToggleOnRelationship(relationship,onstate){for(var i=0;i<relationship.length;i++){if(relationship[i].on===onstate){return true}}return false}function isParent(type){return Boolean(_relationships[type.getName(false)])}function isChild(type){for(var p in _relationships){if(_relationships[p].children[type.getName(false)]){return true}}return false}function isChildActive(currentMapType,parent){var prntRel=_relationships[parent.getName(false)];for(var c in prntRel.children){if(prntRel.children[c].node.equals(currentMapType)){return true}}return false}function createInactiveLink(map,mapType,first){var currentMapType=map.getCurrentMapType();var sprite=nmls.BUTTONS;var lnkSpc;var lnk=document.createElement("a");var lnkTxt=document.createTextNode(mapType.getName(true));nms.css(lnk,{color:currentMapType===mapType||isCurrentToggleOffState(currentMapType,mapType)?"#089853":"#00284d",cursor:"pointer",display:"inline","float":"left","font-size":"13px","font-family":"Arial, Helvetica, sans-serif","font-weight":"bold","line-height":"17px","margin-right":"6px","margin-top":"4px","vertical-align":"top"},true);nmev.addDomListener(lnk,"mouseover",nmev.callbackArgs(lnk,linkbtnmouseover,map));nmev.addDomListener(lnk,"mouseout",nmev.callbackArgs(lnk,linkbtnmouseout,map));nmev.addDomListener(lnk,"click",nmev.callbackArgs(lnk,onnormalbtnclick,map));nmev.addListener(map,"maptypechanged",nmev.callbackArgs(map,normalbtnmaptypechanged,lnk));if(!first){lnkSpc=document.createElement("span");nms.css(lnkSpc,{background:"url("+sprite.url+") -107px -84px no-repeat",display:"inline","float":"left","line-height":"13px",margin:"0px 5px 0px 0px",width:"2px",height:"19px"},true);lnk.appendChild(lnkSpc)}lnk.appendChild(lnkTxt);return lnk}function createInactiveParentLink(map,mapType){var lnk=document.createElement("a");var lnkTxt=document.createTextNode(mapType.getName(true));nms.css(lnk,{color:"#00284d",cursor:"pointer","font-family":"Arial, Helvetica, sans-serif","font-size":"13px","font-weight":"bold","line-height":"25px","margin-right":"5px","padding-left":"5px","text-align":"center","vertical-align":"middle",display:"block"},true);nmev.addDomListener(lnk,"mouseover",nmev.callback(lnk,parentbtnmouseover));nmev.addDomListener(lnk,"mouseout",nmev.callback(lnk,parentbtnmouseout));nmev.addDomListener(lnk,"click",nmev.callbackArgs(lnk,parentbtnclick,map));lnk.appendChild(lnkTxt);return lnk}function styleInactiveButtons(){var nrmlBtn;for(var n=0;n<_normalButtons.length;n++){_normalButtons[n].style.color="#00284d"}for(var t=0;t<_toggleButtons.length;t++){_toggleButtons[t].style.color="#00284d"}}function createToggleButton(map,groupName,toggleRelationship,first){var sprite=nmls.BUTTONS;var lnkSpc;var lnk=document.createElement("a");var lnkTxt=document.createTextNode(groupName);var currentMapType=map.getCurrentMapType();for(var i=0;i<toggleRelationship.length;i++){if(currentMapType===toggleRelationship[i].on){lnk.mapType=toggleRelationship[i].on}}nms.css(lnk,{color:isCurrentToggleOnState(currentMapType,lnk.mapType)?"#089853":"#00284d",cursor:"pointer",display:"inline","float":"left","font-family":"Arial, Helvetica, sans-serif","font-size":"13px","font-weight":"bold","line-height":"17px","margin-right":"0px","margin-top":"4px","vertical-align":"top"},true);nmev.addDomListener(lnk,"mouseover",nmev.callbackArgs(lnk,linkbtnmouseover,map));nmev.addDomListener(lnk,"mouseout",nmev.callbackArgs(lnk,linkbtnmouseout,map));nmev.addDomListener(lnk,"click",nmev.callbackArgs(lnk,ontogglebtnclick,map,toggleRelationship));nmev.addListener(map,"maptypechanged",nmev.callbackArgs(map,ontogglebtnmaptypechanged,lnk,toggleRelationship));if(!first){lnkSpc=document.createElement("span");nms.css(lnkSpc,{background:"url("+sprite.url+") -107px -84px no-repeat",display:"inline","float":"left","line-height":"13px",margin:"0px 5px 0px 0px",width:"2px",height:"19px"},true);lnk.appendChild(lnkSpc)}lnk.appendChild(lnkTxt);_toggleButtons.push(lnk);return lnk}function createNormalButton(map,mapType,first){var btn=createInactiveLink(map,mapType,first);btn.mapType=mapType;_normalButtons.push(btn);return btn}function createToggleButtons(map){var sprite=nmls.BUTTONS;var frag=document.createDocumentFragment();var cnt=document.createElement("div");var btnLst=document.createElement("div");var leftShoulder=document.createElement("span");var leftShoulderSprite=document.createElement("span");var groupName;nms.css(cnt,{display:"inline"},true);nms.css(btnLst,{background:"url("+sprite.url+") repeat-x",display:"inline","float":"left",height:"26px","padding-left":"5px"},true);nms.css(leftShoulder,{display:"inline-block","float":"left",position:"relative",height:"26px",width:"3px"},true);nms.css(leftShoulderSprite,{clip:"rect(28px 8px 54px 5px)",display:"inline-block",height:"54px",width:"8px",position:"absolute",left:"-5px",top:"-28px"},true);nms.applyPngAlphaBg(leftShoulderSprite,sprite.url);frag.appendChild(cnt);cnt.appendChild(leftShoulder);cnt.appendChild(btnLst);leftShoulder.appendChild(leftShoulderSprite);for(var i=0;i<_toggleRelationShipOrder.length;i++){groupName=_toggleRelationShipOrder[i];if(groupName in _toggleRelationships){btnLst.appendChild(createToggleButton(map,groupName,_toggleRelationships[groupName],i===0))}}return frag}function createNormalButtons(map){var mt;var sprite=nmls.BUTTONS;var frag=document.createDocumentFragment();var cnt=document.createElement("div");var leftShoulder=document.createElement("span");var leftShoulderSprite=document.createElement("span");var rightShoulder=document.createElement("span");var rightShoulderSprite=document.createElement("span");var btnLst=document.createElement("div");nms.css(cnt,{display:"inline"},true);nms.css(btnLst,{background:"url("+sprite.url+") repeat-x",display:"inline","float":"left",height:"26px","padding-left":"5px"},true);nms.css(leftShoulder,{display:"inline-block","float":"left",position:"relative",height:"26px",width:"3px"},true);nms.css(leftShoulderSprite,{clip:"rect(28px 8px 54px 5px)",display:"inline-block",height:"54px",width:"8px",position:"absolute",left:"-5px",top:"-28px"},true);nms.applyPngAlphaBg(leftShoulderSprite,sprite.url);nms.css(rightShoulder,{display:"inline-block","float":"left",position:"relative",height:"26px",width:"3px"},true);nms.css(rightShoulderSprite,{clip:"rect(28px 3px 54px 0px)",display:"inline-block",height:"54px",width:"8px",position:"absolute",left:"0px",top:"-28px"},true);nms.applyPngAlphaBg(rightShoulderSprite,sprite.url);frag.appendChild(cnt);cnt.appendChild(btnLst);cnt.appendChild(rightShoulder);leftShoulder.appendChild(leftShoulderSprite);rightShoulder.appendChild(rightShoulderSprite);for(var i=0;i<_normalMapTypes.length;i++){mt=_normalMapTypes[i];btnLst.appendChild(createNormalButton(map,mt,(_toggleOnMapTypes.length===0&&i===0)))}return frag}function createChildButton(parentBtn,parentMapType,map,mapType){var sprite=nmls.BUTTONS;var cnt=document.createElement("span");var clockwise=document.createElement("a");var clockwiseSprite=document.createElement("span");var antiClockwise=document.createElement("a");var antiClockwiseSprite=document.createElement("span");var nameCnt=document.createElement("strong");cnt.style.display=map.getCurrentMapType()===mapType?"inline":"none";nms.css(clockwise,{cursor:"pointer","float":"left",height:"26px",width:"38px",overflow:"hidden",position:"relative"},true);nms.css(clockwiseSprite,{clip:"rect(84px 38px 110px 0px)",height:"110px",width:"38px",position:"absolute",top:"-84px"},true);nms.applyPngAlphaBg(clockwiseSprite,sprite.url);nms.css(antiClockwise,{cursor:"pointer","float":"right",height:"26px",width:"38px",overflow:"hidden",position:"relative"},true);nms.css(antiClockwiseSprite,{clip:"rect(84px 78px 110px 40px)",height:"110px",width:"78px",position:"absolute",top:"-84px",left:"-40px"},true);nms.applyPngAlphaBg(antiClockwiseSprite,sprite.url);nms.css(nameCnt,{color:"#089853",display:"inline","float":"left","font-family":"Arial, Helvetica, sans-serif","font-weight":"bold","font-size":"13px","line-height":"25px","text-align":"center",width:"50px"},true);nmev.addDomListener(clockwise,"mouseover",nmev.callback(clockwise,clockwisemouseover));nmev.addDomListener(antiClockwise,"mouseover",nmev.callback(antiClockwise,anticlockwisemouseover));nmev.addDomListener(clockwise,"mouseout",nmev.callback(clockwise,clockwisemouseout));nmev.addDomListener(antiClockwise,"mouseout",nmev.callback(antiClockwise,anticlockwisemouseout));nmev.addDomListener(clockwise,"click",nmev.callbackArgs(clockwise,clockwiseclick,parentMapType,map,mapType));nmev.addDomListener(antiClockwise,"click",nmev.callbackArgs(antiClockwise,anticlockwiseclick,parentMapType,map,mapType));nmev.addListener(map,"maptypechanged",nmev.callbackArgs(map,hideChildButton,mapType,parentBtn,cnt));cnt.appendChild(clockwise);cnt.appendChild(nameCnt);cnt.appendChild(antiClockwise);clockwise.appendChild(clockwiseSprite);antiClockwise.appendChild(antiClockwiseSprite);nameCnt.appendChild(document.createTextNode(mapType.getName(true)));return cnt}function createParentButton(map,mapType){var sprite=nmls.BUTTONS;var prntLnk;var children=_relationships[mapType.getName(false)].children;var frag=document.createDocumentFragment();var cnt=document.createElement("div");var btnLst=document.createElement("div");var rightShoulder=document.createElement("span");var rightShoulderSprite=document.createElement("span");prntLnk=createInactiveParentLink(map,mapType);prntLnk.mapType=mapType;nms.css(cnt,{background:"url("+sprite.url+") 0px -56px repeat-x",cursor:"default",display:"inline","float":"left",position:"relative",left:"-3px",width:"130px"},true);nms.css(rightShoulder,{display:"inline","float":"left",position:"absolute",right:"0px",height:"26px",width:"3px"},true);nms.css(rightShoulderSprite,{clip:"rect(28px 3px 54px 0px)",display:"inline-block",height:"54px",width:"8px",position:"absolute",left:"0px",top:"-28px"},true);nms.applyPngAlphaBg(rightShoulderSprite,sprite.url);nms.css(btnLst,{display:"inline","float":"left",height:"26px",width:"130px","padding-left":"3px",visibility:"hidden"},true);nmev.addListener(map,"maptypechanged",nmev.callbackArgs(map,toggleparentbtn,prntLnk,mapType));nmev.addListener(map,"tilelayersupdated",nmev.callbackArgs(map,ontilelayersupdated,btnLst,prntLnk));frag.appendChild(cnt);cnt.appendChild(rightShoulder);cnt.appendChild(btnLst);rightShoulder.appendChild(rightShoulderSprite);btnLst.appendChild(prntLnk);for(var c in children){if(children.hasOwnProperty(c)){btnLst.appendChild(createChildButton(prntLnk,mapType,map,children[c].node))}}_parentButtons.push(prntLnk);return frag}function createParentButtons(map){var frag=document.createDocumentFragment();var mt;for(var i=0;i<_parentMapTypes.length;i++){mt=_parentMapTypes[i];frag.appendChild(createParentButton(map,mt))}return frag}this.getNode=function(){return _node};this.initialize=function(map){var frag=document.createDocumentFragment();var mapTypes=map.getMapTypes();var mt;_node=document.createElement("div");for(var i=0;i<mapTypes.length;i++){mt=mapTypes[i];if(isParent(mt)){_parentMapTypes.push(mt)}else{if(isToggleOnState(mt)){_toggleOnMapTypes.push(mt)}else{if(!isChild(mt)){_normalMapTypes.push(mt)}}}}nmev.addDomListener(_node,"click",nmev.stopBubbling);nmev.addDomListener(_node,"dblclick",nmev.stopBubbling);if(!this.selectable()){nmev.disableSelect(_node)}frag.appendChild(_node);_node.appendChild(createToggleButtons(map));_node.appendChild(createNormalButtons(map));_node.appendChild(createParentButtons(map));map.getContainer().appendChild(frag);return _node};this.useShortNames=Boolean(useShortNames);this.printable=function(){return true};this.selectable=function(){return false};this.clearRelationships=function(){_relationships={}};this.addFallback=function(parent,fallback){var prntRel=getParentRelationship(parent.getName(false));prntRel.fallback=fallback};this.addRelationship=function(parent,child,isFirstChild){var prntRel=getParentRelationship(parent.getName(false));prntRel.children[child.getName(false)]={node:child};if(!prntRel.firstChild||isFirstChild){prntRel.firstChild=child}};this.addRotateRelationship=function(node,clockwise,antiClockwise){var key=node.getName(false),childNode,childCnt=0;for(var p in _relationships){if(_relationships.hasOwnProperty(p)){childNode=_relationships[p].children[key];if(childNode){childNode.clockwise=clockwise;childNode.antiClockwise=antiClockwise;childCnt++}}}if(childCnt===0){throw new Error("You can only add a rotate relationship to MapTypes that are a child of a current relationship. Use already addRelationship() before calling addRotateRelationship()")}};this.removeRelationShip=function(type){var key=type.getName(false);delete _relationships[key];for(var p in _relationships){if(_relationships.hasOwnProperty(p)){delete _relationships[p].children[key];for(var rp in _relationships[p].children){if(_relationships[p].hasOwnProperty(rp)){if(_relationships[p].children[rp].clockwise.equals(type)){delete _relationships[p].children[rp].clockwise}if(_relationships[p].children[rp].antiClockwise.equals(type)){delete _relationships[p].children[rp].antiClockwise}}}}}};this.addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_NORTH_MAP);this.addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_EAST_MAP);this.addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_SOUTH_MAP);this.addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_WEST_MAP);this.addFallback(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.PHOTO_MAP);this.addRotateRelationship(nmm.MapType.MULTI_VIEW_NORTH_MAP,nmm.MapType.MULTI_VIEW_EAST_MAP,nmm.MapType.MULTI_VIEW_WEST_MAP);this.addRotateRelationship(nmm.MapType.MULTI_VIEW_EAST_MAP,nmm.MapType.MULTI_VIEW_SOUTH_MAP,nmm.MapType.MULTI_VIEW_NORTH_MAP);this.addRotateRelationship(nmm.MapType.MULTI_VIEW_SOUTH_MAP,nmm.MapType.MULTI_VIEW_WEST_MAP,nmm.MapType.MULTI_VIEW_EAST_MAP);this.addRotateRelationship(nmm.MapType.MULTI_VIEW_WEST_MAP,nmm.MapType.MULTI_VIEW_NORTH_MAP,nmm.MapType.MULTI_VIEW_SOUTH_MAP);_toggleRelationShipOrder.push("StreetMap");_toggleRelationships.StreetMap=[{on:nmm.MapType.HYBRID_MAP,off:nmm.MapType.PHOTO_MAP},{on:nmm.MapType.PHYSICAL_HYBRID_MAP,off:nmm.MapType.PHYSICAL_MAP}]}ToggleAndRotateMapTypeViewControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(10,10))};function MenuMapTypeControl(printable,selectable){var _node;function createMapTypeOption(mapType){var opt=document.createElement("option");opt.innerHTML=mapType.getName(true);opt.value=mapType.getName(false);return opt}function onselectchange(e){}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var mapTypes=map.getMapTypes();var frag=document.createDocumentFragment();_node=document.createElement("select");frag.appendChild(_node);for(var i=0;i<mapTypes.length;i++){_node.appendChild(createMapTypeOption(mapTypes[i]))}_node.onchange=onselectchange;map.getContainer().appendChild(_node);return _node};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(15,10))}}function ScaleControl(printable,selectable){function getResolution(map){var projection=map.getCurrentMapType().getProjection();if(projection instanceof nmm.MercatorProjection){return Math.abs(156543.04*Math.cos(map.getCenter().lat()*nml.PI/180))/Math.pow(2,map.getZoom())}else{return}}function getClosestBase(l){var baseunit;if(l/2000>=1){baseunit=2000}else{if(l/1000>=1){baseunit=1000}else{if(l/500>=1){baseunit=500}else{if(l/100>=1){baseunit=100}else{if(l/50>=1){baseunit=50}else{if(l/10>=1){baseunit=10}else{if(l/5>=1){baseunit=5}else{if(l/2>=1){baseunit=2}else{baseunit=1}}}}}}}}return Math.round(l/baseunit)*baseunit}function getImperialMeasurements(pxRes,unroundedWidth){var impPxRes=pxRes*nml.METER_TO_INCH;var unroundedLength=impPxRes*unroundedWidth;var scaleMeasurements={};var toFeet=unroundedLength/12;var toMile=toFeet/5280;if(toMile>=1){scaleMeasurements.unit="mi";scaleMeasurements.value=getClosestBase(toMile);scaleMeasurements.width=Math.ceil(scaleMeasurements.value/impPxRes*12*5280)}else{if(toFeet>=1){scaleMeasurements.unit="ft";scaleMeasurements.value=getClosestBase(toFeet);scaleMeasurements.width=Math.ceil(scaleMeasurements.value/impPxRes*12)}else{scaleMeasurements.unit="in";scaleMeasurements.value=getClosestBase(unroundedLength);scaleMeasurements.width=Math.ceil(scaleMeasurements.value/impPxRes)}}return scaleMeasurements}function getMetricMeasurements(pxRes,unroundedWidth){var unroundedLength=pxRes*unroundedWidth;var scaleMeasurements={};var toKm=unroundedLength/1000;var toCm=unroundedLength*100;if(toKm>=1){scaleMeasurements.unit="km";scaleMeasurements.value=getClosestBase(toKm);scaleMeasurements.width=Math.ceil(scaleMeasurements.value/pxRes*1000)}else{if(unroundedLength>=1){scaleMeasurements.unit="m";scaleMeasurements.value=getClosestBase(unroundedLength);scaleMeasurements.width=Math.ceil(scaleMeasurements.value/pxRes)}else{scaleMeasurements.unit="cm";scaleMeasurements.value=getClosestBase(toCm);scaleMeasurements.width=Math.ceil(scaleMeasurements.value/pxRes/100)}}return scaleMeasurements}function setResolution(){var metricUnit=arguments[arguments.length-1];var imperialUnit=arguments[arguments.length-2];var metricEnd=arguments[arguments.length-3];var imperialEnd=arguments[arguments.length-4];var run=arguments[arguments.length-5];var pxRes=getResolution(this);var metricRes;var imperialRes;var unroundedWidth=100;var endOffset=-78;var runWidth;metricRes=getMetricMeasurements(pxRes,unroundedWidth);imperialRes=getImperialMeasurements(pxRes,unroundedWidth);runWidth=(metricRes.width>imperialRes.width?metricRes.width:imperialRes.width);metricUnit.innerHTML=metricRes.value+" "+metricRes.unit;imperialUnit.innerHTML=imperialRes.value+" "+imperialRes.unit;nms.css(run,{clip:"rect(89px "+runWidth+"px 93px 0px)",width:runWidth+"px"});metricEnd.style.left=(endOffset+metricRes.width)+"px";imperialEnd.style.left=(endOffset+imperialRes.width)+"px"}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var sprite=nmls.TIMELINE;var frag=document.createDocumentFragment();var node=document.createElement("div");var measure=document.createElement("div");var start=document.createElement("div");var run=document.createElement("div");var metricEnd=document.createElement("div");var imperialEnd=document.createElement("div");var metricUnit=document.createElement("span");var imperialUnit=document.createElement("span");nms.css(node,{cursor:"default",height:"30px",overflow:"hidden","vertical-align":"top"},true);nms.css(measure,{height:"30px",width:"150px",position:"relative"},true);nms.css(start,{clip:"rect(0px 74px 30px 70px)",height:"30px",width:"74px",position:"absolute",top:"0px",left:"-70px"},true);nms.applyPngAlphaBg(start,sprite.url);nms.css(run,{height:"93px",position:"absolute",left:"3px",top:"-75px"},true);nms.applyPngAlphaBg(run,sprite.url);nms.css(metricEnd,{clip:"rect(0px 81px 15px 77px)",height:"15px",width:"81px",position:"absolute",top:"0px"},true);nms.applyPngAlphaBg(metricEnd,sprite.url);nms.css(imperialEnd,{clip:"rect(0px 81px 15px 77px)",height:"15px",width:"81px",position:"absolute",top:"15px"},true);nms.applyPngAlphaBg(imperialEnd,sprite.url);nms.css(metricUnit,{color:"#fff","font-size":".85em","line-height":"1em",position:"absolute",top:"0px",left:"15px"},true);nms.css(imperialUnit,{color:"#fff","font-size":".85em","line-height":"1em",position:"absolute",bottom:"0px",left:"15px"},true);setResolution.apply(map,[run,imperialEnd,metricEnd,imperialUnit,metricUnit]);nmev.addListener(map,"moveend",nmev.callbackArgs(map,setResolution,run,imperialEnd,metricEnd,imperialUnit,metricUnit));nmev.addListener(map,"setcenter",nmev.callbackArgs(map,setResolution,run,imperialEnd,metricEnd,imperialUnit,metricUnit));if(!this.selectable()){nmev.disableSelect(node)}frag.appendChild(node);measure.appendChild(start);measure.appendChild(metricEnd);measure.appendChild(imperialEnd);measure.appendChild(run);node.appendChild(measure);node.appendChild(metricUnit);node.appendChild(imperialUnit);map.getContainer().appendChild(frag);return node};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,30))}}function ShadowControl(printable,selectable){this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var sprite=nmls.SHADOW;var node=document.createElement("div");nms.css(node,{height:sprite.size.getHeightString(),width:sprite.size.getWidthString(),overflow:"hidden","vertical-align":"top"},true);nms.applyPngAlphaBg(node,sprite.url);map.getContainer().appendChild(node);return node};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(0,0))}}function LargeZoomControl(printable,selectable){this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var chain=document.createElement("div"),zoomIn=new ZoomInControl(this.printable(),this.selectable()),zoomOut=new ZoomOutControl(this.printable(),this.selectable()),slider=new SliderControl(this.printable(),this.selectable());nms.css(chain,{display:"inline-block",width:"25px"});chain.appendChild(zoomIn.initialize(map));chain.appendChild(slider.initialize(map));chain.appendChild(zoomOut.initialize(map));map.getContainer().appendChild(chain);return chain};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))}}var TimelineControlOptions={controlLeft:null,controlRight:null,minWidth:0};function TimelineControl(printable,selectable,container,opts){var _that=this;var _sprite=nmls.TIMELINE;var _wheelVelocity=0;var _listeners={};var _timers={};var _surveyDates=[];var _animations={};var _node;var _btnCnt;var _activeDate;var _dateList;var _horizOffset;var _leftCtrlNode;var _rightCtrlNode;var _lineDmnsn;var _baseLayers;var _glow;function ondatebuttonover(btn,map){return function(e){var tileDate=map.getTileDate();var showingDate=map.getShowingDate();var btnTime=btn.surveyDate.getTime();if((tileDate&&btnTime===tileDate.getTime())||(showingDate&&btnTime===showingDate.getTime())){return}styleInactiveDateHover(btn,btn.firstChild)}}function ondatebuttonout(btn,map){return function(e){var tileDate=map.getTileDate();var showingDate=map.getShowingDate();var btnTime=btn.surveyDate.getTime();if((tileDate&&btnTime===tileDate.getTime())||(showingDate&&btnTime===showingDate.getTime())){return}styleInactiveDate(btn,btn.firstChild)}}function ondatebuttonclick(btn,map){return function(e){var oldDate=map.getTileDate();if(oldDate!==btn.surveyDate){map.setTileDate(btn.surveyDate)}}}function oncleardateclick(e,map){map.setTileDate(null)}function ondatelistmousewheel(e,map){var target;var node;e=e||window.event;target=nmev.getTarget(e);node=target.nodeName.toLowerCase();if(!this.focused&&node==="select"){wheelTimeline(nmev.normalizeWheelDelta(e),map);nmev.stopBubbling(e)}else{if(nmc.browser.msie||node==="option"){nmev.stopBubbling(e)}}}function ondatelistfocus(e){this.focused=true}function ondatelistblur(e){this.focused=false}function ondatelistkeyup(e,map){var selVal;if(!nmc.browser.msie){e=e||window.event;if(e.keyCode<37||e.keyCode>40){return}selVal=this.options[this.selectedIndex].value;map.setTileDate(selVal?nml.DateHelper.fromNearmapDateUTC(selVal):null);nmev.stopBubbling(e)}}function ondatelistkeydown(e,map){e=e||window.event;if(e.keyCode>=37&&e.keyCode<=40){nmev.stopBubbling(e)}}function ondatelistchange(e,map){map.setTileDate(this.value?nml.DateHelper.fromNearmapDateUTC(this.value):null)}function ontimelinewheel(e,map){e=e||window.event;wheelTimeline(nmev.normalizeWheelDelta(e),map);nmev.stopBubbling(e)}function onbuttontiledatechanged(oldDate,newDate,btn,btnSprite){var surveyMs=btn.surveyDate.getTime();var showingDate=this.getShowingDate();if(newDate&&surveyMs===newDate.getTime()){styleActiveDate(btn,btnSprite)}else{if(showingDate&&showingDate.getTime()===surveyMs){styleShowingDate(btn,btnSprite)}else{styleInactiveDate(btn,btnSprite)}}}function onbuttonshowingdatechanged(oldShowingDate,newShowingDate,btn){}function ondatelisttiledatechanged(oldDate,newDate,dateList){var newDateMs,len;if(newDate){newDateMs=newDate.getTime();len=dateList.length;for(var i=1;i<len;i++){if(nml.DateHelper.fromNearmapDateUTC(dateList[i].value).getTime()===newDateMs){dateList.selectedIndex=i;return}}}else{dateList.selectedIndex=0}}function getSurveyDatePosition(d,surveyDates){var ms;if(!d){return -1}ms=d.getTime();for(var i=0;i<surveyDates.length;i++){if(surveyDates[i].getTime()===ms){return i}}return -1}function getButtonOffset(dateRangeMin,surveyDate,dayPx,arrayPos,btnHalfMargin,btnFullMargin,timelinePadding){return(Math.floor(dayPx*getDaysBetween(dateRangeMin,surveyDate))+(btnHalfMargin+(arrayPos*btnFullMargin))+timelinePadding)+"px"}function setSurveyDate(timeDirection,map){var viewedDate=map.getTileDate();var newDateInd=null;var len=_surveyDates.length;var newDate;if(!viewedDate&&timeDirection<0){newDateInd=len-1+timeDirection}else{if(viewedDate){newDateInd=getViewedDatePos(viewedDate,_surveyDates)+timeDirection}}if(newDateInd===null||newDateInd>=len){newDate=null}else{if(newDateInd<0){newDate=_surveyDates[0]}else{newDate=_surveyDates[newDateInd]}}map.setTileDate(newDate)}function calculateHorizontalOffsets(){var cntWidth=container.offsetWidth;var cntOffset=container.offsetLeft;var defaultOffset=5;_horizOffset.right=_rightCtrlNode?cntWidth-cntOffset-_rightCtrlNode.offsetLeft:defaultOffset;_horizOffset.left=_leftCtrlNode?_leftCtrlNode.offsetLeft+_leftCtrlNode.offsetWidth-cntOffset:defaultOffset}function getWidthAvailable(){return container.offsetWidth-_horizOffset.left-_horizOffset.right}function clearContainer(){var childNode=_node.lastChild;while(childNode){prevChildNode=childNode.previousSibling;nmev.clearNode(childNode);nme.discardElement(childNode,container);childNode=prevChildNode}}function removeDateContainer(btnCnt){var dateBtn;if(btnCnt){dateBtn=btnCnt.firstChild;while(dateBtn){dateBtn.onmouseover=null;dateBtn.onmouseout=null;dateBtn.onclick=null;nmev.removeListener(dateBtn.ontiledatechanged);nmev.removeListener(dateBtn.onshowingdatechanged);dateBtn.ontiledatechanged=null;dateBtn.onshowingdatechanged=null;dateBtn=dateBtn.nextSibling}removeDateOptions(_dateList);nme.discardElement(btnCnt,container)}}function getViewedDatePos(viewedDate,surveyDates){var vwdDateInd=-1;var i=0;var len=surveyDates.length;while(i<len&&vwdDateInd===-1){if(surveyDates[i].getTime()-viewedDate.getTime()===0){vwdDateInd=i}i++}return vwdDateInd}function styleNewActiveDate(oldDate,newDate){var next=_btnCnt.firstChild,btnTime;while(next){btnTime=next.surveyDate.getTime();if(newDate&&btnTime-newDate.getTime()===0){styleActiveDate(next,next.firstChild)}else{styleInactiveDate(next,next.firstChild)}next=next.nextSibling}}function styleInactiveDateHover(btn,btnSprite){var size=new nmm.Size(15,13);nms.css(btn,{height:size.getHeightString(),width:size.getWidthString(),marginLeft:-Math.floor(size.width/2)+"px",marginTop:-Math.floor(size.height/2)+"px"});nms.css(btnSprite,{clip:"rect(0px, 49px, 13px, 34px)",top:"0px",left:"-34px"})}function styleInactiveDate(btn,btnSprite){var size=new nmm.Size(15,13);nms.css(btn,{height:size.getHeightString(),width:size.getWidthString(),marginLeft:-Math.floor(size.width/2)+"px",marginTop:-Math.floor(size.height/2)+"px"});nms.css(btnSprite,{clip:"rect(0px, 29px, 13px, 14px)",height:_sprite.size.getHeightString(),width:"49px",position:"absolute",top:"0px",left:"-14px"});nms.applyPngAlphaBg(btnSprite,_sprite.url)}function styleActiveDate(btn,btnSprite){var size=new nmm.Size(15,26);nms.css(btn,{height:size.getHeightString(),width:size.getWidthString(),marginLeft:-Math.floor(size.width/2)+"px",marginTop:-Math.floor(size.height/2)+"px"});nms.css(btnSprite,{clip:"rect(14px, 49px, 40px, 34px)",height:_sprite.size.getHeightString(),width:"49px",position:"absolute",top:"-14px",left:"-34px"});nms.applyPngAlphaBg(btnSprite,_sprite.url)}function styleShowingDate(btn,btnSprite){var size=new nmm.Size(15,26);nms.css(btn,{height:size.getHeightString(),width:size.getWidthString(),marginLeft:-Math.floor(size.width/2)+"px",marginTop:-Math.floor(size.height/2)+"px"});nms.css(btnSprite,{clip:"rect(0px, 141px, 26px, 126px)",height:_sprite.size.getHeightString(),width:"141px",position:"absolute",top:"0px",left:"-126px"});nms.applyPngAlphaBg(btnSprite,_sprite.url)}function createDateButton(yearCnt,surveyDate,viewedDate,showingDate,map){var dateBtn=document.createElement("a");var dateBtnSprite=document.createElement("span");var nearmapDate=nml.DateHelper.smallDateUTC(surveyDate);dateBtn.surveyDate=surveyDate;dateBtnSprite.className="canceltooltip";nms.css(dateBtn,{cursor:"pointer",overflow:"hidden",position:"absolute",top:"7px"});yearCnt.appendChild(dateBtn);dateBtn.appendChild(dateBtnSprite);if(viewedDate&&surveyDate.getTime()-viewedDate.getTime()===0){dateBtn.title="Show up to and including "+nearmapDate;styleActiveDate(dateBtn,dateBtnSprite)}else{if(showingDate&&showingDate.getTime()===surveyDate.getTime()){dateBtn.title="Showing "+nearmapDate;styleShowingDate(dateBtn,dateBtnSprite)}else{dateBtn.title=nearmapDate;styleInactiveDate(dateBtn,dateBtnSprite)}}dateBtn.onmouseover=ondatebuttonover(dateBtn,map);dateBtn.onmouseout=ondatebuttonout(dateBtn,map);dateBtn.onclick=ondatebuttonclick(dateBtn,map);dateBtn.ontiledatechanged=nmev.addListener(map,"tiledatechanged",nmev.callbackArgs(map,onbuttontiledatechanged,dateBtn,dateBtnSprite));dateBtn.onshowingdatechanged=nmev.addListener(map,"showingdatechanged",nmev.callbackArgs(map,onbuttonshowingdatechanged,dateBtn));return dateBtn}function selectOptionDate(dateList,toSelectDate){var nmDate;if(!toSelectDate){dateList.selectedIndex=0;return}nmDate=nml.DateHelper.toNearmapDateUTC(toSelectDate);for(var i=1;i<dateList.length;i++){if(dateList[i].value===nmDate){dateList.selectedIndex=i;return}}}function removeDateOptions(dateList){var latest=dateList.options[0];var latestTxt="Latest";if(latest){latest.text=latestTxt}for(var i=dateList.length-1;i>0;i--){nme.discardElement(dateList.options[i],container)}}function addDateListOption(dateList,surveyDate){var option=document.createElement("option");option.text=nml.DateHelper.smallDateUTC(surveyDate);option.value=nml.DateHelper.toNearmapDateUTC(surveyDate);dateList.options.add(option,1)}function getDaysBetween(min,max){return Math.ceil((max.getTime()-min.getTime())/nml.MS_IN_DAY)}function getDateRange(yearRange){return{min:new Date(yearRange.min,0,1),max:new Date(yearRange.max,11,31)}}function getYearRange(viewedDate,surveyDates){var vwdMs=viewedDate?viewedDate.getTime():null;var minSurvey=surveyDates[0];var maxSurvey=surveyDates[surveyDates.length-1];return{min:viewedDate&&minSurvey&&vwdMs-minSurvey.getTime()<0?viewedDate.getUTCFullYear():(minSurvey?minSurvey.getUTCFullYear():null),max:viewedDate&&maxSurvey&&vwdMs-maxSurvey.getTime()>0?viewedDate.getUTCFullYear():(maxSurvey?maxSurvey.getUTCFullYear():null)}}function renderLarge(dateList,viewedDate,map){var frag=document.createDocumentFragment();var btnCnt=document.createElement("div");var btnHalfMargin=2;var btnFullMargin=btnHalfMargin*2;var yearRange=getYearRange(viewedDate,_surveyDates);var dateRange=getDateRange(yearRange);var daysBetween=getDaysBetween(dateRange.min,dateRange.max);var optLatest=dateList.options[0];var timelinePadding=10;var buttonAvailableWidth=_lineDmnsn.width-(timelinePadding*2);var showingDate=map.getShowingDate();var dateBtn;var len;var surveyDate;var latestDate;var dayPx;nms.css(btnCnt,{display:"inline-block",height:"15px",width:_lineDmnsn.width+"px",position:"absolute",left:_lineDmnsn.left+"px",top:"8px",zIndex:"1"});len=_surveyDates.length;latestDate=len>0?_surveyDates[len-1]:null;dayPx=(buttonAvailableWidth-(len*btnFullMargin))/daysBetween;if(optLatest){optLatest.text="Latest"+(latestDate?" ("+nml.DateHelper.smallDateUTC(latestDate)+")":"")}frag.appendChild(btnCnt);for(var i=0;i<len;i++){surveyDate=_surveyDates[i];addDateListOption(dateList,surveyDate);dateBtn=createDateButton(btnCnt,surveyDate,viewedDate,showingDate,map);dateBtn.style.left=getButtonOffset(dateRange.min,surveyDate,dayPx,i,btnHalfMargin,btnFullMargin,timelinePadding)}selectOptionDate(dateList,viewedDate);return frag}function renderSmall(dateList,viewedDate){var frag=document.createDocumentFragment();var dateBtn;var len;var latestDate;var optLatest=dateList.options[0];len=_surveyDates.length;latestDate=len>0?_surveyDates[len-1]:null;if(optLatest){optLatest.text="Latest"+(latestDate?" ("+nml.DateHelper.smallDateUTC(latestDate)+")":"")}for(var i=0;i<len;i++){addDateListOption(dateList,_surveyDates[i])}selectOptionDate(dateList,viewedDate);frag.appendChild(document.createElement("div"));return frag}function onmaptypetiledatesupdated(oldDates,newDates,showButtons){var viewedDate=this.getTileDate();var vwdPos;var frag;vwdPos=getSurveyDatePosition(viewedDate,newDates);_surveyDates=(vwdPos===-1&&viewedDate?nml.DateHelper.insertUniqueAsc(newDates,viewedDate):newDates.slice(0,newDates.length));removeDateContainer(_btnCnt);if(showButtons){frag=renderLarge(_dateList,viewedDate,this)}else{frag=renderSmall(_dateList,viewedDate)}_btnCnt=frag.firstChild;_node.appendChild(frag)}function wheelTimeline(direction,map){if(_timers.timelinewheel){window.clearTimeout(_timers.timelinewheel);delete _timers.timelinewheel}setSurveyDate(direction,map)}function createBackground(ctrlWidth){var shoulderSize=new nmm.Size(5,39);var bgCnt=document.createElement("div");var bgLeft=document.createElement("span");var bgMiddle=document.createElement("span");var bgRight=document.createElement("span");var bgSize=new nmm.Size(ctrlWidth,shoulderSize.height);var middleBgSize=new nmm.Size(bgSize.width-(shoulderSize.width*2),shoulderSize.height);nms.css(_node,{cursor:"default",width:(ctrlWidth)+"px","z-index":"1"},true);nms.css(bgCnt,{height:shoulderSize.getHeightString(),overflow:"hidden",position:"relative"});nms.css(bgLeft,{clip:"rect(0px, "+shoulderSize.getWidthString()+", 39px, 0px)",display:"inline-block",fontSize:"0px",position:"absolute",left:"0px",height:shoulderSize.getHeightString(),width:_sprite.size.getWidthString()});nms.applyPngAlphaBg(bgLeft,_sprite.url);nms.css(bgMiddle,{clip:"rect(41px, "+middleBgSize.width+"px, 80px, 0px)",display:"inline-block","font-size":"0px",position:"absolute",left:shoulderSize.getWidthString(),top:"-41px",height:_sprite.size.getHeightString(),width:middleBgSize.getWidthString()},true);nms.applyPngAlphaBg(bgMiddle,_sprite.url,true);nms.css(bgRight,{clip:"rect(0px, 11px, 39px, 6px)",display:"inline-block",fontSize:"0px",position:"absolute",left:(bgSize.width-shoulderSize.width-6)+"px",height:shoulderSize.getHeightString(),width:_sprite.size.getWidthString()});nms.applyPngAlphaBg(bgRight,_sprite.url);_node.appendChild(bgCnt);bgCnt.appendChild(bgLeft);bgCnt.appendChild(bgMiddle);bgCnt.appendChild(bgRight);return bgCnt}function createDateList(bgCnt,dateListWidth,map,centerList){var latest=document.createElement("option");_dateList=document.createElement("select");_dateList.className="canceltooltip";latest.text="Latest";latest.value="";if(centerList){bgCnt.style.textAlign="center";nms.css(_dateList,{position:"relative",margin:"5px 0px 0px 0px","z-index":"10"},true)}else{nms.css(_dateList,{position:"relative",margin:"5px 0px 0px 4px",width:dateListWidth+"px","z-index":"10"},true)}_dateList.options.add(latest);nmev.addDomListener(_dateList,"keyup",nmev.callbackArgs(_dateList,ondatelistkeyup,map));nmev.addDomListener(_dateList,"keydown",nmev.callbackArgs(_dateList,ondatelistkeydown,map));nmev.addDomListener(_dateList,"blur",nmev.callback(_dateList,ondatelistblur));nmev.addDomListener(_dateList,"focus",nmev.callback(_dateList,ondatelistfocus));nmev.addDomListener(_dateList,"mousewheel",nmev.callbackArgs(_dateList,ondatelistmousewheel,map));nmev.addDomListener(_dateList,"change",nmev.callbackArgs(_dateList,ondatelistchange,map));nmev.addListener(map,"tiledatechanged",nmev.callbackArgs(map,ondatelisttiledatechanged,_dateList));bgCnt.appendChild(_dateList)}function createContiuum(bgCnt,ctrlWidth,dateListWidth,map){var clearSize=new nmm.Size(9,9);var horizMargin=4;var line=document.createElement("span");var clearDate=document.createElement("a");_lineDmnsn={width:ctrlWidth-((clearSize.width+horizMargin)+(dateListWidth+horizMargin)),left:(horizMargin+dateListWidth)};clearDate.title="View latest";clearDate.className="canceltooltip";nms.css(line,{clip:"rect(82px, "+_lineDmnsn.width+"px, 87px, 0px)",display:"inline-block",height:_sprite.size.getHeightString(),width:_lineDmnsn.width+"px",position:"absolute",left:_lineDmnsn.left+"px",top:"-70px"});nms.applyPngAlphaBg(line,_sprite.url,true);nms.css(clearDate,{clip:"rect(14px, 64px, 23px, 55px)",cursor:"pointer",display:"inline-block",height:_sprite.size.getHeightString(),width:"64px",position:"absolute",left:(_lineDmnsn.width+_lineDmnsn.left-55)+"px",top:"-4px"});nms.applyPngAlphaBg(clearDate,_sprite.url);nmev.addDomListener(clearDate,"click",nmev.callbackArgs(clearDate,oncleardateclick,map));bgCnt.appendChild(line);bgCnt.appendChild(clearDate)}function renderContainer(map,widthAvail){var marginRight=15;var dateListWidth=165;var ctrlWidth=widthAvail-marginRight;var bgCnt;var showButtons=false;if(_listeners.maptypetiledatesupdated){nmev.removeListener(_listeners.maptypetiledatesupdated)}clearContainer();bgCnt=createBackground(ctrlWidth);if(widthAvail>=opts.minWidth){showButtons=true;createContiuum(bgCnt,ctrlWidth,dateListWidth,map)}createDateList(bgCnt,dateListWidth,map,!showButtons);_node.style.display="block";_listeners.maptypetiledatesupdated=nmev.addListener(map,"maptypetiledatesupdated",nmev.callbackArgs(map,onmaptypetiledatesupdated,showButtons));onmaptypetiledatesupdated.apply(map,[null,map.getAvailableMapTypeTileDates(),showButtons]);return showButtons}function reInitializeControl(map){var bottom=_node.style.bottom;var top=bottom?null:(_node.style.top||"0px");var right=_node.style.right;var left=right?null:(_node.style.left||"0px");var showButtons;showButtons=renderContainer(map,getWidthAvailable());_node.style.position="absolute";if(bottom){_node.style.bottom=bottom}else{_node.style.top=top}if(right){_node.style.right=right}else{_node.style.left=left}onmaptypetiledatesupdated.apply(map,[null,map.getAvailableMapTypeTileDates(),showButtons])}function registerMapEvents(map){nmev.addDomListener(_node,"mousewheel",nmev.callbackArgs(_node,ontimelinewheel,map));nmev.addDomListener(_node,"mousedown",nmev.stopBubbling);nmev.addDomListener(_node,"mouseup",function(e){e=e||window.event;if(nmev.getMouseButton(e)===nmev.MouseButton.RIGHT_BUTTON){nmev.stopBubbling(e)}});nmev.addDomListener(_node,"dblclick",nmev.stopBubbling);nmev.addDomListener(_node,"click",nmev.stopBubbling);nmev.addListener(map,"resizestart",nmev.callbackArgs(map,reInitializeControl,map));nmev.addListener(map,"maptypechanged",function(){_baseLayers=map.getCurrentMapType().getTileLayers()})}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.getNode=function(){return _node};this.getHorizontalOffset=function(){return _horizOffset};this.getSurveyDates=function(){return _surveyDates};this.initialize=function(map){var frag=document.createDocumentFragment();var widthAvail;var childNode;var prevChildNode;var tooltip;_node=document.createElement("div");_baseLayers=map.getCurrentMapType().getTileLayers();calculateHorizontalOffsets();frag.appendChild(_node);renderContainer(map,getWidthAvailable());registerMapEvents(map);tooltip=new nmd.Tooltip("Click dots to select dates and use scroll wheel to change dates",_node,map.getContainer(),{maxWidth:"210px"});if(!this.selectable()){nmev.disableSelect(_node)}map.getContainer().appendChild(frag);return _node};opts=nmo.Synchronize.fill(opts,TimelineControlOptions);_leftCtrlNode=opts.controlLeft&&opts.controlLeft.getNode?opts.controlLeft.getNode():null;_rightCtrlNode=opts.controlRight&&opts.controlRight.getNode?opts.controlRight.getNode():null;_horizOffset={left:0,right:0}}TimelineControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))};function LatestImageryControl(printable,selectable){var _node;function findClosestImageDate(surveyDates,selectedDate){var sDate;var selMs;if(surveyDates.length===0){return null}if(selectedDate===null){return surveyDates[surveyDates.length-1]}selMs=selectedDate.getTime();for(var i=surveyDates.length-1;i>=0;i--){sDate=surveyDates[i];if(selMs-sDate.getTime()>=0){return sDate}}}function setLatestDateLabel(surveyDates,selectedDate,label){var imgDate=findClosestImageDate(surveyDates,selectedDate);if(!imgDate){label.nodeValue="unavailable"}else{label.nodeValue=nml.DateHelper.smallDateUTC(imgDate)}}function onmaptypetiledatesupdated(oldDates,newDates,latestDateTxt){setLatestDateLabel(newDates,this.getTileDate(),latestDateTxt)}function ontiledatechanged(oldDate,newDate,latestDateTxt){setLatestDateLabel(this.getAvailableMapTypeTileDates(),newDate,latestDateTxt)}this.printable=function(){return printable};this.selectable=function(){return selectable};this.getNode=function(){return _node};this.initialize=function(map){var frag=document.createDocumentFragment();var latest=document.createTextNode("Showing ");var latestDateTxt=document.createTextNode(" (searching...)");_node=document.createElement("div");nms.css(_node,{cursor:"default",color:"#fff","font-size":"12px"},true);nmev.addListener(map,"maptypetiledatesupdated",nmev.callbackArgs(map,onmaptypetiledatesupdated,latestDateTxt));nmev.addListener(map,"tiledatechanged",nmev.callbackArgs(map,ontiledatechanged,latestDateTxt));if(!this.selectable()){nmev.disableSelect(_node)}frag.appendChild(_node);_node.appendChild(latest);_node.appendChild(latestDateTxt);map.getContainer().appendChild(frag);return _node}}LatestImageryControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(0,0))};function ReturnToRegularSiteControl(printable,selectable){var _node;this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){_node=document.createElement("a");_node.appendChild(document.createTextNode("Return to regular site"));_node.title="Return to the regular sized map";_node.href=nmm.HOST_URL+"?"+nmm.OUTPUT_KEY+"=normal";nms.css(_node,{color:"#fff","border-bottom":"dotted 1px #fff","font-size":"12px","text-decoration":"none"},true);_node.onmouseover=function(){_node.style.borderBottom="solid 1px #fff"};_node.onmouseout=function(){_node.style.borderBottom="dotted 1px #fff"};map.getContainer().appendChild(_node);return _node};this.getNode=function(){return _node}}ReturnToRegularSiteControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,20))};function GeoLocationControl(printable,selectable){var _node;function onbuttonclick(e){}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(){_node=document.createElement("div");nmev.addDomListener(_node,"click",onbuttonclick);return _node}}function IPhoneNavControl(printable,selectable){var _node;var _sprite=nmm.sprites.zoom;function createBackground(){var frag=document.createDocumentFragment();var borderTop=document.createElement("div");var middle=document.createElement("div");var borderBottom=document.createElement("div");nms.css(borderTop,{clip:"rect(50px 27px 56px 0px)",height:"56px",width:"27px",position:"absolute",top:"-50px",left:"0px"},true);nms.applyPngAlphaBg(borderTop,_sprite.url);nms.css(middle,{clip:"rect(0px 57px 67px 30px)",height:"67px",width:_sprite.size.getWidthString(),position:"absolute",top:"6px",left:"-30px"},true);nms.applyPngAlphaBg(middle,_sprite.url,true);nms.css(borderBottom,{clip:"rect(61px 27px 67px 0px)",height:"67px",width:"27px",position:"absolute",top:"12px",left:"0px"},true);nms.applyPngAlphaBg(borderBottom,_sprite.url);frag.appendChild(borderTop);frag.appendChild(middle);frag.appendChild(borderBottom);return frag}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var frag=document.createDocumentFragment();var reset=new ResetControl(printable,selectable);var geo=new GeoLocationControl(printable,selectable);var resetNode=reset.initialize(map);_node=document.createElement("div");nms.css(_node,{height:"80px",width:"30px"},true);nms.css(resetNode,{position:"absolute",top:"53px",left:"4px"});nmev.addDomListener(_node,"dblclick",nmev.stopBubbling);nmev.addDomListener(_node,"mousedown",nmev.stopBubbling);nmev.addDomListener(_node,"mouseup",nmev.stopBubbling);frag.appendChild(_node);_node.appendChild(createBackground());_node.appendChild(resetNode);map.getContainer().appendChild(frag);return _node};this.getNode=function(){return _node}}IPhoneNavControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(15,50))};function DynamicLayersControl(printable,selectable){var _node;var _map;var _handlers=[];var _layerManagers={};var _icon;var _minZoom=0;var _maxZoom=24;var _mapDragging=false;function ondragstart(){_mapDragging=true}function ondragend(){_mapDragging=false}function onmenuover(e){if(!_mapDragging){this.lastChild.style.visibility="visible"}}function onmenuout(e){this.lastChild.style.visibility="hidden"}function oncheckboxclick(e){var manager;if(this.checked){manager=new nmov.MarkerManager(_map,{borderPadding:200});_layerManagers[this.value]=manager;addLayer(this.value,manager)}else{_layerManagers[this.value].clearMarkers();delete _layerManagers[this.value]}}function saveHistory(title,latlng,zoom,mapType,tileDate){var newState;var oldState;var oldTileDate=_map.getTileDate();var oldNmDate=(oldTileDate?nml.DateHelper.toNearmapDateUTC(oldTileDate):null);var newNmDate=(tileDate?nml.DateHelper.toNearmapDateUTC(tileDate):null);oldState=nmo.Synchronize.fill({title:document.title,latlng:_map.getCenter().toString(),zoom:_map.getZoom(),mapType:nmm.MapType.Keys[_map.getCurrentMapType().getName(false)],tileDate:oldNmDate},nmlh.MapHistoryState);newState=nmo.Synchronize.fill({title:title,latlng:latlng.toString(),zoom:zoom,mapType:nmm.MapType.Keys[mapType.getName(false)],tileDate:newNmDate},nmlh.MapHistoryState);nmlh.save(newState,title,oldState)}function ongotolinkclick(e){var ll;var zoom;var mapType;var tileDate;var mapHttp;e=e||window.event;mapHttp=new nmh.MapHttpRequest(this.href);ll=mapHttp.getLatLng();zoom=mapHttp.getZoom();mapType=mapHttp.getMapType();tileDate=mapHttp.getTileDate();if(!ll){ll=_map.getCenter()}if(!zoom){zoom=_map.getZoom()}if(!mapType){mapType=_map.getCurrentMapType()}if(!tileDate){tileDate=_map.getTileDate()}saveHistory(this.title,ll,zoom,mapType,tileDate);_map.setCenter(ll,zoom,mapType,tileDate,true,true);return nmev.preventDefault(e)}function onmarkerclick(latlng,locationUrl,forumUrl,title,infoOpts){var node=document.createElement("div");var head=document.createElement("h3");var linkList=document.createElement("ul");var goToItem=document.createElement("li");var forumItem=document.createElement("li");var goToLink=document.createElement("a");var forumLink=document.createElement("a");var spacer=document.createElement("span");goToLink.href=locationUrl;forumLink.href=forumUrl;nms.css(head,{"font-size":"1.15em",padding:"5px 25px 5px 15px"},true);nms.css(linkList,{background:"#f0f0f0","border-top":"solid 1px #e4e4e4",color:"#004687","font-size":".9em",padding:"5px 10px",position:"relative","list-style":"none"},true);nms.css(goToItem,{display:"inline"},true);nms.css(forumItem,{display:"inline"},true);nms.css(spacer,{margin:"0px 5px",position:"relative",top:"-1px","vertical-align":"top"},true);nms.css(goToLink,{color:"#004687","font-weight":"bold","text-decoration":"none"},true);nms.css(forumLink,{color:"#004687","font-weight":"bold","text-decoration":"none"},true);goToLink.onclick=nmev.callback(goToLink,ongotolinkclick);if(title){node.appendChild(head);head.innerHTML=title;goToLink.title=title}node.appendChild(linkList);linkList.appendChild(goToItem);linkList.appendChild(forumItem);goToItem.appendChild(goToLink);forumItem.appendChild(spacer);forumItem.appendChild(forumLink);spacer.appendChild(document.createTextNode("|"));goToLink.appendChild(document.createTextNode("Go here"));forumLink.appendChild(document.createTextNode("Forum post"));_map.openInfoWindow(latlng,node,infoOpts)}function addLayer(layerId,markerManager){ajax.getJSON(nmm.DYNAMIC_LAYER_POINTS_URL_JSONP.replace(/\{L\}/,layerId),function(data){var markers=[];var bounds=_map.getBounds();var inBounds=false;var sw=bounds.getSouthWest();var ne=bounds.getNorthEast();var minLat=sw.lat();var maxLat=ne.lat();var minLng=sw.lng();var maxLng=ne.lng();var iconSize=_icon.iconSize;var marker;var layerPoint;var location;var latlng;var nsw,nne;var zoomOutBounds;var boundsZoomLevel;var infoOpts;var opts;if(data.length<=0){return}infoOpts={pixelOffset:new nmm.Size(0,-iconSize.height),maxWidth:500};for(var i=data.length;i--;){layerPoint=data[i];opts={icon:_icon,title:(layerPoint.title?layerPoint.title:undefined)};location=layerPoint.location;latlng=new nmm.LatLng(location.lat,location.lng);marker=new nmov.Marker(latlng,opts);nmev.addListener(marker,"click",nmev.callbackArgs(marker,onmarkerclick,layerPoint.link,layerPoint.forumlink,layerPoint.title,infoOpts));markers.push(marker);if(!inBounds){inBounds=bounds.containsLatLng(latlng)}if(!inBounds){if(minLat>latlng.lat()){minLat=latlng.lat()}if(maxLat<latlng.lat()){maxLat=latlng.lat()}if(minLng>latlng.lng()){minLng=latlng.lng()}if(maxLng<latlng.lng()){maxLng=latlng.lng()}}}markerManager.addMarkers(markers,_minZoom,_maxZoom);if(!inBounds){nsw=new nmm.LatLng(minLat,minLng);nne=new nmm.LatLng(maxLat,maxLng);zoomOutBounds=new nmm.LatLngBounds(nsw,nne);boundsZoomLevel=_map.getBoundsZoomLevel(zoomOutBounds,_map.getSize(),1);if(boundsZoomLevel>=1){boundsZoomLevel--}_map.setCenter(zoomOutBounds.getCenter(),boundsZoomLevel,_map.getCurrentMapType(),_map.getTileDate(),true,true)}markerManager.refresh()})}function createIcons(layers){var icon=nmov.Icon.DEFAULT_ICON;return icon}function createSubMenuBackground(){var frag=document.createDocumentFragment();return frag}function createCheckbox(layer,isLast){var frag=document.createDocumentFragment();var wrap=document.createElement("div");var checkCol=document.createElement("td");var nameCol=document.createElement("td");var checkbox=document.createElement("input");var layerName=document.createElement("label");var prefix="nmdl";checkbox.type="checkbox";checkbox.id=prefix+layer.name;checkbox.value=layer.id;layerName.htmlFor=checkbox.id;nms.css(wrap,{clear:"both","float":"left","margin-bottom":(isLast?"0px":"10px"),width:"100%"},true);nms.css(checkbox,{display:"inline","float":"left",margin:"2px 5px 0px 10px","vertical-align":"top"},true);nms.css(layerName,{display:"inline","float":"left","font-size":"12px","font-weight":"bold",width:"100px"},true);nmev.addDomListener(checkbox,"click",nmev.callback(checkbox,oncheckboxclick));frag.appendChild(wrap);wrap.appendChild(checkbox);wrap.appendChild(layerName);layerName.appendChild(document.createTextNode(layer.name));return frag}function processLayers(menuContainer,bgContainer){return function(data){var horizSprite=nmls.BUTTONS;var vertSprite=nmls.BUTTONS_VERTICAL;var menuFrag=document.createDocumentFragment();var bgFrag=document.createDocumentFragment();var contentWrap=document.createElement("div");var footerWrap=document.createElement("div");var cornerSize=new nmm.Size(10,10);var leftCorner=nmls.createClippedSprite(horizSprite,cornerSize,new nmm.Point(105,150));var rightCorner=nmls.createClippedSprite(horizSprite,cornerSize,new nmm.Point(90,150));var bottomBorder;var leftBorder;var rightBorder;var contentBg;var len=data.length;var width;var height;var ieFocusFix;_icon=createIcons(data);for(var i=0;i<len;i++){menuFrag.appendChild(createCheckbox(data[i],i===len-1))}menuContainer.appendChild(menuFrag);width=menuContainer.offsetWidth;height=menuContainer.offsetHeight;leftBorder=nmls.createClippedSprite(vertSprite,new nmm.Size(cornerSize.width,height),new nmm.Point(0,0),{x:false,y:true});contentBg=nmls.createClippedSprite(nmls.BUTTONS_BG,new nmm.Size(width-(cornerSize.width*2),height),new nmm.Point(0,0),{x:true,y:true});rightBorder=nmls.createClippedSprite(vertSprite,new nmm.Size(cornerSize.width,height),new nmm.Point(15,0),{x:false,y:true});bottomBorder=nmls.createClippedSprite(horizSprite,new nmm.Size(width-(cornerSize.width*2),cornerSize.height),new nmm.Point(0,174));nms.css(contentWrap,{overflow:"hidden",width:width+"px"},true);nms.css(footerWrap,{height:cornerSize.getHeightString(),overflow:"hidden",position:"relative"},true);nms.css(bottomBorder.firstChild,{position:"absolute",left:cornerSize.getWidthString()},true);nms.css(rightCorner.firstChild,{position:"absolute",left:(width-cornerSize.width)+"px"},true);bgFrag.appendChild(contentWrap);bgFrag.appendChild(footerWrap);contentWrap.appendChild(leftBorder);contentWrap.appendChild(contentBg);contentWrap.appendChild(rightBorder);footerWrap.appendChild(leftCorner);footerWrap.appendChild(bottomBorder);footerWrap.appendChild(rightCorner);bgContainer.appendChild(bgFrag);if(nmc.browser.msie&&nmc.browser.majorVersion<=6){ieFocusFix=document.createElement("iframe");ieFocusFix.setAttribute("allowtransparency","true");ieFocusFix.frameBorder=0;nms.css(ieFocusFix,{filter:'chroma(color="#FFFFFF")',position:"absolute",width:width+"px",height:height+"px"},true);bgContainer.parentNode.insertBefore(ieFocusFix,bgContainer)}_node.style.visibility="visible"}}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.getNode=function(){return _node};this.initialize=function(map){var btnSprite=nmls.BUTTONS;var frag=document.createDocumentFragment();var moreBtn=document.createElement("a");var btnEdgeSize=new nmm.Size(3,26);var btnLeftEdge=nmls.createClippedSprite(btnSprite,btnEdgeSize,new nmm.Point(5,28));var btnRightEdge=nmls.createClippedSprite(btnSprite,btnEdgeSize,new nmm.Point(0,28));var btnContent=document.createElement("span");var subMenuWrap=document.createElement("div");var subMenuBg=document.createElement("div");var subMenu=document.createElement("div");var width=150;var ieFocusFix;_map=map;_node=document.createElement("div");nms.css(moreBtn,{cursor:"pointer","float":"left",padding:"0px 0px 10px 0px"},true);nms.css(btnLeftEdge.firstChild,{overflow:"hidden"});nms.css(btnRightEdge.firstChild,{overflow:"hidden"});nms.css(btnContent,{background:"url("+btnSprite.url+") repeat-x","float":"left","font-size":"13px","font-weight":"bold",height:btnEdgeSize.getHeightString(),"line-height":"25px",padding:"0px 5px"},true);nms.css(subMenuWrap,{position:"absolute",top:"35px",left:"0px",visibility:"hidden",width:width+"px"},true);nms.css(subMenu,{cursor:"default",display:"block","list-style":"none",padding:"10px 0px 0px 0px",position:"absolute",top:"0px",left:"0px",width:width+"px"},true);nms.css(subMenuBg,{overflow:"hidden"},true);nmev.addDomListener(_node,"mouseover",nmev.callback(_node,onmenuover));nmev.addDomListener(_node,"mouseout",nmev.callback(_node,onmenuout));nmev.addListener(_map,"dragstart",ondragstart);nmev.addListener(_map,"dragend",ondragend);if(!this.selectable()){nmev.disableSelect(_node)}frag.appendChild(_node);_node.appendChild(moreBtn);_node.appendChild(subMenuWrap);moreBtn.appendChild(btnLeftEdge);moreBtn.appendChild(btnContent);moreBtn.appendChild(btnRightEdge);subMenuWrap.appendChild(subMenuBg);subMenuWrap.appendChild(subMenu);btnContent.appendChild(document.createTextNode("More..."));map.getContainer().appendChild(frag);if(nmc.browser.msie){ieFocusFix=document.createElement("iframe");ieFocusFix.setAttribute("allowtransparency","true");ieFocusFix.setAttribute("scrolling","no");ieFocusFix.frameBorder=0;nms.css(ieFocusFix,{filter:'chroma(color="#FFFFFF")',height:"36px",width:width+"px",position:"absolute",top:"0px",left:"0px"},true);_node.insertBefore(ieFocusFix,moreBtn)}ajax.getJSON(nmm.DYNAMIC_LAYERS_URL_JSONP,processLayers(subMenu,subMenuBg));return _node}}function SmallMapControl(){}SmallMapControl.prototype=new Control(false,false);SmallMapControl.prototype.initialize=function(map){};SmallMapControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))};function HierarchicalMapTypeControl(){var relationships}HierarchicalMapTypeControl.prototype=new Control(false,false);HierarchicalMapTypeControl.prototype.initialize=function(map){};HierarchicalMapTypeControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(0,0))};function OverviewMapControl(){}OverviewMapControl.prototype=new Control(false,false);OverviewMapControl.prototype.initialize=function(map){};OverviewMapControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(0,0))};function NavLabelControl(){}NavLabelControl.prototype=new Control(false,false);NavLabelControl.prototype.initialize=function(map){};NavLabelControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(0,0))};function NearmapBar(printable,selectable){this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){};this.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(10,10))}}nmm.ControlAnchor=ControlAnchor;nmm.ControlPosition=ControlPosition;nmm.Control=Control;nmm.SmallMapControl=SmallMapControl;nmm.LargeMapControl=LargeMapControl;nmm.LargeMapControl3D=LargeMapControl3D;nmm.SmallZoomControl=SmallZoomControl;nmm.SmallZoomControl3D=SmallZoomControl3D;nmm.LargeZoomControl=LargeZoomControl;nmm.ScaleControl=ScaleControl;nmm.ShadowControl=ShadowControl;nmm.MapTypeControl=MapTypeControl;nmm.ToggleAndRotateMapTypeViewControl=ToggleAndRotateMapTypeViewControl;nmm.MenuMapTypeControl=MenuMapTypeControl;nmm.HierarchicalMapTypeControl=HierarchicalMapTypeControl;nmm.OverviewMapControl=OverviewMapControl;nmm.NavLabelControl=NavLabelControl;nmm.TimelineControl=TimelineControl;nmm.TimelineControlOptions=TimelineControlOptions;nmm.LatestImageryControl=LatestImageryControl;nmm.ReturnToRegularSiteControl=ReturnToRegularSiteControl;nmm.IPhoneNavControl=IPhoneNavControl;nmm.GeoLocationControl=GeoLocationControl;nmm.DynamicLayersControl=DynamicLayersControl})();
