// ********************
// functions.js

// ********************
// Global variables

	var arrTree;
	arrTree = new Array;
	var searchStr;
	searchStr = new Array;
	searchStr[0] = "";
	var searchMode = "and";
	var allOpen = 0;
	var all = 0;
	var mark = 1;
	var arrAux;
	arrAux = new Array;

	var lastClick = "";
	var timeOutId = 0;

// ********************
// Event handlers

//called after html file is loaded
function initializeTractatus(){
	arrAux[0] = treeElement("", "Ludwig Wittgenstein - Tractatus logico-philosophicus", 0);
	arrAux[0][0] = 1;
	arrAux[0][1] = 1;
	generateArrTree();
	redrawTree();
}

//called when the user clicks on a folder
function openBranch(branchNr){
	lastClick = branchNr;
	clickOnFolderRec(arrAux[0], branchNr)
	//if (branchName=="Start Menu" && arrAux[0][0]==0)
	//	top.folderFrame.location="basefolder.htm";
	timeOutId = setTimeout("redrawTree()",100);
}

function getPosition(element){
  var elem=element,tagname="",x=0,y=0;

  while ((typeof(elem)=="object")&&(typeof(elem.tagName)!="undefined"))
  {
    y+=elem.offsetTop;     /* Offset des jeweiligen Elements addieren */
    x+=elem.offsetLeft;    /* Offset des jeweiligen Elements addieren */
    tagname=elem.tagName.toUpperCase(); /* tag-Name ermitteln, Grossbuchstaben */

    if (tagname=="BODY")
      elem=0;

    if (typeof(elem)=="object")
      if (typeof(elem.offsetParent)=="object")
        elem=elem.offsetParent;
  }
  position=new Object();
  position.x=x;
  position.y=y;
  return position;
}

//repositioning of the frame
function alertPosition(elementId){
  var a,element;
  element=top.treeFrame.window.document.getElementById(elementId);
  a=getPosition(element);
  if(a.y>500) top.treeFrame.window.scrollTo(0,a.y-25);
}

function doFormular(newStr, newMode, newMark, newAll, newAllOpen){

	newStr = newStr.toLowerCase();
	searchStr = newStr.split(",");
	for(i=0; i<searchStr.length; i++){
		var start = 0;
		var end = searchStr[i].length-1;
		while(searchStr[i].charAt(start) == " "){
			start++;
		}
		while(searchStr[i].charAt(end) == " "){
			end--;
		}
		searchStr[i] = searchStr[i].substring(start, end+1);
	}
	searchMode = newMode;
	allOpen = newAllOpen;
	all = newAll;
	mark = newMark;

	for(i=0; i<arrAux.length; i++){
		arrAux.pop
	}
	lastClick="";
	initializeTractatus();
}


// ********************
// Auxiliary functions

//generating the array for actual tree
function generateArrTree(){
	for(i=0; i<arrTree.length; i++){
		arrTree.pop;
	}
	for(i=0; i<arr.length; i++){
		arrTree[i] = new Array;
	}
	var j=0;
	for(i=0; i<arr.length; i++){
		test = arr[i][2].toLowerCase();
		var searchResult = -1;
		for(k=0; k<searchStr.length; k++){
			if(searchResult == -1 && k>0){
				if(searchMode == "or"){
					searchResult=test.search(searchStr[k]);
				}
			}else{
				searchResult=test.search(searchStr[k]);
			}
		}
		if(searchResult!=-1 || all==1){
			arrTree[j][0]=arr[i][0];
			arrTree[j][1]=arr[i][1];
			if(mark==1 && searchStr[0]!=""){
				arrTree[j][2]=arr[i][2];
				for(n=0; n<searchStr.length; n++){
					arrTree[j][2]=markUp(arrTree[j][2],searchStr[n]);
				}
			}else{
				arrTree[j][2]=arr[i][2];
			}
			j++;
		}
		if(all==1){
			j=i+1;
		}

	}
	while(j<arr.length){
		arrTree.pop();
		j++;
	}
	for(i=1; i<arrTree.length; i++){
		if(checkElementPosition(arrTree[i][1], arrTree[i-1][1]) == false){
			arrTree[i-1][0] = 1;
		}
	}
	if(arrTree.length>0) arrTree[arrTree.length-1][0] = 1;
	generateTree();
}

//generating the tree
function generateTree(){
	var j=0;
	for(i=0; i<arrTree.length; i++){
		var nr = arrTree[i][1];
		var txt = arrTree[i][2];
		j = getNode(j, nr);

		if(arrTree[i][0] == 1){
			appendChild(arrAux[j], treeElement(nr, txt, 1));
		}else{
			arrAux[j+1] = appendChild(arrAux[j], treeElement(nr, txt, 0));
			j++;
		}
	}
}

function getNode(j, nr){
	if(checkElementPosition(nr, arrAux[j][3]) == true){
		return j;
	}else{
		if(j>0){
			return getNode(j-1, nr);
		}else{
			return 0;
		}
	}
}

function checkElementPosition(nr, nrOld){
	if(nr.slice(0,nrOld.length) == nrOld){ var check = true; }else{ var check = false; }
	return check;
}

//Auxiliary function to build a tree element
function treeElement(nr, name, node){
	var arrayAux;
	arrayAux = new Array;
	arrayAux[0] = allOpen*(allOpen-node);
	arrayAux[1] = allOpen*(allOpen-node);
	arrayAux[2] = node;
	arrayAux[3] = nr;
	arrayAux[4] = name;
	return arrayAux;
}

//this way the generate tree function becomes simpler and less error prone
function appendChild(parent, child){
	parent[parent.length] = child;
	return child;
}

//mark search string
function markUp(txt,markStr){
	var temp = txt.toLowerCase();
	var retStr = "";
	var i = temp.search(markStr);
	while(i!=-1){
		retStr += txt.substr(0,i);
		retStr += "<b id=red>" + txt.substr(i, markStr.length) + "</b>";
		j = i+markStr.length;
		k = temp.length-j;
		temp = temp.substr(j, k);
		txt = txt.substr(j, k);
		i=temp.search(markStr);
	}
	return retStr + txt;
}

// **********************
// display functions

//redraws the Tree
function redrawTree(){
	var doc = top.treeFrame.window.document;

	doc.clear();
	doc.write("<html>");
	doc.write("<meta http-equiv='pragma' content='no-cache'>");
	doc.write("<head>");
	doc.write("</head>");
	doc.write("<body bgcolor='#f5f5f5'>");
	doc.write("<div id='mentab'>");
	doc.write("<link rel=stylesheet type='text/css' href='sys/menstyles.css'>");
	doc.write("<table bgcolor=#ffffff border=1 bordercolor=#5B6779 cellspacing=0 cellpadding=10 height=98% width='800px'>");
	doc.write("<tr valign='top' valign=top><td align=left><br><br>");

	doc.write("<form name='tractatus'><table border=0 cellpadding=0 cellspacing=0>");
	doc.write("<tr><td>Suchwort: </td><td>&nbsp;&nbsp;&nbsp;</td><td><input type='text' name='searchStr' accesskey='f' value='");
	for(k=0; k<searchStr.length; k++){
		doc.write(searchStr[k]);
		if(searchStr.length>1 && k<(searchStr.length-1)){
			doc.write(", ");
		}
	}
	doc.write("'><button id='button' type='submit' name='search' accesskey='s' onClick='parent.doFormular(this.form.searchStr.value,this.form.searchMode.value,this.form.mark.value,this.form.all.value,this.form.allOpen.value);'>search <small>(alt+s)</small></button></td></tr>");
	if(searchMode=="and"){
		doc.write("<tr><td>Suchmodus: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='searchMode'><option value='and' selected>and</option><option value='or'>or</option></select></td></tr>");
	}else{
		doc.write("<tr><td>Suchmodus: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='searchMode'><option value='and'>and</option><option value='or' selected>or</option></select></td></tr>");
	}
	if(mark==1){
		doc.write("<tr><td>Suchwort markieren: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='mark'><option value='1' selected>ja</option><option value='0'>nein</option></select></td></tr>");
	}else{
		doc.write("<tr><td>Suchwort markieren: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='mark'><option value='1'>ja</option><option value='0' selected>nein</option></select></td></tr>");
	}
	if(all==1){
		doc.write("<tr><td>Baum komplett anzeigen: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='all'><option value='1' selected>ja</option><option value='0'>nein</option></select></td></tr>");
	}else{
		doc.write("<tr><td>Baum komplett anzeigen: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='all'><option value='1'>ja</option><option value='0' selected>nein</option></select></td></tr>");
	}
	if(allOpen==1){
		doc.write("<tr><td>Baum aufklappen: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='allOpen'><option value='1' selected>ja</option><option value='0'>nein</option></select></td></tr>");
	}else{
		doc.write("<tr><td>Baum aufklappen: </td><td>&nbsp;&nbsp;&nbsp;</td><td><select name='allOpen'><option value='1'>ja</option><option value='0' selected>nein</option></select></td></tr>");
	}
	doc.write("</table></form>");
	doc.write("<b id='petit'>[alt + f] ins Suchfeld springen<br>[alt + s] Suche abschicken<br>");
	doc.write("verschiedene Suchstrings sind mit Komma zu trennen;<br>nicht mit Komma getrennte Worte werden als Wortfolge gesucht</small>");

	doc.write("<br><br>");
	redrawNode(arrAux[0], doc, 0, 1, "");
	for(i=0; i<18; i++){
		doc.write("<br>");
	}
	doc.write("<b id='petit'>Text: Ludwig Wittgenstein&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTML-Konzept: Hannes Meder-Wernicke</small>");
	doc.write("</td></tr></table>");
	doc.write("<br>");
	doc.write("</div></body>");
	doc.write("</html>");
	doc.close();
	if(lastClick != "") alertPosition(lastClick);
}

//recursive function over the tree structure called by redrawTree
function redrawNode(foldersNode, doc, level, lastNode, leftSide){
	var j=0;
	var i=0;

	doc.write("<table border=0 cellspacing=0 cellpadding=0 width='150px'>");
	doc.write("<tr valign='top' height=26>");
	doc.write(leftSide);

	if (level>0)
		if (lastNode) //the last 'brother' in the children array
		{
			doc.write("<td height=26 valign=top nowrap style='background-image:url(img/blank.gif)'>");
			doc.write("<img src='img/lastnode.gif' width=16 height=26>");
			leftSide = leftSide + "<td height=26 valign=top nowrap style='background-image:url(img/blank.gif)'><img src='img/blank.gif' width=16 height=26>";
		}
		else
		{
			doc.write("<td height=26 valign=top nowrap style='background-image:url(img/vertline.gif)'>");
			doc.write("<img src='img/node.gif' width=16 height=26>");
			leftSide = leftSide + "<td height=26 valign=top nowrap style='background-image:url(img/vertline.gif)'><img src='img/vertline.gif' width=16 height=26></td>";
		}

	if (foldersNode[1])
		doc.write("</td><td height=26 valign=top nowrap style='background-image:url(img/vertline.gif)'>");
	else
		doc.write("</td><td height=26 valign=top nowrap style='background-image:url(img/blank.gif)'>");
	displayIconAndLabel(foldersNode, doc);
	doc.write("</td></tr></table>");

	if (foldersNode.length > 5 && foldersNode[0]) //there are sub-nodes and the folder is open
	{
		level=level+1;
		for (i=5; i<foldersNode.length; i++)
			if (i==foldersNode.length-1)
				redrawNode(foldersNode[i], doc, level, 1, leftSide);
			else
				redrawNode(foldersNode[i], doc, level, 0, leftSide);
	}
}


//builds the html code to display a folder and its label
function displayIconAndLabel(foldersNode, doc){
	if (!foldersNode[2]){
		if(foldersNode[3]==""){
			doc.write("<img src=img/openfolder.gif width=20 height=26 border=noborder></td>");
		}else{
			doc.write("<A href='javascript:top.openBranch(\"" + foldersNode[3] + "\");' name='" + foldersNode[3] + "' id='" + foldersNode[3] + "'><img src=img/");
			if (foldersNode[1])
				doc.write("openfolder.gif width=20 height=26 border=noborder></a></td>");
			else
				doc.write("closedfolder.gif width=20 height=26 border=noborder></a></td>");
		}
	}
	else
		doc.write("<img src=img/doc.gif width=20 height=26 border=noborder></td>");
	if (foldersNode[3] == 0){
		doc.write("<td align=left nowrap><big><br style='line-height:2pt'>");
		doc.write(foldersNode[4]);
		doc.write("</big>");
	}else{
		doc.write("<td align=left nowrap width='500px'><br style='line-height:2pt'>");
		doc.write("<table border=0 cellspacing=0 cellpadding=0><tr valign='top'><td>" + foldersNode[3] + "</td><td>&nbsp;&nbsp;&nbsp;</td><td>" + foldersNode[4] + "</td></tr></table>");
	}
	doc.write("<br style='line-height:5pt'></td></tr>");

}


//**********************+
// Recursive functions

//closes folder
function closeFolders(foldersNode){
	var i=0

	//when a parent is closed all children also are
    /*    if (!foldersNode[2])
	{
        	for (i=5; i< foldersNode.length; i++)
	           	closeFolders(foldersNode[i])

	}
    */
    	foldersNode[0] = 0;
        foldersNode[1] = 0;
}

//recursive over the tree structure
//called by openbranch
function clickOnFolderRec(foldersNode, folderNr)
{
var i=0

        if (foldersNode[3] == folderNr)
	{
		if (foldersNode[0])
			closeFolders(foldersNode);
		else
		{
			foldersNode[0] = 1;
			foldersNode[1] = 1;
		}
	}
	else
	{
        	if (!foldersNode[2])
        		for (i=5; i< foldersNode.length; i++)
	           		clickOnFolderRec(foldersNode[i], folderNr);
	}
}

