﻿/* utilisé dans la page LoginPage */
function dynamicValidation(hElement, hideValidValidator) {
    if (typeof (hideValidValidator) == "undefined") hideValidValidator = false;
    if (!hElement || !hElement.id) return;
    if (typeof (Page_Validators) == "undefined") return;
    DEB.info("dynamicValidation('" + hElement.id + "')");
    var lastCorrectValidator;
    var bGotError = false;
    // On recherche les validateurs de cet élément
    for (var i = 0; i < Page_Validators.length; i++) {
        var hValidator = Page_Validators[i];
        var isSecondaryControl = false;
        // On vérifie si le validateur est bien lié à ce controle
        if ((hValidator.controltovalidate == hElement.id)
            || (hValidator.controlalternate && (hValidator.controlalternate == hElement.id))
            || (hValidator.controltocompare && (hValidator.controltocompare == hElement.id))) {

            DEB.info("|-> Checking validator '" + hValidator.id + "'");

            if (bGotError) {
                DEB.info("  |-> Hide validator (caused by previous error)");
                // On a une erreur, on masque le résultat ou le ghost des autres
                /*hValidator.className = "";
                hValidator.style.display = "none";*/
                setValidatorVisibility(hValidator, "hide");
                continue;
            }
            
            
            
            // Si c'est un controle secondaire qui n'a jamais été testé, on le laisse,
            // il sera géré lors du passage sur le controle principale de test
            if (hValidator.controltocompare && (hValidator.controltocompare == hElement.id)) {
                isSecondaryControl = true;
                if (!hValidator.hasbeentriggered) {
                    DEB.info("  |-> This is a never triggered secondary validator, ignoring");
                    continue;
                }
            }

            hValidator.hasbeentriggered = true;

            // On vérifie que le validateur ai bien été déclenché
            if (hValidator.evaluationfunction) {
                if (typeof (hValidator.evaluationfunction) == "string")
                    hValidator.evaluationfunction = eval(hValidator.evaluationfunction);
                hValidator.isvalid = hValidator.evaluationfunction(hValidator);

            }

            // Si le validateur est ok
            if (hValidator.isvalid) {
                DEB.info("  |-> Validator is valid");
                // Si le controle est vide et que ce validateur ne génère pas d'erreur 
                // (il est probable qu'on ai un autre validateur ou qu'il ne soit pas requis)
                // ou si on a déjà un validateur ok, on ne conserve que celui-ci
                if ((hElement.value == "") || lastCorrectValidator) {
                    DEB.info("  |-> Hide validator (caused by previous valid validator)");
                    /*hValidator.className = "";
                    hValidator.style.display = "none";*/
                    setValidatorVisibility(hValidator, "hide");
                    if (hElement.value == "") {
                        setControlValidIndicator(hElement, "hide");
                    }
                } else if(!hideValidValidator) { // sinon on l'affiche
                    DEB.info("  |-> Show validator status");
                    //hValidator.className = "pictureValidator pictureValidate";
                    setValidatorVisibility(hValidator, "hide");
                    lastCorrectValidator = hValidator;
                    setControlValidIndicator(hElement, "valid");
                    if (hValidator.controlalternate) {
                        var alternateId = hValidator.controlalternate;
                        // Si le controle en cours est le second, on enleve l'alerte du controle principal
                        if (alternateId == hElement.id) {
                            setControlValidIndicator(document.getElementById(hValidator.controltovalidate), "hide");
                        } else {
                            setControlValidIndicator(document.getElementById(alternateId), "hide");
                        }
                    } else if (hValidator.controltocompare) {
                        var alternateId = hValidator.controltocompare;
                        // Si le controle en cours est le second, on enleve l'alerte du controle principal
                        if (alternateId == hElement.id) {
                            setControlValidIndicator(document.getElementById(hValidator.controltovalidate), "valid");
                        } else {
                            setControlValidIndicator(document.getElementById(alternateId), "valid");
                        }
                    } 
                }
            } else {
                DEB.info("  |-> Validator is INVALID");
                // Si on a traité un précédent valideur, on le masque
                if (lastCorrectValidator) {
                    DEB.info("  |-> Hide last valid validator '" + lastCorrectValidator.id + "'");
                    /*lastCorrectValidator.className = "";
                    lastCorrectValidator.style.display = "none"; */
                    setValidatorVisibility(lastCorrectValidator, "hide");
                }

                // On bind la validation sur le keyup pour indiquer au visiteur 
                // quand l'erreur est corrigée.
                if (typeof (hElement.onkeyup) != 'Function') {
                    hElement.onkeyup = function () { dynamicValidation(this); };
                }
                //hValidator.className = "pictureValidator  pictureError";
                setValidatorVisibility(hValidator, "show");
                setControlValidIndicator(hElement, "error");
                // Si on a une erreur sur un validateur qui check deux controles,
                // on enlève l'alerte sur l'autre controle
                if (hValidator.controlalternate) {
                    var alternateId = hValidator.controlalternate;
                    // Si le controle en cours est le second, on enleve l'alerte du controle principal
                    if (alternateId == hElement.id) {
                        //setControlValidIndicator(document.getElementById(hValidator.controltovalidate), "hide");
                    } else {
                        setControlValidIndicator(document.getElementById(alternateId), "hide");
                    }    
                }
                bGotError = true;
            }
        }
    }

    DEB.info("End Of \"dynamicValidation('" + hElement.id + "')\"");
}

function setControlValidIndicator(hElement, state) 
{
    var hSibling = $(hElement).next();
    if (!hSibling.hasClass("dynamicindicator")) {
        hSibling = $("<div class=\"dynamicindicator\"></div>").insertAfter(hElement);
    }
    hSibling.removeClass().addClass("dynamicindicator");
    switch (state) {
        case "hide":
            hSibling.addClass("hide");
            break;
        case "valid":
            hSibling.addClass("valid");
            break;
        case "error":
            hSibling.addClass("error");
            break;
    }
}

function setValidatorVisibility(hValidator, state) {
    switch (state) {
        case "hide":
            hValidator.style.visibility = "hidden";
            hValidator.style.display = "none";
            break;
        case "show":
            hValidator.style.visibility = "visible";
            hValidator.style.display = "inline";
            break;
    }
}

function validateAllFilledInput(validationGroup) {
    if (typeof (validationGroup) == "undefined") validationGroup = "";

    for (var i = 0; i < Page_Validators.length; i++) {
        if (Page_Validators[i].validationGroup == validationGroup) {
            var hElement = document.getElementById(Page_Validators[i].controltovalidate);
            if (hElement && hElement.value != '') {
                dynamicValidation(hElement, true);
            }
        }
        
    }

}
