// LyStringScript.js
// Copyright (c) 2000, Lyria.
// All rights reserved.
// @version	$Id: LyDictionaryScript.js,v 1.1 2008/09/15 15:37:55 nha Exp $

// The root node of the dictionary
var dictionaryRoot;
// The selection mode : 0 if none, 1 if single, 2 if multiple
var selectionMode;
// The current selection
var selectedNode;
// The number of values before children in the array representing the nodes
var varBeforeChildren = 6;

var parent_form;
var parent_field_name;
var hidden_field_name;

var sep;
var visibleSep;
var is_popup;
var root_window;

var last_node_open;
var last_node_closed;
var node_open;
var node_closed;
var last_node;
var blank_node;
var vertical_line_node;
var simple_node;
var empty_checkbox;
var checked_checkbox;
var disabled_checkbox;

// The frame name where dictionary shall be written
var dictionaryTagName;

// This function creates an instance of entry.
// Each entry in the dictionary is an Array with at least 6 values :
// entry[0] id of the node
// entry[1] name of the node
// entry[2] indicates if the node is open
// entry[3] indicates if the node is selected
// entry[4] icon of the node when closed
// entry[5] icon of the node when open
// entry[6]...entry[6+n] the n children nodes
// @param id id of the node
// @param name name of the node
// @param nodeClosed icon of the node when closed
// @param nodeOpen icon of the node when open
// @param open indicates if the node is open
// @param selected indicates if the node is selected

function entry(id, name, nodeClosed, nodeOpen, open, selected)
{
	var node;

	node = new Array;

	node[0] = id;
	node[1] = name;
	node[2] = open;
	node[3] = selected;
	node[4] = nodeClosed;
	node[5] = nodeOpen;

	if (selected)
		selectedNode = node;

	return node;
}

// This function returns the id of a node.
function getId(entry)
{
	return entry[0];
}

// This function returns the name of a node.
function getName(entry)
{
	return entry[1];
}

// This function indicates whether the node is open or not.
function isOpen(entry)
{
	if (entry == dictionaryRoot)
		return true;
		
	return entry[2];
}

// This function indicates whether the node is selected or not.
function isSelected(entry)
{
	return entry[3];
}

// This function returns the icon of a node when closed.
function getIconClosed(entry)
{
	return entry[4];
}

// This function returns the icon of a node when open.
function getIconOpen(entry)
{
	return entry[5];
}

// This function returns the link of a node (for href).
function getLink(entry)
{
	return getId(entry);
}

// This function indicates whether the node has children or not.
function hasChildren(entry)
{
	return (entry.length > varBeforeChildren);
}

// Open or close the node.
function setOpen(entry, open)
{
	entry[2] = open;
}

// Select or unselect the node.
function setSelected(entry, selected)
{
	entry[3] = selected;
}

// Add a child to the node.
function addChild(parent, child)
{
	parent[parent.length] = child;

	return child;
}

// Write the dictionary in the given document.
function writeDictionary(updateFromHiddenField)
{
	if (updateFromHiddenField == true)
	{
		var nodes;

		nodes = new Array;

		GetSelectedNodes(nodes, dictionaryRoot);

		for (var i = 0; i < nodes.length; i++)
		{
			nodeTmp = nodes[i];
			setSelected(nodeTmp, false);
		}
		
		var selectedNodes = StringToArray(root_window.GetHiddenValue(), sep);
		
		for (var i = 0; i < selectedNodes.length; i++)
		{
			selectNode(selectedNodes[i], false);
		}
	}
		
	var cell = document.getElementById(dictionaryTagName);
	
	cell.innerHTML = writeNode(dictionaryRoot, 0, 1, "");
}

// Write the node in the given document.
function writeNode(node, level, lastNode, leftSide)
{
	var j = 0;
	var i = 0;
	var celltext = "";
	
	celltext += "<table border=0 cellspacing=0 cellpadding=0>";
	celltext += "<tr>";
	celltext += "<td valign='middle' nowrap='true'>";
	celltext += leftSide;

	if (level > 0)
	{
		var		idNode = ReplaceString(getId(node), "\\", "\\\\");


		if (hasChildren(node))
			celltext += "<a href='javascript:openNode(\"" +
				idNode + "\");' onmouseover=\"window.status='';return true;\">";

		if (lastNode)
		{
			if (hasChildren(node) && isOpen(node))
				celltext += "<img src='" + last_node_open + "' width='16' height='22'";
			else if (hasChildren(node) && !isOpen(node))
				celltext += "<img src='" + last_node_closed + "' width='16' height='22'";
			else
				celltext += "<img src='" + last_node + "' width='16' height='22'";
		}
		else
		{
			if (hasChildren(node) && isOpen(node))
				celltext += "<img src='" + node_open + "' width='16' height='22'";
			else if (hasChildren(node) && !isOpen(node))
				celltext += "<img src='" + node_closed + "' width='16' height='22'";
			else
				celltext += "<img src='" + simple_node + "' width='16' height='22'";
		}

		celltext += " border='0' />";

		if (hasChildren(node))
			celltext += "</a>";

		if (lastNode)
			leftSide = leftSide + "<img src='" + blank_node + "' width='16' height='22' />";
		else
			leftSide = leftSide + "<img src='" + vertical_line_node + "' width='16' height='22' />";
	}


	celltext += "</td>";
	celltext += writeNodeCell(node);
	celltext += "</tr>";
	celltext += "</table>";



	if (hasChildren(node) && isOpen(node))
	{
		level = level + 1;

		for (i = varBeforeChildren; i < node.length; i++)
		{
			if (i == node.length - 1)
				celltext += writeNode(node[i], level, 1, leftSide);
			else
				celltext += writeNode(node[i], level, 0, leftSide);
		}
	}


	return celltext;
}

// Write the node cell (icon + label) in the given document.
function writeNodeCell(node)
{
	var	link = ReplaceString(getLink(node), "\\", "\\\\");
	var	celltext = "";

	if ((selectionMode == 2) && (node != dictionaryRoot) 
		&& (!hasChildren(node) || selection_type == 1))
	{
		celltext += "<td valign='middle' nowrap='true'>&nbsp;";
		celltext += "<a href='javascript:selectNode(\"" +
			link + "\",true);' class='link' onmouseover=\"window.status='';return true;\">";
		
		if (isSelected(node))
			celltext += "<img src='" + checked_checkbox + "' border='0'/>";
		else
			celltext += "<img src='" + empty_checkbox + "' border='0'/>";
		
		celltext += "</a>";
		celltext += "&nbsp;</td>";
	}
	
	celltext += "<td valign='middle' nowrap='true'>";
	
	if (isOpen(node) && (getIconOpen(node) != ""))
		celltext += "<img src='" + getIconOpen(node) + "' border='0' />";
	else if (getIconClosed(node) != "")
		celltext += "<img src='" + getIconClosed(node) + "' border='0' />";

	celltext += "</td>";
	celltext += "<td>&nbsp;</td>";

	celltext += "<td valign='middle' align='left' nowrap='true'";

	if (isSelected(node) && (selectionMode == 1))
		celltext += " bgcolor='#000088'";

	celltext += ">";

	if ((selectionMode != 0) 
		&& (!hasChildren(node) || selection_type == 1))
	{
		celltext += "<a href='javascript:selectNode(\"" +
			link + "\",true);' class='link' onmouseover=\"window.status='';return true;\">";
	}

	celltext += "<font class='label'";

	if (isSelected(node) && (selectionMode == 1))
		celltext += " color='#FFFFFF'";

	celltext += ">" + getName(node) + "</font>";

	if ((selectionMode != 0) 
		&& (!hasChildren(node) || selection_type == 1))
		celltext += "</a>";

	celltext += "</td>";
	
	return celltext;
}

// Retrieve a node with its id.
function getNodeById(node, nodeId)
{
	var i = 0;

	if (getId(node) == nodeId)
		return node;
	else
	{
		for (i = varBeforeChildren; i < node.length; i++)
		{
			nodeTmp = getNodeById(node[i], nodeId);

			if (nodeTmp != null)
				return nodeTmp;
		}
	}

	return null;
}

// Open or close a node.
function openNode(nodeId)
{
	var node = getNodeById(dictionaryRoot, nodeId);

	if (isOpen(node))
		setOpen(node, false);
	else
		setOpen(node, true);


	writeDictionary();

}

// Select a node.
function selectNode(nodeId, mouseClick)
{
	var node = getNodeById(dictionaryRoot, nodeId);

	if (selectionMode == 2)
	{
		setSelected(node, !isSelected(node));
	}
	else
	{
		if ((selectedNode != null) && (node != selectedNode))
			setSelected(selectedNode, false);

		setSelected(node, !isSelected(node));

		if (isSelected(node))
			selectedNode = node;
		else
			selectedNode = null;
	}

	if (mouseClick)
	{
		var displayable_value = ComputeDisplayableValue();
		var value = ComputeValue();
		
		root_window.DictionaryEvent(displayable_value, value);
	}
	
	if (selectionMode == 1 && mouseClick && is_popup)
		top.close();
	else
		writeDictionary();
}

function DictionaryEvent(displayable_value, value)
{
	var parent_field = parent_form.elements[parent_field_name];
	var hidden_field = parent_form.elements[hidden_field_name];
	
	parent_field.value = displayable_value;
	hidden_field.value = value;
}

function ComputeDisplayableValue()
{
	var text = "";
	var nodes;

	nodes = new Array;
	
	GetSelectedNodes(nodes, dictionaryRoot);

	for (var i = 0; i < nodes.length; i++)
	{
		if (i != 0)
			text += visibleSep;
			
		nodeTmp = nodes[i];
		text += nodeTmp[1];
	}
	
	return text;
}

function ComputeValue()
{
	var text = "";
	var nodes;

	nodes = new Array;
	
	GetSelectedNodes(nodes, dictionaryRoot);

	for (var i = 0; i < nodes.length; i++)
	{
		if (i != 0)
			text += sep;
			
		nodeTmp = nodes[i];
		text += nodeTmp[0];
	}
	
	return text;
}

function GetHiddenValue()
{
	var hidden_field = parent_form.elements[hidden_field_name];

	return hidden_field.value;
}

function GetSelectedNodes(nodes, parent)
{
	if (hasChildren(parent))
	{
		for (var i = varBeforeChildren; i < parent.length; i++)
		{
			nodeTmp = parent[i];
			
			if (isSelected(nodeTmp))
				nodes[nodes.length] = nodeTmp;

			GetSelectedNodes(nodes, nodeTmp);
		}
	}
}

function OpenDictionaryPopup(url, form, fieldName, hiddenFieldName, width, height)
{
	var screenX = form.elements["screenX"].value - width;
	var screenY = form.elements["screenY"].value - (-12);

	parent_form = form;
	parent_field_name = fieldName;
	hidden_field_name = hiddenFieldName;

	open(url, 'DictionaryWindow_' + fieldName,
		'resizable=no,width=' + width + ',height=' + height +
		',titlebar=no,screenX=' + screenX +
		',screenY=' + screenY + ',left=' + screenX + ',top=' + screenY);
}

function OnKeyPress(evt, form, fieldName, hiddenFieldName)
{
        var resetChar = /[\x00\x08]/;
        var reCarSpeciaux = /[\x00\x08\x0D]/;

        var codeDecimal  = (!document.all) ? evt.which : event.keyCode;
        var car = String.fromCharCode(codeDecimal);
        var autorisation = reCarSpeciaux.test(car);
        var reset = resetChar.test(car);
        
        if (reset)
        {        			
		//ReInit the values of imput only in Netscape
		//Because onKeyPress in Ie not detect suppression caracters
		ResetDictionary(form, fieldName, hiddenFieldName);
        }
        	
        
        return autorisation;
}

function OnKeyDown(evt, form, fieldName, hiddenFieldName)
{
        if (!document.all)
        	return;

	//ReInit the values of imput only in IE
        var resetChar = /[\x2E\x08]/;

        var codeDecimal  = event.keyCode;
        var car = String.fromCharCode(codeDecimal);        
        var reset = resetChar.test(car);
        
        if (reset)
        {        			
		ResetDictionary(form, fieldName, hiddenFieldName);
        }
}

function ResetDictionary(form, fieldName, hiddenFieldName)
{
	parent_form = form;
	parent_field_name = fieldName;
	hidden_field_name = hiddenFieldName;

	var parent_field = parent_form.elements[parent_field_name];
	var hidden_field = parent_form.elements[hidden_field_name];

	parent_field.value = "";
	hidden_field.value = "";
}