- Fix ui errors with jquery updated
- add select all checkbox
This commit is contained in:
		
							parent
							
								
									14cdc6d4f9
								
							
						
					
					
						commit
						843e0fd52d
					
				
							
								
								
									
										985
									
								
								static/js/bootbox.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										985
									
								
								static/js/bootbox.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@ -0,0 +1,985 @@
 | 
				
			|||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * bootbox.js [v4.4.0]
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * http://bootboxjs.com/license.txt
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// @see https://github.com/makeusabrew/bootbox/issues/180
 | 
				
			||||||
 | 
					// @see https://github.com/makeusabrew/bootbox/issues/186
 | 
				
			||||||
 | 
					(function (root, factory) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  "use strict";
 | 
				
			||||||
 | 
					  if (typeof define === "function" && define.amd) {
 | 
				
			||||||
 | 
					    // AMD. Register as an anonymous module.
 | 
				
			||||||
 | 
					    define(["jquery"], factory);
 | 
				
			||||||
 | 
					  } else if (typeof exports === "object") {
 | 
				
			||||||
 | 
					    // Node. Does not work with strict CommonJS, but
 | 
				
			||||||
 | 
					    // only CommonJS-like environments that support module.exports,
 | 
				
			||||||
 | 
					    // like Node.
 | 
				
			||||||
 | 
					    module.exports = factory(require("jquery"));
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    // Browser globals (root is window)
 | 
				
			||||||
 | 
					    root.bootbox = factory(root.jQuery);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}(this, 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' data-dismiss='modal' aria-hidden='true'>×</button>",
 | 
				
			||||||
 | 
					    form:
 | 
				
			||||||
 | 
					      "<form class='bootbox-form'></form>",
 | 
				
			||||||
 | 
					    inputs: {
 | 
				
			||||||
 | 
					      text:
 | 
				
			||||||
 | 
					        "<input class='bootbox-input bootbox-input-text form-control' autocomplete=off type=text />",
 | 
				
			||||||
 | 
					      textarea:
 | 
				
			||||||
 | 
					        "<textarea class='bootbox-input bootbox-input-textarea form-control'></textarea>",
 | 
				
			||||||
 | 
					      email:
 | 
				
			||||||
 | 
					        "<input class='bootbox-input bootbox-input-email form-control' autocomplete='off' type='email' />",
 | 
				
			||||||
 | 
					      select:
 | 
				
			||||||
 | 
					        "<select class='bootbox-input bootbox-input-select form-control'></select>",
 | 
				
			||||||
 | 
					      checkbox:
 | 
				
			||||||
 | 
					        "<div class='checkbox'><label><input class='bootbox-input bootbox-input-checkbox' type='checkbox' /></label></div>",
 | 
				
			||||||
 | 
					      date:
 | 
				
			||||||
 | 
					        "<input class='bootbox-input bootbox-input-date form-control' autocomplete=off type='date' />",
 | 
				
			||||||
 | 
					      time:
 | 
				
			||||||
 | 
					        "<input class='bootbox-input bootbox-input-time form-control' autocomplete=off type='time' />",
 | 
				
			||||||
 | 
					      number:
 | 
				
			||||||
 | 
					        "<input class='bootbox-input bootbox-input-number form-control' autocomplete=off type='number' />",
 | 
				
			||||||
 | 
					      password:
 | 
				
			||||||
 | 
					        "<input class='bootbox-input bootbox-input-password form-control' autocomplete='off' type='password' />"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  var defaults = {
 | 
				
			||||||
 | 
					    // default language
 | 
				
			||||||
 | 
					    locale: "en",
 | 
				
			||||||
 | 
					    // show backdrop or not. Default to static so user has to interact with dialog
 | 
				
			||||||
 | 
					    backdrop: "static",
 | 
				
			||||||
 | 
					    // 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,
 | 
				
			||||||
 | 
					    // dialog container
 | 
				
			||||||
 | 
					    container: "body"
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 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.stopPropagation();
 | 
				
			||||||
 | 
					    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.call(dialog, 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 = {};
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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";
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					          button.className = "btn-default";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return options;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * map a flexible set of arguments into a single returned object
 | 
				
			||||||
 | 
					   * if args.length is already one just return it, otherwise
 | 
				
			||||||
 | 
					   * use the properties argument to map the unnamed args to
 | 
				
			||||||
 | 
					   * object properties
 | 
				
			||||||
 | 
					   * so in the latter case:
 | 
				
			||||||
 | 
					   * mapArguments(["foo", $.noop], ["message", "callback"])
 | 
				
			||||||
 | 
					   * -> { message: "foo", callback: $.noop }
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  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;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * merge a set of default dialog options with user supplied arguments
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  function mergeArguments(defaults, args, properties) {
 | 
				
			||||||
 | 
					    return $.extend(
 | 
				
			||||||
 | 
					      // deep merge
 | 
				
			||||||
 | 
					      true,
 | 
				
			||||||
 | 
					      // ensure the target is an empty, unreferenced object
 | 
				
			||||||
 | 
					      {},
 | 
				
			||||||
 | 
					      // the base options object for this type of dialog (often just buttons)
 | 
				
			||||||
 | 
					      defaults,
 | 
				
			||||||
 | 
					      // args could be an object or array; if it's an array properties will
 | 
				
			||||||
 | 
					      // map it to a proper options object
 | 
				
			||||||
 | 
					      mapArguments(
 | 
				
			||||||
 | 
					        args,
 | 
				
			||||||
 | 
					        properties
 | 
				
			||||||
 | 
					      )
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * this entry-level method makes heavy use of composition to take a simple
 | 
				
			||||||
 | 
					   * range of inputs and return valid options suitable for passing to bootbox.dialog
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  function mergeDialogOptions(className, labels, properties, args) {
 | 
				
			||||||
 | 
					    //  build up a base set of dialog properties
 | 
				
			||||||
 | 
					    var baseOptions = {
 | 
				
			||||||
 | 
					      className: "bootbox-" + className,
 | 
				
			||||||
 | 
					      buttons: createLabels.apply(null, labels)
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // ensure the buttons properties generated, *after* merging
 | 
				
			||||||
 | 
					    // with user args are still valid against the supplied labels
 | 
				
			||||||
 | 
					    return validateButtons(
 | 
				
			||||||
 | 
					      // merge the generated base properties with user supplied arguments
 | 
				
			||||||
 | 
					      mergeArguments(
 | 
				
			||||||
 | 
					        baseOptions,
 | 
				
			||||||
 | 
					        args,
 | 
				
			||||||
 | 
					        // if args.length > 1, properties specify how each arg maps to an object key
 | 
				
			||||||
 | 
					        properties
 | 
				
			||||||
 | 
					      ),
 | 
				
			||||||
 | 
					      labels
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * from a given list of arguments return a suitable object of button labels
 | 
				
			||||||
 | 
					   * all this does is normalise the given labels and translate them where possible
 | 
				
			||||||
 | 
					   * e.g. "ok", "confirm" -> { ok: "OK, cancel: "Annuleren" }
 | 
				
			||||||
 | 
					   */
 | 
				
			||||||
 | 
					  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 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 = mergeDialogOptions("alert", ["ok"], ["message", "callback"], arguments);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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.call(this);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return true;
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return exports.dialog(options);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exports.confirm = function() {
 | 
				
			||||||
 | 
					    var options;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    options = mergeDialogOptions("confirm", ["cancel", "confirm"], ["message", "callback"], arguments);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * overrides; undo anything the user tried to set they shouldn't have
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    options.buttons.cancel.callback = options.onEscape = function() {
 | 
				
			||||||
 | 
					      return options.callback.call(this, false);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    options.buttons.confirm.callback = function() {
 | 
				
			||||||
 | 
					      return options.callback.call(this, 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;
 | 
				
			||||||
 | 
					    var inputOptions;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // prompt defaults are more complex than others in that
 | 
				
			||||||
 | 
					    // users can override more defaults
 | 
				
			||||||
 | 
					    // @TODO I don't like that prompt has to do a lot of heavy
 | 
				
			||||||
 | 
					    // lifting which mergeDialogOptions can *almost* support already
 | 
				
			||||||
 | 
					    // just because of 'value' and 'inputType' - can we refactor?
 | 
				
			||||||
 | 
					    defaults = {
 | 
				
			||||||
 | 
					      className: "bootbox-prompt",
 | 
				
			||||||
 | 
					      buttons: createLabels("cancel", "confirm"),
 | 
				
			||||||
 | 
					      value: "",
 | 
				
			||||||
 | 
					      inputType: "text"
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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.call(this, null);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    options.buttons.confirm.callback = function() {
 | 
				
			||||||
 | 
					      var value;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      switch (options.inputType) {
 | 
				
			||||||
 | 
					        case "text":
 | 
				
			||||||
 | 
					        case "textarea":
 | 
				
			||||||
 | 
					        case "email":
 | 
				
			||||||
 | 
					        case "select":
 | 
				
			||||||
 | 
					        case "date":
 | 
				
			||||||
 | 
					        case "time":
 | 
				
			||||||
 | 
					        case "number":
 | 
				
			||||||
 | 
					        case "password":
 | 
				
			||||||
 | 
					          value = input.val();
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        case "checkbox":
 | 
				
			||||||
 | 
					          var checkedItems = input.find("input:checked");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // we assume that checkboxes are always multiple,
 | 
				
			||||||
 | 
					          // hence we default to an empty array
 | 
				
			||||||
 | 
					          value = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          each(checkedItems, function(_, item) {
 | 
				
			||||||
 | 
					            value.push($(item).val());
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					          break;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return options.callback.call(this, value);
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (!templates.inputs[options.inputType]) {
 | 
				
			||||||
 | 
					      throw new Error("invalid prompt type");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // create the input based on the supplied type
 | 
				
			||||||
 | 
					    input = $(templates.inputs[options.inputType]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (options.inputType) {
 | 
				
			||||||
 | 
					      case "text":
 | 
				
			||||||
 | 
					      case "textarea":
 | 
				
			||||||
 | 
					      case "email":
 | 
				
			||||||
 | 
					      case "date":
 | 
				
			||||||
 | 
					      case "time":
 | 
				
			||||||
 | 
					      case "number":
 | 
				
			||||||
 | 
					      case "password":
 | 
				
			||||||
 | 
					        input.val(options.value);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case "select":
 | 
				
			||||||
 | 
					        var groups = {};
 | 
				
			||||||
 | 
					        inputOptions = options.inputOptions || [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!$.isArray(inputOptions)) {
 | 
				
			||||||
 | 
					          throw new Error("Please pass an array of input options");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!inputOptions.length) {
 | 
				
			||||||
 | 
					          throw new Error("prompt with select requires options");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        each(inputOptions, function(_, option) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // assume the element to attach to is the input...
 | 
				
			||||||
 | 
					          var elem = input;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (option.value === undefined || option.text === undefined) {
 | 
				
			||||||
 | 
					            throw new Error("given options in wrong format");
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // ... but override that element if this option sits in a group
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          if (option.group) {
 | 
				
			||||||
 | 
					            // initialise group if necessary
 | 
				
			||||||
 | 
					            if (!groups[option.group]) {
 | 
				
			||||||
 | 
					              groups[option.group] = $("<optgroup/>").attr("label", option.group);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            elem = groups[option.group];
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          elem.append("<option value='" + option.value + "'>" + option.text + "</option>");
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        each(groups, function(_, group) {
 | 
				
			||||||
 | 
					          input.append(group);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // safe to set a select's value as per a normal input
 | 
				
			||||||
 | 
					        input.val(options.value);
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      case "checkbox":
 | 
				
			||||||
 | 
					        var values   = $.isArray(options.value) ? options.value : [options.value];
 | 
				
			||||||
 | 
					        inputOptions = options.inputOptions || [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!inputOptions.length) {
 | 
				
			||||||
 | 
					          throw new Error("prompt with checkbox requires options");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (!inputOptions[0].value || !inputOptions[0].text) {
 | 
				
			||||||
 | 
					          throw new Error("given options in wrong format");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // checkboxes have to nest within a containing element, so
 | 
				
			||||||
 | 
					        // they break the rules a bit and we end up re-assigning
 | 
				
			||||||
 | 
					        // our 'input' element to this container instead
 | 
				
			||||||
 | 
					        input = $("<div/>");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        each(inputOptions, function(_, option) {
 | 
				
			||||||
 | 
					          var checkbox = $(templates.inputs[options.inputType]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          checkbox.find("input").attr("value", option.value);
 | 
				
			||||||
 | 
					          checkbox.find("label").append(option.text);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          // we've ensured values is an array so we can always iterate over it
 | 
				
			||||||
 | 
					          each(values, function(_, value) {
 | 
				
			||||||
 | 
					            if (value === option.value) {
 | 
				
			||||||
 | 
					              checkbox.find("input").prop("checked", true);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					          input.append(checkbox);
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // @TODO provide an attributes option instead
 | 
				
			||||||
 | 
					    // and simply map that as keys: vals
 | 
				
			||||||
 | 
					    if (options.placeholder) {
 | 
				
			||||||
 | 
					      input.attr("placeholder", options.placeholder);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (options.pattern) {
 | 
				
			||||||
 | 
					      input.attr("pattern", options.pattern);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (options.maxlength) {
 | 
				
			||||||
 | 
					      input.attr("maxlength", options.maxlength);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // now place it in our form
 | 
				
			||||||
 | 
					    form.append(input);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    form.on("submit", function(e) {
 | 
				
			||||||
 | 
					      e.preventDefault();
 | 
				
			||||||
 | 
					      // Fix for SammyJS (or similar JS routing library) hijacking the form post.
 | 
				
			||||||
 | 
					      e.stopPropagation();
 | 
				
			||||||
 | 
					      // @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() {
 | 
				
			||||||
 | 
					      // need the closure here since input isn't
 | 
				
			||||||
 | 
					      // an object otherwise
 | 
				
			||||||
 | 
					      input.focus();
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (shouldShow === true) {
 | 
				
			||||||
 | 
					      dialog.modal("show");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return dialog;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exports.dialog = function(options) {
 | 
				
			||||||
 | 
					    options = sanitize(options);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    var dialog = $(templates.dialog);
 | 
				
			||||||
 | 
					    var innerDialog = dialog.find(".modal-dialog");
 | 
				
			||||||
 | 
					    var body = dialog.find(".modal-body");
 | 
				
			||||||
 | 
					    var buttons = options.buttons;
 | 
				
			||||||
 | 
					    var buttonStr = "";
 | 
				
			||||||
 | 
					    var callbacks = {
 | 
				
			||||||
 | 
					      onEscape: options.onEscape
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if ($.fn.modal === undefined) {
 | 
				
			||||||
 | 
					      throw new Error(
 | 
				
			||||||
 | 
					        "$.fn.modal is not defined; please double check you have included " +
 | 
				
			||||||
 | 
					        "the Bootstrap JavaScript library. See http://getbootstrap.com/javascript/ " +
 | 
				
			||||||
 | 
					        "for more details."
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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.size === "large") {
 | 
				
			||||||
 | 
					      innerDialog.addClass("modal-lg");
 | 
				
			||||||
 | 
					    } else if (options.size === "small") {
 | 
				
			||||||
 | 
					      innerDialog.addClass("modal-sm");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (options.backdrop !== "static") {
 | 
				
			||||||
 | 
					      // A boolean true/false according to the Bootstrap docs
 | 
				
			||||||
 | 
					      // should show a dialog the user can dismiss by clicking on
 | 
				
			||||||
 | 
					      // the background.
 | 
				
			||||||
 | 
					      // We always only ever pass static/false to the actual
 | 
				
			||||||
 | 
					      // $.modal function because with `true` we can't trap
 | 
				
			||||||
 | 
					      // this event (the .modal-backdrop swallows it)
 | 
				
			||||||
 | 
					      // However, we still want to sort of respect true
 | 
				
			||||||
 | 
					      // and invoke the escape mechanism instead
 | 
				
			||||||
 | 
					      dialog.on("click.dismiss.bs.modal", function(e) {
 | 
				
			||||||
 | 
					        // @NOTE: the target varies in >= 3.3.x releases since the modal backdrop
 | 
				
			||||||
 | 
					        // moved *inside* the outer dialog rather than *alongside* it
 | 
				
			||||||
 | 
					        if (dialog.children(".modal-backdrop").length) {
 | 
				
			||||||
 | 
					          e.currentTarget = dialog.children(".modal-backdrop").get(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (e.target !== e.currentTarget) {
 | 
				
			||||||
 | 
					          return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        dialog.trigger("escape.close.bb");
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $(options.container).append(dialog);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dialog.modal({
 | 
				
			||||||
 | 
					      backdrop: options.backdrop ? "static": false,
 | 
				
			||||||
 | 
					      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() {
 | 
				
			||||||
 | 
					    var values = {};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (arguments.length === 2) {
 | 
				
			||||||
 | 
					      // allow passing of single key/value...
 | 
				
			||||||
 | 
					      values[arguments[0]] = arguments[1];
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      // ... and as an object too
 | 
				
			||||||
 | 
					      values = arguments[0];
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    $.extend(defaults, values);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exports.hideAll = function() {
 | 
				
			||||||
 | 
					    $(".bootbox").modal("hide");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return exports;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /**
 | 
				
			||||||
 | 
					   * 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 = {
 | 
				
			||||||
 | 
					    bg_BG : {
 | 
				
			||||||
 | 
					      OK      : "Ок",
 | 
				
			||||||
 | 
					      CANCEL  : "Отказ",
 | 
				
			||||||
 | 
					      CONFIRM : "Потвърждавам"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    br : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Cancelar",
 | 
				
			||||||
 | 
					      CONFIRM : "Sim"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    cs : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Zrušit",
 | 
				
			||||||
 | 
					      CONFIRM : "Potvrdit"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    da : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Annuller",
 | 
				
			||||||
 | 
					      CONFIRM : "Accepter"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    de : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Abbrechen",
 | 
				
			||||||
 | 
					      CONFIRM : "Akzeptieren"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    el : {
 | 
				
			||||||
 | 
					      OK      : "Εντάξει",
 | 
				
			||||||
 | 
					      CANCEL  : "Ακύρωση",
 | 
				
			||||||
 | 
					      CONFIRM : "Επιβεβαίωση"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    en : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Cancel",
 | 
				
			||||||
 | 
					      CONFIRM : "OK"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    es : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Cancelar",
 | 
				
			||||||
 | 
					      CONFIRM : "Aceptar"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    et : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Katkesta",
 | 
				
			||||||
 | 
					      CONFIRM : "OK"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    fa : {
 | 
				
			||||||
 | 
					      OK      : "قبول",
 | 
				
			||||||
 | 
					      CANCEL  : "لغو",
 | 
				
			||||||
 | 
					      CONFIRM : "تایید"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    fi : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Peruuta",
 | 
				
			||||||
 | 
					      CONFIRM : "OK"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    fr : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Annuler",
 | 
				
			||||||
 | 
					      CONFIRM : "D'accord"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    he : {
 | 
				
			||||||
 | 
					      OK      : "אישור",
 | 
				
			||||||
 | 
					      CANCEL  : "ביטול",
 | 
				
			||||||
 | 
					      CONFIRM : "אישור"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hu : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Mégsem",
 | 
				
			||||||
 | 
					      CONFIRM : "Megerősít"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    hr : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Odustani",
 | 
				
			||||||
 | 
					      CONFIRM : "Potvrdi"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    id : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Batal",
 | 
				
			||||||
 | 
					      CONFIRM : "OK"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    it : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Annulla",
 | 
				
			||||||
 | 
					      CONFIRM : "Conferma"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    ja : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "キャンセル",
 | 
				
			||||||
 | 
					      CONFIRM : "確認"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    lt : {
 | 
				
			||||||
 | 
					      OK      : "Gerai",
 | 
				
			||||||
 | 
					      CANCEL  : "Atšaukti",
 | 
				
			||||||
 | 
					      CONFIRM : "Patvirtinti"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    lv : {
 | 
				
			||||||
 | 
					      OK      : "Labi",
 | 
				
			||||||
 | 
					      CANCEL  : "Atcelt",
 | 
				
			||||||
 | 
					      CONFIRM : "Apstiprināt"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    nl : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Annuleren",
 | 
				
			||||||
 | 
					      CONFIRM : "Accepteren"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    no : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Avbryt",
 | 
				
			||||||
 | 
					      CONFIRM : "OK"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    pl : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Anuluj",
 | 
				
			||||||
 | 
					      CONFIRM : "Potwierdź"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    pt : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Cancelar",
 | 
				
			||||||
 | 
					      CONFIRM : "Confirmar"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    ru : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Отмена",
 | 
				
			||||||
 | 
					      CONFIRM : "Применить"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    sq : {
 | 
				
			||||||
 | 
					      OK : "OK",
 | 
				
			||||||
 | 
					      CANCEL : "Anulo",
 | 
				
			||||||
 | 
					      CONFIRM : "Prano"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    sv : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "Avbryt",
 | 
				
			||||||
 | 
					      CONFIRM : "OK"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    th : {
 | 
				
			||||||
 | 
					      OK      : "ตกลง",
 | 
				
			||||||
 | 
					      CANCEL  : "ยกเลิก",
 | 
				
			||||||
 | 
					      CONFIRM : "ยืนยัน"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    tr : {
 | 
				
			||||||
 | 
					      OK      : "Tamam",
 | 
				
			||||||
 | 
					      CANCEL  : "İptal",
 | 
				
			||||||
 | 
					      CONFIRM : "Onayla"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    zh_CN : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "取消",
 | 
				
			||||||
 | 
					      CONFIRM : "确认"
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    zh_TW : {
 | 
				
			||||||
 | 
					      OK      : "OK",
 | 
				
			||||||
 | 
					      CANCEL  : "取消",
 | 
				
			||||||
 | 
					      CONFIRM : "確認"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exports.addLocale = function(name, values) {
 | 
				
			||||||
 | 
					    $.each(["OK", "CANCEL", "CONFIRM"], function(_, v) {
 | 
				
			||||||
 | 
					      if (!values[v]) {
 | 
				
			||||||
 | 
					        throw new Error("Please supply a translation for '" + v + "'");
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    locales[name] = {
 | 
				
			||||||
 | 
					      OK: values.OK,
 | 
				
			||||||
 | 
					      CANCEL: values.CANCEL,
 | 
				
			||||||
 | 
					      CONFIRM: values.CONFIRM
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return exports;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exports.removeLocale = function(name) {
 | 
				
			||||||
 | 
					    delete locales[name];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return exports;
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exports.setLocale = function(name) {
 | 
				
			||||||
 | 
					    return exports.setDefaults("locale", name);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  exports.init = function(_$) {
 | 
				
			||||||
 | 
					    return init(_$ || $);
 | 
				
			||||||
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return exports;
 | 
				
			||||||
 | 
					}));
 | 
				
			||||||
							
								
								
									
										7
									
								
								static/js/bootstrap.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								static/js/bootstrap.min.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										5
									
								
								static/styles/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								static/styles/bootstrap.min.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -1,57 +0,0 @@
 | 
				
			|||||||
#popup_container {
 | 
					 | 
				
			||||||
	font-family: Arial, sans-serif;
 | 
					 | 
				
			||||||
	font-size: 12px;
 | 
					 | 
				
			||||||
	min-width: 300px; /* Dialog will be no smaller than this */
 | 
					 | 
				
			||||||
	max-width: 600px; /* Dialog will wrap after this width */
 | 
					 | 
				
			||||||
	background: #FFF;
 | 
					 | 
				
			||||||
	border: solid 5px #999;
 | 
					 | 
				
			||||||
	color: #000;
 | 
					 | 
				
			||||||
	-moz-border-radius: 5px;
 | 
					 | 
				
			||||||
	-webkit-border-radius: 5px;
 | 
					 | 
				
			||||||
	border-radius: 5px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_title {
 | 
					 | 
				
			||||||
	font-size: 14px;
 | 
					 | 
				
			||||||
	font-weight: bold;
 | 
					 | 
				
			||||||
	text-align: center;
 | 
					 | 
				
			||||||
	line-height: 1.75em;
 | 
					 | 
				
			||||||
	color: #666;
 | 
					 | 
				
			||||||
	background: #CCC url(/static/images/title.gif) top repeat-x;
 | 
					 | 
				
			||||||
	border: solid 1px #FFF;
 | 
					 | 
				
			||||||
	border-bottom: solid 1px #999;
 | 
					 | 
				
			||||||
	cursor: default;
 | 
					 | 
				
			||||||
	padding: 0em;
 | 
					 | 
				
			||||||
	margin: 0em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_content {
 | 
					 | 
				
			||||||
	background: 16px 16px no-repeat url(/static/images/info.gif);
 | 
					 | 
				
			||||||
	padding: 1em 1.75em;
 | 
					 | 
				
			||||||
	margin: 0em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_content.alert {
 | 
					 | 
				
			||||||
	background-image: url(/static/images/info.gif);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_content.confirm {
 | 
					 | 
				
			||||||
	background-image: url(/static/images/important.gif);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_content.prompt {
 | 
					 | 
				
			||||||
	background-image: url(/static/images/help.gif);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_message {
 | 
					 | 
				
			||||||
	padding-left: 48px;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_panel {
 | 
					 | 
				
			||||||
	text-align: center;
 | 
					 | 
				
			||||||
	margin: 1em 0em 0em 1em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#popup_prompt {
 | 
					 | 
				
			||||||
	margin: .5em 0em;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user