/*
* Copyright (c) 1995-2005 Macromedia, Inc. All rights reserved. 
*/
// ColdFusion JavaScript functions for cfform client-side validation
var _CF_error_messages = new Array();
var _CF_error_fields = new Object();
var _CF_FirstErrorField = null;
var _CF_submit_status = new Array();

function _CF_signalLoad() {
	_CF_loaded = 1;
}

function _CF_onError(form_object, input_object, object_value, error_message) {
	if (_CF_error_fields[input_object] == null) {
		if (_CF_FirstErrorField == null) {
			_CF_FirstErrorField = input_object;
		}
		_CF_error_exists = true;
		_CF_error_fields[input_object] = error_message;
		_CF_error_messages[_CF_error_messages.length] = error_message;
	}
}


function _CF_onErrorAlert(msgArray) {
	//build error message string
	var errorStr = "";
	for (var i = 0; i < msgArray.length; i++) {
		errorStr += msgArray[i] + "\n";
	}

	alert(errorStr);
	return false;
}

/**
* called by the flash controls in an html form, to update the right hidden field
*/
function updateHiddenValue(val, form, name) {
	//alert(form +":" +name +":" +val);
	if (form == null || form == "") form = 0;
	if (document.forms[form] == null || document.forms[form][name] == null) {
		return;
	}
	document.forms[form][name].value = val;
}

function _CF_hasValue(obj, obj_type, obj_trim) {

	if (obj_type == "TEXT" || obj_type == "FILE" || obj_type == "PASSWORD" || obj_type == "CFTEXTAREA" || obj_type == "TEXTAREA" || obj_type == "CFTEXTINPUT") {
		if (obj.value.length == 0)
			return false;
		else
			if (obj_trim) {
			//trim whitespace - for backward compatability this is optional
			str = obj.value.replace(/^\s+/, '').replace(/\s+$/, '');
			if (str.length == 0)
			{ return false; }
		}
		return true;
	}
	else if (obj_type == "SELECT") {
		for (i = 0; i < obj.length; i++) {
			if (obj.options[i].selected)
				return true;
		}
		return false;
	}
	else if (obj_type == "SINGLE_VALUE_RADIO" || obj_type == "SINGLE_VALUE_CHECKBOX") {
		if (obj.checked)
			return true;
		else
			return false;
	}
	else if (obj_type == "RADIO" || obj_type == "CHECKBOX") {
		if (obj.length == undefined && obj.checked) {
			return true;
		} else {
			for (i = 0; i < obj.length; i++) {
				if (obj[i].checked)
					return true;
			}
		}
		return false;
	} else if (obj_type == "CFTREE") {
		if (obj['value'].length > 0) {
			return true;
		} else {
			return false;
		}
	} else {
		return true;
	}
}

function _CF_checkdate(object_value, required) {
	//Returns true if value is a date format or is NULL
	//otherwise returns false
	//trim whitespace before we validate

	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');
	object_value = object_value = object_value.replace(/{d \'/, '').replace(/'}/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}


	if (object_value.length == 0)
		return true;


	//Returns true if value is a date in the mm/dd/yyyy format
	isplit = object_value.indexOf('/');
	splitchr = "/";

	if (isplit == -1) {
		isplit = object_value.indexOf('.');
		splitchr = ".";
	}

	if (isplit == -1) {
		isplit = object_value.indexOf('-');
		splitchr = "-";
	}

	if (isplit == -1 || isplit == object_value.length)
		return false;

	var element1 = object_value.substring(0, isplit);
	// check for yyyy-mm-dd format
	if (element1.length == 4) {
		sYear = object_value.substring(0, isplit);
		isplit = object_value.indexOf(splitchr, isplit + 1);
		if (isplit == -1 || (isplit + 1) == object_value.length)
			return false;
		sMonth = object_value.substring((sYear.length + 1), isplit);
		sDay = object_value.substring(isplit + 1);
	}
	else {
		sMonth = object_value.substring(0, isplit);
		isplit = object_value.indexOf(splitchr, isplit + 1);
		if (isplit == -1 || (isplit + 1) == object_value.length)
			return false;
		sDay = object_value.substring((sMonth.length + 1), isplit);
		sYear = object_value.substring(isplit + 1);
	}

	if (!_CF_checkinteger(sMonth)) //check month
		return false;
	else
		if (!_CF_checkrange(sMonth, 1, 12)) //check month
		return false;
	else
		if (!_CF_checkinteger(sYear)) //check year
		return false;
	else
		if (sYear.length != 1 && sYear.length != 2 && sYear.length != 4)
		return false;
	else
		if (!_CF_checkrange(sYear, 0, 9999)) //check year
		return false;
	else
		if (!_CF_checkinteger(sDay)) //check day
		return false;
	else
		if (!_CF_checkday(sYear, sMonth, sDay)) // check day
		return false;
	else
		return true;

}


function _CF_checkeurodate(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');
	object_value = object_value = object_value.replace(/{d \'/, '').replace(/'}/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	isplit = object_value.indexOf('/');
	splitchr = "/";

	if (isplit == -1) {
		isplit = object_value.indexOf('.');
		splitchr = ".";
	}

	if (isplit == -1) {
		isplit = object_value.indexOf('-');
		splitchr = "-";
	}

	if (isplit == -1 || isplit == object_value.length)
		return false;

	var element1 = object_value.substring(0, isplit);
	// check for yyyy-mm-dd format
	if (element1.length == 4) {
		sYear = object_value.substring(0, isplit);

		isplit = object_value.indexOf(splitchr, isplit + 1);
		if (isplit == -1 || (isplit + 1) == object_value.length)
			return false;

		sMonth = object_value.substring((sYear.length + 1), isplit);
		sDay = object_value.substring(isplit + 1);

	}
	else {
		sDay = object_value.substring(0, isplit);
		isplit = object_value.indexOf(splitchr, isplit + 1);

		if (isplit == -1 || (isplit + 1) == object_value.length)
			return false;

		sMonth = object_value.substring((sDay.length + 1), isplit);
		sYear = object_value.substring(isplit + 1);

	}

	if (!_CF_checkinteger(sMonth))
		return false;
	else
		if (!_CF_checkrange(sMonth, 1, 12))
		return false;
	else
		if (!_CF_checkinteger(sYear))
		return false;
	else
		if (!_CF_checkrange(sYear, 0, null))
		return false;
	else
		if (!_CF_checkinteger(sDay))
		return false;
	else
		if (!_CF_checkday(sYear, sMonth, sDay))
		return false;
	else
		return true;
}


function _CF_checkday(checkYear, checkMonth, checkDay) {
	maxDay = 31;

	if (checkMonth == 4 || checkMonth == 6 ||
		checkMonth == 9 || checkMonth == 11)
		maxDay = 30;
	else if (checkMonth == 2) {
		if (checkYear % 4 > 0)
			maxDay = 28;
		else if (checkYear % 100 == 0 && checkYear % 400 > 0)
			maxDay = 28;
		else
			maxDay = 29;
	}

	return _CF_checkrange(checkDay, 1, maxDay);
}


function _CF_checkinteger(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');
	//remove numeric noise
	object_value = object_value.replace(/[$ŁĄ€,~+]?/g, '');


	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}


	var decimal_format = ".";
	var check_char = object_value.indexOf(decimal_format);

	if (check_char == -1)
		return _CF_checknumber(object_value);
	else
		return false;
}


function _CF_numberrange(object_value, min_value, max_value, required) {
	//trim whitespace before we validate
	//object_value = object_value.replace(/^\s+/,'').replace(/\s+$/,'');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}


	if (min_value != null) {
		if (object_value < min_value)
			return false;
	}

	if (max_value != null) {
		if (object_value > max_value)
			return false;
	}

	return true;
}


function _CF_checknumber(object_value, required) {
	var start_format = " .+-0123456789";
	var number_format = " .0123456789";
	var check_char;
	var decimal = false;
	var trailing_blank = false;
	var digits = false;

	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');
	//remove numeric noise
	object_value = object_value.replace(/[$ŁĄ€,~+]?/g, '');


	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}



	check_char = start_format.indexOf(object_value.charAt(0));

	if (check_char == 1)
		decimal = true;
	else if (check_char < 1)
		return false;

	for (var i = 1; i < object_value.length; i++) {
		check_char = number_format.indexOf(object_value.charAt(i));
		if (check_char < 0)
			return false;
		else if (check_char == 1) {
			if (decimal)
				return false;
			else
				decimal = true;
		}
		else if (check_char == 0) {
			if (decimal || digits)
				trailing_blank = true;
		}
		else if (trailing_blank)
			return false;
		else
			digits = true;
	}

	return true
}


function _CF_checkrange(object_value, min_value, max_value, required) {
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}


	if (!_CF_checknumber(object_value))
		return false;
	else
		return (_CF_numberrange((eval(object_value)), min_value, max_value));

	return true;
}


function _CF_checktime(object_value, required) {
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');
	// replace the {t'..'} format around the timestamp if it exists
	object_value = object_value = object_value.replace(/{t \'/, '').replace(/'}/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}


	var result = _CF_checkregex(object_value, /^(([0-1]?[0-9]|[2][1-4]):([0-5]?[0-9])(:[0-5]?[0-9])?).?([AP]M|[AP]m|[ap]m|[ap]M)?$/, required);
	return result;
}

/**
* validate that the value is formatted as a telephone correctly
* This pattern matches any US Telephone Number.
* This regular expression excludes the first number, after the area code,from being 0 or 1;
* it also allows an extension to be added where it does not have to be prefixed by 'x'.
*
* Matches: 
* 617.219.2000 
* 219-2000
* (617)283-3599 x234
* 1(222)333-4444
* 1 (222) 333-4444
* 222-333-4444
* 1-222-333-4444
* Non-Matches: 
* 44-1344-458606
* +44-1344-458606
* +34-91-397-6611
* 7-095-940-2000
* +7-095-940-2000
* +49-(0)-889-748-5516
*/
function _CF_checkphone(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	if (object_value.length == 0)
		return true;

	return _CF_checkregex(object_value, /^(((1))?[ ,\-,\.]?([\\(]?([1-9][0-9]{2})[\\)]?))?[ ,\-,\.]?([^0-1]){1}([0-9]){2}[ ,\-,\.]?([0-9]){4}(( )((x){0,1}([0-9]){1,5}){0,1})?$/, required);
}

/**
* validate that the value is formatted as a USA zipcode correctly
*
* This pattern will match any us zip code
* matches: 12345, 12345-1234
*/
function _CF_checkzip(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	return _CF_checkregex(object_value, /^([0-9]){5,5}$|(([0-9]){5,5}(-| ){1}([0-9]){4,4}$)/, required);
}


function _CF_checkcreditcard(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	if (object_value.length == 0)
		return true;
	var white_space = " -";
	var creditcard_string = "";
	var check_char;


	for (var i = 0; i < object_value.length; i++) {
		check_char = white_space.indexOf(object_value.charAt(i));
		if (check_char < 0)
			creditcard_string += object_value.substring(i, (i + 1));
	}

	if (creditcard_string.length < 13 || creditcard_string.length > 19)
		return false;

	if (creditcard_string.charAt(0) == "+")
		return false;

	if (!_CF_checkinteger(creditcard_string))
		return false;

	var doubledigit = creditcard_string.length % 2 == 1 ? false : true;
	var checkdigit = 0;
	var tempdigit;

	for (var i = 0; i < creditcard_string.length; i++) {
		tempdigit = eval(creditcard_string.charAt(i));

		if (doubledigit) {
			tempdigit *= 2;
			checkdigit += (tempdigit % 10);

			if ((tempdigit / 10) >= 1.0)
				checkdigit++;

			doubledigit = false;
		}
		else {
			checkdigit += tempdigit;
			doubledigit = true;
		}
	}

	return (checkdigit % 10) == 0 ? true : false;
}

/**
* validate that the value is formatted as a SSN# correctly
*
* this Pattern that the SSN number matches the different formats. (X = [0-9])
* matches: XXX-XX-XXXX, XXX XX XXXX, 
* non-match: XXXXXXXXX
*/
function _CF_checkssn(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	return _CF_checkregex(object_value, /^[0-9]{3}(-| )[0-9]{2}(-| )[0-9]{4}$/, required);
}

/**
* validate that the value is formatted as an email address correctly
*
* this regex matches the majoriity of all email address.
* example matches.
* Matches:  [rick.jones@unit.army.mil], [john_doe@foobar.com], [foo99@foo.co.uk]  
* Non-Matches:  [find_the_mistake.@foo.org], [.prefix.@some.net]
*
* _CF_checkURL mailto uses this same email regex - keep in sync.
*/
function _CF_checkEmail(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}


	//return _CF_checkregex(object_value, /^[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z]{2,7}$/);
	//return _CF_checkregex(object_value, /^[a-zA-Z_0-9-]+(?:\.[a-zA-Z_0-9-]+)*@(?:[a-zA-Z_0-9-]+\.)+[a-zA-Z]{2,7}$/);
	return _CF_checkregex(object_value, /^[a-zA-Z_0-9-'\+~]+(\.[a-zA-Z_0-9-'\+~]+)*@([a-zA-Z_0-9-]+\.)+[a-zA-Z]{2,7}$/, required);
}

/**
* validate that the value is formatted correctly for a http/https/ftp url
* This pattern will match http/https/ftp urls.
*
* Matches: http://www.mm.com/index.cfm
*          HTTP://WWW.MM.COM
*          http://www.mm.com/index.cfm?userid=1&name=mike+nimer
*          http://www.mm.com/index.cfm/userid/1/name/mike+nimer - trick used by cf developers so search engines can parse their sites (search engines ignore query strings)
*          ftp://www.mm.com/
*          ftp://uname:pass@www.mm.com/
*          mailto:email@address.com
*          news:rec.gardening
*          news:rec.gardening
*          http://a/
*			file://ftp.yoyodyne.com/pub/files/foobar.txt
* Non-Matches: www.yahoo.com
*              http:www.mm.com
*
* _CF_checkEmail - the mailto email check is the same as the _CF_checkEmail regex (keep in sync)
*/
function _CF_checkURL(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	//return _CF_checkregex(object_value.toLowerCase(), /^((http|https|ftp|file)\:\/\/([a-zA-Z0-0]*:[a-zA-Z0-0]*(@))?[a-zA-Z0-9-\.]+(\.[a-zA-Z]{2,3})?(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9-\._\?\,\'\/\+&amp;%\$#\=~])*)|((mailto)\:[\w-]+(?:\.[\w-]+)*@(?:[\w-]+\.)+[a-zA-Z0-9]{2,7})|((news)\:[a-zA-Z0-9\.]*)$/);
	return _CF_checkregex(object_value.toLowerCase(), /^((http|https|ftp|file)\:\/\/([a-zA-Z0-0]*:[a-zA-Z0-0]*(@))?[a-zA-Z0-9-\.]+(\.[a-zA-Z]{2,3})?(:[a-zA-Z0-9]*)?\/?([a-zA-Z0-9-\._\?\,\'\/\+&amp;%\$#\=~])*)|((mailto)\:[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*@([a-zA-Z0-9-]+\.)+[a-zA-Z0-9]{2,7})|((news)\:[a-zA-Z0-9\.]*)$/, required);
}

/**
* A string UUID value is required. A UUID is a string
* of length 35 formatted as XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX, where X is a
* hexadecimal digit (0-9 or A-F).
*/
function _CF_checkUUID(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	return _CF_checkregex(object_value, /[A-Fa-f0-9]{8,8}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{16,16}/, required);
}
/**
* A string GUID value is required. A GUID is a string
* of length 36 formatted as XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX, where X is a
* hexadecimal digit (0-9 or A-F).
*/
function _CF_checkGUID(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	return _CF_checkregex(object_value, /[A-Fa-f0-9]{8,8}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{4,4}-[A-Fa-f0-9]{12,12}/, required);
}

/**
* checks CF boolean value
* matches: true, false, 1, 0, yes, no
*/
function _CF_checkBoolean(object_value, required) {
	//trim whitespace before we validate
	object_value = object_value.replace(/^\s+/, '').replace(/\s+$/, '');

	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	if (object_value.toUpperCase() == "TRUE" || object_value.toUpperCase() == "YES" || (_CF_checknumber(object_value) && object_value != "0")) {
		return true;
	} else if (object_value.toUpperCase() == "FALSE" || object_value.toUpperCase() == "NO" || object_value == "0") {
		return true;
	} else {
		return false;
	}
}

function _CF_setFormParam(strFormName, strParamName, strParamValue) {
	var strObjName = "document['" + strFormName + "']['" + strParamName + "']";
	var obj = eval(strObjName);
	if (obj == undefined) {
		return false;
	} else {
		obj.value = strParamValue;
		return true;
	}
}


function _CF_checkregex(object_value, regexPattern, required) {
	if (required) {
		if (object_value.length == 0) {
			return false;
		}
	} else {
		if (object_value.length == 0) {
			return true;
		}
	}

	return regexPattern.test(object_value);
}


