/* shorthand version of frequently used dom methods */
function $(/*string*/uid)  { return document.getElementById(uid); }
function $$(/*string*/tag) { return document.getElementsByTagName(tag); }

/* method to remove all empty items from an array */
Array.prototype.compact = function()
{
	var newArray = new Array();

	for (var i = 0; i < this.length; i++)
		if (this[i] != "")
			newArray.push(this[i]);

	return newArray;
}

/* determine if user agent is Safari */
var isSafari = navigator.userAgent.indexOf("AppleWebKit") > -1;// || navigator.userAgent.indexOf("Firefox") > -1;

/* event attachment rewiring to prevent IE memory leaks */
function addEvent(/*object*/element, /*string*/type, /*function*/handler)
{
	if (element.addEventListener)
		element.addEventListener(type, handler, false);
	else
	{
		if (!handler.$$guid) handler.$$guid = addEvent.guid++;
		if (!element.events) element.events = {};
		var handlers = element.events[type];

		if (!handlers)
		{
			handlers = element.events[type] = {};
			if (element['on' + type]) handlers[0] = element['on' + type];
			element['on' + type] = handleEvent;
		}

		handlers[handler.$$guid] = handler;
	}
}

addEvent.guid = 1;

function removeEvent(/*object*/element, /*string*/type, /*function*/handler)
{
	if (element.removeEventListener)
		element.removeEventListener(type, handler, false);
	else if (element.events && element.events[type] && handler.$$guid)
		delete element.events[type][handler.$$guid];
}

function handleEvent(/*object*/event)
{
	event = event || fixEvent(window.event);
	var returnValue = true;
	var handlers = this.events[event.type];

	for (var i in handlers)
	{
		if (!Object.prototype[i])
		{
			this.$$handler = handlers[i];
			if (this.$$handler(event) === false) returnValue = false;
		}
	}

	if (this.$$handler) this.$$handler = null;

	return returnValue;
}

function fixEvent(/*object*/event)
{
	event.preventDefault = fixEvent.preventDefault;
	event.stopPropagation = fixEvent.stopPropagation;
	return event;
}

fixEvent.preventDefault  = function() { this.returnValue = false; }
fixEvent.stopPropagation = function() { this.cancelBubble = true; }


/* prevent body's onload from overwriting previously attached window events*/
if (!window.addEventListener)
{
	document.onreadystatechange = function()
	{
		if (window.onload && window.onload != handleEvent)
		{
			addEvent(window, "load", window.onload);
			window.onload = handleEvent;
		}
	}
}

/* helper function to apply class change on collection of elements for mouseover and mouseout events */
function setHover(/*array*/collection)
{
	if (collection)
	{
		for (var i = 0; i < collection.length; i++)
		{
			addEvent(collection[i], "mouseover", addHoverClass);
			addEvent(collection[i], "mouseout", removeHoverClass);
		}
	}
}

function addHoverClass()    { addClass([this], "hover"); }
function removeHoverClass() { removeClass([this], "hover"); }

/* helper function to set styles on collection of elements */
function setStyle(/*array*/collection, /*object*/styles)
{
	if (collection && styles)
		for (var i = 0; i < collection.length; i++)
			for (var s in styles)
				collection[i].style[s] = styles[s];
}

/* helper function to add a class to an existing classname */
function addClass(/*array*/collection, /*string*/classname)
{
	if (collection)
	{
		for (var i = 0; i < collection.length; i++)
		{
			if (collection[i].className != "")
				collection[i].className += " " + classname;
			else
				collection[i].className = classname;
		}
	}
}

/* helper function to remove a class from an existing classname */
function removeClass(/*array*/collection, /*string*/classname)
{
	if (collection)
	{
		var classToRemove = new RegExp((classname + "\s?"), "i");
		for (var i = 0; i < collection.length; i++)
		{
			collection[i].className = collection[i].className.replace(classToRemove, "").replace(/^\s?|\s?$/g, "");
		}
	}
}

/* helper function to replace a classname with a new class */
function setClass(/*array*/collection, /*string*/classname)
{
	if (collection)
		for (var i = 0; i < collection.length; i++)
			collection[i].className = classname;
}

/* apply hover to submit buttons */
function setButtonHover()
{
	var buttons = new Array();
	var inputs  = $$("input");

	for (var i = 0; i < inputs.length; i++)
		if (inputs[i].type == "submit")
			buttons.push(inputs[i]);

	setHover(buttons, "hover");
}

/* apply hover to teaser divs */
function setTeaserHover()
{
	var teasers = new Array();
	var divs    = $$("div");

	for (var i = 0; i < divs.length; i++ )
		if (divs[i].className.indexOf("teaser") > - 1)
			teasers.push(divs[i]);

	setHover(teasers, "hover");
}

/* apply hover to search button */
function setSearchHover()
{
	var sb = $("searchbutton")
	if (sb != null)
		setHover([sb], "hover");
}

function setSearchText()
{
	var st = $("searchtext");

	addEvent(st, "focus", clearSearchText);
	addEvent(st, "blur", restoreSearchText);
}

/* ENable the submit when user has not supplied his own search criteria */
function clearSearchText()   { 
this.value = ""; 
	var searchsubmit = $("searchbutton")
	if (searchsubmit != null){
		searchsubmit.disabled = false;
	}
}
/* disable the submit when user has not supplied his own search criteria */
function restoreSearchText() { 
	if (this.value == "") {
		this.value = "Zoeken"; 
		var searchsubmit = $("searchbutton")
		if (searchsubmit != null){
			searchsubmit.disabled = true;
		}
	}
}

/* collect top level menu items (also called domains) */
function getDomains()
{
	/* do not use getElementsByTagName because we only need mainmenulist's children */
	var domainElements = $("mainmenulist") ? $("mainmenulist").childNodes : null;
	var domains        = new Array();

	/* filter domainElements on list items */
	if (domainElements != null)
		for (var i = 0; i < domainElements.length; i++)
			if (domainElements[i].nodeName.toLowerCase() == "li")
				domains.push(domainElements[i]);

	return domains;
}

/* match domains with menuData */
function buildMenu()
{
	/* pageheader offset height should be less than 100 if css is enabled so we can use it to determine if the menu items should be rendered */
	var cssEnabled = $("pageheader").offsetHeight < 100;
	var mainmenu   = $("mainmenulist");
	var domains    = getDomains();

	if (cssEnabled)
	{
		/* append data from menuData array to main menu */
		for (var i = 0; i < domains.length; i++)
			domains[i].innerHTML += menuData[i];

		if (mainmenu)
		{
			/* apply IE-specific events */
			if (document.uniqueID)
			{
				//var selects  = $("pagebody").getElementsByTagName("select");

				/* hide select controls */
				addEvent(mainmenu, "mouseover", hideSelects);

				/* show select controls; do not use onmouseout to prevent flickering in IE */
				addEvent($("pageheader"), "mouseover", showSelects);
				addEvent($("pagebody"), "mouseover", showSelects);
			}

			/* last submenu should flip to left */
			flipLast();

			/* apply hover class */
			setHover(domains, "hover");
		}

	}
}

function hideSelects() { setStyle($("pagebody").getElementsByTagName("select"), {"visibility": "hidden"}); }
function showSelects() { setStyle($("pagebody").getElementsByTagName("select"), {"visibility": "visible"}); }

/* last submenu should flip to left */
function flipLast()
{
	var domains = getDomains();

	if (document.body.clientWidth < 900)
		addClass([domains[domains.length - 1]], "flip");
	else
		removeClass([domains[domains.length - 1]], "flip");
}

/* decrease mainmenu item padding when window resize results in less than 900 pixels browser width */
function resizeMenu()
{
	var domainLinks = new Array();
	var domains     = getDomains();

	for (var i = 0; i < domains.length; i++)
		domainLinks.push(domains[i].getElementsByTagName("a")[0]);

	if (document.body.clientWidth < 900)
		setStyle(domainLinks, {"padding": "4px"});
	else
		setStyle(domainLinks, {"padding": "4px 12px 4px 12px"});
}

/* positioning of back to top button */
function setTopButton()
{
	var backtotop = $("backtotop");

	/* attach setPos to window object to enable setInterval to access it */
	window.setPos = function()
	{
		var fromTop = document.body.scrollTop || (document.documentElement && document.documentElement.scrollTop);
		var page    = $("page");

		/* page is being/has been scrolled */
		if (fromTop > 0)
		{
			/* show backtotop button */
			setClass([backtotop], "shown");

			/* apply positioning for non-IE browsers */
			if (!document.uniqueID)
			{
				/* use page as offset to account for page centering when positioning */
				backtotop.style.left = (isSafari) ? (page.offsetLeft + page.offsetWidth - 205) + "px" : (page.offsetLeft + page.offsetWidth - 210) + "px";
				backtotop.style.bottom = "65px";
				backtotop.style.position = "fixed";
			}
		}
		else
			setClass([backtotop], "i");
	}

	if (backtotop)
	{
		/* repeat scroll check and positiong */
		setInterval("window.setPos()", 100);

		/* non-IE browsers do not support linking to no-display elements */
		addEvent(backtotop, "click", toTop );
	}
}

function toTop() { window.scrollTo(0,0); }

/* generic image randomization */
function setImage()
{
	if (genericImages != null)
	{
		var placeHolder = $("decorative");
		var realImages  = genericImages.compact();
		if (placeHolder && realImages.length > 0)
		{
			var randomNumber = Math.floor(realImages.length * Math.random());
			placeHolder.style.backgroundImage = "url('" + realImages[randomNumber] + "')";
			setClass([placeHolder], "present");
		}
	}
}

/* set width of image containers to force image captions wrapping */
function setImageContainers()
{
	var contentdivs = $("content").getElementsByTagName("div");
	var containers = new Array();

	for (var i = 0; i < contentdivs.length; i++)
		if (contentdivs[i].className.indexOf("inlineleft") > -1 || contentdivs[i].className.indexOf("inlineright") > -1)
			containers.push(contentdivs[i]);

	if (containers.length > 0){
		for (var i = 0; i < containers.length; i++){
			if (containers[i].getElementsByTagName("img")[0] != null){
				containers[i].style.width = (isSafari) ? containers[i].getElementsByTagName("img")[0].offsetWidth + "px" : containers[i].getElementsByTagName("img")[0].offsetWidth + 10 + "px";
			}
		}
	}
}

function setFaqLinks()
{
	if ($("DNBFAQOverzicht") && $("faqlist"))
	{
		var faqs = $("faqlist").getElementsByTagName("li");

		for (var i = 0; i < faqs.length; i++)
		{
			if (faqs[i].getElementsByTagName("div").length > 0)
			{
				setStyle([faqs[i].getElementsByTagName("div")[0]], {"display": "none"});
				addEvent(faqs[i].getElementsByTagName("a")[0], "click", swapAnswer);
			}
		}
	}
}

function swapAnswer()
{
	var a = this.parentNode.getElementsByTagName("div")[0];
	var d = (a.style.display == "block") ? "none" : "block";
	var b = (a.style.display == "block") ? "url('img/readmore.gif')" : "url('img/readmore_down.gif')";

	setStyle([this], {"backgroundImage": b});
	setStyle([a], {"display": d});
}

/* dynamically add a Safari-specific stylesheet */
function setSafariCSS()
{
	var head      = $$("head")[0];
	var safariCSS = document.createElement("link");
	safariCSS.setAttribute("rel","stylesheet");
	safariCSS.setAttribute("type","text/css");
	safariCSS.setAttribute("media","screen, print");
	safariCSS.setAttribute("href","css/safari.css");

	head.appendChild(safariCSS);
}

function resizeTheme()
{
	if ($("DNBhomepage") && $("pagebody").offsetHeight < 480)
		$("pagebody").style.height = $("theme").offsetHeight + 30 + "px";
}

function resizeSafari()
{
	if ($("DNBhomepage"))
		$("content").style.maxWidth = (document.body.clientWidth < 950) ? $("theme").offsetWidth - 110 + "px" : "300px";
	else
		$("content").style.width = (document.body.clientWidth < 950) ? document.body.clientWidth - 450 + "px" : "52%";
}

/* debug */
function getInfo()
{
	//alert($("pagebody").offsetHeight);
}

function externalLinks() { 
 if (!document.getElementsByTagName) return; 
 var anchors = document.getElementsByTagName("a"); 
 for (var i=0; i<anchors.length; i++) { 
   var anchor = anchors[i]; 
   if (anchor.getAttribute("href") && 
       anchor.getAttribute("rel") == "external") 
     anchor.target = "_blank"; 
 } 
} 

/* collect and execute needed functions */
function initLoad()
{
	setSearchHover();
// no search button on this page
//	setSearchText();
	setTeaserHover();
	setButtonHover();
	setTopButton();
	setImage();
	setImageContainers();
	//setFaqLinks();
	resizeMenu();
	resizeTheme();
	getInfo();
	externalLinks();

	/* disable the submit when user has not supplied his own search criteria */

	var searchsubmit = $("searchbutton")
	if (searchsubmit != null){
		searchsubmit.disabled = true;
	}


	if (isSafari)
	{
		setSafariCSS();
		resizeSafari();
	}

	/* execute buildMenu() last because of lag in menu servlet call */
	//buildMenu();
}

function initResize()
{
	resizeMenu();
	resizeTheme();
	flipLast();
	if (isSafari)
		resizeSafari();
}

/* attach functions to event handlers */
addEvent(window, "load", initLoad);
addEvent(window, "resize", initResize);