/*extern GetPropsAsString,GetInheritedStyleString,HideHiddenDropDowns,ActiveXObject,XSLTProcessor*/

// ==================================================
// General javascript functions
// ==================================================

function LTrim(str) {
	if(!str) {return '';}
	var intSpaceFound = str.indexOf(" ");
	while (intSpaceFound == 0) {
		str = str.substring(1,str.length);
		intSpaceFound = str.indexOf(" ");
	}
	return str;
}

function RTrim(str) {
	if(!str) {return '';}
	var intSpaceFound = str.lastIndexOf(" ");
	while (intSpaceFound > 0 && intSpaceFound == str.length - 1) {
		str = str.substring(0,str.length - 1);
		intSpaceFound = str.lastIndexOf(" ");
	}
	return str;
}

function Trim(str) {
	return RTrim(LTrim(str));
}

function RemoveTabsAndReturns(s) {
	if(!s) {return '';}
	while(s.indexOf('\n')>=0) {s=s.replace('\n','');}
	while(s.indexOf('\t')>=0) {s=s.replace('\t','');}
	return s;
}

function IsElementOfArray(value, array) {
	for (var i = 0; i < array.length; i++) {
		if (array[i] == value) {return true;}
	}
	return false;
}

function AddToArray(value, array) {
	if (!IsElementOfArray(value,array)) {array[array.length]=value;}
	return array;
}

function RemoveFromArray(value, array) {
	var aReturn = [], j = 0;
	for(var i=0;i<array.length;i++) {
		if (array[i]!=value) {aReturn[j++] = array[i];}
	}
	return aReturn;
}

function GetIndexInArray(v, a) {
	for(var i=0;i<a.length;i++) {
		if (a[i]==v) {return i;}
	}
	return -1;
}

function ValidateDropDownDate(day, month, year) {
	//only validate when all 3 dropdowns are filled
	var sDay = day.options[day.selectedIndex].value
	var sMonth = month.options[month.selectedIndex].value
	var sYear = year.options[year.selectedIndex].value;
	if (sDay !== '' && sMonth !== '' && sYear !== '') {
		try {
			var date = new Date(parseInt(sYear,10), parseInt(sMonth,10)-1, parseInt(sDay,10));
			if (date.getDate().toString()!=sDay) {
				alert('dit is een ongeldige datum');
				day.selectedIndex=0;
			}
		} catch(e) {
			alert('dit is een ongeldige datum');
		}
	}
}

function GetShortMonthName(date) {
	return date.toString().split(' ')[1];
}

function LongYear(year) {
	if (year < 100) {return 1900 + year;}
	return year;
}

function OpenNamedWindow(url, width, height, windowname) {
	var features = "toolbar=no,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,width=" + width + ",height=" + height + ",resizable=yes";
	eval(windowname + '=window.open("' + url + '","' + windowname + '","' + features + '");');
}

function OpenNewWindow(url, width, height) {
	var features = "toolbar=no,location=no,directories=no,status=no,menubar=yes,scrollbars=yes,width=" + width + ",height=" + height + ",resizable=yes";
	window.open(url, '', features);
}

function ResetForm(formelement) {
	var formobject = formelement.form;
	for (var i = 0; i < formobject.elements.length; i++) {
		if (formobject.elements[i] == formelement) {
         continue;
      }
		switch (formobject.elements[i].type) {
			case 'text':
			case 'button':
			case 'hidden':
				formobject.elements[i].value = '';
				break;
			case 'checkbox':
				formobject.elements[i].checked = false;
				break;
			case 'select-one':
				formobject.elements[i].selectedIndex = 0;
				if (formobject.elements[i].onchange) {
					formobject.elements[i].onchange();
            }
				break;
		}
	}
}


function IsDate(value) {
	if (!value) {return false;}
	var isDate = false, error = false;
	try {
		value.getYear();
		isDate = true;
	} catch (e) {
		error = true;
		isDate = false;
	}
	if (error) {
		//try to parse it..
	}
	return isDate;
}

function getDateFromDateString(sDateString) {
	sDateString = sDateString.toString();
	try {
		var iYear = parseInt(sDateString.substr(0,4),10);
		var iMonth = parseInt(sDateString.substr(4,2),10) - 1;
		var iDay = parseInt(sDateString.substr(6,2),10);
	} catch (e) {}
	try {
		var dtTemp = new Date(iYear, iMonth, iDay);
	} catch (e) {}
	return dtTemp;
};

function DateAddJS(type, value, date) {
	//works as in VBScript, just support for days now
	switch(type) {
		case 'd':
			return new Date(date.getFullYear(), date.getMonth(), date.getDate() + value);
		case 'w':
			return new Date(date.getFullYear(), date.getMonth(), date.getDate() + (7 * value));
		case 'm':
			return new Date(date.getFullYear(), date.getMonth() + value, date.getDate());
		default:
			alert('function DateAddJS(): type ' + type + ' not (yet) supported');
			return undefined;
	}
}

function DateDiffJS(type, date1, date2) {
	//works as in VBScript, just support for days now
	var dt1, dt2;
	if (!IsDate(date1) || !IsDate(date2)) {
		alert('function DateDiffJS():  error: one of inputs is not a date');
		return undefined;
	}
	switch (type) {
		case 'd':	//days
			dt1 = new Date(date1.getFullYear(), date1.getMonth(), date1.getDate());
			dt2 = new Date(date2.getFullYear(), date2.getMonth(), date2.getDate());
			return parseInt((dt1 - dt2) / (24 * 60 * 60 * 1000), 10);

		case 's': //seconds
			return Math.abs(parseInt((date1 - date2) / 1000, 10));

		case 'ms': //milliseconds
			return Math.abs(parseInt((date1 - date2), 10));

	}
	alert('function DateDiffJS():  function not yet defined for ' + type + '.');
	return undefined;
}

function DateToYYYYMMDD(dt) {
	try {
		return dt.getFullYear().toString() + TwoDigit(dt.getMonth()+1) + TwoDigit(dt.getDate());
	} catch(e) {
		if(IsDate(getDateFromDateString(dt))) {
			return dt;
		}
	}
	return '';
}

function ValidateNr(str, decimalSeperator) {
	var nr = parseFloat(str);
	if(decimalSeperator == '.') {
		if (nr.toString() == str || Trim(str) === '') {return parseFloat(str);}
		return 0;
	}
	if (decimalSeperator == ',') {
		alert('function ValidateNr():  function not yet defined for decimal seperator = ","');
		return undefined;
	}
	return undefined;
}

function Round(number, precision) {
	var powprecision = Math.pow(10, precision);
	var pownumber = number * powprecision;
	pownumber = Math.round(pownumber);
	return pownumber / powprecision;
}

function TwoDigit(value) {
	if (isNaN(value)) {return value;}
	value = parseInt(value,10);
	if (value <= 9 && value >= 0) {return '0' + value;}
	if (value > 9 && value < 100) {return value.toString();}
	return null;
}

// Input is a string, should return (when possible) "hh:mm" valid input is "h", "hh", "h:mm" and "hh:mm" of course max value for hour is 24 and for minute is 59 
function ValidateTimeString(str) {
	var nr, min, splitted, len = str.length;
	switch (len) {
		case 1:
			nr = parseInt(str,10);
			if (isNaN(nr)) {return -1;}
			return TwoDigit(nr) + ':00';

		case 2:
			nr = parseInt(str,10);
			if (isNaN(nr)) {return -1;}
			if (nr > 24) {return -2;}
			if (nr < 0) {return -3;}
			return TwoDigit(nr) + ':00';

		case 3:
			if (nr < 0) {return -4;}
			break;

		case 4:
			splitted = str.split(':');
			if (splitted.length != 2) {return -5;}
			if (splitted[0].length != 1) {return -6;}
			nr = parseInt(splitted[0],10);
			if (isNaN(nr)) {return -1;}
			min = parseInt(splitted[1],10);
			if (isNaN(min)) {return -1;}
			if (min > 59) {return -2;}
			if (min < 0) {return -3;}
			return TwoDigit(nr) + ':' + TwoDigit(min);

		case 5:
			splitted = str.split(':');
			if (splitted.length != 2) {return -5;}
			if (splitted[0].length != 2) {return -6;}
			nr = parseInt(splitted[0],10);
			if (isNaN(nr)) {return -1;}
			if (nr > 24) {return -2;}
			if (nr < 0) {return -3;}
			min = parseInt(splitted[1],10);
			if (isNaN(min)) {return -1;}
			if (min > 59) {return -2;}
			if (min < 0) {return -3;}
			return TwoDigit(nr) + ':' + TwoDigit(min);
	}
	return -10;
}

function SubmitFormOnEnter(formName, ev) {
	if (ev.keyCode == 13) {
		var oForm = document.forms[formName];
		event.returnValue=false;
		event.cancel = true;
		oForm.submit();
	}
}

function deleteFormElementsByName(form, names) {
	var i = 0;
	while (i < form.elements.length) {
		if (names instanceof Array && IsElementOfArray(form.elements[i].name, names)) {
			form.elements[i].parentNode.removeChild(form.elements[i]);
			continue;
		}
		if (form.elements[i].name == names) {
			form.elements[i].parentNode.removeChild(form.elements[i]);
			continue;
		}
		i++;
	}
}

function changeClassNames(classNames, add, remove) {
   if (add) {
      if (!(add instanceof Array)) {
         add = [add];
      }
   }
   else {
      add = [];
   }
   if (remove) {
      if (!(remove instanceof Array)) {
         remove = [remove];
      }
   }
   else {
      remove = [];
   }
   var i;
   classNames = classNames.split(" ");
   for (i = 0; i < add.length; i++) {
      classNames = AddToArray(add[i], classNames);
   }
   for (i = 0; i < remove.length; i++) {
      classNames = RemoveFromArray(remove[i], classNames);
   }
   return classNames.join(" ");
}

// ==================================================
// General DOM-related javascript functions
// ==================================================

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 getAbsoluteXPos(obj) {
	var r = obj.offsetLeft;
	if (obj.offsetParent) {r += getAbsoluteXPos(obj.offsetParent);}
	return r;
}

// In order to work in Mozilla, all offset-divs must have style="position:relative;"
function getAbsoluteYPos(obj, noScrollCompensation) {
	var r = ((noScrollCompensation)? obj.offsetTop: obj.offsetTop - obj.scrollTop);
	if (obj.offsetParent) {r += getAbsoluteYPos(obj.offsetParent, noScrollCompensation);}
	return r;
}

function IsObjectInOther(obj, div) {
	if(obj == document.body || obj == document) {return false;}
	if (obj == div) {return true;}
	return IsObjectInOther(obj.parentNode, div);
}

function GetYPositionInContainer(o, c) {
	var r = o.offsetTop;
	if(o.offsetParent) {
		if (o.offsetParent !== c) {r += GetYPositionInContainer(o.offsetParent, c);}
	} else {
		r = r - getAbsoluteYPos(c, true);
	}
	return r;
}

function ShowProps(oTest, bAdd, sName) {
	var oDragDiv
	var sWriteCode = '';
	if (bAdd) {sWriteCode = '----------------------------\n';}
	if (sName) {sWriteCode += '[name = ' + sName + ']\n';}
	if (oTest) {
		sWriteCode += '[propotype = ' + oTest.prototype + ', typeof = ' + typeof(oTest) + ']\n\n';
		sWriteCode += 'constructor :\n ' + oTest.constructor + '\n\n';
	}

	var oWriteDom = document.getElementById('writedom');
	if (!oWriteDom && document.parent) {oWriteDom = parent.document.getElementById('writedom');}
	if(oWriteDom) {
		switch (oWriteDom.tagName.toUpperCase()) {
			case 'TEXTAREA':
				if (bAdd) {
					sWriteCode += '\n\n';
					sWriteCode += GetPropsAsString(oTest, '=', '\n', true);
					oWriteDom.value += sWriteCode;
				} else {
					sWriteCode += GetPropsAsString(oTest, '=', '\n', true);
					oWriteDom.value = sWriteCode;
				}
				break;
			case 'DIV':
				if(bAdd) {
					sWriteCode += '<br><br>';
					sWriteCode += GetPropsAsString(oTest, '=', '<br>', true);
					oWriteDom.innerHTML += sWriteCode;
				} else {
					sWriteCode += GetPropsAsString(oTest, '=', '<br>', true);
					oWriteDom.innerHTML = sWriteCode;
				}
				break;
		}
		if (oWriteDom.getAttribute('isDragDiv')) {
			var oObj = oWriteDom.parentNode;
			while (oObj != document.body) {
				try {
					oDragDiv = oObj.creator();
					oDragDiv.Show();
				} catch(e) { }
				oObj = oObj.parentNode;
			}
		}
	} else {
		sWriteCode += GetPropsAsString(oTest,'=', '\n', true);
		prompt('properties',sWriteCode);
	}
}

function GetPropsAsString(oTest, sCompare, sSeperator, bShowEmptyProps) {
	var element, i, oTemp, sWriteCode = '', sValue = '', sType, bContinue = true;

	if (!oTest) {
		sWriteCode = 'object is null'+ sSeperator;
		bContinue = false;
	} 
	
	if (bContinue && typeof(oTest.xml) == 'string') {
		// for IE XML-objects
		sWriteCode = 'cant\'t parse XML documents for Internet Explorer' + sSeperator + sSeperator;
		sWriteCode += oTest.xml;
		bContinue = false;
	}

	if (bContinue && typeof(oTest) == 'string') {
		sWriteCode += oTest;
		bContinue = false;
	}

	if (bContinue && typeof(oTest) == 'number') {
		sWriteCode += '[value] = ' + oTest.toString() + sSeperator + sSeperator;
	}


	if(bContinue) {	
		for (element in oTest) {
			oTemp = element;
			try {
				sValue = oTest[oTemp.toString()];
				if (bShowEmptyProps || sValue.length > 0) {sWriteCode += oTemp.toString() + sCompare + sValue + sSeperator;}
			} catch(e) {
				if (oTest.snapshotItem) {
					try {
						sValue = oTest.snapshotItem(oTemp);
						sWriteCode += 'object.snapshotItem(' + oTemp.toString() + ')'+ sCompare + sValue + sSeperator;
						continue;
					 } catch(e) {}
				}
				try {
					sValue = oTemp.getAttribute(oTemp);
					if (bShowEmptyProps || sValue.length > 0) {sWriteCode += oTemp.toString() + sCompare + sValue + sSeperator;}
				} catch (e) {
					sType = typeof(oTemp);
					sWriteCode += 'property of type = ' + sType + ' named "' + oTemp.toString() + '" ' + sSeperator;
					sWriteCode += ' - - - some error here: ' + e.toString() + ' ' + sSeperator;
				}
			}
		}
	}

	if(oTest && (oTest.xmlVersion || oTest.nodeType)) {
		sWriteCode += sSeperator + sSeperator + serializeXML(oTest)  + sSeperator;
	}

	return sWriteCode;
}

function WriteAction(sLine) {
	var oActionDiv = document.getElementById('writedom');

	if(!oActionDiv) {
		alert('WriteAction() - no debug element ' + sLine);
		return;
	}
	
	if (oActionDiv.tagName.toUpperCase() == 'TEXTAREA') {
		oActionDiv.value += '\n' + sLine;
	} else {
		oActionDiv.innerHTML += '<br>' + sLine;
	}
}


function AttachStyleForExcel(oTable, aStyleElements, bIncludeSubclasses) {
	var element, sReturn = '<style>';

	sReturn += 'table{';
	for (element in aStyleElements) {
		sReturn += GetInheritedStyleString(oTable, aStyleElements[element]);
	}
	sReturn += '}\n</style>';
	return sReturn;
}

function GetInheritedStyleString(oObject, sStyleElement) {
	switch (sStyleElement) {
		case 'bgcolor':
		case 'backgroundColor':
		case 'background-color':
			var sValue = oObject.currentStyle.backgroundColor;
			if (oObject.offsetParent && (sValue === '' || sValue === 'transparent')) {
				return GetInheritedStyleString(oObject.offsetParent, sStyleElement);
			}
			if (sValue !== '' && sValue !== 'transparent') {
				return 'background-color:' + sValue + ';';
			}
			break;
	}
	return '';
}

function GetCurrentStyle(oObject) {
	if (!oObject) {return null;}
	if (oObject.currentStyle) { //for IE
		return oObject.currentStyle;
	}
	if (document.defaultView) { //for Gecko engine
		return document.defaultView.getComputedStyle(oObject, '');
	}
	return null;
}

function GetCurrentStyleProperty(oObject, sStyleElement) {
	var oStyle = GetCurrentStyle(oObject);
	var sReturn;
	return oStyle[sStyleElement];
	if (oStyle) {
		try {sReturn = oStyle.getPropertyValue(sStyleElement);}
		catch(e) {sReturn = oStyle[sStyleElement];}
		return sReturn;
	} else {
		return 'no style';
	}
}

function FocusObjectInDiv(sDivName, sElementName) {
	var oNode, oDiv = document.getElementById(sDivName), oAnchors = oDiv.getElementsByTagName('a');
	for (var i = 0; i < oAnchors.length; i++) {
		oNode = oAnchors.item(i);
		if (oNode.name == sElementName) {
			oDiv.getElementsByTagName('a').item(i).scrollIntoView(true);
			this.window.scroll(0, 0);
			return;
		}
	}
}

function addEvent(el, evname, func) {
	if (el.attachEvent) { // IE
		el.attachEvent("on" + evname, func);
	} else {
		if (el.addEventListener) { // Gecko / W3C
			el.addEventListener(evname, func, false);
		} else {
			el["on" + evname] = func;
		}
	}
}

function removeEvent(el, evname, func) {
	if (el.detachEvent) { // IE
		el.detachEvent("on" + evname, func);
	} else {
		if (el.removeEventListener) { // Gecko / W3C
			el.removeEventListener(evname, func, false);
		} else {
			el["on" + evname] = null;
		}
	}
}

function getEventElement(ev) {
	if (window.event) {return window.event.srcElement;}
	if (!ev) {return null;}
	if (ev.srcElement) {return ev.srcElement;}
	if (ev.currentTarget) {return ev.currentTarget;}
	return null;
}

function ReturnCssClassDef(sClassName) {
	if (!document.styleSheets) {return null;}
	var i, j;
	for (i = 0; i < document.styleSheets.length; i++) {
		if (document.styleSheets[i].cssRules) {	
			for (j = 0; j < document.styleSheets[i].cssRules.length; j++) {
				if (document.styleSheets[i].cssRules[j].selectorText == sClassName) {
					return document.styleSheets[i].cssRules[j];
				}
			}
		} else {
			if (document.styleSheets[i].rules) {
				for (j = 0; j < document.styleSheets[i].rules.length; j++) {
					if (document.styleSheets[i].rules[j].selectorText == sClassName) {
						return document.styleSheets[i].rules[j];
					}
				}
			}
		}	
	}
	return null;
}

function AttachClickToDocument(ev) {
	if (window.event) { //first cancelBubble
		window.event.cancelBubble = true;
	}
	var oBody = document.documentElement;
	if (oBody.attachEvent) { // for IE
		oBody.attachEvent("onclick", HideHiddenDropDowns);
	} else {
		if (oBody.addEventListener) { // Gecko / W3C
			oBody.addEventListener("click", HideHiddenDropDowns, true);
		} else {
			oBody.onclick = HideHiddenDropDowns;
		}
   }
}

function RemoveClickFromDocument() {
	var oBody = document.documentElement;
	if (oBody.detachEvent) { // for IE
		oBody.detachEvent("onclick", HideHiddenDropDowns);
	} else {
		if (oBody.removeEventListener) { // Gecko / W3C
			oBody.removeEventListener("click", HideHiddenDropDowns, true);
		} else {
			oBody.onclick = null;
		}
	}
}

function FindContainingElement(element, tagName) {
	tagName = tagName.toUpperCase();
	var parent = element.parentNode;
	while (parent && parent.tagName.toUpperCase() != tagName) {
		parent = parent.parentNode;
	}
	return parent;
}

function FindNextTableRow(currentRow, delta) {
	if (!delta) {delta = 1;}
	var table = FindContainingElement(currentRow, "table");
	if (table) {
		for (var i = 0; i < table.rows.length; i++) {
			if (currentRow == table.rows[i] && i + delta >= 0 && i + delta < table.rows.length) {
				var tr = table.rows[i + delta];
				if (tr && tr.getElementsByTagName("th").length < tr.getElementsByTagName("td").length) {
					return tr;
				}
			}
		}
	}
	return null;
}

function preloadImages(urls, baseUrl) {
	var images = document.preloadedImages;
	if (!(images instanceof Array)) {document.preloadedImages = images = [];}
	if (!baseUrl) {baseUrl = "";}
	for (var i = 0; i < urls.length; i++) {
		var img = new Image();
		img.src = baseUrl + urls[i];
		images[images.length] = src;
	}
}

// ==================================================
// General javascript functions using XML and XSL
// ==================================================

function LoadXMLFile(sURL) {
	var oXML, oRequest;
	try {oXML = new ActiveXObject('Msxml2.DOMDocument');}
	catch(e) {oXML = false;}
	if (oXML) {
		//IE load XML document
		oXML.async = false;
		oXML.load(sURL);
		if(oXML.parseError.errorCode) {
			alert('error: ' + oXML.parseError.description);
			return false;
		}
	}
	if (!oXML) {
		//Mozilla load XML document
		try {oXML = document.implementation.createDocument("", "", null);}
		catch(e) {oXML = false;}
		if(oXML) {
			oXML.async = false;
			try {oXML.load(sURL);}
			catch(e) {oXML = false;}
		}
	}
	if(!oXML) {
		try {
			oRequest = new XMLHttpRequest();
			oRequest.open("GET", sURL, false);
			oRequest.send(null);
			oXML = oRequest.responseXML;
		}
		catch(e) {oXML = false;}
	}
	return oXML;
}

function CreateXMLDoc() {
	var oXML;
	try {oXML = new ActiveXObject('Msxml2.DOMDocument');}
	catch(e) {oXML = false;}
	if(!oXML) {
		try {oXML = document.implementation.createDocument("", "", null);}
		catch(e) {oXML = false;}
	}
	if(!oXML) {
		alert('could not create XML document');
	} else {
		oXML.async = false;	
	}
	return oXML;
}

function LoadXML(sUrl) {
	var oXML;
	if (typeof(ActiveXObject) != 'undefined') {
		oXML = new ActiveXObject('Microsoft.XMLHTTP');
	} else {
		if (typeof(XMLHttpRequest) != 'undefined') {oXML = new XMLHttpRequest();}
	}
	if (oXML) {
		oXML.open('GET', sUrl, false);
		oXML.send(null);
		return oXML.responseXML;
	}
	return null;
}


function LoadXMLString(s) {
	var oXML;
	if (document.implementation.createDocument) {
		var oParser = new DOMParser();
		oXML = oParser.parseFromString(s, 'text/xml');
		return oXML;
    } else {
    	if (window.ActiveXObject) {
			// MSIE
			oXML = new ActiveXObject('Microsoft.XMLDOM');
			oXML.async = 'false';
			oXML.loadXML(s);
			return oXML;
		}
	}
}

function CreateXMLRequest() {
	//source: http://www.guru4.net/articoli/javascript-soap-client/en/
	try {
		if(typeof(XMLHttpRequest) != 'undefined') {
			var req = new XMLHttpRequest();
			if(req.readyState == null) {
				req.readyState = 1;
				req.addEventListener("load",function() {req.readyState = 4;if(typeof req.onreadystatechange == "function") req.onreadystatechange(); }, false);
	        }
	        return req;
		}
		if(window.ActiveXObject) {
			var progids = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
			var o;
			for(var i = 0; i < progids.length; i++) {
				try {
					o = new ActiveXObject(progids[i]);
					return o;
				} catch (e) {};
			}
			throw new Error("Could not find an installed XML parser");
		}
	} catch (e) {
		alert (e.message);
	}
	throw new Error("Your browser does not support XmlHttp objects");	
};


function serializeXML (xmlDoc) {
	if(!xmlDoc) {return '[no xml]';}
	//if(typeof(xmlDoc.xml) == 'undefined') {return '[undefined xml]';}
	if(typeof(xmlDoc.xml) == 'string') {
		return xmlDoc.xml;
	} else {
		var serializer = new XMLSerializer();
		return serializer.serializeToString(xmlDoc);
	}
}


function LoadPlainText(sUrl) {
	var oHTTP;
	if (typeof(ActiveXObject) != 'undefined') {
		oHTTP = new ActiveXObject('Microsoft.XMLHTTP');
	} else {
		if (typeof(XMLHttpRequest) != 'undefined') {oHTTP = new XMLHttpRequest();}
	}
	if (oHTTP) {
		oHTTP.open('GET', sUrl, false);
		oHTTP.send(null);
		return oHTTP.responseText;
	}
	return null;
}

function ProcessXMLAndXSL(oXML, oXSL) {
	var sHTML = '';
	if(window.ActiveXObject) { //IE
		try {
			sHTML = oXML.transformNode(oXSL);
			return sHTML;
		} catch (e) {alert('could not transform xml and xsl');}
	}

	//Mozilla
	if (document.implementation && document.implementation.createDocument) {
		var oProcessor = new XSLTProcessor();
		try {
			oProcessor.importStylesheet(oXSL);
			sHTML = oProcessor.transformToFragment(oXML, document);
		} catch (e) {alert('could not transform xml and xsl, e = ' + e.message);}
		return sHTML;
	}

	//other browsers not handled
	return '';
}

function xmlSelectSingleNode(oXML, sXPath) {
	var oNode;
	try {oNode = oXML.selectSingleNode(sXPath);}  
	catch(e) {
		if(oXML.nodeType==9) { 
			//XMLDocument
			try {oNode = oXML.evaluate(sXPath, oXML, null, 9, null).singleNodeValue;}
			catch (e) {
				alert('xmlxsl: xmlSelectSingleNode(): no succes, sXPath = ' + sXPath);
				prompt('error', e.message);
			}
		} else {
			//a node?
			try {oNode = oXML.ownerDocument.evaluate(sXPath, oXML, null, 9, null).singleNodeValue;}
			catch (e) {
				alert('xmlxsl: xmlSelectSingleNode(): no succes, sXPath = ' + sXPath);
				prompt('error', e.message);
			}
		
		}
	}
	return oNode;
}

function xmlSelectNodes(oXML, sXPath) {
	var oNodeList;
	try {
		oNodeList = oXML.selectNodes(sXPath);
	} catch(e) {
		try {
			oNodeList = oXML.evaluate(sXPath, oXML, null, 7, null);
		} catch(e) {
			alert('xmlxsl.xmlSelectNodes(): no succes, sXPath = ' + sXPath);
		}
	}
	return oNodeList;
}

function xmlNextNode(oNodeList, i) {
	var oNode;
	if (oNodeList.snapshotLength) {
		oNode = oNodeList.snapshotItem(i);
	} else {
		try {
			oNode = oNodeList.item(i);
		} catch(e) {
			alert('lib.js: xmlNextNode() not succesfull');
		}
	}
	return oNode;
}

function xmlNodeListLength(oNodeList) {
	if(!oNodeList) {return 0;}
	if (oNodeList.length) {
		return oNodeList.length;
	} else {
		if(oNodeList.snapshotLength) {
			return oNodeList.snapshotLength;
		} else {
			return 0;
		}
	}
}

function GetXSLParam(oXSL, paramname) {
	var oNode, oNodeList = oXSL.documentElement.childNodes;
	for(var i = 0; i < oNodeList.length; i++) {
		oNode = xmlNextNode(oNodeList, i);
		if(oNode.nodeName == 'xsl:param' && oNode.getAttribute('name') == paramname) {
			return oNode.getAttribute('select');
      }
	}
	return null;
}

function xmlNodeText(oNode) {
	var iNodeType;
	try {iNodeType = oNode.nodeType;} catch(e) {return '';}
	switch (iNodeType) {
		case 1:
			if (oNode.firstChild) {
				if (oNode.firstChild.nodeType==3) {return oNode.firstChild.nodeValue;}
				return '';
			}
			return '';

		case 3:
			return oNode.nodeValue;
	}
	return '';
}

function xmlFirstNoneTextChildNode(oNode) {
	var oChild = oNode.firstChild;
	while (oChild) {
		if (oChild.nodeType == 1) {
			return oChild;
		} else {
			if (oChild.nextSibling) {
				oChild = oChild.nextSibling;
			} else {
				break;
			}
		}
	}
	return null;
}

function xmlNextNoneTextSibling(oNode) {
	var oNextSibling = oNode.nextSibling;
	while (oNextSibling) {
		if (oNextSibling.nodeType == 1) {
			return oNextSibling;
		} else {
			if (oNextSibling.nextSibling) {
				oNextSibling = oNextSibling.nextSibling;
			} else {
				break;
			}
		}
	}
	return null;
}

function setXSLOutputMethod(oXSL, sMethod, sMediaType) {
	oNode = getXSLOutputNode(oXSL);
	if(oNode) {
		oNode.setAttribute('method',sMethod);
		oNode.setAttribute('media-type',sMediaType);
		return oXSL;
	}
	return false;
}

function setXSLEncoding(oXSL, sEncoding) {
	oNode = getXSLOutputNode(oXSL);
	if(oNode) {
		oNode.setAttribute('encoding',sEncoding);
		return oXSL;
	}
	return false;
}


function getXSLOutputNode(oXSL) {
	var oNodeList, oNode, i;
	oNodeList = oXSL.documentElement.childNodes;
	for(i=0;i<oNodeList.length;i++) {
		oNode = oNodeList.item(i);
		if (oNode.nodeName == 'xsl:output') {
			return oNode;
		}
	}
	return null;
}


function setXSLParam(oXSL, sParam, vValue) {
	var oNodeList = oXSL.documentElement.childNodes;
	var i, oNode;
	for (i=0; i<oNodeList.length; i++) {
		oNode = xmlNextNode(oNodeList, i);
		if (oNode.nodeName == 'xsl:param' && oNode.getAttribute('name') == sParam) {
			oNode.setAttribute('select', vValue);
			break;
		}
	}
	return oXSL;
}

function importClone(oXML, oNode, bDeep) {
	var i;
	if(oXML.importNode) {
		return oXML.importNode(oNode, bDeep);
	} else {
		//http://books.google.nl/books?id=lNxfh4vyWl4C&pg=PA224&lpg=PA224&dq=importnode+%22internet+explorer%22&source=bl&ots=OMEsXXAF-z&sig=zFxFdcjczBjNUoOEwKeS7KwVB3w&hl=en&ei=YI0uSob-DMmw-Aa8g6mZCg&sa=X&oi=book_result&ct=result&resnum=4#PPA225,M1
		//loop through all the attributes and childnodes of the node
		switch (oNode.nodeType) {
			case 1:
				var oNewNode = oXML.createElement(oNode.nodeName);
				for(i=0;i<oNode.attributes.length;i++) {
					if(oNode.attributes[i].nodeValue && !oNode.attributes[i].nodeValue=='') {
						oNewNode.setAttribute(oNode.attributes[i].nodeName, oNode.attributes[i].nodeValue);
					}
				}
				if(bDeep) {
					for(i=0;i<oNode.childNodes.length;i++) {
						oNewNode.appendChild(importClone(oXML, oNode.childNodes.item(i).cloneNode(bDeep), bDeep));
					}
				}
				return oNewNode;
				
			case 3:
			case 4:
				return oXML.createTextNode(oNode.nodeValue);
				break;
		}
	}
}

function insertFlashInDom(sElement, sPath, width, height, vars) {
	var oContainer = document.getElementById(sElement);
	var oParam, oEmbed;
	if (oContainer) {
		oObject = document.createElement('object');

		if(document.all) {
			//IE
			oObject.setAttribute('classid', 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000');
			oObject.setAttribute('codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab');
			oObject.setAttribute('width', width + 'px');
			oObject.setAttribute('height', height + 'px');

			oParam = document.createElement('param');
			oParam.setAttribute('name', 'movie');
			oParam.setAttribute('value', sPath);
			oObject.appendChild(oParam);
			
			oParam = document.createElement('param');
			oParam.setAttribute('name', '_cx');
			oParam.setAttribute('value', '0');
			oObject.appendChild(oParam);

			oParam = document.createElement('param');
			oParam.setAttribute('name', '_cy');
			oParam.setAttribute('value', '0');
			oObject.appendChild(oParam);
			
		
		} else {
			// standards compliant
			oObject.setAttribute('type', 'application/x-shockwave-flash');
			oObject.setAttribute('data', sPath);
			oObject.setAttribute('width', width);
			oObject.setAttribute('height', height);
		}


		oParam = document.createElement('param');
		oParam.setAttribute('name', 'quality');
		oParam.setAttribute('value', 'high');
		oObject.appendChild(oParam);

		oParam = document.createElement('param');
		oParam.setAttribute('name', 'bgcolor');
		oParam.setAttribute('value', '#FFFFFF');
		oObject.appendChild(oParam);

		oParam = document.createElement('param');
		oParam.setAttribute('name', 'wmode');
		oParam.setAttribute('value', 'transparent');
		oObject.appendChild(oParam);

		oParam = document.createElement('param');
		oParam.setAttribute('name', 'FlashVars');
		oParam.setAttribute('value', vars);
		oObject.appendChild(oParam);

		oParam = document.createElement('param');
		oParam.setAttribute('name', 'play');
		oParam.setAttribute('value', 'true');
		oObject.appendChild(oParam);


		oParam = document.createElement('param');
		oParam.setAttribute('name', 'loop');
		oParam.setAttribute('value', 'true');
		oObject.appendChild(oParam);


		oContainer.appendChild(oObject);
		//prompt('flashcode', oContainer.innerHTML);
		if(document.all) {
			//prompt('flashcode', oContainer.outerHTML);
			oContainer.outerHTML = oContainer.outerHTML;
		}
	}
}


function CreateSoapClient() {
	//modified from // http://www.guru4.net/articoli/javascript-soap-client/en/
	try {
		if(window.XMLHttpRequest) {
		var req = new XMLHttpRequest();
		if(req.readyState == null) {
			req.readyState = 1;
			req.addEventListener("load", function() {req.readyState = 4; if(typeof req.onreadystatechange == "function") req.onreadystatechange(); }, false); }
            return req;
        }
        if(window.ActiveXObject) {
			var progids = ["Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP"];
		    var o;
		    for(var i = 0; i < progids.length; i++) {
		        try {
		            o = new ActiveXObject(progids[i]);
		            return o;
		        } catch (e) {};
		    }
		    throw new Error("Could not find an installed XML parser");
        }
    } catch (e) {}
    throw new Error("Your browser does not support XmlHttp objects");
}


function getFlashMovieObjectByName(movieName) {
	if (window.document[movieName]) {return window.document[movieName];}
	if (navigator.appName.indexOf("Microsoft Internet")==-1) {
		if (document.embeds && document.embeds[movieName]) {
			return document.embeds[movieName];
		}
	} else {
		return document.getElementById(movieName);
	}
}

