Участник:KPu3uC B Poccuu/rcl.js

Материал из Википедии — свободной энциклопедии
var rcp_http;
var rcp_enabled;
var rcp_num_pages;
var rcp_refresh;
var rcp_num_idle_req;
var rcp_curr_idle_req;
//localisation is here
var rcp_str_no_ajax='Ваш обозреватель не поддерживается.';
var rcp_str_box_title='Свежие правки';
var rcp_str_box_title_updating='Свежие правки (обн.)';
var rcp_str_box_title_failed='Свежие правки (неудача обновления)';
var rcp_str_enable='Включить';
var rcp_str_disable='Отключить';
var rcl_deleted='Страница удалена этим действием';
var rcl_moved='Страница переименована этим действием';
//initalise
function rcp_init()
{
	mw.util.addCSS('\
	.flaggedrevs-color-1 {background-color:#f0f8ff}\
	.flaggedrevs-unreviewed {background-color:#FAEBD7}\
	.flaggedrevs-pending {background-color: #FFC}\
	#flagged-legend {display:block !important}\
	')
	// allow user settings through
	if(rcp_enabled==null)rcp_enabled=false;
	if(rcp_num_pages==null)rcp_num_pages=10;
	if(rcp_refresh==null)rcp_refresh=60;
	if (rcp_num_idle_req==null)rcp_num_idle_req=60;
	// A few limits to be nice to the servers
	//if(rcp_num_pages>50)rcp_num_pages=50;else if(rcp_num_pages<1)rcp_num_pages = 1;
	if(rcp_refresh<2)rcp_refresh=2;
	if(rcp_num_idle_req>1000)rcp_num_idle_req=1000;else if(rcp_num_idle_req<5)rcp_num_idle_req=5;
	// get our cookie
	/*
	if(document.cookie.length>0)
	{
		var c_start=document.cookie.indexOf("rcp_show_box=");
		if(c_start!=-1)
		{ 
			c_start=c_start+13; 
			var c_end=document.cookie.indexOf(";",c_start);
			if(c_end<0)c_end=document.cookie.length; 
			rcp_enabled=document.cookie.substring(c_start,c_end)=="yes"
		}
	}*/
	var storage=window.localStorage;
	if(storage)rcp_enabled=storage.getItem('rcl_show')!='no';else
	{
		mw.log(rcp_str_no_ajax);
		rcp_enabled=false;
	}
	// Either make a request or show nothing
	rcp_curr_idle_req=0;
	if(rcp_enabled)rcp_ajax_request();else rcp_draw_disabled_box();
}
 
/* init ajax */
function rcp_create_request() {
	try
	{
		rcp_http=new XMLHttpRequest();
	}
	catch(e)
	{
		try
		{
			rcp_http=new ActiveXObject("Msxml2.XMLHTTP");
		}
		catch(e)
		{
			try
			{
				rcp_http=new ActiveXObject("Microsoft.XMLHTTP");
			}
			catch(e)
			{
				return false;
			}
		}
	}
	rcp_http.onreadystatechange=function()
	{
		if(rcp_http.readyState==4)rcp_ajax_response();
	}
	return true;
}
 
/* make a request */
function rcp_ajax_request()
{
	// if we have done too many requests, disable the box
	//rcp_curr_idle_req++;
	if(rcp_curr_idle_req>rcp_num_idle_req)rcp_disable_box();
	// check we are enabled
	if(!rcp_enabled)return;
	// firstly, inform the user
	var cur_box=document.getElementById('p-recentchangeslist');
	if(cur_box!=null)cur_box.firstChild.firstChild.data=rcp_str_box_title_updating;
	if(!rcp_create_request()){if(cur_box!=null)cur_box.firstChild.firstChild.data=rcp_str_box_title_failed;else alert(rcp_str_no_ajax);}
	// Then make the request
	rcp_http.open("GET",mw.util.wikiScript('api')+"?action=query&format=xml&list=recentchanges&rcshow=!bot|!anon&rcnamespace=0|1|6|7|10|11|14|15&rcprop=title|timestamp|ids|sizes|tags|user|parsedcomment|flags|loginfo&rcexcludeuser="+mw.util.wikiUrlencode(mw.config.get('wgUserName'))+"&rclimit="+mw.util.wikiUrlencode(rcp_num_pages),true);
	rcp_http.send(null);
}
 
function rcp_draw_disabled_box()
{
	rcp_draw_disabled_box_vector();
}

function rcp_ajax_response()
{
	rcp_ajax_response_vector();
	//and do it again
	setTimeout("rcp_ajax_request()",rcp_refresh*1000);
}

function rcp_disable_box()
{
	rcp_enabled=false;
	rcp_draw_disabled_box();
	//document.cookie="rcp_show_box=no; path=/";
	window.localStorage.setItem('rcl_show','no');
}

function rcp_enable_box()
{
	rcp_enabled=true;
	rcp_curr_idle_req=0;
	//document.cookie="rcp_show_box=yes; path=/";
	rcp_ajax_request();
	window.localStorage.setItem('rcl_show','yes');
}

/* Draw disabled box (vector skin) */
function rcp_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-recentchangeslist');
	div.className='portal collapsed';
	var heading=document.createElement('h5');
	heading.appendChild(document.createTextNode(rcp_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(rcp_str_enable));
	a.onclick=rcp_enable_box;
	p.appendChild(a);
	// add later
	div.appendChild(p)
	// now replace the div
	var old_div=document.getElementById('p-recentchangeslist');
	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 $j!='undefined'&&wgVectorEnabledModules.collapsiblenav)
	{
		$('#p-recentchangeslist>h5').keydown(function(event)
		{
			if(event.which== 13/* Enter */||event.which==32/* Space */)rcp_toggle($(this));
		}).mousedown(function()
		{
			rcp_toggle($(this));
			$(this).blur();
			return false;
		});
	}else link_div.appendChild(p);
}
var nonFlaggedNS=[];
$.each(mw.config.get('wgFormattedNamespaces'),function(i,ns)
{
	if(i>0&&i!=6&&i!=10&&i!=14)nonFlaggedNS.push(ns);
})
nonFlaggedNS=new RegExp('^('+nonFlaggedNS.join('|')+'):');
var title,titles=[],link={};
function markLink(pg)
{
	var lnk=$(link[pg.title]);
	var li=lnk.closest('li');
	var clss,catText,catColor,catTip;
	if(pg.flagged)
	{
		if(pg.lastrevid==pg.flagged.stable_revid)clss='flaggedrevs-color-1';else
		{
			clss='flaggedrevs-pending';
			addLnk('oldid='+pg.flagged.stable_revid+'&diff='+pg.lastrevid,'непр.');
		}
	}else clss='flaggedrevs-unreviewed';
	li.addClass(clss);
	var watched=(typeof pg.watched=='string');
	if(watched)lnk.wrap('<strong class="mw-watched"/>');
	catText='—';
	if(pg.categories)
	{
		for(var c=0;c<pg.categories.length;c++)
		{
			cat=pg.categories[c].title.replace(/^[^:]+:/,'');
			if(/:К быстрому удалению$/.test(cat)&&!catText)
			{
				catText='БУ';
				catColor='#f88';
				catTip=cat;
			}else if(/:Кандидаты на удаление$/.test(cat))
			{
				catText='уд.';
				catColor='#faa';
				catTip=cat;
			}else if(/^Википедия:БУ:/.test(cat))
			{
				catText=cat.replace(/^Википедия:/,'');
				catColor='#f88';
				catTip=cat;
			}else if(/^Википедия:К отсроченному удалению$/.test(cat))
			{
				catText = 'отл.';
				catColor = 'pink';
				catTip = cat;
			}else if(/:Оспариваемые быстрые удаления$/.test(cat))
			{
				catText = 'осп.';
				catColor = 'violet';
				catTip = cat;
			}
		}
		//return new Array(catText,catColor,catTip,watched)
		if(catText!='—')li.append('[<span style="background:'+catColor+'"'+'title="«'+catTip+'»">('+catText+')</span>]');
		//var span=document.createElement('span')
		//span.innerHTML='[<span style="background:'+catColor+'"'+'title="«'+catTip+'»">('+catText+')</span>]'
		//link[pg.title].addChild(span)
	}
	function addLnk(href,name)
	{
		li.find('.mw-newpages-history a:last').after(' | <a href="'+mw.config.get('wgScript')+'?'+href+'">'+name+'</a>');
	}
}

function getState(titles)
{
	while(titles.length)$.getJSON(mw.util.wikiScript('api'),
	{
		action:'query',
		format:'json'
		//,prop:'info|flagged|categories'
		,prop:'info|flagged'
		,inprop:'talkid|watched'
		//,cllimit:500
		,titles:titles.splice(0,50).join('|')
	},function(resp)
	{
		if(!resp||!(resp=resp.query))return;
		for(var id in resp.pages)markLink(resp.pages[id]);
	})
}
/* Draw response (vector skin) */
function rcp_ajax_response_vector()
{
	var items=rcp_http.responseXML.getElementsByTagName('rc');
	var tagsbuf=rcp_http.responseXML.getElementsByTagName('tags');
	// create the div that holds all the links
	var link_div = document.createElement('div');
	link_div.className='body';
	link_div.style.display="block";
	link_div.style.maxHeight="500px";
	link_div.style.backgroundColor='white';
	var list = document.createElement('ul');
	link_div.appendChild(list);
	var links=[];
	// populate the list with links.
	for(var i=0;i<items.length;i++)
	{
		var item_name=items[i].getAttribute('title');
		var oldid=items[i].getAttribute('old_revid');
		var newid=items[i].getAttribute('revid');
		var user=items[i].getAttribute('user');
		var patrolled=items[i].getAttribute('patrolled')!=null;
		var isanon=items[i].getAttribute('anon')!=null;
		var isnew=items[i].getAttribute('new')!=null;
		var isminor=items[i].getAttribute('minor')!=null;
		var islogevent=items[i].getAttribute('type')=='log';
		var deleted=items[i].getAttribute('logaction')=='delete'&&items[i].getAttribute('logtype')=='delete';
		var moved=items[i].getAttribute('logaction')=='move'&&(items[i].getAttribute('logtype')=='move'||items[i].getAttribute('logtype')=='move_redir');
		if(!deleted&&!isnew)
		{
			if(moved)var item_url=mw.config.get('wgScript')+'?title='+mw.util.wikiUrlencode(item_name)+'&redirect=no';else
			{
				var item_url=mw.config.get('wgScript')+'?title='+mw.util.wikiUrlencode(item_name)+'&diff='+newid;
				if(oldid!=0)item_url=item_url+'&oldid='+oldid;
			}
		}else var item_url=mw.util.getUrl(item_name);
		var parsedcomment=items[i].getAttribute('parsedcomment');
		var oldsize=items[i].getAttribute('oldlen');
		var newsize=items[i].getAttribute('newlen');
		var time=items[i].getAttribute('timestamp');
		var tags="";
		var temp2=tagsbuf[i].getElementsByTagName('tag');
		for(var j=0;j<temp2.length;j++)
		{
			var data=temp2[j].firstChild.nodeValue;
			if(data)tags=tags+', '+temp2[j].firstChild.nodeValue;
		}
		if(tags)tags=' <span style="background:pink">&laquo;'+tags.replace(/\, /,'')+'&raquo;</span> ';else tags="&nbsp;";
		var exclamation=document.createElement('span');
		exclamation.style.fontSize='20%';
		if(isanon)exclamation.innerHTML='[$2<span style="color:red;font-weight:bolder" title="правка IP-участника $1">$1&nbsp;</span>';else exclamation.innerHTML='[$2<span style="color:green" title="правка зарегистрированного участника $1">✔ $1&nbsp;</span>';
		//Get the current time
		var dateobj=new Date(time);
		var addZero=function(i)
		{
			if(i<10)return '0'+i;else return i;
		}
		time=addZero(dateobj.getHours())+':'+addZero(dateobj.getMinutes())+':'+addZero(dateobj.getSeconds());
		//var now=Math.floor(dateobj.getTime()/1000.0);
		exclamation.innerHTML=exclamation.innerHTML.replace(/\$1/g,decodeURIComponent(user).replace(/_/,' ')).replace(/\$2/,'<span style="color:purple">'+time+'</span>&nbsp;');
		var temp="";
		if(isnew)temp="<abbr class='newpage' title='Этой правкой была создана новая страница'>Н</abbr>";
		if(isnew)temp=temp+"<abbr class='minoredit' title='Эта правка помечена как малая'>м</abbr>";
		if(islogevent)temp=temp+"<abbr style='font-weight:bolder' title='Запись из журнала'>Ж</abbr>";
		var deltasize=newsize-oldsize;
		if(!deltasize)temp=temp+'<span class="mw-plusminus-null" title="Размер изменения в байтах: $1"> (0)</span>‎';else if(deltasize>500)temp=temp+'<strong class="mw-plusminus-pos" title="Размер изменения в байтах: $1"> +$1</strong>';else if(deltasize>0)temp=temp+'<span class="mw-plusminus-pos" title="Размер изменения в байтах: $1"> +$1</span>';else if(deltasize<-500)temp=temp+'<strong class="mw-plusminus-neg" title="Размер изменения в байтах: $1"> $1</strong>';else temp=temp+'<span class="mw-plusminus-neg" title="Размер изменения в байтах: $1"> $1</span>';
		temp=temp.replace(/\$1/g,deltasize);
		exclamation.innerHTML=exclamation.innerHTML+temp+'] ';
		var a=document.createElement('a');
		a.setAttribute('href',item_url);
		a.setAttribute('target','_blank');
		a.setAttribute('title',item_name);
		a.style.fontStyle='normal';
		if(deleted)
		{
			var img=document.createElement('img');
			img.setAttribute('src','//upload.wikimedia.org/wikipedia/commons/c/c4/Contra.png');
			img.setAttribute('width','10px');
			img.setAttribute('title',rcl_deleted);
			img.style.paddingLeft='2px';
			img.style.paddingRight='2px';
			exclamation.appendChild(img);
			a.style.backgroundColor='pink';
			a.style.textDecoration='line-through';
			a.style.color='#ba0000';
		}
		a.appendChild(document.createTextNode(item_name.replace(/_/g,' ')));
		//a.addEventListener('click',dfClick,false);
		if(!nonFlaggedNS.test(item_name))titles.push(item_name);
		var comment=document.createElement('div');
		comment.style.fontSize='15%';
		comment.style.whiteSpace='nowrap';
		comment.style.margin='0';
		comment.style.overflowX='auto';
		comment.style.overflowY='hidden';
		temp=parsedcomment.replace(/<[^<>]+?[\/]?>/ig,'');//.replace(/<[^<>]+?\/>/ig,'')
		comment.setAttribute('title',temp);
		if(parsedcomment)
		{
			comment.innerHTML='<br/>(<i>'+parsedcomment+'</i>)';
			comment.style.lineHeight='0.7';
		}else comment.style.lineHeight='0.1';
		var scriptPath=mw.config.get('wgScript');
		var userlink=mw.util.getUrl("User:"+user);
		var info=document.createElement('span');
		info.style.fontSize='25%';
		info.innerHTML=tags+'<a target="recentchangeswindow" class="mw-newpages-history" title="страница" href="'+mw.util.getUrl(item_name)+'">стр.</a> • <a target="recentchangeswindow" title="история" href="'+scriptPath+'?action=history&title='+item_name+'">и.</a> • <a target="recentchangeswindow" title="журналы" href="'+scriptPath+'?title=Special:Log&page='+item_name+'">ж.</a> • <a target="recentchangeswindow" title="автор правки" href="'+userlink+'">у.</a> • <a target="recentchangeswindow" title="вклад" href="'+mw.util.getUrl('Special:Contributions/'+user)+'">в.</a>';
		var li=document.createElement('li');
		li.appendChild(exclamation);
		li.appendChild(a);
		if(moved)
		{
			var img=document.createElement('img');
			img.setAttribute('src','//upload.wikimedia.org/wikipedia/commons/thumb/3/35/Arrow_icon.svg/800px-Arrow_icon.svg.png');
			img.setAttribute('width','20px');
			img.setAttribute('title',rcl_moved);
			img.style.paddingLeft='2px';
			img.style.paddingRight='2px';
			//li.appendChild(img);
			var moveinfo=items[i].getElementsByTagName('move')[0];
                        console.log(typeof moveinfo);
			var movedtolink=document.createElement('a');
			var movedto=moveinfo.getAttribute('new_title');
                        //console.log(movedto);
			movedtolink.setAttribute('href',mw.util.getUrl(movedto));
			movedtolink.setAttribute('target','_blank');
			movedtolink.setAttribute('title',movedto);
			movedtolink.style.fontStyle='normal';
			li.appendChild(movedtolink);
		}
		li.appendChild(comment);
		li.appendChild(info);
		li.appendChild(document.createElement('hr'));
		link[item_name]=a;
		links.push(item_name);
		list.appendChild(li);
		}
	// Container div
	var div=document.createElement('div');
	div.setAttribute('id','p-recentchangeslist');
	div.className='portal expanded';
	var heading=document.createElement('h5');
	heading.appendChild(document.createTextNode(rcp_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(rcp_str_disable));
	a.onclick=rcp_disable_box;
	p.appendChild(a);
	// add later
	// now replace the div
	var old_div=document.getElementById('p-recentchangeslist');
	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);
	}
	getState(links);
	if(typeof $j!='undefined'&&wgVectorEnabledModules.collapsiblenav)
	{
		$('#p-newpages>h5').keydown(function(event)
		{
			if(event.which==13/* Enter */||event.which==32/* Space */)rcp_toggle($(this));
		}).mousedown(function()
		{
			rcp_toggle($(this));
			$(this).blur();
			return false;
		});
	}else link_div.appendChild(p);
}
 
function rcp_toggle($element)
{
	$.cookie('vector-nav-'+$element.parent().attr('id'),$element.parent().is('.collapsed'));
	if($element.parent().is('.collapsed'))rcp_enable_box();else rcp_disable_box();
	$element.parent().toggleClass('expanded').toggleClass('collapsed').find('div.body').slideToggle('fast');
}
//go!
$(rcp_init);