// ==UserScript==
// @name Sankaku Complex Enhancer
// @version 0.1
// @description Adds additional features to SankakuComplex. Includes, infinite scrolling on the results page, option to filter out results with certain tags, automatically sorting results by quality (or other "order:*"), adds buttons next to tags to results page to add them to the current query,
// @author Qwertanon
// @match https://*.sankakucomplex.com/*
// @grant GM_notification
// @namespace https://greasyfork.org/users/13708
// ==/UserScript==
//TODO:
//have Tooltip appear under every image so you can add or subtract char, show or artist
//Get tag description?
//Find a way to modify the search bar. (Replace it?)
//Link to add a new term but turn all other terms into -* except the order term.
//Change fancy tag names to be displayed as common names.
//Ignore implications
//Ignore aliases
//Add tag search bar
//Add sort by new when finished terms
//Problem with correctly detecting finished terms
//===================
//== User Settings ==
//===================
//Resizes the image on post pages to fit inside the window.
var ResizeImage = true;
//Automatically adds the Order:____ tag to all tag links.
var AddOrderTag = true;
//If you are on a results page and the Order tag is not one of the currently searched tags, it will automatically redirect to a new results page with the order tag included.
var AutoRedirect = true;
//Tag to add. I suggest leaving Order alone. If you do want to replace order:quality all together, only replace Order and have OrderTag be "".
var Order = "order%3A";
//How you want the results to be ordered
//Check idol/chan . sankakucomplex.com/wiki/show?title=help:_quick_guide for order:* tags
var OrderTag = "quality";
//Show occasional alerts pertaining to the function of the script.
var Alerts = true;
//Changes the selected option on the tag search page. [Name/Count/Date/Popularity/Quality]
var TagPageOrder = "Count";
//Automatically redirects tag search results pages to include the new order type.
var AutoRedirectTagResults = true;
//If you are on a resutls page and the OptionalFilterTag is in the tagsidebar, it will automatically redirect to a new results page with OptionalFilterTag removed from the results
var OptionalFilter = false;
//Tag to remove if it's found as a popular tag in the results.
var OptionalFilterTag = "";
var OptionalFilterTagIdol = "";
//Array of tags that the user has already looked through completly.
var FinishedTerms = [];
//var FinishedTerms = ["Example1","Example2"];
//===================
if(window.location.href.indexOf("?tags=") != -1){
var CurrentURL = window.location.href.replace("&commit=Search","");
var regex_multipleplus = new RegExp("\\+{2,}", "g");
//replace any occurance of "++", "+++", etc. in the URL with +.
CurrentURL = CurrentURL.replace(regex_multipleplus,"+");
CurrentURL = CurrentURL.replace("%20","+");
//Check to see if the user is logged into the site and set the max amount of tags allowed to be searched.
if(document.getElementById("navbar").childNodes[1].innerHTML.indexOf("My Account") != -1){
var TagAllowence = 9;
}else if (document.getElementById("navbar").childNodes[1].innerHTML.indexOf("login") != -1){
var TagAllowence = 4;
}
TagGrabber();
//Redirects to new results page with the Order tag added if it hasn't been already, the tag allowence hasn't been reached, and the user isn't on a specific page number.
if(AutoRedirect && CurrentURL.indexOf(Order) == -1 && CurrentURL.indexOf("&page=") == -1 && TagArray.length < TagAllowence){
location.assign(CurrentURL + "+" + Order + OrderTag);
}
if(OptionalFilter) OptionalFilterer();
ResultsNumberGrabber();
TitleTrimmer();
TitleRenamer();
ResultsPageTagSideBarEditor();
if(TotalResults > 20){
Pager();
}
InfoBarAdder();
}else if(window.location.href.indexOf("post/show/") != -1){
AdblockFixer();
if(AddOrderTag) PostPageTagSideBarEditor();
if(ResizeImage) ImageResizer();
}else if(window.location.href.indexOf("/wiki/show?title=") != -1){
if(AddOrderTag){
document.getElementsByClassName("title")[0].childNodes[3].href = document.getElementsByClassName("title")[0].childNodes[3].href + "+" + Order + OrderTag;
}
}else if(window.location.href.indexOf("/tag/index?order=") != -1 || window.location.href.indexOf("/tag?commit=Search")){
/* console.log("Current page is a tags page.");
if(AddOrderTag) TagsPageLinkEditor();
TagPageSelectBoxModifier();
if (AutoRedirectTagResults && window.location.href.indexOf(TagPageOrder) == -1){
location.assign(window.location.href.substring(0,window.location.href.indexOf("&order=")+7) + TagPageOrder);
}*/
}
function OptionalFilterer(){
var TagSidebar = document.getElementById("tag-sidebar");
if(window.location.href.indexOf("idol.sankakucomplex.com") !== -1){
if(window.location.href.indexOf(OptionalFilterTagIdol) == -1){
var TagLinks = TagSidebar.querySelectorAll('*[itemprop^="keywords"]');
//var FilterURL = "idol.sankakucomplex.com/?tags=";
for (i = 0; i < TagLinks.length; i++) {
var CurrentIndexTag = TagLinks[i].href.substring(TagLinks[i].href.indexOf("?tags=")+6);
if(CurrentIndexTag == OptionalFilterTagIdol){
if(TagArray.length < TagAllowence){
location.assign(CurrentURL + "+-" + OptionalFilterTagIdol);
}
break;
}
}
}
}else if(window.location.href.indexOf("chan.sankakucomplex.com") !== -1){
if(window.location.href.indexOf(OptionalFilterTag) == -1){
var TagLinks = TagSidebar.querySelectorAll('*[id^="tag_"]');
//var FilterURL = "chan.sankakucomplex.com/?tags=";
for (i = 0; i < TagLinks.length; i++) {
var CurrentIndexTag = TagLinks[i].href.substring(TagLinks[i].href.indexOf("?tags=")+6);
if(CurrentIndexTag == OptionalFilterTag){
if(TagArray.length < TagAllowence){
location.assign(CurrentURL + "+-" + OptionalFilterTag);
}
break;
}
}
}
}
}
function InfoBarAdder(){
var UnderSearchBarElem = document.getElementById("ad_s_e_all");
var EnabledOptionsButton = document.createElement("p");
EnabledOptionsButton.innerHTML = "Enabled Settings [Hover]";
UnderSearchBarElem.appendChild(EnabledOptionsButton);
EnabledOptionsButton.onmouseover=function(){
//GM_notification("AutoRedirect = "+AutoRedirect+"\n"+"AddOrderTag = "+AddOrderTag+"\n"+"Alerts = "+Alerts+"\n"+"OptionalFilter = "+OptionalFilter);
EnabledOptionsButton.innerHTML = "Enabled Settings [Hover]"+"<br>"+"AutoRedirect = "+AutoRedirect+"<br>"+"AddOrderTag = "+AddOrderTag+"<br>"+"Alerts = "+Alerts+"<br>"+"OptionalFilter = "+OptionalFilter;
};
EnabledOptionsButton.onmouseout=function(){
EnabledOptionsButton.innerHTML = "Enabled Settings [Hover]";
}
}
function AdblockFixer(){
var PostContentElem = document.getElementById("post-content");
PostContentElem.style.paddingTop = "0px";
}
function ImageResizer(){
var ImgElem = document.getElementById("image");
ImgElem.style.height = "auto";
ImgElem.style.width = ImgElem.width + "px";
var ImgElemOrigWidth = ImgElem.width;
var SidebarElem = document.getElementsByClassName("sidebar")[0];
if(window.innerWidth - SidebarElem.offsetWidth < ImgElemOrigWidth){
ImgElem.style.width = window.innerWidth - SidebarElem.offsetWidth - 35 + "px";
}
window.addEventListener("resize", function(){
//var ImgElemStyleWidthNoPx = ImgElem.style.width.replace("px","");
//var ImgStyleWidth = parseInt(ImgElemStyleWidthNoPx);
if(window.innerWidth - SidebarElem.offsetWidth <= ImgElemOrigWidth){
ImgElem.style.width = window.innerWidth - SidebarElem.offsetWidth - 35 + "px";
}
}, true);
}
function TagPageSelectBoxModifier(){
var OrderBox = document.getElementById("order");
switch (TagPageOrder) {
case "Name":
OrderBox.selectedIndex = 0;
break;
case "Count":
OrderBox.selectedIndex = 1;
break;
case "Date":
OrderBox.selectedIndex = 2;
break;
case "Popularity":
OrderBox.selectedIndex = 3;
break;
case "Quality":
OrderBox.selectedIndex = 4;
break;
}
}
//Add amount of results viewed out of total results.
function Pager(){
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
this.addEventListener("readystatechange", function() {
if(this.readyState == 1){
ContentElement = document.getElementById("post-list").childNodes[5];
ContentPages = ContentElement.getElementsByClassName("content-page");
var LastPage = parseInt(ContentPages[ContentPages.length - 1].getAttribute("next-page-url").slice(ContentPages[ContentPages.length - 1].getAttribute("next-page-url").indexOf("&page=")+6) - 1);
var PageSeperator = document.createElement("p");
PageSeperator.innerHTML = "<center><b><br>( " + LastPage * 20 + " / " + TotalResults + " )</b><br><br></center>";
var lastpagecontentpage = document.getElementById("content-page-" + LastPage);
lastpagecontentpage.childNodes[lastpagecontentpage.childNodes.length-1].appendChild(PageSeperator);
}
}, false);
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
}
function TagsPageLinkEditor(){
var HighlightableClasses = document.getElementsByClassName("highlightable");
var TagLinks = HighlightableClasses[0].getElementsByTagName('a');
for (i = 0; i < TagLinks.length; i++) {
if(TagLinks[i].href.indexOf("?tags=") != -1){
TagLinks[i].href = TagLinks[i].href + "+" + Order + OrderTag;
}
}
}
function ResultsPageTagSideBarEditor(){
var TagSidebar = document.getElementById("tag-sidebar");
if(window.location.href.indexOf("idol.sankakucomplex.com") !== -1){
var TagLinks = TagSidebar.querySelectorAll('*[itemprop^="keywords"]');
}else if(window.location.href.indexOf("chan.sankakucomplex.com") !== -1){
var TagLinks = TagSidebar.querySelectorAll('*[id^="tag_"]');
}
if(TagArray.length < TagAllowence){
for (i = 0; i < TagLinks.length; i++) {
var AddLink = document.createElement("a");
var AddLinkText = document.createTextNode("+ ");
var MinusLink = document.createElement("a");
var MinusLinkText = document.createTextNode("- ");
var ORLink = document.createElement("a");
var ORLinkText = document.createTextNode("~ ");
AddLink.appendChild(AddLinkText);
MinusLink.appendChild(MinusLinkText);
ORLink.appendChild(ORLinkText);
var CurrentIndexTag = TagLinks[i].href.substring(TagLinks[i].href.indexOf("?tags=")+6);
if(CurrentURL.indexOf(CurrentIndexTag) == -1){
if(CurrentURL.indexOf(Order) == -1){
if(AddOrderTag && TagArray.length < TagAllowence - 1){
TagSidebar.childNodes[i+1].insertBefore(MinusLink,TagSidebar.childNodes[i+1].childNodes[0]);
TagSidebar.childNodes[i+1].insertBefore(AddLink,TagSidebar.childNodes[i+1].childNodes[0]);
TagSidebar.childNodes[i+1].insertBefore(ORLink,TagSidebar.childNodes[i+1].childNodes[0]);
if(AddOrderTag){
AddLink.href = CurrentURL + "+" + CurrentIndexTag + "+" + Order + OrderTag;
AddLink.href = AddLink.href.replace(/\++/g, "+");
MinusLink.href = CurrentURL + "+-" + CurrentIndexTag + "+" + Order + OrderTag;
MinusLink.href = MinusLink.href.replace(/\++/g, "+");
ORLink.href = CurrentURL + "+~" + CurrentIndexTag + "+" + Order + OrderTag;
ORLink.href = ORLink.href.replace(/\++/g, "+");
}else{
AddLink.href = CurrentURL + "+" + CurrentIndexTag;
AddLink.href = AddLink.href.replace(/\++/g, "+");
MinusLink.href = CurrentURL + "+-" + CurrentIndexTag;
MinusLink.href = MinusLink.href.replace(/\++/g, "+");
ORLink.href = CurrentURL + "+~" + CurrentIndexTag;
ORLink.href = ORLink.href.replace(/\++/g, "+");
}
}else{
TagSidebar.childNodes[i+1].insertBefore(MinusLink,TagSidebar.childNodes[i+1].childNodes[0]);
TagSidebar.childNodes[i+1].insertBefore(AddLink,TagSidebar.childNodes[i+1].childNodes[0]);
TagSidebar.childNodes[i+1].insertBefore(ORLink,TagSidebar.childNodes[i+1].childNodes[0]);
AddLink.href = CurrentURL + "+" + CurrentIndexTag;
AddLink.href = AddLink.href.replace(/\++/g, "+");
MinusLink.href = CurrentURL + "+-" + CurrentIndexTag;
MinusLink.href = MinusLink.href.replace(/\++/g, "+");
ORLink.href = CurrentURL + "+~" + CurrentIndexTag;
ORLink.href = ORLink.href.replace(/\++/g, "+");
}
}else{
if(TagArray.length < TagAllowence){
TagSidebar.childNodes[i+1].insertBefore(MinusLink,TagSidebar.childNodes[i+1].childNodes[0]);
TagSidebar.childNodes[i+1].insertBefore(AddLink,TagSidebar.childNodes[i+1].childNodes[0]);
TagSidebar.childNodes[i+1].insertBefore(ORLink,TagSidebar.childNodes[i+1].childNodes[0]);
var NewURL = CurrentURL.replace(Order+OrderTag,"");
AddLink.href = NewURL + "+" + CurrentIndexTag + "+" + Order + OrderTag;
AddLink.href = AddLink.href.replace(/\++/g, "+");
MinusLink.href = NewURL + "+-" + CurrentIndexTag + "+" + Order + OrderTag;
MinusLink.href = MinusLink.href.replace(/\++/g, "+");
ORLink.href = NewURL + "+~" + CurrentIndexTag + "+" + Order + OrderTag;
ORLink.href = ORLink.href.replace(/\++/g, "+");
}
}
}
if(AddOrderTag){
TagLinks[i].href = TagLinks[i].href + "+" + Order + OrderTag;
}
}
}else if(TagArray.length >= TagAllowence && AddOrderTag){
for (i = 0; i < TagLinks.length; i++) {
TagLinks[i].href = TagLinks[i].href + "+" + Order + OrderTag;
}
}
}
//Edits the tag sidebar to add the order tag to all tag links.
function PostPageTagSideBarEditor(){
var TagSidebar = document.getElementById("tag-sidebar");
if(window.location.href.indexOf("idol.sankakucomplex.com") !== -1){
var TagLinks = TagSidebar.querySelectorAll('*[itemprop^="keywords"]');
}else if(window.location.href.indexOf("chan.sankakucomplex.com") !== -1){
var TagLinks = TagSidebar.querySelectorAll('*[id^="tag_"]');
}
for (i = 0; i < TagLinks.length; i++) {
TagLinks[i].href = TagLinks[i].href + "+" + Order + OrderTag;
}
}
//Grabs all the tags in the URL an puts them in an array.
function TagGrabber(){
TagArray = CurrentURL.slice(CurrentURL.indexOf("?tags=")+6).split("+");
if (Alerts && TagArray.length == TagAllowence) GM_notification("Maximum number of tags allowed to be searched has been reached.");
for (var i = 0; i < TagArray.length; i++) {
if (TagArray[i] === FinishedTerms[i]) {
document.getElementById("header").innerHTML = document.getElementById("header").innerHTML+"<center><b><p style='font-size:40px'>TAG ALREADY COMPLETLY SEARCHED.</p></b></center>";
}
}
}
//Grabs the total number of results from the title.
function ResultsNumberGrabber(){
var TitleElement = document.getElementById("site-title");
var TagTypeNoneClasses = TitleElement.getElementsByClassName("tag-type-none");
if(TagTypeNoneClasses.length > 0){
//Grab the number at the end of the title.
var Num = TagTypeNoneClasses[0].title.substring(12);
//Remove any commas that may be in the number and convert it from a string to a integer.
TotalResults = 1*Num.replace(/,/g, "");
return;
}else{
var TagCountClasses = TitleElement.getElementsByClassName("tag-count");
if(TagCountClasses.length == 1){
//Grab the number at the end of the title.
var Num = TagCountClasses[0].title.substring(12);
//Remove any commas that may be in the number and convert it from a string to a integer.
TotalResults = 1*Num.replace(/,/g, "");
return;
}
}
return;
}
function TitleTrimmer(){
if(window.location.href.indexOf("idol.sankakucomplex.com") !== -1){
document.title = document.title.substring(0,document.title.indexOf(' | Idol Complex'));
}else if(window.location.href.indexOf("chan.sankakucomplex.com") !== -1){
document.title = document.title.substring(0,document.title.indexOf(' | Sankaku'));
}
}
//Renames the page title to add the number of results.
function TitleRenamer(){
if(window.location.href.indexOf("&page=") != -1){
var PageNum = 1*window.location.href.substring(window.location.href.indexOf("&page=")+6);
var RemainingPosts = TotalResults - PageNum*20;
if(RemainingPosts > 999){
var TrimmedRemainingPosts = Math.floor(RemainingPosts / 1000);
var TrimmedRemainingPostsString = TrimmedRemainingPosts.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
document.title = "(" + TrimmedRemainingPostsString + "k*)" + " " + document.title;
return;
}else{
var RemainingPostsString = RemainingPosts.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
document.title = "(" + RemainingPostsString + "*)" + " " + document.title;
return;
}
}else{
if(TotalResults > 999){
var TrimmedTotalResults = Math.floor(TotalResults / 1000);
var TrimmedTotalResultsString = TrimmedTotalResults.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
document.title = "(" + TrimmedTotalResultsString + "k)" + " " + document.title;
return;
}else{
var TotalResultsString = TotalResults.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
document.title = "(" + TotalResultsString + ")" + " " + document.title;
return;
}
}
return;
}