/* MW 2003-07-11 - form validation functions */
/*customised for Real Nappy database - BG 21 Jan 05 - added requireLong*/

function complain(fieldId, message, focus) {
	alert(message);

	if(focus) {
		try {
			document.getElementById(fieldId).focus();
		} catch(e) {
			// Ah well, that's a shame, isn't it?
		}
	}
}

function requireIntOrBlank(fieldId, message) {
	var field = document.getElementById(fieldId);
	var value = field.value;
	if(value.length == 0) { return true; }
	if (!(/^ *[0-9]+ *$/).test(value)) {
		complain(fieldId, message,true);
		return false;
	}
	return true;
}

function requireInteger(fieldId, message) {
	var field = document.getElementById(fieldId);
	if (!(/^ *[0-9]+ *$/).test(field.value)) {
		complain(fieldId, message,true);
		return false;
	}
	return true;
}

function requireIntNonZero(fieldId, message) {
	var field = document.getElementById(fieldId);

	// check integer
	//   note - can't just call requireInteger, as IE has a bug
	//          in it, and doing that causes it to think the call
	//          returned true! How muppet is that...
	var isint = false;
	if (!(/^ *[0-9]+ *$/).test(field.value)) {
		complain(fieldId, message, false);
		return false;
	} else {
		isint = true;
	}

	if(isint) {
		// Now check value
		var text = field.value;
		if(text > 0) {
			return true;
		}
	}

	// failed non zero check
	complain(fieldId, message, false);
	return false;
}

function requireShort(fieldId, message, length) {
	var field = document.getElementById(fieldId);
	var text = field.value;
	if(text.length > length) {
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requireLong(fieldId, message, length) {
	var field = document.getElementById(fieldId);
	var text = field.value;
	if(text.length < length ) {
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requireMoney(fieldId, message) {
	var field = document.getElementById(fieldId);
	if (!(/^ *[0-9]+(\.[0-9][0-9])? *$/).test(field.value)) {
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requireNonEmpty(fieldId, message) {
	var field = document.getElementById(fieldId);
	if (field.value == '') {
		complain(fieldId, message, true);
		return false;
	}
	if ((/^ /).test(field.value)) {
		complain(fieldId,message+ ". Also, must not begin with a space.",true);
		return false;
	}
	return true;
}

function requireDate(fieldId, message) {
	/* does not check valid-looking dates for correctness - that's handled by <ui:date> */
	var field = document.getElementById(fieldId);
	if (!(/^[0-9]{4}-[0-9]{2}-[0-9]{2}$/).test(field.value)) {
		complain(fieldId, message, false);
		return false;
	}
	return true;
}

/* Does equal or later */
function requireDateLater(earlyFieldId,lateFieldId,message) {
	/* does not check valid-looking dates for correctness - that's handled by <ui:date> */
	var early = document.getElementById(earlyFieldId).value;
	var late = document.getElementById(lateFieldId).value;

	/* Strip any timestamps */
	var early_ts = early.indexOf(" 00:00:00");
	if(early_ts > 0) {
		early = early.substring(0,early_ts);
	}
	var late_ts = late.indexOf(" 00:00:00");
	if(late_ts > 0) {
		late = late.substring(0,late_ts);
	}

	var isLater = (early <= late);

	if(isLater) {
		return true;
	}

	complain(earlyFieldId,message,false);

	return false;
}


function requirePostcode(fieldId, message, norecurse) {
	var field = document.getElementById(fieldId);
	if (!(/^ *[a-zA-Z]([a-zA-Z]?[0-9]{1,2}|[0-9][a-zA-Z]|[a-zA-Z][0-9][a-zA-Z]) [0-9][a-bd-hjlnp-uw-zA-BD-HJLNP-UW-Z]{2} *$/).test(field.value)) {
		if(norecurse == null) {
			// If we can find the middle and split it, do so
			if ((/^[a-zA-Z][0-9][0-9][a-zA-Z]/).test(field.value)) {
				var fv = field.value.substring(0,2) + " " + field.value.substring(2,field.value.length);
				field.value = fv;
				return requirePostcode(fieldId,message,true);
			}
			if ((/^[a-zA-Z][0-9][0-9][0-9][a-zA-Z]/).test(field.value)) {
				var fv = field.value.substring(0,3) + " " + field.value.substring(3);
				field.value = fv;
				return requirePostcode(fieldId,message,true);
			}
			if ((/^[a-zA-Z][a-zA-Z][0-9][0-9][a-zA-Z]/).test(field.value)) {
				var fv = field.value.substring(0,3) + " " + field.value.substring(3,field.value.length);
				field.value = fv;
				return requirePostcode(fieldId,message,true);
			}
			if ((/^[a-zA-Z][a-zA-Z][0-9][0-9][0-9][a-zA-Z]/).test(field.value)) {
				var fv = field.value.substring(0,4) + " " + field.value.substring(4);
				field.value = fv;
				return requirePostcode(fieldId,message,true);
			}
		}

		// Oh well, complain
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requirePhoneNumber(fieldId, message, allowBlank) {
	var field = document.getElementById(fieldId);
	if(allowBlank && field.value.length == 0) { return true; }
	if (!(/^ *(\+[0-9]+)? ?[0-9 ext]+ *$/).test(field.value)) {
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requireEmail(fieldId, message, allowBlank) {
	var field = document.getElementById(fieldId);
	if(allowBlank && field.value.length == 0) { return true; }
	if (!(/^([a-zA-Z0-9-_\+]+\.)*[a-zA-Z0-9-_\+]+@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]+$/).test(field.value)) {
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requireEndsWith(fieldId,value,message) {
	var field = document.getElementById(fieldId);
	var fval = field.value.toLowerCase();
	var cval = value.toLowerCase();
	var cfval = fval.substring(fval.length-cval.length,fval.length);
	if(cfval == cval) {
		return true;
	} else {
		complain(fieldId, message, true);
		return false;
	}
}

function requireNotEquals(fieldId,value,message) {
	var field = document.getElementById(fieldId);
	if(field.value == value) {
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requireFieldsEqual(fieldIdA,fieldIdB,message) {
	var field_a = document.getElementById(fieldIdA);
	var field_b = document.getElementById(fieldIdB);
	if(field_a.value == field_b.value) {
		return true;
	} else {
		complain(fieldIdA, message, true);
		return false;
	}
}

function requirePositiveNumber(fieldId, message) {
	var field = document.getElementById(fieldId);
	if (!(/^([0-9]+|[0-9]*\.[0-9]+)$/).test(field.value)) {
		complain(fieldId, message, true);
		return false;
	}
	return true;
}

function requireIntInRange(fieldId,lower,upper,optional,message) {
	var field = document.getElementById(fieldId);
	if(optional) {
		if(field.value.length == 0) {
			return true;
		}
	}
	if (!(/^([0-9]+|[0-9]*\.[0-9]+)$/).test(field.value)) {
		complain(fieldId, message, true);
		return false;
	}
	if( field.value < lower ) {
		complain(fieldId, message+". Must be between "+lower+" and "+upper, true);
		return false;
	}
	if( field.value > upper ) {
		complain(fieldId, message+". Must be between "+lower+" and "+upper, true);
		return false;
	}
	return true;
}

function triggerDateValidation() {
	// This function finds all date elements, and triggers their
	//  validation routines, which might not have occured if the user
	//  hit enter when in a date field

	var ret = true;

	var inputs = document.getElementsByTagName("input");
	for(var i=0; i<inputs.length; i++) {
		if(inputs[i].getAttribute("name") == 'isADateField' ) {
			var date = document.getElementById(inputs[i].value);
			dateBlur(inputs[i].value);
			if(date.value == 'invalid') {
				// date blur found an error
				ret = false;
			}
		}
	}
	return ret;
}

function stripPoundSign(id) {
	var oldval = document.getElementById(id).value;
	var newval = oldval.replace(/^\xA3/,'');
	document.getElementById(id).value = newval;
}

//require a checkbox
function requireChecked(id, message) {
	if(document.getElementById(id).checked != true){
			complain(id, message, true);
			return false;
	}
	return true;
}

//require a number (with the option of having the field empty)
function requireNumber(fieldId, message, allowBlank){
	var field = document.getElementById(fieldId);
	if(allowBlank && field.value.length == 0) {
		return true;
	}
	if ((!allowBlank) && (field.value.length == 0)){
		complain(fieldId, message,true);
		return false;
	}
	if (isNaN(field.value)){
		complain(fieldId, message,true);
		return false;
	}
	return true;
}

//require alphanumeric characters and spaces only
function requireAlphanumeric(fieldId, message, allowBlank){
	var field = document.getElementById(fieldId);
	if(allowBlank && field.value.length == 0) {
		return true;
	}
	if ((!allowBlank) && (field.value.length == 0)){
		complain(fieldId, message,true);
		return false;
	}
	if ( /[^a-zA-Z0-9\s]/.test(field.value) ){
		complain(fieldId, message,true);
		return false;
	}
	return true;
}

//for a select box, require at least one option with a non-empty value to be selected
function requireSelected(fieldId, message) {
	var field = document.getElementById(fieldId);
	for (var i = 0; i < field.options.length; i++) {
		if (field.options[i].selected && field.options[i].value != '') {
			return true;
		}
	}
	complain(fieldId, message,true);
	return false;
}
// Require at least one checkbox / radio button with the specified name to be checked
function requireOneChecked(fieldName, message) {
	var fields = document.getElementsByTagName('INPUT');
	for (var i = 0; i < fields.length; i++) {
		if (fields[i].name == fieldName && fields[i].checked) {
			return true;
		}
	}
	complain(null, message, false);
	return false;
}

