addEvent(window, "load", function()
{
	var images = $("images");
	if(images)
	{
		iterate_children(images, "img", function(image){
			set_hover_action_for_image(image, "i", "a");
		});
	}
	
	var hover_images = document.getElementsByClassName("hover_image");
	hover_images = $A(hover_images);
	hover_images.each(function(image){
		set_hover_action_for_image(image, "i", "a");
	});
	
	var collapsers = document.getElementsByClassName("collapser");
	collapsers = $A(collapsers);
	collapsers.each(function(collapser){
		if(hasClass(collapser, "link"))
			return;
		var imageArrow = document.createElement("img");
		imageArrow.setAttribute("src", ROOT_DIR+"resources/_img/arrow_down");
		collapser.insertBefore(imageArrow, collapser.firstChild);
		var textArrow = document.createElement("span");
		textArrow.appendChild(document.createTextNode(">"));
		textArrow.style.display = "none";
		collapser.insertBefore(textArrow, collapser.firstChild);
		collapser.insertBefore(document.createTextNode(" "), collapser.childNodes[2]);
		addEvent(collapser, "click", new Function("handle_collapser_action(this);"));
		handle_collapser_action(collapser, true);
	});
	
	var enlargeable_images = document.getElementsByClassName("enlargeable");
	enlargeable_images = $A(enlargeable_images);
	enlargeable_images.each(function(enlargeable_image){
		var src = replace_at_end(enlargeable_image.getAttribute("src"), "_s", "_l");
		var popup = new PopUp(src);
		popup.attach(enlargeable_image);
	});
	
	var links = document.getElementsByTagName("a");
	var external_link_pattern = /^(http|https|gopher|telnet):\/\/.*$/;
	links = $A(links);
	links.each(function(link){
		if(!link.href)
			return;
		var my_server = window.location.host;
		if(link.href.match(external_link_pattern) && link.href.indexOf(my_server)==-1)
		{
			link.setAttribute("rel", "external");
			addClass(link, "external");
			link.setAttribute("target", "_blank");
			var parent = link.parentNode;
			if(hasClass(parent, "link"))
				addClass(parent, "external");
		}
	});
	
	var sidebar = $("sidebar");
	if(sidebar && hasClass(sidebar, "sub_navigation") && $("hover_description"))
	{
		iterate_children(sidebar, "a", function(item){
			if(hasClass(item, "navigation_link") && (item.getAttribute("title") !== null))
			{
				var title = item.getAttribute("title");
				item.setAttribute("title", "");
				addEvent(item, "mouseover", new Function("change_text($(\"hover_description\"), \""+title+"\");"));
				addEvent(item, "mouseout", new Function("change_text($(\"hover_description\"), \"\");"));
			}
		}, true);
	}
});

function replace_img_src(image, searcher, replacer)
{
	image = $(image);
	image.setAttribute("src", replace_at_end(image.getAttribute("src"), searcher, replacer));
}

function replace_at_end(text, searcher, replacer)
{
	searcher = new RegExp(searcher+"$");
	return text.replace(searcher, replacer);
}

function set_hover_action_for_image(image, search_key, replace_key)
{
	search_key="_"+search_key;
	replace_key="_"+replace_key;
	addEvent(image, "mouseover", new Function("replace_img_src(this, '"+search_key+"', '"+replace_key+"');"));
	addEvent(image, "mouseout", new Function("replace_img_src(this, '"+replace_key+"', '"+search_key+"');"));
}

function handle_collapser_action(collapser)
{
//	var this_only = get_parameter(1, false); //Taken out because Safari does not support Function.caller
	var this_only = false;
	if(arguments.length == 2)
		this_only = arguments[1];
	var imageArrow = collapser.childNodes[0];
	var textArrow = collapser.childNodes[1];
	
	imageArrow.style.display = (collapser.is_collapsed ? "none" : "");
	textArrow.style.display = (collapser.is_collapsed ? "" : "none");
	
	collapser.is_collapsed = !(collapser.is_collapsed);
		
	if(!this_only)
	{
		var all_collapsers = document.getElementsByClassName("collapser");
		all_collapsers = $A(all_collapsers);
		all_collapsers.each(function(a_collapser){
			if(hasClass(a_collapser, "link"))
				return;
			if(collapser == a_collapser)
				return;
			if(collapser.parentNode != a_collapser.parentNode)
				throw($break);
			if(!a_collapser.is_collapsed)
				handle_collapser_action(a_collapser, true);
		});
	}

	display_value = collapser.is_collapsed ? "none" : "";
	siblings_till_similar(collapser).each(function(sibling){
		if(sibling.nodeType==1)
			sibling.style.display = display_value;
	});
}

function change_text(element, text)
{
	empty_element(element);
	text = document.createTextNode(text);
	element.appendChild(text);
}

function empty_element(element)
{
	var sub_elements = element.childNodes;
	sub_elements = $A(sub_elements);
	sub_elements.each(function(item){
		element.removeChild(item);
	});
}

function iterate_children(parent, tag_name, code, direct_only)
{
	var all_children = parent.getElementsByTagName(tag_name);
	var i=0;
	var counter=0;
	
	for(i=0;i<all_children.length;i++)
	{
		var child=all_children[i];
		if(!direct_only || child.parentNode==parent)
		{
			counter++;
			var code_return = code(child, counter);
			if(code_return===false)
				return;
		}
	}
}

function siblings_till_similar(starter)
{
	var results = [];
	starter = $(starter);
	var started = false;
	var list = $A(starter.parentNode.childNodes);
	list.each(function(element)
	{
		if(started)
		{
			if((element.tagName && element.tagName.toLowerCase() == starter.tagName.toLowerCase()) && (hasClass(element, starter.className)))
				throw($break)
			results[results.length]=element;
		}
		else
		{
			if(element===starter)
				started = true;
		}
	});
	return $A(results);
}

//Meta-functions
function get_parameter(index, defaultValue)
{
	var the_caller = get_parameter.caller || arguments.caller || get_parameter.arguments.caller || this.caller;
	var args = the_caller.arguments;
	if(args[index])
		return args[index];
	return defaultValue;
}

function PopUp(image_url)
{
	this.image = document.createElement("img");
	this.image.setAttribute("src", image_url);
	this.image.popup = this;
	
	this.tooltipElement = document.createElement("div");
	this.tooltipElement.appendChild(this.image);
	
	addClass(this.tooltipElement, "tooltip");
	document.body.appendChild(this.tooltipElement);
	
	this.attach = function(item)
	{
		item.popup = this;
		addEvent(item, "click", this.handle_click);
		addEvent(this.image, "click", this.handle_click);
		this.set_position(365, 95);
	}
	
	this.handle_click = function(event)
	{
		var popup = this.popup;
		popup.toggle();
	}
	
	this.set_position = function(x, y)
	{
		this.tooltipElement.style.left = ""+x+"px";
		this.tooltipElement.style.top = ""+y+"px";
	}
	
	this.toggle = function()
	{
		this.tooltipElement.style.display = (this.tooltipElement.style.display == "block") ? "none" : "block";
	}
}

function Tooltip(image_url)
{
	this.image = document.createElement("img");
	this.image.setAttribute("src", image_url);
	
	this.tooltipElement = document.createElement("div");
	this.tooltipElement.appendChild(this.image);
	addClass(this.tooltipElement, "tooltip");
	
	document.body.appendChild(this.tooltipElement);
	
	this.attach = function(item)
	{
		item.tooltip = this;
		addEvent(item, "mouseover", this.display);
		addEvent(item, "mousemove", this.move);
		addEvent(item, "mouseout", this.hide);
	}
	
	this.display = function(event)
	{
		var tooltip = this.tooltip;
		tooltip.set_position_event(event);
		tooltip.tooltipElement.style.display = "block";
	}
	
	this.move = function(event)
	{
		this.tooltip.set_position_event(event);
	}
	
	this.hide = function(event)
	{
		this.tooltip.tooltipElement.style.display = "none";
	}
	
	this.set_position = function(x, y)
	{
		this.tooltipElement.style.left = ""+x+"px";
		this.tooltipElement.style.top = ""+y+"px";
	}
	
	this.set_position_event = function(event)
	{
		var cursor = getCursorPosition(event);
		this.set_position(cursor.x+5, cursor.y+5);
	}
	
}
