function initTree(){
	total=1;
	db=new Array();
	fillTree();
	current=getCookie("currState");
	visited=getCookie("visiState");
	lastStep=getCookie("lastStep");
	initTreeCookies();
}

function initTreeCookies(){
	if(current==""||current.length!=(db.length-1)){
		initState="";
		visiState="";
		for(i=1;i<db.length;i++){ 
			initState+="0";
			visiState+="0";
		}
		current=initState;
		visited=visiState;
		setCookie("currState",initState);
		setCookie("visiState",visiState);
		setCookie("lastStep","");
	}
}

function dbAdd(mother,display,URL,indent,top,keyStep,show,pscore,icon,pageid,qwids,quids) {
	db[total]=new Object;
	db[total].mother=mother;
	db[total].display=display;
	db[total].URL=URL;
	db[total].indent=indent;
	db[total].top=top;
	db[total].keyStep=keyStep;
	if(typeof show=="undefined")show=1;
	db[total].show=show;
	db[total].pscore=pscore;
	db[total].icon=icon;
	db[total].pageid=pageid;
	db[total].qwids=qwids;
	db[total].quids=quids;
	total++;
}

function puzzleVisiState(n,newScore) {
	var newString=visited.substring(0,n-1);
	var oldScore=parseInt(visited.substring(n,n-1));
	if(newScore){
		switch(true){
		case(oldScore==9 && newScore>0):          newString+=newScore;break; //zuvor erfolglos bearbeitet, jetzt ok -> neuen Wert setzen
		case(oldScore!=9 && newScore<=oldScore):  newString+=oldScore;break; //zuvor schon erfolgreich bearbeitet -> alten Wert behalten
		case(newScore!=9 && newScore>oldScore):   newString+=newScore;break; //erfolgreich bearbeitet -> neuen Wert setzen
		case(newScore==9 && oldScore>1):          newString+=oldScore;break; //aktuell nicht erfolgreich, aber zuvor schon erfolgreich bearbeitet -> alten Wert behalten
		case(newScore==9 && oldScore==0):         newString+=newScore;break; //erster Versuch -> neuen Wert setzen
		default:newString+=newScore;break;	
		}
	}else{
			newString+=oldScore;
	}
	newString+=visited.substring(n,visited.length);
	setCookie("visiState",newString);
	setCookie("lastStep",n);
	visited=newString;
}

function jumpTo(url,target,n){
	parent.location.href=url;
}

function explode(){
	current="";
	initState="";
	for(var i=1;i<db.length;i++){ 
		initState+="1";
		current+="1";
	}
}

function contract(){
	current="";
	initState="";
	for(var i=1;i<db.length;i++){ 
		initState+="0";
		current+="0";
	}
}

function writeTree(current){
	var common=parent.common;
	document.getElementById("treeOut").innerHTML="<img src='"+common+"images/tree/loading.gif' />";
	var db=parent.db;
	if(!current)current=parent.current;
	var visited=parent.visited;
	var prevIndentDisplayed=0;
	var showMyDaughter=0;

	var outline="<table width='100%' cellspacing='0' cellpadding='0' border='0'><tr>";
	
	var myMother=0;
	for (var i=parent.curPageNum;i>0;i--){
		if(db[i].mother){myMother=i;break;}
	}

	for (var i=1;i<db.length;i++){
		var bold=false;
		var hilite=false;
		if(!db[i].show)continue;
		var currIndent=db[i].indent	;
		var expanded=current.substring(i-1,i);

//
		if(db[i].mother){
			var newString=current.substring(0,i-1);
			newString+=0;
			newString+=current.substring(i,current.length);
			parent.setCookie("currState",newString);
			parent.current=newString;
			current=newString;
			expanded=current.substring(i-1,i);
		}
		//


		if(i==myMother){
			newString=current.substring(0,i-1);
			newString+=1;
			newString+=current.substring(i,current.length);
			parent.setCookie("currState",newString);
			parent.current=newString;
			current=newString;
			expanded=current.substring(i-1,i);
		}

		var top=db[i].top;

		if(top=="")top="content";
		if((currIndent==0||currIndent<=prevIndentDisplayed||(showMyDaughter==1&&(currIndent-prevIndentDisplayed==1)))){
			keyStep="";
			if(db[i].keyStep)keyStep="_key";

			if(i==1){
				outline+="<td nowrap width='11' valign='bottom'>"+getSymbol(parseInt(visited.substring(i-1,i)));
			}else{
				outline+="<td nowrap width='11' valign='bottom'>"+getSymbol(parseInt(visited.substring(i-1,i)));
			}

			outline+="</td>";
		 
			if(db[i].URL==""||db[i].URL==null){
				outline+="<td><span title='"+db[i].display+"'>"+getCaption(db[i].display,bold,hilite,db[i].indent)+"</span></td>";
			}else{
				outline+="<td>";
				if(currIndent==0||i==parent.curPageNum)bold=true;
				if(i==parent.curPageNum){
					hilite=true;
					outline+="&nbsp;&nbsp;<a class='truncate' name='#acurr' id='#acurr' href='javascript:jumpTo(\""+db[i].URL+"\",\""+top+"\","+i+")' title='"+db[i].display+"'>"+getCaption(db[i].display,bold,hilite,db[i].indent)+"</a>";
				}else{
					outline+="&nbsp;&nbsp;<a class='truncate' href='javascript:jumpTo(\""+db[i].URL+"\",\""+top+"\","+i+")' title='"+db[i].display+"'>"+getCaption(db[i].display,bold,hilite,db[i].indent)+"</a>";
				}
				outline+="</td>";
			}

			prevIndentDisplayed=currIndent;
			showMyDaughter=expanded;
			outline+="</tr>";
		}
	}	
	outline+="</table>";	
	document.getElementById("treeOut").innerHTML=outline;
	outline="";

	var offsetA=getAnchorPosition("#acurr").y;
	if(offsetA>400)scrollTo(0,getAnchorPosition("#acurr").y)
}

function toggle(n){
	var current=parent.current;
	if(n!=0){
		var newString="";
		var expanded=current.substring(n-1,n);
		newString+=current.substring(0,n-1);
		newString+=expanded ^ 1;
		newString+=current.substring(n,current.length);
		parent.setCookie("currState",newString);
		parent.current=newString;
		writeTree(newString);
	}
}

function pad(n) {
	var result="";
	for (var i=1;i<=n;i++)result+="";
	return result;
}

function getSymbol(curScore){
	var outline="";
	var common=parent.common;
	switch(curScore){
		case 0:outline+="<img src='"+common+"images/tree/check_low.gif' width='11' height='11' border='0' />";break;
		case 1:outline+="<img src='"+common+"images/tree/check_med.gif' width='11' height='11' border='0' />";break;
		case 9:outline+="<img src='"+common+"images/tree/check_nogo.gif' width='11' height='11' border='0' />";break;
		default:outline+="<img src='"+common+"images/tree/check_go.gif' width='11' height='11' border='0' />";break;
	}
	return outline;
}

function getCaption(text,bold,hilite,indent){
	var common=parent.common;
	var caption=text;
	var title="";

	if(parent.bw.ns6){
		var limit=bold?32:33;
		switch(true){
			case (text.length<limit):
				caption=text;
				title="";
				break;	
			case (text.length>(limit-1)):
				caption=text.substring(0,limit)+"...";
				title=text;
				break;
		}
	}

	caption=bold?"<span class='treeHiliteItem'>"+caption+"</span>":caption;
	caption=hilite?"<span class='treeActiveItem'>"+caption+"</span>":caption;

	switch(indent){
	case 0:
		caption="<img src='"+common+"/images/shim.gif' width='1' height='22' border='0' /> "+caption;
		break;
	case 1:
		caption="<img src='"+common+"/images/tree/line_end.gif' width='11' height='16' border='0' /> "+caption;
		break;
	case 2:
		caption="<img src='"+common+"/images/tree/line_left.gif' width='11' height='16' border='0' /><img src='"+common+"/images/tree/line_end.gif' width='11' height='16' border='0' /> "+caption;
		break;
	}


	return caption;
}


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

function getAnchorPosition(anchorname) {
	// This function will return an Object with x and y properties
	var useWindow=false;
	var coordinates=new Object();
	var x=0,y=0;
	// Browser capability sniffing
	var use_gebi=false, use_css=false, use_layers=false;
	if (document.getElementById) { use_gebi=true; }
	else if (document.all) { use_css=true; }
	else if (document.layers) { use_layers=true; }
	// Logic to find position
 	if (use_gebi && document.all) {
		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
		}
	else if (use_gebi) {
		var o=document.getElementById(anchorname);
		x=AnchorPosition_getPageOffsetLeft(o);
		y=AnchorPosition_getPageOffsetTop(o);
		}
 	else if (use_css) {
		x=AnchorPosition_getPageOffsetLeft(document.all[anchorname]);
		y=AnchorPosition_getPageOffsetTop(document.all[anchorname]);
		}
	else if (use_layers) {
		var found=0;
		for (var i=0; i<document.anchors.length; i++) {
			if (document.anchors[i].name==anchorname) { found=1; break; }
			}
		if (found==0) {
			coordinates.x=0; coordinates.y=0; return coordinates;
			}
		x=document.anchors[i].x;
		y=document.anchors[i].y;
		}
	else {
		coordinates.x=0; coordinates.y=0; return coordinates;
		}
	coordinates.x=x;
	coordinates.y=y;
	return coordinates;
	}

// Functions for IE to get position of an object
function AnchorPosition_getPageOffsetLeft (el) {
	if(el==undefined)return 0;
	var ol=el.offsetLeft;
	while ((el=el.offsetParent) != null) { ol += el.offsetLeft; }
	return ol;
}

function AnchorPosition_getWindowOffsetLeft (el) {
	return AnchorPosition_getPageOffsetLeft(el)-document.body.scrollLeft;
}	

function AnchorPosition_getPageOffsetTop (el) {
	if(el==undefined)return 0;
	var ot=el.offsetTop;
	while((el=el.offsetParent) != null) { ot += el.offsetTop; }
	return ot;
}

function AnchorPosition_getWindowOffsetTop (el) {
	if(el==undefined)return 0;
	return AnchorPosition_getPageOffsetTop(el)-document.body.scrollTop;
}
