All Downloads are FREE. Search and download functionalities are using the official Maven repository.

template.js.base.jqmodal.js Maven / Gradle / Ivy

There is a newer version: 5.0.6
Show newest version
/**
 * jqModal - Minimalist Modaling with jQuery
 *   (http://dev.iceburg.net/jquery/jqmodal/)
 *
 * Copyright (c) 2007,2008 Brice Burgess 
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 *
 * $Version: 07/06/2008 +r13
 * Changed by Oleg Kiriljuk, [email protected]
 * Copyright (c) 2014-2018, Oleg Kiriljuk, [email protected]
 */
/*jslint browser: true, nomen: true, plusplus: true, white: true */
/*global jQuery, define, exports, module, require */
(function (global, factory) {
	"use strict";
	if (typeof define === "function" && define.amd) {
		// AMD. Register as an anonymous module.
		define([
			"jquery"
		], function ($) {
			return factory($, global.document);
		});
	} else if (typeof module === "object" && module.exports) {
		// Node/CommonJS
		module.exports = function (root, $) {
			if (!root) {
				root = window;
			}
			if ($ === undefined) {
				// require("jquery") returns a factory that requires window to
				// build a jQuery instance, we normalize how we use modules
				// that require this pattern but the window provided is a noop
				// if it's defined (how jquery works)
				$ = typeof window !== "undefined" ?
						require("jquery") :
						require("jquery")(root);
			}
			factory($, root.document);
			return $;
		};
	} else {
		// Browser globals
		factory(jQuery, global.document);
	}
}(typeof window !== "undefined" ? window : this, function ($, document) {
	"use strict";
	// begin module jqmodal
	var jqmHashLength = 0,
		jqmHash,
		createdModals = [],
		setFocusOnFirstVisibleInput = function (h) {
			try {
				$(":input:visible", h.w).first().focus();
			} catch (ignore) {}
		},
		setFocus = function (h) {
			setFocusOnFirstVisibleInput(h);
		},
		keyOrMouseEventHandler = function (e) {
			var activeModal = jqmHash[createdModals[createdModals.length - 1]],
				modal = !$(e.target).parents(".jqmID" + activeModal.s)[0],
				targetOffset = $(e.target).offset(),
				eX = e.pageX !== undefined ? e.pageX : targetOffset.left,
				eY = e.pageY !== undefined ? e.pageY : targetOffset.top,
				isEventInsideOfModal = function () {
					var isInside = false;
					$(".jqmID" + activeModal.s).each(function () {
						var $self = $(this), offset = $self.offset();
						// mouse event have e.pageX and e.pageY
						// keyboard event have e.type == "keydown" or "keypress",
						// e.pageX and e.pageY are undefined and one can use
						// $(e.target).offset()
						if (offset.top <= eY && eY <= offset.top + $self.height() &&
								offset.left <= eX && eX <= offset.left + $self.width()) {
							isInside = true;
							return false; // stop enumeration
						}
					});
					return isInside;
				};
			if (e.type !== "mousedown" && isEventInsideOfModal()) {
				// allows keyboard events inside of the modal
				return true;
			}
			if (e.type === "mousedown" && modal) {
				if (isEventInsideOfModal()) {
					modal = false;
				}
				if (modal && !$(e.target).is(":input")) {
					setFocusOnFirstVisibleInput(activeModal);
				}
			}
			return !modal;
		},
		bindOrUnbindEvents = function (bindOrUnbind) {
			// bindOrUnbind is either "bind" or "unbind" string
			$(document)[bindOrUnbind]("keypress keydown mousedown", keyOrMouseEventHandler);
		},
		registerHideOrShow = function (w, trigger, key) {
			return w.each(function () {
				var jqm = this._jqm;
				$(trigger).each(function () {
					if (!this[key]) {
						this[key] = [];
						$(this).click(function () {
							var i, method, propertyName, methods = ["jqmShow", "jqmHide"];
							for (i = 0; i < methods.length; i++) {
								method = methods[i];
								for (propertyName in this[method]) {
									if (this[method].hasOwnProperty(propertyName) && jqmHash[this[method][propertyName]]) {
										jqmHash[this[method][propertyName]].w[method](this);
									}
								}
							}
							return false;
						});
					}
					this[key].push(jqm);
				});
			});
		};

	$.fn.jqm = function (o) {
		var p = {
			overlay: 50,
			closeoverlay: false,
			overlayClass: "jqmOverlay",
			closeClass: "jqmClose",
			trigger: ".jqModal",
			ajax: false,
			ajaxText: "",
			target: false,
			modal: false,
			toTop: false,
			onShow: false,
			onHide: false,
			onLoad: false
		};
		return this.each(function () {
			if (this._jqm) {
				jqmHash[this._jqm].c = $.extend({}, jqmHash[this._jqm].c, o);
				return jqmHash[this._jqm].c;
			}
			jqmHashLength++;
			this._jqm = jqmHashLength;
			jqmHash[jqmHashLength] = {
				// comment from https://github.com/briceburg/jqModal/blob/master/jqModal.js
				// hash object;
				//  w: (jQuery object) The modal element
				//  c: (object) The modal's options object
				//  o: (jQuery object) The overlay element
				//  t: (DOM object) The triggering element
				c: $.extend(p, $.jqm.params, o),
				a: false,
				w: $(this).addClass("jqmID" + jqmHashLength),
				s: jqmHashLength // used as id too
			};
			if (p.trigger) {
				$(this).jqmAddTrigger(p.trigger);
			}
		});
	};

	$.fn.jqmAddClose = function (trigger) {
		return registerHideOrShow(this, trigger, "jqmHide");
	};
	$.fn.jqmAddTrigger = function (trigger) {
		return registerHideOrShow(this, trigger, "jqmShow");
	};
	$.fn.jqmShow = function (trigger) {
		return this.each(function () {
			$.jqm.open(this._jqm, trigger);
		});
	};
	$.fn.jqmHide = function (trigger) {
		return this.each(function () {
			$.jqm.close(this._jqm, trigger);
		});
	};

	$.jqm = {
		hash: {},
		open: function (s, trigger) {
			var h = jqmHash[s], $overlay, target, url,
				options = h.c, parentOffset = h.w.parent().offset(), left, top,
				cc = "." + options.closeClass,
				z = (parseInt(h.w.css("z-index"), 10));
			z = (z > 0) ? z : 3000;
			$overlay = $("
").css({ height: "100%", width: "100%", position: "fixed", left: 0, top: 0, "z-index": z - 1, opacity: options.overlay / 100 }); if (h.a) { return false; } h.t = trigger; h.a = true; h.w.css("z-index", z); if ($(h.w[0].ownerDocument).data("ui-dialog-overlays")) { h.w.addClass("ui-dialog"); // hack to allow input inside of jQuery UI modal } if (options.modal) { if (!createdModals[0]) { setTimeout(function () { bindOrUnbindEvents("bind"); }, 1); } createdModals.push(s); } else if (options.overlay > 0) { if (options.closeoverlay) { h.w.jqmAddClose($overlay); } } else { $overlay = false; } h.o = $overlay ? $overlay.addClass(options.overlayClass).prependTo("body") : false; if (options.ajax) { target = options.target || h.w; url = options.ajax; target = (typeof target === "string") ? $(target, h.w) : $(target); url = (url.substr(0, 1) === "@") ? $(trigger).attr(url.substring(1)) : url; target.html(options.ajaxText) .load(url, function () { if (options.onLoad) { options.onLoad.call(this, h); } if (cc) { h.w.jqmAddClose($(cc, h.w)); } setFocus(h); }); } else if (cc) { h.w.jqmAddClose($(cc, h.w)); } if (options.toTop && h.o) { parentOffset = h.w.parent().offset(); left = parseFloat(h.w.css("left") || 0); top = parseFloat(h.w.css("top") || 0); h.w.before('') .insertAfter(h.o); h.w.css({ top: parentOffset.top + top, left: parentOffset.left + left }); } if (options.onShow) { options.onShow(h); } else { h.w.show(); } setFocus(h); return false; }, close: function (s) { var h = jqmHash[s]; if (!h.a) { return false; } h.a = false; if (createdModals[0]) { createdModals.pop(); if (!createdModals[0]) { bindOrUnbindEvents("unbind"); } } if (h.c.toTop && h.o) { $("#jqmP" + h.w[0]._jqm) .after(h.w) .remove(); } if (h.c.onHide) { h.c.onHide(h); } else { h.w.hide(); if (h.o) { h.o.remove(); } } return false; }, params: {} }; jqmHash = $.jqm.hash; // end module jqmodal }));




© 2015 - 2025 Weber Informatics LLC | Privacy Policy