User:Equazcion/Floater.js

mw.loader.using( ['mediawiki.util', 'mediawiki.user'], function () {

return;

// Disable for now, as this script is throwing exceptions

var imageHistory = "https://upload.wikimedia.org/wikipedia/commons/1/1d/Clock_simple_white.svg";

var imageEdit = "http://upload.wikimedia.org/wikipedia/commons/e/ec/Btn_edit.gif";

var imageSwitch = "https://upload.wikimedia.org/wikipedia/commons/e/e8/Play_blauw.png";

// Load prerequisites

importStylesheet('User:Equazcion/Floater.css');

loadJQViewport();

// Predict a static floater height

var floaterHeight = 31;

// Create/insert empty Floater div

$('#mw-head').prepend('

');

// Grab the div

var floater = $('.floater');

// Set URL prefix

var pre = location.protocol + '//' + mw.config.get('wgPageContentLanguage') + '.' + mw.config.get('wgNoticeProject') + '.org' + '/w/index.php?title=';

// Construct the page title line here. Long titles will need to be truncated.

if (mw.config.get('wgPageName').length > 40){

if (mw.config.get('wgNamespaceNumber') == 0){

pageNS = '';

} else if (mw.config.get('wgNamespaceNumber') == 4) {

pageNS = 'WP:';

} else if (mw.config.get('wgNamespaceNumber') == 5) {

pageNS = 'WP Talk:';

} else if (mw.config.get('wgNamespaceNumber') == 8) {

pageNS = 'MW:';

} else if (mw.config.get('wgNamespaceNumber') == 9) {

pageNS = 'MW Talk:';

} else if (mw.config.get('wgNamespaceNumber') == 14) {

pageNS = 'Cat:';

} else if (mw.config.get('wgNamespaceNumber') == 15) {

pageNS = 'Cat talk:';

} else {

pageNS = mw.config.get('wgCanonicalNamespace') + ':';

}

var pageTitle = pageNS + mw.config.get('wgTitle').substr(0,7) + '...' + mw.config.get('wgTitle').substr(-15);

var titleLine = '

  • ' + pageTitle.replace(/_/g,' ') + '
  • ';

    } else {

    var titleLine = '

  • ' + mw.config.get('wgPageName').replace(/_/g,' ') + '
  • ';

    }

    // If the current page has an "add section" tab, construct a link

    if ($('#ca-addsection').length > 0){

    var addSection = '

  • +Section' + '
  • ';

    } else {

    var addSection = '';

    }

    // Add preview and save buttons if we're editing

    if ((mw.config.get('wgAction') == 'edit') || (mw.config.get('wgAction') == 'submit')){

    var editButton = '

  • ' +

    '

  • ' +

    '

  • Edit' + '
  • ';

    } else {

    var editButton = '

  • Edit' + '
  • ';

    }

    // Leave out main/talk switch and history buttons on Special pages

    if (mw.config.get('wgNamespaceNumber') > -1){

    var switchButton = '

  • ' + getAssoc('name') + '' + '
  • ';

    var historyButton = '

  • History' + '
  • ';

    } else {

    var switchButton = '';

    var historyButton = '';

    }

    // Fill the Floater div with some crap

    floater.html(

    // Left section for page title, edit, history, and main/talk toggle

    '

    ' +

    '

    ' +

    '

    ' +

    // Small links for info, logs, whatlinkshere

    '

    ' +

    '

    ' +

    '

    ' +

    // Search bar

    '

    ' +

    '

    ' +

    '

    ' +

    '' +

    '' +

    '' +

    '

    ' +

    '

    ' +

    '

    ' +

    // User links

    '

    ' +

    '

    ' +

    '

    ');

    // Set the "go to top" click function: Go to the MediaWiki top anchor, then scroll up some more

    $('a.gotoTop').click(function(){

    window.location.hash="top";

    window.scrollBy(0, -floaterHeight - 50);

    });

    // Wait half a sec for images to load etc. b4 un-hiding Floater

    setTimeout(function(){floater.prop('hidden', false)},500);

    // Listen for TOC or other internal anchor clicks and adjust page scrolling to un-obscure the associated header

    $(window).on('hashchange', function(){

    adjustForHash();

    });

    // Run the scroll function once on load after additional half-second delay to display Floater in case we come in mid-page

    setTimeout(function(){

    scroll();

    adjustForHash();

    },500);

    function adjustForHash(){

    // If we're coming in mid-page due to an anchor link, make sure the anchored header isn't obscured by Floater

    if (window.location.hash) {

    // Get DOM version of the anchored header using [0], then use DOM method to get its viewport coordinates

    var anchorCoords = $('[id="' + window.location.hash.replace('#','') + '"]:last')[0].getBoundingClientRect();

    // If the pagetop links aren't in view and the anchored header is likely obscured by Floater, scroll up to reveal it

    if (($('#p-namespaces ul li:above-the-top').length > 0) && (anchorCoords.bottom < 25)){

    window.scrollBy(0, -floaterHeight - 5);

    }

    }

    }

    // Set the function for scrolling

    $(window).scroll(function(){

    scroll();

    });

    // Use :above-the-top (from plugin below) to check for pagetop stuff outside window. If they're there, start the music.

    function scroll(){

    if ($('#p-namespaces ul li:above-the-top').length > 0){

    floater.css('top','0');

    } else {

    floater.css('top','-' + floaterHeight + 'px');

    }

    }

    // Find the title of the associated talk or main page. Is there an easier way?

    function getAssoc(type){

    var toggledTitle = '';

    var toggled = '';

    var ns = mw.config.get('wgNamespaceNumber');

    var title = mw.config.get('wgTitle');

    if (ns == 0){

    toggledTitle = "Talk:" + title;

    toggled = "Talk";

    } else if (ns == 1){

    toggledTitle = title;

    toggled = "Article";

    } else if (ns == 2){

    toggledTitle = "User_talk:" + title;

    toggled = "Talk";

    } else if (ns == 3){

    toggledTitle = "User:" + title;

    toggled = "User page";

    } else if (ns == 4){

    toggledTitle = "Wikipedia_talk:" + title;

    toggled = "Talk";

    } else if (ns == 5){

    toggledTitle = "Wikipedia:" + title;

    toggled = "Project page";

    } else if (ns == 6){

    toggledTitle = "File_talk:" + title;

    toggled = "Talk";

    } else if (ns == 7){

    toggledTitle = "File:" + title;

    toggled = "File page";

    } else if (ns == 8){

    toggledTitle = "MediaWiki_talk:" + title;

    toggled = "Talk";

    } else if (ns == 9){

    toggledTitle = "MediaWiki:" + title;

    toggled = "MediaWiki page";

    } else if (ns == 10){

    toggledTitle = "Template_talk:" + title;

    toggled = "Talk";

    } else if (ns == 11){

    toggledTitle = "Template:" + title;

    toggled = "Template page";

    } else if (ns == 12){

    toggledTitle = "Help_talk:" + title;

    toggled = "Talk";

    } else if (ns == 13){

    toggledTitle = "Help:" + title;

    toggled = "Help page";

    } else if (ns == 14){

    toggledTitle = "Category_talk:" + title;

    toggled = "Talk";

    } else if (ns == 15){

    toggledTitle = "Category" + title;

    toggled = "Cat page";

    } else if (ns == 16){

    toggledTitle = "Portal_talk:" + title;

    toggled = "Talk";

    } else if (ns == 17){

    toggledTitle = "Portal:" + title;

    toggled = "Portal page";

    }

    if (type == 'url'){

    var returned = toggledTitle;

    } else if (type == 'name'){

    var returned = toggled;

    }

    return returned;

    }

    // Add the :above-the-top jQuery selector, which we use to check if user has scrolled past a certain point.

    function loadJQViewport(){

    /* Excerpt from http://www.appelsiini.net/projects/viewport, Copyright (c) 2008-2009 Mika Tuupola, MIT license: http://www.opensource.org/licenses/mit-license.php

    $(":above-the-top") */

    (function($) {

    $.abovethetop = function(element, settings){

    var top = $(window).scrollTop();

    return top >= $(element).offset().top + $(element).height() - settings.threshold;

    };

    $.extend($.expr[':'], {

    "above-the-top": function(a, i, m) {

    return $.abovethetop(a, {threshold : 0});

    }

    });

    })(jQuery);

    }

    //If the clock gadget is enabled, replicate it for Floater

    if (mw.user.options.get('gadget-UTCLiveClock') == 1){

    var $target;

    function showTime($target){

    var dateNode = $('#utcdate2');

    if (!dateNode){return;}

    var now = new Date();

    var hh = now.getUTCHours();

    var mm = now.getUTCMinutes();

    var ss = now.getUTCSeconds();

    if ($target === undefined){$target = $(dateNode).find('a:first');}

    var time = ( hh < 10 ? '0' + hh : hh ) +

    ':' + ( mm < 10 ? '0' + mm : mm ) +

    ':' + ( ss < 10 ? '0' + ss : ss );

    $target.text(time);

    var ms = now.getUTCMilliseconds();

    setTimeout( function(){showTime($target); }, 1100 - ms);

    }

    showTime();

    }

    // The rest of this replicates the MediaWiki suggest functionality for Floater's search box

    var map2, resultRenderCache2, searchboxesSelectors2;

    var $searchInput2 = $('#searchInput2');

    var $searchRegion2 = $('#simpleSearch2');

    function computeResultRenderCache2(context){

    var $form, formAction, baseHref, linkParams;

    $form = context.config.$region.closest('form');

    formAction = $form.attr('action');

    baseHref = formAction + (formAction.match(/\?/) ? '&' : '?');

    linkParams = {};

    $.each( $form.serializeArray(), function (idx, obj){linkParams[obj.name] = obj.value;});

    return {textParam: context.data.$textbox.attr('name'), linkParams: linkParams, baseHref: baseHref};

    }

    function renderFunction2(text, context){

    if (!resultRenderCache2){resultRenderCache2 = computeResultRenderCache2(context);}

    resultRenderCache2.linkParams[resultRenderCache2.textParam] = text;

    this.append($('').css('whiteSpace', 'nowrap').text(text)).wrap($('')

    .attr('href', resultRenderCache2.baseHref + $.param( resultRenderCache2.linkParams)).addClass('mw-searchSuggest-link'));

    }

    searchboxesSelectors2 = ['#searchInput2'];

    $(searchboxesSelectors2.join(', ')).suggestions({fetch: function (query){

    var $el, jqXhr;

    if (query.length !== 0){

    $el = $(this);

    jqXhr = $.ajax({url: mw.util.wikiScript('api'),data: {format: 'json', action: 'opensearch', search: query, namespace: 0, suggest: ''},

    dataType: 'json', success: function (data){if ($.isArray(data) && data.length){$el.suggestions('suggestions', data[1]);}}});

    $el.data('request', jqXhr);

    }},

    cancel: function (){

    var jqXhr = $(this).data('request');

    if (jqXhr && $.isFunction(jqXhr.abort)){jqXhr.abort();$(this).removeData('request');

    }},result: {render: renderFunction2,select: function ($input){$input.closest('form').submit();}},

    delay: 120, highlightInput: true}).bind('paste cut drop', function (){$(this).trigger('keypress');});

    function specialrenderFunction2(query, context){

    var $el = this;

    if (!resultRenderCache2){resultRenderCache2 = computeResultRenderCache2(context);}

    resultRenderCache2.linkParams[resultRenderCache2.textParam] = query;

    if ($el.children().length === 0){

    $el.append($('

    ').addClass('special-label').text(mw.msg('searchsuggest-containing')), $('
    ').addClass('special-query').text(query).autoEllipsis()).show();

    } else {$el.find('.special-query').text(query).autoEllipsis();}

    if ($el.parent().hasClass('mw-searchSuggest-link')){

    $el.parent().attr('href', resultRenderCache2.baseHref + $.param(resultRenderCache2.linkParams) + '&fulltext=1');

    } else {$el.wrap($('').attr('href', resultRenderCache2.baseHref + $.param(resultRenderCache2.linkParams) + '&fulltext=1').addClass('mw-searchSuggest-link'));}

    }

    $searchInput2.attr('placeholder', mw.msg('searchsuggest-search')).placeholder();

    $searchInput2.suggestions({result: {render: renderFunction2, select: function ($input){$input.closest('form').submit();}},

    special: {

    render: specialrenderFunction2, select: function ($input){$input.closest('form').append($(''));

    $input.closest('form').submit();}}, $region: $searchRegion2});

    });