Jump to content

User:Joshua Scott/Scripts/pendingchanges.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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 pendch_http;
var pendch_enabled;
var pendch_num_pages;
var pendch_refresh;
var pendch_num_idle_req;
var pendch_curr_idle_req;
var pendch_diffonly;

var pendch_str_no_ajax = "There seems to be a problem using the pendingchanges script. Your browser is not supported.";
var pendch_str_box_title = "Pending changes";
var pendch_str_box_title_updating = "Pending changes (updating)";
var pendch_str_box_title_failed = "Pending changes (update failed)";
var pendch_str_enable = "Enable this box";
var pendch_str_disable = "Disable this box";

$(document).ready( pendch_init );
 
/* initalise */
function pendch_init() {
 
  if (window.location.toString().search(/diffonly=1/) != -1) {
    var currURL = window.location.toString();
    var newURL=currURL.replace(/diffonly=1/,diffonly=0);
    console.log(document.getElementById("difference").innerHTML);
    if (document.getElementById("difference").innerHTML.search(/Show page below diff/) == -1) {
      document.getElementById("difference").innerHTML += '&nbsp;(<a href="' + newURL + '">Show page below diff</a>)';
    }
  }

  // allow user settings through
  if (pendch_enabled == null) {
    pendch_enabled = false;
  }
  if (pendch_num_pages == null) {
    pendch_num_pages = 10;
  }
  if (pendch_refresh == null) {
    pendch_refresh = 10;
  }
  if (pendch_num_idle_req == null) {
    pendch_num_idle_req = 60;
  }
  if(pendch_diffonly == null) {
    pendch_diffonly = 1;
  }
  // A few limits to be nice to the servers
  if (pendch_num_pages > 50) {
    pendch_num_pages = 50;
  }
  if (pendch_num_pages < 1) {
    pendch_num_pages = 1;
  }
  if (pendch_refresh < 2) {
    pendch_refresh = 2;
  }
  if (pendch_num_idle_req > 1000) {
    pendch_num_idle_req = 1000;
  }
  if (pendch_num_idle_req < 5) {
    pendch_num_idle_req = 5;
  }

  // get our cookie
  if (document.cookie.length > 0) {
    var c_start = document.cookie.indexOf("pendch_show_box=");
    if (c_start != -1) { 
      c_start = c_start + 16; 
      var c_end = document.cookie.indexOf(";", c_start);
      if (c_end == -1) {
        c_end = document.cookie.length;
      }
 
      if (document.cookie.substring(c_start, c_end) == "yes") {
        pendch_enabled = true;
      } else {
        pendch_enabled = false;
      }
    } 
  }
 
  // Either make a request or show nothing
  pendch_curr_idle_req = 0;
  if (pendch_enabled == true) {
    pendch_ajax_request();
  } else {
    pendch_draw_disabled_box();
  }
}
 
/* init ajax */
function pendch_create_request() {
  try {
    pendch_http = new XMLHttpRequest();
  } catch (e) {
    try {
      pendch_http = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        pendch_http = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) {
        return false;
      }
    }
  }
 
  pendch_http.onreadystatechange = function() {
    if(pendch_http.readyState == 4) pendch_ajax_response();
  }
 
  return true;
}
 
/* make a request */
function pendch_ajax_request() {
  // if we have done too many requests, disable the box
  pendch_curr_idle_req++;
  if (pendch_curr_idle_req > pendch_num_idle_req) {
    pendch_disable_box();
  }

  // check we are enabled
  if (pendch_enabled == false) return;

  // firstly, inform the user
  var cur_box = document.getElementById('p-pendingchanges');
  if (cur_box != null) {
    cur_box.firstChild.firstChild.data = pendch_str_box_title_updating;
  }

  if (pendch_create_request () == false) {
    if (cur_box != null) {
      cur_box.firstChild.firstChild.data = pendch_str_box_title_failed;
    } else {
      alert (pendch_str_no_ajax);
    }
  }

  // Get the current time
  var dateobj = new Date();
  var now = Math.floor(dateobj.getTime() / 1000.0);

  // Then make the request
  pendch_http.open("GET", "/w/api.php?action=query&format=json&list=oldreviewedpages&ornamespace=0|4&orlimit=" + pendch_num_pages, true);
  pendch_http.send(null);
}

function pendch_draw_disabled_box() {
  if (mw.config.get('skin') == 'vector') {
    pendch_draw_disabled_box_vector();
  } else {
    pendch_draw_disabled_box_monobook();
  }
}

function pendch_ajax_response() {
  if (mw.config.get('skin') == 'vector') {
    pendch_ajax_response_vector();
  } else {
    pendch_ajax_response_monobook();
  }

  // and do it again in 5 secs
  setTimeout("pendch_ajax_request()", pendch_refresh * 1000);
}

function pendch_disable_box() {
  pendch_enabled = false;
  pendch_draw_disabled_box();
  document.cookie = "pendch_show_box=no; path=/";
}
 
function pendch_enable_box() {
  pendch_enabled = true;
  pendch_curr_idle_req = 0;
  document.cookie = "pendch_show_box=yes; path=/";
  pendch_ajax_request();
}


/* Draw disabled (monobook) */
function pendch_draw_disabled_box_monobook() {
  // Container div
  var link_div = document.createElement('div');
  link_div.className = 'pBody';
  var div = document.createElement('div');
  div.setAttribute('id', 'p-pendingchanges');
  div.className = 'portal';
  var heading = document.createElement('h3');
  heading.appendChild(document.createTextNode(pendch_str_box_title));
  div.appendChild(heading);
  div.appendChild(link_div);
 
  // enable link
  var p = document.createElement('p');
  p.style.fontSize = 'x-small';
  p.style.margin = '0px';
  var a = document.createElement('a');
  a.appendChild(document.createTextNode(pendch_str_enable));
  a.onclick = pendch_enable_box;
  p.appendChild(a);
  link_div.appendChild(p);
 
  // now replace the div
  var old_div = document.getElementById('p-pendingchanges');
  var side_col = document.getElementById('column-one');
  if (old_div != null) {
    side_col.replaceChild(div, old_div);
  } else {
    var node = document.getElementById('p-search');
   if ( node && node.parentNode === side_col ) {
     side_col.insertBefore(div, node);
   }
  }
}

/* Draw response (monobook) */
function pendch_ajax_response_monobook() {
 
  var resp = JSON.parse(pendch_http.responseText);
  var items = resp.query.oldreviewedpages;
  
  // create the div that holds all the newpage links
  var link_div = document.createElement('div');
  link_div.className = 'pBody';
  var list = document.createElement('ul');
  link_div.appendChild(list);
 
  // populate the list with 10 links.
  for (var i = 0; i < items.length; i++) {
  	var item = items[i];
    var item_name = item.title;
    var old_id = item.stable_revid;

    item_name = item_name.replace(/&/, "%26");
	var item_url = 'http://en.wikipedia.org/w/index.php?title=' + item_name + '&diff=cur&oldid=' + old_id + '&diffonly=' + pendch_diffonly;
 
    a = document.createElement('a');
    a.setAttribute('href', item_url);
    a.appendChild(document.createTextNode(item_name));

    var li = document.createElement('li');
    li.appendChild(a);
    list.appendChild(li);
  }
 
  // Container div
  var div = document.createElement('div');
  div.setAttribute('id', 'p-pendingchanges');
  div.className = 'portal';
  var heading = document.createElement('h3');
  heading.appendChild(document.createTextNode(pendch_str_box_title));
  div.appendChild(heading);
  div.appendChild(link_div);
 
  // disable link
  var p = document.createElement('p');
  p.style.fontSize = 'x-small';
  p.style.margin = '0px';
  p.style.textAlign = 'right';
  a = document.createElement('a');
  a.appendChild(document.createTextNode(pendch_str_disable));
  a.onclick = pendch_disable_box;
  p.appendChild(a);
  link_div.appendChild(p);
 
  // now replace the div
  var old_div = document.getElementById('p-pendingchanges');
  var side_col = document.getElementById('column-one');
  if (old_div != null) {
    side_col.replaceChild(div, old_div);
  } else {
    var node = document.getElementById('p-search');
    side_col.insertBefore(div, node);
  }
}


/* Draw disabled box (vector skin) */
function pendch_draw_disabled_box_vector() {
  // Container div
  var link_div = document.createElement('div');
  link_div.className = 'body';
  link_div.style.display = "block";
  var div = document.createElement('div');
  div.setAttribute('id', 'p-pendingchanges');
  div.className = 'portal collapsed';
  var heading = document.createElement('h3');
  heading.appendChild(document.createTextNode(pendch_str_box_title));
  div.appendChild(heading);
  div.appendChild(link_div);
 
  // enable link
  var p = document.createElement('p');
  p.style.fontSize = 'x-small';
  p.style.margin = '0px';
  var a = document.createElement('a');
  a.appendChild(document.createTextNode(pendch_str_enable));
  a.onclick = pendch_enable_box;
  p.appendChild(a);
  // add later
 
  // now replace the div
  var old_div = document.getElementById('p-pendingchanges');
  var side_col = document.getElementById('mw-panel');
  if (old_div != null) {
    side_col.replaceChild(div, old_div);
  } else {
    var node = document.getElementById('p-interaction');
    side_col.insertBefore(div, node);
  }

  if( typeof $ != 'undefined' ) {
    $('#p-pendingchanges > h3').keydown( function( event ) {
      if ( event.which == 13 /* Enter */ || event.which == 32 /* Space */ ) {
        pendch_toggle( $(this) );
      }
    } )
    .mousedown( function() {
      pendch_toggle( $(this) );
      $(this).blur();
        return false;
    } );
  } else {
   link_div.appendChild(p);
  }
}

/* Draw response (vector skin) */
function pendch_ajax_response_vector() {
 
  var resp = JSON.parse(pendch_http.responseText);
  var items = resp.query.oldreviewedpages;

  // create the div that holds all the newpage links
  var link_div = document.createElement('div');
  link_div.className = 'body';
  link_div.style.display = "block";
  var list = document.createElement('ul');
  link_div.appendChild(list);
 
  // populate the list with 10 links.
  for (var i = 0; i < items.length; i++) {
   	var item = items[i];
    var item_name = item.title;
    var old_id = item.stable_revid;

    item_name = item_name.replace(/&/, "%26");
	var item_url = 'http://en.wikipedia.org/w/index.php?title=' + item_name + '&diff=cur&oldid=' + old_id + '&diffonly=' + pendch_diffonly;
 
    a = document.createElement('a');
    a.setAttribute('href', item_url);
    //a.style.fontSize = 'x-small';
    a.appendChild(document.createTextNode(item_name));
 
    var li = document.createElement('li');
    li.appendChild(a);
    list.appendChild(li);
  }
 
  // Container div
  var div = document.createElement('div');
  div.setAttribute('id', 'p-pendingchanges');
  div.className = 'portal expanded';
  var heading = document.createElement('h3');
  heading.appendChild(document.createTextNode(pendch_str_box_title));
  div.appendChild(heading);
  div.appendChild(link_div);

  // disable link
  var p = document.createElement('p');
  p.style.fontSize = 'x-small';
  p.style.margin = '0px';
  p.style.textAlign = 'left';
  a = document.createElement('a');
  a.appendChild(document.createTextNode(pendch_str_disable));
  a.onclick = pendch_disable_box;
  p.appendChild(a);
  // add later

  // now replace the div
  var old_div = document.getElementById('p-pendingchanges');
  var side_col = document.getElementById('mw-panel');
  if (old_div != null) {
    side_col.replaceChild(div, old_div);
  } else {
    var node = document.getElementById('p-interaction');
    side_col.insertBefore(div, node);
  }

  if( typeof $ != 'undefined' ) {
    $('#p-pendingchanges > h3').keydown( function( event ) {
      if ( event.which == 13 /* Enter */ || event.which == 32 /* Space */ ) {
        pendch_toggle( $(this) );
      }
    } )
    .mousedown( function() {
      pendch_toggle( $(this) );
      $(this).blur();
        return false;
    } );
  } else {
   link_div.appendChild(p);
  }
}

function pendch_toggle( $element ) {
 $.cookie( 'vector-nav-' + $element.parent().attr( 'id' ), $element.parent().is( '.collapsed' ) );
 if( $element.parent().is('.collapsed') ) {
  pendch_enable_box();
 } else {
  pendch_disable_box();
 }
 $element
  .parent()
  .toggleClass( 'expanded' )
  .toggleClass( 'collapsed' )
  .find( 'div.body' )
  .slideToggle( 'fast' );
}