(function (jQuery) { if (!jQuery.isFunction(jQuery.fn.on)) { jQuery.fn.on = function(types, sel, fn) { return this.delegate(sel, types, fn); }; jQuery.fn.off = function(types, sel, fn) { return this.undelegate(sel, types, fn); }; } if (!jQuery.support.transition) jQuery.fn.transition = jQuery.fn.animate; jQuery.fn.emodal = function (method) { // Method calling logic if (jQuery.fn.emodal.methods[method]) { return jQuery.fn.emodal.methods[method].apply(this, Array.prototype.slice.call(arguments, 1)); } else if (typeof method === 'object' || !method) { return jQuery.fn.emodal.methods.init.apply(this, arguments); } else { jQuery.error('Method ' + method + ' does not exist on jQuery.fn.emodal'); } }; jQuery.fn.emodal.methods = { init: function (options) { return this.each(function () { var $this = jQuery(this); var settings = jQuery.extend(true, {}, jQuery.fn.emodal.defaults, $this.data('emodal'), options); if (!$this.parent().is('body')) $this.appendTo('body'); if (!jQuery('#' + settings.overlay.attr.id).length) jQuery('
').attr(settings.overlay.attr).appendTo('body'); jQuery(window).on('resize', function () { if ($this.hasClass('active')) jQuery.fn.emodal.utilities.throttle(setTimeout(function () { $this.emodal('reposition'); }, 25), 500, false); }); $this .data('emodal', settings) .on('emodalBeforeOpen.hide_modal', function (e) { jQuery(this) .css({ visibility: "visible" }) .hide() .addClass(settings.container.active_class); if(!settings.meta.display.stackable) { $this.emodal('close_all'); } }) .on('emodalAfterClose.close_overlay', function (e) { $overlay = jQuery('#' + settings.overlay.attr.id); if ($overlay.length && $overlay.is(":visible")) { $overlay.fadeOut(settings.close.close_speed); } }) .on('emodalAfterClose.reset_videos', function (e) { jQuery('iframe', $this).filter('[src*="youtube"],[src*="vimeo"]').each(function () { var src = jQuery(this).attr('src'); jQuery(this).attr('src', '').attr('src', src); }); }) .on('emodalBeforeOpen.setup_close', function () { $this.emodal('setup_close'); }) .on('emodalBeforeOpen.retheme', function () { $this.emodal('retheme'); }) .on('emodalBeforeOpen.reposition', function () { $this.emodal('reposition'); }) .trigger('emodalInit'); return this; }); }, setup_close: function () { var $this = jQuery(this), settings = $this.data('emodal'), $overlay = jQuery('#' + settings.overlay.attr.id), $close = jQuery('.' + settings.close.attr.class, $this); $close .off('click.emodal') .on("click.emodal", function (e) { e.preventDefault(); e.stopPropagation(); $this.emodal('close'); }); if (settings.meta.close.esc_press) jQuery(window) .off('keyup.emodal') .on('keyup.emodal', function (e) { if (e.keyCode == 27) $this.emodal('close'); }); if (settings.meta.close.overlay_click) $overlay .off('click.emodal') .on('click.emodal', function (e) { e.preventDefault(); e.stopPropagation(); $this.emodal('close'); }); $this .on('emodalAfterClose', function () { jQuery(window).off('keyup.emodal'); $overlay.off('click.emodal'); $close.off('click.emodal'); }) .trigger('emodalSetupClose'); }, open: function (callback) { var $this = jQuery(this); var settings = $this.data('emodal'); $this .trigger('emodalBeforeOpen') .emodal('animate', settings.meta.display.animation.type, function() { $this.trigger('emodalAfterOpen'); if(callback !== undefined) callback(); }); return this; }, close: function () { return this.each(function () { var $this = jQuery(this), settings = $this.data('emodal'); $this .trigger('emodalBeforeClose') .removeClass('active') .fadeOut(settings.close.close_speed, function () { $this.trigger('emodalAfterClose'); }); return this; }); }, close_all: function () { var settings = jQuery(this).data('emodal'); jQuery('.' + settings.container.attr.class).removeClass('active').hide(0); return this; }, reposition: function (callback) { var $this = jQuery(this); $this.trigger('emodalBeforeReposition'); var settings = $this.data('emodal'); var location = settings.meta.display.location; var position = settings.meta.display.position; var reposition = { my: "", at: "" }; if (location.indexOf('left') >= 0) reposition = { my: reposition.my + " left" + (position.left !== 0 ? "+" + position.left : ""), at: reposition.at + " left" }; if (location.indexOf('right') >= 0) reposition = { my: reposition.my + " right" + (position.right !== 0 ? "-" + position.right : ""), at: reposition.at + " right" }; if (location.indexOf('center') >= 0) { if (location == 'center') reposition = { my: "center", at: "center" }; else reposition = { my: reposition.my + " center", at: reposition.at + " center" }; } if (location.indexOf('top') >= 0) reposition = { my: reposition.my + " top" + (position.top !== 0 ? "+" + position.top : ""), at: reposition.at + " top" }; if (location.indexOf('bottom') >= 0) reposition = { my: reposition.my + " bottom" + (position.bottom !== 0 ? "-" + position.bottom : ""), at: reposition.at + " bottom" }; reposition.my = jQuery.trim(reposition.my); reposition.at = jQuery.trim(reposition.at); reposition.of = window; reposition.collision = 'fit'; reposition.using = typeof (callback) == "function" ? callback : jQuery.fn.emodal.callbacks.reposition_using; var opacity = false; if ($this.is(':hidden')) { opacity = $this.css("opacity"); $this.css({ opacity: 0 }).show(); } if (position.fixed) $this.addClass('fixed'); else $this.removeClass('fixed'); if (settings.meta.display.size == 'custom') { $this.css({ width: settings.meta.display.custom_width + settings.meta.display.custom_width_unit, height: settings.meta.display.custom_height_auto ? 'auto' : settings.meta.display.custom_height + settings.meta.display.custom_height_unit }); } $this .addClass('custom-position') .position(reposition) .trigger('emodalAfterReposition'); if (opacity) { $this.css({ opacity: opacity }).hide(); } return this; }, retheme: function (theme) { var $this = jQuery(this); $this.trigger('emodalBeforeRetheme'); var settings = $this.data('emodal'), $overlay = jQuery('#' + settings.overlay.attr.id), $container = $this, $title = jQuery('> .' + settings.title.attr.class, $container), $content = jQuery('> .' + settings.content.attr.class, $container), $close = jQuery('> .' + settings.close.attr.class, $container); if (theme === undefined) { theme = jQuery.fn.emodal.themes[settings.theme_id]; if (theme === undefined) { theme = jQuery.fn.emodal.themes[1]; } } $overlay.removeAttr('style').css({ backgroundColor: jQuery.fn.emodal.utilities.convert_hex(theme.overlay.background.color, theme.overlay.background.opacity) }); var container_inset = theme.container.boxshadow.inset == 'yes' ? 'inset ' : ''; $container.css({ padding: theme.container.padding + 'px', backgroundColor: jQuery.fn.emodal.utilities.convert_hex(theme.container.background.color, theme.container.background.opacity), borderStyle: theme.container.border.style, borderColor: theme.container.border.color, borderWidth: theme.container.border.width + 'px', borderRadius: theme.container.border.radius + 'px', boxShadow: container_inset + theme.container.boxshadow.horizontal + 'px ' + theme.container.boxshadow.vertical + 'px ' + theme.container.boxshadow.blur + 'px ' + theme.container.boxshadow.spread + 'px ' + jQuery.fn.emodal.utilities.convert_hex(theme.container.boxshadow.color, theme.container.boxshadow.opacity) }); $title.css({ color: theme.title.font.color, fontSize: theme.title.font.size + 'px', fontFamily: theme.title.font.family, textAlign: theme.title.text.align, textShadow: theme.title.textshadow.horizontal + 'px ' + theme.title.textshadow.vertical + 'px ' + theme.title.textshadow.blur + 'px ' + jQuery.fn.emodal.utilities.convert_hex(theme.title.textshadow.color, theme.title.textshadow.opacity) }); $content.css({ color: theme.content.font.color, //fontSize: theme.content.font.size+'px', fontFamily: theme.content.font.family }); jQuery('p, label', $content).css({ color: theme.content.font.color, //fontSize: theme.content.font.size+'px', fontFamily: theme.content.font.family }); var close_inset = theme.close.boxshadow.inset == 'yes' ? 'inset ' : ''; $close.html(theme.close.text).css({ padding: theme.close.padding + 'px', backgroundColor: jQuery.fn.emodal.utilities.convert_hex(theme.close.background.color, theme.close.background.opacity), color: theme.close.font.color, fontSize: theme.close.font.size + 'px', fontFamily: theme.close.font.family, borderStyle: theme.close.border.style, borderColor: theme.close.border.color, borderWidth: theme.close.border.width + 'px', borderRadius: theme.close.border.radius + 'px', boxShadow: close_inset + theme.close.boxshadow.horizontal + 'px ' + theme.close.boxshadow.vertical + 'px ' + theme.close.boxshadow.blur + 'px ' + theme.close.boxshadow.spread + 'px ' + jQuery.fn.emodal.utilities.convert_hex(theme.close.boxshadow.color, theme.close.boxshadow.opacity), textShadow: theme.close.textshadow.horizontal + 'px ' + theme.close.textshadow.vertical + 'px ' + theme.close.textshadow.blur + 'px ' + jQuery.fn.emodal.utilities.convert_hex(theme.close.textshadow.color, theme.close.textshadow.opacity) }); switch (theme.close.location) { case "topleft": $close.css({ top: theme.close.position.top + 'px', left: theme.close.position.left + 'px' }); break; case "topright": $close.css({ top: theme.close.position.top + 'px', right: theme.close.position.right + 'px' }); break; case "bottomleft": $close.css({ bottom: theme.close.position.bottom + 'px', left: theme.close.position.left + 'px' }); break; case "bottomright": $close.css({ bottom: theme.close.position.bottom + 'px', right: theme.close.position.right + 'px' }); break; } $this.trigger('emodalAfterRetheme', [theme]); return this; }, animate_overlay: function (style, duration, callback) { // Method calling logic var $this = jQuery(this); var settings = $this.data('emodal'); if(settings.meta.display.overlay_disabled) { callback(); } else { if (jQuery.fn.emodal.overlay_animations[style]) return jQuery.fn.emodal.overlay_animations[style].apply(this, Array.prototype.slice.call(arguments, 1)); else jQuery.error('Animation style ' + jQuery.fn.emodal.overlay_animations + ' does not exist.'); } return this; }, animate: function (style, callback) { // Method calling logic if (jQuery.fn.emodal.animations[style]) return jQuery.fn.emodal.animations[style].apply(this, Array.prototype.slice.call(arguments, 1)); else jQuery.error('Animation style ' + jQuery.fn.emodal.animations + ' does not exist.'); return this; } }; jQuery.fn.emodal.callbacks = { reposition_using: function (position) { jQuery(this).css(position); } }; jQuery.fn.emodal.utilities = { convert_hex: function (hex, opacity) { hex = hex.replace('#', ''); r = parseInt(hex.substring(0, 2), 16); g = parseInt(hex.substring(2, 4), 16); b = parseInt(hex.substring(4, 6), 16); result = 'rgba(' + r + ',' + g + ',' + b + ',' + opacity / 100 + ')'; return result; }, debounce: function (callback, threshold) { var timeout; return function() { var context = this, params = arguments; window.clearTimeout(timeout); timeout = window.setTimeout(function() { callback.apply(context, params); }, threshold); }; }, throttle: function (callback, threshold) { var suppress = false; var clear = function() { suppress = false; }; return function() { if (!suppress) { callback.apply(this, arguments); window.setTimeout(clear, threshold); suppress = true; }; } } }; // Deprecated fix. utilies was renamed because of typo. jQuery.fn.emodal.utilies = jQuery.fn.emodal.utilities; jQuery.fn.emodal.defaults = { meta: { display: { stackable: 0, overlay_disabled: 0, size: 'medium', custom_width: '', custom_width_unit: '%', custom_height: '', custom_height_unit: 'em', custom_height_auto: 1, location: 'center top', position: { top: 100, left: 0, bottom: 0, right: 0, fixed: 0 }, animation: { type: 'fade', speed: 350, origin: 'center top' } }, close: { overlay_click: 0, esc_press: 1 } }, container: { active_class: 'active', attr: { class: "emodal" } }, title: { attr: { class: "emodal-title" } }, content: { attr: { class: "emodal-content" } }, close: { close_speed: 0, attr: { class: "emodal-close" } }, overlay: { attr: { id: "emodal-overlay", class: "emodal-overlay" } } }; jQuery.fn.emodal.themes = emodal_themes; jQuery.fn.emodal.overlay_animations = { none: function (duration, callback) { var $this = jQuery(this); var settings = $this.data('emodal'); jQuery('#' + settings.overlay.attr.id).show(duration, callback); }, fade: function (duration, callback) { var $this = jQuery(this); var settings = $this.data('emodal'); jQuery('#' + settings.overlay.attr.id).fadeIn(duration, callback); }, slide: function (duration, callback) { var $this = jQuery(this); var settings = $this.data('emodal'); jQuery('#' + settings.overlay.attr.id).slideDown(duration, callback); } }; jQuery.fn.emodal.animations = { none: function (callback) { var $this = jQuery(this); var settings = $this.data('emodal'); $this.emodal('animate_overlay', 'none', 0, function(){ $this.show(); if(callback !== undefined) callback(); }); return this; }, slide: function (callback) { var $this = jQuery(this).show(0).css({ opacity: 0 }); var settings = $this.data('emodal'); var speed = settings.meta.display.animation.speed; var origin = settings.meta.display.animation.origin; var start = { my: "", at: "" }; switch (origin) { case 'top': start = { my: "left+" + $this.offset().left + " bottom", at: "left top" }; break; case 'bottom': start = { my: "left+" + $this.offset().left + " top", at: "left bottom" }; break; case 'left': start = { my: "right top+" + $this.offset().top, at: "left top" }; break; case 'right': start = { my: "left top+" + $this.offset().top, at: "right top" }; break; default: if (origin.indexOf('left') >= 0) start = { my: start.my + " right", at: start.at + " left" }; if (origin.indexOf('right') >= 0) start = { my: start.my + " left", at: start.at + " right" }; if (origin.indexOf('center') >= 0) start = { my: start.my + " center", at: start.at + " center" }; if (origin.indexOf('top') >= 0) start = { my: start.my + " bottom", at: start.at + " top" }; if (origin.indexOf('bottom') >= 0) start = { my: start.my + " top", at: start.at + " bottom" }; start.my = jQuery.trim(start.my); start.at = jQuery.trim(start.at); break; } start.of = window; start.collision = 'none'; jQuery('html').css('overflow-x', 'hidden'); $this.position(start).css({ opacity: 1 }); $this.emodal('animate_overlay', 'fade', speed * 0.25, function () { $this.emodal('reposition', function (position) { position.opacity = 1; $this.transition(position, speed * 0.75, function () { jQuery('html').css('overflow-x', 'inherit'); if(callback !== undefined) callback(); }); }); }); return this; }, fade: function (callback) { var $this = jQuery(this); var settings = $this.data('emodal'); var speed = settings.meta.display.animation.speed / 2; $this.emodal('animate_overlay', 'fade', speed, function () { $this.fadeIn(speed, function(){ if(callback !== undefined) callback(); }); }); return this; }, fadeAndSlide: function (callback) { var $this = jQuery(this).show(0).css({ opacity: 0 }); var settings = $this.data('emodal'); var speed = settings.meta.display.animation.speed; var origin = settings.meta.display.animation.origin; var start = { my: "", at: "" }; switch (origin) { case 'top': start = { my: "left+" + $this.offset().left + " bottom", at: "left top" }; break; case 'bottom': start = { my: "left+" + $this.offset().left + " top", at: "left bottom" }; break; case 'left': start = { my: "right top+" + $this.offset().top, at: "left top" }; break; case 'right': start = { my: "left top+" + $this.offset().top, at: "right top" }; break; default: if (origin.indexOf('left') >= 0) start = { my: start.my + " right", at: start.at + " left" }; if (origin.indexOf('right') >= 0) start = { my: start.my + " left", at: start.at + " right" }; if (origin.indexOf('center') >= 0) start = { my: start.my + " center", at: start.at + " center" }; if (origin.indexOf('top') >= 0) start = { my: start.my + " bottom", at: start.at + " top" }; if (origin.indexOf('bottom') >= 0) start = { my: start.my + " top", at: start.at + " bottom" }; start.my = jQuery.trim(start.my); start.at = jQuery.trim(start.at); break; } start.of = window; start.collision = 'none'; jQuery('html').css('overflow-x', 'hidden'); $this.position(start); $this.emodal('animate_overlay', 'fade', speed * 0.25, function () { $this.emodal('reposition', function (position) { position.opacity = 1; $this.transition(position, speed * 0.75, function () { jQuery('html').css('overflow-x', 'inherit'); if(callback !== undefined) callback(); }); }); }); return this; }, grow: function (callback) { var $this = jQuery(this); var settings = $this.data('emodal'); var speed = settings.meta.display.animation.speed; var origin = settings.meta.display.animation.origin; // Set css for animation start. $this.css({ transformOrigin: origin, opacity: 0 }).show(); // Begin Animation with overlay fade in then grow animation. $this.emodal('animate_overlay', 'fade', speed * 0.25, function () { // Reposition with callback. position returns default positioning. $this.emodal('reposition', function (position) { position.scale = 1; position.duration = speed * 0.75; $this .css({ scale: 0, opacity: 1 }) .transition(position); if(callback !== undefined) callback(); }); }); return this; }, growAndSlide: function (callback) { var $this = jQuery(this).css({ opacity: 0 }).show(); var settings = $this.data('emodal'); var speed = settings.meta.display.animation.speed; var origin = settings.meta.display.animation.origin; var start = { my: "", at: "" }; switch (origin) { case 'top': start = { my: "left+" + $this.offset().left + " bottom", at: "left top" }; break; case 'bottom': start = { my: "left+" + $this.offset().left + " top", at: "left bottom" }; break; case 'left': start = { my: "right top+" + $this.offset().top, at: "left top" }; break; case 'right': start = { my: "left top+" + $this.offset().top, at: "right top" }; break; default: if (origin.indexOf('left') >= 0) start = { my: start.my + " right", at: start.at + " left" }; if (origin.indexOf('right') >= 0) start = { my: start.my + " left", at: start.at + " right" }; if (origin.indexOf('center') >= 0) start = { my: start.my + " center", at: start.at + " center" }; if (origin.indexOf('top') >= 0) start = { my: start.my + " bottom", at: start.at + " top" }; if (origin.indexOf('bottom') >= 0) start = { my: start.my + " top", at: start.at + " bottom" }; start.my = jQuery.trim(start.my); start.at = jQuery.trim(start.at); break; } start.of = window; start.collision = 'none'; jQuery('html').css('overflow-x', 'hidden'); $this.position(start) .css({ opacity: origin == 'center center' ? 0 : 1, transformOrigin: origin }); $this.emodal('animate_overlay', 'fade', speed * 0.25, function () { $this.emodal('reposition', function (position) { position.scale = 1; position.opacity = 1; position.duration = speed * 0.75; $this.css({ scale: 0 }) .transition(position, function () { jQuery('html').css('overflow-x', 'inherit'); }); if(callback !== undefined) callback(); }); }); return this; } }; jQuery('.emodal').css({ visibility: "visible" }).hide(); jQuery(document).ready(function () { jQuery('.emodal') .emodal() .each(function () { var $this = jQuery(this); jQuery(document).on('click', '.' + $this.attr('id'), function (e) { e.preventDefault(); e.stopPropagation(); $this.emodal('open'); }); jQuery('.' + $this.attr('id')).css('cursor', 'pointer'); }); }); }(jQuery));