    var tree_xmlHttp;

    var cascade_xmlHttp;

    var actual_element_id;
    
    var tree_length;
     
    var tree_min_length = 5;
    var tree_max_length = 20;

    var tree_max_length_sav = 20;

    var tree_entry_max_chars = 50;
    var tree_entry_max_chars_sav = 50;
    var tree_entry_max_chars_max = 50;
    
    var actual_tree_offset = 0;
    
    var pos_highlighted = -1;
    
    var stack = new Object(); 
    var map = new Array();
    var close_map = new Object();

    var tree_content_sav;
    
    var ar_name_sav = "";
    
    var tree_resize_in_progress = 0;

    var cascade_text;
    
    function show_waiter_tree(){
		document.getElementById('waiter_tree').style.left = (document.getElementById("right").offsetLeft-50)+"px";//???konstante?
		document.getElementById('waiter_tree').style.visibility='visible';	    
    }
    
    function hide_waiter_tree(){
		document.getElementById('waiter_tree').style.visibility='hidden';
    }

    function reset_tree(){
		actual_tree_offset = 0;
	
		pos_highlighted = -1;
	
		stack = new Object();
		map = new Array();
		close_map = new Array(); //?????????warum nicht new Object()??
	
		document.getElementById('tree').innerHTML = tree_content_sav;
	
		init_tree();
    }

    function enlarge_tree(){

	    tree_max_length_sav = tree_max_length;
	    //tree_max_length = 50;
	    fill_tree();
    }

    function reduce_tree(){

	    tree_max_length = tree_max_length_sav;
	    fill_tree();
    }

    function adjust_treeblock_width(){

		tree_entry_max_chars = tree_entry_max_chars_max;
		
		tree_resize_in_progress = 0;
	
		fill_tree();
		
		var tree_width = document.getElementById('tree_block').offsetWidth;
		var right_xpos = document.getElementById('right').offsetLeft;
/*
		while((tree_width > right_xpos - 10) && tree_entry_max_chars > 4){//!!konstante: 10 = ausgleich für den linken randabstand von tree_block
			tree_width = document.getElementById('tree_block').offsetWidth;
			right_xpos = document.getElementById('right').offsetLeft;
			tree_entry_max_chars--;

			fill_tree();
		}
	*/
    }

    function adjust_tree_fill(){
    	document.getElementById('tree_fill').style.width = document.getElementById('right').offsetLeft-8+"px";//konstante??
		document.getElementById('tree_fill').style.height = document.getElementById('props_block').offsetTop+"px";
		document.getElementById('tree_fill').style.height = document.getElementById('tree').offsetHeight+"px";
    }

    function init_tree(){

		//array mit allen Baumzeilen
		var elements = document.getElementById("tree_root").getElementsByTagName('div');
		
		var begin_tag = "<div>";
		var end_tag = "</div>";
		
		var i;
		var j=0;
		
		var one_element_content;
		
		var last_actual_element_id = "";

    	for(i=0; i < elements.length; i++){	
    		one_element_content = elements[i].innerHTML;
    
			if(one_element_content!="" && one_element_content.indexOf("list_up")==-1 && one_element_content.indexOf("list_down")==-1){
				var new_id = one_element_content.substring(one_element_content.indexOf('id=')+3, one_element_content.length);
	
				new_id = new_id.substring(0, new_id.indexOf(" "));
				new_id = new_id.replace("\"",""); 
				new_id = new_id.replace("\"","");
	
				map[j] = new_id;
	
				stack[new_id] = one_element_content;
	
				//jede Baumzeile erhält zugewiesen: ihren Nachfolger in geschlossenem Zustand 
				if(last_actual_element_id != "" && last_actual_element_id.indexOf("a_")==-1){
					close_map[last_actual_element_id] = new_id;
				}
	
				last_actual_element_id = new_id;
				j++;
			}
    	}
    	
    	fill_tree();
    }

    function cascade_tree(_ar_id, _kind, _id, _be_id, _action, _tabs){
		var url = "get_tree_path.php?ar_id="+_ar_id+"&kind="+_kind+"&id="+_id;
	
		cascade_xmlHttp = new net.ContentLoader(url,cascade_stateChanged);
    }

    function cascade_stateChanged(){
		cascade_text = this.req.responseText;

		tab_click("view");

		continue_cascade();
    }

	
    function continue_cascade(){

		var part = cascade_text.substring(0,cascade_text.indexOf('*'));

		cascade_text = cascade_text.substring(cascade_text.indexOf('*')+1);
	
		var casc_id = part.substring(0,part.indexOf('#'));
	
		var casc_kind = part.substring(part.indexOf('#')+1,part.lastIndexOf('#'));
	
		var casc_tab = part.substring(part.lastIndexOf('#')+1);
	
		tree_click_cascade(ar_id, casc_kind, casc_id, be_id, "open", casc_tab);//!!tabs??
    }
    
   	
   function tree_click(_ar_id, _kind, _id, _be_id, _action, _tabs){

		ar_id = _ar_id;
		action = _action;
		id = _id;
		be_id = _be_id;
		
		kind = _kind;
		
		tabs = _tabs;
			
		actual_pag = 0;
		
		props_priority = false;
		
		props_preview_done = false;
		
		if(kind=='k') kg_id = id;
		else kg_id = '-';

	   	reload_tree(kind+'_'+id, 'linker');

	   	if(split_view) reload_middle();

	   	if(!split_view && (_kind=='b' || _kind=='be_e' || _kind=='k' || _kind=='t')){
	   		reload_middle();			
	   	}
	   	else{
	   		reload_props(_id, _be_id, _kind);
			
			reload_path(_id, _be_id, _kind);
		}
		
		reload_nav(_id, _be_id, kg_id, _kind);
		
    }

    function tree_click_cascade(_ar_id, _kind, _id, _be_id, _action, _tabs){
	    
        ar_id = _ar_id;
        action = _action;
        id = _id;
        be_id = _be_id;

        kind = _kind;

        tabs = _tabs;

		actual_pag = 0;

    	reload_tree_cascade(kind+'_'+id, 'linker');
    }

    function reload_tree(_actual_element_id, _source){
 
		var url = do_reload_tree(_actual_element_id, _source);
		
		//xlert(url);

		tree_xmlHttp = new net.ContentLoader(url,tree_stateChanged);
    }

    function reload_tree_cascade(_actual_element_id, _source){
		var url = do_reload_tree(_actual_element_id, _source);
	
		tree_xmlHttp = new net.ContentLoader(url,tree_stateChanged_cascade);
    }
    
    function do_reload_tree(_actual_element_id, _source){

		actual_element_id = _actual_element_id;
		source = _source;
	

		var url="tree_";
		url = url + "arid-"+ar_id;
		url = url + "-action-"+action;
		url = url + "-kind-"+kind;
		if(id!="-") url = url + "-id-"+id;
		if(be_id!="-") url = url + "-beid-"+be_id;
		url = url + "-source-"+source;
		url = url + "-tabs-"+tabs;
		url = url + ".html";

		return url;
    }

    function tree_stateChanged(){

    	var new_inner = this.req.responseText;

		tree_do_stateChanged(new_inner);
    }

    function tree_stateChanged_cascade(){

    	var new_inner = this.req.responseText;

		tree_do_stateChanged(new_inner);
		
		if(cascade_text.length>1) continue_cascade();
		else{
			if(kind!='ve'){
				reload_middle();
				
				reload_path(id, be_id, kind);
				
				reload_props(id, be_id, kind);
			}

			continue_lookup();
		}
    }
    
    function tree_do_stateChanged(new_inner){

	    var action = new_inner.substring(0,new_inner.indexOf('*'), new_inner.length);
	
		if(action=='reset'){
		 init('a', '', '-1', show_differenced_inds);
		}
		else{
	
		    var begin_tag = "<div>";
		    var end_tag = "</div>";
	
		    var begin;
	
		    var end;
		    
		    var new_id;
	
		    var content;
	
		    var elements;
	
		    var temp_map = Array();
	
		    var i;
		    var j=0;
		    var k;
	
		    var in_array;
	
		    var closed_until = 0;
	
		    var element_id;
	
		    for(i=0; i < map.length; i++){ 
	
				element_id = map[i];
		
				if(closed_until==element_id){
					closed_until=0;
					//xlert("close reached:"+element_id);
				}
		
				if(element_id != actual_element_id){               
					if(action!="close" || closed_until==0){
						temp_map[j] = element_id;
						j++;
					}
		
				}
				else{
					if(action=="open"){
					   var last_actual_element_id = "";
		
					   while(new_inner.indexOf(begin_tag) != -1){
						begin = new_inner.indexOf(begin_tag)+begin_tag.length;
						end = new_inner.indexOf(end_tag);
		
						content = new_inner.substr(begin,end-begin);
		
						new_id = content.substring(content.indexOf('id=\"')+4, content.length);
						new_id = new_id.substring(0, new_id.indexOf("\""));
		
						in_array = 0;
		
						for(k=0; k<map.length;k++) if(map[k] == new_id) in_array=1;
		
						if(in_array != 1 || new_id == actual_element_id){
		
						    stack[new_id] = content;
		
						    temp_map[j] = new_id;
						    j++;
						}
						new_inner = new_inner.substring(end+end_tag.length, new_inner.length);
		
						if(last_actual_element_id != "" && last_actual_element_id != actual_element_id && last_actual_element_id.indexOf("a_")==-1){		
							close_map[last_actual_element_id] = new_id;
							//xlert("closed_map set for "+last_actual_element_id+":"+new_id);
						}
		
						close_map[new_id] = close_map[actual_element_id];
		
						last_actual_element_id = new_id;
					    }			   			    
					}
					else if(action=="close"){
						begin = new_inner.indexOf(begin_tag)+begin_tag.length;
						end = new_inner.indexOf(end_tag);
		
						content = new_inner.substr(begin,end-begin);
		
						stack[element_id] = content;
		
						temp_map[j] = element_id;
						j++;
		
						closed_until=close_map[element_id];
		
						//xlert("closed until set:"+closed_until);
					}				
				}               
		    }
	
		    map = temp_map;
	
		    //altes highlighting ausschalten
		    for(i=0; i<map.length; i++){
			    if(map[i] != actual_element_id){
				    content = stack[map[i]];
				    content = content.replace('<i><b>','');
				    content = content.replace('</b></i>','');
				    if(content != stack[map[i]]){
					stack[map[i]] = content;    	
				    }
			    }
			    else pos_highlighted = (i+1);
		    }
	
		    adjust_treeblock_width();//fill_tree();
	    }
    }   

    
    function move_up(){
		if(actual_tree_offset > 0) actual_tree_offset--;
		pos_highlighted = -1;
		fill_tree();
    }

    function move_down(){
		if(actual_tree_offset < map.length-tree_min_length) actual_tree_offset++;
		pos_highlighted = -1;
		fill_tree();
    }

    function fill_tree(){
    	do_fill_tree();
    	
	    adjust_slider_tree();
    }
    
    function do_fill_tree(){
	    var i;	    
	    var j;

	    // tree_length: angezeigte Länge des Baumes
	    tree_length = map.length;	   	    
	    if (tree_length > tree_max_length){ 
	    	tree_length = tree_max_length;
	    }
	    
	
	    //highlighted-Zeile muss immer sichtbar sein!
	    //xlert("ph: "+pos_highlighted+"tml"+tree_max_length+"ato:"+actual_tree_offset);
	    if(pos_highlighted != -1){
	    	actual_tree_offset = pos_highlighted-(tree_max_length-2);
	    	if(actual_tree_offset<0){
				actual_tree_offset=0;
	    	}
	    }

		tree_entry_max_chars_sav = 4;//minimalste Länge

	    //xindow.status = "pos: "+pos_highlighted+" * "+"actual: "+actual_tree_offset;
	    	      
	    //*************** 1. Schritt: Baumzeilen anlegen
	    
	    //alle Baumelemente befinden sich in 'tree_root' (=Archivnamen-anzeige)
	    var root_element = document.getElementById("tree_root");
	    
	    //alte Baumelemente ignorieren
	    var new_innerHTML = root_element.innerHTML.substring(0,root_element.innerHTML.indexOf("<div"));
	  	    
	    //Sonderfall für den IE, der den Quellcode nicht korrekt zurückgibt (Case-Sensitivity!)
	    if(new_innerHTML=="") new_innerHTML = root_element.innerHTML.substring(0,root_element.innerHTML.indexOf("<DIV"));

	    var _temp = new_innerHTML.substring(0,new_innerHTML.lastIndexOf("</a"));
	    
	    //Sonderfall für den IE
	    if(_temp=="") _temp = new_innerHTML.substring(0,new_innerHTML.lastIndexOf("</A"));

	    var last_close_pos = _temp.lastIndexOf(">");
		_temp = _temp.substring(last_close_pos+1); 
		
		var last_br_pos = 0;
		var _end = "";
		
		if(_temp.length > tree_entry_max_chars) _temp = _temp.substr(0,tree_entry_max_chars-5)+"(...)";//
			
	    new_innerHTML = new_innerHTML.substring(0,last_close_pos+1)+_temp +"</a>";

	    //Anzahl der anzuzeigenden Baumzeilen
	    j=0;
	    
	    if(actual_tree_offset > 0){
	        j++;
	    }
	    
	    if ((map.length - actual_tree_offset) > tree_max_length){ 
	    	j++;
	    }
	    
	    //ein div-element pro baumzeile anlegen
	    for(i=0; i<tree_length+j; i++){
	    	new_innerHTML += "<div></div>";
	    }
	    
	    root_element.innerHTML = new_innerHTML;	
	    
	    //*************** 2. Schritt: Baumzeilen füllen

	    //array mit den leeren "neuen" baumzeilen
	    var elements = document.getElementById('tree_root').getElementsByTagName("div");

	    if(actual_tree_offset > 0){
	        elements[0].innerHTML = "<a id='list_up' onmouseup='return false;' onmousedown='return false;' onmouseout='setMouseOverListUp(false);' onmouseover='setMouseOverListUp(true);'><img src='../icons/list_up.gif' /></a>";
	        j=1;
	    }
	    else j=0;

	    var _inner;
	    var _inner_display;
	    var _pos;
	    var _highlighted;
	    var rest;

	    //xindow.status = "tree_length:"+tree_length;
	    
	    for(i=j; i<tree_length; i++){
	    	if(stack[map[i+actual_tree_offset]]){
				_inner = stack[map[i+actual_tree_offset]];

				_inner = _inner.substring(0, _inner.length-4);// "</a>" rausschneiden
				
				_pos = _inner.lastIndexOf("border=\"0\">")+11;//11="border=\"0\">";
	
				if(_pos==10) _pos = _inner.lastIndexOf("border=0")+9;//9="border=0"; 
				
				_inner_display = _inner.substr(_pos);

				if(_inner_display.lastIndexOf("</b></i>")!=-1){
	 				_inner = _inner.substr(0,_pos)+_inner_display.substr(0,_inner_display.lastIndexOf("<")-4);//4=</b><
					_highlighted=1;
				}
				else _highlighted = 0;
	
				//if(_inner.length-_pos -(6*_highlighted)> tree_entry_max_chars_sav) tree_entry_max_chars_sav = _inner.length-_pos-(6*_highlighted);
	
	    		elements[i+j].innerHTML = _inner;//_inner.substr(0,_pos+tree_entry_max_chars+(6*_highlighted));
	    		
	    		//if(_inner.length-(6*_highlighted)>_pos+tree_entry_max_chars) elements[i+j].innerHTML += "...";
	
				if(_highlighted==1){
					_inner = elements[i+j].innerHTML += "</b></i>";
				}

	    		elements[i+j].innerHTML += "</a>";
	    	}
	    }
	    
	    if ((map.length - actual_tree_offset) > tree_max_length){
	    	elements[elements.length-1].innerHTML = "<a id='list_down' onmouseup='return false;' onmousedown='return false;' onmouseout='javascript: setMouseOverListDown(false);' onmouseover='javascript: setMouseOverListDown(true);'><img src='../icons/list_down.gif' /></a>";
	    	j=0;
	    }
	    else j=1;
	    	    
	    //*************** 3. Schritt: Restplatz auffüllen (baum sollte immer gleichviel Platz einnehmen):
	   
	    new_innerHTML = root_element.innerHTML;
	    
	    rest = tree_max_length - i + j;
	    if ((map.length - actual_tree_offset) <= tree_max_length) rest += actual_tree_offset;
	    
	    if(map.length-tree_max_length>0) rest -= map.length-tree_max_length; 
	    
	    while(rest > 0){
	    	new_innerHTML += "<div><img src='../icons/e2.gif' border='none'></div>";
	    	rest--;
	    }	
	    
	    root_element.innerHTML = new_innerHTML;
    }

