// 'global' misc_form_functions.js v1.6
var monthdays = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var monthnames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var daynames = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");

function getDaysForMonth(month, year) {
	if ((month == 2) && (year % 4 == 0) && ((year % 400 == 0) || !(year % 100 == 0))) {
		return (monthdays[month-1] + 1);
	} else {
		return monthdays[month-1];
	}
}

function year2yearindex(year, yearsArray) {
	for (var i=1; i<yearsArray.length; i++) {
		if (yearsArray[i] == year) {
			return i;
		}
	}
	return 0;
}

function formDateIsNotToday(datetype, formField, dateToday, dateCompare) {
	if (dateCompare.valueOf() == dateToday.valueOf()) { // today
		return(formError("Sorry, you cannot choose a "+datetype+" date of today", formField));
	}
	return true;
}

function getDaysBetweenDates(first_date, second_date) {
	//86400000 = 24 * 60 * 60 * 1000 = milliseconds in one day
	// in theory the parseInt shouldn't be needed, but without it we get fractional parts
	return Math.abs(parseInt((second_date.getTime() - first_date.getTime()) / 86400000));
}

function formDateIsAfterToday(datetype, formDayField, formMonthField, formYearField, formPresetField, dateToday, dateCompare, selectPreset) {
	if (dateCompare.valueOf() < dateToday.valueOf()) { // before today
		var badFormField;
		if (selectPreset) {
			badFormField = formPresetField;
		} else {
			// don't need to check before this year, because another bit of JavaScript only displays this year and next year
			// so the first if below is merely here for completeness
			if (dateCompare.getFullYear() < dateToday.getFullYear()) { // before this year
				badFormField = formYearField;
			} else if (dateCompare.getMonth() < dateToday.getMonth()) { //before this month
				badFormField = formMonthField;
			} else if (dateCompare.getDate() < dateToday.getDate()) { //before this date
				badFormField = formDayField;
			}
		}
		return(formError("Invalid "+datetype+" date, before today", badFormField));
	}
	return true;
}

function formDateIsLessThanYearFromToday(datetype, formDayField, formMonthField, formYearField, formPresetField, dateToday, dateCompare, selectPreset) {
	// today + 1 year
	var dateOneYearAfterToday = new Date(dateToday);
	dateOneYearAfterToday.setFullYear(dateOneYearAfterToday.getFullYear() + 1);
	if (dateCompare.valueOf() > dateOneYearAfterToday.valueOf()) {
		var badFormField;
		if (selectPreset) {
			badFormField = formPresetField;
		} else {
			// don't need to check after next year, because another bit of JavaScript only displays this year and next year
			// so the first if below is merely here for completeness
			if (dateCompare.getFullYear() > dateOneYearAfterToday.getFullYear()) { //after next year
				badFormField = formYearField;
			} else if (dateCompare.getMonth() > dateOneYearAfterToday.getMonth()) { //after this month
				badFormField = formMonthField;
			} else if (dateCompare.getDate() > dateOneYearAfterToday.getDate()) { //after this date
				badFormField = formDayField;
			}
		}
		return(formError("Sorry, you cannot choose a "+datetype+" date more than a year in advance", badFormField));
	}
	return true;
}

function formDateIsValid(datetype, formDayField, formMonthField, formYearField, yearsArray) {
	if (formDayField.selectedIndex == 0) {
		return(formError("Please enter a "+datetype+" Day", formDayField));
	}
	if (formMonthField.selectedIndex == 0) {
		return(formError("Please enter a "+datetype+" Month", formMonthField));
	}
	if (formYearField.selectedIndex == 0) {
		return(formError("Please enter a "+datetype+" Year", formYearField));
	}
	// Check valid date
	if (formDayField.selectedIndex > getDaysForMonth(formMonthField.selectedIndex, yearsArray[formYearField.selectedIndex])) {
		return(formError("Invalid "+datetype+" date", formDayField));
	}
	return true;
}

function formfields2date(formDayField, formMonthField, formYearField, yearsArray) {
	if ((formDayField.selectedIndex != 0) && (formMonthField.selectedIndex != 0) && (formYearField.selectedIndex != 0)) {
		if (formDayField.selectedIndex <= getDaysForMonth(formMonthField.selectedIndex, yearsArray[formYearField.selectedIndex])) {
			return new Date(yearsArray[formYearField.selectedIndex], formMonthField.selectedIndex-1, formDayField.selectedIndex);
		}
	}
}

function date2formfields(date, formDayField, formMonthField, formYearField, yearsArray) {
	var dayIndex = 0;
	var monthIndex = 0;
	var yearIndex = 0;
	if (date != null) {
		dayIndex = date.getDate();
		monthIndex = date.getMonth()+1;
		yearIndex = year2yearindex(date.getFullYear(), yearsArray);
	}
	formDayField.selectedIndex = dayIndex;
	formMonthField.selectedIndex = monthIndex;
	formYearField.selectedIndex = yearIndex;
}

function date2string(date, separator) {
	return date.getDate()+separator+monthnames[date.getMonth()]+separator+date.getFullYear();
}

function date2daystring(date) {
	return daynames[date.getDay()]+' '+date2string(date, " / ");
}

function formDateCheck(datetype, formDayField, formMonthField, formYearField, dateToday, yearsArray) {
	// Check a complete valid date has been entered
	if (!formDateIsValid(datetype, formDayField, formMonthField, formYearField, yearsArray)) return false;
	// the requested delivery date
	var deliveryDate = formfields2date(formDayField, formMonthField, formYearField, yearsArray);
	// Check not before today
	if (!formDateIsAfterToday(datetype, formDayField, formMonthField, formYearField, null, dateToday, deliveryDate, false)) return false;
	// Check not today
	if (!formDateIsNotToday(datetype, formDayField, dateToday, deliveryDate)) return false;
	// Check not more than a year ahead
	if (!formDateIsLessThanYearFromToday(datetype, formDayField, formMonthField, formYearField, null, dateToday, deliveryDate, false)) return false;
	// all tests were okay!
	return true;
}

function formBlankError(message, formfield) {
	if (formfield != null) {
		formfield.value = "";
	}
	return formError(message, formfield);
}

function formError(message, formfield) {
	alert(message);
	if (formfield != null) {
		formfield.focus();
	}
	return false;
}

function isBlank(fieldvalue) {
	if (fieldvalue == null) return true;
	if (fieldvalue.length == 0) return true;
	var blankchars = " \t\n\r";
	for (var i=0; i<fieldvalue.length; i++) {
		var letter = fieldvalue.charAt(i);
		if (blankchars.indexOf(letter) == -1) return false;
	}
	return true;
}

function hasBlank(fieldvalue) {
	if (fieldvalue.indexOf(' ') != -1) return true;
	if (fieldvalue.indexOf('\t') != -1) return true;
	if (fieldvalue.indexOf('\n') != -1) return true;
	return false;
}

function isEmail(email) {
	if (isBlank(email)) return false;
	if (hasBlank(email)) return false;
	var atpos = email.indexOf('@');
	if ((atpos < 1) || (atpos > email.length - 4)) return false;
	if (email.charAt(atpos + 1) == '.') return false;
	var dotpos = email.lastIndexOf('.');
	if ((dotpos < atpos + 2) || (dotpos > email.length - 2)) return false;
	return true;
}

function checkBlank(label, formfield) {
	if (isBlank(formfield.value)) {
		return(formBlankError("Please enter " + label, formfield));
	}
	return true;
}

function checkEmail(label, formfield) {
	if (!checkBlank(label, formfield)) return false;
	if (hasBlank(formfield.value)) {
		return(formError("Please check there are no spaces in " + label, formfield));
	}
	if (!isEmail(formfield.value)) {
		return(formError("Please check " + label + " is correct", formfield));
	}
	return true;
}

function checkNumber(label, formfield) {
	if (!checkBlank("the "+label, formfield)) return false;
	if (isNaN(formfield.value)) {
		return(formBlankError("Please enter a valid "+label, formfield));
	}
	return true;
}

function checkOrderReference(label, formfield) {
	if (!checkBlank("the "+label, formfield)) return false;
	if (formfield.value.length != 7) {
		return(formError("Please enter a valid "+label, formfield));
	}
	return true;
}

function formatPenceAs(input, currency) {
	var inputNum = parseInt(input);
	var sign = ""; var pounds = "0"; var pence = "00";
	if (isNaN(inputNum)) {
		inputNum = "";
	} else {
		if (inputNum < 0) {
			sign = "-";
			inputNum *= -1;
		}
		var inputTxt = "" + inputNum;
		var txtLen = inputTxt.length;

		if (txtLen < 3) {
			pounds = "0";
			pence = inputTxt;
			while (pence.length < 2) {
				pence = "0" + pence;
			}
		} else {
			pounds = inputTxt.substr(0, txtLen-2);
			pence = inputTxt.substr(txtLen-2,txtLen);
		}
	}
	return sign+currency+pounds+"."+pence;
}

function escapeField(formfield) {
	formfield.value = replace(formfield.value,'"',"'");
}

function setList(type, category, string, formName, changeFunc) {
	var changeFuncString;
	if (changeFunc != null) {
		changeFuncString = " onChange='" + changeFunc + "'";
	}
	writeout(type + "_list", "<INPUT TYPE=HIDDEN NAME='" + type + "list' VALUE='" + category + "'><SELECT NAME='" + type + "'" + changeFuncString +">" + string + "</SELECT>");
	eval("document." + formName + "." + type + ".disabled = " + (category == 0));
}

function showCategory(type, category, formName, changeFunc) {
	if (eval("parseInt(document." + formName + "." + type + "list.value) != " + category)) {
		string = eval(type + "list[" + category + "]");
		setList(type, category, string, formName, changeFunc);
	}
}

function checkFieldOptions(type, typePreset, typeCategory, formName, changeFunc) {
	if (typePreset == "Any") {
		showCategory(type, typeCategory, formName, changeFunc);
	} else {
		setList(type, 0, "<OPTION>" + typePreset + "</OPTION>", formName);
	}
}

function checkNonCategoryFieldOptions(type, typePreset, typeNonPreset, formName, changeFunc) {
	if (typePreset == "Any") {
		setList(type, 1, typeNonPreset, formName, changeFunc);
	} else {
		setList(type, 0, "<OPTION>" + typePreset + "</OPTION>", formName);
	}
}

