/** * Copyright (C) 2021 Double Bastion LLC * * This file is part of Roundpin, which is licensed under the * GNU Affero General Public License Version 3.0. The license terms * are detailed in the "LICENSE.txt" file located in the root directory. * * This is a modified version of the original file "jquery.jeegoopopup.1.0.0.js", * first modified in 2021. The copyright notice for the original * content follows: /*! * Copyright (c) 2009 - 2013 Erik van den Berg (http://www.tweego.nl/jeegoopopup) * Licensed under MIT (http://www.opensource.org/licenses/mit-license.php) license. * Consider linking back to author's homepage: http://www.tweego.nl * * Version: 1.0.0 * Requires jQuery 1.4.2+ */ (function ($) { var _popups; var _init; var _popupsLeft; var _fadeIn; // Drag & drop & resize vars var _dragX; var _dragY; var _mouseX; var _mouseY; var _width; var _height; var _initialize = function () { if (!_init) { // Add popup container. $('body').append( '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '' + '
' ); // Set defaults. _fadeIn = 300; // Init popup list. _popups = []; _init = true; } }; var _position = function (close) { if(_popups.length > 0) { var popup = _popups[_popups.length - 1]; var css = { position: popup.fixed ? 'fixed' : 'absolute' }; if(close) { $('#jg_popup_inner').css(popup.css); } else { var $window = $(window); var scrollLeft = $window.scrollLeft(); var scrollTop = $window.scrollTop(); // Determine x-position popup. if(popup.left != undefined) { css.right = 'auto'; css.left = popup.fixed ? popup.left + 'px' : scrollLeft + popup.left + 'px'; } else if(popup.right != undefined) { css.left = 'auto'; css.right = popup.fixed ? popup.right + 'px' : popup.right - scrollLeft + 'px'; } else if(popup.center) { css.right = 'auto'; var left = ($window.width() - $('#jg_popup_inner').outerWidth()) / 2; css.left = popup.fixed ? left + 'px' : scrollLeft + left + 'px'; } else { css.right = 'auto'; css.left = popup.fixed ? '0px' : scrollLeft + 'px'; } // Determine y-position popup. if(popup.top != undefined) { css.bottom = 'auto'; css.top = popup.fixed ? popup.top + 'px' : scrollTop + popup.top + 'px'; } else if(popup.bottom != undefined) { css.top = 'auto'; css.bottom = popup.fixed ? popup.bottom + 'px' : popup.bottom - scrollTop + 'px'; } else if(popup.center) { css.bottom = 'auto'; var top = ($window.height() - $('#jg_popup_inner').outerHeight()) / 2; css.top = popup.fixed ? top + 'px' : scrollTop + top + 'px'; } else { css.bottom = 'auto'; css.top = popup.fixed ? '0px' : scrollTop + 'px'; } $('#jg_popup_inner').css(css); popup.css = css; } } }; var _close = function (args) { if (_popups && _popups.length > 0) { var index = _popups.length - 1; var onClose = _popups[index].onClose; // Remove popup's data. _popups.pop(); // Move popup's content to garbage. var content = $('#jg_popup_content > div:eq(' + index + ')'); // Unload all iframes inside content. try { var iframes = content.find('iframe'); for(var i = 0; i < iframes.length; i++) { $(iframes[i]).attr('src', 'about:blank'); } }catch(err){} // ie9 hack. setTimeout(function(){ content.appendTo('#jg_popup_garbage'); }, 0); // Unbind handlers and reset overflow if last popup. if (index == 0) { $('#jg_popup_close').unbind('click.jg_popup'); $('#jg_popup_title').unbind('mousedown.jg_popup'); $('.jg_popup_scroller').removeClass('jg_popup_scroller').css('overflow', 'auto'); } _refresh(true); // Invoke popup's onClose callback if present. if (onClose) { if (args) onClose.apply(window, args); else onClose(); } } }; var _refreshWidth = function () { var content = $('#jg_popup_content'); var width = _popups[_popups.length - 1].width; content.css('width', width == 'auto' ? 'auto' : width + 'px'); }; var _refreshHeight = function () { var content = $('#jg_popup_content'); var height = _popups[_popups.length - 1].height; if (_popups[_popups.length - 1].url) { if (height != 'auto') { $('#jg_popup_content div:eq(' + (_popups.length - 1) + ') > iframe.jg_popup_iframe').attr('height', height); // Vertically center loader. var marginTop = (height - $('#jg_popup_loader div').height()) / 2; $('#jg_popup_loader').css('top', (marginTop + _popups[_popups.length - 1].loaderVerticalOffset) + 'px'); } else $('#jg_popup_content div:eq(' + (_popups.length - 1) + ') > iframe.jg_popup_iframe').removeAttr('height'); $('#jg_popup_content').height('auto'); } else $('#jg_popup_content').height(height); }; var _refreshTitle = function () { var title = _popups[_popups.length - 1].title; var maxLength = _popups[_popups.length - 1].maxTitleLength if (maxLength && title && title.length > maxLength) $('#jg_popup_title').html(title.substring(0, maxLength) + '...'); else $('#jg_popup_title').html(title || ''); }; var _refreshParentScrolling = function() { var parentScrolling = _popups[_popups.length - 1].parentScrolling; if(parentScrolling) { $('.jg_popup_scroller').removeClass('jg_popup_scroller').css('overflow', 'auto'); } else // Disable scrolling on parent document. { var scroller = $('body'); if(scroller.css('overflow') == 'hidden') { scroller = scroller.find('*').filter(function(){ return $(this).css('overflow') == 'auto'; }).first(); } scroller.addClass('jg_popup_scroller').css('overflow', 'hidden'); } }; var _refreshSkinClass = function(){ $('#jg_popup_table').removeClass().addClass(_popups[_popups.length - 1].skinClass); }; var _refreshContentClass = function(){ $('#jg_popup_content').removeClass().addClass(_popups[_popups.length - 1].contentClass); }; var _refreshInnerClass = function(){ $('#jg_popup_inner').removeClass().addClass(_popups[_popups.length - 1].innerClass); }; var _refreshDraggable = function(){ $('#jg_popup_title')[_popups[_popups.length - 1].draggable ? 'addClass' : 'removeClass']('jg_popup_draggable'); }; var _refreshResizable = function(){ $('#jg_popup_br')[_popups[_popups.length - 1].resizable ? 'addClass' : 'removeClass']('jg_popup_resizable'); }; var _refreshOverlay = function(){ $('#jg_popup_overlay').css('display', _popups[_popups.length - 1].overlay ? 'block' : 'none'); }; var _refreshOverlayColor = function(){ $('#jg_popup_overlay').css('backgroundColor', _popups[_popups.length - 1].overlayColor); }; var _refreshOpacity = function(){ $('#jg_popup_overlay').css('opacity', _popups[_popups.length - 1].opacity / 100); }; var _refresh = function (close) { if (_popups.length <= 0) // No more popups, hide all. { _popupsLeft = false; $('#jg_popup_overlay, #jg_popup_inner').hide(); } else { var currentContent = $('#jg_popup_content > div:eq(' + (_popups.length - 1) + ')'); // Initially hide popup window and show overlay on first popup. if (!_popupsLeft) { $('#jg_popup_inner').css('visibility', 'hidden'); } else // Hide previous popup contents, show this one. { $('#jg_popup_content > div:lt(' + (_popups.length - 1) + ')').hide(); currentContent.show(); } _refreshTitle(); _refreshWidth(); _refreshHeight(); _refreshParentScrolling(); _refreshSkinClass(); _refreshContentClass(); _refreshInnerClass(); _refreshDraggable(); _refreshResizable(); _refreshOverlay(); _refreshOverlayColor(); _refreshOpacity(); // If the popup content consists of an image and with and/or height are auto and the image should be centered, wait for the image to load before positioning and showing the image. if( (_popups[_popups.length - 1].width == 'auto' || _popups[_popups.length - 1].height == 'auto') && _popups[_popups.length - 1].center && currentContent.find('img').length > 0 && document.createElement('img').complete != undefined ){ var image = currentContent.find('img:eq(0)').get()[0]; // Start polling the image for completion. var poller = setInterval(function () { if (image.complete) { // Image is loaded, stop polling. clearInterval(poller); if(_popups.length > 0) { _position(close); $('#jg_popup_inner').css({ visibility: 'visible', display: 'none' }); $('#jg_popup_inner').fadeIn(_fadeIn, function () { if (_popups.length > 0 && _popups[_popups.length - 1].onOpen) { _popups[_popups.length - 1].onOpen(); } }); } } }, 50); } else { _position(close); // Fade-in popup if it is the first popup. if (!_popupsLeft) { $('#jg_popup_inner').css({ visibility: 'visible', display: 'none' }); $('#jg_popup_inner').fadeIn(_fadeIn, function () { if (_popups.length > 0 && _popups[_popups.length - 1].onOpen) _popups[_popups.length - 1].onOpen(); }); } else if (_popups.length > 0 && _popups[_popups.length - 1].onOpen) { _popups[_popups.length - 1].onOpen(); } } _popupsLeft = true; } }; var _drag = function (e) { var popup = _popups[_popups.length - 1]; if (!popup.draggable) return; _mouseX = e.pageX; _mouseY = e.pageY; var offset = $('#jg_popup_inner').offset(); var fixed = $('#jg_popup_inner').css('position') == 'fixed'; var $window = $(window); _dragX = offset.left - (fixed ? $window.scrollLeft() : 0); _dragY = offset.top - (fixed ? $window.scrollTop() : 0); // Invoke dragstart callback. if (popup.onDragStart) popup.onDragStart(popup); // Overlay content with transparant overlay. $('
').css({ opacity: 0, background: '#000', width: '100%', height: '100%', position: 'fixed', left: 0, top: 0, cursor: 'move' }).appendTo('#jg_popup_content'); $(document).unbind('mousemove.jg_popup_drag').bind('mousemove.jg_popup_drag', function (e) { var left = (_dragX + (e.pageX - _mouseX)); var top = (_dragY + (e.pageY - _mouseY)); var css = { left: left + 'px', top: top + 'px', right: 'auto', bottom: 'auto' }; $('#jg_popup_inner').css(css); // Save new position with popup. popup.left = left; popup.top = top; popup.css = css; if (popup.onDrag) popup.onDrag(popup); }).unbind('mouseup.jg_popup_drag').bind('mouseup.jg_popup_drag', function (e) { // Remove transparant iframe overlay. $('#jg_drag_aid').remove(); // Unbind drag handler. $(this).unbind('.jg_popup_drag'); // Invoke dragend callback. if (popup.onDragEnd) popup.onDragEnd(popup); }); }; // Resize var _resize = function (e) { var popup = _popups[_popups.length - 1]; if (!popup.resizable) return; _mouseX = e.pageX; _mouseY = e.pageY; _width = popup.width; if(_width == 'auto')_width = $('#jg_popup_content').width(); _height = _popups[_popups.length - 1].height; if(_height == 'auto')_height = $('#jg_popup_content').height(); // Invoke resizeStart callback. if (popup.onResizeStart) popup.onResizeStart(popup); // Overlay iframe with transparant overlay. $('
').css({ opacity: 0, background: '#000', width: '100%', height: '100%', position: 'fixed', left: 0, top: 0, cursor: 'move' }).appendTo('#jg_popup_content'); $(document).unbind('mousemove.jg_popup_resize').bind('mousemove.jg_popup_resize', function (e) { _popups[_popups.length - 1].width = _width + (e.pageX - _mouseX); _popups[_popups.length - 1].height = _height + (e.pageY - _mouseY); _refreshWidth(); _refreshHeight(); if (popup.onResize) popup.onResize(popup); }).unbind('mouseup.jg_popup_resize').bind('mouseup.jg_popup_resize', function (e) { // Remove transparant iframe overlay. $('#jg_drag_aid').remove(); // Unbind resize handler. $(this).unbind('.jg_popup_resize'); // Invoke resizeEnd callback. if (popup.onResizeEnd) popup.onResizeEnd(popup); }); }; var _getValue = function(value) { return (_popups && _popups.length > 0) ? _popups[_popups.length - 1][value] : null; } $.jeegoopopup = { open: function (options) { _initialize(); // Clear garbage. try { $('#jg_popup_garbage').empty(); } catch (ex) { } // Add new popup. // Default undefined: // ============================= // title, string // maxTitleLength, int // fadeIn, int // url, string // html, string // left, int // top, int // right, int // bottom, int // onOpen, function // onClose, function // onDragStart, function // onDrag, function // onDragEnd, function // onResizeStart, function // onResize, function // onResizeEnd, function var popupData = $.extend({ width: 'auto', height: 'auto', scrolling: 'auto', skinClass: 'jg_popup_basic', contentClass: 'customContentStyle', innerClass: 'customInnerClass', fixed: true, center: true, overlay: true, overlayColor: '#000', opacity: 50, loaderVerticalOffset: 0, parentScrolling: true, draggable: true, resizable: true }, options || {}); _popups.push(popupData); // Override fadeIn if provided. if (options && options.fadeIn != undefined) _fadeIn = options.fadeIn; // Take-over underlying popup position if popup is not centered and no left, right, top or bottom are defined. if (_popups.length > 1 && !popupData.center) { var offset = $('#jg_popup_inner').offset(); if (popupData.top == undefined && popupData.bottom == undefined) { popupData.top = popupData.fixed ? offset.top - $(window).scrollTop() : offset.top; } if (popupData.left == undefined && popupData.right == undefined) { popupData.left = popupData.fixed ? offset.left - $(window).scrollLeft() : offset.left; } } // Add popup content(html or iframe). if (popupData.url) // iframe { // Generate random id to prevent iframe caching. var id = "jgpopup" + Math.random().toString().replace(/\D/, ""); // Show loader animation. $('#jg_popup_loader').css('visibility', 'visible'); $('#jg_popup_content').append( '
' ); } else // html { var overflow = popupData.scrolling; if(overflow == 'yes') overflow = 'scroll'; else if(overflow == 'no') overflow = 'hidden'; $('#jg_popup_content').append('
' + (popupData.html || '') + '
'); } // Attach handlers on first popup. if (_popups.length == 1) { // Attach close handler to close button, wrap in function to prevent calling it with click handler argument (e). $('#jg_popup_close').unbind('click.jg_popup').bind('click.jg_popup', function () { _close(); }); // Bind drag handler to title section. $('#jg_popup_title').unbind('mousedown.jg_popup').bind('mousedown.jg_popup', _drag); // Bind resize handler to bottom right corner. $('#jg_popup_br').unbind('mousedown.jg_popup').bind('mousedown.jg_popup', _resize); } _refresh(); }, close: function () { // close topmost popup. _close(arguments); }, // Properties opacity: function (value) { if (value == undefined) return _getValue('opacity'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].opacity = value; _refreshOpacity(); } return this; }, overlay: function (value) { if (value == undefined) return _getValue('overlay'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].overlay = value; _refreshOverlay(); } return this; }, overlayColor: function (value) { if (value == undefined) return _getValue('overlayColor'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].overlayColor = value; _refreshOverlayColor(); } return this; }, draggable: function (value) { if (value == undefined) return _getValue('draggable'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].draggable = value; _refreshDraggable(); } return this; }, resizable: function (value) { if (value == undefined) return _getValue('resizable'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].resizable = value; _refreshResizable(); } return this; }, fixed: function (value) { if (value == undefined) return _getValue('fixed'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].fixed = value; _position(); } return this; }, height: function (value) { if (value == undefined) return _getValue('height'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].height = value; _refreshHeight(); } return this; }, width: function (value) { if (value == undefined) return _getValue('width'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].width = value; _refreshWidth(); } return this; }, top: function (value) { if (value == undefined) return _getValue('top'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].top = value; $('#jg_popup_inner').css({ top: _getValue('fixed') ? value + 'px' : $(window).scrollTop() + value + 'px', bottom: 'auto' }); } return this; }, left: function (value) { if (value == undefined) return _getValue('left'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].left = value; $('#jg_popup_inner').css({ left: _getValue('fixed') ? value + 'px' : $(window).scrollLeft() + value + 'px', right: 'auto' }); } return this; }, right: function (value) { if (value == undefined) return _getValue('right'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].right = value; _popups[_popups.length - 1].left = undefined; $('#jg_popup_inner').css({ right: _getValue('fixed') ? value + 'px' : value - $(window).scrollLeft() + 'px', left: 'auto' }); } return this; }, bottom: function (value) { if (value == undefined) return _getValue('bottom'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].bottom = value; _popups[_popups.length - 1].top = undefined; $('#jg_popup_inner').css({ bottom: _getValue('fixed') ? value + 'px' : value - $(window).scrollTop() + 'px', top: 'auto' }); } return this; }, title: function (value) { if (value == undefined) return _getValue('title'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].title = value; _refreshTitle(value, _popups[_popups.length - 1].maxTitleLength); } return this; }, maxTitleLength: function (value) { if (value == undefined) return _getValue('maxTitleLength'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].maxTitleLength = value; _refreshTitle(_popups[_popups.length - 1].title, value); } return this; }, skinClass: function (value) { if (value == undefined) return _getValue('skinClass'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].skinClass = value; _refreshSkinClass(); } return this; }, contentClass: function (value) { if (value == undefined) { return _getValue('contentClass'); } else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].contentClass = value; _refreshContentClass(); } return this; }, innerClass: function (value) { if (value == undefined) { return _getValue('innerClass'); } else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].innerClass = value; _refreshInnerClass(); } return this; }, parentScrolling: function (value) { if (value == undefined) return _getValue('parentScrolling'); else if (_popups && _popups.length > 0) { _popups[_popups.length - 1].parentScrolling = value; _refreshParentScrolling(); } return this; }, center: function () { // Center popup. if (_popups && _popups.length > 0) { var $window = $(window); var popup = _popups[_popups.length - 1]; var left = ($window.width() - $('#jg_popup_inner').outerWidth()) / 2; var top = ($window.height() - $('#jg_popup_inner').outerHeight()) / 2; var css = { left: popup.fixed ? left + 'px' : $window.scrollLeft() + left + 'px', top: popup.fixed ? top + 'px' : $window.scrollTop() + top + 'px', right: 'auto', bottom: 'auto' }; popup.css = css; $('#jg_popup_inner').css(css); } return this; }, refresh: function(){ // Reload iframe. if (_popups && _popups.length > 0) { var iframe = $('#jg_popup_content div:eq(' + (_popups.length - 1) + ') > iframe.jg_popup_iframe'); if(iframe.length > 0) { iframe[0].contentDocument.location.reload(true); } } return this; } }; })(jQuery);