//+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
// 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 = "Some of the fields below are required or the information given is not valid.<BR>Please move your mouse over the highlighted boxes below for more information.";
var pcodeRegxp = /^([A-Za-z]{1,2})([0-9]{2,3})([A-Za-z]{2})$/;
//var telnoRegxp = /^(^[0-9\+]+)$/;
var telnoRegxp = /^(^[0-9\+ ]+)$/;		//CM CHANGED THIS 19/09/06
var numericRegxp = /^([0-9.]+)$/;

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

//var urlRegxp = /^(http|https):\/\/(www)?\./i; 

var urlRegxp = /^((http|https):\/\/([\-\w]+\.)+\w{2,3}(\/[%\-\w]+(\.\w{2,})?)*(([\w\-\.\?\\/+@&#;`~=%!]*)(\.\w{2,})?)*\/?)/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{1,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;
var warningFlag = 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];

		var optionalFlag = -1;

		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 typ = chklist[e.name];						// could be  "text" "date" "numeric" etc.

				if(typ.indexOf('opt_') != -1){
					//alert("OPTIONAL VALUE" + typ.replace(/opt_/,''));
					typ = typ.replace(/opt_/,'');
					optionalFlag = 1;
				}

				if(typ != "wordcount" || typ != "text" || typ != "summary"){
					value = e.value.replace(/ \.,/g, '');
				}else{
					value = e.value;
				}

				if (typ=="text"){
					if ((optionalFlag != -1) && (value == '') || (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 == "summary"){
					var words = value.split(/ /);
					//alert("Summary length: "+words.length+" value: '"+value+"'");
					errorTxt = "Please move your mouse over the highlighted boxes below for more information.";
					if(value == ''){
						alt_tags[e.name] = "This is a required field";
					}else{
						if(words.length < 250)	good[e.name]=1;
						if(words.length > 250){
							alt_tags[e.name] = "Your report can be a maximum of 250 words.";
						}
					}
				}
				else if(typ == "wordcount"){
					var words = value.split(/ /);
					//alert("Review length: "+words.length);
					if(words.length<2000 && words.length>=50)	good[e.name]=1;
					if(words.length > 2000){
						alt_tags[e.name] = "Thanks for the extra effort, but im afraid your review must be less than 2000 words.";
					}else if(words.length < 50){
						alt_tags[e.name] = "Sorry your review must be at least 50 words.";
					}
				}
				else if(typ == "required_check"){
					//alert(typ + " " + value);
					if((value == 'yes') && (e.checked)){
						good[e.name]=1;
					}else{
						alert('You must tick to agree that you are the owner of the submitted material and that you agree to the competition terms');
					}
				}
				else if (typ=="radio_special"){
					if(e.checked){
						good[e.name]=1;
					}else{
						alt_tags[e.name] = "Please give your destination / resort / hotel a rating before proceeding.";
					}
				}
				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=="chargestartdate"){
					var today = new Date();
					//alert("Flag: "+optionalFlag+"  Result: "+dateRegxp.test(value));
					if (dateRegxp.test(value) == true || (optionalFlag != -1 && value == '')){
						var bits = value.split('-');
						var myDate = new Date;
						bits[0] = bits[0].replace(/^0/,'');
						bits[1] = bits[1].replace(/^0/,'');
						bits[1] = bits[1] - 1;
						myDate.setDate(bits[0]);
						myDate.setMonth(bits[1]); // January = 0
						myDate.setFullYear(bits[2]);
						//alert("Day: "+bits[0]+" Month: "+bits[1]+" Year: "+bits[2]);
						//alert("Today: "+today);
						//alert("Entered Date: "+myDate);
						if(today <= myDate){
							//alert("ROUTE 1");
							if(warningFlag == 1) good[e.name]=1;
							if(today >= myDate && warningFlag == 0){
								alt_tags[e.name] = "Click 'Submit TravelDeal' if you're sure you want to advertise your Travel Deal for part of this period.";
								alert("Charging starts at midnight, so if you wish to advertise your Travel Deal for part of today, you will be charged the full daily rate.");
								warningFlag = 1;
							}else{
								//alert("GOOD");
								good[e.name]=1;
							}
							//alert("FLAG: "+warningFlag);
						}else{
							//alert("ROUTE 2");
							alt_tags[e.name] = "This date has already passed.  Are you sure this is correct?";
						}
					}else{
						//alert("ROUTE 3");
						alt_tags[e.name] = "Date format must be eg. dd-mm-yyyy";
					}
					//alert("END");
				}
				else if (typ=="chargestartdatecombo"){
					var today = new Date();
					//alert("Flag: "+optionalFlag+"  Result: "+dateRegxp.test(value));
					if (dateRegxp.test(value) == true || (optionalFlag != -1 && value == '')){
						var bits = value.split('-');
						var myDate = new Date;
						bits[0] = bits[0].replace(/^0/,'');
						bits[1] = bits[1].replace(/^0/,'');
						bits[1] = bits[1] - 1;
						myDate.setDate(bits[0]);
						myDate.setMonth(bits[1]); // January = 0
						myDate.setFullYear(bits[2]);
						//alert("Day: "+bits[0]+" Month: "+bits[1]+" Year: "+bits[2]);
						//alert("Today: "+today);
						//alert("Entered Date: "+myDate);
						if(today >= myDate){
							//alert("ROUTE 1");
							if(warningFlag == 1) good[e.name]=1;
							if(warningFlag == 0){
								alt_tags[e.name] = "Click 'Submit Banner Advert' if you're sure you want to advertise your Travel Deal for part of this period.";
								alert("Charging starts from each sunday at midnight, so if you wish to advertise your Banner Advert for part of this advertising period, you will be charged the full weekly rate.");
								warningFlag = 1;
							}
						}else{
							good[e.name] = 1;
							//alert("ROUTE 2");
						}
					}else{
						//alert("ROUTE 3");
						alt_tags[e.name] = "Date format must be eg. dd-mm-yyyy";
					}
					//alert("END");
				}
				else if (typ=="rangedate"){
					//alert("Flag: "+optionalFlag+"  Result: "+dateRegxp.test(value));
					if (dateRegxp.test(value) == true || (optionalFlag != -1 && value == '')){
						var startdate = document.getElementById('datefrom').value;
						var bits = startdate.split('-');
						var startDate = new Date();
						startDate.setDate(bits[0]);
						startDate.setMonth(bits[1]-1); // January = 0
						startDate.setFullYear(bits[2]);

						var bits = value.split('-');
						var endDate = new Date;
						endDate.setDate(bits[0]);
						endDate.setMonth(bits[1]-1); // January = 0
						endDate.setFullYear(bits[2]);
						if(startDate <= endDate){
							good[e.name]=1;
						}else{
							alt_tags[e.name] = "This date is before the chosen from date this cannot be correct.";
						}
					}else{
						alt_tags[e.name] = "Date format must be eg. dd-mm-yyyy";
					}
				}
				else if (typ=="futuredate"){
					var today = new Date();
					//alert("Flag: "+optionalFlag+"  Result: "+dateRegxp.test(value));
					if (dateRegxp.test(value) == true || (optionalFlag != -1 && value == '')){
						var bits = value.split('-');
						var myDate = new Date;
						myDate.setDate(bits[0]);
						myDate.setMonth(bits[1]-1); // January = 0
						myDate.setFullYear(bits[2]);
						if(today < myDate){
							good[e.name]=1;
						}else{
							alt_tags[e.name] = "This date has already passed.  Are you sure this is correct?";
						}
					}else{
						alt_tags[e.name] = "Date format must be eg. dd-mm-yyyy";
					}
				}
				else if (typ=="weekrangecombo"){
					//alert("Check 'weekrangecombo'");
					//alert("Flag: "+optionalFlag+"  Result: "+dateRegxp.test(value));
					if (dateRegxp.test(value) == true || (optionalFlag != -1 && value == '')){
						var fromObj = document.getElementById('datefrom');
						if(fromObj){
							var value2 = fromObj.value;
							var startBits = value2.split('-');
							var endBits = value.split('-');
							var endDate = new Date;
							var startDate = new Date;

							startDate.setDate(startBits[0]);
							startDate.setMonth(startBits[1]); 
							startDate.setFullYear(startBits[2]);

							endDate.setDate(endBits[0]);
							endDate.setMonth(endBits[1]);
							endDate.setFullYear(endBits[2]);

							if(startDate < endDate){
								//alert("GOOD");
								good[e.name]=1;
							}else{
								//alert("ERROR 1");
								alt_tags[e.name] = "This date must be after the 'from' date field.";
							}
						}else{
							alt_tags[e.name] = "Could not find the 'from' date field.";
						}
					}else{ 
						//alert("ERROR 2");
						alt_tags[e.name] = "Date format must be eg. dd-mm-yyyy";
					}
				}
				else if (typ=="date"){
					//alert("Flag: "+optionalFlag+"  Result: "+dateRegxp.test(value));
					if (dateRegxp.test(value) == true || (optionalFlag != -1 && value == '')){
						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 || (optionalFlag != -1 && value == '')){
						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 || (optionalFlag != -1 && value == '')){
						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"){
					//alert(emailRegxp.test(value));
					if (emailRegxp.test(value) == true){
						var confObj = document.getElementById('conf_'+e.name);
						//alert(confObj);
						if(confObj){
							//alert("CONF EMAIL FIELD FOUND... checking.");
							good[e.name] = (confObj.value == value)?1:0;
							good['conf_'+e.name] = good[e.name];
							alt_tags[e.name] = (good[e.name])?"":"Please ensure both email address fields match.";
							alt_tags['conf_'+e.name] = alt_tags[e.name];

							//alert("Good Value: "+good[e.name]+"  Alt Tag: "+alt_tags[e.name]);
							//alert("Confirm Value: "+good['conf_'+e.name]+"  Confirm Alt Tag: "+alt_tags['conf_'+e.name]);
						}else{
							alt_tags[e.name] = "";
							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"){
					if (((value.length>=6) && /\d/.test(value) && /[a-z]/i.test(value)) || (optionalFlag != -1 && value == '')){
						var confObj = document.getElementById('conf_'+e.name);
						//alert(confObj);
						if(confObj || (optionalFlag == -1 && value != '')){
							//alert("CONF EMAIL FIELD FOUND... checking.");
							good[e.name] = (confObj.value == value)?1:0;
							good['conf_'+e.name] = good[e.name]
							
							alt_tags[e.name] = (good[e.name])?"":"Please ensure both password fields match.";
							alt_tags['conf_'+e.name] = alt_tags[e.name];
						}else{
							alt_tags[e.name] = "";
							good[e.name]=1;
							ClrError('conf_'+e.name);
						}
					}else{ 
						alt_tags[e.name] = "Your password must be at least 6 characters and contain letters and numbers."; 
					}
				}
				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+')');
					good[e.name]=1; 
				}
			}else{
				if(debug) debugTxt += " - INVISIBLE";
				good[e.name]=1; // hidden so say it is good													 
			}
		}else{
			var name = e.name;
			if(name.indexOf('conf_') == -1){		//DONT VERIFY CONFIRMATION FIELDS..
				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 += " - " + alt_tags[e.name] + " - ERROR\n";
			}
		}
	}

	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){
		if(formobj.name != 'commentform')	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;  // corrected 28/2/2006 BC/CM
}

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

function ClrError(name){
	var obj = document.getElementById(name);
	if(obj){
		if(obj.className.indexOf('_err') != -1){
			obj.className = obj.className.replace(/_err/,'');
			obj.title = "";
			obj.alt = "";
		}
	}
}

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

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,frmname){
	var checks;
	if(document.forms[frmname][name]){
		checks =document.forms[frmname][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 setSingleCheckBox(name,current,frmname){	//NOBLLED WILL ONLY WORK WITH SINGLE CHECKBOXES
	//alert("Name: "+name+" Current: "+current+" Form name: "+frmname);
	if(document.forms[frmname][name]){
		var checkbox = document.forms[frmname][name];
		if(current == 1){
			checkbox.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('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;
			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);
	}
}
	