function preview_task_callback(data, jqXHR, status) {
    "use strict";
    if (data.item) {
        $('#' + data.item + '_panel').data('ajaxing', false);
        for (var m in data.msgs){
            var target = $('div[for=' + data.item + '][lang=' + m +']');
            if (target.length === 1){
                target.html(data.msgs[m]);
                target.find('.placeholder').tooltip();
            }
        }
    }
}

function preview_task_error(item) {
    "use strict";
    return function(jqXHR, textStatus, errorThrown) {
        $('#' + item + '_panel').data('ajaxing', false);
        $('#' + item + '_preview div').text(gettext('An error has occurred.'));
        if (textStatus === "timeout") {
            alert(gettext("The request took too long. Please try again."));
        } else {
            if (jqXHR.status >= 400 && jqXHR.status < 500) {
                alert(gettext('An error of type {code} occurred.').replace(/\{code\}/, jqXHR.status));
            } else {
                alert(gettext('We currently cannot reach the server. Please try again. ' +
                              'Error code: {code}').replace(/\{code\}/, jqXHR.status));
            }
        }
    }
}

function mail_preview_setup($el) {
    $el.find('.mail-preview .placeholder').tooltip();
    $el.find('a[type=preview]').on('click', function () {
        var itemName = $(this).closest('.preview-panel').attr('for');
        if ($('#' + itemName + '_panel').data('ajaxing') || $(this).parent('.active').length !== 0) {
            return;
        }

        // gathering data
        var parentForm = $(this).closest('form');
        var previewUrl = $(parentForm).attr('mail-preview-url');
        var token = $(parentForm).find('input[name=csrfmiddlewaretoken]').val();
        var dataString = 'item=' + itemName + '&csrfmiddlewaretoken=' + token;
        $('#' + itemName + '_edit textarea, #' + itemName + '_edit input').each(function () {
            dataString += '&' + $(this).serialize();
        });

        // prepare for ajax
        $('#' + itemName + '_panel').data('ajaxing', true);
        $('#' + itemName + '_preview div').text(gettext('Generating messages …'));

        $.ajax(
            {
                'type': 'POST',
                'url': previewUrl,
                'data': dataString,
                'success': preview_task_callback,
                'error': preview_task_error(itemName),
                'dataType': 'json',
                'timeout': 60000,
            }
        );

    });
}

$(function () {
    "use strict";
    mail_preview_setup($("body"));
    $(document).on("pretix:bind-forms", function () {
        mail_preview_setup($("body"));
    });
});
