
/**
 * Composant Orion associé : fr.gouv.agriculture.orion.view.faces.standard.component.RememberScrollComponent
 * Dépendances : JQuery, fichier de langue.
 */
function RememberScroll() {

    this.regional = new Array();
    this.scrollLeft = undefined;
    this.scrollTop = undefined;

    this.initialize = function() {

        /* Activation des listeners de body et de window */
        this.setScrollPosition();
    };

    this.getViewId = function() {
        return $("input[name='orionViewId']");
    };
    
    this.getScrollLeft = function() {
        return $("input[name='orionScrollLeft']");
    };


    this.getScrollTop = function() {
        return $("input[name='orionScrollTop']");
    };
    
    /**
     * Vérifie qu'il est possible de stocker les positions, lève une alerte sinon
     * A priori ne doit jamais arriver sauf mauvaise manip du DOM via AJAX
     */
    this.checkStorage = function() {
        // Controle
        if ((!orion.rememberscroll.getScrollLeft().length)
                || (!orion.rememberscroll.getScrollTop().length)
                || (!orion.rememberscroll.getViewId().length) ) {
	    orion.logger.log(orion.rememberscroll.regional["orion.remember.missingFields"]);
        }
    };

   /*--------------------------------------------------------------------------
     *  fonction de vérification de la présence d'input hidden
     *   scrollTop et scrollLeft
     ---------------------------------------------------------------------------*/
    this.shouldKeepScrollPosition = function() {

        return (orion.rememberscroll.getScrollLeft().length != 0)
                && (orion.rememberscroll.getScrollTop().length != 0) && (orion.rememberscroll.getViewId().length != 0);
    };

   /*--------------------------------------------------------------------------
     *  fonction de sauvegarde des données de scroll
     *  scrollLeft et scrollTop dans les input hidden
     *  scrollTop et scrollLeft dont la présence
     *  est vérifié via la méthode shouldKeepScrollPosition.
     ---------------------------------------------------------------------------*/
    this.saveScrollPositionInForm = function() {
	orion.rememberscroll.checkStorage();
	
	if (orion.rememberscroll.shouldKeepScrollPosition()) {
		var viewId = orion.rememberscroll.getViewId().val();
		var scrollLeft = 0;
		var scrollTop = 0;

	    if ('pageXOffset' in window) {	// all browsers, except IE before version 9
		scrollLeft = window.pageXOffset;
		scrollTop = window.pageYOffset;
	    }
	    else if (document.documentElement) { // IE ?
		scrollLeft = document.documentElement.scrollLeft;
		scrollTop = document.documentElement.scrollTop;
	    }
	    orion.rememberscroll.getScrollLeft().val(scrollLeft);
	    orion.rememberscroll.getScrollTop().val(scrollTop);
	    orion.storeInSessionStorage(viewId + "_scrollLeft", scrollLeft);
	    orion.storeInSessionStorage(viewId + "_scrollTop", scrollTop);
	}
    };

    /*--------------------------------------------------------------------------
     *  fonction pour fixer la position du scroll
     *  On récupère les données présentes dans les input hidden
     *  scrollTop et scrollLeft dont la présence
     *  est vérifié via la méthode shouldKeepScrollPosition
     *  précédement vérifié via la méthode shouldKeepScrollPosition.
     ---------------------------------------------------------------------------*/
    this.setScrollPosition = function(event) {
        if (orion.rememberscroll.shouldKeepScrollPosition()) {
            var viewId = orion.rememberscroll.getViewId().val();
	    scrollLeft = orion.getFromSessionStorage(viewId + "_scrollLeft");
	    scrollTop = orion.getFromSessionStorage(viewId + "_scrollTop");
	    if (event) {
		var paddingTop = event.paddingTop;
		scrollTop = parseInt(paddingTop) + parseInt(scrollTop);
	    }
	    if (viewId && scrollLeft && scrollTop) {
		window.scrollTo(scrollLeft, scrollTop);
	    } 
        }
    };
}

orion.rememberscroll = new RememberScroll();
$(document).ready(function() {
    orion.rememberscroll.initialize();
    // Semble ne pas marcher sur IE 9 ...
    orion.event.listenTo("scroll", orion.rememberscroll.saveScrollPositionInForm);
    // Si il y a une modification du padding (liée au header fixe pour lequel on décale le body),
    // on force le repositionnement du scroll.
    orion.event.listenToBodyPadding(orion.rememberscroll.setScrollPosition);
});
