// Budget Estimator JavaScript, (C)2002 Craig Buckler, Digita.com

// globals
var errorsfound;
var form;

// ########################################################
// Error handling

// ________________________________________________________
// show error message and highlight a form element
function error(fieldname, errmessage) {
	if (!errorsfound) {
		alert(errmessage);
		if (form.elements[fieldname].type=="text" || form.elements[fieldname].type=="textarea" || form.elements[fieldname].type=="password") {
			form.elements[fieldname].select();
			form.elements[fieldname].focus();
		}
		errorsfound=true;
	}
}

// ########################################################
// FETCH functions

// ________________________________________________________
// fetch value from input box
function fetch_text(field) {
	return form.elements[field].value;
}

// ________________________________________________________
// fetch value from selected selectbox option
function fetch_select(field) {
	return form.elements[field][form.elements[field].selectedIndex].value;
}

// ________________________________________________________
// fetch value from selected radio option
function fetch_radio(field) {
	var ret="";
	var i=0;
	do {
		if (form.elements[field][i].checked) { ret = form.elements[field][i].value; }
		i++;
	}
	while (i<radiosize(field) && ret=="")
	return ret;
}

// ________________________________________________________
// fetch number of radio options (handles if zero, one, or more)
function radiosize(field) {
	var ret=0;
	if (form.elements[field]) {
		ret = form.elements[field].length;
		if (isNaN(ret)) { ret = 1; }
	}
	return ret;
}

// ________________________________________________________
// select a radio option
function selectRadio(field, chosen) {
	if (chosen>=1 && chosen<=radiosize(field) && radiosize(field)>1) {
		form.elements[field][chosen-1].checked = true;
	}
}

// ########################################################
// Choose functions

// ________________________________________________________
// select the appropriate radio option
function chooseRadioValue(field, opt) {
	var i=radiosize(field)-1;
	var found=false;
	do {
		if (opt==form.elements[field][i].value) {
			found=true;
		}
		else {
			if (i>0) { i--; } else { found=true; }
		}
	} while (!found);
	form.elements[field][i].checked=true;
}

// ________________________________________________________
// select the appropriate select box option
function chooseSelectValue(field, opt) {
	var i=form.elements[field].length-1;
	var found=false;
	do {
		if (opt==form.elements[field][i].value) {
			found=true;
		}
		else {
			if (i>0) { i--; } else { found=true; }
		}
	} while (!found);
	form.elements[field][i].selected=true;
}

// ########################################################
// VERIFY functions

// ________________________________________________________
// verify that the value entered is an integer
function verify_integer(num) {
	var ret="";
	num = String(num);
	num = num.replace(/,/g, "");
	if (!isNaN(num)) { ret = String(toInt(num)); }
	return ret;
}

// ________________________________________________________
// verify that the value entered is a currency
function verify_currency(num) {
	var ret="";
	num = String(num);
	num = num.replace(/£|,/g, "");
	if (!isNaN(num)) { ret = String(toInt(num)); }
	return ret;
}

// ________________________________________________________
// verify that the value entered is a date
function verify_date(str) {
	var ret = "";
	str = String(str);

	if (str!="" && str==str.replace(/[^-\/0-9]/g, "")) {

		// parse date
		str = str.replace(/\//g, "-");
		var pdate = str.split("-");

		if (pdate.length==3) {
			var d=0; var m=0; var y=0;
			// get day
			if (!isNaN(pdate[0]) && pdate[0].length<=2) { d = toInt(pdate[0]); }
			// get month
			if (!isNaN(pdate[1]) && pdate[1].length<=2) { m = toInt(pdate[1]); }
			// get year
			if (!isNaN(pdate[2]) && (pdate[2].length==2 || pdate[2].length==4)) {
				y = toInt(pdate[2]);
				if (y<100) {
					if (y<30) { y = y+2000; } else { y=y+1900; }
				}
			}

			// valid date?
			if (d>0 && m>0 && y>0) {
				var vdate = new Date(y, (m-1), d);

				if (d==vdate.getDate() && (m-1)==vdate.getMonth() && y==vdate.getFullYear()) {
					// create return string
					if (d<10) { ret = ret + "0"; }
					ret = ret + String(d) + "/";
					if (m<10) { ret = ret + "0"; }
					ret = ret + String(m) + "/" + String(y);
				}
			}
		}
	}

	return ret;
}

// ________________________________________________________
// verify that the value entered is a valid email address
function verify_email(email) {
	email = email.replace(/^\s*|\s*$/g, "");
	email = email.toLowerCase();
	if (email != "") if (email.replace(/^.+@[a-z0-9]+([_\.\-]{0,1}[a-z0-9]+)*([\.]{1}[a-z0-9]+)+$/, "") != "") email = "";
	return email;
}

// ########################################################
// Formatting functions

// ________________________________________________________
// convert to formatted integer
function format_integer(intconv) {
	intconv=toInt(intconv);
	if (intconv==0) { intconv=""; }
	else { intconv=addCommas(intconv); }
	return intconv;
}

// ________________________________________________________
// convert to formatted currency
function format_currency(curconv) {
	curconv=format_integer(curconv);
	if (curconv!="") { curconv="£"+curconv; }
	return curconv;
}

// ________________________________________________________
// convert to formatted date
function format_date(dateconv) {
	if (dateconv.length==8) { dateconv=dateconv.substr(6,2)+"/"+dateconv.substr(4,2)+"/"+dateconv.substr(0,4); }
	return verify_date(dateconv);
}


// ########################################################
// Comparison functions

// ________________________________________________________
// general compare routine (accepts <, <=, >, >=, or = operators)
function compare(var1, op, var2) {
	switch (op) {
		case "<":
			return (var1<var2); break;
		case "<=":
			return (var1<=var2); break;
		case ">":
			return (var1>var2); break;
		case ">=":
			return (var1>=var2); break;
		default:
			return (var1==var2);
	}
}

// ________________________________________________________
// compare two strings (length or string comparsion)
function compare_string(var1, op, var2) {

	var1 = String(var1);
	var1 = var1.toLowerCase();

	if (isNaN(var2)) {
		// string comparison
		var2 = String(var2);
		var2 = var2.toLowerCase();
	}
	else {
		// check string length
		var1 = var1.length;
		var2 = toInt(var2);
	}

	return compare(var1, op, var2);
}

// ________________________________________________________
// compare two integers
function compare_integer(var1, op, var2) {

	var1 = verify_integer(var1);
	if (var1=="") { var1 = "0"; }

	var2 = verify_integer(var2);
	if (var2=="") { var2 = "0"; }

	return compare(toInt(var1), op, toInt(var2));
}

// ________________________________________________________
// compare two currencies
function compare_currency(var1, op, var2) {

	var1 = verify_currency(var1);
	if (var1=="") { var1 = "0"; }

	var2 = verify_currency(var2);
	if (var2=="") { var2 = "0"; }

	return compare(toInt(var1), op, toInt(var2));
}

// ________________________________________________________
// compare two dates
function compare_date(var1, op, var2) {
	return compare(parseDate(verify_date(var1)), op, parseDate(verify_date(var2)));
}

// ________________________________________________________
// converts a date to yyyymmdd format
function parseDate(str) {
	var ret;
	if (str.length == 10) { ret = str.substr(6,4) + str.substr(3,2) + str.substr(0,2); }
	if (isNaN(ret)) { ret="0"; }
	return toInt(ret);
}

// ########################################################
// Miscellaneous functions

// ________________________________________________________
// converts a string to a decimal integer
function toInt(str) {
	var ret=0;
	var state=1;
	// clean string
	str = String(str);
	str = str.replace(/[^0-9-.]/g, "");
	// is this a negative value?
	if (str.charAt(0) == "-") {
		state = -1;
		str = str.replace(/-/g, "");
	}
	// if numeric
	if (!isNaN(str)) {
		// remove leading zeros
		str = str.replace(/^0+/g, "");
		// find integer and convert to correct state
		ret = Math.round(parseFloat(str) * state);
		if (isNaN(ret)) { ret=0; }
	}
	return ret;
}

// ________________________________________________________
// convert value to comma delimited
function addCommas(num) {
	var ret=String(toInt(num));
	var old;
	do {
		old=ret;
		ret=ret.replace(/(\d+)(\d{3})/g, "$1,$2");
	} while (ret!=old);
	return ret;
}