var registrationHandler = {
    bubbleCtrl: null,
    validatePW2: false,

    init: function() {
        Event.observe($('regSubmit'),'click',this.handleSubmit.bindAsEventListener(this));

        var self = this;
        jq('#formRegUnPw #username').bind('blur',function() {
            self.bubbleCtrl.setSuppressBubbles(false);
            var uname = jq(this).val();
            new APIRequest('isusernameavailable',true,{username:uname},self.handleUserNameCheck.bind(self),self.handleUserNameCheckFail.bind(self));
        });
    },
    setBubbleController: function(ctrl) {
        this.bubbleCtrl = ctrl;
    },
    setValidatePW2: function(val) {
        this.validatePW2 = val;
    },
    handleSubmit: function() {
        if (this.validate()) {
            $('formRegUnPw').submit();
        }
    },
    handleUserNameCheck: function(resp) {
        if (resp.available != 1) {
            // show some suggestions in a bubble
            var bubble = new Bubble({
                elemId: 'usernameBubble',
                targetId: 'username',
                posOffset: true,
                offsetX: 490,
                offsetY: -11
            });
            this.bubbleCtrl.addBubble(bubble);

            var suggestions = '';
            for (var n in resp.suggestions) {
                if (resp.suggestions[n].suggestion) {
                    suggestions += '<li><a href="javascript:void(0);" onclick="registrationHandler.handleSuggestion(this);">'+resp.suggestions[n].suggestion+'</a>';
                }
            }
            var bubContent = jq('#usernameBubble #suggestions').html(suggestions);
            this.bubbleCtrl.hideAllBubbles();

            this.bubbleCtrl.show('usernameBubble');
            
            var usernameBubbleError = jq('#usernameBubble .unerr');
            if (usernameBubbleError.is(":visible")) {
                usernameBubbleError.hide();
                jq('#usernameBubble .unsug').show();
            }
            this.bubbleCtrl.setSuppressBubbles(true);
        } else {
            this.bubbleCtrl.hide('usernameBubble');
            this.bubbleCtrl.setSuppressBubbles(false);
        }
    },
    handleUserNameCheckFail: function(resp) {
        if (resp.error && resp.error.msg) {
            // show error bubble
            var bubble = new Bubble({
                elemId: 'usernameBubble',
                targetId: 'username',
                posOffset: true,
                offsetX: 490,
                offsetY: -11
            });
            this.bubbleCtrl.addBubble(bubble);

            this.bubbleCtrl.hideAllBubbles();
            jq('#usernameBubble .unsug').hide();
            var extras = '';
            if (resp.error.code == '201') {
                extras = 'Usernames must be at least 3 characters long. ';
                extras += 'They can only contain the characters a-z, A-Z, 0-9, -, _, ';
                extras += 'and must begin with either a letter, a number, or an underscore. Spaces are not allowed.';
            }
            jq('#usernameBubble .unerr').html('<h3>'+resp.error.msg+'</h3>'+extras);
            jq('#usernameBubble .unerr').show();
            this.bubbleCtrl.show('usernameBubble');
            this.bubbleCtrl.setSuppressBubbles(true);
        }
    },
    handleSuggestion: function(obj) {
        var uname = obj.innerHTML;
        var formFields = jq('#formRegUnPw :input');
        formFields[0].value = uname;
        this.bubbleCtrl.hide('usernameBubble');
        this.bubbleCtrl.setSuppressBubbles(false);
        formFields[0].focus();
        formFields[1].focus();
    },
    validate: function() {
        return true;
        var sel = '#formRegUnPw #';
        var params = jq('#formRegUnPw').serializeArray();
        for (var n=0;n<params.length;n++) {
            var field = params[n];
            // validate username
            if (field.name == 'username') {
                if (this.isEmptyField(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,'Please enter a username');
                    return false;
                }
                
                var errmsg = 'Usernames must be at least 3 characters long. ';
                errmsg += 'They can only contain the characters a-z, A-Z, 0-9, -, _, ';
                errmsg += 'and must begin with either a letter, a number, or an underscore. ';
                errmsg += 'Spaces are not allowed.';

                // check length and regex
                if (field.value.length < 3 || field.value.length > 50) {
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }
                var pattern = /^[a-zA-Z0-9_][-a-zA-Z0-9_]+$/;
                if (!pattern.test(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }
                
            } else if (field.name == 'password1') {
                if (this.isEmptyField(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,'Please enter a password');
                    return false;
                }

                var errmsg = 'Passwords must be at least 6 characters long. ';
                errmsg += 'They can only contain the characters a-z, A-Z, 0-9, -, _, ';
                errmsg += 'contain no spaces, and cannot start with a zero.';
                
                // check length and regex
                if (field.value.length < 6 || field.value.length > 50) {
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }
                var pattern = /^[a-zA-Z1-9_-][a-zA-Z0-9_-]+$/;
                if (!pattern.test(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                }
                var pw1 = field.value;
                
            } else if (this.validatePW2 && field.name == 'password2') {
                if (this.isEmptyField(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,'Please confirm your password');
                    return false;
                }

                if (field.value != pw1) {
                    var errmsg = 'Please confirm your password';
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }
                
            } else if (field.name == 'email') {
                var errmsg = 'Please enter a valid email address';
                if (this.isEmptyField(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }

                // check regex
                // email pattern is from jquery validation plugin
                var pattern = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i;
                if (!pattern.test(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }
                
            } else if (field.name == 'gender') {
                // check string
                var errmsg = 'Please select a gender';
                if (this.isEmptyField(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }

            } else if (field.name == 'birthMonth' || field.name == 'birthDay' || field.name == 'birthYear') {
                // check isnumeric
                if (!this.isNumber(field.value)) {
                    this.fireInputErrorMessage(sel+field.name,'Please enter your birth date.');
                    return false;
                }
            } else if (field.name == 'recaptcha_response_field') {
                if (this.isEmptyField(field.value)) {
                    var errmsg = 'Please re-type the code';
                    this.fireInputErrorMessage(sel+field.name,errmsg);
                    return false;
                }
            }
        }
        return true;
    },
    isEmptyField: function(val) {
        return (val == '');
    },
    isNumber: function(n) {
        return !isNaN(parseFloat(n)) && isFinite(n);
    },
    fireInputErrorMessage: function(sel,msg) {
        this.fireMessage('error',msg);
        jq(sel)[0].focus();
    },
    fireMessage: function(type,details) {
        var aType = (type == 'success') ? 'success' : 'error';
        var attn = (aType == 'success') ? 'Success' : 'Attention';
        document.fire(PBMessage.EVENT.NOTIFY, {
            message: new PBMessage({
            title: attn,
            details: details,
            type: aType})
        });
    }
};

