NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Furaffinity Enhanced // @namespace http://codingtoby.com // @version 0.4.0.3 // @description Adds new features, fixes bugs, and more! // @author Toby // @include http://www.furaffinity.net/* // @include https://www.furaffinity.net/* // @require http://js.codingtoby.com/tusl.js?updated=00006 // @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js // @require https://cdnjs.cloudflare.com/ajax/libs/velocity/1.2.3/velocity.min.js // @grant GM_getValue // @grant GM_setValue // @grant GM_deleteValue // ==/UserScript== (function (w, $) { // FAE Proper var FAE = { name : GM_info["script"]["name"], version : GM_info["script"]["version"], myLocation: w.location.href, on : {}, fn : {}, user : {}, status : {}, site : {} }; FAE.site = { baseURL: FAE.myLocation.split(".net")[0] + ".net", view : {prefix: "/view/"}, search : {prefix: "/search/"} }; var fae_styles = ""; for (var key in FAE.site) { if (FAE.site.hasOwnProperty(key)) { var obj = FAE.site[key]; for (var prop in obj) { if (obj.hasOwnProperty(prop)) { // Create Full URLs. obj["url"] = FAE.site.baseURL + obj[prop]; // Perform location checking. if (obj["prefix"]) { if (RegExp(FAE.site.baseURL + obj["prefix"] + "*").exec(FAE.myLocation)) { FAE.on[key] = true; } else { FAE.on[key] = false; } } } } } } FAE.fn = { scrollToPic : function() { var scrollTo = $(".maintable").position().top; scrollTo -= 5; $('html, body').animate({scrollTop: scrollTo}, 0); }, gdocStories : function() { var gdocBase = "https://docs.google.com/viewer?url="; var api = "http://faexport.boothale.net/submission/"; var temp = FAE.myLocation; var thisID = temp.replace(FAE.site.view.url,""); thisID = thisID.replace("/",""); var apiURL = api + thisID + ".json"; var test = $("td:contains('Submission information')").find("b:contains('Category')"); var category = $(test[0]).prop("nextSibling").data; category = category.trim(); if(category == "Story") { var dlURL = $("a:contains('Download')").attr("href"); dlURL = "http:" + dlURL; var eDU = encodeURI(dlURL); var viewURL = gdocBase + eDU; $("a:contains('Download')").after(' | <a target="_blank" href="'+viewURL+'">GDocs</a>'); } }, responsivePic : function() { $("table[width*='%']").each(function() { var thisWidth = $(this).attr("width"); $(this).removeAttr("width"); $(this).css("width",thisWidth); }); var winH = $(window).height(); var mt = $(".maintable")[0]; $("#submissionImg").before("<div id='fae_responsiveSubContainer'></div>"); var temp = $("#submissionImg").prop("outerHTML"); $("#submissionImg").remove(); var mtW = $("#page-submission").width(); $("#fae_responsiveSubContainer").append(temp); var actualType = $("#submissionImg").prop("nodeName"); if(actualType == "IMG") { var imgW = $("#submissionImg").width(); var responsiveImgWidth = mtW - 10; fae_styles += " .fae_responsiveSub { width: 100%; height: auto; box-sizing: border-box; } "; $("#fae_responsiveSubContainer").css("width",responsiveImgWidth); if(imgW >= mtW) { $("#submissionImg").addClass("fae_responsiveSub"); $("#submissionImg").removeAttr("onclick"); $("#submissionImg").click(function() { $("#submissionImg").toggleClass("fae_responsiveSub"); }); $(w).resize(function() { $("#submissionImg").hide(); var mtW = $("#page-submission").width(); $("#submissionImg").show(); var responsiveImgWidth = mtW - 10; $("#fae_responsiveSubContainer").css("width",responsiveImgWidth); console.log("window resized"); }); } } else if(actualType == "SPAN") { var objW = $("object").width(); var objH = $("object").height(); var objOriginalW = objW; var objOriginalH = objH; var responsiveObjWidth = ""; var responsiveObjHeight = ""; var useScale = false; var scrollTo = $("object").position().top; scrollTo -= 5; $('html, body').animate({scrollTop: scrollTo}, 0); function findScale() { objW = $("object").width(); objH = $("object").height(); winH = $(window).height(); mtW = $("#page-submission").width(); if((objW >= mtW) && (objH < winH)) { responsiveObjWidth = mtW - 10; var objWdiff = responsiveObjWidth / objW; responsiveObjHeight = objWdiff * objH; useScale = objWdiff; } else if((objH >= winH) && (objW < mtW)) { var reduceH = objH - winH; responsiveObjHeight = (objH - reduceH) - 10; var objHdiff = responsiveObjHeight / objH; responsiveObjWidth = (objHdiff * objW); $("#fae_responsiveSubContainer").css("width",responsiveObjWidth); $("#fae_responsiveSubContainer").css("height",responsiveObjHeight); useScale = objHdiff; } else if ((objH >= winH) && (objW >= mtW)) { var reduceH = objH - winH; var reduceW = objW - mtW; var newObjH = objH - reduceH; var newObjW = objW - reduceW; var scaleH = newObjH / objH; var scaleW = newObjW / objW; if(scaleH < scaleW) { responsiveObjWidth = (objW * scaleH) - 10; responsiveObjHeight = (objH * scaleH) - 10; useScale = scaleH; } else { responsiveObjWidth = objW * scaleW; responsiveObjHeight = objH * scaleW; useScale = scaleW; } } } function makeAdjustments() { findScale(); if(useScale) { $("object").attr("width",responsiveObjWidth); $("object").attr("height",responsiveObjHeight); } } makeAdjustments(); $(w).resize(function() { $("object").attr("width",objOriginalW); $("object").attr("height",objOriginalH); makeAdjustments(); }); } }, instaFav : function () { $(document).ready(function () { var addText = "+Add to Favorites"; var remText = "-Remove from Favorites"; var addFavLink = $("a:contains('" + addText + "')")[0]; var remFavLink = $("a:contains('" + remText + "')")[0]; var thisLink = ""; var linkURL = ""; var currentText = ""; if ((typeof addFavLink !== "undefined") && (typeof remFavLink !== "undefined")) { console.log("No link."); } else { if (typeof addFavLink !== "undefined") { thisLink = $("a:contains('" + addText + "')")[0]; linkURL = FAE.site.baseURL + $(addFavLink).attr("href"); currentText = addText; } if (typeof remFavLink !== "undefined") { thisLink = $("a:contains('" + remText + "')")[0]; linkURL = FAE.site.baseURL + $(remFavLink).attr("href"); currentText = remText; } $(thisLink).attr("href", "javascript:;"); $(thisLink).click(function () { toggleLink(thisLink, linkURL); }); } function gotoLink(linkURL) { var dfd = jQuery.Deferred(); $.ajax( { method : "GET", url : linkURL, success: function (data) { dataType: 'html', dfd.resolve(); }, error : function () { alert("Error faving."); } }); return dfd.promise(); } function toggleLink(thisLink, linkURL) { $.when(gotoLink(linkURL)).then(function () { if (currentText == addText) { currentText = remText; } else { currentText = addText; } $(thisLink).text(currentText); console.log("Success."); }); } }); }, betterSearch: function () { $(document).ready(function () { $("#search-form").prop("method", "GET"); $("select[name='perpage']").val("72"); $("input[type='submit']").each(function() { $(this).attr("type","button"); }); function fae_search() { $("input[type='checkbox']").each(function() { if(!$(this).prop("checked")) { $(this).after('<input type="hidden" name="'+$(this).attr("name")+'" value="0">'); } }); $("#search-form").submit(); } $("input[name='do_search']").click(function() { fae_search(); }); $("#q").keydown(function(e) { if(e.which == 13) { fae_search(); } }); $("input[name='next_page']").click(function() { var page = w.location.search.substr(1).split("&")[1]; curPage = page.replace("page=",""); curPage = parseInt(curPage); var nextPage = curPage+1; var newPage = "page="+nextPage; var loc = FAE.myLocation; var nextPageURL = loc.replace(page,newPage); w.location.href = nextPageURL; }); }); if (FAE.site.search.url == FAE.myLocation) { $(document).ready(function () { $("#button-extended").click(); var scrollTo = $(".maintable").position().top; scrollTo -= 5; $('html, body').animate({scrollTop: scrollTo}, 0); $("select[name='order-by']").val("popularity"); }); } else { $(document).ready(function () { var nextPageButtons = $("input[name='next_page']"); $(nextPageButtons[0]).attr("id", "nextPageTOP"); $(nextPageButtons[1]).attr("id", "nextPageBOT"); $("#search-results").find("a").each(function () { var thisLinkURL = $(this).attr("href"); var thisID = thisLinkURL.replace("/view/",""); thisID = thisID.replace("/",""); $(this).attr("id", thisID); var sro = JSON.stringify({id: "sid_"+thisID}); $(this).click(function (e) { e.preventDefault(); history.replaceState(sro,$("title"),FAE.myLocation); w.location.href = $(this).attr("href"); }); }); var searchPage = parseInt($("#page").val()); var sr = $("legend:contains('Search results')").text(); numResults = sr.split("of ")[1]; numResults = numResults.split(")")[0]; var numResults = parseInt(numResults); //console.log("Results: " + numResults); var pages = numResults / 72; pages = Math.ceil(pages); //console.log("Pages: " + pages); $("#page").after(" / <input type='text' size='3' class='textbox' disabled value='"+pages+"'> "); (function () { $("input[name='do_search']").click(function() { var sro = JSON.stringify({ id : "search-results" }); history.replaceState(sro,$("title"),FAE.myLocation); }); if($("#nextPageTOP").val() != ">>> 72 more >>>") { var curPage = parseInt($("#page").val()); var resultsLeft = numResults - (curPage * 72); var newVal = ">>> " + resultsLeft + " more >>>"; $("#nextPageTOP").val(newVal); $("#nextPageBOT").val(newVal); } $("#nextPageTOP").click(function () { var sro = JSON.stringify({ id : "nextPageTOP" }); history.replaceState(sro,$("title"),FAE.myLocation); }); $("#nextPageBOT").click(function () { var sro = JSON.stringify({ id : "nextPageBOT" }); history.replaceState(sro,$("title"),FAE.myLocation); }); })(); if(history.state) { var hs = JSON.parse(history.state); var id = hs.id; var scrollTo = $("#" + id).position().top; $('html, body').animate({scrollTop: scrollTo}, 0); if(id.indexOf("sid_") != -1) { $("#" + id).css("background-color","#2e3b41"); $("#" + id) .velocity({backgroundColor: "#4F5F67"}) .velocity({backgroundColor: "#2e3b41"}) .velocity({backgroundColor: "#4F5F67"}) .velocity({backgroundColor: "#2e3b41"}); } } else { var scrollTo = $("#search-results").position().top; scrollTo -= 5; $('html, body').animate({scrollTop: scrollTo}, 0); } var query = w.location.search.substr(1).split("&")[0]; query = query.replace("q=", ""); query = tusl.replaceAll(query, "+", " "); query = tusl.replaceAll(query, "%2B", "+"); $("#q").val(query); }); } } }; FAE.init = function() { $(document).ready(function() { $("head").append("<style id='fae_styles'>"+fae_styles+"</style>"); }); if (FAE.on.view) { FAE.fn.instaFav(); FAE.fn.scrollToPic(); FAE.fn.responsivePic(); FAE.fn.gdocStories(); } else if (FAE.on.search) { FAE.fn.betterSearch(); } }; var tempLoc = w.location.href; if(tempLoc.indexOf("furaffinity.net") != -1) { FAE.init(); } })(window, this.jQuery);