/************************************************************************

History GIS MapServer

Ben Loh
Inquirium
ben@inquirium.net

Created 7/21/05


hmap_loadMgr.js
AJAX functions that manage the dynamic loading of maps and legends.

This should focus just on managing the communication of data back and forth,
as well as the loading of data into variables.

It should pass off the display functions to another script.

 ************************************************************************/


function ConstructQueryString( form ) 
{
	return ConstructReadableQueryString( form, '' );
}

function ConstructReadableQueryString( form, separator ) 
{
	var u = form.elements.length;
//	alert ('ConstructReadableQueryString: number of form elements = ' + u);
	var a = new Array();
	var okToSubmit = true;
	var data;
	var s = '';
	
	for (i=0; i<u; i++)
	{
		e = form.elements[i];
		if (e.id) {	// only if not blank
			data = e.value;
			if (e.type == 'checkbox' || e.type == 'radio' ) 
			{
				if (!e.checked) { continue; }
			}
			if (e.type == 'select') 
			{
				data = e.options[ e.selectedIndex ].text;
			}
			if (e.type == 'button')
			{
				continue;	//	Don't process buttons
			}
			
			if (data != '' ) {
				a.push( e.id + '=' + data );
			}
		}
	}
	
	s = a.join(separator + '&');
	
//ShowURLinNewWin(s);
	
	return pathToSettings+'&'+ s;
}



function RenderMap( mapID, getString, debugOn ) 
{
	//alert( 'hmap_loadMgr: RenderMap called with getString: ' + getString);
	
	//	CLASS VARS
	var self 				= this;
	this.mapRequester 		= null;
	this.legendRequester 	= null;
	this.timelineRequester 	= null;
	this.GETstring			= '';
	this.showMapAndLegendAlreadyCalled = false;
	
	//	CLASS METHODS
	
	this.RequestMap =	function( getString ) 
	{
		SetLoadingMessage('Requesting map');

		self.GETstring = getString;	
		
		// Check for running connections
		if (self.mapRequester != null && self.mapRequester.readyState != 0 && self.mapRequester.readyState != 4) 
		{ 
			self.mapRequester.abort(); 
		}
		
		//	Initialize the requester
		try {
			self.mapRequester = new XMLHttpRequest();
		} 
		catch (error) {
			try {
				self.mapRequester = new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch (error) {
				DbgOut('RequestMap:  Unable to create requester.  Make sure you\'re using Internet Explorer 6 with Javascript turned on.');
				return false;		
			}
		}
		
		SetLoadingMessage('Requester created');
		
		qstring = "../../hmap/hmap/hmap_renderMap.php?mapID="+mapID+"&"+getString;
		
		if (debugOn) {
			//	Open in new window instead
			window.open( qstring );
		} else {
//			alert('RequestMap: 1. Get qstring = ' + qstring);
			self.mapRequester.open("GET", qstring );
//			alert('RequestMap: 2. Send null');
			self.mapRequester.send(null);
//			alert('RequestMap: 3. set readystatechange');
			self.mapRequester.onreadystatechange = RetrieveMap;
			SetLoadingMessage('Map requested');
		}

		SetLoadingMessage('Waiting for response');
	}
	

	
	this.RetrieveMap = function()
	{
//		SetLoadingMessage('...readyState = ' + self.mapRequester.readyState + ' ');
		if (self.mapRequester.readyState == 4)
		{
			//DbgOut('RetrieveMap ready state change = 4'); 
//			try
//			{
			SetLoadingMessage('...status = ' + self.mapRequester.status + ' ');
				if (self.mapRequester.status == 200)
				{
					//DbgOut('Received data: ' + mapRequester.responseText );
					SetLoadingMessage('Map ready to download');
					ShowMapAndLegend();
				}
				else 
				{
					DbgOut('Retrieve Map: Returned status is Not OK (200). requester.status = ' + self.mapRequester.status);
				}
/*			}
			catch (error)
			{
				DbgOut('RetrieveMap: For some reason I wasn\'t able to get the status.  Error = ' + error );
				return false;
			}
*/		}
		return true;
	}



	this.ShowMapAndLegend = function() 
	{
		if (self.showMapAndLegendAlreadyCalled) {						//	This is needed to prevent ShowMapAndLegend from being called with EVERY state change!
			alert('already called, returning');
			return;
		}
		
		self.showMapAndLegendAlreadyCalled = true;						//	This is needed to prevent ShowMapAndLegend from being called with EVERY state change!

		//	Load the JSON object
		try {
			SetLoadingMessage('Parsing map data');
			
			var parsedJSON = self.mapRequester.responseText.parseJSON();
			if (parsedJSON == false) {
				DebugPage( 'Ooops.  I couldn\'t read the data from the server.  Please report this: JSON loading error:' + self.mapRequester.responseText );
				loadingIsCancelled = true;
				FinishedLoading( mapID );
				return;
			}
			var mapObject = parsedJSON;
		}
		catch (error) {
			DebugPage( 'Ooops.  I couldn\'t read the data from the server.  Please report this: JSON loading error.  hmap_loadMgr.ShowMapAndLegend failed while evaling the JSON object: ' + error + ':' + self.mapRequester.responseText );
//			DbgOut( 'JSON loading error.  url = ' + mapObject.mapurl + 'hmap_loadMgr.ShowMapAndLegend failed while evaling the JSON object: ' + error + ':' + self.mapRequester.responseText );
//			DbgOut( 'url = ' + mapObject.mapurl);
//			alert( 'hmap_loadMgr.ShowMapAndLegend failed while evaling the JSON object: ' + error + ':' + self.mapRequester.responseText );
		}

		SetLoadingMessage('Setting map variables');

		//	Set the keymap image URL
// Set the keymap first to prevent refresh flicker
		var keymapurl = mapObject.keymapurl;	//GetValue( self.mapRequester.responseXML, "keymapurl" );
		var keymapImageObject = document.getElementById(mapID+"_keymap");
		keymapImageObject.src = keymapurl;				//	new URL

		//	Set the map image URL
		try {
			mapurl = mapObject.mapurl;	//GetValue( self.mapRequester.responseXML, "mapurl" ); 
		} catch (error) {
			alert('mapObject error. This is probably due to a bad map file.  self.mapRequester.responseText = ' + self.mapRequester.responseText);
		}
		ResetMapImage( mapID );


		//	Set the previous URL so that the next page will load with this graphic initially
//		var prevURLObject = document.getElementById(mapID+'_prevMapURL');			
//		prevURLObject.value = mapurl;					//	new URL

		var currentDate = mapObject.mapDate;		//GetValue( self.mapRequester.responseXML, "mapDate");
		var dateObject = document.getElementById( mapID+'_mapDate' );
		dateObject.value = currentDate;

		var newExtentHTML = mapObject.newExtent;	//GetValue( self.mapRequester.responseXML, "newExtent");
		var newExtentObject = document.getElementById( mapID+'_newExtent' );
		newExtentObject.value = newExtentHTML;
//		alert('new extent = ' + newExtentHTML );

		var currentCmdStrHTML = mapObject.currentCmdStr;	//GetValue( self.mapRequester.responseXML, "currentCmdStr");
		var currentCmdStrObject = document.getElementById( mapID+'_cmdStr' );
		currentCmdStrObject.value = currentCmdStrHTML;
		var lastCmdObject = document.getElementById('lastCmd');
		lastCmdObject.innerHTML = currentCmdStrHTML;

		var markerPointHTML = mapObject.markerPoint;	//GetValue( self.mapRequester.responseXML, "markerPoint");
		var markerPointObject = document.getElementById( mapID+'_markerPoint' );
		markerPointObject.value = markerPointHTML;

		var markerExpressionsHTML = mapObject.markerExpressions;
		var markerExpressionsObject = document.getElementById( mapID+'_markerExpressions' );
		markerExpressionsObject.value = markerExpressionsHTML;
		//alert('marker Expressions = ' + decodeURIComponent(markerExpressionsHTML) );

		var mapDrawTime = mapObject.timeToDrawMap;
		var mapRenderTime = mapObject.timeToRender;
		var phpLoadTimeObject = document.getElementById( 'phpLoadTime' );
		phpLoadTimeObject.innerHTML = mapDrawTime + 'Total Seconds: ' + mapRenderTime;
				
		//	Read the legend data from PHP
		SetLoadingMessage('Rendering legend');
		var selectedLegendLayer = mapObject.selectedLegendLayer;
		var legendJSON = mapObject.legend;
		legendMgr.loadFromJSON( legendJSON, selectedLegendLayer );				//	legendMgr is globally defined in jsLayer.js
		
		//	Draw the legend HTML
		var legendObject = document.getElementById( mapID+'_legend' );
		//Debug('hmap_loadMgr.about to call legendMgr.getHTML');
		legendObject.innerHTML = legendMgr.getHTML(310);						//	'450' is the width of the legend
		//Debug('hmap_loadMgr.finished calling legendMgr.getHTML');
		//Debug(legendMgr.getHTML(480));
		legendMgr.initListeners();

		//	Draw the query results
		//	Also need to load from any saved query Results?
		Debug('loadmgr.selectedLegendLayer = ' + selectedLegendLayer );;
		var latlon = markerPointHTML.split(',')[0];							//	Just return the first marker point
		if (latlon == '0 0') { latlon = '- -'; } 
		qResultMgr.loadFromLegendMgr( legendMgr, selectedLegendLayer, self.GETstring, currentDate, currentCmdStrHTML, latlon );
		var queryResultEl = document.getElementById( mapID+'_queryResult' );
		queryResultEl.innerHTML = qResultMgr.getHTML(450, true);						//	qResultMgr is globally defined in jsQueryResult.js
		
		//	Process the queryResults to add links
		AddLinkOpeners( 'documents' );

		//	Restore the currently selected row
		legendMgr.setSelectedRow( selectedLegendLayer );
		
		//	Init mouseover/out handlers for query table
		qResultMgr.initListeners();
		
		FinishedLoading( mapID );

		return true;
	}
	
	
	//	INIT
	//	Initial Function
	RequestMap( getString);
	
}


//	Cache error messages
var showErrors = true;
function DbgOut(msgStr) {
	if (showErrors) {
		Debug( msgStr );
		showErrors = false;
	}
}
