Користувач:Matma Rex/Voting6.js
Перейти до навігації
Перейти до пошуку
Увага: Після публікування слід очистити кеш браузера, щоб побачити зміни.
- Firefox / Safari: тримайте Shift, коли натискаєте Оновити, або натисніть Ctrl-F5 чи Ctrl-Shift-R (⌘-R на Apple Mac)
- Google Chrome: натисніть Ctrl-Shift-R (⌘-Shift-R на Apple Mac)
- Internet Explorer / Edge: тримайте Ctrl, коли натискаєте Оновити, або натисніть Ctrl-F5
- Opera: натисніть Ctrl-F5
/*jshint asi:true, indent:4, unused:true */
/*global mw */
/*global wgServer, wgScript, wgUserName, importStylesheetURI */
mw.loader.using(['mediawiki.api'], function(){
function el(e) { return document.createElement(e) }
function tstamp(t) { return !t.getUTCFullYear() ? null : // Safari + Chrome
(t.getUTCFullYear()+":0"+(t.getUTCMonth()+1)+":0"+t.getUTCDate()+":0"+
t.getUTCHours() +":0"+ t.getUTCMinutes() +":0"+t.getUTCSeconds())
.replace(/:0?(\d\d)/g, '$1')
}
var conf = {
'start': new Date("Sep 3 2014 21:00:00 +0000"),
'end': new Date("Sep 17 2014 21:00:00 +0000"),
'criteria': {
'count': 300,
'registration': '2014-06-05T21:00:00Z'
},
'pagepath': 'Вікіпедія:Вибори арбітрів/2014/Голосування',
'talkpath': 'Вікіпедія:Вибори арбітрів/Обговорення/',
'votepath': 'Вікіпедія:Вибори арбітрів/2014/Голосування/'
}
var ico = {
'up': '//upload.wikimedia.org/wikipedia/commons/thumb/',
'supp' : '2/2d/Support-gray.svg/39px-Support-gray.svg.png',
'suppinact' : '8/8d/Support-colored.svg/39px-Support-colored.svg.png',
'suppact' : '5/5b/Support-filled.svg/39px-Support-filled.svg.png',
'opp' : 'e/e7/Oppose-gray.svg/39px-Oppose-gray.svg.png',
'oppinact' : '0/06/Oppose-colored.svg/39px-Oppose-colored.svg.png',
'oppact' : '7/7d/Oppose-filled.svg/39px-Oppose-filled.svg.png'
}
var loc = {
'votebutton': 'Проголосувати',
'statuscriteria': 'Перевірка критеріїв…',
'criteriafail': '<h3 class="voting-error">Ви не відповідаєте критеріям.</h3><p>Ваші голоси на цих виборах <b>не будуть враховані</b>.</p><p>Утім, якщо вам просто цікаво, як працює скрипт, ви можете подивитись на нього без збереження голосів.</p>',
'criteriafailbutton': 'Переглянути',
'loadingvotes': 'Перевірка наявних голосів…',
'votinghelp': '<p>Розставте голоси «за» і «проти» поряд з іменами тих кандидатів, щодо яких у вас сформована думка. Ви зможете доповнити чи змінити вибір пізніше.</p></div>',
'justbeforesave': 'Сміливо пишіть будь-які відгуки, пропозиції та повідомлення про помилки на <a href="/wiki/MediaWiki_talk:Voting3.js">сторінку обговорення</a>.',
'savebutton': 'Зберегти',
'saveprog': '<b>Не закривайте сторінку</b> до завершення збереження.',
'summary': '+\u200B',
'thankyou': '<h3>Дякуємо за участь у виборах!</h3><p>Ви зможете змінити ваші голоси до кінця голосування.</p><p>Щойно віддані голоси можна подивитись на <a href="/wiki/Special:Mycontributions">сторінці внеску</a>.</p>'
}
var cand = 'A1 - Basio - Dghooo - DixonD - Dzyadyk - Jbuket - Lexusuns - OlegB - Olvin - Pavlo1 - ReAl - Yakudza - Zlir\'a - Учитель'.split(' - ')
var votes = {}
var criteriaMatch
var saving = null
var api = new mw.Api()
function votingStart() {
importStylesheetURI('//ru.wikipedia.org/w/index.php?title=MediaWiki:Voting7.css&action=raw&ctype=text/css')
btn.disabled = true
btn.style.display = 'none'
status.innerHTML = loc.statuscriteria
api.get({
action: 'query',
list: 'users',
usprop: 'registration|editcount',
ususers: wgUserName
}).done(votingStartContinue)
}
function votingStartContinue( response ) {
var userinfo = response.query.users[0]
if (// a valid voter must be a non-anonymous user
userinfo.missing !== undefined ||
// who is not blocked
userinfo.blockedby ||
// whose editcount is at least conf.criteria.count
userinfo.editcount < conf.criteria.count ||
// and who is registered no later than conf.criteria.registration
// "null" means "before 2005-12-29", user creation was not logged before then
(userinfo.registration !== null && userinfo.registration > conf.criteria.registration))
votingCriteriaFail()
else {
criteriaMatch = 1
votingContinue()
}
}
function votingCriteriaFail() {
status.innerHTML = loc.criteriafail
btn.style.display = ''
btn.disabled = false
btn.value = loc.criteriafailbutton
btn.onclick = function(){criteriaMatch = 0; votingContinue()}
}
function votingContinue() {
status.innerHTML = loc.loadingvotes
btn.style.display = ''
btn.onclick = votingSave
btn.value = loc.savebutton
btn.disabled = true
// latest contributions in ns:4
var params = {
action: 'query',
list: 'usercontribs',
ucnamespace: 4,
uclimit: 500,
ucuser: wgUserName,
ucdir: 'older'
}
if(tstamp(conf.start)) {
params.ucend = tstamp(conf.start);
}
api.get(params).done(votingDraw)
}
function votingDraw(response) {
btn.disabled = !criteriaMatch
status.innerHTML = ''
for (i=0; i<cand.length; i++) votes[cand[i]] = {'orig':0, 'value':0}
var query = response.query
var co = query.usercontribs
// retrieving votes; according to contributions, only latest ones are valid
for (var i=co.length-1; i>=0; i--) {
var m = co[i].title.indexOf(conf.votepath) === 0
if (m) m = co[i].title.match(/\/2014\/Голосування\/(.*?)\/([+-])$/)
if (m) votes[m[1]] = { 'orig' : m[2]=='+' ? +1 : -1,
'value': 0 }
}
// drawing
var div1 = el('div')
div1.id = 'voting-standard'
div1.innerHTML = loc.votinghelp
var tab = el('table')
var tr, img, td1, td2, td3, lin
for (i in votes) {
if (i != '_') {
tr = el('tr')
td1 = el('td')
img = el('img')
img.alt = '+'
img.width = img.height = 39
img.src = ico.up + (votes[i].orig == 1 ? ico.suppinact : ico.supp)
lin = el('a')
lin.href = '#'
lin.title = '+'
lin.appendChild(img)
td1.appendChild(lin)
td2 = el('td')
img = el('img')
img.alt = '-'
img.width = img.height = 39
img.src = ico.up + (votes[i].orig == -1 ? ico.oppinact : ico.opp)
lin = el('a')
lin.href = '#'
lin.title = '-'
lin.appendChild(img)
td2.appendChild(lin)
td3 = el('td')
td3.className = 'talklink'
lin = el('a')
lin.href = mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + encodeURI(conf.talkpath + i)
lin.target = '_blank'
lin.innerHTML = i
td3.appendChild(lin)
tr.appendChild(td1)
tr.appendChild(td2)
tr.appendChild(td3)
tab.appendChild(tr)
}
}
div1.appendChild(tab)
// IE has problems inserting the table
div1.innerHTML += ''
var imgs = div1.getElementsByTagName('img')
for (i=0; i<imgs.length; i++)
imgs[i].parentNode.onclick = oncl
status.innerHTML = loc.justbeforesave
status.parentNode.insertBefore(div1, status)
}
function votingSave() {
if (saving === null) {
var div = el('div')
div.id = 'voting-saving'
div.innerHTML = '<div id="voting-progress"><div id="voting-progress-progress" style="width:0%"> </div></div>' + loc.saveprog
status.parentNode.appendChild(div)
btn.disabled = true
document.getElementById('voting-standard').style.visibility = 'hidden'
saving = {'cursor': 0, 'pages': []}
for (var i in votes) {
if (votes[i].value !== 0 && votes[i].orig !== votes[i].value) {
saving.pages[saving.cursor] = {'text': '\n# [[user:' + wgUserName + '|' + wgUserName + ']] ~' + '~~' + '~~\n',
'page': conf.votepath + i + '/' + (votes[i].value===1?'+':'-')}
saving.cursor++
}
}
saving.cursor = -5
if (saving.pages.length)
votingSave()
else
document.getElementById('voting-container').innerHTML = loc.thankyou
} else {
if (saving.cursor == -5) saving.cursor = 0
if (saving.cursor == -1) return
document.getElementById('voting-progress-progress').style.width = 100*(saving.cursor+1)/saving.pages.length + '%'
api.postWithToken('edit', {
action: 'edit',
unwatch: 1,
summary: loc.summary,
title: saving.pages[saving.cursor].page,
appendtext: saving.pages[saving.cursor].text
}).done(votingSave)
saving.cursor++
if (!saving.pages[saving.cursor]) {
saving.cursor = -1
document.getElementById('voting-container').innerHTML = loc.thankyou
}
}
}
// onclick() for round buttons
function oncl() {
var imgs = this.parentNode.parentNode.getElementsByTagName('img')
var link = this.parentNode.parentNode.getElementsByTagName('a')[2]
var ca = link.innerHTML
var ti = this.title
var vo = ti=='+'?1:-1
votes[ca].value = (votes[ca].value==vo) ? 0 : vo
imgs[0].src = ico.up + (votes[ca].value== 1 ?ico.suppact:(votes[ca].orig== 1 ?ico.suppinact:ico.supp))
imgs[1].src = ico.up + (votes[ca].value==-1 ?ico.oppact :(votes[ca].orig==-1 ?ico.oppinact :ico.opp))
link.className = ['opp', '', 'supp'][votes[ca].value + 1]
return false
}
document.getElementById('voting-container').innerHTML = ''
var btn = el('input')
btn.type = 'button'
btn.id = 'voting-button'
btn.value = loc.votebutton
btn.onclick = votingStart
var status = el('div')
status.id = 'voting-status'
document.getElementById('voting-container').appendChild(status)
document.getElementById('voting-container').appendChild(btn)
})