/*jslint*/
/*global $,JSON, window, document*/

var addLoginFunctions = function (onObject) {
    var makeLoginView = (function () {
        return function (spec) {
            var controller = spec.controller,
            $dom = {},
            active = 'sx2-btn-activated',
            clicked = 'sx2-btn-clicked',
            loginShown = true, //If false, then send-email is shown
            raise = function (eventFn, eventObj) {
                var fn = eventFn;
                if (fn) {
                    fn(eventObj);
                }
            },
            anyFocus = function () {
                raise(controller.viewEvents.onAnyActivity);
            },
            forgotPwdClick = function () {
                anyFocus();
                raise(controller.viewEvents.onForgotPasswordClick);
            },
            cancelClick = function () {
                raise(controller.viewEvents.onCancel);
            },
            stateRefresh = function () {
                var toggleActive = function (check, $element, disabled) {
                    if (check) {
                        $element.addClass(active);
                    } else {
                        $element.removeClass(active);
                    }
                    $element.removeClass(clicked);
                    if (disabled) {
                        if (check) {
                            $element.removeAttr('disabled');
                        } else {
                            $element.attr('disabled', "on");
                        }
                    }
                };
                toggleActive($dom.forgotEmail.val() !== "", $dom.emailButton);
                toggleActive($dom.username.val() !== "" && $dom.pwd.val() !== "", $dom.submit, true);
            },
            btnClickHelp = function ($btn, event, eventObj) {
                stateRefresh();
                if ($btn.hasClass(active)) {
                    $btn.removeClass(active).addClass(clicked);
                    anyFocus();
                    raise(event, eventObj);                
                }
            },
            submit = function (e) {
                btnClickHelp($dom.submit, controller.viewEvents.onSubmit, e);
                return false;
            },
            emailButtonClick = function () {
                btnClickHelp($dom.emailButton, controller.viewEvents.onEmailSendClick);
            },
            passwordReminderOn = function () {
                $dom.pwdRemind.show();
                loginShown = false;
                $dom.submitAndCancel.hide();
                $dom.emailButton.show();
            },
            passwordReminderOff = function () {
                $dom.pwdRemind.hide();
                $dom.forgotEmail.val("");
                loginShown = true;
                $dom.submitAndCancel.show();
                $dom.emailButton.hide();
            },
            passwordReminderToggle = function () {
                if ($dom.pwdRemind.is(':visible')) {
                    passwordReminderOff();
                } else {
                    passwordReminderOn();                
                }
                stateRefresh();
            },
            passwordSentToggle = function () {
                $dom.emailSent.toggle();
                stateRefresh();
            },
            init = function () {
                $dom.root = $('#sx2-login-main');
                $dom.forgotPwd = $('#sx2-login-forgot-pwd');
                $dom.form = $('#sx2-login-form');
                $dom.pwdRemind = $('#sx2-login-pwd-remind').hide();
                $dom.oops = $('#sx2-login-oops').hide();
                $dom.emailSent = $('#sx2-login-email-sent').hide();
                $dom.forgotEmail = $('#sx2-login-forgot-email');
    
                $dom.username = $('#sx2-login-username');
                $dom.username.focus(anyFocus);
    
                $dom.pwd = $('#sx2-login-pwd').focus(anyFocus);
                $dom.errorMessage = $('#sx2-login-error-message');
                $dom.submit = $('#sx2-login-submit');
                $dom.submitAndCancel = $('#sx2-login-cancel-login-buttons');
                $dom.cancelButton = $('#sx2-login-cancel');
                $dom.emailButton = $('#sx2-login-email-button').hide();
    
                $dom.cancelButton.click(cancelClick);
                $dom.submit.click(submit);
                $dom.emailButton.click(emailButtonClick);
                $dom.forgotPwd.click(forgotPwdClick);
    
                $dom.username.keyup(stateRefresh);
                $dom.pwd.keyup(stateRefresh);
                $dom.forgotEmail.keyup(stateRefresh);
                $dom.form.submit(submit);
                try {
                    $dom.username.get(0).focus();                    
                } catch (e) {} //Does not work in IE if hidden

                stateRefresh();
                window.setTimeout(stateRefresh, 100); //Because browser might "remember password"
            },
            setErrorMessage = function (msg) {
                $dom.errorMessage.text(msg);
            },
            getEmail = function () {
                return $dom.forgotEmail.val();
            },
            getUserPwd = function () {
                return {
                    username: $dom.username.val(),
                    password: $dom.pwd.val()
                };
            };
                             
            return {
                init: init,
                getUserPwd: getUserPwd,
                getEmail: getEmail,
                passwordReminderToggle: passwordReminderToggle,
                passwordSentToggle: passwordSentToggle,
                setErrorMessage: setErrorMessage,
                internals: {
                    $dom: $dom,
                    stateRefresh: stateRefresh
                }
            };
        };
    }()),
    makeLoginModel = (function () {
        return function (spec) {
            var api = {
                defaultErrMsg: "An unexpected error happened."
            },
            ajaxSubmit = function (success, err) {
                var $form = $('#sx2-login-main form'), 
                data;
                $('.ajax', $form).attr('value', 'json');
                data = $form.serialize();
                $.ajax({url: document.location.href,
                        data: data,
                        type: "post",
                        dataType: 'json',
                        success: success,
                        error : err
                       });
                
                return false;
            },
            login = function (params) {
                var username = params.username,
                password = params.password,
                cont = function (response) {
                    params.onSuccess(response);
                },
                err = function (info) {
                    var msg = api.defaultErrMsg;
                    params.onFailure(msg);
                },
                checkIfLoggedIn = function (response) {
                    if (response.loginSuccessful) {
                        cont(response);
                    } else {
                        if (response.errorMessage) {
                            params.onFailure(response.errorMessage);
                        }
                    }
                    
                };
                ajaxSubmit(checkIfLoggedIn, err);
                //host.queryServer("login", cont, [username, password], err);
            },
            sendEmailReminder = function (params) {
                var err = function (info) {
                    var msg = api.defaultErrMsg;
                    params.onFailure(msg);
                };
                ajaxSubmit(params.onSuccess, err);
            };
            api.sendEmailReminder = sendEmailReminder;
            api.login = login;
            return api;
        };
    }()),
    makeLoginController = (function () {
        return function (spec) {
            var model, view,
            successCont,
            emailSent,
            onFailure = function (msg) {
                view.setErrorMessage(msg);
            },
            submit = function (e) {
                var params = view.getUserPwd();
                params.onSuccess = function (key) {
                    //view.hide(); HENRIK DISABLED FOR IFRAME
                    successCont(key, params);
                };
                params.onFailure = onFailure;
                model.login(params);
            },
            cancel = function () {
                if (spec.onCancel) {
                    spec.onCancel();
                }
            },
            togglePasswordReminder = function () {
                view.passwordReminderToggle();
            },
            sendReminder = function () {
                model.sendEmailReminder({
                    onSuccess: function (response) {
                        if (response.errorMessage) {
                            view.setErrorMessage(response.errorMessage);
                        }
                        if (! response.forgotPassword) {
                            togglePasswordReminder();
                            view.passwordSentToggle();
                            emailSent = true;
                        }
                    },
                    onFailure: onFailure
                });
                //view.setErrorMessage("Sorry, this feature is not implemented yet.");
            },
            someActivity = function () {
                if (emailSent) {
                    emailSent = false;
                    view.passwordSentToggle();
                }
            },
            api = {
                viewEvents: {
                    onSubmit: submit,
                    onForgotPasswordClick: togglePasswordReminder,
                    onEmailSendClick: sendReminder,
                    onAnyActivity: someActivity,
                    onCancel: cancel
                }
            },
            loginSpec = {
                host: spec.host,
                controller: api
            };
            view = (spec.viewConstructor || makeLoginView)(loginSpec);
            model = (spec.modelConstructor || makeLoginModel)(loginSpec);
    
            api.login = function (successContinuation) {
                successCont = successContinuation;
                view.init();
            };
            return api;
        };
    }()),
    sendLoginOK = function () {
        window.parent.postMessage("LOGIN-OK", "*");
    },
    sendLogoutOK = function () {
        window.parent.postMessage("LOGOUT-OK", "*");
    },
    sendLoginCancel = function () {
        window.parent.postMessage("LOGIN-CANCEL", "*");
    },
    sendLogoutCancel = function () {
        window.parent.postMessage("LOGOUT-CANCEL", "*");
    },
    makeLoginFunction = function (queryServerFn)  {
        var login = function (someLoginFn) {
            var host = {
                getInsertionNode: function () {
                    return $('body');
                },
                controller: {},
                errorTypes: { program: "program"},
                errorCodes: {
                    errNotAuthorized: 801,
                    errWithMessagetoClient: 802
                }
            },
            onLogin = function (response, params) {
                //Do a real non-ajax submit to set cookies
                $('#sx2-login-main form .ajax').val("");
                $('#sx2-login-main form').submit();
            },
            onCancel = function () {
                sendLoginCancel();
            },
            loginSpec = {
                host: host,
                onCancel: onCancel
            },
                    c = makeLoginController(loginSpec);
            c.login(someLoginFn || onLogin);
        };
        return login;
    };
    onObject.makeLoginView = makeLoginView;
    onObject.makeLoginModel = makeLoginModel;    
    onObject.makeLoginController = makeLoginController;
    onObject.makeLoginFunction = makeLoginFunction;
    onObject.login = makeLoginFunction();
    onObject.sendLoginOK = sendLoginOK;
    onObject.sendLogoutOK = sendLogoutOK;
    onObject.sendLoginCancel = sendLoginCancel;
    onObject.sendLogoutCancel = sendLogoutCancel;    
};
var LOGIN = {};
addLoginFunctions(LOGIN);


