Користувач: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': 'Сміливо пишіть будь-які відгуки, пропозиції та повідомлення&nbsp;про&nbsp;помилки на&nbsp;<a href="/wiki/MediaWiki_talk:Voting3.js">сторінку&nbsp;обговорення</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%">&nbsp;</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)
})