// $Id: gpMap.js,v 1.1.4.5 2008/06/11 01:13:43 greenskin Exp $

if (Drupal.jsEnabled) {
  var map;
  var mgr;
  var myCenter;
  gpResultPages = [];
  var geocoder = new GClientGeocoder(new GGeocodeCache());
  var reasons=[];
        reasons[G_GEO_SUCCESS]            = "Success";
        reasons[G_GEO_MISSING_ADDRESS]    = "Missing Address: The address was either missing or had no value.";
        reasons[G_GEO_UNKNOWN_ADDRESS]    = "Unknown Address:  No corresponding geographic location could be found for the specified address.";
        reasons[G_GEO_UNAVAILABLE_ADDRESS]= "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons.";
        reasons[G_GEO_BAD_KEY]            = "Bad Key: The API key is either invalid or does not match the domain for which it was given";
        reasons[G_GEO_TOO_MANY_QUERIES]   = "Too Many Queries: The daily geocoding quota for this site has been exceeded.";
        reasons[G_GEO_SERVER_ERROR]       = "Server error: The geocoding request could not be successfully processed.";
  var icons = {};
  var reviewMarkers = [];
  var markerID = 0;
  var pageSet;
  // Create a base icon for all of our markers that specifies the shadow, icon dimensions, etc.
  var baseIcon = new GIcon();
  baseIcon.shadow = "http://www.google.com/mapfiles/shadow50.png";
  baseIcon.iconSize = new GSize(20,34);
  baseIcon.shadowSize = new GSize(37,34);
  baseIcon.iconAnchor = new GPoint(9,34);
  baseIcon.infoWindowAnchor = new GPoint(9,2);

  // ONLOAD
  $(document).ready(function() {
    if (GBrowserIsCompatible()) {
      map = new GMap2(document.getElementById("gpMap"));
      map.setCenter(new GLatLng(mapSettings.centerLat,mapSettings.centerLng),mapSettings.zoomLvl*1); // multiply zoomLvl by one to ensure it is an int
      myCenter = map.getCenter();
      results_title = $("#gprox_result h2").html();
      loadControls(); // Loads map controls
      window.setTimeout(loadMarkers, 0);

      // EVENTS
      GEvent.addListener(map, 'moveend', function() {
        loadResults();
      });
    loadResults();


    }
  });

  // START FUNCTIONS
  function gproxSearch(search) {
    geocoder.getLatLng(search,function(point) {
      if (point) {
        map.setCenter(point, mapSettings.searchZoomLvl*1);
        myCenter = point;
        loadResults();
      } else {
        var result = geocoder.getCache().get(search);
        if (result) {
          var reason = "Code " + result.Status.code;
          if (reasons[result.Status.code]) {
            reason = reasons[result.Status.code];
          }
        } else {
          var reason = "";
        }
        alert('Count not find "' + search + '" ' + reason);
      }
    })
  }

  function loadControls() {
    // Scale
    if (mapSettings.scale == 1) {
      map.addControl(new GScaleControl());
    }

    // Map Types
    if (mapSettings.mapType == 1) {
      map.addControl(new GMapTypeControl());
    }

    // Zoom
    if (mapSettings.zoom == 1) {
      map.addControl(new GSmallZoomControl());
    } else if (mapSettings.zoom == 2) {
      map.addControl(new GSmallMapControl());
    } else if (mapSettings.zoom == 3) {
      map.addControl(new GLargeMapControl());
    }

    // Overview
    if (mapSettings.overview == 1) {
      if (mapSettings.hideShow == 1) {
        map.addControl(new GOverviewMapControl());
      } else {
        ovMap = new GOverviewMapControl();
        map.addControl(ovMap);
        ovMap.hide(true);
      }
    }

    // Double-Click Zoom
    if (mapSettings.doubleClick == 1) {
      map.enableDoubleClickZoom();
    }

    // Scroll Zoom
    if (mapSettings.scrollZoom == 1) {
      map.enableScrollWheelZoom();
    }

    // Map Dragging
    if (mapSettings.mapDragging == 0) {
      map.disableDragging();
    }

    // Continuous Zoom
    if (mapSettings.continuousZoom == 1) {
      map.enableContinuousZoom();
    }
  }

  function loadMarkers() {
    mgr = new GMarkerManager(map);
    for (var i in locations) {
      var layer = locations[i];
      var markers = [];
      for (var j in layer.places) {
        var place = layer.places[j];
        var point = new GLatLng(place.lat,place.lng);
        var icon = '';
        if (place.icon) {
          icon = getIcon(place.icon);
        }
        markers.push(createMarker(point,place.extra,place.nid,icon));
      }
      if (!layer.zoom[1]) {
        layer.zoom[1] = 0;
      }
      mgr.addMarkers(markers, layer.zoom[0], layer.zoom[1]);
    }
    mgr.refresh();
  }

  function createMarker(point,extra,nid,icon) {
    var marker = new GMarker(point,{icon: icon});
    GEvent.addListener(marker, "click", function() {
      if (extra) {
        var info = extra.replace('[DISTANCE-MILES]', calcDistance(myCenter,point,'miles'));
        info = info.replace('[DISTANCE-KM]', calcDistance(myCenter,point,'km'));
      } else {
        info = '';
      }
      marker.openInfoWindowHtml("<div id='bubble'>"+info+"</div>");
    });

    // Add marker to reviewMarkers array for referencing in review window.
    if (gpNodeLink) {
      reviewMarkers[markerID] = marker;
      markerID++;
    }
    return marker;
  }

  function calcDistance(startPoint,endPoint,unitType) {
    if (unitType == 'miles') {
      return Math.round(((startPoint.distanceFrom(endPoint)/1000)/1.61)*100)/100;
    }
    if (unitType == 'km') {
      return Math.round((startPoint.distanceFrom(endPoint)/1000)*100)/100;
    }
  }

  function getIcon(iconSpecs) {
    var icon = null;
    var key = iconSpecs.marker;
    if (key) {
      if (icons[key]) {
        icon = icons[key];
      } else {
        icon = new GIcon(baseIcon);
        icon.image = iconSpecs.marker;
        icon.iconSize = new GSize(iconSpecs.markerSize[0],iconSpecs.markerSize[1]);
        icon.iconAnchor = new GPoint(iconSpecs.anchor[0],iconSpecs.anchor[1]);
        icon.infoWindowAnchor = new GPoint(iconSpecs.infoAnchor[0],iconSpecs.infoAnchor[1]);
        if (iconSpecs.shadow != '') {
          icon.shadow = iconSpecs.shadow;
          icon.shadowSize = new GSize(iconSpecs.shadowSize[0],iconSpecs.shadowSize[1]);
        }

        icons[key] = icon;
      }
    }
    return icon;
  }
  function loadResults() {
    var distances = [];
    var titles = [];
    var mapObjectList = [];
    
    gpResultPages = new Array();
    var checkCalc;


    for (var i in locations[0].places) {
      var place = locations[0].places[i];
      var point = new GLatLng(place.lat,place.lng);
      var calc = calcDistance(map.getCenter(),point,'km');
      var info = place.results_extra;
      info = info.replace('[DISTANCE-KM]', calcDistance(map.getCenter(),point,'km'));
      info = info.replace('[DISTANCE-MILES]', calcDistance(map.getCenter(),point,'miles'));
      if (checkCalc == calc) calc+= .000001;  // If more than one marker have the same location
      distances.push(calc);
      mapObject = new Array();
      
      mapObject.distance = calc;
      mapObject.lat = place.location_latitude =  place.lat;
      mapObject.lng = place.location_longitude = place.lng;
      mapObject.info = info;
      mapObject.id = i;
      for (var i in place.sort_fields) {
        if (place[place.sort_fields[i]]) {
          var field_value = place[place.sort_fields[i]].replace(/(<([^>]+)>)/ig,"");
        } else {
          var field_value = '';
        }
        mapObject[place.sort_fields[i]] = field_value;
      }
      mapObjectList.push(mapObject);
      checkCalc = calc;
    }
    // Sort by title as default
    if (! mapSettings.results_sort) mapSettings.results_sort = 'title';
    quickSort(mapObjectList, mapSettings.results_sort, false, true);

    var pageCount = 1;
    var count = 1;
    var resultsCount = 0;
    for (var i in mapObjectList) {
      if (mapObjectList[i].distance != '0' && distanceLimit != '0') {
        if (mapObjectList[i].distance > distanceLimit) {
          continue;
        }
      } 
      if (count == 1) {
        gpResultPages[pageCount] = new Array();
      }
      gpResultPages[pageCount].push(mapObjectList[i]);
      if (count == gpResultQty) {
        count = 1;
        pageCount++;
      } else {
        count++;
      }
      if (gpPager) {
        resultsCount++;
      } else {
        if ((resultsCount < gpResultQty) || gpResultQty == '0') {
          resultsCount++;
        }
      }
    }
    $("#gprox_result h2").html(results_title+' ('+resultsCount+')');
    if (distanceLimit == 0) {
      if (! pageSet) pageSet = 1;
    } else {
      pageSet = 1;
    }
    showPage(pageSet);
  }

  function showPage(page) {
    var tempResults;
    var tempMarkerID = new Array();
    pageSet = page;
    $("#gpResults").empty();
    tempResults = '<ul class="results">';
    for (var i in gpResultPages[page]) {
      tempResults+= '<li class="node-title">'+gpResultPages[page][i]['info']+'</li>';
      if (gpNodeLink) {
        tempMarkerID.push(gpResultPages[page][i]['id']);
      }
    }
    tempResults+= '</ul>';
    if (gpNodeLink) {
      $("#gpResults ul").unbind();
    }
    $("#gpResults").append(tempResults);
    if (gpNodeLink) {
      $("#gpResults a[@class=map-link]").each(function(i) {
        $(this).click(function() {
          GEvent.trigger(reviewMarkers[tempMarkerID[i]], "click");
          return false;
        });
      });
    }
    if (gpPager) {
      var pagePrev;
      var pageNext;
      var pageNavSpacer;

      $("#gpResultsNav").empty();
      if (page > 1) {
        pageSet = page;
        var prev = page-1;
        pagePrev = "<a href='javascript:void(0)' onclick='showPage(" + prev + ")'>Prev</a>";
      } else {
        pagePrev = "Prev";
      }
      pageNavSpacer = " | ";
      if (gpResultPages[page+1]) {
        var next = page+1;
        pageNext = "<a href='javascript:void(0)' onclick='showPage(" + next + ")'>Next</a>";
      } else {
        pageNext = "Next";
      }
      if (pagePrev != 'Prev' || pageNext != 'Next') {
        $("#gpResultsNav").append(pagePrev + pageNavSpacer + pageNext);
      }
    }
  }


}
