﻿/******************************************************************
 
Copyright © Global Knowledge Software LLC 2007.  All Rights Reserved.
 
This program is protected by U.S. and International Copyright and
Patent Laws.  Unauthorized duplication and/or distribution of this
program is strictly prohibited. Distribution and duplication of this
program are limited by license. If you do not currently have a valid
license from Global Knowledge for this program, any copying or
distribution of the program is unauthorized.  If you do have a current
license from Global Knowledge to utilize this program, your use is
strictly limited by the terms of that license.
 
Patent Pending.
 
******************************************************************/

// common variables

var treeControlDB=false;
var treeForAllCreated=false;		// tree for ALL view is created
var treeForFilteredCreated=false;	// tree for FILTERED view is created
var treeForHemiCreated=false;		// tree for HEMI view is created
var treeViewMode="ALL";				// view mode ("ALL" or "FILTERED" or "HEMI")

var lastSelectedA=null;
var lastSelectedF=null;
var lastSelectedH=null;

function GetJunctionId(s)
{
	k=s.indexOf('_');
	kk=s.indexOf('_',k+1)
	ss=s.substr(0,kk);
	return ss;
}

////////////////////////////////////
// filtering support

var filteredGuidsF=new Array();	// associative array contains all guid to show
var filteredTopicCountF=0;		// number of filtered topics (FILTERED)
var filteredGuidsH=new Array();	// associative array contains all guid to show
var filteredTopicCountH=0;		// number of filtered topics (HEMI)
var filteredGuidsR=new Array();	// associative array contains all guid to show
var filteredTopicCountR=0;		// number of filtered topics (ROLES)
var rolefilter_enabled=false;

var selection_need=false;
var stl_mode="ALL";
var stl_callback="";
var stl_myTopicArray=new Array();
var stl_i=0;
var stl_topicMapId=-1;
var stl_newtMap=false;
var stl_topicMapPageLen=-1;
var global_topicMap=new Array();

function SetTopicList(mode, topicarray, callbackfn)
{
	stl_mode=mode;
	stl_callback=callbackfn;
	if (mode=="FILTERED")
	{
		filteredGuidsF=new Array();
		filteredTopicCountF=topicarray.length;
	}
	else if (mode=="HEMI")
	{
		filteredGuidsH=new Array();
		filteredTopicCountH=topicarray.length;
	}
	else if (mode=="ROLES")
	{
		filteredGuidsR=new Array();
		filteredTopicCountR=topicarray.length;
		rolefilter_enabled=true;
	}
	else	// "NOROLES"
	{
		rolefilter_enabled=false;
		eval(stl_callback+"()");
		return;
	}
	stl_myTopicArray=new Array();
	stl_myTopicArray=topicarray;
	stl_i=0;
	if (stl_topicMapPageLen==-1)
		SetTopicList_LoadPageLen();
	else
		SetTopicList_Next();
}

function SetTopicList_LoadPageLen()
{
	LoadXMLDocArray("../querydb/topicmap/0.xml","SetTopicList_LoadPageLen_Return","","T");
}

function SetTopicList_LoadPageLen_Return(retArray)
{
	stl_topicMapPageLen=parseInt(retArray[0]);
	SetTopicList_Next();
}

function SetTopicList_Next()
{
	fTC=filteredTopicCountF;
	if (stl_mode=="HEMI")
		fTC=filteredTopicCountH;
	if (stl_mode=="ROLES")
		fTC=filteredTopicCountR;
	
	if (!(stl_i<fTC))
	{
		eval(stl_callback+"()");
		return;
	}
	j=stl_myTopicArray[stl_i];
	a=Math.floor((j-1)/stl_topicMapPageLen);
	if (!global_topicMap[""+a])
	{
		stl_topicMapId=a;
		stl_newtMap=true;
		LoadXMLDocArray("../querydb/topicmap/"+a+".xml","SetTopicList_Next2","","T");
	}
	else
	{
		stl_topicMapId=a;
		stl_newtMap=false;
		setTimeout("SetTopicList_Next2()",1);
	}
}

function DecodeTMapArray(tmapArray)
{
	var newArray=new Array();
	var fullstr="";
	for (var i=0;i<tmapArray.length;i++)
	{
		if (i==0)
		{
			newArray[newArray.length]=tmapArray[i];
		}
		else
		{
			var s = { s : tmapArray[i], p : 0 };
			l = ReadBase64_32(s);
			str=fullstr.substr(0,l)+s.s.substr(s.p,s.s.length);
			fullstr=str;
			newArray[newArray.length]=str;
		}
	}
	return newArray;
}

function SetTopicList_Next2(tmapArray)
{
	if (stl_newtMap)
	{
		global_topicMap[""+stl_topicMapId]=DecodeTMapArray(tmapArray);
	}
	j=stl_myTopicArray[stl_i];
	a=Math.floor((j-1)/stl_topicMapPageLen);
	s=global_topicMap[""+stl_topicMapId][j-(a*stl_topicMapPageLen)];
	k=s.indexOf('/');
	while (k>=0)
	{
		ss=""+s.substr(0,k);
		if (stl_mode=="FILTERED")
			filteredGuidsF[ss]=true;
		else if (stl_mode=="HEMI")
			filteredGuidsH[ss]=true;
		else	// "ROLES"
			filteredGuidsR[ss]=true;
		ss=s.substr(k+1);
		s=ss;
		k=s.indexOf('/');							
	}
	if (s.length>0)
	{
		ss=s;
		k=s.indexOf('#');
		if (k>0)
			ss=s.substr(0,k);
		if (stl_mode=="FILTERED")
			filteredGuidsF[ss]=true;
		else if (stl_mode=="HEMI")
			filteredGuidsH[ss]=true;
		else
			filteredGuidsR[ss]=true;
	}
	stl_i++;
	SetTopicList_Next();
}

//////////////////////////////////////////////////////////////////////////////

function TreeViewModeLetter()
{
	return treeViewMode.substr(0,1);
}

function IsFiltered(guid,tMode) // true if the guid must be show
{
	roles=(rolefilter_enabled ? filteredGuidsR[guid]==true : true);
	if (tMode=="ALL")
	{
		return roles;
	}
	else if (tMode=="FILTERED")
		return (roles && filteredGuidsF[guid]==true);
	else	//"HEMI"
		return (roles && filteredGuidsH[guid]==true);
}

function IsAutoExpand()	// true if the tree must be appear expanded
{
	if (treeViewMode=="ALL")
		return false;
	else if (treeViewMode=="FILTERED")
		return (filteredTopicCountF<100)
	else	//"HEMI"
		return (filteredTopicCountH<100)
}

////////////////////////////////////
// delayed tree load support

var treeLoadQueue=new Array();
var treeLoadQueueDivs=new Array();
var treeLoadQueuePtr=0;

function Queue_Init()	// init queue internal variables
{
	treeLoadQueue=new Array();
	treeLoadQueueDivs=new Array();
	treeLoadQueuePtr=0
}

function Queue_Add(s,div)	// add section html file to queue
{
	treeLoadQueue[treeLoadQueue.length]=s;
	treeLoadQueueDivs[treeLoadQueueDivs.length]=div;
}

function Queue_Next(t)	// load next section html file
{
	if (treeLoadQueuePtr<treeLoadQueue.length)
	{
		t.LoadScript(treeLoadQueue[treeLoadQueuePtr],treeLoadQueueDivs[treeLoadQueuePtr]);
		treeLoadQueuePtr++;
	}
	else
	{
		if (selection_need)
		{
			t.SelectFirstItem();
			selection_need=false;
		}
		if (parent.selector.SearchEnable)
		{
			setTimeout("parent.selector.SearchEnable()",100);
		}
		else
		{
			setTimeout("parent.selector.SearchEnable()",500);
		}
	}
}

function createTreeControl(rootData)
{
	if (treeViewMode=="ALL")
	{
		if (treeForAllCreated==true)
			return;
		treeForAllCreated=true;
	}
	else if (treeViewMode=="FILTERED")
	{
		if (treeForFilteredCreated==true)
			return;
		treeForFilteredCreated=true;
		lastSelectedF=null;
	}
	else	//"HEMI"
	{
		if (treeForHemiCreated==true)
			return;
		treeForHemiCreated=true;
		lastSelectedH=null;
	}
	if (treeViewMode=="ALL")
		treeControl = new TreeControl(document.getElementById("treeControlHostForAll"), rootData);
	else if (treeViewMode=="FILTERED")
		treeControl = new TreeControl(document.getElementById("treeControlHostForFiltered"), rootData);
	else	//"HEMI"
		treeControl = new TreeControl(document.getElementById("treeControlHostForHemi"), rootData);
	Queue_Init();
	selection_need=true;
	treeControl.LoadScript(treeControl.rootData + ".html", treeControl.treeHost.id);
}

function TreeControl(host, rootData)
{
	this.host = host;
	this.rootData = rootData;

	host.innerHTML="";
	this.treeHost = document.createElement("div");
	this.treeHost.id = rootData + "_" + TreeViewModeLetter();
	this.treeHost.className = "treeControlNode";
	this.treeHost.onclick = this.OnClick;
	this.treeHost.ondblclick = this.OnDoubleClick;
	this.host.appendChild(this.treeHost);

	if (treeViewMode=="ALL")
		this.loader=document.getElementById("treeControlDataForAll");
	else if (treeViewMode=="FILTERED")
		this.loader=document.getElementById("treeControlDataForFiltered");
	else	//"HEMI"
		this.loader=document.getElementById("treeControlDataForHemi");
	this.loader.className = "treeControlData";

	var imagesToCache = new Array(
		"module_c.gif", "module_o.gif", "outl_f.gif", "outl_fc.gif", "outl_fo.gif", "outl_l.gif",
		"outl_lc.gif", "outl_lo.gif", "outl_m.gif", "outl_mc.gif", "outl_mo.gif", "outl_r.gif", 
		"outl_rc.gif", "outl_ro.gif", "topic.gif", "vert_line.gif", "s.gif");
	
	this.imageCache = new Array();
	for (var i = 0; i < imagesToCache.length; i++) 
	{
		this.imageCache[i] = new Image();
		this.imageCache[i].src = "../img/" + imagesToCache[i];
	}
}

var _indexedSrc="";

TreeControl.prototype.LoadScript = function(src, indexedSrc)
{
	_indexedSrc=indexedSrc;
	setTimeout("treeControl.LoadScriptInternal('" + src + "')", 1);
}

TreeControl.prototype.LoadScriptInternal = function(src)
{
	var l = this.loader;
	var d = (l.contentDocument ? l.contentDocument : (l.contentWindow ? l.contentWindow.document : null));
	if (!d)
		return;
	treeControlDB = true;
	d.location.replace(src);
}

TreeControl.prototype.Bind = function(data)
{
	if (treeControlDB) 
	{
		treeControlDB = false;
		this.TraverseChildren(data.c, document.getElementById(_indexedSrc));
	}
	Queue_Next(this);
}

function UnescapeQuotes(s)
{
	ss=s;
	k=ss.indexOf('&amp;');
	while (k>=0)
	{
		sss=ss.substr(0,k)+"&"+ss.substr(k+5);
		ss=sss;
		k=ss.indexOf('&amp;');
	}
	k=ss.indexOf('&gt;');
	while (k>=0)
	{
		sss=ss.substr(0,k)+">"+ss.substr(k+4);
		ss=sss;
		k=ss.indexOf('&gt;');
	}
	k=ss.indexOf('&lt;');
	while (k>=0)
	{
		sss=ss.substr(0,k)+"<"+ss.substr(k+4);
		ss=sss;
		k=ss.indexOf('&lt;');
	}
	return ss;
}

TreeControl.prototype.TraverseNode = function(node, parentElement, image, last)
{
	var e, f, g, hasChildren;
	node.element = document.createElement("div");
	f = node.element;
	f.className = "treeControlNode";

	hasChildren = node.c || node.d;
	emptylesson=false;
	if (node.e)
		emptylesson=true;
		
	g = f.appendChild(document.createElement("div"));
	g.setAttribute("tpc", (node.i ? node.i : node.d));
	
	e = g.appendChild(document.createElement("img"));
	e.setAttribute("srcroot", "../img/outl_" + image);
	if (emptylesson)
		e.src = e.getAttribute("srcroot") + ".gif";
	else
		e.src = e.getAttribute("srcroot") + (hasChildren ? ( IsAutoExpand() ? "o.gif" : "c.gif") : ".gif");

	e = g.appendChild(document.createElement("img"));

	if (emptylesson)
		e.src= "../img/module_c.gif";
	else
		e.src= ( hasChildren ? (IsAutoExpand() ? "../img/module_o.gif" : "../img/module_c.gif") : 
							"../img/topic.gif" );

	e = g.appendChild(document.createElement("span"));
	ee=e.appendChild(document.createElement("a"));
	ee.className="tsimple";
	ee.style.cursor="pointer";
	ee.onmouseover = this.OnOverItem;
	ee.onmouseout = this.OnOutItem;
	ee.appendChild(document.createTextNode(UnescapeQuotes(node.t)));
	
	parentElement.appendChild(f);

	if (hasChildren) 
	{
		e = node.element.appendChild(document.createElement("table"));
		e.className = "treeControlChildren" + (!IsAutoExpand() ? "H" : "V");
		e.cellSpacing = 0;
		e = e.appendChild(document.createElement("tbody"));
		e = e.appendChild(document.createElement("tr"));
		f = e.appendChild(document.createElement("td"));
		f.className = "treeControlLine" + (last ? "H" : "V");
		f = f.appendChild(document.createElement("img"));
		f.src = "../img/s.gif";

		f = e.appendChild(document.createElement("td"));
		if (node.c)
			this.TraverseChildren(node.c, f);
		if (node.d)
		{
			f.id = node.d + "_" + TreeViewModeLetter();
			return f.id;
		}
	}
	return null;
}

TreeControl.prototype.TraverseChildren = function(children, parentElement)
{
	if (!children)
		return;
	
	var children2=new Array();
	var childrendivs=new Array();

	for (var c=0;c<children.length;c++)
	{
		var guid=(children[c].d ? children[c].d : children[c].i);
		if (IsFiltered(guid,treeViewMode))
			children2[children2.length]=children[c];
	}

	if (children2.length > 0) 
	{
		if (parentElement.className=="treeControlNode")
		{
			if (children2.length==1)
			{
				childrendivs[0]=this.TraverseNode(children2[0], parentElement, "r", true);
			}
			else
			{
				childrendivs[0]=this.TraverseNode(children2[0], parentElement, "f", false);
				var lasti = children2.length - 1;
				for (var i = 1; i < lasti; i++)
					childrendivs[i]=this.TraverseNode(children2[i], parentElement, "m", false);
				childrendivs[lasti]=this.TraverseNode(children2[lasti], parentElement, "l", true);
			}
		}
		else
		{
			var lasti = children2.length - 1;
			for (var i = 0; i < lasti; i++)
				childrendivs[i]=this.TraverseNode(children2[i], parentElement, "m", false);
			childrendivs[lasti]=this.TraverseNode(children2[lasti], parentElement, "l", true);
		}
	} 
	
	if (IsAutoExpand())
	{
		for (var j=0; j<children2.length; j++)
		{
			if (children2[j].d)
				Queue_Add(children2[j].d + ".html",childrendivs[j]);
		}
	}
}

TreeControl.prototype.OnOverItem = function(event)
{
	if (!event)
		event = window.event;
	target=event.target;
	if (!target)
		target = event.srcElement;
	if (target.className=="tselected")
		return;
	target.className="thover";
}

TreeControl.prototype.OnOutItem = function(event)
{
	if (!event)
		event = window.event;
	target=event.target;
	if (!target)
		target = event.srcElement;
	if (target.className=="tselected")
		return;
	target.className="tsimple";
}

TreeControl.prototype.OnClick = function(event)
{
	if (!event)
		event = window.event;
	target=event.target;
	if (!target)
		target = event.srcElement;
	treeControl.OnClickHandler(event,target);
}

TreeControl.prototype.OnDoubleClick = function(event)
{
	if (!event)
		event = window.event;
	target=event.target;
	if (!target)
		target = event.srcElement;
	if (!target.tagName)
		target=target.parentNode;
	if (target.tagName=="A")
	{
		var t=target.parentNode.parentNode.firstChild;
		target=t;
		treeControl.OnClickHandler(event,target);
	}
}

function ChangeSelection(e,first)
{
	ee=(e.tagName=="A" ? e : e.childNodes[0]);
	if (treeViewMode=="ALL")
	{
		if (lastSelectedA) 
		{
			lastSelectedA.className="tsimple";
		}
		lastSelectedA = ee;
		lastSelectedA.className="tselected";
	}
	else if (treeViewMode=="FILTERED")
	{
		if (lastSelectedF) 
		{
			lastSelectedF.className="tsimple";
		}
		lastSelectedF = ee;
		lastSelectedF.className="tselected";
	}
	else	//"HEMI"
	{
		if (lastSelectedH) 
		{
			lastSelectedH.className="tsimple";
		}
		lastSelectedH = ee;
		lastSelectedH.className="tselected";
	}
//	if (!first)
//	{
//		if (ee.parentNode.parentNode.focus)
//			ee.parentNode.parentNode.focus();
//	}
	if (parent["selector"].FocusToSearchField)
		parent["selector"].FocusToSearchField();
}

TreeControl.prototype.SelectFirstItem = function()
{
	var hostname="";
	if (treeViewMode=="ALL")
		hostname="treeControlHostForAll";
	else if (treeViewMode=="FILTERED")
		hostname="treeControlHostForFiltered";
	else	//"HEMI"
		hostname="treeControlHostForHemi";
	var tpc="";
	var spam;
	var f=document.getElementById(hostname);
	while (tpc=="")
	{
		try
		{
			t=f.getAttribute("tpc");
		}
		catch(e)
		{
			return;
		}
		if (t)
		{
			tpc=t;
			spam=f.lastChild;
		}
		f=f.firstChild;
	}
	ChangeSelection(spam,true);
	if (parent.parent.TreeItemSelected)
		parent.parent.TreeItemSelected(tpc,treeViewMode);
}

TreeControl.prototype.OnClickHandler = function(event,t)
{
	var realselect=false;
//	var t = event.target;
	if (!t.tagName)
		t = t.parentNode;
	if (t.tagName == "IMG") 
	{
		var e = t.parentNode.parentNode.lastChild;
		if (e.tagName == "TABLE") // section icon
		{
			var f = t.parentNode.firstChild;
			if (e.className == "treeControlChildrenV") 
			{
				f.src = f.getAttribute("srcroot") + "c.gif";
				f = f.nextSibling
				f.src = "../img/module_c.gif";
				e.className = "treeControlChildrenH";
			} 
			else 
			{
				f.src = f.getAttribute("srcroot") + "o.gif";
				f = f.nextSibling
				f.src = "../img/module_o.gif";
				e.className = "treeControlChildrenV";
				var g = e.firstChild.firstChild.lastChild;
				if (!g.firstChild)
				{
					goriginal=( g.id.length>36 ? GetJunctionId(g.id) : g.id);
					treeControl.LoadScript(goriginal + ".html",g.id);
				}
			}
		}
		else	// topic icon
		{
			var e = t.parentNode.lastChild;
			ChangeSelection(e);
			realselect=true;
		}
	}
	if (t.tagName == "A") // text field in <A> tag
	{
		ChangeSelection(t);
		realselect=true;
	}
	
	var tpc = t.parentNode.getAttribute("tpc");
	if (tpc==null)
		tpc = t.parentNode.parentNode.getAttribute("tpc");
	if (realselect && parent.parent.TreeItemSelected)
		parent.parent.TreeItemSelected(tpc,treeViewMode);

}
