﻿
if (typeof (this.ModuleSchedulePublic.Common) == "undefined") {
    this.ModuleSchedulePublic.Common = {};
    }

    if (typeof (this.ModuleSchedulePublic.Common.Manage) == "undefined") {
        this.ModuleSchedulePublic.Common.Manage = {};
    }

    ModuleSchedulePublic.Common.Manage.SessionSelectedClassName = 'mSessionSelected';
    ModuleSchedulePublic.Common.Manage.SessionNotSelectedClassName = 'mSessionNotSelected';

    ModuleSchedulePublic.Common.Manage.PresentationSelectedClassName = 'mPresentationSelected';
    ModuleSchedulePublic.Common.Manage.PresentationNotSelectedClassName = 'mPresentationNotSelected';
    
    //Ajoute ou supprime une session des données de l'utilisateur enregistré
    //  si l'utilisateur n'est pas enregistré, une popup de connexion est affichée
    ModuleSchedulePublic.Common.Manage.SelectSession = function(sessionURI, authenticated) {
        if (!authenticated) {
            ModuleSchedulePublic.Common.Manage.LoadLogin();
        } else {
            if (ModuleSchedulePublic.Common.Manage.IsAlreadySelectedSession(sessionURI)) {
                //la session était déja sélectionnée
                //on ne vérifie pas les conflits et on maj directement
                ModuleSchedulePublic.Common.Manage.AddOrRemoveSession(sessionURI);
            } else {
                //la session n'était pas sélectionnée
                //on vérifie que l'ajout de la session ne provoque pas un conflit de plage horaire
                ModuleSchedulePublic.Common.Manage.CheckConflict(sessionURI, '', function() {
                    ModuleSchedulePublic.Common.Manage.AddOrRemoveSession(sessionURI); 
                });
            }   
        }
    }
    
    //Ajoute ou supprime une session des données de l'utilisateur enregistré
    //  si l'utilisateur n'est pas enregistré, une popup de connexion est affichée
    ModuleSchedulePublic.Common.Manage.SelectPresentation = function(presentationURI, sessionURI, authenticated) {
        if (!authenticated) {
            ModuleSchedulePublic.Common.Manage.LoadLogin();
        }else{
            if (ModuleSchedulePublic.Common.Manage.IsAlreadySelectedPresentation(presentationURI)) {
                //l'intervention était déja sélectionnée
                //on ne vérifie pas les conflits et on maj directement
                ModuleSchedulePublic.Common.Manage.AddOrRemovePresentation(presentationURI, sessionURI);
            } else {
                //l'intervention n'était pas sélectionnée
                //on vérifie que l'ajout de l'intervention ne provoque pas un conflit de plage horaire
                ModuleSchedulePublic.Common.Manage.CheckConflict(sessionURI, presentationURI, function() {
                    ModuleSchedulePublic.Common.Manage.AddOrRemovePresentation(presentationURI, sessionURI);
                });
            }   
        }
    }

    //Ajoute ou supprime une session des données de l'utilisateur enregistré
    ModuleSchedulePublic.Common.Manage.LaunchUpdate = function(url, callbackFunction) {
        
        //formulaire uniquement utilisé pour la soumission
        var form = ModuleSchedulePublic.CreateDummyForm('dummyForm', url);
        var divResult = document.createElement('div');
        
        //lance la requête asynchrone
        var d = cyim.ajax.xhrPost({ form: dojo.byId('dummyForm'), url: url, handleAs: "text" });
        d.addCallback(dojo.hitch(cyim.ajax, "getDataBack", divResult,
            function() {
                callbackFunction();
                
            }
        ));
        d.addErrback(function() { ModuleSchedulePublic.Common.Manage.ErrorLog(); });

    }
    
    //Log du message d'erreur
    ModuleSchedulePublic.Common.Manage.ErrorLog = function(error) {
        if (typeof (console) != 'undefined') {
            console.log(error);
        }
    }
    
    //Modifie l'affichage de l'état d'une session sélectionnée ou non
    ModuleSchedulePublic.Common.Manage.ChangeStateSelectedSession = function(sessionURI, select) {
        //modifie l'état d'affichage de la session choisie
        if (ModuleSchedulePublic.Common.Manage.IsAlreadySelectedSession(sessionURI)) {
            document.getElementById('selectSession_' + sessionURI).className = ModuleSchedulePublic.Common.Manage.SessionNotSelectedClassName;
            //on masque la session
            document.getElementById('session_' + sessionURI).style.display = 'none';
        } else {
            document.getElementById('selectSession_' + sessionURI).className = ModuleSchedulePublic.Common.Manage.SessionSelectedClassName;
            document.getElementById('selectSession_' + sessionURI).parentNode.title = ModuleSchedulePublic.i18n.unSelectFullSession;
        }
        //si les présentations de cette session sont affichées, on les place dans le même état que la session
        dojo.query('#presentations_' + sessionURI + ' .mPresentationList .mMyScheduleSession a span').forEach(
            function(tag) {
                if (ModuleSchedulePublic.Common.Manage.IsAlreadySelectedSession(sessionURI)) {
                    tag.className = ModuleSchedulePublic.Common.Manage.PresentationSelectedClassName;
                    tag.parentNode.title = ModuleSchedulePublic.i18n.unSelectPresentation;
                } else {
                    tag.className = ModuleSchedulePublic.Common.Manage.PresentationNotSelectedClassName;
                    tag.parentNode.title = ModuleSchedulePublic.i18n.selectPresentation;
                }
            }
        );
    }
    
    //Modifie l'affichage de l'état d'une présentation sélectionnée ou non
    ModuleSchedulePublic.Common.Manage.ChangeStateSelectedPresentation = function(presentationURI, sessionURI) {
        //modifie l'état d'affichage de la présentation choisie
        if (ModuleSchedulePublic.Common.Manage.IsAlreadySelectedPresentation(presentationURI)) {
            document.getElementById('selectPresentation_' + presentationURI).className = ModuleSchedulePublic.Common.Manage.PresentationNotSelectedClassName;
            document.getElementById('selectPresentation_' + presentationURI).parentNode.title = ModuleSchedulePublic.i18n.selectPresentation;
        } else {
            document.getElementById('selectPresentation_' + presentationURI).className = ModuleSchedulePublic.Common.Manage.PresentationSelectedClassName;
            document.getElementById('selectPresentation_' + presentationURI).parentNode.title = ModuleSchedulePublic.i18n.unSelectPresentation;
        }
        //teste si l'on doit modifier l'état de la session selectionnée
        //si l'une des presentations est dans un état "non selectionné"
        //  => la session est considérée comme non sélectionnée
        var sessionSelected = true;
        dojo.query('#presentations_' + sessionURI + ' .mPresentationList .mMyScheduleSession a span').forEach(
            function(tag) {
                if (tag.className == 'mPresentationNotSelected') {
                    sessionSelected = false;
                }
            }
        );
        var sessionNode = document.getElementById('selectSession_' + sessionURI);
        if (sessionSelected) {
            sessionNode.className = ModuleSchedulePublic.Common.Manage.SessionSelectedClassName;
            sessionNode.parentNode.title = ModuleSchedulePublic.i18n.unSelectFullSession;
        } else {
            sessionNode.className = ModuleSchedulePublic.Common.Manage.SessionNotSelectedClassName;
            sessionNode.parentNode.title = ModuleSchedulePublic.i18n.selectFullSession;
        }
    }

    //Teste si la session est déja sélectionnée
    ModuleSchedulePublic.Common.Manage.IsAlreadySelectedSession = function(sessionURI) {
        return (document.getElementById('selectSession_' + sessionURI).className == ModuleSchedulePublic.Common.Manage.SessionSelectedClassName);
    }

    //Teste si la session est déja sélectionnée
    ModuleSchedulePublic.Common.Manage.IsAlreadySelectedPresentation = function(presentationURI) {
        return (document.getElementById('selectPresentation_' + presentationURI).className == ModuleSchedulePublic.Common.Manage.PresentationSelectedClassName);
    }    
    
    //Ajoute ou supprime une session des données de l'utilisateur enregistré
    ModuleSchedulePublic.Common.Manage.AddOrRemovePresentation = function(presentationURI, sessionURI) {
        var currentClassName = document.getElementById('selectPresentation_' + presentationURI).className;
        var url = 'AddOrRemoveSession.phtml?presentationURI=' + presentationURI + '&alreadySelected=' + ModuleSchedulePublic.Common.Manage.IsAlreadySelectedPresentation(presentationURI);
        document.getElementById('selectPresentation_' + presentationURI).className = 'mLoadingSelected';
        ModuleSchedulePublic.Common.Manage.LaunchUpdate(url, function() {
            document.getElementById('selectPresentation_' + presentationURI).className = currentClassName;
            ModuleSchedulePublic.Common.Manage.ChangeStateSelectedPresentation(presentationURI, sessionURI);
        });
    }

    //Ajoute ou supprime une session des données de l'utilisateur enregistré
    //Change l'état de la session sélectionnée
    //raffraichi la liste des interventions si dépliées
    ModuleSchedulePublic.Common.Manage.AddOrRemoveSession = function(sessionURI) {
        var presentationsDisplayed = ModuleSchedulePublic.Common.SessionArea.PresentationsDisplayed(sessionURI);
        var currentClassName = document.getElementById('selectSession_' + sessionURI).className;
        var url = 'AddOrRemoveSession.phtml?sessionURI=' + sessionURI + '&alreadySelected=' + ModuleSchedulePublic.Common.Manage.IsAlreadySelectedSession(sessionURI);
        document.getElementById('selectSession_' + sessionURI).className = 'mLoadingSelected';
        ModuleSchedulePublic.Common.Manage.LaunchUpdate(url, function() {
            document.getElementById('selectSession_' + sessionURI).className = currentClassName;
            ModuleSchedulePublic.MySchedule.Manage.ChangeStateSelectedSession(sessionURI);
            if (presentationsDisplayed) {
                //si les présentations sont affichées, on raffraichi
                ModuleSchedulePublic.Search.SessionArea.DisplayPresentations(sessionURI, true);
            }
        });
    }
    
    ModuleSchedulePublic.Common.Manage.LoadLogin = function() {
    
        dojo.require("dijit.Dialog");
    
        //création et ajout au DOM de l'emplacement correspondant à la modalPopup
        var divLogin = document.createElement('div');
        divLogin.id = 'divLogin';
        divLogin.name = 'divLogin';
        
        var divLoginChild = document.createElement('div');
        divLoginChild.id = 'divLoginChild';
        divLoginChild.name = 'divLoginChild';
        divLogin.appendChild(divLoginChild);
        
        document.getElementsByTagName('body')[0].appendChild(divLogin);
    
        //création de la modalPopup
        if (dijit.byId('divLogin')!=undefined) {
            dijit.byId("divLogin").destroy();
        }
        var LoginDialog = new dijit.Dialog({}, dojo.byId('divLogin'));
        
         //affichage de la liste des sessions
        var url = 'login.phtml';
        var form = ModuleSchedulePublic.CreateDummyForm('dummyForm', url);
        var d = cyim.ajax.xhrPost({ form: dojo.byId('dummyForm'), url: url, handleAs: "text" });
        d.addCallback(dojo.hitch(cyim.ajax, "getDataBack", document.getElementById('divLoginChild'),
            function() {
                LoginDialog.show();
            }
        ));
        d.addErrback(function() { ModuleSchedulePublic.Common.Manage.ErrorLog(); });
    
    }

    //Teste, pour l'intervention en param, si elle provoque un conflit de plage horaire
    //Si non, la session est ajoutée au programme de l'utilisateur
    //Si oui, une vue demandant confirmation de la selection à l'utilisateur est affichée dans une modalPopup
    ModuleSchedulePublic.Common.Manage.CheckConflict = function(sessionURI, presentationURI, callbackfunction) {
        var url = 'CheckTimeRangeConflict.phtml?sessionURI=' + sessionURI + '&presentationURI=' + presentationURI;
        //formulaire uniquement utilisé pour la vérification
        var form = ModuleSchedulePublic.CreateDummyForm('dummyForm', url);
        var divResult = document.createElement('div');
        //lance la requête asynchrone
        var d = cyim.ajax.xhrPost({ form: dojo.byId('dummyForm'), url: url, handleAs: "text" });
        d.addCallback(dojo.hitch(cyim.ajax, "getDataBack", divResult,
            function() {
                var hasTimeRangeConflict = eval(divResult.innerHTML.replace('/*', '').replace('*/', ''));
                if (hasTimeRangeConflict) {
                    ModuleSchedulePublic.Common.Manage.LoadTimeRangeConflictConfirmationWindow(sessionURI, presentationURI);
                } else {
                    callbackfunction(hasTimeRangeConflict);
                }
            }
        ));
        d.addErrback(function() { ModuleSchedulePublic.Common.Manage.ErrorLog(); });
    }

    //Charge une vue, demandant confirmation de la selection à l'utilisateur, dans une modalPopup 
    ModuleSchedulePublic.Common.Manage.LoadTimeRangeConflictConfirmationWindow = function(sessionURI, presentationURI) {

        dojo.require("dijit.Dialog");

        //création et ajout au DOM de l'emplacement correspondant à la modalPopup
        var divTimeRangeConflictConfirmationWindow = document.createElement('div');
        divTimeRangeConflictConfirmationWindow.id = 'divTimeRangeConflictConfirmationWindow';
        divTimeRangeConflictConfirmationWindow.name = 'divTimeRangeConflictConfirmationWindow';

        var divTimeRangeConflictConfirmationWindowChild = document.createElement('div');
        divTimeRangeConflictConfirmationWindowChild.id = 'divTimeRangeConflictConfirmationWindowChild';
        divTimeRangeConflictConfirmationWindowChild.name = 'divTimeRangeConflictConfirmationWindowChild';
        divTimeRangeConflictConfirmationWindow.appendChild(divTimeRangeConflictConfirmationWindowChild);

        document.getElementsByTagName('body')[0].appendChild(divTimeRangeConflictConfirmationWindow);

        //création de la modalPopup
        if (dijit.byId('divTimeRangeConflictConfirmationWindow') != undefined) {
            dijit.byId("divTimeRangeConflictConfirmationWindow").destroy();
        }
        var TimeRangeConflictConfirmationWindowDialog = new dijit.Dialog({}, dojo.byId('divTimeRangeConflictConfirmationWindow'));

        //affichage de la vue
        var url = 'TimeRangeConflictConfirmationWindow.phtml?sessionURI=' + sessionURI + '&presentationURI=' + presentationURI;
        var form = ModuleSchedulePublic.CreateDummyForm('dummyForm', url);
        var d = cyim.ajax.xhrPost({ form: dojo.byId('dummyForm'), url: url, handleAs: "text" });
        d.addCallback(dojo.hitch(cyim.ajax, "getDataBack", document.getElementById('divTimeRangeConflictConfirmationWindowChild'),
                function() {
                    TimeRangeConflictConfirmationWindowDialog.show();
                }
            ));
        d.addErrback(function() { ModuleSchedulePublic.Common.Manage.ErrorLog(); });


    }

    //Traitement lancé lorsque l'utilisateur a confirmé son choix de sélection de la session
    ModuleSchedulePublic.Common.Manage.ConfirmSessionTimeRangeConflict = function(sessionURI) {
        ModuleSchedulePublic.Common.Manage.AddOrRemoveSession(sessionURI);
        ModuleSchedulePublic.Common.Manage.CloseTimeRangeConflictWindow();
    }
    
    //Traitement lancé lorsque l'utilisateur a confirmé son choix de sélection de l'intervention
    ModuleSchedulePublic.Common.Manage.ConfirmPresentationTimeRangeConflict = function(presentationURI, sessionURI) {
        ModuleSchedulePublic.Common.Manage.AddOrRemovePresentation(presentationURI, sessionURI);
        ModuleSchedulePublic.Common.Manage.CloseTimeRangeConflictWindow();
    }

    //Traitement lancé lorsque l'utilisateur a annulé son choix de sélection de la session ou de l'intervention
    ModuleSchedulePublic.Common.Manage.CancelTimeRangeConflict = function() {
        ModuleSchedulePublic.Common.Manage.CloseTimeRangeConflictWindow();
    }


    //Traitement lancé lorsque l'utilisateur a confirmé son choix de sélection de la session
    ModuleSchedulePublic.Common.Manage.CloseTimeRangeConflictWindow = function() {
        if (dijit.byId('divTimeRangeConflictConfirmationWindow') != undefined) {
            dijit.byId('divTimeRangeConflictConfirmationWindow').hide();
            dijit.byId("divTimeRangeConflictConfirmationWindow").destroy();
        }

    }









