/******************************************************************************* 
Ajax XMLHTTPRequest functies 
*******************************************************************************/
if (typeof XMLHttpRequest == "undefined") {
	XMLHttpRequest = function() {
		try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch(e) {};
		try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch(e) {};
		try { return new ActiveXObject("Msxml2.XMLHTTP"); }     catch(e) {};
		try { return new ActiveXObject("Microsoft.XMLHTTP"); }  catch(e) {};
		throw new Error("Deze browser biedt geen ondersteuning voor XMLHttpRequest of XMLHTTP!" );
	};
}

function getURL(url) { 
    var xhr = new XMLHttpRequest();
	xhr.open("GET", url, true);
	xhr.onreadystatechange = function() { if ((xhr.readyState==4) && (xhr.status==200)) eval(xhr.responseText); };
	//url = url + "&ms=" + new Date().getTime();
	xhr.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
	xhr.setRequestHeader("Cache-Control", "no-cache");
	xhr.setRequestHeader("X_USERAGENT", "WebiaXHR");
	xhr.send(null);
}

function postURL(url, data) {
    var xhr = new XMLHttpRequest();
	xhr.open('POST', url, true);
	xhr.onreadystatechange = function() { if ((xhr.readyState==4) && (xhr.status==200)) eval(xhr.responseText); };
	xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xhr.setRequestHeader("Content-length", data.length);
	xhr.setRequestHeader("Connection", "close");
	//xhr.setRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
	//xhr.setRequestHeader("Cache-Control", "no-cache");
	xhr.setRequestHeader("X_USERAGENT", "WebiaXHR");
	xhr.send(data);
}


function getMouseX(e) {
	if (e.pageX) return e.pageX;
	else if (e.clientX) return e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
}
	
function getMouseY(e) {
	if (e.pageY) return e.pageY;
	else if (e.clientY) return e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
}

function getX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
		}
	}
	return curleft;
}
function getY(obj) {
	var curtop = 0;
	if (obj.offsetParent) {
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curtop += obj.offsetTop;
		}
	}
	return curtop;
}

function getStyle(obj, property) {
	if (obj.currentStyle) {
		return obj.currentStyle[property]; //IE
	}
	else if (window.getComputedStyle) {
		//document.defaultView.getComputedStyle(obj,null).getPropertyValue(property);
		var styles = document.defaultView.getComputedStyle(obj,null);
		if (styles) return styles[property];
	}
}

//belangrijk voor de functies met classnames:
//in het geval van meerdere classnames zullen deze gescheiden moeten zijn door een enkele spatie

function hasClassName(elm, name) {
	var classname = ' '+elm.className+' ';
	if (classname.indexOf(' '+name+' ') == -1) {
		return false;
	}
	return true;
}

function addClassName(elm, name) {
	if (elm.className) {
		if (!hasClassName(elm, name)) {
			elm.className += ' '+name;
		}
	}
	else elm.className = name;
}

function removeClassName(elm, name) {
	if (elm.className) {
		var names = elm.className.split(' '); //split de namen op spatie
		var newnames = [];
		var i = names.length;
		while (i--) {
			if (names[i] != name) newnames.push(names[i]);
		}
		elm.className = newnames.join(' ');
	}
}


//geef alle elementen die voldoen aan opgegeven classnaam onder obj
//name: mag bestaan uit meerdere namen gescheiden door spaties
//obj: node waaronder gezocht wordt
function getElementsByClass(name, obj) {
	if (obj==null) obj = document;
	//wanneer native ondersteunt
	if (obj.getElementsByClassName) {
		return obj.getElementsByClassName(name);
	}
	else {
		var classelems = []; //de return array
		var e; //e element uit alle geselecteerde elements
		var classname = '';
		var names = name.split(' '); //split de namen op spatie
		var k = names.length;
		var elems = (obj.all) ? obj.all : obj.getElementsByTagName('*');
		var l = elems.length;
		var hasnames = true;
		for (var i = 0; i < l; i++) {
			//neem volgend element
			e = elems[i];
			classname = ' '+e.className+' ';
			//kijk of een naam niet voorkomt, want het heeft dan geen zin om verder te kijken
			j = k;
			while (j--) {
				if (classname.indexOf(' '+names[j]+' ') == -1) {
					//er komt een naam niet voor
					hasnames = false;
					break;
				}
			}
			//voeg toe als alle namen voorkomen
			if (hasnames) classelems.push(e);
			else hasnames = true;
		}
		return classelems;
	}
}




//set hoogte element rekening houdend met padding en borders (die zijn dus inclusief)
function setHeight(obj, height) {
	height -= parseInt(getStyle(obj, 'paddingTop'));
	height -= parseInt(getStyle(obj, 'paddingBottom'));
	if (getStyle(obj, 'borderTopStyle') != 'none') height -= parseInt(getStyle(obj, 'borderTopWidth'));
	if (getStyle(obj, 'borderBottomStyle') != 'none') height -= parseInt(getStyle(obj, 'borderBottomWidth'));
	obj.style.height = height + 'px';
}

//set breedte element rekening houdend met padding en borders (die zijn dus inclusief)
function setWidth(obj, width) {
	width -= parseInt(getStyle(obj, 'paddingLeft'));
	width -= parseInt(getStyle(obj, 'paddingRight'));
	if (getStyle(obj, 'borderLeftStyle') != 'none') width -= parseInt(getStyle(obj, 'borderLeftWidth'));
	if (getStyle(obj, 'borderRightStyle') != 'none') width -= parseInt(getStyle(obj, 'borderRightWidth'));
	obj.style.width = width + 'px';
}


function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

//breedte van window
function getViewPortWidth(w) {
	var vpw;
	if (typeof w.innerWidth != 'undefined') vpw = w.innerWidth;
	else if (typeof w.document.documentElement != 'undefined' && typeof w.document.documentElement.clientWidth != 'undefined' && w.document.documentElement.clientWidth != 0) {
		vpw = w.document.documentElement.clientWidth;
	}
	else vpw = w.document.getElementsByTagName('body')[0].clientWidth;
	return vpw;
}

//hoogte van window
function getViewPortHeight(w) {
	var vph;
	if (typeof w.innerHeight != 'undefined') vph = w.innerHeight;
	else if (typeof w.document.documentElement != 'undefined' && typeof w.document.documentElement.clientHeight != 'undefined' && w.document.documentElement.clientHeight != 0) {
		vph = w.document.documentElement.clientHeight;
	}
	else vph = w.document.getElementsByTagName('body')[0].clientHeight;
	return vph;
}

function getPrevNode(node) {
	var prev = node.previousSibling;
	while (prev && prev.nodeType != 1) prev = prev.previousSibling;
	return prev;
}

function getNextNode(node) {
	var next = node.nextSibling;
	while (next && next.nodeType != 1) next = next.nextSibling;
	return next;
}

/******************************************************************************* 
Eenvoudige eventhandler
*******************************************************************************/
//voor bestaande standaard events
function addEvent(o, t, f) {
	if (o.addEventListener) o.addEventListener(t,  f, false);
	else if (o.attachEvent) o.attachEvent('on'+t,  f);
}

function removeEvent(o, t, f) {
	if (o.removeEventListener) o.removeEventListener(t,  f, false);
	else if (o.detachEvent) o.detachEvent('on'+t,  f);
}

//voor eigen events
var evt = {
	events: [],
	
	subscribe: function(id, callback, scope) {
		if (!this.events[id]) this.events[id] = [];
		this.events[id].push({callback:callback, scope:scope});
	},
	
	unsubscribe: function(id, callback) {
		var e;
		if (e = this.events[id]) {
			for (var i = 0; i < e.length; i++) {
				if (e[i].callback == callback) e.splice(i,1);
			}
		}
	},
	
	fire: function(id) {
		var e;
		if (e = this.events[id]) {
			var args = Array.prototype.slice.apply(arguments, [1]);
			for (var i = 0; i < e.length; i++) {
				e[i].callback.apply(e[i].scope || window, args);
			}
		}
	}
};
/******************************************************************************* 
URL handler
*******************************************************************************/

var searchquery = {
	searcharray: [],
	
	load: function() {
		var search = window.location.search;
		if (search.length > 1) {
			search = search.substring(1, search.length);
			//search = decodeURIComponent(search);
			this.searcharray = search.split('&');
		}
	},
	
	add: function(key, value) {
		var found = false;
		for (var i = 0; i < this.searcharray.length; i++) {
			if (this.searcharray[i].split("=")[0] == key) {
				this.searcharray[i] = key + '=' + value;
				found = true;
				break;
			}
		}
		if (!found) {
			this.searcharray[this.searcharray.length] = key + '=' + value;
		}
	},
	
	rebuild: function() {
		var href = window.location.href.split('?')[0];
		return href + '?' + this.searcharray.join('&');
	}
}

String.prototype.trim = function() { return (this.replace(/^[\s\xA0]+/, "").replace(/[\s\xA0]+$/, "")); };
String.prototype.startsWith = function(str) { return this.indexOf(t) == 0 ? true : false };
String.prototype.endsWith = function(str) { return (this.match(str+"$")==str); };
String.prototype.contains = function(t) { return this.indexOf(t) >= 0 ? true : false };
