/**
* Copyright:	Graphic Form & Function Automation
* Project:		Proprietorial
* Module:		Basic clientside JavaScript library
* Versie:		4.3.0
* Datum:		070908
*
*/


/*
* CLIENT; PLATFORM DETECTIE
* string Utils.client.getAppPlatform()
*/

function getAppPlatform() {
	if (this.UAstring.search(new RegExp("Win")) != -1) {
		this.platform = "Windows";
	}
	if (this.UAstring.search(new RegExp("Mac")) != -1) {
		this.platform = "MacOS";
	}
	if (this.UAstring.search(new RegExp("Linux")) != -1) {
		this.platform = "Linux";
	}
	if (this.UAstring.search(new RegExp("SunOS")) != -1) {
		this.platform = "SunOS";
	}

	return this.platform;
}

/*
* CLIENT; ENGINE DETECTIE
* string Utils.client.getAppFamily()
*/

function getAppFamily() {
	if (this.UAstring.search(new RegExp("Mozilla")) != -1) {
		this.browserFamily = "Mozilla";
	}
	if (this.UAstring.search(new RegExp("Gecko")) != -1) {
		this.browserFamily = "Gecko";
	}

	return this.browserFamily;
}

/*
* CLIENT; BROWSER DETECTIE
* string Utils.client.getAppName()
*/

function getAppName() {
	if (this.UAstring.search(new RegExp("MSIE")) != -1) {
		this.browserName = "MSIE";
	}
	if (this.UAstring.search(new RegExp("Netscape")) != -1) {
		this.browserName = "Netscape";
	}
	if (this.UAstring.search(new RegExp("Firefox")) != -1) {
		this.browserName = "Firefox";
	}
	if (this.UAstring.search(new RegExp("Opera")) != -1) {
		this.browserName = "Opera";
	}
	if (this.UAstring.search(new RegExp("Safari")) != -1) {
		this.browserName = "Safari";
	}

	return this.browserName;
}

/*
* CLIENT; VERSIE DETECTIE
* float Utils.client.getAppVersion()
*/

function getAppVersion() {
	var re = null;
	switch (this.browserName) {
		case "Netscape" :
			re = new RegExp("Netscape\\/(\\d\\.\\d+?\.?\d?)");
		break;
		case "Firefox" :
			re = new RegExp("Firefox\\/(\\d\\.\\d+?\.?\d?)");
		break;
		case "MSIE" :
			re = new RegExp("MSIE (\\d\\.\\d+)");
		break;
		case "Opera" :
			re = new RegExp("Opera[\\/ ](\\d\\.\\d+)");
		break;
		case "Safari" :
			re = new RegExp("Safari\\/(\\d+\\.?\\d?)");
		break;
	}
	if (re) {
	    re.exec(this.UAstring);
	    this.version = (isNaN(parseFloat(RegExp.$1))) ? 0 : parseFloat(RegExp.$1);
	}

	return this.version;
}


/*
* ARRAY; SORTEER TWEEDIMENSIONELE ARRAYS
* object::array Utils.array.mdSort(object::array a, int i [, string d])
* parameters -a: geïndexeerde array, met subarrays als inhoud
*            -i: index van de subarray waarop gesorteerd wordt
*            -d: '+' oplopend sorteren (optioneel; standaard oplopend)
*                '-' aflopend sorteren (optioneel)
*/

function mdArrSort(ao, sai, ad) {
	var temp, i, zoekindex, startx;
	var retourneerArr = new Array(0);
	var sorteerArr = new Array(0);

	if (ao[0][sai]) {
	    for (i = 0; i < ao.length; i++) {
		    sorteerArr[i] = ao[i][sai] + "_" + i;
	    }
	    switch (ad) {
	        case "-" :
        	    sorteerArr.sort();
    	        sorteerArr.reverse();
	        break;
	        default :
        	    sorteerArr.sort();
	        break;
	    }
	    for (i = 0; i < sorteerArr.length; i++) {
		    temp = sorteerArr[i];
		    startx = temp.lastIndexOf("_") + 1;
		    zoekindex = parseInt(temp.substring(startx, temp.length));
		    retourneerArr[i] = ao[zoekindex];
	    }
	} else {
	    retourneerArr = ao;
	}

	return retourneerArr;
}

/*
* ARRAY; VIND AANWEZIGHEID VAN WAARDE
* int Utils.array.containsValue(object::array a, string s)
* parameters -a: geïndexeerde array
*            -s: zoek-string
*/

function containsValue(arr, val) {
    var index = 0;
    var returnVal = -1;
    var boolFound = false;

    while (index < arr.length && !boolFound) {
        if (arr[index] == val) {
            returnVal = index;
            boolFound = true;
        }
        index++;
    }

    return returnVal;
}

/*
* ARRAY; VERSCHUIF ELEMENT IN ARRAY
* object::array Utils.array.indexOrder(object::array a, int o, int n)
* parameters -a: geïndexeerde array
*            -o: oorspronkelijke index
*            -n: nieuwe index
*/

function arrIndexOrder(arr, oi, ni) {
	var indexN, indexO, temparr;

	indexO = 0;
	indexN = 0;
	temparr = new Array(0);
	if (oi >= 0 && ni >= 0) {
	    if (ni >= arr.length) {
    	    temparr[arr.length - 1] = arr[oi];
	    } else if (oi >= arr.length) {
    	    temparr[ni] = arr[arr.length - 1];
	    } else {
    	    temparr[ni] = arr[oi];
    	}
	    while (indexO < arr.length) {
		    if (indexO == oi) {
			    indexO++;
		    }
		    if (indexN == ni) {
			    indexN++;
		    }
		    if (arr[indexO] && indexN < arr.length) {
    		    temparr[indexN] = arr[indexO];
    	    }
		    indexN++;
		    indexO++;
	    }
	} else {
	    temparr = arr;
	}

	return temparr;
}

/*
* ARRAY; VERWIJDER ELEMENT UIT ARRAY OP BASIS VAN INDEX
* object::array Utils.array.deleteIndex(object::array a, int i)
* parameters -a: geïndexeerde array
*            -i: te verwijderen index
*/

function verwijderArrIndex(arr, vi) {
	var temparr = new Array(0);

	for (var i = 0; i < arr.length; i++) {
		if (i != vi) {
			temparr[temparr.length] = arr[i];
		}
	}

	return temparr;
}

/*
* ARRAY; VERWIJDER ELEMENT UIT ARRAY OP BASIS VAN WAARDE
* object::array Utils.array.deleteValue(object::array a, string w)
* parameters -a: geïndexeerde array
*            -w: te verwijderen waarde
*/

function verwijderArrWaarde(arr, w) {
	var temparr = new Array(0);

	for (var i = 0; i < arr.length; i++) {
		if (arr[i] != w) {
			temparr[temparr.length] = arr[i];
		}
	}

	return temparr;
}


/*
* TEXT; CONVERTEER NAAR BEGINKAPITAAL
* string Utils.text.capitalize(string i [, bool s])
* parameters -i: invoer-string
*            -s: 'true' maakt alleen beginkapitaal; negeert overige letters (optioneel)
*                'false' maakt beginkapitaal en alle overige letters onderkast (optioneel)
*/

function beginKap(s, b) {
	if (s) {
		if (!b) {
			s = s.toLowerCase();
			s = (s.substr(0, 1)).toUpperCase() +  s.substr(1, s.length - 1);
		} else {
			s = s.charAt(0).toUpperCase() + s.substr(1, s.length - 1);
		}
		return s;
	} else {
		return "";
	}
}

/**
* TEXT; CONVERTEER LETTERTEKENS NAAR HEXADECIMALE STRING-WAARDEN
* string Utils.text.toHexStr(string i);
*/

function toHexStr(txt) {
	var hexStr = "";

	for (var i = 0; i < txt.length; i++) {
		hexStr += (txt.charCodeAt(i) << 1).toString(16);
	}

	return hexStr;
}

/**
* TEXT; CONVERTEER HEXADECIMALE STRING-WAARDEN NAAR LETTERTEKENS
* string Utils.text.fromHexStr(string i);
*/

function fromHexStr(txt) {
	var chars = "";

	for (var i = 0; i < txt.length; i += 2) {
		chars += String.fromCharCode(parseInt("0X" + txt.substr(i, 2)) >> 1)
	}

	return chars;
}

/**
* TEXT; CODEER TEKST
* string Utils.text.encrypt(string i);
*/

function encrypt(txt) {
	var windex;
	var aantal = txt.length;
	var hexchars = new Array();
	var chaos = new Array();
	var control = new Array();

	for (var i = 0; i < aantal; i++) {
		hexchars[i] = (this.toHexStr(i.toString()) + this.toHexStr(txt.charAt(i))).toUpperCase();
		control[i] = false;
	}
	for (var i = 0; i < aantal; i++) {
		var volgende = true;
		while (volgende) {
			windex = Math.floor(Math.random() * aantal);
			if (!control[windex]) {
				chaos[i] = hexchars[windex];
				control[windex] = true;
				volgende = false;
			}
		}
	}

	return chaos.join("");
}

/**
* TEXT; DECODEER VERSLEUTELDE TEKST
* string Utils.text.decrypt(string i);
*/

function decrypt(txt) {
	var chars = new Array();

	for (var i = 0; i < txt.length; i += 4) {
		chars[parseInt(txt.substr(i, 2), 16)] = this.fromHexStr(txt.substr(i + 2, 2));
	}

	return chars.join("");
}

/**
* TEXT; VERVANG DECIMAALTEKEN PUNT DOOR KOMMA OF OMGEKEERD
* string Utils.text.dot2comma(string i [, string s]);
* parameters -i: invoer-string
*            -s: weer te geven decimaalteken (optioneel; standaard ",")
*/

function pK(waarde, decimaalteken) {
	var zoekteken, vervangteken;

	waarde = waarde.toString();
	switch (decimaalteken) {
	    case "." :
    	    zoekteken = ",";
    	    vervangteken = ".";
	    break;
	    default :
    	    zoekteken = ".";
    	    vervangteken = ",";
	    break;
	}
	waarde = waarde.replace(zoekteken, vervangteken);

	return waarde;
}

/**
* TEXT; ROND GETAL AF, MET X CIJFERS ACHTER HET DECIMAALTEKEN
* string Utils.text.roundCommaValue(number i [, int n]);
* parameters -i: invoer (ongeacht decimaalteken)
*            -n: aantal decimaaltekens (optioneel; standaard 2)
*/

function pKp(w, s) {
	var dto, di, prefix, postfix;
	var dti = ".";

	w = String(w);
	s = (s) ? s : 2;
	f = Math.pow(10, s);
	dto = (w.lastIndexOf(",") != -1) ? "," : ".";
	w = String(Math.round((parseFloat(this.dot2comma(w, dti))) * f) / f);
	di = (w.indexOf(".") == -1) ? w.length : w.indexOf(".");
	prefix = w.substring(0, di) + dti;
	postfix = w.substring(di + 1, w.length);
	while (postfix.length < s) {
		postfix += "0";
	}
	w = prefix + postfix;

	return this.dot2comma(w, dto);
}

/**
* TEXT; DRUK DATUM AF VOLGENS PATROON
* string Utils.text.printDate([object::date d] [, string p]);
* parameters -d: datumobject (optioneel; standaard huidige datum)
*            -p: afdrukpatroon (optioneel; standaard uitvoer 'd-m-yy')
*/

function printDate() {
	var dobj, patroon;
	var datum, maand, jaar, dag, uren, minuten, seconden;
	var temp, temparr;
	var retourwaarde = "";
	var maanden = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	var dagen = new Array("sun", "mon", "tue", "wen", "thu", "fri", "sat");

	dobj = new Date();
	patroon = "%d-%m-%y";
	if (arguments.length > 0) {
		for (var i = 0; i < arguments.length; i++) {
			if (typeof(arguments[i]) == "object" && arguments[i].constructor == Date) {
				dobj = arguments[i];
			}
			if (typeof(arguments[i]) == "string") {
				patroon = arguments[i];
			}
		}
	}
	datum = dobj.getDate();
	maand = dobj.getMonth();
	jaar = dobj.getFullYear();
	dag = dobj.getDay();
	uren = dobj.getHours();
	minuten = dobj.getMinutes();
	seconden = dobj.getSeconds();
	jaar = jaar.toString();
	uren = uren.toString();
	minuten = minuten.toString();
	seconden = seconden.toString();
	temparr = patroon.split("%");
	for (var i = 0; i < temparr.length; i++) {
		temp = (temparr[i].length > 1) ? temparr[i].substring(1, temparr[i].length): "";
		switch (temparr[i].substring(0, 1)) {
			case "a" :
				retourwaarde += dagen[dag].substring(0, 2);
			break;
			case "b" :
				retourwaarde += maanden[maand].substring(0, 3);
			break;
			case "D" :
				datum = datum.toString();
				if (datum.length == 1) {
					datum = "0" + datum;
				}
				retourwaarde += datum;
			break;
			case "d" :
				retourwaarde += datum;
			break;
			case "k" :
				retourwaarde += uren;
			break;
			case "m" :
				retourwaarde += (maand + 1).toString();
			break;
			case "T" :
				maand = (maand + 1).toString();
				if (maand.length == 1) {
					maand = "0" + maand;
				}
				retourwaarde += maand;
			break;
			case "y" :
				retourwaarde += jaar.substring(2, 4);
			break;
			case "A" :
				retourwaarde += dagen[dag] + "dag";
			break;
			case "B" :
				retourwaarde += maanden[maand];
			break;
			case "H" :
				if (uren.length == 1) {
					uren = "0" + uren;
				}
				retourwaarde += uren;
			break;
			case "M" :
				if (minuten.length == 1) {
					minuten = "0" + minuten;
				}
				retourwaarde += minuten;
			break;
			case "S" :
				if (seconden.length == 1) {
					seconden = "0" + seconden;
				}
				retourwaarde += seconden;
			break;
			case "Y" :
				retourwaarde += jaar;
			break;
		}
		retourwaarde += temp;
	}

	return retourwaarde;
}

/**
* TEXT; ZOEK EN VERVANG KARAKTER-ENTITEITEN
* string Utils.text.entities(string i [, bool t])
* parameters -i: tekstinvoer
*            -t: 'true' converteert ook typografische tekens (optioneel)
*                'false' converteert typografische tekens niet (optioneel; standaard 'false')
*/

function Unicode(k, ud, ux) {
	this.k = (k) ? k : "";
	this.ud = (ud) ? ud : "";
	this.ux = (ux) ? ux : "";
	this.e = "&#160;";
	this.un = "&#160;";
}

function initEntities(boolTypo) {
	for (var i = 160;  i <= 255; i++) {
		this.entitiesStock[this.entitiesStock.length] = new Unicode(String.fromCharCode(i), "&#" + i + ";");
	}
	this.entitiesStock[this.entitiesStock.length] = new Unicode("\\\€", "&#8364;");
	if (boolTypo) {
	    with (this) {
	        entitiesStock[entitiesStock.length] = new Unicode(" -- ", " &#8211; ");
	        entitiesStock[entitiesStock.length] = new Unicode(" '", " &#8216;");
	        entitiesStock[entitiesStock.length] = new Unicode("' ", "&#8217; ");
	        entitiesStock[entitiesStock.length] = new Unicode("',", "&#8217;,");
	        entitiesStock[entitiesStock.length] = new Unicode("'\\\.", "&#8217;.");
	        entitiesStock[entitiesStock.length] = new Unicode("'\\\!", "&#8217;!");
	        entitiesStock[entitiesStock.length] = new Unicode("'\\\?", "&#8217;?");
	        entitiesStock[entitiesStock.length] = new Unicode(" \\\‘", " &#8216;");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\’ ", "&#8217; ");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\’,", "&#8217;,");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\’\\\.", "&#8217;.")
	        entitiesStock[entitiesStock.length] = new Unicode("'s", "&#8217;s");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\’s", "&#8217;s");
	        entitiesStock[entitiesStock.length] = new Unicode(" \\\"", " &#8220;");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\" ", "&#8221; ");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\",", "&#8221;,");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\"\\\.", "&#8221;.");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\"\\\!", "&#8221;!");
	        entitiesStock[entitiesStock.length] = new Unicode("\\\"\\\?", "&#8221;?");
	    }
	}
	this.entitiesInitiated = true;
}

function zenv(s, boolTypo) {
	if (!this.entitiesInitiated) {
		this.entitiesInit(boolTypo ? boolTypo : false);
	}
	s = s.replace(new RegExp("&", "g"), "&#38;");
	s = s.replace(new RegExp("<", "g"), "&#60;");
	s = s.replace(new RegExp(">", "g"), "&#62;");
	for (var i = 0; i < this.entitiesStock.length; i++) {
		s = s.replace(new RegExp(this.entitiesStock[i].k, "g"), this.entitiesStock[i].ud);
	}
	s = s.replace(new RegExp("&#38;#", "g"), "&#");
	return s;
}


/**
* TEXT; CONTROLEER GELDIGHEID FORMULIERVAK
* bool Utils.text.checkFormField(string i, string l);
* parameters -i: tekstinvoer
*            -l: 'email' controleert op geldig e-mail-adres
*                'zipcode' controleert op geldige postcode
*                'phone' controleert op geldig telefoonnummer
*/

function controleerFormVeld(ffv, lbl) {
	var patroon;
	switch (lbl) {
		case "email" :
			patroon = new RegExp("^[a-z0-9._\-]+[@][a-z0-9.\-]+$", "i");
		break;
		case "zipcode" :
			patroon = new RegExp("^[1-9][0-9]{3} ?[a-z]{2}$", "i");
		break;
		case "phone" :
			patroon = new RegExp("^[\+]?[0-9]+$");
		break;
	}
	if (patroon.test(ffv)) {
		return true;
	} else {
		return false;
	}
}


/**
* COOKIES; PLAATSEN
* void Utils.cookie.addValue(string k, string v [, string e [, string p]]);
* parameters -k: sleutelwoord
*            -v: waarde
*            -e: vervaldatum (optioneel; standaard einde sessie)
*            -p: padnaam (optioneel; standaard huidige map)
*/

function zetKoekje(sleutel, waarde, afloop, pad) {
	if (pad) {
		pad = ";path=" + pad;
	} else {
		pad = "";
	}
	if (afloop) {
		document.cookie = sleutel + "=" + escape(waarde) + pad + ";expires=" + afloop;
	} else {
		document.cookie = sleutel + "=" + escape(waarde) + pad;
	}
}

/**
* COOKIES; SUBCOOKIE PLAATSEN
* void Utils.cookie.addSubValue(string k, string s, string v [, string e]);
* parameters -k: sleutelwoord
*            -s: secundair sleutelwoord
*            -v: waarde
*            -e: vervaldatum (optioneel; standaard einde sessie)
*/

function zetSubKoekje(sleutel, subsleutel, waarde, afloop) {
	var temparr;
	var overschreven = false;
	if (this.getValue(sleutel)) {
		temparr = (this.getValue(sleutel)).split("&");
		for (var i = 0; i < temparr.length; i++) {
			if (temparr[i].indexOf(subsleutel) != -1) {
				temparr[i] = subsleutel + "=" + waarde;
				overschreven = true;
			}
		}
		if (!overschreven) {
			temparr[temparr.length] = subsleutel + "=" + waarde;
		}
		waarde = temparr.join("&");
	} else {
		waarde = subsleutel + "=" + waarde;
	}
	if (afloop) {
		this.addValue(sleutel, waarde, afloop);
	} else {
		this.addValue(sleutel, waarde);
	}
}

/**
* COOKIES; LEZEN
* string Utils.cookie.getValue(string k [, string s])
* parameters -k: sleutelwoord
*            -s: secundair sleutelwoord (optioneel)
*/

function zoekKoekje(sleutel, subsleutel) {
	var zoek, koekje, index1, index2;
	var waarde = "";
	zoek = sleutel + "=";
	if (document.cookie.length > 0) {
		koekje = document.cookie;
		index1 = koekje.indexOf(zoek);
		if (index1 != -1) {
			index1 += zoek.length;
			index2 = koekje.indexOf(";", index1);
			if (index2 == -1) {
				index2 = koekje.length;
			}
			waarde = koekje.substring(index1, index2);
			waarde = waarde.replace("+", " ");
			waarde = unescape(waarde);
			if (subsleutel) {
				zoek = subsleutel + "=";
				index1 = waarde.indexOf(zoek);
				if (index1 != -1) {
					index1 += zoek.length;
					index2 = waarde.indexOf("&", index1);
					if (index2 == -1) {
						index2 = waarde.length;
					}
					waarde = waarde.substring(index1, index2);
				}
			}
		}
	}
	return waarde;
}

/**
* COOKIES; VERWIJDEREN
* bool Utils.cookie.erase(string k [, string s [, string p]]);
* parameters -k: sleutelwoord
*            -s: secundair sleutelwoord (optioneel)
*            -p: padnaam (optioneel; standaard huidige map)
*/

function verwijderKoekje(sleutel, subsleutel, pad) {
	var temparr, afloop;
	var tempstr = "";
	var waarde = zoekKoekje(sleutel);
	var verloop = new Date();
	pad = pad ? pad : "";
	if (waarde != false) {
		if (subsleutel) {
			temparr = waarde.split("&");
			for (var i = 0; i < temparr.length; i++) {
				if (temparr[i].indexOf(subsleutel) == -1) {
					tempstr += temparr[i] + "&";
				}
			}
			tempstr = tempstr.substr(0, tempstr.length - 1);
			if (afloop) {
				this.addValue(sleutel, tempstr, afloop, pad);
			} else {
				this.addValue(sleutel, tempstr, "", pad);
			}
		} else {
			verloop.setTime(verloop.getTime() - 1000);
			this.addValue(sleutel, "", verloop.toGMTString(), pad);
		}
		return true;
	} else {
		return false;
	}
}

/**
* COOKIES; TEST ACCEPTATIE
* bool Utils.cookie.access();
*/

function testKoekje() {
	this.addValue("testkoekje", "OK");
	if (this.getValue("testkoekje") == "OK") {
    	this.erase("testkoekje");
		return true;
	} else {
		return false;
	}
}


/**
* DOM; CONVERTEER XML-STRING NAAR XML-DOM
* object::xmldom Utils.dom.parseXMLstr(string x);
* parameters -x: XML-string
*/

function parseXMLstr(strXml) {
	var objParser;
	
	if (this.client.isMSIECompatible) {
	    this.XMLdom = new ActiveXObject("Microsoft.XMLDOM");
	    this.XMLdom.async = false;
	    this.XMLdom.loadXML(strXml);
        if (this.XMLdom.parseError.errorCode == 0) {
            this.documentElement = this.XMLdom.documentElement;
        } else {
            this.parseError = this.XMLdom.parseError.reason;
        }
	}

	if (this.client.isGeckoCompatible) {
	    objParser = new DOMParser();
	    this.XMLdom = objParser.parseFromString(strXml, "text/xml");
        if (this.XMLdom.documentElement.nodeName != "parsererror") {
            this.documentElement = this.XMLdom.documentElement;
        } else {
            this.parseError = this.XMLdom.documentElement.firstChild.nodeValue;
        }
	}
	
	if (this.XMLdom && !this.parseError) {
    	return this.XMLdom;
    } else {
        return null;
    }
}

/**
* DOM; XML NODE OMZETTEN NAAR STRING
* string Utils.dom.serializeToString(object::xmlnode n);
*/

function nodeObj2String(objNode) {
    var strReturnValue = "";
    var objTarget;
    var objSerializer;

    if (objNode) {
        objTarget = objNode;
    } else {
        objTarget = this.documentElement;
    }
    if (this.client.isMSIECompatible) {
        strReturnValue = objTarget.xml;
    }
    if (this.client.isGeckoCompatible) {
        objSerializer = new XMLSerializer();
        strReturnValue = objSerializer.serializeToString(objTarget);
    }

    return strReturnValue;
}

/**
* DOM; SYNCHROON OPENEN VAN XML-BESTAND DOOR DOM
* object::xmldom Utils.dom.openS(string u);
* parameters -u: URL van te laden XML-bestand
*/

function openXMLsyn(strUrl) {
	
	if (this.client.isMSIECompatible) {
	    this.XMLdom = new ActiveXObject("Microsoft.XMLDOM");
	    this.XMLdom.async = false;
	    this.XMLdom.load(strUrl);
        if (this.XMLdom.parseError.errorCode == 0) {
            this.documentElement = this.XMLdom.documentElement;
        } else {
            this.parseError = this.XMLdom.parseError.reason;
        }
	}

	if (this.client.isGeckoCompatible) {
	    this.XMLdom = document.implementation.createDocument("", "", null);
	    this.XMLdom.async = false;
	    this.XMLdom.load(strUrl);
        if (this.XMLdom.documentElement.nodeName != "parsererror") {
            this.documentElement = this.XMLdom.documentElement;
        } else {
            this.parseError = this.XMLdom.documentElement.firstChild.nodeValue;
        }
	}
	
	if (!this.parseError && this.XMLdom) {
    	return this.XMLdom;
    } else {
        return null;
    }
}

/**
* DOM; ASYNCHROON OPENEN VAN XML-BESTAND DOOR HTTP
* void Utils.dom.openA(string u, object::function f);
* parameters -u: URL van te laden XML-bestand
*            -f: functie voor afhandeling laadproces
*/

function openXMLasyn(strUrl, _function) {
	if (this.client.isMSIECompatible) {
    	this.XMLhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (this.client.isGeckoCompatible || (this.client.isMSIECompatible && this.client.version >= 7)) {
    	this.XMLhttp = new XMLHttpRequest();
	}
	if (this.XMLhttp) {
        this.XMLhttp.onreadystatechange = _function;
        this.XMLhttp.open("GET", strUrl, true);
        this.XMLhttp.send(null);
	}
}

/**
* DOM; SYNCHROON VERSTUREN VAN XML-STRING DOOR HTTP
* object::xmldom Utils.dom.sendS(string u, string x);
* parameters -u: URL bestemming
*            -x: te verzenden XML-string
*/

function sendXMLsyn(strUrl, strXml) {
	var objReturnVal = null;

	if (this.client.isMSIECompatible && this.client.version < 7) {
    	this.XMLhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (this.client.isGeckoCompatible || (this.client.isMSIECompatible && this.client.version >= 7)) {
    	this.XMLhttp = new XMLHttpRequest();
	}
	if (this.XMLhttp) {
        if (this.parseXMLstr(strXml)) {
            this.XMLhttp.open("POST", strUrl, false);
            this.XMLhttp.send(this.XMLdom);
            //!!! eerst cross-browser 'parseError' controleren !!!
            if (this.XMLhttp.status == 200 && this.XMLhttp.responseXML) {
                this.documentElement = this.XMLhttp.responseXML.documentElement;
                objReturnVal = this.XMLhttp.responseXML;
            }
        }
	}
	
	return objReturnVal;
}

/**
* DOM; ASYNCHROON VERSTUREN VAN XML-STRING DOOR HTTP
* bool Utils.dom.sendA(string u, string x, object::function f);
* parameters -u: URL bestemming
*            -x: te verzenden XML-string
*            -f: functie voor afhandeling respons
*/

function sendXMLasyn(strUrl, strXml, _function) {
	var boolReturnVal = false;

	if (this.client.isMSIECompatible && this.client.version < 7) {
    	this.XMLhttp = new ActiveXObject("Microsoft.XMLHTTP");
	}
	if (this.client.isGeckoCompatible || (this.client.isMSIECompatible && this.client.version >= 7)) {
    	this.XMLhttp = new XMLHttpRequest();
	}
	if (this.XMLhttp) {
        if (this.parseXMLstr(strXml)) {
            this.XMLhttp.open("POST", strUrl, true);
            this.XMLhttp.onreadystatechange = _function;
            this.XMLhttp.send(this.XMLdom);
            boolReturnVal = true;
        }
	}

	return boolReturnVal;
}

/**
* DOM; ASYNCHROON XMLHTTP-PROCES AFRONDEN
* void Utils.dom.finalize();
*/

function finalize() {
    if (this.XMLhttp.readyState == 4) {
        this.busyParsing = false;   //!!! cross-browser foutafhandeling !!!
        if (this.XMLhttp.responseXML) {
            if (this.XMLhttp.responseXML.documentElement) {
                this.documentElement = this.XMLhttp.responseXML.documentElement;
            } else {
                this.parseError = this.XMLhttp.responseText;
            }
        }
    } else {
        this.busyParsing = true;
    }
}

/**
* DOM; VIND EEN NODE-OBJECT OP BASIS VAN EEN ID
* object::xmlnode Utils.dom.getElementById(object::xmlnode n, string i);
* parameters -n: XML-node
*            -i: id
*/

function getElementById(objNode, strId) {
    var strXPathExpression;
    var objTarget;
    var objReturnNode = null;

    if (objNode) {
        objTarget = objNode;
    } else {
        objTarget = this.documentElement;
    }
    strXPathExpression = ".//*[@id = '" + strId + "']";
    if (this.client.isMSIECompatible) {
        objReturnNode = objTarget.selectSingleNode(strXPathExpression);
    }
    if (this.client.isGeckoCompatible) {
        objReturnNode = document.evaluate(strXPathExpression, objTarget, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
        if (objReturnNode) {
            objReturnNode = objReturnNode.singleNodeValue;
        }
    }

    return objReturnNode;
}

/**
* DOM; VIND EEN NODE-WAARDE OP BASIS VAN EEN ID
* string Utils.dom.getNodeValueById(object::xmlnode n, string i);
* parameters -n: XML-node
*            -i: id
*/

function getNodeValueById(objNode, strId) {
    var objTarget;

    if (objNode) {
        objTarget = objNode;
    } else {
        objTarget = this.documentElement;
    }
	objTarget = this.getElementById(objTarget, strId);
	if (objTarget) {
		return objTarget.firstChild.nodeValue;
	} else {
		return "";
	}
}

/**
* DOM; VIND EEN NODE-WAARDE OP BASIS VAN EEN NAAM
* string Utils.dom.getNodeValueByName(object::xmlnode n, string e);
* parameters -n: XML-node
*            -e: elementnaam
*/

function getNodeValueByName(objNode, strNodeName) {
    var objTarget;

    if (objNode) {
        objTarget = objNode.getElementsByTagName(strNodeName)[0];
    } else {
        objTarget = this.documentElement.getElementsByTagName(strNodeName)[0];
    }
    if (objTarget && objTarget.hasChildNodes()) {
        return objTarget.firstChild.nodeValue;
    } else {
        return "";
    }
}

/**
* DOM; VIND EEN NODE-OBJECT OP BASIS VAN EEN XPATH EXPRESSIE
* object::xmlnode Utils.dom.getSingleNode(object::xmlnode n, string p);
* parameters -n: XML-node
*            -p: XPath-expressie
*/

function getSingleNode(objNode, strXPathExpression) {
    var objTarget;
    var objReturnNode = null;

    if (objNode) {
        objTarget = objNode;
    } else {
        objTarget = this.documentElement;
    }
    if (this.client.isMSIECompatible) {
        objReturnNode = objTarget.selectSingleNode(strXPathExpression);
    }
    if (this.client.isGeckoCompatible) {
        objReturnNode = document.evaluate(strXPathExpression, objTarget, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null);
        if (objReturnNode) {
            objReturnNode = objReturnNode.singleNodeValue;
        }
    }

    return objReturnNode;
}

/**
* DOM; STEL EEN NODE-WAARDE IN OP BASIS VAN EEN ID
* bool Utils.dom.setNodeValueById(object::xmlnode n, string i, string v);
* parameters -n: XML-node
*            -i: id
*            -v: waarde
*/

function setNodeValueById(objNode, strId, strNv) {
	var nodeobj = this.getElementById(objNode, strId);
	var boolReturnVal = false;

	if (nodeobj) {
		nodeobj.firstChild.nodeValue = strNv;
		boolReturnVal = true;
	}
	
	return boolReturnVal;
}

/**
* DOM; LEEGMAKEN
* void Utils.dom.purge();
*/

function purge() {
	this.parseError = "";
	this.busyParsing = false;
	this.XMLdom = null;
	this.documentElement = null;
}


// EVENT; INITIEER
function fire(e) {
    if (this.client.isMSIECompatible) {
        this.occurrence = event;
        this.source = this.occurrence.srcElement;
    }
    if (this.client.isGeckoCompatible) {
        this.occurrence = e;
        this.source = this.occurrence.target;
    }
    return this.source;
}

// EVENT; RETOURNEER TOETSENBORDCODE
function toetsenbord(e) {
	if (this.client.isGeckoCompatible) {
		if (e.keyCode) {
    		this.keyPressed = e.keyCode;
		}
		if (e.which) {
    		this.keyPressed = e.which;
		}
		if (e.altKey) {
			this.keyPressed = "alt";
			this.alt = true;
		}
		if (e.shiftKey) {
			this.keyPressed = "shift";
			this.shift = true;
		}
		if (e.ctrlKey) {
			this.keyPressed = "ctrl";
			this.ctrl = true;
		}
	}
	if (this.client.isMSIECompatible) {
		this.keyPressed = window.event.keyCode;
		if (window.event.altKey) {
			this.keyPressed = "alt";
			this.alt = true;
		}
		if (window.event.shiftKey) {
			this.keyPressed = "shift";
			this.shift = true;
		}
		if (window.event.ctrlKey) {
			this.keyPressed = "ctrl";
			this.ctrl = true;
		}
	}
	return this.keyPressed;
}

// EVENT; RESET MODIFIER KEYS
function releaseModifiers() {
    this.alt = false;
    this.shift = false;
    this.ctrl = false;
}

// EVENT; LUISTERAAR
function catchEvent(strEvent, func) {
    if (this.client.isGeckoCompatible) {
        document.addEventListener(strEvent, func, false);
    }
    if (this.client.isMSIECompatible) {
        document.attachEvent("on" + strEvent, func );
    }
}


// INITIEER UTILITIES
function ClientSniffer() {
	this.UAstring = navigator.userAgent;
	this.platform = "";
	this.browserFamily = "";
	this.browserName = "";
	this.version = 0.0;
	this.isMSIECompatible = false;
	this.isGeckoCompatible = false;
	this.getAppFamily = getAppFamily;
	this.getAppVersion = getAppVersion;
	this.getAppName = getAppName;
	this.getAppPlatform = getAppPlatform;
	this.getAppPlatform();
	this.getAppFamily();
	this.getAppName();
	this.getAppVersion();
	if (this.browserName == "MSIE") {
	    this.isMSIECompatible = true;
	}
	if (this.browserFamily == "Gecko") {
	    this.isGeckoCompatible = true;
	}
}

function TextFunctions() {
	this.entitiesInitiated = false;
	this.entitiesStock = new Array(0);
	this.entitiesInit = initEntities;
	this.entities = zenv;
	this.dot2comma = pK;
	this.roundCommaValue = pKp;
	this.toHexStr = toHexStr;
	this.fromHexStr = fromHexStr;
	this.capitalize = beginKap;
	this.encrypt = encrypt;
	this.decrypt = decrypt;
	this.printDate = printDate;
	this.checkFormField = controleerFormVeld;
}

function ArrayFunctions() {
	this.mdSort = mdArrSort;
	this.containsValue = containsValue;
	this.indexOrder = arrIndexOrder;
	this.deleteIndex = verwijderArrIndex;
	this.deleteValue = verwijderArrWaarde;
}

function DOMFunctions(objClient) {
	this.parseError = "";
	this.busyParsing = false;
	this.XMLdom = null;
	this.XMLhttp = null;
	this.documentElement = null;
	this.client = objClient;
	this.parseXMLstr = parseXMLstr;
	this.openS = openXMLsyn;
	this.openA = openXMLasyn;
	this.sendS = sendXMLsyn;
	this.sendA = sendXMLasyn;
	this.finalize = finalize;
	this.getElementById = getElementById;
	this.getNodeValueByName = getNodeValueByName;
	this.getNodeValueById = getNodeValueById;
	this.getSingleNode = getSingleNode;
	this.setNodeValueById = setNodeValueById;
	this.serializeToString = nodeObj2String;
	this.purge = purge;
}

function CookieFunctions() {
	this.addValue = zetKoekje;
	this.addSubValue = zetSubKoekje;
	this.getValue = zoekKoekje;
	this.erase = verwijderKoekje;
	this.access = testKoekje;
}

function EventFunctions(objClient) {
	this.alt = false
	this.shift = false;
	this.ctrl = false;
	this.occurrence = null;
	this.source = null;
	this.client = objClient;
	this.fire = fire;
	this.keyPressed = null;
	this.key = toetsenbord;
	this.release = releaseModifiers;
	this.catchEvent = catchEvent;
}

function initUtils(li, ww) {
	return new Utils();
}

function Utils() {
	this.client = new ClientSniffer();
	this.text = new TextFunctions();
	this.cookie = new CookieFunctions();
	this.array = new ArrayFunctions();
	this.dom = new DOMFunctions(this.client);
	this.event = new EventFunctions(this.client);
}
