
(function(){

    var Y = Nb.Lib;
    
    var EVT_TERMS_ACCEPT_COMPLETE = 'termsAcceptComplete';
    
    Nb.FeUser.Gui.ApiClass = function()
    {
        Nb.FeUser.Gui.ApiClass.superclass.constructor.apply(this, arguments);
        
        this.termsLayer = null;
        this.loginLayer = null;
        this.loginBox = null;
        this.profileEditLayer = null;
    }
    
    Nb.FeUser.Gui.ApiClass.NAME = 'feUserGuiApiClass';
    
    Y.extend(Nb.FeUser.Gui.ApiClass, Y.Base, {
        _onProcessParticipateComplete : function(transactionId, response, args)
        {
            var response = Y.JSON.parse(response.responseText);

            if (response.success)
            {
                args.callback.apply(args.context, args.args);
            }
            else
            {
                if (response.data == undefined)
                {
                    alert('Unbekannter Fehler');
                }

                if (response.data.isLoggedIn != undefined && !response.data.isLoggedIn)
                {
                     this.showLogin(response.data.promotion);
                }
                else if (response.data.hasTermsAccepted != undefined && !response.data.hasTermsAccepted)
                {
                     this.showTerms(response.data.promotion);
                }
                else if (response.data.hasRequiredUserFields != undefined && !response.data.hasRequiredUserFields)
                {
                     this.showProfile(response.data.promotion, args.requiredUserFields)
                }
            }
            
        },
        processParticipate : function(promotion, requiredUserFields, callback, context, args)
        {
            var requiredUserFieldsQuery = '';

            for (var key in requiredUserFields)
            {
                var value = requiredUserFields[key];

                if (typeof(value) == 'string')
                {
                    requiredUserFieldsQuery += 'requiredUserFields[' + key + ']=' + value + '&';
                }
            }

            var result = Y.io('/index.php?ajax=1&ext=fe_user_gui&controller=Api&method=canParticipateXhr&promotion=' + promotion, {
                data : requiredUserFieldsQuery,
                method : 'post',
                on : {
                    complete: this._onProcessParticipateComplete
                },
                context : this,
                arguments : {
                    requiredUserFields : requiredUserFields,
                    callback : callback,
                    context : context,
                    args : args
                }
            });
        },
        showProfile : function(promotion, requiredUserFields)
        {
            var requiredUserFieldsQuery = '';

            for (var key in requiredUserFields)
            {
                var value = requiredUserFields[key];

                if (typeof(value) == 'string')
                {
                    requiredUserFieldsQuery += 'requiredUserFields[' + key + ']=' + value + '&';
                }
            }

            Y.io('/index.php?ajax=1&ext=fe_user_gui&controller=ProfileEdit&method=renderXhr&promotion=' + promotion, {
                method : 'post',
                data : requiredUserFieldsQuery,
                on : {
                    complete: this._onGetProfileContentComplete
                },
                context: this
            });
        },
        _onGetProfileContentComplete : function(transactionId, response)
        {
            var response = Y.JSON.parse(response.responseText);

            if (!this.profileEditLayer)
            {
                this.profileEditLayer = new Nb.Wr.UI.Layer();
            }

            this.profileEditLayer.set('header', response.data.header);
            this.profileEditLayer.set('content', response.data.content);

            if (response.data.colorSchema)
            {
                this.profileEditLayer.set('colorSchema', response.data.colorSchema);
            }

            if (response.data.width)
            {
                this.profileEditLayer.set('width', response.data.width);
            }

            this.profileEditLayer.show();

            for (var i = 0; i < response.data.components.length; i++)
            {
                var componentConfig = Y.JSON.parse(response.data.components[0]);

                componentConfig.config.layer = this.profileEditLayer;

                var type = Nb.Core.Util.getType(componentConfig.type);
                var component = new type(componentConfig.config);

                Nb.Wr.Controller.addComponent(componentConfig.name, component);
            }
        },
        showTerms : function(promotion)
        {
            Y.io('/index.php?ajax=1&ext=fe_user_gui&controller=Terms&method=renderXhr&promotion=' + promotion, {
                method : 'post',
                on : {
                    complete: this._onGetTermsContentComplete
                },
                context: this
            });
        },
        _onGetTermsContentComplete : function(transactionId, response)
        {
            var response = Y.JSON.parse(response.responseText);

            if (!this.termsLayer)
            {
                this.termsLayer = new Nb.Wr.UI.Layer();
            }
            
            this.termsLayer.set('header', response.data.header);
            this.termsLayer.set('content', response.data.content);
            
            if (response.data.colorSchema)
            {
                this.termsLayer.set('colorSchema', response.data.colorSchema);
            }
            
            if (response.data.width)
            {
                this.termsLayer.set('width', response.data.width);
            }
            
            this.termsLayer.show();
            
            var termsAcceptButton = Y.one('#terms-accept-button');
            
            if (termsAcceptButton)
            {
                termsAcceptButton.on('click', this._onTermsAcceptButtonClick, this, response.data.promotion);
            }
        },
        _onTermsAcceptButtonClick : function(event, promotion)
        {
            event.halt();
            
            Y.io('/index.php?ajax=1&ext=fe_user_gui&controller=Terms&method=acceptXhr&promotion=' + promotion, {
                method : 'post',
                on : {
                    complete: this._onTermsAcceptComplete
                },
                context: this
            });
        },
        _onTermsAcceptComplete : function(transactionId, response)
        {
            var response = Y.JSON.parse(response.responseText);
            
            this.termsLayer.set('content', response.data.content);
            
            this.fire(EVT_TERMS_ACCEPT_COMPLETE, response.data.promotion, this.termsLayer);

            //location.reload();
        },
        showLogin : function(promotion)
        {
            Y.io('/index.php?ajax=1&ext=fe_user_gui&controller=LoginBox&method=renderXhr&promotion=' + promotion, {
                method : 'post',
                on : {
                    complete: this._onGetLoginContentComplete
                },
                context: this
            });
        },
        _onGetLoginContentComplete : function(transactionId, response)
        {
            var response = Y.JSON.parse(response.responseText);

            if (!this.loginLayer)
            {
                this.loginLayer = new Nb.Wr.UI.Layer();
            }
            
            this.loginLayer.set('header', response.data.header);
            
            if (response.data.colorSchema)
            {
                this.loginLayer.set('colorSchema', response.data.colorSchema);
            }
            
            if (response.data.width)
            {
                this.loginLayer.set('width', response.data.width);
            }
            
            var loginBoxWrapper = Y.one('#login-box-guest-wrapper');
            
            var fadeOut = new Y.Anim({
                node: loginBoxWrapper,
                to: {
                    opacity: 0
                }
            });
            
            fadeOut.on('end', this._onLoginBoxWrapperFadeOutEnd, this);
            
            fadeOut.run();
            
            
        },
        _onLoginBoxWrapperFadeOutEnd : function()
        {
            if (!this.loginBox)
            {
                this.loginBox = Y.one('#login-box-guest');
            }
            
            var form = this.loginBox.one('form');
            form.removeClass('form-sidebar');
            form.addClass('form');
            
            Y.one('#login-box-guest-form-submit img').set('src', '/inc/img/button/submit_onwhite.gif');
            
            this.loginBox.remove();
            
            this.loginLayer.set('content', this.loginBox);
            this.loginLayer.on('close', this._onLoginLayerClose, this);
            this.loginLayer.show();
        },
        _onLoginLayerClose : function()
        {
            var loginBoxWrapper = Y.one('#login-box-guest-wrapper');
            
            var form = this.loginBox.one('form');
            form.removeClass('form');
            form.addClass('form-sidebar');
            
            Y.one('#login-box-guest-form-submit img').set('src', '/inc/img/icon/link_blue.gif');
            
            this.loginBox.remove();
            
            Y.one('#login-box-guest-wrapper div.inner').appendChild(this.loginBox);
            
            var fadeIn = new Y.Anim({
                node: loginBoxWrapper,
                to: {
                    opacity: 1
                }
            });
            
            fadeIn.run();
        }
    });
    
    Nb.FeUser.Gui.Api = new Nb.FeUser.Gui.ApiClass();
    
})();

