מדיה ויקי:Gadget-checkVoteRights.js

הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.

  • פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
  • גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
  • אינטרנט אקספלורר / אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
  • אופרה: ללחוץ על Ctrl-F5.
/**
 * סקריפט לבדיקת זכות הצבעה בדפי משתמש ובדפי הצבעה
 * נכתב על ידי קובי כרמל
 * version: 1.4
**/

'use strict';

function checkVoteRight(){

	var self = this,
		namespaceNumber = mw.config.get('wgNamespaceNumber');

	/** VARIABLES **/

	this.datetime = new Date(); // Date datetime details

	this.heMonths = ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר']; // Object Array Hebrew months

	this.result = ''; // jQuery DOM Object

	this.user = ''; // String username

	this.voteStart = $('li:contains(תאריך תחילת ההצבעה)'); // jQuery DOM Object for vote pages

	/** METHODS **/

	Date.prototype.toMwDate = function(){ // converting to mw timestamp
		var format = self.format;
		return this.getFullYear() + format(this.getMonth() + 1) + format(this.getDate()) + format(this.getHours()) + format(this.getMinutes()) + '00';
	}

	this.addLink = function(){

		self.dpInit();
		var pl = mw.util.addPortletLink('p-tb', null, 'בדיקת זכות הצבעה', 't-checkvoterights')
		$(pl).click(function(e) {
			e.preventDefault();
			self.buildCvrPicker();
		});
	}

	this.buildCvrPicker = function(){

		if($('#cvr-dialog').length)
			return self.fillTime(), $('#cvr-dialog').show();

		var content = [
			$('<span>', {id: 'cvr-before'}),
			$('<span>', {id: 'cvr-after'}),
			$('<div>', {id: 'cvr-titlebar'}).append(
				'בחר תאריך ושעה:',
				$('<span>', {id: 'cvr-close', 'class': 'ui-icon ui-icon-closethick', title: 'סגירה'}).click(function(){
					$('#cvr-dialog').remove()
				})
			),
			$('<div>', {'class': 'cvr-row'}).append(
				$('<label>').text('תאריך:'),
				$('<input>', {'class': 'cvr-date'}).attr('maxlength', 10)
			),
			$('<div>', {'class': 'cvr-row'}).append(
				$('<label>').text('שעה:'),
				$('<select>', {id: 'cvr-hour'}),
				$('<select>', {id: 'cvr-minute'})
			),
			$('<div>', {id: 'cvr-result'}),
			$('<div>', {id: 'cvr-exec'}).html(
				$('<button>')
					.text('בדיקה')
					.click(function(){			
						if(namespaceNumber == 1 || namespaceNumber == 4){ // not a user (talk) page
							self.buildForVote();
							$('#cvr-dialog').hide();
						}
						else
							self.checkOne();
					})
			)
		];

		$('body').append($('<div>', {id: 'cvr-dialog'}).append(content));

		$('#cvr-dialog').css({
			top: $('#t-checkvoterights').offset().top - 37.5,
			left: $('#content').outerWidth() - $('#cvr-dialog').outerWidth()
		})

		$('.cvr-date').datepicker(); 

		$('.cvr-date').keypress(function(event){
			if(event.which == 8 || event.which == 47) // Backspace or Slash
				return;
			var val = this.value;
			if(val.length == 2 || val.length == 5)
				this.value += '/';
		});

		self.fillTime();
	}

	this.buildForVote = function(){
		$('.cvr-usersign').remove();
		self.links = mw.util.$content.find('a[href^="/index.php/%D7%9E%D7%A9%D7%AA%D7%9E%D7%A9"]');
		self.links.before(
			$('<span>', {'class': 'cvr-usersign'}).append(
				' (',
				$('<a>')
					.text('±')
					.click(function(){
						var check = new checkVoteRight();
						check.checkInVote($(this));
					}),
				') '
			)
		)
	}

	this.check = function(){

		self.setDateTime();

		if(isNaN(self.datetime))
			return self.updateStatus('יש להזין תאריך תקין', 'red');

		self.updateStatus('בודק מספר עריכות...', 'orange');
		var startDate = new Date(self.datetime);
		startDate.setDate(startDate.getDate() - 90);
		var param = {
			action: 'query',
			format: 'json',
			list: 'usercontribs',
			ucuser: self.user,
			ucprop: 'timestamp',
			ucnamespace: '0|6|8|10|12|14|100',
			ucdir: 'newer',
			uclimit: 100,
			ucstart: startDate.toMwDate(),
			ucend: self.datetime.toMwDate()
		}

		$.getJSON('/w/api.php', param, function(res){
			var contribs = res.query.usercontribs;

			if(contribs.length < 100) // no 100 edits
				return self.updateStatus('נכשל - אין 100 עריכות', 'red');
			self.checkSeniority();
		})
	}

	this.checkInVote = function(elem){
		self.result = elem;
		self.user = decodeURI(elem.parent().next().attr('href').split(':')[1]);
		
		/* get a valid username by avoiding redirects */
		var getUser = new mw.Api();
		getUser.get( {
			    action: 'query',
			    titles: 'שיחת משתמש:' + self.user,
			    redirects: true
			} ).done( function ( data ) {
			    self.user = data.query.pages[Object.keys(data.query.pages)[0]]['title'].split(':')[1];
			    self.check();
		} );
	}

	this.checkOne = function(){
		self.result = $('#cvr-result');
		self.user = mw.config.get( 'wgTitle' );
		self.check();
	}

	this.checkSeniority = function(){
		self.updateStatus('בודק ותק...', 'orange');
		var param = {
			action: 'query',
			format: 'json',
			list: 'usercontribs',
			ucuser: self.user,
			ucprop: 'timestamp',
			ucdir: 'newer',
			uclimit: 1
		}

		$.getJSON('/w/api.php', param, function(res){
			var firstEdit = new Date(res.query.usercontribs[0].timestamp),
				minSeniority = new Date(self.datetime);

			minSeniority.setDate(minSeniority.getDate() - 30);
			if(minSeniority < firstEdit)
				return self.updateStatus('נכשל - אין 30 ימי ותק', 'red');
			self.updateStatus('עבר', 'green');
		});
	}

	this.dpInit = function(){
		/* Hebrew initialisation for the UI Datepicker extension
		Written by Amir Hardon (ahardon at gmail dot com). */
		$.datepicker.regional['he'] = {
			closeText: 'סגור',
			prevText: '&#x3C;הקודם',
			nextText: 'הבא&#x3E;',
			currentText: 'היום',
			monthNames: self.heMonths,
			monthNamesShort: ['ינו','פבר','מרץ','אפר','מאי','יוני',
			'יולי','אוג','ספט','אוק','נוב','דצמ'],
			dayNames: ['ראשון','שני','שלישי','רביעי','חמישי','שישי','שבת'],
			dayNamesShort: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
			dayNamesMin: ['א\'','ב\'','ג\'','ד\'','ה\'','ו\'','שבת'],
			weekHeader: 'Wk',
			dateFormat: 'dd/mm/yy',
			firstDay: 0,
			isRTL: true,
			showMonthAfterYear: false,
			yearSuffix: ''
		};
		$.datepicker.setDefaults($.datepicker.regional['he']);
	}

	this.fillInVote = function(){
		var datetime = self.voteStart.text().split(':').splice(1,3).join(':').split(','),
			date = $.trim(datetime[1]).split(' '),
			time = $.trim(datetime[0]).split(':'),
			format = self.format;

		$('.cvr-date').val([format(date[0]), format($.inArray(date[1].substr(1), self.heMonths) + 1), date[2]].join('/'));

		$('#cvr-hour option').each(function(){
			this.selected = this.value == time[0];
		})

		$('#cvr-minute option').each(function(){
			this.selected = this.value == time[1];
		})
	}

	this.fillTime = function(){
		for(var h = 0; h < 24; h++)
			$('#cvr-hour').append($('<option>').text(self.format(h)));
		for(var m = 0; m < 60; m++)
			$('#cvr-minute').append($('<option>').text(self.format(m)));

		if(namespaceNumber == 4 && self.voteStart.length) // vote page with starting time
			self.fillInVote();
	}

	this.format = function(str){
		var num = '00' + str;
		return num.substr(num.length - 2);
	}

	this.setDateTime = function(){
		var date = $('.cvr-date').val().split('/'),
			datetime = new Date();
		datetime.setYear(date[2]);
		datetime.setMonth(date[1] - 1);
		datetime.setDate(date[0]);


		datetime.setHours($('#cvr-hour').val());
		datetime.setMinutes($('#cvr-minute').val());

		self.datetime = datetime;
	}

	this.updateStatus = function(result, color){
		self.result
			.text(result)
			.css('color', color);
	}
}

$(function(){
	
	var namespaceNumber = mw.config.get('wgNamespaceNumber');
	
	if(namespaceNumber >= 1 && namespaceNumber <= 4)
		mw.loader.using('jquery.ui', function(){
			var check = new checkVoteRight();
			check.addLink();
		})
})