function errdisplay(fld, errfld, errmsg) {
	var retval = true;

	if (errmsg.length > 0) {
		errfld.firstChild.nodeValue = errmsg;
		fld.className = "errorfld";
		errfld.className = "showerrmsg";
		fld.focus();
		retval = false;
	} else {
		fld.className = "validfld";
		errfld.className = "hideerrmsg";
	}

	return retval;
}

function fieldval(fld, errfld, type, req) {
	var strval = fld.value;
	var errmsg = "";
	var re;

	switch (type) {
		case "alpha":
			re = /^[a-zA-Z\s-]+$/;
			break;
		case "alphanum":
			re = /^[\w\s]+$/;
			break;
		case "email":
			re = /^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/;
			break;
		default:
			re = /.*/;
	}

	if (strval.length == 0) {
		if (req) {
			errmsg = "Field cannot be empty";
		}
	} else {
		if (!strval.match(re)) {
			errmsg = "Input is invalid";
		}
	}

	return errdisplay(fld, errfld, errmsg);
}

function phoneval(fld, errfld, type, req) {
	var strval = fld.value;
	var errmsg = "";
	var phfmt;

	if (strval.length == 0) {
		if (req) {
			errmsg = "Field cannot be empty";
		}
	} else {
		var phfmt = phoneformat(strval, type)

		if (phfmt == -1) {
			errmsg = "Invalid phone no./format";
		} else {
			fld.value = phfmt;
		}
	}

	return errdisplay(fld, errfld, errmsg);
}

function dateval(fld, errfld, type, req) {
	var strval = fld.value;
	var errmsg = "";
	var datefmt;

	if (strval.length == 0) {
		if (req) {
			errmsg = "Field cannot be empty";
		}
	} else {
		var datefmt = dateformat(strval, type);

		if (datefmt == -1) {
			errmsg = "Invalid date";
		} else {
			fld.value = datefmt;
		}
	}

	return errdisplay(fld, errfld, errmsg);
}

function timeval(fld, errfld, type, req) {
	var strval = fld.value;
	var errmsg = "";
	var timefmt;

	if (strval.length == 0) {
		if (req) {
			errmsg = "Field cannot be empty";
		}
	} else {
		var timefmt = timeformat(strval, type);

		if (timefmt == -1) {
			errmsg = "Invalid time";
		} else {
			fld.value = timefmt;
		}
	}

	return errdisplay(fld, errfld, errmsg);
}

function phoneformat(strval, fmt) {
	var retval;

	if (strval.length > 0) {
		var nums = strval.replace(/[-\.\/\s\(\)]/g, "");

		switch (fmt) {
		case 0: //validate north american, return nums only
			re = /^1?[-\.\/\s]?((\(\d{3}\))|\d{3})[-\.\/\s]?(\d{3})[-\.\/\s]?(\d{4})$/;

			if (strval.match(re) && nums.length >= 10 && nums.length <= 11) {
				retval = nums;
			} else {
				retval = -1;
			}

			break;
		case 1: //validate north american, return format
			re = /^1?[-\.\/\s]?((\(\d{3}\))|\d{3})[-\.\/\s]?(\d{3})[-\.\/\s]?(\d{4})$/;

			if (strval.match(re)) {
				if (nums.length == 10) {
					retval = nums.substr(0, 3) + "-" + nums.substr(3, 3) + "-" + nums.substr(6, 4);
				} else if (nums.length == 11) {
					retval = nums.substr(0, 1) + "-" + nums.substr(1, 3) + "-" + nums.substr(4, 3) + "-" + nums.substr(7, 4);
				} else {
					retval = -1;
				}
			} else {
				retval = -1;
			}

			break;
		case 2: //validate international, return nums only
			re = /^((\+\d{1,3}[-\.\/\s]?\(?\d\)?[-\.\/\s]?\d{1,5})|(\(?\d{2,6}\)?))[-\.\/\s]?(\d{3,4})[-\.\/\s]?(\d{4})$/;

			if (strval.match(re)) {
				retval = nums;
			} else {
				retval = -1;
			}

			break;
		case 3: //validate international, return format
			re = /^((\+\d{1,3}[-\.\/\s]?\(?\d\)?[-\.\/\s]?\d{1,5})|(\(?\d{2,6}\)?))[-\.\/\s]?(\d{3,4})[-\.\/\s]?(\d{4})$/;

			if (strval.match(re)) {
				re = /^1?[-\.\/\s]?((\(\d{3}\))|\d{3})[-\.\/\s]?(\d{3})[-\.\/\s]?(\d{4})$/;

				if (strval.match(re)) {
					if (nums.length == 10) {
						retval = nums.substr(0, 3) + "-" + nums.substr(3, 3) + "-" + nums.substr(6, 4);
					} else if (nums.length == 11) {
						retval = nums.substr(0, 1) + "-" + nums.substr(1, 3) + "-" + nums.substr(4, 3) + "-" + nums.substr(7, 4);
					}
				} else {
					retval = strval;
				}
			} else {
				retval = -1;
			}

			break;
		default: //not specified; validate north american, return format
			re = /^1?[-\.\/\s]?((\(\d{3}\))|\d{3})[-\.\/\s]?(\d{3})[-\.\/\s]?(\d{4})$/;

			if (strval.match(re)) {
				if (nums.length == 10) {
					retval = nums.substr(0, 3) + "-" + nums.substr(3, 3) + "-" + nums.substr(6, 4);
				} else if (nums.length == 11) {
					retval = nums.substr(0, 1) + "-" + nums.substr(1, 3) + "-" + nums.substr(4, 3) + "-" + nums.substr(7, 4);
				} else {
					retval = -1;
				}
			} else {
				retval = -1;
			}

			break;
		}
	}

	return retval
}

function dateformat(strval, fmt) {
	var retval = "";

	delim = "(\\/|-|\\.|\\s)"
	re = "^\\d{1,2}" + delim + "(\\d{1,2}|jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)" + delim + "(\\d{2}|\\d{4})$";
	var elems;
	mos = new Array("", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
	var day;
	var month;
	var year;

	if (strval.length > 0) {
		if (!strval.match(RegExp(re, "i"))) {
			retval = -1;
		} else {
			lv_tempdelim = strval.match(RegExp(delim));
			lv_tempchar = String(lv_tempdelim).substring(0,1);
			elems = strval.split(lv_tempchar);
			
			day = parseInt(elems[0], 10);
			month = parseInt(elems[1], 10);

			if (!month) {
				for (i in mos) {
					if (mos[i].match(RegExp("^" + elems[1], "i"))) {
						month = parseInt(i, 10);
					}
				}
			}

			year = (elems[2].length == 2)? (2000 + parseInt(elems[2], 10)) : (parseInt(elems[2], 10));

			if (month == 2) {
				if ((year % 4 == 0 && year % 100 > 0) || year % 400 == 0) {
					if (day < 1 || day > 29) {
						retval = -1;
					}
				} else {
					if (day < 1 || day > 28) {
					retval = -1;
					}
				}				
			} else if (month == 4 || month == 6 || month == 9 || month == 11) {
				if (day < 1 || day > 30) {
					retval = -1;
				}
			} else if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {
				if (day < 1 || day > 31) {
					retval = -1;
				}
			} else {
				retval = -1;
			}

			if (retval != -1) {
				switch (fmt) {
				case "mmmmmmmmmddyyyy":
					retval = mos[month] + " " + day + ", " + year;
					break;
				case "yyyy-mm-dd":
					retval = year + "-" + ((month < 10)? "0" + month: month) + "-" + ((day < 10)? "0" + day: day);
					break;
				case "dd-mm-yyyy":
					retval = ((day < 10)? "0" + day: day) + "-" + ((month < 10)? "0" + month: month) + "-" + year;
					break;
				case "dd/mm/yyyy":
					retval = ((day < 10)? "0" + day: day) + "/" + ((month < 10)? "0" + month: month) + "/" + year;
					break;
				case "mm-dd-yyyy":
					retval = ((month < 10)? "0" + month: month) + "-" + ((day < 10)? "0" + day: day) + "-" + year;
					break;
				case "mm/dd/yyyy":
					retval = ((month < 10)? "0" + month: month) + "/" + ((day < 10)? "0" + day: day) + "/" + year;
					break;
				case "dd-mmm-yyyy":
					retval = ((day < 10)? "0" + day: day) + "-" + (mos[month].substr(0, 3)).toUpperCase() + "-" + year;
					break;
				default:
					retval = year + "-" + ((month < 10)? "0" + month: month) + "-" + ((day < 10)? "0" + day: day);
					break;
				}
			}
		}
	}

	return retval;
}

function timeformat(strval, fmt) {
	var retval = "";

	var re = /^\d{1,2}:?\d{2}(:?\d{2})?\s?([AaPp][Mm])?$/;

	var ap;
	var nums;
	var hour;
	var min;
	var sec;

	if (strval.length > 0) {
		if (strval.match(re)) {
			var ap = String(strval.match(/[AaPp][Mm]/)).toUpperCase();

			var nums = strval.replace(/[:\sAaPpMm]/g, "");

			switch (nums.length) {
			case 3: //hr, mins only
				hour = parseInt(nums.substr(0, 1), 10);
				min = parseInt(nums.substr(1, 2), 10);

				break;
			case 4: //hrs, mins only
				hour = parseInt(nums.substr(0, 2), 10);
				min = parseInt(nums.substr(2, 2), 10);

				break;
			case 5: //hr, mins, secs
				hour = parseInt(nums.substr(0, 1), 10);
				min = parseInt(nums.substr(1, 2), 10);
				sec = parseInt(nums.substr(3, 2), 10);

				break;
			case 6: //hrs, mins, secs
				hour = parseInt(nums.substr(0, 2), 10);
				min = parseInt(nums.substr(2, 2), 10);
				sec = parseInt(nums.substr(4, 2), 10);

				break;
			}

			if (sec > 59) {
				retval = -1;
			}

			if (min > 59) {
				retval = -1;
			}

			if (hour > 23) {
				retval = -1;
			} else {
				if (ap == "AM") {
					if (hour < 1 || hour > 12) {
						retval = -1;
					} else if (hour == 12) {
						hour = 0;
					}
				} else if (ap == "PM" && hour < 12) {
					hour = hour + 12;
				}
			}

			if (retval != -1) {
				switch (fmt) {
				case "12HH:MM:SS": //12-hour c secs
					hour = ((hour > 12)? (hour - 12): ((hour == 0)? 12: hour));

					retval = hour + ":" + ((min < 10)? "0" + min: min) + ":" + ((sec)? ((sec < 10)? "0" + sec: sec): "00");

					break;
				case "12HH:MM:SS AP": //12-hour c secs, am/pm
					ap = ((hour < 12)? "AM": "PM");
					hour = ((hour > 12)? (hour - 12): ((hour == 0)? 12: hour));

					retval = hour + ":" + ((min < 10)? "0" + min: min) + ":" + ((sec)? ((sec < 10)? "0" + sec: sec): "00") + " " + ap;

					break;
				case "24HH:MM:SS": //24-hour c secs
					retval = ((hour < 10)? "0" + hour: hour) + ":" + ((min < 10)? "0" + min: min) + ":" + ((sec)? ((sec < 10)? "0" + sec: sec): "00");

					break;
				case "12HH:MM": //12-hour s secs
					hour = ((hour > 12)? (hour - 12): ((hour == 0)? 12: hour));

					retval = hour + ":" + ((min < 10)? "0" + min: min) + " " + ap;

					break;
				case "12HH:MM AP": //12-hour s secs, am/pm
					ap = ((hour < 12)? "AM": "PM");
					hour = ((hour > 12)? (hour - 12): ((hour == 0)? 12: hour));

					retval = hour + ":" + ((min < 10)? "0" + min: min);

					break;
				case "24HH:MM": //12-hour s secs
					retval = ((hour < 10)? "0" + hour: hour) + ":" + ((min < 10)? "0" + min: min);

					break;
				default: //not specified; return 24-hour c secs
					retval = ((hour < 10)? "0" + hour: hour) + ":" + ((min < 10)? "0" + min: min) + ":" + ((sec)? ((sec < 10)? "0" + sec: sec): "00");

					break;
				}
			}
		} else {
			retval = -1;
		}
	}

	return retval;
}

