/* Global table that contains all current tree objects in use */
var strSpanDelimiter = "<span style='font-family:Wingdings 3' >g</span>";
var strTitleDelimiter = "-->";
var TREECHECK_Trees = new Hashtable();
/* Tree object class */

function CheckTree(id, imgExp, imgCol, displaySelectionPath)
{
	setmsg("Loading ...");
	cursor_wait();
	this.id = id;
	this.dataName = "";
	this.imageExpand = imgExp;
	this.imageColpse = imgCol;
	this.displayEntirePath = displaySelectionPath;
	
	
	this.currentParentNode = "";
	this.nodesSelected = new Hashtable();
	this.nodesPosition = new Hashtable();
	this.style = getStyleObject(this.id);
	this.style.cursor = 'wait';
	this.parentNodeScrollHeight = 0;
	
	this.searchPos = "";
	this.searchID  = "";
	this.searchTxt = "";
	
	
	// variables to send back to server on selection change
	this.cbNodeArray = null;		// contains actual nodes selected
	this.cbParentArray = null;		// contains only parent nodes
	this.cbChildArray = null;		// contains all IDs selected by parent
	
	this.obj = getObject(this.id);

	var nodePosCount = 0;
	var childCount = 0;
	var divs = this.obj.getElementsByTagName("a");
	for (var i=0; i<divs.length; i++)
    {
		/*if ((this.GetNodeLevel(divs[i].id) == "1") && 
			(divs[i].id.substring(divs[i].id.length-2, divs[i].id.length) != "_i"))
		{
			nodePosCount++;
			this.nodesPosition.put(divs[i].id, nodePosCount);
		}*/
		if (1==1)
		{
			if (this.parentNodeScrollHeight == 0)
				this.parentNodeScrollHeight = divs[i].scrollHeight;
				
			var pSpans = divs[i].getElementsByTagName("a");
			if (pSpans.length)
			{
				pSpans[0].className = this.parentNormalCss;
				
			}

			if (divs[i].attachEvent)
			{
				divs[i].attachEvent('onclick'
									, function(e) { eval("ToggleNode(e,'" + id + "');") }
									);
			}
			else if (divs[i].addEventListener)
			{
				divs[i].addEventListener('onclick'
									, function(e) { eval("ToggleNode(e,'" + id + "');") }
									, false);  
			}    
		}
		else if (this.IsChildNode(divs[i].id))
		{
			childCount++;
			var spans = divs[i].getElementsByTagName("a");
			for (var j=0; j<spans.length; j++)
			{
				spans[j].className = this.childNormalCss;

				if (spans[j].attachEvent)
				{
					spans[j].attachEvent('onclick'
										, function(e) { eval("cSelect(e,'" + id + "');") }
										);
				}
				else if (spans[j].addEventListener)
				{
					spans[j].addEventListener('onclick'
										, function(e) { eval("cSelect(e,'" + id + "');") }
										, false);  
				}    
			}
		}
    }
    
    var chks = this.obj.getElementsByTagName("a");
    for (var i=0; i<chks.length; i++)
    {
		if (chks[i].checked) 
		{
			var nodeid= chks[i].id.substring(0, chks[i].id.length-4)
			this.nodesSelected.put(nodeid, this.GetNodeValue(nodeid));
		}
		if(1==1)
		{
			if (chks[i].attachEvent)
			{
				chks[i].attachEvent('onclick'
									, function(e) { eval("NodeChecked(e,'" + id + "',true);") }
									);
				chks[i].attachEvent('onmouseout'
									, function(e) { eval("ChkMouseOut(e,'" + id + "');") }
									);
			}
			else if (chks[i].addEventListener)
			{
				chks[i].addEventListener('click'
									, function(e) { eval("NodeChecked(e,'" + id + "',true);") }
									, false);  
				chks[i].addEventListener('mouseout'
									, function(e) { eval("ChkMouseOut(e,'" + id + "');") }
									, false);  
			}    
		}
    }
    
    TREECHECK_Trees.put(this.id, this);
	
	clearObject(this.id+'_Loading');
	changeObjectVisibility(this.id, 'visible');
	setmsg("");
	this.style.cursor = 'default';
	cursor_clear();
	var treeObj = TREECHECK_Trees.get(id);
	eval(id + " = TREECHECK_Trees.get(id);");
	treeObj.SelectionsChanged();
	
}

function CheckTree_SetNode(nodeID, bSelected)
{
	//Clear the hashtable if controltype is radio and hide the tree control
	if (document.getElementById(nodeID +"_chk") && document.getElementById(nodeID +"_chk").type == "radio") 
	{
		this.nodesSelected = new Hashtable();
		ExpandCollapseTreeSelectionList(this.id)
	}
	if (bSelected)
	{
		this.nodesSelected.put(nodeID, this.GetNodeValue(nodeID));
	}
	else
	{	
		this.nodesSelected.put(nodeID, '');
	}
	
}

function CheckTree_GetNodeLevel(nodeID)
{
	return (nodeID.substring(this.id.length+2,this.id.length+3));
}

function CheckTree_GetNodeSetting(nodeID)
{
	return this.nodesSelected.get(nodeID);
}

function CheckTree_IsNodeSelected(nodeID)
{
	return (this.GetNodeSetting(nodeID) && (this.GetNodeSetting(nodeID) != ''));
}

function CheckTree_IsParentNode(nodeID)
{
	var pTag = this.id + "_p";
	return ((nodeID.substring(0,pTag.length) == pTag) && (nodeID.substring(nodeID.length-2, nodeID.length) != "_i"))
}

function CheckTree_IsChildNode(nodeID)
{
	var cTag = this.id + "_c";
	return (nodeID.substring(0,cTag.length) == cTag);
}

function CheckTree_SetNodeClass(nodeID, bMouseOver)
{
	var nodeObj = getObject(nodeID);
	if (!nodeObj) return;
		
	if (this.IsParentNode(nodeID))
	{	
		this.SetNodeTextClass(nodeID, (bMouseOver) ? this.parentSelectedOverCss : this.parentSelectedCss);
	}
	else if (this.IsChildNode(nodeID))
	{
		this.SetNodeTextClass(nodeID, (bMouseOver) ? this.childNormalOverCss : this.childNormalCss);
	}
}


function CheckTree_GetNodeValue(nodeID)
{
	nodeObj = getObject(nodeID);
	var val = nodeObj.value;

	if (!val)
	{
		for (var i=0; i<nodeObj.attributes.length; i++)
		{
			if (nodeObj.attributes[i].name == "value")
			{
				val = nodeObj.attributes[i].value;
				break;
			}
		}
	}
	
	return val;
}

function CheckTree_GetCheckboxValue(nodeID)
{
	var value = "";
	
	var nodeObj = getObject(nodeID + "_chk");
	
	if (nodeObj && nodeObj.checked)
		value = nodeObj.value;
		
	return value;
}

function CheckTree_SetNodeTextClass(nodeID, cName)
{
	var nodeObj = getObject(nodeID);
	
	if (nodeObj)
	{
		var spans = nodeObj.getElementsByTagName("span");
		for (var i=0; i<spans.length; i++)
		{
			if (spans[i].parentNode == nodeObj)
			{
			}
			else
				break;
		}
	}
}

function CheckTree_GetParentNode(nodeID)
{
	var nodeObj = getObject(nodeID);
	var parentObj = nodeObj.parentNode;
	
	if (!parentObj || (parentObj == this.obj))
		return false;	
	
	while ((parentObj) && (!this.IsParentNode(parentObj.id)))
	{
		parentObj = parentObj.parentNode;
	}

	return parentObj;	
}

function CheckTree_SelectionsChanged()
{
	
	cursor_wait();
	var parentObj = null;

	this.cbNodeArray = new Array();
	this.cbParentArray = new Array();
	this.cbChildArray = new Array();
	this.nodesSelected = new Hashtable();
	
	var alertstring = "";
	var mouseoverstring = "";
	var chks = this.obj.getElementsByTagName("input");
    for (var i=0; i<chks.length; i++)
    {
		if (chks[i].checked) 
		{
			var nodeid= chks[i].id.substring(0, chks[i].id.length-4)
			this.nodesSelected.put(nodeid, this.GetNodeValue(nodeid));
		}
	}
	
	for (var i=0; i<this.nodesSelected.keys.length; i++)
	{
		var nodeID = this.nodesSelected.keys[i];
		var parentText = "";
		var parentID = "";
		var flag= false;
		if (this.IsNodeSelected(nodeID))
		{	
		
			for (var j=0; j<=this.GetNodeLevel(nodeID)-1; j++)
			{
				if (parentID == "")  parentID = nodeID;
				parentObj = this.GetParentNode(parentID);
				if (parentObj) 
				{
					if (this.IsNodeSelected(parentObj.id))
					{
						parentText = this.GetNodeText(parentObj.id);
						flag = true;
					}
					else
						parentText = this.GetNodeText(parentObj.id) + " " + strTitleDelimiter + " " + parentText;	
				}
				parentID = parentObj.id
			}
			
			if (!flag) 
			{
				if (this.displayEntirePath == "True") alertstring += parentText
				
				alertstring += this.GetNodeText(nodeID);
				alertstring += ", ";
				
				mouseoverstring += parentText + this.GetNodeText(nodeID) +", ";
			}
			
			this.cbNodeArray[this.cbNodeArray.length] = nodeID;
			if (this.IsChildNode(nodeID))
			{
				parentObj = this.GetParentNode(nodeID);
				if (parentObj)
				{
					this.cbParentArray[this.cbParentArray.length] = this.GetNodeValue(parentObj.id);
					this.cbChildArray[this.cbChildArray.length] = this.GetNodeValue(nodeID);
				}
			}
		}
	}
	cursor_clear();
}

function CheckTree_ToggleNode(nodeID)
{
	nodeID.substring(nodeID.length-2, nodeID.length)
	var inodeID = nodeID.substring(0, nodeID.length-4) + "_i";
	var inodeObj = getStyleObject(inodeID);
	if (!inodeObj) return;
	var imgID = getObject(nodeID + '_img');
	
	if (inodeObj.display == 'inline')
	{
		if (inodeObj.display) inodeObj.display = 'none';
		changeObjectVisibility(inodeID, 'hidden');

		if (imgID) imgID.src = this.imageExpand;
	}
	else
	{
		if (inodeObj.display) inodeObj.display = 'inline';
		changeObjectVisibility(inodeID, 'visible');
		if (imgID) imgID.src = this.imageColpse;
	}

}

function CheckTree_NodeChecked(nodeID, bUpdate)
{
	var nodeObj = getObject(nodeID);
	if (!nodeObj) 	return;
	var chkObj = getObject(nodeID + "_chk");
	var parentID = ""
	if (chkObj)
	{
		this.SetNode(nodeID, chkObj.checked);
		cursor_wait();
		/////nodeObj.disabled = true;
		setTimeout("CheckTree_NodeChecked_OnTimer('" + this.id + "', '" + nodeID + "', " +  chkObj.checked + ", " + bUpdate + ")", 5);
	}
	//Call Onchange Function
	var treeObj = TREECHECK_Trees.get(this.id);
    if (treeObj.onChange) treeObj.onChange();		
	
}
function CheckTree_GetNodeText(nodeID)
{
	var text = "";
	var nodeObj = getObject(nodeID + "_lbl");
	
	if (nodeObj)
		text = (ie) ? nodeObj.innerText : nodeObj.innerHTML;
		
	return text;
}

function CheckTree_NodeChecked_OnTimer(id, nodeID, checked, bUpdate)
{
	var treeObj = TREECHECK_Trees.get(id);
	var nodeObj = getObject(nodeID);
	var inodeObj = getObject(nodeID + "_i");
	
	nodeObj.disabled = false;
	cursor_clear();
	
	if (inodeObj && document.getElementById(nodeID +"_chk") && document.getElementById(nodeID +"_chk").type == "checkbox")  treeObj.SelectChildren(inodeObj, checked, bUpdate);

	treeObj.SetNodeClass(nodeID, false);
	parObj = treeObj.GetParentNode(nodeID);
	while (parObj)
	{
		var chkObj = getObject(parObj.id + "_chk");
		if (treeObj.HasSelections(parObj.id))
		{
			if (chkObj && !checked)
				chkObj.checked = false;
				
		}
		else
		{
			if (chkObj)
				chkObj.checked = false;
			treeObj.SetNode(parObj.id, false);
		}
		treeObj.SetNodeClass(parObj.id, false);
		parObj = treeObj.GetParentNode(parObj.id);
	}
	treeObj.SelectionsChanged();
	
}

function CheckTree_ChkMouseOut(nodeID)
{
	setmsg("");
}

function CheckTree_SelectChildren(nodeObj, bSelect, bUpdate)
{
    var divs = nodeObj.getElementsByTagName("div");
    for (var i=0; i<divs.length; i++)
    {
		var chkObj = getObject(divs[i].id + "_chk");
		if (chkObj) chkObj.checked = bSelect;
		this.SetNode(divs[i].id, bSelect);
	}
	
    for (var i=0; i<divs.length; i++)
    {
		if (this.IsParentNode(divs[i].id) || this.IsChildNode(divs[i].id))
			this.SetNodeClass(divs[i].id, false);
	}

	if (bUpdate)	
		this.SelectionsChanged();
}

function CheckTree_NodeSelected(nodeID)
{
	var nodeObj = getObject(nodeID);
	if (nodeObj)
	{
		var spans = nodeObj.getElementsByTagName("span");
		for (var i=0; i<spans.length; i++)
		{
			//this.ChildSelect(nodeID, spans[i].id, false);
			spans[i].className = this.childSelectedCss;
		}
	}
}

function CheckTree_HasSelections(pNodeID)
{
	var iObj = getObject(pNodeID + "_i");
	if (iObj)
	{
		var divs = iObj.getElementsByTagName("div");
		for (var i=0; i<divs.length; i++)
		{
			if ((divs[i].id.length > 4) && (this.IsParentNode(divs[i].id)))
			{
				if (this.IsNodeSelected(divs[i].id))
					return true;
			}
			else if (this.IsChildNode(divs[i].id))
			{
				if (this.IsNodeSelected(divs[i].id))
					return true;
			}
		}
	}
	
	return false;
}

function CheckTree_ChildSelect(divID, nodeID, bUpdate)
{
	var nodeObj = getObject(nodeID);
	var styObj = getStyleObject(nodeID);s
	var bSelected = this.IsNodeSelected(divID);
	var parObj;
	if (nodeObj)
	{
		if (bSelected)
		{
			// Unselect
			this.SetNode(divID, false);
			styObj.cursor = 'pointer';	
			var chkObj = getObject(divID + "_chk");
				if (chkObj)
					chkObj.checked = false;
			
			parObj = this.GetParentNode(divID);
			if (parObj)			
			{
				this.SetNode(parObj.id, false);
				var chkObj = getObject(parObj.id + "_chk");
				if (chkObj)
					chkObj.checked = false;
			}
		}
		else
		{
			var chkObj = getObject(divID + "_chk");
				if (chkObj)
					chkObj.checked = true;
			// Select
			this.SetNode(divID, true);
			styObj.cursor = 'pointer';		
		}
		
		this.SetNodeClass(divID, false);
		
		parObj = this.GetParentNode(divID);
		while (parObj)
		{
			var parChkObj = getObject(parObj.id + "_chk");
			if (parChkObj && bSelected)
				parChkObj.checked = false;
			if (!this.HasSelections(parObj.id))
			{
				this.SetNode(parObj.id, false);
				parChkObj.checked = false;
			}
			this.SetNodeClass(parObj.id, false);
			parObj = this.GetParentNode(parObj.id);
		}
	}

	setmsg("");	
	if (bUpdate)
		this.SelectionsChanged();
}

function CheckTree_SetParentNode(pNodeID)
{
	this.currentParentNode = pNodeID;
}

function getNodeID(eventObj, bubbleCancel)
{
	var nid="";
	//if (browser.isIE)
	if (1==1)
	{
		if (eventObj == null)
			eventObj = window.event;
		eventObj.cancelBubble = bubbleCancel;
		nid = eventObj.srcElement.id;
	}
	else
	{
		eventObj.cancelBubble = bubbleCancel;
		nid = eventObj.target.id;
	}
	return nid;
}

function getDivID(eventObj, bubbleCancel)
{
	var nid="";
	//if (browser.isIE)
	if (1==1)
	{
		if (eventObj == null)
			eventObj = window.event;
		eventObj.cancelBubble = bubbleCancel;
		nid = eventObj.srcElement.parentElement.id;
	}
	else
	{
		eventObj.cancelBubble = bubbleCancel;
		nid = eventObj.target.parentNode.id;
	}
	return nid;
}

function ToggleNode(eventObj, treeID)
{
	var treeObj = TREECHECK_Trees.get(treeID);
	if (treeObj)
	{
		
		treeObj.ToggleNode(getDivID(eventObj, true));
	}
}

function NodeChecked(eventObj, treeID)
{
	var treeObj = TREECHECK_Trees.get(treeID);
	if (treeObj)
	{
		treeObj.NodeChecked(getDivID(eventObj, true), true);
	}
}

function ChkMouseOut(eventObj, treeID)
{
	var treeObj = TREECHECK_Trees.get(treeID);
	if (treeObj)
	{
		treeObj.ChkMouseOut(getDivID(eventObj, false));
	}
}

function cSelect(eventObj, treeID)
{
	
	var treeObj = TREECHECK_Trees.get(treeID);
	if (treeObj)
		treeObj.ChildSelect(getDivID(eventObj, false), getNodeID(eventObj, false), true);
}

function setParentNode(eventObj, treeID, pNodeID)
{
	var treeObj = TREECHECK_Trees.get(treeID);
	if (treeObj)
		treeObj.SetParentNode(pNodeID);
}

CheckTree.prototype.GetNodeText = CheckTree_GetNodeText;
CheckTree.prototype.GetNodeLevel = CheckTree_GetNodeLevel;
CheckTree.prototype.SetNode = CheckTree_SetNode;
CheckTree.prototype.GetNodeSetting = CheckTree_GetNodeSetting;
CheckTree.prototype.IsNodeSelected = CheckTree_IsNodeSelected;
CheckTree.prototype.IsParentNode = CheckTree_IsParentNode;
CheckTree.prototype.IsChildNode = CheckTree_IsChildNode;
CheckTree.prototype.SetNodeClass = CheckTree_SetNodeClass;
CheckTree.prototype.GetNodeValue = CheckTree_GetNodeValue;
CheckTree.prototype.GetParentNode = CheckTree_GetParentNode;
CheckTree.prototype.SelectionsChanged = CheckTree_SelectionsChanged;
CheckTree.prototype.ToggleNode = CheckTree_ToggleNode;
CheckTree.prototype.NodeChecked = CheckTree_NodeChecked;
CheckTree.prototype.ChkMouseOut = CheckTree_ChkMouseOut;
CheckTree.prototype.SelectChildren = CheckTree_SelectChildren;
CheckTree.prototype.NodeSelected = CheckTree_NodeSelected;
CheckTree.prototype.ChildSelect = CheckTree_ChildSelect;
CheckTree.prototype.SetParentNode = CheckTree_SetParentNode;
CheckTree.prototype.HasSelections = CheckTree_HasSelections;
CheckTree.prototype.GetCheckboxValue = CheckTree_GetCheckboxValue;
CheckTree.prototype.SetNodeTextClass = CheckTree_SetNodeTextClass;
CheckTree.prototype.Clear = CheckTree_ClearTreeSelections;
CheckTree.prototype.Show = CheckTree_Show;
CheckTree.prototype.Hide = CheckTree_Hide;
CheckTree.prototype.Expand = CheckTree_Expand;
CheckTree.prototype.Collapse = CheckTree_Collapse;
CheckTree.prototype.SelectedText = CheckTree_SelectedText;

var nav = (navigator.appName=="Netscape") ? true : false;
var mac = (navigator.appVersion.indexOf("Mac") != -1);
var ie = (document.all) ? true : false;

//*****************************************************************
//* Hashtable definitions
	Hashtable.prototype.hash = null;
	Hashtable.prototype.keys = null;
	Hashtable.prototype.location = null;

	function Hashtable()
	{
		this.hash = new Array();
		this.keys = new Array();

		this.location = 0;
	}

	Hashtable.prototype.get = function (key) {
		return this.hash[key];
	}

	Hashtable.prototype.put = function (key, value)
	{
		if (value == null)
			return null;

		if (this.hash[key] == null)
			this.keys[this.keys.length] = key;

		this.hash[key] = value;
	}

function cursor_wait() 
{
	document.documentElement.className = 'waitCursor';
}

function cursor_clear() 
{
	document.documentElement.className = ''; 
}

function clearObject(objID)
{
	var obj = getObject(objID);
	
	if (obj)
	{
		while (obj.childNodes[0])
			obj.removeChild(obj.childNodes[0]);
	}
}


function setmsg(msg) {
  window.status=msg
  return true
}

function getStyleObject(objectId) 
{
    if(document.getElementById && document.getElementById(objectId)) {
	return document.getElementById(objectId).style;
    } else if (document.all && document.all(objectId)) {
	return document.all(objectId).style;
    } else if (document.layers && document.layers[objectId]) {
	return document.layers[objectId];
    } else {
	return false;
    }
} 

function getObject(objectId)
{
    if(document.getElementById && document.getElementById(objectId)) {
	return document.getElementById(objectId);
    } else if (document.all && document.all(objectId)) {
	return document.all(objectId);
    } else if (document.layers) {
	return eval('document.'+objectId);
    } else {
	return false;
    }
}

function changeObjectVisibility(objectId, newVisibility) 
{
    var styleObject = getStyleObject(objectId);
    
    if(styleObject) 
    {
		styleObject.visibility = newVisibility;
		return true;
    } 
    else 
    {
		alert('no style: ' + objectId);
		return false;
    }
}

//function Expand(spanID, divID, textboxID, iframeTreeCtrlId)
function ExpandCollapseTreeSelectionList(ControlID)
{
	var span = document.getElementById("spnArrow_" + ControlID);
	var div = document.getElementById("divTree_" + ControlID);
	var iframe= document.getElementById("iframe_" + ControlID);
	var trTree = document.getElementById("trTree_" + ControlID);
	
	iframe.style.width = div.style.width;
	iframe.style.height = div.style.height;
	iframe.style.top = div.style.top;
	iframe.style.left = div.style.left;
	iframe.style.zIndex = div.style.zIndex - 1;
	
	
	if (div.style.display =="none")
	{
		div.style.display = "block";
		span.title = "Click to collapse";
		iframe.style.display = "block";
		trTree.style.display = "block";
	}
	else
	{
		div.style.display = "none";
		span.title = "Click to expand";
		iframe.style.display = "none";
		trTree.style.display = "none";
	}
}

function CheckTree_Show()
{
	document.getElementById("tblTree_" + this.id).style.display = "block";
}

function CheckTree_Hide()
{
	document.getElementById("tblTree_" + this.id).style.display = "none";
}

function CheckTree_Expand()
{
	document.getElementById("divTree_" + this.id).style.display = "none";
	ExpandCollapseTreeSelectionList(this.id);
}

function CheckTree_Collapse()
{
	document.getElementById("divTree_" + this.id).style.display = "block";
	ExpandCollapseTreeSelectionList(this.id);
}

function CheckTree_ClearTreeSelections()
{
	
	var chks = this.obj.getElementsByTagName("input");	
	for (var i=0; i<chks.length; i++)
    {
		chks[i].checked = false;
		var nodeid= chks[i].id.substring(0, chks[i].id.length-4)
		this.nodesSelected.put(nodeid, '');
	}
	var treeObj = TREECHECK_Trees.get(this.id);
	treeObj.SelectionsChanged();	
}

function CheckTree_SelectedText()
{
	return (document.getElementById("spnData_"+ this.id).innerText);
}


function replaceAll( str, from, to ) {
    var idx = str.indexOf( from );


    while ( idx > -1 ) {
        str = str.replace( from, to ); 
        idx = str.indexOf( from );
    }

    return str;
}


function replaceChars(entry) {

var strOut = ""
var temp="";
for (var i=0; i<=entry.length-1; i++)
{
	var s=entry.substr(i, 1);
	if (s == "&")
		temp += " " + s + " ";
	else
		temp += s
}
return temp;
}

