Advertisement
Guest User

Untitled

a guest
Mar 7th, 2011
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 21.81 KB | None | 0 0
  1. /*
  2. * SimpleModal 1.4.1 - jQuery Plugin
  3. * http://www.ericmmartin.com/projects/simplemodal/
  4. * Copyright (c) 2010 Eric Martin (http://twitter.com/ericmmartin)
  5. * Dual licensed under the MIT and GPL licenses
  6. * Revision: $Id: jquery.simplemodal.js 261 2010-11-05 21:16:20Z emartin24 $
  7. */
  8.  
  9. /**
  10. * SimpleModal is a lightweight jQuery plugin that provides a simple
  11. * interface to create a modal dialog.
  12. *
  13. * The goal of SimpleModal is to provide developers with a cross-browser
  14. * overlay and container that will be populated with data provided to
  15. * SimpleModal.
  16. *
  17. * There are two ways to call SimpleModal:
  18. * 1) As a chained function on a jQuery object, like $('#myDiv').modal();.
  19. * This call would place the DOM object, #myDiv, inside a modal dialog.
  20. * Chaining requires a jQuery object. An optional options object can be
  21. * passed as a parameter.
  22. *
  23. * @example $('<div>my data</div>').modal({options});
  24. * @example $('#myDiv').modal({options});
  25. * @example jQueryObject.modal({options});
  26. *
  27. * 2) As a stand-alone function, like $.modal(data). The data parameter
  28. * is required and an optional options object can be passed as a second
  29. * parameter. This method provides more flexibility in the types of data
  30. * that are allowed. The data could be a DOM object, a jQuery object, HTML
  31. * or a string.
  32. *
  33. * @example $.modal('<div>my data</div>', {options});
  34. * @example $.modal('my data', {options});
  35. * @example $.modal($('#myDiv'), {options});
  36. * @example $.modal(jQueryObject, {options});
  37. * @example $.modal(document.getElementById('myDiv'), {options});
  38. *
  39. * A SimpleModal call can contain multiple elements, but only one modal
  40. * dialog can be created at a time. Which means that all of the matched
  41. * elements will be displayed within the modal container.
  42. *
  43. * SimpleModal internally sets the CSS needed to display the modal dialog
  44. * properly in all browsers, yet provides the developer with the flexibility
  45. * to easily control the look and feel. The styling for SimpleModal can be
  46. * done through external stylesheets, or through SimpleModal, using the
  47. * overlayCss, containerCss, and dataCss options.
  48. *
  49. * SimpleModal has been tested in the following browsers:
  50. * - IE 6, 7, 8, 9
  51. * - Firefox 2, 3, 4
  52. * - Opera 9, 10
  53. * - Safari 3, 4, 5
  54. * - Chrome 1, 2, 3, 4, 5, 6
  55. *
  56. * @name SimpleModal
  57. * @type jQuery
  58. * @requires jQuery v1.2.4
  59. * @cat Plugins/Windows and Overlays
  60. * @author Eric Martin (http://ericmmartin.com)
  61. * @version 1.4.1
  62. */
  63. ;(function ($) {
  64. var ie6 = $.browser.msie && parseInt($.browser.version) === 6 && typeof window['XMLHttpRequest'] !== 'object',
  65. ie7 = $.browser.msie && parseInt($.browser.version) === 7,
  66. ieQuirks = null,
  67. w = [];
  68.  
  69. /*
  70. * Create and display a modal dialog.
  71. *
  72. * @param {string, object} data A string, jQuery object or DOM object
  73. * @param {object} [options] An optional object containing options overrides
  74. */
  75. $.modal = function (data, options) {
  76. return $.modal.impl.init(data, options);
  77. };
  78.  
  79. /*
  80. * Close the modal dialog.
  81. */
  82. $.modal.close = function () {
  83. $.modal.impl.close();
  84. };
  85.  
  86. /*
  87. * Set focus on first or last visible input in the modal dialog. To focus on the last
  88. * element, call $.modal.focus('last'). If no input elements are found, focus is placed
  89. * on the data wrapper element.
  90. */
  91. $.modal.focus = function (pos) {
  92. $.modal.impl.focus(pos);
  93. };
  94.  
  95. /*
  96. * Determine and set the dimensions of the modal dialog container.
  97. * setPosition() is called if the autoPosition option is true.
  98. */
  99. $.modal.setContainerDimensions = function () {
  100. $.modal.impl.setContainerDimensions();
  101. };
  102.  
  103. /*
  104. * Re-position the modal dialog.
  105. */
  106. $.modal.setPosition = function () {
  107. $.modal.impl.setPosition();
  108. };
  109.  
  110. /*
  111. * Update the modal dialog. If new dimensions are passed, they will be used to determine
  112. * the dimensions of the container.
  113. *
  114. * setContainerDimensions() is called, which in turn calls setPosition(), if enabled.
  115. * Lastly, focus() is called is the focus option is true.
  116. */
  117. $.modal.update = function (height, width) {
  118. $.modal.impl.update(height, width);
  119. };
  120.  
  121. /*
  122. * Chained function to create a modal dialog.
  123. *
  124. * @param {object} [options] An optional object containing options overrides
  125. */
  126. $.fn.modal = function (options) {
  127. return $.modal.impl.init(this, options);
  128. };
  129.  
  130. /*
  131. * SimpleModal default options
  132. *
  133. * appendTo: (String:'body') The jQuery selector to append the elements to. For .NET, use 'form'.
  134. * focus: (Boolean:true) Focus in the first visible, enabled element?
  135. * opacity: (Number:50) The opacity value for the overlay div, from 0 - 100
  136. * overlayId: (String:'simplemodal-overlay') The DOM element id for the overlay div
  137. * overlayCss: (Object:{}) The CSS styling for the overlay div
  138. * containerId: (String:'simplemodal-container') The DOM element id for the container div
  139. * containerCss: (Object:{}) The CSS styling for the container div
  140. * dataId: (String:'simplemodal-data') The DOM element id for the data div
  141. * dataCss: (Object:{}) The CSS styling for the data div
  142. * minHeight: (Number:null) The minimum height for the container
  143. * minWidth: (Number:null) The minimum width for the container
  144. * maxHeight: (Number:null) The maximum height for the container. If not specified, the window height is used.
  145. * maxWidth: (Number:null) The maximum width for the container. If not specified, the window width is used.
  146. * autoResize: (Boolean:false) Automatically resize the container if it exceeds the browser window dimensions?
  147. * autoPosition: (Boolean:true) Automatically position the container upon creation and on window resize?
  148. * zIndex: (Number: 1000) Starting z-index value
  149. * close: (Boolean:true) If true, closeHTML, escClose and overClose will be used if set.
  150. If false, none of them will be used.
  151. * closeHTML: (String:'<a class="modalCloseImg" title="Close"></a>') The HTML for the default close link.
  152. SimpleModal will automatically add the closeClass to this element.
  153. * closeClass: (String:'simplemodal-close') The CSS class used to bind to the close event
  154. * escClose: (Boolean:true) Allow Esc keypress to close the dialog?
  155. * overlayClose: (Boolean:true) Allow click on overlay to close the dialog?
  156. * position: (Array:null) Position of container [top, left]. Can be number of pixels or percentage
  157. * persist: (Boolean:false) Persist the data across modal calls? Only used for existing
  158. DOM elements. If true, the data will be maintained across modal calls, if false,
  159. the data will be reverted to its original state.
  160. * modal: (Boolean:true) User will be unable to interact with the page below the modal or tab away from the dialog.
  161. If false, the overlay, iframe, and certain events will be disabled allowing the user to interact
  162. with the page below the dialog.
  163. * onOpen: (Function:null) The callback function used in place of SimpleModal's open
  164. * onShow: (Function:null) The callback function used after the modal dialog has opened
  165. * onClose: (Function:null) The callback function used in place of SimpleModal's close
  166. */
  167. $.modal.defaults = {
  168. appendTo: 'body',
  169. focus: true,
  170. opacity: 1,
  171. overlayId: 'simplemodal-overlay',
  172. overlayCss: {},
  173. containerId: 'simplemodal-container',
  174. containerCss: {},
  175. dataId: 'simplemodal-data',
  176. dataCss: {},
  177. minHeight: null,
  178. minWidth: null,
  179. maxHeight: null,
  180. maxWidth: null,
  181. autoResize: false,
  182. autoPosition: true,
  183. zIndex: 1000,
  184. close: true,
  185. closeHTML: '<a class="modalCloseImg" title="Close"></a>',
  186. closeClass: 'simplemodal-close',
  187. escClose: true,
  188. overlayClose: true,
  189. position: null,
  190. persist: false,
  191. modal: true,
  192. onOpen: null,
  193. onShow: null,
  194. onClose: null
  195. };
  196.  
  197. /*
  198. * Main modal object
  199. * o = options
  200. */
  201. $.modal.impl = {
  202. /*
  203. * Contains the modal dialog elements and is the object passed
  204. * back to the callback (onOpen, onShow, onClose) functions
  205. */
  206. d: {},
  207. /*
  208. * Initialize the modal dialog
  209. */
  210. init: function (data, options) {
  211. var s = this;
  212.  
  213. // don't allow multiple calls
  214. if (s.d.data) {
  215. return false;
  216. }
  217.  
  218. // $.boxModel is undefined if checked earlier
  219. ieQuirks = $.browser.msie && !$.boxModel;
  220.  
  221. // merge defaults and user options
  222. s.o = $.extend({}, $.modal.defaults, options);
  223.  
  224. // keep track of z-index
  225. s.zIndex = s.o.zIndex;
  226.  
  227. // set the onClose callback flag
  228. s.occb = false;
  229.  
  230. // determine how to handle the data based on its type
  231. if (typeof data === 'object') {
  232. // convert DOM object to a jQuery object
  233. data = data instanceof jQuery ? data : $(data);
  234. s.d.placeholder = false;
  235.  
  236. // if the object came from the DOM, keep track of its parent
  237. if (data.parent().parent().size() > 0) {
  238. data.before($('<span></span>')
  239. .attr('id', 'simplemodal-placeholder')
  240. .css({display: 'none'}));
  241.  
  242. s.d.placeholder = true;
  243. s.display = data.css('display');
  244.  
  245. // persist changes? if not, make a clone of the element
  246. if (!s.o.persist) {
  247. s.d.orig = data.clone(true);
  248. }
  249. }
  250. }
  251. else if (typeof data === 'string' || typeof data === 'number') {
  252. // just insert the data as innerHTML
  253. data = $('<div></div>').html(data);
  254. }
  255. else {
  256. // unsupported data type!
  257. alert('SimpleModal Error: Unsupported data type: ' + typeof data);
  258. return s;
  259. }
  260.  
  261. // create the modal overlay, container and, if necessary, iframe
  262. s.create(data);
  263. data = null;
  264.  
  265. // display the modal dialog
  266. s.open();
  267.  
  268. // useful for adding events/manipulating data in the modal dialog
  269. if ($.isFunction(s.o.onShow)) {
  270. s.o.onShow.apply(s, [s.d]);
  271. }
  272.  
  273. // don't break the chain =)
  274. return s;
  275. },
  276. /*
  277. * Create and add the modal overlay and container to the page
  278. */
  279. create: function (data) {
  280. var s = this;
  281.  
  282. // get the window properties
  283. w = s.getDimensions();
  284.  
  285. // add an iframe to prevent select options from bleeding through
  286. if (s.o.modal && ie6) {
  287. s.d.iframe = $('<iframe src="javascript:false;"></iframe>')
  288. .css($.extend(s.o.iframeCss, {
  289. display: 'none',
  290. opacity: 0,
  291. position: 'fixed',
  292. height: w[0],
  293. width: w[1],
  294. zIndex: s.o.zIndex,
  295. top: 0,
  296. left: 0
  297. }))
  298. .appendTo(s.o.appendTo);
  299. }
  300.  
  301. // create the overlay
  302. s.d.overlay = $('<div></div>')
  303. .attr('id', s.o.overlayId)
  304. .addClass('simplemodal-overlay')
  305. .css($.extend(s.o.overlayCss, {
  306. display: 'none',
  307. opacity: s.o.opacity / 100,
  308. height: s.o.modal ? w[0] : 0,
  309. width: s.o.modal ? w[1] : 0,
  310. position: 'fixed',
  311. left: 0,
  312. top: 0,
  313. zIndex: s.o.zIndex + 1
  314. }))
  315. .appendTo(s.o.appendTo);
  316.  
  317. // create the container
  318. s.d.container = $('<div></div>')
  319. .attr('id', s.o.containerId)
  320. .addClass('simplemodal-container')
  321. .css($.extend(s.o.containerCss, {
  322. display: 'none',
  323. position: 'fixed',
  324. zIndex: s.o.zIndex + 2
  325. }))
  326. .append(s.o.close && s.o.closeHTML
  327. ? $(s.o.closeHTML).addClass(s.o.closeClass)
  328. : '')
  329. .appendTo(s.o.appendTo);
  330.  
  331. s.d.wrap = $('<div></div>')
  332. .attr('tabIndex', -1)
  333. .addClass('simplemodal-wrap')
  334. .css({height: '100%', outline: 0, width: '100%'})
  335. .appendTo(s.d.container);
  336.  
  337. // add styling and attributes to the data
  338. // append to body to get correct dimensions, then move to wrap
  339. s.d.data = data
  340. .attr('id', data.attr('id') || s.o.dataId)
  341. .addClass('simplemodal-data')
  342. .css($.extend(s.o.dataCss, {
  343. display: 'none'
  344. }))
  345. .appendTo('body');
  346. data = null;
  347.  
  348. s.setContainerDimensions();
  349. s.d.data.appendTo(s.d.wrap);
  350.  
  351. // fix issues with IE
  352. if (ie6 || ieQuirks) {
  353. s.fixIE();
  354. }
  355. },
  356. /*
  357. * Bind events
  358. */
  359. bindEvents: function () {
  360. var s = this;
  361.  
  362. // bind the close event to any element with the closeClass class
  363. $('.' + s.o.closeClass).bind('click.simplemodal', function (e) {
  364. e.preventDefault();
  365. s.close();
  366. });
  367.  
  368. // bind the overlay click to the close function, if enabled
  369. if (s.o.modal && s.o.close && s.o.overlayClose) {
  370. s.d.overlay.bind('click.simplemodal', function (e) {
  371. e.preventDefault();
  372. s.close();
  373. });
  374. }
  375.  
  376. // bind keydown events
  377. $(document).bind('keydown.simplemodal', function (e) {
  378. if (s.o.modal && e.keyCode === 9) { // TAB
  379. s.watchTab(e);
  380. }
  381. else if ((s.o.close && s.o.escClose) && e.keyCode === 27) { // ESC
  382. e.preventDefault();
  383. s.close();
  384. }
  385. });
  386.  
  387. // update window size
  388. $(window).bind('resize.simplemodal', function () {
  389. // redetermine the window width/height
  390. w = s.getDimensions();
  391.  
  392. // reposition the dialog
  393. s.o.autoResize ? s.setContainerDimensions() : s.o.autoPosition && s.setPosition();
  394.  
  395. if (ie6 || ieQuirks) {
  396. s.fixIE();
  397. }
  398. else if (s.o.modal) {
  399. // update the iframe & overlay
  400. s.d.iframe && s.d.iframe.css({height: w[0], width: w[1]});
  401. s.d.overlay.css({height: w[0], width: w[1]});
  402. }
  403. });
  404. },
  405. /*
  406. * Unbind events
  407. */
  408. unbindEvents: function () {
  409. $('.' + this.o.closeClass).unbind('click.simplemodal');
  410. $(document).unbind('keydown.simplemodal');
  411. $(window).unbind('resize.simplemodal');
  412. this.d.overlay.unbind('click.simplemodal');
  413. },
  414. /*
  415. * Fix issues in IE6 and IE7 in quirks mode
  416. */
  417. fixIE: function () {
  418. var s = this, p = s.o.position;
  419.  
  420. // simulate fixed position - adapted from BlockUI
  421. $.each([s.d.iframe || null, !s.o.modal ? null : s.d.overlay, s.d.container], function (i, el) {
  422. if (el) {
  423. var bch = 'document.body.clientHeight', bcw = 'document.body.clientWidth',
  424. bsh = 'document.body.scrollHeight', bsl = 'document.body.scrollLeft',
  425. bst = 'document.body.scrollTop', bsw = 'document.body.scrollWidth',
  426. ch = 'document.documentElement.clientHeight', cw = 'document.documentElement.clientWidth',
  427. sl = 'document.documentElement.scrollLeft', st = 'document.documentElement.scrollTop',
  428. s = el[0].style;
  429.  
  430. s.position = 'absolute';
  431. if (i < 2) {
  432. s.removeExpression('height');
  433. s.removeExpression('width');
  434. s.setExpression('height','' + bsh + ' > ' + bch + ' ? ' + bsh + ' : ' + bch + ' + "px"');
  435. s.setExpression('width','' + bsw + ' > ' + bcw + ' ? ' + bsw + ' : ' + bcw + ' + "px"');
  436. }
  437. else {
  438. var te, le;
  439. if (p && p.constructor === Array) {
  440. var top = p[0]
  441. ? typeof p[0] === 'number' ? p[0].toString() : p[0].replace(/px/, '')
  442. : el.css('top').replace(/px/, '');
  443. te = top.indexOf('%') === -1
  444. ? top + ' + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"'
  445. : parseInt(top.replace(/%/, '')) + ' * ((' + ch + ' || ' + bch + ') / 100) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"';
  446.  
  447. if (p[1]) {
  448. var left = typeof p[1] === 'number' ? p[1].toString() : p[1].replace(/px/, '');
  449. le = left.indexOf('%') === -1
  450. ? left + ' + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"'
  451. : parseInt(left.replace(/%/, '')) + ' * ((' + cw + ' || ' + bcw + ') / 100) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"';
  452. }
  453. }
  454. else {
  455. te = '(' + ch + ' || ' + bch + ') / 2 - (this.offsetHeight / 2) + (t = ' + st + ' ? ' + st + ' : ' + bst + ') + "px"';
  456. le = '(' + cw + ' || ' + bcw + ') / 2 - (this.offsetWidth / 2) + (t = ' + sl + ' ? ' + sl + ' : ' + bsl + ') + "px"';
  457. }
  458. s.removeExpression('top');
  459. s.removeExpression('left');
  460. s.setExpression('top', te);
  461. s.setExpression('left', le);
  462. }
  463. }
  464. });
  465. },
  466. /*
  467. * Place focus on the first or last visible input
  468. */
  469. focus: function (pos) {
  470. var s = this, p = pos && $.inArray(pos, ['first', 'last']) !== -1 ? pos : 'first';
  471.  
  472. // focus on dialog or the first visible/enabled input element
  473. var input = $(':input:enabled:visible:' + p, s.d.wrap);
  474. setTimeout(function () {
  475. input.length > 0 ? input.focus() : s.d.wrap.focus();
  476. }, 10);
  477. },
  478. getDimensions: function () {
  479. var el = $(window);
  480.  
  481. // fix a jQuery/Opera bug with determining the window height
  482. var h = $.browser.opera && $.browser.version > '9.5' && $.fn.jquery < '1.3'
  483. || $.browser.opera && $.browser.version < '9.5' && $.fn.jquery > '1.2.6'
  484. ? el[0].innerHeight : el.height();
  485.  
  486. return [h, el.width()];
  487. },
  488. getVal: function (v, d) {
  489. return v ? (typeof v === 'number' ? v
  490. : v === 'auto' ? 0
  491. : v.indexOf('%') > 0 ? ((parseInt(v.replace(/%/, '')) / 100) * (d === 'h' ? w[0] : w[1]))
  492. : parseInt(v.replace(/px/, '')))
  493. : null;
  494. },
  495. /*
  496. * Update the container. Set new dimensions, if provided.
  497. * Focus, if enabled. Re-bind events.
  498. */
  499. update: function (height, width) {
  500. var s = this;
  501.  
  502. // prevent update if dialog does not exist
  503. if (!s.d.data) {
  504. return false;
  505. }
  506.  
  507. // reset orig values
  508. s.d.origHeight = s.getVal(height, 'h');
  509. s.d.origWidth = s.getVal(width, 'w');
  510.  
  511. // hide data to prevent screen flicker
  512. s.d.data.hide();
  513. height && s.d.container.css('height', height);
  514. width && s.d.container.css('width', width);
  515. s.setContainerDimensions();
  516. s.d.data.show();
  517. s.o.focus && s.focus();
  518.  
  519. // rebind events
  520. s.unbindEvents();
  521. s.bindEvents();
  522. },
  523. setContainerDimensions: function () {
  524. var s = this,
  525. badIE = ie6 || ie7;
  526.  
  527. // get the dimensions for the container and data
  528. var ch = s.d.origHeight ? s.d.origHeight : $.browser.opera ? s.d.container.height() : s.getVal(badIE ? s.d.container[0].currentStyle['height'] : s.d.container.css('height'), 'h'),
  529. cw = s.d.origWidth ? s.d.origWidth : $.browser.opera ? s.d.container.width() : s.getVal(badIE ? s.d.container[0].currentStyle['width'] : s.d.container.css('width'), 'w'),
  530. dh = s.d.data.outerHeight(true), dw = s.d.data.outerWidth(true);
  531.  
  532. s.d.origHeight = s.d.origHeight || ch;
  533. s.d.origWidth = s.d.origWidth || cw;
  534.  
  535. // mxoh = max option height, mxow = max option width
  536. var mxoh = s.o.maxHeight ? s.getVal(s.o.maxHeight, 'h') : null,
  537. mxow = s.o.maxWidth ? s.getVal(s.o.maxWidth, 'w') : null,
  538. mh = mxoh && mxoh < w[0] ? mxoh : w[0],
  539. mw = mxow && mxow < w[1] ? mxow : w[1];
  540.  
  541. // moh = min option height
  542. var moh = s.o.minHeight ? s.getVal(s.o.minHeight, 'h') : 'auto';
  543. if (!ch) {
  544. if (!dh) {ch = moh;}
  545. else {
  546. if (dh > mh) {ch = mh;}
  547. else if (s.o.minHeight && moh !== 'auto' && dh < moh) {ch = moh;}
  548. else {ch = dh;}
  549. }
  550. }
  551. else {
  552. ch = s.o.autoResize && ch > mh ? mh : ch < moh ? moh : ch;
  553. }
  554.  
  555. // mow = min option width
  556. var mow = s.o.minWidth ? s.getVal(s.o.minWidth, 'w') : 'auto';
  557. if (!cw) {
  558. if (!dw) {cw = mow;}
  559. else {
  560. if (dw > mw) {cw = mw;}
  561. else if (s.o.minWidth && mow !== 'auto' && dw < mow) {cw = mow;}
  562. else {cw = dw;}
  563. }
  564. }
  565. else {
  566. cw = s.o.autoResize && cw > mw ? mw : cw < mow ? mow : cw;
  567. }
  568.  
  569. s.d.container.css({height: ch, width: cw});
  570. s.d.wrap.css({overflow: (dh > ch || dw > cw) ? 'auto' : 'visible'});
  571. s.o.autoPosition && s.setPosition();
  572. },
  573. setPosition: function () {
  574. var s = this, top, left,
  575. hc = (w[0]/2) - (s.d.container.outerHeight(true)/2),
  576. vc = (w[1]/2) - (s.d.container.outerWidth(true)/2);
  577.  
  578. if (s.o.position && Object.prototype.toString.call(s.o.position) === '[object Array]') {
  579. top = s.o.position[0] || hc;
  580. left = s.o.position[1] || vc;
  581. } else {
  582. top = hc;
  583. left = vc;
  584. }
  585. s.d.container.css({left: left, top: top});
  586. },
  587. watchTab: function (e) {
  588. var s = this;
  589.  
  590. if ($(e.target).parents('.simplemodal-container').length > 0) {
  591. // save the list of inputs
  592. s.inputs = $(':input:enabled:visible:first, :input:enabled:visible:last', s.d.data[0]);
  593.  
  594. // if it's the first or last tabbable element, refocus
  595. if ((!e.shiftKey && e.target === s.inputs[s.inputs.length -1]) ||
  596. (e.shiftKey && e.target === s.inputs[0]) ||
  597. s.inputs.length === 0) {
  598. e.preventDefault();
  599. var pos = e.shiftKey ? 'last' : 'first';
  600. s.focus(pos);
  601. }
  602. }
  603. else {
  604. // might be necessary when custom onShow callback is used
  605. e.preventDefault();
  606. s.focus();
  607. }
  608. },
  609. /*
  610. * Open the modal dialog elements
  611. * - Note: If you use the onOpen callback, you must "show" the
  612. * overlay and container elements manually
  613. * (the iframe will be handled by SimpleModal)
  614. */
  615. open: function () {
  616. var s = this;
  617. // display the iframe
  618. s.d.iframe && s.d.iframe.show();
  619.  
  620. if ($.isFunction(s.o.onOpen)) {
  621. // execute the onOpen callback
  622. s.o.onOpen.apply(s, [s.d]);
  623. }
  624. else {
  625. // display the remaining elements
  626. s.d.overlay.show();
  627. s.d.container.show();
  628. s.d.data.show();
  629. }
  630.  
  631. s.o.focus && s.focus();
  632.  
  633. // bind default events
  634. s.bindEvents();
  635. },
  636. /*
  637. * Close the modal dialog
  638. * - Note: If you use an onClose callback, you must remove the
  639. * overlay, container and iframe elements manually
  640. *
  641. * @param {boolean} external Indicates whether the call to this
  642. * function was internal or external. If it was external, the
  643. * onClose callback will be ignored
  644. */
  645. close: function () {
  646. var s = this;
  647.  
  648. // prevent close when dialog does not exist
  649. if (!s.d.data) {
  650. return false;
  651. }
  652.  
  653. // remove the default events
  654. s.unbindEvents();
  655.  
  656. if ($.isFunction(s.o.onClose) && !s.occb) {
  657. // set the onClose callback flag
  658. s.occb = true;
  659.  
  660. // execute the onClose callback
  661. s.o.onClose.apply(s, [s.d]);
  662. }
  663. else {
  664. // if the data came from the DOM, put it back
  665. if (s.d.placeholder) {
  666. var ph = $('#simplemodal-placeholder');
  667. // save changes to the data?
  668. if (s.o.persist) {
  669. // insert the (possibly) modified data back into the DOM
  670. ph.replaceWith(s.d.data.removeClass('simplemodal-data').css('display', s.display));
  671. }
  672. else {
  673. // remove the current and insert the original,
  674. // unmodified data back into the DOM
  675. s.d.data.hide().remove();
  676. ph.replaceWith(s.d.orig);
  677. }
  678. }
  679. else {
  680. // otherwise, remove it
  681. s.d.data.hide().remove();
  682. }
  683.  
  684. // remove the remaining elements
  685. s.d.container.hide().remove();
  686. s.d.overlay.hide();
  687. s.d.iframe && s.d.iframe.hide().remove();
  688. setTimeout(function(){
  689. // opera work-around
  690. s.d.overlay.remove();
  691.  
  692. // reset the dialog object
  693. s.d = {};
  694. }, 10);
  695. }
  696. }
  697. };
  698. })(jQuery);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement