﻿
socioscope.userModule = function() {

//    var authCookieName = 'socioscope_auth';
//    var minimumPasswordLength = 8;
//    var minimumPasswordLengthMessage= 'Votre mot de passe doit avoir un minimum de 8 caractères...';

    var strAppUrl = socioscope.appUrl;
    
    var hasSession = false;
    var username;
    
    var interval = 1; // en minutes...

    var stateProvider;

    var profileWindow;
    
    var loginBtnId = 'login_btn';
    var logoutBtnId = 'logout_btn';
    var profileBtnId = 'profile_btn';
    
    var loginWizard;
    
    var pageBlockOptions = { fadeIn: 200, fadeOut: 0, css: { border: 'none', padding: '0px' }, overlayCSS: { backgroundColor: '#333', opacity: 0.5, cursor: 'wait' }, message: '' };
    var dialogBlockOptions = { fadeIn: 0, fadeOut: 0, css: { border: 'none', padding: '0px' }, overlayCSS: { backgroundColor: '#fff', cursor: 'default' }, message: '' };
  
    var hideProfileWindow = function() {
    
        $('#profileDialog').css('visibility', 'hidden');
        //$('#relationsExplorer').css({visibility: 'visible'})
    
        $('#profileDialog').effect('transfer', { to: '#' + profileBtnId, className: 'ui-effects-transfer' }, 300, function() {
            $.unblockUI();  
        });
    
    };
  
    var showProfileWindow = function() {
    
        if (hasSession) {
        
            if ($('#profileDialog').length === 0)  {
            
                $.ajax({
                    url: strAppUrl + 'content/profile_dialog.txt',
                    async: false,
                    //data: $('#user').serialize() + '&method=user.getprofile&format=json',
                    success: function(data) {
                    
                        $('#page').before(data);      
                        //$('#profileDialog').draggable({handle: '.dialog-header', cursor: 'move'});
                        
                        var statusBar = $('#profileDialog').find('span.statusbar');
                        var dlgBody = $('#profileDialog').find('form');
                        
                        $('#profileDialog .ok').click(function() {
                        
                            var fieldSelector = '#oldpassword, #newpassword, #confirmpassword';
                            
                            if (!$(fieldSelector, '#profileDialog').valid()) {
                                return false;
                            }

                            statusBar.html('Un instant, nous effectuons les modifications...');
                            dlgBody.block(dialogBlockOptions);
                            
                            $.post(strAppUrl + 'services/api.ashx',
                                {
                                    method: 'user.changePassword',
                                    oldpassword: $('#oldpassword', '#profileDialog').val(),
                                    newpassword: $('#newpassword', '#profileDialog').val(),
                                    confirmpassword: $('#confirmpassword', '#profileDialog').val(),
                                    format: 'json',
                                    ts: new Date().getTime()
                                }, 
                                function(json, textStatus) {

                                    dlgBody.unblock();
                                    statusBar.html('');  
                                    
                                    alert(json.response['@statuscode']);
                                                                                                      
                                    if (parseInt(json.response['@statuscode'], 10) === 200) {
                                    
                                        hideProfileWindow();
                                        
                                    } else {
                                                                        
                                        var validator = $('#profileForm').validate();
                                        
                                        var fieldId = json.response.errors.error.id;
                                        var errorMsg = json.response.errors.error.msg;
                                        
                                        var errorObj = {};
                                        errorObj[fieldId] = errorMsg;
                                        
                                        validator.showErrors(errorObj);
                                                                            
                                    }
                                   
                                },
                                'json' 
                            );


//                            $.ajax({
//                                url: strAppUrl + 'services/api.ashx',
//                                async: true,
//                                type: 'POST',
//                                data: 'method=user.changepassword&' + $(fieldSelector, '#profileDialog').serialize() + '&format=json&ts=' + new Date().getTime(),
//                                dataType: 'json',
//                                success: function(json) {
//                                
//                                    dlgBody.unblock();
//                                    statusBar.html('');  
//                                    
//                                    alert(json.response['@statuscode']);
//                                                                                                      
//                                    if (parseInt(json.response['@statuscode'], 10) === 200) {
//                                    
//                                        hideProfileWindow();
//                                        
//                                    } else {
//                                                                        
//                                        var validator = $('#profileForm').validate();
//                                        
//                                        var fieldId = json.response.errors.error.id;
//                                        var errorMsg = json.response.errors.error.msg;
//                                        
//                                        var errorObj = {};
//                                        errorObj[fieldId] = errorMsg;
//                                        
//                                        validator.showErrors(errorObj);
//                                                                            
//                                    }
//                                                       
//                                }
//                                
//                            });

                            return false;
                            
                        });
                        
                        $('#profileDialog .cancel').click(function() {
                            hideProfileWindow();
                            return false;
                        });
                        
                        $('input[type="text"], input[type="password"]', '#profileDialog').focus(function() {
                            $(this).parent().addClass('focus');                
                        });
                        
                        $('input[type="text"], input[type="password"]', '#profileDialog').blur(function() {
                            $(this).parent().removeClass('focus');                
                        });
                       
                        
                    }
                });
            
            
            }
            
            var validator = $("#profileForm").validate({errorClass: "validation-error"});
   
            $('#profileForm')[0].reset();
            $('#profileForm').validate().resetForm();
                                   
            $('#relationsExplorer').css({visibility: 'hidden'}); 
            
            var left = (($('#viewport').outerWidth() - $('#profileDialog').outerWidth()) / 2) + $('#viewport').offset().left;
            var top = ($(window).height() - $('#profileDialog').outerHeight()) / 2;
            
            $('#profileDialog').css({top: top > $('#viewport').offset().top ? $('#viewport').offset().top : top, left: left}); 
              
            if (jQuery.browser.msie) {
            
                $('#profileDialog').css({visibility: 'visible', display: 'block'});
                $.blockUI({centerY: false, message: $('#profileDialog'), css: {top: 0, left: 0}, constrainTabKey: false});
                            
            } else {
            
                $('#' + profileBtnId).effect('transfer', { to: '#profileDialog', className: 'ui-effects-transfer' }, 200, function() {
                    $('#profileDialog').css('visibility', 'visible');
                    $.blockUI({message: $('#profileDialog'), css: {top: 0, left: 0}, constrainTabKey: false}); 
                    $('#profileDialog').find('#oldpassword').focus();
                });
            
            }
        
        }
    
    };
     
    var hideLoginWindow = function() {

        //$('#relationsExplorer').css({visibility: 'visible'})
        
        $('#loginDialog').css('visibility', 'hidden');
    
        if (jQuery.browser.msie) {
        
            $.unblockUI();
                            
        } else {
    
            $('#loginDialog').effect('transfer', { to: '#' + loginBtnId, className: 'ui-effects-transfer' }, 200, function() {
                $.unblockUI();   
            });
            
        }
        
    };
    
    var handleLoginNextButton = function() {
         
        var fieldSelector;
        var statusBar = $('#loginDialog').find('span.statusbar');
        var dlgBody = $('#loginDialog').find('form');
        
            var method = $('input[name="method"]:checked').val();
                    
            switch (loginWizard.getPageIndex() + 1) {
            
                case 1:

                    switch (method) {
                    
                        case 'user.register':
                            fieldSelector = '#user, #password, #confirmpassword';
                            break;
                            
                        case 'user.resetpassword':
                            fieldSelector = '#user';
                            break;
                             
                        default:
                            fieldSelector = '#user, #password';
                            break;

                    }

                    if (!$(fieldSelector, '#loginDialog').valid()) {
                        return false;
                    }
                    
                    statusBar.text('Un instant, nous vérifions votre identité...');
                    dlgBody.block(dialogBlockOptions);

                    $.ajax({
                        url: strAppUrl + 'services/api.ashx',
                        async: true,
                        data: 'method=' + method + '&' + $(fieldSelector, '#loginDialog').serialize() + '&format=json&checkonly=' + (method === 'user.resetpassword' || method === 'user.register'),
                        dataType: 'json',
                        success: function(json) {
                        
                            dlgBody.unblock();
                            statusBar.text('');
                                                                                              
                            if (parseInt(json.response['@statuscode'], 10) === 200) {
                                                               
                                if (method === 'user.resetpassword') {
                                           
                                    statusBar.text('Un instant, nous récupérons vos informations...');
                                    dlgBody.block(dialogBlockOptions);

                                    $.ajax({
                                        url: strAppUrl + 'services/api.ashx',
                                        async: true,
                                        data: $('#user', '#loginDialog').serialize() + '&method=user.getprofile&format=json',
                                        dataType: 'json',
                                        success: function(json) {
                                        
                                            dlgBody.unblock();
                                            statusBar.text('');
                                               
                                            $('#secretquestion').val(json.response.user.secretquestion);
                                            
                                            loginWizard.next();
                                            
                                        }                                           
                                    });
                                           
                                } else if (method === 'user.register') {
                                
                                    loginWizard.next();
                                                                         
                                } else {
                                
                                    //checkSession();
                                    
                                   
                                    username = $('#user').val();
                                    hasSession = true;
                                    
                                    hideLoginWindow();
                                    updateInterface(hasSession);
                                
                                    $('#' + loginBtnId).everyTime(interval * 1 * 60 * 1000, "checkSessionTimer", function(i) {
                                        checkSession();
                                    }, 0);
                                    
                                    restartTimeoutTimer();
                                    

                                
                                }
                                
                            } else {
                                                                
                                var validator = $('#loginForm').validate();
                                
                                var fieldId = json.response.errors.error.id;
                                var errorMsg = json.response.errors.error.msg;
                                
                                var errorObj = {};
                                errorObj[fieldId] = errorMsg;
                                
                                validator.showErrors(errorObj);
                                                                
                            } 
                        }
                    });
                    
                    break;
                    
                case 2:
                
                    switch (method) {
                    
                        case 'user.register':
                            fieldSelector = '#user, #password, #confirmpassword, #secretquestion, #secretanswer';
                            break;
                            
                        case 'user.resetpassword':
                            fieldSelector = '#user, #question, #answer, #secretquestion, #secretanswer';
                            break;
                             
                        default:
                            fieldSelector = '#user, #password';
                            break;

                    }
                     
                    if (!$(fieldSelector).valid()) {
                        return false;
                    }
                    
                    statusBar.html('Un instant, nous traitons votre demande...');
                    dlgBody.block(dialogBlockOptions);
                    
                    $.ajax({
                        url: strAppUrl + 'services/api.ashx',
                        async: true,
                        data: 'method=' + method + '&' + $(fieldSelector).serialize() + '&format=json',
                        dataType: 'json',
                        success: function(json) {
                        
                            dlgBody.unblock();
                            statusBar.text('');
                        
                            if (parseInt(json.response['@statuscode'], 10) === 200) {
                            
                                $('.cancel, .next, .end', '#loginDialog').toggleClass('hidden');
                                loginWizard.next();
                            
                            } else {
                                                                
                                var validator = $('#loginForm').validate();
                                
                                var fieldId = json.response.errors.error.id;
                                var errorMsg = json.response.errors.error.msg;
                                
                                var errorObj = {};
                                errorObj[fieldId] = errorMsg;
                                
                                validator.showErrors(errorObj);
                                
                                returnValue = false;
                                
                            } 
                            
                        }     
                                                              
                    });
                    
                    break;
                    
                case 3:
                
                    returnValue = true;
//                                        hideLoginWindow();
                    break;
                                             
                default:
                
                    returnValue = false;
//                                        hideLoginWindow();
                    break;
                    
            }
                                                       
            return false;
                   
                            
    
    };
    
    var showLoginWindow = function() {
    
    
        if (!hasSession) {
       
            if ($('#loginDialog').length === 0)  {
           
                $.ajax({
                    url: strAppUrl + 'content/login_dialog.txt',
                    async: false,
                    //data: $('#user').serialize() + '&method=user.getprofile&format=json',
                    success: function(data) {
                                        
                        $('#page').before(data);                  
                        //$('#loginDialog').draggable({handle: '.dialog-header', cursor: 'move'});
                        
                        loginWizard = $('#loginWizard').scrollable({size: 1, speed: 200, clickable: false, api: true});
                            
                        $('#loginDialog .next').click(function() {
                            handleLoginNextButton();
                            return false;
                        });
                        
                        $('#loginDialog .cancel').click(function() {
                            hideLoginWindow();
                            return false;
                        });
                        
                        $('#loginDialog .end').click(function() {
                            hideLoginWindow();
                            return false;
                        });
                                             
                        var validator = $("#loginForm").validate({errorClass: "validation-error"});
            
                        $('input[name="method"]').click(function() {
                            if ($(this).val() == 'user.login') {
                                $('input[name="password"]', '#loginDialog').attr("disabled", "").parent().removeClass('x-disabled');
                                $('input[name="confirmpassword"]', '#loginDialog').attr("disabled", "disabled").parent().addClass('x-disabled');
                            } else if ($(this).val() == 'user.register') {
                                $('input[name="password"]', '#loginDialog').attr("disabled", "").parent().removeClass('x-disabled');
                                $('input[name="confirmpassword"]', '#loginDialog').attr("disabled", "").parent().removeClass('x-disabled');
                            } else {
                                $('input[name="password"]', '#loginDialog').attr("disabled", "disabled").parent().addClass('x-disabled');
                                $('input[name="confirmpassword"]', '#loginDialog').attr("disabled", "disabled").parent().addClass('x-disabled');     
                            }
                            $('#loginForm').validate().resetForm();
                        });
                        
      
                        
                        $('input', '#loginDialog').keydown(function(e) { 
                        
                            switch (e.keyCode) {
                            
                                case 9:
                                    return false;
                                    break;  
                                    
                                case 13:
                                    return false;
                                    break;   
                                    
                                default:
                                    return true;                                   
                            
                            }
                        
                            return false;
    
                        });                  
                        
                        $('input[type="text"], input[type="password"]', '#loginDialog').focus(function() {
                            $(this).parent().addClass('focus');                
                        });
                        
                        $('input[type="text"], input[type="password"]', '#loginDialog').blur(function() {
                            $(this).parent().removeClass('focus');                
                        });
                       
                        
                    } 
                                                              
                });
            
            }
            


             
            loginWizard.begin();
            
            $('.cancel, .next', '#loginDialog').removeClass('hidden');
            $('.end', '#loginDialog').addClass('hidden');
             
            $('#loginForm')[0].reset();
            $('#loginForm').validate().resetForm();
                   
            $('input[value="user.login"]').attr('checked', true).trigger('click');
            
            
            //$('#loginDialog').css('display', 'block');
            //$('#loginDialog').css('visibility', 'visible');
            
            $('#relationsExplorer').css({visibility: 'hidden'});      
            //$('#loginDialog').css('display', 'block');
            
            var left = (($('#viewport').outerWidth() - $('#loginDialog').outerWidth()) / 2) + $('#viewport').offset().left;
            var top = ($(window).height() - $('#loginDialog').outerHeight()) / 2;
            
            $('#loginDialog').css({top: top > $('#viewport').offset().top ? $('#viewport').offset().top : top, left: left}); 
            
            if (jQuery.browser.msie) {
            
                $('#loginDialog').css({visibility: 'visible', display: 'block'});
                $.blockUI({centerY: false, message: $('#loginDialog'), constrainTabKey: false});
                
            } else {
            
                $('#' + loginBtnId).effect('transfer', { to: '#loginDialog', className: 'ui-effects-transfer' }, 200, function() {
                    $('#loginDialog').css({visibility: 'visible'});  
                    $.blockUI({message: $('#loginDialog'), css: {top: 0, left: 0}, constrainTabKey: false});                   
                    $('#loginDialog').find('#user').focus();
                });
            }
   
        }
                  
    };
  
    var updateInterface = function(hasSession) {
    
        $('#session_tools').show();
    
        if (hasSession) {
        
            $('#username').html(username); 
                
            $('#' + loginBtnId).addClass('x-disabled');
            $('#' + logoutBtnId).removeClass('x-disabled');
            $('#' + profileBtnId).removeClass('x-disabled');
            
            $('.comment_rater').addClass('hidden');
            $('span.warning', '#comment_form').hide();
               
            $('div.wysiwyg', '#comment_form').show();
            $('textarea', '#comment_form').show();
                        
//            if ($('div.wysiwyg', '#comment_form').length === 0) {
//                $('textarea', '#comment_form').show();
//            } else {
//                $('div.wysiwyg', '#comment_form').show();
//            }
            
            $('#post_comment_btn').show();
 
        } else {
        
            $('#username').html('');
            
            if ($('#profileDialog').css('visibility') == 'visible') {
                hideProfileWindow();
            }
        
            $('#' + loginBtnId).removeClass('x-disabled');
            $('#' + logoutBtnId).addClass('x-disabled');
            $('#' + profileBtnId).addClass('x-disabled');
            
            $('.comment_rater').addClass('hidden');
            $('span.warning', '#comment_form').show();
            
            $('div.wysiwyg', '#comment_form').hide();
             $('textarea', '#comment_form').hide();
             
            $('#post_comment_btn').hide();
            
//            Ext.getCmp('commentForm').hide();
        
        }
        
    };
    
    var checkSession = function() {

        logMessage("Checking session...");
                
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'user.checkSession', format: 'json'},
            function(data, textStatus) {
            
                // Success??? Failure???
            
                var response = data.response;
                var isLoggedIn = toBoolean(response['@success']);
                           
                if (!isLoggedIn && hasSession) {
                
                    $('#' + loginBtnId).stopTime("checkSessionTimer");
                    $(document).stopTime("sessionTimeoutTimer");
                                    
//                    Ext.MessageBox.show({
//                        title: 'Information',
//                        msg: 'Votre session de travail a expiré à ' + new Date().format('G:i') + '.',
//                        icon: Ext.MessageBox.INFO,
//                        buttons: Ext.MessageBox.OK           
//                    });
                    
                    logMessage('Session has expired');
                    
                }
                   
                username =  response['@message'];
                hasSession = isLoggedIn;
                updateInterface(hasSession);
                                
                return hasSession;
               
            }
        );
          
    };
    
    var restartTimeoutTimer = function() {
    
        $(document).stopTime("sessionTimeoutTimer");
        
        if (hasSession) {
        
            logMessage('Restarting session timeout counter...');

            $(document).everyTime(interval * 0.25 * 60 * 1000, 'sessionTimeoutTimer', function(i) {
                handleBeforeTimeout();
            }, 0);
        
        }
    
    };
    
    var doLogout = function() {
    
        $.get(strAppUrl + 'services/api.ashx', {method: 'user.logout'},
            function(data, textStatus) {
               
            }
        );
    
        $('#' + loginBtnId).stopTime("checkSessionTimer");
        $(document).stopTime("sessionTimeoutTimer");
    
        hasSession = false;
        updateInterface(false);
    
    };
    
    var handleBeforeTimeout = function() {
    
//        console.log(hasSession ? 'Session is about to end' : 'No session..');

    };

    return {
    
        hasSession: function() {
            return hasSession;
        },
        
        init: function() {
        
            $.blockUI.defaults.fadeIn = 100; 
            $.blockUI.defaults.fadeOut = 100; 
            $.blockUI.defaults.css = {}; 
            $.blockUI.defaults.overlayCSS = {};
            
            $.blockUI.defaults.onUnblock = function(element) {
                if (element.tagName === undefined) {
                    $('#relationsExplorer').css({visibility: 'visible'});
                }  
            };
        
            checkSession();
            
            if (hasSession) {
                $('#' + loginBtnId).everyTime(interval * 1 * 60 * 1000, "checkSessionTimer", function(i) {
                    checkSession();
                }, 0);
            }
        
            $(document).ajaxComplete(function() {       
                restartTimeoutTimer();                                  
            });
          
           $('#' + loginBtnId).click(function() {
                showLoginWindow(); 
                return false;
            });
            
            $('.login_btn').click(function() {
                showLoginWindow(); 
                return false;
            });
            
            $('#' + profileBtnId).click(function() {
                showProfileWindow();
                return false;
            });
            
            $('#' + logoutBtnId).click(function() {
                doLogout();
                return false;
            });
                              
            logMessage('Socioscope user module started...');
            
        }
        
    };

}();

$(document).ready(function () {

    socioscope.userModule.init();
    
});


