var esPhinx, Flyweight; (function($, $module) { "use strict"; var visible, minimized = []; $module.extend({ panels: {modal: {}} }); $.Extender.extend($module.panels.modal, true, { hide: function(animation) { visible.hide(animation); }, close: function() { visible.close(); }, // functions are constructors in js new: function(options) { var _windowController, progress, modal, mask, section, loadingContainer, main, closeButton, hideButton, headers, URLParameters, instance, timesUp, calledback, ready, readyToShow, instanceShowWasCalled, self = this, ConstructorReference = $module.panels.modal.new, body = $("body"), _classes = options.class || options.classes, isMinimized = function() { var index = minimized.indexOfEquivalence(this); if (index) { return index; } return false; }, addToMinimized = function() { if (!isMinimized.call(this)) { minimized.push(this); } }, removeFromMinimized = function() { var index = isMinimized.call(this); if (index) { minimized.delete(index); } }, maskTransitionDuration = function(mask) { return parseFloat(mask .css("transition-duration")) * 1000; }, restartTransition = function(mask) { mask.css("transition", "opacity 0s"); }, resolveArguments = function() { options = options || {}; if (typeof options.windowController != "boolean") { _windowController = true; } else { _windowController = options.windowController; } if (typeof options.closeButton != "boolean") { options.closeButton = true; } if (options.content) { options.url = false; } }, create = function() { modal = $("
") .addClass("esphinx ui modal"); if (_classes) { modal.addClass(_classes); } section = $("
").addClass("hidden"); mask = $("
").addClass("fixed transparent mask"); main = $("
").addClass("main"); loadingContainer = $("
") .addClass("main loading"); section.append(loadingContainer); modal.append(mask).append(section); body.append(modal); if (options.timeout) { window.setTimeout(function() { if (options.timesUp && typeof options.timesUp == "function" && !ready) { timesUp = true; options.timesUp.call(self); } }, options.timeout * 1000); } observers(section, options); if (options.url) { headers = options.header || options.headers || null; URLParameters = options.param || options.URLParameters || null; $.Ajax.new(options.url).get({ URLParameters: URLParameters, headers: headers, progress: function() { if (options.loading) { if (!calledback) { calledback = true; options.loading .call(self); } } }, success: function(r) { hide.call(self, false); main.html(r); } }); } else { if (options.loading) { options.loading.call(self); } hide.call(self, false); main.html(options.content); } }, bindHeaderEventListeners = function() { if (closeButton) { closeButton.on("click", function() { close.call(self); }); } hideButton.on("click", function() { hide.call(self); }); }, prependHeaderActions = function(section, options) { var header = section.find("header"), actions; if ((_windowController || timesUp) && !header.count()) { header = $("
"); actions = $("
").addClass("actions"); hideButton = $('') .addClass("hide-button"); header.append(actions); if (options.closeButton || timesUp) { closeButton = $('') .addClass("close-button"); actions.append(closeButton); } if (!timesUp) { actions.append(hideButton); } section.prepend(header) .css({ "max-height": $(window.document).height(), "max-width": $(window.document).width() }); bindHeaderEventListeners(); } }, show = function() { $.Promise.new({ onAccomplish: function() { modal.css("z-index", 0); if (options.fadeIn) { restartTransition(mask); mask.css("transition", "opacity " + options.fadeIn); } mask.removeClass("transparent"); section.show(); visible = self; removeFromMinimized.call(this); } }, function(_accomplish) { if (readyToShow) { _accomplish(); } }); }, // hide = function(animation = true) { hide = function(animation) { if (typeof animation != "boolean") { animation = true; } section.hide(); restartTransition(mask); if (animation) { if (options.fadeOut) { mask.css("transition", "opacity " + options.fadeOut); modal.css("z-index", -1, maskTransitionDuration(mask)); } } mask.addClass("transparent"); addToMinimized.call(this); }, close = function() { section.hide(); restartTransition(mask); if (options.fadeOut) { mask.css("transition", "opacity " + options.fadeOut); } mask.addClass("transparent"); modal.remove(maskTransitionDuration(mask)); self.deleteSingleton(); }, observers = function(section, options) { var loadingContainerObserver, count = 0, callback = function(img) { $(img).on("load", function() { count += 1; }); }, sectionObserveBlock = function() { var imgs = section.find("img"); if (imgs.some()) { imgs.each(callback); $.Promise.new({ onAccomplish: function() { section.centralizeAt(window.document); if (progress || progress === undefined) { readyToShow = true; show.call(self); } } }, function(_accomplish) { if (count == imgs.length || timesUp) { _accomplish(); } }); } else { prependHeaderActions(section, options); section.centralizeAt(window.document); readyToShow = true; if (options.complete && !progress) { options.complete.call(self); } } }, mainObserveBlock = function() { var imgs, count = 0, callback = function(img) { $(img).on("load", function() { count += 1; }); }; loadingContainerObserver = this; imgs = main.find("img"); if (imgs.some()) { imgs.each(callback); $.Promise.new({ onAccomplish: function() { progress = false; hide.call(self, false); if (!timesUp) { section.html(main); } prependHeaderActions(section, options); section.centralizeAt(window.document); ready = true; readyToShow = true; if (instanceShowWasCalled) { show.call(self); } if (options.complete) { options.complete.call(self); } } }, function(_accomplish) { progress = true; if (count == imgs.length || timesUp) { _accomplish(); } }); // doesn't have imgs } else { progress = false; hide.call(self, false); if (!timesUp) { section.html(main); } prependHeaderActions(section, options); section.centralizeAt(window.document); ready = true; readyToShow = true; } this.disconnect(); }; section.observe(sectionObserveBlock); main.observe(mainObserveBlock); }; resolveArguments(); if (!(this instanceof ConstructorReference)) { // debugger // if (!ConstructorReference.instance) { // return ConstructorReference.functionalSingleton(arguments); // } else if (isMinimized.call(ConstructorReference.instance)) { // ConstructorReference.instance.show(); // } instance = Flyweight.Factory.exists(ConstructorReference, arguments); if (!instance) { return Flyweight.Factory.new(ConstructorReference, arguments); } else if (isMinimized.call(instance)) { self = instance; show.call(self); } } else { // global scope (public) // this.hide = function(animation = true) { this.hide = function(animation) { if (typeof animation != "boolean") { animation = true; } hide.call(self, animation); return self; }; this.show = function() { show.call(self); instanceShowWasCalled = true; return self; }; this.close = function() { close.call(self); return self; }; this.content = function(content) { var node = $(content); if (!node.some()) { node = window.document.createTextNode(content); } hide.call(self, false); loadingContainer.html(node); return self; }; create(); } return self; } }); }(esPhinx, esPhinx.ui));