/*
	Author: Alberto Asuero (alberto.asuero@gstgis.com)
	Date: 26-07-2011
	Enterprise: Geographica Studio
	Mail: alberto.asuero@gstgis.com
	Tfno: 645816025
*/

function TreeNode(objectValues)
{
	if (!objectValues)
	{
		return;
	}

	/* title */
	this.id = (objectValues.id) ?  objectValues.id : null;
	this.id_layer = (objectValues.id_layer) ?  objectValues.id_layer : null;
	this.type = (objectValues.type) ?  objectValues.type : null;
	this.title = (objectValues.title) ?  objectValues.title : null;
	this.ico_legend = (objectValues.ico_legend) ?  objectValues.ico_legend : null;
	this.ico_legend_disabled = (objectValues.ico_legend_disabled) ?  objectValues.ico_legend_disabled : null;
	this.visible = (objectValues.visible) ?  objectValues.visible : null;
	this.father = (objectValues.father) ?  objectValues.father : null;
	this.childs = (objectValues.childs) ?  objectValues.childs : null;
	this.checkbox = (objectValues.checkbox) ?  objectValues.checkbox : null;
	this.active = (objectValues.active) ?  objectValues.active : null;

}


function GroupLayer(objectValues)
{
	if (!objectValues)
	{
		return;
	}

	/* tree */
	this.tree = (objectValues.tree) ?  objectValues.tree : null;
	this.kmlClient = (objectValues.kmlClient) ?  objectValues.kmlClient : null;
	this.mashup = (objectValues.mashup) ?  objectValues.mashup : null;
	this.TYPE_NODE_GROUP = 1;
	this.TYPE_NODE_LAYER = 2;

	this.__checkNodeInScaleRange = function(node)
	{
		if (node.type == this.TYPE_NODE_LAYER )
		{
			return this.kmlClient.isLayerInRange(node.id_layer);
		}
		for (var i=0;node.childs && i<node.childs.length;i++)
		{
			var inScaleRange = this.__checkNodeInScaleRange(node.childs[i]);
			if (inScaleRange)
			{
				return true;
			}
		}
		return false;

	};

	this.__getHTMLTreeNode = function(node,level)
	{
		var html = "<div class='tree_level_" + level + "'>";
		var inScaleRange = this.__checkNodeInScaleRange(node);

		var link;
		if (node.checkbox)
		{
			html += "<div class='co_check'>";

			if (node.type == this.TYPE_NODE_LAYER)
			{
				if (inScaleRange)
				{
					link = (node.visible) ? "checkbox_selected.png" : "checkbox_unselected.png";
					html += "<img class='jsLink' onclick='MiradorMashup.groupLayer.changeLayerVisibility(" + node.id + ")'"
						+	"	src='img/tree_map/" + link + "'/>";
				}
				else
				{
					link = (node.visible) ? "checbox_selec_off.png" : "checkbox_deactivate.png";
					html += "<img src='img/tree_map/" + link + "'/>";
				}

			}
			else
			{
				if (inScaleRange)
				{
					link = (node.visible) ? "checkbox_selected.png" : "checkbox_unselected.png";
					html += "<img class='jsLink' onclick='MiradorMashup.groupLayer.changeGroupVisibility(" + node.id + ")'"
						+	"	src='img/tree_map/" + link + "'/>";
				}
				else
				{
					link = (node.visible) ? "checbox_selec_off.png" : "checkbox_deactivate.png";
					html += "<img src='img/tree_map/" + link + "'/>";
				}

			}

			html +="</div>"
		}

		if (node.type == this.TYPE_NODE_LAYER )
		{
			var disabled_img = node.ico_legend.substring(0,node.ico_legend.length - 4) + "_disabled.png";

			link = inScaleRange ? node.ico_legend : disabled_img ;

			// it's a layer'
			html += "		<div class='co_img'>"
					+ "			<img src='img/tree_map/" + link +"'>"
					+ "		</div>"
		}


		html += inScaleRange ? "<div class='co_name'>" + node.title + "</div>" :
										"<div class='co_name_disabled'>" + node.title + "</div>";

		html += "</div>";

		return html;

	};
	this.__drawNode = function(node,level)
	{
		var html = "";

		if (!node.active)
		{
			return html;
		}
		// check node visibility

		html += this.__getHTMLTreeNode(node,level);

		for (var i=0;node.childs && i<node.childs.length;i++)
		{
			html += this.__drawNode(node.childs[i],level+1);
		}
		return html;
	};
	this. drawInterface = function()
	{
		var html = "<div style='height:10px'></div>";
		for (var i=0;i<this.tree.length;i++)
		{

			html += this.__drawNode(this.tree[i], 1);
		}


		jQuery("#layer_tree").html(html);
	};
	this.draw = function()
	{
		this.kmlClient.draw();
		this.drawInterface();
	};
	this. __searchIndividualNodeDepth = function(node,id_node)
	{
		if (node.id == id_node)
		{
			return node;
		}
		for (var i=0;node.childs && i<node.childs.length;i++)
		{
			var nodeFound = this.__searchIndividualNodeDepth(node.childs[i],id_node);
			if (nodeFound)
			{
				return nodeFound;
			}
		}
		return null;
	};

	this.searchNodeDepth = function(id_node)
	{
		for (var i=0;this.tree.length;i++)
		{
			var node = this.__searchIndividualNodeDepth(this.tree[i],id_node);
			if (node)
			{
				return node;
			}
		}
		return null;
	};

	this.changeLayerVisibility = function(id_node)
	{
		var node = this.searchNodeDepth(id_node);
		node.visible = !node.visible;
		this.kmlClient.changeLayerVisibility(node.id_layer);
		this.__notifyFatherChangeOnVisibility(node);
		this.draw();
	};

	this.__notifyFatherChangeOnVisibility = function (node)
	{
		if (!node.father)
		{
			return;
		}
		var node_father = this.searchNodeDepth(node.father);
		var allChildsInvisible = true;
		for (var i=0;node_father.childs && i<node_father.childs.length;i++)
		{
			if (node_father.childs[i].visible)
			{
				allChildsInvisible = false;
				break;
			}
		}
		if (allChildsInvisible)
		{
			node_father.visible = false;
		}

	};

	this.changeGroupVisibility = function(id_node)
	{
		// ToDO: support more that one level (depth search)

		var node = this.searchNodeDepth(id_node);
		node.visible = !node.visible;
		if (node.type == this.TYPE_NODE_LAYER)
		{
			this.kmlClient.changeLayerVisibility(node.id_layer);
		}


		for (var i=0;node.childs && i<node.childs.length;i++)
		{
			node.childs[i].visible = node.visible;
			if (node.childs[i].type == this.TYPE_NODE_LAYER)
			{
				this.kmlClient.changeLayerVisibility(node.childs[i].id_layer);
			}
		}

		this.draw();

	}
}



