Attempts to clear up unwanted items in your ebay search results
// ==UserScript==
// @name ebay Country Filter
// @namespace https://greasyfork.org/
// @version 0.4.33
// @description Attempts to clear up unwanted items in your ebay search results
// @author Schabernack
// @match http://www.ebay.com/sch/*
// @match https://www.ebay.com/sch/*
// @grant none
// @noframes
// ==/UserScript==
/*
ebay Country Filter
Attempts to clear up unwanted items in your ebay search results
by hiding items being sold from certain countries
A work in progress
*/
(function() {
//print various debugging info, slightly more convienient than using the console sometimes
var DEBUGON = false;
var totalHidden = 0;
var countriesList = JSON.parse(localStorage.getItem("ecfCountriesList"));
//localstorage ecfEnabled is a STRING. Need to convert it to a boolean
var enabled = localStorage.getItem("ecfEnabled") === "true";
if (DEBUGON) {
console.log("\ninitial storage values");
console.log("ecfEnabled: ", enabled);
console.log("ecfCountriesList:", countriesList);
}
//if getItem returns null then this is the first time the script it being used
if (countriesList === null) {
countriesList = [];
}
if (DEBUGON) {
console.log("\nafter storage values");
console.log("ecfEnabled: ", enabled);
console.log("ecfCountriesList:", countriesList);
}
//insert the markup into the sidebar with the other default filters
//the html here is complicated mostly because I wanted to keep the same aesthetics
//and structure as the rest of the page
//important so this plays nicely with other ebay userscripts
var enableText = `
<div id='ecf_controls'>
<div class='asp asp-left-nav'>
<div class='pnl-h'>
<h3>Country Filter - Enable</h3>
<div class='pnl-b pad-bottom'>
<div class='cbx'>
<span>
<input type='checkbox' name='ecf_enable' id='ecf_enable'
value='enable' class='cbx' ${enabled ? "checked" : ""} />
<label for='ecf_enable'><span class='cbx'>Enabled</span></label>
</span>
</div>
</div>
</div>
</div>
</div>
<div id='ecf_countries' style='display: ${enabled ? "block" : "none"}'>
<div class='asp'>
<div class='pnl-h'>
<h3>Country Filter - List</h3>
<div class='pnl-b pad-bottom'>
<div id='ecf_countries_list'></div>
<div class='cbx'>
<span class='cbx'>
<a id='ecf_add'>Add New Country</a>
</span>
</div>
<a id='ecf_apply'><input class='submit-btn submit' type='button' value="Apply Changes"></a>
</div>
</div>
</div>
</div>`;
//insert the markup into the sidebar
//sometimes ebay's markup changes and I can't figure out why (layout looks identical)
//the two common sidebar containers are left rail and #LeftNavContainer
var sidebarContainer =
$("#LeftNavContainer").length > 0
? $("#LeftNavContainer")
: $(".srp-rail__left").eq(0);
sidebarContainer.prepend(enableText);
//display the list of country list checkboxes
if (countriesList.length !== 0) {
countriesList.forEach(function(country) {
printCountry(country);
});
}
if (enabled) {
var countriesListText = countriesList.join("|");
//if the list of countries is empty or the user only added empty strings as countries
if (countriesListText !== "") {
var regex = new RegExp(
"(?:From )(?:" + countriesList.join("|") + ")",
"i"
);
//go through each item li on the page and hide it if it's from an unwanted country
var itemList =
$("li.sresult").length > 0 ? $("li.sresult") : $("li.s-item");
itemList.each(function(index, obj) {
//the "From: <country> text"
var locText = obj.textContent.trim();
if (regex.test(locText)) {
//add wrapper and expand button
obj.innerHTML =
"<div class='ecf_expander'>[+] Hidden - Click to expand</div><div class='ecf_wrapper'>" +
obj.innerHTML +
"</div>";
$(this).addClass("ecf_hidden");
totalHidden++;
}
});
}
}
if (DEBUGON) {
console.log("Total Hidden: " + totalHidden + "\n");
}
//To do: display the total items hidden somewhere
//maybe underneath the total found? or with the rest of the userscripts controls?
stylesheetInit();
/* *** Functions and events *** */
/*
adds country to master list and updates local storage
@return true The country given is valid and could be added
@return false The country given is empty/spaces
*/
var addCountry = function(country) {
country = country.trim();
//if user entered an empty string or a bunch of spaces, ignore it
if (country === "") {
return false;
}
countriesList.push(country);
localStorage.setItem("ecfCountriesList", JSON.stringify(countriesList));
if (DEBUGON) {
console.log("new country list: ", countriesList);
}
return true;
};
/*
removes country from master list and updates local storage
*/
var removeCountry = function(country) {
var index = countriesList.indexOf(country);
countriesList.splice(index, 1);
if (DEBUGON) {
console.log("new country list: ", countriesList);
}
localStorage.setItem("ecfCountriesList", JSON.stringify(countriesList));
};
/*
displays a given country in a checkbox on the page
*/
function printCountry(country) {
var valStripped = country.replace(" ", "");
$("#ecf_countries_list").append(`
<div class='cbx'>
<span>
<input type='checkbox' name='ecf_${valStripped}'
id='ecf_${valStripped}' value='${country}'
class='cbx ecf_country_checkbox' checked />
<label for='ecf_${valStripped}'>
<span class='cbx'>${country}</span>
</label>
</span>
</div>`);
}
/*
clicking on the "Add Country" link will prompt the user for a country
*/
$("#ecf_add").on("click", function() {
var val = prompt("Enter country name");
//attempt to add country to list and display it if it's valid
if (addCountry(val)) {
printCountry(val);
}
});
/*
clicking on a filtered item will show/hide it
*/
var resultContainer =
$("#Results").length > 0 ? $("#Results") : $(".srp-main");
resultContainer.on("click", ".ecf_expander", function() {
$(this)
.next()
.slideToggle(550, "swing");
});
/*
checking enable checkbox will show the list of countries div
unchecking it will hide it
also updates local storage
*/
$(document).on("change", "#ecf_enable", function() {
if (DEBUGON) {
console.log("ecfEnabled: " + localStorage.getItem("ecfEnabled"));
}
if (enabled == true) {
enabled = false;
localStorage.setItem("ecfEnabled", false);
$("#ecf_countries").hide();
//hide the country filter - list div
} else {
enabled = true;
localStorage.setItem("ecfEnabled", true);
$("#ecf_countries").show();
//show the country filter - list div
}
if (DEBUGON) {
console.log("ecfEnabled: " + localStorage.getItem("ecfEnabled"));
}
});
/*
reload the page so the user's settings will take effect
*/
$("#ecf_apply").on("click", function() {
location.reload();
});
/*
unchecking a country checkbox will remove that country from the master list
the checkbox will also get removed from the page as well
*/
$("#ecf_countries_list").on("click", ".ecf_country_checkbox", function() {
var country = $(this).val();
if (DEBUGON) {
console.log(country);
}
removeCountry(country);
$(this)
.parent()
.parent()
.remove(); //structure: <div><span><input /> ...
});
/*
add a new stylesheet to the page and set it up with our styles
*/
function stylesheetInit() {
var sheet = (function() {
var style = document.createElement("style");
//for webkit
style.appendChild(document.createTextNode(""));
document.head.appendChild(style);
return style.sheet;
})();
sheet.insertRule(
".ecf_wrapper { background: #333333; border: 5px solid brown; overflow: auto }",
0
);
sheet.insertRule(
".ecf_expander { cursor: pointer; height: 1.5em; line-height: 1.5em; color: #555; background-color: #fafafa; }",
0
);
sheet.insertRule(
".ecf_hidden .ecf_wrapper { background: #cccccc; display: none; }",
0
);
sheet.insertRule("#ecf_controls { margin-bottom:5px; }", 0);
sheet.insertRule("#ecf_add { display:block; margin-top: 6px; }", 0);
sheet.insertRule(
"#ecf_apply { display:block; margin-top: 15px;color:#333333; }",
0
);
sheet.insertRule("#ecf_apply input { display:block; width:auto; }", 0);
}
})();