// File: RangeMap.js
var RangeMap = (
	function(){
		// Private Static (Class) Members
		var strIDTemplate = "RangeMap";
		var intCounter = 0;

		// Private Static Methods
		function incrementCounter()
		{
			return intCounter++;
		};


		// Class Constructor.
		function constructorFn()
		{
			// Private Instance Variables
			var self = this;
			var index = incrementCounter();
			var id = strIDTemplate + index;
			var listLines = new Object();
			var listMarkers = new Object();
			var map = null;
			var bLinesShown = true;
			var bMarkersShown = true;

			// Private Instance Methods
			var getScreenWidth = function()
			{
				var frameWidth = -1;
				if(screen.width)
					frameWidth = screen.width;
/*
				if(self.innerWidth){
					frameWidth = self.innerWidth;
				}
				else if(document.documentElement && document.documentElement.clientWidth){
					frameWidth = document.documentElement.clientWidth;
				}
				else if(document.body){
					frameWidth = document.body.clientWidth;
				}
*/
				return frameWidth;
			};

			var getScreenHeight = function()
			{
				var frameHeight = -1;

				if(screen.height)
					frameHeight = screen.height;

/*
				if(self.innerHeight){
					frameHeight = self.innerHeight;
				}
				else if(document.documentElement && document.documentElement.clientHeight){
					frameHeight = document.documentElement.clientHeight;
				}
				else if(document.body){
					frameHeight = document.body.clientHeight;
				}
*/
				return frameHeight;
			}

			var generateLine = function(listPnt1, listPnt2, strColor, nWeight, nOpacity)
			{
				points = new Array();
				points.push(new GLatLng(listPnt1[0], listPnt1[1]));
				points.push(new GLatLng(listPnt2[0], listPnt2[1]));
				return new GPolyline(points, strColor, nWeight, nOpacity);
			};

			var createMarker = function(point, text)
			{
				var marker = new GMarker(point, {title: text});
/*
				GEvent.addListener(marker, "mouseover",
					function(){
						marker.openInfoWindowHtml(text);
					}
				);
*/
				return marker;
			};

			var showLines = function()
			{
				var index;

				for(index in listLines){
					if(listLines[index])
						map.addOverlay(listLines[index]);
				}
			}

			var showMarkers = function()
			{
				var index;
				for(index in listMarkers){
					if(listMarkers[index])
						map.addOverlay(listMarkers[index]);
				}
			}

			var handleShowLines = function(e)
			{

				e = !e ? window.event : e;

				var elt = e.target ? e.target : window.srcElement;
				if(!elt) elt = this;

				if(elt){
					if(elt.checked){
						bLinesShown = true;
						showLines();
					}
					else{
						bLinesShown = false;
						map.clearOverlays();
						if(bMarkersShown){
							showMarkers();
						}
					}
				}
				return true;
			};

			var handleShowMarkers = function(e)
			{
				e = !e ? window.event : e;

				var elt = e.target ? e.target : window.srcElement;
				if(!elt) elt = this;

				if(elt){
					if(elt.checked){
						bMarkersShown = true;
						showMarkers();
					}
					else{
						bMarkersShown = false;
						map.clearOverlays();
						if(bLinesShown){
							showLines();
						}
					}
				}
				return true;
			};

			this.load = function()
			{
				var scrH = getScreenHeight();
				var scrW = getScreenWidth();


				if(GBrowserIsCompatible()){
					var eltMap = document.getElementById("map");

					if(scrW > 0 && scrH > 0){
//						alert("W: " + scrW + "\nH: " + scrH);
						var offset = Math.floor(scrH / 4);

						var fact = 1.0;
						while(scrW * fact * 0.70 > scrH - offset && fact > 0.0){
							fact -= 0.01;
						}

						if(fact > 0.0){
							scrW *= fact;
							eltMap.style.width = scrW + "px";
							eltMap.style.height = 0.70 * scrW + "px";
						}
					}

					map = new GMap2(eltMap, {mapTypes: [G_HYBRID_MAP]});
					map.addControl(new GLargeMapControl());
					map.addControl(new GScaleControl());

					GEvent.addListener(map, "moveend",
						function(){
							var center = map.getCenter();
//							document.getElementById("message").innerHTML = center.toString();
							map.clearOverlays();
//							map.addOverlay(new GMarker(center));

							if(bLinesShown) showLines();
							if(bMarkersShown) showMarkers();

						}
					);

					var elt;
					if((elt = document.getElementById("chkShowLines")) != null){
						elt.onclick = handleShowLines;
					}

					if((elt = document.getElementById("chkShowMarkers")) != null){
						elt.onclick = handleShowMarkers;
					}


					var gPoint = new GLatLng(39.691824, -104.608275);
					map.setCenter(gPoint, 16);// Set Center and Zoom Level

					map.openInfoWindow(map.getCenter(), document.createTextNode("Golden Gun Club"));


					var nLineWeight = 3; //px
					var nLineOpacity = 1; // 0 - 1
					var nLineWeightBerm = 2;


					// ************* Lines *************
					// West Range:
					listLines["WestRange"] = generateLine([39.68992, -104.61261570453644], [39.68992, -104.61231383945465], '#0000FF', nLineWeight, nLineOpacity);

					// Central Range:
					listLines["CentralRange"] = generateLine([39.68992, -104.61226433515549], [39.68992, -104.61174130439758], '#FF0000', nLineWeight, nLineOpacity);

					// East Range:
					listLines["EastRange"] = generateLine([39.68995, -104.61158037185669], [39.68995, -104.61112707853317], '#00FF00', nLineWeight, nLineOpacity);

					// Shotgun-West
					listLines["ShotgunWest"] = generateLine([39.69007832438065, -104.60897326469421], [39.69007832438065, -104.60840437381744],'#FFAA00', nLineWeight, nLineOpacity);

					// Shotgun-Central
					listLines["ShotgunCentral"] = generateLine([39.69007832438065, -104.60834953453064], [39.69007832438065, -104.60550785064697], '#00FFFF', nLineWeight, nLineOpacity);

					// Shotgun-East
					listLines["ShotgunEast"] = generateLine([39.69007832438065, -104.60545152425766], [39.69007832438065, -104.60487216711044], '#FFAA00', nLineWeight, nLineOpacity);

					// Berms
					listLines["100L"] = generateLine([39.69087, -104.61255133152008], [39.69087, -104.61193978786469], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["100R"] = generateLine([39.69092, -104.61141407489777], [39.69092, -104.6108990907669], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["150"] = generateLine([39.69137, -104.61085081100464], [39.69137, -104.61042165756226], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["200L"] = generateLine([39.69178, -104.61183468601227], [39.69178, -104.61158573627472], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["200R"] = generateLine([39.69197303851778, -104.61136043071747], [39.691853330448964, -104.61072206497192], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["300"] = generateLine([39.69266, -104.61224555969238], [39.69266, -104.61183786392212], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["400"] = generateLine([39.69343, -104.61171448230743], [39.69343, -104.61137652397156], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["500"] = generateLine([39.69448, -104.61219727993011], [39.69448, -104.61166083812714], '#FFFFFF', nLineWeightBerm, nLineOpacity);

					listLines["700Safety"] = generateLine([39.69634843236339, -104.61265325546265], [39.69634843236339, -104.61174130439758], '#FF0000', nLineWeightBerm, nLineOpacity);

					// ***************** Markers ***************
					listMarkers["WestRange"] = createMarker(listLines["WestRange"].getVertex(0), "West Range (Pistol)");

					listMarkers["CentralRange"] = createMarker(listLines["CentralRange"].getVertex(1), "Central Range (Rifle/Pistol)");

					listMarkers["EastRange"] = createMarker(listLines["EastRange"].getVertex(1), "East Range (Rifle/Pistol)");

					listMarkers["ShotgunWest"] = createMarker(listLines["ShotgunWest"].getVertex(0), "Shotgun: Trap Fields");

					// Shotgun Central Marker
					var fLat = (listLines["ShotgunCentral"].getVertex(0).lat() + listLines["ShotgunCentral"].getVertex(1).lat()) / 2;
					var fLng = (listLines["ShotgunCentral"].getVertex(0).lng() + listLines["ShotgunCentral"].getVertex(1).lng()) / 2;
					var point = new GLatLng(fLat, fLng);

					listMarkers["ShotgunCentral"] = createMarker(point, "Shotgun: Trap/Skeet Fields");

					listMarkers["ShotgunEast"] = createMarker(listLines["ShotgunEast"].getVertex(1), "Shotgun: Trap Fields");


					listMarkers["100L"] = createMarker(listLines["100L"].getVertex(0), "100 Yard Berm");

					listMarkers["100R"] = createMarker(listLines["100R"].getVertex(1), "100 Yard Berm");

					listMarkers["150"] = createMarker(listLines["150"].getVertex(1), "150 Yard Berm");

					listMarkers["200L"] = createMarker(listLines["200L"].getVertex(0), "200 Yard Berm");

					listMarkers["200R"] = createMarker(listLines["200R"].getVertex(1), "200 Yard Berm");

					listMarkers["300"] = createMarker(listLines["300"].getVertex(0), "300 Yard Berm");

					listMarkers["400"] = createMarker(listLines["400"].getVertex(1), "400 Yard Berm");

					listMarkers["500"] = createMarker(listLines["500"].getVertex(0), "500 Yard Berm");

					listMarkers["700Safety"] = createMarker(listLines["700Safety"].getVertex(0), "700 Yard Berm (Safety Berm) - Not For Posting Targets.");

					// Clubhouse
					listMarkers["Clubhouse"] = createMarker(new GLatLng(39.689318772957584, -104.60685), "Clubhouse");

					// Front Gate
					listMarkers["FrontGate"] = createMarker(new GLatLng(39.68912269174946, -104.6039816737175), "Front Gate");

					listMarkers["RifleRangeGate"] = createMarker(new GLatLng(39.68909998757358, -104.60694015026093), "Rifle Range Gate");

					if(bLinesShown) showLines();
					if(bMarkersShown) showMarkers();
				}
					return true;
			};	// End load()

			// Attach
			window.onload = this.load;
			window.onunload = GUnload;

		}; // End constructorFn

		/* return the constructor. */
		return constructorFn;
	}
)(); // simultaneously define and call (one-off)!

// ***** Implementation *****
new RangeMap();



