// Mapping functions

function loadGMap(where,lat,lon, zoom, markLat, markLon, mapType) {
	
	if (!where) { return }
	
	if (lat + lon == 0) { return }
	
	if (GBrowserIsCompatible()) {

		var map		= new GMap2(document.getElementById(where));
		map.addMapType(G_PHYSICAL_MAP);		
		map.addControl(new GSmallMapControl());
		map.addControl(new GMapTypeControl());
		map.addControl(new GScaleControl());

		zoom		= (zoom>0) ? zoom : 15;
		var point	= new GLatLng(lat, lon);

		var thisMapType;
		switch (mapType) {
			case 'Hybrid':
			thisMapType	= G_HYBRID_MAP;
			break;
			case 'Terrain':
			thisMapType	= G_PHYSICAL_MAP;
			break;
			case 'Satellite':
			thisMapType	= G_SATELLITE_MAP;
			break;
			default:
			thisMapType	= G_NORMAL_MAP;
		};	

		map.setCenter(point, zoom, thisMapType);	
	
		markLat		= (markLat)	? markLat : lat;
		markLon		= (markLon)	? markLon : lon;
		var markPt	= new GLatLng(markLat, markLon);
		var marker	= new GMarker(markPt, {draggable: false});		
		map.addOverlay(marker);
		
		return 1;
	}
	else { return }
};

function loadPublicStationsGMap(map,markers) {

	if (GBrowserIsCompatible()) { 
		var stationsMap	= new GMap2(document.getElementById(map));
		stationsMap.setCenter(new GLatLng(0,0),0); 
		
		stationsMap.addMapType(G_PHYSICAL_MAP);
		stationsMap.addControl(new GLargeMapControl());
		stationsMap.addControl(new GMapTypeControl());
		
		var markerList		= [];	
		var bounds 			= new GLatLngBounds();

		for (var m in markers) {
			var thisM		= markers[m];
			if (!thisM['posn'][0]) continue;
			var thisLat		= parseFloat(thisM['posn'][0]);
			var thisLon		= parseFloat(thisM['posn'][1]);				
			if (isNaN(thisLat) || isNaN(thisLon)) {
				continue;
			}
			
			var thisInfo	= composeInfoWindowViewMsg(thisM['id'], thisM['name'], thisM['publish_url']);
			
			var thisP		= new GLatLng(thisLat,thisLon);
			if (thisP == null) {
				continue;
			}
			bounds.extend(thisP);
			var thisMark	= createMarker(thisP,thisInfo);
			stationsMap.addOverlay(thisMark);
			markerList.push(thisMark);
	
		}
		stationsMap.setZoom(stationsMap.getBoundsZoomLevel(bounds));
		stationsMap.setCenter(bounds.getCenter());		
		stationsMap.setMapType(G_PHYSICAL_MAP);
	}
};
	

function loadStationsGMap(map,markers) {

	if (GBrowserIsCompatible()) { 

		// do this here because call was probably xhr not new page load
		GUnload();

		// map
		var stationsMap	= new GMap2(document.getElementById(map));
		stationsMap.setCenter(new GLatLng(0,0),0);		
		stationsMap.addMapType(G_PHYSICAL_MAP);
		stationsMap.addControl(new GLargeMapControl());
		stationsMap.addControl(new GMapTypeControl());
		stationsMap.addControl(new GScaleControl());

		// markers
		var markerList		= [];	
		var markerBounds 	= new GLatLngBounds();
		for (var m in markers) {
			var thisM		= markers[m];
			if (!thisM['posn'][0]) continue;
			var thisLat		= parseFloat(thisM['posn'][0]);
			var thisLon		= parseFloat(thisM['posn'][1]);				
			if (isNaN(thisLat) || isNaN(thisLon)) {
				continue;
			}
			
			var thisInfo	= compose_infowindowEdit_msg(thisM['id'], thisM['name']);
			
			var thisP		= new GLatLng(thisLat,thisLon);
			if (thisP == null) {
				continue;
			}
			markerBounds.extend(thisP);
			var thisMark	= createMarker(thisP,thisInfo);
			stationsMap.addOverlay(thisMark);
			markerList.push(thisMark);	
		}

		// now that bounds include all markers	
		stationsMap.setCenter(markerBounds.getCenter());		
		stationsMap.setZoom(stationsMap.getBoundsZoomLevel(markerBounds));
		stationsMap.setMapType(G_PHYSICAL_MAP);
	}
};

function compose_infowindowEdit_msg(stationID,stationName) {	
	var info		= [];
	info.push('<h4 align=\"center\">' + stationName + '</h4>');
	info.push('<p align=\"center\">');
	info.push('<span class=\"click_span\" onMouseOver=\"this.style.cursor=\'pointer\'\" ');
	info.push('onclick=\"xhrGet(\'station_xhr\',\'STA:show_id=' + stationID + '\',[{fcn:\'updateItem\',tgt:\'display_div\'},{fcn:\'setItemStyle\',tgt:\'display_div\',sel:\'height\',val:\'auto\'}],0,[],[])\">');
	info.push('Edit Place Details and Map');		
 	info.push('</span></p>'); 		
	info.push('<p align=\"center\">(ID ' + stationID + ')</p>'); 		
	return info.join('');	
};

function compose_infowindowView_msg(stationID,stationName,publishURL) {	
	var info		= [];		
		info.push('<h4 align=\"center\">' + stationName + '</h4>');
		info.push('<p align=\"center\">');
		info.push('<span class=\"click_span\" >');
		info.push('<a href=\'' + publishURL + '\'>');
		info.push('View Place Details and Map');
		info.push('</a></span></p>'); 		
		info.push('<p align=\"center\">(ID ' + stationID + ')</p>'); 		
	return info.join('');
};

function composeInfoWindowViewMsg (stationID,stationName,publishURL) {
	var infoArray	= [
		'<h4 align=\"center\">',
		stationName,
		'<\/h4>',
		'<p align=\"center\">',
		'<span class=\"click_span\" >',
		'<a href=\"',
		publishURL,
		'\">',
		'View Place Details and Map',
		'<\/a><\/span><\/p>',
		'<p align=\"center\">(ID ',
		stationID,
		')<\/p>'
	];

	return infoArray.join('');
}

function createMarker(markPoint,markName) {
	var newMarker	= new GMarker(markPoint);
	GEvent.addListener(newMarker, 'click', function() {
		newMarker.openInfoWindowHtml(markName);
	});
	return newMarker;
};

function createTitledMarker(markPoint,markTitle,markName) {
	var newMarker	= new GMarker(markPoint,{title:markTitle});
	GEvent.addListener(newMarker, 'click', function() {
		newMarker.openInfoWindowHtml(markName);
	});
	return newMarker;
};

// converter - Object constructor for coordinate converter
// call with "new converter()".
// See prototypes below for methods.

function converter () {
   this.latsign = 1;
   this.lonsign = 1;
   this.absdlat = 0;
   this.absdlon = 0;
   this.absmlat = 0;
   this.absmlon = 0;
   this.absslat = 0;
   this.absslon = 0;

   //Math.round is used to eliminate the small error caused by rounding in the computer:
   //e.g. 0.2 is not the same as 0.20000000000284
   this.round_factor =    10000000000;
   this.comp_factor     = 59.99999999

};

converter.prototype.reset = function () {
   this.latsign = 1;
   this.lonsign = 1;
   this.absdlat = 0;
   this.absdlon = 0;
   this.absmlat = 0;
   this.absmlon = 0;
   this.absslat = 0;
   this.absslon = 0;
	
}


// End Mapping Functions


