﻿  var map = null;
  var panorama;
  var markers = []; 
  var markerNodes;
  var infoWindow;
  var locationSelect;
  var searchType;
  var dynamicBounds;
  var CountryViewport;
  var Location = new google.maps.LatLng(52.533672,	-1.840175);

 
 
  function initializeMap() {
//do a search based on what is in the drop down by default...
    var geocoder = new google.maps.Geocoder();
    geocoder.geocode({address: $('#country').val()}, function(results, status)
    {
    if (status == google.maps.GeocoderStatus.OK) 
    {      
  // Set up the map
    var mapOptions = {
      center: results[0].geometry.location,
      zoom: 4,
      mapTypeId: google.maps.MapTypeId.ROADMAP,
      streetViewControl: false
    };
   
    map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions);
    panorama = map.getStreetView();    
    infoWindow = new google.maps.InfoWindow();
    } 
   });

   }
   


  
  function streetView(bearing,inLat,inLon)
  {  
  
  if ($(".panel.active").length > 0) {
    go($(".baseRight .control"), true);
  }
  
    panorama.setPosition(new google.maps.LatLng(inLat,inLon));
    panorama.setPov({
      heading: bearing,
      zoom:0,
      pitch:0}
    );
    toggleStreetView();
  }
 
  function toggleStreetView() {
      panorama.setVisible(!panorama.getVisible());
  }
   
 function doGSearch()
  {
  //if specialist search
  if ($('#SearchType').val() == "spec")
  {
   searchType = "spec";
   go($(".baseRight .control"), true);
  } 
  else
  {
  //if hotel search
   searchType = "hot";
   
  if ($('#country').val() == "UK" && ($("#county").val() == undefined || $("#county").val() == "")) {
    $("#county").show();
    return false;
  }
  else {
    if ($('#country').val() != "UK") {
        $("#county").hide();
        $("#county").val("");
    }
  }
   
  }
  
  $("#Results").show();
  $("#Results").empty();
  
  if (map == null)
  {
    initializeMap();
  }
  if (panorama != null) {
  panorama.setVisible(false);
  }
    var address = "";
    
    if ($('#gSearch').val() != undefined && $('#gSearch').val() != "") {
        address = $('#gSearch').val();
    }
    if ($('#country').val() != undefined && $('#country').val() != "") {
        if (address != "") {
            address = address +"," + $('#country').val();
        }   
        else {
            address = $('#country').val();
        }
    }
    
    if (searchType == "hot" && $('#country').val() == "UK") {
        if (address != "") {
            address = address +"," + $('#county').val();
        }   
        else {
            address = $('#county').val();
        }
    }

    var geocoder = new google.maps.Geocoder();
    var Result;
    geocoder.geocode({address: address}, function(results, status)
    {
    if (status == google.maps.GeocoderStatus.OK) 
    {      
    //Result = results[0];
    Location = results[0].geometry.location;
    
     //CODE TO DETERMINE POSTCODE  
     var postcode = "";
     var locality = "";
     var administrative_layer = ""
     if (results) 
     {
          for (var i=0; i<results[0].address_components.length; i++) 
          {
          if (results[0].address_components[i].types[0].indexOf("postal_code") > -1)
              {
                  postcode = results[0].address_components[i].long_name;
                  break;
              }
          if (results[0].address_components[i].types[0].indexOf("locality") > -1)
              { //this will occur if the locality is available - this usually happens if a city name is typed in...
                  locality = results[0].address_components[i].long_name;
              }
          
          if (results[0].address_components[i].types[0].indexOf("administrative_area_level_2") > -1)
              { //this will occur if the locality is available - this usually happens if a city name is typed in...
                  administrative_layer = results[0].address_components[i].long_name;
              }
          }
          if (postcode == "")
              {
                 postcode = locality;
              }
          if (postcode == "")
              {
                 postcode = administrative_layer;
              } 
          
     }
     //END OF CODE TO DETERMINE POSTCODE
    
     searchLocationsNear(results[0].geometry, postcode); 
    } 
     else 
    {
     alert(address + ' not found');
    }    
   });
  }
  

//Passes the first result of the google map search to the XML builder
//The XML will return a limited number of the closest entries based on its configuration
//The returns are then parsed to set the markers and the bounds (or zoom level) of the map
  function searchLocationsNear(geometry,postcode) 
  {   
  var center = geometry.location;
  clearLocations();
      var searchUrl = '/xml/GooglemapsXML.aspx';
      downloadUrl(searchUrl,geometry.location.lat(),geometry.location.lng(),postcode, function(data) 
      {  
      dynamicBounds = null;
      ClosestMarkerLatlLong = null;
      ClosestDistance = 6000;
      MatchCount = 0;
      dynamicBounds = new google.maps.LatLngBounds();
      
      createMarker(geometry.location, 'Search location', '<div style=\"display:block\" class=\"info_wrapper\"><h2 class="infoWindowH2">Search location</h2>',true);

      var xml = parseXml(data);
        markerNodes = xml.documentElement.getElementsByTagName("marker");

        if (searchType == "hot")
        {
         map.fitBounds(geometry.viewport);
         for (var i = 0; i < markerNodes.length; i++) 
         {
            addCountryHotelMarkers(i, geometry.viewport);
         }
        } else
        {
          dynamicBounds.extend(geometry.location);
          for (var i = 0; i < markerNodes.length; i++) 
            {           
               addSpecialistMarkers(i);
            } //end of for loop
            if (MatchCount < 1)
        {  //extend bounds to nearest marker if there are no markers that fall inside the specified radius
            dynamicBounds.extend(ClosestMarkerLatlLong);
            dynamicBounds.extend(geometry.location);
        }
        map.fitBounds(dynamicBounds);
        }
     });
  }
  
  function addCountryHotelMarkers(i, bounds)
  {
        var name = markerNodes[i].getAttribute("name");     
        var distance = parseFloat(markerNodes[i].getAttribute("distanceM"));     
        var lat = parseFloat(markerNodes[i].getAttribute("lat"));
        var lon = parseFloat(markerNodes[i].getAttribute("lng"))
        var latlng = new google.maps.LatLng(lat,lon);
        
        if (bounds.contains(latlng))
        {
          createMarker(latlng, name, markerHTML(markerNodes[i]),false);
        }
  }
  
  var MatchCount = 0;
  var ClosestDistance = 6000;
  var ClosestMarkerLatlLong;
  function addSpecialistMarkers(i)
  {
        var name = markerNodes[i].getAttribute("name");     
        var distance = parseFloat(markerNodes[i].getAttribute("distanceM"));     
        var lat = parseFloat(markerNodes[i].getAttribute("lat"));
        var lon = parseFloat(markerNodes[i].getAttribute("lng"))
        var latlng = new google.maps.LatLng(lat,lon);
        //---
        
        if (distance < 50)
            { //if markers are found within the defined radius we set 
              //the bounds using the found markers
                dynamicBounds.extend(latlng);
                MatchCount += 1;
            } 
        else
            { //if the distance is over 400 miles - we want to get the next closest marker
              if (distance < ClosestDistance)
              {
                ClosestMarkerLatlLong = latlng;
                ClosestDistance = distance;
              }
            }
             
        
         var html = markerHTML(markerNodes[i]);  
         createMarker(latlng, name, html);
  }
  
  //Parses a string and returns it as an XML doc
  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');
     }
  } 
  
  var markerPin = new google.maps.MarkerImage(
    '/multimedia/maps/locatorpin.png',
    new google.maps.Size(23,29),
    new google.maps.Point(0,0),
    new google.maps.Point(12,29)
  );
  
  var searchLocator = new google.maps.MarkerImage(
    '/multimedia/maps/uarehere.png',
    new google.maps.Size(23,29),
    new google.maps.Point(0,0),
    new google.maps.Point(12,29)
  );
  
    var markerShadow = new google.maps.MarkerImage(
    '/multimedia/maps/shadow.png',
    new google.maps.Size(41,29),
    new google.maps.Point(0,0),
    new google.maps.Point(12,29)
  );
  
  function getPinGraphic(searchLocation)
  {
    if (searchLocation)
      return searchLocator;
      else
      return markerPin;
  }

  
  //creates an instance of a marker
  function createMarker(latlng, name, html,searchLocation)
  {   
      var marker = new google.maps.Marker(
      {  
        icon : getPinGraphic(searchLocation),
        shadow: markerShadow,
        map: map,
        position: latlng, 
        title: name  }
      );
      google.maps.event.addListener(
      marker, 'click', function()
          {     
            infoWindow.setContent(html);
            infoWindow.open(map, marker);
          });
      markers.push(marker);
      
      var item = $('<li/>').html(name).click(function() { 
        if (panorama != null) {
        panorama.setVisible(false);
        }
       
       infoWindow.setContent(html);
       infoWindow.open(map, marker);
       map.panTo(marker.position);
      });
      item.appendTo($('#Results'));
  }
   
   //return the HTML that will be used in the marker
  function markerHTML(markerNode)
  {
   var name = markerNode.getAttribute("name");     
        var address = markerNode.getAttribute("addr").replace(/##/gi, "<br/>");     
        var tel = markerNode.getAttribute("tel");   
        var fax = markerNode.getAttribute("fax");   
        var website = markerNode.getAttribute("web");  
        var bearing = markerNode.getAttribute("bearing");  
        var distance = parseFloat(markerNode.getAttribute("distanceM"));     
        var distanceK = parseFloat(markerNode.getAttribute("distanceK"));   
        var lat = parseFloat(markerNode.getAttribute("lat"));
        var lon = parseFloat(markerNode.getAttribute("lng"))
    
        var html = '<div class=\"info_wrapper\"><h2 class="infoWindowH2">'+name+'</h2>';
         
           if (address != "" && address != "null" && address != "NULL")
                    {
                    html = html + '<p class="infoWindowP">'+address+'</p>';
                    }
         
           if (tel != "" && tel != "null" && tel != "NULL")
                    {
                    html = html + '<p class="infoWindowTel">tel: '+tel+'</p>';
                    }
                    
           if (fax != "" && fax != "null" && fax != "NULL")
                    {       
                    '<p class="infoWindowFax">fax: '+fax+'</p>';
                    }
                    
           if (website != "" && website != "null" && website != "NULL")
                    {
                    html = html + '<p class=\"infoWindowP\"><a title=\"' + website + '\" target=\"_blank\" href=\"http://' + website + '\">' + website + '</a></p>';
                    }
           if (bearing != "-1")
                    {
                     html = html + '<p class=\"infoWindowP\"><a href="javascript:streetView('+bearing+','+lat+','+lon+')">Street view</a></p>';
                    }                      
                    html = html + "</div>";  
                    
                    return html;  
  }
  

  function clearLocations() {
    infoWindow.close();  
    for (var i = 0; i < markers.length; i++) 
    {  
        markers[i].setMap(null);  
    }  
    markers.length = 0; 
  }
  
  
  function downloadUrl(url,latitude,longitude,postcode,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);
      }  
      };
    
      var fullURL = url + "?lat=" + latitude + "&lon=" + longitude + "&type=" + $('#SearchType')[0].value + "&pcode=" + postcode + "&country=" + $('#country').val();
      request.open('GET', fullURL, true);
      request.send(null);
   }
   
   function doNothing() {}
   function doSomething() {}
   

