/*
 * @category Java Script Module Pattern
 * @version $Rev$
 * @author Joel Bair <joelb@baseltd.biz>
 *
 */

// reference local blank image
Ext.BLANK_IMAGE_URL = '../extjs/resources/images/default/s.gif';


Ext.apply(Ext.form.VTypes, {
    telephone:  function(v) {
        return /^(\(\d{3}\))|(\d{3}\-)\d{3}\-\d{4}$/.test(v);
    },
    telephoneText: 'Invalid phone number!<br>Valid Format(s):<br> (111)555-5555 <br>111-555-5555',

    zipcode:  function(v) {
        return /^\d{5}(\-\d{4})?$/.test(v);
    },
    zipcodeText: 'Invalid phone zip code!<br>Valid Format(s):<br> 12345 <br>12345-6789',

    password: function(value, field) {

        if(field.matchFieldId) {
            var pwd = Ext.get(field.matchFieldId);
            var matchValue = pwd.getValue();
        }

        var hasSpecial = value.match(/[0-9!@#\$%\^&\*\(\)\-_=\+]+/i);
        var hasLength = (value.length >= 5);
        if(!hasSpecial || !hasLength) {
            this.passwordText = 'Passwords must be at least 5 characters, containing either a number, or a valid special character (!@#$%^&*()-_=+)';
            return false;
        }

        if(matchValue) {
            if(value === matchValue) {
                Ext.getCmp(field.matchFieldId).clearInvalid();
                return true;
            } else {
                this.passwordText = 'Password Mismatch!!! <br>This password does not match your intial password entry.  ';
                this.passwordText += 'Passwords must be at least 5 characters, containing either a number, or a valid special character (!@#$%^&*()-_=+)';
                return false;
            }
        }

        return true;
    },
    passwordText: ''

});

// create namespace
Ext.namespace('register');

// create application
register = function() {
    // do NOT access DOM from here; elements don't exist yet

    // private variables
    var registerform = new Ext.FormPanel({
        id: 'register_form',
        url: '/account/create',
        monitorValid: true,
        frame: true,
        bodyStyle:'padding:5px 5px 0',
        items: [{
            xtype:'fieldset',
            title: 'Sign-On / Log-In:',
            autoHeight:true,
            labelWidth: 125,
            labelAlign: 'right',
            defaultType: 'textfield',
            items :[{
                id: 'username_field',
                fieldLabel: 'Login / Username',
                name: 'username',
                allowBlank: false,
                anchor:'95%'
            },{
                id: 'password_field',
                fieldLabel: 'Password',
                name: 'password',
                allowBlank: false,
                validationDelay: 10,
                vtype: 'password',
                matchFieldId: 'passwordConfirm_field',
                inputType: 'password',
                anchor:'95%'
            },{
                id: 'passwordConfirm_field',
                fieldLabel: 'Re-Type Password',
                name: 'passwordConfirm',
                allowBlank: false,
                validationDelay: 10,
                vtype: 'password',
                matchFieldId: 'password_field',
                inputType: 'password',
                anchor:'95%'
            }]
        },{
            xtype:'fieldset',
            title: 'Contact Information:',
            autoHeight: true,
            labelAlign: 'right',
            labelWidth: 150,
            items :[{
                layout:'column',
                items:[{
                    columnWidth:.35,
                    layout: 'form',
                    border: false,
                    labelAlign: 'top',
                    items: [{
                        xtype: 'textfield',
                        id: 'firstname_field',
                        fieldLabel: 'First Name',
                        name: 'firstname',
                        allowBlank: false,
                        vtype:'formalname',
                        anchor:'95%'
                    }]
                },{
                    columnWidth:.29,
                    layout: 'form',
                    border: false,
                    labelAlign: 'top',
                    items: [{
                        xtype: 'textfield',
                        id: 'middlename_field',
                        fieldLabel: 'Middle Name',
                        name: 'middlename',
                        allowBlank: true,
                        vtype:'formalname',
                        anchor:'95%'
                    }]
                },{
                    columnWidth:.35,
                    layout: 'form',
                    border: false,
                    labelAlign: 'top',
                    items: [{
                        xtype: 'textfield',
                        id: 'lastname_field',
                        fieldLabel: 'Last Name',
                        name: 'lastname',
                        allowBlank: false,
                        vtype:'formalname',
                        anchor:'95%'
                    }]
                }]
            },{
                xtype: 'textfield',
                id: 'emailaddress_field',
                fieldLabel: 'Email Address',
                name: 'emailaddress',
                allowBlank: false,
                vtype:'email',
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'phone1_field',
                fieldLabel: 'Primary Phone Number',
                name: 'phone1',
                allowBlank: true,
                vtype:'telephone',
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'phone2_field',
                fieldLabel: 'Alternate Phone Number',
                name: 'phone2',
                allowBlank: true,
                vtype:'telephone',
                anchor:'95%'
            }]
        },{
            xtype:'fieldset',
            title: 'Mailing Address:',
            autoHeight: true,
            labelAlign: 'right',
            labelWidth: 150,
            items :[{
                xtype: 'textfield',
                id: 'street1_field',
                fieldLabel: 'Street Address Line 1',
                name: 'street1',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'street2_field',
                fieldLabel: 'Street Address Line 2',
                name: 'street2',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'city_field',
                fieldLabel: 'City',
                name: 'city',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'state_field',
                fieldLabel: 'State',
                name: 'state',
                vtype: 'markup',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'zip_field',
                fieldLabel: 'Zip Code',
                name: 'zip',
                allowBlank: true,
                vtype:'zipcode',
                anchor:'95%'
            }]
        },{
            xtype:'fieldset',
            title: 'Validation:',
            autoHeight: true,
            labelAlign: 'right',
            labelWidth: 150,
            items :[{
                xtype:'box',
                anchor:'95%',
                autoEl:{
                    tag:'div',
                    id: 'captcha_img_reg-area',
                    style:'position:relative; left:45px; width:225px; padding-bottom:15px',
                    children:[{
                        tag:'img',
                        id: 'captcha_img_reg',
                        width: 300,
                        height: 60,
                        waitMsgTarget: true,
                        src: '/images/captcha_null_img.png'
                    }]
                }
            },{
                xtype:'textfield',
                id: 'captcha_reg_field',
                fieldLabel: 'Validation Code',
                name: 'captcha[input]',
                allowBlank: false,
                anchor:'95%'
            }]
        }],
        buttons: [{
            text: 'Register',
            tooltip: 'Create my account now... / Process my registration...',
            handler: function() { var fm = registerform.getForm(); fm.label = registerform.id; doSubmit(fm); }
        },{
            text: 'Cancel',
            tooltip: 'Clear all and close this window.',
            handler: function() { var fm = registerform.getForm(); fm.label = registerform.id; doClear(fm); }
        },{
            text: 'New Validation Code',
            tooltip: 'Having trouble deciphering the Validation Code?  Generate a new one...',
            handler: function() { captcha.loader.init_captcha_img('captcha_img_reg'); }
        }]
    });

    var editregistrationform = new Ext.FormPanel({
        id: 'edit_registration_form',
        url: '/account/update',
        monitorValid: true,
        frame:true,
        bodyStyle:'padding:5px 5px 0',
        items: [{
            xtype:'fieldset',
            title: 'Sign-On / Log-In:',
            autoHeight:true,
            labelWidth: 125,
            labelAlign: 'right',
            defaultType: 'textfield',
            items :[{
                id: 'username_field_edit',
                fieldLabel: 'Login / Username',
                name: 'username',
                value: login.username,
                disabled: true,
                anchor:'95%'
            },{
                id: 'password_field_edit',
                fieldLabel: 'Password',
                name: 'password',
                disabled: true,
                value: 'xxxxxxxx',
                inputType: 'password',
                anchor:'95%'
            },
            new Ext.Button({
                text: 'Change Password',
                style: 'margin: 5px auto',
                handler: function() {
                    resetpasswin.show();
                    Ext.QuickTips.init();
                }
            })
            ]
        },{
            xtype:'fieldset',
            title: 'Contact Information:',
            autoHeight: true,
            labelAlign: 'right',
            labelWidth: 150,
            items :[{
                layout:'column',
                items:[{
                    columnWidth:.35,
                    layout: 'form',
                    border: false,
                    labelAlign: 'top',
                    items: [{
                        xtype: 'textfield',
                        id: 'firstname_field_edit',
                        fieldLabel: 'First Name',
                        name: 'firstname',
                        allowBlank: false,
                        vtype:'formalname',
                        anchor:'95%'
                    }]
                },{
                    columnWidth:.29,
                    layout: 'form',
                    border: false,
                    labelAlign: 'top',
                    items: [{
                        xtype: 'textfield',
                        id: 'middlename_field_edit',
                        fieldLabel: 'Middle Name',
                        name: 'middlename',
                        allowBlank: true,
                        vtype:'formalname',
                        anchor:'95%'
                    }]
                },{
                    columnWidth:.35,
                    layout: 'form',
                    border: false,
                    labelAlign: 'top',
                    items: [{
                        xtype: 'textfield',
                        id: 'lastname_field_edit',
                        fieldLabel: 'Last Name',
                        name: 'lastname',
                        allowBlank: false,
                        vtype:'formalname',
                        anchor:'95%'
                    }]
                }]
            },{
                xtype: 'textfield',
                id: 'emailaddress_field_edit',
                fieldLabel: 'Email Address',
                name: 'emailaddress',
                allowBlank: false,
                vtype:'email',
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'phone1_field_edit',
                fieldLabel: 'Primary Phone Number',
                name: 'phone1',
                allowBlank: true,
                vtype:'telephone',
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'phone2_field_edit',
                fieldLabel: 'Alternate Phone Number',
                name: 'phone2',
                allowBlank: true,
                vtype:'telephone',
                anchor:'95%'
            }]
        },{
            xtype:'fieldset',
            title: 'Mailing Address:',
            autoHeight: true,
            labelAlign: 'right',
            labelWidth: 150,
            items :[{
                xtype: 'textfield',
                id: 'street1_field_edit',
                fieldLabel: 'Street Address Line 1',
                name: 'street1',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'street2_field_edit',
                fieldLabel: 'Street Address Line 2',
                name: 'street2',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'city_field_edit',
                fieldLabel: 'City',
                name: 'city',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'state_field_edit',
                fieldLabel: 'State',
                name: 'state',
                vtype: 'markup',
                allowBlank: true,
                anchor:'95%'
            },{
                xtype: 'textfield',
                id: 'zip_field_edit',
                fieldLabel: 'Zip Code',
                name: 'zip',
                allowBlank: true,
                vtype:'zipcode',
                anchor:'95%'
            }]
        }],
        buttons: [{
            text: 'Apply',
            handler: function() { var fm = editregistrationform.getForm(); fm.label = editregistrationform.id; doSubmit(fm); }
        },{
            text: 'Cancel',
            handler: function() { var fm = editregistrationform.getForm(); fm.label = editregistrationform.id; doClear(fm); }
        }]
    });

    var resetpassform = new Ext.FormPanel({
        id: 'reset_password_form',
        url: '/account/resetpassword',
        monitorValid: true,
        frame:true,
        bodyStyle:'padding:5px 5px 0',
        items: [{
            xtype:'fieldset',
            title: 'Set New Pasword:',
            autoHeight:true,
            labelWidth: 125,
            labelAlign: 'right',
            defaultType: 'textfield',
            items :[{
                id: 'password_field',
                fieldLabel: 'Password',
                name: 'password',
                allowBlank: false,
                validationDelay: 10,
                vtype: 'password',
                matchFieldId: 'passwordConfirm_field',
                inputType: 'password',
                anchor:'95%'
            },{
                id: 'passwordConfirm_field',
                fieldLabel: 'Re-Type Password',
                name: 'passwordConfirm',
                allowBlank: false,
                validationDelay: 10,
                vtype: 'password',
                matchFieldId: 'password_field',
                inputType: 'password',
                anchor:'95%'
            }]
        }],
        buttons: [{
            text: 'Apply',
            handler: function() { var fm = resetpassform.getForm(); fm.label = resetpassform.id; doSubmit(fm); }
        },{
            text: 'Cancel',
            handler: function() { var fm = resetpassform.getForm(); fm.label = resetpassform.id; doClear(fm); }
        }]
    });

    var regwin = new Ext.Window({
        id: 'register-win',
        title: 'Register New User / Sign Up...',
        layout: 'fit',
        width: 450,
        height: 690,
        closeAction: 'hide',
        hidden: true,
        constrainHeader: true,
        items: registerform
    });

    regwin.on('beforehide', function(event, target, opts) {
        registerform.getForm().reset();
    });

    regwin.on('show', function(){
        Ext.getCmp('username_field').focus(null, 10);
    });

    var editregwin = new Ext.Window({
        id: 'edit-registration-win',
        title: 'Edit User Sign-On / Registration Info....',
        layout: 'fit',
        width: 450,
        height: 550,
        closeAction: 'hide',
        hidden: true,
        constrainHeader: true,
        items: editregistrationform
    });

    editregwin.on('beforehide', function(event, target, opts) {
        editregistrationform.getForm().reset();
    });

    var resetpasswin = new Ext.Window({
        id: 'reset-password-win',
        title: 'Reset User Sign-On Password....',
        layout: 'fit',
        width: 350,
        height: 175,
        closeAction: 'hide',
        hidden: true,
        constrainHeader: true,
        modal: true,
        items: resetpassform
    });

    resetpasswin.on('beforehide', function(event, target, opts) {
        resetpassform.getForm().reset();
    });

    // private functions
    var doClear = function(form){
        //form.reset();
        if(form.label == 'register_form') { regwin.hide(); }
        if(form.label == 'edit_registration_form') { editregwin.hide(); }
        if(form.label == 'reset_password_form') { resetpasswin.hide(); }
    };

    var doSubmit = function(form) {
        if(!form.isValid()) {
            form.markInvalid();
            return;
        }

        var userfld = form.findField('username_field');
        if (userfld) {
            var origuser = userfld.getRawValue();
            if (origuser) userfld.setRawValue(utils.encodeString(origuser));
        }

        var passfld = form.findField('password_field');
        if (passfld) {
            var origpass = passfld.getRawValue();
            if (origpass) passfld.setRawValue(utils.encodeString(origpass));
        }

        var passconfld = form.findField('passwordConfirm_field');
        if (passconfld) {
            var origpasscon = passconfld.getRawValue();
            if (origpasscon) passconfld.setRawValue(utils.encodeString(origpasscon));
        }

        form.submit({
            timeout: 300,
            params: function() {
                if(login.loggedin) {
                    return { page: myPage.name, username: utils.encodeString(login.username) };
                } else {
                    return { page: myPage.name, 'captcha[id]': captcha.captcha_id };
                }
            },
            success: function(form, action) { doSuccess(form, action) },
            failure: function(form, action) {
                if(userfld) userfld.setRawValue(origuser);
                if(passfld) passfld.setRawValue(origpass);
                if(passconfld) passconfld.setRawValue(origpasscon);
                doFailure(form, action);
            },
            waitMsg:'Processing...'
        });
    };

    var doSuccess = function(form, action){
        if(login.loggedin) {
            if(form.label == 'edit_registration_form') {
                editregwin.hide();
                utils.flashMessage('Complete...', 'Your registration information has been updated.');
                form.reset();
            }
            if(form.label == 'reset_password_form') {
                resetpasswin.hide();
                utils.flashMessage('Complete...', 'Your password has been changed.');
                form.reset();
            }
        } else {
            var post = form.getValues();
            Ext.Ajax.request({
                url: '/auth/login',
                params: { page: myPage.name, username: post.username, passwd: post.password },
                success: function(o){
                    if(Ext.decode(o.responseText).success){
                        window.location="";
                    }
                },
                failure: function(){
                    Ext.MessageBox.alert('Error', 'Server connection broken.');
                }
            });
        }
    };

    var doFailure = function(form, action){
        form.markInvalid(action.result.errors);
        utils.flashMessage('Error...', action.result.msg);
        if(!login.loggedin) {
            captcha.loader.init_captcha_img('captcha_img_reg');
            var cf = form.findField('captcha_reg_field');
            if (cf) cf.setRawValue('');
        }
    };

    var raise_editregwin = function(t) {
        editregwin.setAnimateTarget(t);
        editregwin.show();
        Ext.QuickTips.init();
    };

    var raise_regwin = function(t) {
        regwin.setAnimateTarget(t);
        regwin.show();
        Ext.QuickTips.init();
        captcha.loader.init_captcha_img('captcha_img_reg');
    };

    // public space
    return {
        // public properties, e.g. strings to translate
        // methods and varibles defined in here always preface w/ "this."

        // myvar: "true",

        // public methods

        init: function() {
            if(login.loggedin) {
               var button = Ext.get('nav-menu').insertHtml('beforeEnd','<div class="navbutton" id="btn-edit-registration"> <div class="ntext">Edit My Registration</div></div>',true);
               editregwin.render(Ext.getBody());
               resetpasswin.render(Ext.getBody());
            } else {
                var button = Ext.get('nav-menu').insertHtml('beforeEnd','<div class="navbutton" id="btn-register"> <div class="ntext">Register</div></div>',true);
                regwin.render(Ext.getBody());
            }
            button.removeAllListeners();
            button.on('click', function(eventObj, target, optionsObj){
                register.render(target);
            });
        },

        render: function(target) {
            if(login.loggedin) {
                raise_editregwin(target);

                var form = editregistrationform.getForm();
                form.load({
                    url: '/account/loadregistration',
                    params: { page: myPage.name, username: utils.encodeString(login.username) },
                    waitMsg: 'Loading...',
                    failure: function(form,action) {
                            //form.reset();
                            editregwin.hide();
                            Ext.MessageBox.alert('Error', 'Unable to access user defined data.  Please try again..<br>'+action.result.msg);
                        }
                });
            } else {
                raise_regwin(target);
            }
        }

    };
}();
