// messages
var INVALIDPOSTALCODE_MESSAGE = "De postcode in combinatie met het huisnummer komt niet voor. Controleer de gegevens en probeer het opnieuw.";
var DISTANCE_MESSAGE = "Er moet een afstand opgegeven worden.";
var VALIDPOSTALCODE_MESSAGE = "Er moet een geldige postcode opgegeven worden.";
var EMPTYPOSTALCODE_MESSAGE = "Er moet een postcode opgegeven worden.";
var MANDATORY_MESSAGE = "Niet alle verpichte velden zijn in gevuld!";
var EMAIL_MESSAGE = "Het opgegeven e-mailadres heeft geen geldige opbouw.";
var PHONE_MESSAGE = "Het opgegeven nummer heeft geen geldige opbouw.";
var UNKNOW_ERROR = "Er is helaas onbekende fout opgetreden.";
var INVALID_STARTDATE_MESSAGE = "De van datum moet kleiner zijn dan de tot datum.";
var INVALID_BASEPAY = "Er mogen alleen getallen in gevoerd worden bij gewenst salaris";
var SAMEPASSWORD_MESSAGE = "Het nieuwe wachtwoord is gelijk aan het huidige wachtwoord. Probeer het opnieuw.";
var REPEAT_MESSAGE = "Het nieuwe wachtwoord is niet goed herhaalt. Probeer het opnieuw.";
var VALIDPASSWORD_MESSAGE = "Het nieuwe wachtwoord is niet goed het moet minimaal 4 karakters lang zijn. Probeer het opnieuw.";
var ONLY_FIFE = "Er mogen maar maximaal 5 items worden toegevoegd.";
var VALIDSEARCH_MESSAGE = "";

/**
 * Check form is valid
 **/
function validateForm(e)
{
	try {
		var e = (e)?e:window.event;
		var f = (e.srcElement)?e.srcElement:e.target;
		switch (f.name)
		{
			case "search":
				return validateSearchForm();
			break;	
			case "inschrijving":
				return validateSignInForm(f);
			break;
			case "titel":
				return validateTitelForm(f);
			break;
			case "contact":
				return validateContactForm(f);
			break;
			case "werkervaring":
				return validateWerkervaringForm(f);
			break;
			case "opleiding":
				return validateOpleidingForm(f);
			break;
			case "competency":
				return validateCompetencyForm(f);
			break;
			case "language":
				return validateLanguageForm(f);
			break;
			case "reference":
				return validateReferenceForm(f);
			break;
			case "extra":
				return checkForm(f);
			break;
			case "matchallowed":
				return checkForm(f);
			break;			
			case "preferences":
				return validatePreferencesForm(f);
			break;
			case "licenseOrCertificat":
				return checkForm(f);
			break;
			case "informatie":
				return checkForm(f);
			break;
			case "cvupload":
				return checkForm(f);
			break;
			case "changepassword":
				return validateChangePassword(f);
			break;
			case "forgottenpassword":
				return validateForgottenPassword(f);
			break;
		}
		f = null;
		return false;
	} catch (ex) {
		alert(UNKNOW_ERROR + ex.message);
		// todo send error by email
		return false;
	}
}

function validateChangePassword(form) {
	var pa = form.elements["password"];
	var pn = form.elements["passwordnew"];
	var pn1 = form.elements["passwordnew1"];

	if (pn.value != pn1.value) 
	{
		alert(REPEAT_MESSAGE);
		return false;
	} else if (pa.value == pn.value) 
	{
		alert(SAMEPASSWORD_MESSAGE);
		return false;
	} else if (pn.value.length < 4)
	{
		alert(VALIDPASSWORD_MESSAGE);
		return false;
	}
	pa = pn = pn1 = null;
	return true;
}

function validateForgottenPassword(form) {
	var pn = form.elements["passwordnew"];
	var pn1 = form.elements["passwordnew1"];

	if (pn.value != pn1.value) 
	{
		alert(REPEAT_MESSAGE);
		return false;
	} else if (pn.value.length < 4)
	{
		alert(VALIDPASSWORD_MESSAGE);
		return false;
	}
	pn = pn1 = null;
	return true;
}

function validateSearchForm()
{
	var today = new Date(); 
	var zero_date = new Date(0,0,0); 
	today.setTime(today.getTime() - zero_date.getTime()); 
	var cookie_expire_date = new Date(today.getTime() + (8 * 7 * 86400000)); 

	var searchPostalCode = document.getElementById("searchPostalCode");
	var searchCommuteDistance = document.getElementById("searchCommuteDistance");
	var searchPositionTitles = document.getElementById("searchPositionTitles");

	if (searchPostalCode.value!="" && searchCommuteDistance.selectedIndex<1)
	{
		alert(DISTANCE_MESSAGE);
		return false;	
	}
	if (searchPostalCode.value=="" && searchCommuteDistance.selectedIndex>1)
	{
		alert(EMPTYPOSTALCODE_MESSAGE);
		return false;	
	}
	if (searchCommuteDistance.selectedIndex>1)
	{
		searchPostalCode.value = searchPostalCode.value.replace(/\s/gi,"");
		var reg = /^[0-9]{4}[A-Z]{2}$/gi
		if (!reg.test(searchPostalCode.value))
		{
			alert(VALIDPOSTALCODE_MESSAGE);
			return false;	
		}		
	}
	if (searchPostalCode.value=="" && searchPositionTitles.selectedIndex<0)
	{
		//alert(VALIDSEARCH_MESSAGE);
		//return false;
	}
	
	setCookie("postalCode",searchPostalCode.value,cookie_expire_date);
	setCookie("commuteDistance",searchCommuteDistance.value,cookie_expire_date);
	setCookie("positionTitles",searchPositionTitles.value,cookie_expire_date);

	searchPostalCode = null;
	searchCommuteDistance = null;
	searchPositionTitles = null;
}

function validateSignInForm(form) {
	var re = checkForm(form);
	if (re)
	{
		var fi = form.elements['internetEmailAddress'];
		if (!fi.value.match(/\b[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b/i)) 
		{
			alert(EMAIL_MESSAGE);
			setFocus(fi);
			fi = null;
			return false;
		}
		var fi1 = form.elements['mobile'];
		var fi2 = form.elements['telephone'];
		if (fi1.value!="")
		{
			if (!fi1.value.match(/^[+]?[0-9]{10,11}$/i)) 
			{
				alert(PHONE_MESSAGE);
				setFocus(fi1);
				fi = null;
				return false;
			} else {
				fi1.style.backgroundColor="";
			}
		} else if (fi2.value!="")
		{
			if (!fi2.value.match(/^[+]?[0-9]{10,11}$/i)) 
			{
				alert(PHONE_MESSAGE);
				setFocus(fi2);
				fi = null;
				return false;
			} else {
				fi2.style.backgroundColor="";
			}
		} else {
			alert(MANDATORY_MESSAGE);
				fi1.style.backgroundColor="#ffffcc";
				setFocus(fi1);
				fi1 = fi2 = null;
				return false;
		}
		fi1 = fi2 = fi = null;
	}
	return re;
}

function validateContactForm(form) {
	var re = checkForm(form);
	if (re)
	{
		var fi = form.elements['internetEmailAddress'];
		if (!fi.value.match(/\b[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}\b/i)) 
		{
			alert(EMAIL_MESSAGE);
			setFocus(fi);
			fi = null;
			return false;
		}
		var fi1 = form.elements['mobile'];
		var fi2 = form.elements['telephone'];
		if (fi1.value!="")
		{
			if (!fi1.value.match(/^[+]?[0-9]{10,11}$/i)) 
			{
				alert(PHONE_MESSAGE);
				setFocus(fi1);
				fi = null;
				return false;
			} else {
				fi1.style.backgroundColor="";
			}
		} else if (fi2.value!="")
		{
			if (!fi2.value.match(/^[+]?[0-9]{10,11}$/i)) 
			{
				alert(PHONE_MESSAGE);
				setFocus(fi2);
				fi = null;
				return false;
			} else {
				fi2.style.backgroundColor="";
			}
		} else {
			alert(MANDATORY_MESSAGE);
				fi1.style.backgroundColor="#ffffcc";
				setFocus(fi1);
				fi1 = fi2 = null;
				return false;
		}
		fi1 = fi2 = fi = null;
	}
	return re;
}

function validateTitelForm(form) {
	return checkForm(form);
}

function validateCompetencyForm(form) {
	var re = checkForm(form);
	return re;
}

function validateLanguageForm(form) {
	var re = checkForm(form);
	return re;
}

function validateReferenceForm(form) {
	var re = checkForm(form);
	return re;
}

function validatePreferencesForm(form) {
	var re = checkForm(form);
	if (re)
	{
		var fi = form.elements['basePayAmountMin'];
		if (!fi.value.match(/^[0-9,.]*$/))
		{
			alert(INVALID_BASEPAY);
			fi.style.backgroundColor="#ffffcc";
			setFocus(fi);
			re = false;
		}
		fi = null;

	}
	if (re) // select all for post
	{
		var jc = get('jcRight');
		var pt = get('ptRight');
		var ic = get('icRight');
		var pl = get('plRight');
		selectall_options(jc);
		selectall_options(pt);
		selectall_options(ic);
		selectall_options(pl);
		jc = pt = ic = pt = null;
	}
	return re;
}

function selectall_options(select) {
	try	{
		var l = select.options.length;
		var os = select.options;
		for(var i=0;i<l;i++)
		{
			os[i].selected = true;
		}
	}
	catch (er) {
		return false;
	}
	os = null;
	return true;
}

function validateOpleidingForm(form) {
	var re = checkForm(form);
	if (re)
	{
		var sm = parseInt(form.elements['startDate[month]'].value);
		var sy = parseInt(form.elements['startDate[year]'].value);

		var em = parseInt(form.elements['endDate[month]'].value);
		var ey = parseInt(form.elements['endDate[year]'].value);
		if (em !=0 || isNaN(em))
		{
			if (sy > ey)
			{
				alert(INVALID_STARTDATE_MESSAGE);
				re = false;
			} else if (sy == ey && sm >= em)
			{
				alert(INVALID_STARTDATE_MESSAGE);
				re = false;
			}
		}
	}
	return re;
}

function validateWerkervaringForm(form) {
	var re = checkForm(form);
	if (re)
	{
		var sm = parseInt(form.elements['startDate[month]'].value);
		var sy = parseInt(form.elements['startDate[year]'].value);

		var em = parseInt(form.elements['endDate[month]'].value);
		var ey = parseInt(form.elements['endDate[year]'].value);
		if (em !=0 || isNaN(em))
		{
			if (sy > ey)
			{
				alert(INVALID_STARTDATE_MESSAGE);
				re = false;
			} else if (sy == ey && sm >= em)
			{
				alert(INVALID_STARTDATE_MESSAGE);
				re = false;
			}
		}
	}
	return re;
}

function onExPa(e) {
	var e = e || window.event;
	var t = e.srcElement || e.target;
	var el = document.getElementById('currentlyEnrolled');
	var dd = document.getElementsByName('degreeDate[day]')[0];
	var dm = document.getElementsByName('degreeDate[month]')[0];
	var dy = document.getElementsByName('degreeDate[year]')[0];
	if (t.value=='true')
	{
		el.disabled = true;
		dd.disabled = false;
		dm.disabled = false;
		dy.disabled = false;
		el.checked = false;
	} else {
		el.disabled = false;
		dd.disabled = true;
		dm.disabled = true;
		dy.disabled = true;
		dd.value = '';
		dm.value = '';
		dy.value = '';
	}
	el = e = t = null;
}

function checkTextField(obj)
{
	if (obj.value=="")
	{
		return false;
	}
	return true;
}

function checkTextAreaField(obj)
{
	return checkTextField(obj);
}

function checkFileField(obj)
{
	return checkTextField(obj);
}

function checkCheckboxField(obj)
{
	var ck = document.getElementsByName(obj.name);
	var found = false;
	for (var i=0;i<ck.length;i++)
	{
		if (ck[i].checked)
		{
			found = true;
		}
	}
	return found;
}

function checkSelectOneField(obj)
{
	if (obj.selectedIndex < 0)
	{
		return false;
	}
	if (obj.value == "")
	{
		return false;
	}
	if (obj.value == "00")
	{
		return false;
	}
	if (obj.value == "0000")
	{
		return false;
	}
	return true;
}

function checkSelectMultipleField(obj)
{
	var found = false;
	for (var i=0;i<obj.options.length;i++)
	{
		if (obj.options[i].selected)
		{
			found=true;
			i=obj.options.length;
		}
	}
	if (!found){return false;}
	return true;
}

function checkRadioField(obj)
{
	var fields = document.getElementsByName(obj.name);
	var checked = true;
	for (var i=0;i<fields.length;i++)
	{
		var field = fields[i];
		checked = field.checked;
		if (checked) i = fields.length;
		field = null;
	}
	if (!checked)
	{
		return false;
	}
	fields = null;
	checked = null;
	return true;
}

function checkForm(form)
{
	var rv = true;
	if (!form) return false;

	for (var i=0;i<form.elements.length;i++)
	{
		var field = form.elements[i];
		var mandatory = (field.getAttribute("mandatory")=="true") ? true:false;
		if (mandatory)
		{
			switch (field.type)
			{
			case "text":
				rv = checkTextField(field);
				break;
			case "textarea":
				rv = checkTextAreaField(field);
				break;
			case "radio":
				rv = checkRadioField(field);
				break;
			case "select-one":
				rv = checkSelectOneField(field);
				break;
			case "select-multiple":
				rv = checkSelectMultipleField(field);
				break;
			case "checkbox":
				rv = checkCheckboxField(field);
				break;
			case "file":
				rv = checkFileField(field);
				break;
			default:
				alert(UNKNOW_ERROR);
				break;
			}
			if (rv===false)
			{
				alert(MANDATORY_MESSAGE);
				field.style.backgroundColor="#ffffcc";
				setFocus(field);
				field = null;
				return false;
			} else {
				field.style.backgroundColor="";
				field = null;
			}
		}
	}
	form = null;
	return true;
}

function onPlCo(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;
	var el = document.getElementById('plRegion');

	try
	{
		var dom = new XmlDocument.create();
		dom.async = true;
		dom.onreadystatechange = function()
		{
			if (dom.readyState == 4)
			{	
				var nodes = dom.selectNodes("/DataSet/Record/Region");
				el.options.length = nodes.length+1;
				el.options[0].value = "";
				el.options[0].text = "--- Geen voorkeur ---";
				for (var i=0;i<nodes.length;i++)
				{
					var option = el.options[i+1];
					var node = nodes[i];
					option.value = node.parentNode.getAttribute("id");
					option.text = node.text;
				}
				dom=null;
				el = option = node = nodes = null;
			}		
		}
		dom.load("../broker.php?method=getRegions&arg[]="+se.value);
	} catch(err) {
		alert(err.message);
	}
	se = e = null;
}

function onPlRe(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;
	var el = get('plMunicipality');

	try
	{
		var dom = new XmlDocument.create();
		dom.async = true;
		dom.onreadystatechange = function()
		{
			if (dom.readyState == 4)
			{	
				var nodes = dom.selectNodes("/DataSet/Record/Municipality");
				el.options.length = nodes.length+1;
				el.options[0].value = "";
				el.options[0].text = "--- Geen voorkeur ---";
				for (var i=0;i<nodes.length;i++)
				{
					var option = el.options[i+1];
					var node = nodes[i];
					option.value = node.parentNode.getAttribute("id");
					option.text = node.text;
				}
				dom=null;
				el = option = node = nodes=null;
			}		
		}
		dom.load("../broker.php?method=getMunicipalities&arg[]="+se.value);
	} catch(err) {
		alert(err.message);
	}
	se = e = null;
}

function onPlAdd(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	

	var co = get('plCountry');
	var re = get('plRegion');
	var mu = get('plMunicipality');
	var ri = get('plRight');

	if (ri.options.length>=5) {
		alert(ONLY_FIFE);
		return;
	}

	var t = new Array();
	var v = new Array();
	if (co.selectedIndex)
	{
		var op = co.options[co.selectedIndex];
		if (op.value!="")
		{
			t.push(op.value);
			v.push(op.value);
		}
	}

	if (re.selectedIndex > -1)
	{
		var op = re.options[re.selectedIndex];
		if (op.value!="")
		{
			t.push(op.text);
			v.push(op.value);
		}
	}

	if (mu.selectedIndex > -1)
	{
		var op = mu.options[mu.selectedIndex];
		if (op.value!="")
		{
			t.push(op.text);
			v.push(op.value);
		}
	}
	ri.options[ri.options.length] = new Option(t.join(' / '),t.join('||'));

	op = co = re = mu = ri = se = e = null;
}

function onPlRemove(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	
	
	var ri = get('plRight');
	var l = ri.options.length;
	for (var i=0;i<l;i++)
	{
		if (ri.options[i].selected)
		{
			ri.options[i].text = '';
			ri.options[i].value = '';
			ri.remove(i);
		}
	}

	ri = se = e = null;
}

function onJcAdd(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	

	var le = get('jcLeft');
	var ri = get('jcRight');

	var l = le.options.length;
	for (var i=0;i<l;i++)
	{
		if (ri.options.length>=5) {
			alert(ONLY_FIFE);
			return;
		}
		if (le.options[i].selected)
		{
			var t = trim(le.options[i].text);
			var v = le.options[i].value;
			ri.options[ri.options.length] = new Option(t,v);
			le.remove(i);
			l--;
		}
	}
	op = le = ri = se = e = null;
}

function onIcAdd(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	

	var le = get('icLeft');
	var ri = get('icRight');

	var l = le.options.length;
	for (var i=0;i<l;i++)
	{
		if (ri.options.length>=5) {
			alert(ONLY_FIFE);
			return;
		}
		if (le.options[i].selected)
		{
			var t = trim(le.options[i].text);
			var v = le.options[i].value;
			ri.options[ri.options.length] = new Option(t,v);
			le.remove(i);
			l--;
		}
	}
	le = ri = se = e = null;
}

function onPtAdd(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	

	var le = get('ptLeft');
	var ri = get('ptRight');

	var l = le.options.length;
	for (var i=0;i<l;i++)
	{
		if (ri.options.length>=5) {
			alert(ONLY_FIFE);
			return;
		}
		if (le.options[i].selected)
		{
			var t = trim(le.options[i].text);
			var v = le.options[i].value;
			ri.options[ri.options.length] = new Option(t,v);
			le.remove(i);
			l--;
		}
	}
	ri = le = se = e = null;
}

function onJcRemove(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	

	var le = get('jcLeft');
	var ri = get('jcRight');

	var l = ri.options.length;
	for (var i=0;i<l;i++)
	{
		if (ri.options[i].selected)
		{
			var t = ri.options[i].text;
			var v = ri.options[i].value;
			var co = v.split('||')[0];
			var ix = 0;
			while (le.options[ix].value.split('||')[0]<co && 
				ix < le.options.length)
			{
				ix++;
			}
			for (var j=2;j<co.length;j++)
			{
				t = String.fromCharCode(160)+t;
				t = String.fromCharCode(160)+t;
			}			
			var ol = le.options[ix];
			var op = new Option(t,v);
			try {
				// standards compliant; doesn't work in IE
				le.add(op,ol); 
			}
			catch(ex) {
				le.add(op,ix); // IE only
			}
			ri.remove(i);
			l--;
		}
	}
	se = e = null;
}

function onIcRemove(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	

	var le = get('icLeft');
	var ri = get('icRight');

	var l = ri.options.length;
	for (var i=0;i<l;i++)
	{
		if (ri.options[i].selected)
		{
			var t = ri.options[i].text;
			var v = ri.options[i].value;
			var co = v.split('||')[0];
			var ix = 0;
			while (le.options[ix].value.split('||')[0]<co && 
				ix < le.options.length)
			{
				ix++;
			}
			for (var j=3;j<co.length;j++)
			{
				t = String.fromCharCode(160)+t;
				t = String.fromCharCode(160)+t;
			}			
			var ol = le.options[ix];
			var op = new Option(t,v);
			try {
				// standards compliant; doesn't work in IE
				le.add(op,ol); 
			}
			catch(ex) {
				le.add(op,ix); // IE only
			}
			ri.remove(i);
			l--;
		}
	}
	ol = se = e = null;
}

function onPtRemove(e) {
	var e = e || window.event;
	var se = e.srcElement || e.target;	

	var le = get('ptLeft');
	var ri = get('ptRight');

	var l = ri.options.length;
	for (var i=0;i<l;i++)
	{
		if (ri.options[i].selected)
		{
			var t = ri.options[i].text;
			var v = ri.options[i].value;
			var ix = 0;
			while (le.options[ix].text<t && 
				ix < le.options.length)
			{
				ix++;
			}
			var ol = le.options[ix];
			var op = new Option(t,v);
			try {
				// standards compliant; doesn't work in IE
				le.add(op,ol); 
			}
			catch(ex) {
				le.add(op,ix); // IE only
			}
			ri.remove(i);
			l--;
		}
	}
	ol = se = e = null;
}

function find_option(key,options) {
	var l = options.length-1;
	while (options[l].value==key)
	{
		if (options[l].value<key)
			l = Math.floor(l/2);
		else
			l = l+Math.floor(l/2);
	}
	return l;
}

function setFocus(field) {
	try{
		field.focus();	
	}catch (ex){}
}

function trim(str)
{
   str = leftTrim(str);
   return rightTrim(str);
}

function leftTrim(str) 
{
	str = str.replace(/^[\s\xA0]+/gi,'');
	return str;
}

function rightTrim(str) 
{
	str = str.replace(/[\s\xA0]+$/gi,'');
	return str;
}

function showLayer(id,visible)
{
	get(id).style.display=(visible)?"block":"none";
}

function get(id)
{
	return document.getElementById(id);
}

function MM_preloadImages() { //v3.0
	var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
	var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
	if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
	}

function MM_swapImgRestore() { //v3.0
	var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
	var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
	d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
	if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
	for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
	if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
	var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
	if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}
function doFlash( flashcode ) {
	document.write ( flashcode );
}

function getCookie(name) { 
   var start = document.cookie.indexOf(name+"="); 
   var len = start+name.length+1; 
   if ((!start) && (name != document.cookie.substring(0,name.length))) return null; 
   if (start == -1) return ""; 
   var end = document.cookie.indexOf(";",len); 
   if (end == -1) end = document.cookie.length; 
   return unescape(String(document.cookie.substring(len,end))); 
} 

function setCookie(name,value,expires,path,domain,secure) { 
    var cookieString = name + "=" +escape(value) + 
       ( (expires) ? ";expires=" + expires.toGMTString() : "") + 
       ( (path) ? ";path=" + path : "") + 
       ( (domain) ? ";domain=" + domain : "") + 
       ( (secure) ? ";secure" : ""); 
    document.cookie = cookieString; 
} 

function deleteCookie(name,path,domain) { 
   if (Get_Cookie(name)) document.cookie = name + "=" + 
      ( (path) ? ";path=" + path : "") + 
      ( (domain) ? ";domain=" + domain : "") + 
      ";expires=Thu, 01-Jan-70 00:00:01 GMT"; 
} 

//<script>
//////////////////
// Helper Stuff //
//////////////////

// used to find the Automation server name
function getDomDocumentPrefix() {
	if (getDomDocumentPrefix.prefix)
		return getDomDocumentPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".DomDocument");
			return getDomDocumentPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

function getXmlHttpPrefix() {
	if (getXmlHttpPrefix.prefix)
		return getXmlHttpPrefix.prefix;
	
	var prefixes = ["MSXML2", "Microsoft", "MSXML", "MSXML3"];
	var o;
	for (var i = 0; i < prefixes.length; i++) {
		try {
			// try to create the objects
			o = new ActiveXObject(prefixes[i] + ".XmlHttp");
			return getXmlHttpPrefix.prefix = prefixes[i];
		}
		catch (ex) {};
	}
	
	throw new Error("Could not find an installed XML parser");
}

function get(id) {
	return document.getElementById(id);
}

//////////////////////////
// Start the Real stuff //
//////////////////////////


// XmlHttp factory
function XmlHttp() {}

XmlHttp.create = function () {
	try {
		if (window.XMLHttpRequest) {
			var req = new XMLHttpRequest();
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			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) {
			return new ActiveXObject(getXmlHttpPrefix() + ".XmlHttp");
		}
	}
	catch (ex) {}
	// fell through
	throw new Error("Your browser does not support XmlHttp objects");
};

// XmlDocument factory
function XmlDocument() {}

XmlDocument.create = function () {
	try {
		// DOM2
		if (document.implementation && document.implementation.createDocument) {
			var doc = document.implementation.createDocument("", "", null);
			
			// some versions of Moz do not support the readyState property
			// and the onreadystate event so we patch it!
			if (doc.readyState == null) {
				doc.readyState = 1;
				doc.addEventListener("load", function () {
					doc.readyState = 4;
					if (typeof doc.onreadystatechange == "function")
						doc.onreadystatechange();
				}, false);
			}
			
			return doc;
		}
		if (window.ActiveXObject)
			return new ActiveXObject(getDomDocumentPrefix() + ".DomDocument");
	}
	catch (ex) {}
	throw new Error("Your browser does not support XmlDocument objects");
};

// Create the loadXML method and xml getter for Mozilla
if (window.DOMParser &&
	window.XMLSerializer &&
	window.Node && Node.prototype && Node.prototype.__defineGetter__) {

	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	//XMLDocument.prototype.loadXML = 
	Document.prototype.loadXML = function (s) {
		
		// parse the string to a new doc	
		var doc2 = (new DOMParser()).parseFromString(s, "text/xml");
		
		// remove all initial children
		while (this.hasChildNodes())
			this.removeChild(this.lastChild);
			
		// insert and import nodes
		for (var i = 0; i < doc2.childNodes.length; i++) {
			this.appendChild(this.importNode(doc2.childNodes[i], true));
		}
	};
	
	
	/*
	 * xml getter
	 *
	 * This serializes the DOM tree to an XML String
	 *
	 * Usage: var sXml = oNode.xml
	 *
	 */
	// XMLDocument did not extend the Document interface in some versions
	// of Mozilla. Extend both!
	/*
	XMLDocument.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});
	*/
	function _sarissa_XMLDocument_onload()
	{
		_sarissa_loadHandler(this);
	};
	/**
	 * <p>Ensures the document was loaded correctly, otherwise sets the
	 * parseError to -1 to indicate something went wrong. Internal use</p>
	 * @private
	 */
	function _sarissa_loadHandler(oDoc)
	{
		if (!oDoc.documentElement || oDoc.documentElement.tagName == "parsererror")
			oDoc.parseError = -1;
		_sarissa_setReadyState(oDoc, 4);
	};
	/**
	 * <p>Sets the readyState property of the given DOM Document object.
	 * Internal use.</p>
	 * @private 
	 * @argument oDoc the DOM Document object to fire the
	 *          readystatechange event
	 * @argument iReadyState the number to change the readystate property to
	 */
	function _sarissa_setReadyState(oDoc, iReadyState) 
	{
		oDoc.readyState = iReadyState;
		if (oDoc.onreadystatechange != null && typeof oDoc.onreadystatechange == "function")
			oDoc.onreadystatechange();
	};
	Document.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});

	Node.prototype.__defineGetter__("xml", function () {
		return (new XMLSerializer()).serializeToString(this);
	});


	Node.prototype.__defineGetter__("text", function () {
		if (this.firstChild && this.firstChild.nodeType==3)
		{	
			return this.firstChild.nodeValue;
		} else {
			return "";
		}
	});

	Node.prototype.__defineSetter__("text", function (str) {
		if (this.firstChild && this.firstChild.nodeType==3)
		{	
			this.firstChild.nodeValue = str;
		} else {
			this.appendChild(this.ownerDocument.createTextNode(str));
		}
	});

	Document.prototype.selectNodes = function(cXPathString, xNode)
	{
		if( !xNode ) { xNode = this; } 

		var oNSResolver = this.createNSResolver(this.documentElement)
		var aItems = this.evaluate(cXPathString, xNode, oNSResolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null)
		var aResult = [];
		for( var i = 0; i < aItems.snapshotLength; i++)
		{
			aResult[i] =  aItems.snapshotItem(i);
		}		
		return aResult;
	}
	Document.prototype.selectSingleNode = function(cXPathString, xNode)
	{
		if( !xNode ) { xNode = this; } 

		var xItems = this.selectNodes(cXPathString, xNode);
		if( xItems.length > 0 )
		{
			return xItems[0];
		}
		else
		{
			return null;
		}
	}
	Element.prototype.selectNodes = function(cXPathString) 
	{
		return this.ownerDocument.selectNodes(cXPathString, this);
	}
	Element.prototype.selectSingleNode = function(cXPathString) 
	{
		return this.ownerDocument.selectSingleNode(cXPathString, this);
	}
	XMLDocument.prototype._sarissa_clearDOM = function()
	{
		while(this.hasChildNodes())
			this.removeChild(this.firstChild);
	};

	XMLDocument.prototype._sarissa_copyDOM = function(oDoc)
	{
		this._sarissa_clearDOM();
		if(oDoc.nodeType == Node.DOCUMENT_NODE || oDoc.nodeType == Node.DOCUMENT_FRAGMENT_NODE)
		{
			var oNodes = oDoc.childNodes;
			for(var i=0;i<oNodes.length;i++)
				this.appendChild(this.importNode(oNodes[i], true));
		}
		else if(oDoc.nodeType == Node.ELEMENT_NODE)
			this.appendChild(this.importNode(oDoc, true));
	};
	Document.prototype.transformNodeToObject = function(xslDoc, oResult)
	{
		var xsltProcessor = null;
		try
		{
			xsltProcessor = new XSLTProcessor();
			if(xsltProcessor.reset)// new nsIXSLTProcessor is available
			{
				xsltProcessor.importStylesheet(xslDoc);
				var newFragment = xsltProcessor.transformToFragment(this, oResult);
				oResult._sarissa_copyDOM(newFragment);
			}
			else // only nsIXSLTProcessorObsolete is available
			{
				xsltProcessor.transformDocument(this, xslDoc, oResult, null);
			}
		}
		catch(e)
		{
			if(xslDoc && oResult)
				throw "Failed to transform document. (original exception: "+e+")";
			else if(!xslDoc)
				throw "No Stylesheet Document was provided. (original exception: "+e+")";
			else if(!oResult)
				throw "No Result Document was provided. (original exception: "+e+")";
			else if(xsltProcessor == null)
				throw "Could not instantiate an XSLTProcessor object. (original exception: "+e+")";
			else
				throw e;
		}
	};
	Document.prototype.transformNode = function(xslDoc)
	{
		var out = document.implementation.createDocument("", "", null);
		this.transformNodeToObject(xslDoc, out);
		var str = null;
		try
		{
			var serializer = new XMLSerializer();
			str = serializer.serializeToString(out);
		}
		catch(e)
		{
			throw "Failed to serialize result document. (original exception: "+e+")";
		}
		return str;
	};
}
