Project Endor (Zoltar)

easy clicks for zoltars

Fra 15.04.2016. Se den seneste versjonen.

// ==UserScript==
// @name         Project Endor (Zoltar)
// @namespace    https://greasyfork.org/en/users/12709
// @version      1.1.0
// @description  easy clicks for zoltars
// @author       feihtality
// @match        https://www.google.com/evaluation/endor/*
// @grant        none
// ==/UserScript==
/*jshint esnext:true*/

(function() {
    'use strict';

    function make(tag) { return document.createElement(tag); }
    function get() { return (arguments.length > 1 ? arguments[0] : document).querySelector(arguments[1] || arguments[0]); }
    function getAll() { return (arguments.length > 1 ? arguments[0] : document).querySelectorAll(arguments[1] || arguments[0]); }

    var _p = document.querySelector('p');
    if (!/previewand/.test(document.referrer) && _p && /An error occurred/.test(_p.textContent)) document.location.reload(); // autorefresh loading error
    if (!get('h3').textContent.includes('website is NOT available')) return; // not a zoltar

    var css = document.head.appendChild(document.createElement('STYLE'));
    css.innerHTML = '.zoltarpanel p {margin:5px; background:lightblue; padding:2px 5px;}' +
        '.zoltarpanel {z-index:10; position:fixed; top:10%;right:50%; background:aliceblue; opacity:0.9; transform:translateX(50%);}' +
        '.zoltarpanel p button {font-size: 12px; margin-right:2px; padding:1px;}';

    function sel(obj) {
        obj.btn.onclick = () => {
            var prev = obj.p.querySelector('[style]');
            if (prev && !obj.isCheckbox) prev.style.background = '';
            if (obj.isCheckbox) obj.btn.style.background = obj.btn.style.background === 'lightgreen' ? '' : 'lightgreen';
            else obj.btn.style.background = 'lightgreen';
            obj.target.click();
            scroller(obj.target);
        };
    }
    function scroller(loc, dt) {
        var getPos = function(el) { var offset = 0; while(el) { offset += el.offsetTop; el = el.offsetParent; } return offset; },
            target = getPos(loc)-window.innerHeight/4,
            pos = window.scrollY,
            dpos = Math.ceil((target-pos)/3);
        dt = dt ? dt-1 : 25;
        if (target === pos || dpos === 0 || dt === 0) return;
        window.scrollBy(0,dpos);
        setTimeout( () => scroller(loc, dt), dt);
    }

    var zoltar = {
        sections: Array.prototype.slice.call(getAll('div[ng-show][flex]'), 1), // slice out initial div (business name)
        master: document.body.appendChild(make('DIV')),
    };
    zoltar.master.className = 'zoltarpanel';

    for (var section of zoltar.sections) {
        var options = Array.from(getAll(section, '[aria-label]')),
            isCheckbox = options[0].tagName.toLowerCase().includes('checkbox'),
            p = zoltar.master.appendChild(make('P'));

        for (var option of options) {
            var btn = p.appendChild(make('BUTTON'));
            btn.textContent = option.getAttribute('aria-label');
            sel({ p: p, btn: btn, target: option, isCheckbox: isCheckbox });
        }
    }

    var submit = zoltar.master.appendChild(make('P')).appendChild(make('BUTTON'));
    submit.textContent = 'SUBMIT';
    submit.onclick = () => get('input[type=submit]').click();
})();