NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
(function () { // ==UserScript== // @name uso - Searchin' // @namespace http://userscripts.org/users/37004 // @description Enhances and moves the search box into the mainmenu // @copyright 2011+, Marti Martz (http://userscripts.org/users/37004) // @license CC-BY-NC-SA-4.0; https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode // @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt // @version 0.1.26.1eol // @icon https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/Searchin%27/res/icon48.png // @homepageURL https://github.com/Martii/UserScripts/tree/master/src/uso/Searchin%27 // @homepageURL https://openuserjs.org/scripts/Marti/uso_-_Searchin // @homepageURL http://userscripts.org/scripts/show/158922 // @supportURL http://userscripts.org/topics/122744 // @include /^https?://userscripts\.org(?::\d{1,5})?/?/ // @include http://userscripts.org:8080/* // @include http://userscripts.org/* // @include https://userscripts.org/* // @require https://raw.githubusercontent.com/Martii/GM_config/42d6367b3c8ccc1b8f32af7b23fce5078716ff14/gm_config.js // @require https://raw.githubusercontent.com/Martii/UserScripts/master/lib/GM_setStyle/GM_setStyle.js // @resource icon https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/Searchin%27/res/icon32.png // @resource more https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/Searchin%27/res/more9x5.gif // @resource uso https://raw.githubusercontent.com/Martii/UserScripts/master/res/compatibilityMatrix/uso16.png // @resource cse https://raw.githubusercontent.com/Martii/UserScripts/master/src/uso/Searchin%27/res/cse16.png // @resource gmc https://raw.githubusercontent.com/sizzlemctwizzle/GM_config/master/gm_config_icon.png // @grant GM_deleteValue // @grant GM_getResourceURL // @grant GM_getValue // @grant GM_log // @grant GM_setValue // ==/UserScript== if (!document || !document.body || location.hash == "#posts-last") return; let protocol = "http" + (/^https:$/i.test(location.protocol) ? "s" : "") + ":"; let port = /^80$/.test(location.port) ? "" : ":8080"; if (typeof GM_configStruct != "undefined") { // Reclaim some memory delete GM_config; function insertHook() { let hookNode = document.getElementById("full_description"); if (hookNode && !hookNode.firstChild) return hookNode.appendChild(document.createElement("div")); else return (hookNode) ? hookNode.insertBefore(document.createElement("div"), hookNode.firstChild) : document.body.appendChild(document.createElement("div")); } /* Common */ let divNode = insertHook(); let gmcHome = new GM_configStruct(); gmcHome.id = "gmc158922home"; gmcHome.init( divNode, ([ '<img alt="searchIn" title="uso - searchIn" src="' + GM_getResourceURL("icon") + '" />', '<p>Preferences</p>', '<span>', '<a href="' + protocol + '//github.com/sizzlemctwizzle/GM_config/wiki">', '<img alt="GM_config" title="Powered in part by GM_config" src="' + GM_getResourceURL("gmc") + '" />', '</a>', '</span>' ]).join(""), /* Custom CSS */ GM_setStyle({ node: null, data: [ "@media screen, projection {", "#gmc158922home { position: static !important; z-index: 0 !important; width: auto !important; height: auto !important; max-height: none !important; max-width: none !important; margin: 0 0 0.5em 0 !important; border: 1px solid #ddd !important; clear: right !important; }", "#gmc158922home_header a { display: inline; }", "#gmc158922home_header img { vertical-align: middle; }", "#gmc158922home_header > img { height: 32px; margin-right: 0.25em; width: 32px; }", "#gmc158922home_header > p { display: inline; margin: 0; vertical-align: middle; }", "#gmc158922home_header span { float: right; }", "#gmc158922home_header span > a { display: inline; margin-left: 0.25em; }", "#gmc158922home_wrapper { background-color: #eee; padding-bottom: 0.25em; }", "#gmc158922home .config_header { background-color: #333; color: #fff; font-size: 1.57em; margin: 0; padding: 0 0.5em; text-align: left; }", "#gmc158922home .config_var { clear: both; margin: 0.5em; padding: 0; }", "#gmc158922home .field_label { color: #333; font-size: 100%; font-weight: normal; margin: 0 0.25em; position: relative; top: 0.125em; }", "#gmc158922home .section_desc { margin: 0.25em 1.5em !important; }", ".gmc-yellownote { background-color: #ffd; font-size: 0.66em !important; }", ".gmc158922home-invisilink { text-decoration: none; color: #000; }", ".gmc158922home-invisilink:hover { color: #000; }", "#gmc158922home_buttons_holder { margin: 0.5em; }", "#gmc158922home_saveBtn { margin: 0.5em !important; padding: 0 3.0em !important; }", "#gmc158922home_resetLink { margin-right: 1.5em; }", "#gmc158922home_closeBtn { display: none; }", "}", "@media print {", "#gmc158922home { display: none !important; }", "}" ].join("\n") }), /* Settings object */ { 'unstickSearchTab': { "type": 'checkbox', "label": 'Unstick the main menu search tab', "default": false } } ); if (location.pathname.match(/\/scripts\/show\/158922\/?/i)) { gmcHome.open(); } let gmc = new GM_configStruct(); gmc.id = "gmc158922"; gmc.init( document.body.insertBefore(document.createElement("div"), document.body.firstChild), ([ '<a href="/scripts/show/158922" target="_top">', '<img alt="searchIn" title="uso - searchIn" src="' + GM_getResourceURL("icon") + '" />', '</a>', '<p>Options</p>', '<span>', '<a href="' + protocol + '//github.com/sizzlemctwizzle/GM_config/wiki" target="_top">', '<img alt="GM_config" title="Powered in part by GM_config" src="' + GM_getResourceURL("gmc") + '" />', '</a>', '</span>' ]).join(""), /* Custom CSS */ GM_setStyle({ node: null, data: [ "@media screen, projection {", "#gmc158922 { background-color: rgba(0, 0, 0, 0.66) !important; height: 100% !important; width: 100% !important; max-height: 100% !important; max-width: 100% !important; left: 0 !important; top: 0 !important; }", "#gmc158922_wrapper { background-color: #eee; width: 30em; height: 40em; position: absolute; left: 50%; top: 50%; margin: -20em 0 0 -15em; border: 1px solid #ddd; }", "#gmc158922_header a { display: inline; }", "#gmc158922_header img { vertical-align: middle; }", "#gmc158922_header > a img { height: 32px; margin-right: 0.25em; width: 32px; }", "#gmc158922_header > p { display: inline; margin: 0; vertical-align: middle; }", "#gmc158922_header span { float: right; }", "#gmc158922_header span > a { display: inline; margin-left: 0.25em; }", "#gmc158922 .config_header { background-color: #333; color: #fff; font-size: 1.57em; margin: 0; padding: 0 0.5em; text-align: left; }", "#gmc158922 .config_var { clear: both; margin: 0.5em 1em; padding: 0; }", "#gmc158922 .field_label { color: #333; font-size: 100%; font-weight: normal; margin: 0 0.25em; position: relative; top: 0.125em; }", "#gmc158922 .section_desc { margin: 0.25em 1.5em !important; }", "#gmc158922 .section_header { margin: 0 1em; text-align: left; }", "#gmc158922 .section_header img { margin: 0 0.25em; vertical-align: middle; }", ".gmc-yellownote { background-color: #ffd; font-size: 0.66em !important; }", ".gmc158922-invisilink { text-decoration: none; color: #000; }", ".gmc158922-invisilink:hover { color: #000; }", "#gmc158922_field_searchInCSE { margin-left: 1em; }", "#gmc158922_field_searchInCSE label { display: block; }", "#gmc158922_field_searchInCSE span { position: relative; top: 0.125em; }", "#gmc158922_field_lockInurl { margin-left: 1em; }", "#gmc158922_field_lockInurl label { display: block; }", "#gmc158922_field_lockInurl label:first-child { margin-bottom: 0; }", "#gmc158922_field_lockInurl span { position: relative; top: 0.125em; }", "#gmc158922_field_inurlLock { margin-left: 3em; width: 84%; }", "#gmc158922_buttons_holder { margin: 0.5em; position: absolute; bottom: 0; right: 0; }", "#gmc158922_saveBtn, #gmc158922_closeBtn { margin: 0.5em !important; padding: 0 3.0em !important; }", "#gmc158922_resetLink { margin-right: 1.5em; }", "}", "@media print {", "#gmc158922 { display: none !important; }", "}" ].join("\n") }), /* Settings object */ { 'enableCSEfilter': { "section": ['<a href="http://www.google.com/cse/"><img src="' + GM_getResourceURL("cse") + '"></a> Google Custom Search Engine'], "label": 'Modify search results by applying a filter of: <p class="gmc-yellownote" style="margin: 0 0.5em;">NOTE: Only last known working query modifiers are shown</p>', "type": 'checkbox', "value": 'unchecked' }, 'searchInCSE': { "type": 'radio', "options": ['intitle:', 'inanchor:', 'intext:'], "default": 'intitle:' }, 'lockInurl': { "label": 'Search path generation for inurl:', "type": 'radio', "options": ['Contextual', 'Fixed'], "default": 'Contextual' }, 'inurlLock': { "type": "text", "default": "/scripts", "label": '<p class="gmc-yellownote" style="margin-left: 5em; ">Clear the path for everywhere and to enable the full dropdown quick list on second click</p>' } } ); gmc.onOpen = function () { let saveBtn = document.getElementById("gmc158922_saveBtn"); if (saveBtn) saveBtn.textContent = "Save \u0026 Close"; let closeBtn = document.getElementById("gmc158922_closeBtn"); if (closeBtn) closeBtn.textContent = "Cancel"; let fixed = gmc.fields["inurlLock"].node; if (fixed) { fixed.setAttribute("list", "common-pathnames"); fixed.setAttribute("autocomplete", "off"); // NOTE: documentation vague let datalistNode = document.createElement("datalist"); datalistNode.id = "common-pathnames"; datalistNode.classList.add("hid"); let pathnames = { "Everywhere" : "", "Scripts" : "/scripts", "Source Codes" : "/scripts/review", "Users" : "/users", "Blogs" : "/articles", "Groups" : "/groups", "Guides" : "/guides", "Reviews" : "/scripts/reviews", "Forums/Discussions" : "/topics", "Tags" : "/tags" } for (let pathname in pathnames) { let optionNode = document.createElement("option"); optionNode.value = pathnames[pathname]; optionNode.textContent = pathname; datalistNode.appendChild(optionNode); } fixed.appendChild(datalistNode); } } gmc.onSave = function () { let section_search = document.getElementById("section_search"), cse_section_search = document.getElementById("cref_iframe_cse-search-box") ; if (gmc.get("lockInurl") == "Fixed" && !cse_section_search.classList.contains("hid")) section_search.classList.add("urllock"); else section_search.classList.remove("urllock"); gmc.close(); } /* <form id="cref_iframe_cse-search-box" action="/search"> <input type="hidden" value="http://userscripts.org/cse.xml" name="cref"> <input type="hidden" value="FORID:9" name="cof"> <input type="hidden" value="UTF-8" name="ie"> <input type="text" size="31" name="q"> <input type="submit" value="Search" name="sa"> </form> */ function parseQueryCSE(aValue) { if (!(/in.+?\:/.test(aValue))) { // ** Parse gmc for applicable filter let quo = false; if (gmc.get("enableCSEfilter")) aValue = aValue.trim().split(/[ ]+/).map(function (e) { e = e.trim(); if (!quo) { if (/^["'].*/.test(e)) quo = !quo; return (gmc.get("searchInCSE") + e); } else { if (quo && /["']$/.test(e)) quo = !quo; return (e); } }).join(" "); // Check gmc for fixed if (gmc.get("lockInurl") == "Fixed") { if (gmc.get("inurlLock") != "") aValue += " inurl:" + gmc.get("inurlLock"); } else { let pathname = location.pathname; if (! /^\/(?:groups|users)\/?/.test(pathname) ) pathname = pathname.replace(/\/\d+(?:.*?)?\/?$/, ""); // Any other trailing beginning number strip it off // ** Homepage check if (/^\/$/.test(pathname)) { pathname = "/scripts"; // NOTE: Match USO default } // ** USO search page check if (/.+\/search\/?$/.test(pathname)) pathname = pathname.replace(/\/search\/?$/, ""); // ** Custom site search page check if (!(/^\/search\/?/.test(pathname))) aValue += " inurl:" + pathname; else { if (/^\/search\/?/.test(pathname)) { let inurl = location.search.match(/\+inurl\%3A\%2F(.+?)\&/); if (inurl) aValue += " inurl:/" + decodeURIComponent(inurl[1]) } } } } return (aValue); } function onsubmitCSE(ev) { let xpr = document.evaluate( ".//input[@name='q']", ev.target, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; if (thisNode.value == "") { ev.preventDefault(); ev.stopPropagation(); GM_deleteValue(":cse-last-query"); location.assign("/search"); return; } GM_setValue(":cse-last-query", thisNode.value); thisNode.value = parseQueryCSE(thisNode.value); } else console.error('FATAL ERROR: Search query NOT FOUND'); } function onmouseoverCSE(ev) { ev.target.title = "Searchin' " + parseQueryCSE(ev.target.value).trim(); } function createSearchCSE(aUrl) { let inputNodeSubmit = document.createElement("input"); inputNodeSubmit.type = "submit"; inputNodeSubmit.name = "sa"; inputNodeSubmit.value = ""; inputNodeSubmit.className = "go"; let inputNodeQ = document.createElement("input"); inputNodeQ.type = "text"; inputNodeQ.title = "Search in "; inputNodeQ.setAttribute("placeholder", "in\u2026"); inputNodeQ.name = "q"; inputNodeQ.className = "input"; inputNodeQ.value = GM_getValue(":cse-last-query", ""); inputNodeQ.addEventListener("mouseover", onmouseoverCSE, false); let inputNodeIe = document.createElement("input"); inputNodeIe.name = "ie"; inputNodeIe.type = "hidden"; inputNodeIe.value = "UTF-8"; let inputNodeCof = document.createElement("input"); inputNodeCof.name = "cof"; inputNodeCof.type = "hidden"; inputNodeCof.value = "FORID:9"; let inputNodeCref = document.createElement("input"); inputNodeCref.name = "cref"; inputNodeCref.type = "hidden"; inputNodeCref.value = protocol + "//userscripts.org" + port + "/cse.xml"; let formNode = document.createElement("form"); formNode.method = "get"; formNode.action = "/search"; formNode.id = "cref_iframe_cse-search-box"; formNode.addEventListener("submit", onsubmitCSE, false); formNode.appendChild(inputNodeCref); formNode.appendChild(inputNodeCof); formNode.appendChild(inputNodeIe); formNode.appendChild(inputNodeQ); formNode.appendChild(inputNodeSubmit); return (formNode); } /* <div id="section_search"> <form method="get" action="/scripts/search"> <input type="text" title="Search" placeholder="Search scripts" name="q" class="input"> <input type="submit" value="" name="submit" class="go"> </form> </div> */ function createSearchUSO(aUrl) { let inputNodeSubmit = document.createElement("input"); inputNodeSubmit.type = "submit"; inputNodeSubmit.name = "submit"; inputNodeSubmit.value = ""; inputNodeSubmit.className = "go"; let inputNodeQ = document.createElement("input"); inputNodeQ.type = "text"; inputNodeQ.title = "Search"; inputNodeQ.setAttribute("placeholder", "in\u2026"); inputNodeQ.name = "q"; inputNodeQ.className = "input"; let formNode = document.createElement("form"); formNode.method = "get"; formNode.action = "/scripts/search"; formNode.id = "uso-search-box"; formNode.appendChild(inputNodeQ); formNode.appendChild(inputNodeSubmit); return (formNode); } // ** Start twiddling ** let ubs = document.getElementById("userscripts_better_search"), // Detect ubs uac = false ; // Detect uac let xpr = document.evaluate( "//div[contains(concat(' ', normalize-space(@class), ' '), ' alt_topbottom ')]", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; uac = true; } let mm = document.getElementById("mainmenu"); if (!mm) { console.error('FATAL ERROR: Main menu does not exist'); return; } function onresize(ev) { let xpr = document.evaluate( "//div[@id='top']/div[@class='container']", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; let width = parseFloat(getComputedStyle(thisNode, null).getPropertyValue("width").replace(/px$/i, "")); // NOTE: Returns normalized used instead of computed if (width <= 950) { let mainmenu = document.getElementById("mainmenu"); if (mainmenu) mainmenu.style.setProperty("margin-right", (document.body.clientWidth - width) / 2 + "px", ""); } else return true; } if (!ev) return false; } if (!onresize()) addEventListener("resize", onresize, false); let height = getComputedStyle(mm, null).height.replace(/px$/, "") - 1 - 1; // NOTE: Extra pixel in rendering w FF let uso = GM_getResourceURL("uso"), cse = GM_getResourceURL("cse") ; let gCSS = GM_setStyle({ media: "screen, projection", data: [ ".hid { display: none; }", ".HID { display: none !important; }", "#header > .container { position: static; }", "#header #mainmenu { padding-top: 0; }", "#section_search .go {", "background: url(/images/search-icon.png) no-repeat scroll 0 0 transparent;", "border: medium none !important;", "box-shadow: none;", "cursor: pointer;", "height: 16px;", "padding: 0;", "width: 16px !important;", '}', "#header #mainmenu li a { display: inline-block; }", ((!ubs) ? "#section_search { border-bottom: thin solid #eee; border-left: thin solid #eee; }" : ""), "#section_search { width: " + ((!ubs) ? "180": "240") + "px; margin: 0; padding: 0;" + ((!ubs) ? " float: right;": "") + " }", "#section_search { height: " + height + "px; }", "#section_search form { height: inherit; }", "#section_search input[name=q] { height: inherit; }", "#section_search input { margin: 0; }", "#section_search .input {" + " font-size: inherit;" + " width: " + ((!ubs) ? "65%" : "190px") + " !important;" + " padding-top: 0;" + ((!ubs) ? " padding-right: " + ((!uac) ? "2.29" : "1.5") + "em;" : "") + " padding-bottom: 0;" + ((!ubs) ? " padding-left: 3em;" : "") + " background-color: #eee;" + " border: thin none;" + " float: left; " // NOTE: Needed for USO generated CSE + ((!uac) ? "": " -moz-border-radius: " + ((!ubs) ? "0": "6px") + " 6px 0 0;") + ((!uac) ? "": " border-radius: " + ((!ubs) ? "0": "6px") + " 6px 0 0;") + " }", "#section_search .input:focus { background-color: #fff; }", "#section_search .searchin-opt { width: 16px; height: 16px; position: absolute; margin: 0.58em 0 0 -3em; background: url(" + GM_getResourceURL("gmc") + ") no-repeat scroll center center transparent; }", "#section_search #searchin { width: 32px; height: 16px; position: absolute; margin: " + ((!uac) ? "7px" : "0.58em") + " 0 0 0.25em; }", "#section_search .uso { background: url(" + GM_getResourceURL("uso") + ") no-repeat scroll left center, url(" + GM_getResourceURL("more") + ") no-repeat scroll right center transparent; }", "#section_search .cse { background: url(" + GM_getResourceURL("cse") + ") no-repeat scroll left center, url(" + GM_getResourceURL("more") + ") no-repeat scroll right center transparent; }", ".urllock { border-bottom-color: #000 !important; border-left-color: #000 !important; }", "#semenu { top: " + ((!uac) ? (height + 1) + "px" : "2.393em") + "; position: absolute; z-index: 2; margin: 0; list-style: none outside none; border-left: 1px solid #888; border-right: 1px solid #888; border-bottom: 1px solid #888; border-top: 1px solid #888; padding-left: 0; }", "#semenu > li { padding: 0.25em 1em 0.25em 0.5em; border-style: none !important; color: #000; -moz-border-radius: 0 !important; border-radius: 0 !important; margin: 0 !important; float: none !important; background: #eee url(ddata:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAZCAQAAABamYz0AAAAAXNSR0IArs4c6QAAAB5JREFUCNdjuOfAxPCPieEvDP1D4v5DIv/iEEcIAgClTRkR4R/Z1AAAAABJRU5ErkJggg==) repeat-x scroll left top !important; }", "#semenu > li a { color: #fff !important; }", "#semenu > li:last-child { border-top: thin dotted #aaa !important; }", "#semenu > li img { vertical-align: middle; margin: 0 0.25em; }", "#semenu > li:hover { color: #fff !important; background-color: #06b !important; }", "#section_search .go { position: absolute; margin: " + ((!uac) ? "7px" : "0.58em") + " 0 0 " + ((!ubs) ? "-1.5" : "-1.2") + "em; }" ].join("\n") }); // Restore native USO styling and put UBS in his... err its place ;) if (ubs) { GM_setStyle({ node: gCSS, data: [ '#install_script { bottom: auto !important; top: 10px !important; }', '#userscripts_better_search { margin: ' + ((!uac) ? '0.66':'0.6') + 'em 0 0 ' + ((!uac) ? '17.25':'14.75') + 'em !important; right: auto !important; background-position: center 1px !important; }' ].join("\n") }); } let section_search = document.getElementById("section_search"), cse_section_search = null, uso_section_search = null, mainmenu = document.getElementById("mainmenu") ; // *** Check for CSE existance already from /search page *** if (!section_search) { cse_section_search = document.getElementById("cref_iframe_cse-search-box"); if (cse_section_search) { // ** wrap in div and move pointer let divNode = document.createElement("div"); divNode.id = "section_search"; if (gmc.get("lockInurl") == "Fixed") { divNode.classList.add("urllock"); } let xpr = document.evaluate( "//h2[.='Google Site Search']", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; thisNode.textContent = "Site Search"; } document.evaluate( ".//input[@name='q']", cse_section_search, null, XPathResult.FIRST_ORDERED_NODE_TYPE, xpr ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; thisNode.classList.add("input"); thisNode.value = GM_getValue(":cse-last-query", ""); thisNode.addEventListener("mouseover", onmouseoverCSE, false); } document.evaluate( ".//input[@name='sa']", cse_section_search, null, XPathResult.FIRST_ORDERED_NODE_TYPE, xpr ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; thisNode.classList.add("go"); } cse_section_search.parentNode.insertBefore(divNode, cse_section_search); divNode.appendChild(cse_section_search); cse_section_search.addEventListener("submit", onsubmitCSE, false); section_search = divNode; GM_deleteValue(":cse-last-query"); } } else { let xpr = document.evaluate( ".//form", section_search, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; if (!thisNode.id) { thisNode.id = "uso-search-box"; uso_section_search = thisNode; if (location.pathname == "/") { // NOTE: Static watchpoint thisNode.parentNode.parentNode.removeChild(thisNode.parentNode.nextSibling); thisNode.parentNode.parentNode.removeChild(thisNode.parentNode.nextSibling); // NOTE: Remove br tag thisNode.parentNode.parentNode.removeChild(thisNode.parentNode.previousSibling); thisNode.parentNode.parentNode.removeChild(thisNode.parentNode.previousSibling); // NOTE: Remove h6 } } else { console.error( [ 'id attribute for uso search box already exists', '', 'Please leave a message at http://userscripts.org/topics/122744 ' ].join('\n') ); return; } } } // ** e.g. no search forms found at all e.g /tags ** if (!section_search) { let divNode = document.createElement("div"); divNode.id = "section_search"; let xpr = document.evaluate( "//ul[@id='mainmenu']//li[contains(concat(' ', normalize-space(@class), ' '), ' active ')]", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; cse_section_search = createSearchCSE(); } else { cse_section_search = createSearchCSE(); } divNode.appendChild(cse_section_search); if (gmc.get("lockInurl") == "Fixed") { divNode.classList.add("urllock"); } section_search = document.body.appendChild(divNode); // NOTE: Very random location } // ** Draw in the engine selector and search tab ** if (section_search && mainmenu) { let liNode = document.createElement("li"); if (/^\/search/.test(location.pathname)) liNode.classList.add("active"); if (!ubs) { let aNode = document.createElement("a"); aNode.href = "/search"; aNode.textContent = "Search"; liNode.appendChild(aNode); } liNode.appendChild(section_search); if (!ubs && uso_section_search && !cse_section_search) { cse_section_search = createSearchCSE(); cse_section_search.classList.add("hid"); // NOTE: Initial section_search.appendChild(cse_section_search); } if (!ubs && gmcHome.get("unstickSearchTab")) { section_search.classList.add("hid"); section_search.parentNode.addEventListener("mouseover", function (ev) { section_search.classList.remove("hid"); }, false); section_search.parentNode.addEventListener("mouseout", function (ev) { section_search.classList.add("hid"); }, false); } mainmenu.insertBefore(liNode, mainmenu.firstChild); if (!ubs) { let inputNodeSE = document.createElement("input"); inputNodeSE.type = "image"; inputNodeSE.id = "searchin"; section_search.insertBefore(inputNodeSE, section_search.firstChild); inputNodeSE.src = "data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; inputNodeSE.addEventListener("click", function (ev) { ev.preventDefault(); ev.stopPropagation(); // ** Build a menu ** let semenu = document.getElementById("semenu"); if (!semenu) { let ulNode = document.createElement("ul"); ulNode.id = "semenu"; function onclick (ev) { document.body.removeEventListener("click", onclick, false); if (ulNode && ulNode.parentNode) ulNode.parentNode.removeChild(ulNode); } document.body.addEventListener("click", onclick, false); if (ev.target.classList.contains("more")) { let liNodeSEuso = document.createElement("li"); liNodeSEuso.textContent = "Userscripts.org"; liNodeSEuso.addEventListener("click", function (ev) { let section_search = document.getElementById("section_search"); if (section_search) section_search.classList.remove("urllock"); let inputNodeSE = section_search.firstChild; inputNodeSE.classList.remove("cse"); inputNodeSE.classList.add("uso"); let query; let cse_section_search = document.getElementById("cref_iframe_cse-search-box"); if (cse_section_search) { cse_section_search.classList.add("hid"); let xpr = document.evaluate( ".//input[@name='q']", cse_section_search, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; query = thisNode.value; } } let uso_section_search = document.getElementById("uso-search-box"); if (uso_section_search) { uso_section_search.classList.remove("hid"); GM_deleteValue(":se-default"); let xpr = document.evaluate( ".//input[@name='q']", uso_section_search, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; if (query) thisNode.value = query; } } let e = document.createEvent("MouseEvents"); e.initEvent("mouseout", true, false); ev.target.dispatchEvent(e); let semenu = document.getElementById("semenu"); if (semenu) semenu.parentNode.removeChild(semenu); }, false); let imgNodeSEuso = document.createElement("img"); imgNodeSEuso.src = GM_getResourceURL("uso"); liNodeSEuso.insertBefore(imgNodeSEuso, liNodeSEuso.firstChild); ulNode.appendChild(liNodeSEuso); } let liNodeSEcse = document.createElement("li"); liNodeSEcse.textContent = "Google CSE"; liNodeSEcse.addEventListener("click", function (ev) { let section_search = document.getElementById("section_search"); if (section_search && gmc.get("lockInurl") == "Fixed") section_search.classList.add("urllock"); let inputNodeSE = section_search.firstChild; inputNodeSE.classList.remove("uso"); inputNodeSE.classList.add("cse"); let query; let uso_section_search = document.getElementById("uso-search-box"); if (uso_section_search) { uso_section_search.classList.add("hid"); let xpr = document.evaluate( ".//input[@name='q']", uso_section_search, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; query = thisNode.value; } } let cse_section_search = document.getElementById("cref_iframe_cse-search-box"); if (cse_section_search) { cse_section_search.classList.remove("hid"); GM_setValue(":se-default", "cse"); let xpr = document.evaluate( ".//input[@name='q']", cse_section_search, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (xpr && xpr.singleNodeValue) { let thisNode = xpr.singleNodeValue; if (query) thisNode.value = query; } } let e = document.createEvent("MouseEvents"); e.initEvent("mouseout", true, false); ev.target.dispatchEvent(e); let semenu = document.getElementById("semenu"); if (semenu) semenu.parentNode.removeChild(semenu); }, false); let imgNodeSEcse = document.createElement("img"); imgNodeSEcse.src = GM_getResourceURL("cse"); liNodeSEcse.insertBefore(imgNodeSEcse, liNodeSEcse.firstChild); ulNode.appendChild(liNodeSEcse); let liNodeSEmanage = document.createElement("li"); liNodeSEmanage.textContent = "Manage Search Engines\u2026"; liNodeSEmanage.addEventListener("click", function (ev) { gmc.open(); let e = document.createEvent("MouseEvents"); e.initEvent("mouseout", true, false); ev.target.dispatchEvent(e); let semenu = document.getElementById("semenu"); if (semenu) semenu.parentNode.removeChild(semenu); }, false); let imgNodeSEmanage = document.createElement("img"); imgNodeSEmanage.src = GM_getResourceURL("gmc"); liNodeSEmanage.insertBefore(imgNodeSEmanage, liNodeSEmanage.firstChild); ulNode.appendChild(liNodeSEmanage); ev.target.parentNode.insertBefore(ulNode, ev.target.parentNode.firstChild.nextSibling); ev.target.parentNode.parentNode.addEventListener("mouseout", function (ev) { let thatNode = this.lastChild; while (thatNode) { if (thatNode.tagName.toLowerCase() == "ul") thatNode.classList.add("hid"); thatNode = thatNode.nextSibling; } }, false); ev.target.parentNode.parentNode.addEventListener("mouseover", function (ev) { let thatNode = this.lastChild; while (thatNode) { if (thatNode.tagName.toLowerCase() == "ul") thatNode.classList.remove("hid"); thatNode = thatNode.nextSibling; } }, false); } else semenu.parentNode.removeChild(semenu); }, false); let xpr = document.evaluate( ".//input[@name='q']", section_search, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null ); if (xpr) { for (let i = 0, thisNode; thisNode = xpr.snapshotItem(i); ++i) { thisNode.setAttribute("placeholder", "in\u2026"); // ** Clear out stray value attribute on / with go button let go = document.evaluate( "//input[contains(concat(' ', normalize-space(@class), ' '), ' go ')]", document.body, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ); if (go && go.singleNodeValue) { let thisNode = go.singleNodeValue; thisNode.value = ""; } switch (GM_getValue(":se-default")) { case "cse": if (uso_section_search) { inputNodeSE.classList.add("cse"); inputNodeSE.classList.remove("uso"); cse_section_search.classList.remove("hid"); uso_section_search.classList.add("hid"); if (gmc.get("lockInurl") == "Fixed") { section_search.classList.add("urllock"); } } break; case undefined: default: if (uso_section_search) { inputNodeSE.classList.add("uso"); inputNodeSE.classList.remove("cse"); uso_section_search.classList.remove("hid"); cse_section_search.classList.add("hid"); if (gmc.get("lockInurl") == "Fixed") { section_search.classList.remove("urllock"); } } break; } if (xpr.snapshotLength > 1) inputNodeSE.classList.add("more"); else inputNodeSE.classList.add("cse"); } } } } else console.error('FATAL ERROR: search NOT FOUND'); } })();