MediaWiki:Common.js: differenze tra le versioni

Da Wiki The-West IT.
Vai alla navigazione
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
/* Il codice JavaScript inserito qui viene caricato da ciascuna pagina, per tutti gli utenti. */
/*******************************
/* Wiki Subpage Tooltip Script *
/*******************************/
// Author:  Shawn Bruckner
// Date:    2013-Apr-28
// License: CC-BY 3.0
// Version: beta


var tooltips = {
var wst = wst || {
     debug: true,
 
     dataSubpageTitle : '/Tooltip',
     api: false,
    loadingTemplate: 'Template:Tooltip hover box loading',
     types: [],
     loadedTemplate: 'Template:Tooltip hover box',
     classes: ['basic-tooltip', 'advanced-tooltip'],
     loadingHtml: null,
     advancedCounter: 1,
     classPrefix: 'wst-tooltip-',
     articlePath : null,
     events: [],
     fullScriptPath : null,
     timeouts: [],
     scriptPath: null,
     dataTitlesToCheck: Array(),
     offsetX: 20,
     contentTitles: Array(),
     offsetY: 20,
     dataTitles: Array(),
     waitForImages: false,
 
     encodeAllSpecial : function( unencoded ) {
     init: function() {
         var encoded = "";
         if(location.search.search('ttdebug=true') != -1 || (typeof tooltips_debug != 'undefined' && tooltips_debug)) tooltips.debug = true;
        var c;
         var href = $('link[rel="canonical"]').attr('href')
         var safeChars = /[0-9A-Za-z]/;
         if(typeof href == 'undefined' || !href) {
         for( var i = 0; i < unencoded.length; i++ ) {
             console.log('Tooltips: script couldn\'t find required  link[rel="canonical"]  tag');
             c = unencoded.charAt(i);
             tooltips.disabled = true;
             if ( safeChars.test( c ) ) {
             return false;
                encoded = encoded + c;
             } else {
                encoded = encoded + '_' + c.charCodeAt().toString(16) + '-';
            }
         }
         }
         href = href.split('/wiki/');
         return encoded;
         tooltips.api = href[0]+'/api.php?format=json&action=parse&disablepp=true&prop=text&title='+href[1];
    },
         if(mw.util.getParamValue('uselang')) tooltips.api += '&uselang='+mw.util.getParamValue('uselang');
 
        tooltips.api += '&text=';
    getTitleFromHref : function( href ) {
        var end;
        tooltips.types['basic-tooltip'] = {};
         var result = null;
         tooltips.types['advanced-tooltip'] = {};
        if ( href.indexOf( wst.fullScriptPath ) === 0 ) {
            end = href.substring( wst.fullScriptPath.length );
        if(!tooltips.config()) {
            result = ( new RegExp( 'title=([^&]*)' ) ).exec( end );
             console.log('Tooltips: missing config');
         } else if ( href.indexOf( wst.scriptPath ) === 0 ) {
             tooltips.disabled = true;
            end = href.substring( wst.scriptPath.length );
            return false;
            result = ( new RegExp( 'title=([^&]*)' ) ).exec( end );
         } else if ( href.indexOf( wst.articlePath ) === 0 ) {
             end = href.substring( wst.articlePath.length );
             result = ( new RegExp( '([^?]*)' ) ).exec( end );
         }
         }
 
         var content = $('#WikiaMainContent')
         if ( result ) {
        if(!content.length) content = $('#mw-content-text')
            if ( result[1].substring(0, 8) !== "Special:" ) {
                return decodeURIComponent( result[1] );
        if($('#tooltip-wrapper').length == 0) $('<div id="tooltip-wrapper" class="WikiaArticle"></div>').appendTo(content);
             } else {
        if($('#tooltip-storage').length == 0) $('<div id="tooltip-storage" class="WikiaArticle"></div>').append('<div class="main-tooltip tt-basic-tooltip" id="tooltip-basic-tooltip">Lorem ipsum dolor sit amet</div>').appendTo(content);
                return null;
             }
        $('#tooltip-wrapper')
         } else {
             .css({'margin':'0px','position':'fixed','height':'auto','min-height':'0'})
             return null;
            .hide()
        $('#tooltip-storage')
            .css({'height':'0px','min-height':'0','visibility':'hidden','overflow':'hidden','position':'static'})
        $('#tooltip-basic-tooltip').data('type', 'basic-tooltip');
        tooltips.applyTooltips(document)
        mw.hook('wikipage.content').add(function(elem) {
             tooltips.applyTooltips($(elem));
        });
        if(typeof tooltips.events == 'string') tooltips.events = [tooltips.events]
         for(var x=0; x<tooltips.events.length; x++) { $(window).on(tooltips.events[x], function(ev, elem) { tooltips.applyTooltips(elem || this) }) }
        if(tooltips.debug) {
             $('#tooltip-wrapper').css({'background-color':'rgba(255,0,0,0.2)'})
            $('#tooltip-storage').css({'background-color':'rgba(0,255,0,0.2)','height':'500px','overflow-y':'scroll','visibility':'visible'})
         }
         }
     },
     },
     config: function() {
 
         if(typeof tooltips_list != 'undefined') {
     getTitlesAndContentLinks : function() {
             $(tooltips_list).each(function(i, v) { tooltips.addType(v) });
         var links = $( '#mw-content-text a[href]' );
        var uniqueTitles = {};
        var title;
 
        for ( var i = 0; i < links.length; i++ ) {
             if( title = wst.getTitleFromHref( links[i].href ) ) {
                uniqueTitles[title] = null; // hackish way to ensure only unique titles are added
            }
        }
 
        for ( uniqueTitle in uniqueTitles ) {  
          wst.dataTitlesToCheck.push( uniqueTitle + wst.dataSubpageTitle ); // put unique titles into the array
         }
         }
         if(typeof tooltips_config == 'object') {
    },
            tooltips.offsetX = tooltips_config.offsetX || tooltips.offsetX;
 
            tooltips.offsetY = tooltips_config.offsetY || tooltips.offsetY;
    beginLinkSetup : function() {
            tooltips.waitForImages = (tooltips_config.waitForImages || tooltips.waitForImages) && true;
         wst.articlePath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgArticlePath' ).replace( /\$1/, '' );
             tooltips.events = tooltips_config.events || tooltips.events;
        wst.fullScriptPath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' );
        wst.scriptPath = mw.config.get( 'wgScript' );
 
        wst.getTitlesAndContentLinks();
 
        if ( wst.dataTitlesToCheck.length > 0 ) {
             $.ajax( {
                type: 'POST',
                url: mw.util.wikiScript( 'api' ),
                data: { action: 'parse', format: 'json', text: '{{:' + wst.loadingTemplate + '}}' },
                dataType: 'json',
                success: wst.midLinkSetup
            } );
         }
         }
        return true
     },
     },
     applyTooltips: function(elem) {
 
         $(elem).find('.'+tooltips.classes.join(', .')).each(function() {
     midLinkSetup: function( jsonData ) {
            $this = $(this)
         wst.loadingHtml = jsonData.parse.text['*'];
            if($this.hasClass('tooltips-init-complete')) return;
 
        wst.startQueryPageExistence();      
            $this.find('*').removeAttr('title');
            $this.mouseover(tooltips.handlers.mouseOver);
            $this.mouseout(tooltips.handlers.mouseOut);
            $this.mousemove(tooltips.handlers.mouseMove);
            $this.data('tooltip-contents', $(this).attr('title'));
            $this.removeAttr('title');
            tooltips.advancedTooltip($this);
            $(this).addClass('tooltips-init-complete');
        });
     },
     },
     advancedTooltip: function(elem) {
 
         elem = $(elem)
     startQueryPageExistence : function( ) {
         if(!elem.hasClass('advanced-tooltip')) return;
         titleSubset = Array();
         var tips = elem.find('.tooltip-contents')
         for ( i = 0; i < 50 && wst.dataTitlesToCheck.length > 0; i++ ) {
        if(!tips.length) return;
            titleSubset.push( wst.dataTitlesToCheck.pop() );
         var tip = $('<div class="main-tooltip tt-advanced-tooltip"></div>').attr('id', 'tooltip-advanced-tooltip-'+tooltips.advancedCounter).appendTo('#tooltip-storage').data('type', 'advanced-tooltip').append($(tips[0]).contents()).each(tooltips.calcSize);
        }
        tips.remove();
         var titles = titleSubset.join( '|' );
        elem.data('tooltip-id-advanced-tooltip', tooltips.advancedCounter);
 
         tooltips.advancedCounter++;
         $.ajax( {
            type: 'POST',
            url: mw.util.wikiScript( 'api' ),
            data: { action: 'query', format: 'json', titles: titles },
            dataType: 'json',
            success: wst.finishQueryPageExistence
         } );
     },
     },
     addType: function(tt) {
 
         if(typeof tooltips.types[tt.classname] == 'undefined') {
     finishQueryPageExistence : function( jsonData ) {
            var obj = {}
         wst.filterTitles( jsonData.query.pages );
 
            if(typeof tt.parse == 'string' || typeof tt.parse == 'function') var parse = tt.parse; else var parse = false;
        if ( wst.dataTitlesToCheck.length > 0 ) {
            if(typeof tt.text == 'string' || typeof tt.text == 'function') var text = tt.text; else var text = false;
             wst.startQueryPageExistence();
            if(parse) {
                obj.text = parse;
                obj.parse = true;
            } else if(text) {
                obj.text = text;
                obj.parse = false;
             } else return;
            if(typeof obj.text == 'string') obj.parameters = tooltips.getParameters(obj.text); else obj.parameters = [];
            if(typeof tt.delay == 'string' || typeof tt.delay == 'number') obj.delay = parseInt(tt.delay); else obj.delay = false;
            if(typeof tt.onParsed == 'function') obj.onParsed = tt.onParsed;
            if(typeof tt.onShow == 'function') obj.onShow = tt.onShow;
            if(typeof tt.onHide == 'function') obj.onHide = tt.onHide;
            tooltips.types[tt.classname] = obj;
            if(tooltips.classes.indexOf(tt.classname) == -1) tooltips.classes.push(tt.classname)
         } else {
         } else {
             if(typeof tt.delay == 'string' || typeof tt.delay == 'number') tooltips.types[tt.classname].delay = parseInt(tt.delay);
             wst.finishLinkSetup();
            if(typeof tt.onParsed == 'function') tooltips.types[tt.classname].onParsed = tt.onParsed;
            if(typeof tt.onShow == 'function') tooltips.types[tt.classname].onShow = tt.onShow;
            if(typeof tt.onHide == 'function') tooltips.types[tt.classname].onHide = tt.onHide;
         }
         }
     },
     },
     getParameters: function(text) {
 
         var list = []
     filterTitles : function( pageData ) {
         var matches = text.match(/<#\s*[a-z0-9_\-]+?\s*#>/gi)
         var result, title;
        if(matches) {
         for ( index in pageData ) {
            for(var x=0; x<matches.length; x++) {
            result = pageData[index];
                 list.push(/<#\s*([a-z0-9_\-]+?)\s*#>/i.exec(matches[x])[1])
            if ( result.missing === undefined ) {
                title = result.title.replace( / /g, '_' );
                wst.dataTitles.push( title );
                 wst.contentTitles.push( title.substring( 0, title.length - wst.dataSubpageTitle.length ) );
             }
             }
         }
         }
        return list
     },
     },
     getAPI: function(text) {
 
         return tooltips.api+encodeURIComponent(text)
     finishLinkSetup : function( ) {
    },
         for ( var i = 0; i < wst.contentTitles.length; i++ ) {
    getText: function(type, elem) {
            $( 'body' ).append( '<div id="' + wst.classPrefix + wst.encodeAllSpecial( wst.contentTitles[i] ) +
        if(typeof tooltips.types[type].text == 'function') {
                '" style="display: none; position: absolute; z-index: 10000;">' +
            var text = tooltips.types[type].text($(elem)[0])
                wst.loadingHtml.replace( /\$1/, wst.contentTitles[i].replace( /_/, " " ) ) + '</div>' );
         } else {
         }
            var text = tooltips.types[type].text
 
            for(var x=0; x<tooltips.types[type].parameters.length; x++) {
        var title, id;
                var param = tooltips.types[type].parameters[x]
        var links = $( '#mw-content-text a[href]' );
                var value = $(elem).data(param)
        for ( var i = 0; i < links.length; i++ ) {
                 if(typeof value == 'undefined') value = ''
            title = wst.getTitleFromHref( links[i].href );
                 var rx = new RegExp('<#\\s*'+param.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&")+'\\s*#>', 'g')
            if ( title !== null && $.inArray( title, wst.contentTitles ) !== -1 ) {
                text = text.replace(rx, value)
                id = wst.classPrefix + wst.encodeAllSpecial( title );
                 links.eq(i).on( 'mouseover', { id : id, title : title }, function( event ) { wst.showTooltip( event ); } );
                 links.eq(i).on( 'mousemove', { id : id }, function( event ) { wst.moveTooltip( event ); } );
                links.eq(i).on( 'mouseout', { id : id }, function( event ) { wst.hideTooltip( event ); } );
             }
             }
         }
         }
        return text
     },
     },
     getTooltip: function(type, elem) {
 
         elem = $(elem)
     showTooltip : function( event ) {
        if(elem.data('tooltip-id-'+type)) return $('#tooltip-'+type+'-'+elem.data('tooltip-id-'+type))
         tooltipBox = $( '#' + event.data.id );
         wst.positionTooltip( event.data.id, event.pageX, event.pageY );
        var text = tooltips.getText(type, elem)
         tooltipBox.fadeIn();
        var id = tooltips.hash(text)
 
         elem.data('tooltip-id-'+type, id)
         if ( !tooltipBox.hasClass( 'loaded' ) && !tooltipBox.hasClass( 'loading' ) ) {
             tooltipBox.addClass( wst.classPrefix + 'loading' );
        var tip = $('#tooltip-'+type+'-'+elem.data('tooltip-id-'+type))
            wst.beginLoadTooltip( event.data.id, event.data.title );
        if(tip.length) return tip;
        tip = $('<div class="main-tooltip"></div>').attr('id', 'tooltip-'+type+'-'+id).appendTo('#tooltip-storage').data('type', type).addClass('tt-'+type)
         tooltips.wrapperPosition(tooltips.lastKnownMousePos[0], tooltips.lastKnownMousePos[1])
        tooltips.sameWidth()
         if(!tooltips.types[type].parse) {
            tip.html(text).each(tooltips.calcSize)
            tooltips.wrapperPosition(tooltips.lastKnownMousePos[0], tooltips.lastKnownMousePos[1])
            tooltips.sameWidth()
        } else {
            tip.addClass('tooltip-loading')
            var api = tooltips.getAPI(text)
            if(tooltips.debug) tip.html('<pre style="padding:2px 3px;font-size:11px;">'+api+'</pre>')
            tip.attr('title', api)
             $.ajax({
                url: api,
                dataType: 'json',
                context: tip,
                success: function(data, textStatus, jqXHR) {
                    $(this).html(data['parse']['text']['*']).each(tooltips.calcSize)
                    tooltips.wrapperPosition(tooltips.lastKnownMousePos[0], tooltips.lastKnownMousePos[1])
                    tooltips.sameWidth()
                    var images = $(this).find('img')
                    images.fadeTo(0, 0).one('load', function() {
                        if(tooltips.waitForImages) {
                            $(this).fadeTo(0,1);
                            $(this).addClass('image-loaded')
                            tip = $(this).closest('.main-tooltip')
                            if(tip.find('img').length == tip.find('img.image-loaded').length) {
                                tip.removeClass('tooltip-loading').each(tooltips.calcSize)
                                tooltips.wrapperPosition(tooltips.lastKnownMousePos[0], tooltips.lastKnownMousePos[1])
                                tooltips.sameWidth()
                            }
                        } else $(this).fadeTo(100,1);
                    })
                    if(tooltips.waitForImages) {
                        if(images.length == 0) {
                            $(this).removeClass('tooltip-loading').each(tooltips.calcSize)
                        }
                    } else {
                        $(this).removeClass('tooltip-loading').each(tooltips.calcSize)
                    }
                    var type = $(this).data('type') || false
                    if(type && typeof tooltips.types[type].onParsed == 'function') {
                        tooltips.types[type].onParsed.call(this);
                        tip.each(tooltips.calcSize)
                    }
                    if($(this).find('a.new').length > 0) $(this).addClass('has-redlinks')
                    tooltips.wrapperPosition(tooltips.lastKnownMousePos[0], tooltips.lastKnownMousePos[1])
                    tooltips.sameWidth()
                }
            });
         }
         }
        return tip
     },
     },
     getBasicTooltip: function(elem) {
 
         return $("#tooltip-basic-tooltip").html($(elem).data('tooltip-contents').replace(/\\n/g,'<br />')).each(tooltips.calcSize);
     beginLoadTooltip : function( id, title ) {
         $.ajax( {
            type: 'POST',
            url: mw.util.wikiScript( 'api' ),
            data: { action: 'parse', format: 'json', title: title.replace( /_/, ' ' ),
                text: '{{:' + title + wst.dataSubpageTitle + '|' + wst.loadedTemplate + '}}' },
            dataType: 'json',
            success: function( jsonData ) { wst.finishLoadTooltip( id, jsonData ); }
        } );
     },
     },
     getAdvancedTooltip: function(elem) {
 
         return $("#tooltip-advanced-tooltip-"+$(elem).data('tooltip-id-advanced-tooltip'));
     finishLoadTooltip : function( id, jsonData ) {
         tooltipBox = $( '#' + id );
        tooltipBox.addClass( 'loaded' );
        tooltipBox.removeClass( 'loading' );
        tooltipBox.html( jsonData.parse.text['*'] );
     },
     },
     getTooltips: function(elem) {
 
         elem = $(elem)
     moveTooltip : function( event ) {
        var classes = elem.attr('class').split(' ')
         wst.positionTooltip( event.data.id, event.pageX, event.pageY );
        var tips = []
        for(var i=0;i<classes.length;i++) {
            var tip = false;
            if(classes[i] == 'advanced-tooltip') tip = tooltips.getAdvancedTooltip(elem);
            else if(classes[i] == 'basic-tooltip') tip = tooltips.getBasicTooltip(elem);
            else if(typeof tooltips.types[classes[i]] != 'undefined') tip = tooltips.getTooltip(classes[i], elem);
            if(tip) tips.push(tip[0]);
        }
        return $(tips)
     },
     },
     setOwnWidth: function() {
 
         $this = $(this)
     positionTooltip: function( id, pageX, pageY ) {
         if(typeof $this.data('width') != 'undefined') $this.css('width', $this.data('width')+'px')
         var tooltip = $( '#' + id );
         else $this.css('width', '')
         var bodyOffsets = document.body.getBoundingClientRect();
    },
         var bodyX = pageX - bodyOffsets.left;
    calcSize: function() {
        var bodyY = pageY - bodyOffsets.top;
         $this = $(this)
         var scrollX = $( document ).scrollLeft();
        $this.css('position', 'absolute')
         var scrollY = $( document ).scrollTop();
         var temp = $this.css('width')
         var bodyWidth = $( 'body' ).width();
        $this.css('width', '')
         var bodyHeight = $( 'body' ).height();
         $this.data('width', $this.width());
         var viewWidth = $( window ).width();
         $this.data('height', $this.height());
         var viewHeight = $( window ).height();
         $this.data('outerwidth', $this.outerWidth(true));
         var topAdjust = 6;
        $this.data('outerheight', $this.outerHeight(true));
 
         $this.css('width', $this.data('width')+'px')
         if ( tooltip.width() * 1.1 > pageX - scrollX ) {
        $this.css('position', '')
             tooltip.css( { 'left' : bodyX - scrollX + 15, 'right' : 'auto' } );
         $this.css('width', temp)
            topAdjust = 36;
    },
    sameWidth: function() {
         if($("#tooltip-wrapper").find('.main-tooltip').length == 1) {
             $("#tooltip-wrapper").find('.main-tooltip').each(tooltips.setOwnWidth)
         } else {
         } else {
             var width = 0;
             tooltip.css( { 'right' : bodyWidth - bodyX + scrollX + 6, 'left' : 'auto' } );
            $("#tooltip-wrapper").find('.main-tooltip').each(function() { width = Math.max(width, $(this).data('width') || 0); });
            $("#tooltip-wrapper").find('.main-tooltip').each(function() { $(this).css('width', width+'px'); });
         }
         }
    },
 
    wrapperPosition: function(mouseX, mouseY) {
         if ( tooltip.height() * 1.5 > pageY - scrollY ) {
         var tipH = parseInt($("#tooltip-wrapper").css('padding-top')) + parseInt($("#tooltip-wrapper").css('padding-bottom'));
            tooltip.css( { 'top' : bodyY - scrollY + topAdjust, 'bottom' : 'auto' } );
        var tipW = 0;
        $("#tooltip-wrapper").find('.main-tooltip').each( function(){ if(typeof $(this).data('outerheight') != 'undefined') tipH += $(this).data('outerheight'); });
        $("#tooltip-wrapper").find('.main-tooltip').each( function(){ if(typeof $(this).data('outerwidth') != 'undefined') tipW = Math.max(tipW, $(this).data('outerwidth') + parseInt($("#tooltip-wrapper").css('padding-left')) + parseInt($("#tooltip-wrapper").css('padding-right'))); });
        var coordX = tooltips.offsetX+mouseX;
        var coordY = tooltips.offsetY+mouseY;
        var toRight = $(window).width()-coordX;
        if ($("#tooltip-wrapper").css('position') == 'fixed') {
            coordX = coordX-$(window).scrollLeft();
            coordY = coordY-$(window).scrollTop();
            coordY = Math.min(coordY, $(window).height()-tipH-$('#WikiaBarWrapper').height());
         } else {
         } else {
             coordY = Math.min(coordY, $(window).height()-tipH-$('#WikiaBarWrapper').height()+$(window).scrollTop());
             tooltip.css( { 'bottom' : bodyHeight - bodyY + scrollY + 3, 'top' : 'auto' } );
         }
         }
        if(toRight >= tipW) $("#tooltip-wrapper").css({left: coordX + 'px', top: coordY + 'px'});
        else $("#tooltip-wrapper").css({left: coordX-tipW-tooltips.offsetX*2 + 'px', top: coordY + 'px'});
     },
     },
     handlers: {
 
        mouseOver: function(e) {
     hideTooltip : function( event ) {
            tooltips.lastKnownMousePos = [e.pageX, e.pageY]
        $( '#' + event.data.id ).fadeOut();
            tooltips.wrapperPosition(e.pageX, e.pageY)
    }
 
            var tips = tooltips.getTooltips(this)
};
            $("#tooltip-wrapper").prepend(tips).show();
 
            tooltips.sameWidth()
mw.loader.using( 'mediawiki.util' ).then( function() {
    wst.beginLinkSetup();
            var handle = this
} );
            tips.each(function() {
 
                var $this = $(this);
/***********************************
                var type = $(this).data('type') || false;
/* End Wiki Subpage Tooltip Script *
/***********************************/
                $this.show();
                if(type && typeof tooltips.types[type] != 'undefined' && tooltips.types[type].delay) {
                    $this.hide()
                    tooltips.timeouts[$(this).attr('id')] = setTimeout(function(){
                        $this.show();
                        if(type && typeof tooltips.types[type].onShow == 'function') tooltips.types[type].onShow.call($this[0], handle);
                    }, tooltips.types[type].delay)
                } else if(type && typeof tooltips.types[type].onShow == 'function') tooltips.types[type].onShow.call(this, handle);
            });
        },
        mouseOut: function(e) {
            tooltips.lastKnownMousePos = [e.pageX, e.pageY]
            tooltips.wrapperPosition(e.pageX, e.pageY)
            var handle = this
            $("#tooltip-wrapper").hide()
            $("#tooltip-wrapper").find('.main-tooltip').appendTo('#tooltip-storage').each(function() {
                var type = $(this).data('type') || false;
                if(type && typeof tooltips.types[type].onHide == 'function') tooltips.types[type].onHide.call(this, handle);
                $(this).show()
                clearTimeout(tooltips.timeouts[$(this).attr('id')])
                delete tooltips.timeouts[$(this).attr('id')]
            });
        },
        mouseMove: function(e) {
            tooltips.lastKnownMousePos = [e.pageX, e.pageY]
            tooltips.wrapperPosition(e.pageX, e.pageY)
        },
    },
    hash: function(text) {
        /* Source: http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/ */
        var hash = 0, i, char;
        if (text.length == 0) return hash;
        for (i = 0, l = text.length; i < l; i++) {
            char  = text.charCodeAt(i);
            hash  = ((hash<<5)-hash)+char;
            hash |= 0; // Convert to 32bit integer
        }
        return hash;
    },
}
addOnloadHook(tooltips.init)

Versione delle 13:37, 16 dic 2016

/*******************************
/* Wiki Subpage Tooltip Script *
/*******************************/
// Author:  Shawn Bruckner
// Date:    2013-Apr-28
// License: CC-BY 3.0
// Version: beta

var wst = wst || {

    dataSubpageTitle : '/Tooltip',
    loadingTemplate: 'Template:Tooltip hover box loading',
    loadedTemplate: 'Template:Tooltip hover box',
    loadingHtml: null,
    classPrefix: 'wst-tooltip-',
    articlePath : null,
    fullScriptPath : null,
    scriptPath: null,
    dataTitlesToCheck: Array(),
    contentTitles: Array(),
    dataTitles: Array(),

    encodeAllSpecial : function( unencoded ) {
        var encoded = ""; 
        var c;
        var safeChars = /[0-9A-Za-z]/;
        for( var i = 0; i < unencoded.length; i++ ) {
            c = unencoded.charAt(i);
            if ( safeChars.test( c ) ) {
                encoded = encoded + c;
            } else {
                encoded = encoded + '_' + c.charCodeAt().toString(16) + '-';
            }
        }
        return encoded;
    },

    getTitleFromHref : function( href ) {
        var end;
        var result = null;
        if ( href.indexOf( wst.fullScriptPath ) === 0 ) {
            end = href.substring( wst.fullScriptPath.length );
            result = ( new RegExp( 'title=([^&]*)' ) ).exec( end );
        } else if ( href.indexOf( wst.scriptPath ) === 0 ) {
            end = href.substring( wst.scriptPath.length );
            result = ( new RegExp( 'title=([^&]*)' ) ).exec( end );
        } else if ( href.indexOf( wst.articlePath ) === 0 ) {
            end = href.substring( wst.articlePath.length );
            result = ( new RegExp( '([^?]*)' ) ).exec( end );
        }

        if ( result ) {
            if ( result[1].substring(0, 8) !== "Special:" ) {
                return decodeURIComponent( result[1] );
            } else {
                return null;
            }
        } else {
            return null;
        }
    },

    getTitlesAndContentLinks : function() {
        var links = $( '#mw-content-text a[href]' );
        var uniqueTitles = {};
        var title;

        for ( var i = 0; i < links.length; i++ ) {
            if( title = wst.getTitleFromHref( links[i].href ) ) {
                uniqueTitles[title] = null; // hackish way to ensure only unique titles are added
            }
        }

        for ( uniqueTitle in uniqueTitles ) { 
          wst.dataTitlesToCheck.push( uniqueTitle + wst.dataSubpageTitle ); // put unique titles into the array
        }
    },

    beginLinkSetup : function() {
        wst.articlePath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgArticlePath' ).replace( /\$1/, '' );
        wst.fullScriptPath = mw.config.get( 'wgServer' ) + mw.config.get( 'wgScript' );
        wst.scriptPath = mw.config.get( 'wgScript' );

        wst.getTitlesAndContentLinks();

        if ( wst.dataTitlesToCheck.length > 0 ) {
            $.ajax( {
                type: 'POST',
                url: mw.util.wikiScript( 'api' ),
                data: { action: 'parse', format: 'json', text: '{{:' + wst.loadingTemplate + '}}' },
                dataType: 'json',
                success: wst.midLinkSetup
            } );
        }
    },

    midLinkSetup: function( jsonData ) {
        wst.loadingHtml = jsonData.parse.text['*'];

        wst.startQueryPageExistence();        
    },

    startQueryPageExistence : function( ) {
        titleSubset = Array();
        for ( i = 0; i < 50 && wst.dataTitlesToCheck.length > 0; i++ ) {
            titleSubset.push( wst.dataTitlesToCheck.pop() );
        }
        var titles = titleSubset.join( '|' );

        $.ajax( {
             type: 'POST',
             url: mw.util.wikiScript( 'api' ),
             data: { action: 'query', format: 'json', titles: titles },
             dataType: 'json',
             success: wst.finishQueryPageExistence
        } );
    },

    finishQueryPageExistence : function( jsonData ) {
        wst.filterTitles( jsonData.query.pages );

        if ( wst.dataTitlesToCheck.length > 0 ) {
            wst.startQueryPageExistence();
        } else {
            wst.finishLinkSetup();
        }
    },

    filterTitles : function( pageData ) {
        var result, title;
        for ( index in pageData ) {
            result = pageData[index];
            if ( result.missing === undefined ) {
                title = result.title.replace( / /g, '_' );
                wst.dataTitles.push( title );
                wst.contentTitles.push( title.substring( 0, title.length - wst.dataSubpageTitle.length ) );
            }
        }
    },

    finishLinkSetup : function( ) {
        for ( var i = 0; i < wst.contentTitles.length; i++ ) {
            $( 'body' ).append( '<div id="' + wst.classPrefix + wst.encodeAllSpecial( wst.contentTitles[i] ) + 
                '" style="display: none; position: absolute; z-index: 10000;">' + 
                wst.loadingHtml.replace( /\$1/, wst.contentTitles[i].replace( /_/, " " ) ) + '</div>' );
        }

        var title, id;
        var links = $( '#mw-content-text a[href]' );
        for ( var i = 0; i < links.length; i++ ) {
            title = wst.getTitleFromHref( links[i].href );
            if ( title !== null && $.inArray( title, wst.contentTitles ) !== -1 ) {
                id = wst.classPrefix + wst.encodeAllSpecial( title );
                links.eq(i).on( 'mouseover', { id : id, title : title }, function( event ) { wst.showTooltip( event ); } );
                links.eq(i).on( 'mousemove', { id : id }, function( event ) { wst.moveTooltip( event ); } );
                links.eq(i).on( 'mouseout', { id : id }, function( event ) { wst.hideTooltip( event ); } );
            }
        }
    },

    showTooltip : function( event ) {
        tooltipBox = $( '#' + event.data.id );
        wst.positionTooltip( event.data.id, event.pageX, event.pageY );
        tooltipBox.fadeIn();

        if ( !tooltipBox.hasClass( 'loaded' ) && !tooltipBox.hasClass( 'loading' ) ) {
            tooltipBox.addClass( wst.classPrefix + 'loading' );
            wst.beginLoadTooltip( event.data.id, event.data.title );
        }
    },

    beginLoadTooltip : function( id, title ) {
        $.ajax( {
             type: 'POST',
             url: mw.util.wikiScript( 'api' ),
             data: { action: 'parse', format: 'json', title: title.replace( /_/, ' ' ),
                 text: '{{:' + title + wst.dataSubpageTitle + '|' + wst.loadedTemplate + '}}' },
             dataType: 'json',
             success: function( jsonData ) { wst.finishLoadTooltip( id, jsonData ); }
        } );
    },

    finishLoadTooltip : function( id, jsonData ) {
        tooltipBox = $( '#' + id );
        tooltipBox.addClass( 'loaded' );
        tooltipBox.removeClass( 'loading' );
        tooltipBox.html( jsonData.parse.text['*'] );
    },

    moveTooltip : function( event ) {
        wst.positionTooltip( event.data.id, event.pageX, event.pageY );
    },

    positionTooltip: function( id, pageX, pageY ) {
        var tooltip = $( '#' + id );
        var bodyOffsets = document.body.getBoundingClientRect();
        var bodyX = pageX - bodyOffsets.left;
        var bodyY = pageY - bodyOffsets.top;
        var scrollX = $( document ).scrollLeft();
        var scrollY = $( document ).scrollTop();
        var bodyWidth = $( 'body' ).width();
        var bodyHeight = $( 'body' ).height();
        var viewWidth = $( window ).width();
        var viewHeight = $( window ).height();
        var topAdjust = 6;

        if ( tooltip.width() * 1.1 > pageX - scrollX ) {
            tooltip.css( { 'left' : bodyX - scrollX + 15, 'right' : 'auto' } );
            topAdjust = 36;
        } else {
            tooltip.css( { 'right' : bodyWidth - bodyX + scrollX + 6, 'left' : 'auto' } );
        }

        if ( tooltip.height() * 1.5 > pageY - scrollY ) {
            tooltip.css( { 'top' : bodyY - scrollY + topAdjust, 'bottom' : 'auto' } );
        } else {
            tooltip.css( { 'bottom' : bodyHeight - bodyY + scrollY + 3, 'top' : 'auto' } );
        }
    },

    hideTooltip : function( event ) {
        $( '#' + event.data.id ).fadeOut();
    }

};

mw.loader.using( 'mediawiki.util' ).then( function() {
    wst.beginLinkSetup();
} );

/***********************************
/* End Wiki Subpage Tooltip Script *
/***********************************/