function requireValue(ctrl,message) {
	switch (ctrl.type) {
		case 'select-one':
		case 'select-multiple':
			if(ctrl.selectedIndex == -1 || ctrl.options[ctrl.selectedIndex].value.length == 0) {
				alert(message);
				ctrl.focus();
				return false;
			}
			break;
		case 'checkbox':
		case 'radio':
		// Single checkbox or radio
			if(!ctrl.checked) {
				alert(message);
				ctrl.focus();
				return false;
			}
			break;
		case 'text':
		case 'textarea':
		case 'password':
			if(ctrl.value.length == 0) {
				alert(message);
				ctrl.focus();
				return false;
			}
			break;
		default:
			// Check for multiple checkboxes or radios
			if(ctrl.length && ctrl.length > 1) {
				if(ctrl[0].type == 'checkbox' || ctrl[0].type == 'radio') {
					for(i=0;i<ctrl.length;i++) {
						if(ctrl[i].checked) return true;
					}
					// No checked controls found
					alert(message);
					return false;
				}
			}
	}
	return true;
}
function validateFormat(ctrl,format,message)
{
	ctrlval=ctrl.value;
	regexp=null;
	if(ctrlval.length)
	{
		switch(format)
		{
			case 'integer' :
				ctrlval=ctrlval.replace(/[ ]/g,"");
				regexp=/^[0-9]+$/;
				break;
			case 'float' :
				ctrlval=ctrlval.replace(/[ ]/g,"");
				regexp=/^[0-9]*(\.[0-9]+)?$/;
				break;
			case 'phone' :
				ctrlval=ctrlval.replace(/[- ()]/g,"");
				regexp=/^[0-9]{10}$/;
				break;
			case 'zipcode' :
				ctrlval=ctrlval.replace(/[ ]/g,"");
				regexp=/^[0-9]{5}(-[0-9]{4})?$/;
				break;
			case 'email' :
				ctrlval=ctrlval.replace(/[ ]/g,"");
				regexp=/^([a-z0-9][-a-z0-9_%.]*)?[a-z0-9]@[a-z0-9][-a-z0-9%.]*[.][a-z]{2,}$/i;
				break;
			case 'creditcard' :
				ctrlval=ctrlval.replace(/[- ]/g,"");
				if(!mod10(ctrlval)) {
					alert(message);
					ctrl.focus();
					return false;
				} else {
					regexp=/^[0-9]{13,16}$/;
					break;
				}
			case 'date' :
				ctrlval=ctrlval.replace(/-/g,"/");
				dt = new Date(ctrlval);
				if(isNaN(Date.parse(dt))) {
					alert(message);
					ctrl.focus();
					return false;
				} else return true;
			default:
				return true;
		}
		if(ctrlval.search(regexp)==-1)
		{	
			alert(message);
			ctrl.focus();
			return false;
		}
	}
	return true;
}
// Mod 10 check for credit card account numbers
function mod10(ccNum) {
	var checkdigit=0;
	for (i=0;i<ccNum.length;i++)
	{
		c=parseInt(ccNum.substr(ccNum.length-i-1,1),10);
		checkdigit += (((1+(i%2))*c)%10) + parseInt(((1+(i%2))*c)/10);
	}
	if(checkdigit % 10 != 0)
	{
		return false;
	}
	return true;
}
function matchfields(ctrl_1,ctrl_2,message) {
	if(ctrl_1.value != ctrl_2.value) {
		alert(message);
		ctrl_1.focus();
		return false;
	}
	return true;
}

// Shortcut functions, allowing you to pass in array of paired items 
function require(frm) {
	// require(myform,ctrlname,message[,ctrlname,message][,ctrlname,message]...)
	var i;
	for(i=1;i<arguments.length-1;i+=2) {
		ctrlname = arguments[i]; message = arguments[i+1];
		if(!requireValue(frm[ctrlname],message)) return false;
	}
	return true;
}
function checkformat(frm) {
	// format(myform,ctrlname,format,message[,ctrlname,format,message][,ctrlname,format,message]...)
	var i;
	for(i=1;i<arguments.length-2;i+=3) {
		ctrlname = arguments[i]; format = arguments[i+1];message = arguments[i+2];
		if(!validateFormat(frm[ctrlname],format,message)) return false;
	}
	return true;
}
