
Ext.ns('Imhotep.authentication.tester');

Imhotep.authentication.tester.Messenger = Ext.extend(Ext.Window, {

    tplBody : new Ext.XTemplate(
        '<div>',
            '<p>{explanation}</p>',
            '{login}',
        '</div>'
    ),

    /**
     *----------------------------------------------------------------------
     *                Methodes sans acces a this.config
     *----------------------------------------------------------------------
     */

    initComponent: function() {
        Imhotep.Ajax.skippedStatus.push(401);
        Imhotep.AjaxError.listen({
            fn    : this.onRequestException,
            scope : this
        });
        Ext.applyIf(this, {
            config     : {},
            width      : 350,
            height     : 180,
            autoScroll : true,
            bodyStyle  : 'padding: 10px',
            iconCls    : 'imhotep-authentication-tester-window',
            modal      : true,
            onEsc      : function(){this.hide();}
        });
        Ext.apply(this, {
            closeAction  : 'hide',
            animateTarget: Ext.getBody()
        });
        Imhotep.authentication.tester.Messenger.superclass.initComponent.call(this);

        this.on({
            afterrender: {scope: this, single: true, fn: this.onAfterRender},
            show: {scope: this, fn: this.onShow}
        });
    },

    onRequestException: function(conn, response, options) {
        // on ne traite le probleme d'autorisation que si on recoit une erreur
        // HTTP 401 du serveur
        if (response.status != 401) {
            return false;
        }
        // on va recuperer les infos pour creer la box de login
        var json = {};
        try {
            json = Ext.decode(response.responseText);
        } catch (e){
            json = {error: false};
        }
        // si error = true, c'est que le serveur a bien reussi a renvoyer
        // l'info comme quoi il y avait une erreur. Si error = false, c'est
        // que le json n'a pas pu etre decode et que l'erreur est encore plus
        // grave et intretable par cette classe
        if (json.error === true) {
            this.config = json;
            this.show();
            return true;
        }
        return false;
    },


    /**
     *----------------------------------------------------------------------
     *                  Methodes publiques
     *----------------------------------------------------------------------
     */

    /**
     * Appele apres que la fenetre soit rendue (ca ne veut pas dire qu'elle
     * est visible)
     *
     * Ici on set simplement le contenu de la window
     *
     * @return void
     */
    onAfterRender: function() {
        this.setTitle(this.config.wording.authentification_tester_title);
        // un brin de Prototype.js
        this.config.login.evalScripts();
        // set du contenu de la window
        this.tplBody.overwrite(this.body, {
            explanation: this.config.wording.authentification_tester_explanation,
            login: this.config.login
        });
        // masque de loading
        this._mask = new Ext.LoadMask(this.bwrap, {msg: this.config.wording.message.wait.wait});
    },

    /**
     * Appele apres que la fenetre soit visible
     *
     * Ici on va setter les actions de bouton en javascript
     *
     * @return void
     */
    onShow: function() {
        // on s'assure que l'event n'est sette qu'une seule fois
        if (!this.loginEventized) {
            Ext.get(this.loginButtonId).on({
                click: {scope: this, fn: function(){
                    this.login();
                }}
            });
            this.form = new Ext.form.BasicForm(this.loginFormId);
            this.loginEventized = true;
        }
        var e = Ext.get(this.loginFieldId);
        e.highlight();
    },

    /**
     * Methode appelee depuis le template du composant de Login
     *
     * @param string buttonId l'id du bouton de submit
     * @param string formId l'id du formulaire
     * @return void
     */
    setTemplateDatas: function(buttonId, formId, loginId) {
        this.loginButtonId = buttonId;
        this.loginFieldId = loginId;
        this.loginFormId = formId;
    },

    /**
     * Envoi la requete ajax avec les parametres du formulaire de login
     *
     * @return void
     */
    login: function() {
        this._mask.show();
        this.form.submit({
            scope   : this,
            params  : {ajaxCall: 1},
            success : function(form, action) {
                this.manageResponse({
                    msg  : this.config.wording.authentification_tester_authok,
                    icon : Ext.Msg.INFO,
                    fn   : function(){this.hide();}
                });
            },
            failure : function(form, action) {
                this.manageResponse({
                    msg  : action.result.error,
                    icon : Ext.Msg.WARNING
                });
            }
        });
    },

    /**
     * Affiche les messages en fonction de la reussite ou non du login
     *
     * @param Object config un bout de config de Ext.Msg.show
     * @return void
     */
    manageResponse: function(config) {
        this._mask.hide();
        Ext.Msg.show(Ext.apply(config, {
            title   : this.config.wording.authentification_tester_authok_title,
            scope   : this,
            closable: false,
            buttons : Ext.Msg.OK,
            animEl  : Ext.getBody()
        }));
    }

});
