123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- /*
- A simple jQuery modal
- Version 0.5.5
- www.198zone.com
- */
- (function($) {
- var current = null;
- $.modal = function(el, options) {
- $.modal.close(); // Close any open modals.
- var remove, target;
- this.$body = $('body');
- this.options = $.extend({}, $.modal.defaults, options);
- this.options.doFade = !isNaN(parseInt(this.options.fadeDuration, 10));
- if (el.is('a')) {
- target = el.attr('href');
- //Select element by id from href
- if (/^#/.test(target)) {
- this.$elm = $(target);
- if (this.$elm.length !== 1) return null;
- this.open();
- //AJAX
- } else {
- this.$elm = $('<div>');
- this.$body.append(this.$elm);
- remove = function(event, modal) { modal.elm.remove(); };
- this.showSpinner();
- el.trigger($.modal.AJAX_SEND);
- $.get(target).done(function(html) {
- if (!current) return;
- el.trigger($.modal.AJAX_SUCCESS);
- current.$elm.empty().append(html).on($.modal.CLOSE, remove);
- current.hideSpinner();
- current.open();
- el.trigger($.modal.AJAX_COMPLETE);
- }).fail(function() {
- el.trigger($.modal.AJAX_FAIL);
- current.hideSpinner();
- el.trigger($.modal.AJAX_COMPLETE);
- });
- }
- } else {
- this.$elm = el;
- this.open();
- }
- };
- $.modal.prototype = {
- constructor: $.modal,
- open: function() {
- var m = this;
- if(this.options.doFade) {
- this.block();
- setTimeout(function() {
- m.show();
- }, this.options.fadeDuration * this.options.fadeDelay);
- } else {
- this.block();
- this.show();
- }
- if (this.options.escapeClose) {
- $(document).on('keydown.modal', function(event) {
- if (event.which == 27) $.modal.close();
- });
- }
- if (this.options.clickClose) this.blocker.click($.modal.close);
- },
- close: function() {
- this.unblock();
- this.hide();
- $(document).off('keydown.modal');
- },
- block: function() {
- var initialOpacity = this.options.doFade ? 0 : this.options.opacity;
- this.$elm.trigger($.modal.BEFORE_BLOCK, [this._ctx()]);
- this.blocker = $('<div class="jquery-modal blocker"></div>').css({
- top: 0, right: 0, bottom: 0, left: 0,
- width: "100%", height: "100%",
- position: "fixed",
- zIndex: this.options.zIndex,
- background: this.options.overlay,
- opacity: initialOpacity
- });
- this.$body.append(this.blocker);
- if(this.options.doFade) {
- this.blocker.animate({opacity: this.options.opacity}, this.options.fadeDuration);
- }
- this.$elm.trigger($.modal.BLOCK, [this._ctx()]);
- },
- unblock: function() {
- if(this.options.doFade) {
- this.blocker.fadeOut(this.options.fadeDuration, function() {
- $(this).remove();
- });
- } else {
- this.blocker.remove();
- }
- },
- show: function() {
- this.$elm.trigger($.modal.BEFORE_OPEN, [this._ctx()]);
- if (this.options.showClose) {
- this.closeButton = $('<a href="#close-modal" rel="modal:close" class="close-modal ' + this.options.closeClass + '">' + this.options.closeText + '</a>');
- this.$elm.append(this.closeButton);
- }
- this.$elm.addClass(this.options.modalClass + ' current');
- this.center();
- if(this.options.doFade) {
- this.$elm.fadeIn(this.options.fadeDuration);
- } else {
- this.$elm.show();
- }
- this.$elm.trigger($.modal.OPEN, [this._ctx()]);
- },
- hide: function() {
- this.$elm.trigger($.modal.BEFORE_CLOSE, [this._ctx()]);
- if (this.closeButton) this.closeButton.remove();
- this.$elm.removeClass('current');
- if(this.options.doFade) {
- this.$elm.fadeOut(this.options.fadeDuration);
- } else {
- this.$elm.hide();
- }
- this.$elm.trigger($.modal.CLOSE, [this._ctx()]);
- },
- showSpinner: function() {
- if (!this.options.showSpinner) return;
- this.spinner = this.spinner || $('<div class="' + this.options.modalClass + '-spinner"></div>')
- .append(this.options.spinnerHtml);
- this.$body.append(this.spinner);
- this.spinner.show();
- },
- hideSpinner: function() {
- if (this.spinner) this.spinner.remove();
- },
- center: function() {
- this.$elm.css({
- position: 'fixed',
- top: "50%",
- left: "50%",
- marginTop: - (this.$elm.outerHeight() / 2),
- marginLeft: - (this.$elm.outerWidth() / 2),
- zIndex: this.options.zIndex + 1
- });
- },
- //Return context for custom events
- _ctx: function() {
- return { elm: this.$elm, blocker: this.blocker, options: this.options };
- }
- };
- //resize is alias for center for now
- $.modal.prototype.resize = $.modal.prototype.center;
- $.modal.close = function(event) {
- if (!current) return;
- if (event) event.preventDefault();
- current.close();
- var that = current.$elm;
- current = null;
- return that;
- };
- $.modal.resize = function() {
- if (!current) return;
- current.resize();
- };
- // Returns if there currently is an active modal
- $.modal.isActive = function () {
- return current ? true : false;
- }
- $.modal.defaults = {
- overlay: "#000",
- opacity: 0.75,
- zIndex: 1,
- escapeClose: true,
- clickClose: true,
- closeText: 'Close',
- closeClass: '',
- modalClass: "modal",
- spinnerHtml: null,
- showSpinner: true,
- showClose: true,
- fadeDuration: null, // Number of milliseconds the fade animation takes.
- fadeDelay: 1.0 // Point during the overlay's fade-in that the modal begins to fade in (.5 = 50%, 1.5 = 150%, etc.)
- };
- // Event constants
- $.modal.BEFORE_BLOCK = 'modal:before-block';
- $.modal.BLOCK = 'modal:block';
- $.modal.BEFORE_OPEN = 'modal:before-open';
- $.modal.OPEN = 'modal:open';
- $.modal.BEFORE_CLOSE = 'modal:before-close';
- $.modal.CLOSE = 'modal:close';
- $.modal.AJAX_SEND = 'modal:ajax:send';
- $.modal.AJAX_SUCCESS = 'modal:ajax:success';
- $.modal.AJAX_FAIL = 'modal:ajax:fail';
- $.modal.AJAX_COMPLETE = 'modal:ajax:complete';
- $.fn.modal = function(options){
- if (this.length === 1) {
- current = new $.modal(this, options);
- }
- return this;
- };
- // Automatically bind links with rel="modal:close" to, well, close the modal.
- $(document).on('click.modal', 'a[rel="modal:close"]', $.modal.close);
- $(document).on('click.modal', 'a[rel="modal:open"]', function(event) {
- event.preventDefault();
- $(this).modal();
- });
- })(jQuery);
|