<!-- Check whether entry is mpn -->
function isMPN ( mpn ) {

	for ( var i=0; i < mpn.length; i++ ) {
		if ( mpn.charAt(i) != " " && mpn.charAt(i) != "0" ) {
			if ( !parseFloat( mpn.charAt(i) ) ) {
				return false;
			}
		}
	}
	return true;
}


<!-- Check whether entry is valid email -->
function isEmail ( email ) {

	if ( email == "" ) return true;
	for ( var i=0; i < email.length; i++ ) {
		if ( email.charAt(i) == "@" ) {
			return true;
		}
	}
	return false;
}


<!-- Check whether entry is valid date -->
function isADate( year, month, day ) {
	if ( !( day =="" && month ==""  && year=="" ) ) {
		if ( !parseFloat( day ) || day > 31 ) return false;
		if ( !parseFloat( month ) || month > 12 ) return false;
		if ( !parseFloat( year ) || year < 1900 ) return false;
	}
	return true;
}


<!--View datatype details in target frame  -->
function viewDetails( selectOpt, datatype, target ) {

	var url = ""
	if ( datatype == "member" ) url += "members?memberMPN=";
	if ( datatype == "group" ) url += "groups?groupID=";
	url += selectOpt.options[selectOpt.selectedIndex].value;
	url += "&sessionID=" + document.forms[0].elements["sessionID"].value;

	top.frames[target].document.location.href = url;
}


<!-- Auto tab to next field -->
var isNN = (navigator.appName.indexOf("Netscape")!=-1);
function autoTab(input,len, e) {
	var keyCode = (isNN) ? e.which : e.keyCode; 
	var filter = (isNN) ? [0,8,9] : [0,8,9,16,17,18,37,38,39,40,46];
	if(input.value.length >= len && !containsElement(filter,keyCode)) {
		input.value = input.value.slice(0, len);
		input.form[(getIndex(input)+1) % input.form.length].focus();
	}

	function containsElement(arr, ele) {
		var found = false, index = 0;
		while(!found && index < arr.length)
		if(arr[index] == ele) found = true;
		else index++;
		return found;
	}
	function getIndex(input) {
		var index = -1, i = 0, found = false;
		while (i < input.form.length && index == -1)
		if (input.form[i] == input) index = i;
		else i++;
		return index;
	}
	return true;
}


function getValueString( selectbox ) {

	var mpnstring = "";
	for (i = 0; i < selectbox.options.length; i++) {
		mpnstring += selectbox.options[i].value + "|";
	}
	return mpnstring;
}

<!-- Move values between select boxes -->
function move(fbox, tbox) {

	var arrFbox = new Array();
	var arrTbox = new Array();
	var arrLookup = new Array();
	var i;

	for (i = 0; i < tbox.options.length; i++) {
		arrLookup[tbox.options[i].text] = tbox.options[i].value;
		arrTbox[i] = tbox.options[i].text;
	}

	var fLength = 0;
	var tLength = arrTbox.length;

	for(i = 0; i < fbox.options.length; i++) {
		arrLookup[fbox.options[i].text] = fbox.options[i].value;
		if (fbox.options[i].selected && fbox.options[i].value != "") {
			arrTbox[tLength] = fbox.options[i].text;
			tLength++;
		}
		else {
			arrFbox[fLength] = fbox.options[i].text;
			fLength++;
		 }
	}

	arrFbox.sort();
	arrTbox.sort();
	fbox.length = 0;
	tbox.length = 0;
	var c;

	for(c = 0; c < arrFbox.length; c++) {
		var no = new Option();
		no.value = arrLookup[arrFbox[c]];
		no.text = arrFbox[c];
		fbox[c] = no;
	}

	for(c = 0; c < arrTbox.length; c++) {
		var no = new Option();
		no.value = arrLookup[arrTbox[c]];
		no.text = arrTbox[c];
		tbox[c] = no;
	}
}


<!-- Selects or de-selects all options in select -->
function selectOptions( selectbox, selectvalue ) {

	
	for (i = 0; i < selectbox.options.length; i++) {
		selectbox.options[i].selected = selectvalue;
	}
}


<!-- Update count for message up to 160 characters -->
function textCounter(field, countfield, maxlimit) {
	if (field.value.length > maxlimit) // if too long...trim it!
		field.value = field.value.substring(0, maxlimit);
	// otherwise, update 'characters left' counter
	else 
		countfield.value = maxlimit - field.value.length;
}


/* validation.js - Version 1.0 - Copyright BestTech Ltd	*/
/* slight modifications to error messages - 28-FEB-04 - DGE*/
function blank( str )
{
	if ( (str == null) || (str == "") )
		return true;

	for ( var i=0;i<str.length;i++ )
	{
		var c = str.charAt( i );
		if ( ( c != ' ' ) && ( c != '\n' ) && (c != '\t' ) )
			return false;
	}
	return true;
}
function validChrs( val, allowed )
{
	for ( var i=0;i<val.length;i++ )
	{
		var c = val.charAt(i);
		if ( allowed.indexOf( c ) == -1 )
			return false;
	}
	return true;
}
function isDigits( val )
{
	return validChrs( val, "1234567890" );
}
function isASCII( val )
{
	for ( var i=0;i<val.length;i++ )
	{
		// Allow pound signs as well.
		if ( val.charAt(i) != "£" ) {
			var c = val.charCodeAt(i);
			if ( c < 32 || c > 126 )
				return false;
		}
	}
	return true;
}
function validID( val ) // blank never allowed, 1-20 characters in length, letters, numbers, and underscores.
{
	if ( blank(val) )
		return true;	// Blank values picked up in mandatory check rather than here.
	if ( val.length > 20 )
		return false;
	if ( !validChrs(val, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_") )
		return false;
	return true;
}
function validName( val )
{
	if ( blank(val) )
		return true;	// Blank values picked up in mandatory check rather than here.  Apostrophe's allowed for O'Hara type names
	if ( !validChrs(val, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_ '()/-") )
		return false;
	return true;
}
function validSender( val )
{
	if ( blank(val) )
		return true;	// Blank values picked up in mandatory check rather than here.
	if ( !validChrs(val, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890_") )
		return false;
	return true;
}
function validInt( val, min, max )
{
	if ( (parseInt(val,10) < min) || (parseInt(val,10) > max) )
		return false;
	return validChrs(val, "1234567890");
}
function validPayment( val )
{
	if ( !validChrs(val, "1234567890.") )
		return false;
	return parseFloat(val) >= 5;

}
function validEmailAddress( val )
{
	var supported = 0;
	//alert('hello Blag2!');

	if (window.RegExp)
	{
		var tempStr = "a";
		var tempReg = new RegExp(tempStr);
		if (tempReg.test(tempStr)) supported = 1;
	}
	if (!supported)
	{
		return ( val.indexOf(".") > 2 ) && ( val.indexOf("@") > 0 )  && ( val.indexOf(" ") > 0 );
	}
	var emailPat=/^(.+)@(.+)$/;
	var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
	var validChars="\[^\\s" + specialChars + "\]";
	var quotedUser="(\"[^\"]*\")";
	var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;
	var atom=validChars + '+';
	var word="(" + atom + "|" + quotedUser + ")";
	var userPat=new RegExp("^" + word + "(\\." + word + ")*$");
	var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");
	var matchArray=val.match(emailPat);
	if (matchArray==null)
	{
		return false;
	}
	var user=matchArray[1];
	var domain=matchArray[2];
	if (user.match(userPat)==null)
	{
		return false;
	}
	var IPArray=domain.match(ipDomainPat);
	if (IPArray!=null)
	{
		for (var i=0;i<4;i++)
		{
			if ( ( IPArray[i] >= 255 ) || ( IPArray[i] <= 0 ) )
			{
				return false;
			}
		}
		return true;
	}
	var domainArray=domain.match(domainPat);
	if (domainArray==null)
	{
		return false;
	}
	var atomPat=new RegExp(atom,"g");
	var domArr=domain.match(atomPat);
	var len=domArr.length;
	if ( domArr[domArr.length-1].length < 2 ||
	     domArr[domArr.length-1].length > 4 )
	{
		return false;
	}
	if (len<2)
	{
		return false;
	}
	return true;
}
function validMsisdn( val )
{
	if ( blank(val) )
		return true;
	if ( !isDigits(val) )
		return false;
/*	if ( val.substr(0,2) != "07" )
		return false;
*/
	if ( val.length < 10 )
		return false;
	return true;
}
function validSMSText( val )
{
	if ( blank(val) )
		return true;
	if ( !isASCII(val) )
		return false;
	if ( val.length > 160 )
		return false;
	return true;
}
function validHouseName( val )
{
	if ( blank(val) )
		return true;	// Blank values picked up in mandatory check rather than here.
	if ( val.length > 40 )
		return false;
	if ( val.length < 4 )
		return false;
	if ( !validChrs(val, "abcdefghijklmnopqrstuvwxyz1234567890") )
		return false;
	return true;
}
function isFormType( fid, type )
{
	if ( blank(fid) )
		return false;
	if ( fid.value == type )
		return true;
	return false;
}
function validDate( val ) // In the form DD-MM-YYYY HH:MM:SS (24 hour clock)
{
	if ( blank(val) )
		return true;
 
	if ( val.indexOf(" ") == -1 )
		val += " 00:00:00";
 
	var mydate = val.substr( 0,val.indexOf(" ") );
	var time = val.substr( val.indexOf(" ")+1, val.length );
 
	if (mydate.length != 10 || time.length != 8 )
		return false;
 
	var day, month, year, hour, min, sec;
	sec = parseInt(time.substr(6,8),10);
	min = parseInt(time.substr(3,5),10);
	hour = parseInt(time.substr(0,2),10);
	day = parseInt(mydate.substr(0,2),10);
	month = parseInt(mydate.substr(3,5),10);
	year = parseInt(mydate.substr(6,10),10);
 
	//Check the time
	if ( hour < 0 || hour > 23 || min < 0 || min > 59 || sec < 0 || sec > 59 )
		return false;
	
	//Check the year
	if ( year < 1901 || month < 1 || month > 12 )
		return false;

	var dayInMonth = new Array( 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 );
	dayInMonth[2] = ( ((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0) ) ) ? 29 : 28 );

	if ( day < 1 || day > dayInMonth[month-1] )
		return false;

	return true;
}
function replaceFormImage( field, error )
{
	//alert('Error: ' + error);


	if ( document.images != null )
	{
		var imgName = field.name + "_img";
		var img = document.images[imgName];
		if ( img != null )
		{
			if ( error && field.mandatory == "true")
			{
				img.src="./images/forms/fieldbad.gif";
			}
			else if ( error )
			{
				img.src="./images/forms/fieldwrong.gif";
			}
			else
			{
				img.src="./images/forms/fieldok.gif";
			}
		}
	}
}
function validateForm( frm )
{
	var msg = "Please correct the following error(s).\n";
	var err = "";
	var errorThisTime;
	
	for ( var i=0;i<frm.length;i++ )
	{
		var e = frm.elements[i];
		errorThisTime = false;
		//alert("name: " + e.name  + '   man: ' + e.mandatory + "A:" + blank(e.value));
		if ( e.mandatory == "true" && blank(e.value) )
		{
			err += "\nThe " + e.displayname + " field must be completed.\n";
			errorThisTime = true;
		}
		else if ( blank(e.value) )
		{
			e.value = "";	// Enforce an empty string on blank values
		}

		if ( !blank(e.value) )
		{
			if ( e.validation == "id" )
			{
				if ( !validID( e.value ) )
				{
					err += "\nThe " + e.displayname + " field may only contain letters, numbers, and underscores.  It may only be between 1 and 20 characters in length.";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "date" )
			{
//				if ( e.value.indexOf(" ") == -1 )
//				{
//					e.value += " 00:00:00";
//				}
				if ( !validDate( e.value ) )
				{
					err += "\nThe " + e.displayname + " field must be entered in the form dd/mm/yyyy.";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "datetime" )
			{
				if ( e.value.indexOf(" ") == -1 )
				{
					e.value += " 00:00:00";
				}
				if ( !validDate( e.value ) )
				{
					err += "\nThe " + e.displayname + " field must be entered in the form dd/mm/yyyy HH:MM:SS (24 hour clock).";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "text" )
			{
			}
			else if ( e.validation == "telephone" )
			{
				if ( !isDigits(e.value) || e.value.length < 9 )
				{
					err += "\nThe " + e.displayname + " field must contain only numbers (no spaces)";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "msisdn" )
			{
				if ( !validMsisdn(e.value) )
				{
					err += "\nThe " + e.displayname + " field must contain only numbers and be at least 10 numbers long.";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "smsmessage" )
			{
				// Replace all £ signs with &pound;
//				e.value = e.value.replace(/£/g, "&pound;");
				 
				if ( !validSMSText(e.value) )
				{
					err += "\nThe " + e.displayname + " field may contain only standard letters, numbers, and other characters. Tabs, carriage returns (Enter), and other non-visible characters are not allowed.";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "int" )
			{
				if ( !validInt( e.value, 0, 65535 ) )
				{
					err += "\nThe " + e.displayname + " field must be between 0 and 65535.\n";
					errorThisTime = true;
				}
			}

			else if ( e.validation == "terms" )
			{
				if ( e.checked == false )
				{
					err += "\nThe " + e.displayname + " must be checked.\n";
					errorThisTime = true;
				}
			}

			else if ( e.validation == "payment" )
			{
				if ( !validPayment( e.value ) )
				{
					err += "\nThe " + e.displayname + " must be a valid amount - minimum payment is £5.00.\n";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "email" )
			{
				if ( !validEmailAddress( e.value ) )
				{
					err += "\nThe " + e.displayname + " field doesn't appear to be a valid address.\n";
					errorThisTime = true;
				}
			}
			else if ( e.validation == "name" )
			{
				if ( !validName( e.value ) )
				{
					err += "\nThe " + e.displayname + " field may only contain letters, numbers, spaces, and hyphens.\n";
				}
			}
			else if ( e.validation == "sender" )
			{
				if ( !validSender( e.value ) )
				{
					err += "\nThe " + e.displayname + " field may only contain letters and numbers. This can be a valid mobile number up to 15 digits long, or a name up to 11 characters long (A-Z, 0-9 only).\n";
				}
			}
			else if ( e.validation == "housename" )
			{
				if ( !validHouseName( e.value ) )
				{
					err += "\nThe " + e.displayname + " field may only contain lower-case letters and numbers.  It must be between 4 and 40 characters in length.\n";
				}
			}
			else if ( e.validation == "villagerusername" )
			{
				if ( e.value.length < 6 || e.value > 20 || !validChrs(val, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_ ") )
				{
					err += "\nThe " + e.displayname + " must be between 6 and 20 characters in length and contain only letters, numbers, space, dash, and underscore.";
				}
			}
		} // End of if .. blank

		replaceFormImage( e, errorThisTime );
	}

	if ( blank(err) )
	{
		return true;
	}
	alert( msg + err );
	return false;
}

function setDroplistValue( widget, val )
{
	var i;
	for (i=0; i<widget.options.length; i++)
	{
		if ( widget.options[i].value == val )
		{
			widget.selected = i;
			widget.value = val;
			break;
		}
	}
}
function duplicateItem( idField, actionField )
{
	alert("Please fill in the ID field and make any other changes you require.");
	idField.value = "";
	actionField.value = "insert";
}

function confirmDelete()
{
	var agree=confirm("Are you sure you wish to delete this record?");
	if (agree) {
		return true ;
	}
	else {
		return false ;
	}
}
