/* -----------------------------------------------------------------
// Online Services
//
// Form handling for MKB Online Services
// Generic scripts with dependency on TNT Post framework/scripts
// Make sure the Page object has loaded first or this will fail.
//
// Copyright 2006, TNT Post
----------------------------------------------------------------- */

// Initialize osform
OSFormKickStart = function() {
	if (window.page) {
		window.osform = new OSForm();
	}
	else {
		// try again in x milliseconds
		setTimeout("OSFormKickStart()", 100); 
	}
}
OSFormKickStart(); 

// Set event listeners
addEvent(window, "unload", function(){
	if (window.osform) { window.osform.destroy(); }
});

/* -----------------------------------------------------------------
// Main osform object
----------------------------------------------------------------- */

OSForm = function() {
	
	if (!window.page.hasSupport()) return;

	this.sForm = "formMain"; // The name of the form

	this.sAdresXpressUri = "/includes/controls/os-postcode.aspx";
	
	this.createWarning(); // Init warning message
	this.validationInit(); // Init form validation
	this.fixInfoBoxes(); // Fix infoboxes on IE

}


OSForm.prototype.isArray = function(obj) {
   if(obj){
     if (!obj.length)
        return false;
     else
        return true;
  }else{
    return false;
  }
}


// Helper function to clean up the osform object
OSForm.prototype.destroy = function() {
	
	if(!window.page.hasSupport()) return;
	
	// Kill objects to prevent memory leaks due to closures. - TODO!

}

/* -----------------------------------------------------------------
// OS form helpers/methods/properties/...
----------------------------------------------------------------- */

// Function to post the form to a different URL
OSForm.prototype.goBack = function(url) {
	var oFormMain = document.getElementById(this.sForm);
	if (oFormMain) {
		oFormMain.action = url;
		oFormMain.submit();
	}
}

// Function to fix the mouseover of the infoboxes in IE
OSForm.prototype.fixInfoBoxes = function() {
	var i, aInfobox = getElementsByClassName("infobox", document);
	if (aInfobox) {
		this.createInfoBox(); // Create a separate infobox
		for (i=0; i<(aInfobox.length); i++) {
			aInfobox[i].onmouseover = function() {
				addClass(this, "infoboxhover");
				osform.showInfoBox(this);
				tickle();
			}
			aInfobox[i].onmouseout=function() {
				removeClass(this, "infoboxhover");
				osform.hideInfoBox();
				tickle();
			}
		}
	}
}
// Infobox div
OSForm.prototype.createInfoBox = function() {
	var oBody = document.getElementsByTagName("body")[0];
	var oInfoBox = document.createElement("div");
	oInfoBox.id = "os-form-infobox";
	var oInfoBoxMsg = document.createElement("div");
	oInfoBoxMsg.id = "os-form-infobox-msg";
	oInfoBox.appendChild(oInfoBoxMsg);
	if(document.all){ // IE only iframe
		var oInfoBoxIFrame = document.createElement("iframe");
		oInfoBoxIFrame.id = "os-form-infobox-iframe";	
		oInfoBoxIFrame.frameBorder = 0;
		oInfoBoxIFrame.scrolling = "no";
		oInfoBoxIFrame.src = "about:blank";
		oInfoBox.appendChild(oInfoBoxIFrame);		
	}
	// Append to body
	oBody.appendChild(oInfoBox);
}
OSForm.prototype.showInfoBox = function(obj) {
	var oInfoBox = document.getElementById("os-form-infobox");
	if (oInfoBox) {
		var oInfoBoxMsg = document.getElementById("os-form-infobox-msg");
		var oObjDD = obj.getElementsByTagName("dd")[0];
		var oInfoBoxX = calculateLeft(oObjDD), oInfoBoxY = calculateTop(oObjDD);
		oInfoBox.style.left = oInfoBoxX+"px";
		oInfoBox.style.top  = oInfoBoxY+"px";
		oInfoBoxMsg.innerHTML = oObjDD.innerHTML;
		oInfoBox.style.display = "block";
		oObjDD.style.visibility = "hidden";
	}
}
OSForm.prototype.hideInfoBox = function() {
	var oInfoBox = document.getElementById("os-form-infobox");
	if (oInfoBox) {
		oInfoBox.style.display = "none";
	}
}

// Function to toggle optional fields on or off.
// Inputargs: 'show/hide', 'field1', ..., 'fieldn'
OSForm.prototype.toggleOptional = function() {
	if (this.animation) {
		this.animation.stop();
		this.optionalFadeDone();
	}
	this.nowarn();
	var i, obj, bstatus, args = this.toggleOptional.arguments;
	if (args[0]) { bstatus = args[0]; }
  for (i=1; i<(args.length); i++) {
		obj = document.getElementById(args[i]);
		this.container = obj;
		
		if (obj && bstatus == "show") {
			removeClass(obj, "os-optional");
			// Fade animation when shown
			this.animation = new Animator(151, 255,  this.method(this.optionalFade), this.method(this.optionalFadeDone));
			this.animation.setRate(50);
			this.animation.setStep(8);
			this.animation.start();
		}
		else if (obj && bstatus == "hide") {
			addClass(obj, "os-optional");
		}
		
	}
	// Nudge the browser to display properly
	tickle();
}
OSForm.prototype.optionalFade = function(x) {
	this.container.style.backgroundColor = "rgb("+x+", "+x+", "+x+")";
}
OSForm.prototype.optionalFadeDone = function(x) {
	this.container.style.backgroundColor = "";
}

// Validate a single field (realtime)
OSForm.prototype.validateField = function(obj) {
  
	if (!window.fieldValues) { return; }
	
	if (window.fieldValues[obj.id]) {
		if (window.fieldValues[obj.id].match("isDate")) { // Check for date
			var msg = eval("this."+window.fieldValues[obj.id]);
		}
		else if (window.fieldValues[obj.id].match("isBetween")) { // Check for date
			var msg = eval("this."+window.fieldValues[obj.id]);
		}
		else if (window.fieldValues[obj.id].match("isMinimumDate")) { // Check for date
			var msg = eval("this."+window.fieldValues[obj.id]);
		}
		else if (window.fieldValues[obj.id].match("isMinimal")) { // Check for minimum
			var msg = eval("this."+window.fieldValues[obj.id]);
		}
		else if (window.fieldValues[obj.id].match("isValidDate")) { // Check for minimum
			var msg = eval("this."+window.fieldValues[obj.id]);
		}
		else if (window.fieldValues[obj.id].match("isValidDateRow")) { // Check for minimum
      
			var msg = eval("this."+window.fieldValues[obj.id]);
		}
		else if (window.fieldValues[obj.id].match("isValidFutureDate")) { // Check for future date
			var msg = eval("this."+window.fieldValues[obj.id]);
		}		
		else { // Validate expression
			var msg = eval("this."+window.fieldValues[obj.id]+"(obj)");
		}
		if (msg) {
			this.warn(obj, msg);
			//obj.focus();
			return false;
		}
		else {
			this.nowarn();
			return true;
		}
	}

}
OSForm.prototype.isRequired = function(obj) { // Required field
	if (obj.type != "checkbox") {
		if (obj.value.length < 1) { return "This field is required."; }
	}
	else if (obj.type == "checkbox") {
		if (!obj.checked) { return "Geef aan dat u akkoord gaat met de voorwaarden."; }
	}
}
OSForm.prototype.isNumeric = function(obj) { // Numeric field
	if (!obj.value.match(/^\d+$/)) { 
		return "Vul een getal in."; 
	}
}

//Check if "name" field does not contain numeric input (porten innen)
OSForm.prototype.isName = function(obj) { // Non Numeric field
	//if (!obj.value.match(/^\d+$/)) { 
	if (obj.value.match(/^\d*\.{0,1}\d+$/)) { 

		return "Vul een geldige naam in."; 
	}
}

OSForm.prototype.isBetween = function(aantal, min, max, error) { // is number between min and max
	var pass = true;
    var obj = document.getElementById(aantal);
    nVal = obj.value.replace(/\D/g, "");
    if (!error){
		error = "Vul een getal in tussen "+min+" en "+max;
    }    
	if (this.isNumeric(obj)) { 
		pass = false;
	}
	if (nVal < min) { 
		pass = false;
	}
	if (nVal > max) { 
		pass = false;
	}
	if(pass){
		return "";
	}else{
		return error;
	}
}
OSForm.prototype.isKvKnr = function(obj) { // KvK number field (8 digit)
	if (!obj.value.match(/^[0-9]{8,}$/)) { 
		return "Vul een KvK-nummer van minimaal 8 cijfers in."; 
	}
}

OSForm.prototype.isKvKnrOptional = function(obj) { // KvK number field (8 digit)
	if (!obj.value.match(/^[0-9]{8}$/) && obj.value.length > 0) { 
		return "Vul een KvK-nummer van minimaal 8 cijfers in."; 
	}
}

OSForm.prototype.isKvKnrmore = function(obj) { // KvK more numbers field (12 digit)
	if (!obj.value.match(/^[0-9]{12}$/)) { 
		return "Vul een KvK-nummer van 12 cijfers in."; 
	}
}

OSForm.prototype.isKvKnrmoreOptional = function(obj) { // KvK more numbers field (12 digit)
	if (!obj.value.match(/^[0-9]{12}$/) && obj.value.length > 0) { 
		return "Vul een KvK-nummer van 12 cijfers in."; 
	}
}

OSForm.prototype.isPostcode = function(obj) { // Postcode field
	if (!obj.value.match(/^[1-9]{1}[0-9]{3} ?[A-Za-z]{2}$/)) { 
		return "Enter a postal code of 4 digits and 2 letters."; 
	}
}
OSForm.prototype.isStreetname = function(obj) { // Streetname field
	if (obj.value.length < 1 || obj.value.match(/automatisch/)) { 
		return "Vul een geldige straatnaam in."; 
	}
}
OSForm.prototype.isCityname = function(obj) { // Cityname field
	if (obj.value.length < 1 || obj.value.match(/automatisch/)) { 
		return "Vul een geldige plaatsnaam in.";
	}
}
OSForm.prototype.isPhone = function(obj) { // Phone field
	if (!obj.value.match(/([0]{1}[6]{1}[-\s]*([0-9]{1}[\s]*){8})|([0]{1}[1-9]{1}[0-9]{2}[-\s]*([0-9]{1}[\s]*){6})|([0]{1}[1-9]{1}[0-9]{1}[-\s]*([0-9]{1}[\s]*){7})/)) { 
		return "Enter a minimum of 10 phone numbers."; 
	}
}

OSForm.prototype.isPhoneOptional = function(obj) { // Optional Phone field
	if ( obj.value.length > 0) { 
		return this.isPhone(obj);
	}
}

OSForm.prototype.isFax = function(obj) { // Fax field
	if (!obj.value.match(/([0]{1}[6]{1}[-\s]*([0-9]{1}[\s]*){8})|([0]{1}[1-9]{1}[0-9]{2}[-\s]*([0-9]{1}[\s]*){6})|([0]{1}[1-9]{1}[0-9]{1}[-\s]*([0-9]{1}[\s]*){7})/)) {
		return "Vul een faxnummer van minimaal 10 cijfers in."; 
	}
}
OSForm.prototype.isEmail = function(obj) { // Email field
	if (!obj.value.match(/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/)) {
		return "Enter a valid e-mailaddress."; 
	}
}
OSForm.prototype.isBankaccount = function(obj) { // Bank or Giro field
	var bValid = false, nVal = obj.value.replace(/\D/g, "");
	if (nVal > 0 && nVal < 100000000 && nVal.length < 8) { // Giro (below 100.000.000)
		bValid = true;
	}
	else if (nVal.length < 11 && nVal > 100000000) { // Bank (11-proef)
		var nSum = 0;
		for (var i = 0; i < nVal.length; i++) {
			nSum += nVal.charAt(i) * (nVal.length-i);
		}
		if (nSum % 11 == 0) {
			bValid = true;
		}
	}
	if (!bValid) { 
		return "Vul een geldig rekeningnummer in."; 
	}
}
OSForm.prototype.isTNTClientNr = function(obj) { // Clientnumber field (7 digit)
	if (!obj.value.match(/^[0-9]{1,10}$/)) { 
		return "Vul een geldig TNT Post klantnummer in."; 
	}
}

OSForm.prototype.isClientNr = function(obj) {
    var res = AJAXHandler.IsClient(obj.value);
    if(!res.error){
        if(res.value.HTML != ""){
            return "U heeft een onbekend klantnummer ingevoerd. U kunt daarom geen bestelling plaatsen. Neemt u contact op met TNT Business Service, via 076-5272727.";
        }else{
            return "";
        }
    }else{
        return "Kan op dit moment niet uw klantnummer valideren.";
    }
}

OSForm.prototype.isDate = function(sDay, sMonth, sYear, bFuture, aFutureDate) { // Is it a valid (future) date?
	var bValid = false;
	var oDay   = document.getElementById(sDay);
	var oMonth = document.getElementById(sMonth);
	var oYear  = document.getElementById(sYear);
	if ((!isNaN(oDay.value) && oDay.value > 0 && oDay.value <= 31)
		&& (!isNaN(oMonth.value) && oMonth.value > 0 && oMonth.value <= 12) 
		&& (!isNaN(oYear.value) && oYear.value.length > 3)) {
		var dToday = new Date(), dDate = new Date();
		dDate.setFullYear(oYear.value, oMonth.value-1, oDay.value);
		if (aFutureDate) { dToday.setFullYear(aFutureDate[0], aFutureDate[1]-1, aFutureDate[2]); }
		// Date is valid?
		if (oDay.value == dDate.getDate()
			&& oMonth.value == dDate.getMonth()+1
			&& oYear.value == dDate.getFullYear()) {
			bValid = true;
		}
		// Date is valid future?
		if (bFuture && dToday >= dDate) {
			bValid = false;
		}
	}
	if (bFuture && !bValid) {
		return "Vul een geldige datum in de toekomst in.";
	}
	else if (!bValid) {
		return "Vul een geldige datum in.";
	}
}
OSForm.prototype.isMinimal = function(fact, minimum, errorMessage){
	var facturen = document.getElementById(fact);
                if (this.isNumeric(facturen)){
                      return this.isNumeric(facturen);
                }
                else if(facturen.value.replace(" ","") < minimum){
                      return errorMessage;
                }
}

OSForm.prototype.isDateOptional = function(sDay, sMonth, sYear, bFuture, aFutureDate) { // Is it a valid (future) date? Optionally!
	var oDay   = document.getElementById(sDay);
	var oMonth = document.getElementById(sMonth);
	var oYear  = document.getElementById(sYear);
	if (oDay.value.length > 0 || oMonth.value.length > 0 || oYear.value.length > 0) {
		return this.isDate(sDay, sMonth, sYear, bFuture, aFutureDate);
	}
}
OSForm.prototype.isMinimumDate = function(sDateYear, sDateMonth, sDateDay, sMinimumDate){
	var oDateYear   = document.getElementById(sDateYear);
	var oDateMonth   = document.getElementById(sDateMonth);
	var oDateDay   = document.getElementById(sDateDay);
	var sDate = oDateDay.Value
	
	if(isDate(oDateYear.id, oDateMonth.id, oDateDay.id)){
		
	}
	else
	{
		return "Vul een geldige geboortedatum in dd-mm-jjjj";
	}
	return sMessage;
}
OSForm.prototype.isValidDate = function(sDate, sMinimumDate){
	var sMessage = "";
	var oDate   = document.getElementById(sDate);
	var dDate = this.parseDate(oDate.value);
	var dMinimumDate = this.parseDate(sMinimumDate);
	if(!dDate || dDate < dMinimumDate){
		sMessage = "U heeft geen geldige datum opgegeven.";
	}
	return sMessage;
	
}

OSForm.prototype.isValidOptionalDate = function(sDate, sMinimumDate){
  var sMessage = "";
	var oDate   = document.getElementById(sDate);
	var dDate = this.parseDate(oDate.value);
	var dMinimumDate = this.parseDate(sMinimumDate);
	if (oDate.value.length > 0 ) {	
	if(!dDate || dDate < dMinimumDate){
		sMessage = "U heeft geen geldige datum opgegeven.";
	}
	}
	return sMessage;
}

OSForm.prototype.isValidFutureDate = function(sDateYear, sDateMonth, sDateDay, nOffsetDays){
  var sMessage = "";
	var oDateYear   = document.getElementById(sDateYear);
	var oDateMonth   = document.getElementById(sDateMonth);
	var oDateDay   = document.getElementById(sDateDay);
	var dToday = new Date();
	var dMaxDate = new Date().setDate(dToday.getDate()+nOffsetDays);
	var dDate = new Date(oDateYear.value,oDateMonth.value-1,oDateDay.value)
	if(dDate <= dToday){
		sMessage = "U kunt geen bezorgdatum invullen in het verleden.";
	}
	if(dDate > dMaxDate){
		sMessage = "U kunt geen bezorgdatum invullen verder dan 1 jaar in de toekomst.";
	}
	return sMessage;
}

function makeNLDate(sDate){
    var arrDate = new Array();
    var tDate=sDate+"";
    arrDate = tDate.split("-");
    var dDate = new Date(arrDate[2],arrDate[1]-1,arrDate[0]);
    return(dDate);
}

OSForm.prototype.isValidDateRow = function(sDateVan, sDateTot, VanOfTot, sMinimumDate){

  var sMessage = "";
	var oDateVan   = new Date(makeNLDate(document.getElementById(sDateVan).value));
	var oDateTot   = new Date(makeNLDate(document.getElementById(sDateTot).value));
	
	var dToday = new Date();
	var dMaxDate = new Date().dateAdd("yyyy", 1);
	var dDate = new Date().dateAdd("d", 1);
	
	if (document.getElementById(sDateVan).value != "" && document.getElementById(sDateTot).value != "") {
        if (VanOfTot == "van") {
            if (oDateVan < dDate) {
                sMessage = "Datum dient minimaal 2 werkdagen in de toekomst te liggen.";
            }
            if (oDateVan > dMaxDate) {
                sMessage = "U kunt geen vandatum invullen verder dan 1 jaar in de toekomst.";
            }
            if (oDateVan > oDateTot) {
                sMessage = "U kunt geen vandatum invullen die groter is dan de tot datum.";
            }
            if (sMinimumDate != "" && sMessage == "") {
                var dMinimumDate = this.parseDate(sMinimumDate);
                if (oDateVan < dMinimumDate) {
                    sMessage = "Datum dient minimaal 2 werkdagen in de toekomst te liggen.";
                }
            }
        } else {
            if (oDateTot < dDate) {
                sMessage = "Datum dient minimaal 2 werkdagen in de toekomst te liggen.";
            }
            if (oDateTot > dMaxDate) {
                sMessage = "U kunt geen totdatum invullen verder dan 1 jaar in de toekomst.";
            }
            if (oDateTot < oDateVan) {
                sMessage = "U kunt geen totdatum invullen die kleiner is dan de van datum.";
            }
            if (sMinimumDate != "" && sMessage=="") {
                var dMinimumDate = this.parseDate(sMinimumDate);
                if (oDateTot < dMinimumDate) {
                    sMessage = "Datum dient minimaal 2 werkdagen in de toekomst te liggen.";
                }
            }
        }
    } else {
	if(document.getElementById(sDateVan).value != ""){
		if (oDateVan < dDate) {
                sMessage = "Datum dient minimaal 2 werkdagen in de toekomst te liggen.";
            }
	}
	if(document.getElementById(sDateTot).value != ""){
		if (oDateTot < dDate) {
                sMessage = "Datum dient minimaal 2 werkdagen in de toekomst te liggen.";
            }
	}
        if (document.getElementById(sDateVan).value != "" && document.getElementById(sDateTot).value == "" && VanOfTot == "tot") {
            sMessage = "U moet een van en een tot datum invullen.";
        }
        if (document.getElementById(sDateVan).value == "" && document.getElementById(sDateTot).value != "" && VanOfTot == "van") {
            sMessage = "U moet een van en een tot datum invullen.";
        }
    }
	return sMessage;
}


OSForm.prototype.parseDate = function(sDate){
	arrDate = sDate.split("-");
	dtReturnDate = new Date();
	dtReturnDate = dtReturnDate.setFullYear(arrDate[2], arrDate[1] - 1, arrDate[0])
	return dtReturnDate;
}

OSForm.prototype.isRadioChecked = function(obj) { // Radio checked
	var i, bChecked = false;
	if (osform.isArray(obj)){
    for (i=0; i < obj.length; i++) { 
      if (obj[i].checked) { bChecked = true; }
    }
	}else{
    if (obj.checked) { bChecked = true; }
	}
	if (!bChecked) { return "Selection an option."; }
}

OSForm.prototype.getPakketVerzendDatum = function(sPlaceholderId, sBarcodeId, sZipcodeId){ // Get first Date for sent package
  var oBarcode = document.getElementById(sBarcodeId);
  var oZipcode = document.getElementById(sZipcodeId);
  var oPlaceholder = document.getElementById(sPlaceholderId);
  var res = null;
  if(oBarcode.value != "" && oZipcode.value != ""){
    res = AJAXHandler.GetPakketVerzendDatum(oBarcode.value, oZipcode.value);
    if(oPlaceholder.type == "text"){
      oPlaceholder.value = res.value;
    }else{
      oPlaceholder.innerHTML = res.value;
    }
  }
}

OSForm.prototype.getPakketVerzendDatumInt = function(sPlaceholderId, sBarcodeId){ // Get first Date for sent package
  var oBarcode = document.getElementById(sBarcodeId);
  var oPlaceholder = document.getElementById(sPlaceholderId);
  var res = null;
  if(oBarcode.value != ""){
    res = AJAXHandler.GetPakketVerzendDatumInt(oBarcode.value);
    if(oPlaceholder.type == "text"){
      oPlaceholder.value = res.value;
    }else{
      oPlaceholder.innerHTML = res.value;
    }
  }
}

OSForm.prototype.validationInit = function() {

	if (!window.fieldValues) { return; }
	
	var myForm = document.getElementById(this.sForm);

	if (myForm) {
		myForm.submitCatcher = function() { // Custom submit catcher
			var sKey, ofield, msg, bDoSubmit = true;
			osform.nowarn();
			// Loop through required fields
			for (sKey in window.fieldValues) {
				// Check field values
				ofield = document.getElementById(sKey);
				if (ofield 
						&& !ofield.parentNode.className.match("os-optional") 
						&& !ofield.parentNode.parentNode.className.match("os-optional") 
						&& !ofield.parentNode.parentNode.parentNode.className.match("os-optional")
						&& !ofield.parentNode.parentNode.parentNode.parentNode.className.match("os-optional")
						&& window.fieldValues[sKey] != "isRadioChecked") {
					if (window.fieldValues[sKey].match("isDate")) { // Check for date
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isBetween")) { // Check for date
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isMinimal")) { // Check for minimum
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isMinimumDate")) { // Check for minimum
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isValidDate")) { // minimum
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isValidDateRow")) { // minimum
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isValidFutureDate")) { // Check for future date
						msg = eval("osform."+window.fieldValues[sKey]);
					}	
					else { // Validate expression
					
						msg = eval("osform."+window.fieldValues[sKey]+"(ofield)");
					}
					if (msg) {
					 
						osform.warn(ofield, msg);
						bDoSubmit = false;
						try{
						ofield.focus();
						
						}catch(err){
              txt="There was an error on this page.\n\n";
              txt+="Field:" + ofield.id + "\n\n";
              txt+="Parent:" + ofield.parentNode.tagName + ":" + ((ofield.parentNode.id) ? ofield.parentNode.id : '') + "\n\n";
              txt+="Parent:" + ofield.parentNode.parentNode.tagName + ":" + ((ofield.parentNode.parentNode.id) ? ofield.parentNode.parentNode.id : '') + "\n\n";
              txt+="Error description: " + err.description + "\n\n";
              txt+="Click OK to continue.\n\n";
              alert(txt);
						}
						return false;
					}
				}
				// Check radios (need different handling)
				else if (window.fieldValues[sKey] == "isRadioChecked") {
				var oRadioGroup = eval("document."+myForm.name+"."+sKey);
					if(osform.isArray(oRadioGroup)){
            if (oRadioGroup 
                && !oRadioGroup[0].parentNode.className.match("os-optional") 
                && !oRadioGroup[0].parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup[0].parentNode.parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup[0].parentNode.parentNode.parentNode.parentNode.className.match("os-optional")) {
              msg = eval("osform.isRadioChecked(oRadioGroup)");
              if (msg) {
                osform.warn(oRadioGroup[oRadioGroup.length-1], msg);
                bDoSubmit = false;
                return false;
              }
            }
					}else if(oRadioGroup 
                && !oRadioGroup.parentNode.className.match("os-optional") 
                && !oRadioGroup.parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup.parentNode.parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup.parentNode.parentNode.parentNode.parentNode.className.match("os-optional")){
              msg = eval("osform.isRadioChecked(oRadioGroup)");
              if (msg) {
                osform.warn(oRadioGroup, msg);
                bDoSubmit = false;
                return false;
              }
					}
				}

			}
	
			// Do submit!
			if (bDoSubmit) { this.submit(); }
			
		}
		
		
		myForm.validateForm = function() { // Custom submit catcher
			var sKey, ofield, msg, bDoSubmit = true;
			osform.nowarn();
			// Loop through required fields
			for (sKey in window.fieldValues) {
				// Check field values
				ofield = document.getElementById(sKey);
				if (ofield 
						&& !ofield.parentNode.className.match("os-optional") 
						&& !ofield.parentNode.parentNode.className.match("os-optional") 
						&& !ofield.parentNode.parentNode.parentNode.className.match("os-optional")
						&& !ofield.parentNode.parentNode.parentNode.parentNode.className.match("os-optional")
						&& window.fieldValues[sKey] != "isRadioChecked") {
					if (window.fieldValues[sKey].match("isDate")) { // Check for date
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isBetween")) { // Check for date
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isMinimal")) { // Check for minimum
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isMinimumDate")) { // Check for minimum
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isValidDateRow")) { // minimum
						msg = eval("osform."+window.fieldValues[sKey]);
					}
					else if (window.fieldValues[sKey].match("isValidFutureDate")) { // Check for future date
						msg = eval("osform."+window.fieldValues[sKey]);
					}	
					else { // Validate expression
					
						msg = eval("osform."+window.fieldValues[sKey]+"(ofield)");
					}
					if (msg) {
					 
						osform.warn(ofield, msg);
						bDoSubmit = false;
						try{
						ofield.focus();
						
						}catch(err){
              txt="There was an error on this page.\n\n";
              txt+="Field:" + ofield.id + "\n\n";
              txt+="Parent:" + ofield.parentNode.tagName + ":" + ((ofield.parentNode.id) ? ofield.parentNode.id : '') + "\n\n";
              txt+="Parent:" + ofield.parentNode.parentNode.tagName + ":" + ((ofield.parentNode.parentNode.id) ? ofield.parentNode.parentNode.id : '') + "\n\n";
              txt+="Error description: " + err.description + "\n\n";
              txt+="Click OK to continue.\n\n";
              alert(txt);
						}
						return false;
					}
				}
				// Check radios (need different handling)
				else if (window.fieldValues[sKey] == "isRadioChecked") {
				var oRadioGroup = eval("document."+myForm.name+"."+sKey);
					if(osform.isArray(oRadioGroup)){
            if (oRadioGroup 
                && !oRadioGroup[0].parentNode.className.match("os-optional") 
                && !oRadioGroup[0].parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup[0].parentNode.parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup[0].parentNode.parentNode.parentNode.parentNode.className.match("os-optional")) {
              msg = eval("osform.isRadioChecked(oRadioGroup)");
              if (msg) {
                osform.warn(oRadioGroup[oRadioGroup.length-1], msg);
                bDoSubmit = false;
                return false;
              }
            }
					}else if(oRadioGroup 
                && !oRadioGroup.parentNode.className.match("os-optional") 
                && !oRadioGroup.parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup.parentNode.parentNode.parentNode.className.match("os-optional")
                && !oRadioGroup.parentNode.parentNode.parentNode.parentNode.className.match("os-optional")){
              msg = eval("osform.isRadioChecked(oRadioGroup)");
              if (msg) {
                osform.warn(oRadioGroup, msg);
                bDoSubmit = false;
                return false;
              }
					}
				}

			}	
		}
	}

}

// Form validation warning
OSForm.prototype.createWarning = function() {

	var oBody = document.getElementsByTagName("body")[0];
	var oWarning = document.createElement("div");
	oWarning.id = "os-form-warning";
	var oWarningContainer = document.createElement("div");
	oWarningContainer.id = "os-form-warning-container";
	var oWarningArrow = document.createElement("span");
	oWarningArrow.id = "os-form-warning-arrow";
	var oWarningText = document.createTextNode("Warning: ");
	var oWarningMsg = document.createElement("span");
	oWarningMsg.id = "os-form-warning-msg";
	
	// Construct messagenode
	oWarningContainer.appendChild(oWarningArrow);
	oWarningContainer.appendChild(oWarningText);
	oWarningContainer.appendChild(oWarningMsg);
	oWarning.appendChild(oWarningContainer)
	oWarning._status = null;
	
	if(document.all){ // IE only iframe
		var oWarningIFrame = document.createElement("iframe");
		oWarningIFrame.id = "os-form-warning-iframe";	
		oWarningIFrame.frameBorder = 0;
		oWarningIFrame.scrolling = "no";
		//oWarningIFrame.src = "javascript:false;";
		oWarningIFrame.src = "about:blank";
		oWarning.appendChild(oWarningIFrame);		
	}
	
	// Append to body
	oBody.appendChild(oWarning);

}
OSForm.prototype.warn = function(obj, msg) {
	
	var oWarning = document.getElementById("os-form-warning");
	if (oWarning && !oWarning._status) {
		var oWarningMsg = document.getElementById("os-form-warning-msg");
		var oWarningX   = calculateLeft(obj), oWarningY = calculateTop(obj) + 19;
		oWarning.style.left = oWarningX+"px";
		oWarning.style.top  = oWarningY+"px";
		oWarningMsg.innerHTML = msg;
		oWarning.style.display = "block";
		oWarning._status = "showing";
		setTimeout("window.osform.nowarn()", 5000); // Remove warning after x milliseconds
	}

}
OSForm.prototype.nowarn = function() {

	var oWarning = document.getElementById("os-form-warning");
	if (oWarning) { 
		oWarning.style.display = "none"; 
		oWarning._status = null;
	}

}

// Fetches the postcode info (streetname/placename)
OSForm.prototype.fetchPostcodeInfo = function(pc, hnr, straat, woonplaats) {
	var oForm = document.getElementById(this.sForm);
	if (oForm) {
		var oPC     = document.getElementById(pc);
		var oHnr    = document.getElementById(hnr);
		var oStraat = document.getElementById(straat);
		var oPlaats = document.getElementById(woonplaats);
		
		if ( oPC.value.match("^[1-9]{1}[0-9]{3} ?[A-Za-z]{2}$")  
					&& oHnr.value.length > 0 ) {
					
			
			var res = Postalcode.Search(oPC.value, oHnr.value, "", "");
			if(res.value != null)
			{
        if(res.value.addresses.length > 0){
          var address = res.value.addresses[0];
          if(oStraat)
              oStraat.value = address.straatnaam;
          if(oPlaats)
              oPlaats.value = address.woonplaats;
        }
      }
		}
	}
}


function dateAddExtention(p_Interval, p_Number){


   var thing = new String();
   
   
   //in the spirt of VB we'll make this function non-case sensitive
   //and convert the charcters for the coder.
   p_Interval = p_Interval.toLowerCase();
   
   if(isNaN(p_Number)){
   
      //Only accpets numbers 
      //throws an error so that the coder can see why he effed up   
      throw "The second parameter must be a number. \n You passed: " + p_Number;
      return false;
   }

   p_Number = new Number(p_Number);
   switch(p_Interval.toLowerCase()){
      case "yyyy": {// year
         this.setFullYear(this.getFullYear() + p_Number);
         break;
      }
      case "q": {      // quarter
         this.setMonth(this.getMonth() + (p_Number*3));
         break;
      }
      case "m": {      // month
         this.setMonth(this.getMonth() + p_Number);
         break;
      }
      case "y":      // day of year
      case "d":      // day
      case "w": {      // weekday
         this.setDate(this.getDate() + p_Number);
         break;
      }
      case "ww": {   // week of year
         this.setDate(this.getDate() + (p_Number*7));
         break;
      }
      case "h": {      // hour
         this.setHours(this.getHours() + p_Number);
         break;
      }
      case "n": {      // minute
         this.setMinutes(this.getMinutes() + p_Number);
         break;
      }
      case "s": {      // second
         this.setSeconds(this.getSeconds() + p_Number);
         break;
      }
      case "ms": {      // second
         this.setMilliseconds(this.getMilliseconds() + p_Number);
         break;
      }
      default: {
      
         //throws an error so that the coder can see why he effed up and
         //a list of elegible letters.
         throw   "The first parameter must be a string from this list: \n" +
               "yyyy, q, m, y, d, w, ww, h, n, s, or ms.  You passed: " + p_Interval;
         return false;
      }
   }
   return this;
}
Date.prototype.dateAdd = dateAddExtention;
