// Verify the form and it's types
function verify(form) {
	var element;
	var pattern;
	var element_type;
	var element_id;
	var element_required;
	var password;
	var fromdate;
	var minimum;
	var tr;
	var incorrect_pattern;
	var field_error;
	var error = false;
	
	// Find the elements of this form	
	for(i = 0; i < form.length; i++) {
		// It should not be hidden, disabled, reset or a submit
		if(form[i].type != "button" && 
				form[i].type != "submit" && 
				form[i].type != "reset" && 
				form[i].disabled != true &&
				form[i].type != "select-one" &&
				form[i].type != "radio" &&
				form[i].type != "checkbox" &&
				form[i].type != "hidden") {
			field_error = false;
			element = form[i];
			// Correct id pattern
			element_ids = element.id.split('_');
			if(element_ids.length != 3)
				continue;
			element_type = element_ids[0];
			element_id = element_ids[1];
			element_required = element_ids[2];

			// What pattern should this element match?
			pattern = new RegExp(getPattern(element_type));
			incorrect_pattern = !pattern.test(element.value);
			
			// Special check for password
			if(element_id == 'password') {
				password = element;
			}
			if(element_id == 'password2') {
				if(element.value != password.value)
					field_error = true;
			}
			
			// Special check for email
			if(element_id == 'firstemail') {
				firstemail = element;
			}
			if(element_id == 'secondemail') {
				if(element.value != firstemail.value)
					field_error = true;
			}
			
			// Special check for from-till dates
			if(element_id == 'fromdate') {
				fromdate = element;
			}
			if(element_id == 'tilldate') {
				from = fromdate.value.split("-");
				from = from[2] + from[1] + from[0];
				till = element.value.split("-");
				till = till[2] + till[1] + till[0];
				if(till < from)
					field_error = true;
			}
			
			// Special check for minimum and maximum
			if(element_id == 'minimum') {
				minimum = element;
			}
			if(element_id == 'maximum') {
				if(parseFloat(element.value) < parseFloat(minimum.value))
					field_error = true;
			}		
			
			// Special check for dates
			if(element_type == 'date' && element.value == "DD-MM-JJJJ")
				incorrect_pattern = false;
			if(element_type == 'date' && !incorrect_pattern) {
				// If date is required, it should be checked
				if(element_required == '1') 
					incorrect_pattern = !isValidDate(element.value, "DMY");
				// If it is not empty or not "DD-MM-JJJJ", it should be checked
				else if(replaceAll(" ", "", element.value) != "" && element.value != "DD-MM-JJJJ")
					incorrect_pattern = !isValidDate(element.value, "DMY");
				// Otherwise it is allowed to contain "DD-MM-JJJJ"
				else
					incorrect_pattern = false;
			}
			
			// If this is a required field, it may not be empty and match the pattern
			if(element_required == '1' && replaceAll(" ", "", element.value) == "") {
				field_error = true;
			}
			// If this field is required, it should match the pattern
			if(element_required == '1' && incorrect_pattern) {
				field_error = true;
			}
			// If a field is not empty, it should match the pattern
			if(replaceAll(" ", "", element.value) != "" && incorrect_pattern) {
				field_error = true;
			}
			if (element.type == "hidden" && element_required != '1') {
				field_error = false;
			}
			
			if (element_type == "check" && element_required == "1") {
				field_error = !checkCheckBoxes(element_id);
			}

			// Error in this field?
			if(field_error) {
				tr = document.getElementById("tr_"+element_id);
				if(tr) tr.className = "inputerror";
				error = true;
			}
			// No error, so reset the previous error fields
			else {
				tr = document.getElementById("tr_"+element_id);
				if(tr) tr.className = "";
			}
		}	
	}
	
	if(error) {
		return false;
	}
	
	// Tell the form it is submitted
	if(form.add) form.add.value = 1;
	if(form.update) form.update.value = 1;
	// Disable buttons
	if(form.submit && form.submit.value != undefined) form.submit.disabled = true;
	if(form.reset && form.reset.value != undefined) form.reset.disabled = true;
	if(form.back && form.back.value != undefined) form.back.disabled = true;
	return true;
}

function alert_remove() {
	return confirm("Weet u zeker dat u deze wilt verwijderen?");
}

function getPattern(type) {
	var pattern = "";
	
	if(type == 'none')
		pattern = '^.{0}$';
		
	else if(type == 'text')
		pattern = '^.*$';
		
	else if(type == 'integer')
		pattern = '(^-?[0-9]+$)';
		
	else if(type == 'unsignedinteger')
		pattern = '(^[0-9]+$)';
		
	else if(type == 'double')
		pattern = '(^-?([0-9]+)(\\.[0-9]+)?$)';
		
	else if(type == 'unsigneddouble')
		pattern = '(^[0-9]+(\\.[0-9]+)?$)';
		
		else if(type == 'price')
		pattern = '(^-?([0-9]*)((\\.|,)[0-9]{1,2})?$)';
		
	else if(type == 'unsignedprice')
		pattern = '(^([0-9]*)((	\\.|,)[0-9]{1,2})?$)';
		
	else if(type == 'email')
		pattern = '^([a-zA-Z0-9_\\.\-])+\@(([a-zA-Z0-9\-])+\\.)+([a-zA-Z0-9]{2,4})$';
		
	else if(type == 'emails')
		pattern = '^(([a-zA-Z0-9_\\.\-])+\@(([a-zA-Z0-9\-])+\\.)+([a-zA-Z0-9]{2,4})\\s*(,|;)?\\s*)+$';
		
	else if(type == 'zipcode')
		pattern = '(^[0-9]{4}\\s?[a-zA-Z]{2}$)';
		
	else if(type == 'phone')
		pattern = '(^0[1-9][0-9]{0,2}-?[1-9][0-9]{5,7}$)';
		
	else if(type == 'banknumber')
		pattern = '(^[0-9]{6,10}$)';
		
	else if(type == 'date')
		pattern = '^[0-9]{1,2}(\-|\/|\\.)[0-9]{1,2}(\-|\/|\\.)[0-9]{4}$';
		
	else if(type == 'time')
		pattern = '^[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}$';
		
	else if(type == 'url')
		pattern = '^http(s)?:\/\/[_0-9a-zA-Z\-.]+[_0-9a-z-]{2,3}([\/][_0-9a-zA-Z\-\.]*)*(\\?[_0-9a-zA-Z]+[\=][_0-9a-zA-Z]*([&][_0-9a-zA-Z]+[\=][_0-9a-zA-Z]*)*)?$';
		
	else
		pattern = '^.{0}$';
		
	return pattern;
}

function percen(form) {
	if(form.korting_dagen) {
		form.korting_dagen.disabled = true;
		document.getElementById("div_dagen").style.visibility = 'hidden';
		form.korting_percentage.value = document.form.korting_dagen.value;
		form.korting_dagen.value = '';
		form.korting_percentage.disabled = false;
		document.getElementById("div_percentage").style.visibility = 'visible';
		form.korting_percentage.focus();
		
		// Clear errors
		document.getElementById("tr_percentage").className = '';
		document.getElementById("tr_dagen").className = '';
	}
	if(form.korting_personen) {
		form.korting_personen.disabled = true;
		document.getElementById("div_personen").style.visibility = 'hidden';
		form.korting_percentage.value = document.form.korting_personen.value;
		form.korting_personen.value = '';
		form.korting_percentage.disabled = false;
		document.getElementById("div_percentage").style.visibility = 'visible';
		form.korting_percentage.focus();
		
		// Clear errors
		document.getElementById("tr_percentage").className = '';
		document.getElementById("tr_personen").className = '';
	}
}

function dag(form) {
	form.korting_percentage.disabled = true;
	document.getElementById("div_percentage").style.visibility = 'hidden';
	form.korting_dagen.value = Math.floor(document.form.korting_percentage.value);
	form.korting_percentage.value = '';
	form.korting_dagen.disabled = false;
	document.getElementById("div_dagen").style.visibility = 'visible';
	form.korting_dagen.focus();
	
	// Clear errors
	document.getElementById("tr_percentage").className = '';
	document.getElementById("tr_dagen").className = '';
}

function persoon(form) {
	form.korting_percentage.disabled = true;
	document.getElementById("div_percentage").style.visibility = 'hidden';
	form.korting_personen.value = Math.floor(document.form.korting_percentage.value);
	form.korting_percentage.value = '';
	form.korting_personen.disabled = false;
	document.getElementById("div_personen").style.visibility = 'visible';
	form.korting_personen.focus();
	
	// Clear errors
	document.getElementById("tr_percentage").className = '';
	document.getElementById("tr_personen").className = '';
}

/*
 * The problem with the code above is that it has a hard coded reference to
 * forms[0], so it will not work when the input you want to set the focus to 
 * is not within the first form. For example, a complex page might contain 
 * several forms for various purposes. My final solution was to use a nested 
 * loop that loops through all forms until it finds an input that is not 
 * hidden and not disabled. The code below has been tested in Internet 
 * Explorer 6.0 and Mozilla Firefox 1.0.4:
 *
 */
var bFound = false;

// for each form
for (f=0; f < document.forms.length; f++) {
	// for each element in each form
	for(i=0; i < document.forms[f].length; i++) {
		// if it's not a hidden element
		if (document.forms[f][i].type != "hidden") {
			// and it's not disabled
			if (document.forms[f][i].disabled != true) {
				// and it's a textfield
				if( document.forms[f][i].type == "text" || document.forms[f][i].type == "password") {
					// set the focus to it
					document.forms[f][i].focus();
					var bFound = true;
				}
			}
		}
		// if found in this element, stop looking
		if (bFound == true)
			break;
	}
	// if found in this form, stop looking
	if (bFound == true)
		break;
}

function isValidDate(dateStr, format) {
	if (format == null) { format = "MDY"; }
	format = format.toUpperCase();
	if (format.length != 3) { format = "MDY"; }
	if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || (format.indexOf("Y") == -1) ) { format = "MDY"; }
	if (format.substring(0, 1) == "Y") { // If the year is first
		var reg1 = /^\d{4}(\-|\/|\.)\d{2}\1\d{2}$/
		var reg2 = /^\d{4}(\-|\/|\.)\d{2}\1\d{2}$/
	} else if (format.substring(1, 2) == "Y") { // If the year is second
		var reg1 = /^\d{2}(\-|\/|\.)\d{4}\1\d{2}$/
		var reg2 = /^\d{2}(\-|\/|\.)\d{4}\1\d{2}$/
	} else { // The year must be third
		var reg1 = /^\d{2}(\-|\/|\.)\d{2}\1\d{4}$/
		var reg2 = /^\d{2}(\-|\/|\.)\d{2}\1\d{4}$/
	}
	// If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
	if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
	var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
	// Check to see if the 3 parts end up making a valid date
	if (format.substring(0, 1) == "M") { var mm = parts[0]; } 
	else if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; }
	if (format.substring(0, 1) == "D") { var dd = parts[0]; } 
	else if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; }
	if (format.substring(0, 1) == "Y") { var yy = parts[0]; } 
	else if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; }
	if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
	if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
	var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
	if (parseFloat(dd) != dt.getDate()) { return false; }
	if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
	return true;
}

// Een exact nummer in een invulveld
// onblur="extractNumber(this,0,false);" onkeyup="extractNumber(this,0,false);" onkeypress="return blockNonNumbers(this, event, false, false);"
function extractNumber(obj, decimalPlaces, allowNegative)
{
	var temp = obj.value;
	
	// avoid changing things if already formatted correctly
	var reg0Str = '[0-9]*';
	if (decimalPlaces > 0) {
		reg0Str += '\\.?[0-9]{0,' + decimalPlaces + '}';
	} else if (decimalPlaces < 0) {
		reg0Str += '\\.?[0-9]*';
	}
	reg0Str = allowNegative ? '^-?' + reg0Str : '^' + reg0Str;
	reg0Str = reg0Str + '$';
	var reg0 = new RegExp(reg0Str);
	if (reg0.test(temp)) return true;

	// first replace all non numbers
	var reg1Str = '[^0-9' + (decimalPlaces != 0 ? '.' : '') + (allowNegative ? '-' : '') + ']';
	var reg1 = new RegExp(reg1Str, 'g');
	temp = temp.replace(reg1, '');

	if (allowNegative) {
		// replace extra negative
		var hasNegative = temp.length > 0 && temp.charAt(0) == '-';
		var reg2 = /-/g;
		temp = temp.replace(reg2, '');
		if (hasNegative) temp = '-' + temp;
	}
	
	if (decimalPlaces != 0) {
		var reg3 = /\./g;
		var reg3Array = reg3.exec(temp);
		if (reg3Array != null) {
			// keep only first occurrence of .
			//  and the number of places specified by decimalPlaces or the entire string if decimalPlaces < 0
			var reg3Right = temp.substring(reg3Array.index + reg3Array[0].length);
			reg3Right = reg3Right.replace(reg3, '');
			reg3Right = decimalPlaces > 0 ? reg3Right.substring(0, decimalPlaces) : reg3Right;
			temp = temp.substring(0,reg3Array.index) + '.' + reg3Right;
		}
	}
	
	obj.value = temp;
}
function blockNonNumbers(obj, e, allowDecimal, allowNegative)
{
	var key;
	var isCtrl = false;
	var keychar;
	var reg;
		
	if(window.event) {
		key = e.keyCode;
		isCtrl = window.event.ctrlKey
	}
	else if(e.which) {
		key = e.which;
		isCtrl = e.ctrlKey;
	}
	
	if (isNaN(key)) return true;
	
	keychar = String.fromCharCode(key);
	
	// check for backspace or delete, or if Ctrl was pressed [or ENTER]
	if (key == 8 || isCtrl || key == 13)
	{
		return true;
	}

	reg = /\d/;
	var isFirstN = allowNegative ? keychar == '-' && obj.value.indexOf('-') == -1 : false;
	var isFirstD = allowDecimal ? keychar == '.' && obj.value.indexOf('.') == -1 : false;
	
	return isFirstN || isFirstD || reg.test(keychar);
}

function replaceAll(findStr,repStr,oldStr) {
	var srchNdx = 0;	// srchNdx will keep track of where in the whole line
						// of oldStr are we searching.
	var newStr = "";	// newStr will hold the altered version of oldStr.
	while (oldStr.indexOf(findStr,srchNdx) != -1) {
		// As long as there are strings to replace, this loop
		// will run. 
		newStr += oldStr.substring(srchNdx,oldStr.indexOf(findStr,srchNdx));
		// Put it all the unaltered text from one findStr to
		// the next findStr into newStr.
		newStr += repStr;
		// Instead of putting the old string, put in the
		// new string instead. 
		srchNdx = (oldStr.indexOf(findStr,srchNdx) + findStr.length);
		// Now jump to the next chunk of text till the next findStr.           
	}
	newStr += oldStr.substring(srchNdx,oldStr.length);
	// Put whatever's left into newStr.             
	return newStr;
}
