﻿     function isValid()
     {
        var ERAValidationRuleMapping = 
        [
            [0, "isRequired"],
            [1, "maxLength"],
            [2, "allowAlpha"],
            [3, "allowNumeric"],
            [4, "allowNonAlphaNumeric"],
            [5, "regexPattern"]
        ];

        var emailRegEx = new RegExp(validEmailRegex);
        var errorArrElements = new Array();
        var errorArrMessages = new Array();
        var valid = true;
        var delim = "~!~";
        var eraElements = getERAElements();
        eraElements.reverse();
        
        for(var c = 0;c<eraElements.length;c++)
        {
            var element = eraElements[c];
            var errorMessage = "";
            var elementType = "";
            var fieldName = (element.name==null)?"":element.name;
            
            if(element.tagName == "SELECT"||element.tagName == "TEXTAREA")
            {
                elementType = element.tagName;
            }
            else
            {
                elementType = element.getAttribute("type", false).toUpperCase();
            }

            //validate email if there is one
            var isEmail = element.getAttribute("isEmail", true);
            var emailValid = true;
            if(isEmail&&fieldName.length>0&&element.value.length>0)
            {
                emailValid = emailRegEx.test(element.value);
                if(!emailValid)
                {
                    valid = false;
                    if(!errorArrElements.Contains(element))
                    {
                        errorArrElements.push(element);
                    }
                    errorArrMessages.push(element.name + " is invalid");
                }
            }

            if(element.getAttribute("eraValidationRules", false)!=null&&fieldName.length>0)
            {
                var validationArgs = element.getAttribute("eraValidationRules", false).split(delim);
                for(var i = 0;i<validationArgs.length;i++)
                {
                    var validationKey = validationArgs[i].split(":")[0];
                    var validationValue = validationArgs[i].split(":")[1];
                    var isRequiredValid = true;
                    if(validationValue.length>0&&validationValue!="null")
                    {
                        var validationType = getValueByKey(ERAValidationRuleMapping, validationKey);
                        switch(validationType)
                        {
                            case "isRequired" :
                                if(validationValue=="true")
                                {
                                    if(elementType=="SELECT")
                                    {
                                        if(element.selectedIndex==-1)
                                        {
                                            isRequiredValid = false;
                                        }
                                    }
                                    else
                                    {
                                        if(element.value.length==0)
                                        {
                                            isRequiredValid = false;
                                        }
                                    }
                                    if(!isRequiredValid)
                                    {
                                        valid = false;
                                        errorMessage = fieldName + " requires a value";
                                        if(!errorArrElements.Contains(element))
                                        {
                                            errorArrElements.push(element);
                                        }
                                        errorArrMessages.push(errorMessage);
                                    }
                                }
                            break;
                            case "maxLength" :
                                if(element.value.length>validationValue)
                                {
                                    valid = false;
                                    errorMessage = fieldName + " cannot contain more than " + validationValue + " characters";
                                    if(!errorArrElements.Contains(element))
                                    {
                                        errorArrElements.push(element);
                                    }
                                    errorArrMessages.push(errorMessage);
                                }
                            break;
                            case "allowAlpha" :
                                if(element.value.length>0&&validationValue=="false")
                                {
                                    if(element.value.search("[a-zA-Z]")!=-1)
                                    {
                                        valid = false;
                                        errorMessage = fieldName + " does not allow letters";
                                        if(!errorArrElements.Contains(element))
                                        {
                                            errorArrElements.push(element);
                                        }
                                        errorArrMessages.push(errorMessage);
                                    }
                                }
                            break;
                            case "allowNumeric" :
                                if(element.value.length>0&&validationValue=="false")
                                {
                                    if(element.value.search("[0-9]")!=-1)
                                    {
                                        valid = false;
                                        errorMessage = fieldName + " does not allow numerals";
                                        if(!errorArrElements.Contains(element))
                                        {
                                            errorArrElements.push(element);
                                        }
                                        errorArrMessages.push(errorMessage);
                                    }
                                }
                            break;
                            case "allowNonAlphaNumeric" :
                                if(element.value.length>0&&validationValue=="false")
                                {
                                    if(element.value.search("[^a-zA-Z0-9 ]")!=-1)
                                    {
                                        valid = false;
                                        errorMessage = fieldName + " does not allow non alphanumeric characters";
                                        if(!errorArrElements.Contains(element))
                                        {
                                            errorArrElements.push(element);
                                        }
                                        errorArrMessages.push(errorMessage);
                                    }
                                }
                            break;
                            case "regexPattern" : //this one tests for positive match as usage this way is a little more intuitive
                                if(element.value.length>0)
                                {
                                    if(element.value.search(validationValue)==-1)
                                    {
                                        valid = false;
                                        errorMessage = fieldName + " contains one or more invalid characters";
                                        if(!errorArrElements.Contains(element))
                                        {
                                            errorArrElements.push(element);
                                        }
                                        errorArrMessages.push(errorMessage);
                                    }
                                }
                            break;
                        }//end switch
                    }//end validationValue check
                }//end validation args loop
            }//end validation attribute check
        }//end era elements loop
        
        setErrorMessage(errorArrElements, errorArrMessages);
        return valid;
     }
     
     function setErrorMessage(elements, messages)
     {
        //First clear out any previous values
        var eraElements = getERAElements();
        for(var i = 0; i<eraElements.length;i++)
        {
            var element = eraElements[i];
            var elementParent = element.parentNode;
            var errorStar = document.getElementById("error_" + element.id);
            if(errorStar!=null)
            {
                elementParent.removeChild(errorStar);
            }
        }
        if(elements.length>0)
        {
            for(var i = 0; i<elements.length;i++)
            {
                var element = elements[i];
                var elementParent = element.parentNode;
                
                var errorStar;
                errorStar = document.createElement("SPAN");
                errorStar.id = "error_" + element.id;
                errorStar.innerHTML = "*";
                errorStar.style.color = "red";
                
                var appendedNode = elementParent.appendChild(errorStar);
            }
        }

        //format messages
        if(messages.length>0)
        {
            messages.reverse();
            var messageOutput = "";
            for(var i = 0; i<messages.length;i++)
            {
                messageOutput = messageOutput + "• " + messages[i] + "\r\n";
            }
            alert(messageOutput);
        }
    }