// Cross-browser event handlers.
function addEvent(obj, evType, fn) {
    if (obj.addEventListener) {
        obj.addEventListener(evType, fn, false);
        return true;
    } else if (obj.attachEvent) {
        var r = obj.attachEvent("on" + evType, fn);
        return r;
    } else {
        return false;
    }
}

function removeEvent(obj, evType, fn) {
    if (obj.removeEventListener) {
        obj.removeEventListener(evType, fn, false);
        return true;
    } else if (obj.detachEvent) {
        obj.detachEvent("on" + evType, fn);
    } else {
        return false;
    }
}

var map;
var zoomcontrol;

function makeMarker(lat, lng, title, html) {
    var markerpt = new GLatLng(lat,lng);
    var marker = new GMarker(markerpt, {'title':title});
    if (html) {
        GEvent.addListener(marker, "click", function() { marker.openInfoWindowHtml(html); });
    }
    return marker;
}

function unload() {
  GUnload();
}

function buildDataURL(sw,ne) {
  var parts =['/drinkspecials/map/data'];
  parts.push(getLatLonSlug(sw));
  parts.push(getLatLonSlug(ne));

  return parts.join('/') + '/';
}

//stolen from http://www.ashleyit.com/ajax/bingo.htm
//code in the response calls handleData.
function fetchData() {
  var head = document.getElementsByTagName('head').item(0);
  var old  = document.getElementById('specialsdata');
  if (old) {
     head.removeChild(old);
  }
  var bounds = map.getBounds();

  script = document.createElement('script');
  script.src = buildDataURL(bounds.getSouthWest(),bounds.getNorthEast());
  script.type = 'text/javascript';
  script.defer = true;
  script.id = 'specialsdata';
  void(head.appendChild(script));
}

function handleData(data) {
  wipeData();
  //wipe any existing points, add points for all data.
  //data looks like {points:[lat,lon,title,html],...]}
  var lenPoints = data['points'].length;
  var markers = [];
  for (var i=0;i<lenPoints;i++) {
     var p = data['points'][i];
     markers.push(makeMarker(p[0],p[1],p[2],p[3]));
  }
  var markerMgr = new GMarkerManager(map);
  markerMgr.addMarkers(markers, 1);
  markerMgr.refresh();

}

function wipeData() {
  map.clearOverlays();
}

/* just use selection from dropdown.
function getInitialArea() {
  var url = location.href;
  var areaName = 'angelinas';//url.substring(url.lastIndexOf('/', url.length-2)+1, url.length-1);
  return DrinkAreas[areaName];
}
*/

function getLatLonSlug(latLng) {
   return latLng.lat().toFixed(3) + "x" + latLng.lng().toFixed(3);
}

function getSelectedArea() {
  var areasel = $('#id_area').get(0);
  return DrinkAreas[areasel[areasel.selectedIndex].value];

}

function turnZoomOn() {
   freeZoom = true;
   setArea();
}
freeZoom=true;
function setArea() {
   var area = getSelectedArea();
   var pt = new GLatLng(area.lat, area.lon);

   if (freeZoom) {
      zoomcontrol = new GLargeMapControl();
      map.addControl(zoomcontrol);
   } else {
      if (zoomcontrol) {
         map.removeControl(zoomcontrol);
     zoomcontrol = null;
      }
   }

   map.setCenter(pt, area.zoom);
   fetchData();
}

function newText(text) {
  return document.createTextNode(text);
}
function addOption(sel, name, value) {
  var opt = document.createElement('option');
  opt.value = value;
  sel.appendChild(opt);
  opt.appendChild(newText(name));

}

function load() {
   if (GBrowserIsCompatible()) {
      var map_div = document.getElementById("gmap");
      map = new GMap2(map_div,{mapTypes:[G_NORMAL_MAP]});

      var area_sel = $("#id_area").get(0);

      for (var i=0;i<DrinkAreas.length;i++) {
         addOption(area_sel, DrinkAreas[i].human, i);
      }

      //map.disableDragging();
      GEvent.addListener(map, "dragend", fetchData);
      GEvent.addListener(map, "zoomend", fetchData);

      addEvent(area_sel, 'change', setArea);
      area_sel.selectedIndex = 0;
      setArea();      
  }
}

$(window).bind('load', load);
$(window).bind('unload', unload);