Szerkesztő:Winston/WatchCat.js

A Wikipédiából, a szabad enciklopédiából

Megjegyzés: közzététel után frissítened kell a böngésződ gyorsítótárát, hogy lásd a változásokat.

  • Firefox / Safari: tartsd lenyomva a Shift gombot és kattints a Frissítés gombra a címsorban, vagy használd a Ctrl–F5 vagy Ctrl–R (Macen ⌘–R) billentyűkombinációt
  • Google Chrome: használd a Ctrl–Shift–R (Macen ⌘–Shift–R) billentyűkombinációt
  • Internet Explorer / Edge: tartsd nyomva a Ctrl-t, és kattints a Frissítés gombra, vagy nyomj Ctrl–F5-öt
  • Opera: Nyomj Ctrl–F5-öt
//WatchCat
//Created by [[:hu:User:Winston]]
//Test version!!! Under heavy development!!!
//
//Todo:
//- fix IE ordering bug
//- add options (set namespaces, hide hidden categories, set ordering etc.)
//

$(function() {
  if (document.getElementsByTagName("h1")[0].firstChild.nodeValue == "Figyelőlistám") {
    addPortletLink_mod('p-cactions', 'WatchCat', 'ca-WCat', 'WatchCat teszt');
    var target = document.getElementById("ca-WCat");
    if( target.attachEvent ){
      target.attachEvent('onclick', watchCatLoader);
    } else {
      target.addEventListener('click', watchCatLoader, false); 
    }
    pic = new Image(); 
    pic.src="http://upload.wikimedia.org/wikipedia/commons/f/f3/WatchCat_load_indicator_monobook.gif"; 
  }
});

function getElementsByClassName_win(className, tag, elm){
  var testClass = new RegExp("(^|\\\\s)" + className + "(\\\\s|$)");
  var tag = tag || "*";
  var elm = elm || document;
  var elements = (tag == "*" && elm.all) ? elm.all : elm.getElementsByTagName(tag);
  var returnElements = [];
  var current;
  var length = elements.length;
  for(var i=0; i<length; i++){
    current = elements[i];
    if(testClass.test(current.className)){
      returnElements.push(current);
    }
  }
  return returnElements;
}

function addPortletLink_mod(portlet, text, id, tooltip, accesskey, nextnode) {
  var node = document.getElementById(portlet);
  if ( !node ) return null;
  node = node.getElementsByTagName( "ul" )[0];
  if ( !node ) return null;

  var link = document.createElement( "a" );
  link.appendChild( document.createTextNode( text ) );

  var item = document.createElement( "li" );
  item.appendChild( link );
  if ( id ) item.id = id;

  if ( accesskey ) {
    link.setAttribute( "accesskey", accesskey );
    tooltip += " ["+accesskey+"]";
  }
  if ( tooltip ) {
    link.setAttribute( "title", tooltip );
  }
  if ( accesskey && tooltip ) {
    updateTooltipAccessKeys( new Array( link ) );
  }

  if ( nextnode && nextnode.parentNode == node )
    node.insertBefore( item, nextnode );
  else
  node.appendChild( item );  // IE compatibility (?)

  return item;
}

function watchCatLoader () {
  url = "http://hu.wikipedia.org/w/api.php";
  params0 = "action=query&meta=userinfo&uiprop=groups&format=json";
  preResponse = new Array();
  watchCatArr = new Array();
  displayLoading();
  ajaxFunction(url, params0, 0);
};

function ajaxFunction(url, params, ver, optional, wlc, clc) {
  var xmlHttp;
  try {
    // Firefox, Opera 8.0+, Safari
    xmlHttp=new XMLHttpRequest();
  }
  catch (e) {
    // Internet Explorer
    try {
      xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
    }
    catch (e) {
      try {
        xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
      }
      catch (e) {
        alert("Your browser does not support AJAX!");
        return false;
      }
    }
  }
  xmlHttp.onreadystatechange=function() {
    if(xmlHttp.readyState==4) {
      if (ver == 0) {
        preResponse[0] = eval( "(" + xmlHttp.responseText + ")" );
        params1 = "action=query&generator=watchlist&gwllimit=max&cllimit=max&prop=categories&format=json";
        if (xmlHttp.responseText.match(/sysop/) || xmlHttp.responseText.match(/patrol/)) {
          params2 = "action=query&list=watchlist&wllimit=max&wlprop=timestamp|ids|sizes|patrol|flags|user|comment&format=json";
        } else {
          params2 = "action=query&list=watchlist&wllimit=max&wlprop=timestamp|ids|sizes|flags|user|comment&format=json";
        }
        ajaxFunction(url, params1, 1, 0, "", "|");
      }
      else if (ver == 1) {
        if ((undefined !== optional) && (0 != optional)) {
          preResponse[1][optional] = eval( "(" + xmlHttp.responseText + ")" );
        } else {
          preResponse[1] = new Array();
          preResponse[1][optional] = eval( "(" + xmlHttp.responseText + ")" );
        }
        if (undefined !== preResponse[1][optional]["query-continue"]) {
          if (undefined !== preResponse[1][optional]["query-continue"]["categories"]) {
            gwlstart = wlc;
            clcontinue = preResponse[1][optional]["query-continue"]["categories"]["clcontinue"];
            params1 = "action=query&generator=watchlist&gwllimit=max&cllimit=max&prop=categories&format=json&gwlstart=" + gwlstart + "&clcontinue=" + clcontinue;
          } else {
            gwlstart = preResponse[1][optional]["query-continue"]["watchlist"]["gwlstart"];
            clcontinue = "|";
            params1 = "action=query&generator=watchlist&gwllimit=max&cllimit=max&prop=categories&format=json&gwlstart=" + gwlstart + "&clcontinue=" + clcontinue;
          }
          optional++;
          ajaxFunction(url, params1, 1, optional, gwlstart, clcontinue);
        } else {
          ajaxFunction(url, params2, 2, 0);
        }
      }
      else if (ver == 2) {
        if ((undefined !== optional) && (0 != optional)) {
          preResponse[2][optional] = eval( "(" + xmlHttp.responseText + ")" );
        } else {
          preResponse[2] = new Array();
          preResponse[2][optional] = eval( "(" + xmlHttp.responseText + ")" );
        }
        if (undefined !== preResponse[2][optional]["query-continue"]) {
          params2c = params2 + "&wlstart=" + preResponse[2][optional]["query-continue"]["watchlist"]["wlstart"]
          optional++;
          ajaxFunction(url, params2c, 2, optional);
        } else {
          responseHandler(preResponse);
        }
      }
      else if (ver == 3) {
        unwatchResponse = eval( "(" + xmlHttp.responseText + ")" );
        removeWatched(unwatchResponse, optional);
      }
    }
  }
  xmlHttp.open("POST",url,true);
  xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  xmlHttp.setRequestHeader("Content-length", params.length);
  xmlHttp.setRequestHeader("Connection", "close");
  xmlHttp.send(params);
}

function pageidSearch (arr, id) {
  for (elem in arr) {
    if (arr[elem]['pageid'] == id) {
      return arr[elem];
    }
  }
  return false;
}

function realLength (arr) {
  var i = 0;
  for (key in arr) {
    i++;
  }
  return i;
};

function timeProcessor (timestamp) {
  modDateTime = new Array();
  rawDate = timestamp.split("T");
  date = rawDate[0].split("-");
  rawTime = rawDate[1].split("Z");
  time = rawTime[0].split(":");
  modDateTime['date'] = date;
  modDateTime['time'] = time;

  return modDateTime;
}

/**
*
*  Javascript trim, ltrim, rtrim
*  http://www.webtoolkit.info/
*
**/
 
function trim(str, chars) {
	return ltrim(rtrim(str, chars), chars);
}
 
function ltrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
}
 
function rtrim(str, chars) {
	chars = chars || "\\s";
	return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
}

function commentProcessor (rawComment) {
  hasChapter = rawComment.match(/\*\//);
  a = trim(rawComment, "\/\* ");
  a = a.split(" */ ");
  a.unshift(hasChapter);
  return a;
}

function ksort(array) {
    // http://kevin.vanzonneveld.net
    // +   original by: GeekFG (http://geekfg.blogspot.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   modified by: Winston (http://hu.wikipedia.org/wiki/User:Winston)
    // %          note: The examples are correct, this is a new way
    // *     example 1: data = {2: 'van', 3: 'Zonneveld', 1: 'Kevin'};
    // *     example 1: ksort(data);
    // *     results 1: data == {1: 'Kevin', 2: 'van', 3: 'Zonneveld'}
    // *     returns 1: true

    var tmp_arr={}, keys=[], i, key, that=this;
   
    // Make a list of key names
    for (key in array) {
        keys.push(key);
    }
 
    keys.sort();
 
    // Rebuild array with sorted key names
    for (i = 0; i < keys.length; i++) {
        key = keys[i];
        tmp_arr[key] = array[key];
        delete array[key];
    }
    for (i in tmp_arr) {
        array[i] = tmp_arr[i];
    }
 
    return true;
}

function uasort (inputArr, sorter) {
  // Sort an array with a user-defined comparison function and maintain index association  
  // 
  // version: 905.3122
  // discuss at: http://phpjs.org/functions/uasort
  // +   original by: Brett Zamir (http://brett-zamir.me)
  // +   improved by: Brett Zamir (http://brett-zamir.me)
  // *   example 1: fruits = {d: 'lemon', a: 'orange', b: 'banana', c: 'apple'};
  // *   example 1: uasort(fruits, function (a, b) { if (a > b) {return 1;}if (a < b) {return -1;} return 0;});
  // *   results 1: fruits == {c: 'apple', b: 'banana', d: 'lemon', a: 'orange'}
  if (typeof sorter === 'string') {
    sorter = this[sorter];
  } else if (sorter instanceof Array) {
    sorter = this[sorter[0]][sorter[1]];
  }
  
  var valArr = [], keyArr=[], tempKeyVal, tempValue, ret;
  var k = '', i = 0;

  var sorterNew = function (keyArr, valArr) {
    for (var i=valArr.length-2; i >=0; i--) {
      for (var j=0; j <= i; j++) {
        ret = sorter(valArr[j+1], valArr[j]);
        if (ret < 0) {
          tempValue = valArr[j];
          valArr[j] = valArr[j+1];
          valArr[j+1] = tempValue;
          tempKeyVal = keyArr[j];
          keyArr[j] = keyArr[j+1];
          keyArr[j+1] = tempKeyVal;
        }
      }
    }
  };

  for (k in inputArr) { // Get key and value arrays
    valArr.push(inputArr[k]);
    keyArr.push(k);
    delete inputArr[k];
  }
  try {
    sorterNew(keyArr, valArr); // Sort our new temporary arrays
  } catch(e) {
    return false;
  }
  for (i = 0; i < valArr.length; i++) { // Repopulate the old array
    inputArr[keyArr[i]] = valArr[i];
  }
  
  return true;
}

function in_array(needle, haystack, argStrict) {
    // Checks if the given value exists in the array  
    // 
    // version: 905.3120
    // discuss at: http://phpjs.org/functions/in_array
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: vlado houba
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true
    // *     example 2: in_array('vlado', {0: 'Kevin', vlado: 'van', 1: 'Zonneveld'});
    // *     returns 2: false
    // *     example 3: in_array(1, ['1', '2', '3']);
    // *     returns 3: true
    // *     example 3: in_array(1, ['1', '2', '3'], false);
    // *     returns 3: true
    // *     example 4: in_array(1, ['1', '2', '3'], true);
    // *     returns 4: false
    var key = '', strict = !!argStrict;

    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;
            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true;
            }
        }
    }

    return false;
}

function sortByDateDesc(a,b) {
  var x = a.timestamp;
  var y = b.timestamp;
  return ((x < y) ? 1 : ((x > y) ? -1 : 0));
}

function child_search(needle,haystack){
    for(var i in haystack){
        if(haystack[i].id==needle){return parseInt(i);}    
    }
    return false;
}

function responsePreprocessor (preResp) {
  response = new Array();
  response[0] = preResp[0]
  response[1] = new Array();
  response[2] = new Array();
  for (var i=0;i<realLength(preResp[1]);i++) {
    for (pageid in preResp[1][i].query.pages) {
      if (undefined === response[1][pageid] || undefined !== preResp[1][i].query.pages[pageid]["categories"]) {
        response[1][pageid] = preResp[1][i].query.pages[pageid];
      }
    }
  }
  var count = 0;
  for (var i=0;i<realLength(preResp[2]);i++) {
    for (j in preResp[2][i].query.watchlist) {
      response[2][count++] = preResp[2][i].query.watchlist[j];
    }
  }
  return response;
}

function responseHandler (resp) {
  response = responsePreprocessor(resp);
  if (undefined!==response[0].query.userinfo.groups) {
    sysop = in_array("sysop", response[0].query.userinfo.groups);
  }
  for (pageid in response[1]) {
    if (undefined===response[1][pageid].categories) {
      response[1][pageid].categories = new Array();
      response[1][pageid].categories[0] = new Array();
      response[1][pageid].categories[0].title = "Speciális:Kategorizálatlan lapok"
    }
    for (i=0;i<response[1][pageid].categories.length;i++) {
      catName = response[1][pageid].categories[i].title;
      if (undefined===window.watchCatArr[catName]){
        watchCatArr[catName] = new Array();
      }
      watchCatArr[catName][pageid] = new Array();
      response2Elem = pageidSearch(response[2], pageid);
      watchCatArr[catName][pageid]['title'] = response[1][pageid].title;
      watchCatArr[catName][pageid]['timestamp'] = response2Elem.timestamp;
      watchCatArr[catName][pageid]['timeArr'] = timeProcessor (response2Elem.timestamp);
      watchCatArr[catName][pageid]['revid'] = response2Elem.revid;
      watchCatArr[catName][pageid]['lendiff'] = response2Elem.newlen - response2Elem.oldlen;
      watchCatArr[catName][pageid]['user'] = response2Elem.user;
      watchCatArr[catName][pageid]['comment'] = commentProcessor(response2Elem.comment);
      if (undefined!==window.response2Elem.patrolled) {
        watchCatArr[catName][pageid]['patrolled'] = true;
      } else { watchCatArr[catName][pageid]['patrolled'] = false; }
      if (undefined!==window.response2Elem['new']) {
        watchCatArr[catName][pageid]['new'] = true;
      } else { watchCatArr[catName][pageid]['new'] = false; }
      if (undefined!==window.response2Elem.minor) {
        watchCatArr[catName][pageid]['minor'] = true;
      } else { watchCatArr[catName][pageid]['minor'] = false; }
      if (undefined!==window.response2Elem.bot) {
        watchCatArr[catName][pageid]['bot'] = true;
      } else { watchCatArr[catName][pageid]['bot'] = false; }
    }
  }
  watchCatString = watchCatOutput(watchCatArr);
  changeWl(watchCatString);
  addRemoverLink();
}

function watchCatOutput(watchCatArr) {
  ksort(watchCatArr);
  outputString = "";
  for (catName in watchCatArr) {
    if (realLength(watchCatArr[catName]) > 1) {
      uasort(watchCatArr[catName], sortByDateDesc);
    }
    outputString += '<div class="watchCategory"><h4><a title="' + catName + '" href="/wiki/' + catName + '">' + catName + '</a></h4>';
    for (pageid in watchCatArr[catName]) {
      outputString += '<table cellspacing="0" cellpadding="0" border="0" style="background: none" id="' + pageid + '"><tr><td valign="top" style="white-space: nowrap"><tt><img src="/skins-1.5/common/images/Arr_.png" width="12" height="12" alt=" " title="" />&nbsp;';
      if (true === watchCatArr[catName][pageid]['new']) {
        outputString += '<span class="newpage">Ú</span>';
      } else { outputString += '&nbsp;'; }
      if (true === watchCatArr[catName][pageid]['minor']) {
        outputString += '<span class="minor">a</span>';
      } else { outputString += '&nbsp;'; }
      if (true === watchCatArr[catName][pageid]['bot']) {
        outputString += '<span class="bot">b</span>';
      } else { outputString += '&nbsp;'; }
//      if (true === watchCatArr[catName][pageid]['patrolled']) {
        outputString += '&nbsp;';
//      } else { outputString += '<span class="unpatrolled">!</span>'; }
      outputString += '&nbsp;';
      outputString += watchCatArr[catName][pageid]['timeArr']['date'][0] + '. ' + watchCatArr[catName][pageid]['timeArr']['date'][1] + '. ' + watchCatArr[catName][pageid]['timeArr']['date'][2] + '. ' + watchCatArr[catName][pageid]['timeArr']['time'][0] + ':' + watchCatArr[catName][pageid]['timeArr']['time'][1];
      outputString += '&nbsp;</tt></td><td>  <a href="/wiki/' + watchCatArr[catName][pageid]['title'] + '" title="' + watchCatArr[catName][pageid]['title'] + '">' + watchCatArr[catName][pageid]['title'] + '</a>';
      outputString += '‎ (<a href="/w/index.php?title=' + watchCatArr[catName][pageid]['title'] + '&amp;curid=' + pageid + '&amp;diff=' + watchCatArr[catName][pageid]['revid'] + '">eltér</a>;';
      outputString += ' <a href="/w/index.php?title=' + watchCatArr[catName][pageid]['title'] + '&amp;curid=' + pageid + '&amp;action=history">történet</a>;';
      outputString += ' <a title="' + watchCatArr[catName][pageid]['title'] + '" name="' + pageid + '" class="removerLink">lapfigyelés vége</a>) . . ';
      if (0 == watchCatArr[catName][pageid]['lendiff']) {
        outputString += '<span class="mw-plusminus-null">(' + watchCatArr[catName][pageid]['lendiff'] + ')</span>';
      } else if (0 < watchCatArr[catName][pageid]['lendiff']) {
        outputString += '<span class="mw-plusminus-pos">(' + watchCatArr[catName][pageid]['lendiff'] + ')</span>';
      } else if (0 > watchCatArr[catName][pageid]['lendiff']) {
        outputString += '<span class="mw-plusminus-neg">(' + watchCatArr[catName][pageid]['lendiff'] + ')</span>';
      }
      outputString += ' . .  <a href="/wiki/Szerkeszt%C5%91:' + watchCatArr[catName][pageid]['user'] + '" title="Szerkesztő:' + watchCatArr[catName][pageid]['user'] + '" class="mw-userlink">' + watchCatArr[catName][pageid]['user'] + '</a>';
      outputString += ' <span class="mw-usertoollinks">(<a href="/wiki/Szerkeszt%C5%91vita:' + watchCatArr[catName][pageid]['user'] + '" title="Szerkesztővita:' + watchCatArr[catName][pageid]['user'] + '">vitalap</a>'
      outputString += ' | <a href="/wiki/Speci%C3%A1lis:Szerkeszt%C5%91_k%C3%B6zrem%C5%B1k%C3%B6d%C3%A9sei/' + watchCatArr[catName][pageid]['user'] + '" title="Speciális:Szerkesztő közreműködései/' + watchCatArr[catName][pageid]['user'] + '">szerkesztései</a>';
      if (true === sysop) {
        outputString += ' | <a href="/wiki/Speci%C3%A1lis:Blokkol%C3%A1s/' + watchCatArr[catName][pageid]['user'] + '" title="Speciális:Blokkolás/' + watchCatArr[catName][pageid]['user'] + '">blokkolás</a>';
      }
      outputString += ')</span>';
      if ((realLength(watchCatArr[catName][pageid]['comment']) == 3) || (realLength(watchCatArr[catName][pageid]['comment']) == 2 && watchCatArr[catName][pageid]['comment'][1] != "")) {
        outputString += ' <span class="comment">(';
        if (realLength(watchCatArr[catName][pageid]['comment']) == 3) {
          outputString += '<span class="autocomment"><a href="/wiki/' + watchCatArr[catName][pageid]['title'] + '#' + watchCatArr[catName][pageid]['comment'][1] + '" title="' + watchCatArr[catName][pageid]['title'] + '">→</a>' + watchCatArr[catName][pageid]['comment'][1] + ':</span> ' + watchCatArr[catName][pageid]['comment'][2] + ')</span>';
        } else {
          outputString += watchCatArr[catName][pageid]['comment'][1] + ')</span>';
        }
      }
      outputString += '</td></tr></table>';
    }
    outputString += '</div>'
  }
  return outputString;
}

function displayLoading() {
  bodyCont = document.getElementById("bodyContent");
  key = child_search("mw-watchlist-options", bodyCont.childNodes) + 2;
  while (bodyCont.childNodes.length>key) {
    bodyCont.removeChild(bodyCont.lastChild);
  }
  watchCatContainer = document.createElement("div");
  watchCatContainer.id = "watchCatLoadingContainer";
  watchCatContainer.innerHTML = '<div style="width:100%; text-align:center;"><h3>A WatchCat töltődik</h3><img src="http://upload.wikimedia.org/wikipedia/commons/f/f3/WatchCat_load_indicator_monobook.gif" /></div>';
  bodyCont.appendChild(watchCatContainer);
}

function changeWl(watchCatStr) {
  bodyCont = document.getElementById("bodyContent");
  key = child_search("mw-watchlist-options", bodyCont.childNodes) + 2;
  while (bodyCont.childNodes.length>key) {
    bodyCont.removeChild(bodyCont.lastChild);
  }
  watchCatContainer = document.createElement("div");
  watchCatContainer.id = "watchCatContainer";
  watchCatContainer.innerHTML = watchCatStr;
  bodyCont.appendChild(watchCatContainer);
}

function unwatchHandler(ev) {

  // vagy megkapjuk az esemény objektumot, vagy meg kell szereznünk
  ev || (ev = window.event);

  var target = ev.target || ev.srcElement;

  params3 = "action=watch&title=" + target.title+ "&unwatch=''&format=json";
  ajaxFunction(url, params3, 3, target)

  // eseménnyel mi foglalkoztunk, nem kell továbbvinni
  if (ev.preventDefault) {
    ev.preventDefault(); ev.stopPropagation();
  }
  else {
    ev.cancelBubble = true; ev.returnValue = false;
  }
  return false;
}

function removeWatched (resp, targ) {
  if (undefined !== resp.watch.unwatched) {
    table = document.getElementById(targ.name);
    table.parentNode.removeChild(table);
  }
}

function addRemoverLink() {
  removers = getElementsByClassName_win("removerLink");
    if(removers[0].attachEvent){
      for (var i=0;i<removers.length;i++) {
        removers[i].attachEvent('onclick', unwatchHandler);
      }
    } else {
      for (var i=0;i<removers.length;i++) {
        removers[i].addEventListener('click', unwatchHandler, false); 
      }
    }
}