
function Orion(){
    
    this.regional = new Array();
    this.event = new Event();
    this.logger = new Logger();
        
    this.initialize = function() {       
        orion.setLinkAutofocus();
        orion.sessionTimeoutClock();
        orion.initBeforeUnloadHandler();
    };               
    
    function Event(){
        this.fireEvent = function(name){
            $(document).trigger(name);
        };

        this.listenTo = function(event, handler){
            $(document).on(event, handler);
        };

        this.listenToUsingSelector = function(event, selector, handler){
            $(document).on(event, selector, handler);
        };

        this.stopListeningTo = function(event, handler){
            $(document).off(event, handler);
        };

        this.stopListeningToUsingSelector = function(event, selector, handler){
            $(document).off(event, selector, handler);
        };
    };
   
    function Logger(){
        this.log = function(mesg){
            if (typeof console !== 'undefined') {
                console.log(mesg);    
            }
        };    
    };
    
    /**
     * Instaler un gestionnaire de l'évènement beforeUnload de l'objet windows
     */
    this.initBeforeUnloadHandler = function() {        
         window.onbeforeunload = this.beforeUnloadWindows;
    };
    
    
    /**
     * Traiter l'évévement unload courant
     */
    this.beforeUnloadWindows = function() {
        orion.event.fireEvent(orion.event.PAGE_UNLOAD);
    };

   
    /**
    *  permet de positionner le focus sur un lien 
    */       
    this.setLinkAutofocus = function() {               
        var nbLink = $('a[data-o-autofocus="autofocus"]').length;
        if (nbLink === 1) {
            $('a[data-o-autofocus="autofocus"]').focus();
        }        
    }; 
   
   
    /**
    *  permet de positionner le focus sur un champ a partir de son elementId
    *  Cette function devrait se trouver dans orion-form.js mais
    *  dans ce cas le script d'appel à celle-ci rendu par le script manager 
    *  est rendu avant l'inclusion du script orion-form.js ce qui concuit à l'erreur
    *  cannot call setFocus of undefined !
    */
    /* a priori à supprimer (à condition que cela fonctionne avec IE10) : remplacé par l'utilisation de l'attribut HTMl5 autofocus
    
    this.setFocus = function(elementId) {       
        var selector = "[id$='"+elementId+"']";        
        $(selector).focus();
    }; 
    */
   
    $(document).ready(function(){
        $("#edit-column > menuitem").live("click",function(){
            var selection = document.getSelection();
            $(selection.focusNode).parent("th").remove();
        });
    }
    );
        
    /**
     * Enregistre une propriété et sa valeur dans le localStorage du navigateur.
     * 
     * @param property la propriété pour laquelle on veut sauvegarder une valeur.
     * Cette propriété sera préfixée par le contexte de l'application.
     * @param value la valeur a enregister.
     */        
    this.storeInLocalStorage = function (property, value) {
        var storage = window.localStorage;

        storage.setItem(orion.getContextPath() + "_" + property, value);
    };
        
    /**
     * Récupère la valeur d'une propriété depuis le localStorage du navigateur.
     * Ne fait aucun contrôle sur la présence de cette clef dans le store. Peut 
     * donc renvoyer "undefined" ou "null".
     * 
     * @param property la clef pour laquelle il faut récupérer la valeur depuis 
     * le store local.
     * Cette propriété sera préfixée par le contexte de l'application.
     * 
     * @return la valeur associée à la clef dans le localStorage du navigateur, 
     * ou undefined ou null si la clef n'est pas définit dans le store.
     */        
    this.getFromLocalStorage = function (property) {
        var storage = window.localStorage;
        
        return storage.getItem(orion.getContextPath() + "_" + property);
    };
    
    /**
     * Supprime la valeur d'une propriété dans le localStorage du navigateur.
     * Ne fait aucun contrôle sur la présence de cette clef dans le store.
     * 
     * @param property la clef pour laquelle il faut supprimer la valeur depuis 
     * le store local.
     * Cette propriété sera préfixée par le contexte de l'application.
     *      
     */        
    this.removeFromLocalStorage = function (property) {
        var storage = window.localStorage;        
        storage.removeItem(orion.getContextPath() + "_" + property);
    };
    
    /**
     * Enregistre une propriété et sa valeur dans le sessionStorage du navigateur.
     * 
     * @param property la propriété pour laquelle on veut sauvegarder une valeur.
     * Cette propriété sera préfixée par le contexte de l'application.
     * @param value la valeur a enregister.
     */        
    this.storeInSessionStorage = function (property, value) {
        var storage = window.sessionStorage;

        storage.setItem(orion.getContextPath() + "_" + property, value);
    };
        
    /**
     * Récupère la valeur d'une propriété depuis le sessionStorage du navigateur.
     * Ne fait aucun contrôle sur la présence de cette clef dans le store. Peut 
     * donc renvoyer "undefined" ou "null".
     * 
     * @param property la clef pour laquelle il faut récupérer la valeur depuis 
     * le store de session local.
     * Cette propriété sera préfixée par le contexte de l'application.
     * 
     * @return la valeur associée à la clef dans le sessionStorage du navigateur, 
     * ou undefined ou null si la clef n'est pas définit dans le store.
     */        
    this.getFromSessionStorage = function (property) {
        var storage = window.sessionStorage;
        
        return storage.getItem(orion.getContextPath() + "_" + property);
    };
    
    /**
     * Supprime la valeur d'une propriété dans le sessionStorage du navigateur.
     * Ne fait aucun contrôle sur la présence de cette clef dans le store. 
     * 
     * @param property la clef pour laquelle il faut supprimer la valeur dans 
     * le store de session local.
     * Cette propriété sera préfixée par le contexte de l'application.
     *      
     */        
    this.removeFromSessionStorage = function (property) {
        var storage = window.sessionStorage;        
        storage.removeItem(orion.getContextPath() + "_" + property);
    };
    
    /**
     * Récupère le contexte de l'application.
     * 
     * @return le contexte de l'application.
     */  
    this.getContextPath = function() {
        var base = document.getElementsByTagName('base')[0];
        if (base && base.href && (base.href.length > 0)) {
            base = base.href;
        } else {
            base = document.URL;
        }

        var domainAndContext = base.substr(0,
            base.indexOf("/", base.indexOf("/", base.indexOf("//") + 2) + 1));
            
        var contextOnly = domainAndContext.substr(domainAndContext.lastIndexOf("/"), domainAndContext.length);
        
        return contextOnly;
    };
    
    /**
     * Gère le déclenchement d'une action une minute avant la fin de session HTTP.
     */
    this.sessionTimeoutClock = function(){
        
        var sessionTimeout = 1800;
        if(ORION_SESSION_TIMEOUT){
            sessionTimeout = ORION_SESSION_TIMEOUT;
        }        
        
        // Le sessionTimeout est exprimé en secondes. Le paramètre de la fonction setTimeout est lui en millisecondes...
        // Une minute avant sa fin, on affiche un pop-up à l'utilisateur pour recharger la page.
        var timeBeforePopup = (parseInt(sessionTimeout) - 60) * 1000;
        window.setTimeout('orion.sessionTimeoutReminder()', timeBeforePopup);
    };
    
    /**
     * Affiche un pop-up pour éviter une fin de session HTTP.
     */
    this.sessionTimeoutReminder = function(){
        var msg = orion.regional["orion.timeoutReminder"];
        if (window.confirm(msg)) {
            document.forms[0].submit();
        }
    };
}

var orion = new Orion();    
$(document).ready(function() {    
    orion.initialize();    
});
