static/js/leanModal.js
2016-01-27 17:58:45 +03:00

179 lines
4.8 KiB
JavaScript

(function($) {
var _stack = 0,
_lastID = 0,
_generateID = function() {
_lastID++;
return 'materialize-lean-overlay-' + _lastID;
};
$.fn.extend({
openModal: function(options) {
$('body').css('overflow', 'hidden');
var defaults = {
opacity: 0.5,
in_duration: 350,
out_duration: 250,
ready: undefined,
complete: undefined,
dismissible: true,
starting_top: '4%'
},
overlayID = _generateID(),
$modal = $(this),
$overlay = $('<div class="lean-overlay"></div>'),
lStack = (++_stack);
// Store a reference of the overlay
$overlay.attr('id', overlayID).css('z-index', 1000 + lStack * 2);
$modal.data('overlay-id', overlayID).css('z-index', 1000 + lStack * 2 + 1);
$("body").append($overlay);
// Override defaults
options = $.extend(defaults, options);
if (options.dismissible) {
$overlay.click(function() {
$modal.closeModal(options);
});
// Return on ESC
$(document).on('keyup.leanModal' + overlayID, function(e) {
if (e.keyCode === 27) { // ESC key
$modal.closeModal(options);
}
});
}
$modal.find(".modal-close").on('click.close', function(e) {
$modal.closeModal(options);
});
$overlay.css({ display : "block", opacity : 0 });
$modal.css({
display : "block",
opacity: 0
});
$overlay.velocity({opacity: options.opacity}, {duration: options.in_duration, queue: false, ease: "easeOutCubic"});
$modal.data('associated-overlay', $overlay[0]);
// Define Bottom Sheet animation
if ($modal.hasClass('bottom-sheet')) {
$modal.velocity({bottom: "0", opacity: 1}, {
duration: options.in_duration,
queue: false,
ease: "easeOutCubic",
// Handle modal ready callback
complete: function() {
if (typeof(options.ready) === "function") {
options.ready();
}
}
});
}
else {
$.Velocity.hook($modal, "scaleX", 0.7);
$modal.css({ top: options.starting_top });
$modal.velocity({top: "10%", opacity: 1, scaleX: '1'}, {
duration: options.in_duration,
queue: false,
ease: "easeOutCubic",
// Handle modal ready callback
complete: function() {
if (typeof(options.ready) === "function") {
options.ready();
}
}
});
}
}
});
$.fn.extend({
closeModal: function(options) {
var defaults = {
out_duration: 250,
complete: undefined
},
$modal = $(this),
overlayID = $modal.data('overlay-id'),
$overlay = $('#' + overlayID);
options = $.extend(defaults, options);
// Disable scrolling
$('body').css('overflow', '');
$modal.find('.modal-close').off('click.close');
$(document).off('keyup.leanModal' + overlayID);
$overlay.velocity( { opacity: 0}, {duration: options.out_duration, queue: false, ease: "easeOutQuart"});
// Define Bottom Sheet animation
if ($modal.hasClass('bottom-sheet')) {
$modal.velocity({bottom: "-100%", opacity: 0}, {
duration: options.out_duration,
queue: false,
ease: "easeOutCubic",
// Handle modal ready callback
complete: function() {
$overlay.css({display:"none"});
// Call complete callback
if (typeof(options.complete) === "function") {
options.complete();
}
$overlay.remove();
_stack--;
}
});
}
else {
$modal.velocity(
{ top: options.starting_top, opacity: 0, scaleX: 0.7}, {
duration: options.out_duration,
complete:
function() {
$(this).css('display', 'none');
// Call complete callback
if (typeof(options.complete) === "function") {
options.complete();
}
$overlay.remove();
_stack--;
}
}
);
}
}
});
$.fn.extend({
leanModal: function(option) {
return this.each(function() {
var defaults = {
starting_top: '4%'
},
// Override defaults
options = $.extend(defaults, option);
// Close Handlers
$(this).click(function(e) {
options.starting_top = ($(this).offset().top - $(window).scrollTop()) /1.15;
var modal_id = $(this).attr("href") || '#' + $(this).data('target');
$(modal_id).openModal(options);
e.preventDefault();
}); // done set on click
}); // done return
}
});
})(jQuery);