/*
 * 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;
	}
	/*
	//ORIGINAL CODE
	else if (obj_type == "SELECT")
	{
		for (i=0; i < obj.length; i++)
		{
			if (obj.options[i].selected)
				return true;
		}
	   	return false;	
	}
	*/
	//MODIFIED CODE, VERSION 1
	//source: http://livedocs.adobe.com/coldfusion/5.0/CFML_Reference/Tags91.htm
	/*
	else if (obj_type == "SELECT"){
		for (i=0; i < obj.length; i++){
			if (obj.options[i].selected && obj.options[i].value != "")
			return true;
		}
		return false;
	}
	*/
	//MODIFIED CODE, VERSION 2
	//source: http://livedocs.adobe.com/coldfusion/5.0/CFML_Reference/Tags91.htm
	else if (obj_type == "SELECT"){
		if(!obj.multiple){
			var StartFrom=1;
		}
		else{
			var StartFrom=0;
		}
		for(i=StartFrom; 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);
}

