// ==UserScript==
// @name Google Search Extra Buttons (Position Slightly Right)
// @description Add buttons (past 1/2/3 days, weeks, PDF search etc.) for Google search page
// @version 45.2023.10.08
// @namespace spmbt.github.com
// @include http://www.google.*/search*
// @include https://www.google.*/search*
// @include https://www.google.*/*
// @include https://encrypted.google.*/search*
// @include https://encrypted.google.*/*
// @include https://spmbt.github.io/googleSearchExtraButtons/saveYourLocalStorage.html
// @include https://www.gstatic.com/sites/p/b9356d/system/services/test.html
// @include https://www.gstatic.com/index.html
// @license MIT
// ==/UserScript==
// 🕮 <lunde> ef3c5f9a-82e1-4b71-9a8d-7c902e27927b.md
const BASE_POSITION = -127; // Starting position of buttons used in csLeft function
const BUTTON_SPACING = 37; // Spacing between each button
const RIGHT_OFFSET = 180; // Offset from the right
var xLocStI = 0,
xLocSto = [
{
origin: "https://spmbt.github.io",
restHref: "/googleSearchExtraButtons/saveYourLocalStorage.html",
},
{
origin: "https://www.gstatic.com",
restHref: "/sites/p/b9356d/system/services/test.html",
"//": "blank page",
},
{
origin: "https://www.gstatic.com",
restHref: "/index.html",
"//": "404 page",
},
];
// For use own eXternal LocalStorage add to array your origin+restHref of site with https protocol,
// set xLocStI pointed to it, @include directive with this URL. If this script is Chrome extension, fill include_globs in manifest.json.
// TODO If localStorage will be unavailable, script will be use next indexes of array.
if (location.host == xLocSto[xLocStI].origin.replace(/[^/]*\/\//, "")) {
window.addEventListener(
"message",
function (ev) {
if (/^https?:\/\/www\.google\./.test(ev.origin)) {
var d =
typeof ev.data == "string" && ev.data[0] == "{"
? JSON.parse(ev.data)
: ev.data;
if (!d.do) return;
var tok = d.tok,
key = d.key;
try {
switch (d.do) {
case "set":
var prev = localStorage[key];
if (d.val !== undefined)
localStorage[key] = JSON.stringify(d.val);
else localStorage.removeItem(key);
break;
case "get":
prev = localStorage[key];
prev =
prev === undefined ||
(typeof prev == "string" && prev[0] != "{")
? prev
: JSON.parse(prev);
break;
case "remove":
prev = localStorage[key];
if (prev !== undefined) localStorage.removeItem(key);
}
} catch (er) { }
//xLocStI !=0 && console.log('[xLocSto]', tok, 'prev=', prev);
xLocStI != 0 &&
ev.source.postMessage(
JSON.stringify(
prev !== undefined
? { tok: tok, prev: prev }
: { tok: tok, undef: 1 }
),
ev.origin
);
}
},
!1
); //console.log('[xLocSto-1]_'+ xLocStI);
} else
(function (setts) {
//lang, sites, lastHoursLess
var $x = function (el, h) {
if (h) for (var i in h) el[i] = h[i];
return el;
}, //===extend===
$pd = function (ev) {
ev.preventDefault();
},
d = document,
$q = function (q, el) {
return (el || d).querySelector(q);
},
lh = location.href,
$e = function (g, el) {
//===create or use existing element=== //g={el|clone,cl,ht,cs,at,atRemove,on,apT}
g.el = el || g.el || g.clone || "DIV";
var o = (g.o =
(g.clone && g.clone.cloneNode && g.clone.cloneNode(!0)) ||
(typeof g.el == "string" ? d.createElement(g.el) : g.el));
if (o) {
//execute if exist
if (g.cl) o.className = g.cl;
if (g.cs) $x(o.style, g.cs);
if (g.ht || g.at) {
var at = g.at || {};
if (g.ht) at.innerHTML = g.ht;
}
if (at)
for (var i in at) {
if (i == "innerHTML") o[i] = at[i];
else o.setAttribute(i, at[i]);
}
if (g.atRemove)
for (var i in g.atRemove) o.removeAttribute(g.atRemove[i]);
if (g.on)
for (var i in g.on) if (g.on[i]) o.addEventListener(i, g.on[i], !1);
g.ap && o.appendChild(g.ap);
g.apT && g.apT.appendChild(o);
}
return o;
},
addRules = function (css) {
$e(
{ apT: d.getElementsByTagName("head")[0], ap: d.createTextNode(css) },
"style"
);
},
//check occurrence of third-party event with growing interval: h.t=time, h.i=count, h.c=check, h.o=occur, h.m=multi
CS = function (h, d) {
d
? h.o(d)
: h.i-- &&
setTimeout(function () {
CS(h, h.c());
}, (h.t *= h.m));
}, //example: t:120, i:12, m: 1.6 => wait around 55 sec
//for xLocStor:
xLocStorOrigin =
d.location.protocol + xLocSto[xLocStI].origin.replace(/[^/]*/, ""),
qr,
qrs = {}, //set of queries "key-calls" (ок, toutLitt, toutLong, noService, noStorage)
qrI = 0, //queries counter
qrN = 12, //max number of waiting queries
errIMax = 120,
errNMax = errIMax, //max number of errors
ns = "googXButtons_", //namespace for keys
listenMsg,
/**
* external localStorage for using another domain if current domain storage is erased anywhere
* @param{String} h.do - action: set|get|remove
* @param{String} h.key
* @param{Object|undefined} h.val (any type)
* @param{Number|undefined} h.toutLitt
* @param{Number|undefined} h.tout
* @param{Function} h.cB - callback with 2 arguments
* @param{Function|undefined} h.err - callback for err with one argument
*/
xLocStor = function (h) {
var h0 = h;
h.toutLitt = h.toutLitt || 400;
h.tout = h.tout || 4000;
var ifr = d.getElementById("xLocStor"),
query = function () {
if ((qrI += 1) > qrN) {
xCatch("longQrs", null, h);
return;
}
ifr.contentWindow.postMessage(
JSON.stringify(
$x(
{
do: h.do,
tok: token,
key: ns + h.key,
},
h.val !== undefined ? { val: h.val } : {}
)
),
xLocStorOrigin
);
qrs[token] = $x(
{
//for wait of response
wToutLitt: (function (h, qrI, errIMax) {
return setTimeout(function () {
qrI -= 1;
if ((errIMax -= 1) >= 0); //console.warn('toutLitt', h);
chkErrMax();
}, h.toutLitt);
})(h, qrI, errIMax),
wTout: (function (h, qrI) {
return setTimeout(function () {
qrI -= 1;
//xCatch('tout', null, h);
//xLocStor(h0);
}, h.tout);
})(h, qrI),
},
h
);
},
token = +new Date() + (Math.random() + "").substr(1, 8),
el = h.el;
delete h.el;
if (ifr) query();
else
ifr = $e({
el: "iframe",
at: {
id: "xLocStor",
src: xLocStorOrigin + xLocSto[xLocStI].restHref,
},
cs: { display: "none" },
on: { load: query },
apT: el || d.body,
});
if (!listenMsg)
addEventListener(
"message",
function (ev) {
if (ev.origin == xLocStorOrigin) {
// {"tok":"<value>"[,"err":"<txt>"],"h":...}
//console.log('from_io', JSON.parse(ev.data))
var resp = ev.data && ev.data[0] == "{" && JSON.parse(ev.data);
if (!resp) xCatch("bad_format", resp, h);
if ((qr = qrs[resp.tok])) {
qrI -= 1;
qr.cB(resp.prev, resp.undef);
var er = qr.err;
delete qrs[resp.tok];
} // else ignore unsufficient token
if (resp.err && (!er || er(resp.err)))
//individual or common error processing depends of er()
xCatch(resp.err, resp, h);
}
},
!1
);
listenMsg = 1;
},
//for tests: localStorage.googXButtons_dwmyh = JSON.stringify({h:[1,2,1,1,1]})
//$('#xLocStor').contentWindow.postMessage('{"do":"get","key":"googXButtons_dwmyh"}',xLocSto[xLocStI].origin)
xCatch = function (er, resp, h) {
if ((errIMax -= 1) >= 0)
console.error(
"tok:",
(resp && resp.tok) || "--",
"; err:",
er,
"; h:",
h,
"; respH:",
resp && resp.h
);
chkErrMax();
},
chkErrMax = function () {
if (!errIMax) console.error("Too many err messages:", errNMax);
},
fileType = "PDF,DOC,RTF,ODF,XLS,ODS,PPT,ODP,TXT,XML,More..., KML,DWF,PS,WPM,BAS,C,CC,CPP,CXX, Java,PL,PY,H,HPP,CS"
.split(/,\s*/)
.map(function (x) {
return " " + x + " ";
}),
isFTMore = 0,
meta = {
Goog: "",
Duck: "",
Bing: "",
Ask: "",
Baidu: "",
Yandex: "",
Mailru: "",
SlideS: "",
}, //will create child-tabs (window names)
imgFile = "SVG,JPG,GIF,PNG,BMP,webp,ICO,RAW".split(",").map(function (x) {
return " " + x + " ";
}), //will switch to Img Search
imgType = "face,clipart,photo,lineart,animated".split(","), //for Img Search (+imgColor,imgSize,imgSizeLt)
imgColor = "red,orange,yellow,green,teal,blue,purple,pink,white,gray,black,brown".split(
","
),
imgSize = "l,m,small,icon,>=,Exact...".split(","),
imgSizeLt = "vga,svga,xga,2mp,4mp,qsvga".split(","),
$l = {
ru: {
"search in PDF files": "поиск по документам PDF",
"search in": "искать по",
More: "Ещё",
"search black/white": "искать чёрно-белые",
"return to colored": "вернуться к цветным",
"from / to": "за период",
past: ["за последний", "за последние", "за последнюю"],
day: "сутки",
days: ["дня", "дней"],
week: "неделю",
weeks: ["недели", "недель"],
month: "месяц",
months: ["месяца", "месяцев"],
year: "год",
years: ["года", "лет"],
hour: "час",
hours: ["часа", "часов"],
Settings: "Настройки",
"of userscript": "юзерскрипта",
"reload page for effect": "перезагрузить страницу",
"Interface language": "Язык интерфейса",
"Less positions at the end of selects":
"Меньше выбора в конце селектов",
"Gray design of buttons": "Серый дизайн кнопок",
"Show Filetype Button": "Кнопка типов файлов",
Sites: "Сайты",
},
fr: {
"search in PDF files": "la recherche dans les fichiers PDF",
"search in": "rechercher dans",
More: "Plus",
"search black/white": "trouver noir et blanc",
"return to colored": "retour à la couleur",
"from / to": "pour la période",
past: ["le dernier", "dans les derniers", "dans les derniers"],
day: "jour",
days: ["jours", "jours"],
week: "semaine",
weeks: ["semaines", "semaines"],
month: "mois",
months: ["mois", "mois"],
year: "an",
years: ["ans", "ans"],
hour: "heure",
hours: ["heures", "heures"],
Settings: "Paramètres",
"of userscript": "de Userscript",
"reload page for effect": "recharger la page pour effet",
"Interface language": "Langue de l'interface",
"Less positions at the end of selects":
"Moins de choix les longues listes",
"Gray design of buttons": "Gris design des boutons",
"Show Filetype Button": "Bouton Types de fichiers",
Sites: "Les sites",
},
de: {
"search in PDF files": "Suche in PDF-Dateien",
"search in": "Suche in",
More: "Mehr",
"search black/white": "schwarz und weiß finden",
"return to colored": "zurück zur Farbe",
"from / to": "im Zeitraum",
past: ["letzte", "letzte", "letzte"],
day: "Tag",
days: ["Tage", "Tage"],
week: "Woche",
weeks: ["Wochen", "Wochen"],
month: "Monat",
months: ["Monate", "Monate"],
year: "Jahr",
years: ["Jahre", "Jahre"],
hour: "Stunde",
hours: ["Stunden", "Stunden"],
Settings: "Einstellungen",
"of userscript": "von Userscript",
"reload page for effect": "Seite neu laden",
"Interface language": "Sprache",
"Less positions at the end of selects":
"Weniger Auswahl in langen Listen",
"Gray design of buttons": "Graues Design der Schaltflächen",
"Show Filetype Button": "Schaltfläche Dateitypen",
Sites: "Websites",
},
es: {
"search in PDF files": "búsqueda en archivos PDF",
"search in": "busca en",
More: "Más",
"search black/white": "encontrar blanco y negro",
"return to colored": "volver al color",
"from / to": "para el período",
past: ["el último", "en los últimos", "en los últimos"],
day: "día",
days: ["días", "días"],
week: "Semana",
weeks: ["semanas", "semanas"],
month: "mes",
months: ["meses", "meses"],
year: "año",
years: ["años", "años"],
hour: "hora",
hours: ["horas", "horas"],
Settings: "Ajustes",
"of userscript": "de userscript",
"reload page for effect": "página para efecto de recargar",
"Interface language": "Idioma de interfaz",
"Less positions at the end of selects":
"Menos elección en listas largas",
"Gray design of buttons": "Diseño gris de botones",
"Show Filetype Button": "Botón de tipos de archivo",
Sites: "Sitios",
},
},
cB; //if !lang, then no hints
var bBack = /^(?:rgba?\((\d+)|#(.))/.exec(
window.getComputedStyle(d.body).backgroundColor.replace(/gb/, "gba")
), // for Images tab
mDark =
(d.querySelectorAll('meta[name="color-scheme"]')[0] || {}).content ===
"dark" ||
(bBack && ((bBack[1] && bBack[1] < 96) || (bBack[2] && bBack[2] < 6)));
addRules(
".hp .sfsbc,.sfsbc{display:inline-block}.siteList:hover button{display:block}" +
".gb_Ib >.gb_e{height:47px}.gb_Fb{z-index:1087}.tsf-p{z-index:203}" +
".lsbb .xButt,.lsbb >.siteList,.sbibod .xButt,.sbibod >.siteList {z-index:2002; width:34px; height:17px;" +
"padding:0 2px; line-height:14px; font-size:14px; border:1px solid transparent; border-radius:2px;" +
"background-color:#dddae6; color:#eee; opacity:.07; transition:opacity .57s ease-in}" +
".lsbb >.siteList:hover {background-color:#4889f1}" +
".lsbb >.siteList,.sbibod >.siteList {width:32px; height:auto; padding:1px 0 2px; text-align:center}" +
".lsbb >.siteList .lsb >.txt.or {visibility:hidden; position:relative; left:3px; top:-2px; margin-left:-14px;" +
"font-size:9px; font-variant:small-caps; border:1px solid rgb(72, 137, 241); border-radius:8px;" +
"background-color:rgba(233, 238, 247, 0.66); color:rgb(131, 105, 68)}.lsbb >.siteList .lsb >.txt.or.sit {left:-1px}" +
".lsbb >.siteList .selted .lsb:not(.more):not(.moreShow):not(.sett):hover >.txt.or {visibility:visible}" +
//deprecated gray design
".lsbb .xButt:hover,.sbibod .xButt:hover,.xButt.xButt2:hover .xButt2,.xButt2:hover{background-color:#c3d4e1; color:#fff; opacity:1}" +
".xButt2{padding:0 0 2px; background-color:#dad6e2; color:#eee; opacity:1}" +
".sbibod.lsbb{height:44px}" +
".sbibod .xButt:hover,.sbibod .xButt2:hover,.sbibod .xButt:hover .xButt2{background-color:#c3c6c7}" +
".sbibod:not(.lsbb) >.siteList, .sbibod:not(.lsbb) >.xButt2{background-color:#dddae6; opacity:.45}" +
".sbibod:not(.lsbb) >.siteList:hover, .sbibod:not(.lsbb) >.xButt2:hover{background-color:#dddae6; opacity:.87}" +
".sbibod >.siteList >.list{background-color:#e1deeb}" +
".sbibod >.siteList.fade:hover{opacity:1; transition:opacity .1s ease-in}" +
".sbibod >.siteList.fade{opacity:0.23}" +
".list .more ~.xButt{display:none!important}" +
".list .moreShow ~ .xButt{position:absolute!important; left:52px; height:19px!important}" +
".list .moreShow~.x2.xButt, .list .moreShow~.x2 ~.xButt{left:99px}" +
".siteList .sett .txt{padding:2px 2px 4px; font-size:14px}" +
".siteList .settIn{display:none; width:250px; padding:2px 4px; text-align:left; border:1px solid #48f; font-size:14px;" +
"background-color:#dde; color:#336}" +
".siteList .settIn hr{margin:2px 0}" +
".sbibtd .sfsbc .nojsb, .siteList .sett:hover .settIn, .siteList .settIn.changed," +
".siteList .settIn.changed .reload{display:block}.siteList .settIn .reload, .siteList.hiddn{display:none}" +
'div.gb_g[aria-label="promo"],.pdp-psy.og-pdp, .gb_Sc.gb_g .gb_ha, .gb_g.gb_ha:not(.xpdopen ){display:none}' +
".xpdopen{display:block!important}.rhsvw{opacity:.16; transition:.4s}.rhsvw:hover{opacity:1}" +
".srp #sfdiv{overflow:inherit}" + //hide promo
".UUbT9 >div.aajZCb{background-color:rgba(" +
(mDark ? "40,44,48, 0.92" : "255,255,255, 0.75") +
");}" + //opacity for suggests
".UUbT9 ul li div span b{background-color:rgba(" +
(mDark ? "88,93,99" : "237,242,248") +
", 0.9); margin:0 -6px 0 4px; padding:0 6px 0 0;border-radius:7px;}" + //white under suggest texts
".gb_kb{padding-left:10px; padding-right:7px}form .RNNXgb{position:relative; background:rgba(" +
(mDark ? "40,44,48" : "255,255,255") +
", 0.92)}" +
".RNNXgb, #tsf{width:auto!important} #searchform form#tsf{max-width:auto} body div#searchform,body .ctr-p{min-width:0}" +
"div#searchform.minidiv{top:-8px!important}.minidiv .sfbg{margin-top:-26px!important}" + // for narrow sticked searchbar
".minidiv .sfbg{top:-39px}.minidiv .sfbg +form#tsf{top:-39px}.minidiv .sfbg +form#tsf:hover{top:0}" + //hide sticked
".minidiv .sfbg +form#tsf:hover .siteList, .minidiv .sfbg +form#tsf:hover .lsbb >.xButt {top:-6px!important}" +
".RNNXgb .Tg7LZd {flex:0 0 auto; visibility:hidden; width:44px; height:44px; margin-right:-31px; padding:0 13px 0 0;" +
" border-radius:0 8px 8px 0; background:transparent; border:none; outline:none}" +
".emcav div.RNNXgb {z-index:998; box-shadow:0 -1px 4px 0 rgba(32,33,36,0.28)}" +
".minidiv .RNNXgb {z-index:998}.minidiv .RNNXgb:hover {box-shadow:0 -1px 4px 0 rgba(32,33,36,0.28)}" +
".A8SBwf .logo +.RNNXgb .Tg7LZd {visibility:visible; margin-right:-9px; margin-bottom:-2px; transition:margin 5s ease-in-out}"
);
try {
xLocStor({
do: "get",
key: "sett",
val: setts,
cB: (cB = function (prev, undef) {
S = prev || setts;
S.dwmyh = S.dwmyh || setts.dwmyh; //temp. transitional expr.
console.timeStamp = function () { };
addRules(
!(S.whiteMintOval || S.whiteMintOval === undefined) //blue old design
? ".lsbb .xButt:not(.xButt2),.lsbb >.siteList,.sbibod .xButt:not(.xButt2) {text-align:center; background-color:#4889f1; color:#fff; opacity:0.75}" +
".lsbb >.siteList .lsb,.sbibod >.siteList .lsb {font-weight:normal; color:#d4d4d4}" +
".lsbb .lsb:hover,.sbibod .lsb:hover {opacity:1; color:#f1c44a; cursor:default}" +
".lsbb >.siteList >div:not([class]):hover,.sbibod >.siteList:hover {background-color:#c2d4e0; color:#f7f7f7; opacity:.93}" +
".lsbb >.siteList >div:not([class]):hover span {color:#aa6c1c}" +
".lsbb >.siteList .sett .txt{background-color:#4889f1}"
: //white-mint-oval design
".lsbb .xButt:not(.xButt2), .lsbb >.siteList {text-align:center; background-color:rgb(" +
(mDark ? "92,100,110" : "240,247,248") +
"); opacity:0.75; color:rgb(" +
(mDark ? "40,44,48" : "137,137,137") +
")}" +
".lsbb >.siteList {border:1px solid rgb(" +
(mDark ? "87,97,108" : "183,219,205") +
"); border-radius:10px; background-color:rgba(" +
(mDark ? "86,89,92" : "243,243,243") +
",0.7); color:rgb(" +
(mDark ? "140,154,173" : "75,143,231") +
")}" +
".lsbb >.siteList .lsb {font-weight:normal; border:1px solid rgb(" +
(mDark ? "98,98,90" : "210,210,190") +
"); border-radius:10px; background-color:rgb(" +
(mDark ? "77,84,89" : "225,239,239") +
"); color:rgb(140, 140, 140)}" +
".lsbb .lsb:hover {opacity:1; color:rgb(152, 123, 43); cursor:default}" +
".lsbb >.siteList:hover {background-color:rgb(" +
(mDark ? "87,97,108" : "183,219,205") +
")}" +
".lsbb .xButt:hover {background-color:rgb(221, 230, 228)}" +
".lsbb >.siteList >div:not([class]):hover span {color:rgb(" +
(mDark ? "233,140,19" : "170,108,28") +
")}" +
".lsbb >.siteList .sett .txt {position:relative; top:2px; margin:0 -2px; padding:1px;" +
"border:1px solid rgb(" +
(mDark ? "87,97,108" : "183,219,205") +
"); border-radius:10px; background-color:rgb(" +
(mDark ? "92,100,110" : "240,247,248") +
")"
);
CS({
t: 120,
i: 12,
m: 1.6,
c: function () {
return (
d &&
d.getElementsByName("q") &&
!/[?&]tbm=(shop|bks|fin)/.test(lh) &&
d.getElementsByName("q")[0]
);
},
o: function (dat) {
var lang = S.lang != null ? S.lang : setts.lang,
sites =
(S.sites &&
((S.sites.length && S.sites[0]) || S.sites.length > 1) &&
S.sites) ||
(typeof sites == "string" && [sites]) ||
(!S.sites && setts.sites) ||
null;
var strSites =
(sites && sites.join("\n").replace(/^\n/, "\n\n")) || "",
$L = $l[lang] || $l.ru; //default template of lang
if (!lang || !$l[lang] || lang == "en")
for (var l in $L) {
//replace 'en' lang for default or substitution
if ($L[l] instanceof Array)
for (var l2 in $L[l]) $L[l][l2] = l;
else $L[l] = l;
}
var srch = $q(".RNNXgb"),
startPg =
(srch && !$q("button", srch)) || /\/(web|img)hp/.test(lh);
if (startPg) {
//console.log('==-==startPg', srch);
$e({
el: "button",
cl: "Tg7LZd",
at: {
"aria-label": "Google Search",
type: "button",
jsname: "Tg7LZd",
innerHTML:
'<div class="gBCQ5d"><span class="z1asCe MZy1Rb">sr</span></div>',
},
apT: srch,
});
}
var $LSettings = $L["Settings"];
if (sites && sites.length) sites.push($LSettings);
var mainPg = /\/search\?|&q=|#q=/.test(lh),
inputSearch = dat,
layout1811 =
$q(".Tg7LZd") ||
$q('button[aria-label="Google Search"]') ||
$q('button[jsname="Tg7LZd"]'),
design1612 = ($q("#_fZl") || $q(".sbico-c")) && !layout1811,
d16 = (design1612 || layout1811) && S.design1612,
imSrch = /[?&]tbm=isch|\/imghp/.test(lh), // sizes are shown if images (outdated): /[&?]tbs[^&]*?(=|,|%2C)imgo(:|%3A)1/i
imgTools = imSrch && /[&?]tbs=[^&]*/.exec(lh), //'tbs' with all params
isBWShown =
imgTools && /[&?]tbs[^&]*?(=|,|%2C)ic(:|%3A)gray/i.exec(lh), // Black-White Images search
buttSearcStart =
(startPg &&
layout1811 &&
($q('input[name="btnK"]') ||
$q('input[aria-label="Google Search"]'))) ||
$q('button[jsname="Tg7LZd"]'), //for the start page
buttSearch =
(d.getElementsByName("btnG") &&
d.getElementsByName("btnG")[0]) ||
design1612 ||
layout1811,
buttS = {
Srch: { url: "", txt: "search" },
PDF: {
url: "filetype:PDF",
txt:
$L[
imSrch
? (isBWShown ? "hide" : "show") + " sizes"
: "search in PDF files"
],
},
site: {
url: "site:" + S.sites[0],
txt: $L["search in"] + " " + S.sites[0],
one: "day",
}, //you may comment this line
//,'.. : ..':{url:'', txt:$L['from / to']}
"1D": {
url: "&tbs=qdr:d",
txt: $L["past"][1] + " " + $L["day"],
one: "day",
up: 13,
lett: "D",
},
"1W": {
url: "&tbs=qdr:w",
txt: $L["past"][2] + " " + $L["week"],
one: "week",
up: 14,
lett: "W",
},
"1M": {
url: "&tbs=qdr:m",
txt: $L["past"][0] + " " + $L["month"],
one: "month",
up: 20,
lett: "M",
},
"1Y": {
url: "&tbs=qdr:y",
txt: $L["past"][0] + " " + $L["year"],
one: "year",
up: 15,
lett: "Y",
},
"1H": {
url: "&tbs=qdr:h",
txt: $L["past"][0] + " " + $L["hour"],
one: "hour",
up: 23,
lett: "H",
},
},
ii = -1,
iD = -1;
if (
(design1612 || layout1811) &&
!d16 &&
buttSearch &&
buttSearch.parentNode
)
buttSearch.parentNode.className += " lsbb";
!sites && delete buttS.site;
if (!layout1811 && buttSearch && buttSearch.parentNode) {
buttSearch.parentNode.style.position = "relative";
buttSearch.parentNode.style.zIndex = "1003";
}
if (buttSearch && top == self)
for (var i in buttS)
if ((i == "site" && !S.sites) || !imSrch || i != "1H") {
++ii; //buttons under search input line
if (i.length == 2) iD++;
else iD = -1;
var bI = buttS[i],
Gesch = { m: "letzter", f: "letzte", n: "letztes" }[
"m,f,m,n,f".split(",")[iD]
],
hint = function (j) {
return (
j +
1 +
" " +
(j % 10 || j == 10
? $L[bI.one + "s"][
j % 10 < 4 && ((j / 10) | 0) != 1 ? 0 : 1
]
: $L[bI.one])
);
},
// 🕮 <lunde> ef3c5f9a-82e1-4b71-9a8d-7c902e27927b.md
csLeft = function (ii) {
let calculatedPosition = BASE_POSITION + BUTTON_SPACING * (ii - 1);
return design1612 || layout1811
? { right: -calculatedPosition - RIGHT_OFFSET + "px" }
: { left: calculatedPosition + "px" };
},
isBWShown2 = isBWShown && i == "PDF",
butt2 = $e({
clone:
i == "site" || i.length == 2 || i == "PDF"
? $e({
cl: "siteList",
cs: { cursor: "default" },
at: { site: S.sites[0], date: bI.url },
})
: i != ".. : .." || mainPg
? $e({
el: "button",
cl: "xButt " + (d16 ? "xButt2" : "lsb"),
})
: $e({ cl: "siteList hiddn" }),
at: {
value:
iD != -1 && S.dwmyh[iD] != 1
? S.dwmyh[iD] + bI.lett
: i,
innerHTML:
"<div" +
(d16 ? " class=xButt2" : "") +
"><s" +
(isBWShown2 ? "" : "pan") +
' class=txt onclick=this.parentNode.click();return!1 title="' +
(lang || i == "site" || i == ".. : .."
? (
(iD == -1 || S.dwmyh[iD] == 1
? bI.txt
: $L["past"][1] +
" " +
hint(S.dwmyh[iD] - 1)) || ""
).replace(/letzte/, Gesch)
: "") +
'" itrvNum="' +
(i == "site"
? ""
: bI.url + (imSrch ? "" : S.dwmyh[iD])) +
'">' +
(iD != -1 && S.dwmyh[iD] != 1
? S.dwmyh[iD] + bI.lett
: imSrch && i == "PDF"
? "B/W"
: i) +
(isBWShown2 ? "</s>" : "</span>") +
"</div>",
},
cs: $x(
{
position: "absolute",
top: startPg ? "40px" : "33px",
wordSpacing: "-1px",
visibility:
ii <= S.hiddenEdgeLeft ? "hidden" : "visible",
},
$x(
csLeft(ii),
ii === 2
? {
width: "26px",
marginRight: "3px",
borderRadius: "2px",
lineHeight: "0.75em",
marginTop: "0.125em",
}
: {}
)
),
on: {
click: (function (bI, i, iD) {
//console.log('clic0:', i, iD);
return /Srch|PDF|DOC|site/.test(i)
? function (ev) {
var t = ev.target;
//console.log('cli-DocSite: i,t.class,value,ev,attrSite,$LS,aPSite,bSSta',i, t.className, inputSearch.value,ev, 'attrSite:'
// ,t.getAttribute('site'),'aP:', t.parentNode.getAttribute('site'), buttSearcStart);
if (t && t.className == "defa")
saveLocStor("", "", "remove");
$pd(ev);
if (
t &&
(t.getAttribute("site") == $LSettings ||
(t.parentNode &&
t.parentNode.getAttribute("site") ==
$LSettings)) &&
!/Srch|PDF|DOC/.test(i)
)
return;
if (
t.classList.contains("settIn") ||
t.parentNode.classList.contains("settIn")
) {
ev.stopPropagation();
return;
}
if (t && t.className != "txt")
inputSearch.value =
(inputSearch.value || "")
.replace(
/( site(:|%3A)\s*\S*|$)/gi,
/Srch|site/.test(i) ? "" : "$1"
)
.replace(
/( |\+|&as_)filetype(:|%3A)[^\&]*/g,
""
) +
" " +
(/Srch|PDF|DOC/.test(i)
? imSrch
? ""
: bI.url
: "site:" +
((t &&
(t.getAttribute("site") ||
(t.parentNode &&
t.parentNode.getAttribute(
"site"
)))) ||
""));
if (
t &&
t.getAttribute("site") == null &&
t.parentNode &&
t.parentNode.getAttribute("site") == null &&
!/Srch|PDF|DOC/.test(i)
)
return;
if (imSrch && i == "PDF") {
ev.stopPropagation();
saveLocStor();
location.href = isBWShown
? lh.replace(
new RegExp(imgTools[0]),
imgTools &&
imgTools[0]
.replace(
/(,|%2C)?ic(:|%3A)gray/gi,
""
)
.replace(
/([?&])tbs=?,?(&|$)/,
"$1"
)
) //return to colored
: imgTools
? imgTools &&
lh.replace(
new RegExp(imgTools[0]),
imgTools[0] +
(imgTools[0].length < 5
? ""
: ",") +
"ic:gray"
) //upd.'Show'
: lh +
(/\?/.test(lh) ? "&" : "?") +
"tbs=ic:gray"; //new Tools-More_tools_Show_sizes
} else if (
(t &&
/xButt|txt/.test(t.className) &&
!(
i == "site" &&
!(
/list/.test(t.parentNode.className) ||
/list/.test(
t.parentNode.parentNode.className
)
)
)) ||
(t && /Srch|PDF|DOC/.test(t.value))
)
/*console.log('==startSrch'),*/ (
buttSearcStart || buttSearch
).click();
}
: !bI.url
? function (ev) {
//from-to date (! not used now)
var el = $q("#cdrlnk"),
o;
el &&
el.dispatchEvent(
((o = d.createEvent("Events")).initEvent(
"click",
!0,
!1
),
o)
);
$pd(ev);
}
: function (ev) {
//past interval
var t = ev && ev.target,
sbd = /,sbd:1/.test(lh),
ta = t,
tOvr = t && t.parentNode,
tOv0 = tOvr,
date2 = tOvr && tOvr.getAttribute("date");
var l2 = startPg
? lh.replace(
/^([^/]*)\/\/([^/]+)\/?([^?#]*)([?#]?.*)/,
"$1//$2/search$4"
)
: lh; // insert '/search?' instead any
//console.log('cli-Past: value,date2,siteList,list,l2',inputSearch.value,date2,tOvr.classList.contains('siteList'), t.classList.contains('list'), l2);
if (
tOvr &&
tOvr.classList.contains("siteList") &&
!ta.classList.contains("list")
) {
//clicked by top button
var elTop =
$q("div:not(.list) >.txt", tOvr) || "",
itrvNum =
(elTop &&
elTop.getAttribute("itrvNum")) ||
"",
newSrch = /[?&]q=/.test(l2)
? l2.replace(
/(&|\?)q=([^&]*)(&|$)/g,
"$1q=" +
encodeURIComponent(
inputSearch.value
) +
"$3"
) //add value to '[?&]q=[^&]*'
: l2 +
(/\?/.test(l2) ? "&" : "?") +
"q=" +
encodeURIComponent(inputSearch.value); //set new value as &q=.+
if (layout1811 && itrvNum !== "" && date2)
location.href = /qdr(:|%3A)([dwmyh])\d*/.test(
l2
)
? newSrch.replace(
/([?&]tbs=)?qdr(:|%3A)[dwmyh]\d*/,
function (x) {
return itrvNum.replace(
/&/,
/\?/.test(x) ? "?" : "&"
);
}
) //patch date in URL
: newSrch +
(/\?/.test(newSrch) ? "&" : "?") +
itrvNum; //add date in URL
if (itrvNum != null)
S.dwmyh[iD] = +(itrvNum || "").replace(
/\D/g,
""
);
} else if (
t.textContent ||
tOv0.textContent
) {
var sa = (
t.textContent ||
tOv0.textContent ||
""
).replace(/\D/g, "");
if (sa.length <= 6) S.dwmyh[iD] = +sa;
}
//console.log('==noDocNoSite', tOvr.value, itrvNum);
$pd(ev);
ev.stopPropagation();
saveLocStor();
};
})(bI, i, iD),
mouseover:
i == "site" || i.length == 2 || i == "PDF"
? (function (bI, i) {
return function (ev) {
clearTimeout(bI.ww);
var t = ev.currentTarget;
t.classList.add("fade");
$q(".list", t).style.display = "block";
};
})(bI, i)
: "",
mouseout:
i == "site" || i.length == 2 || i == "PDF"
? (function (bI, i) {
return function (ev) {
var t = ev.currentTarget;
clearTimeout(bI.ww);
bI.ww = setTimeout(function () {
$q(".list", t).style.display = "none";
t.classList.remove("fade");
}, 570);
};
})(bI, i)
: "",
change: saveLocStor,
},
apT: buttSearch.parentNode,
});
bI.el = butt2;
if (i == "site" || i.length == 2 || i == "PDF") {
//dropdown lists under some buttons
//TODO 'list selted' will be placed if search by filetype or by site was presented (and accordingly buttons will be with 'selted')
var siteList = $e({
cl: "list",
cs: { display: "none" },
apT: butt2,
}),
arr = [];
for (
var j = 0;
j <
(imSrch
? 1
: bI.up -
(i == "1W" && S.lastHoursLess ? 4 : 0) -
(i == "1M" && S.lastHoursLess ? 9 : 0) -
(i == "1Y" && S.lastHoursLess ? 5 : 0));
j++
)
if (i != "1H" || !S.lastHoursLess || j < 8 || j % 2)
arr.push(hint(j));
//console.log(S.sites,i, S.dwmyh);
var list =
i == "site"
? sites || []
: i == "1D" && !sites
? arr.concat([$LSettings])
: i == "PDF"
? imSrch
? imgFile
: fileType
: arr,
fTMoreX2 = 0;
for (var j in list)
if (j != 0 || (iD != -1 && S.dwmyh[iD] != 1)) {
//console.log('==i,sI', i, sI);
fTMoreX2 = /CPP/.test(fTyp) || fTMoreX2;
var sI = list[j],
fTyp = sI.replace(/ ?/g, ""),
fTMore = /More\.\.\./.test(fTyp),
butt3 = $e({
clone:
sI == $LSettings
? $e({
cl:
"sett" +
(d16 ? " xButt xButt2" : " lsb"),
})
: $e({
el: "button",
cl:
"xButt" +
(d16 ? " xButt2" : " lsb") +
(fTMore ? " more" : "") +
(fTMoreX2 ? " x2" : ""),
}),
at: {
value: sI,
site: sI,
date: bI.url.replace(/pdf$/i, fTyp),
title:
sI == $LSettings || !lang
? ""
: (/site|PDF/.test(i)
? (
$L[
i == "PDF"
? "search in PDF files"
: "search in"
] + (i == "PDF" ? "" : " " + sI)
).replace(/PDF/, fTyp)
: j == 0
? bI.txt
: $L["past"][1] + " " + sI
).replace(/letzte/, Gesch),
innerHTML:
(/site|PDF/.test(i)
? '<span class="txt or' +
(i == "PDF" ? "" : " sit") +
'" data-val="' +
sI.replace(/ ?/g, "") +
'" title="' + //multiselect mechanics
(1
? (i == "PDF" ? "" : "sites ") +
"multiselect" +
(i == "PDF" ? " of types" : "")
: "click to disable select") +
'">' +
(1 ? "OR" : "V") +
"</span>"
: "") +
"<span class=txt>" +
sI +
"</span>" +
(sI != $LSettings && !(!S.sites && i == "1H")
? ""
: '<div class="settIn">' +
$L.Settings +
" " +
$L["of userscript"] +
'<br/>"Google Search Extra Buttons"<hr/>' +
$L["Interface language"] +
': <select class="lang" style="width:70px">' +
(function () {
var s =
"<option" +
(lang == "en" ? " selected" : "") +
">en</option>";
for (var i in $l)
s +=
"<option" +
(lang == i ? " selected" : "") +
">" +
i +
"</option>";
return (
s +
'<option value=""' +
(lang == "" ? " selected" : "") +
">en w/o hints</option>"
);
})() +
"</select><br/>" +
'<input type="checkbox" class="less" id="hoursLess"' +
(S.lastHoursLess ? " checked" : "") +
"/>" +
'<label for="hoursLess" id="hoursLessL">' +
$L[
"Less positions at the end of selects"
] +
"</label><br/>" +
'<input type="checkbox" class="des16" id="design1612"' +
/*!layout1811 &&*/ (S.design1612
? " checked"
: "") +
(1 ? " disabled" : "") +
"/>" +
'<input type="checkbox" class="des18" id="whiteMintOval"' +
(S.whiteMintOval ||
S.whiteMintOval === undefined
? " checked"
: "") +
"/>" +
'<label for="whiteMintOval" id="whiteMintOvalL">' +
$L["Gray design of buttons"] +
"</label><br/>" +
'<input type="checkbox" class="butTyp" id="butTypes"' +
(S.hiddenEdgeLeft ? "" : " checked") +
"/>" +
'<label for="butTypes" id="butTypesL">' +
$L["Show Filetype Button"] +
"</label><br/>" +
'<i><a href="#" class="defa" style="float: right">Default settings</a></i>' +
$L.Sites +
': <br/><textarea class="sites" style="width:97%" rows=8>' +
strSites +
"</textarea><br/>" +
'<a class="reload" href=# onclick="location.reload();return!1">' +
$L["reload page for effect"] +
"</a>" +
"</div>"),
},
cs: Object.assign(
{
position:
(sI != $LSettings ||
design1612 ||
layout1811) &&
!fTMore
? "static"
: "absolute",
display: "block",
width:
sI != $LSettings
? "auto"
: /en|es/.test(lang) || !lang
? "3em"
: "4em",
height: sI != $LSettings ? "18px" : "16px",
margin: "2px 0 -1px -13px",
padding: "0 2px 0 1px",
minWidth: "42px",
top: 19 * j - 175 - 133 * fTMoreX2 + "px",
textAlign: "left",
fontWeight: "normal",
opacity: 1,
whiteSpace: "nowrap",
},
fTMore ? { top: "18px", left: "47px" } : {}
),
on: {
click: (function (fTyp, pdf, fTMore) {
return function (ev) {
var t = ev.target;
var less = $q("#hoursLess"),
des16 = $q("#design1612"), //&& !layout1811
des18 = $q("#whiteMintOval"),
butTyp = $q("#butTypes"),
itrv =
t.getAttribute("date") ||
t.parentNode.getAttribute("date") ||
"",
num = (
t.getAttribute("site") ||
t.parentNode.getAttribute("site") ||
""
).replace(
/site/.test(itrv) ? /^/ : /\D/g,
""
);
//console.log('==clic3:t,itrv,num,fTyp,pdf:',t, itrv, num,'|',fTyp,pdf);
if (
t.classList.contains("sett") ||
t.parentNode.classList.contains("sett")
) {
ev.stopPropagation();
return;
}
if (less && /hoursLess/.test(t.id)) {
less.outerHTML =
'<input type="checkbox" class="less" id="hoursLess"' +
(less.getAttribute("checked") != null
? ""
: ' checked="checked"') +
"/>";
saveLocStor();
}
if (des16 && /design1612/.test(t.id)) {
des16.outerHTML =
'<input type="checkbox" class="des16" id="design1612"' +
(des16.getAttribute("checked") != null
? ""
: ' checked="checked"') +
"/>";
saveLocStor();
}
if (des18 && /whiteMintOval/.test(t.id)) {
des18.outerHTML =
'<input type="checkbox" class="des18" id="design1612"' +
(des18.getAttribute("checked") != null
? ""
: ' checked="checked"') +
"/>";
saveLocStor();
}
if (butTyp && /butTypes/.test(t.id)) {
butTyp.outerHTML =
'<input type="checkbox" class="butTyp" id="butTypes"' +
(butTyp.getAttribute("checked") != null
? ""
: ' checked="checked"') +
"/>";
saveLocStor();
}
if (pdf || /site/.test(itrv)) {
//console.log('==pdf|site');
inputSearch.value = inputSearch.value.replace(
new RegExp(
"(?:(\\s+OR\\s+)?\\s*" +
(pdf ? "filetype" : "site") +
"(?::|%3A)\\s*\\S*)+|$",
"g"
),
(s1) =>
fTMore || s1
? ""
: " " +
(imSrch
? itrv.toLowerCase() + num
: itrv + (pdf ? "" : fTyp))
);
}
var l2 = startPg
? lh.replace(
/^([^/]*)\/\/([^/]+)\/?([^?#]*)([?#]?.*)/,
"$1//$2/search$4"
)
: lh, // insert '/search?' instead any
newSrch = /[?&]q=/.test(l2)
? l2.replace(
/(&|\?)q=([^&]*)(&|$)/g,
"$1q=" +
encodeURIComponent(
inputSearch.value
) +
"$3"
) //add value to '[?&]q=[^&]*'
: l2 +
(/\?/.test(l2) ? "&" : "?") +
"q=" +
encodeURIComponent(inputSearch.value); //set new value as &q=.+
//console.log('==inputSearch.value,newSrch,fTyp,pdf,num', inputSearch.value, newSrch, fTyp, pdf, num);
if (
(pdf && !fTMore) ||
(num !== "" && num != +num)
) {
ev.stopPropagation();
}
if (
buttSearcStart &&
((pdf && !fTMore) ||
(num !== "" && num != +num))
) {
buttSearcStart.click();
return;
}
if ((layout1811 && num !== "") || pdf) {
pdf && ev.stopPropagation();
if (!fTMore)
location.href = /qdr(:|%3A)([dwmyh])\d*/.test(
l2
)
? newSrch.replace(
/([?&]tbs=)?qdr(:|%3A)[dwmyh]\d*/,
function (x) {
return pdf
? ""
: (
itrv + (imSrch ? "" : num)
).replace(
/&/,
/\?/.test(x) ? "?" : "&"
);
}
) //patch date in URL
: newSrch +
(/\?/.test(newSrch) ? "&" : "?") +
(pdf
? ""
: itrv + (imSrch ? "" : num));
//add date in URL
else {
if (t.classList.contains("txt")) {
if (
t.parentNode.classList.contains(
"more"
)
)
t.parentNode.className =
"xButt lsb moreShow";
else
t.parentNode.className =
"xButt lsb more";
} //'className' because bug of Chrome in upper line with .toggle
else {
if (t.classList.contains("more"))
t.className = "xButt lsb moreShow";
else t.className = "xButt lsb more";
}
}
} //bug of Fx with .toggle,.toggle - list is changed slow (0.4 s)
$pd(ev);
};
})(fTyp, i == "PDF", fTMore),
}, //, mouseover: function(ev){ev.stopPropagation()}, mouseout: function(ev){ev.stopPropagation()}
apT: siteList,
});
}
siteList.style.height = "auto";
siteList.style.textAlign = "center";
siteList.style.marginRight = "-40px";
}
}
},
});
}),
el: d.body,
});
} catch (er) {
console.log("==cB");
cB();
}
var saveLocStor = function (ev, val, do2) {
var aaa,
aab,
aac,
aad,
aae,
aaf,
t = (ev && ev.target.form) || document.documentElement || document.body;
xLocStor({
do: do2 || "set",
key: "sett",
val: {
lang: (aaa = d.querySelectorAll(".lang", t))[aaa.length - 1].value,
sites: (
(aab = d.querySelectorAll(".sites", t))[aab.length - 1].value || ""
)
.replace(/^[ \t]*|[ \n\t]*$/g, "")
.split("\n"),
lastHoursLess: (aac = d.querySelectorAll(".less", t))[aac.length - 1]
.checked,
design1612: (aad = d.querySelectorAll(".des16", t))[aad.length - 1]
.checked,
whiteMintOval: (aae = d.querySelectorAll(".des18", t))[aae.length - 1]
.checked,
hiddenEdgeLeft: !(aaf = d.querySelectorAll(".butTyp", t))[
aaf.length - 1
].checked,
dwmyh: S.dwmyh || setts.dwmyh,
},
cB: function (prev) {
console.info("Settings are saved. prev=", prev);
},
});
$q(".siteList .settIn").classList.add("changed");
};
})({
//write "lang:''," to remove hints; 'en' for English hints (fr - Français, es - espagnol), 'ru' for Russian
lang:
"" ||
(navigator.languages && navigator.languages[1]) ||
navigator.language.substr(0, 2), //='' if hide hints, or 2 letters from $l{}
sites: [
//=array or one site in string
"",
"slashdot.org",
"reddit.com",
"techcrunch.com",
"habr.com",
"geektimes.com",
"smashingmagazine.com",
"engadget.com",
], //write your favorite sites
lastHoursLess: 1, //=boolean - not show odd some values of hours after 8 h
design1612: 0, //=boolean - gray design is disabled for layout1811 ===== TODO enable
whiteMintOval: 1, //=boolean - white-mint-oval design with sticked search field
hiddenEdgeLeft: 0, //how many extra buttons to hide from left
dwmyh: [1, 1, 1, 1, 1], //=array of numbers - current vals of days, weeks, months, years, hours
fileType: {}, // turn on or off {doc:1, txt:1}
meta: {}, // on/off {Ask:1, }
//TODO meta-data for search of same results {Ya:{title:'',txt:'',url:''},...}
imgFile: "", // one of: switch to img search or in img search
imgType: {}, //{itp:'face'}
imgColor: {}, //{isc:'blue'}
imgSize: {}, //{isz:'i'}
imgSizeLt: {}, //{islt:'vga'}
});