/** * version 1.1.0 * upgrades * - fade animation on open and close * - open method. can open modal without binding link * - possible to open modal with "POST". nessecary when need to send large amount of data to modal */ (function ($) { $.modalLinkDefaults = { height: 600, width: 900, showTitle: true, showClose: true, overlayOpacity: 0.6, method: "GET", // GET, POST, REF, CLONE disableScroll: true, onHideScroll: function () { }, onShowScroll: function () { } }; function hideBodyScroll(cb) { var w = $("body").outerWidth(); $("body").css({ overflow: "hidden" }); var w2 = $("body").outerWidth(); $("body").css({ width: w }); if (typeof cb == "function") { var scrollbarWidth = w2 - w; cb(scrollbarWidth); } } function showBodyScroll(cb) { var $body = $("body"); var w = $body.outerWidth(); $body.css({ width: '', overflow: '' }); var w2 = $body.outerWidth(); if (typeof cb == "function") { var scrollbarWidth = w - w2; cb(scrollbarWidth); } } /** * Helper method for appending parameter to url */ function addUrlParam(url, name, value) { return appendUrl(url, name + "=" + value); } /** * Hepler method for appending querystring to url */ function appendUrl(url, data) { return url + (url.indexOf("?") < 0 ? "?" : "&") + data; } function buildOptions(option) { } function resolveBooleanValue($link) { for (var i = 1; i < arguments.length; i++) { var val = arguments[i]; if (typeof val == "boolean") { return val; } if (typeof val == "string") { var attrValue = $link.attr(val); if (attrValue) { if (attrValue.toLowerCase() === "true") { return true; } if (attrValue.toLowerCase() === "false") { return false; } } } } } var methods = { init: function (options) { var settings = $.extend({}, $.modalLinkDefaults); $.extend(settings, options); return this.each(function () { var $link = $(this); // already bound if ($link.hasClass("sparkling-modal-link")) return; // mark as bound $link.addClass("sparkling-modal-link"); $link.click(function (e) { e.preventDefault(); methods.open($link, settings); return false; }); }); }, close: function (cb) { var $container = $(".sparkling-modal-container"); var $link = $container.data("modallink"); if (!$link) { return; } $link.trigger("modallink.close"); var $overlay = $container.find(".sparkling-modal-overlay"); var $content = $container.find(".sparkling-modal-frame"); $overlay.fadeTo("fast", 0); $content.fadeTo("fast", 0, function () { $container.remove(); showBodyScroll(cb); if (typeof cb == "function") { cb(); } }); }, open: function ($link, options) { options = options || {}; var url, title, showTitle, showClose, disableScroll; url = options.url || $link.attr("href"); title = options.title || $link.attr("data-ml-title") || $link.attr("title") || $link.text(); showTitle = resolveBooleanValue($link, options.showTitle, "data-ml-show-title", $.modalLinkDefaults.showTitle); showClose = resolveBooleanValue($link, options.showClose, "data-ml-show-close", $.modalLinkDefaults.showClose); disableScroll = resolveBooleanValue($link, options.disableScroll, "data-ml-disable-scroll", $.modalLinkDefaults.disableScroll); var settings = $.extend({}, $.modalLinkDefaults); $.extend(settings, options); var dataWidth = $link.attr("data-ml-width"); if (dataWidth) { settings.width = parseInt(dataWidth); } var dataHeight = $link.attr("data-ml-height"); if (dataHeight) { settings.height = parseInt(dataHeight); } if (settings.method !== "CLONE" && url.length > 0 && url[0] === "#") { settings.method = "REF"; } if (settings.method == "GET" || settings.method == "POST") { url = addUrlParam(url, "__inmodal", "true"); } var data = {}; if (typeof settings.data != 'undefined') { if (typeof settings.data == "function") { data = settings.data(); } else { data = settings.data; } } var $container = $("
"); $container.data("modallink", $link); var $overlay = $(""); $overlay.css({ position: 'fixed', top: 0, left: 0, opacity: 0, width: '100%', height: '100%', zIndex: 999 }); $overlay.appendTo($container); var $content = $("") .css("opacity", 0) .css({ zIndex: 1000, position: 'fixed', display: 'inline-block' }) .css({ left: '50%', marginLeft: -settings.width / 2 }) .css({ top: '50%', marginTop: -settings.height / 2 }) .appendTo($container); $("body").append($container); if (showTitle) { var $title = $(""); $title.appendTo($content); $title.append($("").html(title)); if (showClose) { var $closeButton = $("