//
// form_util.js
// Copyright Jacky Kwok.
// Version: 4.0
// Last Updated: Tuesday, March 23, 2004
// Version confusion, combined version 2.4 and version 3.2, thus name it as 4.0
//

// last modifed: Tuesday, November 19, 2002
function chkWholeFrm(frm) {
	var ok = true;
	var checkBoxRadioArray = new Array();

	for (var i=0; i<frm.length; i++) {
		if (frm.elements[i].type) {
			if (frm.elements[i].type == "checkbox" || frm.elements[i].type == "radio") {
				ok = false;
				for (var j=0; j<checkBoxRadioArray.length; j++) {
					if (checkBoxRadioArray[j] == frm.elements[i].name) {
						ok = true;
						break;
					}
				}
				if (!ok) {
					if (isFilled(frm.elements[i])) {
						ok = true;
						if (checkBoxRadioArray.push) {
							checkBoxRadioArray.push(frm.elements[i].name);
						} else {
							checkBoxRadioArray[checkBoxRadioArray.length] = frm.elements[i].name;
						}
					}
				}
				if (ok) {
					continue;
				}
			}
		}

		if (!isFilled(frm.elements[i])) {
			ok = false;
		}
	}

	return ok;
}

// last modifed: Wednesday, November 15, 2002
function getFormElementType(elm) {
	return elm.type ? elm.type : elm[0].type;
}

// last modifed: Wednesday, November 15, 2002
function isFilled(elm) {
	var ok = true;
	var elmType = getFormElementType(elm);

	switch (elmType) {
	case "text":
		if (!trim(elm).value)
			ok = false;
		break;
	case "password":
		if (!elm.value)
			ok = false;
		break;
	case "textarea":
		if (!trim(elm.value))
			ok = false;
		break;
	case "radio":
		ok = false;
		if (elm.length) {
			for (var i=0; i<elm.length; i++) {
				if (elm[i].checked) {
					ok = true;
					break;
				}
	        	}
	        } else {
	        	if (elm.checked)
	        		ok = true;
	        }
		break;
	case "checkbox":
		ok = false;
		if (elm.length) {
			for (var i=0; i<elm.length; i++) {
				if (elm[i].checked) {
					ok = true;
					break;
				}
	        	}
	        } else {
	        	if (elm.checked)
	        		ok = true;
	        }
		break;
	case "select-one":
		if (!trim(elm[elm.selectedIndex].value))
			ok = false;
		break;
	case "select-multiple":
		if (elm.selectedIndex < 0)
			ok = false;
		break;
	case "file":
		if (!trim(elm.value))
			ok = false;
		break;
	}

	return ok;
}

function trim(elm) {
	var elmValue;
	if (elm.value)
		elmValue = elm.value;
	else
		elmValue = elm;

	if (String(elmValue).trim) {
		var tmp = String(elmValue).trim();
	} else {
		var tmp = String(elmValue).replace(/(^\s*)|(\s*$)/g, "");
	}

	if (elm.value) {
		elm.value = tmp;
		return elm;
	} else {
		return tmp;
	}
}

// last modifed: Thursday, February 07, 2002
function getCheckedRadioIndex(frm, name) {
	var rad = frm[name];
	if (rad) {
		for (var i=0; i<rad.length; i++) {
			if (rad[i].checked)
				return i;
		}
	}
	return -1;
}

function isValidDate(input_year, input_month, input_day) {
	var ok = true;
	var year, month, day;
	if (input_year.value)
		year = input_year.value;
	else
		year = input_year;
	if (input_month.value)
		month = input_month.value;
	else
		month = input_month;
	if (input_day.value)
		day = input_day.value;
	else
		day = input_day;

	var quotion = year % 4;
	if (month == 4 || month == 6 || month == 9 || month == 11) { // check small month
		if (day > 30)
			ok = false;
	} else if (month == 2) { // check Feb
		if (quotion != 0 && day > 28)
			ok = false;
		else if (quotion == 0 && day > 29)
			ok = false;
	} else {
		if (day > 31)
			ok = false;
	}

	return ok;	
}

function isValidEmail(elm) {
	var email;
	if (elm.value)
		email = elm.value;
	else
		email = elm;

	return ( email.search( /\w+((-\w+)|(\.\w+)|(\_\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z]{2,5}/ ) != -1 );
}

// accept format like "A1234563" and "A123456(3)", case insensitive
// will automatically convert the field from "A1234563" format to "A123456(3)" format
// return 1 if valid
// return 0 for check digit invalid
// return -1 for syntax error
// so that if you just use it as boolean, it will still work.
// last modifed: Friday, November 29, 2002
function isValidHKIC(elm) {
	var hkic;
	if (elm.value)
		hkic = elm.value;
	else
		hkic = elm;

	// convert syntax
	hkic = trim(hkic).toUpperCase();

	// validate syntax
	if ( hkic.search( /^[A-Z]{1,2}[0-9]......$/ ) == -1 ) {
		if ( hkic.search( /^[A-Z]{1,2}[0-9].....\([A0-9]\)$/ ) == -1 ) {
			return (-1);
		} else {
			hkic = hkic.substring(0, hkic.length-3) + hkic.charAt(hkic.length-2);
		}
	}

	// calculate "check digit"
	var checkSum = 0;
	if (hkic.length == 8) { // contains only 1 letter
		for (var i=0; i<hkic.length-1; i++) {
			var multiplyValue = hkic.length - i;
			if (i == 0 || (i == 1 && hkic.length == 9)) { // letter
				var eqNum = (Number(hkic.charCodeAt(i)) % 11) - 9;
				if (eqNum < 1)
					eqNum += 11;
				if (eqNum == 0)
					eqNum = 11;
			} else {
				var eqNum = Number(hkic.charAt(i));
			}
			checkSum += eqNum * multiplyValue;
		}
	}
	var checkDigit = checkSum % 11;
	if (checkDigit != 0)
		checkDigit = 11 - checkDigit;
	if (checkDigit == 10)
		checkDigit = "A";
	checkDigit = String(checkDigit);

	// convert the field to format like A123456(7)
	if (elm.value)
		elm.value = hkic.substring(0, hkic.length-1) + "(" + hkic.charAt(hkic.length-1) + ")";
	return ( (hkic.charAt(hkic.length-1) == checkDigit) ? 1 : 0 );
}

// arguments:
// 1. type (required), can be: "year", "month", "day", "hour", "minute"
// 2. field name (required)
// 3. which one is selected
// 4. how many options in select box
// 5. additional info to field (e.g. class)
// 6. dummy entry
function printCommonSelect() {
	if (arguments.length < 2)
		return;

	var today = new Date();

	var type = arguments[0];
	var fieldName = arguments[1];
	var selected = arguments.length > 4 ? -1 : 0;
	var numOfOptions;
	var initialValue;
	var additionalInfo = ""
	if (type == "year") {
		numOfOptions = 2;
	} else if (type == "month") {
		numOfOptions = 12;
		initialValue = 1;
	} else if (type == "day") {
		numOfOptions = 31;
		initialValue = 1;
	} else if (type == "hour") {
		numOfOptions = 24;
		initialValue = 0;
	} else if (type == "minute") {
		numOfOptions = 60;
		initialValue = 0;
	}

	if (arguments.length > 2) {
		if (arguments[2] != -1)
			selected = arguments[2];
	}

	if (arguments.length > 3) {
		if (arguments[3] != "")
			numOfOptions = arguments[3];
	}

	if (arguments.length > 4) {
		additionalInfo = arguments[4];
	}

	if (type == "year") {
		if (numOfOptions >= 0)
			initialValue = today.getFullYear();
		else {
			initialValue = today.getFullYear() + numOfOptions + 1;
			numOfOptions = -numOfOptions;
		}
	}

	var numOfDigits = String(initialValue + numOfOptions - 1).length;

	document.writeln('<select name="' + fieldName + '"' + additionalInfo + '>');
	for (var i=5; i<arguments.length; i++) {
		if (selected == -1) {
			document.writeln('  <option selected>' + arguments[i] + '</option>');
		} else {
			document.writeln('  <option>' + arguments[i] + '</option>');
		}
	}

	for (var i=initialValue; i < (initialValue + numOfOptions); i++) {
		if (i < 10) {
			display = "0" + i;
		} else {
			display = i;
		}
		if (i == selected) {
			document.writeln('  <option value="' + i + '" selected>' + zeroPaddingNumber(i, numOfDigits) + '</option>');
		} else {
			document.writeln('  <option value="' + i + '">' + zeroPaddingNumber(i, numOfDigits) + '</option>');
		}
	}
	document.writeln('</select>');
}

// arguments:
// 1. field name (required)
// 2. start number (required)
// 3. how many options in select box (required)
// 3. which one is selected
// 5. additional info to field (e.g. class)
// 6. dummy entry
function printNumSelect() {
	if (arguments.length < 3)
		return;

	var fieldName = arguments[0];
	var initialValue = arguments[1];
	var numOfOptions = arguments[2];
	var selected = arguments.length > 3 ? arguments[3] : -1;
	var additionalInfo = arguments.length > 4 ? arguments[4] : "";

	if (selected == -1 && arguments.length < 6)
		selected = initialValue;

	var numOfDigits = String(initialValue + numOfOptions - 1).length;

	document.writeln('<select name="' + fieldName + '"' + additionalInfo + '>');
	for (var i=5; i<arguments.length; i++) {
		if (selected == -1) {
			document.writeln('  <option selected>' + arguments[i] + '</option>');
		} else {
			document.writeln('  <option>' + arguments[i] + '</option>');
		}
	}

	for (var i=initialValue; i < (initialValue + numOfOptions); i++) {
		if (i == selected) {
			document.writeln('  <option value="' + i + '" selected>' + zeroPaddingNumber(i, numOfDigits) + '</option>');
		} else {
			document.writeln('  <option value="' + i + '">' + zeroPaddingNumber(i, numOfDigits) + '</option>');
		}
	}
	document.writeln('</select>');
}

// covert "num" to "digit" digits
// the result will be in string format of coz!
// e.g. zeroPaddingNumber(3, 5) returns "00003"
function zeroPaddingNumber(num, digit) {
	if (String(num).length < Number(digit))
		return "0" + zeroPaddingNumber(num, Number(digit) - 1);
	else
		return String(num);
}
