// JavaScript Document

	google.load("prototype", "1.6.1.0");  

    var geocoder;
    var map;
    var markers = [];
    var infoWindow;
    var locationSelect;

    var image = 'http://thecrimetracker.com/images/badge.png';
	var homeImage = 'http://thecrimetracker.com/images/home.png';
  	var mapElem = $('map_canvas');
 

	
   function initialize() {
	geocoder = new google.maps.Geocoder();
	//var latlng = new google.maps.LatLng(visitor_lat, visitor_lng);
	var visitor_address = google.loader.ClientLocation.address.city.toString();
	var visitor_lat = google.loader.ClientLocation.latitude.toString();
	var visitor_lng = google.loader.ClientLocation.longitude.toString();
	var radius = document.getElementById("radius").value;
    var address = document.getElementById("coverageaddress").value;
	
	 if(!address){
	 	document.getElementById("coverageaddress").value = visitor_address+" California";
	 }
	 if(!radius){
	 	document.getElementById("radius").value = 10;
	 }
	 
		map = new google.maps.Map(document.getElementById("map_canvas"), {
			center: new google.maps.LatLng(visitor_lat, visitor_lng),
			zoom: 12,
			mapTypeId: 'roadmap',
			mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}
		  });
		  infoWindow = new google.maps.InfoWindow();
		  locationSelect = document.getElementById("locationSelect");
		  codeAddress();
		  locationSelect.onchange = function() {
			var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
			if (markerNum != "none"){
			  google.maps.event.trigger(markers[markerNum], 'click');
			}
		  };
	  
   }
   
     function searchLocations() {
     var radius = document.getElementById('radius').value;
     var address = document.getElementById("coverageaddress").value;
	 if(address){
		 var geocoder = new google.maps.Geocoder();
		 geocoder.geocode({address: address}, function(results, status) {
		   if (status == google.maps.GeocoderStatus.OK) {
			searchLocationsNear(results[0].geometry.location);
		   } else {
			 //alert(address + ' not found');
		   }
		 });
	 }
   }

  function codeAddress() {
    var radius = document.getElementById("radius").value;
    var address = document.getElementById("coverageaddress").value;
	searchLocations();
	if(address){
		if (geocoder) {
		  geocoder.geocode( { 'address': address}, function(results, status) {
			if (status == google.maps.GeocoderStatus.OK) {
			  map.setCenter(results[0].geometry.location);
			  latlng = results[0].geometry.location;
			  //alert(center);
			  var marker = new google.maps.Marker({
				  map: map, 
				  icon: homeImage,
				  position: results[0].geometry.location
			  });
			 drawCircle(mapElem, map, latlng, radius);
			} else {
			  //alert("Geocode was not successful for the following reason: " + status);
			}
		  });
		}
	}
  }
 

   function clearLocations() {
     infoWindow.close();
     for (var i = 0; i < markers.length; i++) {
       markers[i].setMap(null);
     }
     markers.length = 0;

     locationSelect.innerHTML = "";
     var option = document.createElement("option");
     option.value = "none";
     option.innerHTML = "See all arestee's:";
     locationSelect.appendChild(option);
   }

   function searchLocationsNear(center) {
     clearLocations(); 
     var radius = document.getElementById('radius').value;
     var searchUrl = 'googlev3_map/phpsqlsearch_genxml.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
     downloadUrl(searchUrl, function(data) {
       var xml = parseXml(data);
       var markerNodes = xml.documentElement.getElementsByTagName("marker");
	   var markerNodesTotal = xml.documentElement.getElementsByTagName("total");
       var bounds = new google.maps.LatLngBounds();
	   document.getElementById('nodeCount').innerHTML = markerNodes.length;
	   document.getElementById('nodeCountTotal').innerHTML = markerNodes.length;	   
       for (var i = 0; i < markerNodes.length; i++) {
		 var crime = markerNodes[i].getAttribute("CrimeType");
         var name = markerNodes[i].getAttribute("Gender")+" "+markerNodes[i].getAttribute("First")+" "+markerNodes[i].getAttribute("Last");
         var address = markerNodes[i].getAttribute("address")+", "+markerNodes[i].getAttribute("City")+"<br>Arrested for: "+markerNodes[i].getAttribute("Code01")/*+"<br>"+markerNodes[i].getAttribute("Race")+" "+" "+markerNodes[i].getAttribute("DOB")+"<br><a href='buy.php'>Subscribe for more details!</a>"*/;
         var distance = parseFloat(markerNodes[i].getAttribute("distance"));
         var latlng = new google.maps.LatLng(
              parseFloat(markerNodes[i].getAttribute("lat")),
              parseFloat(markerNodes[i].getAttribute("lng")));
         createOption(name, distance, i);
         createMarker(latlng, name, address, crime);
         bounds.extend(latlng);
       }
       map.fitBounds(bounds);
       locationSelect.style.visibility = "visible";
       locationSelect.onchange = function() {
         var markerNum = locationSelect.options[locationSelect.selectedIndex].value;
         google.maps.event.trigger(markers[markerNum], 'click');
       };
      });
	 searchLocationsNearAgency(center);
    }

   function searchLocationsNearAgency(center) {
     var radius = document.getElementById('radius').value;
     var searchUrl = 'googlev3_map/phpsqlsearch_genxml_agency.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
     downloadUrl(searchUrl, function(data) {
       var xml = parseXml(data);
       var markerNodes = xml.documentElement.getElementsByTagName("marker");
       var bounds = new google.maps.LatLngBounds();
       for (var i = 0; i < markerNodes.length; i++) {
		 var name = markerNodes[i].getAttribute("Name");
         var crime = markerNodes[i].getAttribute("Chief");
         var address = markerNodes[i].getAttribute("City")+"<br>"+markerNodes[i].getAttribute("Phone")+"<br>Number of Officers : "+markerNodes[i].getAttribute("Officers");
         var distance = parseFloat(markerNodes[i].getAttribute("distance"));
         var latlng = new google.maps.LatLng(
              parseFloat(markerNodes[i].getAttribute("lat")),
              parseFloat(markerNodes[i].getAttribute("lng")));
         createOption(name, distance, i);
         createMarker(latlng, name, address, '999');
         bounds.extend(latlng);
       }
      });
	 searchLocationsNearAll(center);
    }
   function searchLocationsNearAll(center) {
     var radius = document.getElementById('radius').value;
     var searchUrl = 'googlev3_map/phpsqlsearch_genxml_all.php?lat=' + center.lat() + '&lng=' + center.lng() + '&radius=' + radius;
     downloadUrl(searchUrl, function(data) {
       var xml = parseXml(data);
       var markerNodes = xml.documentElement.getElementsByTagName("marker");
       var bounds = new google.maps.LatLngBounds();
	   if(markerNodes.length!=0){
	   document.getElementById('nodeCountTotal').innerHTML = markerNodes.length;
	   }
       for (var i = 0; i < markerNodes.length; i++) {
		 var name = "Upgrade to see this record!";
         //var address = "<br><a href='buy.php'>Subscribe for more details!</a>";
         var distance = parseFloat(markerNodes[i].getAttribute("distance"));
         var latlng = new google.maps.LatLng(
              parseFloat(markerNodes[i].getAttribute("lat")),
              parseFloat(markerNodes[i].getAttribute("lng")));
         createOption(name, distance, i);
         createMarker(latlng, name, address, '123456');
         bounds.extend(latlng);
       }

      });
    }
	

	function resolveCrime(crime){
		switch(crime){
			case "2":
			case "3":
			case "29":
			return 'http://thecrimetracker.com/images/icons/homicide.png';
			break;
			
			case "4":
			return 'http://thecrimetracker.com/images/icons/rape.png';
			break;

			case "5":
			return 'http://thecrimetracker.com/images/icons/robbery.png';
			break;

			case "6":
			case "30":
			return 'http://thecrimetracker.com/images/icons/assult.png';
			break;
			
			case "7":
			case "11":
			case "12":
			case "13":
			case "14":
			case "15":
			case "19":
			case "22":
			case "23":
			case "24":
			case "25":
			case "33":
			case "34":
			case "36":
			case "38":
			case "42":
			case "43":
			case "44":
			case "45":
			case "46":
			case "47":
			case "48":
			case "49":
			case "50":
			case "51":
			case "55":
			case "56":
			case "57":
			case "59":
			case "60":
			case "63":
			case "64":
			return 'http://thecrimetracker.com/images/icons/other.png';
			break;

			case "8":
			case "9":
			return 'http://thecrimetracker.com/images/icons/breakingentering.png';
			break;

			case "10":
			return 'http://thecrimetracker.com/images/icons/vehicletheft.png';
			break;

			case "31":
			case "32":
			case "61":
			return 'http://thecrimetracker.com/images/icons/theft.png';
			break;

			case "16":
			case "18":
			case "37":
			case "39":
			case "40":
			case "41":
			case "62":
			return 'http://thecrimetracker.com/images/icons/sexoffense.png';
			break;
			
			case "20":
			case "21":
			case "52":
			case "53":
			case "54":
			case "74":
			case "99":
			return 'http://thecrimetracker.com/images/icons/traffic.png';
			break;

			case "999":
			return 'http://thecrimetracker.com/images/icons/badge.png';
			break;

			case "123456":
			return 'http://thecrimetracker.com/images/icons/disabled.png';
			break;

			default:
			return 'http://thecrimetracker.com/images/icons/other.png';
			//return 'http://thecrimetracker.com/images/badge.png';
		}
	}
  
    function createMarker(latlng, name, address, crime) {
	  var image = resolveCrime(crime);
      var html = "<b>" + name + "</b> <br/>" + address;
      var marker = new google.maps.Marker({
        map: map,
        position: latlng,
		icon: image
      });
      google.maps.event.addListener(marker, 'click', function() {
        infoWindow.setContent(html);
        infoWindow.open(map, marker);
      });
      markers.push(marker);
    }

    function createOption(name, distance, num) {
      var option = document.createElement("option");
      option.value = num;
      option.innerHTML = name + " (" + distance.toFixed(1) + ") Miles";
      locationSelect.appendChild(option);
    }

    function downloadUrl(url, callback) {
      var request = window.ActiveXObject ?
          new ActiveXObject('Microsoft.XMLHTTP') :
          new XMLHttpRequest;

      request.onreadystatechange = function() {
        if (request.readyState == 4) {
          request.onreadystatechange = doNothing;
          callback(request.responseText, request.status);
        }
      };

      request.open('GET', url, true);
      request.send(null);
    }

    function parseXml(str) {
      if (window.ActiveXObject) {
        var doc = new ActiveXObject('Microsoft.XMLDOM');
        doc.loadXML(str);
        return doc;
      } else if (window.DOMParser) {
        return (new DOMParser).parseFromString(str, 'text/xml');
      }
    }
 
			function drawCircle(canvas, map, point, radius) {
				var d2r = Math.PI / 180;
				var circleLatLngs = new Array();
				var circleLat = radius * 0.014483;  // Convert statute miles into degrees latitude
				var circleLng = circleLat / Math.cos(point.lat() * d2r);
				var numPoints = 100;

				var latlngbounds = new google.maps.LatLngBounds( );

				// 2PI = 360 degrees, +1 so that the end points meet
				for (var i = 0; i < numPoints + 1; i++) { 
					var theta = Math.PI * (i / (numPoints / 2)); 
					var vertexLat = point.lat() + (circleLat * Math.sin(theta)); 
					var vertexLng = parseFloat(point.lng()) + parseFloat((circleLng * Math.cos(theta)));
					var vertextLatLng = new google.maps.LatLng(vertexLat, vertexLng);
					circleLatLngs.push(vertextLatLng);
					latlngbounds.extend(vertextLatLng);
				}

				var polygon = new google.maps.Polygon({
					paths: circleLatLngs
				});

				polygon.setMap(map);
				map.fitBounds(latlngbounds);
			} function doNothing() {}

	

	function setAddressValue(){
		document.getElementById('coverageaddress').innerHTML =  google.loader.ClientLocation.address.city.toString();
	}
	
setAddressValue();
