PageSourceSearch

http://fan-fara.ru/bitrix/templates/aspro_next/js/jqModal.js

js fan-fara.ru collected 2026-10-08 15:55:07 UTC 12,439 bytes, 362 lines download raw bytes

1/*
2 * jqModal - Minimalist Modaling with jQuery
3 *
4 * Copyright (c) 2007-2014 Brice Burgess @iceburg_net
5 * Dual licensed under the MIT and GPL licenses:
6 *   http://www.opensource.org/licenses/mit-license.php
7 *   http://www.gnu.org/licenses/gpl.html
8 *
9 * $Version: 1.0.2 (2014.04.10 +r19)
10 * Requires: jQuery 1.2.3+
11 */
12
13(function ($) {
14  /**
15   * Initialize a set of elements as "modals". Modals typically are popup dialogs,
16   * notices, modal windows, &c.
17   *
18   * @name jqm
19   * @param options user defined options, augments defaults.
20   * @type jQuery
21   * @cat Plugins/jqModal
22   */
23
24  $.fn.jqm = function (options) {
25    var o = $.extend({}, $.jqm.params, options);
26
27    return this.each(function () {
28      var e = $(this),
29        jqm = $(this).data("jqm");
30
31      if (!jqm) jqm = { ID: I++ };
32
33      // add/extend options to modal and mark as initialized
34      e.data("jqm", $.extend(o, jqm)).addClass("jqm-init");
35
36      // ... Attach events to trigger showing of this modal
37      o.trigger && $(this).jqmAddTrigger(o.trigger);
38    });
39  };
40
41  /**
42   * Matching modals will have their jqmShow() method fired by attaching a
43   *   onClick event to elements matching `trigger`.
44   *
45   * @name jqmAddTrigger
46   * @param trigger a selector String, jQuery collection of elements, or a DOM element.
47   */
48  $.fn.jqmAddTrigger = function (trigger) {
49    return this.each(function () {
50      if (!addTrigger($(this), "jqmShow", trigger)) err("jqmAddTrigger must be called on initialized modals");
51    });
52  };
53
54  /**
55   * Matching modals will have their jqmHide() method fired by attaching an
56   *   onClick event to elements matching `trigger`.
57   *
58   * @name jqmAddClose
59   * @param trigger a selector String, jQuery collection of elements, or a DOM element.
60   */
61  $.fn.jqmAddClose = function (trigger) {
62    return this.each(function () {
63      if (!addTrigger($(this), "jqmHide", trigger)) err("jqmAddClose must be called on initialized modals");
64    });
65  };
66
67  /**
68   * Open matching modals (if not shown)
69   */
70  $.fn.jqmShow = function (trigger) {
71    return this.each(function () {
72      !this._jqmShown && show($(this), trigger);
73    });
74  };
75
76  /**
77   * Close matching modals
78   */
79  $.fn.jqmHide = function (trigger) {
80    return this.each(function () {
81      this._jqmShown && hide($(this), trigger);
82    });
83  };
84
85  // utility functions
86
87  var err = function (msg) {
88      if (window.console && window.console.error) window.console.error(msg);
89    },
90    show = function (e, t) {
91      /**
92       * e = modal element (as jQuery object)
93       * t = triggering element
94       *
95       * o = options
96       * z = z-index of modal
97       * v = overlay element (as jQuery object)
98       * h = hash (for jqModal <= r15 compatibility)
99       */
100
101      var o = e.data("jqm"),
102        t = t || window.event,
103        z = parseInt(e.css("z-index"));
104
105      if (o.noOverlay === undefined || (o.noOverlay !== undefined && !o.noOverlay)) {
106        if (isNaN(z)) {
107          if (window["lastJqmZindex"]) {
108            window["lastJqmZindex"] = z = window["lastJqmZindex"] + 2;
109          } else {
110            z = 3000;
111          }
112        }
113        window["lastJqmZindex"] = z;
114        var v = $("<div></div>")
115          .addClass(o.overlayClass)
116          .css({
117            height: "100%",
118            width: "100%",
119            position: "fixed",
120            left: 0,
121            top: 0,
122            "z-index": z - 1,
123            opacity: o.overlay / 100,
124          });
125        e.css("z-index", z);
126      } else {
127        var v = $("");
128        e.css("z-index", 2999);
129      }
130
131      // maintain legacy "hash" construct
132      var h = { w: e, c: o, o: v, t: t };
133
134      if (o.ajax) {
135        var target = o.target || e,
136          url = o.ajax;
137
138        target = typeof target == "string" ? $(target, e) : $(target);
139        if (url.substr(0, 1) == "@") url = $(t).attr(url.substring(1));
140
141        // Load the Ajax Content (and once loaded);
142        // Fire the onLoad callback (if exists),
143        // Attach closing events to elements inside the modal that match the closingClass,
144        // and Execute the jqModal default Open Callback
145        target.html(o.ajaxText).load(url, function () {
146          o.onLoad && o.onLoad.call(this, h);
147          open(h);
148        });
149      } else {
150        open(h);
151      }
152    },
153    hide = function (e, t) {
154      /**
155       * e = modal element (as jQuery object)
156       * t = triggering element
157       *
158       * o = options
159       * h = hash (for jqModal <= r15 compatibility)
160       */
161
162      var o = e.data("jqm"),
163        t = t || window.event,
164        // maintain legacy "hash" construct
165        h = { w: e, c: o, o: e.data("jqmv"), t: t };
166
167      close(h);
168    },
169    onShow = function (hash) {
170      // onShow callback. Responsible for showing a modal and overlay.
171      //  return false to stop opening modal.
172
173      // hash object;
174      //  w: (jQuery object) The modal element
175      //  c: (object) The modal's options object
176      //  o: (jQuery object) The overlay element
177      //  t: (DOM object) The triggering element
178
179      // display the overlay (prepend to body) if not disabled
180
181      // prevent double click
182      if (hash.w[0]._jqmShown) return false;
183
184      if (hash.c.overlay > 0) hash.o.prependTo("#popup_iframe_wrapper");
185
186      // make modal visible
187      hash.w.show();
188
189      // call focusFunc (attempts to focus on first input in modal)
190      $.jqm.focusFunc(hash.w);
191
192      return true;
193    },
194    onHide = function (hash) {
195      // onHide callback. Responsible for hiding a modal and overlay.
196      //  return false to stop closing modal.
197
198      // hash object;
199      //  w: (jQuery object) The modal element
200      //  c: (object) The modal's options object
201      //  o: (jQuery object) The overlay element
202      //  t: (DOM object) The triggering element
203
204      // hide modal and if overlay, remove overlay.
205      hash.w.hide() && hash.o && hash.o.remove();
206
207      return true;
208    },
209    addTrigger = function (e, key, trigger) {
210      // addTrigger: Adds a jqmShow or jqmHide (key) for a modal (e)
211      //  all elements that match trigger string (trigger)\
212
213      // return false if e is not an initialized modal element
214      if (!e.data("jqm")) return false;
215
216      return $(trigger)
217        .each(function () {
218          // register modal to trigger elements
219          this[key] = this[key] || [];
220          this[key].push(e);
221        })
222        .click(function () {
223          var trigger = this;
224
225          // foreadh modal registered to this trigger, call jqmShow ||
226          //   jqmHide (key) on modal passing trigger element (e)
227          $.each(this[key], function (i, e) {
228            e[key](trigger);
229          });
230
231          // stop trigger click event from bubbling
232          return false;
233        });
234    },
235    open = function (h) {
236      // open: executes the onOpen callback + performs common tasks if successful
237
238      // transform legacy hash into new var shortcuts
239      var e = h.w,
240        v = h.o,
241        o = h.c;
242
243      // execute onShow callback
244      if (o.onShow(h) !== false) {
245        // mark modal as shown
246        e[0]._jqmShown = true;
247
248        // if modal dialog
249        //
250        // Bind the Keep Focus Function [F] if no other Modals are open (!A[0]) +
251        // Add this modal to the opened modals stack (A) for nested modal support
252        //
253        // else, close dialog when overlay is clicked
254        if (o.modal) {
255          !A[0] && F("bind");
256          A.push(e);
257        } else e.jqmAddClose(v);
258
259        //  Attach closing events to elements inside the modal that match the closingClass
260        o.closeClass && e.jqmAddClose($("." + o.closeClass, e));
261
262        // IF toTop is true and overlay exists;
263        //  Add placeholder element <span id="jqmP#ID_of_modal"/> before modal to
264        //  remember it's position in the DOM and move it to a child of the body tag (after overlay)
265        o.toTop && v && e.before('<span id="jqmP' + o.ID + '"></span>').insertAfter(v);
266
267        // remember overlay (for closing function)
268        e.data("jqmv", v);
269      }
270    },
271    close = function (h) {
272      // close: executes the onHide callback + performs common tasks if successful
273
274      // transform legacy hash into new var shortcuts
275      var e = h.w,
276        v = h.o,
277        o = h.c;
278
279      // execute onShow callback
280      if (o.onHide(h) !== false) {
281        // mark modal as !shown
282        e[0]._jqmShown = false;
283
284        // If modal, remove from modal stack.
285        // If no modals in modal stack, unbind the Keep Focus Function
286        if (o.modal) {
287          A.pop();
288          !A[0] && F("unbind");
289        }
290
291        // IF toTop was passed and an overlay exists;
292        //  Move modal back to its "remembered" position.
293        o.toTop &&
294          v &&
295          $("#jqmP" + o.ID)
296            .after(e)
297            .remove();
298      }
299    },
300    F = function (t) {
301      // F: The Keep Focus Function (for modal: true dialos)
302      // Binds or Unbinds (t) the Focus Examination Function (X) to keypresses and clicks
303
304      $(document)[t]("keypress keydown mousedown", X);
305    },
306    X = function (e) {
307      // X: The Focus Examination Function (for modal: true dialogs)
308
309      var modal = $(e.target).data("jqm") || $(e.target).parents(".jqm-init:first").data("jqm"),
310        activeModal = A[A.length - 1].data("jqm");
311
312      // allow bubbling if event target is within active modal dialog
313      if (modal && modal.ID == activeModal.ID) return true;
314
315      // else, trigger focusFunc (focus on first input element and halt bubbling)
316      return $.jqm.focusFunc(activeModal);
317    },
318    I = 0, // modal ID increment (for nested modals)
319    A = []; // array of active modals (used to lock interactivity to appropriate modal)
320
321  // $.jqm, overridable defaults
322  $.jqm = {
323    /**
324     *  default options
325     *
326     * (Integer)   overlay      - [0-100] Translucency percentage (opacity) of the body covering overlay. Set to 0 for NO overlay, and up to 100 for a 100% opaque overlay.
327     * (String)    overlayClass - Applied to the body covering overlay. Useful for controlling overlay look (tint, background-image, &c) with CSS.
328     * (String)    closeClass   - Children of the modal element matching `closeClass` will fire the onHide event (to close the modal).
329     * (Mixed)     trigger      - Matching elements will fire the onShow event (to display the modal). Trigger can be a selector String, a jQuery collection of elements, a DOM element, or a False boolean.
330     * (String)    ajax         - URL to load content from via an AJAX request. False to disable ajax. If ajax begins with a "@", the URL is extracted from the attribute of the triggering element (e.g. use '@data-url' for; <a href="#" class="jqModal" data-url="modal.html">...)
331     * (Mixed)     target       - Children of the modal element to load the aja
331x response into. If false, modal content will be overwritten by ajax response. Useful for retaining modal design.
332     *                            Target may be a selector string, jQuery collection of elements, or a DOM element -- and MUST exist as a child of the modal element.
333     * (String)    ajaxText     - Text shown while waiting for ajax return. Replaces HTML content of `target` element.
334     * (Boolean)   modal        - If true, user interactivity will be locked to the modal window until closed.
335     * (Boolean)   toTop        - If true, modal will be posistioned as a first child of the BODY element when opened, and its DOM posistion restored when closed. Useful for overcoming z-Index container issues.
336     * (Function)  onShow       - User defined callback function fired when modal opened.
337     * (Function)  onHide       - User defined callback function fired when modal closed.
338     * (Function)  onLoad       - User defined callback function fired when ajax content loads.
339     */
340    params: {
341      overlay: 50,
342      overlayClass: "jqmOverlay",
343      closeClass: "jqmClose",
344      trigger: ".jqModal",
345      ajax: false,
346      target: false,
347      ajaxText: "",
348      modal: false,
349      toTop: false,
350      onShow: onShow,
351      onHide: onHide,
352      onLoad: false,
353    },
354
355    // focusFunc is fired when a modal is shown, or when interaction occurs outside
356    // a modal enabled dialog. Passed the modal element.
357    focusFunc: function (e) {
358      $(":input:visible:first", e).focus();
359      return false;
360    },
361  };
362})(jQuery);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.