var onLabelClick = function(oNode) { 
	var expNode=new Array();
	
	getExpandedNodeList(oNode.tree.getRoot(),expNode);
	var zLink = "";
	for(var i = 0;i<expNode.length;i++){
		var node = expNode[i];
		zLink+=node.data.z;
	}

	var appLoc = oNode.data.h;
	var sm = appLoc.substring(appLoc.indexOf("sm=")+3);
	appLoc = appLoc.substr(0,appLoc.indexOf("?sm="));
	
 	var sm1 = document.getElementsByName("sm");
	var smv = sm1[0].value+oNode.data.sl;	
	var url = concateSMParams(zLink,sm);
	url = concateSMParams(sm1[0].value, url);

	window.location = appLoc+"?sm="+url;
	return false; // added for IE 6 compatibility
}

function URLEncode(plaintext) {
	//plaintext = unescape(plaintext).replace(/&amp;/g, ''); // temp for testing
	
	
	// The Javascript escape and unescape functions do not correspond
	// with what browsers actually do...
	var SAFECHARS = "0123456789" +					// Numeric
					"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +	// Alphabetic
					"abcdefghijklmnopqrstuvwxyz" +
					"-_.!~*'();/:&+";				// RFC2396 Mark characters
	var HEX = "0123456789ABCDEF";

	var encoded = "";
	for (var i = 0; i < plaintext.length; i++ ) {
		var ch = plaintext.charAt(i);
	    if (ch == " ") {
		    encoded += "+";				// x-www-urlencoded, rather than %20
		} else if (SAFECHARS.indexOf(ch) != -1) {
		    encoded += ch;
		} else {
		    var charCode = ch.charCodeAt(0);
			if (charCode > 255) {
//			    alert( "Unicode Character " 
//                        + ch 
//                        + " cannot be encoded using standard URL encoding.\n" +
//				          "(URL encoding only supports 8-bit characters.)\n" +
//						  "A space (+) will be substituted." );
				//encoded += "+";
			} else {
				encoded += "%";
				encoded += HEX.charAt((charCode >> 4) & 0xF);
				encoded += HEX.charAt(charCode & 0xF);
			}
		}
	} // for

	return encoded;//.replace(/&amp;&amp;/g, '');
}
 
function concateSMParams(src,dest){
	var url = src+dest;
	//url = url.replace("&amp\;","");
	url = url.replace(/#/g, '%23');
	url = url.replace("=","" );
	return url;	
} 

function buildHTree1(pathsList,expandedNodeList,facetName){
	var divId = facetName+"_TC";
 	var hTree = YAHOO.widget.TreeView.getTree(divId);
	if(hTree==null)
		hTree = new YAHOO.widget.TreeView(divId);
	
	hTree.multiExpand = true;
	var root = hTree.getRoot();
	var parent = root;
	for(i = 0;i<pathsList.length;i++) {
		listT = pathsList[i];
		parent = root;
		for(var l = 0;l<listT.length;l++) {
			//var thisid = listT[l].v + "_id";
			var thisid 		= listT[l].id;
			var thislabel 	= listT[l].v;
			var thisLink 	= listT[l].l;
			var res 		= listT[l].r;
			var zlink 		= listT[l].z;
			zlink 			= zlink.replace(/#/g, '%23');
			var count 		= listT[l].c;
			var appLoc 		= thisLink;
			var sm 			= appLoc.substring(appLoc.indexOf("sm=")+3);
			appLoc 			= appLoc.substr(0,appLoc.indexOf("?sm="));
			
			if(zlink.charAt(0)=='=') {
				zlink 		= zlink.substring(1);
			}
			
			if(thisLink.charAt(0)=='='){
				thisLink 	= thisLink.substring(1);
			}

			thisLink 		= appLoc + "?sm=" + zlink + sm; //URLEncode(sm);
						
			if(count!=null && count!='undefined') { 
				thislabel 	+= " [" + count + "]";
			}
			
			if (listT[l].isHeader == "true") {
				thislabel 	= "<b>" + thislabel + "</b>";
			}
			else if (listT[l].isHeader == "inactive") {
				var row 	= document.getElementById("FP" + thisid + "_span").parentNode;
				// Only those nodes that are marked inactive and don't have any children being loaded (will have "Loading Hierarchy")
				// must be deactivated, but still shown
				if (row.innerHTML.indexOf("Loading") >= 0) {
					thislabel 	= "<span class=\"inactiveTreeNode\">" + thislabel + "</span>";
					thislink 	= "";
					zlink 		= "";
					res 		= "";
				}
			}
	
			var data = {
				label:thislabel,
				id:thisid,
				h:thisLink,
				z:zlink,
				r:res,
				f:facetName
			};
			
			
			var node = hTree.getNodeByProperty("id", thisid);
			
			if(node==null || node=="undefined"){
				var expandFlag 	= isExpand(expandedNodeList,data.id);
				var tmpNode 	= new YAHOO.widget.TextNode(data, parent, expandFlag);
			 
				if(!expandFlag && listT[l].hc!=null && listT[l].hc=="true"){
			 		tmpNode.setDynamicLoad(loadNodeData,1);
			 	}			 

				if (listT[l].isHeader != "inactive") {	// If inactive, then don't put the onclick link
			 		tmpNode.onLabelClick = onLabelClick;
				}
				if(listT[l].p!='L') {
					parent 	= tmpNode;
				}
			}
			else{
			 	if(listT[l].p!='L') {
			 		parent 	= node;	
			 	}
		 	}
		}
	}

	//expandNode(expandedNodeList,hTree.getRoot());
	parent.tree.draw();
}

function isExpand(expandedNodes,id){
	for(var i = 0;i<expandedNodes.length;i++){
		if(expandedNodes[i]==id)
			return true;	
	} 
	
	return false;	
}

function getExpandedNodeList(rootNode,expandedNodeList){ 
	for (var i=0;i<rootNode.children.length;++i) {
 		var c = rootNode.children[i];
 		if(c.expanded){
			expandedNodeList[expandedNodeList.length] = c;
			getExpandedNodeList(c,expandedNodeList);
	 	}
	}
}


function loadNodeData(node, fnLoadComplete) {
	var url 		= node.data.h;
	url 			= url.substring(url.indexOf("sm=")+3);
	var ind 		= url.lastIndexOf("&");
	var otherParams = document.location.search.substring(4);	// include current URL as params
	url 			= url.substring(0,ind);
	
	
/*	
	var index = url.indexOf('?');
	if(index==-1){
		url+="?sm=";
	}
	
	var sUrl = url.split("?sm")[1]; 
*/
	var sUrl = url;
	var callback = {
		success:addChildren,
		//failure:function(o){alert(o)}, // no need to advertise errors...
		argument:node,
		timeout: 5000
	};
		
	sUrl = sUrl.replace("&amp\;","");
	sUrl = sUrl.replace(/#/g, '%23');
	var sm1 = document.getElementsByName("sm");
	var smv = sm1[0].value;

	if(!node.hasChildren(false)){
		/*
			THIS LINE HAS TO BE UPDATED MANUALLY WHENEVER THE APPLICATION PATH CHANGES. BY DEFAULT
			SEAMARK PUTS IN /test/ + ...
			var fUrl = "/test/"+hPreviewJSP+"?sm="+sUrl+smv;
		*/
		/*****************************************************/
		var fUrl = "/" + hPreviewJSP + "?sm=" + sUrl + smv;
		//alert("smv=" + smv + "\n, Otherparams = " + otherParams);
		/*****************************************************/
		var transaction = YAHOO.util.Connect.asyncRequest('GET',fUrl,callback, null);
	}
	
	fnLoadComplete();
}

function addChildren(o){
	var data 		= eval('(' + o.responseText + ')');
	var parent 		= o.argument;
	var facetName 	= parent.data.f;
	var pNode 		= o.argument;
	var hTree 		= parent.tree;
	var root 		= parent.tree.getRoot();
	var nodes 		= data.nodes;
	var slink 		= pNode.data.h.split("?")[0];
	var expandedNodeList = new Array();
		
	for (var i = 0;i<(nodes.length-1);i++){
		// This try catch statement is there because IE has a problem getting the .node value on the first try (firefox does not) 
		// Everything still works fine
		var lnode = null;
		try {
			lnode = nodes[i].node;
		}
		catch (err) {}
		
		if(lnode!=null && lnode.pr==pNode.data.id){
			//var thisid= lnode.v + "_id";
			var thisid		= lnode.id;
			var thislabel 	= lnode.v;
			var thisLink 	= lnode.l;
			thisLink 		= thisLink.split("?")[1];
			thisLink 		= thisLink.substring(url.indexOf("sm=")+3);
			var res 		= lnode.r;
			var zlink 		= lnode.z;
			
			if(zlink.charAt(0)=='='){
				zlink 		= zlink.substring(1);
			}
			
			if(thisLink.charAt(0)=='='){
				thisLink 	= thisLink.substring(1);
			}
			
			zlink 			= zlink.replace(/#/g, '%23'); 
			thisLink 		= slink + "?sm=" + zlink + thisLink;
			
			var count 		= lnode.c;	
			expandedNodeList[expandedNodeList.length] = parent.data.id;
			
			if(count!=null && count!='undefined'){ 
				thislabel 	+= " [" + count + "]";
			}
					
			var data = {
				label:thislabel,
				id:thisid,
				h:thisLink,
				z:zlink,
				r:res,
				f:facetName 
			};
			
			var node = hTree.getNodeByProperty("id", thisid);
			if(node==null || node=="undefined" || node=='null') {
				var expandFlag 	= isExpand(expandedNodeList, data.id);
				var tmpNode 	= new YAHOO.widget.TextNode(data, parent, expandFlag);
				if(!expandFlag && lnode.hc && lnode.hc=="true") {
					tmpNode.setDynamicLoad(loadNodeData,1);
				}
				
				tmpNode.onLabelClick = onLabelClick;
				if(lnode.p!='L'){
					parent 	= tmpNode;
				}
			}
			else{
				if(lnode.p!='L'){
					parent 	= node;
				}
			}
		}
	}
	
	//expandNode(expandedNodeList,hTree.getRoot());
	o.argument.tree.draw();
	//parent.refresh();
}

function expandNode (expandedNodes,root){
	var tree = root.tree;
	for(var e=0; e<expandedNodes.length; e++){
		var node = tree.getNodeByProperty("id", expandedNodes[e] + "_id");
		if(node != null)
		node.expanded = true;
	}
}

function expandAncestors(root,node){
	while(node != root){
		node = node.parent;
		node.expanded = true;
	}
}
	
function getCheckedNodes(rootNode,checkedNodesList){
	rState = rootNode.checkState;
		
	if(rState != 0 && rState > 0 && rState == 2 ) { // Haha this is so funny, I can't delete it
		checkedNodesList[checkedNodesList.length] = rootNode;
	}
	else {			
		for (var i=0; i<rootNode.children.length; ++i) {
			var c = rootNode.children[i];
			var state = c.checkState;
		 	if(state == 2) {
				checkedNodesList[checkedNodesList.length] = c;
			} else{
				getCheckedNodes(c, checkedNodesList);					
	 		}
 		}
	}
}
