/*
 *	Adam Fox 2006
 *	LINE Communications
 */

function validateFields()
{
	var no_err = true;
	if(typeof(validation_list) != "undefined")
	{
		var field_list = validation_list;
		for(var x=0; x<field_list.length; x++)
		{
			var fobj = document.getElementById(field_list[x][0]);
			if(fobj == null || fobj.type == "radio"){
				if(field_list[x][1] == "MANDATORY"){
					// found radio button if IE, possible radio if FF
					// attempt to find each radio field
					var y = 0, z = false;
					while(fobj = document.getElementById(field_list[x][0]+y)){
						z = fobj.checked ? true : z;
						y++;
					}
					var msg = '';
					var element = document.getElementById(field_list[x][0]+"_error");
					if(!z){
						no_err = false;
						msg = '- please complete this field';
					}
					if (element != null) {
						element.innerHTML = msg;
						element.style.display = msg ? 'block' : 'none';
					}
				}
			} else {
				// try and validate field
				if(!validateIt(fobj, field_list[x][1])){ no_err = false; }
			}
		}
	}
	if(typeof(validation_custom) == "function"){ no_err = (no_err && validation_custom()); }
	return no_err;
}

function validateIt(objField, rxp)
{	
	if(!objField.value && rxp != "MANDATORY"){ return true; }
	
	var valid = true;
	var msg   = "You entered an invalid response.";
	switch(rxp)
	{
		case 'MANDATORY':
			rxp = false;
			msg = '- please complete this field';
			valid = trim(objField.value) != "";
			break;
		case 'STRING':
			rxp = /^([a-zA-Z\s]+)$/;
			msg = '- you entered an invalid character.';
			break;
		case 'UPPERCASE':
			rxp = false;
			objField.value = objField.value.toUpperCase();
			break;
		case 'LOWERCASE':
			rxp = false;
			objField.value = objField.value.toLowerCase();
			break;
		case 'EMAIL':
			rxp = /\w+((-\w+)|(\.\w+)|(\_\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]{2,5}/;
			msg = '- please enter a valid e-mail address.';
			break;
		case 'POSTCODE':
			rxp = false;
			msg = '- please enter a valid postcode.';
			var valid = validatePostcode(objField.value);
			if(valid){ objField.value = valid; valid = true; }
			break;
		case 'NUMBER':
			rxp = /^[-+]?\d+(\.\d+)?$/;
			msg = '- please enter a valid number.';
			break;
		case 'TELEPHONE':
			rxp = false;
			var phone_val = objField.value;
			valid = validateTelephoneNo(phone_val, msg);
			if(valid){ objField.value = valud; valid = true; }
			break;
		case 'CURRENCY':
			rxp = /\£\d{1,3}(,\d{3})*\.\d{2}/;
			msg = '- please enter a valid currency.';
			parseCurrency(objField);
			break;
		case 'DATE':
		case 'DATE_PAST':
		case 'DATE_FUTURE':
			var date_val = objField.value;
			var msg = new Array();
			msg[0]  = "- please enter a valid date.";
			msg[1]  = "You have entered a future date.\nAre you sure you want to continue?";
			msg[2]  = "You have entered a past date\nAre you sure you want to continue?";
			valid_date = validateDate(date_val);
			if(!valid_date)
			{
				msg = msg[0];
				valid = false;
				objField.value = "";
			}
			else if(valid_date != true)
			{
				var error = false;
				var today = new Date();
				if(rxp == 'DATE_PAST' && valid_date > today){
					return confirm(msg[1]);
				}
				else if(rxp == 'DATE_FUTURE' && valid_date < today && !datesEqual(valid_date, today))
				{
					return confirm(msg[2]);
				}
			}
			rxp = false;
			break;
		case 'TIME':
			var time_val = objField.value;
			rxp = /^([01]?\d|[2][0-3]):[0-5]\d$/;
			msg = '- please entere a valid time';
			objField.value = parseTime(time_val);
			break;
	}
	if(rxp)
	{
		var format = new RegExp(rxp);
		valid = objField.value.match(format)?true:false;
	}
	var element = document.getElementById(objField.name+"_error");
	if (element != null) {
		element.innerHTML = valid ? '' : msg;
		element.style.display = valid ? 'none' : 'block';
	}
	return valid;
}

function lTrim(str_in){ return str_in ? str_in.replace(/\s*((\S+\s*)*)/, "$1") : ""; }
function rTrim(str_in){	return str_in ? str_in.replace(/((\s*\S+)*)\s*/, "$1") : ""; }
function trim(str_in) {	return lTrim(rTrim(str_in)); }

function validateDate(date_in) 
{
	var error = 0;
	if (date_in != "") 
	{
		split_date = date_in.split("/");
		dd   = split_date[0];
		mm   = split_date[1];
		yyyy = split_date[2];

		var dateTest = new Date(mm + "/" + dd + "/" + yyyy);
		error = dateTest.getFullYear() != yyyy ? true : error;
		error = dateTest.getMonth() + 1 != mm ? true : error;
		error = dateTest.getDate() != dd ? true : error;
		error = !isLeapYear(yyyy) && (mm == "02" && dd > "28") ? true : error;
		error = !getMonthLen(dateTest.getFullYear(), dateTest.getMonth(), dd) ? true : error;
		return error ? false : dateTest;
	}
	return true;
}

function datesEqual(date1, date2)
{
		if(date1.getFullYear() == date2.getFullYear()){
			if(date1.getMonth() == date2.getMonth()){
				if(date1.getDate() == date2.getDate()) {
					return true;
				}
			}
		}
		return false;
}

function validatePostcode(postCode)
{
	var valid = false

	var chars = new Array();
	chars[0]  = "[abcdefghijklmnoprstuwyz]";
	chars[1]  = "[abcdefghklmnopqrstuvwxy]";
	chars[2]  = "[abcdefghjkstuw]";
	chars[3]  = "[abehmnprvwxy]";
	chars[4]  = "[abdefghjlnpqrstuwxyz]";

	var formats = new Array ();
	formats.push (new RegExp ("^(" + chars[0] + "{1}" + chars[1] + "?[0-9]{1,2})(\\s*)([0-9]{1}" + chars[4] + "{2})$","i"));
	formats.push (new RegExp ("^(" + chars[0] + "{1}[0-9]{1}" + chars[2] + "{1})(\\s*)([0-9]{1}" + chars[4] + "{2})$","i"));
	formats.push (new RegExp ("^(" + chars[0] + "{1}" + chars[1] + "?[0-9]{1}" + chars[3] +"{1})(\\s*)([0-9]{1}" + chars[4] + "{2})$","i"));
	formats.push (/^(GIR)(\s*)(0AA)$/i);
	formats.push (/^(bfpo)(\s*)([0-9]{1,4})$/i);
	formats.push (/^(bfpo)(\s*)(c\/o\s*[0-9]{1,3})$/i);

	for(var i=0; i < formats.length; i++)
	{
		if (formats[i].test(postCode))
		{
			formats[i].exec(postCode);
			postCode = RegExp.$1.toUpperCase() + " " + RegExp.$3.toUpperCase();
			postCode = postCode.replace (/C\/O\s*/,"c/o ");

			valid = true;
			break;
		}
	}
	return valid ? postCode : false;
}

function validateTelephoneNo(number_in, err_msg)
{
	var messages = new Array ();
	messages[0] = "Valid UK telephone number";
	messages[1] = "Telephone number not provided";
	messages[2] = "UK telephone number without the country code, please";
	messages[3] = "UK telephone numbers should contain 10 or 11 digits";
	messages[4] = "The telephone number should start with a 0";
	messages[5] = "The telephone number is either invalid or inappropriate";

	var phone_num = number_in + " "; if (phone_num.length == 1){ err_msg = messages[1]; return false }
	phone_num.length = phone_num.length - 1;
	var rxp = /^(\+)[\s]*(.*)$/; if(rxp.test(phone_num) == true){ err_msg = messages[2]; return false; }
	while (phone_num.indexOf(" ")!= -1)
	{
		phone_num = phone_num.slice (0,phone_num.indexOf(" ")) + phone_num.slice(phone_num.indexOf(" ")+1); 
	}
	while (phone_num.indexOf("-")!= -1)
	{
		phone_num = phone_num.slice (0,phone_num.indexOf("-")) + phone_num.slice(phone_num.indexOf("-")+1);
	}

	rxp = /^[0-9]{10,11}$/;	if(rxp.test(phone_num) != true){ err_msg = messages[3]; return false; }
	rxp = /^0[0-9]{9,10}$/; if(rxp.test(phone_num) != true){ err_msg = messages[4]; return false; }
	rxp = /^(01|02|05|070|077|078|079)[0-9]+$/; if(rxp.test(phone_num) != true){ err_msg = messages[5]; return false; }
	return phone_num;
}

function isLeapYear(yyyy)
{
	yyyy = parseInt(yyyy);
	if(yyyy % 4 == 0)
	{
		if(yyyy % 10 != 0){ return true; }
		else if(yyyy % 400 == 0){ return true; }
	}
	return false;
}

function calculateAge(date_in, fieldName)
{
	if(date_in != "")
	{
		var split_date = date_in.split("/")
		var dd = split_date[0]; 
		var mm = split_date[1];
		var yy = split_date[2];
		var days = new Date();
		var curDate = days.getDate();
		var curMonth = days.getMonth()+1;

		// Months offset by 1
		var curYear = days.getYear();
		var age = curYear - yy;
		if(mm > curMonth){ age -= 1; }
		else if(mm == curMonth){ if(dd > curDate){age -= 1;} }
		return age;
	}
	return false;
}

function getMonthLen(yyyy, mm, dd) 
{
    var oneHour = 1000 * 60 * 60;
    var oneDay = oneHour * 24;
    var thisMonth = new Date(yyyy, mm, 1);
    var nextMonth = new Date(yyyy, mm + 1, 1);
    var len = Math.ceil((nextMonth.getTime() - thisMonth.getTime() - oneHour)/oneDay);
	if (dd > len)
	{
		// alert("Invalid date");
		return false;
	}
	return true;
}

function parseCurrency(currency_in)
{
	var hasDP  = false;
	var prefix = "£";

	if(currency_in.value.charAt(0) == prefix){
		currency_in.value = currency_in.value.substring(1); 
	}

	var tmp = currency_in.value;
	tmp = tmp == "" ? 0 : tmp;
	
	for(i=0; i<tmp.length; i++) {
		hasDP = tmp.charAt(i) == "." ? true : hasDP;
	}
	if(!hasDP){ 
		currency_in.value = prefix + tmp + ".00"; 
	}
	else {
		if (tmp.charAt(tmp.length-2) == "."){ currency_in.value = prefix + tmp + "0"; }
		else{ currency_in.value = prefix + tmp; }
	}
}

function parseTime(time_in)
{
	var tmp = "";
	if(time_in.length >= 3)
	{
		for(var x=0; x<time_in.length; x++)
		{
			if(!isNaN(time_in.substring(x, x+1)))
			{
				tmp += time_in.substring(x, x+1) 
			}
		}
		tmp = tmp.length == 3 ? "0" + tmp : tmp;
		tmp = tmp.substring(0,2) + ":" + tmp.substring(2,4);
	}
	return tmp ? tmp : time_in;
}

