forked from Coded/SIPRP
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							610 lines
						
					
					
						
							15 KiB
						
					
					
				
			
		
		
	
	
							610 lines
						
					
					
						
							15 KiB
						
					
					
				/**
 | 
						|
 * bootbox.js v4.0.0
 | 
						|
 *
 | 
						|
 * http://bootboxjs.com/license.txt
 | 
						|
 */
 | 
						|
// @see https://github.com/makeusabrew/bootbox/issues/71
 | 
						|
window.bootbox = window.bootbox || (function init($, undefined) {
 | 
						|
  "use strict";
 | 
						|
 | 
						|
  // the base DOM structure needed to create a modal
 | 
						|
  var templates = {
 | 
						|
    dialog:
 | 
						|
      "<div class='bootbox modal' tabindex='-1' role='dialog'>" +
 | 
						|
        "<div class='modal-dialog'>" +
 | 
						|
          "<div class='modal-content'>" +
 | 
						|
            "<div class='modal-body'><div class='bootbox-body'></div></div>" +
 | 
						|
          "</div>" +
 | 
						|
        "</div>" +
 | 
						|
      "</div>",
 | 
						|
    header:
 | 
						|
      "<div class='modal-header'>" +
 | 
						|
        "<h4 class='modal-title'></h4>" +
 | 
						|
      "</div>",
 | 
						|
    footer:
 | 
						|
      "<div class='modal-footer'></div>",
 | 
						|
    closeButton:
 | 
						|
      "<button type='button' class='bootbox-close-button close'>×</button>",
 | 
						|
    form:
 | 
						|
      "<form class='bootbox-form'></form>",
 | 
						|
    inputs: {
 | 
						|
      text:
 | 
						|
        "<input class='bootbox-input form-control' autocomplete=off type=text />"
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  // cache a reference to the jQueryfied body element
 | 
						|
  var appendTo = $("body");
 | 
						|
 | 
						|
  var defaults = {
 | 
						|
    // default language
 | 
						|
    locale: "pt",
 | 
						|
    // show backdrop or not
 | 
						|
    backdrop: true,
 | 
						|
    // animate the modal in/out
 | 
						|
    animate: true,
 | 
						|
    // additional class string applied to the top level dialog
 | 
						|
    className: null,
 | 
						|
    // whether or not to include a close button
 | 
						|
    closeButton: true,
 | 
						|
    // show the dialog immediately by default
 | 
						|
    show: true
 | 
						|
  };
 | 
						|
 | 
						|
  // our public object; augmented after our private API
 | 
						|
  var exports = {};
 | 
						|
 | 
						|
  /**
 | 
						|
   * @private
 | 
						|
   */
 | 
						|
  function _t(key) {
 | 
						|
    var locale = locales[defaults.locale];
 | 
						|
    return locale ? locale[key] : locales.en[key];
 | 
						|
  }
 | 
						|
 | 
						|
  function processCallback(e, dialog, callback) {
 | 
						|
    e.preventDefault();
 | 
						|
 | 
						|
    // by default we assume a callback will get rid of the dialog,
 | 
						|
    // although it is given the opportunity to override this
 | 
						|
 | 
						|
    // so, if the callback can be invoked and it *explicitly returns false*
 | 
						|
    // then we'll set a flag to keep the dialog active...
 | 
						|
    var preserveDialog = $.isFunction(callback) && callback(e) === false;
 | 
						|
 | 
						|
    // ... otherwise we'll bin it
 | 
						|
    if (!preserveDialog) {
 | 
						|
      dialog.modal("hide");
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  function getKeyLength(obj) {
 | 
						|
    // @TODO defer to Object.keys(x).length if available?
 | 
						|
    var k, t = 0;
 | 
						|
    for (k in obj) {
 | 
						|
      t ++;
 | 
						|
    }
 | 
						|
    return t;
 | 
						|
  }
 | 
						|
 | 
						|
  function each(collection, iterator) {
 | 
						|
    var index = 0;
 | 
						|
    $.each(collection, function(key, value) {
 | 
						|
      iterator(key, value, index++);
 | 
						|
    });
 | 
						|
  }
 | 
						|
 | 
						|
  function sanitize(options) {
 | 
						|
    var buttons;
 | 
						|
    var total;
 | 
						|
 | 
						|
 | 
						|
    if (typeof options !== "object") {
 | 
						|
      throw new Error("Please supply an object of options");
 | 
						|
    }
 | 
						|
 | 
						|
    if (!options.message) {
 | 
						|
      throw new Error("Please specify a message");
 | 
						|
    }
 | 
						|
 | 
						|
    // make sure any supplied options take precedence over defaults
 | 
						|
    options = $.extend({}, defaults, options);
 | 
						|
 | 
						|
    if (!options.buttons) {
 | 
						|
      options.buttons = {};
 | 
						|
    }
 | 
						|
 | 
						|
    // we only support Bootstrap's "static" and false backdrop args
 | 
						|
    // supporting true would mean you could dismiss the dialog without
 | 
						|
    // explicitly interacting with it
 | 
						|
    options.backdrop = options.backdrop ? "static" : false;
 | 
						|
 | 
						|
    buttons = options.buttons;
 | 
						|
 | 
						|
    total = getKeyLength(buttons);
 | 
						|
 | 
						|
    each(buttons, function(key, button, index) {
 | 
						|
 | 
						|
      if ($.isFunction(button)) {
 | 
						|
        // short form, assume value is our callback. Since button
 | 
						|
        // isn't an object it isn't a reference either so re-assign it
 | 
						|
        button = buttons[key] = {
 | 
						|
          callback: button
 | 
						|
        };
 | 
						|
      }
 | 
						|
 | 
						|
      // before any further checks make sure by now button is the correct type
 | 
						|
      if ($.type(button) !== "object") {
 | 
						|
        throw new Error("button with key " + key + " must be an object");
 | 
						|
      }
 | 
						|
 | 
						|
      if (!button.label) {
 | 
						|
        // the lack of an explicit label means we'll assume the key is good enough
 | 
						|
        button.label = key;
 | 
						|
      }
 | 
						|
 | 
						|
      if (!button.className) {
 | 
						|
        if (total <= 2 && index === total-1) {
 | 
						|
          // always add a primary to the main option in a two-button dialog
 | 
						|
          button.className = "btn-primary btn-sm btn-danger";
 | 
						|
        } else {
 | 
						|
          button.className = "btn-sm";
 | 
						|
        }
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    return options;
 | 
						|
  }
 | 
						|
 | 
						|
  function mapArguments(args, properties) {
 | 
						|
    var argn = args.length;
 | 
						|
    var options = {};
 | 
						|
 | 
						|
    if (argn < 1 || argn > 2) {
 | 
						|
      throw new Error("Invalid argument length");
 | 
						|
    }
 | 
						|
 | 
						|
    if (argn === 2 || typeof args[0] === "string") {
 | 
						|
      options[properties[0]] = args[0];
 | 
						|
      options[properties[1]] = args[1];
 | 
						|
    } else {
 | 
						|
      options = args[0];
 | 
						|
    }
 | 
						|
 | 
						|
    return options;
 | 
						|
  }
 | 
						|
 | 
						|
  function mergeArguments(defaults, args, properties) {
 | 
						|
    return $.extend(true, {}, defaults, mapArguments(args, properties));
 | 
						|
  }
 | 
						|
 | 
						|
  function mergeButtons(labels, args, properties) {
 | 
						|
    return validateButtons(
 | 
						|
      mergeArguments(createButtons.apply(null, labels), args, properties),
 | 
						|
      labels
 | 
						|
    );
 | 
						|
  }
 | 
						|
 | 
						|
  function createLabels() {
 | 
						|
    var buttons = {};
 | 
						|
 | 
						|
    for (var i = 0, j = arguments.length; i < j; i++) {
 | 
						|
      var argument = arguments[i];
 | 
						|
      var key = argument.toLowerCase();
 | 
						|
      var value = argument.toUpperCase();
 | 
						|
 | 
						|
      buttons[key] = {
 | 
						|
        label: _t(value)
 | 
						|
      };
 | 
						|
    }
 | 
						|
 | 
						|
    return buttons;
 | 
						|
  }
 | 
						|
 | 
						|
  function createButtons() {
 | 
						|
    return {
 | 
						|
      buttons: createLabels.apply(null, arguments)
 | 
						|
    };
 | 
						|
  }
 | 
						|
 | 
						|
  function validateButtons(options, buttons) {
 | 
						|
    var allowedButtons = {};
 | 
						|
    each(buttons, function(key, value) {
 | 
						|
      allowedButtons[value] = true;
 | 
						|
    });
 | 
						|
 | 
						|
    each(options.buttons, function(key) {
 | 
						|
      if (allowedButtons[key] === undefined) {
 | 
						|
        throw new Error("button key " + key + " is not allowed (options are " + buttons.join("\n") + ")");
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    return options;
 | 
						|
  }
 | 
						|
 | 
						|
  exports.alert = function() {
 | 
						|
    var options;
 | 
						|
 | 
						|
    options = mergeButtons(["ok"], arguments, ["message", "callback"]);
 | 
						|
 | 
						|
    if (options.callback && !$.isFunction(options.callback)) {
 | 
						|
      throw new Error("alert requires callback property to be a function when provided");
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * overrides
 | 
						|
     */
 | 
						|
    options.buttons.ok.callback = options.onEscape = function() {
 | 
						|
      if ($.isFunction(options.callback)) {
 | 
						|
        return options.callback();
 | 
						|
      }
 | 
						|
      return true;
 | 
						|
    };
 | 
						|
 | 
						|
    return exports.dialog(options);
 | 
						|
  };
 | 
						|
 | 
						|
  exports.confirm = function() {
 | 
						|
    var options;
 | 
						|
 | 
						|
    options = mergeButtons(["cancel", "confirm"], arguments, ["message", "callback"]);
 | 
						|
 | 
						|
    /**
 | 
						|
     * overrides; undo anything the user tried to set they shouldn't have
 | 
						|
     */
 | 
						|
    options.buttons.cancel.callback = options.onEscape = function() {
 | 
						|
      return options.callback(false);
 | 
						|
    };
 | 
						|
 | 
						|
    options.buttons.confirm.callback = function() {
 | 
						|
      return options.callback(true);
 | 
						|
    };
 | 
						|
 | 
						|
    // confirm specific validation
 | 
						|
    if (!$.isFunction(options.callback)) {
 | 
						|
      throw new Error("confirm requires a callback");
 | 
						|
    }
 | 
						|
 | 
						|
    return exports.dialog(options);
 | 
						|
  };
 | 
						|
 | 
						|
  exports.prompt = function() {
 | 
						|
    var options;
 | 
						|
    var defaults;
 | 
						|
    var dialog;
 | 
						|
    var form;
 | 
						|
    var input;
 | 
						|
    var shouldShow;
 | 
						|
 | 
						|
    // we have to create our form first otherwise
 | 
						|
    // its value is undefined when gearing up our options
 | 
						|
    // @TODO this could be solved by allowing message to
 | 
						|
    // be a function instead...
 | 
						|
    form = $(templates.form);
 | 
						|
 | 
						|
    defaults = {
 | 
						|
      buttons: createLabels("cancel", "confirm"),
 | 
						|
      value: ""
 | 
						|
    };
 | 
						|
 | 
						|
    options = validateButtons(
 | 
						|
      mergeArguments(defaults, arguments, ["title", "callback"]),
 | 
						|
      ["cancel", "confirm"]
 | 
						|
    );
 | 
						|
 | 
						|
    // capture the user's show value; we always set this to false before
 | 
						|
    // spawning the dialog to give us a chance to attach some handlers to
 | 
						|
    // it, but we need to make sure we respect a preference not to show it
 | 
						|
    shouldShow = (options.show === undefined) ? true : options.show;
 | 
						|
 | 
						|
    /**
 | 
						|
     * overrides; undo anything the user tried to set they shouldn't have
 | 
						|
     */
 | 
						|
    options.message = form;
 | 
						|
 | 
						|
    options.buttons.cancel.callback = options.onEscape = function() {
 | 
						|
      return options.callback(null);
 | 
						|
    };
 | 
						|
 | 
						|
    options.buttons.confirm.callback = function() {
 | 
						|
      return options.callback(input.val());
 | 
						|
    };
 | 
						|
 | 
						|
    options.show = false;
 | 
						|
 | 
						|
    // prompt specific validation
 | 
						|
    if (!options.title) {
 | 
						|
      throw new Error("prompt requires a title");
 | 
						|
    }
 | 
						|
 | 
						|
    if (!$.isFunction(options.callback)) {
 | 
						|
      throw new Error("prompt requires a callback");
 | 
						|
    }
 | 
						|
 | 
						|
    // create the input
 | 
						|
    input = $(templates.inputs.text);
 | 
						|
    input.val(options.value);
 | 
						|
 | 
						|
    // now place it in our form
 | 
						|
    form.append(input);
 | 
						|
 | 
						|
    form.on("submit", function(e) {
 | 
						|
      e.preventDefault();
 | 
						|
      // @TODO can we actually click *the* button object instead?
 | 
						|
      // e.g. buttons.confirm.click() or similar
 | 
						|
      dialog.find(".btn-primary").click();
 | 
						|
    });
 | 
						|
 | 
						|
    dialog = exports.dialog(options);
 | 
						|
 | 
						|
    // clear the existing handler focusing the submit button...
 | 
						|
    dialog.off("shown.bs.modal");
 | 
						|
 | 
						|
    // ...and replace it with one focusing our input, if possible
 | 
						|
    dialog.on("shown.bs.modal", function() {
 | 
						|
      input.focus();
 | 
						|
    });
 | 
						|
 | 
						|
    if (shouldShow === true) {
 | 
						|
      dialog.modal("show");
 | 
						|
    }
 | 
						|
 | 
						|
    return dialog;
 | 
						|
  };
 | 
						|
 | 
						|
  exports.dialog = function(options) {
 | 
						|
    options = sanitize(options);
 | 
						|
 | 
						|
    var dialog = $(templates.dialog);
 | 
						|
    var body = dialog.find(".modal-body");
 | 
						|
    var buttons = options.buttons;
 | 
						|
    var buttonStr = "";
 | 
						|
    var callbacks = {
 | 
						|
      onEscape: options.onEscape
 | 
						|
    };
 | 
						|
 | 
						|
    each(buttons, function(key, button) {
 | 
						|
 | 
						|
      // @TODO I don't like this string appending to itself; bit dirty. Needs reworking
 | 
						|
      // can we just build up button elements instead? slower but neater. Then button
 | 
						|
      // can just become a template too
 | 
						|
      buttonStr += "<button data-bb-handler='" + key + "' type='button' class='btn " + button.className + "'>" + button.label + "</button>";
 | 
						|
      callbacks[key] = button.callback;
 | 
						|
    });
 | 
						|
 | 
						|
    body.find(".bootbox-body").html(options.message);
 | 
						|
 | 
						|
    if (options.animate === true) {
 | 
						|
      dialog.addClass("fade");
 | 
						|
    }
 | 
						|
 | 
						|
    if (options.className) {
 | 
						|
      dialog.addClass(options.className);
 | 
						|
    }
 | 
						|
 | 
						|
    if (options.title) {
 | 
						|
      body.before(templates.header);
 | 
						|
    }
 | 
						|
 | 
						|
    if (options.closeButton) {
 | 
						|
      var closeButton = $(templates.closeButton);
 | 
						|
 | 
						|
      if (options.title) {
 | 
						|
        dialog.find(".modal-header").prepend(closeButton);
 | 
						|
      } else {
 | 
						|
        closeButton.css("margin-top", "-10px").prependTo(body);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    if (options.title) {
 | 
						|
      dialog.find(".modal-title").html(options.title);
 | 
						|
    }
 | 
						|
 | 
						|
    if (buttonStr.length) {
 | 
						|
      body.after(templates.footer);
 | 
						|
      dialog.find(".modal-footer").html(buttonStr);
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
    /**
 | 
						|
     * Bootstrap event listeners; used handle extra
 | 
						|
     * setup & teardown required after the underlying
 | 
						|
     * modal has performed certain actions
 | 
						|
     */
 | 
						|
 | 
						|
    dialog.on("hidden.bs.modal", function(e) {
 | 
						|
      // ensure we don't accidentally intercept hidden events triggered
 | 
						|
      // by children of the current dialog. We shouldn't anymore now BS
 | 
						|
      // namespaces its events; but still worth doing
 | 
						|
      if (e.target === this) {
 | 
						|
        dialog.remove();
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    /*
 | 
						|
    dialog.on("show.bs.modal", function() {
 | 
						|
      // sadly this doesn't work; show is called *just* before
 | 
						|
      // the backdrop is added so we'd need a setTimeout hack or
 | 
						|
      // otherwise... leaving in as would be nice
 | 
						|
      if (options.backdrop) {
 | 
						|
        dialog.next(".modal-backdrop").addClass("bootbox-backdrop");
 | 
						|
      }
 | 
						|
    });
 | 
						|
    */
 | 
						|
 | 
						|
    dialog.on("shown.bs.modal", function() {
 | 
						|
      dialog.find(".btn-primary:first").focus();
 | 
						|
    });
 | 
						|
 | 
						|
    /**
 | 
						|
     * Bootbox event listeners; experimental and may not last
 | 
						|
     * just an attempt to decouple some behaviours from their
 | 
						|
     * respective triggers
 | 
						|
     */
 | 
						|
 | 
						|
    dialog.on("escape.close.bb", function(e) {
 | 
						|
      if (callbacks.onEscape) {
 | 
						|
        processCallback(e, dialog, callbacks.onEscape);
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    /**
 | 
						|
     * Standard jQuery event listeners; used to handle user
 | 
						|
     * interaction with our dialog
 | 
						|
     */
 | 
						|
 | 
						|
    dialog.on("click", ".modal-footer button", function(e) {
 | 
						|
      var callbackKey = $(this).data("bb-handler");
 | 
						|
 | 
						|
      processCallback(e, dialog, callbacks[callbackKey]);
 | 
						|
 | 
						|
    });
 | 
						|
 | 
						|
    dialog.on("click", ".bootbox-close-button", function(e) {
 | 
						|
      // onEscape might be falsy but that's fine; the fact is
 | 
						|
      // if the user has managed to click the close button we
 | 
						|
      // have to close the dialog, callback or not
 | 
						|
      processCallback(e, dialog, callbacks.onEscape);
 | 
						|
    });
 | 
						|
 | 
						|
    dialog.on("keyup", function(e) {
 | 
						|
      if (e.which === 27) {
 | 
						|
        dialog.trigger("escape.close.bb");
 | 
						|
      }
 | 
						|
    });
 | 
						|
 | 
						|
    // the remainder of this method simply deals with adding our
 | 
						|
    // dialogent to the DOM, augmenting it with Bootstrap's modal
 | 
						|
    // functionality and then giving the resulting object back
 | 
						|
    // to our caller
 | 
						|
 | 
						|
    appendTo.append(dialog);
 | 
						|
 | 
						|
    dialog.modal({
 | 
						|
      backdrop: options.backdrop,
 | 
						|
      keyboard: false,
 | 
						|
      show: false
 | 
						|
    });
 | 
						|
 | 
						|
    if (options.show) {
 | 
						|
      dialog.modal("show");
 | 
						|
    }
 | 
						|
 | 
						|
    // @TODO should we return the raw element here or should
 | 
						|
    // we wrap it in an object on which we can expose some neater
 | 
						|
    // methods, e.g. var d = bootbox.alert(); d.hide(); instead
 | 
						|
    // of d.modal("hide");
 | 
						|
 | 
						|
   /*
 | 
						|
    function BBDialog(elem) {
 | 
						|
      this.elem = elem;
 | 
						|
    }
 | 
						|
 | 
						|
    BBDialog.prototype = {
 | 
						|
      hide: function() {
 | 
						|
        return this.elem.modal("hide");
 | 
						|
      },
 | 
						|
      show: function() {
 | 
						|
        return this.elem.modal("show");
 | 
						|
      }
 | 
						|
    };
 | 
						|
    */
 | 
						|
 | 
						|
    return dialog;
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
  exports.setDefaults = function(values) {
 | 
						|
    $.extend(defaults, values);
 | 
						|
  };
 | 
						|
 | 
						|
  exports.hideAll = function() {
 | 
						|
    $(".bootbox").modal("hide");
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
  /**
 | 
						|
   * standard locales. Please add more according to ISO 639-1 standard. Multiple language variants are
 | 
						|
   * unlikely to be required. If this gets too large it can be split out into separate JS files.
 | 
						|
   */
 | 
						|
  var locales = {
 | 
						|
    pt : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Cancelar",
 | 
						|
      CONFIRM : "Sim"
 | 
						|
    },
 | 
						|
    br : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Cancelar",
 | 
						|
      CONFIRM : "Sim"
 | 
						|
    },
 | 
						|
    da : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Annuller",
 | 
						|
      CONFIRM : "Accepter"
 | 
						|
    },
 | 
						|
    de : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Abbrechen",
 | 
						|
      CONFIRM : "Akzeptieren"
 | 
						|
    },
 | 
						|
    en : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Cancel",
 | 
						|
      CONFIRM : "OK"
 | 
						|
    },
 | 
						|
    es : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Cancelar",
 | 
						|
      CONFIRM : "Aceptar"
 | 
						|
    },
 | 
						|
    fi : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Peruuta",
 | 
						|
      CONFIRM : "OK"
 | 
						|
    },
 | 
						|
    fr : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Annuler",
 | 
						|
      CONFIRM : "D'accord"
 | 
						|
    },
 | 
						|
    it : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Annulla",
 | 
						|
      CONFIRM : "Conferma"
 | 
						|
    },
 | 
						|
    nl : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Annuleren",
 | 
						|
      CONFIRM : "Accepteren"
 | 
						|
    },
 | 
						|
    pl : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Anuluj",
 | 
						|
      CONFIRM : "Potwierdź"
 | 
						|
    },
 | 
						|
    ru : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "Отмена",
 | 
						|
      CONFIRM : "Применить"
 | 
						|
    },
 | 
						|
    zh_CN : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "取消",
 | 
						|
      CONFIRM : "确认"
 | 
						|
    },
 | 
						|
    zh_TW : {
 | 
						|
      OK      : "OK",
 | 
						|
      CANCEL  : "取消",
 | 
						|
      CONFIRM : "確認"
 | 
						|
    }
 | 
						|
  };
 | 
						|
 | 
						|
  exports.init = function(_$) {
 | 
						|
    window.bootbox = init(_$ || $);
 | 
						|
  };
 | 
						|
 | 
						|
  return exports;
 | 
						|
 | 
						|
}(window.jQuery));
 |