var environment ;
var map;
var ui;
var srch;
var defaultLat = 43.66;
var defaultLng = -79.46;
var defaultZoom = 13;
var currentAreasForPoint = [];
var crosshair;
var startMarker
var endMarker
var blue_flag;
var googleLogoBottom = 60
var maxVertices = 20
var distortion = {0: 1, 1: 0.9914529914529915, 2: 0.9914529914529915, 3: 0.9914529914529915, 4: 0.9914529914529915, 5: 0.9914529914529915, 6: 0.9914529914529915, 7: 0.9914529914529915, 8: 0.9914529914529915, 9: 0.9830508474576272, 10: 0.9830508474576272, 11: 0.9830508474576272, 12: 0.9747899159663865, 13: 0.9666666666666667, 14: 0.9666666666666667, 15: 0.9666666666666667, 16: 0.9586776859504132, 17: 0.9508196721311475, 18: 0.943089430894309, 19: 0.943089430894309, 20: 0.9354838709677419, 21: 0.928, 22: 0.9206349206349206, 23: 0.9133858267716536, 24: 0.9133858267716536, 25: 0.8992248062015504, 26: 0.8923076923076924, 27: 0.8854961832061069, 28: 0.8787878787878788, 29: 0.8721804511278195, 30: 0.8656716417910447, 31: 0.8529411764705882, 32: 0.8467153284671532, 33: 0.8345323741007195, 34: 0.8285714285714286, 35: 0.8169014084507042, 36: 0.8055555555555556, 37: 0.7945205479452054, 38: 0.7837837837837838, 39: 0.7733333333333333, 40: 0.7631578947368421, 41: 0.7532467532467533, 42: 0.7388535031847133, 43: 0.725, 44: 0.7160493827160493, 45: 0.7073170731707317, 46: 0.6946107784431138, 47: 0.6783625730994152, 48: 0.6666666666666666, 49: 0.655367231638418, 50: 0.6408839779005525, 51: 0.6270270270270271, 52: 0.6105263157894737, 53: 0.5979381443298969, 54: 0.5858585858585859, 55: 0.5714285714285714, 56: 0.5576923076923077, 57: 0.5420560747663551, 58: 0.5272727272727272, 59: 0.5132743362831859, 60: 0.4978540772532189, 61: 0.48333333333333334, 62: 0.46774193548387094, 63: 0.453125, 64: 0.43609022556390975, 65: 0.4218181818181818, 66: 0.40559440559440557, 67: 0.38926174496644295, 68: 0.3729903536977492, 69: 0.3569230769230769, 70: 0.34017595307917886, 71: 0.32492997198879553, 72: 0.3076923076923077, 73: 0.2907268170426065, 74: 0.27423167848699764, 75: 0.2577777777777778, 76: 0.24116424116424118, 77: 0.22393822393822393, 78: 0.20714285714285716, 79: 0.18985270049099837}
var toInt = function(obj) {return parseInt(obj)}
var displayedURLMessage
var tmpPts;
var mobileLoc;

var Namespace =
{
    Register : function(_Name)
    {
        var chk = false;
        var cob = "";
        var spc = _Name.split(".");
        for(var i = 0; i<spc.length; i++)
        {
            if(cob!=""){cob+=".";}
            cob+=spc[i];
            chk = this.Exists(cob);
            if(!chk){this.Create(cob);}
        }
        if(chk){ throw "Namespace: " + _Name + " is already defined."; }
    },

    Create : function(_Src)
    {
        eval("window." + _Src + " = new Object();");
    },

    Exists : function(_Src)
    {
        eval("var NE = false; try{if(" + _Src + "){NE = true;}else{NE = false;}}catch(err){NE=false;}");
        return NE;
    }
}


function browserCheck () {
	var browser = BrowserDetect.browser + ' ' + BrowserDetect.version + ' on ' + BrowserDetect.OS
	if (BrowserDetect.browser == "Firefox") {
		
	} else if ( BrowserDetect.browser == "Safari") {
		
	} else {
		// alert("Sorry! You're using " + browser + ". This beta is designed to run on Firefox, which is available for all platforms. We update Urbanistica frequently, so check back to see if your browser is supported")
		// window.location = "http://www.urbanisti.ca"
	}
}

function initializePage () { 
	// navigator.geolocation.getCurrentPosition(foundLocation, noLocation);

	function foundLocation(position) {
	  	if (confirm("Should I use your current location?")) {
			startLoc  = {latitude : position.coords.latitude, longitude: position.coords.longitude}
		}
	}
	
	function noLocation()
	{
	  mobileLoc = null
	}
	
	// browserCheck()
	environment = "map"
	crosshair = new GIcon();
	crosshair.name = 'crosshair'
	crosshair.image = "http://s3.amazonaws.com/urbanistica/interface/marker_pin.png";
	crosshair.shadow = "http://s3.amazonaws.com/urbanistica/interface/marker_pin_shadow.png"
	crosshair.iconSize = new GSize(22, 47);
	crosshair.shadowSize = new GSize(40, 47);
	crosshair.iconAnchor = new GPoint(11, 47);
	crosshair.shadowAnchor = new GPoint(2, 33);
	crosshair.infoWindowAnchor = new GPoint(31, 8);
	
	startMarker = new GIcon();
	startMarker.name = 'crosshair'
	startMarker.image = "http://s3.amazonaws.com/urbanistica/interface/marker_green.png";
	startMarker.shadow = "http://s3.amazonaws.com/urbanistica/interface/marker_pin_shadow.png"
	startMarker.iconSize = new GSize(22, 47);
	startMarker.shadowSize = new GSize(40, 47);
	startMarker.iconAnchor = new GPoint(11, 47);
	startMarker.shadowAnchor = new GPoint(2, 33);
	startMarker.infoWindowAnchor = new GPoint(31, 8);
	
	endMarker = new GIcon();
	endMarker.name = 'crosshair'
	endMarker.image = "http://s3.amazonaws.com/urbanistica/interface/marker_red.png";
	endMarker.shadow = "http://s3.amazonaws.com/urbanistica/interface/marker_pin_shadow.png"
	endMarker.iconSize = new GSize(22, 47);
	endMarker.shadowSize = new GSize(40, 47);
	endMarker.iconAnchor = new GPoint(11, 47);
	endMarker.shadowAnchor = new GPoint(2, 33);
	endMarker.infoWindowAnchor = new GPoint(31, 8);
	
	blue_flag = new GIcon()
	blue_flag.image = "http://s3.amazonaws.com/urbanistica/interface/blue_flag.png"
	blue_flag.iconSize = new GSize(18, 27); 
	blue_flag.shadow = "http://s3.amazonaws.com/urbanistica/interface/flag_shadow.png"
	blue_flag.shadowSize = new GSize(38, 27);
	blue_flag.iconAnchor = new GPoint(6, 26);
	blue_flag.infoWindowAnchor = new GPoint(31, 8);
	
	setInterval ( "ui.UpdateSpinner()", 100 );
	
	try {
		ui = new Interface.Controls
	} catch(err) {
		
	}
	map = new Map.Controls(startLoc)
	try {
		var zoom_slider = $('date_zoom_slider_div')

    	map.dateSlider = new Control.Slider(zoom_slider.down('.handle'), zoom_slider, {
	      range: $R(0, 300),
	      sliderValue: 300,
				onChange : function(val) {
					map.DateSliderUpdated(val)
				}
	    });
	} catch(err) {
		alert('no date slider')
	}
	msgs = new Message.Controls
	map.InitMap(new google.maps.Map2(document.getElementById("map")));
	srch = new Search.Controls
	$('logo').observe('click', function(event) {
		if (! confirm("This will take you away from the map, to the home page. Continue?")) {return}
		window.location = "/"
	})
	ui.InitializeRibbon()
	ui.InitializeTagSearch()
	ui.InitializeBroadcastOptions()
	ui.WindowResized()
	ui.InitializeNewMessage()
	ui.InitializeNewReply()
	ui.InitializeDraggables()
// 	checkForOpenMessage()
	
}

function checkForOpenMessage () {

	if (gup('viewMessage') && displayedURLMessage != true) {
		var id = gup('viewMessage')
		displayedURLMessage = true
		msgs.OpenMessage(id)
	}
}

function gup( name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

function revertedPoly () {
	// called by the map when a reversion occurs, ie user creates illegal poly with crossing lines
}

function currentAreaCoords () {
	return $A(map.lastPolyPts).toJSON()
}

function trimString(sInString) { 				// utility script
  sInString = sInString.replace( /^\s+/g, "" );// strip leading
  return sInString.replace( /\s+$/g, "" );// strip trailing
}

function checkEmail(email){						// utility script
    var pattern=/^([a-zA-Z0-9_.-])+@([a-zA-Z0-9_.-])+\.([a-zA-Z])+([a-zA-Z])+/;
    return (pattern.test(email))        
}

// var BrowserDetect = {
// 	init: function () {
// 		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
// 		this.version = this.searchVersion(navigator.userAgent)
// 			|| this.searchVersion(navigator.appVersion)
// 			|| "an unknown version";
// 		this.OS = this.searchString(this.dataOS) || "an unknown OS";
// 	},
// 	searchString: function (data) {
// 		for (var i=0;i<data.length;i++)	{
// 			var dataString = data[i].string;
// 			var dataProp = data[i].prop;
// 			this.versionSearchString = data[i].versionSearch || data[i].identity;
// 			if (dataString) {
// 				if (dataString.indexOf(data[i].subString) != -1)
// 					return data[i].identity;
// 			}
// 			else if (dataProp)
// 				return data[i].identity;
// 		}
// 	},
// 	searchVersion: function (dataString) {
// 		var index = dataString.indexOf(this.versionSearchString);
// 		if (index == -1) return;
// 		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
// 	},
// 	dataBrowser: [
// 		{
// 			string: navigator.userAgent,
// 			subString: "Chrome",
// 			identity: "Chrome"
// 		},
// 		{ 	string: navigator.userAgent,
// 			subString: "OmniWeb",
// 			versionSearch: "OmniWeb/",
// 			identity: "OmniWeb"
// 		},
// 		{
// 			string: navigator.vendor,
// 			subString: "Apple",
// 			identity: "Safari",
// 			versionSearch: "Version"
// 		},
// 		{
// 			prop: window.opera,
// 			identity: "Opera"
// 		},
// 		{
// 			string: navigator.vendor,
// 			subString: "iCab",
// 			identity: "iCab"
// 		},
// 		{
// 			string: navigator.vendor,
// 			subString: "KDE",
// 			identity: "Konqueror"
// 		},
// 		{
// 			string: navigator.userAgent,
// 			subString: "Firefox",
// 			identity: "Firefox"
// 		},
// 		{
// 			string: navigator.vendor,
// 			subString: "Camino",
// 			identity: "Camino"
// 		},
// 		{		// for newer Netscapes (6+)
// 			string: navigator.userAgent,
// 			subString: "Netscape",
// 			identity: "Netscape"
// 		},
// 		{
// 			string: navigator.userAgent,
// 			subString: "MSIE",
// 			identity: "Explorer",
// 			versionSearch: "MSIE"
// 		},
// 		{
// 			string: navigator.userAgent,
// 			subString: "Gecko",
// 			identity: "Mozilla",
// 			versionSearch: "rv"
// 		},
// 		{ 		// for older Netscapes (4-)
// 			string: navigator.userAgent,
// 			subString: "Mozilla",
// 			identity: "Netscape",
// 			versionSearch: "Mozilla"
// 		}
// 	],
// 	dataOS : [
// 		{
// 			string: navigator.platform,
// 			subString: "Win",
// 			identity: "Windows"
// 		},
// 		{
// 			string: navigator.platform,
// 			subString: "Mac",
// 			identity: "Mac"
// 		},
// 		{
// 			   string: navigator.userAgent,
// 			   subString: "iPhone",
// 			   identity: "iPhone/iPod"
// 	    },
// 		{
// 			string: navigator.platform,
// 			subString: "Linux",
// 			identity: "Linux"
// 		}
// 	]
// 
// };
// BrowserDetect.init();


