﻿$.fn.tascForm = function() {

    function updateTextAreas($form) {
        if (window.FCKeditorAPI) {
            $form.find('textarea[id]').each(function() {
                var e = FCKeditorAPI.GetInstance(this.id);
                if (e) e.UpdateLinkedField();
            });
        }
    }

    this.filter(':not(.no-ajax)').each(function() {
        var form = $(this);
        form.ajaxForm({
            dataType: 'json',
            success: function(data) {
                if (data.action) {
                    if (data.action == 'redirect') {
                        window.location = data.url;
                    }
                } else {
                    var id = form.attr('id');
                    var successFunction = window[id + '_success'];
                    if (successFunction) {
                        successFunction(data);
                    } else {
                        window.location = '/success?role=' + encodeURIComponent(data.role);
                    }
                }
                form.css({ visibility: 'visible' });
            },
            error: function(xhr) {
                form.css({ visibility: 'visible' });

                var contentType = xhr.getResponseHeader('Content-Type');
                if (contentType.match(/^text\/plain/)) {
                    form.append('<div class="error">' + xhr.responseText + '</div>');
                } else if (contentType.match(/^application\/json/)) {
                    var errors = eval(xhr.responseText);
                    for (var i = 0; i < errors.length; i++) {
                        if (typeof errors[i] == 'string') {
                            form.append('<div class="error">' + errors[i] + '</div>');
                        } else {
                            var input = form.find('[name=' + errors[i].id + ']');
                            var message = errors[i].error;
                            if (!message || message == '') message = 'Invalid input.';
                            input.addClass('input-error').after('<p class="error">' + message + '</p>');
                            if (errors[i].value) {
                                input.val(errors[i].value);
                            }
                        }
                    }
                    form.find('.input-error:first').focus();
                }
                form.addClass('error');

                var id = form.attr('id');
                var errorFunction = window[id + '_error'];
                if (errorFunction) {
                    errorFunction(xhr);
                }
            },
            beforeSerialize: function() {
                updateTextAreas(form);
            },
            beforeSend: function() {
                form.removeClass('error');
                form.find('.input-error').removeClass('input-error');
                form.find('.error').remove();
                form.css({ visibility: 'hidden' });
            }
        });
    });

    return this;
};

$.fn.ajaxLink = function() {
    this.each(function() {
        var action = $(this).attr('data-action');
        var url = this.href;
        var confirmMessage = $(this).attr('data-confirm');
        var successType = $(this).attr('data-success');

        var a = $(this);
        a.click(function() {
            if (!confirmMessage || confirm(confirmMessage)) {
                $.ajax({
                    url: url,
                    type: action,
                    success: function() {
                        switch (successType) {
                            case 'remove-row':
                                a.parents('tr:first').remove();
                                break;
                            case 'message':
                                alert(a.attr('data-successmessage'));
                                break;
                        }
                    }
                });
            }
            return false;
        });
    });

    return this;
}

$(function() {
    $('form').tascForm();
    $('a[data-action]').ajaxLink();

    $('form :input:first').focus();
});