﻿
    //<![CDATA[
    
    var searchTimerId = 0;    
	var map;
	var custommap;
	var gdir;
	var parkingOverlay;
	var bikeParkingOverlay;
	var markers;
	var markers2;
	var vtmarkers = [];
	var wifimarkers = [];	
    var gmarkers = [];
    var parkingmarkers = [];

    function load() {
      if (GBrowserIsCompatible()) {
        resizeMap();
    map = new GMap2(document.getElementById("map"));  
    
    gdir = new GDirections(map, document.getElementById("leftcontent"));
        //GEvent.addListener(gdir, "load", onGDirectionsLoad);
        GEvent.addListener(gdir, "error", handleErrors);

        GEvent.addListener(map, "movestart", function() {
            if (parkingOverlay != null)
                map.removeOverlay(parkingOverlay);
            if (bikeParkingOverlay != null)
                map.removeOverlay(bikeParkingOverlay);
        });
        
        GEvent.addListener(map, "moveend", function() {
            if(parkingOverlay!=null)
                map.addOverlay(parkingOverlay);
            if (bikeParkingOverlay != null)
                map.addOverlay(bikeParkingOverlay);
        });
    
    /*GEvent.addListener(map, "click", function(hi,point) {
            alert(point);
         });*/
      map.addControl(new GScaleControl());
	//map.enableScrollWheelZoom();
	//map.enableContinuousZoom();
      
      
      // ============================================================
      // ====== Create a copyright entry =====
      var copyright = new GCopyright(1,
          new GLatLngBounds(new GLatLng(40.23401632784149,-111.44791584014893),new GLatLng(40.28401632784149,-111.84791584014893) ),
          16, "Ordnance Survey");


      // ============================================================
      // ====== Create a copyright collection =====
      // ====== and add the copyright to it   =====
      var copyrightCollection = new GCopyrightCollection('Map Data:');
      copyrightCollection.addCopyright(copyright);
      

      // ============================================================
      // == Write our own getTileUrl function ========
      // In this case the tiles are names like  8053_5274_3.jpg      
      CustomGetTileUrl=function(a,b){
          //alert(a.y);
          if(a.x>12444 || a.x<12440 || a.y>24752 || a.y<24747)
            return "byu/blank.jpg";
          else
            return "byu/Tile_" + a.x +"_" + a.y +"_16.jpg";
      }


      // ============================================================
      // ===== Create the GTileLayer =====
      // ===== adn apply the CustomGetTileUrl to it
      var tilelayers = [new GTileLayer(copyrightCollection,5,6)];
      tilelayers[0].getTileUrl = CustomGetTileUrl;
      
      
      // ============================================================
      // ===== Create the GMapType =====
      // ===== and add it to the map =====
      custommap = new GMapType(tilelayers, new GMercatorProjection(17), "Campus");
    
    
    GDownloadUrl("buildings.xml", function(data, responseCode) {
      var xml = GXml.parse(data);  
      markers = xml.documentElement.getElementsByTagName("BUILDING");  
      
      for (var i = 0; i < markers.length; i++) {    
          map.addOverlay(createMarker(markers[i]));      
      }
      
      CheckLoadBuilding();
      CheckLoadDirections();
      
      markers2 = xml.documentElement.getElementsByTagName("LOCATION");  
      
      for (var i = 0; i < markers2.length; i++) {    
      
          map.addOverlay(createMarker(markers2[i]));
      
      }})  

      }
      
      
      map.addMapType(custommap);
      
      
      var stuff = new GLargeMapControl();
      //var prevZoom = 16;

      GEvent.addListener(map, "maptypechanged", function() {
          if (map.getCurrentMapType() == custommap) {
              map.disableScrollWheelZoom();
              map.removeControl(stuff);
              prevZoom = map.getZoom();
              map.setZoom(16);
          }
          else {
              //map.setZoom(prevZoom);
              //map.addOverlay(new GStreetviewOverlay());
              map.enableScrollWheelZoom();
              map.enableContinuousZoom();
              map.addControl(stuff);
          }

          if (parkingOverlay != null) {
              showHideParking();
              showHideParking();
          }
          if (bikeParkingOverlay != null) {
              showHideBikeParking();
              showHideBikeParking();
          }
      }); 
      
        
	    map.addControl(new GMapTypeControl());
        map.setCenter(new GLatLng(40.249251,-111.64791584014893), 16, custommap);

      var tooltip = document.createElement("div");
      map.getPane(G_MAP_FLOAT_PANE).appendChild(tooltip);
      tooltip.style.visibility="hidden";   
    
    function showTooltip(marker) {
      	tooltip.innerHTML = marker.tooltip;
	    var point=map.getCurrentMapType().getProjection().fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom());
	    var offset=map.getCurrentMapType().getProjection().fromLatLngToPixel(marker.getPoint(),map.getZoom());
	    var anchor=marker.getIcon().iconAnchor;
	    var width=marker.getIcon().iconSize.width;
	    var height=tooltip.clientHeight;
	    var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y -height)); 
	    pos.apply(tooltip);
	    tooltip.style.visibility="visible";
    }
    
    function createMarker(markerXml)
    {
        // Create our "tiny" marker icon
    var icon = new GIcon();
    icon.image = markerXml.getAttribute("key") + ".gif";
    icon.iconSize = new GSize(18, 12);
    icon.iconAnchor = new GPoint(9, 6);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var text = "";
    
    for(var a = 0; a < markerXml.childNodes.length; a++)
    {
        if(markerXml.childNodes[a].tagName=="HEADER")
        {
            text += "<p style='font-weight:bold;font-family:Verdana;font-size:1.1em;'>" + markerXml.childNodes[a].firstChild.nodeValue + "</p>";    
        }
        else if(markerXml.childNodes[a].tagName=="TEXT")
        {
            text += "<p style='font-family:Verdana;font-size:1.1em;'>" + markerXml.childNodes[a].firstChild.nodeValue + "</p>";
        }
    }

    var point = new GLatLng(parseFloat(markerXml.getAttribute("lat")),parseFloat(markerXml.getAttribute("long")));
    var myMarker = new GMarker(point, icon);  
    
    var picture = "";
    
    if(markerXml.getAttribute("picture")!=null)
    {
        picture = "<img src='images/" + markerXml.getAttribute("picture") + "' style='float:left;width:" + markerXml.getAttribute('width') + "px;height:" + markerXml.getAttribute('height') + "px;margin-top:1.1em;padding:3px;border:solid 1px #777;' />";
    }
        
    GEvent.addListener(myMarker, "click", function() {
        if(map.getZoom()<16)
        {
            map.setZoom(16);
        }
        myMarker.openInfoWindowHtml("<div style='float:left;width:300px;padding-right:1em;'><p style='font-family:Verdana;font-weight:bold;text-decoration:underline;font-size:1.2em;'>" + markerXml.getAttribute("name") + "</p>" + text + "<p style='font-family:Verdana;'><a href='javascript:map.closeInfoWindow();'>Close</a></p></div>" + picture);
      });
      
            var acro = "";
      
            if(markerXml.getAttribute("acronym")!="")
                acro = '<br />(' + markerXml.getAttribute("acronym") + ')';
            myMarker.tooltip = '<div class="tooltip"><nobr>' + markerXml.getAttribute("name") + '</nobr>' + acro + '</div>';
            
            
                  GEvent.addListener(myMarker,"mouseover", function() {
                  showTooltip(this);
        });        
        GEvent.addListener(myMarker,"mouseout", function() {
		tooltip.style.visibility="hidden"
        });    
      
        gmarkers[markerXml.getAttribute("key")] = myMarker;
        
        return myMarker; 
    }
    
        if(getQueryVariable("parking")=="true")
        {
            document.getElementById("Checkbox1").checked = true;
            showHideParking();
        }
        if (getQueryVariable("tours") == "true") {
            document.getElementById("Checkbox2").checked = true;
            showHideVT();
        }
        if (getQueryVariable("wifi") == "true") {
            document.getElementById("Checkbox3").checked = true;
            loadWiFi();
        }
        
        if(getQueryVariable("debug")=="true")
        {
            GEvent.addListener(map, "click", function(overlay, latlng) {                
                window.clipboardData.setData('Text',latlng.toString());
            });
        }

    } //end of load()

    function showHideBikeParking() {
        if (bikeParkingOverlay == null) {
            var pointSW;
            var pointNE;

            if (map.getCurrentMapType() == G_DEFAULT_MAP_TYPES[0] || map.getCurrentMapType() == G_DEFAULT_MAP_TYPES[1] || map.getCurrentMapType() == G_DEFAULT_MAP_TYPES[2]) {
                pointSW = new GLatLng(40.24306, -111.66152);
                pointNE = new GLatLng(40.265544, -111.637938);
            }
            else {
                pointSW = new GLatLng(40.24293, -111.66142);
                pointNE = new GLatLng(40.265769, -111.638025)
            }
            bikeParkingOverlay = new GGroundOverlay("bikeparking.png", new GLatLngBounds(pointSW, pointNE)); map.addOverlay(bikeParkingOverlay);           
        }
        else {
            map.removeOverlay(bikeParkingOverlay);
            bikeParkingOverlay = null;
        }
    }
    
    function showHideParking()
    {
        if(parkingOverlay==null)
        {
            var pointSW;
            var pointNE;
            
            if(map.getCurrentMapType()==G_DEFAULT_MAP_TYPES[0] || map.getCurrentMapType()==G_DEFAULT_MAP_TYPES[1] || map.getCurrentMapType()==G_DEFAULT_MAP_TYPES[2])
            {
                pointSW = new GLatLng(40.24306,-111.66152);
                pointNE = new GLatLng(40.265544,-111.637938);
            }
            else
            {
                pointSW = new GLatLng(40.24293,-111.66142);
                pointNE = new GLatLng(40.265769,-111.638025)
            }
            document.getElementById("parkingzones").style.visibility = "visible";
            parkingOverlay = new GGroundOverlay("parkingfast.png", new GLatLngBounds(pointSW, pointNE));map.addOverlay(parkingOverlay);
            
            GDownloadUrl("http://map.byu.edu/lots.xml", function(data, responseCode) {
                xml = GXml.parse(data);
                
                var zones = xml.documentElement.getElementsByTagName("Zone");
                var num = 0;
                
                for(var i = 0; i < zones.length; i++)
                {
                    var lots = zones[i].getElementsByTagName("Lot");
                    
                    for(var a = 0; a < lots.length; a++)
                    {
                        parkingmarkers[num] = createParkingMarker(lots[a]);
                        map.addOverlay(parkingmarkers[num]);
                        num++;
                    }
                }
            });
        }
        else
        {
            document.getElementById("parkingzones").style.visibility = "hidden";
            map.removeOverlay(parkingOverlay);
            parkingOverlay = null;
            for(var i = 0; i < parkingmarkers.length; i++)
                map.removeOverlay(parkingmarkers[i]);
        }
    }
    function showHideVT() {
        if(vtmarkers[0]==null)
        {
        GDownloadUrl("virtualtours.xml", function(data, responseCode) {
        var xml = GXml.parse(data);  
        var marker = xml.documentElement.getElementsByTagName("Tour");  
      
      for (var i = 0; i < marker.length; i++) {    
          vtmarkers[i] = createVTMarker(marker[i]);
          map.addOverlay(vtmarkers[i]);      
      }
      });     
      }
      else
      {
                for (var i = 0; i < vtmarkers.length; i++) {    
                map.removeOverlay(vtmarkers[i]);   
      }
                vtmarkers[0] = null;   
      } 
    }
    function createVTMarker(markerXml)
    {
        // Create our "tiny" marker icon
    var icon = new GIcon();
    icon.image = "vt.png";
    icon.iconSize = new GSize(18, 18);
    icon.iconAnchor = new GPoint(9, 6);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var text = "";
        

    var point = new GLatLng(parseFloat(markerXml.getAttribute("lat")),parseFloat(markerXml.getAttribute("long")));
    var myMarker = new GMarker(point, icon);  
    
    var picture = "";
        
    GEvent.addListener(myMarker, "click", function() {
        var newwindow=window.open('http://map.byu.edu/VR/' + markerXml.getAttribute("src") + '.php','name','height=320,width=340');
	    if (window.focus) {newwindow.focus()}
      });    

              
        return myMarker; 
    }
    function loadWiFi()
    {
        if(wifimarkers[0]==null)
        {
        GDownloadUrl("buildings.xml", function(data, responseCode) {
        var xml = GXml.parse(data);  
        var marker = xml.documentElement.getElementsByTagName("BUILDING");  
        
        var a = 0;
      
      for (var i = 0; i < marker.length; i++) {   
          if(marker[i].getAttribute("wireless")=="true")
          { 
          wifimarkers[a] = createWiFiMarker(marker[i]);
          map.addOverlay(wifimarkers[a]); 
          a++;
          }     
      }
      });     
      }
      else
      {
                for (var i = 0; i < wifimarkers.length; i++) {    
                map.removeOverlay(wifimarkers[i]);   
                }
      
                wifimarkers[0] = null;   
      } 
    }
    function createWiFiMarker(markerXml)
    {
            // Create our "tiny" marker icon
    var icon = new GIcon();
    icon.image = "wifi.png";
    icon.iconSize = new GSize(30, 36);
    icon.iconAnchor = new GPoint(15, 42);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var text = "";
        

    var point = new GLatLng(parseFloat(markerXml.getAttribute("lat")),parseFloat(markerXml.getAttribute("long")));
    var myMarker = new GMarker(point, icon); 
    
    GEvent.addListener(myMarker, "click", function() {
        myMarker.openInfoWindowHtml("<p style='width:400px;font-size:1.2em'>For a more detailed list of wireless access locations <a href='http://it.byu.edu/index.cfm?child_id=157&a_id=848&catID=0' target='_blank' style='text-decoration:underline'>click here</a> for the <a href='http://it.byu.edu/index.cfm?child_id=157&a_id=848&catID=0' target='_blank'>Office of IT's website</a>.</p><p style='font-family:Verdana;'><a href='javascript:map.closeInfoWindow();'>Close</a></p></div>" + picture);
      }); 
    
    var picture = "";
              
        return myMarker; 
    }
    function createParkingMarker(markerXml)
    {
            // Create our "tiny" marker icon
    var icon = new GIcon();
    icon.image = "picon.gif";
    icon.iconSize = new GSize(12, 13);
    icon.iconAnchor = new GPoint(5, 1);
    icon.infoWindowAnchor = new GPoint(5, 1);
    
    var policyNode = markerXml.getElementsByTagName("Policy");
    
    if(policyNode.length == 0)
    {
        policyNode = markerXml.parentNode.getElementsByTagName("Policy");
        
        if(policyNode.length == 0 || policyNode[0].parentNode.nodeName!="Zone")
            policyNode = markerXml.parentNode.parentNode.getElementsByTagName("Policy");
    }
    
    var text = "";  
        
    var point = new GLatLng(parseFloat(markerXml.getAttribute("lat")),parseFloat(markerXml.getAttribute("long")));
    var myMarker = new GMarker(point, {icon:icon, zIndexProcess:importanceOrder});
    myMarker.importance = 1;     
    
    GEvent.addListener(myMarker, "click", function() {
        myMarker.openInfoWindowHtml("<p style='width:400px;font-size:1.2em;text-decoration:underline;'>Lot " + markerXml.getAttribute("id") + markerXml.parentNode.getAttribute("id") +  "</p><p>" + policyNode[0].childNodes[0].nodeValue + "</p><p style='font-family:Verdana;'><a href='javascript:map.closeInfoWindow();'>Close</a></p></div>" + picture);
      }); 
    
    var picture = "";
              
        return myMarker; 
    }
    
    function importanceOrder (marker,b) {
        return GOverlay.getZIndex(marker.getPoint().lat()) + marker.importance*1000000;
      }

      function setDirections(fromAddress, locale) {
      document.getElementById("buildinglist").style.display = "none";
      document.getElementById("clearDirections1").style.display = "block";
      document.getElementById('leftcontent').innerHTML = '';
      document.getElementById('leftcontent').style.display = 'block';
      if(map.getCurrentMapType()==custommap)
      {
        map.setMapType(G_HYBRID_MAP);
      }
      map.removeMapType(custommap);
      gdir.load("from: " + fromAddress + " to: E Campus Drive Provo, UT",
                { "locale": locale });
    }

    function handleErrors(){
	   if (gdir.getStatus().code == G_GEO_UNKNOWN_ADDRESS)
	     alert("Address not found. Please check spelling and enter the address in the format: Address Line, City, State Zip");
	   else if (gdir.getStatus().code == G_GEO_SERVER_ERROR)
	     alert("A geocoding or directions request could not be successfully processed, yet the exact reason for the failure is not known.\n Error code: " + gdir.getStatus().code);
	   
	   else if (gdir.getStatus().code == G_GEO_MISSING_QUERY)
	     alert("The HTTP q parameter was either missing or had no value. For geocoder requests, this means that an empty address was specified as input. For directions requests, this means that no query was specified in the input.\n Error code: " + gdir.getStatus().code);

	//   else if (gdir.getStatus().code == G_UNAVAILABLE_ADDRESS)  <--- Doc bug... this is either not defined, or Doc is wrong
	//     alert("The geocode for the given address or the route for the given directions query cannot be returned due to legal or contractual reasons.\n Error code: " + gdir.getStatus().code);
	     
	   else if (gdir.getStatus().code == G_GEO_BAD_KEY)
	     alert("The given key is either invalid or does not match the domain for which it was given. \n Error code: " + gdir.getStatus().code);

	   else if (gdir.getStatus().code == G_GEO_BAD_REQUEST)
	     alert("A directions request could not be successfully parsed.\n Error code: " + gdir.getStatus().code);
	    
	   else alert("An unknown error occurred.");
	   
	}

	function onGDirectionsLoad(){ 
      // Use this function to access information about the latest load()
      // results.

      // e.g.
      // document.getElementById("getStatus").innerHTML = gdir.getStatus().code;
	  // and yada yada yada...
	}
	
	function clearDirections() {
	    if(document.getElementById('clearDirections1').style.display=='block')
	    {
	    document.getElementById('clearDirections1').style.display='none';
	    document.getElementById('leftcontent').innerHTML = '';
	    document.getElementById('leftcontent').style.display = 'none';
	    document.getElementById('leftcontent').style.padding = '0';
	    document.getElementById('buildinglist').style.display = 'block';
	    gdir.clear();
	    map.addMapType(custommap);
	    }
	}
	
	function showDrivingDirections() {
	    document.getElementById('searchBox').style.display = "none";	    
	    document.getElementById('directionsBox').style.display = "block";
	    document.getElementById('leftcontent').style.display = "none";
	    //document.getElementById('leftcontent').innerHTML = '';
	}
	
	function showSearch() {	 
	    clearDirections();   
	    document.getElementById('searchBox').style.display = "block";	    
	    document.getElementById('directionsBox').style.display = "none";
	}
	
	function search(searchString) {	
	        clearTimeout(searchTimerId);
	        searchTimerId = setTimeout("search2('" + searchString + "')", 400);
	}
	
	function search2(searchString) {
	    var leftContent = document.getElementById('leftcontent');
	    
	    if(searchString.length>1)
	    {
	        leftContent.style.display = 'block';
	        leftContent.innerHTML = '<h2>Search Results</h2>';
	        var objRegex = new RegExp("^" + searchString + "| " + searchString,"i");
	        var foundMatch = false;
	       
	        
	        for(var i = 0; i < markers.length; i++)
	        {
	            if(markers[i].getAttribute('acronym').match(objRegex)!=null || markers[i].getAttribute('name').match(objRegex) != null)
	            {
	                leftContent.innerHTML += "<p style='margin-top:0em;margin-bottom:1.5em;'>" + markers[i].getAttribute("key") + ". <a href=\"javascript:GEvent.trigger(gmarkers[" + markers[i].getAttribute("key") + "], 'click');\" onmouseover=\"GEvent.trigger(gmarkers[" + markers[i].getAttribute("key") + "], 'mouseover');\" onmouseout=\"GEvent.trigger(gmarkers[" + markers[i].getAttribute("key") + "], 'mouseout');\">" + markers[i].getAttribute("name") + "</a></p>";
	                foundMatch = true;
	            }
	        }
	        for(var i = 0; i < markers2.length; i++)
	        {
	            if(markers2[i].getAttribute('acronym').match(objRegex)!=null || markers2[i].getAttribute('name').match(objRegex) != null)
	            {
	                leftContent.innerHTML += "<p style='margin-top:0em;margin-bottom:1.5em;'>" + markers2[i].getAttribute("key") + ". <a href=\"javascript:GEvent.trigger(gmarkers[" + markers2[i].getAttribute("key") + "], 'click');\" onmouseover=\"GEvent.trigger(gmarkers[" + markers2[i].getAttribute("key") + "], 'mouseover');\" onmouseout=\"GEvent.trigger(gmarkers[" + markers2[i].getAttribute("key") + "], 'mouseout');\">" + markers2[i].getAttribute("name") + "</a></p>";
	                foundMatch = true;
	            }
	        }
	        
	        if(!foundMatch)
	        {
	            leftContent.innerHTML += "<p>No matches found</p>";
	        }	    
	        
	        leftContent.innerHTML += "<div style=\"clear:both;width:90%;height:1px;border-bottom:solid 1px #8495A9;padding:0px;margin:0px;\"></div>";
	    }
	    else
	    {	 
	        leftContent.style.display = 'none'; 
	        leftContent.innerHTML = '';      
	        //document.getElementById('buildinglist').style.display = 'block';
	    }
	    //alert("ran!");
	}
	function resizeMap() {
	    document.getElementById("leftresize").style.height = getWindowHeight() - 108 + 'px';
	    document.getElementById("map").style.height = getWindowHeight() - 108 + 'px';
	    //alert(getWindowHeight());
	    //alert(document.body.clientWidth);
	}
	function getWindowHeight() {
	if (window.self && self.innerHeight) {
		return self.innerHeight;
	}
	if (document.documentElement && document.documentElement.clientHeight) {
		return document.documentElement.clientHeight;
	}
	    return 0;
    }
    function CheckLoadBuilding()
    {
        var elem = document.getElementById("ShowStartUp");
        if(elem.value != "")
        {
            GEvent.trigger(gmarkers[elem.value],'click');
        }
    }
    function CheckLoadDirections()
    {
        var elem = document.getElementById("ShowStartUpDirections");
        if(elem.value != "")
        {
            document.getElementById('directions3').value = elem.value;
            showDrivingDirections();
            setDirections(elem.value, 'en');
        }
    }
    function getQueryVariable(variable) {
        var query = window.location.search.substring(1);
        var vars = query.split("&");
        for (var i=0;i<vars.length;i++) {
            var pair = vars[i].split("=");
            if (pair[0] == variable) {
            return pair[1];
        }
        }
    } 
    //]]>