83
edits
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
/* | /* <pre> | ||
* Thickbox4MediaWiki v3. | * Thickbox4MediaWiki v3.13 - Based on Thickbox 3.1 By Cody Lindley (http://www.codylindley.com) | ||
* Copyright (c) 2010 - | * Copyright (c) 2010 - 2023 Jesús Martínez (User:Ciencia_Al_Poder), Original Thickbox Copyright (c) 2007 Cody Lindley | ||
* Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php | * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php | ||
*/ | */ | ||
window.Thickbox = (function($, mw) { | window.Thickbox = (function($, mw) { | ||
'use strict'; | 'use strict'; | ||
var _version = '3.13', | |||
var _version = '3.12', | var _version = '3.12', | ||
// Minimum dimensions | // Minimum dimensions | ||
Line 29: | Line 30: | ||
_loaderTm = null, | _loaderTm = null, | ||
_logger = null, | _logger = null, | ||
// Private | // Private methods | ||
_init = function() { | _init = function() { | ||
// | // We could have this event listener directly on each 'a.image', but this is much faster and more efficient (it only takes 20% in FF2) than to go through the entire DOM | ||
$('#mw-content-text').off('click.thickbox mouseover.thickbox_imgtip').on({ | $('#mw-content-text').off('click.thickbox mouseover.thickbox_imgtip').on({ | ||
'click.thickbox': _triggerEvent, | 'click.thickbox': _triggerEvent, | ||
Line 49: | Line 47: | ||
var a = target.parentNode; | var a = target.parentNode; | ||
// Images with links to other articles do not have the "image" class, except in Wikia where it does and add "link-internal" or "link-external" | // Images with links to other articles do not have the "image" class, except in Wikia where it does and add "link-internal" or "link-external" | ||
if (!a || !_isTag(a,'a') || !_isClass(a,'image') || _isClass(a, 'link-internal') || _isClass(a, 'link-external')) { | if (!a || !_isTag(a,'a') || !(_isClass(a,'image') || _isClass(a,'mw-file-description')) || _isClass(a, 'link-internal') || _isClass(a, 'link-external')) { | ||
return true; | return true; | ||
} | } | ||
// | // MW < 1.40 | ||
if (_isClass( | if (_isClass(target,'thumbimage')) { | ||
// Es thumb | |||
a.blur(); | |||
_getCaption = _getCaptionThumb; | |||
_showImage(a); | _showImage(a); | ||
return false; | return false; | ||
} | } | ||
if ( | // MW >= 1.40 | ||
// | if (_isTag(a.parentNode,'figure')) { | ||
// Es thumb | |||
a.blur(); | a.blur(); | ||
_getCaption = | _getCaption = _getCaptionThumb140; | ||
_showImage(a); | _showImage(a); | ||
return false; | return false; | ||
} | } | ||
var gb = a. | var gb = $(a).closest('li.gallerybox').get(0); | ||
// MediaWiki gallery | // MediaWiki gallery | ||
if | if (gb) { | ||
var t = gb.parentNode; | var t = gb.parentNode; | ||
if (_isTag(t,'ul') && _isClass(t,'gallery')) { | if (_isTag(t,'ul') && _isClass(t,'gallery')) { | ||
a.blur(); | a.blur(); | ||
_getCaption = _getCaptionMW; | _getCaption = _getCaptionMW; | ||
_galleryData = $(t).find('div.thumb a.image'); | _galleryData = $(t).find('div.thumb a.image,div.thumb a.mw-file-description'); // MW<1.40,MW>=1.40 | ||
_galleryIndex = _galleryData.index(a); | _galleryIndex = _galleryData.index(a); | ||
_showImage(a); | _showImage(a); | ||
Line 87: | Line 79: | ||
} | } | ||
} | } | ||
// | // Is generic thumbnail | ||
a.blur(); | a.blur(); | ||
_getCaption = _getCaptionEmpty; | _getCaption = _getCaptionEmpty; | ||
_showImage(a); | _showImage(a); | ||
return false; | return false; | ||
} else if (_isTag(target,'a')) { | |||
var sup = target.parentNode; | var sup = target.parentNode; | ||
if (!_isTag(sup,'sup') || !_isClass(sup,'reference')) { | if (!_isTag(sup,'sup') || !_isClass(sup,'reference')) { | ||
Line 99: | Line 91: | ||
target.blur(); | target.blur(); | ||
_showElement(target); | _showElement(target); | ||
return false; | return false; | ||
} | } | ||
return true; | return true; | ||
Line 155: | Line 147: | ||
descUrl = $a.attr('href'); | descUrl = $a.attr('href'); | ||
if ($img.data('image-key')) { | if ($img.data('image-key')) { | ||
// image-key is the name for the URL. | // image-key is the name for the URL. So not use image-name because it's encoded (& --> &amp;) | ||
descUrl = mw.util.wikiGetlink(mw.config.get('wgFormattedNamespaces')['6'] + ':' + decodeURIComponent($img.data('image-key'))); | descUrl = mw.util.wikiGetlink(mw.config.get('wgFormattedNamespaces')['6'] + ':' + decodeURIComponent($img.data('image-key'))); | ||
} | } | ||
TB_descLink = '<a id="TB_descLink" class="sprite details" title=" | TB_descLink = '<a id="TB_descLink" class="sprite details" title="Ir a la página de descripción de la imagen"></a>'; | ||
// Is it a gallery? | // Is it a gallery? | ||
if (_galleryIndex != -1) { | if (_galleryIndex != -1) { | ||
TB_secondLine = '<div id="TB_secondLine">'+ | TB_secondLine = '<div id="TB_secondLine">'+ | ||
'<span id="TB_imageCount"></span>'+ | '<span id="TB_imageCount"></span>'+ | ||
'<span id="TB_prev"><a href="#" title="See previous | '<span id="TB_prev"><a href="#" title="See previous [A]">< Prev.</a></span>'+ | ||
'<span id="TB_next"><a href="#" title="See next | '<span id="TB_next"><a href="#" title="See next [S]">Next. ></a></span></div>'; | ||
} | } | ||
$('#TB_window').append('<div id="TB_closeWindow"><a href="#" id="TB_closeWindowButton" title="Close [ESC]">close</a></div>' + | $('#TB_window').append('<div id="TB_closeWindow"><a href="#" id="TB_closeWindowButton" title="Close [ESC]">close</a></div>' + | ||
'<div id="TB_ImageOff"><img id="TB_Image" alt="Image" title="Close" />' + TB_descLink + '</div>' + TB_secondLine + '<div id="TB_caption"></div>'); | |||
if (_galleryIndex != -1) { | if (_galleryIndex != -1) { | ||
_updateNavigation(); | _updateNavigation(); | ||
Line 177: | Line 169: | ||
$('#TB_prev').add('#TB_next').click(_navigate); | $('#TB_prev').add('#TB_next').click(_navigate); | ||
$('#TB_descLink').attr('href', descUrl); | $('#TB_descLink').attr('href', descUrl); | ||
$('#TB_ImageOff').on({ | |||
mouseover: function() { | |||
$('#TB_descLink').css('display','block'); | |||
}, | |||
mouseout: function() { | |||
$('#TB_descLink').css('display','none'); | |||
} | |||
}); | |||
if (_imgPreloader === null) { | if (_imgPreloader === null) { | ||
Line 192: | Line 192: | ||
_imgPreloader.src = url; | _imgPreloader.src = url; | ||
} | } | ||
} catch(e) { | } catch(e) { | ||
_log(e); | _log(e); | ||
Line 205: | Line 204: | ||
var baseurl = url.substr(0, idx), | var baseurl = url.substr(0, idx), | ||
hash = decodeURIComponent(url.substr(idx + 1)), | hash = decodeURIComponent(url.substr(idx + 1)), | ||
// | // Check that the URL is from the same document | ||
locbase = document.location.href.replace(baseurl, ''), | locbase = document.location.href.replace(baseurl, ''), | ||
rel = document.getElementById(hash); | rel = document.getElementById(hash); | ||
Line 216: | Line 215: | ||
$('#TB_overlay').click(_remove); | $('#TB_overlay').click(_remove); | ||
var titleHTML = '<div id="TB_title"><div id="TB_closeAjaxWindow"><a href="#" id="TB_closeWindowButton" title="Close [ESC]">close</a></div></div>', | var titleHTML = '<div id="TB_title"><div id="TB_closeAjaxWindow"><a href="#" id="TB_closeWindowButton" title="Close [ESC]">close</a></div></div>', | ||
wnd = $('#TB_window'), | wnd = $('#TB_window'), | ||
cel = $(rel).clone(); | cel = $(rel).clone(); | ||
Line 228: | Line 227: | ||
lw = elOffset.left, | lw = elOffset.left, | ||
rw = $(document).width() - elOffset.left - tgEl.width(), | rw = $(document).width() - elOffset.left - tgEl.width(), | ||
// | // Calculating the optimal dimensions. Calculating the area and determine that the ideal is ratio 3/2 | ||
prefw = parseInt(Math.sqrt(wnd.width()*wnd.height()*3/2),10), | prefw = parseInt(Math.sqrt(wnd.width()*wnd.height()*3/2),10), | ||
// Minimum width correction if scroll occurs | // Minimum width correction if scroll occurs | ||
cd = $('#TB_ajaxContent')[0]; | cd = $('#TB_ajaxContent')[0]; | ||
prefw += cd.scrollWidth-cd.clientWidth; | prefw += cd.scrollWidth-cd.clientWidth; | ||
// | // Should not go below minimum | ||
if (prefw < _minWidth) { | if (prefw < _minWidth) { | ||
prefw = _minWidth; | prefw = _minWidth; | ||
Line 245: | Line 244: | ||
} else if (lw < 250 || rw < 250) { // It does not fit on either side. We look to see if the minimum width (250) cannot be used. In that case the width we force it and put it to the right | } else if (lw < 250 || rw < 250) { // It does not fit on either side. We look to see if the minimum width (250) cannot be used. In that case the width we force it and put it to the right | ||
prefw = 250; | prefw = 250; | ||
} else if (rw > lw) { // | } else if (rw > lw) { // Using the width of the larger side | ||
prefw = rw - margen; | prefw = rw - margen; | ||
} else { | } else { | ||
Line 252: | Line 251: | ||
} | } | ||
wnd.css({width: prefw, left: left}); | wnd.css({width: prefw, left: left}); | ||
// Now the vertical position. | // Now the vertical position. Width needs to be assigned in order to calculate correctly. | ||
var top = elOffset.top - parseInt(wnd.height(), 10) - margen; | var top = elOffset.top - parseInt(wnd.height(), 10) - margen; | ||
// If it does not fit above we place it below | // If it does not fit above we place it below | ||
Line 294: | Line 293: | ||
if (keycode == 27) { // close | if (keycode == 27) { // close | ||
_remove(); | _remove(); | ||
} else if (keycode == | } else if (keycode == 65) { // 'A' display previous image | ||
$('#TB_prev').click(); | $('#TB_prev').click(); | ||
} else if (keycode == | } else if (keycode == 83) { // 'S' display next image | ||
$('#TB_next').click(); | $('#TB_next').click(); | ||
} | } | ||
Line 336: | Line 335: | ||
_getCaptionThumb = function(elem) { | _getCaptionThumb = function(elem) { | ||
return elem.closest('.thumbinner').find('> .thumbcaption').clone().find('> div.magnify').remove().end().html(); | return elem.closest('.thumbinner').find('> .thumbcaption').clone().find('> div.magnify').remove().end().html(); | ||
}, | |||
_getCaptionThumb140 = function(elem) { | |||
return elem.closest('figure').find('> figcaption').clone().html(); | |||
}, | }, | ||
_getCaptionEmpty = function(elem) { | _getCaptionEmpty = function(elem) { | ||
Line 361: | Line 363: | ||
x = pagesize[0] - _minMarginWidth * 2 - _imageMarginWidth * 2, | x = pagesize[0] - _minMarginWidth * 2 - _imageMarginWidth * 2, | ||
y = pagesize[1] - _minMarginHeight * 2 - wndH + img.height(), | y = pagesize[1] - _minMarginHeight * 2 - wndH + img.height(), | ||
firstNav, imgOpt; | firstNav, imgOpt; | ||
// You can enter by one or both. In fact, this check is enough, because if you have to go through both it does not matter which side is reduced first | // You can enter by one or both. In fact, this check is enough, because if you have to go through both it does not matter which side is reduced first | ||
Line 376: | Line 376: | ||
firstNav = (img.attr('src') || '') === ''; | firstNav = (img.attr('src') || '') === ''; | ||
// Thickbox window dimensions | // Thickbox window dimensions for positioning | ||
_width = imageWidth + _imageMarginWidth * 2; // 15px | _width = imageWidth + _imageMarginWidth * 2; // 15px gap on both sides | ||
// We know the height of the window. Just replace the old image and put the new one, that is, its dimensions. The height has to be done differently because more elements are involved than in the width | // We know the height of the window. Just replace the old image and put the new one, that is, its dimensions. The height has to be done differently because more elements are involved than in the width | ||
_height = wndH - img.height() + imageHeight; | _height = wndH - img.height() + imageHeight; | ||
Line 386: | Line 386: | ||
imgOpt = {width: imageWidth, height: imageHeight, opacity: 1}; | imgOpt = {width: imageWidth, height: imageHeight, opacity: 1}; | ||
// We look to see if it loads when opening or after browsing. If it comes from opening, | // We look to see if it loads when opening or after browsing. If it comes from opening, skip animation | ||
if (firstNav) { | if (firstNav) { | ||
img.css(imgOpt); | img.css(imgOpt); | ||
Line 417: | Line 417: | ||
if (url.length > 3 && url.substr(url.length - 4).toLowerCase() == '.svg') { | if (url.length > 3 && url.substr(url.length - 4).toLowerCase() == '.svg') { | ||
$img = gitem.find('> img').eq(0); | $img = gitem.find('> img').eq(0); | ||
// For SVG we already know its aspect ratio, although not its original dimensions | |||
// It would have to be done differently to load the SVG. Instead, here it is dynamically determined | |||
// It is artificially enlarged, and then this function will reduce it to the maximum window size | |||
_updateImageView($img.prop('width') * 1000, $img.prop('height') * 1000, url); | _updateImageView($img.prop('width') * 1000, $img.prop('height') * 1000, url); | ||
_imgPreloader.src = ''; | _imgPreloader.src = ''; | ||
Line 474: | Line 474: | ||
return; | return; | ||
} | } | ||
if (_isTag(target,'img')) { // Gallery | if (_isTag(target,'img')) { // Gallery or thumb | ||
a = target.parentNode; | a = target.parentNode; | ||
if (!_isTag(a,'a') || !_isClass(a,'image') || _isClass(a,'link-internal')) { | if (!_isTag(a,'a') || !(_isClass(a,'image') || _isClass(a,'mw-file-description')) || _isClass(a,'link-internal')) { | ||
_hideImgTip(); | _hideImgTip(); | ||
return; | return; | ||
Line 497: | Line 497: | ||
}, | }, | ||
_createImgTip = function() { | _createImgTip = function() { | ||
_imgTip = $('<div id="TB_imagetip" title="Click on the image to enlarge. Click with Ctrl or Shift to go to the file page | _imgTip = $('<div id="TB_imagetip" title="Click on the image to enlarge. Click with Ctrl or Shift to go to the file page">').appendTo(document.body); | ||
_imgTip.on('click',_imgTipClickEvent); | _imgTip.on('click',_imgTipClickEvent); | ||
}, | }, | ||
Line 508: | Line 508: | ||
display: 'block', | display: 'block', | ||
left: of.left + target.width(), | left: of.left + target.width(), | ||
top: of.top | top: of.top + target.height() | ||
}); | }); | ||
_imgTipVisible = true; | _imgTipVisible = true; |