|
|
Line 1: |
Line 1: |
| /* Any JavaScript here will be loaded for users using the mobile site */
| |
| /* MF broke the mobile styles loading in 1.31 */
| |
| mw.loader.using( 'mobile.site.styles' );
| |
|
| |
|
| ( function() {
| |
| 'use strict';
| |
|
| |
| /* Variables for interface text used throughout the script, for ease of translating */
| |
| var i18n = {
| |
| // File upload
| |
| defaultLicense: 'License'
| |
| };
| |
|
| |
| /**
| |
| * Instead of cluttering up the global scope with
| |
| * variables, they should instead be set as a
| |
| * property of this global variable
| |
| *
| |
| * E.g: Instead of
| |
| * myVar = 'blah';
| |
| * use
| |
| * mcw.myVar = 'blah';
| |
| */
| |
| var mcw = window.mcw = {};
| |
|
| |
| /* Fires when DOM is ready */
| |
| $( function() {
| |
|
| |
| var urlRegex = /.*Special:MobileDiff\/([0-9]+).*/;
| |
| var currentID = location.href.replace(urlRegex, '$1');
| |
| var prevID = $('#content #mw-mf-diffarea .revision-history-prev a[href]').attr('href').replace(urlRegex, '$1');
| |
|
| |
| var pagelink = $('#content #mw-mf-diffarea a[href*="oldid"]');
| |
| pagelink.after('<br>(<a href="/' + pagelink.text().replace(/ /g, '_') + '" style="color:#36c">View current page</a>)');
| |
|
| |
| $('#content #mw-mf-diffarea').append('<a class="mw-ui-button" href="/' + pagelink.text().replace(/ /g, '_') + '?action=edit&undoafter=' + prevID + '&undo=' + currentID + '">Undo</a>');
| |
|
| |
|
| |
| /**
| |
| * Pause animations on mouseover of a designated container (.animated-container and .mcui)
| |
| *
| |
| * This is so people have a chance to look at the image and click on pages they want to view.
| |
| */
| |
| $( '#mw-content-text' ).on( 'mouseenter mouseleave', '.animated-container, .mcui', function( e ) {
| |
| $( this ).find( '.animated' ).toggleClass( 'animated-paused', e.type === 'mouseenter' );
| |
| } );
| |
|
| |
|
| |
| /**
| |
| * Fix edit summary prompt for undo
| |
| *
| |
| * Fixes the fact that the undo function combined with the "no edit summary prompter"
| |
| * causes problems if leaving the edit summary unchanged.
| |
| * Added by [[wikipedia:User:Deskana]], code by [[wikipedia:User:Tra]].
| |
| * See https://bugzilla.wikimedia.org/show_bug.cgi?id=8912
| |
| */
| |
| if ( document.location.search.indexOf( "undo=" ) !== -1 && document.getElementsByName( 'wpAutoSummary' )[0] ) {
| |
| document.getElementsByName( 'wpAutoSummary' )[0].value='1';
| |
| }
| |
|
| |
|
| |
| // /**
| |
| // * Make simple search suggestions box separately styled
| |
| // */
| |
| // mw.loader.using( 'mediawiki.searchSuggest', function() {
| |
| // setTimeout( function() {
| |
| // $( '.suggestions:first' ).addClass( 'searchbar' );
| |
| // } );
| |
| // } );
| |
|
| |
|
| |
| /**
| |
| * Set unlicensed as the default license on file pages
| |
| *
| |
| * That way the file will be categorised so someone can find a license for the file
| |
| */
| |
| if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Upload' ) {
| |
| var $license = $( '#wpLicense' );
| |
| if ( $license.length ) {
| |
| if ( !$license.val() ) {
| |
| $license.val( i18n.defaultLicense );
| |
| }
| |
|
| |
| mw.loader.using( 'mediawiki.special.upload', function() {
| |
| setTimeout( function() {
| |
| $license.change();
| |
| } );
| |
| } );
| |
| }
| |
| }
| |
|
| |
|
| |
| /**
| |
| * Creates minecraft style tooltips
| |
| *
| |
| * Replaces normal tooltips. Supports minecraft [[formatting codes]] (except k), and a description with line breaks (/).
| |
| */
| |
| ( function() {
| |
| var escapeChars = { '\\&': '&', '<': '<', '>': '>' };
| |
| var escape = function( text ) {
| |
| // "\" must be escaped first
| |
| return text.replace( /\\\\/g, '\' )
| |
| .replace( /\\&|[<>]/g, function( char ) { return escapeChars[char]; } );
| |
| };
| |
| var $tooltip = $();
| |
| var $win = $( window ), winWidth, winHeight, width, height;
| |
|
| |
| $( '#mw-content-text' ).on( {
| |
| 'mouseenter.minetip': function( e ) {
| |
| $tooltip.remove();
| |
|
| |
| var $elem = $( this ), title = $elem.attr( 'data-minetip-title' );
| |
| if ( title === undefined ) {
| |
| title = $elem.attr( 'title' );
| |
| if ( title !== undefined ) {
| |
| title = $.trim( title.replace( /&/g, '\\&' ) );
| |
| $elem.attr( 'data-minetip-title', title );
| |
| }
| |
| }
| |
|
| |
| // No title or title only contains formatting codes
| |
| if ( title === undefined || title !== '' && title.replace( /&([0-9a-fl-or])/g, '' ) === '' ) {
| |
| // Find deepest child title
| |
| var childElem = $elem[0], childTitle;
| |
| do {
| |
| if ( childElem.hasAttribute( 'title' ) ) {
| |
| childTitle = childElem.title;
| |
| }
| |
| childElem = childElem.firstChild;
| |
| } while( childElem && childElem.nodeType === 1 );
| |
| if ( childTitle === undefined ) {
| |
| return;
| |
| }
| |
|
| |
| // Append child title as title may contain formatting codes
| |
| if ( !title ) {
| |
| title = '';
| |
| }
| |
| title += $.trim( childTitle.replace( /&/g, '\\&' ) );
| |
|
| |
| // Set the retrieved title as data for future use
| |
| $elem.attr( 'data-minetip-title', title );
| |
| }
| |
|
| |
| if ( !$elem.data( 'minetip-ready' ) ) {
| |
| // Remove title attributes so the native tooltip doesn't get in the way
| |
| $elem.find( '[title]' ).addBack().removeAttr( 'title' );
| |
| $elem.data( 'minetip-ready', true );
| |
| }
| |
|
| |
| if ( title === '' ) {
| |
| return;
| |
| }
| |
|
| |
| var content = '<span class="minetip-title">' + escape( title ) + '&r</span>';
| |
|
| |
| var description = $.trim( $elem.attr( 'data-minetip-text' ) );
| |
| if ( description ) {
| |
| // Apply normal escaping plus "/"
| |
| description = escape( description ).replace( /\\\//g, '/' );
| |
| content += '<span class="minetip-description">' + description.replace( /\//g, '<br>' ) + '&r</span>';
| |
| }
| |
|
| |
| // Add classes for minecraft formatting codes
| |
| while ( content.search( /&[0-9a-fl-o]/ ) > -1 ) {
| |
| content = content.replace( /&([0-9a-fl-o])(.*?)(&r|$)/g, '<span class="format-$1">$2</span>&r' );
| |
| }
| |
| // Remove reset formatting
| |
| content = content.replace( /&r/g, '' );
| |
|
| |
| $tooltip = $( '<div id="minetip-tooltip">' );
| |
| $tooltip.html( content ).appendTo( 'body' );
| |
|
| |
| // Cache current window and tooltip size
| |
| winWidth = $win.width();
| |
| winHeight = $win.height();
| |
| width = $tooltip.outerWidth( true );
| |
| height = $tooltip.outerHeight( true );
| |
|
| |
| // Trigger a mouse movement to position the tooltip
| |
| $elem.trigger( 'mousemove', e );
| |
| },
| |
| 'mousemove.minetip': function( e, trigger ) {
| |
| if ( !$tooltip.length ) {
| |
| $( this ).trigger( 'mouseenter' );
| |
| return;
| |
| }
| |
|
| |
| // Get event data from remote trigger
| |
| e = trigger || e;
| |
|
| |
| // Get mouse position and add default offsets
| |
| var top = e.clientY - 34;
| |
| var left = e.clientX + 14;
| |
|
| |
| // If going off the right of the screen, go to the left of the cursor
| |
| if ( left + width > winWidth ) {
| |
| left -= width + 36;
| |
| }
| |
|
| |
| // If now going off to the left of the screen, resort to going above the cursor
| |
| if ( left < 0 ) {
| |
| left = 0;
| |
| top -= height - 22;
| |
|
| |
| // Go below the cursor if too high
| |
| if ( top < 0 ) {
| |
| top += height + 47;
| |
| }
| |
| // Don't go off the top of the screen
| |
| } else if ( top < 0 ) {
| |
| top = 0;
| |
| // Don't go off the bottom of the screen
| |
| } else if ( top + height > winHeight ) {
| |
| top = winHeight - height;
| |
| }
| |
|
| |
| // Apply the positions
| |
| $tooltip.css( { top: top, left: left } );
| |
| },
| |
| 'mouseleave.minetip': function() {
| |
| if ( !$tooltip.length ) {
| |
| return;
| |
| }
| |
|
| |
| $tooltip.remove();
| |
| $tooltip = $();
| |
| }
| |
| }, '.minetip, .invslot-item' );
| |
| }() );
| |
|
| |
| //Code For books
| |
| $('.pageactive').each(function (_, page) {
| |
| setupPage($(page));
| |
| });
| |
| $('.book_leftarrow').click(function () {
| |
| setupPage($(this).siblings('.pageactive').removeClass('pageactive').prev());
| |
| });
| |
| $('.book_rightarrow').click(function () {
| |
| setupPage($(this).siblings('.pageactive').removeClass('pageactive').next());
| |
| });
| |
|
| |
|
| |
| //Code for Cycling
| |
| $('.cyclist > :not(:first-child)').hide();
| |
| setInterval(function() {
| |
| if (!!$('.cyclist').filter(function() { return $(this).is(":hover"); }).length) return;
| |
| $('.cyclist > :not(:hidden)').hide().each(function() {
| |
| var elem = $(this);
| |
| elem.next().show();
| |
| if (elem.is(':last-child')) elem.siblings().first().show();
| |
| });
| |
| }, 2000);
| |
|
| |
|
| |
| } );
| |
| /* End DOM ready */
| |
|
| |
| function setupPage (active) {
| |
| active.addClass('pageactive');
| |
| var index = active.index();
| |
| var length = active.siblings().length - 2;
| |
| active.siblings('.book_pagenum').text('Page ' + index + ' of ' + length);
| |
| active.siblings('.book_leftarrow, .book_rightarrow').show();
| |
| if (index == 1) {
| |
| active.siblings('.book_leftarrow').hide();
| |
| }
| |
| if (index == length) {
| |
| active.siblings('.book_rightarrow').hide();
| |
| }
| |
| }
| |
|
| |
| }() );
| |