var map;
var localSearch = new GlocalSearch();
var gmarkers = new Array();
var mapzoom;
var postcodeSearchedLat = 0;
var postcodeSearchedLong = 0;
var postcodeSearched;
var hassearched = false;

// vars that will need to be translated or update per country //

var centlat             = 53.600939134593;
var centlng             = -2.399894114594;
var noStores            = 'Sorry there are no stores in this town or area';
var noPostcodeEntered   = 'Please enter a postcode or town';    
var noOptionsEntered    = 'Please enter a town or postcode and select a search option:\n\n - Spectacles & contact lenses\n - Laser eye surgery\n - Intraocular lenses';
var retrievingData      = 'retreiving data'
var laserDirectoryName  = 'laser-eye-surgery/clinic-';
var tnName              = 'Location';
var tnPostcode          = 'Postcode';
var tnDistance          = 'Distance';
var townUnmatched       = 'Town not found';
var laserDirectory      = '/laser-eye-surgery/';
var directoryName       = 'clinics/';
var moreInfo            = 'Find out more';
var stores              = ' stores ';
var showing             = ' showing ';
var countryName         = ' UK';
var storelistHeader     = ' Nearest stores to ';
var unit                = ' miles';
var townName;

function isLaserPage() {
    return document.getElementById('isLaserPage');
}   


function addEvent(oTarget, sType, fpDest) {
  sType = 'on'+sType;
  var oOldEvent = oTarget[sType];
  if (typeof oOldEvent != "function") {
    oTarget[sType] = fpDest;
  } else {
    oTarget[sType] = function(e) {
      oOldEvent(e);
      fpDest(e);
    }
  }
}

function showStoreInfo(id)
{
    // pops up the infor window
    map.addOverlay( gmarkers[id]);
    GEvent.trigger(gmarkers[id], "click");
}

function usePointFromPostcodeTown(town) {
// this function takes a town and zooms and center on the map based on this

    town += ',' + countryName;

  localSearch.setSearchCompleteCallback(null,
    function() {

      if (localSearch.results[0]) {
        var resultLat = localSearch.results[0].lat;
        var resultLng = localSearch.results[0].lng;
        var point = new GLatLng(resultLat,resultLng);
        townName = localSearch.results[0].title;
        postcodeSearchedLat = resultLat;
        postcodeSearchedLong = resultLng;
        postcodeSearched = town;
        if(!isLaserPage()) {
            map.clearOverlays();
        }
        var zoom = 12;
        map.setCenter(point, zoom, G_PHYSICAL_MAP);
        putResultsOnMap();
      }else{
        alert(townUnmatched);
        map.setCenter(new GLatLng(centlat,centlng), 5, G_PHYSICAL_MAP);
      }
    });

  localSearch.execute(town);
}


function putResultsOnMap(fromZoom, fromLaser)
{
    //Don't populate the markers if they haven't done a search yet on main Store Locator
    /*
    if(!isLaserPage() && !hassearched) {
        return false;
    }
    */

    bounds = map.getBounds();
    leftBottomCorner = bounds.getSouthWest();
    rightTopCorner = bounds.getNorthEast();
    min_lat =  leftBottomCorner.lat();
    max_lat =  rightTopCorner.lat();
    min_long = leftBottomCorner.lng();
    max_long = rightTopCorner.lng();
    
    // based on the current map bounds send off a request to get what stores are in this.
    var url = "/inc/storeLocator-xml.inc.php"; //?min_lat=" + min_lat + '&max_lat=' +  max_lat + '&min_long='  + min_long + '&max_long=' + max_long + '&zoom=' + map.getZoom();
    // if we have a post send the long and lat of this so that we can return ordered results
    if(postcodeSearchedLat && postcodeSearchedLong )
    {
      url +=  '&postcodeLat=' + postcodeSearchedLat + '&postcodeLong=' + postcodeSearchedLong;
    }
    
    //lets check if any of the tickboxes were ticked if so add that on the url
    if(document.getElementById('isSpecsContacts') && document.getElementById('isSpecsContacts').checked == true)
    {
      url +=  '&isSpecsContacts=1'; 
    }
    
    if(isLaserPage() || (document.getElementById('isLaser') && document.getElementById('isLaser').checked == true))
    {
      url +=  '&isLaser=1'; 
    }
    
    if(document.getElementById('isIOL') && document.getElementById('isIOL').checked == true)
    {
      url +=  '&isIOL=1';   
    }
    
    GDownloadUrl(url, function(data, responseCode) 
    {  
      // if the script doesnt die on us process the results
      if(responseCode == 200) 
      {
        
        // we get returned an xml document 
         var xml = GXml.parse(data);
         // lets get the markers out of that into an array
         if(xml)
         {
             var markers = xml.documentElement.getElementsByTagName("marker"); 
             var markertotal = markers.length;
             
             // if we have no markers returned and they didnt just zoom then we know they came from a search
             // so tell them the search returned no results
             
             if(markertotal == 0 && !fromZoom) 
             { 
               map.zoomOut();
               putResultsOnMap(fromZoom, fromLaser);
               return;
             } 
             var lattotal = 0;
             var lngtotal = 0;
            
            // The Pink Icon
            var Icon = new GIcon();
            Icon.image = "/img/markerSign.png";
            Icon.iconSize = new GSize(45, 45);
            Icon.shadow = "/img/markerSignShadow.png";
            Icon.shadowSize = new GSize(78, 47);
            Icon.iconAnchor = new GPoint(10, 45);
            Icon.infoWindowAnchor = new GPoint(21, 0);

            // The Blue Icon for Non-Surgical Clinics
            var Icon2 = new GIcon();
            Icon2.image = "/img/markerSign2.png";
            Icon2.iconSize = new GSize(45, 45);
            Icon2.shadow = "/img/markerSignShadow.png";
            Icon2.shadowSize = new GSize(78, 47);
            Icon2.iconAnchor = new GPoint(10, 45);
            Icon2.infoWindowAnchor = new GPoint(21, 0);

            // lets loop through the xml list
            for (var i = 0; i < markers.length; i++) { 
                var title = '';
                // lets plot the location
                point = new GLatLng(markers[i].getAttribute("lat"), markers[i].getAttribute("lng"));
                lattotal = lattotal + Number(markers[i].getAttribute("lat")); 
                lngtotal = lngtotal + Number(markers[i].getAttribute("lng"));    
                
                // make individual markers
                title = markers[i].getAttribute("town");      
                isNonSurgical = markers[i].getAttribute("isNonSurgical");
                var marker;
                
                if(isNonSurgical == '1') {
                    marker = new GMarker(point, {title: title, icon:Icon2}); 
                } else {                
                    marker = new GMarker(point, {title: title, icon:Icon}); 
                }
                lowerCaseTownForUrl = markers[i].getAttribute("fname").toLowerCase();
                name = markers[i].getAttribute("name");
                marker.name = title; // add some info that we can access later for linking
                marker.myhtml = "<img src=\"/img/storeLocator-logo.gif\" alt=\"Optical Express\"><br /><strong> " + markers[i].getAttribute("town") + "</strong><br /><br /><a onClick=\"saveCurrentPosition();\" href=\"/" + directoryName +  markers[i].getAttribute("fname") + '-'  +  markers[i].getAttribute("id") +  ".html \">" + moreInfo + "</a>"; 
                 
                marker.id =  markers[i].getAttribute("id");
                // add marker to the map - if it isn't already there!
                if(!gmarkers[markers[i].getAttribute("id")]) {
                    gmarkers[markers[i].getAttribute("id")] = marker;
                    map.addOverlay(marker);
                }
            }
            
          }
       }
    }   
  );  
}


function createMap()
{
    // basic  function just to create the google map
    map = new GMap2(document.getElementById("storeMap"));
    // add the new terrain map type
    map.addMapType(G_PHYSICAL_MAP); 
    // add the large zoom bar
    map.addControl(new GLargeMapControl());
    // add the maps types eg. satellite, hybrid, street
    map.addControl(new GMapTypeControl());
    // allow users to double on the map to zoom
    map.enableDoubleClickZoom();
    
         
    // set min/max map scale
    var minmapscale = 5;
    var maxmapscale = 15;
    // get array of map types
    var mapTypes = map.getMapTypes();
    // overwrite the getMinimumResolution() and getMaximumResolution() methods for each map type
    for (var i=0; i<mapTypes.length; i++) {
        mapTypes[i].getMinimumResolution = function() {return minmapscale;}
        mapTypes[i].getMaximumResolution = function() {return maxmapscale;}
    }
}



function addMapListeners()
{
/*
    GEvent.addListener(map, "moveend", function() {
        checkZoom(); 
    } );
*/
    // lets add some listeners for clikc and zoom events
    GEvent.addListener(map, "click", function(overlay, point) {
        if (overlay) { 
            if (overlay.openInfoWindowHtml) {
                overlay.openInfoWindowHtml(overlay.myhtml);
            } 
        } 
    } );
}


function searchFormSubmitted()
{
    // lets first save the search values    
    // if we have postcode or town search by this 
    targ = document.getElementById('postcodeTown');
    
    //We're going to rebuild the list of markers
    gmarkers = new Array();
    
    // lets validate first
    isSpecsContacts = document.getElementById('isSpecsContacts');
    isLaser = document.getElementById('isLaser');
    isIOL = document.getElementById('isIOL');
 
    //If it's the laser page and they're trying to submit the form with no postcode, do an error
    if(isLaserPage() && targ.value == '')
    {
        alert(noPostcodeEntered);
        return false;   
    }
    
    //Otherwise we need to check they've selected something from the radio buttons
    if(!isLaserPage()) {
        if(targ.value == '' || (isSpecsContacts.checked == false && isLaser.checked == false && isIOL.checked == false))
        {
            alert(noOptionsEntered);
            return false;
        }
    }
    
    hassearched = true;
    
    // go get the results if the user gave us something to search for 
    if(targ.value != '')
    {
         usePointFromPostcodeTown(targ.value);  
    }
    else
    {
        // get rid of all current markers and replot for these search params
        map.clearOverlays();  
        putResultsOnMap(); 
    }
    
    return false;

}

function mapLoad( ) 
{
  // unless we are setting the zoom to be something else default it to 4 veiw of europe
  if (GBrowserIsCompatible()) 
  {
          createMap(); 
          // if they hit back from a store info page then they will have their last pos saved so return them to it
          returnToSavedPosition();  
          if(!mapzoom) { 
              mapzoom = 6;
          }
          map.setCenter(new GLatLng(centlat,centlng), mapzoom, G_PHYSICAL_MAP);
          if(isLaserPage())
          {
            // if we are coming from laser we don't want to use the ajax list   
            checkZoom(1);
          } else {
            checkZoom();
            //Check if we have posted something
            /*
            var isformposted = document.getElementById('from_storelist');
            if(isformposted && isformposted.value == '1') {
                searchFormSubmitted();
            } 
            */  
          }
          /*
          var pos = new GControlPosition(G_ANCHOR_TOP_RIGHT, new GSize(10,40)); pos.apply(document.getElementById("legend")); document.getElementById("storeMap").appendChild( document.getElementById("legend"));          
          $("legend").toggle();           
          */
          addMapListeners();      
         
  }
}

function checkZoom(fromLaser)
{
    putResultsOnMap(1, fromLaser); 
}

function clinicSelected()
{
  var targ = document.getElementById('clinics');
  if(targ)
  {
    var name = targ.options[targ.options.selectedIndex].value;
    location.href= laserDirectory + name + '.html'; 
  }
}

function saveCurrentPosition()
{
    // get the map position
    expires = 1000 * 60 * 5;
    cent = map.getCenter();
    var zoom = map.getZoom();
    //save this to cookies so that when the user hits back they 
    //get returned to where they were on the map
    if(!isLaserPage()) {
        var latCookie = 'opEx_centlat';     
        var longCookie = 'opEx_centlng';        
        var zoomCookie = 'opEx_zoom';       
    } else {
        var latCookie = 'opEx_laser_centlat';       
        var longCookie = 'opEx_laser_centlng';      
        var zoomCookie = 'opEx_laser_zoom';     
    }
    
    setCookie(latCookie, cent.lat(), expires);
    setCookie(longCookie, cent.lng(), expires);
    setCookie(zoomCookie,zoom, expires);
    
}

function returnToSavedPosition()
{
    if(!isLaserPage()) {
        var latCookie = 'opEx_centlat';     
        var longCookie = 'opEx_centlng';        
        var zoomCookie = 'opEx_zoom';       
    } else {
        var latCookie = 'opEx_laser_centlat';       
        var longCookie = 'opEx_laser_centlng';      
        var zoomCookie = 'opEx_laser_zoom';     
    }

  //if cookie get the previous map position and zoom
  if(getCookie(zoomCookie))
  {
    mapzoom = Number(getCookie(zoomCookie));
  }
  
  if(getCookie(latCookie) && getCookie(longCookie))
  {
    centlat = Number(getCookie(latCookie));
    centlng = Number(getCookie(longCookie));
    hassearched = true;
  }
}

function getCookie(sName)
{
  var aCookie = document.cookie.split("; ");
  for (var i=0; i < aCookie.length; i++)
  {
    var aCrumb = aCookie[i].split("=");
    if (sName == aCrumb[0]) return unescape(aCrumb[1]);
  }
  return 0;
}

function setCookie(sName, sValue, sExpires)
{
  // create a cookie
  var today = new Date();
  today.setTime( today.getTime() );
  var expires = 1000 * 60 * 4;
  var expires_date = new Date( today.getTime() + (expires) );   
  document.cookie = sName + "=" + escape(sValue) + "; path=/; " + "expires=" +  expires_date.toGMTString();
}

function getElementsByClass(searchClass,node,tag)
{
    // provide a class name and it returns and array of all elements belonging to this class
    var classElements = new Array();
    if ( node == null )
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function addUnLoadEvent(func) {
// we need this to avoid memory leaks
var oldonunload = window.onunload;
if (typeof window.onunload != 'function') {
  window.onunload = func;
  } else {
    window.onunload = function() {
        oldonunload();
            func();
              }
              }
}

// when the page loads load the map
addEvent( window, 'load',mapLoad);
addUnLoadEvent(GUnload);