// Global geo_maps array and array size
var geo_maps = new Array(); 
var num_maps = 0;
var geo_map; 

// Creates a map 
function geopress_makemap(map_id, name, lat, lon, map_format, map_type, map_controls, map_zoom) {
  num_maps = geo_maps.push(new Mapstraction("geo_map" + map_id, map_format)) - 1;
  var myPoint = new LatLonPoint(lat, lon);
  geo_maps[num_maps].addControls(map_controls);
  geo_maps[num_maps].setCenterAndZoom(myPoint, map_zoom);
  geo_maps[num_maps].setMapType(map_type);
  var marker = new Marker(myPoint);
  marker.setInfoBubble(name);
  geo_maps[num_maps].addMarker(marker);
}
function geopress_setmap() {
	geo_map.removeAllMarkers();
	var myPoint = new LatLonPoint(30,-90);
	geo_map.setCenterAndZoom(myPoint, 8);
	var marker = new Marker(myPoint);
	marker.setInfoBubble("@ Pointed");
	geo_map.addMarker(marker);
}

// @todo - make this use a Mapstraction geocoder or geocoder independent
 var geocoder = new GClientGeocoder();

// addPointToMap() adds a marker at a specific point from either 
// a geocoder response or the user clicking on the map. 
// @todo handle drawing polylines
function addPointToMap(point) {
	geo_map.removeAllMarkers();
	marker = new Marker(point);
	geo_map.setCenterAndZoom(point,10);
	marker.setInfoBubble(point.toString());
	geo_map.addMarker(marker);
}
 // addAddressToMap() is called when the geocoder returns an
 // answer.  It adds a marker to the map with an open info window
 // showing the nicely formatted version of the address and the country code.
function addAddressToMap(response) {
//   map.clearOverlays();
  if (!response || response.Status.code != 200) {
    alert("Sorry, we were unable to geocode that address");
  } else {
    place = response.Placemark[0];
    point = new LatLonPoint(place.Point.coordinates[1],
                        place.Point.coordinates[0]);
    addPointToMap(point);
  }
}

 // showLocation() is called when you click on the Search button
 // in the form.  It geocodes the address entered into the form
 // and adds a marker to the map at that location.
function showLocation() {
	var address = document.forms[0].addr.value;
	if(address) {
		// If the 'address' is just points, map them
   		if(matches = address.match(/\[(.+),[ ]?(.+)\]/)) {
			setMapPoint(new LatLonPoint(matches[1], matches[2]));
		} else {
			geocoder.getLocations(address, addAddressToMap);
		}
	}
}

function geocode() {
	document.forms[0].locname.value = "";
	showLocation();   
}
// findLocation() is used to enter the sample addresses into the form.
function findLocation(address) {
	document.forms[0].addr.value = address;
	showLocation();
}
var gPoint;
// setMapPoint() handles a user clicking on a map
function setMapPoint(point) {
	document.forms[0].addr.value = "[" + point + "]";
	geo_map.removeAllMarkers();
	addPointToMap(point);
}

function resetMap() {
	geo_map.setCenterAndZoom(new LatLonPoint(0,0),1);
}

// used to register onload events to the body 
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; 
 } 
}

// Handles loading a saved address
function geopress_loadsaved(oSel) { 

   var addr = oSel.options[oSel.selectedIndex].value;
   var name = oSel.options[oSel.selectedIndex].text;
   
   addrobj = document.getElementById("addr");
   locnameobj = document.getElementById("locname");
   addrobj.value = addr;
   locnameobj.value = name;

   oSel.selectedIndex = 0;
}
function checkEnter(e,elem){ //e is event object passed from function invocation
	var characterCode;// literal character code will be stored in this variable

	if(e && e.which){ //if which property of event object is supported (NN4)
		e = e
		characterCode = e.which //character code is contained in NN4s which property
	}
	else{
		e = event
		characterCode = e.keyCode //character code is contained in IEs keyCode property
	}

	if(characterCode == 13){ //if generated character code is equal to ascii 13 (if enter key)
		geocode();				
		return false
	}
	else{
		return true
	}
}

//
// Map Configuration Functions
//
// Handles changing the map controls
function geopress_change_controls(oSel) { 

	var map_controls_pan = document.getElementById("map_controls_pan").checked;
	var map_controls_zoom = document.getElementById("map_controls_zoom").value;
	var map_controls_overview = document.getElementById("map_controls_overview").checked;
	var map_controls_map_type = document.getElementById("map_controls_map_type").checked;
	var map_controls_scale = document.getElementById("map_controls_scale").checked;
	geo_map.addControls({
		pan:      map_controls_pan,
		zoom:     map_controls_zoom,
		overview: map_controls_overview,
		scale:    map_controls_scale,
		map_type: map_controls_map_type
	});
}
// Handles changing the map format
function geopress_change_map_format() { 

	var map_format = document.getElementById("map_format").value;
	geo_map.swap(map_format);
}
// Handles changing the map view type (street, satellite, hybrid)
function geopress_change_view() { 

	var type_string = document.getElementById("map_view_type").value;
	var type;
	switch(type_string) {
		case "satellite":
			type = Mapstraction.SATELLITE;
			break;
		case "road":
			type = Mapstraction.ROAD;
			break;
		case "hybrid":
			type = Mapstraction.HYBRID;
			break;
		default :
			type = Mapstraction.HYBRID;
			break;
	}
	geo_map.setMapType(type);

}
// Handles changing the map default zoom level
function geopress_change_zoom() { 

	var zoom_level = document.getElementById("default_zoom_level").value;
	geo_map.setZoom(zoom_level);

}
