MediaWiki:Gadget-floatingTips.js

Материал из свободной русской энциклопедии «Традиция»
Перейти к: навигация, поиск
/*
 * Приспособление floatingTooltips для показа всплывающих подсказок
 *     над сносками, если текст сносок за пределами экрана (<ref>, расширение Cite),
 *     и над текстом с подсказкой (шаблон Подсказка).
 *     Стиль подсказок определён в файле MediaWiki:Gadget-floatingTips.css.
 *     Используется поставляемый с MediaWiki плагин jQuery tipsy (зависимость jquery.tipsy).
 *     Александр Машин для «Традиции», 2014.
 *
 */

// Для совместимости jquery.tipsy с jQuery 1.11:
$.fn.live = $.fn.on;

// После загрузки страницы:
 window.pg || $(document).ready (function ($) {
    
    // Настройки tipsy:
    var tipsy_settings = {
	    delayIn : 200     // -- 200 мс до выскакивания,
	  , delayOut: 3000    // -- 3 с, достаточно, чтобы доехать до ссылок и вложенных всплывающих сносок в сноске,
	  , fade    : true    // -- для красоты,
	    // Расположение подсказок в зависимости от текущего положения сноски в окне просмотра:
	  , gravity : function () {
        	var $this     = $(this);
        	var $document = $(document);
        	var $window   = $(window);
        	return ($this.offset ().top  > ($document.scrollTop  () + $window.height () * 0.25) ? 's' : 'n')
        	     + ($this.offset ().left > ($document.scrollLeft () + $window.width  () * 0.35) ? 'e' : 'w');
        }	  
	  , html    : true    // -- чтобы работало сложное форматирование,
	  , offset  : 0       // -- 0 пикселов от сноски,
	  , opacity : 1       // -- полная непрозрачность,
	  , hover   : 'hover' // -- не 'focus' или 'manual',
	  , live    : true    // -- чтобы работали вложенные,
	  , title   : function () {
			return getTipText ($(this));
	    }
    };
    
    // Селектор, внутри которого могут быть подсказки:
    var tipped = '.reference, .tipped';
    
    // Функция генерации подсказки для фрагмента $tipped:
    function getTipText ($tipped) {
        var $tip;
        if ($tipped.hasClass ('tipped')) {
		    // .tipped:
			$tip =  $tipped.find ('.tip').first ().clone ().show ();
		} else {
			// сноска:
			var href = $tipped.children ('a').first ().attr ('href');
			var id = href && href.substring (href.indexOf ('#') + 1);
			$tip = $(document.getElementById (id)).find ('.reference-text');
		}
		// Рекурсивно снабдить подсказками:
		$tip.find (tipped).tipsy (tipsy_settings);
		return $tip.html () || '<em>(сноска не задана)</em>';
    }
    
    // Сноски верхнего уровня:
	$(tipped).tipsy (tipsy_settings);

});