User:Js/patroller.js

$(patrollerScript);

function patrollerScript(){ //main wrapper

var isIE = navigator.userAgent.indexOf('MSIE') != -1

//localization
var mwC = { //en.wp
 patrol_word: 'patrol',
 autosumm_new: /<\/a>Created page with '(.+)'$/i,
 patrol_switch_tip: 'Add [patrol] link to each title',
 olderArticlesID: 16100000,
 patrol_tip: 'Mark page as patrolled',
 patrol_wait: 'Marking as patrolled...'
}

var ul, lis, logTable, swLink, isTable = false
var imcomm = 'http://upload.wikimedia.org/wikipedia/commons/'

if (mw.config.get('wgCanonicalNamespace')=='Special'  && mw.config.get('wgCanonicalSpecialPageName')=='Newpages')
  startOnSpecialNewPages()
else if (mw.config.get('wgNamespaceNumber')==0 && mw.config.get('wgAction')=='view' && mw.config.get('wgArticleId') > mwC.olderArticlesID)
  startOnNewArtcile()          
else return




// *** This part is executed on Special:NewPages *** 

function startOnSpecialNewPages(){
	//get page structure
	var content = document.getElementById('content') || document.getElementById('mw_content')
	ul = content.getElementsByTagName('ol')[0] || content.getElementsByTagName('ul')[0]
	if (!ul) return
	//attach  switching link
	swLink = document.createElement('span')
	swLink.onclick = switchNewPages
	swLink.style.cssText = 'margin-left:10px; font-size:85%; cursor:pointer' 
  ul.parentNode.insertBefore(swLink, ul)
	//create table
	lis = ul.getElementsByTagName('li')
	if (window.ptMaxPages && lis.length > ptMaxPages) isTable = true //surpress creation if too many rows
	switchNewPages()
}


function switchNewPages(){
 if (isTable){ 
   ul.style.display = 'block'
   if (logTable) logTable.style.display = 'none'
   swLink.innerHTML = '<img src='+imcomm+'thumb/4/41/List_icon.gif/12px-List_icon.gif>'
 }else{
   if (!logTable) createTable()
   ul.style.display = 'none'
   logTable.style.display = 'block'
   swLink.innerHTML = '<img src='+imcomm+'thumb/c/cc/Simple_icon_table.svg/13px-Simple_icon_table.svg.png>'
 }
 isTable = !isTable
}


function createTable(){
 //var comment, isOneUser
 if (!window.logDateIn) logDateIn = /(\d\d:\d\d), (\d\d?) (\S\S\S)\S* (\d\d\d\d)/
 if (!window.logDateOut) logDateOut = '$1 $2&nbsp;$3'
 if (!window.logBlDivider) logBlDivider = '<br>'
 addCSS('\
.logtime {width:15px}\
tr.not-patrolled {background:transparent}\
tr.not-patrolled td.logtime {background:#FFFFAA}\
td.pagehist {text-align:right; padding-right:2px}\
td.quote {background:white}\
' + (window.newPagesCSS?newPagesCSS:''))
 //create table
 var tbody = '<tr><th><img src='+imcomm+'thumb/a/af/Relogio07_15.svg/15px-Relogio07_15.svg.png></th>'
 var columns = 5
 var ma
 if (isOneUser=/&username=([^&]+)/.test(document.URL)) columns = 4
 else tbody += '<th><img src=/skins-1.5/monobook/user.gif></th>'
 tbody += '<th id=thTitles>&nbsp;</th><th>&nbsp;</th>'
  + '<th><img src=' + imcomm + '8/80/Icons-mini-comment_blue.gif></th></tr>'
 //parse entries
 for (var i=0; i<lis.length; i++){
   row = lis[i].innerHTML 
	//get comment span
   ma = row.match(/<span class="?comment"?>\((.+)\)<\/span> *$/i)
   isQuote = ''
   if (ma) {
     comment = ma[0] 
     row = row.substring(0, row.length - comment.length)
     ma = ma[1] //without SPAN
     if (ma=ma.match(mwC.autosumm_new)){ comment = ma[1]; isQuote = ' quote' }
   }else comment = ''
   //parse everything else 
   ma = row.match(/([^<]+)(<a[^<]+<\/a>) \((<a[^<]+<\/a>)[^\d]*([^ \]]+)[^<]*(<a[^<]+<\/a>) (.*)/i) 
   if (!ma || ma.length != 7) { //cannot parse
    tbody +='<tr><td colspan='+columns+'>' + lis[i].innerHTML + '</td></tr>'
    continue
   }
   tbody +='<tr class="' + lis[i].className + '">' 
   + '<td class=logtime>'  + ma[1].replace(logDateIn, logDateOut) 
   + (isOneUser ? '' : '</td><td>' 
     + ma[5] + ma[6].replace(/>(.)(.*?)</g, '>$1<').replace(/> </,'>&nbsp;<'))
   + '</td><td class=pagetitle>' + ma[2] 
   + '</td><td class=pagehist>' + ma[3].replace(/>[^<]+</, '>'
    +ma[4].replace(/[^\d,]/g,'')+'<') //number of bytes as history link
   + '</td><td class="comment'+isQuote+'">' + comment + '</td></tr>'
 }
 //insert table
 logTable = document.createElement('div')
 logTable.innerHTML = '<table class=wikitable width=100% id=logTable>' +  tbody + '</table>'
 ul.parentNode.insertBefore(logTable, ul)
 ts_makeSortable(document.getElementById('logTable'))
 //add [patrol] switch
 var sp = document.createElement('span')
 sp.style.cssText = 'cursor:pointer; font-size:smaller; font-weight:normal; margin-left:1em'
 sp.appendChild(document.createTextNode('[+'+mwC.patrol_word+']'))
 sp.title = mwC.patrol_switch_tip
 sp.onclick = displayDirectPatrolLinks
 document.getElementById('thTitles').appendChild(sp)
}


function displayDirectPatrolLinks(){
 var tds = getElementsByClassName(logTable, 'td', 'pagetitle'), aa, pp
 for (var i=0; i<tds.length; i++){
   var aa = tds[i].getElementsByTagName('a')
   if (!(aa=aa[0]) || !(href=aa.href) || (href.indexOf('&rcid=')==-1)) continue
   pLink = aa.nextSibling
   if (!pLink || pLink.nodeName != 'A'){ //create [patrol] link
     pLink = document.createElement('a')
     pLink.appendChild(document.createTextNode('['+mwC.patrol_word+']'))
     pLink.href = href + '&action=markpatrolled'
     addHandler(pLink, 'click', patrolClick)
     pLink.style.cssText = 'font-size:smaller; margin-left:1em; display:none'
     aa.parentNode.appendChild(pLink)
   }
   pLink.style.display = (pLink.style.display == 'none') ? 'inline' : 'none'
 }
}


function addCSS(text){
 var s = document.createElement('style')
 s.setAttribute('type', 'text/css')
 if (s.styleSheet) s.styleSheet.cssText = text //IE
 else s.appendChild(document.createTextNode(text))
 document.getElementsByTagName('head')[0].appendChild(s)
}









// *** This part is executed on  articles *** 
var mwPatrolLink

function startOnNewArtcile(){
	//add 'patrol' tab 
  var pTabLink
	if (!window.ptNoPatrolTab){
	  pTabLink = mw.util.addPortletLink('p-cactions', '', mwC.patrol_word, 't-patrol', mwC.patrol_tip).firstChild
	  addHandler(pTabLink, 'click', patrolClick)
	}
	//find MediaWiki built-in patrol link
	var content = document.getElementById('content') || document.body
  var mwPatrolLink = getElementsByClassName(content, 'div', 'patrollink')[0]
	if (mwPatrolLink && (mwPatrolLink=mwPatrolLink.getElementsByTagName('a')[0])){
	  addHandler(mwPatrolLink, 'click', patrolClick)
    if (pTabLink) pTabLink.href = mwPatrolLink.href
	}
	
}
 

function patrolClick(e){
 e = e || window.event
 if (e.shiftKey || e.button == 2) return true // shift key or right click
 if ((isIE && e.button == 4) || (!isIE && e.button == 1)) return true //middle click
 var lnk = e.target || e.srcElement
 var url = lnk.getAttribute('href')
 if (url && window.ptNoInPagePatrolling) return true //let browser handle it
 if (e.preventDefault) e.preventDefault(); else e.returnValue = false  //otherwise intercept
 if (url) markAsPatrolled(url)
 else makeApiCall('query&list=recentchanges&rctype=new&rcprop=ids|patrolled&rctitles=' 
    + encodeURIComponent(mw.config.get('wgPageName')), getRCIDFirst)
 return false
}


function getRCIDFirst(resp){
 if (!resp) return jsMsg('Error while making API call')
 var q
 try {eval('q='+resp)} 
 catch (e) { return jsMsg('Error while evaluating API answer:<br />'+resp)}
 if (q.error) return jsMsg('API says "' + q.error.code + ':' + q.error.info+'"')
 if (!(q=q.query) || !(q=q.recentchanges) || !(q=q[0])) 
   return jsMsg('Cannot find «'+mw.config.get('wgPageName')+'» in recentchanges:<br />'+resp)
 if (!q.rcid) return jsMsg('Cannot find RCID:<br />'+resp)
 //define url
 var patrolURL = mw.config.get('wgServer')+mw.config.get('wgScript')+'?action=markpatrolled&rcid='+q.rcid
  +'&title='+encodeURIComponent(mw.config.get('wgPageName'))
 //check if patrolled already
 if (typeof q.patrolled == 'string'){
   jsMsg('This page has been <b>already patrolled</b>'
    +' (<a href="'+mw.config.get('wgServer')+mw.config.get('wgScript')+'?title=Special:Log&page='+encodeURIComponent(mw.config.get('wgPageName'))+'">log</a>).'
    + ' If you want, you can <a id=patrol-anyway href="'+patrolURL+'">mark it</a> as patrolled again')
   addHandler(document.getElementById('patrol-anyway'), 'click', patrolClick)
   return
 }
 markAsPatrolled(patrolURL)
}


function markAsPatrolled(url){
 //url = url.replace(/action=markpatrolled/, 'action=watch') // debugging !!!
 jsMsg(mwC.patrol_wait)
 if (window.ptNoInPagePatrolling) document.location.href = url
 else openActionInFrame(url)
}


function openActionInFrame (url){
 var ifr = document.createElement('iframe')
 ifr.style.cssText = 'width:85%; height:150px; border:none;  opacity:0.3'
 //attch iframe
 var jsm = document.getElementById('mw-js-message')
 jsm.appendChild(ifr)
 //attach onload
 function iframeOnLoad(){ //hide unneeded HTML elements
   var d = ifr.contentDocument || ifr.contentWindow.document
   var pp = d.getElementsByTagName('p')
   patrolMessage2 = '' //global var
   for (var j=0; j<pp.length; j++)  patrolMessage2 += '<br/>' + pp[j].innerHTML + '<br/>'
   //jsm.removeChild(ifr); ifr = null
   setTimeout('jsMsg(patrolMessage2)', 10) //otherwise Firefox 1.5 staying is "loading" state for some reason
 }
 if (isIE) ifr.onreadystatechange = function(){ if (/loaded|complete/.test(this.readyState)) iframeOnLoad()}
 else ifr.onload = iframeOnLoad
 //load
 window.scrollTo(0, 0)
 ifr.src = url + '&useskin=myskin'
}


// ** AJAX asynchronous call
function makeApiCall(params, func){
 var aj = sajax_init_object()
 var url = '/w/api.php?action=' + params
 jsMsg('Making API <a href="'+mw.config.get('wgServer')+url +'">request</a>, please wait...')
 aj.open('GET', url + '&format=json',true)
 aj.onreadystatechange=function() {
   if (aj.readyState != 4) return
   if (aj.status == 200) func(aj.responseText)
   else func(null) 
 }
 aj.send(null)
}


}

Content Disclaimer

Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.

  1. The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
  2. There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
  3. It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
  4. Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
  5. Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.