Jump to content

User:SoledadKabocha/common.js

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by SoledadKabocha (talk | contribs) at 04:57, 7 August 2018 (disable the features of badAnchorWarning.js that use jQuery html() (really because there are false warnings when editing sections with certain special characters in the title)). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
var dt   = new Date( );
var dtH  = dt.getHours( );
var dtM  = dt.getMinutes( );
var dtUDm = dt.getUTCDate( );
var dtUDw = dt.getUTCDay( );

// XXX: There are still more mw.config.get calls to replace with this
// XXX: Should use a time delay after each attempt, but that would need Promises (?)
function safelyGetMwConfig( confName ) {
  var result = null, maxAttempts = 18;
  for ( var i = 0; i < maxAttempts; i++ ) {
    try {
      result = mw.config.get( confName );
    } catch ( ex ) {
      /* XXX TODO */
    }
    if ( result !== null ) { return result; }
  }
  return result;
}

var zzSentinel = dt.getSeconds( ) + Math.random( );
var         zzAction           = safelyGetMwConfig( 'wgAction' );
if ( typeof zzAction           !== 'string' ) zzAction           = zzSentinel + '';
var         zzArticleId        = safelyGetMwConfig( 'wgArticleId' );
if ( typeof zzArticleId        !== 'number' ) zzArticleId        = zzSentinel;
var         zzUserEditCount    = safelyGetMwConfig( 'wgUserEditCount' );
if ( typeof zzUserEditCount    !== 'number' ) zzUserEditCount    = zzSentinel;
var         zzPageName         = safelyGetMwConfig( 'wgPageName' );
if ( typeof zzPageName         !== 'string' ) zzPageName         = zzSentinel + '';
var         zzNamespaceNumber  = safelyGetMwConfig( 'wgNamespaceNumber' );
if ( typeof zzNamespaceNumber  !== 'number' ) zzNamespaceNumber  = zzSentinel;
var         zzPageContentModel = safelyGetMwConfig( 'wgPageContentModel' );
if ( typeof zzPageContentModel !== 'string' ) zzPageContentModel = zzSentinel + '';

// XXX: this is the syntax used in linkclassifier, but
// [[mw:RL/DEV#Client-side (dynamically)]] says to use mw.loader.using(...).done(...) instead?
// NB: jsfnPortletLink, below, isn't actually called til well after this point (and its definition).
// Similarly for hideTwinklePortlet defined below (XXX reconsider)
function hideTwinklePortlet( ) {
	mw.util.addCSS( '#p-twinkle, a[href*="twinklerevert="], div[id^="tw-revert"] { display:none; }' );
}
mw.loader.using( [ 'mediawiki.util', 'mediawiki.notify' ], function ( ) {
	if ( typeof mw.util.jsMessage === 'function' ) {
		var origMUJsM = mw.util.jsMessage;
		mw.util.jsMessage = function( myMsg, clss ) {
			if ( myMsg === 'Could not load twinkleoptions.js' && clss === undefined ) {
				hideTwinklePortlet( );
			}
			origMUJsM( myMsg, clss );
		}
	}

	mw.util.addPortletLink( 'p-tb', '#replaceMe', '__________', 'ca-dummysep' );
	mw.util.addCSS( '#p-logo:hover { filter:blur(' + ( Math.random( ) + Math.random( ) ) + 'px); }' );

});

var zzRealBackendResponseTime = safelyGetMwConfig( 'wgBackendResponseTime' );
// TODO: randomize the sentinel value for db lag similarly
var zzSentinelBackendResponseTime = 10 * ( 6000 + Math.floor( Math.random( ) * 24000 ) ) + 9;
var zzBackendResponseTime = zzSentinelBackendResponseTime;
if (
  typeof zzRealBackendResponseTime === 'number' &&
  zzRealBackendResponseTime >= 0 &&
  zzRealBackendResponseTime === Math.ceil( zzRealBackendResponseTime )
) {
  zzBackendResponseTime = zzRealBackendResponseTime;
}

//TODO: create a separate version which supports the 5th arg of addPortletLink (title text)
function jsfnPortletLink( container, myFunc, dispName, liId, myArg ) {
  var hasMwNotifyLoaded = ( typeof mw.notify === 'function' );

  var typ = typeof myFunc;
  if ( typ !== 'function' ) {
    var errStr = 'myFunc was a(n) ' + typ + ', but we needed a function';
    if ( hasMwNotifyLoaded ) {
      mw.notify(
        $( '<strong class="error">[jsfnPortletLink] ' + errStr + '</strong>' ),
        { autoHide: false }
      );
    }
    throw new TypeError( errStr );
  }

  try {
  var plnk = mw.util.addPortletLink(
                          container,    '#', dispName, liId
  );
  $( plnk ).click( function ( e ) {
    e.preventDefault( );

    //TODO: expand to handle multiple args
    myFunc.call( this, myArg );
  });
  } catch ( ex ) {
    if ( hasMwNotifyLoaded ) {
      mw.notify(
        $(
          '<strong class="error">[jsfnPortletLink] ' +
          'Something went wrong adding the link; swallowing error to preserve other functionality' +
          '</strong>'
        ),
        { autoHide: false }
      );
    }
  }
}

//using gadget
LocalComments = {
	dateDifference: true,
	dateFormat: 'dmy',
	timeFirst: true,
	twentyFourHours: true,
	dayOfWeek: true,
	dropDays: 121,
	dropMonths: 30
};

//$( '#searchInput' ).attr( 'placeholder', '' );

var isActionEditing = /it$/.test( zzAction );

function printSHStatus( ) {
  mw.util.jsMessage( '<samp>TOut: ' + syntaxHighlighterConfig.timeout        + 'ms<br />'
                         + 'Best: ' + window.syntaxHlBestTime                + 'ms<br />'
                         + 'Wrst: ' + window.syntaxHlWorstTime               + 'ms<br />'
                         + 'UpLf: ' + window.syntaxHlTimeoutUpdatesLeft      + '<br />'
                         + 'SpTl: ' + syntaxHighlighterConfig.spikeTolerance + 'ms<br />'
                         + 'NumS: ' + window.syntaxHlNumSpikesTolerated      + '<br />'
                         + 'Abrt: ' + window.syntaxHlAborted                 + '<br />'
                         + 'dPRF: ' + window.syntaxHlDetectedResistFingerprintingPref + '</samp>' );
}
syntaxHighlighterConfig = {
  adaptiveTiming: true,
  timeoutCallback: function( thresh, actual ) {
    mw.util.jsMessage( 'syntax highlighter abort ' + actual + 'ms&gt;' + thresh + 'ms<br />'
                     + '<samp>Best: '   + window.syntaxHlBestTime               + 'ms<br />'
                           + 'Wrst: '   + window.syntaxHlWorstTime              + 'ms<br />'
                           + 'UpLf: ' + window.syntaxHlTimeoutUpdatesLeft      + '<br />'
                           + 'SpTl: ' + syntaxHighlighterConfig.spikeTolerance + 'ms<br />'
                           + 'NumS: ' + window.syntaxHlNumSpikesTolerated      + '<br />'
                           + 'Abrt: ' + window.syntaxHlAborted                 + '<br />'
                           + 'dPRF: ' + window.syntaxHlDetectedResistFingerprintingPref + '</samp>' );
  }
}
if ( Math.random( ) < 5/8 ) {
  syntaxHighlighterConfig.timeoutMsg = '';
}
else {
  syntaxHighlighterConfig.languageOverride = 'es';
}

function checkBadPipeTrick( ) {
  var edsumbox = $( '#wpSummary' );
  if ( !edsumbox || edsumbox.length === 0 ) return;
  var edsumboxtext = edsumbox.val( );
  if ( typeof edsumboxtext !== 'string' ) return;
  if ( /\[\[.+\|\]\]/.test( edsumboxtext ) ) {
    mw.util.addCSS( '.mw-summary-preview{color:red;}' )
    mw.util.addCSS( '.mw-summary-preview a{text-decoration:line-through;}' )
    mw.util.addCSS( '.mw-summary-preview a:not(.new){color:red;}' )
    mw.notify( $(
      '<span class="badpipewarn">Attempted pipe trick in edit summary &mdash; does NOT work</span>'
    ) );
  }
  else if ( /^Undid revision \d+ by \[\[Special:Contributions\/SoledadKabocha\|SoledadKabocha\]\] \(\[\[User talk:SoledadKabocha\|talk\]\]\)$/.test( edsumboxtext ) ) {
    //DIRTY HACK - move this elsewhere - scope of zz vars??
    if ( safelyGetMwConfig( 'wgAction' ) === 'edit' ) { //that is, not 'submit'
      edsumbox.val( edsumboxtext.replace( 'SoledadKabocha]] ([[User talk:SoledadKabocha|talk]])', 'self]]: ' ) );
    }
  }

  var editbox = $( '#wpTextbox1' );
  if ( !editbox || editbox.length === 0 ) return;
  var editboxtext = editbox.val( );
  if ( typeof editboxtext !== 'string' ) return;
  if ( /<ref( name="[^<>]+")?>[^<>]*\[\[[^<>]+\|\]\][^<>]*<\/ref>/.test( editboxtext ) ) {
    mw.notify( $(
      '<span class="badpipewarn">Attempted pipe trick in footnote &mdash; does NOT work</span>'
    ) );
  }
  if ( editboxtext.indexOf( '``' + '`' ) !== -1 ) {
    mw.notify( $(
      '<span class="badpipewarn">Shift key not pressed hard enough when signing?</span>'
    ) );
    // XXX: should have a separate class name
  }
}
var isEditingSection = ( window.location.search.indexOf( "section=" ) !== -1 );
var isLongArticle = /^(List_of_(Internet_top-level_domain|TCP_and_UDP_port_number)s|Wikipedia:Database_reports\/)$/.test( zzPageName ) && zzAction !== 'history' /*&& !isEditingSection // hmmm */;
var isViewingANArchive = ( /^Wikipedia:.+noticeboard\/.*Archive\d+$/.test( zzPageName ) && zzAction === 'view' );
if ( isActionEditing ) {
  importScript('User:SoledadKabocha/enterInSummaryPreviews.js');
  window.BetterCancelAddSectionAnchor = true;
  importScript('User:SoledadKabocha/betterCancelLite.js');

  window.aBBWarnInitially = ( zzAction === 'submit' );

  if ( zzPageContentModel === 'wikitext' ) {
    importScript( 'User:SoledadKabocha/syntax highlighter experimental.js' );
    if ( syntaxHighlighterConfig.adaptiveTiming ) {
      jsfnPortletLink( 'p-cactions', printSHStatus, 'synHs', 'ca-syntaxhighlightdbg' );
    }
    importScript('User:SoledadKabocha/cleanArrows.js');
    window.aBBWarnInitially = ( window.aBBWarnInitially && (zzNamespaceNumber % 2) === 0 );
  }

  importScript('User:SoledadKabocha/antiBracketBot.js');

  /*if ( document.getElementById( 'mw-missingsummary' ) ) {
    var jqMSWarn = $( '#mw-missingsummary .mbox-text' );
    var MSWarnStr = jqMSWarn.html( );
    if ( MSWarnStr ) jqMSWarn.html( MSWarnStr.replace( 'Edit summaries help other users understand the intention of your edits. ', '' ) );
  }*/

  checkBadPipeTrick( );
}
else {
  if ( zzNamespaceNumber >= 0 && zzAction === 'view' ) {
    if ( zzPageName === 'Wikipedia:Lamest_edit_wars' ) {
      $( '#bodyContent div' ).removeClass( 'plainlinks' );
    }
    else if ( zzPageName.indexOf( 'Wikipedia:Wikipedia_Signpost/20' ) === 0 ) {
      $( '#bodyContent div:not(.NavContent):not([style*="font-family"])' ).removeClass( 'plainlinks' );
    }
  }

  // toggle uncat display (potentially) every 20 minutes,
  // with the boundary of the 20-min intervals shifted by +/- 1 min
  // based on something slowly varying (i.e. my edit count)
  var dtUnitMapping = [
    Math.min( dtH + dtUDw, dtUDm ),
    dtH,
    Math.max( dtH + dtUDw, dtUDm )
  ];
  var dtMfudged = dtM;
  if ( zzUserEditCount % 4 === 0 ) {
    dtMfudged--;
    if ( dtMfudged < 0 ) dtMfudged = 59;
  }
  else if ( zzUserEditCount % 4 === 2 ) {
    dtMfudged++;
    if ( dtMfudged > 59 ) dtMfudged = 0;
  }
  var mess = zzArticleId || document.URL.charCodeAt( -1 );
  var thirdOfHrIndex = Math.floor( dtMfudged / 20 );
  // Math.floor guarantees that the result, if a finite number, is an integer
  // The typeof might be unnecessary, but can never be too sure...
  if ( typeof thirdOfHrIndex !== 'number' || !isFinite( thirdOfHrIndex ) || thirdOfHrIndex < 0 || thirdOfHrIndex > 2 ) {
    mw.notify(
      'common.js (rediruncategorized): We found that it is the ' + thirdOfHrIndex + '-th third of the hour, which is invalid!',
      { autoHide: false }
    );
    thirdOfHrIndex = 0;
  }
  mess += dtUnitMapping[ thirdOfHrIndex ];
  mess %= 2;
  if ( mess === 0 ) { //formerly [[User:SoledadKabocha/rediruncategorized.css]]
    mw.util.addCSS( 'A.redirect.redir-uncategorized:not(.userlink):hover,' +
                    'A.mw-redirect.redir-uncategorized:not(.userlink):hover'+
                    '{color:red; background-image:linear-gradient(to top, white, #ffed59, white);}' );
  }

  window.BAWarnInSiteSub = false;
  window.BAWarnAsJsMessage = false;
  window.BAAutofillSearch = !isViewingANArchive;
  importScript('User:SoledadKabocha/badAnchorWarning.js');
}

window.CLRNNoAutoStart = window.CLRNstripAnchors = true;
importScript('User:SoledadKabocha/contentLinkRedirectNo.js');
function addRedirectNoWrapper( ) {
  if ( typeof addRedirectNo === 'function' ) {
    addRedirectNo( );
    var myPortletLink = $( '#ca-contentredirectno' );
    if ( myPortletLink ) myPortletLink.remove( );
  }
}
jsfnPortletLink( 'p-tb', addRedirectNoWrapper, 'Add redirect=no', 'ca-contentredirectno' );

function editboxSpacesToTabs( tabSize ) {
  if ( typeof tabSize !== 'number' || tabSize !== Math.ceil( tabSize ) || tabSize < 2 ) return;

  var editbox = $( '#wpTextbox1' );
  if ( !editbox || editbox.length === 0 ) return;
  var editboxtext = editbox.val( );
  if ( typeof editboxtext !== 'string' ) return;

  var maxLevel = 15;
  var exemplar = '';
  for ( var i = 0; i < maxLevel; i++ ) {
    exemplar += '	';
  }

  var levelSeen = 0;

  for ( var curLevel = maxLevel; curLevel > 0; curLevel-- ) {
    var re = new RegExp( '^ {' + ( tabSize * curLevel ) + '}', 'gm' );
    var neweditboxtext = editboxtext.replace( re, exemplar );
    if ( neweditboxtext !== editboxtext && levelSeen === 0 ) {
      levelSeen = curLevel;
    }
    editboxtext = neweditboxtext;
    exemplar = exemplar.slice( 0, -1 );
  }

  mw.notify( 'Highest tab level: ' + levelSeen );
  editbox.val( editboxtext );
}
if ( isActionEditing ) {
  jsfnPortletLink( 'p-cactions', editboxSpacesToTabs, 'Sp→T(2)', 'ca-sptotab-2', 2 );
  jsfnPortletLink( 'p-cactions', editboxSpacesToTabs, 'Sp→T(4)', 'ca-sptotab-4', 4 );
  jsfnPortletLink( 'p-cactions', editboxSpacesToTabs, 'Sp→T(8)', 'ca-sptotab-8', 8 );
}

//window.checkLinksToCitations = ( zzNamespaceNumber !== 10 && !( zzNamespaceNumber % 2 === 1 && zzPageName.indexOf('/') === -1 ) );
//if ( !isEditingSection ) { importScript('User:SoledadKabocha/HarvErrors.js'); }
function checkHarv( ) { /* TODO: log something */ }

const FALLBACK_LAG = 999999;
function lagCheckerCallback( r, sts, xhr ) {
    if ( typeof afterLagCheck !== 'function' ) {
        mw.notify(
            'common.js: lagCheckerCallback could not find afterLagCheck! ' +
            'This means we did not load completely!',
            { autoHide: false }
        );
        return;
    }

    if ( !r ) {
        afterLagCheck( FALLBACK_LAG ); return;
    }
    if ( !r.query ) {
        afterLagCheck( FALLBACK_LAG ); return;
    }
    if ( !r.query.dbrepllag ) {
        afterLagCheck( FALLBACK_LAG ); return;
    }
    if ( !r.query.dbrepllag[0] ) {
        afterLagCheck( FALLBACK_LAG ); return;
    }
    if ( r.query.dbrepllag[0]['lag'] === undefined ) {
        afterLagCheck( FALLBACK_LAG ); return;
    }

    var lagSeconds = parseInt( r.query.dbrepllag[0]['lag'] );
    if ( !isFinite( lagSeconds ) ) lagSeconds = FALLBACK_LAG;

    afterLagCheck( lagSeconds );
}

var lcq = {
    format:'json',
    action:'query',
    meta:'siteinfo',
    siprop:'dbrepllag'
};
$.ajax( {
    url:mw.util.wikiScript('api'),
    dataType:'json',
    type:'POST',
    data:lcq,
    rawdata:lcq,
    success:lagCheckerCallback,
    error:function( xhr, textStatus, errorThrown ) {
        if ( typeof afterLagCheck === 'function' ) {
            afterLagCheck( FALLBACK_LAG );
        }
    }
} );

/* *** BEGIN afterLagCheck *** */ function afterLagCheck( lagSeconds ) {
var totalSrvLoad = lagSeconds * 1000 + zzBackendResponseTime;

var numLinks = 9999;
try {
  numLinks = $( '#bodyContent a[href^="/w"]' ).length;
} catch ( ex ) {
  /* XXX TODO */
}
if ( typeof numLinks !== 'number' ) { numLinks = 9999; } // arbitrary num > loadThresh

var dummysepHash = '#lag=' + lagSeconds + '...brt=' + zzBackendResponseTime + '...nlnk=' + numLinks;

// todo, make conditional on ns etc.?
var loadThresh = 8096;
var llHypotSq = totalSrvLoad * totalSrvLoad + numLinks * numLinks;
// "dblagging" name is a historical artifact
var dblagging = llHypotSq > ( loadThresh * loadThresh );
if ( dblagging ) {
  var lagWarnStr = 'Pausing scripts due to server load and/or long page';
  var lagWarnAutohide = true;
  //var lagCheckEncounteredFatalError = false;
  if ( lagSeconds === FALLBACK_LAG ) {
    lagWarnStr = 'Problem checking db lag - pausing scripts';
    lagWarnAutohide = ( zzNamespaceNumber === 0 && zzAction === 'view' );
    //temporarily moved here (hmm)
    if ( typeof hideTwinklePortlet === 'function' ) { hideTwinklePortlet( ); }
  }
  else if ( zzBackendResponseTime === zzSentinelBackendResponseTime ) {
    lagWarnStr = 'Got ' + zzRealBackendResponseTime +
                 ' for wgBackendResponseTime, which is not a nonneg. int! ';/* +
                 'Should never happen! Second try ';*/

    /*var brtSecondTry = mw.config.get( 'wgBackendResponseTime' );
    if (
      typeof brtSecondTry === 'number' &&
      brtSecondTry >= 0 &&
      brtSecondTry === Math.ceil( brtSecondTry )
    ) {
      zzBackendResponseTime = brtSecondTry;
      lagWarnStr += 'seems to have worked, though.';

      //If we failed to get one config var, we probably failed to get others too (XXX really?)
      if ( zzAction           === zzSentinel + '' ) lagWarnStr += ' [A!]';
      if ( zzNamespaceNumber  === zzSentinel      ) lagWarnStr += ' [NN!]';
      if ( zzPageName         === zzSentinel + '' ) lagWarnStr += ' [PN!]';
      if ( zzPageContentModel === zzSentinel + '' ) lagWarnStr += ' [PCM!]';
      //safer to re-get these unconditionally?
      zzAction           = mw.config.get( 'wgAction' );
      zzNamespaceNumber  = mw.config.get( 'wgNamespaceNumber' );
      zzPageName         = mw.config.get( 'wgPageName' );
      zzPageContentModel = mw.config.get( 'wgPageContentModel' );

      lagWarnAutohide = ( zzNamespaceNumber === 0 && zzAction === 'view' );

      totalSrvLoad = lagSeconds * 1000 + zzBackendResponseTime;
      dblagging = ( totalSrvLoad * totalSrvLoad + numLinks * numLinks ) > ( loadThresh * loadThresh );
    }
    else {
      lagWarnStr += 'failed too! PANIC!! ABORTING - PLEASE RELOAD!!';
      lagWarnAutohide = false;
      lagCheckEncounteredFatalError = true;
    }
    dummysepHash = dummysepHash.replace(
      '...realbrt=REPLACEME',
      '...realbrt=' + zzRealBackendResponseTime + '...retrybrt=' + brtSecondTry
    );*/
  }
  mw.notify( lagWarnStr, { autoHide: lagWarnAutohide } );
  /*if ( lagCheckEncounteredFatalError === true ) {
    if ( typeof hideTwinklePortlet === 'function' ) { hideTwinklePortlet( ); }
    throw new Error( 'mw.config.get failed repeatedly in user script - should never happen unless browser is mishandling timeouts' );
  }*/
} else {
  window.talklinkDisableRedirection = true;
  window.talklinkShowRedirectTarget = true;
  if ( zzNamespaceNumber >= 0 && (zzNamespaceNumber % 2) === 0 && /^.i/.test( zzAction ) ) importScript('User:SoledadKabocha/talklink.js'); //mod.from User:Anomie/talklink.js
}

//dummysepHash = dummysepHash.replace( '...realbrt=REPLACEME', '' );
$( '#ca-dummysep a' ).attr( 'href', dummysepHash );

var isPageSandbox = ( zzPageName === 'Wikipedia:Sandbox' || zzPageName === 'Wikipedia_talk:Sandbox' || /^Template(_talk)?:X[1-9](\/(doc|testcases))?$/.test( zzPageName ) || zzPageName === 'Template:Template_sandbox' || zzPageName.toLowerCase().indexOf( '/sandbox' ) !== -1 );

window.LinkClassifierAutohideFatalErrors = zzNamespaceNumber === 0 && zzAction === 'view';
window.LinkClassifierNoApihighlimits = true;
window.LinkClassifierOnDemand = dblagging || zzPageName === 'Special:LintErrors' || (
    zzNamespaceNumber === 6 &&
    zzAction === 'view' &&
    !!document.getElementById( 'mw-indicator-commons-icon' )
);
window.LinkClassifierSkipDraftDetection = dblagging || ( isActionEditing && ( totalSrvLoad >= 1490 || zzNamespaceNumber === 0 ) ) || isLongArticle || isViewingANArchive || totalSrvLoad >= 4490;
window.LinkClassifierOnDemandText = 'LnkClssfr';
window.LinkClassifierOnDemandLoc = 'p-tb';
window.LinkClassifierRedirTitleAppend = true;
//window.LinkClassifierUninterruptible = !isActionEditing;
window.LinkClassifierStatusSel = '#content';
window.LinkClassifierIgnoreRedirectedFrom = window.LinkClassifierSkipDraftDetection;
window.LinkClassifierSlowDownMin = Math.round( Math.random( ) ); // i.e. 0 or 1
if ( window.LinkClassifierIgnoreRedirectedFrom ) { window.LinkClassifierSlowDownMin++; }
if ( llHypotSq >= ( 256 * 256 ) ) { window.LinkClassifierSlowDownMin++; }
if ( lagSeconds > 0 ) { window.LinkClassifierSlowDownMin++; }
window.LinkClassifierSlowDownMax = Math.min( Math.round( Math.sqrt( totalSrvLoad ) * Math.log1p( totalSrvLoad ) ), 2250 );
window.LinkClassifierSlowDownMax = Math.max( window.LinkClassifierSlowDownMax, 8 );

window.mbNoAutoStart = window.LinkClassifierOnDemand || isActionEditing || isViewingANArchive;
window.mbLocalContribsName = ['Contributions', 'Contribs', 'Block', 'CentralAuth', 'DeletedContributions', 'EmailUser', 'Emailuser', 'ListFiles', 'Nuke'];
window.mbOnDemandLinkText = 'Userlink info';
window.mbOnDemandLinkLoc = 'p-tb';
window.mbLoadingOpacity = 0.25;
window.mbTempStyle = 'opacity:0.63; font-style:normal; text-decoration:line-through';
window.mbTemp2Style = 'opacity:0.8; font-style:italic; text-decoration:line-through; text-shadow:#F83A33 0px 0px 1px';
window.mbIndefStyle = 'font-style:italic; text-decoration:line-through; text-shadow:#F61000 0px 0px 2px';
window.mbLongThreshold = 11.5*24*60*60*1000;
window.mbLongThreshIsRemainingTime = true;
window.mbPseudoIndefThreshold = 1.25*365.2425*24*60*60*1000;
window.mbShowRegDateRel = true;
window.mbShowYears = true;
window.mbEnableWhenEditing = ( zzNamespaceNumber === 4 || (zzNamespaceNumber % 2) === 1 || isPageSandbox || zzPageName.indexOf( 'User:SoledadKabocha/' ) === 0 ) && zzPageContentModel === 'wikitext' && !dblagging;
window.mbEnableOnMainspaceDiff = true;
window.mbReplaceUserRedLinksWithContribs = true;
window.mbShibbocuridleet = true;

window.LinkClassifierChainedFunc = function ( ) {
  if ( typeof markBlocked === 'function' ) { markBlocked( ); }
  else { importScript( 'User:SoledadKabocha/markBlockedPlus.js' ); }
}
importScript('User:SoledadKabocha/linkclassifier2.js');

function isEditReasonableForBLR( ) {
  var editbox = $( '#wpTextbox1' );
  if ( !editbox || editbox.length === 0 ) return false;
  var editboxtext = editbox.val( );
  if ( typeof editboxtext !== 'string' ) return false;

  if ( zzPageContentModel === 'wikitext' ) {
    if ( /\{\| *class="/.test( editboxtext ) )                     return false;
    if ( /(<font .*color="|style=".*color:)/.test( editboxtext ) ) return false;
    if ( editboxtext.indexOf( '<syntaxh' + 'ighlight ' ) !== -1 )   return false;
    // fall through to length test
  }
  else { return false; }

  return ( editboxtext.length >= 768 && editboxtext.length < 15000 );
}
window.beelineReaderAutoColor = isActionEditing && zzNamespaceNumber > 0 && zzNamespaceNumber !== 10 && !isPageSandbox && isEditReasonableForBLR( );
importScript('User:SoledadKabocha/beelineReader.js');

if ( isActionEditing ) {
  ajaxPreviewFull = ( zzNamespaceNumber === 0 || isPageSandbox ) && !isEditingSection && window.location.search.indexOf( 'undoafter=' ) === -1 && window.location.search.indexOf( 'oldid=' ) === -1;
  window.ajaxPreviewExec = function(previewArea) {
    window.LinkClassifierChainedFuncArg = previewArea;
    LinkClassifier.onDemand();

    if ( window.syntaxHlAborted === true ) {
      mw.notify( $(
        // This can be triggered more than once per editing session (if we ajax-preview more than once).
        // Therefore, use a class rather than an ID.
        '<span class="syntaxhighlighter-notrunning">' +
        'WARNING: Syntax highlighter underperformed and gave up. You <b>must</b> do a <b>non-ajax</b> preview to resume highlighting syntax.' +
        '</span>'
      ) );
    }

    checkBadPipeTrick();
    if ( typeof checkEditBrackets === 'function' ) { checkEditBrackets(); }
    if ( typeof checkHarv         === 'function' ) { checkHarv(); }
    if ( !document.getElementById( 'ca-contentredirectno' ) ) {
        jsfnPortletLink( 'p-tb', addRedirectNoWrapper, 'Add redirect=no', 'ca-contentredirectno' );
    }

    $( '#editnotice-area'            ).addClass( 'editnotice-ajaxpreviewed' );
    $( '.mw-warning-with-logexcerpt' ).addClass( 'editnotice-ajaxpreviewed' );
    $( '#revision-info'              ).addClass( 'editnotice-ajaxpreviewed' );
    //in principle this could be done for #editingold, but I'm already hiding it unconditionally in css
    $( '.limitreport'                ).addClass( 'limitreport-ajaxpreviewed' );

    var forceSHDbgPrb = ( zzNamespaceNumber === 0 ? 0.5 : 0.2 );
    if ( zzPageContentModel === 'wikitext' && typeof printSHStatus === 'function' ) {
        if ( Math.random( ) < forceSHDbgPrb && window.syntaxHlAborted !== true ) {
            printSHStatus( );
        }
    }
  }
  //ajaxPreviewPos = 'bottom'; //FIXME
 window.ajaxPreviewMsg = {
  emptydiff: '<span id="ajax-preview-emptydiff">No changes</span>',
  difftip:   '<span id="ajax-preview-tipmsg">SHIFT-click the button to show changes compared to this old version</span>',
  diff2old:  '<span id="ajax-preview-tipmsg">Comparison to old version</span>',
  viewtip:   '<span id="ajax-preview-tipmsg">SHIFT-click the button to update categories; interwikis may disappear</span>'
 };
  importScript('User:SoledadKabocha/ajaxPreview.js');
}

setTimeout( importScript, 4 + Math.ceil( Math.random( ) * 96 ), 'User:SoledadKabocha/common-junk.js' );
}/* *** END afterLagCheck *** */