/* A simple jQuery modal (http://github.com/kylefox/jquery-modal) Version 0.5 */ (function($) { var current = null; $.modal = function(el, options) { var remove, target; this.$body = $('body'); this.options = $.extend({}, $.modal.defaults, options); 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 = $('
'); 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() { 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() { this.$elm.trigger($.modal.BEFORE_BLOCK, [this._ctx()]); this.blocker = $('
').css({ top: 0, right: 0, bottom: 0, left: 0, width: "100%", height: "100%", position: "fixed", zIndex: this.options.zIndex, background: this.options.overlay, opacity: this.options.opacity }); this.$body.append(this.blocker); this.$elm.trigger($.modal.BLOCK, [this._ctx()]); }, unblock: function() { this.blocker.remove(); }, show: function() { this.$elm.trigger($.modal.BEFORE_OPEN, [this._ctx()]); if (this.options.showClose) { this.closeButton = $('' + this.options.closeText + ''); this.$elm.append(this.closeButton); } this.$elm.addClass(this.options.modalClass + ' current'); this.center(); this.$elm.show().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').hide(); this.$elm.trigger($.modal.CLOSE, [this._ctx()]); }, showSpinner: function() { if (!this.options.showSpinner) return; this.spinner = this.spinner || $('
') .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(); current = null; }; $.modal.showSpinner = function(event) { if (!current) return; if (event) event.preventDefault(); current.showSpinner(); } $.modal.hideSpinner = function(event) { if (!current) return; if (event) event.preventDefault(); current.hideSpinner(); } $.modal.getWidget = function() { if (!current) return null; else return current.$elm; } $.modal.resize = function() { if (!current) return; current.resize(); }; $.modal.defaults = { overlay: "#000", opacity: 0.75, zIndex: 1, escapeClose: true, clickClose: true, closeText: 'Close', modalClass: "modal", spinnerHtml: null, showSpinner: true, showClose: true }; // 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', 'a[rel="modal:close"]', $.modal.close); $(document).on('click', 'a[rel="modal:open"]', function(event) { event.preventDefault(); $(this).modal(); }); // Automatically bind links with rel="modal:open:ajaxpost" to $(document).on('click', 'a[rel="modal:open:ajaxpost"]', function(event) { //ensure that our custom events will be received event.preventDefault(); // show the dialog $(this).modal(); // bind the event when the ajax call is completed $(this).bind($.modal.AJAX_COMPLETE, function() { // configure the submit handler $('form').submit(function(){ // save the current form current_form = $(this); // show the spinner again $.modal.showSpinner(); // send the ajax call $.ajax({ type: this.method, url: this.action + '.json', data: $(this).serialize(), dataType: 'html', success: function(data) { // hide the sinner $.modal.hideSpinner(); // close the dialog $.modal.close(); }, error: function(data) { // hide the sinner $.modal.hideSpinner(); // remove the older error message current_form.find(".error").remove() // parse the result var obj = jQuery.parseJSON(data.responseText); $.each(obj.errors, function(key, value) { current_form.find("#"+ current_form.attr("id").split('_').pop()+ "_" + key).after(''+ value[0] + ''); }); } }); return false; }); }); // return false to prevent normal anchor action return false; }); })(jQuery);