( function ( $, mw ) {
/**
* Check whether the Navigation Popups gadget module is enabled
*
* @return {boolean}
*/
function isNavigationPopupsGadgetEnabled() {
// Temporary fix to get this code working on huwiki
var moduleName = mw.config.get( 'wgPageContentLanguage' ) === 'hu' ?
'ext.gadget.latszer' : 'ext.gadget.Navigation_popups',
moduleState = mw.loader.getState( moduleName );
// Does the module exist and is it being used?
return ( moduleState !== null && moduleState !== 'registered' ) ||
window.pg !== undefined;
}
mw.popups.enabled = mw.popups.getEnabledState();
/**
* Returns valid jQuery selectors for which a popup should be triggered.
* This can be overwritten by targets.
*
* @return string
*/
mw.popups.triggers = 'mouseenter focus';
/**
* Creates the SVG mask used to create the
* the triangle pointer on popups with images
*
* @method createSVGMask
*/
mw.popups.createSVGMask = function () {
$( '
' )
.attr( 'id', 'mwe-popups-svg' )
.appendTo( document.body )
.html(
''
);
return true;
};
/**
* Create the element that holds the popups
*
* @method createPopupElement
*/
mw.popups.createPopupElement = function () {
mw.popups.$popup = $( '
' )
.attr( {
'class': 'mwe-popups',
role: 'tooltip',
'aria-hidden': 'true'
} )
.appendTo( document.body );
};
/**
* Checks if the user is scrolling, sets to false on mousemove
*
* @method checkScroll
*/
mw.popups.checkScroll = function () {
$( window ).on( 'scroll', function () {
mw.popups.scrolled = true;
} );
$( window ).on( 'mousemove', function () {
mw.popups.scrolled = false;
} );
};
mw.hook( 'wikipage.content' ).add( function ( $content ) {
var $elements, dwellStartTime, linkInteractionToken;
mw.popups.$content = $content;
$elements = mw.popups.selectPopupElements();
// Only enable Popups when the Navigation popups gadget is not enabled
if ( !isNavigationPopupsGadgetEnabled() && mw.popups.enabled ) {
mw.popups.removeTooltips( $elements );
mw.popups.setupTriggers( $elements );
} else {
// Events are logged even when Hovercards are disabled
// See T88166 for details
$elements
.on( mw.popups.triggers, function () {
// cache the hover start time and link interaction token for a later use
dwellStartTime = mw.now();
linkInteractionToken = mw.popups.getRandomToken();
} )
.on( 'mouseleave blur', function () {
var $this = $( this );
if ( dwellStartTime && linkInteractionToken && mw.now() - dwellStartTime >= 250 ) {
mw.track( 'ext.popups.schemaPopups', {
pageTitleHover: $this.attr( 'title' ),
action: 'dwelledButAbandoned',
totalInteractionTime: Math.round( mw.now() - dwellStartTime ),
linkInteractionToken: linkInteractionToken
} );
}
} )
.on( 'click', function ( event ) {
var $this = $( this ),
action = mw.popups.getAction( event ),
href = $this.attr( 'href' );
mw.track( 'ext.popups.schemaPopups', {
pageTitleHover: $this.attr( 'title' ),
action: action,
totalInteractionTime: Math.round( mw.now() - dwellStartTime ),
linkInteractionToken: linkInteractionToken
} );
if ( action === 'opened in same tab' ) {
event.preventDefault();
window.location.href = href;
}
} );
}
} );
function initPopups() {
mw.popups.checkScroll();
mw.popups.createSVGMask();
mw.popups.createPopupElement();
}
$( function () {
var jStorage = mw.storage.get( 'jStorage' );
// FIXME: Can be removed a month from jStorage removal. Not perfect but should work in most cases.
if ( jStorage && jStorage.indexOf( 'popups-enabled' ) > 0 ) {
// slower loading popups when in transition mode
mw.loader.using( 'jquery.jStorage' ).done( function () {
var val = $.jStorage.get( 'mwe-popups-enabled' );
// delete jStorage key
$.jStorage.deleteKey( 'mwe-popups-enabled' );
if ( val === 'false' ) {
// copy over
mw.storage.set( 'mwe-popups-enabled', '0' );
} else {
if ( val ) {
mw.storage.set( 'mwe-popups-enabled', '1' );
}
initPopups();
}
} );
} else if ( mw.popups.enabled ) {
initPopups();
}
mw.track( 'ext.popups.schemaPopups', {
action: 'pageLoaded'
} );
} );
} )( jQuery, mediaWiki );