var sInitAddress;
var sInitLat;
var sInitLong;

var sInitEndAddress;
var sInitEndLat;
var sInitEndLong;
var sAction;
var sEmptyStringColor;
var sValueSetColor;

var directionDisplay;
var directionsService = new google.maps.DirectionsService();

var geocoder;
var map;
var localSearch;
var editTimeOut;

var startMarker;
var endMarker;

var bDoRouting = false;
var iSiteZoom = 15;
var bAddressFound = false;

/*initialize the map interface by setting the Startup Address*/
function setDefaultValue( item ){
	item.value = item.defaultValue; //"Address";

	var style = getIdStyleObj(item.id);
	style.color = sEmptyStringColor;
}
function setActualValue( item, value ){
	item.value = value;
	
	var style = getIdStyleObj(item.id);
	style.color = sValueSetColor;
}
function initialize() {
	if ( sAction == "routing" ) {
		bDoRouting = true;
	}

	var myOptions = {
	    	zoom: iSiteZoom,
	    	center: null,
	    	mapTypeId: google.maps.MapTypeId.ROADMAP
	  	};
	map = new google.maps.Map(getIdObj("map_canvas"), myOptions);
	if ( bDoRouting ) { 
		var options = {
			map: map,
			panel: document.getElementById("directionsPanel")
   	  	};
   		directionsDisplay = new google.maps.DirectionsRenderer(options);
	}
		
	google.maps.event.addListener(map, 'click', 
	  	function(event) {
			placeMarkerOnClick(event.latLng);
		}
	);

	if ( sAction == "view" ){
		if ( sInitLat != null && sInitLong !=null 
				&& sInitLat.length > 0 && sInitLong.length > 0 
				&& sInitLat != "Latitude" && sInitLong != "Longitude" ){
			doAddressLookup( sInitLat + " " + sInitLong, doStartUpAddresses);
		}
		else if ( sInitAddress != null && sInitAddress.length > 0 && sInitAddress != "Address") {
	  		doAddressLookup(sInitAddress, actionUpdateStartAddress);
		}
	}
	else {
		if ( sInitLat != null && sInitLong !=null 
				&& sInitLat.length > 0 && sInitLong.length > 0
				&& sInitLat != "Latitude" && sInitLong != "Longitude" ){
			doAddressLookup( sInitLat + " " + sInitLong, doStartUpAddresses);
		}
		else if ( sInitAddress != null && sInitAddress.length > 0 && sInitAddress != "Address" ) {
	  		doAddressLookup(sInitAddress, doStartUpAddresses);
		}
		else {
			if ( sInitEndLat != null && sInitEndLong !=null 
					&& sInitEndLat.length > 0 && sInitEndLong.length > 0 
					&& sInitEndLat != "Latitude" && sInitEndLong != "Longitude"){
				doAddressLookup( sInitEndLat + " " + sInitEndLong, actionUpdateEndAddress);
			}
			else if ( sInitEndAddress != null && sInitEndAddress.length > 0 && sInitEndAddress != "Address"  ) {
		  		doAddressLookup(sInitEndAddress, doUpdateEndMarker);
			}
		}
	}
		
	if ( !bAddressFound ) {
		setEmptyMap();
	}
}
/* Set the map defaults*/
function setEmptyMap(){
	var point = new google.maps.LatLng(-0.000000, 0.000000);
	map.setZoom(2);
	map.setCenter(point);
	
}
/* Start the Key down timeout counter */
function startEditTimer( target ){
	if ( editTimeOut )
		clearTimeout(editTimeOut);
	editTimeOut = setTimeout(target, 2000);
}

/* Center between start and destination */
function doCenter(){
	if ( endMarker && startMarker ) {
		var endPoint = endMarker.getPosition();
		var startPoint = startMarker.getPosition();

		var iLat1 = endPoint.lat() / 2;
		var iLat2 = startPoint.lat() / 2;
		
		var iLng1 = endPoint.lng() / 2;
		var iLng2 = startPoint.lng() / 2;

		var centerPoint = new google.maps.LatLng(iLat1 + iLat2, iLng1 + iLng2);
		map.setCenter(centerPoint);
	}
}

/* Caculate the zoom level */
function doZoomAndCenter(){
	if ( endMarker && startMarker ) { 
		var startPoint = startMarker.getPosition();
		var endPoint = endMarker.getPosition();
				
		var bounds = new google.maps.LatLngBounds();
		bounds.extend(startPoint);
		bounds.extend(endPoint);
		map.fitBounds(bounds);

		//map.setCenter(bounds.getCenter());
		doCenter();
	} else if ( startMarker ){
		map.setZoom(15);
		map.setCenter(startMarker.getPosition());
	} else if ( endMarker ){
		map.setZoom(15);
		map.setCenter(endMarker.getPosition());
	} 
}

/* lookup the address details including coordinates */
function doAddressLookup( address, callback ){
	if ( !localSearch ) {
		localSearch = new GlocalSearch();
	}

	if ( !callback )
		callback = doAddressResponse;
	localSearch.setSearchCompleteCallback(null,callback);
	bAddressFound = false;  
	localSearch.execute(address);
}
function doStartUpAddresses(){
	actionUpdateStartAddress();
	//doUpdateStartMarker();
	
	var bFoundCache = bAddressFound;
	if ( sInitEndLat != null && sInitEndLong !=null && sInitEndLat.length > 0 && sInitEndLong.length > 0 ){
		doAddressLookup( sInitEndLat + " " + sInitEndLong, actionUpdateEndAddress);
	}
	else if ( sInitEndAddress != null && sInitEndAddress.length > 0 ) {
  		doAddressLookup(sInitEndAddress, doUpdateEndMarker);
	}
	if ( !bAddressFound ) {
		bAddressFound = bFoundCache;
	}
}

/*Place a Marker on the Location*/
function placeMarkerOnClick(location) {
	var iLat = roundNumber(location.lat(),7);
	var iLng = roundNumber(location.lng(),7);

	var obj = getIdObj("trackstart");
		if ( obj && obj.checked ){
			setActualValue(getIdObj("startlat"),iLat);
			setActualValue(getIdObj("startlong"),iLng);
    	
			var sStart = getStartPoint();
			doAddressLookup( sStart, actionUpdateStartAddressNoCenter );
		}

		obj = getIdObj("trackend");
		if ( obj && obj.checked ){
			setActualValue(getIdObj("endlat"),iLat);
			setActualValue(getIdObj("endlong"),iLng);			
    	
			var sEnd = getEndPoint();
			doAddressLookup( sEnd, actionUpdateEndAddressNoCenter );
		}
}
/*Place a Marker on the Location*/
function placeMarkerOnPoint(iLat, iLng, title) {
	var point = new google.maps.LatLng(iLat,iLng);

	map.setCenter(point);
	startMarker = new google.maps.Marker({
		map: map,
		position: point,
		title: title
	});
}	

/*Calculate the Address text from the Location result set*/ 
function doCompileResultAddress( locationResult, doCoordinates ){
   	var result = locationResult.streetAddress + 
   				"\n " + locationResult.city + 
   				"\n " + locationResult.postalCode + 
   				"\n " + locationResult.region + 
   				"\n " + locationResult.country;
	if ( doCoordinates ) {
	  		result = result + ", Latitude: " + locationResult.lat +
  						  ", Longitude: " + locationResult.lng;
	}
	return result;
}

function doAddressResponse(){
  	if (localSearch.results[0]) {    
    	var resultLat = localSearch.results[0].lat;
    	var resultLng = localSearch.results[0].lng;
    	var point = new google.maps.LatLng(resultLat,resultLng);

    	map.setCenter(point);
		var marker = new google.maps.Marker({
    		map: map, 
    		position: point
		});

   	}else{
    	alert("Address not found!");
  	}
}

function getStartPoint(){
	var lat = getIdObj("startlat").value;
	var lng = getIdObj("startlong").value;
	if ( lat.length >= 4 && lng.length >= 4 ){
		var iLat = fixNum(lat);
		var iLng = fixNum(lng);
		return new google.maps.LatLng(iLat,iLng);
	} 
	var start = lat + " " + lng;
	if ( start.length < 3 )
		start = null;
	return start;
}

/*Set the Start point marker and the coordinates without updating the address*/
function doUpdateStartMarker(){
	doStartUpdate( false );
}
/*Set the Start point marker from coordinates*/
function doUpdateStartCoords(){
	doStartUpdate( true );
}
/* doStartUpdate */
function doStartUpdate( bFromCoords ){
	var oLat = getIdObj("startlat");
	var oLong = getIdObj("startlong");
	
  	if (localSearch.results[0]) {
  		bAddressFound = true;    
    	var resultLat = localSearch.results[0].lat;
    	var resultLng = localSearch.results[0].lng;
    	if ( !bFromCoords && oLat && oLong ) {
      		setActualValue(oLat, roundNumber(resultLat, 7));
      		setActualValue(oLong, roundNumber(resultLng, 7));    		
    	}
    		
    	var point = new google.maps.LatLng(resultLat,resultLng);
    	var sText = doCompileResultAddress(localSearch.results[0], true);
			objPanel = getIdObj("endPanel");
			if ( bDoRouting ) {
	  			sText = "Origin - " + sText;
			} 
    	setStartAndCenter(point, sText);
  	}
  	else  if ( !bFromCoords && oLat && oLong ) {
  		//oLat.value = "";
  		//oLong.value = "";
  		setDefaultValue(oLat);
  		setDefaultValue(oLong);
  	}
}

/* Update the Start Address from the Address lookup and set the marker */
function actionUpdateStartAddress(){
	doUpdateStartAddress(true);
}
function actionUpdateStartAddressNoCenter(){
	doUpdateStartAddress(false);
}
function doUpdateStartAddress( doCenter ){
	//var iCount = localSearch.results.length;
  	if (localSearch.results[0]) {    
  		bAddressFound = true;
    	var result = doCompileResultAddress(localSearch.results[0], false);
		var resultNew = result;
    	
    	var resultLat = localSearch.results[0].lat;
    	var resultLng = localSearch.results[0].lng;
    	var point = new google.maps.LatLng(resultLat,resultLng);

    	result = result + ", Latitude: " + resultLat +
		  				  ", Longitude: " + resultLng;
    	if ( bDoRouting ) {
			result = "Origin - " + result;
        }
    	setStart(point, result, doCenter );

    	var oStart = getIdObj("start");
    	if ( oStart )
    		//oStart.value = resultNew;
    		setActualValue(oStart,resultNew);	
  	}
  	else {
  	  	var oLat = getIdObj("startlat");
  	  	var oLng = getIdObj("startlong");
  	  	var iLat = 0;
  	  	var iLng = 0;

  	  	if ( oLat && oLng ) {
			var lat = oLat.value;
			var lng = oLng.value;
			if ( lat.length >= 4 && lng.length >= 4 ){
				setDefaultValue(getIdObj("start"));
				iLat = fixNum(lat);
	    		iLng = fixNum(lng);
			}
  	  	}
  	  	else if ( sInitLat.length >= 4 && sInitLong.length >= 4 ){
			iLat = fixNum(sInitLat);
    		iLng = fixNum(sInitLong);
  	  	}
				
		var point = new google.maps.LatLng(iLat,iLng);
		var result = "Latitude: " + iLat + ", Longitude: " + iLng;
		if ( bDoRouting ) {
			result = "Origin - " + result;
        }
		setStart(point, result, doCenter );
  	}
}

/*Place the Origin marker on the map*/
function setStartAndCenter( point, text ){
	setStart( point, text, true );
}
function setStart( point, text, doCenter ){
	if ( !startMarker ) {
		startMarker = new google.maps.Marker({
    		map: map,
    		position: point,
    		title: text
		});
	}
	else {
		startMarker.setPosition( point );
		startMarker.setTitle( text );
	}

	if ( doCenter )
		doZoomAndCenter();
}

/* Stop the Start Coordinate Key down timeout counter */
function doActionCoordinateStart(){
	clearTimeout(editTimeOut);
	var lat = getIdObj("startlat").value;
	var lng = getIdObj("startlong").value;
	if ( lat.length >= 4 && lng.length >= 4 ){
		doAddressLookup(lat + " " + lng, actionUpdateStartAddress);
	}	
}

function doCoordinatesStart( lat, lng ){
	if ( lat.length >= 4 && lng.length >= 4 ){
		doAddressLookup(lat + " " + lng, doStartUpAddresses);
	}	
}

function doCoordinatesEnd( lat, lng ){
	if ( lat.length >= 4 && lng.length >= 4 ){
		doAddressLookup(lat + " " + lng, actionUpdateEndAddress);
	}	
}

function doActionStart(){
	clearTimeout(editTimeOut);
	var address = getIdObj("start").value;
	doAddressLookup( address, doUpdateStartMarker );
}

/* Switch the checkboxes */
function doSelectClickTarget(obj){
	if ( obj.checked ){
		var obj2;
		if ( obj.id == "trackstart" ) {
			obj2 = getIdObj("trackend");
			if ( obj2!=null )
				obj2.checked = false;
		}
		else {
			obj2 = getIdObj("trackstart");
			if ( obj2!=null )
				obj2.checked = false;
		}
	}
}

/**
Use this when you are going to do routing
*/
function getEndPoint(){
	var lat = getIdObj("endlat").value;
	var lng = getIdObj("endlong").value;
	if ( lat.length >= 4 && lng.length >= 4 ){
		var iLat = fixNum(lat);
		var iLng = fixNum(lng);
		return new google.maps.LatLng(iLat,iLng);
	} 

	var end = lat + " " + lng;
	if ( end.length < 3 )
		end = null;
	return end;
}	
/*Place the Destination marker on the map*/
function setEndAndCenter( point, text ){
	setEnd( point, text, true );
}
function setEnd( point, text, doCenter ){
	if ( !endMarker ) {
		endMarker = new google.maps.Marker({
    		map: map,
    		position: point,
    		title: text
		});
	}
	else {
		endMarker.setPosition( point );
		endMarker.setTitle( text );
	}

	if ( doCenter )
		doZoomAndCenter();
}
/* Update the End Address from the Address lookup and set the Marker*/
function actionUpdateEndAddress(){
	doUpdateEndAddress(true);
}
function actionUpdateEndAddressNoCenter(){
	doUpdateEndAddress(false);
}
function doUpdateEndAddress(doCenter){
  	if (localSearch.results[0]) {
  		bAddressFound = true;    
    	var result = doCompileResultAddress(localSearch.results[0], false);

		setActualValue(getIdObj("end"),result);	

    	var resultLat = localSearch.results[0].lat;
    	var resultLng = localSearch.results[0].lng;
    	var point = new google.maps.LatLng(resultLat,resultLng);

    	result = result + ", Latitude: " + resultLat +
		  				  ", Longitude: " + resultLng;
    	
    	setEnd(point, "Destination - " + result, doCenter);
  	}
  	else {
  	  	var oLat = getIdObj("endlat");
  	  	var oLng = getIdObj("endlong");
  	  	var iLat = 0;
  	  	var iLng = 0;

  	  	if ( oLat && oLng ) {
			var lat = oLat.value;
			var lng = oLng.value;
			if ( lat.length >= 4 && lng.length >= 4 ){
				//getIdObj("end").value = "";
				setDefaultValue(getIdObj("end"));
				iLat = fixNum(lat);
	    		iLng = fixNum(lng);
			}
  	  	}
  	  	else if ( sInitLat.length >= 4 && sInitLong.length >= 4 ){
			iLat = fixNum(sInitEndLat);
    		iLng = fixNum(sInitEndLong);
  	  	}
				
		var point = new google.maps.LatLng(iLat,iLng);
		var result = "Latitude: " + iLat + ", Longitude: " + iLng;
		if ( bDoRouting ) {
			result = "Destination - " + result;
        }
		setEnd(point, result, doCenter );		
  	}
}
/*Set the End point marker without updating the address*/
function doUpdateEndMarker(){
	doEndUpdate( false );
}
/*Set the End point marker from coordinates*/
function doUpdateEndCoords(){
	doEndUpdate( true );
}
/* doEndUpdate */
function doEndUpdate( bFromCoords ){
	var oLat = getIdObj("endlat");
	var oLong = getIdObj("endlong");
	
  	if (localSearch.results[0]) {
  		bAddressFound = true;
    	var resultLat = localSearch.results[0].lat;
    	var resultLng = localSearch.results[0].lng;
    	if ( !bFromCoords && oLat && oLong ) {
    		setActualValue(oLat, roundNumber(resultLat, 7));
    		setActualValue(oLong, roundNumber(resultLng, 7));
    	}

    	var point = new google.maps.LatLng(resultLat,resultLng);
    	setEndAndCenter(point, "Destination - " + doCompileResultAddress(localSearch.results[0]), false);
  	}
  	else if ( !bFromCoords && oLat && oLong  ) {
  		setDefaultValue(oLat);
  		setDefaultValue(oLong);
  	}		
}
/* Stop the End Address Key down timeout counter */
function doActionEnd(){
	clearTimeout(editTimeOut);
	var address = getIdObj("end").value;
	doAddressLookup( address, doUpdateEndMarker );	
}
/* Stop the End Coordinate Key down timeout counter */
function doActionCoordinateEnd(){
	clearTimeout(editTimeOut);
	var lat = getIdObj("endlat").value;
	var lng = getIdObj("endlong").value;
	if ( lat.length >= 4 && lng.length >= 4 ){
		doAddressLookup(lat + " " + lng, actionUpdateEndAddress);
	}	
}
/* Calculate the route from the Start Point to the destination.	*/
function calcRouteAuto() {
    var start = getStartPoint();
    if ( !start ) { 
		start = getIdObj("start").value;
	}
	
    var end = getEndPoint();
    if ( !end ) {
		end = getIdObj("end").value;
	}

  	getIdStyleObj("map_canvas").width = "70%";
  	getIdStyleObj("directionsPanel").width = "29%";
	    
    var request = {
        origin:start, 
        destination:end,
        travelMode: google.maps.DirectionsTravelMode.DRIVING,
	provideRouteAlternatives: true
    };
    //,
    //    provideTripAlternatives: true
    //waypoints: can add way points
    
    directionsService.route(request, 
    	    function(response, status) {
      			if (status == google.maps.DirectionsStatus.OK) {
				if (!response.routes[0].copyrights) {
				        response.routes[0].copyrights = "Copyrights IDH.Maps.";
      				} 

	      			var oPanel = getIdObj("directionsPanel");
	      			doSwitchClass(oPanel, "route_ok");
//	      			oPanel.innerHTML = "";

	      			directionsDisplay.setDirections(response);
      			}
      			else {
	      			var oPanel = getIdObj("directionsPanel");
	      			doSwitchClass(oPanel,"route_error");
	      			
	      			oPanel.innerHTML = "Routing Error.";
      			}
    		}
	);
}

function zoomOnMarker(marker){
	if ( marker == "start" ){
		if ( startMarker ) {
			var mPoint = startMarker.getPosition();
			map.setCenter(mPoint);
			map.setZoom(15);
		}
	}
	else if ( marker == "end" ){
		if ( endMarker ) {
			var mPoint = endMarker.getPosition();
			map.setCenter(mPoint);
			map.setZoom(15);
		}
	}  
}

