<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="he">
	<id>https://chabadpedia.co.il/index.php?action=history&amp;feed=atom&amp;title=%D7%9E%D7%93%D7%99%D7%94_%D7%95%D7%99%D7%A7%D7%99%3A%D7%A1%D7%A7%D7%A8%D7%99%D7%A4%D7%98%D7%99%D7%9D%2F88.js</id>
	<title>מדיה ויקי:סקריפטים/88.js - היסטוריית גרסאות</title>
	<link rel="self" type="application/atom+xml" href="https://chabadpedia.co.il/index.php?action=history&amp;feed=atom&amp;title=%D7%9E%D7%93%D7%99%D7%94_%D7%95%D7%99%D7%A7%D7%99%3A%D7%A1%D7%A7%D7%A8%D7%99%D7%A4%D7%98%D7%99%D7%9D%2F88.js"/>
	<link rel="alternate" type="text/html" href="https://chabadpedia.co.il/index.php?title=%D7%9E%D7%93%D7%99%D7%94_%D7%95%D7%99%D7%A7%D7%99:%D7%A1%D7%A7%D7%A8%D7%99%D7%A4%D7%98%D7%99%D7%9D/88.js&amp;action=history"/>
	<updated>2026-04-15T20:04:13Z</updated>
	<subtitle>היסטוריית הגרסאות של הדף הזה בוויקי</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://chabadpedia.co.il/index.php?title=%D7%9E%D7%93%D7%99%D7%94_%D7%95%D7%99%D7%A7%D7%99:%D7%A1%D7%A7%D7%A8%D7%99%D7%A4%D7%98%D7%99%D7%9D/88.js&amp;diff=835133&amp;oldid=prev</id>
		<title>מ. רובין: יצירת דף חדש</title>
		<link rel="alternate" type="text/html" href="https://chabadpedia.co.il/index.php?title=%D7%9E%D7%93%D7%99%D7%94_%D7%95%D7%99%D7%A7%D7%99:%D7%A1%D7%A7%D7%A8%D7%99%D7%A4%D7%98%D7%99%D7%9D/88.js&amp;diff=835133&amp;oldid=prev"/>
		<updated>2026-03-19T12:34:21Z</updated>

		<summary type="html">&lt;p&gt;יצירת דף חדש&lt;/p&gt;
&lt;p&gt;&lt;b&gt;דף חדש&lt;/b&gt;&lt;/p&gt;&lt;div&gt;mw.loader.using( [&amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.util&amp;#039;, &amp;#039;mediawiki.user&amp;#039;,&amp;#039;mediawiki.storage&amp;#039;] , function() {&lt;br /&gt;
	const &lt;br /&gt;
		storageTimestampKey = &amp;#039;watchlistwatcher-newestseen&amp;#039;,&lt;br /&gt;
		storageSelectionKey = &amp;#039;watchlistwatcher-userselection&amp;#039;,&lt;br /&gt;
		nbsp = &amp;#039;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;#039;,&lt;br /&gt;
		rlm = &amp;#039;&amp;amp;rlm;&amp;#039;;&lt;br /&gt;
	var &lt;br /&gt;
		api = new mw.Api(),&lt;br /&gt;
		storage = mw.storage,&lt;br /&gt;
		items,&lt;br /&gt;
		newest,&lt;br /&gt;
		watchButton,&lt;br /&gt;
		watchwButtonAnchor,&lt;br /&gt;
		timer,&lt;br /&gt;
		counts,&lt;br /&gt;
		popup,&lt;br /&gt;
		contentDiv,&lt;br /&gt;
		selectedOptions = storage.get(storageSelectionKey),&lt;br /&gt;
		titleCheckboxes,&lt;br /&gt;
		selectAll,&lt;br /&gt;
		refreshButton,&lt;br /&gt;
		optionsLabels = {&lt;br /&gt;
				watchlisthideanons: &amp;#039;anon&amp;#039;,&lt;br /&gt;
				watchlisthidebots:	&amp;#039;bot&amp;#039;,&lt;br /&gt;
				watchlisthideliu: 	&amp;#039;registered&amp;#039;,  /* this strangely named option means &amp;quot;hide regitered users&amp;quot;, IOW, show anons */&lt;br /&gt;
				watchlisthideminor:	&amp;#039;minor&amp;#039;,&lt;br /&gt;
				watchlisthidepatrolled: &amp;#039;patrolled&amp;#039;,&lt;br /&gt;
				watchlisthidecategorization: &amp;#039;cats&amp;#039;,&lt;br /&gt;
				hidelog: &amp;#039;log&amp;#039;,&lt;br /&gt;
				edits: &amp;#039;edits&amp;#039;,&lt;br /&gt;
				&lt;br /&gt;
		},&lt;br /&gt;
		lastOption = &amp;#039;hideedit&amp;#039;,&lt;br /&gt;
		opts = {&lt;br /&gt;
			/* watchlisthideown: we do not care about this one, since &amp;quot;unread&amp;quot; doesn&amp;#039;t have own edits anyway */&lt;br /&gt;
			watchlisthideanons: &amp;#039;!anon&amp;#039;,&lt;br /&gt;
			watchlisthidebots:	&amp;#039;!bot&amp;#039;,&lt;br /&gt;
			watchlisthideliu: 	&amp;#039;anon&amp;#039;,  /* this strangely named option means &amp;quot;hide regitered users&amp;quot;, IOW, show anons */&lt;br /&gt;
			watchlisthideminor:	&amp;#039;!minor&amp;#039;,&lt;br /&gt;
			watchlisthidepatrolled: &amp;#039;!patrolled&amp;#039;&lt;br /&gt;
		},&lt;br /&gt;
		langStrings = {&lt;br /&gt;
			he: {&lt;br /&gt;
				watchlist: &amp;#039;רשימת המעקב (שינויים שטרם נצפו)&amp;#039;,&lt;br /&gt;
				numpages: &amp;#039;דפים ברשימת המעקב שטרם נצפו, מעודכן ל-&amp;#039;,&lt;br /&gt;
				&amp;#039;new&amp;#039;: &amp;#039;חדשות&amp;#039;,&lt;br /&gt;
				prev: &amp;#039;קודמות&amp;#039;,&lt;br /&gt;
				hide: &amp;#039;הסתרת שינויים&amp;#039;,&lt;br /&gt;
				remove: &amp;#039;הסרת הדפים המסומנים מרשימת המעקב&amp;#039;,&lt;br /&gt;
				markread: &amp;#039;סימון הדפים המסומנים כאילו נצפו&amp;#039;,&lt;br /&gt;
				refresh: &amp;#039;רענון&amp;#039;,&lt;br /&gt;
				anon: &amp;#039;אנונימים&amp;#039;,&lt;br /&gt;
				bot: &amp;#039;בוטים&amp;#039;,&lt;br /&gt;
				registered: &amp;#039;רשומים&amp;#039;,&lt;br /&gt;
				minor: &amp;#039;משניות&amp;#039;,&lt;br /&gt;
				patrolled: &amp;#039;בדוקות&amp;#039;,&lt;br /&gt;
				cats: &amp;#039;קטגוריות&amp;#039;,&lt;br /&gt;
				log: &amp;#039;פעולות יומן&amp;#039;,&lt;br /&gt;
				edits: &amp;#039;עריכות&amp;#039;,&lt;br /&gt;
				dif: &amp;#039;הבדל&amp;#039;,&lt;br /&gt;
				hist: &amp;#039;היסטוריה&amp;#039;,&lt;br /&gt;
				added: &amp;#039;נוספו&amp;#039;,&lt;br /&gt;
				removed: &amp;#039;הוסרו&amp;#039;,&lt;br /&gt;
				bytes: &amp;#039;בתים&amp;#039;,&lt;br /&gt;
				lastedit: &amp;#039;בעריכה האחרונה&amp;#039;,&lt;br /&gt;
				multedits: &amp;#039;מספר עריכות&amp;#039;,&lt;br /&gt;
				talk: &amp;#039;שיחה&amp;#039;,&lt;br /&gt;
				contrib: &amp;#039;תרומות&amp;#039;,&lt;br /&gt;
				nounviewed: &amp;#039;אין שינויים שטרם נצפו&amp;#039;,&lt;br /&gt;
				selectall: &amp;#039;בחירת הכול&amp;#039;&lt;br /&gt;
			},&lt;br /&gt;
			&amp;#039;en&amp;#039;: {&lt;br /&gt;
				watchlist: &amp;#039;watchlist&amp;#039;,&lt;br /&gt;
				numpages: &amp;#039;unviewed pages in your watchlist. updated to-&amp;#039;,&lt;br /&gt;
				&amp;#039;new&amp;#039;: &amp;#039;new&amp;#039;,&lt;br /&gt;
				prev: &amp;#039;previous&amp;#039;,&lt;br /&gt;
				hide: &amp;#039;hide changes&amp;#039;,&lt;br /&gt;
				remove: &amp;#039;remove selected from watchlist&amp;#039;,&lt;br /&gt;
				markread: &amp;#039;mark selected as viewed&amp;#039;,&lt;br /&gt;
				refresh: &amp;#039;refresh&amp;#039;,&lt;br /&gt;
				anon: &amp;#039;anonymous&amp;#039;,&lt;br /&gt;
				bot: &amp;#039;bots&amp;#039;,&lt;br /&gt;
				registered: &amp;#039;registered&amp;#039;,&lt;br /&gt;
				minor: &amp;#039;minor&amp;#039;,&lt;br /&gt;
				patrolled: &amp;#039;patrolled&amp;#039;,&lt;br /&gt;
				cats: &amp;#039;categories&amp;#039;,&lt;br /&gt;
				log: &amp;#039;log actions&amp;#039;,&lt;br /&gt;
				edits: &amp;#039;edits&amp;#039;,&lt;br /&gt;
				dif: &amp;#039;diff&amp;#039;,&lt;br /&gt;
				hist: &amp;#039;history&amp;#039;,&lt;br /&gt;
				added: &amp;#039;added&amp;#039;,&lt;br /&gt;
				removed: &amp;#039;removed&amp;#039;,&lt;br /&gt;
				bytes: &amp;#039;bytes&amp;#039;,&lt;br /&gt;
				lastedit: &amp;#039;last change&amp;#039;,&lt;br /&gt;
				multedits: &amp;#039;multiple changes&amp;#039;,&lt;br /&gt;
				talk: &amp;#039;talk&amp;#039;,&lt;br /&gt;
				contrib: &amp;#039;contrib&amp;#039;,&lt;br /&gt;
				nounviewed: &amp;#039;no unviewed changes&amp;#039;,&lt;br /&gt;
				selectall: &amp;#039;select all&amp;#039;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		;&lt;br /&gt;
		&lt;br /&gt;
	function i18n(key) {&lt;br /&gt;
		switch (mw.config.get(&amp;#039;wgUserLanguage&amp;#039;)) {&lt;br /&gt;
			case &amp;#039;he&amp;#039;:&lt;br /&gt;
				return langStrings[&amp;#039;he&amp;#039;][key] || key;&lt;br /&gt;
				default: return langStrings[&amp;#039;en&amp;#039;][key] || key;&lt;br /&gt;
		}&lt;br /&gt;
	}	&lt;br /&gt;
	function titleLine(item) {&lt;br /&gt;
		var titleLink = $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;).attr( { href: mw.util.getUrl(item.title), title: item.title }).text(item.title),&lt;br /&gt;
			diffLink =  $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;).attr( { href: mw.util.getUrl(&amp;#039;special:diff/&amp;#039; + item.revid), title: i18n(&amp;#039;dif&amp;#039;) })	.text(i18n(&amp;#039;dif&amp;#039;)),&lt;br /&gt;
			histLink =  $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;).attr( { href: mw.util.getUrl(item.title, { action: &amp;#039;history&amp;#039; }), title: i18n(&amp;#039;hist&amp;#039;) }).text(i18n(&amp;#039;hist&amp;#039;));&lt;br /&gt;
		if (item.timestamp != item.notificationtimestamp) histLink = $(&amp;#039;&amp;lt;strong&amp;gt;&amp;#039;).append(histLink);&lt;br /&gt;
		return $(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;)&lt;br /&gt;
			.append(titleLink)&lt;br /&gt;
			.append(nbsp)&lt;br /&gt;
			.append(&amp;#039;(&amp;#039;)&lt;br /&gt;
			.append(diffLink)&lt;br /&gt;
			.append(&amp;#039;|&amp;#039;)&lt;br /&gt;
			.append(histLink)&lt;br /&gt;
			.append(&amp;#039;)&amp;#039;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function userLink(item) {&lt;br /&gt;
		var user = item.user,&lt;br /&gt;
			contribl = mw.util.getUrl(&amp;#039;Special:Contributions/&amp;#039; + user),&lt;br /&gt;
			pagel = mw.util.getUrl(&amp;#039;User:&amp;#039; + user),&lt;br /&gt;
			talkl = mw.util.getUrl(&amp;#039;User talk:&amp;#039; + user),&lt;br /&gt;
			pageLink = $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;, { href: pagel, title: user }).text(user),&lt;br /&gt;
			contribLink = $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;, { href: contribl, title: i18n(&amp;#039;contrib&amp;#039;) }).text(i18n(&amp;#039;contrib&amp;#039;)),&lt;br /&gt;
			talkLink = $(&amp;#039;&amp;lt;a&amp;gt;&amp;#039;, { href: talkl, title: i18n(&amp;#039;talk&amp;#039;) }).text(i18n(&amp;#039;talk&amp;#039;));&lt;br /&gt;
		return $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;)&lt;br /&gt;
			.css(&amp;#039;max-width&amp;#039;, &amp;#039;36em&amp;#039;)&lt;br /&gt;
			.append(pageLink)&lt;br /&gt;
			.append(&amp;#039; (&amp;#039;)&lt;br /&gt;
			.append(talkLink)&lt;br /&gt;
			.append(&amp;#039;|&amp;#039;)&lt;br /&gt;
			.append(contribLink)&lt;br /&gt;
			.append(&amp;#039;)&amp;#039;)&lt;br /&gt;
			.append(nbsp)&lt;br /&gt;
			.append($(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;).html(rlm +  (item.parsedcomment || &amp;#039;&amp;#039;) + rlm))&lt;br /&gt;
			;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function localize(date, short) {&lt;br /&gt;
		var options = short&lt;br /&gt;
			? { month: &amp;#039;numeric&amp;#039;, day: &amp;#039;numeric&amp;#039;, hour:&amp;#039;numeric&amp;#039;, minute:&amp;#039;numeric&amp;#039; }&lt;br /&gt;
			: { hour:&amp;#039;numeric&amp;#039;, minute:&amp;#039;numeric&amp;#039;, second: &amp;#039;numeric&amp;#039;, year: &amp;#039;numeric&amp;#039;, day: &amp;#039;numeric&amp;#039;, month: &amp;#039;long&amp;#039; };&lt;br /&gt;
		return date.toLocaleDateString(mw.config.get(&amp;#039;wgUserLanguage&amp;#039;), options);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function timeOrMany(item) {&lt;br /&gt;
		var date = new Date(item.timestamp);&lt;br /&gt;
		var timestamp = item.timestamp == item.notificationtimestamp&lt;br /&gt;
			? localize(date) : i18n(&amp;#039;multedits&amp;#039;) + &amp;#039; (&amp;#039; + localize(date, true) + &amp;#039;)&amp;#039;;&lt;br /&gt;
		return $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).html(timestamp);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function makeCheckbox(item) {&lt;br /&gt;
		var checkbox = new OO.ui.CheckboxInputWidget( { value: item.title } );&lt;br /&gt;
		titleCheckboxes.push(checkbox);&lt;br /&gt;
		return $(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).append(checkbox.$element);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function buildLine(item) {&lt;br /&gt;
		var change = item.newlen - item.oldlen,&lt;br /&gt;
			tooltip = change &amp;gt; 0 &lt;br /&gt;
				? i18n(&amp;#039;added&amp;#039;) + &amp;#039; &amp;#039; + change&lt;br /&gt;
				: i18n(&amp;#039;removed&amp;#039;) + &amp;#039; &amp;#039; + (-change);&lt;br /&gt;
		tooltip = i18n(&amp;#039;lastedit&amp;#039;) + &amp;#039; &amp;#039; + tooltip + &amp;#039; &amp;#039; + i18n(&amp;#039;bytes&amp;#039;);&lt;br /&gt;
		return $(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;)&lt;br /&gt;
			.attr(&amp;#039;title&amp;#039;, tooltip)&lt;br /&gt;
			.css( &amp;#039;vertical-align&amp;#039;, &amp;#039;top&amp;#039; )&lt;br /&gt;
			.append(makeCheckbox(item))&lt;br /&gt;
			.append( timeOrMany(item) )&lt;br /&gt;
			.append( titleLine(item) )&lt;br /&gt;
			.append( userLink(item) )				;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildContent() {&lt;br /&gt;
		var div = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;),&lt;br /&gt;
			already = false,&lt;br /&gt;
 			lastClicked = new Date(storage.get( storageTimestampKey ) || 0),&lt;br /&gt;
 			optionsDiv = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;),&lt;br /&gt;
			table = $(&amp;#039;&amp;lt;table&amp;gt;&amp;#039;)&lt;br /&gt;
				.css( { &amp;#039;border-spacing&amp;#039;: &amp;#039;1em 0&amp;#039; } );&lt;br /&gt;
&lt;br /&gt;
		selectAll = new OO.ui.CheckboxInputWidget( );&lt;br /&gt;
		table.append(&lt;br /&gt;
			$(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;)&lt;br /&gt;
				.append($(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).append(selectAll.$element))&lt;br /&gt;
				.append($(&amp;#039;&amp;lt;td&amp;gt;&amp;#039;).text(i18n(&amp;#039;selectall&amp;#039;)))&lt;br /&gt;
			)&lt;br /&gt;
			.append(counts ? $(&amp;#039;&amp;lt;th&amp;gt;&amp;#039;, { colspan: 3 }).text(i18n(&amp;#039;new&amp;#039;)) : &amp;#039;&amp;#039;)&lt;br /&gt;
			.append($(&amp;#039;&amp;lt;tr&amp;gt;&amp;#039;))&lt;br /&gt;
			.appendTo(div);&lt;br /&gt;
			&lt;br /&gt;
		titleCheckboxes = [selectAll]; //reset every time&lt;br /&gt;
&lt;br /&gt;
		selectAll.on( &amp;#039;change&amp;#039;, function(selected) {&lt;br /&gt;
			for (var i = 1; i &amp;lt; titleCheckboxes.length; i++) {&lt;br /&gt;
				titleCheckboxes[i].setSelected(selected, true);  &lt;br /&gt;
			}&lt;br /&gt;
		}) ; &lt;br /&gt;
		&lt;br /&gt;
		if (! counts) return div.append($(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;).css( { &amp;#039;text-align&amp;#039;: &amp;#039;center&amp;#039;, &amp;#039;font-weight&amp;#039;: &amp;#039;bold&amp;#039; }).text(i18n(&amp;#039;nounviewed&amp;#039;)));  &lt;br /&gt;
		&lt;br /&gt;
		storage.set( storageTimestampKey, new Date(items[0].timestamp ));&lt;br /&gt;
		table;&lt;br /&gt;
&lt;br /&gt;
		for (var i in items) {&lt;br /&gt;
			var item = items[i];&lt;br /&gt;
			if (! already &amp;amp;&amp;amp; new Date(item.timestamp) &amp;lt;= lastClicked) {&lt;br /&gt;
				 table.append($(&amp;#039;&amp;lt;th&amp;gt;&amp;#039;, { colspan: 3 }).text(i18n(&amp;#039;prev&amp;#039;)));&lt;br /&gt;
				 already = true;&lt;br /&gt;
			}&lt;br /&gt;
			table.append(buildLine(item));&lt;br /&gt;
		}&lt;br /&gt;
		return div;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function buildCheckboxWidget() {&lt;br /&gt;
		var checkboxes = [];&lt;br /&gt;
		&lt;br /&gt;
		function createChangeFunc(key) {&lt;br /&gt;
			return function(value) {&lt;br /&gt;
				selectedOptions[key] = value; &lt;br /&gt;
				triggerRefresh();&lt;br /&gt;
			};&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
		for (var key in optionsLabels) {&lt;br /&gt;
			checkboxes.push(&lt;br /&gt;
				new OO.ui.FieldLayout( &lt;br /&gt;
					new OO.ui.CheckboxInputWidget( {&lt;br /&gt;
						value: key,&lt;br /&gt;
						selected: selectedOptions[key]&lt;br /&gt;
					} ).on( &amp;#039;change&amp;#039;, createChangeFunc(key) ),&lt;br /&gt;
					{ label: i18n(optionsLabels[key]), align: &amp;#039;inline&amp;#039; } &lt;br /&gt;
				)&lt;br /&gt;
			);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		var layout = new OO.ui.FieldLayout( new OO.ui.Widget( {&lt;br /&gt;
			content: [&lt;br /&gt;
				new OO.ui.HorizontalLayout( {&lt;br /&gt;
					items: checkboxes&lt;br /&gt;
				})&lt;br /&gt;
			]&lt;br /&gt;
		} ) );&lt;br /&gt;
		return $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;)&lt;br /&gt;
			.css( { &amp;#039;margin-right&amp;#039;: &amp;#039;1em&amp;#039; } )&lt;br /&gt;
			.append($(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;)&lt;br /&gt;
				.css({ &amp;#039;font-size&amp;#039;: &amp;#039;150%&amp;#039;, &amp;#039;font-weight&amp;#039;: &amp;#039;bolder&amp;#039;, margin: &amp;#039;1em&amp;#039; })&lt;br /&gt;
				.text(i18n(&amp;#039;hide&amp;#039;) + &amp;#039;:&amp;#039;)&lt;br /&gt;
			)&lt;br /&gt;
			.append(layout.$element);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function triggerRefresh() { setTimeout(showPopup, 0); }&lt;br /&gt;
	&lt;br /&gt;
	function buttonsPanel() {&lt;br /&gt;
		var&lt;br /&gt;
			p = $(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;);&lt;br /&gt;
		&lt;br /&gt;
		refreshButton = new OO.ui.ButtonWidget( {&lt;br /&gt;
			label: i18n(&amp;#039;refresh&amp;#039;)&lt;br /&gt;
		})&lt;br /&gt;
		.on( &amp;#039;click&amp;#039;, triggerRefresh );&lt;br /&gt;
		refreshButton.$element.appendTo(p);&lt;br /&gt;
		&lt;br /&gt;
		var markseenButton = new OO.ui.ButtonWidget( {&lt;br /&gt;
				label: i18n(&amp;#039;markread&amp;#039;)&lt;br /&gt;
			})&lt;br /&gt;
			.on( &amp;#039;click&amp;#039;, markAsSeen ),&lt;br /&gt;
			unwatchButton = new OO.ui.ButtonWidget( {&lt;br /&gt;
				label: i18n(&amp;#039;remove&amp;#039;)&lt;br /&gt;
			})&lt;br /&gt;
			.on( &amp;#039;click&amp;#039;, unwatch );&lt;br /&gt;
		return $(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;)&lt;br /&gt;
			.css({ &amp;#039;text-align&amp;#039;: &amp;#039;center&amp;#039; })&lt;br /&gt;
			.append(refreshButton.$element)&lt;br /&gt;
			.append(markseenButton.$element)&lt;br /&gt;
			.append(unwatchButton.$element);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function updateStorageAndRefresh() {&lt;br /&gt;
		storage.set( storageTimestampKey, newest ); // remember the click: only items newer than latest click will trigger coloring the bubble.&lt;br /&gt;
		triggerQuery( 0 );	// initiate click, so when it returns we can color the icon accordingly&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	function showPopup( e ) {&lt;br /&gt;
		if (e) {&lt;br /&gt;
			e.stopImmediatePropagation();&lt;br /&gt;
			e.preventDefault();&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		storage.set( storageTimestampKey, newest ); // remember the click: only items newer than latest click will trigger coloring the bubble.&lt;br /&gt;
		&lt;br /&gt;
		mw.loader.using( &amp;#039;oojs-ui&amp;#039; ).done(function() {&lt;br /&gt;
			queryAndUpdate().done(function() {&lt;br /&gt;
				if (! popup) {&lt;br /&gt;
					contentDiv = $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;)&lt;br /&gt;
						.addClass(&amp;#039;wlw-content&amp;#039;);&lt;br /&gt;
					popup = new OO.ui.PopupWidget( {&lt;br /&gt;
								label: &amp;#039;&amp;#039;,&lt;br /&gt;
								head: true,&lt;br /&gt;
								width: 1000,&lt;br /&gt;
								autoClose: true,&lt;br /&gt;
								$floatableContainer: watchButton,&lt;br /&gt;
								$content: $(&amp;#039;&amp;lt;div&amp;gt;&amp;#039;)&lt;br /&gt;
									.css( { overflow: &amp;#039;auto&amp;#039; } )&lt;br /&gt;
									.append(buttonsPanel())&lt;br /&gt;
									.append(buildCheckboxWidget())&lt;br /&gt;
									.append($(&amp;#039;&amp;lt;p&amp;gt;&amp;#039;))&lt;br /&gt;
									.append(contentDiv)&lt;br /&gt;
							});&lt;br /&gt;
					$(&amp;#039;#mw-content-text&amp;#039;).first(&amp;#039;div, form&amp;#039;).prepend(popup.$element);&lt;br /&gt;
				}&lt;br /&gt;
				popup.setLabel( i18n(&amp;#039;numpages&amp;#039;) + localize( new Date() ) );&lt;br /&gt;
				contentDiv&lt;br /&gt;
					.empty()&lt;br /&gt;
					.append(buildContent());&lt;br /&gt;
				&lt;br /&gt;
				if ( e ) popup.toggle();&lt;br /&gt;
			} ); // queryAndUpdate,done&lt;br /&gt;
		} ); // using.done &lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function announce() {&lt;br /&gt;
		const new_id = &amp;#039;pt-notifications-watchlist&amp;#039;;&lt;br /&gt;
		if ( ! watchButton ) {&lt;br /&gt;
			var url,&lt;br /&gt;
				notif = $( &amp;#039;#pt-notifications-notice, #pt-notifications-alert&amp;#039; ).eq(-1);&lt;br /&gt;
			if ( ! notif.length )&lt;br /&gt;
				return;&lt;br /&gt;
			watchButton = notif.clone()&lt;br /&gt;
				.attr( { id: new_id } )&lt;br /&gt;
				.insertAfter( notif );&lt;br /&gt;
			watchwButtonAnchor = watchButton.find( &amp;#039;a&amp;#039; )&lt;br /&gt;
				.removeClass(&amp;#039;oo-ui-icon-tray&amp;#039;)&lt;br /&gt;
				.click( showPopup )&lt;br /&gt;
				.attr( { href: &amp;#039;&amp;#039;, title: i18n(&amp;#039;watchlist&amp;#039;) } );&lt;br /&gt;
			watchwButtonAnchor.find(&amp;#039;span&amp;#039;).remove();&lt;br /&gt;
			watchwButtonAnchor.append($(&amp;#039;&amp;lt;span&amp;gt;&amp;#039;).addClass(&amp;#039;vector-icon watchlistwatcher vector-icon mw-ui-icon-tray mw-ui-icon-wikimedia-tray&amp;#039;));&lt;br /&gt;
		}&lt;br /&gt;
		var lastClicked = new Date(storage.get( storageTimestampKey ) || 0),&lt;br /&gt;
			newChanges = newest &amp;gt; lastClicked;&lt;br /&gt;
		if (refreshButton) {&lt;br /&gt;
			refreshButton.setDisabled(! newChanges);&lt;br /&gt;
		}&lt;br /&gt;
		watchwButtonAnchor&lt;br /&gt;
			.toggleClass( &amp;#039;mw-echo-notifications-badge-unseen&amp;#039;, newChanges )&lt;br /&gt;
			.toggleClass( &amp;#039;mw-echo-notifications-badge-all-read&amp;#039;, counts === 0 )&lt;br /&gt;
			.attr( { &amp;#039;data-counter-text&amp;#039;: counts || &amp;#039;&amp;#039;, &amp;#039;data-counter-num&amp;#039;: counts } );&lt;br /&gt;
	}&lt;br /&gt;
	function calcParams() {&lt;br /&gt;
		var&lt;br /&gt;
			wlshow;&lt;br /&gt;
		if (! selectedOptions || ! selectedOptions.hasOwnProperty(lastOption)) {&lt;br /&gt;
			selectedOptions = {};&lt;br /&gt;
			for (var key in optionsLabels) {&lt;br /&gt;
				selectedOptions[key] = mw.user.options.get(key);&lt;br /&gt;
			}&lt;br /&gt;
		}		&lt;br /&gt;
		&lt;br /&gt;
		wlshow = Object.keys( opts )&lt;br /&gt;
			.filter( function( opt) { return selectedOptions[opt]; } )&lt;br /&gt;
			.map( function( k ) { return opts[k]; } )&lt;br /&gt;
			.concat( &amp;#039;unread&amp;#039; )&lt;br /&gt;
			.join( &amp;#039;|&amp;#039; ),&lt;br /&gt;
		&lt;br /&gt;
		wltype = [&amp;#039;new&amp;#039;];&lt;br /&gt;
		if (! selectedOptions.watchlisthidecategorization) wltype.push(&amp;#039;categorize&amp;#039;);&lt;br /&gt;
		if (! selectedOptions.hidelog) wltype.push(&amp;#039;log&amp;#039;);&lt;br /&gt;
		if (! selectedOptions.hideedit) wltype.push(&amp;#039;edit&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
		return {&lt;br /&gt;
			list: &amp;#039;watchlist&amp;#039;,&lt;br /&gt;
			wlprop: &amp;#039;ids|user|title|timestamp|notificationtimestamp|parsedcomment|sizes&amp;#039;,&lt;br /&gt;
			wlshow: wlshow,&lt;br /&gt;
			wltype: wltype.join(&amp;#039;|&amp;#039;),&lt;br /&gt;
			wllimit: window.script88limit || 50&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function triggerQuery( timeout ) {&lt;br /&gt;
		clearTimeout( timer );&lt;br /&gt;
		if ( typeof(timeout) != &amp;#039;number&amp;#039;)&lt;br /&gt;
			timeout = 1000;&lt;br /&gt;
		timer = setTimeout( queryAndUpdate, timeout );&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function markAsSeen() {&lt;br /&gt;
		var titles =  titleCheckboxes &amp;amp;&amp;amp; titleCheckboxes&lt;br /&gt;
				.filter(cb =&amp;gt; cb.selected &amp;amp;&amp;amp; cb.value)&lt;br /&gt;
				.map(cb =&amp;gt; cb.value)&lt;br /&gt;
				.slice(0, 50);&lt;br /&gt;
		if (titles &amp;amp;&amp;amp; titles.length) {&lt;br /&gt;
			api.postWithToken(&amp;#039;csrf&amp;#039;, {&lt;br /&gt;
				action: &amp;#039;setnotificationtimestamp&amp;#039;,&lt;br /&gt;
				titles: titles.join(&amp;#039;|&amp;#039;)&lt;br /&gt;
			} )&lt;br /&gt;
			.then( () =&amp;gt; setTimeout(triggerRefresh, 1500) );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function unwatch() {&lt;br /&gt;
		var titles =  titleCheckboxes &amp;amp;&amp;amp; titleCheckboxes&lt;br /&gt;
				.filter(cb =&amp;gt; cb.selected &amp;amp;&amp;amp; cb.value)&lt;br /&gt;
				.map(cb =&amp;gt; cb.value)&lt;br /&gt;
				.slice(0, 50);&lt;br /&gt;
		if (titles &amp;amp;&amp;amp; titles.length) {&lt;br /&gt;
			api.postWithToken(&amp;#039;watch&amp;#039;, {&lt;br /&gt;
				action: &amp;#039;watch&amp;#039;,&lt;br /&gt;
				unwatch: true,&lt;br /&gt;
				titles: titles.join(&amp;#039;|&amp;#039;)&lt;br /&gt;
			} )&lt;br /&gt;
			.then(triggerRefresh);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	function queryAndUpdate() {&lt;br /&gt;
		return api.get( calcParams() )&lt;br /&gt;
			.done( function(data) {&lt;br /&gt;
				counts = {};&lt;br /&gt;
				if ( data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.watchlist ) {&lt;br /&gt;
					items = data.query.watchlist;&lt;br /&gt;
					counts = items.length;&lt;br /&gt;
					newest = counts ? new Date(items[0].timestamp) : null;&lt;br /&gt;
					announce();&lt;br /&gt;
					triggerQuery( 60000 );&lt;br /&gt;
				}&lt;br /&gt;
			} ); // promise?&lt;br /&gt;
	} // queryandupdate&lt;br /&gt;
	//load css page. would do it locally, but javascript does not support multiline strings, and putting all the CSS locally is just too much.&lt;br /&gt;
	mw.loader.load( &amp;#039;//he.wikipedia.org/w/index.php?title=מדיה_ויקי:סקריפטים/88.css&amp;amp;action=raw&amp;amp;ctype=text/css&amp;#039;, &amp;#039;text/css&amp;#039; );&lt;br /&gt;
	queryAndUpdate();&lt;br /&gt;
	$(&amp;#039;#mw-watchlist-resetbutton&amp;#039;).submit( triggerQuery );&lt;br /&gt;
	$( &amp;#039;body &amp;#039;).on( &amp;#039;script-88-refresh&amp;#039;, triggerQuery );&lt;br /&gt;
	mw.hook(&amp;#039;wikipage.content&amp;#039;).add( triggerQuery );&lt;br /&gt;
	$(&amp;#039;.oo-ui-buttonElement-button&amp;#039;).click( triggerQuery );&lt;br /&gt;
	$( &amp;#039;body &amp;#039;).on( &amp;#039;script-88-pretend-clicked&amp;#039;, updateStorageAndRefresh );&lt;br /&gt;
} );&lt;/div&gt;</summary>
		<author><name>מ. רובין</name></author>
	</entry>
</feed>