//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// JAVASCRIPT INCLUDE -- validate.js	
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
//
//  Script Author: Chris Merry  
//     
//	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 :)													   
//
// (C) Chris Merry -- Do not copy this script in anyway without permission.  
//
//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=

var errorTxt = "";

var validate_list=new Array();
									
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 urlRegxp = /^(http|https):\/\//i; 

//var dateRegxp = /^([0-9]){1,2}(\/|-){1}([0-9]){1,2}(\/|-)([0-9]){4}$/;
var dateRegxp = /^([0-9]){1,2}\-{1}([0-9]){1,2}\-([0-9]){4}$/;
var timeRegxp = /^[0-9]{2}:[0-9]{2}$/;
var currencyRegxp = /^\d+(\.\d{2})?$/;
var sortcodeRegxp = /^[\d]{2}/;
var usernameReqxp = /[a-zA-Z0-9]{6,20}/;

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

var errFlag = 0;

function submit_form(frmname,val_list,error_panel){
	var frmObj = document.getElementById(frmname);
	if(frmObj){
		if(verifylist(frmObj,val_list,error_panel)){
			frmObj.submit();
		}
	}else{
		alert("Couldnt find form '"+frmname+"' object.");
	}
}

function submit_action(next_action,frmname){
	var frmObj = document.getElementById(frmname);
	if(frmObj){
		if(verifylist(frmObj,validate_list,'form_error')){ 
			frmObj.ac.value = next_action;
			frmObj.submit();
		}
	}else{
		alert("Couldnt find form '"+frmname+"' object.");
	}
}

function change_action(next_action,frmname){
	var frmObj = document.getElementById(frmname);
	if(frmObj){
		frmObj.ac.value = next_action;
		frmObj.submit();
	}else{
		alert("Couldnt find form '"+frmname+"' object.");
	}
}

function submit_profile_action(profile_action,frmname){
	var frmObj = document.getElementById(frmname);
	if(frmObj){
		if(verifylist(frmObj,validate_list,'form_error')){ 
			frmObj.profile_action.value = profile_action;
			frmObj.submit();
		}
	}else{
		alert("[submit_profile_action] Couldnt find form '"+frmname+"' object.");
	}
} 

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

	var debug=0;
	var debugTxt="";

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

		if (!good[e.name]) good[e.name]=0;
		if(debug) debugTxt += "FIELD NAME: " + e.name;
		
		if(chklist[e.name]){	
			if(debug) debugTxt += " - IN CHECKLIST ("+chklist[e.name]+")";
			if	(isdisplayed(e)){					
				if(debug) debugTxt += " - VISIBLE\n";

				var txt = chklist[e.name];						// could be  "text" "date" "numeric" etc.
				var typ = txt;
				var s1 = txt.split(':');
				if (s1.length>1){
					typ=s1[0];
					var s2 = s1[1].split(',');
					if (altlist != ''){altlist += ","}
					altlist += s2[1]; 
				}

				if(typ != "wordcount" && typ != "select-one"){
					value = e.value.replace(/ \.,/g, '');
				}else{
					value = e.value;
				}

				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 == "username"){
					if (usernameReqxp.test(value) == true){
						good[e.name]=1;
					}else{
						alt_tags[e.name] = "Username can only contain letters and numbers and must be between 6 - 20 characters.";
					}
				}
				else if(typ == "required_check"){
					//alert(typ + " " + value);
					if((value == 'yes') && (e.checked)){
						good[e.name]=1;
					}else{
						alert('You must ...');
					}
				}
				else if (typ=="radio_special"){
					if(e.checked){
						good[e.name]=1;
					}else{
						alt_tags[e.name] = "Please give ....";
					}
				}
				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 eg. dd-mm-yyyy";
					}
				}
				else if (typ=="time"){
					if (timeRegxp.test(value) == true){
						var bits = value.split(':');
						if(bits.length>1){
							if(bits[0] < 24){
								if(bits[1] < 60){					
									good[e.name]=1;
								}else{
									alt_tags[e.name] = "You have entered an invalid time, minutes should be between 00-59 minutes.";					
								}
							}else{
								alt_tags[e.name] = "You have entered an invalid time, hours should be between 00-23 hours.";					
							}
						}
					}else{ 
						alt_tags[e.name] = "Time format must be eg. hh:mm (24 hour format)";
					}
				}
				else if (typ=="numeric"){
					if (numericRegxp.test(value) == true){
						good[e.name]=1; 
					}else{
						alt_tags[e.name] = "Should only contain digits eg. 1234";
					}
				}
				else if (typ=="cm"){
					value = value.replace(/cm/,'');
					if (numericRegxp.test(value) == true){
						good[e.name]=1; 
					}else{
						alt_tags[e.name] = "This should be a measurement value in cm   eg. 100cm";
					}
				}
				else if (typ=="currency"){
					if (currencyRegxp.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Must contain a positive currency value eg. 10.99"; 
					}
				}
				else if (typ=="checkbox"){
					good[e.name]=1;
				}
				else if (typ=="select-one"){
					if (e.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 eg. TN40 2QH"; 
					}
				}
				else if (typ=="telephone"){
					value = value.replace(/ /g, '');
					if (telnoRegxp.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Ensure this is a valid UK phone number eg. 01424 998899"; 
					}
				}
				else if (typ=="http"){
					if (urlRegxp.test(value) == true){
						good[e.name]=1;
					}else{
						alt_tags[e.name] = "Please ensure you have entered a valid web address.";
					}
				}else if (typ=="email"){
					if (emailRegxp.test(value) == true){
						var confObj = document.getElementById('conf_'+e.name);
						if(confObj){
							//alert("CONF EMAIL FIELD FOUND... checking.");
							if(confObj.value == value){
								good[e.name] = 1;
								good['conf_'+e.name] = good[e.name];
							}else{
								alt_tags[e.name] = "Please ensure both email address fields are the same.";
								alt_tags['conf_'+e.name]  = alt_tags[e.name];
							}
							(confObj.value == value)?1:0;
						}else{
							good[e.name]=1;
						}
					}else{ 
						alt_tags[e.name] = "Ensure this is a valid email address eg. somebody@domain.co.uk"; 
						
					}
				}else if (typ=="password"){
					var charRegEx = /[a-z]+/;
					var numRegEx = /[0-9]+/;
					if (value.length > 5 && charRegEx.test(value) == true && numRegEx.test(value) == true){
						var confObj = document.getElementById('conf_'+e.name);
						if(confObj){
							//alert("CONF EMAIL FIELD FOUND... checking.");
							good[e.name] = (confObj.value == value)?1:0;
							alt_tags[e.name] = "Please ensure both password fields match.";
						}else{
							good[e.name]=1;
						}
						//alt_tags['conf_'+e.name]  = alt_tags[e.name];
						//good['conf_'+e.name] = good[e.name]
					}else{ 
						alt_tags[e.name] = "Please ensure your password contains letters and numbers and is at least 7 chars long."; 
					}
				}
				else if(typ=="ccnum"){
					if (ccnum.test(value) == true){
						good[e.name]=1; 
					}else{ 
						alt_tags[e.name] = "Ensure your sort code is valid eg. 40-10-19";
					}
				}
				else if(typ=="vcode"){
					if ((value != "")&&(!isBlank(value))) {
						good[e.name]=1;
					}else{
						alt_tags[e.name] = "Please type in the charactures you see in the image next to this box.";
					}
				}
				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 eg. (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 eg. 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 eg. 40-10-19"; }
				}
				else{
					alert('Element ('+e.name+') has unknown validation type! ('+typ+')');
				}
			}else{
				if(debug) debugTxt += " - INVISIBLE";
				good[e.name]=1; // hidden so say it is good													 
			}
		}else{
			if(debug) debugTxt += " - NOT IN CHECKLIST";
			good[e.name]=1; // not in list so say it is good													 
		}
		if(debug){
			if(good[e.name]){
				debugTxt += " - GOOD\n";
			}else{
				debugTxt += " - ERROR\n";
			}
		}
	}
	// only only of the fields in the list needs to be valid
	if (altlist != ""){
		//alert(altlist);
		var s1=altlist.split(',');
		var ga = 0;
		for (var x=0;x<s1.length ;x++ ){
			if (good[s1[x]]){
				ga=1;
			}
		}
		if (ga){
			for (var x=0;x<s1.length ;x++ ){
				good[s1[x]]=1;
			}
		}
	}

	if(debugTxt != '') alert(debugTxt);
	
	var error_info = "<table>";
	for (g in good){
		if (good[g]==0){
			DispError(g,alt_tags[g]);
			error_info += "<tr><td><b>"+g+"</b></td><td> &nbsp;-&nbsp; </td><td>"+alt_tags[g]+"</td></tr>\n"
			fail = 1;
		}
		else if(good[g]==1){
			ClrError(g);
		}
	}
	error_info += "</table>";
	//######################################################################
	//var IframeObj =  document.getElementById('crummy');
	//if(IframeObj){
		//dump(IframeObj.contentWindow);
	//	IframeObj.contentWindow.displayERROR(good['destinationpath']);
	//}
	//######################################################################

	var display = (fail)?'block':'none';
	if(error_panel == 'form_error'){
		//errorTxt = "Sorry, some of the fields below are required or the data is not valid.";
		errorTxt = error_info;
	}else if(error_panel == 'upload_error'){
		errorTxt = "Please select a file to upload."
	}else if(error_panel == 'top_login_error'){
		errorTxt = "Please enter your login information.";
	}
	display_error_text(display,errorTxt,error_panel);
	return (fail)?false:true;
}

function display_error_text(display,errorTxt,error_panel){
	var scroll = (error_panel != 'form_error')?0:0;
	var errorDivObj = document.getElementById(error_panel);
	if(errorDivObj){
		if(display == 'block') window.scrollTo(0,scroll);
		errorDivObj.style.display = display;
		errorDivObj.innerHTML = errorTxt;
	}
}

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

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);
}

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

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){
		if(obj.className.indexOf('_err') != -1){
			obj.className = obj.className.replace(/_err/,'');
		}
	}
}

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

function DispError(name,alt_tag){
	var obj = document.getElementById(name);
	//alert("objname="+name+" obj="+obj);
	if(obj){
		if(obj.className.indexOf('_err') == -1){
			obj.className = obj.className + "_err";
			//alert(obj.className);
			//alert(alt_tag);
			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 submitForm(formobj,list){
	if(verifylist(formobj,list)){
		formobj.submit();
	}
}

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

function setCheckBox(name,current){
	var checks;
	if(document.forms['main'][name]){
		checks =document.forms['main'][name];
		var i=-1;
		for (var x=0;x<checks.length;x++ ){
			if (checks[x].value == current) i=x;
		}
		if(i == 1){ 
			checks[i].checked=1;
		}
	}else{
		alert("setCheckBox - control not found = "+name);
	}
}	

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

function setRadioIndex(name,current){
	var rads;
	if(document.getElementsByName(name)){
		rads=document.getElementsByName(name);
		var i=-1;
		for (var x=0;x<rads.length;x++ ){
			if (rads[x].value == current) i=x;
		}
		if(i != -1){ 
			rads[i].checked=1; 
			rads[i].click();
		}
	}else{
		alert("setRadioIndex - control not found = "+name);
	}

}	

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

function setSelectIndex(name,current,frmname){						
	var ops;
	//alert('Set val: '+current);
	//alert('Name: ' + name + "  Current: " + current + "  Formname:" +frmname);
	if(document.forms[frmname][name]){	
		ops=document.getElementById(name).options;
		obj=document.getElementById(name);
		if(ops){
			var i=-1;
			var multi_set = current.split(',');
			//alert('Amount: '+multi_set.length);
			for (var x=0;x<ops.length;x++ ){
				for (var y=0;y<multi_set.length;y++){
					if(ops[x].value == multi_set[y]){
						ops[x].selected	= true;
						i = x;
					}
				}
			}
			if(i != -1){ 
				//ops.selectedIndex=i;
				if(obj.onchange) obj.onchange();
				ops[0].selected	= false;
			}
		}
	}else{
		alert("setSelectIndex - control not found = "+name);
	}
}
	