$(function(){
    $(document).on('click', 'a[data-async=true]', function(e) {
        e.preventDefault();

        var $this = $(this);
        var $children = $this.children();
        var $loading = $('.loading', $this);
        if ($loading.length == 0) {
            $loading = getLoading();
        }

        var mustShowLoading = ($this.attr('data-async-loading') == 'true');
        var method = $this.attr('data-async-method');
        if (method.length == 0) {
            method = 'get';
        }

        var data = $this.data('async-data');
        if (_.isUndefined(data) || data.length == 0) {
            data = {};
        }

        var mustConfirm = ($this.attr('data-async-confirm') == 'true');

        var callback = function() {
            if (mustShowLoading) {
                $children.remove();
                $this.append($loading);
            }
    
            $.ajax({
                url: $this.attr('href'),
                type: method,
                data: JSON.stringify(data),
                success: function(data) {
                    notifyOk(data.status, '');

                    $this.data('async-result', data);

                    var deleteTarget = $this.attr('data-async-delete');
                    if (!_.isUndefined(deleteTarget)) {
                        $(deleteTarget).disappear();
                    }
    
                    var reloadTarget = $this.attr('data-async-reload');
                    if (!_.isUndefined(reloadTarget)) {
                        $(reloadTarget).reloadData();
                    }
    
                    var callback = $this.attr('data-async-callback');
                    if (!_.isUndefined(callback)) {
                        eval(callback);
                    }
                },
                complete: function() {
                    if (mustShowLoading) {
                        $loading.remove();
                        $this.append($children);
                    }
                },
            });
        }

        if (mustConfirm) {
            showConfirmation($this, false, callback);
        } else {
            callback();
        }
    });

    $(document).on('click', 'input[type=checkbox][data-async=true]', function(e) {
        var $this = $(this);

        var data = $this.attr('data-async-data');
        if (_.isUndefined(data) || data.length == 0) {
            data = {};
        }

        var action, method, reloadTarget, callback
        if ($this.is(":checked")) {
            method = $this.attr('data-async-on-method');
            action = $this.attr('data-async-on-action');
            reloadTarget = $this.attr('data-async-on-reload');
            callback = $this.attr('data-async-on-callback');
        } else {
            method = $this.attr('data-async-off-method');
            action = $this.attr('data-async-off-action');
            reloadTarget = $this.attr('data-async-off-reload');
            callback = $this.attr('data-async-off-callback');
        }

        if (method.length == 0) {
            method = 'get';
        }

        $this.attr("disabled", "disabled");

        $.ajax({
            url: action,
            type: method,
            data: JSON.stringify(data),
            success: function(data) {
                notifyOk(data.status, '');

                if (!_.isUndefined(reloadTarget)) {
                    $(reloadTarget).reloadData();
                }

                if (!_.isUndefined(callback)) {
                    eval(callback);
                }
            },
            complete: function() {
                $this.removeAttr("disabled");
            },
        });
    });

    $(document).on('click', 'button[data-action]', function(e) {
        e.preventDefault();

        var $this = $(this);

        var paramName = $this.attr('data-param-name');
        var $paramValue = $($this.attr('data-param-value'));
        var paramValue = $paramValue.val();
        var $responseTarget = $($this.attr('data-response-target'));
        var responseJSONTagName = $this.attr('data-response-item');

        var data = {};
        data[paramName] = paramValue;

        $this.attr('disabled', 'disabled');
        $paramValue.attr('disabled', 'disabled');

        $.ajax({
            url: $this.attr('data-action'),
            type: $this.attr('data-method'),
            data: JSON.stringify(data),
            success: function(data) {
                if (!_.isUndefined(data.status)) {
                    notifyOk(data.status, '');
                }
                $responseTarget.text(data[responseJSONTagName]);
            },
            complete: function() {
                $this.removeAttr('disabled');
                $paramValue.removeAttr('disabled');
            },
        });
    });
});