/* www.usetext.com :: joes koppers ::: 02.2003 */
/* thnx for reading this code */


/* setup */

documentLoaded = false;
	
function init() {
	
	/* open preset sized window for published version */

	if (mode=="publish" && self.location.search!="?window") {
		document.getElementById("loading").style.visibility = "hidden";
		document.getElementById("reload").style.visibility = "hidden";
		//popup
		usetext();

	} else {
	
	self.moveTo(80,10);
	welcome = true;
	link = false;
	
	document.getElementById("level0_leftmargin").style.visibility = 'visible';
	bottommargin_div = document.getElementById("level0_bottommargin");
	
	//ref for mac exploder selection workaround
	if (ie5 && mac) hiddenform = document.getElementById("hiddenformfield")

	/* tuning vars */

	hlplus_speed = (ns6)? (mac)? 90:60:40;
	hlmin_speed = (ns6)? (mac)? 70:40:20;

	zoom_speed = (ns6)? (mac)? 100:60:50;
	zmin_speed = (ns6)? (mac)? 80:40:40;

	
	/* level & entry objects */ 

	for (var l=0; l<5; l++) {
		
		//more tuning vars
		level[l].default_size = (l==0)? 12:14;
		level[l].highlight_size = 17;
		level[l].mouse_release_size = 25;
		level[l].zoom_size = 70;
		level[l].default_fade = 210;
	
		level[l].div = document.getElementById('level'+l);
		level[l].div.y = level[l].div.offsetTop;
		level[l].bottommargin = document.getElementById('level'+l+'_bottommargin');
	
		level[l].zoomed = -1;
		level[l].zoom = 0;
				
		//entries
		entries = eval("level"+l+"_entries");
		for (var n=0; n<entries; n++) {
					
			if (l==0) level[l].entry[n] = new Object();
			level[l].entry[n].div = (l==0)? document.getElementById('level'+l+'_entry'+n):document.getElementById('level'+l+'_entrydiv');
			if (l>0) level[l].entry[n].rsetdiv = document.getElementById('level'+l+'_topmargin_img');
			level[l].entry[n].div.myid = n;
			level[l].entry[n].div.mylevel = l;
			
			assign_link(l,n);
			
			//defaults
			level[l].entry[n].visited = false;
			level[l].entry[n].fade = 0;
			level[l].entry[n].zoom = (l==0)? level[l].default_size:0;
			level[l].entry[n].div.style.fontSize = (l==0)? level[l].entry[n].zoom +"px":"1px";
			level[l].entry[n].y_offset = 0;
			
			//capture events for level0
			if (l==0) {
				level[0].entry[n].div.onmouseover = mouseOver;
				if (level[0].entry[n].link.level!=-1) { //only if there's a child entry
					level[0].entry[n].div.onmousedown = mouseDown;
					level[0].entry[n].div.onmouseup = mouseUp;
				}
				level[0].entry[n].div.onmousemove = mouseMove;
				
				//deal with possible hrefs in entry
				level[0].entry[n].a_tags = new Array();
				level[0].entry[n].a_tags = level[0].entry[n].div.getElementsByTagName("A");
				for (var i=0; i<level[0].entry[n].a_tags.length; i++) {
					level[0].entry[n].a_tags[i].onmouseover = function () { link = true };
					level[0].entry[n].a_tags[i].onmouseout = function () { link = false };
				}
			}
		}
	}

	/* leftmargins */
	
	leftmargin = new Array();
	
	for (var i=0; i<4; i++) {
		leftmargin[i] = new Object();
		leftmargin[i].div = document.getElementById("level"+(i+1)+"_leftmargin");

		if (ie5) {
			if (mac) leftmargin[i].div.style.backgroundColor = color_shades[i];
			else leftmargin[i].div.style.filter = (i<3)? "alpha(opacity="+(60-(i*20))+")":"alpha(opacity=10)";
		}
		else
		{
			
			leftmargin[i].div.style.opacity = (i<3)? (60-(i*20))/100:.1;
			//alert(leftmargin[i].div.style.opacity);
		}
// 		if (ns6) leftmargin[i].div.style.MozOpacity = (i<3)? 60-(i*20) +"%":"10%";
// 		
// 		if (safari) leftmargin[i].div.style.backgroundColor = color_shades[i];
	}
	
	/* done */
	
	document.getElementById("loading").style.visibility = "hidden";
	level[0].div.style.visibility = "visible";
	documentLoaded = true;
	}

}

function assign_link(l,id) {
	level[l].entry[id].link = new Object();
	level[l].entry[id].link.level = eval("level"+l+"_link_levels["+id+"]");
	level[l].entry[id].link.indexnr = eval("level"+l+"_link_indexnrs["+id+"]");
}

//open window for published version
function usetext() {
	features = "scrollbars=no,resizable=no,width="+winWidth+",height="+winHeight;
	browsewin = window.open(self.location.href+'?window','usetext',features);
}


/* event handling */

function mouseDown(e) {
	if (!e) e = event;
	
	//reset welcome message
	if (welcome) {
		bottommargin_div.innerHTML = author;
		welcome = false;
	}
	
	if (!e.altKey) { //not in text edit mode	
	
		clear_selection();
	
		id = this.myid;
		l = this.mylevel;
		
		//is there a deeper level?
		if (level[l].entry[id].link.level!=-1) zzoom(l,id,true);
		
		return false;
	}
}

function mouseUp(e) {
	if (!e) e = event;
	
	if (!e.altKey) { //not in text edit mode

		clear_selection();
		
		id = this.myid;
		l = this.mylevel;

		if (level[l].entry[id].zoom>level[l].default_size && level[l].entry[id].zoom<level[l].mouse_release_size) zzoom(l,id,false);
	}
}

function mouseOver(e) {
	if (!e) e = event;
	
	if (!e.altKey) { //not in text edit mode
		
		l = this.mylevel;
		id = this.myid;
				
		if (level[l].entry[id].zoom==level[l].default_size) hhighlight(l,id,true);
		
		//reset zoom (if level0)
		if (l==0 && level[0].zoomed!=-1 && level[0].zoomed!=id) {
			clear_other_timeouts(0,level[0].zoomed);
			zzoom(0,level[0].zoomed,false);
		}
	} 
}

//cursor appearance
function mouseMove(e) {
	if (!e) e = event;
	
	if (!e.altKey) {
		if (ie5 && mac) clear_selection(); // <- it's still hard to not get the text selected..
		level[this.mylevel].entry[this.myid].div.style.cursor = (link)? "pointer":"crosshair";
	} else level[this.mylevel].entry[this.myid].div.style.cursor = "text";
}



/* txtbrowse */

function rset(l) {
	if (documentLoaded) {
		//highlights	
		for (var n=0; n<level[l].entry.length; n++) if (n!=level[l].zoomed && level[l].entry[n].zoom>level[l].default_size) hhighlight(l,n,false);
		//zoomed child entries
		for (var c=level.length-1; c>=l; c--) if (level[c].zoomed!=-1) zzoom(c,level[c].zoomed,false);
		//leftmargins
		for (var m=l; m<leftmargin.length; m++) leftmargin[m].div.style.visibility = "hidden";
	}
}


function zzoom(l,id,do_zoom) {

	//debug(false,"zzoom -> ","l=",l," / id=",id);

	//make sure no text gets selected
	clear_selection();
	
	if (do_zoom && !link) {
	
		/* zoomin */
	
		if (level[l].entry[id].zoom<level[l].mouse_release_size) {
			
			clear_other_timeouts(l,id);
			
			level[l].entry[id].zoom++;
			level[l].entry[id].div.style.fontSize = level[l].entry[id].zoom +"px";
			if (l>0) zoom_parent_divs(l,id,1);			
			
			//loop
		 	level[l].entry[id].timeout = window.setTimeout("zzoom("+l+","+id+",true)",zoom_speed);
		 	
		} else if (level[l].entry[id].zoom<level[l].zoom_size) {

			//now this is the active entry
			level[l].zoomed = id;

			zoom_offset = Math.round(.08*level[l].entry[id].zoom);
			level[l].entry[id].zoom+=zoom_offset; // level[l].entry[id].zoom + ;
			level[l].entry[id].div.style.fontSize = level[l].entry[id].zoom +"px";
			if (l>0) zoom_parent_divs(l,id,zoom_offset);
			//fade			
			if (level[l].entry[id].fade<level[l].default_fade-17) level[l].entry[id].fade+=17;
			else level[l].entry[id].fade = level[l].default_fade;
			level[l].entry[id].div.style.color = rgb(level[l].entry[id].fade);


			/* child entry */
			
			link_level = level[l].entry[id].link.level;
			link_index = level[l].entry[id].link.indexnr;
				
			//load & setup child-content on first pass
			if (level[link_level].entry[link_index].zoom==0) {
				level[link_level].entry[link_index].div.innerHTML = level[link_level].entry[link_index].content;
				
				if (level[link_level].entry[link_index].type=="image") {
					level[link_level].div.style.zIndex = 100+(link_level*10);
					level[link_level].entry[link_index].div.style.paddingLeft = "0px"; //looks better
					//prepare for image fade
					if (ie5) level[link_level].entry[link_index].div.style.filter = "alpha(opacity=0)";
				} else {
					level[link_level].div.style.zIndex = 100+(link_level*10);
					level[link_level].entry[link_index].div.style.paddingLeft = "2px";
					//get rid of opacity change
					if (ie5) level[link_level].entry[link_index].div.style.filter = "";
					else level[link_level].entry[link_index].div.style.opactity = 1;
					//if (ns6) level[link_level].entry[link_index].div.style.MozOpacity = "100%";
				}
				level[link_level].entry[link_index].div.myid = link_index;
				level[link_level].entry[link_index].div.mylevel = link_level;
				level[link_level].entry[link_index].fade = 140;
				//init position
				level[link_level].div.y = level[l].div.y + level[l].entry[id].div.offsetTop 
				level[link_level].div.style.top = level[link_level].div.y +"px";
			}
			
			//fade in
			level[link_level].entry[link_index].fade-=10;
			if (level[link_level].entry[link_index].type=="image") {
				if (ie5) level[link_level].entry[link_index].div.filters.alpha.opacity = 140-level[link_level].entry[link_index].fade;
				else level[link_level].entry[link_index].div.style.opacity = (140-level[link_level].entry[link_index].fade)/100;
				//if (ns6) level[link_level].entry[link_index].div.style.MozOpacity = 140-level[link_level].entry[link_index].fade +"%";
			} else level[link_level].entry[link_index].div.style.color = rgb(level[link_level].entry[link_index].fade);
			
			//scale & position
			level[link_level].entry[link_index].zoom++;
			level[link_level].entry[link_index].div.style.fontSize = level[link_level].entry[link_index].zoom +"px";
			if (level[link_level].entry[link_index].type=="image") document.getElementById(link_level+"_"+link_index+"_image").width = level[link_level].entry[link_index].zoom * (level[link_level].entry[link_index].img.w/14);
			level[link_level].entry[link_index].rsetdiv.height = Math.round(.95*level[l].entry[id].zoom);

			//keep entry within the window
			y_offset(link_level,link_index,true);
			
			if (level[link_level].div.style.visibility!="visible") level[link_level].div.style.visibility = "visible";
						
			//loop
			var speed = (ns6 && l>0)? zoom_speed+10:zoom_speed;
			level[l].entry[id].timeout = window.setTimeout("zzoom("+l+","+id+",true)",speed);
			
		} else {
			
			/* zoomin done */
	
			clear_selection();
			
			level[l].entry[id].visited = true;
	
			//leftmargin
			leftmargin[l].div.style.top = (level[0].zoomed==0)? "0px":level[0].div.offsetTop + level[0].entry[level[0].zoomed].div.offsetTop +"px";
			var margin_height = level[0].entry[level[0].zoomed].div.offsetHeight;
			margin_height+= (level[0].zoomed==0)? 12:2;
			leftmargin[l].div.style.height = margin_height +"px";
			leftmargin[l].div.style.visibility = "visible";
				
			/* child entry */
					
			link_level = level[l].entry[id].link.level;
			link_index = level[l].entry[id].link.indexnr;
	
			//start events if child has a child as well
			if (level[link_level].entry[link_index].link.level!=-1) {
				level[link_level].entry[link_index].div.onmouseover = mouseOver;
				level[link_level].entry[link_index].div.onmousedown = mouseDown;
				level[link_level].entry[link_index].div.onmouseup = mouseUp;
				level[link_level].entry[link_index].div.onmousemove = mouseMove;

				//deal with possible hrefs in entry
				level[link_level].entry[link_index].a_tags = new Array();
				level[link_level].entry[link_index].a_tags = level[link_level].entry[link_index].div.getElementsByTagName("A");
				for (var i=0; i<level[link_level].entry[link_index].a_tags.length; i++) {
					level[link_level].entry[link_index].a_tags[i].onmouseover = function () { link = true };
					level[link_level].entry[link_index].a_tags[i].onmouseout = function () { link = false };
				}				
			}
		}

	} else {
	
		/* zoomout */
		
		if (level[l].entry[id].zoom>level[l].highlight_size && level[l].entry[id].zoom<level[l].mouse_release_size) {

			clear_other_timeouts(l,id);
			
			level[l].entry[id].zoom--;
			level[l].entry[id].div.style.fontSize = level[l].entry[id].zoom +"px";
			if (l>0) zoom_parent_divs(l,id,-1);
			
			//loop
		 	level[l].entry[id].timeout = window.setTimeout("zzoom("+l+","+id+",false)",zmin_speed);
		 	
		 } else if (level[l].entry[id].zoom>level[l].highlight_size) {
			
		 	clear_other_timeouts(l,id);

			zoom_offset = (level[l].entry[id].zoom>level[l].highlight_size+12)? 4:6;
		 	level[l].entry[id].zoom-=zoom_offset;
			level[l].entry[id].div.style.fontSize = level[l].entry[id].zoom +"px";
			if (l>0) zoom_parent_divs(l,id,-zoom_offset);
			//fade
			if (l==0) {
				level[l].entry[id].fade-=25;
				if (level[l].entry[id].visited && level[l].entry[id].fade<140) level[l].entry[id].fade = 140;	
			}
			else level[l].entry[id].fade-=17;
			level[l].entry[id].div.style.color = rgb(level[l].entry[id].fade);
			
			
			/* child entry */
			
			link_level = level[l].entry[id].link.level;
			link_index = level[l].entry[id].link.indexnr;

			if (link_level!=-1 && level[l].zoomed==id) { //only when there's no other entry being zoomed on this level

				if (level[link_level].entry[link_index].zoom>2) {

					level[link_level].entry[link_index].zoom-=2;
					level[link_level].entry[link_index].div.style.fontSize = level[link_level].entry[link_index].zoom +"px";
					if (level[link_level].entry[link_index].type=="image") document.getElementById(link_level+"_"+link_index+"_image").width = level[link_level].entry[link_index].zoom * (level[link_level].entry[link_index].img.w/14);
					level[link_level].entry[link_index].rsetdiv.height = Math.round(.95*level[l].entry[id].zoom);
					
					level[link_level].entry[link_index].fade+=20;
					if (level[link_level].entry[link_index].type=="image") {
						if (ie5) level[link_level].entry[link_index].div.filters.alpha.opacity = 140-level[link_level].entry[link_index].fade;
						else level[link_level].entry[link_index].div.style.opacity = (140-level[link_level].entry[link_index].fade)/100;
						//if (ns6) level[link_level].entry[link_index].div.style.MozOpacity = 140-level[link_level].entry[link_index].fade +"%";
					} else level[link_level].entry[link_index].div.style.color = rgb(level[link_level].entry[link_index].fade);
					
					//undo previous offset
					y_offset(link_level,link_index,false);
					
					//y-correction if other entry is highlighted meanwhile    **** still not sure, but it seems to work
					level[link_level].div.style.top = level[l].div.offsetTop + level[l].entry[id].div.offsetTop +"px";
					
				} else level[link_level].div.style.visibility = "hidden";
			}
			
			//loop
		 	level[l].entry[id].timeout = window.setTimeout("zzoom("+l+","+id+",false)",zmin_speed);
		 
		 } else {

			/* zoomout done */
			
		 	level[l].entry[id].zoom	= level[l].highlight_size;
		 	level[l].entry[id].div.style.fontSize = level[l].entry[id].zoom +"px";
		 	//fade
		 	if (!(l==0 && level[l].entry[id].visited)) level[l].entry[id].fade = 0;
		 	level[l].entry[id].div.style.color = rgb(level[l].entry[id].fade);
		 	//parent fade
		 	if (l>0) {
		 		level[l-1].entry[level[l-1].zoomed].fade = level[l-1].default_fade;
		 		level[l-1].entry[level[l-1].zoomed].div.style.color = rgb(level[l-1].entry[level[l-1].zoomed].fade);
		 	}

			//for level0, reset all the way		 	
		 	if (l==0 && level[l].entry[id].visited) hhighlight(l,id,false);
		 	
		 	/* child entry */
		 	
			link_level = level[l].entry[id].link.level;
			link_index = level[l].entry[id].link.indexnr;
			
			if (link_level!=-1 && level[l].zoomed==id) { //only when there's no other entry being zoomed on this level
				level[link_level].div.style.visibility = "hidden";
				
				//reset to defaults
				level[link_level].entry[link_index].div.innerHTML = "";
				level[link_level].entry[link_index].zoom = 0;
				level[link_level].entry[link_index].fade = 0;
				
				//stop events
				level[link_level].entry[link_index].div.onmouseover = null;
				level[link_level].entry[link_index].div.onmousedown = null;
				level[link_level].entry[link_index].div.onmouseup = null;
				level[link_level].entry[link_index].div.onmousemove = null;
				
				level[link_level].entry[link_index].div.style.cursor = "text";
			}
			
			//for level 0, just check if y_offset is completely reset
			if (l==0 && level[l].y!=0) {
				level[l].entry[id].y_offset = 0;
				level[l].div.y = 0;
				level[l].div.style.top = level[l].div.y +"px";
			}
			
			//we're done with this entry
			if (level[l].zoomed==id) level[l].zoomed = -1;
		} 
	}
}


function hhighlight(l,id,do_highlight) {

	//debug(false,"hhigh -> ","l=",l," / id=",id);
		
	if (do_highlight) {

		/* highlight */	

		if (level[l].entry[id].zoom<level[l].highlight_size) {
			
			clear_other_timeouts(l,id);
			
			//reset others on init, only for level 0
			if (l==0 && level[0].entry[id].zoom==level[0].default_size) rset(0);
			
			//highlight (for level0 all events are always turned on, so first check if there's a child entry) 
			if (level[l].entry[id].link.level!=-1) {
				level[l].entry[id].zoom++;
				level[l].entry[id].div.style.fontSize = level[l].entry[id].zoom +"px";
				if (l>0) zoom_parent_divs(l,id,1);
			
				y_offset(l,id,true);
				
				//loop
				level[l].entry[id].timeout = window.setTimeout("hhighlight("+l+","+id+",true)",hlplus_speed);
			}
		}
		
	} else {
	
		/* dont highlight */
		
		if (level[l].entry[id].zoom>level[l].default_size) {
		
			clear_other_timeouts(l,id);
			
			level[l].entry[id].zoom--;
			level[l].entry[id].div.style.fontSize = level[l].entry[id].zoom;
			if (l>0) zoom_parent_divs(l,id,-1);
			
			y_offset(l,id,false);
			
			//loop		
			level[l].entry[id].timeout = window.setTimeout("hhighlight("+l+","+id+",false)",hlmin_speed);
		}
	}
}

function y_offset(l,id,do_offset) {

 	if (id!=level[l].zoomed) {

		var bottom = level[l].div.y + (level[l].entry[id].div.offsetTop + level[l].entry[id].div.offsetHeight);
		var condition = (do_offset)? bottom>(winHeight-22):level[l].entry[id].y_offset>0;

		if (condition) {
			var y_offset = bottom-(winHeight-22);
			var prev_offset = level[l].entry[id].y_offset;
 			level[l].entry[id].y_offset += y_offset;
 			
 			if (level[l].entry[id].y_offset<0) { level[l].entry[id].y_offset = 0; y_offset = -prev_offset; }
 			
 			level[l].div.y-=y_offset;	
 			level[l].div.style.top = level[l].div.y +"px";
 			 		
 			//parent divs:
 			for (var p=l-1; p>=0; p--) { 
 				level[p].div.y-=y_offset;
 				level[p].div.style.top = level[p].div.y +"px";
 				//leftmargins
 				if (p==0) for (var m=0; m<leftmargin.length; m++) leftmargin[m].div.style.top = level[0].div.y + level[0].entry[level[0].zoomed].div.offsetTop +"px";
 			}
 		}
 	}
}


function zoom_parent_divs(l,id,zoom_offset) {
	//pl = level[l].entry[id].div.myparentlevel;
	for (var p=l-1; p>=0; p--) {
	
		p_id = level[p].zoomed;
		
		level[p].entry[p_id].zoom+=zoom_offset; 
		level[p].entry[p_id].div.style.fontSize = level[p].entry[p_id].zoom +"px";
			
		//fade
		if (Math.abs(zoom_offset)>1) { //not while highlighting
			level[p].entry[p_id].fade += (zoom_offset>0)? .7:-0.8;
			level[p].entry[p_id].div.style.color = rgb(Math.round(level[p].entry[p_id].fade));
		}
		
		//update margin heights
		if (p==0) {
			//level 0 margin is the reference
			var margin_height = level[0].entry[level[0].zoomed].div.offsetHeight;
			margin_height+= (level[0].zoomed==0)? 12:2;
			//update them all
			for (n=0; n<leftmargin.length; n++) leftmargin[n].div.style.height = margin_height +"px";
		}
	}
}

function check_fades(l,id) {
	for (var p=l-1; p>=0; p--) {
		for (var f=210; f<250; f+=10) if (level[p].entry[level[p].zoomed].fade>f-5 && level[p].entry[level[p].zoomed].fade<f+5) level[p].entry[level[p].zoomed].fade = f;
		level[p].entry[level[p].zoomed].div.style.color = rgb(level[p].entry[level[p].zoomed].fade);
	}
}

function clear_other_timeouts(l,id) {
	if (level[l].entry[id].timeout) window.clearTimeout(level[l].entry[id].timeout);
}

function clear_selection() {
	if (document.selection) document.selection.clear();
	if (ie5 && mac && document.getSelection()) hiddenform.focus(); // <- strange mac exploder hack
}

function rgb(c) {
	return "rgb("+c+","+c+","+c+")";
}
