/*******************************************************
* custom onload/resize eventlistener
*******************************************************/
var gInitArray = new Array();
var gResizeArray = new Array();

function AddToInitArray(fn) {
	gInitArray[gInitArray.length] = fn;
}
function AddToResizeArray(fn) {
	gResizeArray[gResizeArray.length] = fn;
}

function InitFromArray() {
	for (var i = 0; i < gInitArray.length; i++) {
		gInitArray[i]();
	}
}
function ResizeFromArray() {
	for (var i = 0; i < gResizeArray.length; i++) {
		gResizeArray[i]();
	}
}

window.onload = InitFromArray;
window.onresize = ResizeFromArray;

/* fix ie6 css backgound img flickering */
try {
  document.execCommand("BackgroundImageCache", false, true);
} catch(err) {}

/*******************************************************
* load onerror handler (or not...)
*******************************************************/
if (/\/cms\/beheer/.test(location.href)) {
	var a = document.getElementsByTagName("script");
	for (var i = 0; i < a.length; i++) {
		if (a[i].src && a[i].src.match(/init\.js(\?.*)?$/)) {
			var path = a[i].src.replace(/init\.js(\?.*)?$/,'');
			path += "../cms/js/";
		    document.write('<script type="text/javascript" src="'+path+'jserrorhandler.js"></script>');
		}
	}
}

/*******************************************************
*******************************************************/
/*
function addHandler(elem, sEventType, fnHandler)
{
	//If there are prior event handler functions 
	//that have been assigned to this event handler,
	//then save them:
	if(elem[sEventType]) 
		var oldfuncs = elem[sEventType];
	
	//Assign new function to the 
	//element's event handler:
	elem[sEventType] = function ()
	{
		if (oldfuncs) oldfuncs();
		fnHandler();
	}
}
*/

function xcmsAddEventListener(elem, type, listener, capture) {
	if (elem.addEventListener) {	
		if (capture == "undefined") capture = false;
		elem.addEventListener(type, listener, capture);
	} else if (elem.attachEvent) {
		elem.attachEvent('on'+type, listener);
	}
}

function xcmsRemoveEventListener(elem, type, listener, capture) {
	if (elem.removeEventListener) {	
		if (capture == "undefined") capture = false;
		elem.removeEventListener(type, listener, capture);
	} else if (elem.attachEvent) {
		elem.detachEvent('on'+type, listener);
	}
}

/*******************************************************
* AJAX
*******************************************************/
function xcmsAJAX(url, processor, sync, postdata) {
	var object = this;
	object.httpRequest = (!window.XMLHttpRequest)? (ActiveXObject ? (new ActiveXObject("Microsoft.XMLHTTP")):""):(new XMLHttpRequest());
	if (!object.httpRequest) return;
	
	object.processor = processor || emptyProcessor;
	
	var async = sync ? false : true;
	if (async) object.httpRequest.onreadystatechange = function() {
		if (object.httpRequest.readyState == 4) {
			object.processor(object.httpRequest);
			object.httpRequest = null;
		}
	};
	if (postdata) {
		object.httpRequest.open("POST", url, async);
		//httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded; charset:ISO-8859-1;");
		object.httpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		object.httpRequest.setRequestHeader("Content-length", postdata.length);
		object.httpRequest.send(postdata);
	} else {
		object.httpRequest.open("GET", url, async);
		object.httpRequest.send(null);
	}
}

function emptyProcessor(httpRequest) {
	if (httpRequest.status == 200) {
		//...
	}
}

/*******************************************************
* add IE inner/outerText and outerHTML to Gecko's... (innerHTML is natively supported)
*******************************************************/
if (typeof HTMLElement != "undefined" &&
	typeof HTMLElement.prototype.__defineGetter__ != "undefined") {

	HTMLElement.prototype.__defineGetter__("innerText", function() {
			var tmp = this.innerHTML.replace(/<[^>]*>/g, "");
			return tmp;
  		}
	);

	HTMLElement.prototype.__defineSetter__("innerText",	function(txtStr) {
			var parsedText = document.createTextNode(txtStr);
			this.innerHTML = "";
			this.appendChild(parsedText);
		}
	);

	HTMLElement.prototype.__defineGetter__("outerText", function() {
			return this.innerText;
  		}
	);

	HTMLElement.prototype.__defineSetter__("outerText", function (txtStr) {
			this.outerHTML = txtStr.replace(/\&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
		}
	);

	var _emptyTags = {
	   "IMG":   true,
	   "BR":    true,
	   "INPUT": true,
	   "META":  true,
	   "LINK":  true,
	   "PARAM": true,
	   "HR":    true
	};
	
	HTMLElement.prototype.__defineGetter__("outerHTML", function() {
			var attrs = this.attributes;
			var str = "<" + this.tagName;
			for (var i = 0; i < attrs.length; i++)
				str += " " + attrs[i].name + "=\"" + attrs[i].value + "\"";
			
			if (_emptyTags[this.tagName])
				return str + ">";
			
			return str + ">" + this.innerHTML + "</" + this.tagName + ">";
		}
	);

	HTMLElement.prototype.__defineSetter__("outerHTML", function(sHTML) {
			var r = this.ownerDocument.createRange();
			r.setStartBefore(this);
			var df = r.createContextualFragment(sHTML);
			this.parentNode.replaceChild(df, this);
		}
	);
	
}

/*******************************************************
*******************************************************/
document.getElementsByClassName = function(className, parentElement) {
	var children = ((typeof parentElement == "string" ? document.getElementById(parentElement) : parentElement) || document.body).getElementsByTagName('*');
	var elements = new Array;
	var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
	for (var i = 0; i < children.length; i++) {
		if (re.test(children[i].className)) {
			elements.push(children[i]);
		}
	}
	return elements;
}

function xcmsHasClassName(e, classname) {
	return (new RegExp("(^| )"+classname+"( |$)")).test(e.className);
}
function xcmsAddClassName(e, classname) {
	if (!xcmsHasClassName(e, classname)) {
		if (e.className == "") {
			e.className = classname;
		} else {
			e.className += " "+classname;
		}
	}
}
function xcmsRemoveClassName(e, classname) {
	e.className = e.className.replace(new RegExp("(^| )"+classname+"( |$)"), '');
}

/*******************************************************
* Browser detection stuff
*******************************************************/
var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]
};
BrowserDetect.init();

/*******************************************************
* Miscelaneous...
*******************************************************/
function writeObject(object) {
	document.write(object);
}

function getStyle(el,styleProp) {
	var style;
	if (el.currentStyle)
		return el.currentStyle[styleProp];
	else if (window.getComputedStyle)
		return el.ownerDocument.defaultView.getComputedStyle(el, "").getPropertyValue(styleProp);
		return document.defaultView.getComputedStyle(el,null).getPropertyValue(styleProp);
}

function getAbsoluteWidth(element, stop) {
//    var eWidth = element.offsetWidth;		// Get Width from the parent object
//    while (element.offsetParent != null) {	// Parse the parent hierarchy up to the document element
//        var eParent = element.offsetParent; // Get parent object reference
//        eWidth += eParent.offsetWidth;		// Add parent Width
//        element = eParent;
//    }
//    return eWidth;
	var valueW = 0;
	do {
		valueW += element.offsetWidth || 0;
		element = element.offsetParent;
	} while (element && (!stop || element == stop));
	return valueW;
}

function getPosition(element, stop) {
	var valueT = 0, valueL = 0;
	do {
		valueT += element.offsetTop  || 0;
		valueL += element.offsetLeft || 0;
		element = element.offsetParent;
	} while (element && (!stop || element == stop));
	return [valueL, valueT];
}

function getWindowHeight() {
	var windowHeight=0;
	if (typeof(window.innerHeight) == 'number') {
		windowHeight = window.innerHeight;
	} else {
		if (document.documentElement && document.documentElement.clientHeight) {
			windowHeight = document.documentElement.clientHeight;
		} else {
			if (document.body && document.body.clientHeight) {
				windowHeight = document.body.clientHeight;
			}
		}
	}
	return windowHeight;
}

function getWindowWidth() {
	var windowWidth=0;
	if (typeof(window.innerWidth) == 'number') {
		windowWidth = window.innerWidth;
	} else {
		if (document.documentElement && document.documentElement.clientWidth) {
			windowWidth = document.documentElement.clientWidth;
		} else {
			if (document.body && document.body.clientWidth) {
				windowWidth = document.body.clientWidth;
			}
		}
	}
	return windowWidth;
}

function isChildOf(element, parentNode, deep) {
    if (parentNode) {
    	var children = deep ? parentNode.getElementsByTagName("*") : parentNode.childNodes;
        for (var i = 0; i < children.length; i++) {
            if (children[i] === element) {
                return true;
            }
        }
    }
    return false;
}

function preventDefault(evt) {
	if (evt) {
		if (evt.preventDefault) {
			evt.preventDefault(); 
		}
		evt.returnValue = false; // always set this attribute (it's used by the cms to check for double entries in callbacks...)
	}
}

var gHideSelectControlsId = 0; // if multiple hide requests... track until last unhide request
function showHideSelectControls(action,x,y,width,height) { 
	if (BrowserDetect.browser == "Explorer" && BrowserDetect.version < 7) {
		var right=x+width-1; 
		var bottom=y+height-1; 
		
		var selectControls=document.getElementsByTagName("select"); 
		for (var i=0; i<selectControls.length; i++) {
			if (action == 'hide') {
				var sx=selectControls[i].offsetLeft; 
				var sy=selectControls[i].offsetTop; 
		
				// sx and sy are relative to parent. Compute absolute values 
				var parent=selectControls[i].offsetParent; 
				do { 
					sx += parent.offsetLeft; 
					sy += parent.offsetTop; 
				} while (parent = parent.offsetParent); 
				
				var sRight=sx+selectControls[i].offsetWidth-1; 
				var sBottom=sy+selectControls[i].offsetHeight-1; 
	
				if(x <= sRight 
				&& right >= sx 
				&& y <= sBottom 
				&& bottom >= sy) 
					selectControls[i].style.visibility='hidden'; 

			} else {
				if (action == gHideSelectControlsId) selectControls[i].style.visibility='visible'; 
			}
		} 
		if (action == 'hide') return ++gHideSelectControlsId;
	}
}
