function insertBanner( bannerJson ) { var url, targets; jQuery( 'div#centralNotice' ).prepend( bannerJson.bannerHtml ); if ( bannerJson.autolink ) { url = 'https://wikimediafoundation.org/wiki/Special:LandingCheck'; if ( ( bannerJson.landingPages !== null ) && bannerJson.landingPages.length ) { targets = String( bannerJson.landingPages ).split(','); url += "?" + jQuery.param( { landing_page: targets[Math.floor( Math.random() * targets.length )].replace( /^\s+|\s+$/, '' ) } ); url += "&" + jQuery.param( { utm_medium: 'sitenotice', utm_campaign: bannerJson.campaign, utm_source: bannerJson.bannerName, language: mw.config.get( 'wgUserLanguage' ), country: Geo.country } ); jQuery( '#cn-landingpage-link' ).attr( 'href', url ); } } } function setBannerHidingCookie( bannerType ) { var e = new Date(); e.setTime( e.getTime() + (14*24*60*60*1000) ); // two weeks var work = 'centralnotice_' + bannerType + '=hide; expires=' + e.toGMTString() + '; path=/'; document.cookie = work; } function hideBanner() { jQuery( '#centralNotice' ).hide(); // Hide current banner var bannerType = jQuery.centralNotice.data.bannerType; if ( bannerType === undefined ) { bannerType = 'default'; } setBannerHidingCookie( bannerType ); // Hide future banners of the same type } // This function is deprecated function toggleNotice() { hideBanner(); } var wgNoticeToggleState = document.cookie.indexOf( 'hidesnmessage=1' ) === -1; ( function( $, mw ) { mw.loader.using( 'mediawiki.util', function () { $.ajaxSetup({ cache: true }); $.centralNotice = { data: { getVars: {}, bannerType: 'default' }, fn: { loadBanner: function( bannerName, campaign, bannerType ) { var bannerPageQuery, bannerPage, bannerScript; // Store the bannerType in case we need to set a banner hiding cookie later $.centralNotice.data.bannerType = bannerType; // Get the requested banner bannerPageQuery = $.param( { banner: bannerName, campaign: campaign, userlang: mw.config.get( 'wgUserLanguage' ), db: mw.config.get( 'wgDBname' ), sitename: mw.config.get( 'wgSiteName' ), country: Geo.country } ); bannerPage = '?title=Special:BannerLoader&' + bannerPageQuery; bannerScript = ''; if ( document.cookie.indexOf( 'centralnotice_' + bannerType + '=hide' ) === -1 ) { jQuery( '#siteNotice' ).prepend( '
'+bannerScript+'
' ); } }, loadBannerList: function( geoOverride ) { var geoLocation, bannerListQuery, bannerListURL; if ( geoOverride ) { geoLocation = geoOverride; // override the geo info } else { geoLocation = Geo.country; // pull the geo info } bannerListQuery = $.param( { language: mw.config.get( 'wgContentLanguage' ), project: mw.config.get( 'wgNoticeProject' ), country: geoLocation } ); bannerListURL = mw.util.wikiScript() + '?title=' + encodeURIComponent('Special:BannerListLoader') + '&cache=/cn.js&' + bannerListQuery; // Prevent loading banners on Special pages if ( mw.config.get( 'wgNamespaceNumber' ) !== -1 ) { $.ajax( { url: bannerListURL, dataType: 'json', success: $.centralNotice.fn.chooseBanner } ); } }, chooseBanner: function( bannerList ) { mw.loader.using( 'mediawiki.user', function() { var groomedBannerList = [], i, j, pointer; // Make sure there are some banners to choose from if ( bannerList.length === 0 ) { return false; } for( i = 0; i < bannerList.length; i++ ) { // Only include this banner if it's intended for the current user if( ( !mw.user.anonymous() && bannerList[i].display_account === 1 ) || ( mw.user.anonymous() && bannerList[i].display_anon === 1 ) ) { // Add the banner to our list once per weight for( j = 0; j < bannerList[i].weight; j++ ) { groomedBannerList.push( bannerList[i] ); } } } // Return if there's nothing left after the grooming if ( groomedBannerList.length === 0 ) { return false; } // Choose a random key pointer = Math.floor( Math.random() * groomedBannerList.length ); // Load a random banner from our groomed list $.centralNotice.fn.loadBanner( groomedBannerList[pointer].name, groomedBannerList[pointer].campaign, ( groomedBannerList[pointer].fundraising ? 'fundraising' : 'default' ) ); }); }, getQueryStringVariables: function() { function decode( s ) { return decodeURIComponent( s.split( '+' ).join( ' ' ) ); } document.location.search.replace( /\??(?:([^=]+)=([^&]*)&?)/g, function ( str, p1, p2 ) { $.centralNotice.data.getVars[decode( p1 )] = decode( p2 ); } ); } } }; $( document ).ready( function ( $ ) { // Initialize the query string vars $.centralNotice.fn.getQueryStringVariables(); if( $.centralNotice.data.getVars.banner ) { // if we're forcing one banner $.centralNotice.fn.loadBanner( $.centralNotice.data.getVars.banner ); } else { // Look for banners ready to go NOW $.centralNotice.fn.loadBannerList( $.centralNotice.data.getVars.country ); } } ); } ); } )( jQuery, mediaWiki );