//---[ (C) Chris Merry ]----------------[ Brooker & How Ltd. ]-------------------[ Created: 02th September ]---#
//																											   #
//	Name:		   Javascript Validation functions.																   #
//																											   #
//	Description:   This script will validate any form data and enforce certain rules on the data entered via   #
//				   regular expressions.																		   #
//																											   #
//	Thanks to:	   Ben Clayton, Marc Woodhead :)															   #
//-------------------------------------------------------------------------------------------------------------#
//	Last Modified: 16/04/06																					   #
//-------------------------------------------------------------------------------------------------------------#


var pcodeRegxp = /^([A-Za-z]{1,2})([0-9]{2,3})([A-Za-z]{2})$/;
var telnoRegxp = /^(^[0-9]{11,12})$/;
var numericRegxp = /^([0-9.]+)$/;

var emailRegxp = /^([\w_-]+)(\.[\w_-]+)*@([\w_-]+)(\.[\w_-]*){0,1}(\.[a-zA-Z]{2,4}){1,2}$/; 

var dateRegxp = /^([0-9]){1,2}(\/|-){1}([0-9]){1,2}(\/|-)([0-9]){4}$/;
var currencyRegxp = /^\d+(\.\d{2})?$/;
var passwordRegxp = /^[a-zA-Z0-9]{3,14}$/;
var sortcodeRegxp = /^[\d]{2}/;

var ccnum = /^[\d]{4}/;
var maestro_num_1 = /^[\d]{6,8}/;
var maestro_num_2 = /^[\d]{10,15}/;
var errFlag = 0;

function verifylist(formobj,chklist){
	
	var good = new Array();
	var alt_tags = new Array();
	var fail=0;

	var debug=0;
	var debugTxt="";

	var value="";

	for (var i=0; i<formobj.length; i++){
		var e=formobj.elements[i];

		if (!good[e.name]) good[e.name]=0;
		
		if(chklist[e.name]){	
			if(debug) dbg += "VAL" +  e.name + " = " + chklist[e.name] + "\n";
			if	(isdisplayed(e)){					
				if(debug) debugTxt += "VISIBLE" +  e.name +  "\n";

				var typ = chklist[e.name];						// could be  "text" "date" "numeric" etc.
				if(typ!="email"){ value = e.value.replace(/[ \.,]/g, '');
				}else{  value = e.value.replace(/[ ]/g, ''); }
				if (typ=="text"){										// needs check for digits only 0-9.
					if ((value != "")&&(!isBlank(value))) {
						good[e.name]=1;
					}else{
						alt_tags[e.name] = "This is a required field";
					}
				}
				else if (typ=="radio"){
					if (e.checked){
						good[e.name]=1;
					}else{
						alt_tags[e.name]="Please select at least one of these options";
					}
				}
				else if (typ=="date"){
					if (dateRegxp.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Date format must be \neg. dd/mm/yyyy";
					}
				}
				else if (typ=="numeric"){
					if (numericRegxp.test(value) == true){
						good[e.name]=1; 
					}else{
						alt_tags[e.name] = "Should only contain digits \neg. 1234";
					}
				}
				else if (typ=="currency"){
					if (currencyRegxp.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Must contain a positive currency value \neg. 10.99"; 
					}
				}
				else if (typ=="checkbox"){
					good[e.name]=1;
				}
				else if (typ=="select-one"){
					if (value != "-1"){
						good[e.name]=1;
					}else{
						alt_tags[e.name] = "Please select a value from the pulldown menu";
					}
				}
				else if (typ=="postcode"){
					if (pcodeRegxp.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Ensure postcode is valid \neg. TN40 2QH"; 
					}
				}
				else if (typ=="telephone"){
					if (telnoRegxp.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Ensure this is a valid UK phone number \neg. 01424 222880"; 
					}
				}
				else if (typ=="email"){
					if (emailRegxp.test(value) == true){ 
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Ensure this is a valid email address \neg. somebody@domain.co.uk"; 
					}
				}
				else if(typ=="ccnum"){
					if (ccnum.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Ensure your sort code is valid \neg. 40-10-19";
					}
				}
				else if(typ=="maestro_num_1"){
					if (maestro_num_1.test(value) == true){ good[e.name]=1; }else{ alt_tags[e.name] = "Ensure this is only the first part of your card number \neg. (XXXXXX) - XXXXXXXXXXX"; }
				}
				else if(typ=="maestro_num_2"){
					if (maestro_num_2.test(value) == true){ good[e.name]=1; }else{ alt_tags[e.name] = "Ensure this is only the second part of your card number \neg. XXXXXX - (XXXXXXXXXXX)"; }
				}
				else if (typ=="sortcode"){
					if (sortcodeRegxp.test(value) == true){ good[e.name]=1; }else{ alt_tags[e.name] = "Ensure your sort code is valid \neg. 40-10-19"; }
				}
				else{
					alert('Element ('+e.name+') has unknown validation type! ('+typ+')');
				}
			}else{
				good[e.name]=1; // hidden so say it is good													 
			}
		}else{
			good[e.name]=1; // not in list so say it is good													 
		}
	}

	if(debug) alert(debugTxt);

	
	for (g in good){
		if (good[g]==0){
			//alert(g);
			DispError(g,alt_tags[g]);
			fail = 1;
		}
		else if(good[g]==1){
			ClrError(g);
		}
	}

	var frmError = document.getElementById('form_error');

	if(!fail){
		if(frmError) frmError.style.display = 'none';
		return true;
	}else{
		if(frmError){
			frmError.innerHTML = 'Please fill in the fields marked in red.';
			frmError.style.display = 'block';
			window.scrollTo(0,0);
		}
		return false;
	}
}

//#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
// SUBMIT FORM
//#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#

function submitForm(frmName,list){
	var formobj = document.forms[frmName];
	if(formobj && list){
		if(verifylist(formobj,list)){
			formobj.submit();
		}
	}else{
		alert("function - submitForm | Form with name '"+frmName+"' couldnt be found.");
	}
}

//#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
//SUB FUNCTIONS
//#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#

function isBlank(s){
	for(var i=0; i<s.length; i++) {
		var c = s.charAt(i);
		if((c!='')&&(c!='\t')&&(c!='\n')&&(c!=' ')){
			return false;
		}
	return true;
	}
}

//===========================================================

function ClrError(name){
	var obj = document.getElementById(name);
	if(obj){
		obj.style.borderColor = "#DFECF4";
		obj.style.backgroundColor = "#FFFFFF";
		obj.title = '';
		obj.alt = '';
	}
}

//===========================================================

function DispError(name,alt_tag){
	var obj = document.getElementById(name);
	if(obj){
		obj.style.borderColor = "#F3ABAB";
		obj.style.backgroundColor = "#FCEDED";
		if(alt_tag){
			obj.title = alt_tag;
			obj.alt = alt_tag;
		}
	}
}

//=============================================================================

function isdisplayed(node){

	//This function is used to see if an INPUT is currently being displayed
	// ONLY looking for a encompassing DIV with a style including display:block or display:none
	// test with something like this:
	//       alert(isdisplayed(document.getElementById("surname")))
	var n=0;
	var fnd=0;
	while (fnd==0){
		if(n>1) { node = node.parentNode; }
		if (node){
			if (node.style){
				if (node.style.display){
					//alert(node.style.display);
					if (node.style.display=='block'){
						fnd=0;
						//return true;
					}
					if (node.style.display=='none'){
						fnd=1;
						//return false;
					}
				}
			}
		}else{
			fnd=3;
		}
		if (n>20){
			return true;
		}
		n++;
	}
	if(fnd==1){
		return false;
	}
	if(fnd==0||fnd==3){
		return true;
	}
}

//===========================================================
	
function dump(obj){
	alert(obj);
	var sd="";
	var n=0;
	for (var p in obj){
		sd += p + " = " + obj[p] + "\n";
		
		n++;
		if (n>10){
			alert(sd);
			sd="";
			n=0;
		}
	}
	alert(sd);
}

//===========================================================

//		2 + 2 = 3 = FALSE		  1 + 2 = 3 = TRUE    4=Error string
function field_combine_and_match(id1,id2,id3,err,list){
	//alert(id1+' + '+id2+' = '+id3+ ' or this error ( '+err+' ) is displayed');
	var chkArray = new Array(id1,id2,id3);
	if(validateFields(chkArray,list)){
		var values = parseInt(document.getElementById(id1).value) + parseInt(document.getElementById(id2).value);
		var diff = parseInt(document.getElementById(id3).value) - values;
		var msg = "";
		if( values == parseInt(document.getElementById(id3).value)){
			ClrError(id1);
			ClrError(id2);
			//alert('OK');
			return 1;
		}else{
			if(diff>0){	msg = " short £";	}else{	msg = " over £"; }
			DispError(id1,err+msg+diff);
			DispError(id2,err+msg+diff);
			//alert('BAD');
			return 0;
		}
	}else{
		alert('could not validate fields id1: '+id1+'  id2: '+id2+'  id3: '+id3);
	}
}