//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// 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 = "Sorry, some of the fields below are required or the data is not valid.";
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 currencyRegxp = /^\d+(\.\d{2})?$/;
var passwordRegxp = /^[a-zA-Z0-9]{3,14}$/;
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 verifylist(formobj,chklist){
	
	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"){
					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=="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.");
							good[e.name] = (confObj.value == value)?1:0;
							alt_tags[e.name] = "Please ensure both email address fields are the same.";
						}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=="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=="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);

	for (g in good){
		if (good[g]==0){
			//alert("ERROR: "+g);
			//if(g == 'rating'){
			//	if(document.getElementById('rating_div')){
			//		DispError('rating_div',alt_tags[g]);
			//	}else{
			DispError(g,alt_tags[g]);
			//	}
			//}//else if(g == "dealcategory"){
			//	DispError('dealcategory_div',alt_tags[g]);
			//}
			//else if(g == 'destinationpath'){
			//	DispError('destinationpath_div',alt_tags[g]);
			//}else{
			//	DispError(g,alt_tags[g]);
			//}
			fail = 1;
		}
		else if(good[g]==1){
			//if(g == 'rating'){
			//	var obj = document.getElementById('rating_div');
			//	if(obj) obj.className = "";
			//}else if(g == "dealcategory"){
			//	var obj = document.getElementById('dealcategory_div');
			//	if(obj) obj.className = "";
			//}else if(g == 'destinationpath'){
			//	var obj = document.getElementById('destinationpath_div');
			//	if(obj) obj.className = "textbox";
			//}else{
				ClrError(g);
			//}
		}
	}
	//######################################################################
	//var IframeObj =  document.getElementById('crummy');
	//if(IframeObj){
		//dump(IframeObj.contentWindow);
	//	IframeObj.contentWindow.displayERROR(good['destinationpath']);
	//}
	//######################################################################
	var errorDivObj = document.getElementById('form_error');
	if(errorDivObj){
		window.scrollTo(0,320);
		var display = (fail)?'block':'none';
		errorDivObj.style.display = display;
		errorDivObj.innerHTML = errorTxt;
	}
	return (fail)?false:true;
}


//#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#=#
//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;
	if(document.forms[frmname][name]){	
		ops=document.getElementById(name).options;
		obj=document.getElementById(name);
		var i=-1;
		for (var x=0;x<ops.length;x++ ){
			if (ops[x].value == current) i=x;
		}
		if(i != -1){ 
			ops.selectedIndex=i;
			if(obj.onchange)  obj.onchange();
		}
	}else{
		alert("setSelectIndex - control not found = "+name);
	}
}
	