var account;

var AccountBox = new Class ({
    closed: true,
    holder: null,
    holder_height_min: 35,
    element_timer: null,
    slide_time: 150,
    slide_delay: 1000,
    slide_timer: null,

    /* Internal properties */
    _validEmail: /[\w-\.\+]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}/,
    _ajax_path: 'account_header.php',
    _redirect_url: '/slagroomsparen',
    _message_timeout: null,
    _default_forgot_password_text: 'Vul hieronder je e-mailadres in. Je ontvangt een nieuw wachtwoord per e-mail. Dit wachtwoord kun je eenmalig gebruiken om in te loggen.',

    initialize: function() {
        this.holder = $('account_holder');
        this.holder.getFirst().set('tween', {
            duration: this.slide_time
        });

        // will setup all basic event handlers
        this.setupEventHandlers();
        return true;
    },

    setupEventHandlers: function() {
        this.setupLabelsEvents();
        this.setupPanelEvents();
        this.setupLoginFormEvents();
    },

    setupPanelEvents: function() {
        // if login or forgot password forms aren't open,
        // then close the box
        this.holder.getFirst().addEvent('mouseleave', function(e) {
            if($('not-loggedin')) {
                if( $('login-form').isVisible() || $('forgot-password-holder').isVisible()) {
                    account._close();
                } else {
                    $('not-loggedin').fade('show').setStyle('display', 'block');
                    account._close();
                }
            }
        });
        this.addCheckCodeEvent();

        // Prevent dialog from closing when cursor is still hovering the dialog
        this.holder.getFirst().addEvent('mouseover', function(e) {
            if(typeof account.slide_timer != 'null') {
                clearTimeout(account.slide_timer);
            }
        });
    },

    setupLabelsEvents: function() {
        $$('#account_holder div.input.text.loginbox > label, #account_holder div.input.password.loginbox > label').each(function(el) {
            var input = el.getNext();
            input.set('value', '');
            if(input.get('value').length > 0) {
                input.getPrevious().fade('out');
            }
            input.addEvent('focus', function() {
                input.getPrevious().fade('hide');
            });
            input.addEvent('keypress', function() {
                input.getPrevious().fade('hide');
            });
            input.addEvent('blur', function() {
                if(input.get('value').length == 0) {
                    input.getPrevious().fade('in');
                }
            });
            el.addEvent('click', function() {
                input.blur();
                el.fade('hide');
                input.focus();
            }).addEvent('hover', function() {
                input.blur();
                el.fade('hide');
                input.focus();
            });
        });
    },

    setupLoginFormEvents: function() {
        if(!$('formConfirm'))  {
            return false;
        }
        $$('#formConfirm div.input input').addEvent('keypress', function(event) {
            if(event.key == 'enter') {
                account.doLogin();
            }
        });
        return true;
    },

    slideIn: function() {
        if(this.closed !== true) {
            return false;
        }
        this.closed = false;
        this.holder.getFirst().tween('height', 130);
        this.element_timer = setTimeout(function() {
            $('login-form').setStyle('display','block');
            $('not-loggedin').setStyle('display', 'none');
        }, account.slide_time);
        return true;
    },

    slideOut: function() {
        return this._close();
    },

    /* Internal functions */

    /* Close the loginbox */
    _close: function() {
        if(this.closed === true) {
            return false;
        }
        this.slide_timer = setTimeout(function() {
            account.closed = true;
            $$('.component-ui-box').setStyle('display','none');
            $('not-loggedin').setStyle('display', 'block');
            account.holder.getFirst().tween('height', account.holder_height_min);
            clearTimeout(account.slide_timer);
        }, this.slide_delay);
        return true;
    },

    /* Dialogs */
    showForgotPassword: function() {
        $$('.component-ui-box').setStyle('display','none');
        $('forgot-password-holder').setStyle('display', 'block');
        var message_box = $('login-message-password');
        message_box.fade('in');
        message_box.set('html', account._default_forgot_password_text);
        var email_forgot_input  = $('email-address-forgot');
        if($('email_panel_header').value.length > 0) {
            email_forgot_input.set('value', $('email_panel_header').value);
            email_forgot_input.getPrevious().fade('out');
        }
        email_forgot_input.addEvent('keypress', function(event) {
            if(event.key == 'enter') {
                account.doResetPassword();
            }
        });
        var send_button = $('closefpass');
        send_button.removeEvents('click');
        send_button.addEvent('click', function() {
            account.doResetPassword();
        });
    },


    /* Actions */
    doLogin: function() {
        // do validations before submit
        var u = ($('email_panel_header').value + "").toLowerCase();
        if(!u) {
            $('email_panel_header').blur();
            $('email_panel_header').focus();
            $('email_panel_header').getParent().addClass('error');
            $('email_panel_header').getPrevious().fade('hide');
            return false;
        }
        if(!u.test(account._validEmail)) {
            $('email_panel_header').blur();
            $('email_panel_header').focus();
            $('email_panel_header').getParent().addClass('error');
            $('email_panel_header').getPrevious().fade('hide');
            return false;
        }
        $('email_panel_header').value = u;
        var p = $('password').value;
        if(!p) {
            $('password').blur();
            $('password').focus();
            $('password').getParent().addClass('error');
            $('password').getPrevious().fade('hide');
            return false;
        }
        p = sha256_digest('magneds.com'+u+p) ;
        p = sha256_digest(p+$('loginbar_challenge').value) ;
        $('loginbar_passhash').set('value', p);
        $('formConfirm').submit();
        return true;
    },

    /* Send via AJAX a request to reset user password */
    doResetPassword: function() {
        if(!$('email-address-forgot').value.test(account._validEmail)) {
            $('email-address-forgot').blur();
            $('email-address-forgot').focus();
            $('email-address-forgot').getParent().addClass('error');
            return false;
        }
        var message_box = $('login-message-password');
        message_box.fade('out');
        var send_button = $('closefpass');
        new Request({
            method: 'post',
            url: account._ajax_path,
            data: {
                'ajax': 'forgotPassword',
                'email': $('email-address-forgot').value
            },
            onComplete: function(response) {
                message_box.set('html', response);
                message_box.fade('in');
                message_box.setStyle('display', 'block');
                account._message_timeout = setTimeout(function() {
                    clearTimeout(account._message_timeout);
                    message_box.fade('out');
                    message_box.set('html', account._default_forgot_password_text);
                    message_box.fade('out').fade('in');
                    send_button.addEvent('click', function() {
                        account.doResetPassword();
                    });
                }, 5000);
            }
        }).send();
        // remove send button click event to avoid multiple requests by accident
        send_button.removeEvents('click');
        message_box.set('html', '<img src="/css/ajax-loader.gif" />');
        return true;
    },

    doLogout: function() {
        new Request({
            method: 'post',
            url: account._ajax_path,
            data: {
                'ajax': 'logout'
            },
            onComplete: function(response) {
                document.location.href = account._redirect_url;
            }
        }).send();
    },

    addCheckCodeEvent: function() {
        if($('checkcode')) {
            $('code_status').fade("hide");
            
            //var myElement = document.id('myElement');

            // add event to send button
            $('checkcode').removeEvents('click').addEvent('click', function() {
                account._doCheckCode();
            });

            var input_code = $('raw_code');
            input_code.removeEvents();
            input_code.addEvent('keypress', function(event) {
                if(event.key == 'enter') {
                    account._doCheckCode();
                }
            });
            input_code.addEvent('focus', function() {
                input_code.getPrevious().fade('hide');
            });
            input_code.addEvent('blur', function() {
                if(input_code.value.length == 0) {
                    input_code.getPrevious().fade('in');
                }
            });
            if(input_code.value.length > 0) {
                input_code.getPrevious().fade('hide');
            }
            input_code.getPrevious().addEvent('click', function() {
                input_code.getPrevious().fade('hide');
            });


        }
    },

    _doCheckCode: function() {
        var raw_code = $('raw_code').value;
        if ( raw_code.length == 0 ) {
            return false;
        }

        var myRequest = new Request.JSON({
            url: account._ajax_path,
            method: 'post',
            onSuccess: function(responseJSON, responseText)
            {
                var msg_holder;
                switch(responseJSON.request)
                {
                    case "getBalance":
                        if($('credits')) {
                            $('credits').innerHTML = responseJSON.balance;
                        }
                        break;

                    case "addCredit":
                        if(responseJSON.result == "valid")
                        {
                            $('code_status').fade("show");
                            $('code_status').addClass("code_valid");
                            msg_holder = account.drawCodeResponseLegend('valid', responseJSON.message);
                            setTimeout(function() {
                                $('code_status').fade("hide");
                                $(msg_holder).fade('out').dispose();
                            }, 5000);
                            $('credits').innerHTML = responseJSON.balance;
                            $('raw_code').value = '';


                        }
                        else
                        {
                            $('raw_code').value = '';
                            $('code_status').fade("show");
                            $('code_status').addClass("code_invalid");
                            msg_holder = account.drawCodeResponseLegend('invalid', responseJSON.message);
                            setTimeout(function() {
                                $('code_status').fade("hide");
                                $(msg_holder).fade('out').dispose();
                            }, 5000);
                        }

                        break;


                    default:
                        break;
                }
            },
            onFailure: function()
            {
            // error
            }
        });

        $('code_status').fade("hide");
        $('code_status').removeClass("code_invalid").removeClass("code_valid");
        myRequest.send("ajax=checkCode&rawcode=" +  raw_code);
        return true;
    },

    drawCodeResponseLegend: function(value, message) {
        var legend_container;
        switch( value ) {

            case 'valid':
                legend_container = new Element('div', {
                    id: 'account_code_valid'
                });
                legend_container.set('html', message);
                legend_container.setStyle('opacity', 0);
                legend_container.inject($('account_holder'), 'before').fade('in');
                return legend_container.get('id');
                break;

            case 'invalid':
                legend_container = new Element('div', {
                    id: 'account_code_invalid'
                });
                legend_container.set('html', message);
                legend_container.setStyle('opacity', 0);
                legend_container.inject($('account_holder'), 'before').fade('in');
                return legend_container.get('id');
                break;

            case 'warning':
                legend_container = new Element('div', {
                    id: 'account_code_warning'
                });
                legend_container.set('html', message);
                legend_container.setStyle('opacity', 0);
                legend_container.inject($('account_holder'), 'before').fade('in');
                return legend_container.get('id');
                break;

        }
    },

    warningShopUnlogged: function() {
        var msg_holder;
        new Request({
            method: 'post',
            url: account._ajax_path,
            data: {
                'ajax': 'notloggedin'
            },
            onComplete: function(response) {
                var json_response = JSON.decode(response);
                msg_holder = account.drawCodeResponseLegend('warning', json_response.message);
                var doc_body = $(document.body);
                var doc_body_scroll = new Fx.Scroll(doc_body).set(0, 0);
                setTimeout(function() {
                    $(msg_holder).fade('out').dispose();
                }, 5000);
            }
        }).send();
    },
    
    warningInsufficientPoints: function() {
        var msg_holder;
        new Request({
            method: 'post',
            url: account._ajax_path,
            data: {
                'ajax': 'insufficientpoints'
            },
            onComplete: function(response) {
                var json_response = JSON.decode(response);
                msg_holder = account.drawCodeResponseLegend('warning', json_response.message);
                var doc_body = $(document.body);
                var doc_body_scroll = new Fx.Scroll(doc_body).set(0, 0);
                setTimeout(function() {
                    $(msg_holder).fade('out').dispose();
                }, 5000);
            }
        }).send();
    }
    
});

function hashPasswordResetForm()
{
    var sUser      = ( $("frm_fp_email").value + "" ).toLowerCase();
    var sPass      = $("frm_fp_password").value;
    var sChallenge = $("frm_fp_challenge").value;
    var sDigest    = sha256_digest( "magneds.com" + sUser + sPass );

    if ( sPass == "" ) return true;

    $("frm_fp_password").value = sDigest;
    $("frm_fp_password_again").value = sDigest;

    return true;
}

function forgotPassword()
{
    $('frm_password').getParent().dispose();
    $('account-password-vergeten').getParent().dispose();
    $('title-login-page').set('html', 'Ik ben mijn wachtwoord vergeten');
    $('description-login-page').set('html', 'Vul hieronder uw e-mailadres in en ontvangen een e-mail om jouw wachtwoord aan te passen.');
    var btn = $('inloggen-btn-page').getChildren().getChildren();
    btn[0].set('text', 'Verstuur');
    $('inloggen-btn-page').removeEvents();
    $('inloggen-btn-page').addEvent('click', function() {
        $('frm_extra_action').set('value', 'reset_password');
        validate_form( 'accountLogin', false );
    });
    
}

window.addEvent('domready', function() {
    account = new AccountBox();
});

