// Last Update: June 29, 2001 ( sY )

var errorMessage;

var CONTROL_TYPE        = 0;
var CONTROL_NAME        = 1;
var CONTROL_REQUIRED    = 2;
var CONTROL_DATATYPE    = 3;

var STRING_DATATYPE             = 0;
var INTEGER_DATATYPE            = 1;
var DATE_DATATYPE               = 2;
var REAL_DATATYPE               = 3;
var US_PHONENUMBER_DATATYPE     = 4;
var EMAIL_DATATYPE              = 5;

// Usage:
// ControlName, FriendlyName, Required? (T/F), DataType

function isEmpty( str ) 
{
    var localStr = Trim( str );
    return ( str == null || localStr.length == 0 );
}

function isDigit( c )
{
    return ( (c >= '0') && (c <= '9') );
}

function RTrim( strMyString ) 
{
    return ( strMyString.replace(/^\s*/,"") );
}
 
function LTrim( strMyString ) 
{
    return ( strMyString.replace(/\s*$/, "") );
}
 
function Trim( strMyString ) 
{
    return ( RTrim(LTrim(strMyString)) );
}


function isEmail( str )
{      
    var regExpPattern = /^([0-9a-zA-Z_&.+-]+!)*[0-9a-zA-Z_&.+-]+@(([0-9a-zA-Z]([0-9a-zA-Z-]*[0-9a-zA-Z])?\.)+[a-zA-Z]{2,3}|([0-9]{1,3}\.){3}[0-9]{1,3})$/;
    
    return ( null != str.match( regExpPattern ) );
}

function isValidDate( dateStr, showAlerts ) 
{
	
    // Checks for the following valid date formats:
    // MM/DD/YY   MM/DD/YYYY   MM-DD-YY   MM-DD-YYYY
    // Also separates date into month, day, and year variables
    
    var datePat = /^(\d{1,2})(\/|-)(\d{1,2})\2(\d{2}|\d{4})$/;
    
    if ( !isEmpty( dateStr ) )
    { 
        var matchArray = dateStr.match( datePat ); // is the format ok?
       
        if ( matchArray == null ) 
        {
            if ( showAlerts ) 
                alert("Date [" + dateStr + "] is not in a valid format.")
            return false;
        }
    
        var month    = matchArray[1]; // parse date into variables
        var day      = matchArray[3];
        var year     = matchArray[4];
        
        
        if ( month < 1 || month > 12 ) 
        { 
            // check month range
            if ( showAlerts ) 
                alert("Month in [" + dateStr + "] must be between 1 and 12.");
            return false;
        }
    
        if ( day < 1 || day > 31 ) 
        {       
            if ( showAlerts )  
                alert("Day must be between 1 and 31.");
            return false;
        }
        
        if ( ( month == 4 || month == 6 || month == 9 || month == 11 ) && day == 31 ) 
        {
            if ( showAlerts ) 
                alert("Month " + month + " in [" + dateStr + "] doesn't have 31 days!")
            return false
        }
        
        if ( month == 2 ) 
        {   
            // check for february 29th
            var isLeap = ( year % 4 == 0 && ( year % 100 != 0 || year % 400 == 0 ) );
            if ( day > 29 || (day == 29 && !isLeap) ) 
            {
                if ( showAlerts ) 
                    alert("February " + year + " in [" + dateStr + "] doesn't have " + day + " days!");
                return false;
            }
        }
    }
    
    return true;
}

function isInteger( str )

{   
    var localStr = Trim( str );

    // Search through string's characters one by one
    // until we find a non-numeric character.
    // When we do, return false; if we don't, return true.

    for ( var i = 0; i < localStr.length; i++ )
    {   
        // Check that current character is number.
        var c = localStr.charAt(i);
        if ( !isDigit(c) ) return false;
    }

    // All characters are numbers.
    return true;
}

function isRealNumber( str ) 
{
	
	var numdecs = 0;
	var localStr = Trim( str );
	var i = 0;
		
    // Check to see if first character is a sign ( which is a legal character )
	if ( localStr.charAt(i) == "+" || localStr.charAt(i) == "-" ) 
    {
        // Let's remove the first character so the function can properly check
        // the remaining characters
        localStr = localStr.substr( 1 );
	}
    

	// Check for legal characters
    for ( i = 0; i < localStr.length; i++ ) 
    {
        mychar = localStr.charAt(i);
        if ( ( mychar >= "0" && mychar <= "9" ) || mychar == "." ) 
        {
            if ( mychar == "." )
                numdecs++;
		}
        else 
        {
            alert("[ " + str + " ] is not a valid number");
            return false;
        }
	}

	// Do we have more than one decimal?
	if ( numdecs > 1 )
    {
        alert("[ " + str + " ] is not a valid REAL value.");
        return false;
    }

    return true;
}

function isUSPhoneNumber( str )
{
    var localStr = Trim( str );
    
    regExpPattern = /[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]/;
    
    return ( null != localStr.match( regExpPattern ) );
}

function ValidateReqFields( controlsCollection )
{
    var errorMessage    = new String( "The following field(s) are required:\n\n" );
    var numElements     = controlsCollection.length;
    var validForm       = true;
    var resultFlag;
    
    var objControl;
    var reqValue;
    var datatype;
    var fieldName;
    var fieldValue;

    for( i = 0; i < numElements; i++ )
    {
        objControl  = eval( controlsCollection[i][CONTROL_TYPE] );
        reqValue    = controlsCollection[i][CONTROL_REQUIRED];
        datatype    = controlsCollection[i][CONTROL_DATATYPE];
        fieldName   = controlsCollection[i][CONTROL_NAME];
        
        switch( objControl.type )
        {
            case "checkbox":
                if ( reqValue == true)
                {
                    if ( !objControl.checked )
                    {
                        validForm       = ( validForm && objControl.checked );
                        errorMessage    = errorMessage + fieldName + "\n";
                    }
                }
                break;
                
            case "select-one":
                if ( reqValue == true)
                {
                    fieldValue  = new String( objControl.options[objControl.selectedIndex].value );
                    
                    if ( isEmpty( fieldValue ) )
                    {
                        errorMessage += fieldName + "\n";
                        validForm = false;
                    }
                    
                }
                break;
                
            case "radio":
                if ( reqValue == true)
                {
                    if ( !objControl.checked )
                    {
                        validForm       = ( validForm && objControl.checked );
                        errorMessage    = errorMessage + fieldName + "\n";
                    }
                }
                break;
            
            case "textarea":
            case "text":
                if ( reqValue == true )
                {
                    if ( isEmpty( objControl.value ) )
                    {
                        errorMessage += fieldName + "\n";
                        validForm = false;
                    }
                }
                break;
                
            default: break;
        }
    }  

    if ( !validForm )
        alert( errorMessage );
        
    return validForm;
}

function ValidateFields( controlsCollection )
{
    var numElements     = controlsCollection.length;
    var validForm       = true;
    var errorMessage    = new String( "The following field(s) contain invalid values:\n\n");
    
    var objControl;
    var reqValue;
    var datatype;
    var fieldName;   
    
    for( var i = 0; i < numElements; i++ )
    {
        objControl  = eval( controlsCollection[i][CONTROL_TYPE] );
        reqValue    = controlsCollection[i][CONTROL_REQUIRED];
        datatype    = controlsCollection[i][CONTROL_DATATYPE];
        fieldName   = controlsCollection[i][CONTROL_NAME];
        
        if ( objControl.type == "text" )
        {
            if ( datatype == DATE_DATATYPE )
            {
                if ( !isValidDate( objControl.value, false ) )
                {
                    errorMessage += fieldName + "\n";
                    validForm = false;
                }
            }
            else if ( datatype == INTEGER_DATATYPE )
            {
                if ( !isInteger( objControl.value ) )
                {
                    errorMessage += fieldName + "\n";
                    validForm = false;
                }
            }
            else if ( datatype == REAL_DATATYPE )
            {
                if ( !isRealNumber( objControl.value ) )
                {
                    errorMessage += fieldName + "\n";
                    validForm = false;
                }
            }
            else if ( datatype == US_PHONENUMBER_DATATYPE )
            {
                if ( !isUSPhoneNumber( objControl.value ) )
                {
                    errorMessage += fieldName + "\n";
                    validForm = false;
                }
            }
            else if ( datatype == EMAIL_DATATYPE )
            {
                if ( !isEmail( objControl.value ) )
                {
                    errorMessage += fieldName + "\n";
                    validForm = false;
                }
            }
            
        }
    }
    
    if ( !validForm )
        alert( errorMessage );
    
    return validForm;
}

function ValidateForm( controlsCollection )
{
    return ( ValidateReqFields( controlsCollection ) && ValidateFields( controlsCollection ) );
}
function manualReset( myForm )
{     
    for( var j = 0; j < myForm.elements.length; j++ ) 
    {
        switch( myForm.elements[j].type )
        {
            case 'text' :
                myForm.elements[j].value = '';
                break;
            case 'select-multiple' :
                // Assumes -99 is not a valid ID
                myForm.elements[j].options.selectedIndex = -99;
                break;
            case 'hidden' :
                break;
            default :
                break;
        }                
    }
   
    return;
}