var mapTileLayerOverlay;
var mapTileLayer;

var map;
var mymarker;
var overlayOpac =1.0;
var gmarkers = [];
var hotel_gicon;

var labelbounds;
var udlabelmap;

var toText = "na";
var infoWindowText = "na";

var hotel_markers = [];
var hotel_htmls = [];
var hotel_labels = [];

var i = 0;

	
	
function TileToQuadKey ( x, y, zoom){
    var quad = "";
    for (var i = zoom; i > 0; i--){
        var mask = 1 << (i - 1);
        var cell = 0;
        if ((x & mask) != 0)
            cell++;
        if ((y & mask) != 0)
            cell += 2;
        quad += cell;
    }
    return quad;
}


function mapoverlay(mapoverlayForm,mapoverlayType,opac) {

//alert(opac);

overlayOpac = opac;

if (mapoverlayType == 'walkabout') {
   mapoverlayForm.parking.checked = false;
   mapoverlayForm.udcampus.checked = false;
   mapoverlayForm.basemap.checked = false;
} else if (mapoverlayType == 'parking') {
   mapoverlayForm.walkabout.checked = false;
   mapoverlayForm.udcampus.checked = false;
   mapoverlayForm.basemap.checked = false;
} else if (mapoverlayType == 'udcampus') {
   mapoverlayForm.walkabout.checked = false;
   mapoverlayForm.parking.checked = false;
   mapoverlayForm.basemap.checked = false;
} else if (mapoverlayType == 'basemap') {
   mapoverlayForm.walkabout.checked = false;
   mapoverlayForm.parking.checked = false;
   mapoverlayForm.udcampus.checked = false;
}

if (mapoverlayForm.parking.checked) {
	//alert("Parking checked");
	createTileLayer('parking',opac);
	
} else if (mapoverlayForm.walkabout.checked) {
	//alert("Walkabout checked");
	createTileLayer('walkabout',opac);
	
} else if (mapoverlayForm.udcampus.checked) {
	//alert("UDCampus checked");
	createTileLayer('udcampus',opac);
	
} else {
	//alert("Nothing checked");
	createTileLayer('buildings',opac);
}
}
	
	
function createTileLayer(mapoverlayType,opac) {
  map.removeOverlay(mapTileLayerOverlay);
  //alert(val);
	
  if (mapoverlayType == 'walkabout') {
    var msrTiles = function (a,b) { 
      return  "walkaboutmap_pdf/" + TileToQuadKey(a.x,a.y,b) + ".png";
     };
    mapTileLayer = new GTileLayer(new GCopyrightCollection('') , 12, 17);
    mapTileLayer.getTileUrl = msrTiles;
    mapTileLayer.getCopyright = function(a,b) {return "University of Delaware";};
    mapTileLayer.getOpacity = function () {return overlayOpac;};//of the non transparent part cave
    mapTileLayer.isPng = function() {return true;};
	   
	   
  } else if (mapoverlayType == 'parking') {
    var msrTiles = function (a,b) { 
      return  "parkingmap_pdf/" + TileToQuadKey(a.x,a.y,b) + ".png"; 
     };
    mapTileLayer = new GTileLayer(new GCopyrightCollection('') , 12, 17);
    mapTileLayer.getTileUrl = msrTiles;
    mapTileLayer.getCopyright = function(a,b) {return "University of Delaware";};
    mapTileLayer.getOpacity = function () {return overlayOpac;};//of the non transparent part cave
    mapTileLayer.isPng = function() {return true;};
	   
	   
  } else if (mapoverlayType == 'udcampus') {
    var msrTiles = function (a,b) { 
      return  "udcampusmap_pdf/" + TileToQuadKey(a.x,a.y,b) + ".png"; 
     };
    mapTileLayer = new GTileLayer(new GCopyrightCollection('') , 12, 17);
    mapTileLayer.getTileUrl = msrTiles;
    mapTileLayer.getCopyright = function(a,b) {return "University of Delaware";};
    mapTileLayer.getOpacity = function () {return overlayOpac;};//of the non transparent part cave
    mapTileLayer.isPng = function() {return true;};
 
 
  } else if (mapoverlayType == 'buildings') {
  
	
    var msrTiles = function (a,b) { 
      return  "newmap_pdf/" + TileToQuadKey(a.x,a.y,b) + ".png"; 
     };
    mapTileLayer = new GTileLayer(new GCopyrightCollection('') , 12, 17);
    mapTileLayer.getTileUrl = msrTiles;
    mapTileLayer.getCopyright = function(a,b) {return "University of Delaware";};
    mapTileLayer.getOpacity = function () {return overlayOpac;};//of the non transparent part cave
    mapTileLayer.isPng = function() {return true;};	
	
  }
	  
	  
	mapTileLayerOverlay = new GTileLayerOverlay(mapTileLayer);  
	map.addOverlay(mapTileLayerOverlay);


    //set appropriate map opacity 	image
	
	//rset all map opacity images
	document.getElementById("mapopac0").src="images/0.gif";
	document.getElementById("mapopac25").src="images/25.gif";
	document.getElementById("mapopac50").src="images/50.gif";
	document.getElementById("mapopac75").src="images/75.gif";
	document.getElementById("mapopac100").src="images/100.gif";
	
	if (overlayOpac < 0.01) {
		document.getElementById("mapopac100").src="images/100on.gif";
	} else if (overlayOpac > 0.01 && overlayOpac < 0.375) {
		document.getElementById("mapopac75").src="images/75on.gif";
	} else if (overlayOpac > 0.375 && overlayOpac < 0.625) {
		document.getElementById("mapopac50").src="images/50on.gif";
	} else if (overlayOpac > 0.625 && overlayOpac < 0.95) {
		document.getElementById("mapopac25").src="images/25on.gif";
	} else if (overlayOpac > 0.95) {
		document.getElementById("mapopac0").src="images/0on.gif";
	} 
	
}

function loadmap() {

  //initially set text box  values	
  document.getElementById("saddr").value = "Enter starting address here";
  document.getElementById("todaddr").value = "click destination on map";

  //document.getElementById("saddr").value = "e.g., 2 S Redspire Ct, Newark, DE 19702";
  document.getElementById("daddr").value = "39.6781268,-75.7517463";
	
  if (GBrowserIsCompatible()) {
    map = new GMap2(document.getElementById("map"));
    map.setCenter(new GLatLng(39.680, -75.750), 15);
	
		var mmpoint = new GLatLng(35.0,-75.0);
		mymarker = new GMarker(mmpoint,{draggable: true});
		mymarker.hide();
		map.addOverlay(mymarker); 
		
	map.addControl(new GOverviewMapControl());
    map.addControl(new GLargeMapControl());
    map.addControl(new GMapTypeControl());
	
    map.enableContinuousZoom();
    map.enableDoubleClickZoom();
	map.enableScrollWheelZoom();
 
	var msrTiles = function (a,b) { 
      return  "newmap_pdf/" + TileToQuadKey(a.x,a.y,b) + ".png"; 
     };
    mapTileLayer = new GTileLayer(new GCopyrightCollection('') , 12, 18);
    mapTileLayer.getTileUrl = msrTiles;
    mapTileLayer.getCopyright = function(a,b) {return "University of Delaware";};
    mapTileLayer.getOpacity = function () {return overlayOpac;};//of the non transparent part cave
    mapTileLayer.isPng = function() {return true;};	
	
	
	mapTileLayerOverlay = new GTileLayerOverlay(mapTileLayer);  
    map.addOverlay(mapTileLayerOverlay);
	

	var labelbounds = new GLatLngBounds(new GLatLng(39.6847,-75.754), new GLatLng(39.6870,-75.748));
	var udlabelmap = new GGroundOverlay("images/maplabel2.png", labelbounds);
	map.addOverlay(udlabelmap);	   
	
	
    GEvent.addListener(map,"zoomend", function() {
	
	//add UD label overlay
	//alert(map.getZoom());
	
	if (map.getZoom() == 16) {
	    map.removeOverlay(udlabelmap);
	   	labelbounds = new GLatLngBounds(new GLatLng(39.6847,-75.753), new GLatLng(39.6862,-75.749));
	    udlabelmap = new GGroundOverlay("images/maplabel2.png", labelbounds);
	    map.addOverlay(udlabelmap);	   
	} else if (map.getZoom() == 15) {
	    map.removeOverlay(udlabelmap);
		var labelbounds = new GLatLngBounds(new GLatLng(39.6847,-75.754), new GLatLng(39.6870,-75.748));
	    udlabelmap = new GGroundOverlay("images/maplabel2.png", labelbounds);
	    map.addOverlay(udlabelmap);   
    } else if (map.getZoom() == 14) {
	    map.removeOverlay(udlabelmap);
	   	labelbounds = new GLatLngBounds(new GLatLng(39.685,-75.755), new GLatLng(39.6895,-75.743));
	    udlabelmap = new GGroundOverlay("images/maplabel2.png", labelbounds);
	    map.addOverlay(udlabelmap);	   
    } else if (map.getZoom() == 13) {
	    map.removeOverlay(udlabelmap);
	   	labelbounds = new GLatLngBounds(new GLatLng(39.682,-75.76), new GLatLng(39.69,-75.74));
	    udlabelmap = new GGroundOverlay("images/maplabel2.png", labelbounds);
	    map.addOverlay(udlabelmap);	
    } else if (map.getZoom() == 12) {
	    map.removeOverlay(udlabelmap);
	   	labelbounds = new GLatLngBounds(new GLatLng(39.685,-75.77), new GLatLng(39.70,-75.73));
	    udlabelmap = new GGroundOverlay("images/maplabel2.png", labelbounds);
	    map.addOverlay(udlabelmap);	
	} else {
	  map.removeOverlay(udlabelmap);
	  }

	});
	
	
	
	//ad map click listener
    GEvent.addListener(map,"click", function(overlay,latlng) {
          if (overlay) {
            // ignore if we click on the info window
            return;
          }
		  
		  map.closeInfoWindow(); 
		  map.removeOverlay(mymarker);
		  
		  findPlace(latlng.lat().toFixed(6), latlng.lng().toFixed(6));
		  
		document.getElementById("daddr").value = latlng.lat().toFixed(6) + "," + latlng.lng().toFixed(6);
		document.getElementById("todaddr").value = toText;
	
	
		mymarker = new GMarker(latlng, {draggable: true});
		  
		GEvent.addListener(mymarker, "click", function() {
			mymarker.openInfoWindowHtml(infoWindowText);
			//setTimeout("map.closeInfoWindow();",5000);
		});
		
		GEvent.addListener(mymarker, "dragstart", function() {
			findPlace(mymarker.getPoint().y.toFixed(6), mymarker.getPoint().x.toFixed(6));
			document.getElementById("daddr").value = mymarker.getPoint().y.toFixed(6) + "," + mymarker.getPoint().x.toFixed(6);
			document.getElementById("todaddr").value = toText;
			mymarker.openInfoWindowHtml(infoWindowText);
			//setTimeout("map.closeInfoWindow();",5000);
		});
		  
		GEvent.addListener(mymarker, "dragend", function() {
			findPlace(mymarker.getPoint().y.toFixed(6), mymarker.getPoint().x.toFixed(6));
			document.getElementById("daddr").value = mymarker.getPoint().y.toFixed(6) + "," + mymarker.getPoint().x.toFixed(6);
			document.getElementById("todaddr").value = toText;
			mymarker.openInfoWindowHtml(infoWindowText);
			//setTimeout("map.closeInfoWindow();",5000);
		});
		  
		map.addOverlay(mymarker); 
		mymarker.openInfoWindowHtml(infoWindowText);
		//setTimeout("map.closeInfoWindow();",5000);	  
 
	});
		

	var hotel_gicon = new GIcon(); 
    hotel_gicon.image = 'images/blue-dot.png';
    hotel_gicon.shadow = 'images/shadow50.png';
    hotel_gicon.iconSize = new GSize(32, 32);
    hotel_gicon.shadowSize = new GSize(37, 34);
    hotel_gicon.iconAnchor = new GPoint(6, 20);
    hotel_gicon.infoWindowAnchor = new GPoint(5, 1);

	  
      // A function to create the marker and set up the event window
      function createMarker(point,name,html,url) {
        var marker = new GMarker(point,hotel_gicon);

        GEvent.addListener(marker, "click", function() {
          marker.openInfoWindowHtml("<a href='"+url+"' target='new'>"+name+"</a><br><br>" + html + "<br><br><span id='showgps'><a href='javascript:showgps("+marker.getPoint().y.toFixed(6)+","+marker.getPoint().x.toFixed(6)+");'>GPS Coordinates</a></span>");
		  
		  	document.getElementById("daddr").value = marker.getPoint().y.toFixed(6) + "," + marker.getPoint().x.toFixed(6);
	        document.getElementById("todaddr").value = name;
		  
        });
		 gmarkers.push(marker);
        return marker;
      }

	  
      process_it = function(doc) {
        var jsonData = eval('(' + doc + ')');

        for (var i=0; i<jsonData.markers.length; i++) {
          var marker = createMarker(jsonData.markers[i].point, jsonData.markers[i].label, jsonData.markers[i].html,jsonData.markers[i].url);
          map.addOverlay(marker);
		  
		hotel_labels[i] = jsonData.markers[i].label;
		hotel_markers[i] = marker;
        hotel_htmls[i] = "<a href='"+jsonData.markers[i].url+"' target='new'>"+jsonData.markers[i].label+"</a><br><br>" + jsonData.markers[i].html;
		
		document.forms['mapoverlayform'].hotels.options[i+2] = new Option(jsonData.markers[i].label,i);
		
        }	
		hotelToggle();
      }  
      GDownloadUrl("hotels.json", process_it);
  }
}


function findPlace(ptLat, ptLng) {

	var j=0;
	var vertexCount = 4;   /*rectangle bbox, do not need ending repeated coorindate */
    var oddNodes = false; 
    var x = ptLng;
    var y = ptLat;
	var inout = "";
	
	for (placeCode in placeCoords) { 
	
	j=0;
	polyYi = 0;
	polyXi = 0;
	polyYj = 0;
	polyXj = 0;
	oddNodes = false;
	
    for (var i=0; i < vertexCount; i++) {   /*for more complex polys, dynamically compute coords array length*/ 
      j++;
	  if (j == vertexCount) {j = 0;}

	  polyYi = placeCoords[placeCode][2*i];
	  polyXi = placeCoords[placeCode][2*i+1];
	  polyYj = placeCoords[placeCode][2*j];
	  polyXj = placeCoords[placeCode][2*j+1];
      
      if (((polyYi < y) && (polyYj >= y)) || ((polyYj < y) && (polyYi >= y))) {
        if ( polyXi + (y - polyYi) /  (polyYj-polyYi) *  (polyXj - polyXi)<x ) {
          oddNodes = !oddNodes;
        }
      }
    }
	
	toText = "Location marked on map";
	infoWindowText = "This will be your destination point when using the <br><img src='images/directions_info.gif'> button above.<br><br><span id='showgps'><a href='javascript:showgps("+y
	+","+x+");'>GPS Coordinates</a></span>";
	
	
	 if (oddNodes) { 
		inout = "INSIDE"; 
		
		toText = placeNames[placeCode];
		
		code2 = placeCode.substr(0,2);
        if (code2=='NC' || code2=='NE' || code2=='NN' || code2=='NS' || code2=='NW' || code2=='CA') {
     	 infoWindowText = "<b>" + placeNames[placeCode] + "</b><br><br><span id='showgps'><a href='javascript:showgps("+y+","+x+");'>GPS Coordinates</a></span><br><a target='new' href='http://primus.nss.udel.edu/buildings/displayBuilding.action?building.code=" + placeCode + "'>More info from UD Buldings & Maps</a>";
		 } else {
     	 infoWindowText = "<b>" + placeNames[placeCode] + "</b><br><br><span id='showgps'><a href='javascript:showgps("+y+","+x+");'>GPS Coordinates</a></span>";		 
		 }

		break;
	} else {
		inout = "OUTSIDE"; 
	}
    //alert(placeCode + ", " + placeNames[placeCode] + ", " + inout);
	 
    }  /* end polygons for loop */
		  
}




// This function picks up the click and opens the corresponding info window
function findhotel(i) {
  if (i=='9999') {
	map.closeInfoWindow();
  } else if (i == 'showall') {
    map.setCenter(new GLatLng(39.680, -75.70), 12);
	showHotelMarkers(i);
  } else {
    showHotelMarkers(i);
			}
}


function hotelToggle() {
  if (document.getElementById("hotelcheckbox").checked) {
    showHotelMarkers();
  } else {
    hideHotelMarkers();
  }
}

function showHotelMarkers(hotelid) {
  for (var i=0; i<gmarkers.length; i++) {
    gmarkers[i].show();			  
  }
  document.getElementById("hotelcheckbox").checked = true;
		
  if (hotelid < 100) {
	  var ii = document.forms['mapoverlayform'].hotels.selectedIndex - 2;
			
	  //hotel_markers[i].openInfoWindowHtml(hotel_htmls[i]);
	  gmarkers[ii].openInfoWindowHtml(hotel_htmls[ii] + "<br><br><span id='showgps'><a href='javascript:showgps("+hotel_markers[ii].getPoint().y.toFixed(6)+","+hotel_markers[ii].getPoint().x.toFixed(6)+");'>GPS Coordinates</a></span>");
	  document.getElementById("daddr").value = hotel_markers[ii].getPoint().y.toFixed(6) + "," + hotel_markers[ii].getPoint().x.toFixed(6);
	  document.getElementById("todaddr").value = hotel_labels[ii];
  }		
}


function hideHotelMarkers() {
  for (var i=0; i<gmarkers.length; i++) {
    gmarkers[i].hide();
  }
  document.getElementById("hotelcheckbox").checked = false;
  map.closeInfoWindow();
}

	
/* This script and many more are available free online at
The JavaScript Source!! http://javascript.internet.com
Created by: wsabstract.com | http://www.wsabstract.com */
function checkrequired(whichform) {
  var pass=true;
  var msg = "";

  if (document.getElementById("saddr").value == "" || document.getElementById("saddr").value == "Enter starting address here") {
     msg = "Please enter a starting address.";
     pass=false;
  }
  
  if (!pass) {
    //shortFieldName=tempobj.name.substring(8,30).toUpperCase();
    alert(msg);
    return false;
  } else {
     return true;
  }
}
	
function showgps(y,x) {
	document.getElementById("showgps").innerHTML = "Lat: "+y+", Lng: "+x;
}	
