// the ultimate JavaScript validator
function uValidator(uField, uValType, uEMessage) {
	// split the validation types into an array
	var valTypeArray = new Array();
	uValType = stripChars(uValType, ' ');
	if (uValType.indexOf(',') != -1) {
		valTypeArray = uValType.split(',')
	}
	else {
		valTypeArray[0] = uValType;
	}
	// trim all spaces in the inputs
	for (var i = 0; i < valTypeArray.length; i++) valTypeArray[i].replace(/ /gi, '');
	var functionName, extraArgs;

	for (i = 0; i < valTypeArray.length; i++) {
		extraArgs = '';
		// figure out if there are extra parameters
		if (valTypeArray[i].indexOf(':') != -1) {
			functionName = valTypeArray[i].split(':')[0];
			extraArgs = ',' + valTypeArray[i].split(':')[1];
		}
		else {
			functionName = valTypeArray[i];
		}
		var typeValue;
	
		(uField.type)?typeValue = uField.type.split('-')[0]:typeValue = uField[0].type.split('-')[0];

		if (!eval('_' + typeValue + '_' + functionName + '(uField, uEMessage' + extraArgs + ');'))
			return false;
	}

	return true;
}

function _textarea_nonEmpty(field, message) {
	return _text_nonEmpty(field, message);
}
function _password_nonEmpty(field, message) {
	return _text_nonEmpty(field, message);
}
function _file_nonEmpty(field, message) {
	return _text_nonEmpty(field, message);
}
function _hidden_nonEmpty(field, message) {
	return _text_nonEmpty(field, message);
}

function _password_match(field, message, matchField) {
	return _text_match(field, message, matchField);
}

function _text_match(field, message, matchField) {
	if (field.value != field.form.elements[matchField].value) {
		_sendAlert(message);
		field.focus()
		return false;
	}
	return true;
}

function _text_nonEmpty(field, message) {
	if (field.value == '') {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}
function _textarea_minLength(field, message, minLength) {
	return _text_minLength(field, message, minLength)
}
function _text_minLength(field, message, minLength) {
	if (field.value.length < minLength) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}
function _textarea_maxLength(field, message, maxLength) {
	return _text_maxLength(field, message, maxLength)
}
function _text_maxLength(field, message, maxLength) {
	if (field.value.length > maxLength) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}

function _text_email(field, message) {
	if (!_validate_email(field.value)) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}

function _text_numeric(field, message) {
	if (!_validate_numeric(field.value)) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}

function _text_positiveNumeric(field, message) {
	if (!_validate_numeric_positive(field.value)) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}

function _text_currency(field, message) {
	if (!_validate_currency(field.value)) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}

function _text_postalCode_Canada(field, message) {
	if (!_validate_postalCode_Canada(field.value)) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}

function _select_notFirst(field, message) {
	if (field.selectedIndex == 0) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	return true;
}

function _select_minSelected(field, message, minSelected) {
	var selectCount = 0;
	for (var i = 0; i < field.options.length; i++) {
		if (field.options[i].selected) {
			selectCount++;
		}
	}
	if (selectCount < minSelected) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	else
		return true;
}

function _select_maxSelected(field, message, maxSelected) {
	var selectCount = 0;
	for (var i = 0; i < field.options.length; i++) {
		if (field.options[i].selected) {
			selectCount++;
		}
	}
	if (selectCount > maxSelected) {
		_sendAlert(message);
		field.focus();
		return false;
	}
	else
		return true;
}

function _radio_notSelected(field, message) {
	var valid = false;
	for (var i = 0; i < field.length; i++) {
		if (field[i].checked) {
			valid = true;
			break;
		}
	}
	if (!valid) {
		_sendAlert(message);
		if (field.length) {
			field[0].focus();
		}
		else {
			field.focus();
		}
	}
	return valid;
}

function _checkbox_notSelected(field, message) {
	var valid = false;
	if (field.checked != undefined) {
		// single checkbox
		valid = field.checked;
	}
	else {
		for (var i = 0; i < field.length; i++) {
			if (field[i].checked) {
				valid = true;
				break;
			}
		}
	}
	if (!valid) {
		_sendAlert(message);
		(field.checked != undefined)?field.focus():field[0].focus();
	}
	return valid;
}

function _checkbox_minSelected(field, message, minSelected) {
	var selectCount = 0;
	for (var i = 0; i < field.length; i++) {
		if (field[i].checked) {
			selectCount++;
		}
	}
	if (selectCount < minSelected) {
		_sendAlert(message);
		field[0].focus();
		return false;
	}
	else
		return true;
}

function _checkbox_maxSelected(field, message, maxSelected) {
	var selectCount = 0;
	for (var i = 0; i < field.length; i++) {
		if (field[i].checked) {
			selectCount++;
		}
	}
	if (selectCount > maxSelected) {
		_sendAlert(message);
		field[0].focus();
		return false;
	}
	else
		return true;
}

// this function defends against null messages...if you don't want the validator
// to send the user an alert...just pass the "null" value as the message parameter
// or an empty string
function _sendAlert(message) {
	if (message && message != '') {
		alert(message);
	}
}

