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.
$(document).ready(AIV);

var AIVpageName = 'Wikipedia:Administrator_intervention_against_vandalism';
var section = '1';
var vandal;
var reason;
var username;

function addlilinkAIV(url, name, id){
    mw.util.addPortletLink( 'p-cactions', url, name, id, null, null );
}

function AIV(){
  if (document.title.indexOf("User talk:") != -1){
    username = encodeURIComponent( mw.config.get('wgTitle') );
    var test = username.split('.');
    if(test[3]) {
    addlilinkAIV('javascript:AIVandal("' + username + '")', 'Report IP', 'td-report');
    }
    else {
    addlilinkAIV('javascript:AIVandal("' + username + '")', 'Report', 'td-report');
    }
  }
  if (document.title.indexOf("User contributions") != -1){
    username = location.href.split('/')[5];
    if(username == undefined || username == ""){
      //if this is the case, then something is up
      if(location.href.indexOf("&target=")){
        //it looks like we came here from a target link, lets just take the username from that
        username = location.href.split('=')[2];
      }
    }
    addlilinkAIV('javascript:AIVandal("' + username + '")', 'Report', 'td-report');
  }
}

function AIVandal(vandalU){
  vandal = vandalU;
  if(vandal ==  document.getElementById('pt-userpage').getElementsByTagName('a')[0].innerHTML){
    alert('You don\'t want to report yourself, do you?');
    return;
  }
  reason = prompt('Reason?:');
  if(!reason)
    return;
  document.getElementById('bodyContent').innerHTML = 'Please wait' + '...';
  document.getElementById('bodyContent').innerHTML += '<br />Grabbing page...';

  $.ajax({
      type: 'GET',
      url: mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php?action=query&prop=info|revisions&format=xml&intoken=edit&rvprop=content&titles=' + AIVpageName + '&rvsection=' + section,
      dataType: "xml",
      success: function(xml){
        var pagetext = $(xml).find('rev').text();
        var edittoken = $(xml).find('page').attr('edittoken');
        PageReady(pagetext, edittoken);
      },
      error: function(){
        document.getElementById('bodyContent').innerHTML += '<br />Error reading page: ' + AIVpageName;
      }
  });
}

function PageReady(pagetext, edittoken){

  var x;
  var myArray = pagetext.split(" ");
  var add = true;
  document.getElementById('bodyContent').innerHTML += '<br />Searching for existing report...';
  for (x=0; x < myArray.length; x++)
  {
    var myArray2 = myArray[x].split(/\n/);
    var y;
    for (y=0; y < myArray2.length; y++ ){
 
     if(myArray2[y] == '{{IPvandal|' + vandal + '}}' ||
        myArray2[y] == '*{{IPvandal|' + vandal + '}}' ||
        myArray2[y] == '{{vandal|' + vandal + '}}' ||
        myArray2[y] == '*{{vandal|' + vandal + '}}'){
        add = false;
      }
    }
  }
  if(add){
    document.getElementById('bodyContent').innerHTML += '<br />No report found, adding...';
  }
  else{
    //alert('CSD tag found');
    document.getElementById('bodyContent').innerHTML += '<br />Report found, will not add...';
    return;
  }
  //let's do something expiremntal, to see if it's an IP address
    var test = username.split('.');
    if(test[3]) {
      pagetext += '\n*{{IPvandal|' + vandal + '}} - ' + reason + ' --~' + '~' + '~' + '~';
    }
    else {
      pagetext += '\n*{{vandal|' + vandal + '}} - ' + reason + ' --~' + '~' + '~' + '~';
    }

  var params = {
    action : 'edit',
    title : AIVpageName,
    section : section,
    summary : 'Reporting [[Special:Contributions/' + vandal + '|' + vandal + ']] using [[WP:ARV|ARV 2.2]].',
    minor : null,
    text : pagetext,
    token : edittoken
  }

  document.getElementById('bodyContent').innerHTML += '<br />Submitting form...';

  var xmlhttp = sajax_init_object();
  xmlhttp.overrideMimeType('application/json');
  xmlhttp.open( 'POST' , mw.config.get('wgServer') + mw.config.get('wgScriptPath') + '/api.php', true);
  xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
  xmlhttp.send( AIVparams(params) );
}

function AIVparams( arr ) {
    var resarr = Array();
    for( var i in arr ) {
        if( typeof arr[i] == 'undefined' ) {
            continue;
        }
        var res;
        if( arr[i] instanceof Array ){
            var v =  Array();
            for(var j = 0; j < arr[i].length; ++j ) {
                v[j] = encodeURIComponent( arr[i][j] );
            }
            res = v.join('|');
        } else {
            res = encodeURIComponent( arr[i] );
        }
        resarr.push( encodeURIComponent( i ) + '=' + res );
    }
    return resarr.join('&');
}