/*	Range Modelling Application, v.0.1
	Carlos Labs Pty, 2009-2010
	PID: 200910A, http://www.carloslabs.com

	This code is released under a Creative Commons license. 
	http://creativecommons.org/licenses/by/3.0/legalcode
	
	You may use this code in any software project, provided you	do not remove or 
	modify this header and you credit us as the original authors of the code.
*/

function loadMap(mbj) {
  if (GBrowserIsCompatible()) {
    		
	mslapp.map = new GMap2(document.getElementById("mapview"));		
	mbj.map_name.length < 1 ? "Find a location" : mbj.map_name;
		  				  		
	mslapp.map.setCenter(new google.maps.LatLng(mbj.map_lat, mbj.map_lng), parseInt(mbj.sys_zoom));
		  		
	mslapp.map.setMapType(G_HYBRID_MAP);

    var opt = {
		searchFormHint : mbj.map_name,
      	suppressInitialResultSelection : true,
      	resultList : google.maps.LocalSearch.RESULT_LIST_SUPPRESS,
		onMarkersSetCallback : markersSet_callback
    };

	mslapp.map.addControl(new google.maps.LocalSearch(opt), new GControlPosition(G_ANCHOR_TOP_RIGHT,  new GSize(6,8)));
	mslapp.map.addControl(new GSmallZoomControl3D());        
	mslapp.map.addControl(new GScaleControl(),  new GControlPosition(G_ANCHOR_BOTTOM_LEFT,  new GSize(228,25)));

	GEvent.addListener(mslapp.map, "dragend", function() {
		mslapp.center = mslapp.map.getCenter();
		//alert('lat: ' + mslapp.center.lat().toString() + ' long:' + mslapp.center.lng().toString());
	});
	GEvent.addListener(mslapp.map, "click", function(overlay, point)  {		
		mbj.sys_lat = point.lat().toString();
		mbj.sys_lng = point.lng().toString();
		//alert('lat: ' + mbj.sys_lat + ' long:' + mbj.sys_lng);
		mapRange(mbj);
	});
	
	GEvent.addListener(mslapp.map, "singlerightclick", function(point, source, overlay)  {			
		//clearAll(); // disabled
	});				
  }
  else
  	alert("e200: your browser does not support Google Maps");
}
function markersSet_callback()	{
	mslapp.center = mslapp.map.getCenter();
	clearAll();
	return 1;
};
function radians(degrees) {
	return degrees*Math.PI/180;		}
function cX(x, radius, angle) {
	return x + radius * Math.cos(radians(angle));	}
function cY(y, radius, angle) {
	return y + radius * Math.sin(radians(angle));	}
function latscale(latitude) {
	var m1 = 111132.92;
	var m2 = -559.82;
	var m3 = 1.175;
	var m4 = -0.0023;
	var lat = radians(latitude);
	var latlen = m1 + (m2 * Math.cos(2 * lat)) + (m3 * Math.cos(4 * lat)) + (m4 * Math.cos(6 * lat));
	return (latlen / 1000);
}
function lonscale(latitude) {
	var p1 = 111412.84;
	var p2 = -93.5;
	var p3 = 0.118;
	var lat = latitude * ((2.0 * Math.PI)/360.0);
	var longlen = (p1 * Math.cos(lat)) + (p2 * Math.cos(3 * lat)) + (p3 * Math.cos(5 * lat));
	return (longlen / 1000);
}
function buildInfo(mbj)	{
	document.getElementById('text_content').innerHTML = ' <b>'+ mbj.sys_name.toString() + '</b>: ' + mbj.sys_desc.toString();
}	
function mapRange(mbj)	{
	var err = "";
	var vX = 0, vY = 0; step = 36;
	var polyOptions = {clickable:false,geodesic:true};	
	var a0 = new Array();a1 = new Array();
	var h_text = '<div class="h_text"><b>'+ mbj.sys_name.toString() + '</b><br>' + mbj.sys_desc.toString() + '<p>';
	h_text += '<b><a href="' + mbj.sys_uri.toString() + '" target="_blank">Click here to read more</a></b></div>';
	for (var i = 0; i < (step+1); i++) {
		vX = cX(parseFloat(mbj.sys_lat), parseFloat(mbj.sys_rng) / latscale(parseFloat(mbj.sys_lat)), (i * (360 / step)));
		vY = cY(parseFloat(mbj.sys_lng), parseFloat(mbj.sys_rng) / lonscale(parseFloat(mbj.sys_lat)), (i * (360 / step))); 
		a0[i] = new GLatLng(vX, vY);
		vX = cX(parseFloat(mbj.sys_lat), parseFloat(0.2) / latscale(parseFloat(mbj.sys_lat)), (i * (360 / step)));
		vY = cY(parseFloat(mbj.sys_lng), parseFloat(0.2) / lonscale(parseFloat(mbj.sys_lat)), (i * (360 / step))); 
		a1[i] = new GLatLng(vX, vY);		
	}
		
	mslapp.map.addOverlay(new GPolygon(a0, "#ff9933", 1, 0.75, "#ff9933", 0.5, polyOptions ));
	mslapp.map.addOverlay(new GPolygon(a1, "#aa4444", 1, 1, "#aa4444", 1, polyOptions ));	
	buildInfo(mbj);
	return 1;
}

function clearAll() {
	mslapp.map.clearOverlays();		
	mslapp.map.closeInfoWindow();
	return 1;
}   