var markerHash = new Array();
var markerTypeHash = new Array();
var restaurantsMarkerHash = new Array();
var campingsuppliesMarkerHash = new Array();
var xmlHttp = new Array();
var map;
var defaultMarkerFound = false;
var defaultMarker;

// Creates a marker whose info window displays the given number
function createMarker(point, type, uin, name, country, province, town, url, extra1) {
  var marker = new GMarker(point, markerTypeHash[type]);

  // Show this marker's index in the info window when it is clicked
  var html;
  if ("camping" == type) {
  	html = "<a href='/" + country + "/" + province + "/" + town + "/c" + uin + "-" + textToUrlPath(name) + ".html'>" + name + "</a>";
  } else if ("hostels" == type) {
  	html = "<a href='/" + country + "/" + province + "/" + town + "/h" + uin + "-" + extra1 + "-" + textToUrlPath(name) + ".html'>" + name + "</a>";
  } else {
  	html = "<a href='/" + country + "/" + province + "/" + town + "/" + type + ".html#" + uin + "'>" + name + "</a>";
  }
  if (url) {html = html + "<br /><br /><a href='http://" + url + "'>Go to Website</a>";}
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });

  return marker;
}

// Creates a marker whose info window displays the given number
function createGoogleTypeMarker(point, type, uin, name, country, province, town, url) {
  var marker = new GMarker(point, markerTypeHash[type]);

  // Show this marker's index in the info window when it is clicked
  var html = "NULL" == town ? "<a href='" + url + "'>" + name + "</a>" : "<a href='/" + country + "/" + province + "/" + town + "/r" + uin + "-" + textToUrlPath(name) + ".html'>" + name + "</a>";
  GEvent.addListener(marker, "click", function() {
    marker.openInfoWindowHtml(html);
  });

  return marker;
}

function addData(types) {
  xmlHttp = new Array();
  var bounds = map.getBounds();

  for (var x = 0; x < types.length; x++) {
  	var type = types[x];
    xmlHttp[x] = getRequestObject();

	setUpAjax(x,type,bounds);
  }

  nearbyResources();
}

// This needs to be separate to addData() because JS updates x/pos asynchronously and can't scope it properly
function setUpAjax(pos,type,bounds) {
    if (null != xmlHttp[pos]) {
//      var address = "/cgi-bin/ajax/latlong.pl?minLat=" + bounds.getSouthWest().lat() + "&maxLat=" + bounds.getNorthEast().lat() + "&minLong=" + bounds.getSouthWest().lng() + "&maxLong=" + bounds.getNorthEast().lng() + "&type=" + type;
      xmlHttp[pos].open("GET", "/cgi-bin/ajax/latlong.pl?minLat=" + bounds.getSouthWest().lat() + "&maxLat=" + bounds.getNorthEast().lat() + "&minLong=" + bounds.getSouthWest().lng() + "&maxLong=" + bounds.getNorthEast().lng() + "&type=" + type, true);
      xmlHttp[pos].onreadystatechange = function () {
      	processResult(pos);
      };
      xmlHttp[pos].send(null);
    }
	
}
function processResult(pos) {
  if (4 == xmlHttp[pos].readyState) {
    var results = xmlHttp[pos].responseText.split("\n");
    // Go through the array but not the last one. It's null because there is a final \n that is split() upon
    for (var i = 0; i < results.length-1; i++) {
      if (!markerHash[results[i]]) {
        var data = results[i].split("|");
        if (/^\w+$/.test(data[0]) && /^\d+$/.test(data[1]) && /^\w+$/.test(data[3]) && /^\w+$/.test(data[4]) && /^\w+$/.test(data[5]) && /^[\d\.\-]+$/.test(data[6]) && /^[\d\.\-]+$/.test(data[7])) {
          markerHash[results[i]] = createMarker(new GLatLng(data[6], data[7]), data[0], data[1], data[2], data[3], data[4], data[5], data[8], data[9]);
          map.addOverlay(markerHash[results[i]]);
          //markerHash[results[i]] = true;
          if (!defaultMarkerFound && defaultMarker == data[0] + '|' + data[1]) {
            GEvent.trigger(markerHash[results[i]], "click");
            defaultMarkerFound = true;
          }
        }
      }
    }
    xmlHttp[pos] = false;
  }
}

function createIcons() {
  markerTypeHash['camping'] = new GIcon();
  markerTypeHash['camping'].image = "http://www.interhike.com/images/campingmapIcon.png";
  markerTypeHash['camping'].shadow = "http://www.interhike.com/images/campingmapIconShadow.png";
  markerTypeHash['camping'].iconSize = new GSize(15, 20);
  markerTypeHash['camping'].shadowSize = new GSize(25, 20);
  markerTypeHash['camping'].iconAnchor = new GLatLng(20, 7);
  markerTypeHash['camping'].infoWindowAnchor = new GLatLng(1, 5);

  markerTypeHash['hostels'] = new GIcon();
  markerTypeHash['hostels'].image = "http://www.interhike.com/images/hostelsmapIcon.png";
  markerTypeHash['hostels'].shadow = "http://www.interhike.com/images/hostelsmapIconShadow.png";
  markerTypeHash['hostels'].iconSize = new GSize(15, 20);
  markerTypeHash['hostels'].shadowSize = new GSize(25, 20);
  markerTypeHash['hostels'].iconAnchor = new GLatLng(20, 7);
  markerTypeHash['hostels'].infoWindowAnchor = new GLatLng(1, 5);

  markerTypeHash['attractions'] = new GIcon();
  markerTypeHash['attractions'].image = "http://www.interhike.com/images/attractionsmapIcon.png";
//  markerTypeHash['attractions'].shadow = "http://www.interhike.com/images/attractionsmapIconShadow.png";
  markerTypeHash['attractions'].iconSize = new GSize(37, 34);
//  markerTypeHash['attractions'].shadowSize = new GSize(37, 34);
  markerTypeHash['attractions'].iconAnchor = new GLatLng(20, 7);
  markerTypeHash['attractions'].infoWindowAnchor = new GLatLng(1, 5);

  markerTypeHash['restaurants'] = new GIcon();
  markerTypeHash['restaurants'].image = "http://www.interhike.com/images/restaurantsmapIcon.png";
  markerTypeHash['restaurants'].shadow = "http://www.interhike.com/images/restaurantsmapIconShadow.png";
  markerTypeHash['restaurants'].iconSize = new GSize(18, 34);
  markerTypeHash['restaurants'].shadowSize = new GSize(36, 34);
  markerTypeHash['restaurants'].iconAnchor = new GLatLng(20, 7);
  markerTypeHash['restaurants'].infoWindowAnchor = new GLatLng(1, 5);
  markerTypeHash['googlerestaurants'] = markerTypeHash['restaurants'];

  markerTypeHash['campingsupplies'] = new GIcon();
  markerTypeHash['campingsupplies'].image = "http://www.interhike.com/images/campingsuppliesmapIcon.png";
//  markerTypeHash['campingsupplies'].shadow = "http://www.interhike.com/images/campingsuppliesmapIconShadow.png";
  markerTypeHash['campingsupplies'].iconSize = new GSize(25, 25);
//  markerTypeHash['campingsupplies'].shadowSize = new GSize(25, 20);
  markerTypeHash['campingsupplies'].iconAnchor = new GLatLng(20, 7);
  markerTypeHash['campingsupplies'].infoWindowAnchor = new GLatLng(1, 5);
  markerTypeHash['googlecampingsupplies'] = markerTypeHash['campingsupplies'];
}

function drawMap(latitude, longitude, zoomlevel) {
  map = new google.maps.Map2(document.getElementById("map"));
  map.addControl(new GSmallMapControl());
//<?php
//  $latLongZoomKeyresult = mysql_query("select * from provinces where country = '$country' and province = '$province'",$db);
//  $latLongZoomKeyHandle = mysql_fetch_array($latLongZoomKeyresult);

//  echo "map.setCenter(new GLatLng($latLongZoomKeyHandle[latitude], $latLongZoomKeyHandle[longitude]), $latLongZoomKeyHandle[zoomlevel]);";
//?>
  map.setCenter(new GLatLng(latitude, longitude), zoomlevel);
}

function loadMapWithDefault(latitude, longitude, zoomlevel, types, highlightMarker) {
  defaultMarker = highlightMarker;
  loadMap(latitude, longitude, zoomlevel, types);
}
function loadMap(latitude, longitude, zoomlevel, types) {
  createIcons();
  drawMap(latitude, longitude, zoomlevel);
  GEvent.addListener(map, "moveend", function () { addData(types); });

  addData(types);
}

function nearbyResources() {
  $('#progress').show();

  var bounds = map.getBounds();
  if ($('#restaurants').attr('checked')) {
    $.ajax({
      type: 'GET',
      url: '/cgi-bin/ajax/getrestaurants.pl?minLat=' + bounds.getSouthWest().lat() + '&maxLat=' + bounds.getNorthEast().lat() + '&minLong=' + bounds.getSouthWest().lng() + '&maxLong=' + bounds.getNorthEast().lng(),
      success: function(responseText) {
        if ("" == responseText || null == responseText) {
       	  alert('No restaurants were found in this location. Try zooming out to search a larger area.');
        } else {
          var results = responseText.split("\n");
          if (results[0]) {
            for (var i = 0; i < results.length-1; i++) {
              var data = results[i].split("|");
              if (/^\w+$/.test(data[0]) && /^\d+$/.test(data[1]) && /^\w+$/.test(data[3]) && /^\w+$/.test(data[4]) && /^\w+$/.test(data[5]) && /^[\d\.\-]+$/.test(data[6]) && /^[\d\.\-]+$/.test(data[7])) {
                if (!restaurantsMarkerHash[results[i]]) {
                  restaurantsMarkerHash[results[i]] = createGoogleTypeMarker(new GLatLng(data[6], data[7]), data[0], data[1], data[2], data[3], data[4], data[5], data[8]);
                  map.addOverlay(restaurantsMarkerHash[results[i]]);
                }
              }// else {  Users don't want to see this
                //alert('Invalid data received');
              //}
            }
          }
        }
      },
      error: function() {
//        alert('Internal error. Reverting to standard mode.');
//        showNoscript('mainBody');
//        document.body.style.overflow = 'auto';
//        document.getElementsByTagName('html')[0].style.overflow = '';//TODO What about IE?
      }
    });
  } else {
  	for (var i in restaurantsMarkerHash) {
  	  map.removeOverlay(restaurantsMarkerHash[i]);
  	}
  }

  if ($('#campingsupplies').attr('checked')) {
    $.ajax({
      type: 'GET',
      url: '/cgi-bin/ajax/getcampingsupplies.pl?minLat=' + bounds.getSouthWest().lat() + '&maxLat=' + bounds.getNorthEast().lat() + '&minLong=' + bounds.getSouthWest().lng() + '&maxLong=' + bounds.getNorthEast().lng(),
      success: function(responseText) {
        if ("" == responseText || null == responseText) {
       	  alert('No camping supplies stores were found in this location. Try zooming out to search a larger area.');
        } else {
          var results = responseText.split("\n");
          if (results[0]) {
            for (var i = 0; i < results.length-1; i++) {
              var data = results[i].split("|");
              if (/^\w+$/.test(data[0]) && /^\d+$/.test(data[1]) && /^\w+$/.test(data[3]) && /^\w+$/.test(data[4]) && /^\w+$/.test(data[5]) && /^[\d\.\-]+$/.test(data[6]) && /^[\d\.\-]+$/.test(data[7])) {
                if (!campingsuppliesMarkerHash[results[i]]) {
                  campingsuppliesMarkerHash[results[i]] = createGoogleTypeMarker(new GLatLng(data[6], data[7]), data[0], data[1], data[2], data[3], data[4], data[5], data[8]);
                  map.addOverlay(campingsuppliesMarkerHash[results[i]]);
                }
              }// else {  Users don't want to see this
                //alert('Invalid data received');
              //}
            }
          }
        }
      },
      error: function() {
//        alert('Internal error. Reverting to standard mode.');
//        showNoscript('mainBody');
//        document.body.style.overflow = 'auto';
//        document.getElementsByTagName('html')[0].style.overflow = '';//TODO What about IE?
      }
    });
  } else {
  	for (var i in campingsuppliesMarkerHash) {
  	  map.removeOverlay(campingsuppliesMarkerHash[i]);
  	}
  }

  $('#progress').hide();
}
