if (typeof(NOTIFY) == 'undefined') { NOTIFY = {} }
if (typeof(NOTIFY.ui) == 'undefined') { NOTIFY.ui = {} }

var $  = YAHOO.util.Dom.get,
    yc = YAHOO.util.Connect,
    yd = YAHOO.util.Dom,
    json = YAHOO.lang.JSON;

(function() {
    var getLabel = function(form, name) {
        return yd.getElementsBy(function(el){return el.attributes['for'].value == name},"label",form)[0];
    }

    NOTIFY.ui.LoginControl = {
        setErrorMessage: function(message) {
            yd.getElementsByClassName("error_message","div",document.login_form, function(el) {
                el.innerHTML = message;
            })
        },
        clearErrors: function() {
            yd.getElementsByClassName("error_message","div",document.login_form, function(el) {
                el.innerHTML = '';
            });
            yd.removeClass(getLabel(document.login_form, 'username'), 'label_error');
            yd.removeClass(getLabel(document.login_form, 'password'), 'label_error');
            $('login_username_error').innerHTML = '';
            $('login_username_error').parentNode.style.display = 'none';
            $('login_password_error').innerHTML = '';
            $('login_password_error').parentNode.style.display = 'none';
        },
        setUsernameError: function(message) {
            yd.addClass(getLabel(document.login_form, 'username'), 'label_error');
            $('login_username_error').parentNode.style.display = 'block';
            $('login_username_error').innerHTML = message;
        },
        setPasswordError: function(message) {
            yd.addClass(getLabel(document.login_form, 'password'), 'label_error');
            $('login_password_error').parentNode.style.display = 'block';
            $('login_password_error').innerHTML = message;
        },
        validate: function() {
            var f = document.login_form;
            var has_error = false;
            if (!f.username.value) {
                this.setUsernameError('You must provide a username');
                has_error = true;
            }
            if (!f.password.value) {
                this.setPasswordError('You must provide a password');
                has_error = true;
            }
            if (has_error) {
                this.setErrorMessage('You have given an invalid username or password.  Please correct them before proceeding.');
            }
            return !has_error;
        }
    };

    // TODO: Make less code duplication
    NOTIFY.ui.RegisterControl = {
        setErrorMessage: function(message) {
            yd.getElementsByClassName("error_message","div",document.register_form, function(el) {
                el.innerHTML = message;
            })
        },
        clearErrors: function() {
            yd.getElementsByClassName("error_message","div",document.register_form, function(el) {
                el.innerHTML = '';
            });
            yd.removeClass(getLabel(document.register_form, 'username'), 'label_error');
            yd.removeClass(getLabel(document.register_form, 'password'), 'label_error');
            yd.removeClass(getLabel(document.register_form, 'email'), 'label_error');
            $('register_username_error').innerHTML = '';
            $('register_username_error').parentNode.style.display = 'none';
            $('register_password_error').innerHTML = '';
            $('register_password_error').parentNode.style.display = 'none';
            $('register_email_error').innerHTML = '';
            $('register_email_error').parentNode.style.display = 'none';
        },
        setUsernameError: function(message) {
            yd.addClass(getLabel(document.register_form, 'username'), 'label_error');
            $('register_username_error').parentNode.style.display = 'block';
            $('register_username_error').innerHTML = message;
        },
        setPasswordError: function(message) {
            yd.addClass(getLabel(document.register_form, 'password'), 'label_error');
            $('register_password_error').parentNode.style.display = 'block';
            $('register_password_error').innerHTML = message;
        },
        setEmailError: function(message) {
            yd.addClass(getLabel(document.register_form, 'email'), 'label_error');
            $('register_email_error').parentNode.style.display = 'block';
            $('register_email_error').innerHTML = message;
        },
        validate: function() {
            var f = document.register_form;
            var has_error = false;
            if (!f.username.value) {
                this.setUsernameError('You must provide a username');
                has_error = true;
            }
            if (!f.password.value) {
                this.setPasswordError('You must provide a password');
                has_error = true;
            }
            if (!f.email.value) {
                this.setEmailError('You must provide an email address');
                has_error = true;
            }
            if (has_error) {
                this.setErrorMessage('You have given an invalid username, password, or email.  Please correct them before proceeding.');
            }
            return !has_error;
        }
    };
})();

NOTIFY.ui.Affiliate = {
    showSignInOnClick: function(el) {
        $('login').style.display = 'block';
        $('register').style.display = 'none';
    },
    showCreateAccountOnClick: function(el) {
        $('login').style.display = 'none';
        $('register').style.display = 'block';
    },
    registerSubmit: function(form) {
try{
        var rc = NOTIFY.ui.RegisterControl;
        rc.clearErrors();
        if (!rc.validate()) { return 0; }
        yc.initHeader('Content-Type', 'application/json', null);
        yc.setDefaultPostHeader(false);
        var params = { 
            'username' : form.username.value, 
            'password' : form.password.value,
            'email'    : form.email.value
        };
        params = json.stringify(params);

        yc.asyncRequest('POST', '/rest/v1/authenticate/register', {
            success: function(o) {
                var data = json.parse( o.responseText );
                if (!data.success) {
                    NOTIFY.ui.LoginControl.setErrorMessage(data.message);
                    if (data.errorMessages) {
                        if (data.errorMessages.password) {
                            rc.setPasswordError(data.errorMessages.password.join(", "));
                        }
                        if (data.errorMessages.username) {
                            rc.setUsernameError(data.errorMessages.username.join(", "));
                        }
                        if (data.errorMessages.email) {
                            rc.setEmailError(data.errorMessages.email.join(", "));
                        }
                    }
                    return;
                }
                var f = document.accept_form;
                f.new_user.value = 1;
                f.submit();
            },
            failure: function(o) {
                alert("There was an error.  Please try again.  If the problem persists, please contact the website maintainer");
            },
            timeout: 10000
        }, params);
} catch(e) { alert(e.message) }

    },
    loginSubmit: function(form) {
        NOTIFY.ui.LoginControl.clearErrors();
        if (!NOTIFY.ui.LoginControl.validate()) {
            return 0;
        }

        yc.initHeader('Content-Type', 'application/json', null);
        yc.setDefaultPostHeader(false);
        var params = { 
            'username' : form.username.value, 
            'password' : form.password.value 
        };

        params = json.stringify(params);
        yc.asyncRequest('POST', '/rest/v1/authenticate/login', {
            success: function(o) {
                var data = json.parse( o.responseText );
                if (!data.success) {
                    NOTIFY.ui.LoginControl.setErrorMessage(data.message);
                    if (data.errorMessages) {
                        if (data.errorMessages.password) {
                            NOTIFY.ui.LoginControl.setPasswordError(data.errorMessages.password.join(", "));
                        }
                        if (data.errorMessages.username) {
                            NOTIFY.ui.LoginControl.setUsernameError(data.errorMessages.username.join(", "));
                        }
                    }
                    return;
                }
                var f = document.accept_form;
                f.submit();
            },
            failure: function(o) {
                alert("There was an error.  Please try again.  If the problem persists, please contact the website maintainer");
            },
            timeout: 10000
        }, params);
    },
}
