/*
 * 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;var nearmap=window.nearmap;if(!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.lib.poly){nearmap.lib.poly={}}else{if(typeof nearmap.lib.poly!=="object"){throw new Error("The nearmap.lib.poly namespace must be an object. It is currently a "+typeof nearmap.lib.poly)}}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)}}window.nearmap=nearmap})();/*
 * 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;var nmm=window.nearmap.maps;var nml=window.nearmap.lib;var 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}function round(num,places){var s=Math.pow(10,places);return Math.round(num*s)/s}function formatNumber(num,places,seperator){var splitNum=num.toString().split(".");var formattedWhole="";var whole;var fraction;var i;var currentPlace;if(!places){places=3}if(!seperator){seperator=" "}whole=splitNum[0];fraction=(splitNum.length>=2?"."+splitNum[1]:"");i=whole.length-1;currentPlace=0;while(i>=0){formattedWhole=whole.charAt(i)+(currentPlace!==0&&currentPlace%places===0?seperator:"")+formattedWhole;currentPlace++;i--}return formattedWhole+fraction}nmlm.Random=Random;nmlm.rotatePoint=rotatePoint;nmlm.round=round;nmlm.formatNumber=formatNumber})();/*
 * 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},indexOfObject:function(arr,elt,condition){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&&condition(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 dateFormat=function(){var token=/d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,timezone=/\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,timezoneClip=/[^-+\dA-Z]/g,pad=function(val,len){val=String(val);len=len||2;while(val.length<len){val="0"+val}return val};return function(date,mask,utc){var dF=dateFormat;if(arguments.length===1&&Object.prototype.toString.call(date)==="[object String]"&&!(/\d/).test(date)){mask=date;date=undefined}date=date?new Date(date):new Date();if(isNaN(date)){throw SyntaxError("invalid date")}mask=String(dF.masks[mask]||mask||dF.masks["default"]);if(mask.slice(0,4)=="UTC:"){mask=mask.slice(4);utc=true}var _=utc?"getUTC":"get",d=date[_+"Date"](),D=date[_+"Day"](),m=date[_+"Month"](),y=date[_+"FullYear"](),H=date[_+"Hours"](),M=date[_+"Minutes"](),s=date[_+"Seconds"](),L=date[_+"Milliseconds"](),o=utc?0:date.getTimezoneOffset(),flags={d:d,dd:pad(d),ddd:dF.i18n.dayNames[D],dddd:dF.i18n.dayNames[D+7],m:m+1,mm:pad(m+1),mmm:dF.i18n.monthNames[m],mmmm:dF.i18n.monthNames[m+12],yy:String(y).slice(2),yyyy:y,h:H%12||12,hh:pad(H%12||12),H:H,HH:pad(H),M:M,MM:pad(M),s:s,ss:pad(s),l:pad(L,3),L:pad(L>99?Math.round(L/10):L),t:H<12?"a":"p",tt:H<12?"am":"pm",T:H<12?"A":"P",TT:H<12?"AM":"PM",Z:utc?"UTC":(String(date).match(timezone)||[""]).pop().replace(timezoneClip,""),o:(o>0?"-":"+")+pad(Math.floor(Math.abs(o)/60)*100+Math.abs(o)%60,4),S:["th","st","nd","rd"][d%10>3?0:(d%100-d%10!=10)*d%10]};return mask.replace(token,function($0){return $0 in flags?flags[$0]:$0.slice(1,$0.length-1)})}}();dateFormat.masks={"default":"ddd mmm dd yyyy HH:MM:ss",shortDate:"m/d/yy",mediumDate:"mmm d, yyyy",longDate:"mmmm d, yyyy",fullDate:"dddd, mmmm d, yyyy",shortTime:"h:MM TT",mediumTime:"h:MM:ss TT",longTime:"h:MM:ss TT Z",isoDate:"yyyy-mm-dd",isoTime:"HH:MM:ss",isoDateTime:"yyyy-mm-dd'T'HH:MM:ss",isoUtcDateTime:"UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"};dateFormat.i18n={dayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","January","February","March","April","May","June","July","August","September","October","November","December"]};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)){return true}return false}};DateHelper.format=dateFormat;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 document=window.document;var nearmap=window.nearmap;var nmc=nearmap.client;var nms=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 createStyleSheet(media){var styleSheet=document.createElement("style");styleSheet.setAttribute("type","text/css");styleSheet.setAttribute("rel","stylesheet");if(media){styleSheet.setAttribute("media",media)}document.getElementsByTagName("head")[0].appendChild(styleSheet);return styleSheet}function addRules(styleNode,selector,rules){var cssString;cssString=selector+"{";for(var p in rules){if(rules.hasOwnProperty(p)){cssString+=p+":"+rules[p]+";"}}cssString+="}";if(styleNode.styleSheet){styleNode.styleSheet.cssText+=cssString}else{try{styleNode.innerHTML+=cssString}catch(e){}}}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.createStyleSheet=createStyleSheet;nms.addRules=addRules;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{if(typeof elm.style.MozUserSelect!=="undefined"){elm.style.MozUserSelect="none"}else{if(typeof elm.style.KhtmlUserSelect!=="undefined"){elm.style.KhtmlUserSelect="none"}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(){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){throw"event.removeListener Error: Your must provide a handler to remove"}if(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);var queuesKey;var eventKey=eventPrefix+event;var queue;var queueCopy;var listener;var extraArgs;extraArgs=Array.apply(null,arguments).slice(2);if(key>-1){queuesKey=lookupPrefix+key;queue=objEvents[queuesKey][eventKey];if(queue){queueCopy=queue.slice(0);for(var i=0;i<queueCopy.length;i++){listener=queueCopy[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 getDimensions(elm){var node=elm instanceof String?document.getElementById(elm):elm;if(!node){throw"You have not provided a valid element to getDimensions()"}return{width:node.offsetWidth,height:node.offsetHeight}}function imageSize(img){return{height:img.height,width:img.width}}function addSelectOption(select,text,value){var option=document.createElement("option");option.text=text;option.value=value;select.options.add(option)}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.offsetParent;while(parent){offset+=parent.offsetTop;parent=parent.offsetParent}return offset}function getBodyOffsetLeft(elm){var node=elm instanceof String?document.getElementById(elm):elm;var offset=node.offsetLeft;var parent=node.offsetParent;while(parent){offset+=parent.offsetLeft;parent=parent.offsetParent}return offset}function getBodyOffset(elm){return{offsetTop:getBodyOffsetTop(elm),offsetLeft:getBodyOffsetLeft(elm)}}function getBodyScrollLeft(){return document.body.scrollLeft||document.documentElement.scrollLeft}function getBodyScrollTop(){return document.body.scrollTop||document.documentElement.scrollTop}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+getBodyScrollLeft()))}function getDocPosY(e,mousewheel){return(isFF2Wheel(mousewheel)?e.screenY:(e.pageY?e.pageY:e.clientY+getBodyScrollTop()))}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.getDimensions=getDimensions;nmd.imageSize=imageSize;nmd.addSelectOption=addSelectOption;nmd.getWindowHeight=getWindowHeight;nmd.getWindowWidth=getWindowWidth;nmd.getWindowDimensions=getWindowDimensions;nmd.getBodyOffsetTop=getBodyOffsetTop;nmd.getBodyOffsetLeft=getBodyOffsetLeft;nmd.getBodyOffset=getBodyOffset;nmd.getBodyScrollLeft=getBodyScrollLeft;nmd.getBodyScrollTop=getBodyScrollTop;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 nmc=nearmap.client;var factories;var factory;var cache={};var timers=[];var jsonpName=new Date().getTime();var errorScriptFile="/js/error.js";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(){if(console&&console.log){console.log("There was an error completing the ajax request. Please try again or contact an administrator")}},creationError:function(){if(console&&console.log){console.log("Unfortunately there was an error creating the ajax request. Please ensure your browser supports ajax or update to the latest version.")}},timeoutError:function(){if(console&&console.log){console.log("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 cleanupJSONP(fname,loadScript,timeoutId){if(timeoutId!==undefined){window.clearTimeout(timeoutId)}window[fname]=null;loadScript.onload=loadScript.onreadystatechange=null;nme.discardElement(loadScript)}function getJSONP(url,callback,opts){var head=document.getElementsByTagName("head")[0];var fname="jsonp"+jsonpName++;var errorfname="error"+fname;var liveUrl=url.replace(/=\?/,"="+fname);var done=false;var loadScript=document.createElement("script");var errorScript;var timeout;window[fname]=function(data){var parsedData=(opts.withDate?json.parseObjectWithDate(data):data);done=true;if(opts.useCache){cache[url]=parsedData}cleanupJSONP(fname,loadScript,timeout);callback(data)};if(window.opera){window[errorfname]=function(){if(!done){cleanupJSONP(fname,loadScript,timeout);window[errorfname]=null;nme.discardElement(errorScript);opts.error()}};errorScript=document.createElement("script");errorScript.type="text/javascript"}else{loadScript=document.createElement("script");loadScript.onerror=loadScript.onreadystatechange=function(){if(!done&&(!loadScript.readyState||loadScript.readyState==="loaded"||loadScript.readyState==="complete")){cleanupJSONP(fname,loadScript,timeout);opts.error()}}}timeout=window.setTimeout(function(){cleanupJSONP(fname,loadScript);opts.timeoutError()},opts.timeoutLength);loadScript.type="text/javascript";loadScript.className="temp_script";loadScript.src=liveUrl;head.appendChild(loadScript);if(errorScript){errorScript.type="text/javascript";errorScript.innerHTML+=errorfname+"();";head.appendChild(errorScript)}}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 request;var requestTimer;opts=nmo.Synchronize.fill(opts,AjaxOptions);request=createXMLHttpRequest();if(request){request.onreadystatechange=function(){var headers;var headerDict;var len;if(request.readyState===4){window.clearTimeout(requestTimer);if(request.status===200){headers=request.getAllResponseHeaders().split("\n");headerDict={};len=headers.length;for(var key=0;key<len;key++){if(headers[key].length!=0){header=headers[key].split(": ");headerDict[header[0]]=header[1]}}if(callback&&typeof(callback)==="function"){callback(headerDict)}}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()}}}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);return id}function stopContinuousAnimation(id){window.clearInterval(id)}nma.runAnimation=runAnimation;nma.runFixedAnimation=runFixedAnimation;nma.stopAnimation=stopAnimation;nma.stopFixedAnimation=stopFixedAnimation;nma.runContinuousAnimation=runContinuousAnimation;nma.stopContinuousAnimation=stopContinuousAnimation})();/*
 * 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]){callback(e);deleteTimer(timerName)}else{deleteTimer(timerName);_timers[timerName]=window.setTimeout(_ev.callbackArgs(this,deleteTimer,timerName),_dblTapElapse)}}else{deleteTimer(timerName)}return _ev.preventDefault(e)}}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 nms=nearmap.style;var nmt=nearmap.threading;var nmc=nearmap.client;var _stateBagId="state";var _isEnabled=false;var _frameId;var _loadEntry;var _newState;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 loadHomePage(){var frame=document.getElementById(_frameId);var frameWindow=frame.contentWindow||frame.contentDocument;var frameDoc=frameWindow.document;var stateBag=frameDoc.getElementById(_stateBagId);var mapState;if(!stateBag.value&&_newState){if(_newState.title){document.title=_newState.title;if(nmc.browser.msie){frameDoc.title=_newState.title}}stateBag.value=json.stringify(_newState);_newState=null}else{if(stateBag.value){mapState=json.parse(stateBag.value);if(mapState.title){document.title=mapState.title;if(nmc.browser.msie){frameDoc.title=mapState.title}}_loadEntry(mapState)}}}function initialize(id,loadEntry){if(!loadEntry||typeof loadEntry!=="function"){throw"History.initialize error - You must specify a callback function to load a history entry"}if(!id||!document.getElementById(id)){throw"History.initialize error - You must specify an valid id for an iframe element already inserted into the DOM"}_frameId=id;_isEnabled=true;_loadEntry=loadEntry;window.loadHomePage=loadHomePage}function save(newState,title,oldState,ignoreCallback){var frame;var frameWindow;var frameDoc;var stateBag;if(!_isEnabled){throw"History.save() error - You must first enable the history module by calling nearmap.lib.history.initialize()"}frame=document.getElementById(_frameId);if(!frame){throw"History.save() error - You must provide a valid id for an iframe element already in the DOM"}frameWindow=frame.contentWindow||frame.contentDocument;frameDoc=frameWindow.document;if(!history.stack){history.stack={}}if(history._locked){return false}history.cursor=(new Date()).getTime().toString();_newState=newState;stateBag=frameDoc.getElementById(_stateBagId);if(stateBag&&oldState){stateBag.value=json.stringify(oldState)}nmt.later(function(){frameWindow.location.href="/mapfiles/state2.html?h="+history.cursor})}nmlh.HistoryType=HistoryType;nmlh.HistoryState=HistoryState;nmlh.MapHistoryState=MapHistoryState;nmlh.initialize=initialize;nmlh.save=save})();(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nms=nearmap.style;var nmlp=nearmap.lib.poly;var nmev=nearmap.event;var _isSupported=false;var _IRenderer=null;function Point(x,y){this.x=x;this.y=y}Point.prototype.lerp=function(that,t){t=Math.min(1,t);t=Math.max(0,t);var omt=1-t;return new Point(this.x*omt+that.x*t,this.y*omt+that.y*t)};Point.prototype.midpoint=function(that){return new Point((this.x+that.x)*0.5,(this.y+that.y)*0.5)};Point.prototype.toString=function(){return this.x+","+this.y};function Vector(x,y){this.x=x;this.y=y}Vector.fromPoints=function(p1,p2){return new Vector(p2.x-p1.x,p2.y-p1.y)};Vector.prototype.isZeroVector=function(){return(this.x==0&&this.y==0)};Vector.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y)};Vector.prototype.angleBetween=function(that){var length1=Math.sqrt(this.x*this.x+this.y*this.y);var length2=Math.sqrt(that.x*that.x+that.y*that.y);var cos=(this.x*that.x+this.y*that.y)/(length1*length2);var radians=Math.acos(cos);if(this.x*that.y-that.x*this.y<0){radians=-radians}return 180*radians/Math.PI};Vector.prototype.dot=function(that){return this.x*that.x+this.y*that.y};Vector.prototype.perpendicular=function(that){var result=this.project(that);result.x=this.x-result.x;result.y=this.y-result.y;return result};Vector.prototype.project=function(that){var scale=that.dot(this)/that.dot(that);return that.scale(scale)};Vector.prototype.scale=function(scale){return new Vector(this.x*scale,this.y*scale)};function Matrix(m11,m12,m21,m22,offsetX,offsetY){if(arguments.length==6){this.m11=m11;this.m12=m12;this.m21=m21;this.m22=m22;this.offsetX=offsetX;this.offsetY=offsetY}else{this.setToIdentity()}}Matrix.prototype.getDeterminant=function(){return this.m11*this.m22-this.m21*this.m12};Matrix.prototype.hasInvserse=function(){return this.getDeterminant()!=0};Matrix.prototype.getInverse=function(){var det1=this.getDeterminant();if(det1==0){throw new InvalidOperationException("Matrix not invertible")}return new Matrix(this.m22/det1,-this.m12/det1,-this.m21/det1,this.m11/det1,(this.m21*this.offsetY-this.offsetX*this.m22)/det1,(this.offsetX*this.m12-this.m11*this.offsetY)/det1)};Matrix.prototype.isIdentity=function(){return(this.m11==1&&this.m12==0&&this.m21==0&&this.m22==1&&this.offsetX==0&&this.offsetY==0)};Matrix.prototype.setToIdentity=function(){this.m11=1;this.m12=0;this.m21=0;this.m22=1;this.offsetX=0;this.offsetY=0};Matrix.prototype.preMultiply=function(matrix){return new Matrix(matrix.m11*this.m11+matrix.m12*this.m21,matrix.m11*this.m12+matrix.m12*this.m22,matrix.m21*this.m11+matrix.m22*this.m21,matrix.m21*this.m12+matrix.m22*this.m22,matrix.offsetX*this.m11+matrix.offsetY*this.m21+this.offsetX,matrix.offsetX*this.m12+matrix.offsetY*this.m22+this.offsetY)};Matrix.prototype.preMultiplyEquals=function(matrix){var a=matrix.m11*this.m11+matrix.m12*this.m21;var b=matrix.m11*this.m12+matrix.m12*this.m22;var c=matrix.m21*this.m11+matrix.m22*this.m21;var d=matrix.m21*this.m12+matrix.m22*this.m22;var e=matrix.offsetX*this.m11+matrix.offsetY*this.m21+this.offsetX;var f=matrix.offsetX*this.m12+matrix.offsetY*this.m22+this.offsetY;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.postMultiply=function(matrix){return new Matrix(this.m11*matrix.m11+this.m12*matrix.m21,this.m11*matrix.m12+this.m12*matrix.m22,this.m21*matrix.m11+this.m22*matrix.m21,this.m21*matrix.m12+this.m22*matrix.m22,this.offsetX*matrix.m11+this.offsetY*matrix.m21+matrix.offsetX,this.offsetX*matrix.m12+this.offsetY*matrix.m22+matrix.offsetY)};Matrix.prototype.postMultiplyEquals=function(matrix){var a=this.m11*matrix.m11+this.m12*matrix.m21;var b=this.m11*matrix.m12+this.m12*matrix.m22;var c=this.m21*matrix.m11+this.m22*matrix.m21;var d=this.m21*matrix.m12+this.m22*matrix.m22;var e=this.offsetX*matrix.m11+this.offsetY*matrix.m21+matrix.offsetX;var f=this.offsetX*matrix.m12+this.offsetY*matrix.m22+matrix.offsetY;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.postRotateEquals=function(angle){var radians=angle*Math.PI/180;var cos=Math.Cos(radians);var sin=Math.Sin(radians);var a=this.m11*cos-this.m12*sin;var b=this.m11*sin+this.m12*cos;var c=this.m21*cos-this.m22*sin;var d=this.m21*sin+this.m22*cos;var e=this.offsetX*cos-this.offsetY*sin;var f=this.offsetX*sin+this.offsetY*cos;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.preRotateEquals=function(angle){var radians=angle*Math.PI/180;var cos=Math.Cos(radians);var sin=Math.Sin(radians);var a=this.m11*cos+this.m21*sin;var b=this.m12*cos+this.m22*sin;var c=this.m11*-sin+this.m21*cos;var d=this.m12*-sin+this.m22*cos;var e=this.offsetX;var f=this.offsetY;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.postRotateAtEquals=function(angle,center){var radians=angle*Math.PI/180;var cos=Math.Cos(radians);var sin=Math.Sin(radians);var dx=this.offsetX-center.x;var dy=this.offsetY-center.y;var a=this.m11*cos-this.m12*sin;var b=this.m11*sin+this.m12*cos;var c=this.m21*cos-this.m22*sin;var d=this.m21*sin+this.m22*cos;var e=center.x+cos*dx-sin*dy;var f=center.y+sin*dx+cos*dy;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.preRotateAtEquals=function(angle,center){var radians=angle*Math.PI/180;var cos=Math.Cos(radians);var sin=Math.Sin(radians);var t1=-center.x+center.x*cos-center.y*sin;var t2=-center.y+center.y*cos+center.x*sin;var a=this.m11*cos+this.m21*sin;var b=this.m12*cos+this.m22*sin;var c=this.m11*-sin+this.m21*cos;var d=this.m12*-sin+this.m22*cos;var e=this.m11*t1+this.m21*t2+this.offsetX;var f=this.m12*t1+this.m22*t2+this.offsetY;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.postScaleEquals=function(scaleX,scaleY){this.m11*=scaleX;this.m12*=scaleY;this.m21*=scaleX;this.m22*=scaleY;this.offsetX*=scaleX;this.offsetY*=scaleY};Matrix.prototype.preScaleEquals=function(scaleX,scaleY){this.m11*=scaleX;this.m12*=scaleX;this.m21*=scaleY;this.m22*=scaleY};Matrix.prototype.postScaleAtEquals=function(scaleX,scaleY,origin){this.m11*=scaleX;this.m12*=scaleY;this.m21*=scaleX;this.m22*=scaleY;this.offsetX=(this.offsetX-origin.x)*scaleX+origin.x;this.offsetY=(this.offsetY-origin.y)*scaleY+origin.y};Matrix.prototype.preScaleAtEquals=function(scaleX,scaleY,origin){var dx=origin.x-scaleX*origin.x;var dy=origin.y-scaleY*origin.y;this.m11*=scaleX;this.m12*=scaleX;this.m21*=scaleY;this.m22*=scaleY;this.offsetX=this.offsetX+this.m11*dx+this.m21*dy;this.offsetY=this.offsetY+this.m12*dx+this.m22*dy};Matrix.prototype.postSkewEquals=function(skewX,skewY){var tanX=Math.Tan(skewX*Math.PI/180);var tanY=Math.Tan(skewY*Math.PI/180);var a=this.m11+this.m12*tanX;var b=this.m11*tanY+this.m12;var c=this.m21+this.m22*tanX;var d=this.m21*tanY+this.m22;var e=this.offsetX+this.offsetY*tanX;var f=this.offsetX*tanY+this.offsetY;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.preSkewEquals=function(skewX,skewY){var tanX=Math.Tan(skewX*Math.PI/180);var tanY=Math.Tan(skewY*Math.PI/180);var a=this.m11+this.m21*tanY;var b=this.m12+this.m22*tanY;var c=this.m11*tanX+this.m21;var d=this.m12*tanX+this.m22;this.m11=a;this.m12=b;this.m21=c;this.m22=d};Matrix.prototype.postSkewAtEquals=function(skewX,skewY,origin){var tanX=Math.Tan(skewX*Math.PI/180);var tanY=Math.Tan(skewY*Math.PI/180);var a=this.m11+this.m12*tanX;var b=this.m11*tanY+this.m12;var c=this.m21+this.m22*tanX;var d=this.m21*tanY+this.m22;var e=this.offsetX+(this.offsetY-origin.y)*tanX;var f=(this.offsetX-origin.x)*tanY+this.offsetY;this.m11=a;this.m12=b;this.m21=c;this.m22=d;this.offsetX=e;this.offsetY=f};Matrix.prototype.preSkewAtEquals=function(offestX,offsetY,origin){throw new Error("not implemented")};Matrix.prototype.postTranslateEquals=function(offsetX,offsetY){this.offsetX+=offsetX;this.offsetY+=offsetY};Matrix.prototype.preTranslateEquals=function(offsetX,offsetY){this.offsetX+=this.m11*offsetX+this.m21*offsetY;this.offsetY+=this.m12*offsetX+this.m22*offsetY};Matrix.prototype.toString=function(){return[this.m11,this.m12,this.m21,this.m22,this.offsetX,this.offsetY].join(",")};Matrix.prototype.transformPoint=function(point){return new Point(this.m11*point.x+this.m21*point.y+this.offsetX,this.m12*point.x+this.m22*point.y+this.offsetY)};Matrix.prototype.transformPoint=function(vector){return new Vector(this.m11*point.x+this.m21*point.y,this.m12*point.x+this.m22*point.y)};function MatrixTransform(a,b,c,d,e,f){this._transform=new Matrix(a,b,c,d,e,f)}MatrixTransform.prototype.getTransformMatrix=function(){return this._transform};MatrixTransform.prototype.getTransformText=function(){return"matrix("+this._trasnform+")"};function RotateTransform(angle,origin){this.angle=angle;this.origin=origin||new Point(0,0);this._transform=null}RotateTransform.prototype.getTransformMatrix=function(){if(this._transform==null){var result=new Matrix();result.postRotateAtEquals(this.angle,this.origin);this._transform=result}return this._transform};RotateTransform.prototype.getTransformText=function(){var result="rotate("+this.angle;if(this.origin!=null&&(this.origin.x!=0||this.origin.y!=0)){result+=","+this.origin.toString()}result+=")";return result};function ScaleTransform(scaleX,scaleY,origin){this.scaleX=scaleX;this.scaleY=scaleY;this.origin=origin||new Point(0,0);this._transform=null}ScaleTransform.prototype.getTransformMatrix=function(){if(this._transform==null){var result=new Matrix();result.postScaleAtEquals(this.scaleX,this.scaleY,origin);this._transform=result}return this._transform};ScaleTransform.prototype.getTransformText=function(){var result="scale("+this.scaleX+","+this.scaleY;if(this.origin!=null&&(this.origin.x!=0||this.origin.y!=0)){result+=","+this.origin.x+","+this.origin.y}result+=")";return result};function TranslateTransform(offsetX,offsetY){this.offsetX=offsetX;this.offsetY=offsetY;this._transform=null}TranslateTransform.prototype.getTransformMatrix=function(){if(this._transform==null){var result=new Matrix();result.postTranslateTransformEquals(this.offsetX,this.offsetY);this._transform=result}return this._transform};TranslateTransform.prototype.getTransformText=function(){return"translate("+this.offsetX+","+this.offsetY+")"};function TransformList(){this.transforms=[];this._transform=null}TransformList.prototype.addTransform=function(transform){this.transforms.add(transform);this._transform=null};TransformList.prototype.clear=function(){this.transforms.length=0;this._transform=null};TransformList.prototype.removeTransform=function(transform){for(var i=0;i<this.transforms.length;i++){var target=this.transforms[i];if(target===transform){this.transforms.splice(i,1);break}}};TransformList.prototype.getTransformMatrix=function(){if(this._transform==null){var result=new Matrix();for(var i=0;i<this.transforms.length;i++){var transform=this.transforms[i];var matrix=transform.getTransformMatrix();result.postMultiplyEquals(matrix)}this._transform=result}return this._transform};TransformList.prototype.getTransformText=function(){var buffer=[];for(var i=0;i<this.transforms.length;i++){var transform=this.transforms[i];buffer.push(transform.getTransformText())}return buffer.join(" ")};PathParser.PARAMCOUNT={A:7,C:6,H:1,L:2,M:2,Q:4,S:4,T:2,V:1,Z:0};PathParser.METHODNAME={A:"arcAbs",a:"arcRel",C:"curvetoCubicAbs",c:"curvetoCubicRel",H:"linetoHorizontalAbs",h:"linetoHorizontalRel",L:"linetoAbs",l:"linetoRel",M:"movetoAbs",m:"movetoRel",Q:"curvetoQuadraticAbs",q:"curvetoQuadraticRel",S:"curvetoCubicSmoothAbs",s:"curvetoCubicSmoothRel",T:"curvetoQuadraticSmoothAbs",t:"curvetoQuadraticSmoothRel",V:"linetoVerticalAbs",v:"linetoVerticalRel",Z:"closePath",z:"closePath"};function PathParser(){this._lexer=new PathLexer();this._handler=null}PathParser.prototype.parseData=function(pathData){if(typeof(pathData)!="string"){throw new Error("PathParser.parseData: The first parameter must be a string")}if(this._handler!=null&&this._handler.beginParse!=null){this._handler.beginParse()}var lexer=this._lexer;lexer.setPathData(pathData);var mode="BOP";var token=lexer.getNextToken();while(!token.typeis(PathToken.EOD)){var param_count;var params=[];switch(token.type){case PathToken.COMMAND:if(mode=="BOP"&&token.text!="M"&&token.text!="m"){throw new Error("PathParser.parseData: a path must begin with a moveto command")}mode=token.text;param_count=PathParser.PARAMCOUNT[token.text.toUpperCase()];token=lexer.getNextToken();break;case PathToken.NUMBER:break;default:throw new Error("PathParser.parseData: unrecognized token type: "+token.type)}for(var i=0;i<param_count;i++){switch(token.type){case PathToken.COMMAND:throw new Error("PathParser.parseData: parameter must be a number: "+token.text);case PathToken.NUMBER:params[i]=token.text-0;break;default:throw new Errot("PathParser.parseData: unrecognized token type: "+token.type)}token=lexer.getNextToken()}if(this._handler!=null){var handler=this._handler;var method=PathParser.METHODNAME[mode];if(handler[method]!=null){handler[method].apply(handler,params)}}if(mode=="M"){mode="L"}if(mode=="m"){mode="l"}}};PathParser.prototype.setHandler=function(handler){this._handler=handler};function PathLexer(pathData){if(pathData==null){pathData=""}this.setPathData(pathData)}PathLexer.prototype.setPathData=function(pathData){if(typeof(pathData)!="string"){throw new Error("PathLexer.setPathData: The first parameter must be a string")}this._pathData=pathData};PathLexer.prototype.getNextToken=function(){var result=null;var d=this._pathData;while(result==null){if(d==null||d==""){result=new PathToken(PathToken.EOD,"")}else{if(d.match(/^([ \t\r\n,]+)/)){d=d.substr(RegExp.$1.length)}else{if(d.match(/^([AaCcHhLlMmQqSsTtVvZz])/)){result=new PathToken(PathToken.COMMAND,RegExp.$1);d=d.substr(RegExp.$1.length)}else{if(d.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/)){result=new PathToken(PathToken.NUMBER,parseFloat(RegExp.$1));d=d.substr(RegExp.$1.length)}else{throw new Error("PathLexer.getNextToken: unrecognized path data "+d)}}}}}this._pathData=d;return result};PathToken.UNDEFINED=0;PathToken.COMMAND=1;PathToken.NUMBER=2;PathToken.EOD=3;function PathToken(type,text){if(arguments.length>0){this.init(type,text)}}PathToken.prototype.init=function(type,text){this.type=type;this.text=text};PathToken.prototype.typeis=function(type){return this.type==type};TransformParser.PARAMCOUNT={matrix:[6],translate:[1,2],scale:[1,2],rotate:[1,3],skewX:[1],skewY:[1]};TransformParser.METHODNAME={matrix:"matrix",translate:"translate",scale:"scale",rotate:"rotate",skewX:"skewX",skewY:"skewY"};function TransformParser(){this._lexer=new TransformLexer();this._handler=null}TransformParser.prototype.parseTransform=function(transformText){if(typeof(transformText)!="string"){throw new Error("TransformParser.parseTransform: The first parameter must be a string")}if(this._handler!=null&&this._handler.beginParse!=null){this._handler.beginParse()}var lexer=this._lexer;lexer.setTransformText(transformText);var token=lexer.getNextToken();while(token.typeis(TransformToken.EOD)==false){var command;var param_counts;var params=[];switch(token.type){case TransformToken.MATRIX:case TransformToken.TRANSLATE:case TransformToken.SCALE:case TransformToken.ROTATE:case TransformToken.SKEWX:case TransformToken.SKEWY:command=token.text;param_counts=TransformParser.PARAMCOUNT[command];token=lexer.getNextToken();break;default:throw new Error("TransformParser.parseTransform: expected transform type: "+token.text)}if(token.type!=TransformToken.LPAREN){throw new Error("TransformParser.parserTransform: expected opening parenthesis: "+token.text)}token=lexer.getNextToken();while(token!=TransformToken.EOD&&token.type==TransformToken.NUMBER){params.push(token.text-0);token=lexer.getNextToken()}var valid=false;var actual_count=params.length;for(var i=0;i<param_counts.length;i++){if(param_counts[i]==actual_count){valid=true;break}}if(valid==false){throw new Error("TransformParser.parserTransform: incorrect number of arguments for "+command)}if(token.type!=TransformToken.RPAREN){throw new Error("TransformParser.parserTransform: expected closing parenthesis: "+token.text)}token=lexer.getNextToken();if(this._handler!=null){var handler=this._handler;var method=TransformParser.METHODNAME[command];if(handler[method]!=null){handler[method].apply(handler,params)}}}};TransformParser.prototype.setHandler=function(handler){this._handler=handler};function TransformLexer(transformText){if(transformText==null){transformText=""}this.setTransformText(transformText)}TransformLexer.prototype.setTransformText=function(transformText){if(typeof(transformText)!="string"){throw new Error("TransformLexer.setTransformText: The first parameter must be a string")}this._transformText=transformText};TransformLexer.prototype.getNextToken=function(){var result=null;var buffer=this._transformText;while(result==null){if(buffer==null||buffer==""){result=new TransformToken(TransformToken.EOD,"")}else{if(buffer.match(/^([ \t\r\n,]+)/)){buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(matrix)\b/)){result=new TransformToken(TransformToken.MATRIX,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(translate)\b/)){result=new TransformToken(TransformToken.TRANSLATE,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(scale)\b/)){result=new TransformToken(TransformToken.SCALE,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(rotate)\b/)){result=new TransformToken(TransformToken.ROTATE,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(skewX)\b/)){result=new TransformToken(TransformToken.SKEWX,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(skewY)\b/)){result=new TransformToken(TransformToken.SKEWY,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(\()/)){result=new TransformToken(TransformToken.LPAREN,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(\))/)){result=new TransformToken(TransformToken.RPAREN,RegExp.$1);buffer=buffer.substr(RegExp.$1.length)}else{if(buffer.match(/^(([-+]?[0-9]+(\.[0-9]*)?|[-+]?\.[0-9]+)([eE][-+]?[0-9]+)?)/)){result=new TransformToken(TransformToken.NUMBER,parseFloat(RegExp.$1));buffer=buffer.substr(RegExp.$1.length)}else{throw new Error("TransformLexer.getNextToken: unable to tokenize text: "+buffer)}}}}}}}}}}}}this._transformText=buffer;return result};function TransformToken(type,text){if(arguments.length>0){this.init(type,text)}}TransformToken.UNDEFINED=0;TransformToken.MATRIX=1;TransformToken.TRANSLATE=2;TransformToken.SCALE=3;TransformToken.ROTATE=4;TransformToken.SKEWX=5;TransformToken.SKEWY=6;TransformToken.LPAREN=7;TransformToken.RPAREN=8;TransformToken.NUMBER=9;TransformToken.EOD=10;TransformToken.prototype.init=function(type,text){this.type=type;this.text=text};TransformToken.prototype.typeis=function(type){return this.type==type};function Color(red,green,blue){this.red=red;this.green=green;this.blue=blue}Color.prototype.lerp=function(that,t){t=Math.min(1,t);t=Math.max(0,t);var omt=1-t;var r=Math.round(this.red*omt+that.red*t);var g=Math.round(this.green*omt+that.green*t);var b=Math.round(this.blue*omt+that.blue*t);return new Color(r,g,b)};Color.prototype.toHex=function(){var r=this.red.toString(16);var g=this.green.toString(16);var b=this.blue.toString(16);if(r.length==1){r="0"+r}if(g.length==1){g="0"+g}if(b.length==1){b="0"+b}return"#"+r+g+b};Color.prototype.toRGB=function(){return"rgb("+[this.red,this.green,this.blue].join(",")+")"};Color.prototype.toRGBA=function(){return"rgba("+[this.red,this.green,this.blue,1].join(",")+")"};Color.prototype.toInt=function(){return(this.red<<16|this.green<<8|this.blue)};function Group(){this._children=[]}Group.prototype=new Shape();Group.prototype.constructor=Path;Group.prototype.superclass=Shape;Group.prototype.addChild=function(child){this._children.push(child)};Group.prototype.draw=function(renderer){if(this.hasTransform()){renderer.pushTransform(this.transform)}for(var i=0;i<this._children.length;i++){this._children[i].draw(renderer)}if(this.hasTransform()){renderer.popTransform()}};Group.prototype.removeChild=function(child){for(var i=0;i<this._children.length;i++){var target=this._children[i];if(target===child){this._children.splice(i,1);break}}};function Shape(){this.stroke=null;this.strokeWidth=0;this.strokeOpacity=null;this.strokeJoin=null;this.strokeCap=null;this.strokeDash=null;this.selectable=false;this.fill=null;this.offset=null;this.dimension=null;this.transform=null;this.onclick=null;this.onmouseover=null;this.onmouseout=null}Shape.transformParser=null;Shape.prototype.hasTransform=function(){return(this.transform!=null)};Shape.prototype.setTransform=function(transform){if(transform.constructor===String){var parser=Shape.transformParser;if(parser==null){parser=new TransformParser();Shape.transformParser=parser}if(this.transform===TransformList){this.transform.clear()}else{this.transform=new TransformList()}parser.setHandler(this);parser.parseTransform(transform)}else{this.transform=transform}};Shape.prototype.draw=function(renderer){throw new Error("subclasses must override the Shape.draw method")};Shape.prototype.matrix=function(a,b,c,d,e,f){this.transform.addTransform(new MatrixTransform(a,b,c,d,e,f))};Shape.prototype.translate=function(offsetX,offsetY){offsetY=offsetY||offsetX;this.transform.addTransform(new TranslateTransform(offsetX,offsetY))};Shape.prototype.scale=function(scaleX,scaleY){scaleY=scaleY||scaleX;this.transform.addTransform(new ScaleTransform(offsetX,offsetY))};Shape.prototype.rotate=function(angle,originX,originY){originX=originX||0;originY=originY||0;this.transform.addTransform(new RotateTransform(angle,new Point(originX,originY)))};Shape.prototype.skewX=function(angle){throw new Error("not implemented")};Shape.prototype.skewY=function(angle){throw new Error("not implemented")};function Path(pathData){this.superclass.call(this);this._pathData=pathData}Path.prototype=new Shape();Path.prototype.constructor=Path;Path.prototype.superclass=Shape;Path.prototype.draw=function(renderer){if(this.fill!==null||(this.stroke!==null&&this.strokeWidth!==0)){if(this.fill!==null){renderer.setFillColor(this.fill)}if(this.stroke!==null&&this.strokeWidth!==0){renderer.setStrokeColor(this.stroke);renderer.setStrokeWidth(this.strokeWidth)}if(this.strokeOpacity!==null&&this.strokeOpacity>=0){renderer.setStrokeOpacity(this.strokeOpacity)}if(this.strokeJoin!==null){renderer.setStrokeJoin(this.strokeJoin)}if(this.strokeCap!==null){renderer.setStrokeCap(this.strokeCap)}if(this.strokeDash!==null){renderer.setStrokeDash(this.strokeDash)}if(this.offset!==null){renderer.setOffset(this.offset)}if(this.dimension!==null){renderer.setDimension(this.dimension)}if(this.onclick!==null){renderer.setOnClick(this.onclick)}if(this.onmouseover!==null){renderer.setOnMouseOver(this.onmouseover)}if(this.onmouseout!==null){renderer.setOnMouseOut(this.onmouseout)}if(this.hasTransform()){renderer.pushTransform(this.transform)}renderer.setSelectable(this.selectable);renderer.renderPathData(this._pathData);if(this.hasTransform()){renderer.popTransform()}}};function Rectangle(x,y,width,height,rx,ry){this.superclass.call(this);this._x=x;this._y=y;this._width=width;this._height=height;this._rx=rx||0;this._ry=ry||0}Rectangle.prototype=new Shape();Rectangle.prototype.constructor=Path;Rectangle.prototype.superclass=Shape;Rectangle.prototype.draw=function(renderer){if(this.fill!=null||(this.stroke!=null&&this.strokeWidth!=0)){renderer.beginRender();if(this.fill!=null){renderer.setFillColor(this.fill)}if(this.stroke!=null&&this.strokeWidth!=0){renderer.setStrokeColor(this.stroke);renderer.setStrokeWidth(this.strokeWidth)}if(this._rx==0&&this._ry==0){renderer.movetoAbs(this._x,this._y);renderer.linetoAbs(this._x+this._width,this._y);renderer.linetoAbs(this._x+this._width,this._y+this._height);renderer.linetoAbs(this._x,this._y+this._height);renderer.closePath()}else{var x=this._x;var y=this._y;var w=this._width;var h=this._height;var r=x+w;var b=y+h;var rx=this._rx;var ry=this._ry;renderer.movetoAbs(x,y+ry);renderer.linetoAbs(x,b-ry);renderer.curvetoQuadraticAbs(x,b,x+rx,b);renderer.linetoAbs(r-rx,b);renderer.curvetoQuadraticAbs(r,b,r,b-ry);renderer.linetoAbs(r,y+ry);renderer.curvetoQuadraticAbs(r,y,r-rx,y);renderer.linetoAbs(x+rx,y);renderer.curvetoQuadraticAbs(x,y,x,y+ry)}renderer.endRender()}};function PathRenderer(bridge){this.bridge=bridge;this._transformStack=[];this._flatness=5;this._firstX;this._firstY;this._lastX=0;this._lastY=0;this._lastCommand;this._lastHandleX;this._lastHandleY}PathRenderer.prototype._hasMethod=function(methodName){return(this.bridge!=null&&this.bridge[methodName]!=null)};PathRenderer.prototype._invoke=function(methodName){if(this._hasMethod(methodName)){if(arguments.length>2){throw new Error("PathRenderer._invoke only supports one or two arguments")}if(arguments.length==1){this.bridge[methodName]()}else{this.bridge[methodName](arguments[1])}}};PathRenderer.prototype.beginRender=function(){this._firstX;this._firstY;this._lastX=0;this._lastY=0;this._lastCommand;this._lastHandleX;this._lastHandleY;this._invoke("beginRender")};PathRenderer.prototype.endRender=function(){this._invoke("endRender")};PathRenderer.prototype.clear=function(){this._invoke("clear")};PathRenderer.prototype.popTransform=function(){if(this._transformStack.length==0){throw new Error("tried to pop an element off of an empty transform stack")}if(this._hasMethod("popTransform")){this._invoke("popTransform")}};PathRenderer.prototype.pushTransform=function(transform){this._transformStack.push(transform);if(this._hasMethod("pushTransform")){this._invoke("pushTransform",transform)}};PathRenderer.prototype.renderPathData=function(pathData){var renderer=this.bridge;if(renderer!=null){if(this._hasMethod("renderPathData")){renderer.renderPathData(pathData)}else{this.beginRender();if(this._pathParser==null){this._pathParser=new PathParser();this._pathParser.setHandler(this)}this._pathParser.parseData(pathData);this.endRender()}}};PathRenderer.prototype.setFillColor=function(fill){this._invoke("setFillColor",fill)};PathRenderer.prototype.setStrokeColor=function(stroke){this._invoke("setStrokeColor",stroke)};PathRenderer.prototype.setStrokeWidth=function(strokeWidth){this._invoke("setStrokeWidth",strokeWidth)};PathRenderer.prototype.setStrokeOpacity=function(strokeOpacity){this._invoke("setStrokeOpacity",strokeOpacity)};PathRenderer.prototype.setStrokeJoin=function(strokeJoin){this._invoke("setStrokeJoin",strokeJoin)};PathRenderer.prototype.setStrokeCap=function(strokeCap){this._invoke("setStrokeCap",strokeCap)};PathRenderer.prototype.setStrokeDash=function(strokeDash){this._invoke("setStrokeDash",strokeDash)};PathRenderer.prototype.setOffset=function(offset){this._invoke("setOffset",offset)};PathRenderer.prototype.setDimension=function(dimension){this._invoke("setDimension",dimension)};PathRenderer.prototype.setSelectable=function(selectable){this._invoke("setSelectable",selectable)};PathRenderer.prototype.setOnClick=function(handler){this._invoke("setOnClick",handler)};PathRenderer.prototype.setOnMouseOver=function(handler){this._invoke("setOnMouseOver",handler)};PathRenderer.prototype.setOnMouseOut=function(handler){this._invoke("setOnMouseOut",handler)};PathRenderer.prototype.arcAbs=function(rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y){var renderer=this.bridge;if(renderer!=null&&(this._lastX!=x||this._lastY!=y)){if(this._hasMethod("arcTo")){renderer.arcTo(rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y)}else{var cx,cy;var startAngle,sweepAngle,endAngle;if(rx!=0||ry!=0){var halfDx=(this._lastX-x)*0.5;var halfDy=(this._lastY-y)*0.5;var radians=xAxisRotation*Math.PI/180;var cos=Math.cos(radians);var sin=Math.sin(radians);var x1p=halfDx*cos+halfDy*sin;var y1p=halfDx*-sin+halfDy*cos;var x1px1p=x1p*x1p;var y1py1p=y1p*y1p;var lambda=(x1px1p/(rx*rx))+(y1py1p/(ry*ry));if(lambda>1){var factor=Math.sqrt(lambda);rx*=factor;ry*=factor}var rxrx=rx*rx;var ryry=ry*ry;var rxrxryry=rxrx*ryry;var rxrxy1py1p=rxrx*y1py1p;var ryryx1px1p=ryry*x1px1p;var numerator=rxrxryry-rxrxy1py1p-ryryx1px1p;var s;if(numerator<1e-06){s=0}else{s=Math.sqrt(numerator/(rxrxy1py1p+ryryx1px1p))}if(largeArcFlag==sweepFlag){s=-s}var cxp=s*rx*y1p/ry;var cyp=s*-ry*x1p/rx;cx=cxp*cos-cyp*sin+(this._lastX+x)*0.5;cy=cxp*sin+cyp*cos+(this._lastY+y)*0.5;var u=new Vector(1,0);var v=new Vector((x1p-cxp),(y1p-cyp));var w=new Vector((-x1p-cxp),(-y1p-cyp));startAngle=u.angleBetween(v);sweepAngle=v.angleBetween(w);if(!sweepFlag&&sweepAngle>0){sweepAngle-=360}else{if(sweepFlag&&sweepAngle<0){sweepAngle+=360}}endAngle=startAngle+sweepAngle}if(this._hasMethod("quadraticCurveTo")){if(startAngle!=endAngle){var sign=(sweepAngle>0)?1:-1;var incr=sign*45;var steps=sign*Math.floor(sweepAngle/45);var start=startAngle*Math.PI/180;for(var i=0;i<steps;i++){var end=(startAngle+incr)*Math.PI/180;var startX=rx*Math.cos(start)+cx;var startY=ry*Math.sin(start)+cy;var endX=rx*Math.cos(end)+cx;var endY=ry*Math.sin(end)+cy;var halfAngle=(start+end)*0.5;var midX=rx*Math.cos(halfAngle)+cx;var midY=ry*Math.sin(halfAngle)+cy;var controlX=2*(midX-0.25*startX-0.25*endX);var controlY=2*(midY-0.25*startY-0.25*endY);renderer.quadraticCurveTo(controlX,controlY,endX,endY);startAngle+=incr;start=end}if(startAngle!=endAngle){var end=endAngle*Math.PI/180;var startX=rx*Math.cos(start)+cx;var startY=ry*Math.sin(start)+cy;var endX=rx*Math.cos(end)+cx;var endY=ry*Math.sin(end)+cy;var halfAngle=(start+end)*0.5;var midX=rx*Math.cos(halfAngle)+cx;var midY=ry*Math.sin(halfAngle)+cy;var controlX=2*(midX-0.25*startX-0.25*endX);var controlY=2*(midY-0.25*startY-0.25*endY);renderer.quadraticCurveTo(controlX,controlY,endX,endY)}}}else{if(this._hasMethod("lineTo")){var flatness=this._flatness;var radPerDeg=Math.PI/180;var startDegree=startAngle*radPerDeg;var endDegree=endAngle*radPerDeg;function pointAtAngle(angle){return new Point(cx+Math.cos(angle)*rx,cy+Math.sin(angle)*ry)}function plotInterior(start,end){var mid=(start+end)*0.5;var startPoint=pointAtAngle(start);var midPoint=pointAtAngle(mid);var endPoint=pointAtAngle(end);var v1=Vector.fromPoints(startPoint,midPoint);var v2=Vector.fromPoints(startPoint,endPoint);var perp=v1.perpendicular(v2);var dmax=perp.length();if(dmax>flatness){plotInterior(start,mid);renderer.lineTo(midPoint.x,midPoint.y);plotInterior(mid,end)}else{renderer.lineTo(midPoint.x,midPoint.y)}}var firstPoint=pointAtAngle(startDegree);renderer.lineTo(firstPoint.x,firstPoint.y);plotInterior(startDegree,endDegree);var lastPoint=pointAtAngle(endDegree);renderer.lineTo(lastPoint.x,lastPoint.y)}}}}this._lastX=x;this._lastY=y;this._lastCommand="A"};PathRenderer.prototype.arcRel=function(rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y){this.arcAbs(rx,ry,xAxisRotation,largeArcFlag,sweepFlag,this._lastX+x,this._lastY+y)};PathRenderer.prototype.curvetoCubicAbs=function(x1,y1,x2,y2,x,y){var renderer=this.bridge;if(renderer!=null){if(this._hasMethod("curveTo")){renderer.curveTo(x1,y1,x2,y2,x,y)}else{if(this._hasMethod("quadraticCurveTo")){var ab8X=(x1-this._lastX)*0.125;var ab8Y=(y1-this._lastY)*0.125;var dc8X=(x-x2)*0.125;var dc8Y=(y-y2)*0.125;var eX=this._lastX+ab8X*4;var eY=this._lastY+ab8Y*4;var fX=(x2-x1)*0.5+x1;var fY=(y2-y1)*0.5+y1;var gX=x2+dc8X*4;var gY=y2+dc8Y*4;var hX=(fX-eX)*0.5+eX;var hY=(fY-eY)*0.5+eY;var iX=(gX-fX)*0.5+fX;var iY=(gY-fY)*0.5+fY;var hi8X=(iX-hX)*0.125;var hi8Y=(iY-hY)*0.125;var c0x=this._lastX+ab8X*3;var c0y=this._lastY+ab8Y*3;var c1x=hX+hi8X;var c1y=hY+hi8Y;var a0x=(c1x-c0x)*0.5+c0x;var a0y=(c1y-c0y)*0.5+c0y;var a1x=hX+hi8X*4;var a1y=hY+hi8Y*4;var c2x=hX+hi8X*7;var c2y=hY+hi8Y*7;var c3x=gX+dc8X;var c3y=gY+dc8Y;var a2x=(c3x-c2x)*0.5+c2x;var a2y=(c3y-c2y)*0.5+c2y;renderer.quadraticCurveTo(c0x,c0y,a0x,a0y);renderer.quadraticCurveTo(c1x,c1y,a1x,a1y);renderer.quadraticCurveTo(c2x,c2y,a2x,a2y);renderer.quadraticCurveTo(c3x,c3y,x,y)}else{if(this._hasMethod("lineTo")){var flatness=this._flatness;function plotInterior(p1,p2,p3,p4){var p5=p1.midpoint(p2);var p6=p2.midpoint(p3);var p7=p3.midpoint(p4);var p8=p5.midpoint(p6);var p9=p6.midpoint(p7);var p10=p8.midpoint(p9);var baseline=Vector.fromPoints(p1,p4);var tangent1=Vector.fromPoints(p1,p2);var tangent2=Vector.fromPoints(p4,p3);var dmax=0;if(tangent1.isZeroVector()==false){var perpendicular=baseline.perpendicular(tangent1);dmax=perpendicular.length()}if(tangent2.isZeroVector()==false){var perpendicular=baseline.perpendicular(tangent2);dmax=Math.max(dmax,perpendicular.length())}if(dmax>flatness){plotInterior(p1,p5,p8,p10);renderer.lineTo(p10.x,p10.y);plotInterior(p10,p9,p7,p4)}else{renderer.lineTo(p10.x,p10.y)}}plotInterior(new Point(this._lastX,this._lastY),new Point(x1,y1),new Point(x2,y2),new Point(x,y));renderer.lineTo(x,y)}}}}this._lastX=x;this._lastY=y;this._lastCommand="C";this._lastHandleX=x2;this._lastHandleY=y2};PathRenderer.prototype.curvetoCubicRel=function(x1,y1,x2,y2,x,y){this.curvetoCubicAbs(this._lastX+x1,this._lastY+y1,this._lastX+x2,this._lastY+y2,this._lastX+x,this._lastY+y)};PathRenderer.prototype.linetoHorizontalAbs=function(x){this.linetoAbs(x,this._lastY)};PathRenderer.prototype.linetoHorizontalRel=function(x){this.linetoAbs(this._lastX+x,this._lastY)};PathRenderer.prototype.linetoAbs=function(x,y){if(this.bridge!=null){if(this._hasMethod("lineTo")){this.bridge.lineTo(x,y)}}this._lastX=x;this._lastY=y;this._lastCommand="L"};PathRenderer.prototype.linetoRel=function(x,y){this.linetoAbs(this._lastX+x,this._lastY+y)};PathRenderer.prototype.movetoAbs=function(x,y){if(this.bridge!=null){if(this._hasMethod("moveTo")){this.bridge.moveTo(x,y)}}this._firstX=x;this._firstY=y;this._lastX=x;this._lastY=y;this._lastCommand="M"};PathRenderer.prototype.movetoRel=function(x,y){this.movetoAbs(this._lastX+x,this._lastY+y)};PathRenderer.prototype.curvetoQuadraticAbs=function(x1,y1,x,y){var renderer=this.bridge;if(renderer!=null){if(this._hasMethod("quadraticCurveTo")){renderer.quadraticCurveTo(x1,y1,x,y)}else{if(this._hasMethod("curveTo")){var c1x=this._lastX+(x1-this._lastX)*2/3;var c1y=this._lastY+(y1-this._lastY)*2/3;var c2x=x1+(x-x1)/3;var c2y=y1+(y-y1)/3;renderer.curveTo(c1x,c1y,c2x,c2y,x,y)}else{if(this._hasMethod("lineTo")){var flatness=this._flatness;function plotInterior(p1,p2,p3){var p4=p1.midpoint(p2);var p5=p2.midpoint(p3);var p6=p4.midpoint(p5);var baseline=Vector.fromPoints(p1,p3);var tangent=Vector.fromPoints(p1,p2);var dmax=0;if(tangent.isZeroVector()==false){var perpendicular=baseline.perpendicular(tangent);dmax=perpendicular.length()}if(dmax>flatness){plotInterior(p1,p4,p6);renderer.lineTo(p6.x,p6.y);plotInterior(p6,p5,p3)}else{renderer.lineTo(p6.x,p6.y)}}plotInterior(new Point(this._lastX,this._lastY),new Point(x1,y1),new Point(x,y));renderer.lineTo(x,y)}}}}this._lastX=x;this._lastY=y;this._lastCommand="Q";this._lastHandleX=x1;this._lastHandleY=y1};PathRenderer.prototype.curvetoQuadraticRel=function(x1,y1,x,y){this.curvetoQuadraticAbs(this._lastX+x1,this._lastY+y1,this._lastX+x,this._lastY+y)};PathRenderer.prototype.curvetoCubicSmoothAbs=function(x2,y2,x,y){var x1,y1;if(this._lastCommand=="C"){x1=this._lastX+(this._lastX-this._lastHandleX);y1=this._lastY+(this._lastY-this._lastHandleY)}else{x1=this._lastX;y1=this._lastY}this.curvetoCubicAbs(x1,y1,x2,y2,x,y)};PathRenderer.prototype.curvetoCubicSmoothRel=function(x2,y2,x,y){this.curvetoCubicSmoothAbs(this._lastX+x2,this._lastY+y2,this._lastX+x,this._lastY+y)};PathRenderer.prototype.curvetoQuadraticSmoothAbs=function(x,y){var x1,y1;if(this._lastCommand=="Q"){x1=this._lastX+(this._lastX-this._lastHandleX);y1=this._lastY+(this._lastY-this._lastHandleY)}else{x1=this._lastX;y1=this._lastY}this.curvetoQuadraticAbs(x1,y1,x,y)};PathRenderer.prototype.curvetoQuadraticSmoothRel=function(x,y){this.curvetoQuadraticSmoothAbs(this._lastX+x,this._lastY+y)};PathRenderer.prototype.linetoVerticalAbs=function(y){this.linetoAbs(this._lastX,y)};PathRenderer.prototype.linetoVerticalRel=function(y){this.linetoAbs(this._lastX,this._lastY+y)};PathRenderer.prototype.closePath=function(){this._invoke("close");this._lastX=this._firstX;this._lastY=this._firstY;this._lastCommand="Z"};function SVGBridge(elm){this._canvas=(typeof(elm)==="string"?document.getElementById(elm):elm);this._svgRoot=document.createElementNS(SVGBridge.svgns,"svg");this._canvas.appendChild(this._svgRoot);this._fill=null;this._stroke=null;this._strokeWidth=null;this._strokeOpacity=null;this._strokeJoin=null;this._strokeCap=null;this._strokeDash=null;this._offset=null;this._dimension=null;this._selectable=false;this._transform=null;this._pathData=null;this._onclick=null;this._onmouseover=null;this._onmouseout=null}SVGBridge.svgns="http://www.w3.org/2000/svg";SVGBridge.prototype._addCommand=function(command,args){var argArray=[];var sameCommand=(command==this._lastCommand);var impliedLine=(this._lastCommand=="M"&&command=="L");for(var i=0;i<args.length;i++){argArray[i]=args[i]}if(sameCommand||impliedLine){this._pathData.push(argArray.join(","))}else{this._pathData.push(command+argArray.join(","))}};SVGBridge.isSupported=function(){var result=false;if(document.createElementNS){var svg=document.createElementNS(SVGBridge.svgns,"svg");result=(svg.x!=null)}return result};SVGBridge.prototype.clear=function(){var child;var svgRoot=this._svgRoot;if(svgRoot){child=svgRoot.firstChild;while(child){child.onclick=null;child.onmouseup=null;child.onmousedown=null;child.onmouseover=null;child.onmouseout=null;child=child.nextSibling}svgRoot.parentNode.removeChild(svgRoot);this._svgRoot=null}};SVGBridge.prototype.beginRender=function(){this._pathData=[]};SVGBridge.prototype.endRender=function(){var pathData=this._pathData.join(" ");this.renderPathData(pathData)};SVGBridge.prototype.popTransform=function(){this._transform=null};SVGBridge.prototype.pushTransform=function(transform){this._transform=transform};SVGBridge.prototype.setFillColor=function(fill){this._fill=fill};SVGBridge.prototype.setStrokeColor=function(stroke){this._stroke=stroke};SVGBridge.prototype.setStrokeWidth=function(width){this._strokeWidth=width};SVGBridge.prototype.setStrokeOpacity=function(opacity){this._strokeOpacity=opacity};SVGBridge.prototype.setStrokeJoin=function(join){this._strokeJoin=join};SVGBridge.prototype.setStrokeCap=function(cap){this._strokeCap=cap};SVGBridge.prototype.setStrokeDash=function(dash){this._strokeDash=dash};SVGBridge.prototype.setOffset=function(offset){this._offset=offset};SVGBridge.prototype.setDimension=function(dimension){this._dimension=dimension};SVGBridge.prototype.setSelectable=function(selectable){this._selectable=selectable};SVGBridge.prototype.setOnClick=function(handler){this._onclick=handler};SVGBridge.prototype.setOnMouseOver=function(handler){this._onmouseover=handler};SVGBridge.prototype.setOnMouseOut=function(handler){this._onmouseout=handler};SVGBridge.prototype.renderPathData=function(pathData){var path;var svgRoot;var frag;if(this._fill!==null||(this._stroke!==null&&this._strokeWidth>0)){if(!this._svgRoot){frag=document.createDocumentFragment();svgRoot=document.createElementNS(SVGBridge.svgns,"svg");svgRoot.setAttributeNS(null,"version","1.1");svgRoot.setAttributeNS(null,"overflow","visible");this._svgRoot=svgRoot;frag.appendChild(svgRoot)}else{svgRoot=this._svgRoot;path=svgRoot.firstChild}if(!path){path=document.createElementNS(SVGBridge.svgns,"path");svgRoot.appendChild(path)}path.setAttributeNS(null,"d",pathData);if(!this._selectable&&!this._svgRoot.onmousedown){svgRoot.onmousedown=function(){return false}}else{if(this._selectable){svgRoot.onmousedown=null}}if(this._onclick){path.style.cursor="pointer";path.onclick=this._onclick;path.onmouseup=nmev.stopBubbling;path.onmousedown=nmev.stopBubbling}path.onmouseover=this._onmouseover;path.onmouseout=this._onmouseout;if(this._offset!==null&&this._dimension!==null){nms.css(svgRoot,{position:"absolute",left:this._offset.x+"px",top:this._offset.y+"px","z-index":"1000"},true);svgRoot.setAttributeNS(null,"width",this._dimension.x+"px");svgRoot.setAttributeNS(null,"height",this._dimension.y+"px");svgRoot.setAttributeNS(null,"viewBox",this._offset.x+" "+this._offset.y+" "+this._dimension.x+" "+this._dimension.y)}if(this._stroke!==null&&this._strokeWidth>0){var strokeValue;if(this._strokeDash!==null){path.setAttributeNS(null,"stroke-dasharray",this._strokeDash)}if(this._strokeJoin!==null){path.setAttributeNS(null,"stroke-linejoin",this._strokeJoin)}if(this._strokeCap!==null){path.setAttributeNS(null,"stroke-linecap",this._strokeCap)}if(this._stroke.constructor===Color){strokeValue=this._stroke.toHex()}else{strokeValue=this._stroke}path.setAttributeNS(null,"stroke",strokeValue);if(this._strokeOpacity!==null&&this._strokeOpacity>=0){path.setAttributeNS(null,"stroke-opacity",this._strokeOpacity)}path.setAttributeNS(null,"stroke-width",this._strokeWidth)}if(this._fill!==null){var fillValue;if(this._fill.constructor===Color){fillValue=this._fill.toHex()}else{fillValue=this._fill}path.setAttributeNS(null,"fill",fillValue)}else{path.setAttributeNS(null,"fill","none")}if(this._transform!==null){var transform=this._transform.getTransformText();path.setAttributeNS(null,"transform",transform)}if(frag){this._canvas.appendChild(svgRoot)}}};SVGBridge.prototype.arcTo=function(rx,ry,xAxisRotation,largeArcFlag,sweepFlag,x,y){this._addCommand("A",arguments)};SVGBridge.prototype.curveTo=function(x1,y1,x2,y2,x,y){this._addCommand("C",arguments)};SVGBridge.prototype.lineTo=function(x,y){this._addCommand("L",arguments)};SVGBridge.prototype.moveTo=function(x,y){this._addCommand("M",arguments)};SVGBridge.prototype.quadraticCurveTo=function(x1,y1,x,y){this._addCommand("Q",arguments)};SVGBridge.prototype.close=function(){this._addCommand("z",arguments)};function VMLBridge(elm){var style;this._parent=(typeof(elm)==="string"?document.getElementById(elm):elm);this._shape=null;this._fill=null;this._stroke=null;this._strokeWidth=null;this._strokeOpacity=null;this._strokeJoin=null;this._strokeCap=null;this._strokeDash=null;this._offset=null;this._dimension=null;this._selectable=false;this._pathData=null;this._onclick=null;this._onmouseover=null;this._onmouseout=null;if(!VMLBridge.initialized){document.namespaces.add("v","urn:schemas-microsoft-com:vml");style=document.createStyleSheet();style.addRule("v\\:shape","behavior: url(#default#VML);");style.addRule("v\\:rect","behavior: url(#default#VML);");style.addRule("v\\:oval","behavior: url(#default#VML);");style.addRule("v\\:fill","behavior: url(#default#VML);");style.addRule("v\\:stroke","behavior: url(#default#VML);");style.addRule("v\\:imagedata","behavior: url(#default#VML);");style.addRule("v\\:group","behavior: url(#default#VML);");style.addRule("v\\:textbox","behavior: url(#default#VML);");VMLBridge.initialized=true}}VMLBridge.initialized=false;VMLBridge.isSupported=function(){var ie=navigator.appVersion.match(/MSIE (\d\.\d)/);return(ie&&ie[1]>=6)};VMLBridge.prototype.clear=function(){var shape=this._shape;if(shape){shape.onclick=null;shape.onmouseup=null;shape.onmousedown=null;shape.onmouseover=null;shape.onmouseout=null;shape.parentNode.removeChild(shape);this._shape=null}};VMLBridge.prototype.beginRender=function(){this._pathData=[]};VMLBridge.prototype.endRender=function(){if(this._fill!==null||(this._stroke!==null&&this._strokeWidth>0)){var shape=document.createElement("v:shape");var style=shape.style;var pathData=this._pathData.join(" ");style.position="absolute";style.width=1;style.height=1;shape.setAttribute("coordsize","1,1");shape.setAttribute("path",pathData);if(this._offset!==null){style.left=this._offset.x+"px";style.top=this._offset.y+"px";shape.setAttribute("coordorigin",this._offset.toString())}else{style.left="0px";style.top="0px";shape.setAttribute("coordorigin","0,0")}if(!this._selectable){shape.setAttribute("unselectable","on")}if(this._fill!==null){var fill=document.createElement("v:fill");if(this._fill!==null){if(this._fill.constructor===Color){fill.setAttribute("color",this._fill.toHex())}else{fill.setAttribute("color",this._fill)}}else{fill.setAttribute("on",false)}shape.appendChild(fill)}else{shape.setAttribute("filled","f")}if(this._stroke!==null){var stroke=document.createElement("v:stroke");if(this._stroke!==null&&this._strokeWidth>0){if(this._stroke.constructor===Color){stroke.setAttribute("color",this._stroke.toHex())}else{stroke.setAttribute("color",this._stroke)}stroke.setAttribute("weight",this._strokeWidth+"px")}else{stroke.setAttribute("on",false)}if(this._strokeOpacity>=0&&this._strokeOpacity<=1){stroke.setAttribute("opacity",this._strokeOpacity)}if(this._strokeJoin!==null){stroke.setAttribute("joinstyle",this._strokeJoin)}if(this._strokeCap!==null){stroke.setAttribute("endcap",this._strokeCap)}if(this._strokeDash!==null){stroke.setAttribute("dashstyle","dash")}shape.appendChild(stroke)}if(this._onclick){shape.style.cursor="pointer";shape.onclick=this._onclick;shape.onmouseup=nmev.stopBubbling;shape.onmousedown=nmev.stopBubbling}shape.onmouseover=this._onmouseover;shape.onmouseout=this._onmouseout;if(this._shape){this._parent.replaceChild(shape,this._shape)}else{this._parent.appendChild(shape)}this._shape=shape}};VMLBridge.prototype.setFillColor=function(fill){this._fill=fill};VMLBridge.prototype.setStrokeColor=function(stroke){this._stroke=stroke};VMLBridge.prototype.setStrokeWidth=function(width){this._strokeWidth=width};VMLBridge.prototype.setStrokeOpacity=function(opacity){this._strokeOpacity=opacity};VMLBridge.prototype.setStrokeJoin=function(join){this._strokeJoin=join};VMLBridge.prototype.setStrokeCap=function(cap){this._strokeCap=cap};VMLBridge.prototype.setStrokeDash=function(dash){this._strokeDash=dash};VMLBridge.prototype.setOffset=function(offset){this._offset=offset};VMLBridge.prototype.setDimension=function(dimension){this._dimension=dimension};VMLBridge.prototype.setSelectable=function(selectable){this._selectable=selectable};VMLBridge.prototype.setOnClick=function(handler){this._onclick=handler};VMLBridge.prototype.setOnMouseOver=function(handler){this._onmouseover=handler};VMLBridge.prototype.setOnMouseOut=function(handler){this._onmouseout=handler};VMLBridge.prototype.moveTo=function(x,y){x=Math.round(x);y=Math.round(y);this._pathData.push("m"+x+","+y)};VMLBridge.prototype.lineTo=function(x,y){x=Math.round(x);y=Math.round(y);this._pathData.push("l"+x+","+y)};VMLBridge.prototype.close=function(){};VMLBridge.prototype.curveTo=function(x1,y1,x2,y2,x,y){x1=Math.round(x1);y1=Math.round(y1);x2=Math.round(x2);y2=Math.round(y2);x=Math.round(x);y=Math.round(y);this._pathData.push("c"+[x1,y1,x2,y2,x,y].join(","))};if(SVGBridge.isSupported()){_IRenderer=SVGBridge;_isSupported=true}else{if(VMLBridge.isSupported()){_IRenderer=VMLBridge;_isSupported=true}}function createRenderer(elm){return _isSupported?new PathRenderer(new _IRenderer(elm)):null}nmlp.createRenderer=createRenderer;nmlp.Point=Point;nmlp.Group=Group;nmlp.Path=Path})();(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,htmlEncode){var len=qstr.length;var hasQMark=/\?/.test(host);var params="";for(var i=0;i<len;i++){if(!hasQMark){host+="?"+qstr[i];hasQMark=true}else{host+="&"+qstr[i]}}if(htmlEncode){host=host.replace(/&/g,"&amp;")}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 nms=nearmap.style;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};Cookie.showCookiesRequired=function(elm){var wrap=(typeof(elm)==="string"?document.getElementById(elm):elm);var frag=document.createDocumentFragment();var writeup=document.createElement("div");var mainHeader=document.createElement("h1");var mediumcolumn=document.createElement("div");var highlight=document.createElement("div");var reason=document.createElement("p");var helpList=document.createElement("ul");var oops=document.createElement("span");var enableCookiesItem=document.createElement("li");var browserRequirementsItem=document.createElement("li");var helpCenterItem=document.createElement("li");var enableCookiesLink=document.createElement("a");var browserRequirementsLink=document.createElement("a");var helpCenterLink=document.createElement("a");writeup.id="writeup";enableCookiesLink.href="help/why-cookies-and-how-to-enable-cookies.aspx";browserRequirementsLink.href="help/browser-requirements.aspx";helpCenterLink.href="help/";oops.className="doublesized italicstext";mediumcolumn.className="mediumcolumn";highlight.className="highlight";reason.className="italicstext emphasis";oops.innerHTML="Oops, why am I here?";reason.innerHTML="You are here because the map page requires that you enable cookies. We use cookies to help us remember your last map location, so that you can carry on where you left off. This saves you having to pan and zoom unnecessarily as you can return to the exact same spot.";enableCookiesLink.innerHTML="How to enable cookies";browserRequirementsLink.innerHTML="Browser requirements";helpCenterLink.innerHTML="Click here to visit the Help Centre";frag.appendChild(writeup);writeup.appendChild(mainHeader);writeup.appendChild(mediumcolumn);mediumcolumn.appendChild(highlight);highlight.appendChild(reason);highlight.appendChild(helpList);mainHeader.appendChild(oops);helpList.appendChild(enableCookiesItem);helpList.appendChild(browserRequirementsItem);helpList.appendChild(helpCenterItem);enableCookiesItem.appendChild(enableCookiesLink);browserRequirementsItem.appendChild(browserRequirementsLink);helpCenterItem.appendChild(helpCenterLink);wrap.appendChild(frag);wrap.style.display="block"};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=100/2.54;nmm.API_VERSION="0.3";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.PRINT_MODE_KEY="pw";nmm.ACCEPTED_KEY="a";nmm.LICENCE_KEY="l";nmm.SEARCH_QUERY_KEY="q";nmm.DEFAULT_ZOOM=3;nmm.DBL_CLICK_TIMEOUT=200;nmm.DEFAULT_TILE_SIZE=256;nmm.SESSION_COOKIE_EXPIRES=300000;nmm.SESSION_COOKIE_CHECK_BEFORE=60000;nmm.STREETMAP_GENERATION=1;nmm.PHOTOMAP_GENERATION=0;nmm.TERRAINMAP_GENERATION=0;nmm.NO_PRINT="nmnoprint";nmm.SHOW_PRINT="nmshowprint";nmm.NEARMAP_COM_URL="http://www.nearmap.com";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 nearmap=window.nearmap;var nmm=window.nearmap.maps;var nml=nearmap.lib;function Point(x,y){this.x=(typeof(x)==="number"?x:parseFloat(x));this.y=(typeof(y)==="number"?y:parseFloat(y))}Point.ORIGIN=new Point(0,0);Point.prototype.equals=function(pnt){return this.x===pnt.x&&this.y===pnt.y};Point.prototype.add=function(dx,dy){this.x+=dx;this.y+=dy};Point.prototype.toString=function(){return this.x+","+this.y};Point.prototype.copy=function(){return new Point(this.x,this.y)};function LatLng(lat,lng,unbounded){this._lat=(typeof(lat)==="number"?lat:parseFloat(lat));this._lng=(typeof(lng)==="number"?lng:parseFloat(lng));if(!unbounded){if(this._lat<-90){this._lat=((this._lat+90)%180)+90}else{if(lat>90){this._lat=((this._lat-90)%180)-90}}if(this._lng<-180){this._lng=((this._lng+180)%360)+180}else{if(this._lng>180){this._lng=((this._lng-180)%360)-180}}}}LatLng.prototype.lat=function(){return this._lat};LatLng.prototype.lng=function(){return this._lng};LatLng.prototype.haversine=function(other){var dLat=(other.latRadians()-this.latRadians());var dLon=(other.lngRadians()-this.lngRadians());var a=(Math.sin(dLat/2)*Math.sin(dLat/2))+(Math.cos(this.latRadians())*Math.cos(other.latRadians())*Math.sin(dLon/2)*Math.sin(dLon/2));var c=2*Math.atan2(Math.sqrt(a),Math.sqrt(1-a));return c};LatLng.prototype.distanceFrom=function(other,radius){return this.haversine(other)*(radius||6378137)};LatLng.prototype.initialBearing=function(other){var dLon=other.lngRadians()-this.lngRadians();var y=Math.sin(dLon)*Math.cos(other.latRadians());var x=(Math.cos(this.latRadians())*Math.sin(other.latRadians()))-(Math.sin(this.latRadians())*Math.cos(other.latRadians())*Math.cos(dLon));return Math.atan2(y,x)/nml.DEGREE_TO_RADIAN};LatLng.prototype.toString=function(precision,hideWrapper){var leftWrap;var rightWrap;var lat;var lng;if(typeof(precision)==="number"){lat=this._lat.toFixed(precision);lng=this._lng.toFixed(precision)}else{lat=this._lat;lng=this._lng}if(hideWrapper){leftWrap="";rightWrap=""}else{leftWrap="(";rightWrap=")"}return leftWrap+lat+","+lng+rightWrap};LatLng.prototype.copy=function(unbounded){return new LatLng(this.lat(),this.lng(),unbounded)};LatLng.prototype.latRadians=function(){return this.lat()*nml.DEGREE_TO_RADIAN};LatLng.prototype.lngRadians=function(){return this.lng()*nml.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._sw=null;this._ne=null;this.extend(sw);this.extend(ne)}LatLngBounds.prototype.copy=function(){return new LatLngBounds(this.getSouthWest(),this.getNorthEast())};LatLngBounds.prototype.getSouthWest=function(){return this._sw};LatLngBounds.prototype.getNorthEast=function(){return this._ne};LatLngBounds.prototype.extend=function(latlng){var ne;var sw;var nelat;var nelng;var swlat;var swlng;if(!latlng||!(latlng instanceof LatLng)){return}if(!this._sw&&!this._ne){this._sw=latlng.copy(true);this._ne=latlng.copy(true)}else{sw=this._sw;ne=this._ne;this._sw=new LatLng(sw.lat()>latlng.lat()?latlng.lat():sw.lat(),sw.lng()>latlng.lng()?latlng.lng():sw.lng(),true);this._ne=new LatLng(ne.lat()<latlng.lat()?latlng.lat():ne.lat(),ne.lng()<latlng.lng()?latlng.lng():ne.lng(),true)}};LatLngBounds.prototype.toString=function(){return"("+(this._sw?this._sw.toString():"()")+", "+(this._ne?this._ne.toString():"()")+")"};LatLngBounds.prototype.equals=function(other){var thisEmpty=this.isEmpty();var otherEmpty=other.isEmpty();var tsw;var tne;var osw;var one;if(thisEmpty&&otherEmpty){return true}if((thisEmpty&&!otherEmpty)||(!thisEmpty&&otherEmpty)){return false}tsw=this.getSouthWest();tne=this.getNorthEast();osw=other.getSouthWest();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;var fullLng;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(this.isEmpty()){return false}fullLat=this.isFullLat();fullLng=this.isFullLng();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;var tne;var osw;var one;if(this.isEmpty()){return false}tsw=this.getSouthWest();tne=this.getNorthEast();osw=other.getSouthWest();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;var tne;var osw;var one;if(this.isEmpty()){return false}tsw=this.getSouthWest();tne=this.getNorthEast();osw=other.getSouthWest();one=other.getNorthEast();return this.containsLatLng(one)&&this.containsLatLng(osw)};LatLngBounds.prototype.toSpan=function(){var sw;var ne;if(this.isEmpty()){throw"LaLngBounds.toSpan() error: This instance of LatLngBounds has not been given an area yet. Use LatLngBounds.extend() first."}sw=this.getSouthWest();ne=this.getNorthEast();return new LatLng(ne.lat()-sw.lat(),ne.lng()-sw.lng(),true)};LatLngBounds.prototype.isFullLat=function(){var sw;var ne;if(this.isEmpty()){return false}sw=this.getSouthWest();ne=this.getNorthEast();return(sw.lat()===-90&&ne.lat()===90)};LatLngBounds.prototype.isFullLng=function(){var sw;var ne;if(this.isEmpty()){return false}sw=this.getSouthWest();ne=this.getNorthEast();return(sw.lng()===-180&&ne.lng()===180)};LatLngBounds.prototype.isEmpty=function(){return(!this.getSouthWest()||!this.getNorthEast())};LatLngBounds.prototype.getCenter=function(){var span;var sw;if(this.isEmpty()){return new LatLng(0,180)}span=this.toSpan();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 tSize=parseTileSize(tileSize);var scale;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 new nmm.Point(px,py)}function fromPrecisePixelToLatLng(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)}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 pixel=fromLatLngToPrecisePixel(latlng,zoom,tileSize);pixel.x=Math.round(pixel.x);pixel.y=Math.round(pixel.y);return pixel};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,PRINT:6};var PermalinkOptions={zoom:undefined,latlng:undefined,sspn:undefined,date:undefined,mapTypeKey:undefined};var SearchQueryOptions={rawQuery:undefined,markerLocation:undefined,near:undefined,g:undefined};function SearchQuery(query,opts){opts=nmo.Synchronize.fill(opts,SearchQueryOptions);this.query=query;this.rawQuery=opts.rawQuery;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,rawQuery:queryStr})}this.getZoom=function(){return Math.abs(parseInt(_qryStr[nmm.ZOOM_KEY],10))};this.getLatLng=function(){var latlngStr=_qryStr[nmm.LATLNG_KEY];var latlng;if(latlngStr){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 tileDateStr=_qryStr[nmm.TILE_DATE_KEY];if(tileDateStr){try{return nml.DateHelper.fromNearmapDateUTC(tileDateStr)}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((outputStr==="print"||_qryStr[nmm.PRINT_MODE_KEY])?MapOutput.PRINT: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";function MapCookie(cookie){this.getZoom=function(){return parseInt(cookie.getValue(nmm.ZOOM_KEY),10)};this.getLatLng=function(){var latlngStr=cookie.getValue(nmm.LATLNG_KEY);var latlng;if(latlngStr){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()}}}var LicenceType={PERSONAL:"PERSONAL",COMMERCIAL:"COMMERCIAL",GOVERNMENT:"GOVERNMENT"};function LicenceCookie(cookie){if(!cookie){cookie=nmh.Cookie.getCookie(licenceCookieName);if(!cookie){cookie=new nmh.Cookie(licenceCookieName);cookie.save()}}this._cookie=cookie}LicenceCookie.prototype.isAccepted=function(){var cookie=this._cookie;var licenceType=cookie.getValue(nmm.LICENCE_KEY);return((licenceType===LicenceType.PERSONAL||licenceType===LicenceType.COMMERCIAL||licenceType===LicenceType.GOVERNMENT)&&parseInt(cookie.getValue(nmm.ACCEPTED_KEY),10)===1)};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.MapCookie=new MapCookie();nmh.LicenceCookie=new LicenceCookie();nmh.TileSession=TileSession})();(function(){var window=this;var document=window.document;var nearmap=window.nearmap;var nmm=nearmap.maps;var nme=nearmap.memory;var nmo=nearmap.options;var nml=nearmap.lib;var nms=nearmap.style;var nmev=nearmap.event;var nmlm=nearmap.lib.math;var nmh=nearmap.http;var nmc=nearmap.client;var nmt=nearmap.threading;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),nodeStart:0,createUrlFunction:function(opts){opts=nmo.Synchronize.fill(opts,HostOptions);return function(tileCoords,zoom){var hostNum=((opts.nodes!==0)?((tileCoords.x&2)%opts.nodes):0)+opts.nodeStart;return opts.protocol+opts.prefix+Math.abs(hostNum)+opts.hostPath}}};var TileLayerOptions={opacity:1,isPng:false,tileUrlTemplate:HostOptions.createUrlFunction(),draggingCursor:"default",metaKey:"",enableBackfill:false};var TileLayerInitilizationOptions={heading:0,layerIndex:undefined,tileSize:new nmm.Size(nmm.DEFAULT_TILE_SIZE,nmm.DEFAULT_TILE_SIZE),tileDate:null,originOffset:new nmm.Point(0,0),tileLoadHandler:undefined,tileErrorHandler:undefined,downloadTiles:function(tileSet,downloadTimers,height,width,divOffset,tileSize,tileCheckRange,tileLayer){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)){tile._src=tileLayer.getTileUrl(tile.wrappedPoint,tile.zoom,tile.date);TileLayer.downloadTile(tile)}}}}};function TileLayer(copyrights,minRes,maxRes,options){var _that=this;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)}this.initialize=function(origin,zoom,dimension,proj,opts){var frag=document.createDocumentFragment();var height=dimension.height;var width=dimension.width;var enableBackfill=this._enableBackfill;var png=this._isPng;var opacity=this._opacity;var tileSet=[];var tileRow;var tile;var point;var wrappedPoint;var position;var node;var heading;var tileSize;var tileDate;var originOffset;opts=nmo.Synchronize.fill(opts,TileLayerInitilizationOptions);heading=opts.heading;tileSize=opts.tileSize;tileDate=opts.tileDate;originOffset=opts.originOffset;node=document.createElement("div");node.tilesLoaded=0;node.tilesReturned=0;if(typeof(opts.layerIndex)==="number"){node.layerIndex=opts.layerIndex}frag.appendChild(node);for(var i=0;i<height;i++){tileRow=[];position={y:originOffset.y+(i*tileSize.height)};for(var j=0;j<width;j++){point=getAxisTileCoordinates(origin,{x:j,y:i},heading);wrappedPoint=point.copy();wrappedPoint.x=proj.wrapTileXCoordinate(zoom,wrappedPoint.x);wrappedPoint.y=proj.wrapTileYCoordinate(zoom,wrappedPoint.y);position.x=originOffset.x+(j*tileSize.width);tile=TileLayer.createTile(this.getTileUrl(wrappedPoint,zoom,tileDate),point,wrappedPoint,zoom,tileDate,tileSize,position,png,opacity,enableBackfill,opts.tileLoadHandler,opts.tileErrorHandler);tileRow.push(tile);node.appendChild(tile)}tileSet[i]=tileRow}tileRow=null;tile=null;this._node=node;this._heading=heading;this._tileSize=tileSize;this._proj=proj;this._tileSet=tileSet;opts.downloadTiles(tileSet,this._timers.downloadTiles,height,width,originOffset,tileSize,proj.tileCheckRange,this);return frag};options=nmo.Synchronize.fill(options,TileLayerOptions);this._tileSet=[];this._copyright=copyrights;this._minRes=minRes;this._maxRes=maxRes;this._isPng=options.isPng;this._tileUrlTemplate=options.tileUrlTemplate;this._opacity=options.opacity;this._metaKey=options.metaKey;this._enableBackfill=options.enableBackfill;this._timers={};this._timers.downloadTiles=[]}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;var parentNode;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+"left:"+(offsetX+(width*j))+"px;z-index:"+tile.zoom+";"}}};TileLayer._substring="Vk52edzNRYKbGjF8Ur0WhmQlZs4wgipDETyL1oOMXIAvqtxJBuf7H36acCnS9P";TileLayer._downloads={};TileLayer._downloadCount=0;TileLayer._downloadWrap=100000;TileLayer._placeholder=nmm.HOST_URL+"img/transparent256x256.gif";TileLayer._maxRetries=3;TileLayer._timeout=5000;TileLayer.clearPrecacheItem=function(key){var img;img=TileLayer._downloads[key];if(!img){return}if(img._timer){window.clearTimeout(img._timer);img._timer=null}img.onload=null;img.onerror=null;img=null;delete TileLayer._downloads[key]};TileLayer.clearPrecache=function(){var precache=TileLayer._downloads;var img;for(var p in precache){if(precache.hasOwnProperty(p)){img=precache[p];TileLayer.clearPrecacheItem(img.src)}}};TileLayer.createTile=function(url,point,wrappedPoint,zoom,tileDate,tileSize,position,isPng,opacity,enableBackfill,onload,onerror){var img=new Image();img.point=point;img.wrappedPoint=wrappedPoint;img.zoom=zoom;img.date=tileDate;img.alt="";img.galleryimg="no";img.enableBackfill=enableBackfill;img.replaceTransparent=(isPng&&opacity<1&&nmc.browser.msie&&nmc.browser.majorVersion<=6);img.style.cssText="position:absolute; border: none;width:"+tileSize.width+"px;height:"+tileSize.height+"px;z-index:"+zoom+";left:"+position.x+"px;top:"+position.y+"px;";img._src=url;img.src=TileLayer._placeholder;if(nmm.debug){img.style.border="solid 1px red"}img._onload=onload;img._onerror=onerror;return img};TileLayer.downloadTile=function(tile,retry){var download=new Image();var url=tile._src;var downloadCount=TileLayer._downloadCount;var key=url+"|"+downloadCount;TileLayer._downloadCount=(downloadCount<TileLayer._downloadWrap?downloadCount+1:0);TileLayer._downloads[key]=download;download._retry=(retry>=0?retry:0);download._timer=window.setTimeout(function(){if(url===tile._src){if(download._retry<TileLayer._maxRetries){TileLayer.downloadTile(tile,download._retry+1);return}else{if(tile._onerror&&typeof(tile._onerror)==="function"){tile._onerror.call(tile)}}}download._timer=null;TileLayer.clearPrecacheItem(key);return},TileLayer._timeout);download.onload=function(){if(tile._src===download.src){if(tile.replaceTransparent){nms.applyPngAlphaBg(tile,tile._src,true)}else{tile.src=tile._src}}if(tile._onload&&typeof(tile._onload)==="function"){tile._onload.call(tile)}TileLayer.clearPrecacheItem(key)};download.onerror=function(){if(tile._onerror&&typeof(tile._onerror)==="function"){tile._onerror.call(tile)}TileLayer.clearPrecacheItem(key)};download.src=url};TileLayer.delayDownloadTile=function(tile,url){return function(){if(tile._src===url){TileLayer.downloadTile(tile)}}};TileLayer.prototype.differenceEngine=function(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};TileLayer.prototype.getSafeString=function(x,y,nmd){var arg=x.toString()+y.toString()+((3*x)+y).toString();if(nmd){arg+=nmd}return this.differenceEngine(TileLayer._substring,arg)};TileLayer.prototype.reloadTiles=function(zoom,date,rowStart,colStart,dx,dy,tilesWaiting){var tileSet=this._tileSet;var rows=tileSet.length;var cols=rows>0?tileSet[0].length:0;var proj=this._proj;var tileTimeout=25;var tileRow;var tile;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++){tile=tileRow[c];if(proj.tileCheckRange(tile.point,zoom)){window.setTimeout(TileLayer.delayDownloadTile(tile,tile._src),tilesWaiting*tileTimeout);tilesWaiting+=1}}}}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){tile=tileSet[r][c];if(proj.tileCheckRange(tile.point,zoom)){window.setTimeout(TileLayer.delayDownloadTile(tile,tile._src),tilesWaiting*tileTimeout);tilesWaiting+=1}}}}return tilesWaiting};TileLayer.prototype.setPanTile=function(tile,url){var parent;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}tile.errored=false;tile.returned=false;tile._src=url;if(tile.src!==TileLayer._placeholder){tile.src=TileLayer._placeholder}};TileLayer.prototype.shiftHorizontal=function(zoom,tileDate,rows,cols,shiftCols){var tileSet=this._tileSet;var heading=this._heading;var proj=this._proj;var tileSize=this._tileSize;var ORIGIN=nmm.Point.ORIGIN;var tileRow;var tile;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);this.setPanTile(tile,this.getTileUrl(tile.wrappedPoint,zoom,tileDate));tile.style.left=(parseInt(tile.style.left,10)+(cols*tileSize.width))+"px"}}};TileLayer.prototype.unshiftHorizontal=function(zoom,tileDate,rows,cols,unshiftCols){var tileSet=this._tileSet;var heading=this._heading;var proj=this._proj;var tileSize=this._tileSize;var ORIGIN=nmm.Point.ORIGIN;var tileRow;var tile;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);this.setPanTile(tile,this.getTileUrl(tile.wrappedPoint,zoom,tileDate));tile.style.left=(parseInt(tile.style.left,10)-(cols*tileSize.width))+"px"}}};TileLayer.prototype.shiftVertical=function(zoom,tileDate,rows,cols,shiftRows){var tileSet=this._tileSet;var heading=this._heading;var proj=this._proj;var tileSize=this._tileSize;var ORIGIN=nmm.Point.ORIGIN;var tileRow;var tile;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);this.setPanTile(tile,this.getTileUrl(tile.wrappedPoint,zoom,tileDate));tile.style.top=(parseInt(tile.style.top,10)+(rows*tileSize.height))+"px"}}}}};TileLayer.prototype.unshiftVertical=function(zoom,tileDate,rows,cols,unshiftRows){var tileSet=this._tileSet;var heading=this._heading;var proj=this._proj;var tileSize=this._tileSize;var ORIGIN=nmm.Point.ORIGIN;var newRowEnd=rows-2;var tileRow;var tile;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);this.setPanTile(tile,this.getTileUrl(tile.wrappedPoint,zoom,tileDate));tile.style.top=(parseInt(tile.style.top,10)-(rows*tileSize.height))+"px"}}}}};TileLayer.prototype.reorganize=function(zoom,tileDate,directionX,directionY,tilesWaiting){var tileSet=this._tileSet;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;this.shiftHorizontal.call(this,zoom,tileDate,rows,cols,Math.abs(directionX))}else{if(directionX>0){colStart=directionX-1;this.unshiftHorizontal.call(this,zoom,tileDate,rows,cols,directionX)}}if(directionY<0){rowStart=rows+directionY;this.shiftVertical.call(this,zoom,tileDate,rows,cols,Math.abs(directionY))}else{if(directionY>0){rowStart=directionY-1;this.unshiftVertical.call(this,zoom,tileDate,rows,cols,directionY)}}return this.reloadTiles(zoom,tileDate,rowStart,colStart,dx,dy,tilesWaiting)};TileLayer.prototype.getTile=function(row,col){return this._tileSet[row][col]};TileLayer.prototype.getNorthEastTile=function(){var northRow=this._tileSet[0];return northRow&&northRow.length>0?northRow[northRow.length-1]:null};TileLayer.prototype.getSouthWestTile=function(){var southRow=this._tileSet[this._tileSet.length-1];return southRow&&southRow.length>0?southRow[0]:null};TileLayer.prototype.copyTileSet=function(){return this._tileSet.slice()};TileLayer.prototype.stopDownloadTileTimers=function(){var timers=this._timers.downloadTiles;for(var i=timers.length;i--;){window.clearTimeout(timers[i])}this._timers.downloadTiles=[]};TileLayer.prototype.clear=function(){var row;this.stopDownloadTileTimers();TileLayer.clearPrecache();for(var r=this._tileSet.length;r--;){row=this._tileSet[r];for(var c=row.length;c--;){row[c]._onload=null;row[c]._onerror=null}}this._tileSet=[];this._node=null};TileLayer.prototype.hide=function(){if(this._node){this._node.style.display="none"}};TileLayer.prototype.isHidden=function(){return(this._node&&this._node.style.display==="none")};TileLayer.prototype.minResolution=function(){return this._minRes};TileLayer.prototype.maxResolution=function(){return this._maxRes};TileLayer.prototype.getTileUrl=function(point,zoom,date){var tileUrl;var nmDate;tileUrl=(typeof(this._tileUrlTemplate)==="function")?this._tileUrlTemplate(point,zoom):this._tileUrlTemplate;if(this===window){console.log("caller: %s",TileLayer.prototype.getTileUrl.caller);console.log("this: %o",this)}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="+this.getSafeString(point.x,point.y,nmDate);return tileUrl};TileLayer.prototype.isPng=function(){return this._isPng};TileLayer.prototype.getOpacity=function(){return this._opacity};TileLayer.prototype.getCopyright=function(bounds,zoom){return this._copyrights.getCopyrightNotice(bounds,zoom)};TileLayer.prototype.getMetaKey=function(){return this._metaKey};TileLayer.prototype.isBackfillEnabled=function(){return this._enableBackfill};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.TileLayerInitilizationOptions=TileLayerInitilizationOptions;nmm.HostOptions=HostOptions;nmm.Copyright=Copyright;nmm.CopyrightCollection=CopyrightCollection})();/*
 * This module provides the ability to add overlay items onto the map.
 *
 * 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 nmlp=nearmap.lib.poly;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(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;var latlngPrecision=6;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(latlngPrecision,true);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="nearmapMarkerTitle";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(latlngPrecision,true),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"Required Interface method not implemented: initialize"};this.remove=function(){throw"Required Interface method not implemented: remove"};this.copy=function(){throw"Required Interface method not implemented: copy"};this.redraw=function(force){throw"Required Interface method not implemented: redraw"};this.getKml=function(callback){throw"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(){throw"Marker.copy() not implemented exception."}function getKml(callback){throw"Marker.getKml() not implemented exception."}function showInfoWindow(callback,innerContent,opts){var map=this.map;var dx=0;var dy=0;var bottomLeft;var topRight;var bottomLeftCntPx;var topRightCntPx;var infoWindow;var foregroundNode;var foregroundWrap;var dimensions;var vSize;callback(latlng,innerContent,opts);_isInfoWindowOpen=true;infoWindow=map.getInfoWindow();foregroundNode=infoWindow._foregroundNode;foregroundWrap=foregroundNode.firstChild;vSize=map.getSize();dimensions=nmd.getDimensions(foregroundWrap);if(vSize.width>dimensions.width&&vSize.height>dimensions.height){bottomLeft=nmd.topLeft(foregroundNode);topRight={x:bottomLeft.x+dimensions.width,y:bottomLeft.y-dimensions.height};bottomLeftCntPx=map.fromDivPixelToContainerPixel(bottomLeft);topRightCntPx=map.fromDivPixelToContainerPixel(topRight);if(bottomLeftCntPx.x<Marker._borderLeft){dx=bottomLeftCntPx.x-Marker._borderLeft}else{if(topRightCntPx.x>vSize.width-Marker._borderRight){dx=topRightCntPx.x-vSize.width+Marker._borderRight}}if(bottomLeftCntPx.y>vSize.height){dy=bottomLeftCntPx.y-vSize.height+Marker._borderBottom}else{if(topRightCntPx.y<Marker._borderTop){dy=topRightCntPx.y-Marker._borderTop}}if(dx!==0||dy!==0){map.panBy(new nmm.Size(dx,dy))}}}function openInfoWindow(content,opts){bindInfoWindow(content,opts);showInfoWindow.call(this,this.map.openInfoWindow,content,opts)}function openInfoWindowHtml(content,opts){bindInfoWindowHtml(content,opts);showInfoWindow.call(this,this.map.openInfoWindowHtml,content,opts)}function openInfoWindowTabs(tabs,opts){bindInfoTabs(tabs,opts);showInfoWindow.call(this,this.map.openInfoWindowTabs,tabs,opts)}function openInfoWindowTabsHtml(tabs,opts){bindInfoTabsHtml(tabs,opts);showInfoWindow.call(this,this.map.openInfoWindowTabsHtml,tabs,opts)}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;this._autoPan=this.opts.autoPan;_draggable=this.opts.draggable}Marker._borderTop=90;Marker._borderBottom=5;Marker._borderLeft=5;Marker._borderRight=5;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(){var position=this.map.fromLatLngToDivPixel(this.getLatLng());var icon=this.getIcon();var foregroundImage=this.foregroundImage;var shadowImage=this.shadowImage;foregroundImage.style.left=(position.x+icon.iconAnchor.x)+"px";foregroundImage.style.top=(position.y+icon.iconAnchor.y)+"px";Marker.prototype.positionDragCross.call(this,position)};Marker.prototype.positionDragCross=function(position){var icon;if(!this.dragCrossImage){return}icon=this.getIcon();nms.css(this.dragCrossImage,{display:"",left:(position.x+icon.dragCrossAnchor.x)+"px",top:(position.y+icon.dragCrossAnchor.y)+"px",zIndex:Overlay.getZIndex(this.getLatLng().lat())})};Marker.prototype.renderPickup=function(){var crossPx=this.map.fromLatLngToDivPixel(this.getLatLng());var icon=this.getIcon();if(this.bounceAnimation){nma.stopContinuousAnimation(this.bounceAnimation)}if(this.opts.dragCrossMove){crossPx.y+=icon.maxHeight;this.setLatLng(this.map.fromDivPixelToLatLng(crossPx));this.foregroundImage.style.top=(parseInt(this.foregroundImage.style.top,10)+icon.maxHeight)+"px";if(this.shadowImage){this.shadowImage.style.top=(parseInt(this.shadowImage.style.top,10)+icon.maxHeight)+"px"}}this.foregroundImage.style.marginTop=-icon.maxHeight+"px";if(this.shadowImage){this.shadowImage.style.marginTop=-icon.maxHeight+"px"}Marker.prototype.positionDragCross.call(this,crossPx)};Marker.prototype.animateMarkerFalling=function(startDate,currentDate){var top;var speed;if(this.dragCeil===undefined){this.dragCeil=-this.getIcon().maxHeight}speed=this.speed+(this.direction>0?this.opts.bounceGravity:this.opts.bounceGravity*2);top=parseInt(this.foregroundImage.style.marginTop,10)+speed;if(top>0){top=0}if(top<this.dragCeil){top=this.dragCeil}if(top===0){_direction=-1;this.dragCeil=Math.ceil(this.dragCeil*this.bounceHeight);speed=speed*-1}if(top===this.dragCeil){this.direction=1;speed=0}this.foregroundImage.style.marginTop=top+"px";this.speed=speed};Marker.prototype.markerDropEnd=function(){this.direction=1;this.speed=0;this.foregroundImage.style.marginTop="";if(this.shadowImage){this.shadowImage.style.marginTop=""}if(this.dragCrossImage){this.dragCrossImage.style.display="none"}delete this.dragCeil;delete this.bounceAnimation};Marker.prototype.stopMarkerBounce=function(){var that=this;return function(){return that.dragCeil>=0}};Marker.prototype.renderDrop=function(){var frameLength;if(this.opts.bouncy){frameLength=Math.floor(1000/24);this.bounceAnimation=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 dragged=this.moved;var latlng;var latlngPx;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();heading=mapType.getHeading();tScale=mapType.getTileScale();latlng=this.getLatLng();latlngPx=proj.fromLatLngToPixel(latlng,map.getZoom(),mapType.getTileSize());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;latlngPx.add(rotatedDistMoved.x,rotatedDistMoved.y);this.setLatLng(proj.fromPixelToLatLng(latlngPx,map.getZoom(),false,mapType.getTileSize()));Marker.prototype.moveIcons.call(this);if(!dragged){this.foregroundImage.style.cursor=nmls.CURSOR_GRABBING.css;map.setDraggingCursor(nmls.CURSOR_GRABBING.css);Marker.prototype.renderPickup.call(this);nmev.trigger(this,"dragstart",this.getLatLng())}nmev.trigger(this,"drag",this.getLatLng());return nmev.preventDefault(e)}};Marker.prototype.onwindowmarkermouseup=function(e){e=e||window.event;if(this.opts.draggable&&this.moved){Marker.prototype.renderDrop.call(this);this.map.setDraggableCursor(nmls.CURSOR_GRAB.css);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.onclick=nmev.stopBubbling;foregroundImage.ondblclick=nmev.callback(this,Marker.prototype.onmarkerdblclick)}foregroundImage.onmousedown=nmev.callback(this,Marker.prototype.onmarkermousedown);foregroundImage.onmouseup=nmev.callback(this,Marker.prototype.onmarkermouseup);foregroundImage.onmouseover=nmev.callback(this,Marker.prototype.onmarkermouseover);foregroundImage.onmouseout=nmev.callback(this,Marker.prototype.onmarkermouseout);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 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);if(this.shadowImage){nme.discardElement(this.shadowImage);this.shadowImage=null}if(this.dragCrossImage){nme.discardElement(this.dragCrossImage);this.dragCrossImage=null}nmev.removeListener(this.oninfowindowhidden);nmev.removeListener(this.oninfowindowredraw);this.oninfowindowhidden=null;this.oninfowindowredraw=null;nmev.trigger(this,"remove")};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 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&&(!maxZoom||currentZoom<=maxZoom)&&paddedBounds.containsLatLng(marker.getLatLng())}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,"move",refresh);nmev.addListener(map,"moveend",nmev.callbackArgs(map,refresh,true))}function ScreenPoint(x,y,xunits,yunits){this.x=parseInt(x,10);this.y=parseInt(y,10);this.xunits=(xunits==="fractional"?xunits:"px");this.yunits=(yunits==="fractional"?yunits:"px")}function ScreenSize(width,height,xunits,yunits){this.width=parseInt(width,10);this.height=parseInt(height,10);this.xunits=(xunits==="fractional"?xunits:"px");this.yunits=(yunits==="fractional"?yunits:"px")}function ScreenOverlay(imageUrl,screenXY,overlayXY,size){this._imageUrl=imageUrl;this._screenXY=screenXY;this._overlayXY=overlayXY;this._size=size}ScreenOverlay.prototype.initialize=function(map){var node=document.createElement("div");this._node=node;this._map=map;nms.css(node,{border:"0px none",margin:"0px",padding:"0px",position:"absolute"},true);nms.applyPngAlphaBg(node,this._imageUrl);nmev.disableSelect(node);map.getTileContainer().parentNode.appendChild(node)};ScreenOverlay.prototype.redraw=function(force){var mapSize;var size;var screenXY;var overlayXY;if(!force){return}mapSize=this._map.getSize();size={width:(this._size.xunits==="fractional"?this._size.width*this._size.xunits/100:this._size.width),height:(this._size.yunits==="fractional"?this._size.height*this._size.yunits/100:this._size.height)};screenXY={x:(this._screenXY.xunits==="fractional"?mapSize.width*this._screenXY.x/100:this._screenXY.x),y:(this._screenXY.yunits==="fractional"?mapSize.height*this._screenXY.y/100:this._screenXY.y)};overlayXY={x:(this._overlayXY.xunits==="fractional"?mapSize.width*this._overlayXY.x/100:this._overlayXY.x),y:(this._overlayXY.yunits==="fractional"?mapSize.height*this._overlayXY.y/100:this._overlayXY.y)};nms.css(this._node,{height:size.height+"px",width:size.width+"px",top:(mapSize.height-size.height-screenXY.y+overlayXY.y)+"px",left:(screenXY.x-overlayXY.x)+"px"})};ScreenOverlay.prototype.remove=function(){nme.discardElement(this._node)};ScreenOverlay.prototype.hide=function(){var wasVisible=(this._node.style.display!=="none");if(wasVisible){this._node.style.display="none";nmev.trigger(this,"visibilitychanged",false)}};ScreenOverlay.prototype.show=function(){var wasHidden=(this._node.style.display==="none");if(wasHidden){this._node.style.display="";nmev.trigger(this,"visibilitychanged",true)}};ScreenOverlay.prototype.isHidden=function(){return(this._node.style.display==="none")};ScreenOverlay.prototype.supportsHide=function(){return true};function SystemScreenOverlay(imageUrl,screenXY,overlayXY,size,linkTo){ScreenOverlay.apply(this,arguments);this._unremovable=true;this._linkTo=linkTo}SystemScreenOverlay.prototype=new ScreenOverlay();SystemScreenOverlay.prototype.constructor=SystemScreenOverlay;SystemScreenOverlay.prototype.initialize=function(map){var node;if(!this._linkTo){ScreenOverlay.prototype.initialize.call(this,map);return}node=document.createElement("a");node.href=this._linkTo;this._node=node;this._map=map;nms.css(node,{border:"0px none",margin:"0px",padding:"0px",position:"absolute"},true);nms.applyPngAlphaBg(node,this._imageUrl);nmev.disableSelect(node);map.getTileContainer().parentNode.appendChild(node)};SystemScreenOverlay.prototype.redraw=function(force){ScreenOverlay.prototype.redraw.call(this,force)};var PolylineOptions={clickable:true,geodesic:false,mouseOutTolerance:0};var PolyEditingOptions={maxVertices:undefined,fromStart:false};var PolyStyleOptions={color:"#0000ff",weight:5,opacity:1};function Polyline(latlngs,color,weight,opacity,opts){function getBounds(){throw"Polyline.getBounds not implemented exception"}function hide(){throw"Polyline.hide not implemented exception"}function isHidden(){throw"Polyline.isHidden not implemented exception"}function show(){throw"Polyline.show not implemented exception"}function supportsHide(){throw"Polyline.supportsHide not implemented exception"}this.getBounds=getBounds;this.hide=hide;this.isHidden=isHidden;this.show=show;this.supportsHide=supportsHide;this._opts=nmo.Synchronize.fill(opts,PolylineOptions);this._clickable=this._opts.clickable;this._mouseOutTolerance=this._opts.mouseOutTolerance;this._geodesic=this._opts.geodesic;this._vertexes=latlngs.slice();this._drawingVertexes=[];this._controlPoints=[];this._timers={};this._color=(color?color:PolyStyleOptions.color);this._weight=(weight&&weight>=1?weight:PolyStyleOptions.weight);this._opacity=(opacity>=0&&opacity<=1?opacity:PolyStyleOptions.opacity);this._dblclick=false;this._editable=false;this._drawing=false}Polyline.fromEncoded=function(color,weight,opacity,latlngs,zoomFactor,levels,numLevels){throw"Polyline.fromEncoded not implemented exception"};Polyline.prototype=new Overlay();Polyline.prototype.constructor=Polyline;Polyline.prototype.initialize=function(map){this._map=map;this._renderer=new nmlp.createRenderer(map.getPane(MapPane.OVERLAY_LAYER_PANE))};Polyline.prototype.controlPointIcon=new Icon(Icon.DEFAULT_ICON,nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/marker-measurement-tool.png");Polyline.prototype.controlPointIcon.iconSize=new nmm.Size(14,14);Polyline.prototype.controlPointIcon.iconAnchor=new nmm.Point(-7,-7);Polyline.prototype.controlPointIcon.dragCrossImage=null;Polyline.prototype.controlPointIcon.maxHeight=0;Polyline.prototype.enableEditing=function(opts){var controlPoints=this._controlPoints;this._editable=true;if(opts){if(opts.maxVertices>=0){this._maxVertices=opts.maxVertices}if(opts.fromStart){this._fromStart=true}}for(var i=controlPoints.length;i--;){controlPoints[i].show()}};Polyline.prototype.disableEditing=function(){var controlPoints=this._controlPoints;this._editable=false;delete this._maxVertices;delete this._fromStart;for(var i=controlPoints.length;i--;){controlPoints[i].hide()}};Polyline.prototype.setDrawingCursor=function(){this._map.setDraggableCursor(nmls.CURSOR_CROSSHAIR.css)};Polyline.prototype.enableDrawing=function(opts){var path;var shapes;var startingPoint;this._drawing=true;this.enableEditing.call(this,opts);if(!this._onmapclick){this._onmapclick=nmev.addListener(this._map,"click",nmev.callback(this,Polyline.prototype.onmapclick))}if(!this._onmapdblclick){this._onmapdblclick=nmev.addListener(this._map,"dblclick",nmev.callback(this,Polyline.prototype.onmapdblclick))}if(!this._ondocumentmousemove){this._ondocumentmousemove=nmev.addDomListener(document,"mousemove",nmev.callback(this,Polyline.prototype.ondocumentmousemove))}if(!this._drawingRenderer){this._drawingRenderer=new nmlp.createRenderer(this._map.getPane(MapPane.OVERLAY_LAYER_PANE))}Polyline.prototype.setDrawingCursor.call(this)};Polyline.prototype.endDrawing=function(){if(!this._drawing){return}this._drawing=false;this._drawingVertexes=[];this.disableEditing.call(this);this._map.setDraggableCursor(nmls.CURSOR_GRAB.css);if(this._onmapclick){nmev.removeListener(this._onmapclick);delete this._onmapclick}if(this._onmapdblclick){nmev.removeListener(this._onmapdblclick);delete this._onmapdblclick}if(this._ondocumentmousemove){nmev.removeListener(this._ondocumentmousemove);delete this._ondocumentmousemove}if(this._drawingRenderer){this._drawingRenderer.clear();this._drawingRenderer=null}nmev.trigger(this,"endline")};Polyline.prototype.cancelDrawing=function(){if(!this._drawing){return}this._drawing=false;this._drawingVertexes=[];this._map.setDraggableCursor(nmls.CURSOR_GRAB.css);if(this._onmapclick){nmev.removeListener(this._onmapclick);delete this._onmapclick}if(this._onmapdblclick){nmev.removeListener(this._onmapdblclick);delete this._onmapdblclick}if(this._ondocumentmousemove){nmev.removeListener(this._ondocumentmousemove);delete this._ondocumentmousemove}if(this._drawingRenderer){this._drawingRenderer.clear();this._drawingRenderer=null}nmev.trigger(this,"cancelline")};Polyline.prototype.remove=function(){this.cancelDrawing();this.disableEditing();if(this._renderer){this._renderer.clear();this._renderer=null}nmev.trigger(this,"remove")};Polyline.prototype.createPath=function(vertexes,onclick,pathProperties){var map=this._map;var len=vertexes.length;var trueWeight=(2*this._weight);var path;var pathData;var px;var minX;var minY;var maxX;var maxY;if(len<=1){return null}px=map.fromLatLngToDivPixel(vertexes[0]);minX=px.x;minY=px.y;maxX=px.x;maxY=px.y;pathData="M "+px.toString()+" L ";for(var i=1;i<len;i++){px=map.fromLatLngToDivPixel(vertexes[i]);pathData+=px.toString()+" ";if(px.x<minX){minX=px.x}else{if(px.x>maxX){maxX=px.x}}if(px.y<minY){minY=px.y}else{if(px.y>maxY){maxY=px.y}}}path=new nmlp.Path(pathData);path.offset=new nmlp.Point(minX-this._weight,minY-this._weight);path.strokeWidth=this._weight;path.stroke=this._color;path.strokeOpacity=this._opacity;for(var p in pathProperties){if(pathProperties.hasOwnProperty(p)){path[p]=pathProperties[p]}}path.dimension=new nmlp.Point(maxX-minX+trueWeight,maxY-minY+trueWeight);if(onclick){path.onclick=nmev.callback(this,onclick)}path.onmouseover=nmev.callback(this,Polyline.prototype.onmouseover);path.onmouseout=nmev.callback(this,Polyline.prototype.onmouseout);return path};Polyline.prototype.renderDrawingPath=function(points){if(!this._drawingRenderer){return}path=this.createPath(points,null,{strokeDash:"5, 5"});if(!path){return}shapes=new nmlp.Group();shapes.addChild(path);shapes.draw(this._drawingRenderer)};Polyline.prototype.redraw=function(force){var shapes;var path;var clickCallback;if(force&&this._renderer){clickCallback=(this._clickable?Polyline.prototype.onclick:null);path=this.createPath(this._vertexes,clickCallback,{strokeJoin:"round",strokeCap:"round"});if(!path){return}shapes=new nmlp.Group();shapes.addChild(path);shapes.draw(this._renderer)}};Polyline.prototype.deleteVertex=function(index){if(this._editable){this.deleteControlPoint(index)}if(this._drawing){if(this._vertexes.length>=2){this._drawingVertexes.splice(0,1,this._vertexes[(this._fromStart?0:this._vertexes.length-2)]);this.renderDrawingPath(this._drawingVertexes)}else{this._drawingVertexes=[];this._drawingRenderer.clear()}nmev.trigger(this,"drawinglineupdated")}this._vertexes.splice(index,1);this.redraw(true);nmev.trigger(this,"lineupdated")};Polyline.prototype.deleteControlPoint=function(index){var controlPoint=this._controlPoints[index];if(!controlPoint){return}nmev.removeListener(controlPoint.ondrag);nmev.removeListener(controlPoint.ondragend);this._map.removeOverlay(controlPoint);this._controlPoints.splice(index,1)};Polyline.prototype.getVertexCount=function(){return this._vertexes.length};Polyline.prototype.getVertex=function(index){return this._vertexes[index]};Polyline.prototype.getLength=function(equatorialEarthRadius){var vertexes=this._vertexes;var end=vertexes.length-1;var l=0;equatorialEarthRadius=equatorialEarthRadius|6378137;for(var i=0;i<end;i++){l+=vertexes[i].distanceFrom(vertexes[i+1],equatorialEarthRadius)}return l};Polyline.prototype.getDrawingLength=function(equatorialEarthRadius){var vertexes=this._drawingVertexes;var end=vertexes.length-1;var drawingLength=0;equatorialEarthRadius=equatorialEarthRadius|6378137;for(var i=0;i<end;i++){drawingLength+=vertexes[i].distanceFrom(vertexes[i+1],equatorialEarthRadius)}return drawingLength+this.getLength(equatorialEarthRadius)};Polyline.prototype.getInitialBearing=function(){var bearing=null;var vertexes;if(this._drawingVertexes.length>=2){vertexes=[this._drawingVertexes[0],this._drawingVertexes[1]]}else{if(this.getVertexCount()>=2){vertexes=[this.getVertex(0),this.getVertex(1)]}}if(vertexes){bearing=vertexes[0].initialBearing(vertexes[1])}return bearing};Polyline.prototype.insertControlPoint=function(index,latlng){var controlPoint;controlPoint=new nmov.Marker(latlng,{icon:Polyline.prototype.controlPointIcon,clickable:true,draggable:true,bouncy:false});controlPoint.ondrag=nmev.addListener(controlPoint,"drag",nmev.callbackArgs(controlPoint,Polyline.prototype.oncontrolpointdrag,this));controlPoint.ondragend=nmev.addListener(controlPoint,"dragend",nmev.callback(this,Polyline.prototype.setDrawingCursor));this._controlPoints.splice(index,0,controlPoint);this._map.addOverlay(controlPoint)};Polyline.prototype.insertVertex=function(index,latlng){if(this._drawing){this._drawingVertexes=[];this._drawingRenderer.clear()}this._vertexes.splice(index,0,latlng);this.redraw(true);if(this._editable){this.insertControlPoint(index,latlng)}nmev.trigger(this,"lineupdated")};Polyline.prototype.updateVertex=function(index,latlng,force){if(index<0||index>=this._vertexes.length){return}if(this._drawing){this._drawingVertexes=[];this._drawingRenderer.clear()}force=(force===undefined?false:force);this._vertexes[index]=latlng;this.redraw(force);nmev.trigger(this,"lineupdated")};Polyline.prototype.setStrokeStyle=function(style){var force=false;if(!style){return}if(style.color){this._color=style.color;force=true}if(style.weight>0){this._weight=style.weight;force=true}if(style.opacity>=0){this._opacity=style.opacity;redraw=true}this.redraw(force)};Polyline.prototype.ondocumentmousemove=function(e){var points;var map;var container;var cursorLatLng;var shapes;var path;if(this._vertexes.length<=0){return}e=e||window.event;map=this._map;container=map.getContainer();cursorLatLng=map.fromContainerPixelToLatLng({x:e.clientX-container.offsetLeft,y:e.clientY-container.offsetTop});this._drawingVertexes=[this._vertexes[(this._fromStart?0:this._vertexes.length-1)],cursorLatLng];this.renderDrawingPath(this._drawingVertexes);nmev.trigger(this,"drawinglineupdated")};Polyline.prototype.onclick=function(e){var map=this._map;var container=map.getContainer();var latlng;var containerPixel;e=e||window.event;containerPixel=new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop);latlng=map.fromContainerPixelToLatLng(containerPixel);nmev.trigger(this,"click",latlng);nmev.trigger(map,"click",this,undefined,latlng);return nmev.stopBubbling(e)};Polyline.prototype.onmouseover=function(e){nmev.trigger(this,"mouseover")};Polyline.prototype.onmouseout=function(e){nmev.trigger(this,"mouseout")};Polyline.prototype.oncontrolpointdrag=function(latlng,line){var i=nml.ArrayHelper.indexOf(line._controlPoints,this);if(i>=0){line.updateVertex(i,latlng,true)}};Polyline.prototype.onmapclick=function(overlay,latlng,overlaylatlng){var _that=this;if((overlay&&overlay!==this&&overlay instanceof Polyline)||_that._maxVertices!==undefined&&_that.getVertexCount()>=_that._maxVertices){return}if(this._timers.onmapclick){window.clearTimeout(this._timers.onmapclick)}this._timers.onmapclick=window.setTimeout(function(){var pointLatLng=latlng||overlaylatlng;var controlPoints=_that._controlPoints;var maxVertices=_that._maxVertices;var controlPoint;if(!_that._dblclick){if(controlPoints.length>=1&&controlPoints[controlPoints.length-1]===overlay){_that.endDrawing();return}_that.insertVertex(_that.getVertexCount(),pointLatLng);if(maxVertices===_that.getVertexCount()){_that.endDrawing()}}_that._dblclick=false},nmm.DBL_CLICK_TIMEOUT)};Polyline.prototype.onmapdblclick=function(){if(this._maxVertices===undefined||this.getVertexCount()<this._maxVertices){this._dblclick=true}};var TileLayerOverlayOptions={zPriority:0};function TileLayerOverlay(tileLayer,opts){opts=nmo.Synchronize.fill(opts,TileLayerOverlayOptions);this._zPriority=opts.zPriority;this._tileLayer=tileLayer}TileLayerOverlay.prototype=new Overlay();TileLayerOverlay.prototype.constructor=TileLayerOverlay;TileLayerOverlay.prototype.initialize=function(map){this._map=map};TileLayerOverlay.prototype.reCreateLayer=function(){var tileLayer=this.getTileLayer();var map=this._map;var oldNode=tileLayer._node;var node;var layerInitOpts;var layerFrag;tileLayer.clear();layerInitOpts=map.getTileLayerInitOptions(map.getCenter(),map.getZoom(),map.getTileDate(),map.getCurrentMapType());layerFrag=tileLayer.initialize(layerInitOpts.origin,layerInitOpts.zoom,layerInitOpts.dimension,layerInitOpts.projection,{heading:layerInitOpts.heading,tileSize:layerInitOpts.tileSize,tileDate:layerInitOpts.tileDate,originOffset:layerInitOpts.originOffset,tileLoadHandler:layerInitOpts.tileLoadHandler,downloadTiles:layerInitOpts.downloadTiles});node=tileLayer._node;node.style.zIndex=this._zPriority;if(oldNode){oldNode.parentNode.replaceChild(node,oldNode)}else{map.getPane(MapPane.OVERLAY_LAYER_PANE).appendChild(layerFrag)}};TileLayerOverlay.prototype.panLayer=function(){this._map.reorganize([this.getTileLayer()])};TileLayerOverlay.prototype.redraw=function(force){var tileLayer=this.getTileLayer();var map=this._map;var layerInitOpts;var layerFrag;var oldNode;var node;if(force){this.reCreateLayer()}else{this.panLayer()}};TileLayerOverlay.prototype.remove=function(){var tileLayer=this.getTileLayer();var node=tileLayer._node;tileLayer.clear();if(node){nme.discardElement(node)}};TileLayerOverlay.prototype.hide=function(){var node=this.getTileLayer()._node;if(node){_node.style.display="none"}};TileLayerOverlay.prototype.isHidden=function(){var node=this.getTileLayer()._node;return(node&&node.style.display==="none")};TileLayerOverlay.prototype.show=function(){var node=this.getTileLayer()._node;if(node){node.style.display=""}};TileLayerOverlay.prototype.refresh=function(){throw"TileLayerOverlay.refresh() not implemented exception"};TileLayerOverlay.prototype.supportsHide=function(){return true};TileLayerOverlay.prototype.getTileLayer=function(){return this._tileLayer};function GroundOverlay(imageUrl,bounds){this._imageUrl=imageUrl;this._bounds=bounds.copy()}GroundOverlay.prototype=new Overlay();GroundOverlay.prototype.constructor=GroundOverlay;GroundOverlay.prototype.initialize=function(map){var node=document.createElement("img");node.src=this._imageUrl;node.alt="";node.galleryImg="no";node.style.position="absolute";this._map=map;this._node=node;map.getPane(MapPane.OVERLAY_LAYER_PANE).appendChild(node)};GroundOverlay.prototype.redraw=function(force){var node;var swPx;var nePx;if(!force){return}node=this._node;nePx=this._map.fromLatLngToDivPixel(this._bounds.getNorthEast());swPx=this._map.fromLatLngToDivPixel(this._bounds.getSouthWest());node.style.left=swPx.x+"px";node.style.top=nePx.y+"px";node.style.width=(nePx.x-swPx.x)+"px";node.style.height=(swPx.y-nePx.y)+"px"};GroundOverlay.prototype.remove=function(){if(this._node){nme.discardElement(this._node)}};GroundOverlay.prototype.hide=function(){if(this._node&&this._node.style.display!=="none"){this._node.style="none";nmev.trigger(this,"visibilitychanged",false)}};GroundOverlay.prototype.isHidden=function(){return !this._node||this._node.style.display==="none"};GroundOverlay.prototype.show=function(){if(this._node&&this._node.style.display==="none"){this._node.style="";nmev.trigger(this,"visibilitychanged",true)}};GroundOverlay.prototype.supportsHide=function(){return true};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;nmov.ScreenPoint=ScreenPoint;nmov.ScreenSize=ScreenSize;nmov.ScreenOverlay=ScreenOverlay;nmov.SystemScreenOverlay=SystemScreenOverlay;nmov.PolylineOptions=PolylineOptions;nmov.PolyEditingOptions=PolyEditingOptions;nmov.PolyStyleOptions=PolyStyleOptions;nmov.Polyline=Polyline;nmov.TileLayerOverlayOptions=TileLayerOverlayOptions;nmov.TileLayerOverlay=TileLayerOverlay;nmov.GroundOverlay=GroundOverlay})();/*
 * 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,requestTileInfo:false};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.getRequestTileInfo=function(){return opts.requestTileInfo};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=0;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"+(nmm.PHOTOMAP_GENERATION>0?"&nmg="+nmm.PHOTOMAP_GENERATION:"")}),metaKey:"Vert",enableBackfill:true})],new nmm.MercatorProjection(24),"PHOTO_MAP",{shortName:"PhotoMap",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg,requestTileInfo:true});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___",enableBackfill:true})],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,requestTileInfo:true});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___",enableBackfill:true})],new nmm.MercatorProjection(24),"MULTI_VIEW_NORTH_MAP",{shortName:"N",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.75),errorMessage:errorMsg,heading:0,requestTileInfo:true});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___",enableBackfill:true})],new nmm.MercatorProjection(24),"MULTI_VIEW_EAST_MAP",{shortName:"E",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.5),errorMessage:errorMsg,heading:90,requestTileInfo:true});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___",enableBackfill:true})],new nmm.MercatorProjection(24),"MULTI_VIEW_SOUTH_MAP",{shortName:"S",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.75),errorMessage:errorMsg,heading:180,requestTileInfo:true});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___",enableBackfill:true})],new nmm.MercatorProjection(24),"MULTI_VIEW_WEST_MAP",{shortName:"W",maxResolution:24,minResolution:18,tileSize:256,tileScale:new nmm.Point(1,0.5),errorMessage:errorMsg,heading:270,requestTileInfo:true});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_"+(nmm.STREETMAP_GENERATION>0?"&nmg="+nmm.STREETMAP_GENERATION:""),nodeStart:1}),metaKey:"Map_"})],new nmm.MercatorProjection(24),"NORMAL_MAP",{shortName:"StreetMap",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"+(nmm.PHOTOMAP_GENERATION>0?"&nmg="+nmm.PHOTOMAP_GENERATION:"")}),metaKey:"Vert",enableBackfill:true}),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"+(nmm.STREETMAP_GENERATION>0?"&nmg="+nmm.STREETMAP_GENERATION:""),nodeStart:1}),metaKey:"MapT",isPng:true,opacity:0})],new nmm.MercatorProjection(24),"HYBRID_MAP",{shortName:"PhotoMap/StreetMap",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg,requestTileInfo:true});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"+(nmm.TERRAINMAP_GENERATION>0?"&nmg="+nmm.TERRAINMAP_GENERATION:"")}),metaKey:"Dem_",enableBackfill:true})],new nmm.MercatorProjection(24),"PHYSICAL_MAP",{shortName:"Terrain",maxResolution:24,minResolution:2,tileSize:256,tileScale:new nmm.Point(1,1),errorMessage:errorMsg,requestTileInfo:true});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"+(nmm.TERRAINMAP_GENERATION>0?"&nmg="+nmm.TERRAINMAP_GENERATION:"")}),metaKey:"Dem_",enableBackfill:true}),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&nmg="+(nmm.STREETMAP_GENERATION>0?"&nmg="+nmm.STREETMAP_GENERATION:"")}),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,requestTileInfo:true});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.NORMAL_MAP,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 nmo=nearmap.options;var nmc=nearmap.client;var nms=nearmap.style;function MapUIOptions(opt_size){var isSmall=(opt_size.width<400||opt_size.height<300||false);this.maptypes={normal:true,satellite:true,hybrid:true,physical:true};this.zoom={scrollwheel:true,doubleclick:true};this.keyboard=true;this.controls={largemapcontrol3d:!isSmall,smallzoomcontrol3d:isSmall,scalecontrol:!isSmall};if(isSmall){this.controls.menumaptypecontrol=true}else{this.controls.hierarchicalmaptypecontrol=true}}var KeyboardKeys={BACKSPACE:8,ENTER:13,SHIFT:16,ESC:27,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,ARROW_LEFT:37,ARROW_UP:38,ARROW_RIGHT:39,ARROW_DOWN:40,DELETE:46,NUMPAD_PLUS:107,NUMPAD_MINUS:109};function KeyboardHandler(map){this._listeners={};this._timers={};this._leftPressed=false;this._rightPressed=false;this._upPressed=false;this._downPressed=false;this._map=map;this._listeners.onkeydown=nmev.addDomListener(document,"keydown",nmev.callback(this,KeyboardHandler.prototype.onkeydown));this._listeners.onkeyup=nmev.addDomListener(document,"keyup",nmev.callback(this,KeyboardHandler.prototype.onkeyup));this._listeners.onkeypress=nmev.addDomListener(document,"keypress",nmev.callback(this,KeyboardHandler.prototype.onkeypress));this._listeners.onmapclick=nmev.addListener(map,"click",nmev.callback(this,KeyboardHandler.prototype.onmapclick))}KeyboardHandler.prototype._arrowPanDistance=20;KeyboardHandler.prototype.checkArrowPressed=function(){var that=this;var dx=0;var dy=0;if(this._timers.arrowKeyPan){window.clearTimeout(this._timers.arrowKeyPan)}if(this._leftPressed){dx-=this._arrowPanDistance}if(this._rightPressed){dx+=this._arrowPanDistance}if(this._upPressed){dy-=this._arrowPanDistance}if(this._downPressed){dy+=this._arrowPanDistance}if(dx!==0||dy!==0){this._map.panBy(new nmm.Size(dx,dy),false);this._timers.arrowKeyPan=window.setTimeout(function(){that.checkArrowPressed.call(that)},25)}else{delete this._timers.arrowKeyPressed}};KeyboardHandler.prototype.onkeydown=function(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){this._map.panDirection(0,-1)}else{if(keyCode===KeyboardKeys.PAGE_DOWN){this._map.panDirection(0,1)}else{if(keyCode===KeyboardKeys.END){this._map.panDirection(1,0)}else{if(keyCode===KeyboardKeys.HOME){this._map.panDirection(-1,0)}else{if(keyCode===KeyboardKeys.NUMPAD_PLUS){this._map.zoomIn()}else{if(keyCode===KeyboardKeys.NUMPAD_MINUS){this._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){this._leftPressed=true}else{if(keyCode===KeyboardKeys.ARROW_UP){this._upPressed=true}else{if(keyCode===KeyboardKeys.ARROW_RIGHT){this._rightPressed=true}else{if(keyCode===KeyboardKeys.ARROW_DOWN){this._downPressed=true}}}}}}}}}}}this.checkArrowPressed.call(this)}}};KeyboardHandler.prototype.onkeyup=function(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){this._leftPressed=false}else{if(keyCode===KeyboardKeys.ARROW_UP){this._upPressed=false}else{if(keyCode===KeyboardKeys.ARROW_RIGHT){this._rightPressed=false}else{if(keyCode===KeyboardKeys.ARROW_DOWN){this._downPressed=false}}}}if(!this._leftPressed&&!this._upPressed&&!this._rightPressed&&!this._downPressed){window.clearTimeout(this._timers.arrowKeyPan);delete this._timers.arrowKeyPan}}};KeyboardHandler.prototype.onkeypress=function(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){this._leftPressed=true}else{if(keyCode===KeyboardKeys.ARROW_UP){this._upPressed=true}else{if(keyCode===KeyboardKeys.ARROW_RIGHT){this._rightPressed=true}else{if(keyCode===KeyboardKeys.ARROW_DOWN){this._downPressed=true}}}}this.checkArrowPressed.call(this)}};KeyboardHandler.prototype.onmapclick=function(){window.focus()};KeyboardHandler.prototype.remove=function(){var listeners=this._listeners;nmev.removeListener(listeners.onkeydown);nmev.removeListener(listeners.onkeyup);nmev.removeListener(listeners.onkeypress);nmev.removeListener(listeners.onmapclick);delete listeners.onkeydown;delete listeners.onkeyup;delete listeners.onkeypress;delete listeners.onmapclick};var DraggableObjectOptions={left:0,top:0,container:undefined,draggableCursor:undefined,draggingCursor:undefined};function DraggableObject(src,opts){var style=src.style;this._src=src;this._enabled=true;opts=nmo.Synchronize.fill(opts,DraggableObjectOptions);if(opts.draggableCursor){this._draggableCursor=opts.draggableCursor}if(opts.draggingCursor){this._draggingCursor=opts.draggingCursor}if(opts.left){this._left=opts.left}else{if(!style.left){this._left=0}else{this._left=parseInt(style.left,10)}}if(opts.top){this._top=opts.top}else{if(!style.top){this._top=0}else{this._top=parseInt(style.top,10)}}style.cursor=this._draggingCursor;style.cursor=this._draggableCursor;if(style.position!=="relative"||style.position!=="absolute"){style.position="absolute"}style.left=this._left+"px";style.top=this._top+"px";this._onmousedown=nmev.addDomListener(src,"mousedown",nmev.callbackArgs(src,DraggableObject.prototype.onmousedown,this));this._ontouchstart=nmev.addDomListener(src,"touchstart",nmev.callbackArgs(src,DraggableObject.prototype.ontouchstart,this));this._ontouchend=nmev.addDomListener(src,"touchend",nmev.callbackArgs(src,DraggableObject.prototype.ontouchend,this));this._ontouchmove=nmev.addDomListener(src,"touchmove",nmev.callbackArgs(src,DraggableObject.prototype.ontouchmove,this))}DraggableObject.prototype._draggableCursor="default";DraggableObject.prototype._draggingCursor="default";DraggableObject.setDraggableCursor=function(cursor){this.prototype._draggableCursor=cursor};DraggableObject.setDraggingCursor=function(cursor){this.prototype._draggingCursor=cursor};DraggableObject.prototype.setDraggableCursor=function(cursor){this._draggableCursor=cursor;this._src.style.cursor=cursor};DraggableObject.prototype.setDraggingCursor=function(cursor){this._draggingCursor=cursor;this._src.style.cursor=cursor};DraggableObject.prototype.moveTo=function(point){this._left=point.x;this._top=point.y;this._src.style.left=point.x+"px";this._src.style.top=point.y+"px"};DraggableObject.prototype.moveBy=function(size){var style=this._src.style;this._left=parseInt(style.left,10)+size.width;this._top=parseInt(style.top,10)+size.height;style.left=this._left+"px";style.top=this._top+"px"};DraggableObject.prototype.enable=function(){this._enabled=true;this._src.style.cursor=this._draggableCursor};DraggableObject.prototype.disable=function(){this._enabled=false;this._src.style.cursor=""};DraggableObject.prototype.remove=function(){nmev.removeListener(this._mousedown);delete this._mousemove;if(this._mousemove){nmev.removeListener(this._mousemove);delete this._mousemove}if(this._mouseup){nmev.removeListener(this._mouseup);delete this._mouseup}this._src=null};DraggableObject.prototype.dragend=function(e){var hasDragged=this.hasDragged;nmev.removeListener(this._onmousemove);nmev.removeListener(this._onmouseup);if(this._onframemouseout){nmev.removeListener(this._onframemouseout)}delete this._onmousemove;delete this._onmouseup;delete this._onframemouseout;delete this.mouseX;delete this.mouseY;delete this.hasDragged;if(this._enabled){this._src.style.cursor=this._draggableCursor;if(hasDragged){nmev.trigger(this,"dragend",e)}nmev.trigger(this,"mouseup",e);nmev.trigger(this,"click",e)}};DraggableObject.prototype.onframemouseout=function(e,dragObj){var relatedTarget;relatedTarget=nmev.getRelatedTarget(e);if(!relatedTarget||relatedTarget.nodeName.toLowerCase()==="html"){dragObj.dragend(e)}};DraggableObject.prototype.onmousedown=function(e,dragObj){if(dragObj._enabled&&nmev.getMouseButton(e)===nmev.MouseButton.LEFT_BUTTON){this.style.cursor=dragObj._draggingCursor;dragObj.mouseX=e.clientX;dragObj.mouseY=e.clientY;dragObj.hasDragged=false;dragObj._onmousemove=nmev.addDomListener(document,"mousemove",nmev.callbackArgs(document,DraggableObject.prototype.onmousemove,dragObj));dragObj._onmouseup=nmev.addDomListener(document,"mouseup",nmev.callbackArgs(document,DraggableObject.prototype.onmouseup,dragObj));if(window.parent.location.href!==window.location.href){dragObj._onframemouseout=nmev.addDomListener(document,"mouseout",nmev.callbackArgs(document,DraggableObject.prototype.onframemouseout,dragObj))}return nmev.preventDefault(e)}nmev.trigger(dragObj,"mousedown",e)};DraggableObject.prototype.onmouseup=function(e,dragObj){dragObj.dragend(e)};DraggableObject.prototype.onmousemove=function(e,dragObj){var x;var y;var style;if(!dragObj._enabled){return true}x=e.clientX-dragObj.mouseX;y=e.clientY-dragObj.mouseY;if(x!==0||y!==0){if(!dragObj.hasDragged){dragObj.hasDragged=true;nmev.trigger(dragObj,"dragstart",e)}dragObj.moveBy(new nmm.Size(x,y));dragObj.mouseX=e.clientX;dragObj.mouseY=e.clientY;nmev.trigger(dragObj,"drag",e)}return nmev.preventDefault(e)};DraggableObject.prototype.ontouchstart=function(e,dragObj){var touch;if(dragObj._enabled&&e.touches.length===1){touch=e.touches[0];dragObj.mouseX=touch.clientX;dragObj.mouseY=touch.clientY;dragObj.hasDragged=false;return nmev.preventDefault(e)}};DraggableObject.prototype.ontouchmove=function(e,dragObj){var touch;var x;var y;var style;if(dragObj._enabled&&e.touches.length===1){touch=e.touches[0];x=touch.clientX-dragObj.mouseX;y=touch.clientY-dragObj.mouseY;if(x!==0||y!==0){if(!dragObj.hasDragged){dragObj.hasDragged=true;nmev.trigger(dragObj,"dragstart",touch)}dragObj.moveBy(new nmm.Size(x,y));dragObj.mouseX=touch.clientX;dragObj.mouseY=touch.clientY;nmev.trigger(dragObj,"drag",touch)}}return nmev.preventDefault(e)};DraggableObject.prototype.ontouchend=function(e,dragObj){var hasDragged=dragObj.hasDragged;var touch;if(e.touches===1){hasDragged=dragObj.hasDragged;delete dragObj.mouseX;delete dragObj.mouseY;delete dragObj.hasDragged;if(dragObj._enabled&&hasDragged){touch=e.touches[0];nmev.trigger(dragObj,"dragend",touch)}}};nmm.MapUIOptions=MapUIOptions;nmm.KeyboardHandler=KeyboardHandler;nmm.KeyboardKeys=KeyboardKeys;nmm.DraggableObject=DraggableObject;nmm.DraggableObjectOptions=DraggableObjectOptions})();/*
 * 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 IPHONE_MAP_BUTTONS={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/iphone-map-buttons.png",size:new nmm.Size(150,61)};var IPHONE_WHITE_BUTTON={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/iphone-white-button.png",size:new nmm.Size(29,46)};var IPHONE_BLACK_BUTTON={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/iphone-black-button.png",size:new nmm.Size(29,46)};var IPHONE_BLACK_TAB_BUTTON={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/iphone-black-tab-button.png",size:new nmm.Size(29,36)};var PANEL_BACKGROUND={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/panel-bg.png",size:new nmm.Size(10,10)};var PANEL_BACKGROUND_LIGHT={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/panel-bg-light.png",size:new nmm.Size(10,10)};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 IPHONE_SHADOW={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/iphone-scalebar-shadow.png",size:new nmm.Size(170,79)};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 SPANNER={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/spanner.png",size:new nmm.Size(24,24)};var MEASUREMENT_TOOL={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/measurement-tool-tab-icons.png",size:new nmm.Size(96,20)};var CURSOR_GRAB={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/grab.cur"};CURSOR_GRAB.css=(nmc.browser.mozilla?"-moz-grab":"url("+CURSOR_GRAB.url+")"+(nmc.browser.chrome||nmc.browser.safari?" 10 10":"")+", auto");var CURSOR_GRABBING={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/grabbing.cur"};CURSOR_GRABBING.css=(nmc.browser.mozilla?"-moz-grabbing":"url("+CURSOR_GRABBING.url+")"+(nmc.browser.chrome||nmc.browser.safari?" 10 10":"")+", auto");var CURSOR_CROSSHAIR={url:nmm.HOST_URL+nmm.API_VERSION_PATH+"/img/crosshair.cur"};CURSOR_CROSSHAIR.css="url("+CURSOR_CROSSHAIR.url+")"+(nmc.browser.chrome||nmc.browser.safari?" 16 16":"")+", 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",overflow:"hidden",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.IPHONE_MAP_BUTTONS=IPHONE_MAP_BUTTONS;nmls.IPHONE_WHITE_BUTTON=IPHONE_WHITE_BUTTON;nmls.IPHONE_BLACK_BUTTON=IPHONE_BLACK_BUTTON;nmls.IPHONE_BLACK_TAB_BUTTON=IPHONE_BLACK_TAB_BUTTON;nmls.PANEL_BACKGROUND=PANEL_BACKGROUND;nmls.PANEL_BACKGROUND_LIGHT=PANEL_BACKGROUND_LIGHT;nmls.TIMELINE=TIMELINE;nmls.TIMELINE_YEAR=TIMELINE_YEAR;nmls.SHADOW=SHADOW;nmls.IPHONE_SHADOW=IPHONE_SHADOW;nmls.ZOOM=ZOOM;nmls.MAP_TOOLS=MAP_TOOLS;nmls.SPANNER=SPANNER;nmls.MEASUREMENT_TOOL=MEASUREMENT_TOOL;nmls.CURSOR_GRAB=CURSOR_GRAB;nmls.CURSOR_GRABBING=CURSOR_GRABBING;nmls.CURSOR_CROSSHAIR=CURSOR_CROSSHAIR;nmls.createClippedSprite=createClippedSprite})();/*
 * Nearmap JavaScript Library v0.3
 * 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 nmth=nearmap.threading;var nmg=nearmap.generics;var nml=nearmap.lib;var nmls=nearmap.lib.sprite;var nmlm=nearmap.lib.math;var nmlp=nearmap.lib.poly;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 _centerMarker;nmm.DEFAULT_LAT_LNG=new nmm.LatLng(-31.956967,115.87572);var styleSheet=nms.createStyleSheet("print");nms.addRules(styleSheet,"."+nmm.NO_PRINT,{display:"none"});function showCenterPoint(map){var size=map.getSize(true);if(!_centerMarker){_centerMarker=document.createElement("div")}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);map.getContainer().appendChild(_centerMarker)}function addDefaultControls(map){var shadow=new nmm.ShadowControl(false,false);var legal=new LegalControl(false,false);var output=nmh.CurrentMapHttpRequest.getMapOutput();var printMode=(output===nmh.MapOutput.PRINT);var logo;var zoom;var coord;var requests;var hwCluster;if(nearmap.isPortal){map.addControl(shadow)}if(!printMode){if(!nearmap.isPortal||output===nmh.MapOutput.EMBED||output===nmh.MapOutput.IPHONE){logo=new nmov.SystemScreenOverlay(nmm.HOST_URL+"img/logo-small-white.png",new nmov.ScreenPoint(100,0,"fractional"),new nmov.ScreenPoint(115,-5),new nmov.ScreenSize(110,36),nmm.NEARMAP_COM_URL)}else{logo=new nmov.SystemScreenOverlay(nmm.HOST_URL+"img/nearmap_watermark.png",new nmov.ScreenPoint(100,0,"fractional"),new nmov.ScreenPoint(265,0),new nmov.ScreenSize(265,120))}map.addOverlay(logo);map.addControl(legal)}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)}if(nmm.debug>=4){hwCluster=new HyperWebClusterControl();map.addControl(hwCluster)}}function ZoomLevelControl(printable,selectable){this._printable=Boolean(printable);this._selectable=Boolean(selectable)}ZoomLevelControl.prototype.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,70))};ZoomLevelControl.prototype.onmoveend=function(zoomNode){zoomNode.innerHTML="zoom: "+this.getZoom()};ZoomLevelControl.prototype.initialize=function(map){var node=document.createElement("span");node.innerHTML="zoom: "+map.getZoom();nms.css(node,{color:"#ff0000",cursor:"default","font-weight":"bold","font-size":"30px"},true);if(!this.selectable()){nmev.disableSelect(node)}if(!this.printable()){node.className=nmm.NO_PRINT}nmev.addListener(map,"moveend",nmev.callbackArgs(map,ZoomLevelControl.prototype.onmoveend,node));map.getContainer().appendChild(node);return node};ZoomLevelControl.prototype.printable=function(){return this._printable};ZoomLevelControl.prototype.selectable=function(){return this._selectable};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);_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){this._printable=Boolean(printable);this._selectable=Boolean(selectable)}TileCoordinateControl.prototype.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,100))};TileCoordinateControl.prototype.containermousemove=function(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+"]"};TileCoordinateControl.prototype.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,TileCoordinateControl.prototype.containermousemove,map,node));container.appendChild(node);return node};TileCoordinateControl.prototype.printable=function(){return this._printable};TileCoordinateControl.prototype.selectable=function(){return this._selectable};function RequestRateControl(printable,selectable){this._printable=Boolean(printable);this._selectable=Boolean(selectable)}RequestRateControl.rpsPrefix="r/ps: ";RequestRateControl.rkbpsPrefix="r kb/ps: ";RequestRateControl.rpsKey="X-HyperWeb-RequestsPerSecond";RequestRateControl.rkbpsKey="X-HyperWeb-KbPerSecond";RequestRateControl.prototype.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,135))};RequestRateControl.prototype.processHeaders=function(headers,rps,rkbps){rps.innerHTML=RequestRateControl.rpsPrefix+headers[RequestRateControl.rpsKey];rkbps.innerHTML=RequestRateControl.rkbpsPrefix+headers[RequestRateControl.rkbpsKey]};RequestRateControl.prototype.getRequestRate=function(rps,rkbps){var mapType=this.getCurrentMapType();var proj=mapType.getProjection();var sclTileSize=mapType.getScaledTileSize();var zoom=this.getZoom();var centerTile;var tileUrl;centerTile=proj.fromLatLngToTile(this.getCenter(),zoom,sclTileSize);tileUrl=nmm.TILE_INFO_URL_JSON.replace("{X}",centerTile.x).replace("{Y}",centerTile.y).replace("{Z}",zoom)+"&"+(new Date().getTime());ajax.getHeaders(tileUrl,nmev.callbackArgs(this,RequestRateControl.prototype.processHeaders,rps,rkbps))};RequestRateControl.prototype.scheduleGetRequestRate=function(rps,rkbps){var map=this;var delay=500;window.setTimeout(function(){RequestRateControl.prototype.getRequestRate.call(map,rps,rkbps)},delay)};RequestRateControl.prototype.initialize=function(map){var frag=document.createDocumentFragment();var node=document.createElement("div");var rpsWrap=document.createElement("div");var rkbpsWrap=document.createElement("div");rpsWrap.innerHTML=RequestRateControl.rpsPrefix;rkbpsWrap.innerHTML=RequestRateControl.rkbpsPrefix;nms.css(node,{"font-weight":"bold","font-size":"30px",color:"red"},true);nms.css(rpsWrap,{"line-height":"1em",margin:"0px 0px 8px 0px"},true);nms.css(rkbpsWrap,{"line-height":"1em",margin:"8px 0px 8px 0px"},true);frag.appendChild(node);node.appendChild(rpsWrap);node.appendChild(rkbpsWrap);map.getContainer().appendChild(frag);nmev.addListener(map,"moveend",nmev.callbackArgs(map,RequestRateControl.prototype.scheduleGetRequestRate,rpsWrap,rkbpsWrap));return node};RequestRateControl.prototype.printable=function(){return this._printable};RequestRateControl.prototype.selectable=function(){return this._selectable};function HyperWebClusterControl(printable,selectable){this._printable=Boolean(printable);this._selectable=Boolean(selectable)}HyperWebClusterControl.hostKey="X-HyperWebHost";HyperWebClusterControl.prototype.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,210))};HyperWebClusterControl.prototype.processHeaders=function(headers,node){node.innerHTML="hw cluster host: "+headers[HyperWebClusterControl.hostKey]};HyperWebClusterControl.prototype.getHost=function(node){var mapType=this.getCurrentMapType();var proj=mapType.getProjection();var sclTileSize=mapType.getScaledTileSize();var zoom=this.getZoom();var centerTile;var tileUrl;centerTile=proj.fromLatLngToTile(this.getCenter(),zoom,sclTileSize);tileUrl=nmm.TILE_INFO_URL_JSON.replace("{X}",centerTile.x).replace("{Y}",centerTile.y).replace("{Z}",zoom)+"&"+(new Date().getTime());ajax.getHeaders(tileUrl,nmev.callbackArgs(this,HyperWebClusterControl.prototype.processHeaders,node))};HyperWebClusterControl.prototype.initialize=function(map){var node=document.createElement("div");nms.css(node,{"font-weight":"bold","font-size":"30px",color:"red"},true);map.getContainer().appendChild(node);nmev.addListener(map,"moveend",nmev.callbackArgs(map,HyperWebClusterControl.prototype.getHost,node));return node};HyperWebClusterControl.prototype.printable=function(){return this._printable};HyperWebClusterControl.prototype.selectable=function(){return this._selectable};function LegalControl(printable,selectable){this._printable=Boolean(printable);this._selectable=Boolean(selectable)}LegalControl.prototype.getDefaultPosition=function(){return new nmm.ControlPosition(nmm.ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(10,10))};LegalControl.prototype.onmouseover=function(){this.style.borderBottomStyle="solid"};LegalControl.prototype.onmouseout=function(){this.style.borderBottomStyle="dotted"};LegalControl.prototype.initialize=function(map){var link=document.createElement("a");link.href=nmm.HOST_URL+"legal/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);if(!this.selectable()){nmev.disableSelect(link)}if(!this.printable()){link.className=nmm.NO_PRINT}link.onmouseover=nmev.callback(link,LegalControl.prototype.onmouseover);link.onmouseout=nmev.callback(link,LegalControl.prototype.onmouseout);map.getContainer().appendChild(link);return link};LegalControl.prototype.printable=function(){return this._printable};LegalControl.prototype.selectable=function(){return this._selectable};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");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);if(!selectable){nmev.disableSelect(_node)}map.getContainer().appendChild(_node);return _node}}LargeLogoControl.prototype.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 _isAdded=false;var _clipContentBorders;var _tempClose=false;var _lastDrawn=null;var _handlers=[];var _elements=[];var _contentContainers=[];var _backgroundNode;var _shadowNode;var _tabContainer;var _tabs;var _latlng;var _opts;var _divPx;var _map;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 onmoveend(){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(_that._foregroundNode){_that._foregroundNode.style.visibility="hidden"}if(_shadowNode){_shadowNode.style.visibility="hidden"}nmev.trigger(_that,"hidden")}function show(){if(_that._foregroundNode){_that._foregroundNode.style.visibility="visible"}if(_shadowNode){_shadowNode.style.visibility="visible"}}function isHidden(){return !_that._foregroundNode||_that._foregroundNode.style.visibility==="hidden"}function reset(latlng,tabs,size,offset,selectedTab){var newTabContainer;var tab;if(latlng){_latlng=latlng.copy()}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;var elm;len=sides.length;for(var i=0;i<len;i++){side=sides[i];offset=side.offset;elm=side.element;nms.css(elm,{clip:"rect("+offset.y+"px "+(side.width+offset.x)+"px "+(height+offset.y)+"px "+offset.x+"px)",height:height+"px"});elm.parentNode.style.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 anchorWrap=document.createElement("div");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(anchorWrap,{position:"relative",height:anchorSize.getHeightString()},true);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(anchorWrap);anchorWrap.appendChild(anchor);anchorWrap.appendChild(anchorBottomBorder);anchorWrap.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");_that._foregroundNode=document.createElement("div");_elements.push(_that._foregroundNode);nms.css(_that._foregroundNode,{background:"red",position:"absolute",width:_opts.maxWidth+"px"},true);nms.css(foregroundWrap,{position:"absolute",bottom:"0px"},true);_handlers.push(nmev.addListener(_map,"zoomstart",onzoomstart));_handlers.push(nmev.addListener(_map,"moveend",onmoveend));_handlers.push(nmev.addListener(_map,"click",onmapclick));floatFrag.appendChild(_that._foregroundNode);_that._foregroundNode.appendChild(foregroundWrap);foregroundWrap.appendChild(createTopBorder(_opts.maxWidth));foregroundWrap.appendChild(createMiddleContent(_opts.maxWidth));foregroundWrap.appendChild(createAnchor(_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);_that._foregroundNode.style.zIndex=nmov.Overlay.getZIndex(_latlng.lat());nmev.trigger(_that,"redraw")}}function remove(){nmev.batchRemoveListeners(_handlers);_handlers=[];if(_that._foregroundNode){_that._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 _historyContainer;var _currentUI;var _keyboardHndlr;function onstopselect(e){var target;e=e||window.event;target=nmev.getTarget(e);if(target===this){return nmev.preventDefault(e)}}function createContainers(){var frag=document.createDocumentFragment();var tileContainerWrap=document.createElement("div");_tileContainer=document.createElement("div");_historyContainer=document.createElement("div");nms.css(container,{backgroundColor:backgroundColor,overflow:"hidden",position:"relative"});if(size){container.style.height=size.getHeightString();container.style.width=size.getWidthString()}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(_historyContainer,{position:"absolute",left:"0px",top:"0px","z-index":"0"},true);nmev.addDomListener(tileContainerWrap,"mousedown",nmev.callback(tileContainerWrap,onstopselect));nmev.addDomListener(tileContainerWrap,"selectstart",nmev.callback(tileContainerWrap,onstopselect));frag.appendChild(tileContainerWrap);tileContainerWrap.appendChild(_tileContainer);_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 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.scalecontrol){map.addControl(new nmm.ScaleControl())}if(ui.controls.maptypecontrol){map.addControl(new nmm.MapTypeControl(true))}else{if(ui.controls.menumaptypecontrol){map.addControl(new nmm.MenuMapTypeControl(true))}else{if(ui.controls.hierarchicalmaptypecontrol){map.addControl(new nmm.HierarchicalRotateMapTypeControl())}}}_currentUI=ui}function setUIToDefault(){setUI(getDefaultUI())}this.getContainer=getContainer;this.getTileContainer=getTileContainer;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 positionControl(control,position,relativeToControl){var i=indexOfControl(_controls,control);var ctrlProp;var rInd;var cInd;if(i===-1){throw new Error("positionControl Error: You must add the control to the map with Map2.addControl() before your try to position it.")}ctrlProp=_controls[i];rInd=(relativeToControl?indexOfControl(_controls,relativeToControl):-1);if(rInd>=0){position.applyRelative(ctrlProp.node,_controls[rInd].node)}else{position.apply(ctrlProp.node)}if(ctrlProp.position===nmm.ControlAnchor.ANCHOR_CENTER){cInd=indexOfControl(_centeredControls,control);if(cInd>=0){_centeredControls.splice(cInd,1)}}ctrlProp.position=position;if(position.anchor===nmm.ControlAnchor.ANCHOR_CENTER){_centeredControls.push(ctrlProp)}}function addControl(control,position,relativeToControl){var node;var ctrlProp;var rInd;if(indexOfControl(_controls,control)!==-1){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";ctrlProp={control:control,position:position,node:node};_controls.push(ctrlProp);positionControl(control,position,relativeToControl);nmev.trigger(map,"addcontrol",control)}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)}nmev.trigger(map,"removecontrol",control)}}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)}}}nmev.trigger(map,"clearcontrol")}this.positionControl=positionControl;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 overlay;for(var i=_overlays.length;i--;){overlay=_overlays[i];if(!overlay._unremovable){overlay.remove();_overlays.splice(i,1)}}nmev.trigger(map,"clearoverlays")}function redrawOverlays(force){for(var i=_overlays.length;i--;){_overlays[i].redraw(force)}}function hideOverlayPanes(){var markerShadowPane=map.getPane(nmov.MapPane.MARKER_SHADOW_PANE);var markerPane=map.getPane(nmov.MapPane.MARKER_PANE);var overlayPane=map.getPane(nmov.MapPane.OVERLAY_LAYER_PANE);markerShadowPane.style.display="none";markerPane.style.display="none";overlayPane.style.display="none"}function showOverlayPanes(){var markerShadowPane=map.getPane(nmov.MapPane.MARKER_SHADOW_PANE);var markerPane=map.getPane(nmov.MapPane.MARKER_PANE);var overlayPane=map.getPane(nmov.MapPane.OVERLAY_LAYER_PANE);markerShadowPane.style.display="";markerPane.style.display="";overlayPane.style.display=""}this.addOverlay=addOverlay;this.removeOverlay=removeOverlay;this.clearOverlays=clearOverlays;this.redrawOverlays=redrawOverlays;this.hideOverlayPanes=hideOverlayPanes;this.showOverlayPanes=showOverlayPanes}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.slice();_availableMapTypeTileDates=newMapTypeTileDates;nmev.trigger(map,"maptypetiledatesupdated",oldMapTypeTileDates,newMapTypeTileDates)}}function parseTileInfo(point,zoom,requiredLayers){return function(data){var reqCnt=0;var layers;var layerDates;var newTileLayers;var currentTileLayerKeys;var availLayerNewTileDates;var layerNewTileDates;var currentMapType;var oldAvailTileDates;var oldAvailTileLayers;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={};currentMapType=mapStateManager.getCurrentMapType();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.length!==reqCnt&&zoom>currentMapType.getMinimumResolution()){try{_that.get(new nmm.Point(Math.floor(point.x/2),Math.floor(point.y/2)),zoom-1,requiredLayers)}catch(e){if(console&&console.log){console.log("Callstack error recursing tile info.")}}}else{currentTileLayerKeys=currentMapType.getTileLayerMetaKeys();oldAvailTileDates=_availableTileDates;oldAvailTileLayers=_availableTileLayers;_availableTileDates=availLayerNewTileDates;_availableTileLayers=newTileLayers;checkLayerNewTileDates(currentTileLayerKeys,oldAvailTileDates,availLayerNewTileDates);checkNewTileLayers(currentTileLayerKeys,oldAvailTileLayers,newTileLayers);mergeDateLists(currentTileLayerKeys,availLayerNewTileDates)}}}}function get(point,zoom,requiredLayers){var url;var requestType;var os;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 for TileInfo | x: %s | y: %s | z: %s",point.x,point.y,zoom)}}})}}function purgeTileDates(){var oldMapTypeTileDates;if(!map.getCurrentMapType().getRequestTileInfo()&&_availableMapTypeTileDates.length>0){oldMapTypeTileDates=_availableMapTypeTileDates.slice();_availableMapTypeTileDates=[];nmev.trigger(map,"maptypetiledatesupdated",oldMapTypeTileDates,_availableMapTypeTileDates)}}function getAvailableTileDates(){return _availableTileDates}function getAvailableTileDatesByMapType(mapType){var dates=[];var metaKeys=mapType.getTileLayerMetaKeys();var layerDates;for(var i=0;i<metaKeys.length;i++){layerDates=_availableTileDates[metaKeys[i]];if(layerDates){dates=dates.concat(layerDates)}}return dates}function getAvailableMapTypeTileDates(){return _availableMapTypeTileDates}function getAvailableTileLayers(){return _availableTileLayers}this.get=get;this.getAvailableTileDates=getAvailableTileDates;this.getAvailableTileDatesByMapType=getAvailableTileDatesByMapType;this.getAvailableMapTypeTileDates=getAvailableMapTypeTileDates;this.getAvailableTileLayers=getAvailableTileLayers;this.mergeDateLists=mergeDateLists;nmev.addListener(map,"maptypechanged",purgeTileDates)}function SplashManager(container){var _splash;function remove(){if(_splash){nme.discardElement(_splash);_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");splashMng.create("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(map,container,tileContainer,historyContainer,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.src!==nmm.TileLayer._placeholder){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}}if(!addInvisible&&tile.src!==nmm.TileLayer._placeholder){nme.discardElement(tile)}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;if(tileSets.length>=1){layer=tileSets[0];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)}function clearHistory(){var replacement;stop();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);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){dateHistory.remove(dateKey);nme.discardElement(tile)}else{empty=false}}if(empty){_history.remove(historyKey)}}function isOffset(tile,size,divOffset,scaledTileSize){var tileLeft=parseInt(tile.style.left,10)+divOffset.x;var tileTop=parseInt(tile.style.top,10)+divOffset.y;if(tileLeft+tile.width<-scaledTileSize.width){return true}if(tileLeft>size.width+scaledTileSize.width){return true}if(tileTop+tile.height<-scaledTileSize.height){return true}if(tileTop>size.height+scaledTileSize.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 scaledTileSize=map.getCurrentMapType().getScaledTileSize();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,scaledTileSize)){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)}function stop(){if(_timers.processTileChunk){window.clearTimeout(_timers.processTileChunk);delete _timers.processTileChunk}_loadedTiles=[]}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;this.stop=stop}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 getContainerCenterPixel(){var size=getSize();return new nmm.Point(Math.floor((size.width-1)/2),Math.floor((size.height-1)/2))}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.getContainerCenterPixel=getContainerCenterPixel;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,overlayMng){var _that=this;var _draggable=true;var _listeners={};var _timers={};var _animations={};var _mapDrag;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]}}}function onmapmoveend(){mapStateMng.savePosition();sessionMng.processSession()}function dragstart(e){_that.left=this._left;_that.top=this._top;nmev.trigger(map,"dragstart");nmev.trigger(map,"movestart")}function drag(e){panMap(this._left-_that.left,this._top-_that.top,true,true);_that.left=this._left;_that.top=this._top;nmev.trigger(map,"drag")}function dragend(e){delete _that.left;delete _that.top;nmev.trigger(map,"dragend");nmev.trigger(map,"moveend")}function enableDragging(){_mapDrag.enable();_draggable=true}function disableDragging(){_mapDrag.disable();_draggable=false}function draggingEnabled(){return _draggable}function setDraggableCursor(cursor){_mapDrag.setDraggableCursor(cursor)}function setDraggingCursor(cursor){_mapDrag.setDraggingCursor(cursor)}function reorganize(tileLayers){var mapType=mapStateMng.getCurrentMapType();var divOffset=nmd.topLeft(tileContainer);var vSize=sizeMng.getSize();var sclTSize=mapType.getScaledTileSize();var buffDimensions=sizeMng.getBufferedDimensions(mapType);var dimensions=sizeMng.getDimensions(mapType);var tlTile=tileLayers[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 rx=0;var ry=0;var tilesWaiting=0;var zoom;var tileDate;if(buffNw.x>0){rx=Math.ceil(buffNw.x/sclTSize.width)}else{if(buffSe.x<0){rx=-Math.ceil(-buffSe.x/sclTSize.width)}}if(buffNw.y>0){ry=Math.ceil(buffNw.y/sclTSize.height)}else{if(buffSe.y<0){ry=-Math.ceil(-buffSe.y/sclTSize.height)}}if(rx!==0||ry!==0){zoom=mapStateMng.getZoom();tileDate=mapStateMng.getTileDate();for(var i=0;i<tileLayers.length;i++){tilesWaiting+=tileLayers[i].reorganize(zoom,tileDate,rx,ry,tilesWaiting)}}}function setPanLatLng(newDivOffset,dx,dy){var mapType=mapStateMng.getCurrentMapType();var proj=mapType.getProjection();var heading=mapType.getHeading();var tScale=mapType.getTileScale();var tileSize=mapType.getTileSize();var sclTSize=mapType.getScaledTileSize();var zoom=mapStateMng.getZoom();var vCenter=sizeMng.getContainerCenterPixel();var topLeftTile;var zoomFrom;var currentTileSize;var zoomScale;var offset;var midPoint;var headingOffset;var topLeftPx;var centerPx;var centerLatLng;topLeftTile=mapType.getTileLayers()[0].getTile(0,0);offset={x:vCenter.x-newDivOffset.x-parseInt(topLeftTile.style.left,10),y:vCenter.y-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);zoomFrom=topLeftTile.zoom;currentTileSize=mapStateMng.getTileSizeAtRelativeScale(tileSize,topLeftTile.zoom,zoom);zoomScale=currentTileSize/tileSize;midPoint=Math.floor(tileSize/2);headingOffset=nmlm.rotatePoint(heading,nmm.Point.ORIGIN,new nmm.Point(midPoint,midPoint));headingOffset.x=Math.floor(headingOffset.x*zoomScale);headingOffset.y=Math.floor(headingOffset.y*zoomScale);topLeftPx=new nmm.Point(topLeftTile.point.x*tileSize*zoomScale,topLeftTile.point.y*tileSize*zoomScale);centerPx=new nmm.Point(topLeftPx.x+offset.x+headingOffset.x,topLeftPx.y+offset.y+headingOffset.y);centerLatLng=proj.fromPixelToLatLng(centerPx,zoomFrom,true,currentTileSize);mapStateMng.updateCenterLatLng(centerLatLng);return centerLatLng}function panMap(dx,dy,loadTiles,leaveContainerOffset){var divOffset;var latlng;var mapType;divOffset=nmd.topLeft(tileContainer);if(!leaveContainerOffset){divOffset.x-=dx;divOffset.y-=dy;tileContainer.style.left=divOffset.x+"px";tileContainer.style.top=divOffset.y+"px"}if(loadTiles&&!map.getIsZoomAnimating()){mapType=map.getCurrentMapType();reorganize(mapType.getTileLayers())}latlng=setPanLatLng(divOffset,dx,dy);overlayMng.redrawOverlays(false);nmev.trigger(map,"move");return latlng}function panTo(center){throw"Not Implemented Exception: Map2.panTo"}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===1){nmev.trigger(map,"movestart")}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));if(currentFrame===totalFrames){nmev.trigger(map,"moveend")}})}else{nmev.trigger(map,"movestart");panMap(distance.width,distance.height,(loadTiles===undefined?true:loadTiles));nmev.trigger(map,"moveend")}}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)}nmm.DraggableObject.setDraggableCursor(nmls.CURSOR_GRAB.css);nmm.DraggableObject.setDraggingCursor(nmls.CURSOR_GRABBING.css);_mapDrag=new nmm.DraggableObject(tileContainer,{container:tileContainer.parentNode});nmev.addListener(_mapDrag,"dragstart",dragstart);nmev.addListener(_mapDrag,"drag",drag);nmev.addListener(_mapDrag,"dragend",dragend);nmev.addListener(map,"moveend",onmapmoveend);this.clear=clear;this.reorganize=reorganize;this.enableDragging=enableDragging;this.disableDragging=disableDragging;this.draggingEnabled=draggingEnabled;this.setDraggableCursor=setDraggableCursor;this.setDraggingCursor=setDraggingCursor;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 _isZoomAnimating=false;var _listeners={};var _animations={};var _zoomFrom;var _zoomTo;function downloadTilesInwardStaircase(tileSet,downloadTimers,height,width,divOffset,tileSize,tileCheckRange){var timerOffset=10;var vCenter=sizeMng.getContainerCenterPixel();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;var tile;spiralRows=Math.ceil(height/2);spiralCols=Math.ceil(width/2);maxSteps=(spiralRows>spiralCols?spiralRows:spiralCols);for(var i=0;i<maxSteps;i++){minRow=0+i;maxRow=rows-i;minCol=0+i;maxCol=cols-i;for(var c=minCol;c<=maxCol;c++){if(minRow<=middleRow){mapStateMng.scheduleTileDownload(tileSet[minRow][c],tileCheckRange,downloadTimers,timerOffset)}if(minRow<maxRow&&maxRow>middleRow){mapStateMng.scheduleTileDownload(tileSet[maxRow][c],tileCheckRange,downloadTimers,timerOffset)}}for(var r=minRow+1;r<maxRow;r++){if(minCol<=middleCol){mapStateMng.scheduleTileDownload(tileSet[r][minCol],tileCheckRange,downloadTimers,timerOffset)}if(minCol<maxCol&&maxCol>middleCol){mapStateMng.scheduleTileDownload(tileSet[r][maxCol],tileCheckRange,downloadTimers,timerOffset)}}}}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 bodyOffset=nmd.getBodyOffset(container);var gmtry=new nmd.Geometry();var size=sizeMng.getSize();var mousePos;var cx;var cy;mousePos=gmtry.getDocPos(event,isScroll);return new nmm.Point(mousePos.x-bodyOffset.offsetLeft-Math.floor(size.width/2),mousePos.y-bodyOffset.offsetTop-Math.floor(size.height/2))}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);_isZoomAnimating=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;":"")+"left:"+position.x+"px;top:"+position.y+"px;width:"+size.width+"px;height:"+size.height+"px;z-index:"+tile.zoom+";"}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,zoomFrom){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.initialTileSize,tile.zoom,updateZoomTo);centerPx=proj.fromLatLngToPixel(centerLatLng,tile.zoom,currentScaleTileSize);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 getLockCenterLatLng(centerPx,offset,projection,heading,tileScale,currentTileSize){var scaledOffset;scaledOffset={x:offset.x/tileScale.x,y:offset.y/tileScale.y};scaledOffset=nmlm.rotatePoint(heading,scaledOffset,nmm.Point.ORIGIN);centerPx.add(scaledOffset.x,scaledOffset.y);return projection.fromPixelToLatLng(centerPx,_zoomFrom,true,currentTileSize)}function zoomMap(step,latlng){var startZoom=mapStateMng.getZoom();var frames=8;var length=328;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 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;_isZoomAnimating=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(frames,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;if(zx>=0){scale=currentTileSize/(Math.pow(2,zx)*tSize)}else{scale=currentTileSize/tSize}if(scale===0){mapType.hideAllTileLayers();return}mapStateMng.updateZoom(updateZoomTo);if(step>0){framePanOffset=new nmm.Point(Math.ceil(panOffset.x*panScale)-panOffset.x,Math.ceil(panOffset.y*panScale)-panOffset.y)}else{framePanOffset=new nmm.Point(panOffset.x-Math.ceil(panOffset.x*panScale),panOffset.y-Math.ceil(panOffset.y*panScale))}centerPx=proj.fromLatLngToPixel(map.getCenter(true),_zoomFrom,currentTileSize);newCenterLatLng=getLockCenterLatLng(centerPx,framePanOffset,proj,heading,tileScale,currentTileSize);mapStateMng.updateCenterLatLng(newCenterLatLng);vCenter=sizeMng.getContainerCenterPixel();tileOffset=mapStateMng.getDivOffsetAtRelativeScale(tileSets[0][0][0].point,centerPx,currentTileSize,tileScale,heading,divOffset,vCenter);tileContainer.style.display="none";scaleTiles(tileSets,new nmm.Size(currentTileSize*tScale.x,currentTileSize*tScale.y),tileOffset);scaleOldTiles(newCenterLatLng,updateZoomTo,divOffset,vCenter);tileContainer.style.display=""},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 getIsZoomAnimating(){return _isZoomAnimating}function enableDoubleClickZoom(){if(!_listeners.dblclickzoom){_listeners.dblclickzoom=nmev.addDomListener(tileContainer,"dblclick",ondblclick)}if(!_listeners.dblrightclickzoom){_listeners.dblrightclickzoom=nmev.addListener(map,"dblrightclick",ondblrightclick)}if(!_listeners.onepointdoubletapzoom){_listeners.onepointdoubletapzoom=nmev.addDomListener(tileContainer,"touchstart",nmt.onePointDoubleTap(containeronepointdbltap))}_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}_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;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;var tapLatLng;touch=e.touches[0];tapLatLng=zoomLockToInputPosition(touch,1)}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.getIsZoomAnimating=getIsZoomAnimating;this.setZoom=setZoom;this.zoomIn=zoomIn;this.zoomOut=zoomOut}function MapStateManager(map,mapTypes,container,tileContainer,historyContainer,sizeMng,sessionMng,tileHistoryMng,ctrlMng,overlayMng){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,requestTileInfo,downloadTiles){createMapType(latlng,zoom,tileDate,mapType,requestTileInfo,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()}}nmev.trigger(map,"tilesloaded")}return allReturned}function createBackFillTile(origPoint,origZoom,lastZoom,tileDate,mapType,tileLayer){var zoom=lastZoom-1;var scale;var tileCoords;var key;var tScale;var tileSize;var currentTileSize;var scaledTileSize;var tileOffset;var tile;var divOffset;var size;var vCenter;var proj;var centerPx;var heading;var url;var dateHistory;if(zoom>=0){scale=Math.pow(2,origZoom-zoom);tileCoords={x:Math.floor(origPoint.x/scale),y:Math.floor(origPoint.y/scale)};key=tileHistoryMng.getHistoryKey(tileCoords,zoom);dateHistory=tileHistoryMng.getHistory().getValue(key);if(!dateHistory||!dateHistory.exists(nml.DateHelper.toNearmapDateUTC(tileDate))){proj=mapType.getProjection();divOffset=nmd.topLeft(tileContainer);vCenter=sizeMng.getContainerCenterPixel();heading=mapType.getHeading();tScale=mapType.getTileScale();tileSize=mapType.getTileSize();currentTileSize=getTileSizeAtRelativeScale(tileSize,zoom,origZoom);scaledTileSize=new nmm.Size(currentTileSize*tScale.x,currentTileSize*tScale.y);centerPx=proj.fromLatLngToPixel(getCenter(),zoom,currentTileSize);tileOffset=getDivOffsetAtRelativeScale(tileCoords,centerPx,currentTileSize,tScale,heading,divOffset,vCenter);url=tileLayer.getTileUrl(tileCoords,zoom,tileDate);tile=nmm.TileLayer.createTile(url,tileCoords,tileCoords,zoom,tileDate,scaledTileSize,tileOffset,false,1,true,onbackfilltileload,onbackfilltileerror(origPoint,origZoom,tileDate,mapType,tileLayer));if(nmm.debug){tile.style.borderColor="lime"}tileHistoryMng.appendHistory(tile,mapType,true);nmm.TileLayer.downloadTile(tile)}}}function onbackfilltileload(){tileHistoryMng.processLoadedTile(this)}function onbackfilltileerror(origPoint,origZoom,tileDate,mapType,tileLayer){return function(){try{createBackFillTile(origPoint,origZoom,this.zoom,this.date,mapType,tileLayer)}catch(e){if(console&&console.log){console.log("Create backfill callstack error")}}tileHistoryMng.remove(tileHistoryMng.getHistoryKey(this.wrappedPoint,this.zoom),this.date)}}function ontileload(){var cnt=this.parentNode;if(!cnt){return}this.returned=true;if(cnt.layerIndex===0){cnt.tilesLoaded++;cnt.tilesReturned++;if(!checkBaseLayerLoaded(cnt)){tileHistoryMng.processLoadedTile(this)}}}function ontileerror(mapType,tileLayer){return function(e){var cnt=this.parentNode;if(!cnt){return}this.errored=true;this.returned=true;if(cnt.layerIndex===0&&!this.returned){cnt.tilesReturned++;checkBaseLayerLoaded(cnt)}if(this.enableBackfill){createBackFillTile(this.wrappedPoint,this.zoom,this.zoom,this.date,mapType,tileLayer)}}}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.ceil(getPreciseTileSizeAtRelativeScale(origSize,origZoom,newZoom))}function getDivOffsetAtRelativeScale(point,centerPx,newTileSize,tileScale,heading,divOffset,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),Math.round);centerOffset=new nmm.Point(tilePx.x-centerPx.x+nwTileOffset.x,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=centerOffset.x+vCenter.x;centerOffset.y=centerOffset.y+vCenter.y;var offset=new nmm.Point(centerOffset.x-divOffset.x,centerOffset.y-divOffset.y);offset.x=Math.round(offset.x);offset.y=Math.round(offset.y);return offset}function getTileLayerInitOptions(latlng,zoom,tileDate,mapType,downloadTiles){var proj=mapType.getProjection();var heading=mapType.getHeading();var tSize=mapType.getTileSize();var sclTSize=mapType.getScaledTileSize();var tScale=mapType.getTileScale();var dimension=sizeMng.getBufferedDimensions(mapType);var centerPx;var cornerOffset;var topLeftTile;var centerTile;var vCenter;var divOffset;var tileOffset;latlng=latlng.copy(false);centerPx=proj.fromLatLngToPixel(latlng,zoom,tSize);cornerOffset=new nmm.Point(Math.ceil(dimension.width/2)-1,Math.ceil(dimension.height/2)-1);if(heading!==0){cornerOffset=nmlm.rotatePoint(heading,cornerOffset,nmm.Point.ORIGIN,Math.round)}centerTile=new nmm.Point(Math.floor(centerPx.x/tSize),Math.floor(centerPx.y/tSize));topLeftTile=new nmm.Point(centerTile.x-cornerOffset.x,centerTile.y-cornerOffset.y);vCenter=sizeMng.getContainerCenterPixel();divOffset=nmd.topLeft(tileContainer);tileOffset=getDivOffsetAtRelativeScale(topLeftTile,centerPx,tSize,tScale,heading,divOffset,vCenter);return{vCenter:vCenter,centerPx:centerPx,origin:topLeftTile,zoom:zoom,dimension:dimension,projection:proj,heading:heading,tileSize:sclTSize,tileDate:tileDate,originOffset:tileOffset,divOffset:divOffset,tileLoadHandler:ontileload,downloadTiles:downloadTiles||downloadTilesOutwardStaircase}}function createMapType(centerLatLng,zoom,tileDate,mapType,requestTileInfo,downloadTiles){var frag=document.createDocumentFragment();var tLayers=mapType.getTileLayers();var tlen=tLayers.length;var layerInitOpts;var layer;var mapTypeContainer;var wrapYMin;mapTypeContainer=document.createElement("div");frag.appendChild(mapTypeContainer);nms.css(mapTypeContainer,{position:"absolute",left:"0px",top:"0px"},true);_currentMapTypeContainer=mapTypeContainer;_currentMapType=mapType;layerInitOpts=getTileLayerInitOptions(centerLatLng,zoom,tileDate,mapType,downloadTiles);for(var lcnt=0;lcnt<tlen;lcnt++){layer=tLayers[lcnt];layerContainer=layer.initialize(layerInitOpts.origin,layerInitOpts.zoom,layerInitOpts.dimension,layerInitOpts.projection,{heading:layerInitOpts.heading,tileSize:layerInitOpts.tileSize,tileDate:layerInitOpts.tileDate,originOffset:layerInitOpts.originOffset,tileLoadHandler:layerInitOpts.tileLoadHandler,tileErrorHandler:ontileerror(mapType,layer),layerIndex:lcnt,downloadTiles:layerInitOpts.downloadTiles});mapTypeContainer.appendChild(layerContainer)}tileContainer.appendChild(frag);wrapYMin=layerInitOpts.vCenter.y-layerInitOpts.centerPx.y-layerInitOpts.divOffset.y;_wrapYDivPx={min:wrapYMin,max:wrapYMin+layerInitOpts.projection.getWrapHeight(zoom,layerInitOpts.tileSize.height)}}function downloadTileDelayed(tile){return function(){nmm.TileLayer.downloadTile(tile)}}function scheduleTileDownload(tile,tileCheckRange,timers,timerOffset){var len=timers.length;if(tileCheckRange(tile.point,tile.zoom)){timers.push(window.setTimeout(downloadTileDelayed(tile),len*timerOffset))}}function downloadTilesOutwardStaircase(tileSet,downloadTimers,height,width,divOffset,tileSize,tileCheckRange){var timerOffset=10;var vCenter=sizeMng.getContainerCenterPixel();var offsetLeft;var offsetTop;var divOffsetCenterPx;var centerTile;var spiralRows;var spiralCols;var maxSteps;var minRow;var minCol;var maxRow;var maxCol;var tile;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++){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){scheduleTileDownload(tileSet[minRow][c],tileCheckRange,downloadTimers,timerOffset)}if(minRow!==maxRow&&maxRow<height){scheduleTileDownload(tileSet[maxRow][c],tileCheckRange,downloadTimers,timerOffset)}}}for(var r=minRow+1;r<maxRow;r++){if(r>=0&&r<height){if(minCol>=0){scheduleTileDownload(tileSet[r][minCol],tileCheckRange,downloadTimers,timerOffset)}if(minCol!==maxCol&&maxCol<width){scheduleTileDownload(tileSet[r][maxCol],tileCheckRange,downloadTimers,timerOffset)}}}}}function isMapTypeAvailable(type){var availLayers;var layerKeys;if(!type.getRequestTileInfo()){return true}layerKeys=type.getTileLayerMetaKeys();availLayers=_tileInfoMng.getAvailableTileLayers();for(var i=layerKeys.length;i--;){if(nml.ArrayHelper.indexOf(availLayers,layerKeys[i])>=0){return true}}return false}function isInBackfillMode(callback){return}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 getShowingTileDate(){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 zoom=(minZoom===undefined||minZoom<1?1:minZoom);var ne=bounds.getNorthEast();var sw=bounds.getSouthWest();var tSize;var tScale;var nePx;var swPx;if(_currentMapType){proj=_currentMapType.getProjection();tSize=_currentMapType.getTileSize();tScale=_currentMapType.getTileScale()}else{proj=new nmm.MercatorProjection();tSize=nmm.DEFAULT_TILE_SIZE;tScale=new nmm.Point(1,1)}nePx=proj.fromLatLngToPixel(ne,zoom,tSize);swPx=proj.fromLatLngToPixel(sw,zoom,tSize);if(tScale.x!==1){nePx.x=Math.floor(nePx.x*tScale.x);swPx.x=Math.floor(swPx.x*tScale.x)}if(tScale.y!==1){nePx.y=Math.floor(nePx.y*tScale.y);swPx.y=Math.floor(swPx.y*tScale.y)}if(!size){size=sizeMng.getSize()}if(nePx.x-swPx.x<size.width&&swPx.y-nePx.y<size.height){return 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){if(oldMapType){mapType=oldMapType}else{if(_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){tileHistoryMng.stop();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&&oldMapType!==mapType){nmev.trigger(map,"maptypechanged")}if((_tileDate&&!oldDate)||(!_tileDate&&oldDate)||(oldDate&&_tileDate&&oldDate.getTime()-_tileDate.getTime()!==0)){nmev.trigger(map,"tiledatechanged",oldDate,_tileDate)}overlayMng.redrawOverlays(true);nmev.trigger(map,"move");nmev.trigger(map,"moveend")}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 fromDivPixelToContainerPixel(divPixel){var tileContainer=map.getTileContainer();var topLeft=nmd.topLeft(tileContainer);return new nmm.Point(divPixel.x+topLeft.x,divPixel.y+topLeft.y)}function fromContainerPixelToDivPixel(containerPixel){var tileContainer=map.getTileContainer();var topLeft=nmd.topLeft(tileContainer);return new nmm.Point(containerPixel.x-topLeft.x,containerPixel.y-topLeft.y)}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){console.log("apply wrap");divPx.y+=(Math.ceil((_wrapYDivPx.min-divPx.y)/wrapHeight)*wrapHeight)}if(divPx.y>_wrapYDivPx.max){console.log("apply wrap");divPx.y-=(Math.ceil((divPx.y-_wrapYDivPx.max)/wrapHeight)*wrapHeight)}return divPx}function fromDivPixelToLatLng(pixel){var proj=_currentMapType.getProjection();var tSize=_currentMapType.getTileSize();var tScale=_currentMapType.getTileScale();var zoom=getZoom();var centerPx=proj.fromLatLngToPixel(getCenter(true),zoom,tSize);var size=sizeMng.getSize(true);var vCenter=new nmm.Point(Math.floor(size.width/2),Math.floor(size.height/2));var centerOffset;var rotatedOffset;centerOffset={x:-vCenter.x+pixel.x,y:-vCenter.y+pixel.y};rotatedOffset=nmlm.rotatePoint(_currentMapType.getHeading(),centerOffset,nmm.Point.ORIGIN);rotatedOffset.x=Math.floor(rotatedOffset.x/tScale.x);rotatedOffset.y=Math.floor(rotatedOffset.y/tScale.y);centerPx.add(rotatedOffset.x,rotatedOffset.y);return proj.fromPixelToLatLng(centerPx,zoom,true,tSize)}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();if(tScale.x!==1||tScale.y!==1){resizeOffset.x/=tScale.x;resizeOffset.y/=tScale.y;resizeOffset.x=Math[size.width%2===0?"ceil":"floor"](resizeOffset.x);resizeOffset.y=Math[size.height%2===0?"ceil":"floor"](resizeOffset.y);resizeOffset=nmlm.rotatePoint(heading,resizeOffset,nmm.Point.ORIGIN,Math.round)}resizeOffset.x=Math[size.width%2===0?"floor":"ceil"](resizeOffset.x/2);resizeOffset.y=Math[size.height%2===0?"floor":"ceil"](resizeOffset.y/2);centerPx=proj.fromLatLngToPixel(getCenter(),zoom,tSize);centerPx.add(resizeOffset.x,resizeOffset.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 cancelGetTileInfo(){if(_timers.gettileinfo){window.clearTimeout(_timers.gettileinfo);delete _timers.gettileinfo}}function scheduleGetTileInfo(){var tileInfoDelay=500;cancelGetTileInfo();_timers.gettileinfo=window.setTimeout(function(){_tileInfoMng.get(getCenterTile(),getZoom());delete _timers.gettileinfo},tileInfoDelay)}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.isMapTypeRegistered=isMapTypeRegistered;this.getCurrentMapType=getCurrentMapType;this.getMapTypes=getMapTypes;this.setMapType=setMapType;this.addMapType=addMapType;this.removeMapType=removeMapType;this.getTileLayerInitOptions=getTileLayerInitOptions;this.getAvailableTileLayers=_tileInfoMng.getAvailableTileLayers;this.getAvailableTileDatesByMapType=_tileInfoMng.getAvailableTileDatesByMapType;this.getAvailableMapTypeTileDates=_tileInfoMng.getAvailableMapTypeTileDates;this.isMapTypeAvailable=isMapTypeAvailable;this.isInBackfillMode=isInBackfillMode;this.getZoom=getZoom;this.getCenter=getCenter;this.getCenterPixel=getCenterPixel;this.getScaledCenterPixel=getScaledCenterPixel;this.getCenterTile=getCenterTile;this.getTileDate=getTileDate;this.getShowingTileDate=getShowingTileDate;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.fromContainerPixelToDivPixel=fromContainerPixelToDivPixel;this.fromContainerPixelToLatLng=fromContainerPixelToLatLng;this.fromLatLngToContainerPixel=fromLatLngToContainerPixel;this.fromDivPixelToContainerPixel=fromDivPixelToContainerPixel;this.fromDivPixelToLatLng=fromDivPixelToLatLng;this.fromLatLngToDivPixel=fromLatLngToDivPixel;this.getTileSizeAtRelativeScale=getTileSizeAtRelativeScale;this.getDivOffsetAtRelativeScale=getDivOffsetAtRelativeScale;this.checkResize=checkResize;this.scheduleTileDownload=scheduleTileDownload;this.getTileInfoManager=getTileInfoManager;registerMapTypes();nmev.addListener(map,"maptypetiledatesupdated",updateShowingDate);nmev.addListener(map,"zoomstart",cancelGetTileInfo);nmev.addListener(map,"movestart",cancelGetTileInfo);nmev.addListener(map,"moveend",scheduleGetTileInfo);nmev.addListener(map,"tiledatechanged",updateShowingDateOnTileDateChanged)}function MapEventManager(map,container,tileContainer,mapStateMng){var _that=this;var _dragCnt=0;var _panSpeed=50;var _listeners={};var _timers={};var _clickCount=0;var _mouseovermap=false;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;var bodyOffset;e=e||window.event;target=nmev.getTarget(e);_clickCount++;clickPoint=new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop);if(!_timers.rightclick){_timers.rightclick=window.setTimeout(function(clickPoint,target){return function(){delete _timers.rightclick;nmev.trigger(map,"singlerightclick",clickPoint,target,null);_clickCount=0}}(clickPoint,target),dblclickTimeout)}else{window.clearTimeout(_timers.rightclick);_timers.rightclick=window.setTimeout(function(){delete _timers.rightclick;_clickCount=0},dblclickTimeout);if(_clickCount%2===0){bodyOffset=nmd.getBodyOffset(container);clickPoint=new nmm.Point(e.clientX-bodyOffset.offsetLeft,e.clientY-bodyOffset.offsetTop);latlng=mapStateMng.fromContainerPixelToLatLng(clickPoint);nmev.trigger(map,"dblrightclick",null,latlng)}}return showContextMenu(target)}function containermouseover(e){var cpx;if(!_mouseovermap&&map.isLoaded()){e=e||window.event;cpx=new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop);_mouseovermap=true;nmev.trigger(map,"mouseover",map.fromContainerPixelToLatLng(cpx))}}function containermouseout(e){var relatedTarget;var cpx;e=e||window.event;relatedTarget=nmev.getRelatedTarget(e);if(map.isLoaded()&&(!relatedTarget||!nmd.contains(container,relatedTarget))){_mouseovermap=false;cpx=new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop);nmev.trigger(map,"mouseout",map.fromContainerPixelToLatLng(cpx))}}function containermousemove(e){var cpx;if(map.isLoaded()){e=e||window.event;cpx=new nmm.Point(e.clientX-container.offsetLeft,e.clientY-container.offsetTop);nmev.trigger(map,"mousemove",map.fromContainerPixelToLatLng(cpx))}}nmev.addDomListener(window,"resize",mapStateMng.checkResize);tileContainer.oncontextmenu=oncontextmenu;nmev.addDomListener(container,"mouseover",containermouseover);nmev.addDomListener(container,"mouseout",containermouseout);nmev.addDomListener(container,"mousemove",containermousemove);nmev.addDomListener(tileContainer,"mousedown",nmev.callbackArgs(tileContainer,MapEventManager.prototype.mousedown,this));nmev.addDomListener(tileContainer,"mouseup",nmev.callbackArgs(tileContainer,MapEventManager.prototype.mouseup,this));this._mapStateManager=mapStateMng;this._map=map}MapEventManager.prototype.mousedown=function(e){var target;e=e||window.event;if(nmev.getMouseButton(e)===nmev.MouseButton.LEFT_BUTTON){this.mouseDownX=e.clientX;this.mouseDownY=e.clientY}};MapEventManager.prototype.mouseup=function(e,instance){var latlng;var target;var container;e=e||window.event;target=nmev.getTarget(e);if(this.mouseDownX===e.clientX||this.mouseDownY===e.clientY){container=instance._map.getContainer();latlng=instance._mapStateManager.fromContainerPixelToLatLng({x:e.clientX-container.offsetLeft+nmd.getBodyScrollLeft(),y:e.clientY-container.offsetTop+nmd.getBodyScrollTop()});nmev.trigger(instance._map,"click",null,latlng,null)}this.mouseDownX=null;this.mouseDownY=null};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);_overlayMng=new OverlayManager(map);_uiMng=new UIManager(map,container,opts.backgroundColor,opts.size,_controlMng);_tileContainer=_uiMng.getTileContainer();_sizeMng=new SizeManager(container);_tileHistoryMng=new TileHistoryManager(map,container,_tileContainer,_uiMng.getHistoryContainer(),_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);_infoWindowMng=new InfoWindowManager(map,_overlayMng);_panMng=new PanManager(map,container,_tileContainer,_mapStateMng,_sizeMng,_sessionMng,_overlayMng);_zoomMng=new ZoomManager(map,container,_tileContainer,_zoomLockControl,_mapStateMng,_sizeMng,_tileHistoryMng,_panMng,_uiMng);_mapEventMng=new MapEventManager(map,container,_tileContainer,_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.setDraggableCursor=_panMng.setDraggableCursor;map.setDraggingCursor=_panMng.setDraggingCursor;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.getTileLayerInitOptions=_mapStateMng.getTileLayerInitOptions;map.isMapTypeRegistered=_mapStateMng.isMapTypeRegistered;map.getMapTypes=_mapStateMng.getMapTypes;map.getCurrentMapType=_mapStateMng.getCurrentMapType;map.setMapType=_mapStateMng.setMapType;map.addMapType=_mapStateMng.addMapType;map.removeMapType=_mapStateMng.removeMapType;map.getAvailableTileDatesByMapType=_mapStateMng.getAvailableTileDatesByMapType;map.getAvailableMapTypeTileDates=_mapStateMng.getAvailableMapTypeTileDates;map.getAvailableTileLayers=_mapStateMng.getAvailableTileLayers;map.isMapTypeAvailable=_mapStateMng.isMapTypeAvailable;map.isInBackfillMode=_mapStateMng.isInBackfillMode;map.isLoaded=_mapStateMng.isLoaded;map.getIsZoomAnimating=_zoomMng.getIsZoomAnimating;map.getSize=_sizeMng.getSize;map.getZoom=_mapStateMng.getZoom;map.getTileDate=_mapStateMng.getTileDate;map.getShowingTileDate=_mapStateMng.getShowingTileDate;map.getCenter=_mapStateMng.getCenter;map.getBounds=_mapStateMng.getBounds;map.getBoundsZoomLevel=_mapStateMng.getBoundsZoomLevel;map.checkResize=_mapStateMng.checkResize;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.reorganize=_panMng.reorganize;map.fromContainerPixelToDivPixel=_mapStateMng.fromContainerPixelToDivPixel;map.fromContainerPixelToLatLng=_mapStateMng.fromContainerPixelToLatLng;map.fromLatLngToContainerPixel=_mapStateMng.fromLatLngToContainerPixel;map.fromDivPixelToContainerPixel=_mapStateMng.fromDivPixelToContainerPixel;map.fromDivPixelToLatLng=_mapStateMng.fromDivPixelToLatLng;map.fromLatLngToDivPixel=_mapStateMng.fromLatLngToDivPixel;map.addControl=_controlMng.addControl;map.removeControl=_controlMng.removeControl;map.positionControl=_controlMng.positionControl;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.hideOverlayPanes);nmev.addListener(map,"zoomend",_overlayMng.showOverlayPanes)}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.getShowingTileDate());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})();/*
 * 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 nmt=nearmap.threading;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;var h;var v;if(this.anchor===ControlAnchor.ANCHOR_CENTER){container=elm.parentNode;elm.style.right="";elm.style.bottom="";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{h=this.xA();v=this.yA();elm.style[h]=this.offset.getWidthString();elm.style[v]=this.offset.getHeightString();elm.style[h==="left"?"right":"left"]="";elm.style[v==="top"?"bottom":"top"]=""}};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;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}}PanControl.prototype.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 frag=document.createDocumentFragment();var spriteBtn=document.createElement("span");_node=document.createElement("a");_node.title="Zoom in";nms.css(_node,{cursor:"pointer",height:"22px",width:"22px",overflow:"hidden",position:"relative"},true);nms.css(spriteBtn,{clip:"rect(116px 23px 139px 1px)",height:_sprite.size.getHeightString(),width:_sprite.size.getWidthString(),position:"absolute",left:"-1px",top:"-116px"},true);nms.applyPngAlphaBg(spriteBtn,_sprite.url);nmev.addDomListener(_node,"click",nmev.callbackArgs(_node,onzoomclick,map));frag.appendChild(_node);_node.appendChild(spriteBtn);return _node}}ZoomInControl.prototype.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 frag=document.createDocumentFragment();var spriteBtn=document.createElement("span");_node=document.createElement("a");_node.title="Zoom out";nms.css(_node,{cursor:"pointer",height:"22px",width:"22px",overflow:"hidden",position:"relative"},true);nms.css(spriteBtn,{clip:"rect(145px 23px 167px 1px)",height:_sprite.size.getHeightString(),width:_sprite.size.getWidthString(),position:"absolute",top:"-145px",left:"-1px"},true);nms.applyPngAlphaBg(spriteBtn,_sprite.url);nmev.addDomListener(_node,"click",nmev.callbackArgs(_node,onzoomclick,map));frag.appendChild(_node);_node.appendChild(spriteBtn);return _node}}ZoomOutControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))};function IPhoneZoomOutControl(printable,selectable){var _node;function onzoomclick(e,map){map.zoomOut()}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){_node=document.createElement("a");_node.title="Zoom out";_node.innerHTML="-";nms.css(_node,{color:"#fff",cursor:"pointer","font-size":"70px",height:"30px",width:"30px","line-height":"18px","text-align":"center","-webkit-border-image":"url("+nmls.IPHONE_WHITE_BUTTON.url+") 10 14"},true);_node.onclick=nmev.callbackArgs(_node,onzoomclick,map);map.getContainer().appendChild(_node);return _node}}IPhoneZoomOutControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(8,8))};function IPhoneControl(printable,selectable){var _calloutHeight=125;var _node;var _callout;function show(e){var frames=10;var length=400;var width;var height;_callout.style.visibility="hidden";_callout.style.display="";width=_callout.offsetWidth;height=_callout.offsetHeight;nma.runFixedAnimation(frames,length,function(currentFrame,totalFrames){var ratio;var bottom;var left;_callout.style.visibility="";if(currentFrame===totalFrames){_callout.style.clip=""}else{ratio=currentFrame/totalFrames;bottom=Math.floor(height*ratio);left=width-Math.floor(width*ratio);_callout.style.clip="rect(0px "+width+"px "+bottom+"px "+left+"px)"}})}function hide(e){var frames=10;var length=400;var width;var height;width=_callout.offsetWidth;height=_callout.offsetHeight;nma.runFixedAnimation(frames,length,function(currentFrame,totalFrames){var ratio;var bottom;var left;_callout.style.visibility="";if(currentFrame===totalFrames){_callout.style.clip="";_callout.style.display="none"}else{ratio=currentFrame/totalFrames;bottom=height-Math.floor(height*ratio);left=Math.floor(width*ratio);_callout.style.clip="rect(0px "+width+"px "+bottom+"px "+left+"px)"}})}function createCallout(map){var frag=document.createDocumentFragment();var calloutBorder=document.createElement("div");var calloutContent=document.createElement("div");var resetNode=new IPhoneResetControl().initialize(map);var locationNode=new GeoLocationControl().initialize(map);var mapTypeMenu=new DropDownMapTypeControl();var dateDrpMenuNode=new IPhoneTimelineControl().initialize(map);var close=document.createElement("a");var locationPosition=new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(10,10));var resetPosition=new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(60,10));var mapTypeMenuPosition=new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(10,10));var dateDrpMenuPosition=new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(10,35));var mapTypeMenuNode;_callout=document.createElement("div");close.innerHTML="close";mapTypeMenuNode=mapTypeMenu.initialize(map);nms.css(_callout,{display:"none",height:_calloutHeight+"px",width:"100%",position:"absolute"},true);nms.css(calloutBorder,{border:"solid 8px #fff","-webkit-border-radius":"5px",height:"67px",opacity:"0.5",position:"relative"},true);nms.css(calloutContent,{background:"#fff",border:"solid 1px #ccc",height:"65px",margin:"0px 8px",position:"relative",top:"-75px"},true);nms.css(close,{"-webkit-border-image":"url("+nmls.IPHONE_BLACK_TAB_BUTTON.url+") 14 14","-webkit-border-bottom-left-radius":"5px","-webkit-border-bottom-right-radius":"5px",color:"#fff","font-size":"18px","font-weight":"bold",padding:"3px 10px",position:"absolute",bottom:"-49px",right:"0px"},true);locationPosition.apply(locationNode);resetPosition.apply(resetNode);mapTypeMenuPosition.apply(mapTypeMenuNode);dateDrpMenuPosition.apply(dateDrpMenuNode);close.onclick=hide;frag.appendChild(_callout);_callout.appendChild(calloutBorder);_callout.appendChild(calloutContent);calloutContent.appendChild(locationNode);calloutContent.appendChild(resetNode);calloutContent.appendChild(mapTypeMenuNode);calloutContent.appendChild(dateDrpMenuNode);calloutContent.appendChild(close);map.getContainer().appendChild(_callout)}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var frag=document.createDocumentFragment();var spanner;_node=document.createElement("a");spanner=document.createElement("img");_node.title="Map Options";spanner.src=nmls.SPANNER.url;nms.css(_node,{color:"#fff",cursor:"pointer","font-size":"12px",height:"30px",width:"30px","line-height":"18px","text-align":"center","-webkit-border-image":"url("+nmls.IPHONE_WHITE_BUTTON.url+") 10 14"},true);nms.css(spanner,{margin:"auto",height:nmls.SPANNER.size.getHeightString(),width:nmls.SPANNER.size.getWidthString(),position:"relative",top:"2px"},true);_node.onclick=show;frag.appendChild(_node);_node.appendChild(spanner);map.getContainer().appendChild(_node);createCallout(map);return _node}}IPhoneControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(8,8))};function DropDownMapTypeControl(printable,selectable){var _staticMapTypes=[];var _monitorMapTypes=[];var _node;function onselectchange(e,map){map.setMapType(this.options[this.selectedIndex].mapType)}function onmaptypechanged(){selectMapTypeOption(_node,this.getCurrentMapType())}function getStaticMapTypes(map){var mapTypes=map.getMapTypes();var len=mapTypes.length;var type;for(var i=0;i<len;i++){type=mapTypes[i];if(nml.ArrayHelper.indexOf(_monitorMapTypes,type)===-1){_staticMapTypes.push(type)}}}function addOption(selectBox,text,value,mapType,isStatic){var optn=document.createElement("option");optn.text=text;optn.value=value;optn.mapType=mapType;optn.isStatic=isStatic;selectBox.options.add(optn)}function selectMapTypeOption(selectBox,mapType){var opts=selectBox.options;var len=opts.length;var i=0;var found=false;while(i<len&&!found){if(opts[i].mapType===mapType){selectBox.selectedIndex=i;found=true}i++}}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var len;var type;_node=document.createElement("select");getStaticMapTypes(map);len=_staticMapTypes.length;for(var i=0;i<len;i++){type=_staticMapTypes[i];addOption(_node,type.getName(true),type.getName(false),type,true)}selectMapTypeOption(_node,map.getCurrentMapType());nms.css(_node,{position:"absolute"},true);_node.onchange=nmev.callbackArgs(_node,onselectchange,map);nmev.addListener(map,"maptypechanged",onmaptypechanged);map.getContainer().appendChild(_node);return _node};this.addMonitorMapType=function(mapType){_monitorMapTypes.push(mapType)};this.addMonitorMapTypes=function(mapTypes){_monitorMapTypes=_monitorMapTypes.concat(mapTypes)}}DropDownMapTypeControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_RIGHT,new nmm.Size(5,5))};function IPhoneTimelineControl(printable,selectable){var _node;function ondatechange(e,map){map.setTileDate(this.options[this.selectedIndex].surveyDate)}function ontiledatechanged(oldDate,newDate){selectDate(_node,newDate)}function addOption(selectBox,text,value,surveyDate){var opt=document.createElement("option");opt.text=text;opt.value=value;opt.surveyDate=surveyDate;selectBox.options.add(opt)}function selectDate(selectBox,date){var len;var found;var i;var dateMs;var optDate;if(!date){selectBox.selectedIndex=0;return}dateMs=date.getTime();len=selectBox.options.length;found=false;i=0;while(i<len&&!found){optDate=selectBox.options[i];if(optDate.surveyDate&&optDate.surveyDate.getTime()===dateMs){selectBox.options.selectedIndex=i;found=true}i++}}function renderDates(){var dates=this.getAvailableMapTypeTileDates().slice();var selectedDate=this.getTileDate();var latestStr="";var surveyDate;_node.options.length=0;if(selectedDate&&!nml.DateHelper.dateExists(dates,selectedDate)){dates.push(selectedDate);dates.sort(function(x,y){return x.getTime()-y.getTime()})}if(dates.length>0){latestStr=" ("+nml.DateHelper.smallDateUTC(dates[dates.length-1])+")"}addOption(_node,"Latest"+latestStr,"",null);for(var i=dates.length;i--;){surveyDate=dates[i];addOption(_node,nml.DateHelper.smallDateUTC(surveyDate),nml.DateHelper.toNearmapDateUTC(surveyDate),surveyDate)}selectDate(_node,this.getTileDate())}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){_node=document.createElement("select");nms.css(_node,{position:"absolute"},true);renderDates.call(map);_node.onchange=nmev.callbackArgs(_node,ondatechange,map);nmev.addListener(map,"maptypetiledatesupdated",renderDates);nmev.addListener(map,"tiledatechanged",ontiledatechanged);map.getContainer().appendChild(_node);return _node}}IPhoneTimelineControl.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))};function IPhoneResetControl(printable,selectable){var _node;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){_node=document.createElement("a");_node.title="Show the whole world";nms.css(_node,{background:"url("+nmls.IPHONE_MAP_BUTTONS.url+") no-repeat -53px -3px","-webkit-border-image":"url("+nmls.IPHONE_WHITE_BUTTON.url+") 10 14",color:"#fff",cursor:"pointer","font-size":"12px",height:"30px",width:"30px","line-height":"18px","text-align":"center",position:"absolute"},true);_node.onclick=nmev.callbackArgs(_node,onbuttonclick,map);map.getContainer().appendChild(_node);return _node}}IPhoneResetControl.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 frag=document.createDocumentFragment();var spriteBtn=document.createElement("span");_node=document.createElement("a");_node.title="Show the whole world";nms.css(_node,{cursor:"pointer",height:"22px",width:"22px",overflow:"hidden",position:"relative"},true);nms.css(spriteBtn,{clip:"rect(174px 23px 196px 1px)",height:_sprite.size.getHeightString(),width:_sprite.size.getWidthString(),position:"absolute",top:"-174px",left:"-1px"},true);nms.applyPngAlphaBg(spriteBtn,_sprite.url);nmev.addDomListener(_node,"click",nmev.callbackArgs(_node,onbuttonclick,map));frag.appendChild(_node);_node.appendChild(spriteBtn);return _node}}ResetControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))};function SmallZoomControl3D(printable,selectable){this._printable=Boolean(printable);this._selectable=Boolean(selectable)}SmallZoomControl3D._sprite=nmls.BUTTONS;SmallZoomControl3D._vSprite=nmls.BUTTONS_VERTICAL;SmallZoomControl3D.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(10,10))};SmallZoomControl3D.prototype.createBackground=function(width,height){var sprite=SmallZoomControl3D._sprite;var vSprite=SmallZoomControl3D._vSprite;var cornerSize=new nmm.Size(10,10);var hEdgeSize=new nmm.Size(width-(2*cornerSize.width),cornerSize.height);var vEdgeSize=new nmm.Size(cornerSize.width,height-(2*cornerSize.height));var frag=document.createDocumentFragment();var background=document.createElement("div");var borderTopWrap=document.createElement("div");var borderBottomWrap=document.createElement("div");var middleWrap=document.createElement("div");var topLeftCorner=nmls.createClippedSprite(sprite,cornerSize,new nmm.Point(60,260));var topEdge=nmls.createClippedSprite(sprite,hEdgeSize,new nmm.Point(0,275));var topRightCorner=nmls.createClippedSprite(sprite,cornerSize,new nmm.Point(75,260));var leftEdge=nmls.createClippedSprite(vSprite,vEdgeSize,new nmm.Point(30,0));var middleBg=document.createElement("div");var rightEdge=nmls.createClippedSprite(vSprite,vEdgeSize,new nmm.Point(45,0));var bottomLeftCorner=nmls.createClippedSprite(sprite,cornerSize,new nmm.Point(105,260));var bottomEdge=nmls.createClippedSprite(sprite,hEdgeSize,new nmm.Point(0,287));var bottomRightCorner=nmls.createClippedSprite(sprite,cornerSize,new nmm.Point(90,260));nms.css(background,{position:"relative"},true);nms.css(borderTopWrap,{position:"absolute",top:"0px",left:"0px"},true);nms.css(middleWrap,{position:"absolute",top:cornerSize.getHeightString(),left:"0px"},true);nms.css(middleBg,{"float":"left",position:"relative",width:hEdgeSize.getWidthString(),height:vEdgeSize.getHeightString()},true);nms.applyPngAlphaBg(middleBg,nmls.PANEL_BACKGROUND_LIGHT.url,true);nms.css(borderBottomWrap,{position:"absolute",left:"0px",top:(height-cornerSize.height)+"px"},true);frag.appendChild(background);background.appendChild(borderTopWrap);background.appendChild(middleWrap);background.appendChild(borderBottomWrap);borderTopWrap.appendChild(topLeftCorner);borderTopWrap.appendChild(topEdge);borderTopWrap.appendChild(topRightCorner);middleWrap.appendChild(leftEdge);middleWrap.appendChild(middleBg);middleWrap.appendChild(rightEdge);borderBottomWrap.appendChild(bottomLeftCorner);borderBottomWrap.appendChild(bottomEdge);borderBottomWrap.appendChild(bottomRightCorner);return frag};SmallZoomControl3D.prototype.initialize=function(map){var width=32;var height=86;var frag=document.createDocumentFragment();var node=document.createElement("div");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);this._node=node;nms.css(node,{cursor:"default",height:height+"px",width:width+"px",overflow:"hidden"},true);nms.css(zoomInNode,{position:"absolute",top:"5px",left:"5px"});nms.css(zoomOutNode,{position:"absolute",top:"32px",left:"5px"});nms.css(resetNode,{position:"absolute",top:"59px",left:"5px"});if(!this.selectable()){nmev.disableSelect(node)}if(!this.printable()){node.className=nmm.NO_PRINT}frag.appendChild(node);node.appendChild(this.createBackground(width,height));node.appendChild(zoomInNode);node.appendChild(zoomOutNode);node.appendChild(resetNode);map.getContainer().appendChild(frag);return node};SmallZoomControl3D.prototype.printable=function(){return this._printable};SmallZoomControl3D.prototype.selectable=function(){return this._selectable};SmallZoomControl3D.prototype.getNode=function(){return this._node};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;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){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))}}function MapTypeControl(useShortNames){this._useShortNames=Boolean(useShortNames)}MapTypeControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(50,10))};MapTypeControl.prototype.printable=function(){return false};MapTypeControl.prototype.selectable=function(){return false};MapTypeControl.prototype.onclick=function(e){var target;target=nmev.getTarget(e);if(target.mapType&&this._map.getCurrentMapType()!==target.mapType){this._map.setMapType(target.mapType)}};MapTypeControl.prototype.onmouseover=function(e){var target;target=nmev.getTarget(e);if(target.mapType){target.style.color="#089853"}};MapTypeControl.prototype.onmouseout=function(e){var target;target=nmev.getTarget(e);if(target.mapType&&this._map.getCurrentMapType()!==target.mapType){target.style.color=""}};MapTypeControl.prototype.onmaptypechanged=function(){var currentMapType=this._map.getCurrentMapType();var menu=this._node.firstChild.nextSibling;var menuItem=menu.firstChild;var linkButton;while(menuItem){linkButton=menuItem.firstChild;linkButton.style.color=(linkButton.mapType===currentMapType?"#089853":"");menuItem=menuItem.nextSibling}};MapTypeControl.prototype.createMenuItem=function(currentMapType,mapType,sprite,height,isLast){var frag=document.createDocumentFragment();var listItem=document.createElement("li");var linkButton=document.createElement("a");var spacer;linkButton.innerHTML=mapType.getName(true);linkButton.mapType=mapType;nms.css(listItem,{"float":"left",display:"inline"},true);nms.css(linkButton,{cursor:"pointer","float":"left",height:height+"px","line-height":"2em",margin:"0px 10px"},true);if(currentMapType===mapType){linkButton.style.color="#089853"}frag.appendChild(listItem);listItem.appendChild(linkButton);if(!isLast){spacer=nmls.createClippedSprite(sprite,new nmm.Size(2,height),new nmm.Point(1,56));listItem.appendChild(spacer)}return frag};MapTypeControl.prototype.initialize=function(map){var height=26;var sprite=nmls.BUTTONS;var frag=document.createDocumentFragment();var node=document.createElement("div");var menuBackground=document.createElement("ul");var leftEdge=nmls.createClippedSprite(sprite,new nmm.Size(3,height),new nmm.Point(5,28));var rightEdge=nmls.createClippedSprite(sprite,new nmm.Size(3,height),new nmm.Point(0,28));var currentMapType=map.getCurrentMapType();var mapTypes=map.getMapTypes();var len=mapTypes.length;var lastItem=len-1;this._map=map;this._node=node;nms.css(node,{cursor:"default",margin:"0px",padding:"0px",position:"absolute"},true);nms.css(menuBackground,{background:"url("+sprite.url+") repeat-x",color:"#003465",display:"inline","float":"left","font-family":"Arial, Helvetica, sans-serif","font-size":"13px","font-weight":"bold",height:height+"px",margin:"0px",padding:"0px"},true);if(!this.selectable()){nmev.disableSelect(node)}nmev.addDomListener(node,"click",nmev.callback(this,MapTypeControl.prototype.onclick));nmev.addDomListener(node,"mouseover",nmev.callback(this,MapTypeControl.prototype.onmouseover));nmev.addDomListener(node,"mouseout",nmev.callback(this,MapTypeControl.prototype.onmouseout));nmev.addListener(map,"maptypechanged",nmev.callback(this,MapTypeControl.prototype.onmaptypechanged));frag.appendChild(node);node.appendChild(leftEdge);node.appendChild(menuBackground);node.appendChild(rightEdge);for(var i=0;i<len;i++){menuBackground.appendChild(this.createMenuItem(currentMapType,mapTypes[i],sprite,height,i===lastItem))}map.getContainer().appendChild(frag);return node};function MenuMapTypeControl(useShortNames){this._useShortNames=Boolean(useShortNames)}MenuMapTypeControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(50,10))};MenuMapTypeControl.prototype.printable=function(){return false};MenuMapTypeControl.prototype.selectable=function(){return false};MenuMapTypeControl.prototype.onmaptypechanged=function(activeButton){activeButton.firstChild.nodeValue=this._map.getCurrentMapType().getName(this._useShortNames)};MenuMapTypeControl.prototype.onbuttonclick=function(e){if(this.isSubMenuHidden()){this.showsubmenu()}else{this.hidesubmenu()}};MenuMapTypeControl.prototype.onsubmenuclick=function(e){var target;target=nmev.getTarget(e);if(target.mapType){this._map.setMapType(target.mapType);this.hidesubmenu()}};MenuMapTypeControl.prototype.onsubmenumouseover=function(e){var target;target=nmev.getTarget(e);if(target.mapType){target.style.background="#ccc"}};MenuMapTypeControl.prototype.onsubmenumouseout=function(e){var target;target=nmev.getTarget(e);if(target.mapType){target.style.background=""}};MenuMapTypeControl.prototype.hidesubmenu=function(){this._node.lastChild.style.left="-99999px"};MenuMapTypeControl.prototype.showsubmenu=function(){this._node.lastChild.style.left="0px"};MenuMapTypeControl.prototype.isSubMenuHidden=function(){return this._node&&this._node.lastChild.style.left==="-99999px"};MenuMapTypeControl.prototype.createMenuItem=function(mapType){var frag=document.createDocumentFragment();var menuItem=document.createElement("li");var linkButton=document.createElement("a");linkButton.innerHTML=mapType.getName(this._useShortNames);linkButton.mapType=mapType;nms.css(linkButton,{display:"block",padding:"2px 5px",position:"relative"},true);frag.appendChild(menuItem);menuItem.appendChild(linkButton);return frag};MenuMapTypeControl.prototype.createSubMenu=function(buttonHeight){var frag=document.createDocumentFragment();var menuWrap=document.createElement("div");var menu=document.createElement("ul");var mapTypes=this._map.getMapTypes();var len=mapTypes.length;nms.css(menuWrap,{background:"#fff",position:"absolute",top:buttonHeight+"px",left:"-99999px"},true);nms.css(menu,{border:"solid 1px #ccc","list-style":"none",margin:"0px",padding:"0px"},true);nmev.addDomListener(menuWrap,"click",nmev.callback(this,MenuMapTypeControl.prototype.onsubmenuclick));nmev.addDomListener(menuWrap,"mouseover",MenuMapTypeControl.prototype.onsubmenumouseover);nmev.addDomListener(menuWrap,"mouseout",MenuMapTypeControl.prototype.onsubmenumouseout);frag.appendChild(menuWrap);menuWrap.appendChild(menu);for(var i=0;i<len;i++){menu.appendChild(this.createMenuItem(mapTypes[i]))}return frag};MenuMapTypeControl.prototype.initialize=function(map){var buttonHeight=26;var arrowWidth=14;var arrowMargin=10;var edgeWidth=3;var sprite=nmls.BUTTONS;var frag=document.createDocumentFragment();var node=document.createElement("div");var activeButton=document.createElement("a");var leftEdge=nmls.createClippedSprite(sprite,new nmm.Size(edgeWidth,buttonHeight),new nmm.Point(5,28));var rightEdge=nmls.createClippedSprite(sprite,new nmm.Size(edgeWidth,buttonHeight),new nmm.Point(0,28));var dropArrow=nmls.createClippedSprite(sprite,new nmm.Size(arrowWidth,10),new nmm.Point(150,193));var currentMapType=map.getCurrentMapType();var subMenu;var maxWidth;var endWidth;this._map=map;this._node=node;activeButton.innerHTML=currentMapType.getName(this._useShortNames);activeButton.title="Change map style";nms.css(node,{cursor:"pointer",color:"#003465","font-family":"Arial, Helvetica, sans-serif","font-size":"13px",position:"absolute"},true);nms.css(activeButton,{background:"url("+sprite.url+") repeat-x",display:"inline","float":"left","font-weight":"bold",height:buttonHeight+"px","line-height":"2em",position:"relative"},true);nms.css(dropArrow.firstChild,{position:"absolute",right:"5px",top:"8px"});nmev.addDomListener(activeButton,"click",nmev.callback(this,MenuMapTypeControl.prototype.onbuttonclick));nmev.addListener(map,"click",nmev.callback(this,MenuMapTypeControl.prototype.hidesubmenu));nmev.addListener(map,"maptypechanged",nmev.callbackArgs(this,MenuMapTypeControl.prototype.onmaptypechanged,activeButton));frag.appendChild(node);node.appendChild(leftEdge);node.appendChild(activeButton);node.appendChild(rightEdge);node.appendChild(this.createSubMenu(buttonHeight));activeButton.appendChild(dropArrow);map.getContainer().appendChild(node);subMenu=node.lastChild;maxWidth=(subMenu.offsetWidth>node.offsetWidth?subMenu.offsetWidth:node.offsetWidth);endWidth=maxWidth+arrowMargin+arrowWidth;subMenu.style.width=endWidth+"px";activeButton.style.width=(endWidth-(2*edgeWidth))+"px";return node};function HierarchicalRotateMapTypeControl(printable,selectable){var _that=this;var _sprite=nmls.BUTTONS;var _vertSprite=nmls.BUTTONS_VERTICAL;var _relationships={};var _stateRelationships={};var _availMonitor={};var _timers={};var _currentStateRelationshipParent;var _fallbackMapType;var _node;var _map;function getRelationshipByParent(parentType){return _relationships[parentType.getName(false)]}function getChildInRelationship(parentType,childType){var r=getRelationshipByParent(parentType);var children;var c;if(!r){return null}children=r.children;c=nml.ArrayHelper.indexOfObject(children,childType,function(a,elm){return a.childType===elm});return(c===-1?null:children[c])}function hasChildren(parentType){var r=getRelationshipByParent(parentType);var children;if(!r){return false}children=r.children;for(var i=children.length;i--;){if(_map.isMapTypeRegistered(children[i].childType)){return true}}return false}function isChild(childType){for(var p in _relationships){if(_relationships.hasOwnProperty(p)){children=_relationships[p].children;for(var i=children.length;i--;){if(children[i].childType===childType){return true}}}}}function isChildOf(parentType,childType){var r=getRelationshipByParent(parentType);var children=r.children;for(var i=children.length;i--;){if(children[i].childType===childType){return true}}}function isChildActive(parentType){var r=getRelationshipByParent(parentType);var currentMapType=_map.getCurrentMapType();var children;if(!r){return false}children=r.children;for(var i=children.length;i--;){if(children[i].childType===currentMapType){return true}}return false}function isRelationshipActive(parentType){var currentMapType=_map.getCurrentMapType();var r;var children;if(currentMapType===parentType){return true}r=getRelationshipByParent(parentType);if(r){children=r.children;for(var i=children.length;i--;){if(children[i].childType===currentMapType){return true}}}return false}function addRelationship(parentType,childType,childText,isDefault,disableParentFallback,isRotatable){var r=getRelationshipByParent(parentType);var children;if(!r){r={parent:parentType,children:[{childType:childType,childText:childText,disableParentFallback:disableParentFallback,isRotatable:isRotatable}],defaultChild:isDefault?childType:null}}else{children=r.children;for(var i=children.length;i--;){if(children[i].childType===childType){return}}r.children.push({childType:childType,childText:childText,disableParentFallback:disableParentFallback,isRotatable:isRotatable});if(isDefault){r.defaultChild=childType}}_relationships[parentType.getName(false)]=r}function removeRelationShip(mapType){var r;var children;for(var p in _relationships){if(_relationships.hasOwnProperty(p)){r=_relationships[p];if(r.parent===mapType){delete _relationships[p]}else{if(r.defaultChild===mapType){r.defaultChild=null}children=r.children;for(var i=children.length;i--;){if(children[i].childType===mapType){children.splice(i,1)}}}}}}function clearRelationships(){_relationships={}}function updateCurrentStateRelationshipParent(currentMapType){var r=getStateRelationshipByParent(currentMapType);if(r){_currentStateRelationshipParent=currentMapType}}function getStateRelationshipByParent(parentType){return _stateRelationships[parentType.getName(false)]||null}function addStateRelationship(parentType,childType){var r=getStateRelationshipByParent(parentType);if(!r){r={type:parentType,children:[]};_stateRelationships[parentType.getName(false)]=r}r.children.push(childType)}function addAvailabilityMonitor(type,saveAsFallback,doRecursive){_availMonitor[type.getName(false)]={type:type,saveAsFallback:saveAsFallback,doRecursive:doRecursive}}function clearAvailabilityMonitor(){_availMonitor={}}function isMonitored(type){for(var p in _availMonitor){if(_availMonitor.hasOwnProperty(p)&&_availMonitor[p].type===type){return true}}return false}function getAvailabilityMonitor(type){var monitor;for(var p in _availMonitor){if(_availMonitor.hasOwnProperty(p)){monitor=_availMonitor[p];if(monitor.type===type){return monitor}}}return null}function setFallbackMapType(){var currentMapType=_map.getCurrentMapType();var firstMapType;if(_fallbackMapType&&_fallbackMapType!==currentMapType){_map.setMapType(_fallbackMapType)}else{firstMapType=_map.getMapTypes()[0];if(firstMapType!==currentMapType){_map.setMapType(firstMapType)}}}function checkAvailability(oldLayers,newLayers){var currentMapType=_map.getCurrentMapType();var currentTileDate=_map.getTileDate();var unavailable=[];var available=[];var fallbackTimeout=2000;var dateExists=false;var monitor;var type;var layers;var i;var found;var mapTypeDates;if(_timers.fallback){window.clearTimeout(_timers.fallback)}for(var p in _availMonitor){if(_availMonitor.hasOwnProperty(p)){monitor=_availMonitor[p];type=monitor.type;layers=type.getTileLayers();i=0;found=false;while(i<layers.length&&!found){found=(nml.ArrayHelper.indexOf(newLayers,layers[i].getMetaKey())>=0);i++}if(found){mapTypeDates=_map.getAvailableTileDatesByMapType(type);if((!currentTileDate&&mapTypeDates.length>=1)||(currentTileDate&&nml.DateHelper.dateExists(mapTypeDates,currentTileDate))){dateExists=true}}if(found&&dateExists){available.push(type)}else{unavailable.push(type)}if(!found&&type===currentMapType){_timers.fallback=window.setTimeout(function(){delete _timers.fallback;setFallbackMapType()},fallbackTimeout)}}}if(unavailable.length>=1){nmev.trigger(_that,"maptypesunavailable",unavailable)}if(available.length>=1){nmev.trigger(_that,"maptypesavailable",available)}}function checkMapTypeIsAvailable(){var currentMapType=_map.getCurrentMapType();var monitor;var availLayers;monitor=getAvailabilityMonitor(currentMapType);if(!monitor||monitor.saveAsFallback){_fallbackMapType=currentMapType}if(monitor){availLayers=_map.getAvailableTileLayers();checkAvailability(availLayers,availLayers)}updateCurrentStateRelationshipParent(currentMapType)}function checkMapTypeAvailabilityOnDate(){var availLayers=_map.getAvailableTileLayers();checkAvailability(availLayers,availLayers)}function isChildRotatable(parentType){var r=getRelationshipByParent(parentType);var children=r.children;for(var i=children.length;i--;){if(children[i].isRotatable){return true}}return false}function isMonitoredTypeAvailable(type){if(!isMonitored(type)){return true}return _map.isMapTypeAvailable(type)}function getFirstAvailableChild(children,startChild){var c=nml.ArrayHelper.indexOfObject(children,startChild,function(a,elm){return a.childType===elm});var s=c;var type;for(var i=c;i<children.length;i++){type=children[i].childType;if(isMonitoredTypeAvailable(type)){return type}}for(var j=0;j<s;j++){type=children[j].childType;if(isMonitoredTypeAvailable(type)){return type}}return null}function getNextAvailableChild(children,startChild){var c=nml.ArrayHelper.indexOfObject(children,startChild,function(a,elm){return a.childType===elm});var s=c;var type;if(c===-1){return startChild}c+=1;for(var i=c;i<children.length;i++){type=children[i].childType;if(isMonitoredTypeAvailable(type)){return type}}for(var j=0;j<s;j++){type=children[j].childType;if(isMonitoredTypeAvailable(type)){return type}}return startChild}function getPreviousAvailableChild(children,startChild){var c=nml.ArrayHelper.indexOfObject(children,startChild,function(a,elm){return a.childType===elm});var s=c;var type;if(c===-1){return startChild}c-=1;for(var i=c;i>=0;i--){type=children[i].childType;if(isMonitoredTypeAvailable(type)){return type}}for(var j=children.length-1;j>s;j--){type=children[j].childType;if(isMonitoredTypeAvailable(type)){return type}}return startChild}function getAvailableMapTypeByParent(lastType,parentType){var r=getRelationshipByParent(parentType);var type=lastType||r.defaultChild||parentType;var i;if(!isMonitoredTypeAvailable(type)){type=getFirstAvailableChild(r.children,(type===parentType?r.defaultChild:type))}return type}function onnormalbuttonclick(e){_map.setMapType(this.mapType)}function onnormalbuttonmouseover(e){this.style.color="#089853"}function onnormalbuttonmouseout(e){if(_map.getCurrentMapType()!==this.mapType){this.style.color="#003465"}}function onnormalbuttonmaptypechanged(){this.style.color=(_map.getCurrentMapType()===this.mapType?"#089853":"#003465")}function createNormalButton(parentNode,type,height,isLast){var menuItem=document.createElement("li");var menuButton=document.createElement("a");var spacer=nmls.createClippedSprite(_sprite,new nmm.Size(2,height),new nmm.Point(1,56));menuButton.innerHTML=type.getName(true);menuButton.mapType=type;nms.css(menuItem,{display:"inline","float":"left",height:height+"px","line-height":height+"px"},true);nms.css(menuButton,{color:(_map.getCurrentMapType()===type?"#089853":"#003465"),cursor:"pointer",display:"inline","float":"left",height:height+"px",margin:"0px 15px"},true);menuButton.onclick=nmev.callback(menuButton,onnormalbuttonclick);menuButton.onmouseover=nmev.callback(menuButton,onnormalbuttonmouseover);menuButton.onmouseout=nmev.callback(menuButton,onnormalbuttonmouseout);nmev.addListener(_map,"maptypechanged",nmev.callback(menuButton,onnormalbuttonmaptypechanged));parentNode.appendChild(menuItem);menuItem.appendChild(menuButton);if(!isLast){menuItem.appendChild(spacer)}}function getSubMenuLeftOffset(menuItem){var width=menuItem.offsetWidth;var subMenuWidth=menuItem.lastChild.offsetWidth;var padding;if(subMenuWidth>=width){return 0}padding=width-subMenuWidth;return Math.ceil(padding/2)+2}function onsubmenucheckclick(e){var parentType=arguments[arguments.length-1];var childRelationship;var type;if(!this.checked){childRelationship=getChildInRelationship(parentType,this.mapType);if(childRelationship&&!childRelationship.disableParentFallback){type=parentType}}else{type=this.mapType}if(type){_map.setMapType(type)}else{setFallbackMapType()}}function onsubmenuitemmaptypechanged(parentButton){var isCurrentMapType=(_map.getCurrentMapType()===this.mapType);if(!this.checked&&isCurrentMapType){this.checked=true;if(isMonitored(this.mapType)){parentButton.innerHTML=this.mapType.getName(true)}}else{if(this.checked&&!isCurrentMapType){this.checked=false}}}function onsubmenuitemmaptypesavailable(availableTypes,check,label){if(nml.ArrayHelper.indexOf(availableTypes,check.mapType)>=0){check.disabled=false;check.checked=(_map.getCurrentMapType()===check.mapType);check.style.cursor="pointer";label.style.cursor="pointer";label.style.textDecoration=""}}function onsubmenuitemmaptypesunavailable(unavailableTypes,check,label){if(nml.ArrayHelper.indexOf(unavailableTypes,check.mapType)>=0){check.checked=false;check.disabled=true;check.style.cursor="default";label.style.cursor="default";label.style.textDecoration="line-through"}}function createSubMenuItem(parentNode,parentButton,parentType,childRelationship){var row=document.createElement("tr");var checkCell=document.createElement("td");var labelCell=document.createElement("td");var check=document.createElement("input");var label=document.createElement("label");var childType=childRelationship.childType;check.id="maptypeChild-"+parentType.getName()+"-"+childType.getName();check.type="checkbox";check.mapType=childType;label.htmlFor=check.id;label.innerHTML=childRelationship.childText||childType.getName(true);nms.css(checkCell,{border:"none","line-height":"1em",margin:"0px",padding:"5px 0px","vertical-align":"top"},true);nms.css(check,{cursor:"pointer",height:"13px",width:"13px",overflow:"hidden"},true);nms.css(labelCell,{border:"none","line-height":"1em",margin:"0px",padding:"5px 0px 5px 5px"},true);nms.css(label,{cursor:"pointer",padding:"0px"},true);check.onclick=nmev.callbackArgs(check,onsubmenucheckclick,parentType);nmev.addListener(_map,"maptypechanged",nmev.callbackArgs(check,onsubmenuitemmaptypechanged,parentButton));nmev.addListener(_that,"maptypesunavailable",nmev.callbackArgs(_that,onsubmenuitemmaptypesunavailable,check,label));nmev.addListener(_that,"maptypesavailable",nmev.callbackArgs(_that,onsubmenuitemmaptypesavailable,check,label));parentNode.appendChild(row);row.appendChild(checkCell);row.appendChild(labelCell);checkCell.appendChild(check);labelCell.appendChild(label);check.checked=(_map.getCurrentMapType()===childType)}function createSubMenu(parentNode,parentButton,relationship,height,isRotatable){var cornerSize=new nmm.Size(10,10);var subMenu=document.createElement("div");var menuContentWrap=document.createElement("div");var leftEdgeSprite=nmls.createClippedSprite(_vertSprite,cornerSize,new nmm.Point(0,0));var leftEdge=leftEdgeSprite.firstChild;var rightEdgeSprite=nmls.createClippedSprite(_vertSprite,cornerSize,new nmm.Point(15,0));var rightEdge=rightEdgeSprite.firstChild;var bottomWrap=document.createElement("div");var leftCornerSprite=nmls.createClippedSprite(_sprite,cornerSize,new nmm.Point(105,150));var leftCorner=leftCornerSprite.firstChild;var bottomEdgeSprite=nmls.createClippedSprite(_sprite,cornerSize,new nmm.Point(0,174));var bottomEdge=bottomEdgeSprite.firstChild;var rightCornerSprite=nmls.createClippedSprite(_sprite,cornerSize,new nmm.Point(90,150));var rightCorner=rightCornerSprite.firstChild;var form=document.createElement("form");var menuTable=document.createElement("table");var menuTableBody=document.createElement("tbody");var children=relationship.children;var len=children.length;var parentType=relationship.parent;menuTable.cellPadding=0;menuTable.cellSpacing=0;nms.css(subMenu,{position:"absolute",top:height+"px",padding:"0px "+cornerSize.getWidthString(),left:"-99999px"},true);if(nmc.browser.msie&&nmc.browser.majorVersion<=6){subMenu.style.width="1px"}nms.css(leftEdge,{position:"absolute",left:"0px",top:"0px"});nms.css(rightEdge,{position:"absolute",right:"0px",top:"0px"});nms.css(bottomWrap,{height:cornerSize.getHeightString(),width:"20px"},true);nms.css(leftCorner,{position:"absolute",left:"0px"});nms.css(rightCorner,{position:"absolute",right:"0px"});nms.css(form,{position:"relative"},true);nms.css(menuTable,{border:"none",color:"#003465","font-size":"13px","font-weight":"bold",padding:"0px",margin:"0px"},true);form.onsubmit=nmev.preventDefault;parentNode.appendChild(subMenu);subMenu.appendChild(menuContentWrap);subMenu.appendChild(bottomWrap);menuContentWrap.appendChild(leftEdgeSprite);menuContentWrap.appendChild(form);menuContentWrap.appendChild(rightEdgeSprite);bottomWrap.appendChild(leftCornerSprite);bottomWrap.appendChild(bottomEdgeSprite);bottomWrap.appendChild(rightCornerSprite);form.appendChild(menuTable);menuTable.appendChild(menuTableBody);for(var i=0;i<len;i++){createSubMenuItem(menuTableBody,parentButton,parentType,children[i])}nmev.addListener(_that,"addtodom",function(){var width=subMenu.offsetWidth;var height=menuContentWrap.offsetHeight;var edgeWidth=2*cornerSize.width;var middleWidth=width-edgeWidth;if(middleWidth<0){middleWidth=0}bottomEdge.style.width=middleWidth+"px";bottomEdge.firstChild.style.clip="rect(174px "+middleWidth+"px 184px 0px)";leftEdge.style.height=height+"px";leftEdge.firstChild.style.clip="rect(0px 10px "+height+"px 0px)";rightEdge.style.height=height+"px";rightEdge.firstChild.style.clip="rect(0px 25px "+height+"px 15px)";menuContentWrap.style.height=height+"px";menuContentWrap.style.width=middleWidth+"px";nms.applyPngAlphaBg(menuContentWrap,nmls.PANEL_BACKGROUND.url,true)})}function onparentbuttonclick(e){var target;var r;var type;var childIndex;e=e||window.event;target=nmev.getTarget(e);if(target===this.parentButton&&(!this.lastType||this.lastType!==_map.getCurrentMapType())){type=getAvailableMapTypeByParent(this.lastType,this.mapType);if(_currentStateRelationshipParent&&_currentStateRelationshipParent!==type){var sr=getStateRelationshipByParent(type);var csr;if(sr){if(nml.ArrayHelper.indexOf(sr.children,_currentStateRelationshipParent)===-1){csr=getStateRelationshipByParent(_currentStateRelationshipParent);type=csr.children[0]}}}if(type){_map.setMapType(type)}else{setFallbackMapType()}if(!this.isRotatable){this.lastChild.style.left=getSubMenuLeftOffset(this)+"px"}}}function onparentmouseover(e){var left;if(!this.isRotatable&&isRelationshipActive(this.mapType)){this.lastChild.style.left=getSubMenuLeftOffset(this)+"px"}this.parentButton.style.color="#089853"}function onparentmouseout(e){var relTarget;e=e||window.event;relTarget=nmev.getRelatedTarget(e);if(!isRelationshipActive(this.mapType)){this.parentButton.style.color="#003465"}if(!this.isRotatable&&!nmd.contains(this,relTarget)){this.lastChild.style.left="-99999px"}}function onparentmaptypechanged(menuButton){if(isRelationshipActive(this.mapType)){this.parentButton.style.color="#089853";if(!isMonitored(this.mapType)){this.lastType=_map.getCurrentMapType()}}else{this.parentButton.style.color="#003465";if(isMonitored(this.mapType)){menuButton.innerHTML=this.mapType.getName(true)}}}function onparentmaptypesunavailable(unavailableTypes){var r;var children;if(nml.ArrayHelper.indexOf(unavailableTypes,this.mapType)===-1){return}r=getRelationshipByParent(this.mapType);children=r.children;for(var i=children.length;i--;){if(nml.ArrayHelper.indexOf(unavailableTypes,children[i].childType)===-1){return}}this.style.visibility="hidden"}function onparentmaptypesavailable(availableTypes){var isAvail=false;var r;var children;var i;if(nml.ArrayHelper.indexOf(availableTypes,this.mapType)>=0){isAvail=true}else{r=getRelationshipByParent(this.mapType);children=r.children;i=0;while(i<children.length&&!isAvail){isAvail=(nml.ArrayHelper.indexOf(availableTypes,children[i].childType)>=0);i++}}if(isAvail){this.style.visibility=""}}function onrotatemouseover(e){nms.css(this.firstChild,{clip:"rect("+this.hoverOffsetY+"px "+(this.hoverOffsetX+this.width)+"px "+(this.hoverOffsetY+this.height)+"px "+this.hoverOffsetX+"px)",left:-this.hoverOffsetX+"px",top:-this.hoverOffsetY+"px"})}function onrotatemouseout(e){nms.css(this.firstChild,{clip:"rect("+this.offsetY+"px "+(this.offsetX+this.width)+"px "+(this.offsetY+this.height)+"px "+this.offsetX+"px)",left:-this.offsetX+"px",top:-this.offsetY+"px"})}function onrotateclockwiseclick(e){var parentType=arguments[arguments.length-1];var r=getRelationshipByParent(parentType);var currentMapType=_map.getCurrentMapType();var children=r.children;var nextChild=getNextAvailableChild(children,currentMapType);if(nextChild!==currentMapType){_map.setMapType(nextChild)}}function onrotateanticlockwiseclick(e){var parentType=arguments[arguments.length-1];var r=getRelationshipByParent(parentType);var currentMapType=_map.getCurrentMapType();var children=r.children;var prevChild=getPreviousAvailableChild(children,currentMapType);if(prevChild!==currentMapType){_map.setMapType(prevChild)}}function onrotatemaptypechanged(parentType,menuButton){this.style.display=(isChildActive(parentType)?"":"none")}function createRotateClockwise(parentNode,menuButton,type){var frag=document.createDocumentFragment();var button=document.createElement("a");var sprite=document.createElement("span");var offsetX=0;var offsetY=84;var hoverOffsetX=0;var hoverOffsetY=112;var width=38;var height=26;button.offsetX=offsetX;button.offsetY=offsetY;button.hoverOffsetX=hoverOffsetX;button.hoverOffsetY=hoverOffsetY;button.width=width;button.height=height;nms.css(button,{cursor:"pointer","float":"left",overflow:"hidden",position:"relative",width:width+"px",height:height+"px",display:(isChildActive(type)?"":"none"),position:"absolute",left:"0px"},true);nms.css(sprite,{clip:"rect("+offsetY+"px "+(offsetX+width)+"px "+(offsetY+height)+"px "+offsetX+"px)",position:"absolute",left:-offsetX+"px",top:-offsetY+"px",height:_sprite.size.getHeightString(),width:_sprite.size.getWidthString()},true);nms.applyPngAlphaBg(sprite,_sprite.url);button.onmouseover=nmev.callback(button,onrotatemouseover);button.onmouseout=nmev.callback(button,onrotatemouseout);button.onclick=nmev.callbackArgs(button,onrotateclockwiseclick,type);nmev.addListener(_map,"maptypechanged",nmev.callbackArgs(button,onrotatemaptypechanged,type,menuButton));frag.appendChild(button);button.appendChild(sprite);parentNode.appendChild(frag)}function createRotateAntiClockwise(parentNode,menuButton,type){var frag=document.createDocumentFragment();var button=document.createElement("a");var sprite=document.createElement("span");var offsetX=40;var offsetY=84;var hoverOffsetX=40;var hoverOffsetY=112;var width=38;var height=26;button.offsetX=offsetX;button.offsetY=offsetY;button.hoverOffsetX=hoverOffsetX;button.hoverOffsetY=hoverOffsetY;button.width=width;button.height=height;nms.css(button,{cursor:"pointer","float":"left","margin-right":"-3px",overflow:"hidden",position:"relative",width:width+"px",height:height+"px",display:(isChildActive(type)?"":"none"),position:"absolute",right:"0px"},true);nms.css(sprite,{clip:"rect("+offsetY+"px "+(offsetX+width)+"px "+(offsetY+height)+"px"+offsetX+"px)",position:"absolute",left:-offsetX+"px",top:-offsetY+"px",height:_sprite.size.getHeightString(),width:_sprite.size.getWidthString()},true);nms.applyPngAlphaBg(sprite,_sprite.url);button.onmouseover=nmev.callback(button,onrotatemouseover);button.onmouseout=nmev.callback(button,onrotatemouseout);button.onclick=nmev.callbackArgs(button,onrotateanticlockwiseclick,type);nmev.addListener(_map,"maptypechanged",nmev.callbackArgs(button,onrotatemaptypechanged,type,menuButton));frag.appendChild(button);button.appendChild(sprite);parentNode.appendChild(frag)}function createParentButton(parentNode,type,height,isLast){var menuItem=document.createElement("li");var menuButton=document.createElement("a");var spacer=nmls.createClippedSprite(_sprite,new nmm.Size(2,height),new nmm.Point(1,56));var r=getRelationshipByParent(type);var isRotatable=isChildRotatable(type);var rotateClockwise;var rotateAntiClockwise;menuButton.innerHTML=(isMonitored(type)&&isChildActive(type)?_map.getCurrentMapType():type).getName(true);menuItem.mapType=type;menuItem.parentButton=menuButton;menuItem.isRotatable=isRotatable;if(type===_map.getCurrentMapType()){menuItem.lastType=type}nms.css(menuItem,{display:"inline","float":"left",height:height+"px","line-height":height+"px",position:"relative"},true);if(isRotatable){menuItem.style.width="8em"}nms.css(menuButton,{color:(isRelationshipActive(type)?"#089853":"#003465"),cursor:"pointer",display:"inline","float":"left",margin:(isRotatable?"0em":"0em 1em"),"text-align":"center",height:height+"px"},true);if(isRotatable){menuButton.style.width="100%"}menuItem.onclick=nmev.callback(menuItem,onparentbuttonclick);menuItem.onmouseover=nmev.callback(menuItem,onparentmouseover);menuItem.onmouseout=nmev.callback(menuItem,onparentmouseout);nmev.addListener(_map,"maptypechanged",nmev.callbackArgs(menuItem,onparentmaptypechanged,menuButton));nmev.addListener(_that,"maptypesunavailable",nmev.callbackArgs(menuItem,onparentmaptypesunavailable));nmev.addListener(_that,"maptypesavailable",nmev.callbackArgs(menuItem,onparentmaptypesavailable));parentNode.appendChild(menuItem);if(isRotatable){createRotateClockwise(menuItem,menuButton,type)}menuItem.appendChild(menuButton);if(isRotatable){createRotateAntiClockwise(menuItem,menuButton,type)}if(!isLast){menuItem.appendChild(spacer)}createSubMenu(menuItem,menuButton,r,height,isRotatable)}function createMenu(parentNode,map,height){var menuWrap=document.createElement("ul");var mapTypes=map.getMapTypes();var len=mapTypes.length;var last=len-1;var type;nms.css(menuWrap,{"font-family":"Arial, Helvetica, sans-serif","font-size":"13px","font-weight":"bold",margin:"0px",padding:"0px"},true);parentNode.appendChild(menuWrap);for(var i=0;i<len;i++){type=mapTypes[i];if(hasChildren(type)){createParentButton(menuWrap,type,height,i===last)}else{if(!isChild(type)){createNormalButton(menuWrap,type,height,i===last)}}}}this.getNode=function(){return _node};this.initialize=function(map){var height=26;var frag=document.createDocumentFragment();var menuBackground=document.createElement("div");var leftEdge=nmls.createClippedSprite(_sprite,new nmm.Size(3,height),new nmm.Point(5,28));var rightEdge=nmls.createClippedSprite(_sprite,new nmm.Size(3,height),new nmm.Point(0,28));var currentMapType=map.getCurrentMapType();var monitor;_map=map;_node=document.createElement("div");monitor=getAvailabilityMonitor(currentMapType);if(!monitor||monitor.saveAsFallback){_fallbackMapType=currentMapType}nms.css(_node,{cursor:"default",position:"absolute"},true);nms.css(menuBackground,{background:"url("+_sprite.url+") repeat-x",display:"inline","float":"left",height:height+"px"},true);if(!this.selectable()){nmev.disableSelect(_node)}if(!this.printable()){_node.className=nmm.NO_PRINT}frag.appendChild(_node);_node.appendChild(leftEdge);_node.appendChild(menuBackground);_node.appendChild(rightEdge);createMenu(menuBackground,map,height);checkAvailability(null,map.getAvailableTileLayers());updateCurrentStateRelationshipParent(map.getCurrentMapType());map.getContainer().appendChild(_node);nmev.trigger(_that,"addtodom");nmev.addListener(map,"tilelayersupdated",checkAvailability);nmev.addListener(map,"maptypechanged",checkMapTypeIsAvailable);nmev.addListener(map,"tiledatechanged",checkMapTypeAvailabilityOnDate);return _node};this.addRelationship=addRelationship;this.removeRelationship=removeRelationShip;this.clearRelationships=clearRelationships;this._printable=Boolean(printable);this._selectable=Boolean(selectable);addRelationship(nmm.MapType.PHOTO_MAP,nmm.MapType.HYBRID_MAP,"StreetMap",true);addRelationship(nmm.MapType.PHYSICAL_MAP,nmm.MapType.PHYSICAL_HYBRID_MAP,"StreetMap",true);addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_NORTH_MAP,"North",true,true,true);addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_EAST_MAP,"East",false,true,true);addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_SOUTH_MAP,"South",false,true,true);addRelationship(nmm.MapType.MULTI_VIEW_MAP,nmm.MapType.MULTI_VIEW_WEST_MAP,"West",false,true,true);addStateRelationship(nmm.MapType.PHOTO_MAP,nmm.MapType.PHYSICAL_MAP);addStateRelationship(nmm.MapType.PHYSICAL_MAP,nmm.MapType.PHOTO_MAP);addStateRelationship(nmm.MapType.HYBRID_MAP,nmm.MapType.PHYSICAL_HYBRID_MAP);addStateRelationship(nmm.MapType.PHYSICAL_HYBRID_MAP,nmm.MapType.HYBRID_MAP);addAvailabilityMonitor(nmm.MapType.MULTI_VIEW_MAP,false,true);addAvailabilityMonitor(nmm.MapType.MULTI_VIEW_NORTH_MAP,false,true);addAvailabilityMonitor(nmm.MapType.MULTI_VIEW_EAST_MAP,false,true);addAvailabilityMonitor(nmm.MapType.MULTI_VIEW_SOUTH_MAP,false,true);addAvailabilityMonitor(nmm.MapType.MULTI_VIEW_WEST_MAP,false,true)}HierarchicalRotateMapTypeControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(50,10))};HierarchicalRotateMapTypeControl.prototype.printable=function(){return this._printable};HierarchicalRotateMapTypeControl.prototype.selectable=function(){return this._selectable};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.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","font-family":"Arial, Helvetica, sans-serif","font-size":"14px",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]);if(!this.selectable()){nmev.disableSelect(node)}if(!this.printable()){node.className=nmm.NO_PRINT}nmev.addListener(map,"moveend",nmev.callbackArgs(map,setResolution,run,imperialEnd,metricEnd,imperialUnit,metricUnit));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._printable=Boolean(printable);this._selectable=Boolean(selectable)}ScaleControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(15,30))};ScaleControl.prototype.printable=function(){return this._printable};ScaleControl.prototype.selectable=function(){return this._selectable};function ShadowControl(printable,selectable){this._printable=Boolean(printable);this._selectable=Boolean(selectable)}ShadowControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_BOTTOM_LEFT,new nmm.Size(0,0))};ShadowControl.prototype.printable=function(){return this._printable};ShadowControl.prototype.selectable=function(){return this._selectable};ShadowControl.prototype.initialize=function(map){var sprite=(nmc.os.iPhone||nmc.os.iPod?nmls.IPHONE_SHADOW: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);if(!this.selectable()){nmev.disableSelect(node)}if(!this.printable()){node.className=nmm.NO_PRINT}map.getContainer().appendChild(node);return node};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}}LargeZoomControl.prototype.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.getShowingTileDate();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.getShowingTileDate();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 onshowingdatechanged(oldShowingDate,newShowingDate,dateList){setDateListBackground(dateList,newShowingDate,this.getTileDate())}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.getShowingTileDate();if(newDate&&surveyMs===newDate.getTime()){styleActiveDate(btn,btnSprite)}else{if(showingDate&&showingDate.getTime()===surveyMs){styleShowingDate(btn,btnSprite)}else{styleInactiveDate(btn,btnSprite)}}}function ondatelisttiledatechanged(oldDate,newDate,dateList){var newDateMs;var len;setDateListBackground(dateList,this.getShowingTileDate(),newDate);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 setDateListBackground(dateList,showingDate,tileDate){if(!nml.DateHelper.isDifferentDate(showingDate,tileDate)){dateList.style.backgroundColor="#009d51";dateList.style.color="#fff"}else{dateList.style.backgroundColor="";dateList.style.color=""}}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);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));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.getShowingTileDate();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 cleanupVisibilityAnimation(){delete _animations.visibility}function animateHide(){var width=_node.offsetWidth;var height=_node.offsetHeight;var frames=20;var length=820;if(_animations.visibility){nma.stopFixedAnimation(_animations.visibility)}_animations.visibility=nma.runFixedAnimation(frames,length,function(currentFrame,totalFrames){var fx;var frameHeight;if(currentFrame===totalFrames){_node.style.clip="rect(0px "+width+"px "+height+"px 0px)";_node.style.visibility="hidden"}else{fx=1-(currentFrame/totalFrames);frameHeight=Math.floor(height*fx);_node.style.clip="rect(0px "+width+"px "+frameHeight+"px 0px)";_node.style.visibility="visible"}},cleanupVisibilityAnimation)}function animateShow(){var width=_node.offsetWidth;var height=_node.offsetHeight;var frames=20;var length=820;if(_animations.visibility){nma.stopFixedAnimation(_animations.visibility)}_animations.visibility=nma.runFixedAnimation(frames,length,function(currentFrame,totalFrames){var fx;var frameHeight;if(currentFrame===totalFrames){try{_node.style.clip=""}catch(e){_node.style.clip="rect(auto auto auto auto)"}}else{fx=currentFrame/totalFrames;frameHeight=Math.floor(height*fx);_node.style.clip="rect(0px "+width+"px "+frameHeight+"px 0px)";_node.style.visibility="visible"}},cleanupVisibilityAnimation)}function onmaptypetiledatesupdated(oldDates,newDates,showButtons){var currentMapType=this.getCurrentMapType();var viewedDate=this.getTileDate();var startLen=_surveyDates.length;var frag;if(viewedDate&&currentMapType.getRequestTileInfo()&&getSurveyDatePosition(viewedDate,newDates)===-1){_surveyDates=nml.DateHelper.insertUniqueAsc(newDates,viewedDate)}else{_surveyDates=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);if(startLen===0){_node.style.visibility="hidden"}if(startLen===0&&_surveyDates.length!==0){_node.style.visibility="hidden";nmt.later(animateShow)}else{if(startLen!==0&&_surveyDates.length===0){nmt.later(animateHide)}}}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);setDateListBackground(_dateList,map.getShowingTileDate(),map.getTileDate());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));nmev.addListener(map,"showingdatechanged",nmev.callbackArgs(map,onshowingdatechanged,_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);_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.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)}if(!this.printable()){_node.className=nmm.NO_PRINT}map.getContainer().appendChild(frag);return _node};this._printable=Boolean(printable);this._selectable=Boolean(selectable);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))};TimelineControl.prototype.printable=function(){return this._printable};TimelineControl.prototype.selectable=function(){return this._selectable};function LatestImageryControl(printable,selectable){var _animations={};var _node;function cleanupAnimateVisibility(){delete _animations.visibility}function animateShowing(){var width=_node.offsetWidth;var height=_node.offsetHeight;var frames=20;var length=820;if(_animations.visibility){nma.stopFixedAnimation(_animations.visibility)}_animations.visibility=nma.runFixedAnimation(frames,length,function(currentFrame,totalFrames){var fx;var frameWidth;if(currentFrame===totalFrames){try{_node.style.clip=""}catch(e){_node.style.clip="rect(auto auto auto auto)"}}else{fx=currentFrame/totalFrames;frameWidth=Math.floor(width*fx);_node.style.clip="rect(0px "+frameWidth+"px "+height+"px 0px)";_node.style.visibility="visible"}},cleanupAnimateVisibility)}function animateHiding(){var width=_node.offsetWidth;var height=_node.offsetHeight;var frames=20;var length=820;if(_animations.visibility){nma.stopFixedAnimation(_animations.visibility)}_animations.visibility=nma.runFixedAnimation(frames,length,function(currentFrame,totalFrames){var fx;var frameWidth;if(currentFrame===totalFrames){try{_node.style.clip=""}catch(e){_node.style.clip="rect(auto auto auto auto)"}_node.style.visibility="hidden"}else{fx=1-(currentFrame/totalFrames);frameWidth=Math.floor(width*fx);_node.style.clip="rect(0px "+frameWidth+"px "+height+"px 0px)";_node.style.visibility="visible"}},cleanupAnimateVisibility)}function setLatestDateLabel(showingDate,label){label.nodeValue=(showingDate?nml.DateHelper.smallDateUTC(showingDate):"unavailable")}function onshowingdatechanged(oldShowingDate,newShowingDate,latestDateTxt){latestDateTxt.nodeValue=(newShowingDate?nml.DateHelper.smallDateUTC(newShowingDate):"unavailable");if(newShowingDate&&!oldShowingDate){animateShowing()}else{if(!newShowingDate&&oldShowingDate){animateHiding()}}}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(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",visibility:"hidden"},true);setLatestDateLabel(map.getShowingTileDate(),latestDateTxt);nmev.addListener(map,"showingdatechanged",nmev.callbackArgs(map,onshowingdatechanged,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,30))};function GeoLocationControl(printable,selectable){var _locationZoomLevel=18;var _node;var _map;function getPositionSuccess(location){var latlng=new nmm.LatLng(location.coords.latitude,location.coords.longitude);_map.setCenter(latlng,_locationZoomLevel,_map.getCurrentMapType(),_map.getTileDate(),true,true)}function getPositionError(error){switch(error.code){case 0:alert(error.message);return;case 1:alert(error.message);return;case 2:alert(error.message);return;case 3:alert(error.message);return;default:alert(error.message);return}}function onbuttonclick(e){if(!window.navigator.geolocation){alert("Unfortunately your browser doesn't support geolocation.");return}navigator.geolocation.getCurrentPosition(getPositionSuccess,getPositionError,{enableHightAccuracy:true,maximumAge:1})}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,{background:"url("+nmls.IPHONE_MAP_BUTTONS.url+") no-repeat -3px -3px","-webkit-border-image":"url("+nmls.IPHONE_WHITE_BUTTON.url+") 10 14",color:"#fff",cursor:"pointer","font-size":"12px",height:"30px",width:"30px","line-height":"18px","text-align":"center",position:"absolute"},true);_node.onclick=nmev.callback(_node,onbuttonclick);map.getContainer().appendChild(_node);return _node}}GeoLocationControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(15,30))};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 getLayersError(moreBtn){return function(){moreBtn.style.color="#9f9f9f";moreBtn.title="Currently unavailable due to network issues. To try again please refresh the page."}}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"));this.openInfoWindow(node,{pixelOffset:new nmm.Size(0,-this.getIcon().iconSize.height)})}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:"160px"},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 processOldLayerFormat(data,menuContainer,bgContainer){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.PANEL_BACKGROUND,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"}function createBackground(menuContainer,bgContainer){var horizSprite=nmls.BUTTONS;var vertSprite=nmls.BUTTONS_VERTICAL;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 width;var height;var ieFocusFix;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.PANEL_BACKGROUND,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"}function createSelectableLayers(selectableLayers,parent){var len=selectableLayers.length;for(var i=0;i<len;i++){parent.appendChild(createCheckbox(selectableLayers[i],i===len-1))}}function createNewLayers(data,menuContainer){var menuFrag=document.createDocumentFragment();var layerLen=data.length;var item;var title;var layers;var layer;var layerItem;var layerName;var flyout;_icon=createIcons(data);for(var i=0;i<layerLen;i++){item=data[i];for(var p in item){if(item.hasOwnProperty(p)){layers=item[p];if(layers.length>=1){title=document.createElement("h4");title.innerHTML=p;nms.css(title,{color:"#003465","font-weight":"bold","font-size":"13px",margin:"0px 10px 5px 10px","text-decoration":"underline"},true);menuFrag.appendChild(title);if(layers.length===1){layer=layers[0];for(var sp in layer){if(layer.hasOwnProperty(sp)){title.innerHTML+=" - "+sp;createSelectableLayers(layer[sp],menuFrag)}}}else{for(var j=0;j<layers.length;j++){layer=layers[j];for(var mp in layer){if(layer.hasOwnProperty(mp)){layerItem=document.createElement("div");layerName=document.createElement("a");flyout=document.createElement("div");layerName.innerHTML=mp;nms.css(layerItem,{cursor:"pointer","font-size":"12px","font-weight":"bold",padding:"0px 0px 5px 0px",position:"relative"},true);nms.css(layerName,{margin:"0px 10px"},true);nms.css(flyout,{padding:"5px 0px",position:"absolute",left:"200px",top:"0px",visibility:"hidden",width:"200px"},true);nms.applyPngAlphaBg(flyout,nmls.PANEL_BACKGROUND.url,true);layerItem.onmouseover=function(){this.lastChild.style.visibility=""};layerItem.onmouseout=function(){this.lastChild.style.visibility="hidden"};menuFrag.appendChild(layerItem);layerItem.appendChild(layerName);layerItem.appendChild(flyout);createSelectableLayers(layer[mp],flyout)}}}}}}}}menuContainer.appendChild(menuFrag)}function processNewLayerFormat(data,menuContainer,bgContainer){createNewLayers(data,menuContainer);createBackground(menuContainer,bgContainer)}function processLayers(moreBtn,menuContainer,bgContainer){return function(data){if(data.length<=0){return}if(data[0].id!==undefined){processOldLayerFormat(data,menuContainer,bgContainer)}else{processNewLayerFormat(data,menuContainer,bgContainer)}moreBtn.style.color="#003465";moreBtn.removeAttribute("title")}}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=200;var ieFocusFix;_map=map;_node=document.createElement("div");moreBtn.title="Currently unavailable. To try again please refresh the page.";nms.css(moreBtn,{color:"#9f9f9f",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);if(!this.selectable()){nmev.disableSelect(_node)}if(!this.printable()){_node.className=nmm.NO_PRINT}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);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(moreBtn,subMenu,subMenuBg),{error:getLayersError(moreBtn),creationError:getLayersError(moreBtn),timeoutError:getLayersError(moreBtn)});return _node}}DynamicLayersControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(15,50))};var Notification={id:undefined,priority:1,register:undefined,remove:undefined,node:undefined,position:ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(10,10)),showNotch:false,anchorOffset:0,notchAnchor:ControlAnchor.ANCHOR_TOP_LEFT,notchHeight:10};var NotificationControlOptions={backgroundColor:"#67c7eb",borderColor:"#e7e7e7",cookieName:"notification",cookieExpires:30*nml.MS_IN_DAY,width:400};function NotificationControl(printable,selectable,notifications,opts){var _that=this;var _notifyTimeout=100;var _dismissedNotifications=[];var _undismissedNotifications=[];var _notifyQ=[];var _timers={};var _currentNotification;var _node;var _content;var _map;function sortNotificationsAsc(a,b){return a.priority-b.priority}function saveDismissedNotifications(){var cookie=nmh.Cookie.getCookie(opts.cookieName,opts.cookieExpires);var len=_dismissedNotifications.length;var str="";if(!cookie){cookie=new nmh.Cookie(opts.cookieName,opts.cookieExpires)}for(var i=0;i<len;i++){str+=(str?",":"")+_dismissedNotifications[i].id}cookie.setValue("dismissed",str);cookie.save()}function extractCookieNotifications(){var cookie=nmh.Cookie.getCookie(opts.cookieName,opts.cookieExpires);var dismissedKeys;var keyTokens;var len;var note;var k;var exists;if(!cookie){_undismissedNotifications=notifications.slice();cookie=new nmh.Cookie(opts.cookieName,opts.cookieExpires);cookie.save();return}dismissedKeys=cookie.getValue("dismissed");if(!dismissedKeys){_undismissedNotifications=notifications.slice();return}keyTokens=dismissedKeys.split(",");len=notifications.length;for(var i=0;i<len;i++){exists=false;note=notifications[i];if(keyTokens.length>0){k=keyTokens.length-1;while(k>=0&&!exists){if(note.id===keyTokens[k]){exists=true;keyTokens.splice(k,1);_dismissedNotifications.push(note)}k--}}if(!exists){_undismissedNotifications.push(note)}}}function registerNotifications(map){var len=_undismissedNotifications.length;var notification;var register;for(var i=0;i<len;i++){notification=_undismissedNotifications[i];register=notification.register;if(register&&typeof(register)==="function"){register.call(notification,_that,map)}}}function processNotificationQ(){var notchBorder=_node.firstChild;var notch=notchBorder.firstChild;var callout=_node.lastChild;var notchBorderHeight;var notchHeight;if(_currentNotification){_currentNotification.remove.call(_currentNotification)}_notifyQ.sort(sortNotificationsAsc);_currentNotification=_notifyQ[0];if(typeof _currentNotification.node==="string"){_content.innerHTML=_currentNotification.node}else{if(_content.firstChild){nme.discardElement(_content.firstChild)}_content.appendChild(_currentNotification)}delete _timers.onnotify;_notifyQ=[];if(_currentNotification.showNotch){notchBorderHeight=_currentNotification.notchHeight;notchHeight=notchBorderHeight-2;if(_currentNotification.notchAnchor===ControlAnchor.ANCHOR_BOTTOM_LEFT||_currentNotification.notchAnchor===ControlAnchor.ANCHOR_BOTTOM_RIGHT){nms.css(notchBorder,{borderBottom:"0px",borderTop:"solid "+notchBorderHeight+"px "+opts.borderColor,borderLeft:"solid "+notchBorderHeight+"px transparent",borderRight:"solid "+notchBorderHeight+"px transparent",display:"",top:"",bottom:"-10px"});nms.css(notch,{borderBottom:"0px",borderTop:"solid "+notchHeight+"px "+opts.backgroundColor,borderLeft:"solid "+notchHeight+"px transparent",borderRight:"solid "+notchHeight+"px transparent",left:-(Math.floor(notchBorderHeight/2)+4)+"px",bottom:"2px"});callout.style.marginTop="0px"}else{nms.css(notchBorder,{borderTop:"0px",borderBottom:"solid "+notchBorderHeight+"px "+opts.borderColor,borderLeft:"solid "+notchBorderHeight+"px transparent",borderRight:"solid "+notchBorderHeight+"px transparent",display:"",top:"0px",bottom:""});nms.css(notch,{borderTop:"0px",borderBottom:"solid "+notchHeight+"px "+opts.backgroundColor,borderLeft:"solid "+notchHeight+"px transparent",borderRight:"solid "+notchHeight+"px transparent",left:-(Math.floor(notchBorderHeight/2)+4)+"px",top:"2px"});callout.style.marginTop=notchHeight+"px"}if(nmc.browser.msie&&nmc.browser.majorVersion<=6){nms.css(notchBorder,{borderRightColor:"pink",borderLeftColor:"pink",filter:"chroma(color=pink)"});nms.css(notch,{borderRightColor:"green",borderLeftColor:"green",filter:"chroma(color=green)"})}if(_currentNotification.notchAnchor===ControlAnchor.ANCHOR_BOTTOM_LEFT||_currentNotification.notchAnchor===ControlAnchor.ANCHOR_TOP_LEFT){notchBorder.style.left=_currentNotification.anchorOffset+"px";notchBorder.style.right=""}else{notchBorder.style.right=_currentNotification.anchorOffset+"px";notchBorder.style.left=""}}else{notchBorder.style.display="none";callout.style.marginTop="0px"}_node.style.display="";_map.positionControl(_that,_currentNotification.position)}function close(save){var i;_node.style.display="none";if(_currentNotification){_currentNotification.remove.call(_currentNotification);i=nml.ArrayHelper.indexOf(_undismissedNotifications,_currentNotification);if(i>=0){_undismissedNotifications.splice(i,1);_dismissedNotifications.push(_currentNotification);if(save){saveDismissedNotifications()}}_currentNotification=null}}function ondocumentmousedown(e){close(false)}function onnotify(notification){if(_timers.onnotify){window.clearTimeout(_timers.onnotify)}_notifyQ.push(notification);_timers.onnotify=window.setTimeout(processNotificationQ,_notifyTimeout)}this.printable=function(){return Boolean(printable)};this.selectable=function(){return Boolean(selectable)};this.initialize=function(map){var frag=document.createDocumentFragment();var borderWrap=document.createElement("div");var closeButton=document.createElement("div");var dismissWrap=document.createElement("div");var dismissCheckbox=document.createElement("input");var dismissLabel=document.createElement("label");var notchBorder=document.createElement("div");var notch=document.createElement("div");_map=map;_node=document.createElement("div");_content=document.createElement("div");closeButton.innerHTML="X";dismissCheckbox.id="dismiss-checkbox";dismissCheckbox.type="checkbox";dismissLabel.innerHTML="Don't show me again";dismissLabel.htmlFor=dismissCheckbox.id;nms.css(_node,{cursor:"default",display:"none",width:opts.width+"px"},true);nms.css(notchBorder,{display:"none","font-size":"0px",height:"0px",width:"0px",position:"absolute","z-index":"1"},true);nms.css(notch,{"font-size":"0px",height:"0px",width:"0px",position:"absolute"},true);nms.css(borderWrap,{background:opts.backgroundColor,border:"solid 2px "+opts.borderColor,"border-radius":"10px","-webkit-border-radius":"10px","-moz-border-radius":"10px",padding:"5px 15px 25px 15px",position:"relative",zoom:"1"},true);nms.css(closeButton,{background:"#fff",border:"solid 2px #e7e7e7","border-radius":"10px","-webkit-border-radius":"10px","-moz-border-radius":"10px",cursor:"pointer","font-size":"14px","font-weight":"bold","line-height":"18px",position:"absolute",right:"10px",top:"10px","text-align":"center",height:"18px",width:"18px","z-index":"1"},true);nms.css(dismissWrap,{position:"absolute",bottom:"5px",right:"10px"},true);nms.css(dismissLabel,{"font-weight":"bold","line-height":"1em","margin-right":"5px"},true);nms.css(dismissCheckbox,{"line-height":"1em","vertical-align":"middle"},true);if(!this.selectable()){nmev.disableSelect(_node)}nmev.addDomListener(document,"mousedown",ondocumentmousedown);_node.onmousedown=nmev.stopBubbling;closeButton.onclick=function(){close(false)};dismissCheckbox.onclick=function(){close(true)};frag.appendChild(_node);_node.appendChild(notchBorder);_node.appendChild(borderWrap);notchBorder.appendChild(notch);borderWrap.appendChild(closeButton);borderWrap.appendChild(dismissWrap);borderWrap.appendChild(_content);dismissWrap.appendChild(dismissLabel);dismissWrap.appendChild(dismissCheckbox);map.getContainer().appendChild(frag);if(notifications&&notifications instanceof Array){notifications.sort(sortNotificationsAsc);extractCookieNotifications();registerNotifications(map)}return _node};this.close=close;opts=nmo.Synchronize.fill(opts,NotificationControlOptions);nmev.addListener(_that,"notify",onnotify)}NotificationControl.prototype.getDefaultPosition=function(){return new ControlPosition(ControlAnchor.ANCHOR_TOP_LEFT,new nmm.Size(0,0))};var SmallZoomControl=SmallZoomControl3D;var LargeMapControl=LargeMapControl3D;var HierarchicalMapTypeControl=HierarchicalRotateMapTypeControl;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 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.MenuMapTypeControl=MenuMapTypeControl;nmm.HierarchicalMapTypeControl=HierarchicalMapTypeControl;nmm.HierarchicalRotateMapTypeControl=HierarchicalRotateMapTypeControl;nmm.DropDownMapTypeControl=DropDownMapTypeControl;nmm.OverviewMapControl=OverviewMapControl;nmm.NavLabelControl=NavLabelControl;nmm.TimelineControl=TimelineControl;nmm.TimelineControlOptions=TimelineControlOptions;nmm.LatestImageryControl=LatestImageryControl;nmm.ReturnToRegularSiteControl=ReturnToRegularSiteControl;nmm.GeoLocationControl=GeoLocationControl;nmm.DynamicLayersControl=DynamicLayersControl;nmm.Notification=Notification;nmm.NotificationControl=NotificationControl;nmm.NotificationControlOptions=NotificationControlOptions;nmm.IPhoneZoomOutControl=IPhoneZoomOutControl;nmm.IPhoneControl=IPhoneControl;nmm.IPhoneTimelineControl=IPhoneTimelineControl})();
