    var validation_messages = new Array();
    
    function isValidForm(oForm)
    {
        var bValid = true;
        hideAndDisplayMessage('none');
        cleanMessage();
        
        validation_messages = new Array();
        
        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);
                
                var bRequired = false;
                if(oDiv = document.getElementById("required_"+oInput.name))
                {
                    bRequired = true;    
                }
                
                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(valConditional.indexOf(',') == -1)
                                    {
                                        if(oField[iRadio].checked && oField[iRadio].value == valConditional) 
                                        {
                                            bConditional = true;    
                                        }  
                                    }
                                    else
                                    {
                                        arrValCond = valConditional.split(',');
                                        for(iValCond = 0; iValCond < arrValCond.length; iValCond ++)
                                        {
                                            if(oField[iRadio].checked && oField[iRadio].value == arrValCond[iValCond]) 
                                            {
                                                bConditional = true;    
                                            }        
                                        }
                                    }
                                }
                            }
                            
                            if(bConditional && bRequired)
                            {
                                bValid = isValidField(oInput, bValid);
                            }
                        }
                    }
                }
                else if(bRequired)
                {
                    bValid = isValidField(oInput, bValid);
                }
                
                if(oInput.nodeName.toLowerCase() == "textarea")
                {
                    oInput.value = oInput.value.ltrim();
                 }
                
                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(isValidForm.arrCheckbox.length > 0)
        {
            bValid = validateCheckboxInput(oForm, bValid, isValidForm.arrCheckbox);
        }
        
        if(typeof(validateForm) == 'function')
        {
            bValid = validateForm(oForm, bValid);
        }
        
        if(!bValid)
        {
            hideAndDisplayMessage('');
            alertValidationMessage();
        }
        return bValid;    
    }
    isValidForm.arrRadio = new Array();
    isValidForm.arrCheckbox = 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.type == "checkbox")
        {
            if(oInput.name)
            {
                if(!isValidForm.arrCheckbox.in_array(oInput.name))
                {
                    isValidForm.arrCheckbox[isValidForm.arrCheckbox.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(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);
            
        if(oMessages = document.getElementById('messageValidation'))
        {
            oLI = document.createElement("li");
            oLI.appendChild(document.createTextNode(sMessage.replace("[fieldName]", sLocalization)));
            
            oMessages.appendChild(oLI);
        }
        validation_messages[validation_messages.length] = sMessage.replace("[fieldName]", sLocalization);
    }
    
    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 alertValidationMessage()
    {
        if(validation_messages && validation_messages.length > 0) 
        {
            var sMessage = "";
            for(var iMessage = 0; iMessage < validation_messages.length; iMessage += 1) 
            {
                if(sMessage != "") sMessage += "\n";
                sMessage += validation_messages[iMessage];
            }
            alert(sMessage);
        }
    }
    
    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 validateCheckboxInput(oForm, bValid, arrCheckbox)
    {
        for(iCheckbox = 0; iCheckbox < arrCheckbox.length; iCheckbox ++)
        {
            bChecked = false;
            sCheckbox = arrCheckbox[iCheckbox];
            if(oCheckbox = oForm[sCheckbox])
            {
                for(iElement = 0; iElement < oCheckbox.length; iElement ++)
                {
                    if(oCheckbox[iElement].checked)
                    {
                        bChecked = true;
                    }    
                }
                
                if(!bChecked)
                {
                    writeMessage(sCheckbox, "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(str_shave(sText) == "") {
            bValid = true;    
        }
        
        return bValid;    
    }
    
    function isPostalCode(sText)
    {
        var bValid = false;
        
        // validate Canadian postal code
        var oRegExp = new RegExp(/^([ABCEGHJKLMNPRSTVXYabceghjklmnprstvxy]\d[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz])\ {0,1}(\d[ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz]\d)$/);
        if (oRegExp.test(sText)) {
            bValid = true;
        }
        
        if(!bValid) {
            // validate US ZIP code (also ZIP+4, [hyphen + 4 more digits])
            var oRegExp = new RegExp(/^[0-9]{5}(-[0-9]{4})?$/);
            if(oRegExp.test(sText)) {
                bValid = true;
            }
        }
        
        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, "");        
    }    

