/**
 * AccountModel - JS model for account.
 *
 * @author Dmitry Avseyenko <polsad@gmail.com>
 * @package scripts.models
 * @copyright Copyright &copy; 2010 GeckoBoard
 */
AccountModel = {
    errors : {},
    initAccount: function(errors) {
        AccountModel.errors = errors;
        /**
         * First name (click on change button)
         */
        $('#fname-edit .btn-change').bind('click', function() {
            AccountModel.showEditBox('fname-edit');
            return false;
        });
        /**
         * First name (click on close link)
         */
        $('#fname-edit .f-btn a').bind('click', function() {
            AccountModel.hideEditBox('fname-edit');
            return false;
        });
        /**
         * Last name (click on change button)
         */
        $('#lname-edit .btn-change').bind('click', function() {
            AccountModel.showEditBox('lname-edit');
            return false;
        });
        /**
         * Last name (click on close link)
         */
        $('#lname-edit .f-btn a').bind('click', function() {
            AccountModel.hideEditBox('lname-edit');
            return false;
        });
        /**
         * Company name (click on change button)
         */
        $('#company-edit .btn-change').bind('click', function() {
            AccountModel.showEditBox('company-edit');
            return false;
        });
        /**
         * Company name (click on close link)
         */
        $('#company-edit .f-btn a').bind('click', function() {
            AccountModel.hideEditBox('company-edit');
            return false;
        });
        /**
         * Email (click on change button)
         */
        $('#email-edit .btn-change').bind('click', function() {
            AccountModel.showEditBox('email-edit');
        });
        /**
         * Email( click on close link)
         */
        $('#email-edit .f-btn a').bind('click', function() {
            AccountModel.hideEditBox('email-edit');
            return false;
        });
        /**
         * Domain (click on change button)
         */
        $('#domain-edit .btn-change').bind('click', function() {
            AccountModel.showEditBox('domain-edit');
        });
        /**
         * Domain( click on close link)
         */
        $('#domain-edit .f-btn a').bind('click', function() {
            AccountModel.hideEditBox('domain-edit');
            return false;
        });
        /**
         * Password (click on change button)
         */
        $('#password-edit .btn-change').bind('click', function() {
            $(this).addClass('none');
            $('#password-edit fieldset').removeClass('none');
            return false;
        });
        /**
         * Password( click on close link)
         */
        $('#password-edit .f-btn a').bind('click', function() {
            $('#password-edit .btn-change').removeClass('none');
            $('#password-edit fieldset').addClass('none');
            return false;
        });
        /**
         * Save first name
         */
        $('#fname-edit .btn-change-big').click(function() {
            var fname  = $('#fname-edit input[name=fname]').val();
            /**
             * Check name
             */
            if (fname == '') {
                $('.f-error-msg').html(AccountModel.errors[0]).css('display','block');
                $('#fname-edit input[name=fname]').addClass('f-error-fld');
                return false;
            }
            $.ajax({
                url : '/account/update/first-name/',
                dataType: 'json',
                type : 'post',
                data : {
                    fname: fname
                },
                beforeSend: function() {
                    $('#fname-edit .btn-change-big').attr('disabled', 'true');
                    $('#fname-edit .f-btn a').attr('disabled', 'true');
                },
                success: function(json) {
                    $('.f-error-msg').css('display','none');
                    $('#fname-edit input[name=fname]').removeClass('f-error-fld');
                    if (json.error != undefined) {
                        $('.f-error-msg').html(json.error).css('display','block');
                        $('#fname-edit input[name=fname]').addClass('f-error-fld');
                    }
                    if (json.success != undefined) {
                        $('#fname-edit > span').html(json.success);
                        AccountModel.hideEditBox('fname-edit');
                    }
                    $('#fname-edit .btn-change-big').removeAttr('disabled');
                    $('#fname-edit .f-btn a').removeAttr('disabled');
                },
                error: function() {
                    $('.f-error-msg').html('Server error.').css('display','block');
                    $('#fname-edit input[name=fname]').removeClass('f-error-fld');
                    $('#fname-edit .btn-change-big').removeAttr('disabled');
                    $('#fname-edit .f-btn a').removeAttr('disabled');
                }
            });
            return false;
        });
        /**
         * Save last name
         */
        $('#lname-edit .btn-change-big').click(function() {
            var lname  = $('#lname-edit input[name=lname]').val();
            /**
             * Check name
             */
            if (lname == '') {
                $('.f-error-msg').html(AccountModel.errors[1]).css('display','block');
                $('#lname-edit input[name=lname]').addClass('f-error-fld');
                return false;
            }
            $.ajax({
                url : '/account/update/last-name/',
                dataType: 'json',
                type : 'post',
                data : {
                    lname: lname
                },
                beforeSend: function() {
                    $('#lname-edit .btn-change-big').attr('disabled', 'true');
                    $('#lname-edit .f-btn a').attr('disabled', 'true');
                },
                success: function(json) {
                    $('.f-error-msg').css('display','none');
                    $('#lname-edit input[name=lname]').removeClass('f-error-fld');
                    if (json.error != undefined) {
                        $('.f-error-msg').html(json.error).css('display','block');
                        $('#lname-edit input[name=lname]').addClass('f-error-fld');
                    }
                    if (json.success != undefined) {
                        $('#lname-edit > span').html(json.success);
                        AccountModel.hideEditBox('lname-edit');
                    }
                    $('#lname-edit .btn-change-big').removeAttr('disabled');
                    $('#lname-edit .f-btn a').removeAttr('disabled');
                },
                error: function() {
                    $('.f-error-msg').html('Server error.').css('display','block');
                    $('#lname-edit input[name=lname]').removeClass('f-error-fld');
                    $('#lname-edit .btn-change-big').removeAttr('disabled');
                    $('#lname-edit .f-btn a').removeAttr('disabled');
                }
            });
            return false;
        });
        /**
         * Save company name
         */
        $('#company-edit .btn-change-big').click(function() {
            var company  = $('#company-edit input[name=company]').val();
            /**
             * Check name
             */
            if (company == '') {
                $('.f-error-msg').html(AccountModel.errors[1]).css('display','block');
                $('#lname-company input[name=company]').addClass('f-error-fld');
                return false;
            }
            $.ajax({
                url : '/account/update/company-name/',
                dataType: 'json',
                type : 'post',
                data : {
                    company: company
                },
                beforeSend: function() {
                    $('#company-edit .btn-change-big').attr('disabled', 'true');
                    $('#company-edit .f-btn a').attr('disabled', 'true');
                },
                success: function(json) {
                    $('.f-error-msg').css('display','none');
                    $('#company-edit input[name=company]').removeClass('f-error-fld');
                    if (json.error != undefined) {
                        $('.f-error-msg').html(json.error).css('display','block');
                        $('#company-edit input[name=company]').addClass('f-error-fld');
                    }
                    if (json.success != undefined) {
                        $('#company-edit > span').html(json.success);
                        AccountModel.hideEditBox('company-edit');
                    }
                    $('#company-edit .btn-change-big').removeAttr('disabled');
                    $('#company-edit .f-btn a').removeAttr('disabled');
                },
                error: function() {
                    $('.f-error-msg').html('Server error.').css('display','block');
                    $('#company-edit input[name=company]').removeClass('f-error-fld');
                    $('#company-edit .btn-change-big').removeAttr('disabled');
                    $('#company-edit .f-btn a').removeAttr('disabled');
                }
            });
            return false;
        });
        /**
         * Save email
         */
        $('#email-edit .btn-change-big').click(function() {
            var email = $('#email-edit input[name=email]').val();
            /**
             * Check email
             */
            if (email == '') {
                $('.f-error-msg').html(AccountModel.errors[2]).css('display','block');
                $('#email-edit input[name=email]').addClass('f-error-fld');
                return false;
            }
            var emailrule = new RegExp('^[a-zA-Z0-9._-]+@[a-zA-Z0-9_-]+[\.][a-zA-Z0-9._-]+$');
            if (! emailrule.test(email)) {
                $('.f-error-msg').html(AccountModel.errors[3]).css('display','block');
                $('#email-edit input[name=email]').addClass('f-error-fld');
                return false;
            }
            $.ajax({
                url : '/account/update/email/',
                dataType: 'json',
                type : 'post',
                data : {
                    email: email
                },
                beforeSend: function() {
                    $('#email-edit .btn-change-big').attr('disabled', 'true');
                    $('#email-edit .f-btn a').attr('disabled', 'true');
                },
                success: function(json) {
                    $('.f-error-msg').css('display','none');
                    $('#email-edit input[name=email]').removeClass('f-error-fld');
                    if (json.error != undefined) {
                        $('.f-error-msg').html(json.error).css('display','block');
                        $('#email-edit input[name=email]').addClass('f-error-fld');
                    }
                    if (json.success != undefined) {
                        $('#email-edit > span').html(json.success);
                        AccountModel.hideEditBox('email-edit');
                    }
                    $('#email-edit .btn-change-big').removeAttr('disabled');
                    $('#email-edit .f-btn a').removeAttr('disabled');
                },
                error: function() {
                    $('.f-error-msg').html('Server error.').css('display','block');
                    $('#email-edit input[name=email]').removeClass('f-error-fld');
                    $('#email-edit .btn-change-big').removeAttr('disabled');
                    $('#email-edit .f-btn a').removeAttr('disabled');
                }
            });
            return false;
        });
        
        /**
         * Save password
         */
        $('#password-edit .btn-change-big').click(function() {
            $('#password-edit input[type=password]').removeClass('f-error-fld');
            var opass = $('#password-edit input[name=opass]').val();
            var npass = $('#password-edit input[name=npass]').val();
            var cpass = $('#password-edit input[name=cpass]').val();
            /**
             * Check password
             */
            var error = '';
            var prule = new RegExp("^[^ ]{6,}$");

            if (opass == '') {
                error = error + AccountModel.errors[4];
                $('#password-edit input[name=opass]').addClass('f-error-fld');
            }
            else {
                if (! prule.test(opass)) {
                    error = error + AccountModel.errors[7];
                    $('#password-edit input[name=opass]').addClass('f-error-fld');
                }
            }
            if (npass == '') {
                error = error + AccountModel.errors[5];
                $('#password-edit input[name=npass]').addClass('f-error-fld');
            }
            else {
                if (! prule.test(npass)) {
                    error = error + AccountModel.errors[8];
                    $('#password-edit input[name=npass]').addClass('f-error-fld');
                }
            }
            if (cpass == '') {
                error = error + AccountModel.errors[6];
                $('#password-edit input[name=cpass]').addClass('f-error-fld');
            }
            else {
                if (! prule.test(cpass)) {
                    error = error + AccountModel.errors[9];
                    $('#password-edit input[name=cpass]').addClass('f-error-fld');
                }
            }

            if (npass != '' && cpass != '' && npass != cpass) {
                error = error + AccountModel.errors[10];
                $('#password-edit input[name=npass]').addClass('f-error-fld');
                $('#password-edit input[name=cpass]').addClass('f-error-fld');
            }
            if (error != '') {
                $('.f-error-msg').html(error).css('display','block');
                return false;
            }
            $.ajax({
                url : '/account/update/password/',
                dataType: 'json',
                type : 'post',
                data : {
                    opass: opass,
                    npass: npass,
                    cpass: cpass
                },
                beforeSend: function() {
                    $('#password-edit .btn-change-big').attr('disabled', 'true');
                    $('#password-edit .f-btn a').attr('disabled', 'true');
                },
                success: function(json) {
                    $('.f-error-msg').css('display','none');
                    $('#password-edit input[type=password]').removeClass('f-error-fld');

                    if (json.error != undefined) {
                        $('.f-error-msg').html(json.error).css('display','block');
                    }
                    if (json.fields != undefined) {
                        for (var i = 0; i < json.fields.length; i++) {
                            $('#password-edit input[name='+json.fields[i]+']').addClass('f-error-fld');
                        }
                    }
                    if (json.success != undefined) {
                        $('#password-edit .btn-change').removeClass('none');
                        $('#password-edit fieldset').addClass('none');
                    }
                    $('#password-edit .btn-change-big').removeAttr('disabled');
                    $('#password-edit .f-btn a').removeAttr('disabled');
                },
                error: function() {
                    $('.f-error-msg').html('Server error.').css('display','block');
                    $('#password-edit input[type=password]').removeClass('f-error-fld');
                    $('#password-edit .btn-change-big').removeAttr('disabled');
                    $('#password-edit .f-btn a').removeAttr('disabled');
                }
            });
            return false;
        });
        /**
         * Save mailer option
         */
        $('#mailer').click(function() {
            var mailer = ($(this).attr('checked')) ? 'y' : 'n';
            $.ajax({
                url : '/account/update/mailer/',
                dataType: 'json',
                type : 'post',
                data : {
                    mailer: mailer
                },
                success: function() {},
                error: function() {}
            });
        });
     
        /**
         * Save domain
         */
        $('#domain-edit .btn-change-big').click(function() {
            var domain = $('#domain-edit input[name=domain]').val();
            $.ajax({
                url : '/account/update/domain/',
                dataType: 'json',
                type : 'post',
                data : {
                    domain: domain
                },
                beforeSend: function() {
                    $('#domain-edit .btn-change-big').attr('disabled', 'true');
                    $('#domain-edit .f-btn a').attr('disabled', 'true');
                },
                success: function(json) {
                    $('.f-error-msg').css('display','none');
                    $('#domain-edit input[name=domain]').removeClass('f-error-fld');
                    if (json.error != undefined) {
                        $('.f-error-msg').html(json.error).css('display','block');
                        $('#domain-edit input[name=domain]').addClass('f-error-fld');
                    }
                    if (json.success != undefined) {
                        $('#domain-edit > span').html(json.success);
                        $('#domain-edit input[name=domain]').val(json.success);
                        AccountModel.hideEditBox('domain-edit');
                    }
                    $('#domain-edit .btn-change-big').removeAttr('disabled');
                    $('#domain-edit .f-btn a').removeAttr('disabled');
                },
                error: function() {
                    $('.f-error-msg').html('Server error.').css('display','block');
                    $('#domain-edit input[name=domain]').removeClass('f-error-fld');
                    $('#domain-edit .btn-change-big').removeAttr('disabled');
                    $('#domain-edit .f-btn a').removeAttr('disabled');
                }
            });
            return false;
        });
    },
    showEditBox: function(box) {
        $('#'+box+' .btn-change').addClass('none');
        $('#'+box+' > span').addClass('none');
        $('#'+box+' > .f-full').removeClass('none');
    },
    hideEditBox: function(box) {
        $('#'+box+' .f-full').addClass('none');
        $('#'+box+' > span').removeClass('none');
        $('#'+box+' > .btn-change').removeClass('none');
    },
    changePlanInit: function() {
        /**
         * Click on update subscription
         */
        $('.b-plans-table .status input[type="button"]').bind('click', function() {
            $('#new-plan').val($(this).attr('plan'));
            $('.b-plans-table .status input[type="button"]').attr('disabled', 'true').addClass('btn-disable');
            $('.b-cancel-plan .warning a').attr('disabled', 'true');
            $('#form-update').submit();
            return false;
        });
    },
    cancelAccount: function(domain) {
        $('#cancel-account').bind('click', function() {
            $(this).parent().parent().find('.warning').toggle();
            return false;
        });
        $('.b-cancel-plan .warning a').bind('click', function() {
            $.ajax({
                url : '/account/delete/',
                dataType: 'json',
                type : 'post',
                data : {
                    method: 'delete'
                },
                beforeSend: function() {
                    $('.b-plans-table .status input[type="button"]').attr('disabled', 'true').addClass('btn-disable');
                    $('.b-cancel-plan .warning a').attr('disabled', 'true');
                },
                success: function(json) {
                    if (json.success != undefined) {
                        document.location.href = domain;
                    }
                    $('.b-plans-table .status input[type="button"]').removeAttr('disabled').removeClass('btn-disable');
                    $('.b-cancel-plan .warning a').removeAttr('disabled');
                },
                error: function() {
                    $('.b-plans-table .status input[type="button"]').removeAttr('disabled').removeClass('btn-disable');
                    $('.b-cancel-plan .warning a').removeAttr('disabled');
                }
            });
            return false;
        });
    }
}
