    var tree_xmlHttp;
    
    var filter_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_short = 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_filter_set = false;
    
    var tree_resize_in_progress = 0;

    var cascade_text;
    
    var actual_tree_number = -1;
    
    function switch_trees(){
    	if(actual_tree_number == -1){
    		document.getElementById('tree_block').style.visibility = "visible";
    		
    		document.getElementById('tree_block_rech').style.visibility = "hidden";
    	}
    	else{
    		document.getElementById('tree_block').style.visibility = "hidden";
    		
    		document.getElementById('tree_block_rech').style.visibility = "visible";
    	}
    }
    
    function adjust_tree_filter(){
    	if(false){//application==const_application_intra
    		if(document.getElementById("tree_filter")){
    		document.getElementById("tree_filter").style.visibility = "inherit";

			if(tree_filter_set){
				document.getElementById("tree_filter").src = "../icons/tree_filter_off.gif";	
			}
			else{
				document.getElementById("tree_filter").src = "../icons/tree_filter_on.gif";
			}   
    	}
		}
		else{
			if(document.getElementById("tree_filter")) document.getElementById("tree_filter").style.visibility = "hidden";
		}
    }
    
    function filter(){
    	tree_filter_set = !tree_filter_set;
    	
    	var state;
    	
    	if(tree_filter_set){
    		state = 1;
    	}
    	else{
    		state = 0;
    	}
    	
        var url = "tree_filter.php?ar_id="+ar_id+"&state="+state;

		filter_xmlHttp = new net.ContentLoader(url,filter_stateChanged);
    }
    
    function filter_stateChanged(){
    	var new_inner = this.req.responseText;
    
    	document.getElementById('tree_root').innerHTML = new_inner;	
    	
    	tree_content_sav = new_inner;
    	
		actual_tree_offset = 0;
		
		pos_highlighted = -1;
	
		stack = new Object();
		map = new Array();
		close_map = new Array(); //?????????warum nicht new Object()??
	
		init_tree();
    	
    	adjust_tree_filter();
    }
    
    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(){
    	if(document.getElementById('tree_root')){
			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 = Math.round((windowInnerHeight-100)/21);//!!konst, 21=h�he einer baumzeile, 100=willk�rlicher Abstand

	    tree_max_length_sav = tree_max_length;

	    fill_tree();
    }

    function reduce_tree(){
		tree_max_length_sav = tree_max_length_short;
	    tree_max_length = tree_max_length_sav;
	    fill_tree();
    }

    function adjust_treeblock_width(){

		write2js_log("ajax_tree - adjust_treeblock_width", "", "adjust");

		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;
    }

    function adjust_tree_fill(){
    
    	write2js_log("ajax_tree - adjust_tree_fill", "", "adjust");
    
    	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(){

    	if(document.getElementById("tree_root")){
			//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;

		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 head_click(_ar_id, _kind, _id, _be_id, _action, _tabs, _source){
    	if(actual_tab.substr(0,4)=='resu') tab_click('view');
    	tree_click(_ar_id, _kind, _id, _be_id, _action, _tabs, _source);
    }
    
   function tree_click(_ar_id, _kind, _id, _be_id, _action, _tabs, _source){
   
   		write2js_log("ajax_tree", "kind:"+_kind+" id:"+_id+" action:"+_action+" tabs:"+_tabs+" source:"+_source, "tree_click");
   
   		origin_of_click = 'tree';
   		
   		//actual_tree_number = -1;
   		
   		do_tree_click(_ar_id, _kind, _id, _be_id, _action, _tabs, _source);
   } 
   	
   function do_tree_click(_ar_id, _kind, _id, _be_id, _action, _tabs, _source){
		
		tab_click_locked++;
		
		if(_source != '') source = _source;

		ar_id = _ar_id;
		action = _action;
		id = _id;
		be_id = _be_id;
		
		kind = _kind;
		
		tabs = _tabs;
			
		actual_pag = 0;
		
		if(actual_tree_number == -1){		
			props_priority = false;
			
			props_preview_done = false;
			
			reload_middle_in_move_slider = true;
			
			path_has_content = false;
			
			if(kind=='t') props_close();
			
			if(kind=='k') kg_id = id;
			else kg_id = -1;
		}

	   	reload_tree(kind+'_'+id, 'linker');

		if(actual_tree_number == -1){
		   	reload_middle();
		   	
	  		switch(_kind){
				case 't':
					props_has_content = false;
					break;
				case 'b':
					do_middle_b_click(_id, true);
					break;
				case 'be_e':
					middle_b_click_left(_id, true);
					break;
				case 'k':
					do_middle_b_click(_be_id, true);
					break;
				default:
					//xlert(_kind);
			}		
		
			if(split_view){
				reload_props_and_path(_id, _be_id, -1, _kind);
			}
		
			reload_nav(_id, _be_id, kg_id, _kind);
			
			tab_click_requested = true;
		}
		
		tab_click_locked--;
		
		manage_tab_clicks();		
    }
    
   function list_click(_ar_id, _kind, _id, _be_id, _action, _tabs){

		tab_click_locked++;

		ar_id = _ar_id;
		action = _action;
		id = _id;
		be_id = _be_id;
		
		kind = _kind;
		
		tabs = _tabs;
			
		actual_pag = 0;
		
		origin_of_click = 'tree';
		
		props_priority = false;
		
		props_preview_done = true;
		
		if(kind=='k') kg_id = id;
		else kg_id = -1;
		
		tab_click_requested = true;

	   	reload_middle();
	
	   	reload_props_and_path(_id, _be_id, kg_id, _kind);//??
	   	
		tab_click_locked--;
		
		manage_tab_clicks();	
    }

    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(_actual_element_id+", "+_source+": "+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 + "-treeid-"+actual_tree_number;
		url = url + "-action-"+action;
		url = url + "-kind-"+kind;
		if(id!=-1) url = url + "-id-"+id;
		if(be_id!=-1) 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_props_and_path(id, be_id, -1, kind);
			}

			continue_lookup();
		}
    }
    
    function tree_do_stateChanged(new_inner){

	    var action = new_inner.substring(0,new_inner.indexOf('*'), new_inner.length);
	
		if(action=='reset' && actual_tree_number==-1){
			init('a', '', '-1', show_differenced_inds);
		}
		else{
			if(actual_tree_number==-1){
			    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();
			}
			else{
				rech_tree_statechanged(action,new_inner);
			}
	    }
    }   

    
    function move_up(){
    	if(actual_tree_number==-1){
			if(actual_tree_offset > 0) actual_tree_offset--;
			pos_highlighted = -1;
			fill_tree();
		}
		else{
			if(actual_tree_offset_rech[actual_tree_number] > 0) actual_tree_offset_rech[actual_tree_number]--;
			pos_highlighted = -1;
			fill_tree_rech(actual_tree_number);
		}
    }

    function move_down(){
    	if(actual_tree_number==-1){
			if(actual_tree_offset < map.length-tree_min_length) actual_tree_offset++;
			pos_highlighted = -1;
			fill_tree();
		}
		else{
			if(actual_tree_offset_rech[actual_tree_number] < rech_map[actual_tree_number].length-tree_min_length) actual_tree_offset_rech[actual_tree_number]++;
			pos_highlighted = -1;
			fill_tree_rech(actual_tree_number);
		}
    }

    function fill_tree(){
    	do_fill_tree();
    	
    	adjust_tree_filter();
    	
	    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-5);// "</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){
	    
	    	if(elements[elements.length-1]) 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;
    }


