Source: QfqRecordList.js

/**
                * @author Rafael Ostertag <rafael.ostertag@math.uzh.ch>
                */
                /* global $ */
                /* global console */

                var QfqNS = QfqNS || {};

                /**
                * Qfq Namespace
                *
                * @namespace QfqNS
                */
                (function (n) {
                'use strict';

                /**
                *
                * @param deleteUrl
                * @constructor
                *
                * @name QfqNS.QfqRecordList
                */
                n.QfqRecordList = function (deleteUrl) {
                this.deleteUrl = deleteUrl;
                this.deleteButtonClass = 'record-delete';
                this.recordClass = 'record';
                this.sipDataAttribute = 'sip';

                this.connectClickHandler();
                };

                /**
                * @private
                */
                n.QfqRecordList.prototype.connectClickHandler = function () {
                $("." + this.deleteButtonClass).click(this.handleDeleteButtonClick.bind(this));
                };

                n.QfqRecordList.prototype.handleDeleteButtonClick = function (event) {
                var $eventTarget = $(event.target);
                var $recordElement = this.getRecordElement(event.target);

                if ($recordElement.length !== 1) {
                throw new Error($recordElement.length + ' match(es) found for record class');
                }

                var sip = $eventTarget.data(this.sipDataAttribute);

                if (!sip) {
                throw new Error('No `sip` on delete button');
                }


                var alert = new n.Alert({
                message: "Do you really want to delete the record?",
                type: "warning",
                modal: true,
                buttons: [
                {label: "Yes", eventName: "ok"},
                {label: "No", eventName: "cancel", focus: true}
                ]
                });
                var that = this;
                alert.on('alert.ok', function () {
                $.post(that.deleteUrl + "?s=" + sip)
                .done(that.ajaxDeleteSuccessDispatcher.bind(that, $recordElement))
                .fail(n.Helper.showAjaxError);
                });
                alert.show();
                };

                /**
                *
                * @param $recordElement
                * @param data
                * @param textStatus
                * @param jqXHR
                *
                * @private
                */
                n.QfqRecordList.prototype.ajaxDeleteSuccessDispatcher = function ($recordElement, data, textStatus,
                jqXHR) {
                if (!data.status) {
                throw new Error("No 'status' property 'data'");
                }

                switch (data.status) {
                case "error":
                this.handleLogicDeleteError(data);
                break;
                case "success":
                this.handleDeleteSuccess($recordElement, data);
                break;
                default:
                throw new Error("Status '" + data.status + "' unknown.");
                }
                };

                n.QfqRecordList.prototype.handleDeleteSuccess = function ($recordElement, data) {
                if (data.redirect && data.redirect === "url" && data['redirect-url']) {
                window.location = data['redirect-url'];
                return;
                }
                if (data.redirect && data.redirect === "no") {
                var alert = new n.Alert("redirect=='no' not allowed", "error");
                alert.show();
                }

                var info = new n.Alert("Record successfully deleted", "info");
                info.timeout = 1500;
                info.show();
                $recordElement.fadeOut(function () {
                $recordElement.remove();
                });
                };

                n.QfqRecordList.prototype.getRecordElement = function (element) {
                return $(element).closest('.' + this.recordClass);
                };

                /**
                *
                * @param data
                *
                * @private
                */
                n.QfqRecordList.prototype.handleLogicDeleteError = function (data) {
                if (!data.message) {
                throw Error("Status is 'error' but required 'message' attribute is missing.");
                }
                var alert = new n.Alert(data.message, "error");
                alert.show();
                };


                })(QfqNS);