/**
 * Ensemble des fonctions JavaScript appelées sur le header.
 */
function Header() {
    /* 
     * Initialise le header (placement du corps, ...).
     */
    this.initialize = function() {

        orion.event.listenToUsingSelector("click", "[data-o-role='header-fold-icon']", $.proxy(this.hide, this));
        orion.event.listenToUsingSelector("click", "[data-o-role='header-unfold-icon']", $.proxy(this.show, this));
      
        // On charge depuis le store local l'état (affiché ou masqué) du header.
        // Si le header était masqué, on le remasque...
        var isHeaderHidden = orion.header.isHeaderHidden();
        if (isHeaderHidden) {
            this.hide();
        } else {
            this.show();
        }

        if (orion.page) {
            orion.event.listenToPageResized($.proxy(this.update, this));
        }

        if (orion.ajax) {
            orion.event.listenToAfterAjax($.proxy(this.update, this));
        }
    };

    this.show = function() {
        $("*[data-o-role='header-unfold-icon']").hide();
        $("*[data-o-role='header-unfold-icon']").attr("aria-pressed", "false");
        $("*[data-o-role='marianne']").show();
        $("*[data-o-role='marianne']").addClass("hidden-xs hidden-sm");
        $("*[data-o-role='header-fold-icon']").show();
        $("*[data-o-role='header-fold-icon']").attr("aria-pressed", "true");
        orion.header.update();
        orion.header.saveHeaderState();
    };

    this.hide = function() {
        $("*[data-o-role='header-unfold-icon']").show();
        $("*[data-o-role='header-unfold-icon']").attr("aria-pressed", "true");
        $("*[data-o-role='marianne']").hide();
        $("*[data-o-role='marianne']").removeClass("hidden-xs hidden-sm");
        $("*[data-o-role='header-fold-icon']").hide();
        $("*[data-o-role='header-fold-icon']").attr("aria-pressed", "false");
        orion.header.update();
        orion.header.saveHeaderState();
    };

    /**
     * Enregistre le fait que le header est masqué.
     */
    this.saveHeaderState = function() {
        var isHidden = $("*[data-o-role='marianne']").is(":hidden");
        var currentStorageKey = this.getLocalStorageKey();
        orion.storeInLocalStorage(currentStorageKey, isHidden);
    };

    /**
     * Récupère la clef permettant de stocker/récupérer l'état (affiché/masqué) du header.
     * 
     * @returns {String} la clef de stockage permettant d'identifier le header de cette application.
     */
    this.getLocalStorageKey = function() {
        var headerId = $("header").attr("id");
        var currentStorageKey = 'header_' + headerId + "_hidden";

        return currentStorageKey;
    };

    /**
     * Récupère l'état, affiché ou masqué du header.
     * 
     * @return {Boolean} true si le header est masqué.
     */
    this.isHeaderHidden = function() {
        var currentStorageKey = this.getLocalStorageKey();

        var isHidden = orion.getFromLocalStorage(currentStorageKey);
        // Le stockage dans le local n'est pas fait au format booléen mais au format string.
        if (isHidden === undefined || isHidden === null || isHidden === "true") {
            return true;
        }

        return false;
    };

    /**
     * Récupère la hauteur du header.
     * 
     * @returns la hauteur du header.
     */
    this.getHeaderHeight = function() {
        return parseInt($("*[data-o-role='fixed-header']").outerHeight(true)) + 1;
    };

    /**
     * Méthode pour définir l'emplacement vertical du body, en fonction de la taille de l'en-tête, 
     * de la zone de messages et de la zone de notifications.
     * On n'applique pas de body-padding dans le cas d'un écran de taille inférieur à 979px.
     * Déclenche un évènement de type  orion.event.BODY_PADDING qui informe que la taille du header a été modifiée,
     * ainsi que le "padding" du body.
     * 
     * @param {integer} paddingDelta le delta entre le padding initial et le padding final.
     */
    this.update = function(paddingDelta) {
        

        //if (windowWidth > 979) {
            var fixedHeaderHeight = orion.header.getHeaderHeight();
            $("body").css("padding-top", fixedHeaderHeight);
        //} else {
            // Design responsive. On applique pas de padding-top sur les résolutions trop petites.
            //$("body").css("padding-top", 0);
        //}

        // On crée l'évènement body-padding associé à la différence de padding, qui va être diffusé...
        var bodyPaddingDelta = 0;
        if (paddingDelta && paddingDelta > 0) {
            bodyPaddingDelta = paddingDelta;
        }

        var bodyPaddingEvent = jQuery.Event(orion.event.BODY_PADDING, {
            paddingTop: bodyPaddingDelta,
            headerHeight: fixedHeaderHeight
        });

        orion.event.fireEvent(bodyPaddingEvent);
    };
}

orion.header = new Header();

// Liste des évènements levés par le composant 
orion.event.BODY_PADDING = "orion.body.padding";

orion.event.listenToBodyPadding = function(handler) {
    orion.event.listenTo(orion.event.BODY_PADDING, handler);
};


$(document).ready(function() {
    orion.header.initialize();
});
