    function isValidForm(oForm)
    {
        var bValid = true;
        hideAndDisplayMessage('none');
        cleanMessage();
        
        isValidForm.arrRadio = new Array();
        
        for(iInput = 0; iInput < oForm.elements.length; iInput ++)
        {
            if(oForm.elements[iInput].type != "hidden" && oForm.elements[iInput].type != "button" && oForm.elements[iInput].type != "submit" && oForm.elements[iInput].nodeName.toLowerCase() != "fieldset" && oForm.elements[iInput].disabled == false)
            {
                oInput = oForm.elements[iInput];
                swicthClassName(oInput,false);
                
                if(oConditional = oForm["conditional_"+oInput.name])
                {
                    var arrConditional = oConditional.value.split(';');
                    if(arrConditional.length > 1)
                    {
                        var fldConditional = arrConditional[0];
                        var valConditional = arrConditional[1];
                        
                        var iField = '';
                        var iElement = 0;
                        while(iElement < oForm.elements.length && iField == '')
                        {
                            if(oForm.elements[iElement].name)
                            {
                                if(oForm.elements[iElement].name == fldConditional)
                                {
                                    iField = iElement;   
                                }
                            }
                            iElement ++   
                        }
                        
                        if(iField != '')
                        {
                            var bConditional = false;
                            oField = oForm.elements[iField];
                            if(oField.type == 'select-one')
                            {
                                if(valConditional.indexOf(',') == -1)
                                {
                                    if(oField.options[oField.options.selectedIndex].value == valConditional)
                                    {
                                        bConditional = true;       
                                    }    
                                }
                                else
                                {
                                    arrValCond = valConditional.split(',');
                                    for(iValCond = 0; iValCond < arrValCond.length; iValCond ++)
                                    {
                                        if(oField.options[oField.options.selectedIndex].value == arrValCond[iValCond])
                                        {
                                            bConditional = true;       
                                        }
                                    }
                                }
                            }
                            else if(oField.type == 'checkbox')
                            {
                                if(valConditional == 1 && oField.checked)
                                {
                                    bConditional = true;    
                                }
                                else if(valConditional == 0 && !oField.checked)
                                {
                                    bConditional = true;    
                                }
                            }
                            else if(oField.type == 'radio')
                            {
                                oField = oForm[fldConditional];
                                for(iRadio = 0; iRadio < oField.length; iRadio ++)
                                {
                                    if(oField[iRadio].checked && oField[iRadio].value == valConditional) 
                                    {
                                        bConditional = true;    
                                    }  
                                }
                            }
                            
                            if(bConditional)
                            {
                                bValid = isValidField(oInput, bValid);
                            }
                        }
                    }
                }
                else if(oDiv = document.getElementById("required_"+oInput.name))
                {
                    bValid = isValidField(oInput, bValid);
                }
                
                if(oInput.nodeName.toLowerCase() == "textarea")
                {
                    oInput.value = oInput.value.trim();    
                }
                
                if(oInput.type == "text")
                {
                    if(!isEmpty(oInput.value))
                    {
                        if(oHidden = document.getElementById("type_"+oInput.name))
                        {
                            if(oHidden.value == "date")
                            {
                                if(!isDate(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidDate.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }
                            else if(oHidden.value == "hour")
                            {
                                if(!isHour(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidHour.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }
                            else if(oHidden.value == "integer")
                            {
                                if(!isInteger(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidInteger.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }
                            else if(oHidden.value == "float")
                            {
                                if(!isFloat(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidFloat.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }
                            else if(oHidden.value == "phone")
                            {
                                if(!isPhone(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidPhone.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }
                            else if(oHidden.value == "email")
                            {
                                if(!isEmail(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidEmail.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }
                            else if(oHidden.value == "postalCode")
                            {
                                oInput.value = oInput.value.toUpperCase();
                                if(!isPostalCode(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidPostalCode.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }
                            else if(oHidden.value == "color")
                            {
                                if(!isColor(oInput.value))
                                {
                                    writeMessage(oInput.name, "form.invalidColor.message");
                                    bValid = false;
                                    swicthClassName(oInput,true);
                                }
                            }    
                        }    
                    }
                }
            }  
        }
        
        if(isValidForm.arrRadio.length > 0)
        {
            bValid = validateRadioInput(oForm, bValid, isValidForm.arrRadio);
        }
        
        if(typeof(validateForm) == 'function')
        {
            bValid = validateForm(oForm, bValid);
        }
        
        if(!bValid)
        {
            hideAndDisplayMessage('');    
        }
        return bValid;    
    }
    isValidForm.arrRadio = new Array();
    
    function isValidField(oInput, bValid)
    {
        if(oInput.type == "select-one")
        {
            if(oInput.options[oInput.options.selectedIndex].value == 0 || isEmpty(oInput.options[oInput.options.selectedIndex].value))
            {
                writeMessage(oInput.name, "form.requiredField.message");
                bValid = false;
                swicthClassName(oInput,true);
            }
        }
        if(oInput.type == "select-multiple")
        {
            var bSelected = false;
            for(iOption = 0; iOption < oInput.options.length; iOption ++)
            {
                if(oInput.options[iOption].selected)
                {
                    bSelected = true;
                    iOption = oInput.options.length;      
                }   
            }
            
            if(!bSelected)
            {
                writeMessage(oInput.name, "form.requiredField.message");
                bValid = false;
                swicthClassName(oInput,true);
            }
        }
        else if(oInput.type == "text" || oInput.type == "password")
        {
            if(isEmpty(oInput.value))
            {
                writeMessage(oInput.name, "form.requiredField.message");
                bValid = false;
                swicthClassName(oInput,true);
            }
        }
        else if(oInput.type == "radio")
        {
            if(oInput.name)
            {
                if(!isValidForm.arrRadio.in_array(oInput.name))
                {
                    isValidForm.arrRadio[isValidForm.arrRadio.length] = oInput.name;
                }
            }
        }
        else if(oInput.nodeName.toLowerCase() == "textarea")
        {
            if(isEmpty(oInput.value))
            {
                writeMessage(oInput.name, "form.requiredField.message");
                bValid = false;
                swicthClassName(oInput,true);
            }
        } 
        
        return  bValid;  
    }
    
    function writeMessage(sFieldName, sMessage)
    {
        if(sFieldName.indexOf('form.field.') != -1)
        {
            sFieldName = sFieldName.replace('form.field.', '');
        }
        
        if(oMessages = document.getElementById('messageValidation'))
        {
            if(oLabel = document.getElementById('label_'+sFieldName))
            {
                if(oLabel.nodeName.toLowerCase() == 'input')
                {
                    sLocalization = oLabel.value;
                }
                else
                {
                    sLocalization = oLabel.innerHTML;
                }
            }
            else
            {
                sString = "form.field."+sFieldName;
                sLocalization = (Localization.getTranslation(sString)).toLowerCase();
            }
            sMessage = Localization.getTranslation(sMessage);
            
            oLI = document.createElement("li");
            oLI.appendChild(document.createTextNode(sMessage.replace("[fieldName]", sLocalization)));
            
            oMessages.appendChild(oLI);
        }
    }
    
    function cleanMessage()
    {
        if(oMessages = document.getElementById('messageValidation'))
        {
            oMessages.innerHTML = "";    
        }       
    }
    
    function swicthClassName(oInput,bError)
    {
        if(bError)
        {
            oInput.className = setClassName(oInput, 'invalid');
        }
        else
        {
            oInput.className = removeClassName(oInput, 'invalid');
        }
    }

    function hideAndDisplayMessage(sDisplay)
    {
        if(oMessages = document.getElementById('messageValidation'))
        {
            oMessages.style.display = sDisplay;    
        }    
    }
    
    function validateRadioInput(oForm, bValid, arrRadio)
    {
        for(iRadio = 0; iRadio < arrRadio.length; iRadio ++)
        {
            bChecked = false;
            sRadio = arrRadio[iRadio];
            if(oRadio = oForm[sRadio])
            {
                for(iElement = 0; iElement < oRadio.length; iElement ++)
                {
                    if(oRadio[iElement].checked)
                    {
                        bChecked = true;
                    }    
                }
                
                if(!bChecked)
                {
                    writeMessage(sRadio, "form.requiredField.message");
                    bValid = false;
                }
            }
        }
        
        return bValid;
    }
    
    function isInteger(sText)
    {
        var oRegExp = new RegExp(/^\d*$/);
        var bValid = true;
        
        if (!oRegExp.test(sText))
        {
            bValid = false;
        }
        
        return bValid;
    }
    
    function isFloat(sText)
    {
        //var oRegExp = new RegExp(/^\d+[.]\d+$/);
        var oRegExp1 = new RegExp(/^(\d+)|(\.\d+)|(\d+\.\d+)$/);
        var oRegExp2 = new RegExp(/[a-zA-Z]/);
        
        var bValid = true;
        
        if(oRegExp2.test(sText)) {
            bValid = false;
        }
        else if (!oRegExp1.test(sText)) {
            bValid = false;
        }
        
        return bValid;   
    }
    
    function isValidFloat(sText)
    {
        var Char;
        var CharLen=0;
        var Pos=-1;
        
        Char = sText.replace(',','.')
        Pos  = Char.indexOf('.');
        CharLen = Char.length;
        
        if(Pos == -1) return true; 
        decimal = Char.substring(Pos, CharLen);
        
        if(decimal == '') return true; 
        if(decimal == '0') return true; 
        if(decimal == '.0') return true; 
        if(decimal == '.00') return true; 
        if(decimal == '.25') return true; 
        if(decimal == '.5') return true; 
        if(decimal == '.50') return true; 
        if(decimal == '.75') return true; 
        
        return false;
    }
    
    function isHour(sText)
    {
        var oRegExp = new RegExp(/^[0-2]{1}\d{1}[:][0-5]{1}\d{1}$/);
        var bValid = true;
        
        if (!oRegExp.test(sText))
        {
            bValid = false;
        }
        else
        {
            arrText = sText.split(':');
            
            if(arrText[0] > 23)
            {
                bValid = false;
            }
            if(arrText[1] > 59)
            {
                bValid = false;
            }
        }
        
        return bValid;   
    }
    
    function isDate(sText)
    {
        var oRegExp = new RegExp(/^[1-9]{1}\d{3}[-]\d{2}[-]\d{2}$/);
        var bValid = true;
        
        if (!oRegExp.test(sText))
        {
            bValid = false;
        }
        
        if(bValid)
        {
            var arrDate = sText.split("-");
            if(arrDate[1] < 1 || arrDate[1] > 12)
            {
                bValid = false;    
            }
            
            if(arrDate[2] < 1)
            {
                bValid = false;    
            }
            
            var arrDay = Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
            
            if(arrDate[1] == 2)
            {
                if(arrDate[0] % 4 == 0)
                {
                    if(arrDate[2] > 29)
                    {
                       bValid = false;     
                    }    
                }
                else
                {
                    if(arrDate[2] > arrDay[Number(arrDate[1])])
                    {
                        bValid = false;    
                    }    
                }    
            }
            else
            {
                if(arrDate[2] > arrDay[Number(arrDate[1])])
                {
                    bValid = false;    
                } 
            }
        }
        
        return bValid;     
    }
    
    function isEmpty(sText)
    {
        var bValid = false;
        
        if(trimString(sText) == "")
        {
            bValid = true;    
        }
        
        return bValid;    
    }
    
    function isPostalCode(sText)
    {
        var oRegExp = new RegExp(/^([ABCEGHJKLMNPRSTVXYabceghjklmnprstvxy]\d[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz]\d)$/);
        var bValid = true;
        
        if (!oRegExp.test(sText))
        {
            bValid = false;
        }
        
        return bValid; 
    }
    
    function isEmail(sText)
    {
        var oRegExp = new RegExp(/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/);
        var bValid = true;
        
        if (!oRegExp.test(sText))
        {
            bValid = false;
        }
        
        return bValid; 
    }
    
    function isPhone(sText)
    {
        var oRegExp = new RegExp(/^([0-9]{1})?(-|\s|\.)?(\()?([0-9]{3})(\)|-|(\s)|\.|\)\s)?([0-9]{3})(-|\s|\.)?([0-9]{4}).*$/);
        var bValid = true;
        
        if (!oRegExp.test(sText))
        {
            bValid = false;
        }
        
        return bValid; 
    }
    
    function isCellular(sText)
    {
        var oRegExp = new RegExp(/^([0-9]{1})?(-|\s|\.)?(\()?([0-9]{3})(\)|-|(\s)|\.|\)\s)?([0-9]{3})(-|\s|\.)?([0-9]{4}).$/);
        var bValid = true;
        
        if (!oRegExp.test(sText))
        {
            bValid = false;
        }
        
        return bValid; 
    }
    
    function isColor(sText) {
        var oRegExp = new RegExp(/^[0-9a-fA-F]{6}$/);
        var bValid = true;
        
        if (!oRegExp.test(sText)) {
            bValid = false;
        }
        
        return bValid;
    }
    
    function trimString(sText)
    {
        return sText.replace(/(?:^\s+|\s+$)/g, "");        
    }   
    