/*****************************************************************************
*
* File     : ExtentPanel.js
* 
* Project  : WMS Viewer Client
* 
* Contents : 
*
* Author: Milan Trninic
*
* Copyright 1999-2005 Galdos Systems, Inc.
* All rights reserved.
* 
***|***************************|***********************|*******************|*/

/************************************************************************
*
*	Global declarations
*
*
*************************************************************************/

/************************************************************************
*
*	function:	ExtentPanel
*
*	purpose:	Constructor
*
*************************************************************************/
function ExtentPanel()
{
	// superclass
	var uiElement = document.getElementById("extentPanel");
	this._superClass = StackedPanel;
	this._superClass(uiElement);
	
	// method assignments
	this.init = ExtentPanel.init;
	this.getBoundingBox = ExtentPanel.getBoundingBox;
	this.setBoundingBox = ExtentPanel.setBoundingBox;
	this.getOriginalBoundingBox = ExtentPanel.getOriginalBoundingBox;
	this.sendHarvestRequest = ExtentPanel.sendHarvestRequest;
	this.handleHarvestResponse = ExtentPanel.handleHarvestResponse;
	this.getXmlHttpObject = ExtentPanel.getXmlHttpObject;
	
	this.srsChanged = ExtentPanel.srsChanged;

	this.srsChangedAdapter = ExtentPanel.srsChangedAdapter;

	// instance field declarations
	this._superClass;
	this._srsNameList;
	this._bboxes;
	this._minxUI;
	this._minyUI;
	this._maxxUI;
	this._maxyUI;
	this._xmlhttp;
	this._originalExtent;

	// initialization
	this.init();
}

/************************************************************************
*
*	function:	init
*
*	purpose:	initializes the globals
*
*************************************************************************/
function ExtentPanel.init()
{
	var srsNameListUI = document.getElementById("srsName");
	this._srsNameList = new JsList(srsNameListUI);
	
	this._uiElement.setAttribute("dataTransfer", this);
	this._srsNameList.attachEvent("onchange", ExtentPanel.srsChangedAdapter);
	
	this._bboxes = new Hashtable();

	this._minxUI = document.getElementById("minx");
	this._minyUI = document.getElementById("miny");
	this._maxxUI = document.getElementById("maxx");
	this._maxyUI = document.getElementById("maxy");
}

/************************************************************************
*
*	function:	getBoundingBox
*
*	purpose:	
*
*************************************************************************/
function ExtentPanel.getBoundingBox()
{
	var srsName = this._srsNameList.getSelectedItem();
	var minx = this._minxUI.value;
	var miny = this._minyUI.value;
	var maxx = this._maxxUI.value;
	var maxy = this._maxyUI.value;
	
	var bbox = null;
	try
	{
		bbox = new BoundingBox(minx, miny, maxx, maxy, srsName);
	}
	catch (exception)
	{
		
	}
	return bbox;
}

/************************************************************************
*
*	function:	setBoundingBox
*
*	purpose:	Only sets the numbers in the UI. Used for visual zoom and pan
*
*************************************************************************/
function ExtentPanel.setBoundingBox(bbox)
{
	this._minxUI.value = bbox.getMinX();
	this._minyUI.value = bbox.getMinY();
	this._maxxUI.value = bbox.getMaxX();
	this._maxyUI.value = bbox.getMaxY();
}

/************************************************************************
*
*	function:	getOriginalBoundingBox
*
*	purpose:	
*
*************************************************************************/
function ExtentPanel.getOriginalBoundingBox()
{
	return this._originalExtent;
}

/************************************************************************
*
*	function:	sendHarvestRequest
*
*	purpose:	
*
*************************************************************************/
function ExtentPanel.sendHarvestRequest(wmsAddress, handler)
{
	this._xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
	this._xmlhttp.onreadystatechange = handler;
	// Use POST because no time for finding how to disable IE caching of GET
	this._xmlhttp.open("POST", "fpsPortal?request=getExtents&usecache=true&url=" + escape(wmsAddress), true);
	this._xmlhttp.send();
}

/************************************************************************
*
*	function:	handleHarvestResponse
*
*	purpose:	
*
*************************************************************************/
function ExtentPanel.handleHarvestResponse()
{
	var xml = this._xmlhttp.responseXML;
	
	this._srsNameList.removeAllItems();
	this._bboxes.removeAll();
	
	xml.setProperty("SelectionLanguage", "XPath");
	xml.setProperty("SelectionNamespaces", "xmlns:fps='http://www.galdosinc.com/fps' xmlns:wms='http://www.opengis.net/wms'");
	var xpathExpression = "/fps:Result/wms:BoundingBox";
	var bboxNodes = xml.selectNodes(xpathExpression);

	var xpathExpression = "/fps:Result";
	var result = xml.selectNodes(xpathExpression).item(0);
  var version = result.getAttribute("version");

	var srsAttribute = "SRS";
  if (version == "1.3.0") srsAttribute = "CRS";

	for (var index = 0; index < bboxNodes.length; index++) 
	{
    var bboxNode = bboxNodes.item(index);
    var srsName = bboxNode.getAttribute(srsAttribute);
    this._srsNameList.addItem(srsName);
  	var minx = bboxNode.getAttribute("minx");
  	var miny = bboxNode.getAttribute("miny");
  	var maxx = bboxNode.getAttribute("maxx");
  	var maxy = bboxNode.getAttribute("maxy");
  	var bbox = new BoundingBox(minx, miny, maxx, maxy, srsName);
    this._bboxes.put(srsName, bbox);
 }
	
	var srsName = this._srsNameList.getSelectedItem();
	if (srsName != null) this._originalExtent = this._bboxes.get(srsName);

	this.srsChanged();
}

/************************************************************************
*
*	function:	getXmlHttpObject
*
*	purpose:	
*
*************************************************************************/
function ExtentPanel.getXmlHttpObject()
{
	return this._xmlhttp;
}

/************************************************************************
*
*	function:	srsChanged
*
*	purpose:	
*
*************************************************************************/
function ExtentPanel.srsChanged()
{
	var srsName = this._srsNameList.getSelectedItem();
	if (srsName == null) return;
	var bbox = this._bboxes.get(srsName);
	this._minxUI.value = bbox.getMinX();
	this._minyUI.value = bbox.getMinY();
	this._maxxUI.value = bbox.getMaxX();
	this._maxyUI.value = bbox.getMaxY();
}

/************************************************************************
*
*	function:	Event handler adapters
*
*	purpose:	
*
*************************************************************************/
function ExtentPanel.srsChangedAdapter(){target(event, ExtentPanel).srsChanged(event);}

