MediaWiki:Gadget-referenceTooltips.js: различия между версиями
MrGorun (обсуждение | вклад) Нет описания правки |
(нет различий)
|
Текущая версия от 23:00, 10 октября 2020
// ( function () {
// // ruwiki settings
// var REF_LINK_SELECTOR = '.reference, a[href^="#CITEREF"]',
// COMMENTED_TEXT_CLASS = 'ts-comment-commentedText',
// COMMENTED_TEXT_SELECTOR = ( COMMENTED_TEXT_CLASS ? '.' + COMMENTED_TEXT_CLASS + ', ' : '') +
// 'abbr[title]';
// mw.messages.set( {
// 'rt-settings': 'Настройки всплывающих примечаний',
// 'rt-enable-footer': 'Включить всплывающие примечания',
// 'rt-settings-title': 'Всплывающие примечания',
// 'rt-save': 'Сохранить',
// 'rt-cancel': 'Отмена',
// 'rt-enable': 'Включить',
// 'rt-disable': 'Отключить',
// 'rt-activationMethod': 'Подсказка появляется при',
// 'rt-hovering': 'наведении',
// 'rt-clicking': 'клике',
// 'rt-delay': 'Задержка перед появлением подсказки (в миллисекундах)',
// 'rt-tooltipsForComments': 'Показывать всплывающие подсказки над <span title="Пример всплывающей подсказки" class="' + ( COMMENTED_TEXT_CLASS || 'rt-commentedText' ) + '" style="border-bottom: 1px dotted; cursor: help;">подчёркнутым точками текстом</span> в стиле всплывающих примечаний (позволяет видеть такие подсказки на устройствах, где не поддерживается мышь)',
// 'rt-disabledNote': 'Вы можете включить всплывающие примечания обратно, используя ссылку внизу страницы.',
// 'rt-done': 'Готово',
// 'rt-enabled': 'Всплывающие подсказки с примечаниями включены'
// } );
// // "Global" variables
// var SECONDS_IN_A_DAY = 60 * 60 * 24,
// CLASSES = {
// FADE_IN_DOWN: 'rt-fade-in-down',
// FADE_IN_UP: 'rt-fade-in-up',
// FADE_OUT_DOWN: 'rt-fade-out-down',
// FADE_OUT_UP: 'rt-fade-out-up'
// },
// IS_TOUCHSCREEN = 'ontouchstart' in document.documentElement,
// // Quite a rough check for mobile browsers, a mix of what is advised at
// // https://stackoverflow.com/a/24600597 (sends to
// // https://developer.mozilla.org/en-US/docs/Browser_detection_using_the_user_agent)
// // and https://stackoverflow.com/a/14301832
// IS_MOBILE = /Mobi|Android/i.test( navigator.userAgent ) ||
// typeof window.orientation !== 'undefined',
// CLIENT_NAME = $.client.profile().name,
// settingsString, settings, enabled, delay, activatedByClick, tooltipsForComments, cursorWaitCss,
// windowManager,
// $body = $( document.body ),
// $window = $( window );
// function rt( $content ) {
// // Popups gadget
// if ( window.pg ) {
// return;
// }
// var teSelector,
// settingsDialogOpening = false;
// function setSettingsCookie() {
// mw.cookie.set(
// 'RTsettings',
// Number( enabled ) + '|' + delay + '|' + Number( activatedByClick ) + '|' +
// Number( tooltipsForComments ),
// { path: '/', expires: 90 * SECONDS_IN_A_DAY }
// );
// }
// function enableRt() {
// enabled = true;
// setSettingsCookie();
// $( '.rt-enableItem' ).remove();
// rt( $content );
// mw.notify( mw.msg( 'rt-enabled' ) );
// }
// function disableRt() {
// $content.find( teSelector ).removeClass( 'rt-commentedText' ).off( '.rt' );
// $body.off( '.rt' );
// $window.off( '.rt' );
// }
// function addEnableLink() {
// // #footer-places – Vector
// // #f-list – Timeless, Monobook, Modern
// // parent of #footer li – Cologne Blue
// var $footer = $( '#footer-places, #f-list' );
// if ( !$footer.length ) {
// $footer = $( '#footer li' ).parent();
// }
// $footer.append(
// $( '<li>' )
// .addClass( 'rt-enableItem' )
// .append(
// $( '<a>' )
// .text( mw.msg( 'rt-enable-footer' ) )
// .attr( 'href', 'javascript:' )
// .click( function ( e ) {
// e.preventDefault();
// enableRt();
// } )
// )
// );
// }
// function TooltippedElement( $element ) {
// var tooltip,
// events,
// te = this;
// function onStartEvent( e ) {
// var showRefArgs;
// if ( activatedByClick && te.type !== 'commentedText' && e.type !== 'contextmenu' ) {
// e.preventDefault();
// }
// if ( !te.noRef ) {
// showRefArgs = [ $( this ) ];
// if ( te.type !== 'supRef' ) {
// showRefArgs.push( e.pageX, e.pageY );
// }
// te.showRef.apply( te, showRefArgs );
// }
// }
// function onEndEvent() {
// if ( !te.noRef ) {
// te.hideRef();
// }
// }
// if ( !$element ) {
// return;
// }
// // TooltippedElement.$element and TooltippedElement.$originalElement will be different when
// // the first is changed after its cloned version is hovered in a tooltip
// this.$element = $element;
// this.$originalElement = $element;
// if ( this.$element.is( REF_LINK_SELECTOR ) ) {
// if ( this.$element.prop( 'tagName' ) === 'SUP' ) {
// this.type = 'supRef';
// } else {
// this.type = 'harvardRef';
// }
// } else {
// this.type = 'commentedText';
// this.comment = this.$element.attr( 'title' );
// if ( !this.comment ) {
// return;
// }
// this.$element.addClass('rt-commentedText');
// }
// if ( activatedByClick ) {
// events = {
// 'click.rt': onStartEvent
// };
// // Adds an ability to see tooltips for links
// if ( this.type === 'commentedText' &&
// ( this.$element.closest( 'a' ).length ||
// this.$element.has( 'a' ).length
// )
// ) {
// events[ 'contextmenu.rt' ] = onStartEvent;
// }
// } else {
// events = {
// 'mouseenter.rt': onStartEvent,
// 'mouseleave.rt': onEndEvent
// };
// }
// this.$element.on( events );
// this.hideRef = function ( immediately ) {
// clearTimeout( te.showTimer );
// if ( this.type === 'commentedText' ) {
// this.$element.attr( 'title', this.comment );
// }
// if ( this.tooltip && this.tooltip.isPresent ) {
// if ( activatedByClick || immediately ) {
// this.tooltip.hide();
// } else {
// this.hideTimer = setTimeout( function () {
// te.tooltip.hide();
// }, 200 );
// }
// } else if ( this.$ref && this.$ref.hasClass( 'rt-target' ) ) {
// this.$ref.removeClass( 'rt-target' );
// if ( activatedByClick ) {
// $body.off( 'click.rt touchstart.rt', this.onBodyClick );
// }
// }
// };
// this.showRef = function ( $element, ePageX, ePageY ) {
// // Popups gadget
// if ( window.pg ) {
// disableRt();
// return;
// }
// if ( this.tooltip && !this.tooltip.$content.length ) {
// return;
// }
// var tooltipInitiallyPresent = this.tooltip && this.tooltip.isPresent;
// function reallyShow() {
// var viewportTop, refOffsetTop, teHref;
// if ( !te.$ref && !te.comment ) {
// teHref = te.type === 'supRef' ?
// te.$element.find( 'a' ).attr( 'href' ) :
// te.$element.attr( 'href' ); // harvardRef
// te.$ref = teHref &&
// $( '#' + $.escapeSelector( teHref.slice( 1 ) ) );
// if ( !te.$ref || !te.$ref.length || !te.$ref.text() ) {
// te.noRef = true;
// return;
// }
// }
// if ( !tooltipInitiallyPresent && !te.comment ) {
// viewportTop = $window.scrollTop();
// refOffsetTop = te.$ref.offset().top;
// if ( !activatedByClick &&
// viewportTop < refOffsetTop &&
// viewportTop + $window.height() > refOffsetTop + te.$ref.height() &&
// // There can be gadgets/scripts that make references horizontally scrollable.
// $window.width() > te.$ref.offset().left + te.$ref.width()
// ) {
// // Highlight the reference itself
// te.$ref.addClass( 'rt-target' );
// return;
// }
// }
// if ( !te.tooltip ) {
// te.tooltip = new Tooltip( te );
// if ( !te.tooltip.$content.length ) {
// return;
// }
// }
// // If this tooltip is called from inside another tooltip. We can't define it
// // in the constructor since a ref can be cloned but have the same Tooltip object;
// // so, Tooltip.parent is a floating value.
// te.tooltip.parent = te.$element.closest( '.rt-tooltip' ).data( 'tooltip' );
// if ( te.tooltip.parent && te.tooltip.parent.disappearing ) {
// return;
// }
// te.tooltip.show();
// if ( tooltipInitiallyPresent ) {
// if ( te.tooltip.$element.hasClass( 'rt-tooltip-above' ) ) {
// te.tooltip.$element.addClass( CLASSES.FADE_IN_DOWN );
// } else {
// te.tooltip.$element.addClass( CLASSES.FADE_IN_UP );
// }
// return;
// }
// te.tooltip.calculatePosition( ePageX, ePageY );
// $window.on( 'resize.rt', te.onWindowResize );
// }
// // We redefine this.$element here because e.target can be a reference link inside
// // a reference tooltip, not a link that was initially assigned to this.$element
// this.$element = $element;
// if ( this.type === 'commentedText' ) {
// this.$element.attr( 'title', '' );
// }
// if ( activatedByClick ) {
// if ( tooltipInitiallyPresent ||
// ( this.$ref && this.$ref.hasClass( 'rt-target' ) )
// ) {
// return;
// } else {
// setTimeout( function () {
// $body.on( 'click.rt touchstart.rt', te.onBodyClick );
// }, 0 );
// }
// }
// if ( activatedByClick || tooltipInitiallyPresent ) {
// reallyShow();
// } else {
// this.showTimer = setTimeout( reallyShow, delay );
// }
// };
// this.onBodyClick = function ( e ) {
// if ( !te.tooltip && !te.$ref.hasClass( 'rt-target' ) ) {
// return;
// }
// var $current = $( e.target );
// function contextMatchesParameter( parameter ) {
// return this === parameter;
// }
// // The last condition is used to determine cases when a clicked tooltip is the current
// // element's tooltip or one of its descendants
// while ( $current.length &&
// ( !$current.hasClass( 'rt-tooltip' ) ||
// !$current.data( 'tooltip' ) ||
// !$current.data( 'tooltip' ).upToTopParent(
// contextMatchesParameter, [ te.tooltip ],
// true
// )
// )
// ) {
// $current = $current.parent();
// }
// if ( !$current.length ) {
// te.hideRef();
// }
// };
// this.onWindowResize = function () {
// te.tooltip.calculatePosition();
// };
// }
// function Tooltip( te ) {
// function openSettingsDialog() {
// var settingsDialog, settingsWindow;
// if ( cursorWaitCss ) {
// cursorWaitCss.disabled = true;
// }
// function SettingsDialog() {
// SettingsDialog.parent.call( this );
// }
// OO.inheritClass( SettingsDialog, OO.ui.ProcessDialog );
// SettingsDialog.static.name = 'settingsDialog';
// SettingsDialog.static.title = mw.msg( 'rt-settings-title' );
// SettingsDialog.static.actions = [
// {
// modes: 'basic',
// action: 'save',
// label: mw.msg( 'rt-save' ),
// flags: [ 'primary', 'progressive' ]
// },
// {
// modes: 'basic',
// label: mw.msg( 'rt-cancel' ),
// flags: 'safe'
// },
// {
// modes: 'disabled',
// action: 'deactivated',
// label: mw.msg( 'rt-done' ),
// flags: [ 'primary', 'progressive' ]
// }
// ];
// SettingsDialog.prototype.initialize = function () {
// var dialog = this;
// SettingsDialog.parent.prototype.initialize.apply( this, arguments );
// this.enableOption = new OO.ui.RadioOptionWidget( {
// label: mw.msg( 'rt-enable' )
// } );
// this.disableOption = new OO.ui.RadioOptionWidget( {
// label: mw.msg( 'rt-disable' )
// } );
// this.enableSelect = new OO.ui.RadioSelectWidget( {
// items: [ this.enableOption, this.disableOption ],
// classes: [ 'rt-enableSelect' ]
// } );
// this.enableSelect.selectItem( this.enableOption );
// this.enableSelect.on( 'choose', function ( item ) {
// if ( item === dialog.disableOption ) {
// dialog.activationMethodSelect.setDisabled( true );
// dialog.delayInput.setDisabled( true );
// dialog.tooltipsForCommentsCheckbox.setDisabled( true );
// } else {
// dialog.activationMethodSelect.setDisabled( false );
// dialog.delayInput.setDisabled( dialog.clickOption.isSelected() );
// dialog.tooltipsForCommentsCheckbox.setDisabled( false );
// }
// } );
// this.hoverOption = new OO.ui.RadioOptionWidget( {
// label: mw.msg( 'rt-hovering' )
// } );
// this.clickOption = new OO.ui.RadioOptionWidget( {
// label: mw.msg( 'rt-clicking' )
// } );
// this.activationMethodSelect = new OO.ui.RadioSelectWidget( {
// items: [ this.hoverOption, this.clickOption ]
// } );
// this.activationMethodSelect.selectItem( activatedByClick ?
// this.clickOption :
// this.hoverOption
// );
// this.activationMethodSelect.on( 'choose', function ( item ) {
// if ( item === dialog.clickOption ) {
// dialog.delayInput.setDisabled( true );
// } else {
// dialog.delayInput.setDisabled( dialog.clickOption.isSelected() );
// }
// } );
// this.activationMethodField = new OO.ui.FieldLayout( this.activationMethodSelect, {
// label: mw.msg( 'rt-activationMethod' ),
// align: 'top'
// } );
// this.delayInput = new OO.ui.NumberInputWidget( {
// input: { value: delay },
// step: 50,
// min: 0,
// max: 5000,
// disabled: activatedByClick,
// classes: [ 'rt-numberInput' ]
// } );
// this.delayField = new OO.ui.FieldLayout( this.delayInput, {
// label: mw.msg( 'rt-delay' ),
// align: 'top'
// } );
// this.tooltipsForCommentsCheckbox = new OO.ui.CheckboxInputWidget( {
// selected: tooltipsForComments
// } );
// this.tooltipsForCommentsField = new OO.ui.FieldLayout(
// this.tooltipsForCommentsCheckbox,
// {
// label: new OO.ui.HtmlSnippet( mw.msg( 'rt-tooltipsForComments' ) ),
// align: 'inline',
// classes: [ 'rt-tooltipsForCommentsField' ]
// }
// );
// new TooltippedElement(
// this.tooltipsForCommentsField.$element.find(
// '.' + ( COMMENTED_TEXT_CLASS || 'rt-commentedText' )
// )
// );
// this.fieldset = new OO.ui.FieldsetLayout();
// this.fieldset.addItems( [
// this.activationMethodField,
// this.delayField,
// this.tooltipsForCommentsField
// ] );
// this.panelSettings = new OO.ui.PanelLayout( {
// padded: true,
// expanded: false
// } );
// this.panelSettings.$element.append(
// this.enableSelect.$element,
// $( '<hr>' ).addClass( 'rt-settingsFormSeparator' ),
// this.fieldset.$element
// );
// this.panelDisabled = new OO.ui.PanelLayout( {
// padded: true,
// expanded: false
// } );
// this.panelDisabled.$element.append(
// $( '<table>' )
// .addClass( 'rt-disabledHelp' )
// .append(
// $( '<tr>' ).append(
// $( '<td>' ).append(
// $( '<img>' ).attr( 'src', 'https://en.wikipedia.org/w/load.php?modules=ext.popups.images&image=footer&format=rasterized&lang=ru&skin=vector&version=0uotisb' )
// ),
// $( '<td>' )
// .addClass( 'rt-disabledNote' )
// .text( mw.msg( 'rt-disabledNote' ) )
// )
// )
// );
// this.stackLayout = new OO.ui.StackLayout( {
// items: [ this.panelSettings, this.panelDisabled ]
// } );
// this.$body.append( this.stackLayout.$element );
// };
// SettingsDialog.prototype.getSetupProcess = function ( data ) {
// return SettingsDialog.parent.prototype.getSetupProcess.call( this, data )
// .next( function () {
// this.stackLayout.setItem( this.panelSettings );
// this.actions.setMode( 'basic' );
// }, this );
// };
// SettingsDialog.prototype.getActionProcess = function ( action ) {
// var dialog = this;
// if ( action === 'save' ) {
// return new OO.ui.Process( function () {
// var newDelay = Number( dialog.delayInput.getValue() );
// enabled = dialog.enableOption.isSelected();
// if ( newDelay >= 0 && newDelay <= 5000 ) {
// delay = newDelay;
// }
// activatedByClick = dialog.clickOption.isSelected();
// tooltipsForComments = dialog.tooltipsForCommentsCheckbox.isSelected();
// setSettingsCookie();
// if ( enabled ) {
// dialog.close();
// disableRt();
// rt( $content );
// } else {
// dialog.actions.setMode( 'disabled' );
// dialog.stackLayout.setItem( dialog.panelDisabled );
// disableRt();
// addEnableLink();
// }
// } );
// } else if ( action === 'deactivated' ) {
// dialog.close();
// }
// return SettingsDialog.parent.prototype.getActionProcess.call( this, action );
// };
// SettingsDialog.prototype.getBodyHeight = function () {
// return this.stackLayout.getCurrentItem().$element.outerHeight( true );
// };
// tooltip.upToTopParent( function adjustRightAndHide() {
// if ( this.isPresent ) {
// if ( this.$element[ 0 ].style.right ) {
// this.$element.css(
// 'right',
// '+=' + ( window.innerWidth - $window.width() )
// );
// }
// this.te.hideRef( true );
// }
// } );
// if ( !windowManager ) {
// windowManager = new OO.ui.WindowManager();
// $body.append( windowManager.$element );
// }
// settingsDialog = new SettingsDialog();
// windowManager.addWindows( [ settingsDialog ] );
// settingsWindow = windowManager.openWindow( settingsDialog );
// settingsWindow.opened.then( function () {
// settingsDialogOpening = false;
// } );
// settingsWindow.closed.then( function () {
// windowManager.clearWindows();
// } );
// }
// var tooltip = this;
// // This variable can change: one tooltip can be called from a harvard-style reference link
// // that is put into different tooltips
// this.te = te;
// switch ( this.te.type ) {
// case 'supRef':
// this.id = 'rt-' + this.te.$originalElement.attr( 'id' );
// this.$content = this.te.$ref
// .contents()
// .filter( function ( i ) {
// var $this = $( this );
// return this.nodeType === Node.TEXT_NODE ||
// !( $this.is( '.mw-cite-backlink' ) ||
// ( i === 0 &&
// // Template:Cnote, Template:Note
// ( $this.is( 'b' ) ||
// // Template:Note_label
// $this.is( 'a' ) &&
// $this.attr( 'href' ).indexOf( '#ref' ) === 0
// )
// )
// );
// } )
// .clone( true );
// break;
// case 'harvardRef':
// this.id = 'rt-' + this.te.$originalElement.closest( 'li' ).attr( 'id' );
// this.$content = this.te.$ref
// .clone( true )
// .removeAttr( 'id' );
// break;
// case 'commentedText':
// this.id = 'rt-' + String( Math.random() ).slice( 2 );
// this.$content = $( document.createTextNode( this.te.comment ) );
// break;
// }
// if ( !this.$content.length ) {
// return;
// }
// this.insideWindow = Boolean( this.te.$element.closest( '.oo-ui-window' ).length );
// this.$element = $( '<div>' )
// .addClass( 'rt-tooltip' )
// .attr( 'id', this.id )
// .attr( 'role', 'tooltip' )
// .data( 'tooltip', this );
// if ( this.insideWindow ) {
// this.$element.addClass( 'rt-tooltip-insideWindow' );
// }
// // We need the $content interlayer here in order for the settings icon to have correct
// // margins
// this.$content = this.$content
// .wrapAll( '<div>' )
// .parent()
// .addClass( 'rt-tooltipContent' )
// .addClass( 'mw-parser-output' )
// .appendTo( this.$element );
// if ( !activatedByClick ) {
// this.$element
// .mouseenter( function () {
// if ( !tooltip.disappearing ) {
// tooltip.upToTopParent( function () {
// this.show();
// } );
// }
// } )
// .mouseleave( function ( e ) {
// // https://stackoverflow.com/q/47649442 workaround. Relying on relatedTarget
// // alone has pitfalls: when alt-tabbing, relatedTarget is empty too
// if ( CLIENT_NAME !== 'chrome' ||
// ( !e.originalEvent ||
// e.originalEvent.relatedTarget !== null ||
// !tooltip.clickedTime ||
// $.now() - tooltip.clickedTime > 50
// )
// ) {
// tooltip.upToTopParent( function () {
// this.te.hideRef();
// } );
// }
// } )
// .click( function () {
// tooltip.clickedTime = $.now();
// } );
// }
// if ( !this.insideWindow ) {
// $( '<div>' )
// .addClass( 'rt-settingsLink' )
// .attr( 'title', mw.msg( 'rt-settings' ) )
// .click( function () {
// if ( settingsDialogOpening ) {
// return;
// }
// settingsDialogOpening = true;
// if ( mw.loader.getState( 'oojs-ui' ) !== 'ready' ) {
// if ( cursorWaitCss ) {
// cursorWaitCss.disabled = false;
// } else {
// cursorWaitCss = mw.util.addCSS( 'body { cursor: wait; }' );
// }
// }
// mw.loader.using( [ 'oojs', 'oojs-ui' ], openSettingsDialog );
// } )
// .prependTo( this.$content );
// }
// // Tooltip tail element is inside tooltip content element in order for the tooltip
// // not to disappear when the mouse is above the tail
// this.$tail = $( '<div>' )
// .addClass( 'rt-tooltipTail' )
// .prependTo( this.$element );
// this.disappearing = false;
// this.show = function () {
// this.disappearing = false;
// clearTimeout( this.te.hideTimer );
// clearTimeout( this.te.removeTimer );
// this.$element
// .removeClass( CLASSES.FADE_OUT_DOWN )
// .removeClass( CLASSES.FADE_OUT_UP );
// if ( !this.isPresent ) {
// $body.append( this.$element );
// }
// this.isPresent = true;
// };
// this.hide = function () {
// var tooltip = this;
// tooltip.disappearing = true;
// if ( tooltip.$element.hasClass( 'rt-tooltip-above' ) ) {
// tooltip.$element
// .removeClass( CLASSES.FADE_IN_DOWN )
// .addClass( CLASSES.FADE_OUT_UP );
// } else {
// tooltip.$element
// .removeClass( CLASSES.FADE_IN_UP )
// .addClass( CLASSES.FADE_OUT_DOWN );
// }
// tooltip.te.removeTimer = setTimeout( function () {
// if ( tooltip.isPresent ) {
// tooltip.$element.detach();
// tooltip.$tail.css( 'left', '' );
// if ( activatedByClick ) {
// $body.off( 'click.rt touchstart.rt', tooltip.te.onBodyClick );
// }
// $window.off( 'resize.rt', tooltip.te.onWindowResize );
// tooltip.isPresent = false;
// }
// }, 200 );
// };
// this.calculatePosition = function ( ePageX, ePageY ) {
// var teElement, teOffsets, teOffset, tooltipTailOffsetX, tooltipTailLeft,
// offsetYCorrection = 0;
// this.$tail.css( 'left', '' );
// teElement = this.te.$element.get( 0 );
// if ( ePageX !== undefined ) {
// tooltipTailOffsetX = ePageX;
// teOffsets = teElement.getClientRects &&
// teElement.getClientRects() ||
// teElement.getBoundingClientRect();
// if ( teOffsets.length > 1 ) {
// for (var i = teOffsets.length - 1; i >= 0; i--) {
// if ( ePageY >= Math.round( $window.scrollTop() + teOffsets[i].top ) &&
// ePageY <= Math.round(
// $window.scrollTop() + teOffsets[i].top + teOffsets[i].height
// )
// ) {
// teOffset = teOffsets[i];
// }
// }
// }
// }
// if ( !teOffset ) {
// teOffset = teElement.getClientRects &&
// teElement.getClientRects()[0] ||
// teElement.getBoundingClientRect();
// }
// teOffset = {
// top: $window.scrollTop() + teOffset.top,
// left: $window.scrollLeft() + teOffset.left,
// width: teOffset.width,
// height: teOffset.height
// };
// if ( !tooltipTailOffsetX ) {
// tooltipTailOffsetX = ( teOffset.left * 2 + teOffset.width ) / 2;
// }
// if ( CLIENT_NAME === 'msie' && this.te.type === 'supRef' ) {
// offsetYCorrection = -Number(
// this.te.$element.parent().css( 'font-size' ).replace( 'px', '' )
// ) / 2;
// }
// this.$element.css( {
// top: teOffset.top - this.$element.outerHeight() - 7 + offsetYCorrection,
// left: tooltipTailOffsetX - 20,
// right: ''
// } );
// // Is it squished against the right side of the page?
// if ( this.$element.offset().left + this.$element.outerWidth() > $window.width() - 1 ) {
// this.$element.css( {
// left: '',
// right: 0
// } );
// tooltipTailLeft = tooltipTailOffsetX - this.$element.offset().left - 5;
// }
// // Is a part of it above the top of the screen?
// if ( teOffset.top < this.$element.outerHeight() + $window.scrollTop() + 6 ) {
// this.$element
// .removeClass( 'rt-tooltip-above' )
// .addClass( 'rt-tooltip-below' )
// .addClass( CLASSES.FADE_IN_UP )
// .css( {
// top: teOffset.top + teOffset.height + 9 + offsetYCorrection
// } );
// if ( tooltipTailLeft ) {
// this.$tail.css( 'left', ( tooltipTailLeft + 12 ) + 'px' );
// }
// } else {
// this.$element
// .removeClass( 'rt-tooltip-below' )
// .addClass( 'rt-tooltip-above' )
// .addClass( CLASSES.FADE_IN_DOWN )
// // A fix for cases when a tooltip shown once is then wrongly positioned when it
// // is shown again after a window resize. We just repeat what is above.
// .css( {
// top: teOffset.top - this.$element.outerHeight() - 7 + offsetYCorrection
// } );
// if ( tooltipTailLeft ) {
// // 12 is the tail element width/height
// this.$tail.css( 'left', tooltipTailLeft + 'px' );
// }
// }
// };
// // Run some function for all the tooltips up to the top one in a tree. Its context will be
// // the tooltip, while its parameters may be passed to Tooltip.upToTopParent as an array
// // in the second parameter. If the third parameter passed to ToolTip.upToTopParent is true,
// // the execution stops when the function in question returns true for the first time,
// // and ToolTip.upToTopParent returns true as well.
// this.upToTopParent = function ( func, parameters, stopAtTrue ) {
// var returnValue,
// currentTooltip = this;
// do {
// returnValue = func.apply( currentTooltip, parameters );
// if ( stopAtTrue && returnValue ) {
// break;
// }
// } while ( currentTooltip = currentTooltip.parent );
// if ( stopAtTrue ) {
// return returnValue;
// }
// };
// }
// if ( !enabled ) {
// addEnableLink();
// return;
// }
// teSelector = REF_LINK_SELECTOR;
// if ( tooltipsForComments ) {
// teSelector += ', ' + COMMENTED_TEXT_SELECTOR;
// }
// $content.find( teSelector ).each( function () {
// new TooltippedElement( $( this ) );
// } );
// }
// settingsString = mw.cookie.get( 'RTsettings' );
// if ( settingsString ) {
// settings = settingsString.split( '|' );
// enabled = Boolean( Number( settings[ 0 ] ) );
// delay = Number( settings[ 1 ] );
// activatedByClick = Boolean( Number( settings[ 2 ] ) );
// // The forth value was added later, so we provide for a default value. See comments below
// // for why we use "IS_TOUCHSCREEN && IS_MOBILE".
// tooltipsForComments = settings[ 3 ] === undefined ?
// IS_TOUCHSCREEN && IS_MOBILE :
// Boolean( Number( settings[ 3 ] ) );
// } else {
// enabled = true;
// delay = 200;
// // Since the mobile browser check is error-prone, adding IS_MOBILE condition here would probably
// // leave cases where a user interacting with the browser using touches doesn't know how to call
// // a tooltip in order to switch to activation by click. Some touch-supporting laptop users
// // interacting by touch (though probably not the most popular use case) would not be happy too.
// activatedByClick = IS_TOUCHSCREEN;
// // Arguably we shouldn't convert native tooltips into gadget tooltips for devices that have
// // mouse support, even if they have touchscreens (there are laptops with touchscreens).
// // IS_TOUCHSCREEN check here is for reliability, since the mobile check is prone to false
// // positives.
// tooltipsForComments = IS_TOUCHSCREEN && IS_MOBILE;
// }
// mw.hook( 'wikipage.content' ).add( rt );
// // Caused by [[phab:T238991]]. The bug stayed for almost a month and affected many users which would
// // have two tooltips appear simultaneously if we remove the fix, so we better keep it indefinitely.
// mw.config.set( 'wgPopupsReferencePreviews', false );
// }() );