/*****************************************************************************
 *
 * File     : LayersPanel.js
 * 
 * Project  : WMS Viewer Client
 * 
 * Contents : 
 *
 * Author: Milan Trninic
 *
 * Copyright 1999-2005 Galdos Systems, Inc.
 * All rights reserved.
 * 
 ***|***************************|***********************|*******************|*/

/************************************************************************
*
*	Global declarations
*
*
*************************************************************************/

/************************************************************************
*
*	function:	LayersPanel
*
*	purpose:	Constructor
*
*************************************************************************/
function LayersPanel()
{
	// superclass
	var uiElement = document.getElementById("layersPanel");
	this._superClass = StackedPanel;
	this._superClass(uiElement);

	// method assignments
	this.init = LayersPanel.init;
	this.setSize = LayersPanel.setSize;
	this.getSelectedLayers = LayersPanel.getSelectedLayers;
	this.setAllSelected = LayersPanel.setAllSelected;
	this.setToolbarEnabled = LayersPanel.setToolbarEnabled;
	this.sendHarvestRequest = LayersPanel.sendHarvestRequest;
	this.handleHarvestResponse = LayersPanel.handleHarvestResponse;
	this.getXmlHttpObject = LayersPanel.getXmlHttpObject;
	this.activateLayers = LayersPanel.activateLayers;
	this.activateLayer = LayersPanel.activateLayer;

	this.toggleLayer = LayersPanel.toggleLayer;
	this.selectAll = LayersPanel.selectAll;
	this.deselectAll = LayersPanel.deselectAll;
	this.layerSelected = LayersPanel.layerSelected;
	
	this.toggleLayerAdapter = LayersPanel.toggleLayerAdapter;
	this.selectAllAdapter = LayersPanel.selectAllAdapter;
	this.deselectAllAdapter = LayersPanel.deselectAllAdapter;
	this.layerSelectedAdapter = LayersPanel.layerSelectedAdapter;

	// instance field declarations
	this._superClass;
	this._layersListUI;
	this._toolbar;
	this._xmlhttp;
	
	// initialization
	this.init();
}

/************************************************************************
*
*	function:	init
*
*	purpose:	initializes the globals
*
*************************************************************************/
function LayersPanel.init()
{
	this._layersListUI = document.getElementById("layersList");
	
	var toolbarUI = document.getElementById("selectionToolbar");
	this._toolbar = new Toolbar(toolbarUI);

	var selectButton = this._toolbar.getButton("selectButton");
	var deselectButton = this._toolbar.getButton("deselectButton");
	
	selectButton.setDisabledImagePath("images/selectAllDisabled.gif");
	deselectButton.setDisabledImagePath("images/deselectAllDisabled.gif");

	selectButton.attachEvent("onclick", LayersPanel.selectAllAdapter);
	deselectButton.attachEvent("onclick", LayersPanel.deselectAllAdapter);
	
	this._toolbar.setEnabled(false);
}

/************************************************************************
*
*	function:	setSize
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.setSize(width, height)
{
	// For explanation of the purpose of the temp variable, see the documentation
	this.temp = this._superClass.setSize;
	this.temp(width, height);
	//this._superClass.setSize(width, height);
	this._layersListUI.style.height = height * 0.88;
	this._layersListUI.style.width = width * 0.98;
}

/************************************************************************
*
*	function:	getSelectedLayers
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.getSelectedLayers()
{
	var layers = "";
	var nsMap = new Hashtable();
	var layerNodes = selectNodes(this._layersListUI, "div/div");
	var size = layerNodes.getSize();
	for (var index = 0; index < size; index++)
	{
		var layerNode = layerNodes.get(index);
		var checkbox = selectNodes(layerNode, "div/input").get(0);
		if (checkbox.checked == false) continue;
		var layerName = layerNode.getAttribute("name");
		var typeName = layerNode.getAttribute("typeName");
		var featurePrefix = layerNode.getAttribute("prefix");
		var featureNsUri = layerNode.getAttribute("nsUri");
		if (featurePrefix != null && trim(featurePrefix) != "") nsMap.put(featurePrefix, featureNsUri);
		layers += "?" + layerName;
		layers += "&" + typeName;
		var propertyNodes = selectNodes(layerNode, "div/table/tbody/tr");
		var propertyCount = propertyNodes.getSize();
		for (var ii = 0; ii < propertyCount; ii++)
		{
			var propertyNode = propertyNodes.get(ii);
			var propertyName = propertyNode.getAttribute("name");
			var prefix = propertyNode.getAttribute("prefix");
			var nsUri = propertyNode.getAttribute("nsUri");
			if (trim(prefix) != "" && trim(nsUri) != "") nsMap.put(prefix, nsUri);
			var valueNode = selectNodes(propertyNode, "td/input").get(0);
			if (valueNode == null) continue;
			var propertyValue = trim(valueNode.value);
			if (propertyValue == null || propertyValue == "") continue;
			layers += "&" + prefix + ":" + propertyName + "=" + propertyValue;
		}
	}
	
	var namespaces = "";
	var keys = nsMap.getKeys();
	size = keys.getSize();
	for (var index = 0; index < size; index++)
	{
		var prefix = keys.get(index);
		var nsUri = nsMap.get(prefix);
		if (prefix)
		namespaces += " xmlns:" + prefix + "='" + nsUri + "'";
	}
	
	var result = new Collection();
	result.add(namespaces);
	result.add(layers);
	return result;
}

/************************************************************************
*
*	function:	sendHarvestRequest
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.sendHarvestRequest(wmsAddress, handler)
{
	this._toolbar.setEnabled(false);
	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=getLayers&usecache=false&url=" + escape(wmsAddress), true);
	this._xmlhttp.send();
}

/************************************************************************
*
*	function:	handleHarvestResponse
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.handleHarvestResponse()
{
	if (this._xmlhttp.responseText.indexOf("<div") != 0) 
	{
		if (trim(this._xmlhttp.responseText) == "")
		{
			this._layersListUI.innerHTML = "No layers defined on the server.";
			return;
		}
		throw new Exception("Error occured when getting layers: \n" + this._xmlhttp.responseText.substring(0, 100));
	}
	
	this._layersListUI.innerHTML = this._xmlhttp.responseText;
	
	var layerNodes = selectNodes(this._layersListUI, "div/div/div/img");
	var size = layerNodes.getSize();
	this._uiElement.setAttribute("dataTransfer", this);
	for (var index = 0; index < size; index++)
	{
		var layerNode = layerNodes.get(index);
		var name = layerNode.getAttribute("name");
		if (name != "control") continue;
		layerNodes.get(index).attachEvent("onclick", LayersPanel.toggleLayerAdapter);
	}

	var checkBoxNodes = selectNodes(this._layersListUI, "div/div/div/input");
	var size = checkBoxNodes.getSize();
	for (var index = 0; index < size; index++)
	{
		var checkboxUI = checkBoxNodes.get(index);
		checkboxUI.attachEvent("onpropertychange", LayersPanel.layerSelectedAdapter);
	}

	this._toolbar.setEnabled(true);
}

/************************************************************************
*
*	function:	getXmlHttpObject
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.getXmlHttpObject()
{
	return this._xmlhttp;
}

/************************************************************************
*
*	function:	toggleLayer
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.toggleLayer(event)
{
	var imageUI = event.srcElement;

	var index = imageUI.getAttribute("index");
	var toggleStatus = imageUI.getAttribute("toggleStatus");
	
	if (toggleStatus == "expanded") toggleStatus = "collapsed";
	else toggleStatus = "expanded";
	imageUI.setAttribute("toggleStatus", toggleStatus);

	var src = "";
	if (index == "first") src = "upperCorner";
	else if (index == "last") src = "lowerCorner";
	else if (index == "only") src = "root";
	else src = "t";
	
	if (toggleStatus == "expanded") src += "Minus";
	else src += "Plus";

	src = "images/" + src + ".gif";
	imageUI.src = src;
	
	var layerUI = imageUI.parentNode.parentNode;

	var propertiesNode = selectNodes(layerUI, "div").get(1);
	if (toggleStatus == "collapsed") propertiesNode.style.display = "none";
	else propertiesNode.style.display = "";
}

/************************************************************************
*
*	function:	setAllSelected
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.setAllSelected(selected)
{
	var uiNodes = selectNodes(this._layersListUI, "div/div/div/input");
	var size = uiNodes.getSize();
	for (var index = 0; index < size; index++)
	{
		var checkboxUI = uiNodes.get(index);
		checkboxUI.checked = selected;
	}
}

/************************************************************************
*
*	function:	activateLayer
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.activateLayers(activate)
{
	var layerNodes = selectNodes(this._layersListUI, "div/div");
	var size = layerNodes.getSize();
	for (var index = 0; index < size; index++)
	{
		var layerNode = layerNodes.get(index);
		this.activateLayer(layerNode, activate);
	}
}

/************************************************************************
*
*	function:	activateLayer
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.activateLayer(layerNode, activate)
{
	var checkBoxNode = selectNodes(layerNode, "div/input").get(0);
	var checked = checkBoxNode.checked;

	var layerNameNode = selectNodes(layerNode, "div/span").get(0);
	if (checked && activate) layerNameNode.className = "layerNameActive";
	else layerNameNode.className = "layerName";
	
	var propertyNameNodes = selectNodes(layerNode, "div/table/tbody/tr/td/span");
	var size = propertyNameNodes.getSize();
	for (var index = 0; index < size; index++)
	{
		var propertyNameNode = propertyNameNodes.get(index);
		if (propertyNameNode.className == null) continue;
		if (propertyNameNode.className.substring(0, 12) != "propertyName") continue;
		if (checked && activate) propertyNameNode.className = "propertyNameActive";
		else propertyNameNode.className = "propertyName";
	}
	
	if (checked && activate) layerNode.setAttribute("active", "true");
	else layerNode.setAttribute("active", "false");
	
}

/************************************************************************
*
*	function:	selectAll
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.selectAll(event)
{
	this.setAllSelected(true);
}

/************************************************************************
*
*	function:	deselectAll
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.deselectAll(event)
{
	this.setAllSelected(false);
}

/************************************************************************
*
*	function:	layerSelected
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.layerSelected(event)
{
	if (event.propertyName != "checked") return;
	var checkBox = event.srcElement;
	var layerNode = checkBox.parentNode.parentNode;
	
	if (layerNode.active != "true") return;
	
	var layerName = layerNode.name;
	_resultPanel.showLayer(layerName, checkBox.checked);
}

/************************************************************************
*
*	function:	setToolbarEnabled
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.setToolbarEnabled(enable)
{
	if (enable != null)
	{
		this._toolbar.setEnabled(enable);
		return;
	}
	var layerNodes = selectNodes(this._layersListUI, "div/div/img");
	if (layerNodes.getSize() > 0) this._toolbar.setEnabled(true);
	else this._toolbar.setEnabled(false);
}

/************************************************************************
*
*	function:	Event handler adapters
*
*	purpose:	
*
*************************************************************************/
function LayersPanel.toggleLayerAdapter(){target(event, LayersPanel).toggleLayer(event);}
function LayersPanel.selectAllAdapter(){target(event, LayersPanel).selectAll(event);}
function LayersPanel.deselectAllAdapter(){target(event, LayersPanel).deselectAll(event);}
function LayersPanel.layerSelectedAdapter(){target(event, LayersPanel).layerSelected(event);}


