(function ($) { var ModalBox, linkHandler, closeHandler, scrollHandler; ModalBox = function (el) { this.el = $(el); } ModalBox.prototype.center = function () { var $el = this.el, $modalBox = $el.find('.modal-box'), parentHeight = $el.height(), childHeight = $modalBox.outerHeight(), offsetTop; if ( !$modalBox.is('.top') && !$modalBox.is('.bottom') ) { offsetTop = (parentHeight - childHeight) / 2; $modalBox.css('top', offsetTop); } if ( $modalBox.is('.bottom') ) { offsetTop = (parentHeight - childHeight); $modalBox.css('top', offsetTop); } }; ModalBox.prototype.show = function () { var $el = this.el, id = $el.data('modal'), animation = $el.find('.modal-box').data('animation'), $iframe = $el.find('iframe'); if ( $('[data-modal].open').length ) $('[data-modal].open').modalBox('hide'); if ( $iframe.length ) $iframe.attr('src', $iframe.data('iframeSrc')); $el.addClass('open'); if ( animation == 'none' ) { $el.show(); }else { $el.fadeIn(250); } this.center(); }; ModalBox.prototype.hide = function() { var $el = this.el, animation = $el.find('.modal-box').data('animation'), $iframe = $el.find('iframe'); $el.removeClass('open'); if ( animation && animation == 'none' ) { $el.hide(); if ( $iframe.length ) $iframe.attr('src', ''); }else { $el.fadeOut(250); setTimeout(function () { if ( $iframe.length ) $iframe.attr('src', ''); }, 250); } }; $.fn.modalBox = function (option) { return this.each(function () { var $this = $(this), data = $this.data('modalBox'); if ( !data ) { data = new ModalBox(this); $this.data('modalBox', data); } if (typeof option == 'string') { data[option](); } }); }; linkHandler = function (event) { event.preventDefault(); var modalId = $(this).data('modalLink'), $modalBox = $('[data-modal=' + modalId + ']'); $modalBox.modalBox('show'); }; clickHandler = function (event) { var $target = $(event.target); if ( !$target.closest('.modal-box').length ) { $(this).modalBox('hide'); } }; closeHandler = function () { $(this).closest('[data-modal]').modalBox('hide'); }; resizeHandler = function () { if ( $('[data-modal].open').length ) $('[data-modal].open').modalBox('center'); }; scrollHandler = function (event) { event.preventDefault(); var e0 = event.originalEvent, delta = e0.wheelDelta || -e0.detail, $modalBox = $(event.target).closest('.modal-box'); if ( $modalBox.length ) { $modalBox.get(0).scrollTop -= delta; } }; $('.modal-window').each(function () { var $modal = $(this), $modalBox = $modal.find('.modal-box'), id = $(this).data('modal'), time = $modal.data('timeout'), scroll = $modal.data('scroll'); if ( $modal.find('iframe').length ) { var iframe = $modal.find('iframe'), src = iframe.attr('src'); $modalBox.addClass('iframe-box'); iframe.attr('src', ''); iframe.data('iframeSrc', src); } if ( time ) { setTimeout(function () { $modal.modalBox('show'); }, time); } if ( scroll ) { $(window).on('scroll.modalBox' + id, function () { if ( $(this).scrollTop() >= scroll ) { $modal.modalBox('show'); $(window).off('.modalBox' + id); } }); } }); $(document) .on('click.modalBox', '[data-modal-link]', linkHandler) .on('mousedown.modalBox', '[data-modal]', clickHandler) .on('click.modalBox', '[data-modal] .close-btn', closeHandler) .on('mousewheel.modalBox DOMMouseScroll.modalBox', '[data-modal]', scrollHandler); $(window).on('resize.modalBox', resizeHandler); })(jQuery);