﻿// JScript File

var directionsBoxObj = null;
var geocodedStartPoint = null;
var geocoder = null;
var defaultGeocodeZoomLevel = 17;

function getDirections(lat,lng) {
    var waypoints = [];
    waypoints[0] = geocodedStartPoint;
    waypoints[1] = new GLatLng(lat,lng);
    directionsObj.loadFromWaypoints(waypoints);
}
function geocode(address)
{
		        geocoder.getLatLng(address,function(point){
		            geocodedStartPoint = point;
			    map.setCenter(point,defaultGeocodeZoomLevel);
			    findFromLocation(point.lat(),point.lng(),parseInt(document.getElementById('distbox').value));
		        });
}

function findENOLocation() {
    var address = document.getElementById('addressBox').value;
    geocode(address);
}

function createENOEvent(name,location,dateOfEvent,id) {
	var obj = new Object();
	obj.name = name;
	obj.location = location;
	obj.dateOfEvent = dateOfEvent;
	obj.ID = id;
	return obj;
}
function getStringFromXML(xml) {
    if(xml.text) {
        return xml.text;
    } else {
            try {
                var ele2 = xml.getElementsByTagName('string');
                var ele3 = ele2[0];
		if(ele3.firstChild.nodeValue != ele3.lastChild.nodeValue) {
			return ele3.firstChild.nodeValue + ele3.lastChild.nodeValue;
		} else {
	                return ele3.firstChild.nodeValue;
		}
            } catch (o) {
                return "";
            }
    }
}
function getXMLHttpRequest() {
    var xmlHttp = null;
    if (typeof(XMLHttpRequest) == "undefined") {
    XMLHttpRequest = function() {
    try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
      catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
      catch(e) {}
    try { return new ActiveXObject("Msxml2.XMLHTTP"); }
      catch(e) {}
    try { return new ActiveXObject("Microsoft.XMLHTTP"); }
      catch(e) {}
    throw new Error("This browser does not support XMLHttpRequest.");
    };
    }
    xmlHttp = new XMLHttpRequest();
    return xmlHttp;
}


	var map = null;
	var allLatLngs = [];
	var baseLat = 34.808747;
	var baseLng = -92.464027;
	var starIcon = null;
	var markerOptions = null;
	var directionsObj = null;
	function onInit() {
		directionsBoxObj  = document.getElementById('directionsArea')
		var ele = document.getElementById('myMapArea');
		defaultMapCenter = new GLatLng(34.808747,-92.464027);
		map = new GMap2(ele);
		map.setCenter(defaultMapCenter,5);
 		map.addControl(new GLargeMapControl());
		map.addControl(new GMapTypeControl());
		GEvent.addListener(map,"zoomend",OnZoomHandler);
        	starIcon = new GIcon(G_DEFAULT_ICON);
		starIcon.iconSize = new GSize(32,32);
        	starIcon.image = "http://www.eastproject.org/ENO2009/Resources/Images/star.png";
		
		// Set up our GMarkerOptions object
		markerOptions = { icon:starIcon };
		directionsObj = new GDirections(map,directionsBoxObj);
		geocoder = new GClientGeocoder();

		//createRandomLatLngs();
		getEvents();
	}

	function parseEvent(eventInfo) {
		var eventParts = eventInfo.split('/');
		var id = eventParts[0];
		var loc = new GLatLng(parseFloat(eventParts[1]),parseFloat(eventParts[2]));
		var name = eventParts[3];
		var dateOfEvent = new Date();
		var dateString = eventParts[4]+'/'+eventParts[5]+'/'+(2000+parseInt(eventParts[6]))+' '+eventParts[7]+':'+eventParts[8]
		dateOfEvent.setTime(Date.parse(dateString))
		eventToReturn = createENOEvent(name,loc,dateOfEvent,id);
		allLatLngs.push(eventToReturn);
		return eventToReturn;
	}

	function resetDisplayOfEvents() {
		map.clearOverlays();
		for(i = 0; i < allLatLngs.length; i++) {
			var newMarker = new GMarker(allLatLngs[i].location, markerOptions);
			map.addOverlay(newMarker);
			newMarker.enoid = allLatLngs[i].ID;				
			GEvent.addListener(newMarker, "click", function(pnt) {
				getDataForEventId(pnt,newMarker.enoid);
			});
		}	
	}

	function addENOEventsToMap(xml) {
		return function() {
			if(xml.readyState == 4 && xml.status == 200) {
				var data = getStringFromXML(xml.responseXML);
				var eventParts = data.split('|');
				for(i = 0; i < eventParts.length; i++) {
				  try {
					eventInfo = parseEvent(eventParts[i]);
					var newMarker = new GMarker(eventInfo.location, markerOptions);
					map.addOverlay(newMarker);
					newMarker.enoid=eventInfo.ID;
					GEvent.addListener(newMarker, "click", function(pnt) {
						getDataForEventId(pnt,this.enoid);
					});
				  } catch (errno) {
					var p = 2;
				  }
				}
			}
		}
	}

	function getEvents() {
		var xml = getXMLHttpRequest();
		xml.open("POST", "http://www.eastproject.org/ENO2009/TestService.asmx/GetEventLocations", true);
		xml.onreadystatechange = addENOEventsToMap(xml);
		xml.send("a");
	}

	function eventIdDataHandler(xml,pnt) {
		return function() {
			if(xml.readyState == 4 && xml.status == 200) {
				data = getStringFromXML(xml.responseXML);
				data = data + '<br/><a href="javascript:getDirections('+pnt.lat()+','+pnt.lng()+')">Get Directions</a>'
				map.openInfoWindowHtml(pnt,data);
			}	
		};
	}

	function getDataForEventId(pnt,id) {
		var xml = getXMLHttpRequest();	
		xml.open("GET", "http://www.eastproject.org/ENO2009/TestService.asmx/GetDescriptionForEvent?eventId="+id, true);
		xml.onreadystatechange = eventIdDataHandler(xml,pnt);
		xml.send(null);
	}
	
	var recalculateSchools = false;
	var searchPoint = null;

	function includeSchoolInTable(school,tbody,theDist) {
				var row = document.createElement('tr');				
				var cellText = document.createTextNode(school.name);
				var firstcell = document.createElement('td');
				var nameLink = document.createElement('a');
				//nameLink.href = 'javascript:ZoomToLocation('+allLatLngs[i].location.lat()+','+allLatLngs[i].location.lng()+')';
				nameLink.href = 'javascript:ZoomToLocationENO('+i+')'
				nameLink.appendChild(cellText);
				firstcell.appendChild(nameLink);
				var secondcell = document.createElement('td');
				school.dist = (Math.floor((theDist / 1609.344) * 100) / 100);
				cellText = document.createTextNode(school.dist);
				secondcell.appendChild(cellText);
				var thirdcell = document.createElement('td');
				cellText = document.createTextNode(school.dateOfEvent.toLocaleString());
				thirdcell.appendChild(cellText);
				row.appendChild(firstcell);
				row.appendChild(secondcell);
				row.appendChild(thirdcell);
				var fourthcell = document.createElement('td');
				cellText = document.createTextNode("details");
				nameLink = document.createElement('a');
				nameLink.href = 'javascript:ZoomToLocationENO('+i+')';
				nameLink.appendChild(cellText);				
				fourthcell.appendChild(nameLink);
				row.appendChild(fourthcell);
				tbody.appendChild(row);
		
	}


	//Assume radius is in miles
	function findFromLocation(lat, lng, radius) {
	    recalculateSchools = true;
		map.clearOverlays();
		var count = 0;		
		radius = radius * 1609.344; //Convert miles to meters
		searchPoint = new GLatLng(lat,lng);
		map.addOverlay(new GMarker(searchPoint));
		var ele = document.getElementById('reportArea');
		ele.style.display = '';
		var tbody = document.getElementsByTagName("tbody")[0];
		removeAllChildren(tbody);
		var minLat = 180;
		var minLng = 180;
		var maxLat = 0;
		var maxLng = -180;
		for(i = 0; i < allLatLngs.length; i++) {
			var theDist = searchPoint.distanceFrom(allLatLngs[i].location);
			if(theDist < radius) {
				minLat = Math.min(minLat,allLatLngs[i].location.lat());
				minLng = Math.min(minLng,allLatLngs[i].location.lng());
				maxLat = Math.max(maxLat,allLatLngs[i].location.lat());
				maxLng = Math.max(maxLng,allLatLngs[i].location.lng());

				var newMarker = new GMarker(allLatLngs[i].location, markerOptions);
				map.addOverlay(newMarker, markerOptions);	
				newMarker.enoid=allLatLngs[i].ID;
				GEvent.addListener(newMarker, "click", function(pnt) {
					getDataForEventId(pnt,this.enoid);
				});


				count++;

                includeSchoolInTable(allLatLngs[i],tbody,theDist);
			}
		}
		var bounds = new GLatLngBounds(new GLatLng(minLat,minLng), new GLatLng(maxLat,maxLng));
		if(console) {
			console.log(" " + minLat + " : " + minLng + " : " + maxLat + " : " + maxLng);
		}
		map.setCenter(bounds.getCenter(),map.getBoundsZoomLevel(bounds));		
	}

	function ZoomToLocationENO(index) {
		map.setCenter(allLatLngs[index].location,17);
		getDataForEventId(allLatLngs[index].location,allLatLngs[index].ID);		
	}

	function ZoomToLocation(lat,lng) {
		map.setCenter(new GLatLng(lat,lng),17);
	}

	function removeAllChildren(cell) {

		if ( cell.hasChildNodes() )
		{
    			while ( cell.childNodes.length >= 1 )
    			{
        			cell.removeChild( cell.firstChild );       
    			} 
		}
	}
    function OnZoomHandler(x,y) {
		if(recalculateSchools) {
			var boundz = map.getBounds();
			map.clearOverlays();
			var count = 0;		
			var ele = document.getElementById('reportArea');
			ele.style.display = '';
			var tbody = document.getElementsByTagName("tbody")[0];
			removeAllChildren(tbody);
			for(i = 0; i < allLatLngs.length; i++) {	
				var theDist = searchPoint.distanceFrom(allLatLngs[i].location);
				if(boundz.contains(allLatLngs[i].location)) {
					var newMarker = new GMarker(allLatLngs[i].location, markerOptions);
					map.addOverlay(newMarker, markerOptions);	
					newMarker.enoid=i;
					GEvent.addListener(newMarker, "click", function(pnt) {
						getDataForEventId(pnt,this.enoid);
					});


					count++;
					includeSchoolInTable(allLatLngs[i],tbody,theDist);
				}

			}
		}
	}

	addEvent(window, "load", onInit);


