<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://ejwiki.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AWatchlist.js</id>
	<title>MediaWiki:Watchlist.js - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://ejwiki.org/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AWatchlist.js"/>
	<link rel="alternate" type="text/html" href="https://ejwiki.org/index.php?title=MediaWiki:Watchlist.js&amp;action=history"/>
	<updated>2026-05-16T01:58:33Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://ejwiki.org/index.php?title=MediaWiki:Watchlist.js&amp;diff=388385&amp;oldid=prev</id>
		<title>Mliris: 1 версия</title>
		<link rel="alternate" type="text/html" href="https://ejwiki.org/index.php?title=MediaWiki:Watchlist.js&amp;diff=388385&amp;oldid=prev"/>
		<updated>2010-03-11T07:42:52Z</updated>

		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 07:42, 11 марта 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Mliris</name></author>
	</entry>
	<entry>
		<id>https://ejwiki.org/index.php?title=MediaWiki:Watchlist.js&amp;diff=25732&amp;oldid=prev</id>
		<title>Ariely: переименовал «MediaWiki:Gadget-watchlist.js» в «MediaWiki:Watchlist.js»</title>
		<link rel="alternate" type="text/html" href="https://ejwiki.org/index.php?title=MediaWiki:Watchlist.js&amp;diff=25732&amp;oldid=prev"/>
		<updated>2010-02-28T20:05:29Z</updated>

		<summary type="html">&lt;p&gt;переименовал «&lt;a href=&quot;/index.php/MediaWiki:Gadget-watchlist.js&quot; title=&quot;MediaWiki:Gadget-watchlist.js&quot;&gt;MediaWiki:Gadget-watchlist.js&lt;/a&gt;» в «&lt;a href=&quot;/index.php/MediaWiki:Watchlist.js&quot; title=&quot;MediaWiki:Watchlist.js&quot;&gt;MediaWiki:Watchlist.js&lt;/a&gt;»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;var WLScript = new function(){ //wrapper object&lt;br /&gt;
&lt;br /&gt;
var whenPageLoaded = +(new Date()) - 30000 //add 30 sec just in case&lt;br /&gt;
var namespace, content, alreadySorted, alreadyAddedUnwatch, mw, rcm0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mw = {&lt;br /&gt;
sort:&amp;#039;↑↓&amp;#039;,&lt;br /&gt;
sortTitle:&amp;#039;Сортировать страницы по пространствам&amp;#039;,&lt;br /&gt;
sortDone:&amp;#039;Изменения уже отсортированы&amp;#039;,&lt;br /&gt;
unwatchTitle:&amp;#039;Добавить (x) ссылки для вычёркивания страниц из списка наблюдения&amp;#039;,&lt;br /&gt;
unwatchDone:&amp;#039;Для удаления страниц из списка наблюдения используйте появившиеся ссылки (x)&amp;#039;,&lt;br /&gt;
onlynew:&amp;#039;Только новые&amp;#039;,&lt;br /&gt;
onlynewTitle: &amp;#039;Показать изменения с момента загрузки этой страницы&amp;#039;,&lt;br /&gt;
expandAll: &amp;#039;Показать/спрятать все свёрнутые правки&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
if (wgUserLanguage!=&amp;#039;ru&amp;#039;)&lt;br /&gt;
mw = {&lt;br /&gt;
sort:&amp;#039;Sort...&amp;#039;,&lt;br /&gt;
sortTitle:&amp;#039;Sort titles by even namespace number, then by page title&amp;#039;,&lt;br /&gt;
sortDone:&amp;#039;Watchlist changes already sorted&amp;#039;,&lt;br /&gt;
unwatchTitle:&amp;#039;Add (x) quick unwatch links&amp;#039;,&lt;br /&gt;
unwatchDone:&amp;#039;Use (x) links to quickly unwatch pages&amp;#039;,&lt;br /&gt;
onlynew: &amp;#039;Only new&amp;#039;,&lt;br /&gt;
onlynewTitle: &amp;#039;Show changes since this page was loaded&amp;#039;,&lt;br /&gt;
expandAll: &amp;#039;Expand/hide all&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
mw.unwatch = (window.wgAjaxWatch ? wgAjaxWatch.unwatchMsg : &amp;#039;Unwatch&amp;#039; )&lt;br /&gt;
mw.watch = (window.wgAjaxWatch ? wgAjaxWatch.watchMsg : &amp;#039;Watch&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
this.onLoad = function() {&lt;br /&gt;
 PngFixDisabled = true&lt;br /&gt;
 init()&lt;br /&gt;
 if (!namespace) return&lt;br /&gt;
 //find insertion point&lt;br /&gt;
 var insert = namespace.form&lt;br /&gt;
 while (insert.previousSibling &amp;amp;&amp;amp; insert.nodeName != &amp;#039;BR&amp;#039;) insert=insert.previousSibling&lt;br /&gt;
 //append &amp;quot;only new&amp;quot; link&lt;br /&gt;
 var lnk = addLnk(&amp;#039;#&amp;#039;, mw.onlynew, mw.onlynewTitle)&lt;br /&gt;
 lnk.id = &amp;#039;listSince&amp;#039;&lt;br /&gt;
 lnk.onclick = lnk.onmousedown = onlyNewEntries // react to middle clicks too&lt;br /&gt;
 //append other links&lt;br /&gt;
 addLnk(&amp;#039;javascript:WLScript.addUnwatchLinks()&amp;#039;, &amp;#039;x&amp;#039; , mw.unwatchTitle) //mw.unwatch+&amp;#039;…&amp;#039;&lt;br /&gt;
 addLnk(&amp;#039;javascript:WLScript.sortWatchlist()&amp;#039;, mw.sort, mw.sortTitle)&lt;br /&gt;
 if (rcm0=document.getElementById(&amp;#039;RCM0&amp;#039;))&lt;br /&gt;
   addLnk(&amp;#039;javascript:WLScript.expandWatchlist()&amp;#039;, &amp;#039;±&amp;#039;, mw.expandAll)&lt;br /&gt;
 // function adds &amp;quot; | &amp;lt;link&amp;gt;&amp;quot; just before &amp;#039;insert&amp;#039; element&lt;br /&gt;
 function addLnk(url, text, tooltip){ &lt;br /&gt;
   var lnk = document.createElement(&amp;#039;a&amp;#039;)&lt;br /&gt;
   lnk.href = url&lt;br /&gt;
   lnk.appendChild(document.createTextNode(text))&lt;br /&gt;
   lnk.title = tooltip || &amp;#039;&amp;#039;&lt;br /&gt;
   insert.parentNode.insertBefore(document.createTextNode(&amp;#039; | &amp;#039;), insert)&lt;br /&gt;
   insert.parentNode.insertBefore(lnk, insert)&lt;br /&gt;
   return lnk&lt;br /&gt;
 }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function init(){&lt;br /&gt;
 namespace = document.getElementById(&amp;#039;namespace&amp;#039;)&lt;br /&gt;
 content = document.getElementById(&amp;#039;bodyContent&amp;#039;) || document.body&lt;br /&gt;
}&lt;br /&gt;
this.init = init&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function onlyNewEntries() {&lt;br /&gt;
 var url = window.location.href.split(&amp;#039;#&amp;#039;)[0]&lt;br /&gt;
  var days = ( +(new Date()) - whenPageLoaded)/(1000 * 3600 * 24) &lt;br /&gt;
 if (url.match(/[?&amp;amp;]days=/))&lt;br /&gt;
   this.href = url.replace(/([?&amp;amp;]days=)[^&amp;amp;]*/, &amp;#039;$1&amp;#039;+days)&lt;br /&gt;
 else&lt;br /&gt;
   this.href = url + (url.indexOf(&amp;#039;?&amp;#039;) &amp;lt; 0 ? &amp;#039;?&amp;#039;:&amp;#039;&amp;amp;&amp;#039;) + &amp;#039;days=&amp;#039; + days&lt;br /&gt;
 return true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
this.sortWatchlist = function(){&lt;br /&gt;
 if (alreadySorted) return alert(mw.sortDone)&lt;br /&gt;
 var H4s = content.getElementsByTagName(&amp;#039;h4&amp;#039;), dayDiv, rows, h, i, j, pgname, el, step, last&lt;br /&gt;
 //sort all days separately&lt;br /&gt;
 for (var h=0; h&amp;lt;H4s.length; h++){&lt;br /&gt;
   //get UL or DIV immediately after H4&lt;br /&gt;
   dayDiv = H4s[h]&lt;br /&gt;
   while ((dayDiv=dayDiv.nextSibling) &amp;amp;&amp;amp; (dayDiv.nodeName != &amp;#039;DIV&amp;#039;) &amp;amp;&amp;amp; (dayDiv.nodeName != &amp;#039;UL&amp;#039;));&lt;br /&gt;
   //get WL rows, find their namespaces, calculate sortkeys&lt;br /&gt;
   rows = getWatchlistRows(dayDiv)&lt;br /&gt;
   if (!rows) return&lt;br /&gt;
   for (i = 0; i &amp;lt; rows.length; i++){&lt;br /&gt;
     pgname = getTitleFromURL(rows[i].href)&lt;br /&gt;
     ns = getNSFromTitle(pgname)&lt;br /&gt;
     if (ns&amp;gt;0) pgname = pgname.substring(getNamespace(ns).length+1) //title w/o prefix&lt;br /&gt;
     if (ns%2) ns-- //sort talk page as if it was a base page&lt;br /&gt;
     rows[i].sortkey = zzz(ns) + &amp;#039;:&amp;#039; + pgname //assign custom tag attribute: namespace+title&lt;br /&gt;
   }&lt;br /&gt;
   //sort rows array&lt;br /&gt;
   rows.sort(function(a,b){&lt;br /&gt;
    if (a.sortkey &amp;gt; b.sortkey) return 1 &lt;br /&gt;
    else if (a.sortkey &amp;lt; b.sortkey) return -1 &lt;br /&gt;
    else return 0   &lt;br /&gt;
  })&lt;br /&gt;
  //sort rows in HTML&lt;br /&gt;
  for (i=0; i&amp;lt;rows.length; i++){ //move rows to the dayDiv bottom&lt;br /&gt;
    el = last = rows[i]&lt;br /&gt;
    if (el.parentNode.nodeName == &amp;#039;LI&amp;#039;) //non-enhanced watchlist&lt;br /&gt;
      el.parentNode.parentNode.appendChild(el.parentNode) //move to bottom&lt;br /&gt;
    if (el.parentNode.nodeName == &amp;#039;TD&amp;#039;){&lt;br /&gt;
 //new enhanced WL, with tables&lt;br /&gt;
		  while ((el=el.parentNode) &amp;amp;&amp;amp; el.nodeName != &amp;#039;TABLE&amp;#039;);&lt;br /&gt;
			if (!el) continue&lt;br /&gt;
			do{ //move table bottom, also taking next (hidden) DIV &lt;br /&gt;
			  step = el.nextSibling; el.parentNode.appendChild(el); el = step &lt;br /&gt;
			}while (el &amp;amp;&amp;amp; el.nodeName != &amp;#039;TABLE&amp;#039;)&lt;br /&gt;
    }&lt;br /&gt;
else{ //old enhanced WL, in case new is reverted&lt;br /&gt;
      //find last row element , which is usually BR&lt;br /&gt;
      while ((last=last.nextSibling) &amp;amp;&amp;amp; last.nodeName!=&amp;#039;BR&amp;#039;);&lt;br /&gt;
      if (!last) continue //just in case, this should not happen &lt;br /&gt;
      //move to next DIV (if present), containing (collapsed) list of changes with &amp;quot;enhanced RC&amp;quot;&lt;br /&gt;
      if ((step=last.nextSibling) &amp;amp;&amp;amp; step.nodeName == &amp;#039;#text&amp;#039;) last = step //Firefox insists on &amp;#039;\n&amp;#039; being here&lt;br /&gt;
      if ((step=last.nextSibling) &amp;amp;&amp;amp; step.nodeName == &amp;#039;DIV&amp;#039;)   last = step&lt;br /&gt;
      //now get to the 1st element, stopping just before &amp;lt;br&amp;gt; or &amp;lt;div&amp;gt;&lt;br /&gt;
      while ((step=el.previousSibling) &amp;amp;&amp;amp; step.nodeName!=&amp;#039;BR&amp;#039; &amp;amp;&amp;amp; step.nodeName!=&amp;#039;DIV&amp;#039;) el = step&lt;br /&gt;
      //move all row elements one by one to the bottom of the day div&lt;br /&gt;
      do { step=el.nextSibling;  dayDiv.appendChild(el) } while (el != last &amp;amp;&amp;amp; (el=step)) &lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
 }//for&lt;br /&gt;
 alreadySorted = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
this.expandWatchlist = function(){&lt;br /&gt;
 var i = 0, sp, state = rcm0.style.display&lt;br /&gt;
 while (sp=document.getElementById(&amp;#039;RCM&amp;#039;+(i++).toString()))&lt;br /&gt;
   if (sp.style.display == state) eval(sp.firstChild.href)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
var uwLinks = [], inProgress = null, timeoutID = null&lt;br /&gt;
&lt;br /&gt;
this.addUnwatchLinks = function() {&lt;br /&gt;
 if (alreadyAddedUnwatch) return alert(mw.unwatchDone)&lt;br /&gt;
 var rows = getWatchlistRows(content), x, insAt, el&lt;br /&gt;
 for (var i = 0; i &amp;lt; rows.length; i++){&lt;br /&gt;
   x = document.createElement(&amp;#039;a&amp;#039;)&lt;br /&gt;
   x.href = wgServer+wgScript+&amp;#039;?action=unwatch&amp;amp;title=&amp;#039;+encodeURIComponent(rows[i].title) //non-Ajax unwatch&lt;br /&gt;
   x.onclick = ajaxUnwatch&lt;br /&gt;
   uwLinks.push(x)&lt;br /&gt;
   insAt = rows[i]&lt;br /&gt;
   if (insAt.parentNode.nodeName == &amp;#039;LI&amp;#039;)&lt;br /&gt;
     insAt = insAt.nextSibling.nextSibling //non-enhanced WL: insert before ) after history&lt;br /&gt;
   else&lt;br /&gt;
     while ((el=insAt.previousSibling) &amp;amp;&amp;amp; el.nodeName != &amp;#039;TT&amp;#039;) insAt = el //insert after TT (with time)&lt;br /&gt;
   insAt.parentNode.insertBefore(document.createTextNode(&amp;#039; (&amp;#039;), insAt)&lt;br /&gt;
   insAt.parentNode.insertBefore(x, insAt)&lt;br /&gt;
   insAt.parentNode.insertBefore(document.createTextNode(&amp;#039;) &amp;#039;), insAt)&lt;br /&gt;
   setUnwatchLink(x, false)&lt;br /&gt;
 }&lt;br /&gt;
 alreadyAddedUnwatch = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function ajaxUnwatch(e) {&lt;br /&gt;
 if (inProgress) return false&lt;br /&gt;
 e = e || window.event&lt;br /&gt;
 var targ = e.target || e.srcElement&lt;br /&gt;
 inProgress = getTitleFromURL(targ.href)&lt;br /&gt;
 timeoutID = window.setTimeout( function() {inProgress = null},  10000 )&lt;br /&gt;
 //call server&lt;br /&gt;
 var action = (targ.innerHTML == &amp;#039;x&amp;#039;) ? &amp;#039;u&amp;#039; : &amp;#039;w&amp;#039;&lt;br /&gt;
 sajax_do_call(&amp;#039;wfAjaxWatch&amp;#039;, [inProgress, action], showUnwatch)&lt;br /&gt;
 return false&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function showUnwatch (request) {&lt;br /&gt;
  if (timeoutID) window.clearTimeout(timeoutID)&lt;br /&gt;
  var response = request.responseText&lt;br /&gt;
  if (window.wlUnwatchShowMsg) jsMsg (response.substr(4), &amp;#039;watch&amp;#039;)&lt;br /&gt;
  var name = inProgress, state, prefix, idx, pg, i, el&lt;br /&gt;
  inProgress = null&lt;br /&gt;
  if (/^&amp;lt;u#&amp;gt;/.test(response)) state = true&lt;br /&gt;
  else if (/^&amp;lt;w#&amp;gt;/.test(response)) state = false&lt;br /&gt;
  else return //unrecognized response&lt;br /&gt;
  //find the full name of &amp;quot;other page&amp;quot;&lt;br /&gt;
  var ns = getNSFromTitle(name)&lt;br /&gt;
  var name2 = name&lt;br /&gt;
  if (ns &amp;gt; 0) name2 = name2.substring(getNamespace(ns).length+1) //remove old prefix&lt;br /&gt;
  if (ns % 2)  ns--; else ns++ //switch to  &amp;quot;other&amp;quot; namespace&lt;br /&gt;
  if (ns &amp;gt; 0) name2 = getNamespace(ns) + &amp;#039;:&amp;#039; +  name2 //add new prefix&lt;br /&gt;
  //now mark all rows that are either name or name2&lt;br /&gt;
  for (i=0; i&amp;lt;uwLinks.length; i++){&lt;br /&gt;
    el = uwLinks[i]&lt;br /&gt;
    pg = getTitleFromURL(el.href)&lt;br /&gt;
    if (pg != name &amp;amp;&amp;amp; pg != name2) continue&lt;br /&gt;
    setUnwatchLink (el, state)&lt;br /&gt;
    //now mark the whole line&lt;br /&gt;
    while ((el=el.nextSibling)  &amp;amp;&amp;amp; (el.nodeName!=&amp;#039;DIV&amp;#039;) &amp;amp;&amp;amp; (el.nodeName!=&amp;#039;BR&amp;#039;)) &lt;br /&gt;
       if (el.style) el.style.textDecoration = state ? &amp;#039;line-through&amp;#039; : &amp;#039;&amp;#039;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function setUnwatchLink (unwatchLink, state) {&lt;br /&gt;
  unwatchLink.innerHTML = state ? &amp;#039;+&amp;#039; : &amp;#039;x&amp;#039;&lt;br /&gt;
  unwatchLink.title = state ? mw.watch : mw.unwatch&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//common functions, some need &amp;#039;namespace&amp;#039; select element&lt;br /&gt;
&lt;br /&gt;
function getNSFromTitle(title){ //returns namespace number&lt;br /&gt;
 var i = title.indexOf(&amp;#039;:&amp;#039;)&lt;br /&gt;
 if (i == -1) return 0&lt;br /&gt;
 var prefix = title.substring(0,i+1) //including :&lt;br /&gt;
 for (i=2; i &amp;lt; namespace.options.length; i++)&lt;br /&gt;
   if (namespace.options[i].text+&amp;#039;:&amp;#039; == prefix)&lt;br /&gt;
     return i-1&lt;br /&gt;
 return 0 // &amp;#039;:&amp;#039; was simply a part of a title&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getNamespace(ns){ //returns namespace name&lt;br /&gt;
 if (ns==0) return &amp;#039;&amp;#039;&lt;br /&gt;
 else return namespace.options[ns+1].text&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
function getTitleFromURL (url){ //gets &amp;#039;title=&amp;#039; part from a link&lt;br /&gt;
  var ma = url.match(/(&amp;amp;|\?)title=([^&amp;amp;]+)/)&lt;br /&gt;
  if (ma) return decodeURIComponent(ma[2]).replace(/_/g,&amp;#039; &amp;#039;)&lt;br /&gt;
  else return &amp;#039;&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function getWatchlistRows(parent){ //returns all &amp;#039;history&amp;#039; links inside &amp;#039;parent&amp;#039;&lt;br /&gt;
 var histLinks = []&lt;br /&gt;
 var allLinks = parent.getElementsByTagName(&amp;#039;a&amp;#039;)&lt;br /&gt;
 for (var i = 0; i &amp;lt; allLinks.length; i++)&lt;br /&gt;
   if (/[?&amp;amp;]action=history(&amp;amp;|$)/.test(allLinks[i].href)){&lt;br /&gt;
     histLinks[histLinks.length] = allLinks[i]&lt;br /&gt;
     i += 3 //move counter to speed things up a bit &lt;br /&gt;
   }&lt;br /&gt;
 return histLinks&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function zzz(s){ // 5 -&amp;gt; 005&lt;br /&gt;
 s = s.toString()&lt;br /&gt;
 if (s.length==1) return &amp;#039;00&amp;#039;+s&lt;br /&gt;
 else if (s.length==2) return &amp;#039;0&amp;#039;+s&lt;br /&gt;
 else return s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
}//obj&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
if (wgCanonicalSpecialPageName &amp;amp;&amp;amp; wgCanonicalSpecialPageName == &amp;#039;Watchlist&amp;#039;)&lt;br /&gt;
 addOnloadHook(WLScript.onLoad)&lt;/div&gt;</summary>
		<author><name>Ariely</name></author>
	</entry>
</feed>