var bSetFocusOnError = false; // attempt to set focus to a problem field...may want to disable this if dealing with layers and hidden form fields

// the ultimate JavaScript validator - version two...looks for validation cues in the form and then uses
// version 1 to call the correct function and build an error message to show all errors to the user
function uValidator2(form, strValidInputClass, strInvalidInputClass) {
	var strAlertMessage = '';
	var strFieldName = '';
	var bValid = true; // assume we can submit the form unless we prove otherwise...
	var ptrField = null; // capture the field of the first bad form input and send them back there
	var arrInvalidFields = new Array(); // capture an array of pointers to invalid fields
	
	if (form._validationMessage && form._validationMessage.value != '') {
		strAlertMessage = form._validationMessage.value + '\n\n';
	}
	else {
		strAlertMessage = 'The following errors occurred with this form submission:\n\n';
	}
	
	// loop through the form looking for validation messages
	for (var i = 0; i < form.elements.length; i++) {
		if (form.elements[i].name.indexOf('_validate_') == 0) {
			// we've found an element to validate...
			// get the field name
			strFieldName = form.elements[i].name.split('validate_')[1];
			
			if (form.elements[strFieldName]) { // if this field exists...then try and validate it
				if (!uValidator(form.elements[strFieldName], form.elements[i].value, null)) {
					bValid = false;
					
					// hacky for now, but it will have to do...
					if (form.elements[i].value.indexOf('conditional') == -1) {
						arrInvalidFields.push(form.elements[strFieldName]);
					}
					else {
						var crazyString = eval(form.elements[i].value.split(':')[1]);
						arrInvalidFields.push(form.elements[crazyString.split('~')[1]]);
					}
					strAlertMessage += form.elements['_validateMessage_' + strFieldName].value + '\n';
				}
			}
		}	
	}
	
	if (bValid) {
		return true;	
	}
	else {
		alert(strAlertMessage);
		// things aren't valid...rip through all of the form fields and set their class back to valid
		if (strValidInputClass) {
			for (i = 0; i < form.elements.length; i++) {
				if (form.elements[i].name.indexOf('_') != 0 && form.elements[i].type != 'submit' && form.elements[i].type != 'button' && form.elements[i].type != 'checkbox' && form.elements[i].type != 'radio') {
					form.elements[i].className = strValidInputClass;
				}
			}
		}
		// mark the improperly filled out fields
		for (i = 0; i < arrInvalidFields.length; i++) {
			arrInvalidFields[i].className = strInvalidInputClass;
		}
		if (arrInvalidFields.length > 0) _setFocus(arrInvalidFields[0]);
		return false;	
	}
}

// the ultimate JavaScript validator - version one...displays the first error and then 
// returns false at that point...
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 _password_minLength(field, message, minLength) {
	return _text_minLength(field, message, minLength);
}

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);
		_setFocus(field);
		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);
		_setFocus(field);
		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);
		_setFocus(field);
		return false;
	}
	return true;
}

function _text_email(field, message) {
	if (!_validate_email(field.value)) {
		_sendAlert(message);
		_setFocus(field);
		return false;
	}
	return true;
}

function _text_numeric(field, message) {
	if (!_validate_numeric(field.value)) {
		_sendAlert(message);
		_setFocus(field);
		return false;
	}
	return true;
}

function _text_positiveNumeric(field, message) {
	if (!_validate_numeric_positive(field.value)) {
		_sendAlert(message);
		_setFocus(field);
		return false;
	}
	return true;
}

function _text_currency(field, message) {
	if (!_validate_currency(field.value)) {
		_sendAlert(message);
		_setFocus(field);
		return false;
	}
	return true;
}

function _text_postalCode_Canada(field, message) {
	if (field.value == '') {
		return true;
	}
	if (!_validate_postalCode_Canada(field.value)) {
		_sendAlert(message);
		_setFocus(field);
		return false;
	}
	return true;
}

function _text_dateGTE(field, message, compareField) {
	var compareField = field.form.elements[compareField];
	// make sure we're dealing with valid dates...
	if (!_validate_date_mmddyyyy(field.value) || !_validate_date_mmddyyyy(compareField.value)) {
		_sendAlert(message);
		_setFocus(field);
		return false;
	}
	else {
		if (!_validate_date_gte(new Date(field.value), new Date(compareField.value))) {
			_sendAlert(message);
			_setFocus(field);
			return false;
		}
		else {
			return true;
		}
	}
}

function _select_notFirst(field, message) {
	if (field.selectedIndex == 0) {
		_sendAlert(message);
		_setFocus(field);
		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);
		_setFocus(field);
		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);
		_setFocus(field);
		return false;
	}
	else
		return true;
}

function _select_conditional(field, message, conditionalExtras) {
	//'1~mlsnumber~nonEmpty|numeric'
	var bValueFound = false;
	
	var fieldValue = conditionalExtras.split('~')[0];
	if (field.length) {
		var conditionalField = field[0].form.elements[conditionalExtras.split('~')[1]];
	}
	else {
		var conditionalField = field.form.elements[conditionalExtras.split('~')[1]];
	}
	var conditionalValidation = conditionalExtras.split('~')[2].split('|').join(',');

	if (_getSelectValue(field) == fieldValue) {
		if (!uValidator(conditionalField, conditionalValidation, null)) {
			return false;
		}
		else {
			return true;
		}
	}
	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) {
			_setFocus(field[0]);
		}
		else {
			_setFocus(field);
		}
	}
	return valid;
}

function _radio_conditional(field, message, conditionalExtras) {
	//'1~mlsnumber~nonEmpty|numeric'
	var bValueFound = false;
	
	var fieldValue = conditionalExtras.split('~')[0];
	if (field.length) {
		var conditionalField = field[0].form.elements[conditionalExtras.split('~')[1]];
	}
	else {
		var conditionalField = field.form.elements[conditionalExtras.split('~')[1]];
	}
	var conditionalValidation = conditionalExtras.split('~')[2].split('|').join(',');

	if (_getRadioValue(field) == fieldValue) {
		if (!uValidator(conditionalField, conditionalValidation, null)) {
			return false;
		}
		else {
			return true;
		}
	}
	else {
		return true;
	}
}

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)?_setFocus(field):_setFocus(field[0]);
	}
	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);
		_setFocus(field[0]);
		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);
		_setFocus(field[0]);
		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);
	}
}

// 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 _setFocus(ptrField) {
	if (bSetFocusOnError) {
		field.focus();
	}
}

//------------------------------------------------------------------------------------
// Function to confirm action on an item
//------------------------------------------------------------------------------------
function confirmAction(msg) {
	// if no message is passed, use a generic one
	if (!msg) {
		msg = 'Are you sure you want to do this?';
	}
	
	if (confirm(msg)) {
		return true;
	}
	else {
		return false;
	}
}