index_013.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. function insertBanner( bannerJson ) {
  2. jQuery( 'div#centralNotice' ).prepend( bannerJson.bannerHtml );
  3. if ( bannerJson.autolink ) {
  4. var url = 'https://wikimediafoundation.org/wiki/Special:LandingCheck';
  5. if ( ( bannerJson.landingPages !== null ) && bannerJson.landingPages.length ) {
  6. targets = String( bannerJson.landingPages ).split(',');
  7. url += "?" + jQuery.param( {
  8. 'landing_page': targets[Math.floor( Math.random() * targets.length )].replace( /^\s+|\s+$/, '' )
  9. } );
  10. url += "&" + jQuery.param( {
  11. 'utm_medium': 'sitenotice', 'utm_campaign': bannerJson.campaign,
  12. 'utm_source': bannerJson.bannerName, 'language': wgUserLanguage,
  13. 'country': Geo.country
  14. } );
  15. jQuery( '#cn-landingpage-link' ).attr( 'href', url );
  16. }
  17. }
  18. }
  19. function hideBanner() {
  20. jQuery( '#centralNotice' ).hide(); // Hide current banner
  21. var bannerType = $.centralNotice.data.bannerType;
  22. if ( bannerType === undefined ) bannerType = 'default';
  23. setBannerHidingCookie( bannerType ); // Hide future banners of the same type
  24. }
  25. function setBannerHidingCookie( bannerType ) {
  26. var e = new Date();
  27. e.setTime( e.getTime() + (14*24*60*60*1000) ); // two weeks
  28. var work='centralnotice_'+bannerType+'=hide; expires=' + e.toGMTString() + '; path=/';
  29. document.cookie = work;
  30. }
  31. // This function is deprecated
  32. function toggleNotice() {
  33. hideBanner();
  34. }
  35. var wgNoticeToggleState = (document.cookie.indexOf('hidesnmessage=1')==-1);
  36. ( function( $ ) {
  37. $.ajaxSetup({ cache: true });
  38. $.centralNotice = {
  39. 'data': {
  40. 'getVars': {},
  41. 'bannerType': 'default'
  42. },
  43. 'fn': {
  44. 'loadBanner': function( bannerName, campaign, bannerType ) {
  45. // Store the bannerType in case we need to set a banner hiding cookie later
  46. $.centralNotice.data.bannerType = bannerType;
  47. // Get the requested banner
  48. var bannerPageQuery = $.param( {
  49. 'banner': bannerName, 'campaign': campaign, 'userlang': wgUserLanguage,
  50. 'db': wgDBname, 'sitename': wgSiteName, 'country': Geo.country
  51. } );
  52. var bannerPage = '?title=Special:BannerLoader&' + bannerPageQuery;
  53. var bannerScript = '<script type="text/javascript" src="//meta.wikimedia.org/w/index.php' + bannerPage + '"></script>';
  54. if ( document.cookie.indexOf( 'centralnotice_'+bannerType+'=hide' ) == -1 ) {
  55. jQuery( '#siteNotice' ).prepend( '<div id="centralNotice" class="' +
  56. ( wgNoticeToggleState ? 'expanded' : 'collapsed' ) +
  57. ' cn-' + bannerType + '">'+bannerScript+'</div>' );
  58. }
  59. },
  60. 'loadBannerList': function( geoOverride ) {
  61. if ( geoOverride ) {
  62. var geoLocation = geoOverride; // override the geo info
  63. } else {
  64. var geoLocation = Geo.country; // pull the geo info
  65. }
  66. var bannerListQuery = $.param( { 'language': wgContentLanguage, 'project': wgNoticeProject, 'country': geoLocation } );
  67. var bannerListURL = wgScript + '?title=' + encodeURIComponent('Special:BannerListLoader') + '&cache=/cn.js&' + bannerListQuery;
  68. var request = $.ajax( {
  69. url: bannerListURL,
  70. dataType: 'json',
  71. success: $.centralNotice.fn.chooseBanner
  72. } );
  73. },
  74. 'chooseBanner': function( bannerList ) {
  75. // Convert the json object to a true array
  76. bannerList = Array.prototype.slice.call( bannerList );
  77. // Make sure there are some banners to choose from
  78. if ( bannerList.length == 0 ) return false;
  79. var groomedBannerList = [];
  80. for( var i = 0; i < bannerList.length; i++ ) {
  81. // Only include this banner if it's intended for the current user
  82. if( ( wgUserName && bannerList[i].display_account ) ||
  83. ( !wgUserName && bannerList[i].display_anon == 1 ) )
  84. {
  85. // add the banner to our list once per weight
  86. for( var j=0; j < bannerList[i].weight; j++ ) {
  87. groomedBannerList.push( bannerList[i] );
  88. }
  89. }
  90. }
  91. // Return if there's nothing left after the grooming
  92. if( groomedBannerList.length == 0 ) return false;
  93. // Choose a random key
  94. var pointer = Math.floor( Math.random() * groomedBannerList.length );
  95. // Load a random banner from our groomed list
  96. $.centralNotice.fn.loadBanner(
  97. groomedBannerList[pointer].name,
  98. groomedBannerList[pointer].campaign,
  99. ( groomedBannerList[pointer].fundraising ? 'fundraising' : 'default' )
  100. );
  101. },
  102. 'getQueryStringVariables': function() {
  103. document.location.search.replace( /\??(?:([^=]+)=([^&]*)&?)/g, function () {
  104. function decode( s ) {
  105. return decodeURIComponent( s.split( "+" ).join( " " ) );
  106. }
  107. $.centralNotice.data.getVars[decode( arguments[1] )] = decode( arguments[2] );
  108. } );
  109. }
  110. }
  111. }
  112. jQuery( document ).ready( function ( $ ) {
  113. // Initialize the query string vars
  114. $.centralNotice.fn.getQueryStringVariables();
  115. if( $.centralNotice.data.getVars['banner'] ) {
  116. // if we're forcing one banner
  117. $.centralNotice.fn.loadBanner( $.centralNotice.data.getVars['banner'] );
  118. } else {
  119. // Look for banners ready to go NOW
  120. $.centralNotice.fn.loadBannerList( $.centralNotice.data.getVars['country'] );
  121. }
  122. } ); //document ready
  123. } )( jQuery );