﻿/*********************************************************************************************************************
**********************************************************************************************************************

FILE: Validate.js

DESCRIPTION: This file allows developers to specifiy required fields/input methods.
             The developer may also specify whether the field is of type: date, email
             numeric, zip, or phone.
             
USAGE:       Below is an example of use:

             <!-- Begin Example
             <html>
                 <head>
                     <script type="text/javascript" src="RegExValidation.js"></script>
                     <script type="text/javascript" src="Validate.js"></script>    
                     <script type="text/javascript">
                        function SetRequiredFields()
                         {
                             SetRequired("", "chkLoner", "Check Loner is required.");
                             SetRequired("txtEmail", "", "Enter a vaild email address", "email");
                             SetRequired("txtDate", "", "Enter a vaild date", "date");
                             SetRequired("txtNumeric", "", "Enter a numeric value", "numeric");
                             SetRequired("txtPhone", "", "Enter a vaild US phone number", "phone");
                         }
                     </script>
                 </head>
                 <body>
                     <form onsubmit="return Validate(this, 'reqDiv', 'Please address the following issues:')">
                         <input type="checkbox" name="chkLoner" /> Lone Check Box <br /><br />
                         <input type="text" id="txtEmail" />Email <br /><br />
                         <input type="text" id="txtDate" />Date (mm/dd/yyyy -or- mm-dd-yyyy) <br /><br />
                         <input type="text" id="txtNumeric" />Numeric <br /><br />
                         <input type="text" id="txtZip" />Zip Code <br /><br />
                     </form>
                     
                    <div id="reqDiv" style="display: none; color: Red">
                    </div>
                     
                 </body>
             </html>
             End Example -->

METHODS:
        SetRequiredFields() - Must contain all SetRequired() calls.
        SetRequired(id, name, [Required Message], type (optional))
        Validate([Form Object], [id of Required Div], [Required Message Header])

AUTHOR: Jimmy Hill

DATE: 06/17/2008

**********************************************************************************************************************
*********************************************************************************************************************/


function SetRequired(id, name, msg, type)
{
    //Type must be "date" || "email"
    type = type || null;

    //Create custom attributes
    var att1=document.createAttribute('requiredMessage');
    var att2=document.createAttribute('requiredType');

    //If id is not passed use name
    if(id == "" || id == null)
    {
        var group = document.getElementsByName(name);

        for(var i=0; i < group.length; i++)
        {
            group[i].setAttribute('requiredMessage', msg);
        }
    }
    //Use id
    else
    {
        var who=document.getElementById(id);
        who.setAttribute('requiredMessage', msg);
        
        if(type != null)
        {
            who.setAttribute('requiredType', type);
        }
    }
}

function RemoveRequired(id, name)
{
    //If id is not passed use name
    if(id == "" || id == null)
    {
        var group = document.getElementsByName(name);

        for(var i=0; i < group.length; i++)
        {
            group[i].removeAttribute('requiredMessage');
        }
    }
    //Use id
    else
    {
        var who=document.getElementById(id);
        who.removeAttribute('requiredMessage');
    }
}

function Validate(objForm, reqDivName, reqDivHeader)
{
    //Add required info to elements
    SetRequiredFields();

    var validationMessage = "";
    var groupsChecked = new Array();
    var reqArray = new Array();
    var objArray = objForm.elements;
    
    //Find all elements that have a requiredMessage and validate
    for(var i=0; i < objArray.length; i++)
    {
        if(objArray[i].getAttribute("requiredMessage") != null)
        {
            if(objArray[i].type == "radio" || objArray[i].type == "checkbox")
            {
                var didValidate = false;
                var arrayStr = groupsChecked.toString();
                
                if(arrayStr.search(objArray[i].getAttribute("name")) == -1)
                {
                    groupsChecked.push(objArray[i].getAttribute("name"));
                    
                    var groupToCheck = document.getElementsByName(objArray[i].getAttribute("name"));
                    
                    for(var j=0; j < groupToCheck.length; j++)
                    {
                        if(groupToCheck[j].checked)
                        {
                            didValidate = true;
                        }
                    }
                    if(!didValidate)
                    {
                        validationMessage += "&#149;&nbsp;&nbsp;" + objArray[i].getAttribute('requiredMessage') + "<br />";
                    }
                }
            }
            else
            {
                if(objArray[i].value == "")
                {
                    validationMessage +=  "&#149;&nbsp;&nbsp;" + objArray[i].getAttribute('requiredMessage') + "<br />";
                }
                else
                {
                    if(objArray[i].getAttribute("requiredType") != null)
                    {
                        var result = ValidateType(objArray[i].getAttribute("requiredType"), objArray[i].value);
                        
                        if(!result)
                        {
                            validationMessage +=  "&#149;&nbsp;&nbsp;" + objArray[i].getAttribute('requiredMessage') + "<br />";
                        }
                    }
                }
            }
        }
    }
    
    //If element(s) failed validation show div.
    if(validationMessage != "")
    {
        var div = document.getElementById(reqDivName);
        var html = new String();
        
        html = "<strong>" + reqDivHeader + "</strong><br />";
        html += validationMessage;
        div.innerHTML = html;
        div.style.display = "block";
        return false;
    }
    else
    {
        return true;
    }
}

function ValidateType(type, value)
{
    var result = false;
    
    switch(type)
    {
        case "date":
            result = validateUSDate(value);
            break;
        case "email":
            result = validateEmail(value);
            break;
        case "numeric":
            result = validateNumeric(value);
            break;
        case "zip":
            result = validateUSZip(value);
            break;
        case "phone":
            result = validateUSPhone(value);
            break;
    }
    
    return result;
}