/* 
Javascript for controlling Google Maps on Wildernet.com
Last update October 14, 2011
by terrill@terrillthompson.com
*/ 

var map;
var geocoder=null;
var zoom;
var oldZoom;
var markers = new Array();
var debug=false; 

function loadMap(latitude, longitude, zoom, mapType, areaID){
	// example params: 46.8545565389,-121.7628479,11,"navigation","WANPSMORA"
	var newCenter = new google.maps.LatLng(latitude, longitude);
	var mapTypes = [
		google.maps.MapTypeId.TERRAIN,
		google.maps.MapTypeId.ROADMAP,
		google.maps.MapTypeId.SATELLITE,
		google.maps.MapTypeId.HYBRID,
		'TOPO'
	];
	var myOptions = {
		zoom: zoom,
		center: newCenter,
		mapTypeControlOptions: {
			mapTypeIds: mapTypes
		}
	}
	map = new google.maps.Map(document.getElementById("map"),myOptions);

	//define myTopo map type
	var mytopoMap = new google.maps.ImageMapType({
		getTileUrl: function(ll, z) {
			return "http://maps.mytopo.com/wildernet/tilecache.py/1.0.0/topoG/" + z + "/" + ll.x + "/" + ll.y + ".jpg";
		},
		tileSize: new google.maps.Size(256, 256),
		isPng: true,
		maxZoom: 15,
		minZoom: 9,
		name: "Topo",
		alt: "Detailed topographic maps"
	}); 
	//add it to the available mapTypes
	map.mapTypes.set('TOPO', mytopoMap);
	
	//set the default MapType
	map.setMapTypeId(google.maps.MapTypeId.TERRAIN);

	google.maps.event.addListener(map,'idle', function(event) { 
		//wait until map is ready before adding markers or other features
		//there is no 'movend' event in v3, and 'dragend' does not fire after a zoom
		//idle is fired "when the map becomes idle after panning or zooming"
		oldZoom = zoom;
		zoom = map.getZoom();
		showMarkers(zoom,oldZoom,mapType,areaID);
		if (mapType == 'areaEditor' || mapType == 'activityEditor') { 
			var center = map.getCenter();
			var centerLat = center.lat();
			var centerLng = center.lng();
			document.getElementById("newLat").value = centerLat.toString();
			document.getElementById("newLong").value = centerLng.toString();
			document.getElementById("newZoom").value = zoom.toString();
			document.getElementById("newZoom2").value = zoom.toString();
		}
	});
}
	
function showMarkers(zoom, oldZoom, mapType, areaID) { 

	// if zooming out, clear existing markers 
	if (zoom < oldZoom) clearMarkers();

	var url = createURL('getAll', zoom, oldZoom, mapType, areaID);
	downloadUrl(url, function(data, responseCode) {
		var markers = data.documentElement.getElementsByTagName("marker");
		if (markers.length > 0) { 
			for (var i = 0; i < markers.length; i++) {
				var markerID = markers[i].getAttribute("id");
				var markerName = markers[i].getAttribute("name");
				var markerType = markers[i].getAttribute("type");
				var markerWeight = markers[i].getAttribute("numVisits"); // just in case 
				var markerLat = parseFloat(markers[i].getAttribute("lat"));
				var markerLng = parseFloat(markers[i].getAttribute("long"));
				if (markerLat && markerLng) { 
					var point = new google.maps.LatLng(markerLat,markerLng);
					createMarker(point,markerID,markerName,markerType);
				}
			}
		}
		else { 
			var feedback = '<p><strong>Sorry, there are no areas or activities ';
			feedback += 'to display on this map. Try zooming out, ';
			feedback += 'or move to another location on the map.</strong></p>'; 
			if (debug) { 
				if (document.getElementById("msg")) { 
					document.getElementById("msg").innerHTML = feedback.toString();
				}
			}
		}
	});
}

function clearMarkers() { 
	for(var i = 0; i < markers.length; i++) {
		markers[i].setMap(null);
	}
}

function createMarker(point,markerID,markerName,markerType) {
	var marker = new google.maps.Marker({
		position: point, 
		map: map,
		title: markerName
	});
	if (markerType == "area") 
		var link = "/pages/area.cfm?areaID=" + markerID;
	else if (markerType == "activity")
		var link = "/pages/activity.cfm?actid=" + markerID;
	else if (markerType == "editTrip")
		var link = "/pages/editTrip.cfm?actid=" + markerID;  
	if (typeof link != 'undefined') { 
		google.maps.event.addListener(marker, 'click', function(event) {
			// If map is in an iframe, this doesn't open link in parent:  
			// window.location = link;
			// but this does: 
			window.open(link,'_top');
		});
	}
	markers.push(marker);
} 

function createURL(queryChoice, zoom, oldZoom, mapType, areaID) { 
	var bounds = map.getBounds();
	var southWest = bounds.getSouthWest();
	var northEast = bounds.getNorthEast();
	var span = bounds.toSpan(); 
	var swLat = southWest.lat(); 
	var swLong = southWest.lng();
	var neLat = northEast.lat();
	var neLong = northEast.lng();
	var latSpan = span.lat();
	var longSpan = span.lng();
	if (mapType == "tripReport") 
		var url = "/util/getTripReportMarkers.cfm";
	else if (mapType == "findActivity")
		var url = "/util/getActivityMarkers.cfm";
	else if (mapType == "findDestination")
		var url = "/util/getDestinationMarkers.cfm";
	else if (mapType == "subarea")
		var url = "/util/getSubAreaMarkers.cfm";
	else
		var url = "/util/getMarkers.cfm";
	url += "?queryChoice="+queryChoice;
	url += "&areaID=" + areaID;
/*	
	<cfif isDefined('url.recType')>
		url += "&rectype=" + <cfoutput>"#URLEncodedFormat(url.recType)#"</cfoutput>;
	</cfif>
*/	
	url += "&type=" + mapType;
	url += "&zoom=" + zoom;
	url += "&oldZoom=" + oldZoom;
 	url += "&swLat=" + swLat;
	url += "&swLong=" + swLong;
	url += "&neLat=" + neLat;
	url += "&neLong=" + neLong;
	return url;
}

// GDownloadURL not supported in Google Maps v3 
// The following four functions provide the same functionality
// Source: http://gmaps-samples-v3.googlecode.com/svn/trunk/xmlparsing/downloadurl.html

function createXmlHttpRequest() {
 try {
   if (typeof ActiveXObject != 'undefined') {
     return new ActiveXObject('Microsoft.XMLHTTP');
   } else if (window["XMLHttpRequest"]) {
     return new XMLHttpRequest();
   }
 } catch (e) {
   changeStatus(e);
 }
 return null;
};

function downloadUrl(url, callback) {
 var status = -1;
 var request = createXmlHttpRequest();
 if (!request) {
   return false;
 }

 request.onreadystatechange = function() {
   if (request.readyState == 4) {
     try {
       status = request.status;
     } catch (e) {
       // Usually indicates request timed out in FF.
     }
     if (status == 200) {
       callback(request.responseXML, request.status);
       request.onreadystatechange = function() {};
     }
   }
 }
 request.open('GET', url, true);
 try {
   request.send(null);
 } catch (e) {
   changeStatus(e);
 }
};

function xmlParse(str) {
  if (typeof ActiveXObject != 'undefined' && typeof GetObject != 'undefined') {
    var doc = new ActiveXObject('Microsoft.XMLDOM');
    doc.loadXML(str);
    return doc;
  }

  if (typeof DOMParser != 'undefined') {
    return (new DOMParser()).parseFromString(str, 'text/xml');
  }

  return createElement('div', null);
}

function downloadScript(url) {
  var script = document.createElement('script');
  script.src = url;
  document.body.appendChild(script);
}
//end GDownloadURL workaround


