window.cmu = window.cmu || {};

(function (ns) {

    ns.formHandler = function (spec, my) {
        var that;

        spec = spec || {};
        spec.viewNode = spec.viewNode || null;
        spec.url = spec.url || null;
        spec.containerSelector = spec.containerSelector || null;
        spec.errorField = spec.errorField || '.errorFieldName';

        // ------------------------------------------------------------------
        // Shared properties
        // ------------------------------------------------------------------

        my = my || {};
        my.logger = my.logger || gj.logging.getLogger('cmu.formHandler');

        my.$viewNode = $(spec.viewNode);

        that = {};

        // ------------------------------------------------------------------
        // Private methods
        // ------------------------------------------------------------------

        var submit = function () {
            my.logger.debug('submit()');

            my.$viewNode.trigger('loadStart');

            gj.ajaxForm(spec.viewNode, spec.url, null, function (data) {
                var $data = $(data);
                var $formContainer = my.$viewNode.parents(spec.containerSelector).first();
                $formContainer.replaceWith($data);
                $data.trigger('loadEnd');

                // Important to call last, so it has final say over form input focus
                handleErrors($data);
            }, function (data) {
                alert('Er is iets fout gegaan. Probeer het later nog eens.');
            });
        };

        var handleErrors = function ($scope) {
            my.logger.debug('handleErrors()');
            var $errorFieldName = $scope.find(spec.errorField);

            if (!$errorFieldName.length) {
                my.logger.info('No errors found');
                return;
            }
            var $activeForm = $errorFieldName.closest('form');
            var $errorField = $activeForm.find('input[name="' + $errorFieldName.text() + '"]');

            if (!$errorField.length) {
                my.logger.warning('Could not locate error field in form', $activeForm);
                return;
            }
            $errorField.addClass('error').focus();
        };

        // ------------------------------------------------------------------
        // Public methods
        // ------------------------------------------------------------------

        that.submit = submit;

        // ------------------------------------------------------------------
        // Constructor
        // ------------------------------------------------------------------

        return that;
    };

    ns.ajaxFormSubmit = function (form, containerSelector) {
        gj.logging.getLogger('cmu').debug('ajaxFormSubmit()');

        var formHandler = cmu.formHandler({
            viewNode: form,
            containerSelector: containerSelector
        });
        formHandler.submit();
    };

    ns.addFormClass = function (className) {
        gj.logging.getLogger('cmu').debug('addFormClass()', className);

        var mappings = {
            'showRegisterForm': '.registerForm',
            'showForgotPasswordForm': '.forgotPasswordForm'
        };
        var $formContainer = $('.loginFormContainer:visible');
        $formContainer.addClass(className);

        var selector = mappings[className];
        var $form = $formContainer.find(selector);
        var $firstInput = $form.find('form input[type="text"]').first();
        $firstInput.focus();
    };

})(window.cmu);

