//at first we define a very restrictive rule
var has_dom = false;
var proper_w3c_dom = false;
var proper_msie_dom = false;

//iCab uses both MSIE-DOM and W3C-DOM
if(document.getElementById || document.all) {
	var my_iCab = /iCab/i;
}

//if the browser is W3C-DOM-capable
if(document.getElementById) {
	//at first we set it to true
	proper_w3c_dom = true;
	//iCab has a crappy rendering and positioning is not working properly (tested on iCab 2.9.8 http://www.icab.de)
	if(my_iCab.test(navigator.userAgent)) proper_w3c_dom = false;
	//we exclude all internet explorers or document.all-capable browsers here (especially the opera renders better in MSIE-mode)
	var my_opera = /Opera/i;
	if(document.all || my_opera.test(navigator.userAgent)) proper_w3c_dom = false;
}

if(document.all) {
	proper_msie_dom = true;
	//iCab has a crappy rendering and positioning is not working properly (tested on iCab 2.9.8 http://www.icab.de)
	if(my_iCab.test(navigator.userAgent)) proper_msie_dom = false;
}

//if it is an MSIE-DOM- or W3C-DOM-capable-browser
if(proper_msie_dom || proper_w3c_dom) has_dom = true;

if(has_dom) {
	//declare variables

	//at first the images where we detect the positions from
	var my_points = new Array("menu_be_p","menu_dis_p","menu_help_p","menu_talk_p","menu_win_p");

	//some corrections
	var my_minus_left = 1;
	var my_height = 18;

	//a regular expression to detect macs
	var my_mac_regexp = /mac|ppc|powerpc/i;

	//a regular expression to detect the safari
	var my_safari_regexp = /safari/i;

	//these tags need to be excluded in our positionBubbling later
	if(proper_w3c_dom) var my_offset_regexp = /^(tr|tbody|thead|tfoot|a)$/i;
}

function initialize() {
	if(has_dom) {
		//capture event-bubbling and stop it
		//Safari doesn't support eventBubbling, but renders the page
		if(!my_safari_regexp.test(navigator.userAgent)) {
			for(a=0;a<my_layers.length;a++) {
				if(proper_msie_dom) {
					//if it is no mac MSIE
					if(!my_mac_regexp.test(navigator.userAgent)) {
						var my_layer = document.all[my_layers[a][0]];
						my_layer.attachEvent("onmouseout", cancelOut);
					}
				}
				else if(proper_w3c_dom) {
					var my_layer = document.getElementById(my_layers[a][0]);
					my_layer.addEventListener("mouseout", cancelOut, true);
					var my_body = document.getElementsByTagName("body")[0];
					my_body.addEventListener("mouseover", cancelOver, false);
				}
			}
		}

		/*for(a=0;a<my_points.length;a++) {
			var my_point = document.images[my_points[a]];
			var my_layer;
			if(proper_msie_dom) my_layer = document.all[my_layers[a][0]];
			else if(proper_w3c_dom) my_layer = document.getElementById(my_layers[a][0]);
			var my_point_top = bubbleTop(my_point);
			var my_point_left = bubbleLeft(my_point);
			my_layer.style.top = (my_point_top+my_height)+"px";
			my_layer.style.left = (my_point_left-my_minus_left)+"px";
		}*/
	}
}

//cancel bubbling (to prevent flickering in geckos)
function cancelOut(event) {
	if(has_dom) stopBubbling(event);
}

//cancel bubbling (to prevent flickering in geckos)
function cancelOver(event) {
	if(proper_w3c_dom) {
		var shooter = event.target;

		var shoot_image = false;

		for(a=0;a<my_points.length;a++) {
			if(shooter.name == my_points[a] || shooter.id == my_points[a]) shoot_image = true;
		}

		if(isChildOfDiv(shooter) || shoot_image) {
			stopBubbling(event);
		}
	}
}

//show the layer
function showLayer(nodeName) {
	if(has_dom) {
		var my_layer;
		if(proper_msie_dom) my_layer = document.all[nodeName];
		else if(proper_w3c_dom) my_layer = document.getElementById(nodeName);

		for(a=0;a<my_layers.length;a++) {
			if(nodeName == my_layers[a][0]) {
				/*var my_point = document.images[my_points[a]];
				var my_point_top = bubbleTop(my_point);
				var my_point_left = bubbleLeft(my_point);
				my_layer.style.top = (my_point_top+my_height)+"px";
				my_layer.style.left = (my_point_left-my_minus_left)+"px";*/

				my_layers[a][1] = true;
			}
		}
		try { my_layer.style.display = "block"; } catch(ex) { }; //quick and dirty
	}
}

//hide the layer
function hideLayer(nodeName) {
	if(has_dom) {
		var my_layer;
		if(proper_msie_dom) my_layer = document.all[nodeName];
		else if(proper_w3c_dom) my_layer = document.getElementById(nodeName);
		for(a=0;a<my_layers.length;a++) {
			if(nodeName == my_layers[a][0]) my_layers[a][1] = false;
		}
		try { my_layer.style.display = "none"; } catch(ex) { }; //quick and dirty
	}
}

//hide all layers if body tag fires
function hideLayers() {
	if(proper_w3c_dom && !my_safari_regexp.test(navigator.userAgent)) {
		for(a=0;a<my_layers.length;a++) {
			if(my_layers[a][1]) document.getElementById(my_layers[a][0]).style.display = "none";
		}
	}
}

//bubble thorugh all parentnodes to do a top-values-addition
function bubbleTop(node) {
	if(proper_msie_dom) {
		if(node.offsetParent) return node.offsetTop+bubbleTop(node.offsetParent);
		else return node.offsetTop;
	}
	else if(proper_w3c_dom) {
		var my_offset = node.offsetTop;
		if(isNaN(my_offset)) my_offset = 0;
		if(my_offset_regexp && !my_offset_regexp.test(node.tagName)) {
			if(node.parentNode) return my_offset+bubbleTop(node.parentNode);
			else return my_offset;
		}
		else {
			if(node.parentNode) return bubbleTop(node.parentNode);
			else return 0;
		}
	}
}

//bubble thorugh all parentnodes to do a left-values-addition
function bubbleLeft(node) {
	if(proper_msie_dom) {
		if(node.offsetParent) return node.offsetLeft+bubbleLeft(node.offsetParent);
		else return node.offsetLeft;
	}
	else if(proper_w3c_dom) {
		var my_offset = node.offsetLeft;
		if(isNaN(my_offset)) my_offset = 0;
		if(my_offset_regexp && !my_offset_regexp.test(node.tagName)) {
			if(node.parentNode) return my_offset+bubbleLeft(node.parentNode);
			else return my_offset;
		}
		else {
			if(node.parentNode) return bubbleLeft(node.parentNode);
			else return 0;
		}
	}
}

//detect if the node is a child of one of our divs
function isChildOfDiv(node) {
	if(proper_w3c_dom) {
		var isDiv = false;
		for(a=0;a<my_layers.length;a++) {
			if(node.id == my_layers[a][0]) isDiv = true;
		}

		if(isDiv) return true;
		else {
			if(node.parentNode) return isChildOfDiv(node.parentNode);
			else return false;
		}
	}
}

//we need our own cancelBubble function
function stopBubbling(event) {
	if(window.event && window.event.cancelBubble !== null) {
		window.event.cancelBubble = true;
	}
	else {
		//try everything!
		event.cancelBubble = true;
		if(event.cancelable) event.preventDefault();
		if(event.stopPropagation != null) event.stopPropagation();
	}
}