//
// field_validation.js
//
// Usage:
//
// FORM HTML TAG:
// <form name="TEST" method="post" action="index.php" onsubmit="return(validateForm(document.TEST))">
//
// INCLUDE THIS CODE IN YOUR FORM:
// USE THE FUNCTION EXAMPLES AND FIELD REFERENCES THAT WORK FOR YOUR FORM
//
// <script src="../classes/field_validation.js" Language="JavaScript"></script>
// <script language="JavaScript" type="text/JavaScript">
// function validateForm(theForm)
// {
//    	if (!validRequired(theForm.elements["Login"],"Login Name"))
//            	return false;
//    	if (!validRequired(theForm.elements["FieldValues[FirstName]"],"First Name"))
//        	return false;
//	if (!validEmail(theForm.email,"Email Address",true))
//		return false;
//	if (!validDate(theForm.available,"Date Available",true))
//		return false;
//	if (!validNum(theForm.yearsexperience,"Years Experience",true))
//		return false;
//    	return true;
// }
// </script>
//
// --------------------------------------------------------
//
// Here's another version of the code to include in the form when using CHTML's TRSubmit().
// This way, the Javascript won't attempt to validate any fields in the form if the user
// selects the 'Cancel' or 'Delete' buttons.
//
// <script language="JavaScript" type="text/JavaScript">
//    function validateForm(theForm)
//    {
//        // Canceling or deleting -- don't check the fields
//        if ( sButton != 'SaveChanges' )
//        {
//            return true;
//        }
//        // Saving -- validate fields
//        else
//        {
//            if (!validRequired(theForm.elements["FieldValues[FirstName]"],"First Name"))
//                return false;
//            if (!validRequired(theForm.elements["FieldValues[LastName]"],"Last Name"))
//                return false;
//            if (!validRequired(theForm.elements["FieldValues[Password]"],"Password"))
//                return false;
//            if (!validRequired(theForm.ConfirmPwd,"Confirm Password"))
//                return false;
//            if (!validEmail(theForm.elements["FieldValues[EmailAddress]"],"Email Address",true))
//                return false;
//        }
//        return true;
//    }
//</script>

// This variable is set by CHTML's TRSubmit(), and is declared here to
// work around a bug in IE/Win.
// If not using CHTML, leaving this in shouldn't hurt anything
var sButton = '';

function isEmailAddr(email)
{
  var result = false;
  var theStr = new String(email);
  var index = theStr.indexOf("@");
  if (index > 0)
  {
    var pindex = theStr.indexOf(".",index);
    if ((pindex > index+1) && (theStr.length > pindex+1))
	result = true;
  }
  return result;
}

function validRequired(formField,fieldLabel, condition)
{
	var result = true;
	
	if ( condition == false)
		return true;
	else
	{
		if (formField.value == "")
		{
			alert('Please enter a value for the "' + fieldLabel +'" field.');
			formField.focus();
			result = false;
		}
	}
	return result;
}

function allDigits(str)
{
	return inValidCharSet(str,"0123456789");
}


function containsDigits(str)
{
	var charset = "0123456789";
	var result = false;

	// Note: doesn't use regular expressions to avoid early Mac browser bugs
	for (var i=0;i<str.length;i++)
		if (charset.indexOf(str.substr(i,1))>0)
		{
			result = true;
			break;
		}

	return result;
}

function inValidCharSet(str,charset)
{
	var result = true;

	// Note: doesn't use regular expressions to avoid early Mac browser bugs
	for (var i=0;i<str.length;i++)
		if (charset.indexOf(str.substr(i,1))<0)
		{
			result = false;
			break;
		}

	return result;
}

function validEmail(formField,fieldLabel,required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel))
		result = false;

	if (!required && formField.value == '')
	{
		result = true;
	}
	else if (result && ((formField.value.length < 3) || !isEmailAddr(formField.value)) )
	{
		alert("Please enter a complete email address in the form: yourname@yourdomain.com");
        formField.select();
		formField.focus();
		result = false;
	}

  return result;

}

function validDropDown(formField,fieldLabel)
{
	var result = true;
	if (formField.selectedIndex == 0)
	{
		alert('Please select a value for the "' + fieldLabel +'" field.');
		formField.focus();
		result = false;
	}

	return result;
}

function validIsChecked(formField,fieldLabel)
{
	var result = true;
	if (!formField.checked)
	{
		alert('You must check the "' + fieldLabel +'" field to continue.');
		formField.focus();
		result = false;
	}

	return result;
}

function validRequiredRadio(formField, fieldLabel, condition)
{
	var result = true;
	var i = 0;
	
	if ( condition == false)
		return true;
	else
	{
		result = false;
		if (formField.length == undefined)
		{
			// Only one radio option
			if (formField.checked)
			{
				result = true;
			}
		}
		else
		{
			for (i = 0; i < formField.length; ++i)
			{
				if (formField[i].checked)
				{
					result = true;
				}
			}
		}
		if (!result)
		{
			alert('Please select an option for the ' + fieldLabel +' field.');
		}
	}
	return result;
}

function validRequiredSelect(formField, fieldLabel, condition)
{
	var result = true;
	
	if ( condition == false)
		return true;
	else
	{
		if ((formField.options.selectedIndex <= 0))
		{
			alert('Please select an option for the ' + fieldLabel +' field.');
			formField.focus();
			result = false;
		}
	}
	return result;
}

function validRequiredMultipleSelect(formField, fieldLabel, condition)
{
	var result = true;
	var aSelected = new Array();
	
	if ( condition == false)
		return true;
	else
	{
		var iLen = formField.options.length;
		var iCnt = 0;
		for (i = 0; i < iLen; ++i)
		{
			if (formField.options[i].selected)
			{
				aSelected[iCnt] = i;
				++iCnt;
			}
		}
		if (aSelected.length == 0)
		{
			alert('Please select at least one option for the ' + fieldLabel +' field.');
			formField.focus();
			result = false;
		}
	}
	return result;
}

function validNum(formField,fieldLabel,required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel))
		result = false;

 	if (result)
 	{
 		if (!allDigits(formField.value))
 		{
 			alert('Please enter a number for the "' + fieldLabel +'" field.');
            formField.select();
			formField.focus();
			result = false;
		}
	}

	return result;
}

function validSelect(formField, fieldLabel)
{
	var result = true;
	if (formField.options.selectedIndex <= 0)
	{
		alert('Please select an option for the ' + fieldLabel +' field.');
		formField.focus();
		result = false;
	}
	return result;
}

//
// Note: if your goal is to prevent people from typing things like
// "1234foo", then use validNum(). This function won't return false
// on "1234foo" due to the way parseInt() behaves.
//
function validInt(formField,fieldLabel,required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel))
		result = false;

 	if (result)
 	{
 		var num = parseInt(formField.value,10);
 		if (isNaN(num))
 		{
 			alert('Please enter a number for the "' + fieldLabel +'" field.');
            formField.select();
			formField.focus();
			result = false;
		}
	}

	return result;
}


function validDate(formField,fieldLabel,required)
{
	var result = true;
    formField.value = formField.value.replace(/^\s*|\s*$/g,"");
	if (required && !validRequired(formField,fieldLabel))
		result = false;
        
    if (!required && formField.value.length == 0 )
        return true;

 	if (result)
 	{
 		var elems = formField.value.split("/");

 		result = (elems.length == 3); // should be three components

 		if (result)
 		{
 			var month = parseInt(elems[0],10);
  			var day = parseInt(elems[1],10);
 			var year = parseInt(elems[2],10);
			result = allDigits(elems[0]) && (month > 0) && (month < 13) &&
					 allDigits(elems[1]) && (day > 0) && (day < 32) &&
	//				 allDigits(elems[2]) && ((elems[2].length == 2) || (elems[2].length == 4));
                     allDigits(elems[2]) && ((elems[2].length == 4));
 		}

  		if (!result)
 		{
 			alert('Please enter a date in the format MM/DD/YYYY for the "' + fieldLabel +'" field.');
            formField.select();
			formField.focus();
		}
	}

	return result;
}

// 
// Determines if the field value is a decimal number.
// formField - the field containing the value to test
// fieldLabel - the label to display in an error message
// numRequiredDecimalPlaces - the minimum number of decimal places that the number must have
// maxDecimalPlaces - the maximum number of decimal places the number must have
// required - whether the field is required or not
//
function validDecimal(formField, fieldLabel, numRequiredDecimalPlaces, maxDecimalPlaces, required)
{
    var result = true;
    
    if ( numRequiredDecimalPlaces > maxDecimalPlaces )
        return false;
        
    if ( required && !validRequired(formField, fieldLabel) )
        return false;
        
    if ( result )
    {
        if ( isNaN(formField.value) )
        {
            result = false;
        }
        else
        {
            if ( formField.value.indexOf('.') == -1 )
            {
                if ( numRequiredDecimalPlaces > 0 ) 
                {
                    result = false;
                }
                else
                {
                    return true;
                }
            }
            else
            {
                iDecimalPointIndex = formField.value.indexOf('.');
                decimalPart = formField.value.substring( iDecimalPointIndex + 1, formField.value.length );
                if ( decimalPart.length > maxDecimalPlaces ||
                     decimalPart.length < numRequiredDecimalPlaces )
                    result = false;
            }
        }
    }
    
    if ( !result )
    {
        alert ("Please enter a decimal number (without commas) for the " + fieldLabel + " field.\n" + 
               "(Use at least " + numRequiredDecimalPlaces + " decimal places and " +
               "at most " + maxDecimalPlaces + " decimal places.)" );
        formField.select();
        formField.focus();
    }
    return result;
}

// Determines if the field value is formatted like a phone number: ###-###-####
// formField - the field containing the value to test
// fieldLabel - the label to display in an error message
// required - whether the field is required or not
//
function validPhone( formField, fieldLabel, required )
{
    result = true;
    if ( required && !validRequired(formField, fieldLabel) )
    {
        return false;
    }
    
    fieldValue = formField.value;
    if ( !required && fieldValue.length == 0 )
        return true;
            
    if ( fieldValue.length != 12 )
    {
        result = false;
    }
    else
    {
        // Note: doesn't use regular expressions to avoid early Mac browser bugs
        result = allDigits(fieldValue.substr(0,3));
        result = result && (fieldValue.charAt(3) == '-');
        result = result && allDigits(fieldValue.substr(4,3));
        result = result && (fieldValue.charAt(7) == '-');
        result = result && allDigits(fieldValue.substr(8,4));
    }
    
    if (!result)
    {
        alert ("Please enter a phone number in the " + fieldLabel + " field\n" + 
           "in the following format: ###-###-####" );
        formField.select();
        formField.focus();
        return false;
    }
    else
    {
        return true;
    }
}

// 
// Determines if the field value is formatted like an SSN: ####-##-####
// formField - the field containing the value to test
// fieldLabel - the label to display in an error message
// required - whether the field is required or not
//
function validSSN( formField, fieldLabel, required )
{   

    result = true;
    if ( required && !validRequired(formField, fieldLabel) )
    {
        return false;
    }
    
    fieldValue = formField.value;
    if ( !required && fieldValue.length == 0 )
        return true;
        
    if ( fieldValue.length != 11 )
    {
        result = false;
    }
    else
    {
        // Note: doesn't use regular expressions to avoid early Mac browser bugs
        result = allDigits(fieldValue.substr(0,3));
        result = result && (fieldValue.charAt(3) == '-');
        result = result && allDigits(fieldValue.substr(4,2));
        result = result && (fieldValue.charAt(6) == '-');
        result = result && allDigits(fieldValue.substr(7,4));
    }
    
    if (!result)
    {
        alert ("Please enter a Social Security Number in the " + fieldLabel + " field\n" + 
           "in the following format: ###-##-####" );
        formField.select();
        formField.focus();
        return false;
    }
    else
    {
        return true;
    }
}

function validUSZipCode(formField, fieldLabel, required)
{
    result = true;
    if ( required && !validRequired(formField, fieldLabel) )
    {
        return false;
    }
	
    fieldValue = formField.value;
    if ( !required && fieldValue.length == 0 )
        return true;
    
    if ( fieldValue.length == 5 )
    {
        result = allDigits(fieldValue.substr(0,5));
    }
    else if ( fieldValue.length == 10 )
    {
        // Note: doesn't use regular expressions to avoid early Mac browser bugs
        result = allDigits(fieldValue.substr(0,5));
        result = result && (fieldValue.charAt(5) == '-');
        result = result && allDigits(fieldValue.substr(6,4));
    }
    else
        result = false;
    
    if (!result)
    {
        alert ("Please enter a zip code in the " + fieldLabel + " field\n" + 
           "in the following format: ##### or ######-####" );
        formField.select();
        formField.focus();
        return false;
    }
    else
    {
        return true;
    }
}

function validAlpha(formField, fieldLabel, required)
{
	var result = true;

	if (required && !validRequired(formField,fieldLabel))
		result = false;

 	if (result)
 	{
 		if (containsDigits(formField.value))
 		{
 			alert('Please enter text without numbers for the "' + fieldLabel +'" field.');
            formField.select();
			formField.focus();
			result = false;
		}
	}

	return result;

}
