Allows navigation to next picture (chronologically) on The Escapist webcomics
- // ==UserScript==
- // @name Escapist webcomics viewer
- // @namespace None
- // @description Allows navigation to next picture (chronologically) on The Escapist webcomics
- // @require https://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js
- // @include /^http://www\.escapistmagazine\.com/articles/view/comicsandcosplay/comics/.*/.*$/
- // @grant none
- // @author iceman94
- // @version 0.01
- // @copyright 2015+, iceman94
- // ==/UserScript==
- //=======================================================================================================
- // Cross-browsers load function
- // Tests in this order :
- // -support for jQuery API
- // |-uses $(window).load method if available
- // |-uses $(window).ready method if available
- // -support for DOMContentLoaded event (compatible only with the following browsers :
- // Chrome >= 0.2; Firefox >= 1.0; IE >= 9.0; Opera >= 9.0; Safari >= 3.1)
- // -support for document.attachEvent
- // -uses setTimeout w/ 5000ms delay
- //=======================================================================================================
- function XBLoad (func, verbose)
- {
- verbose = verbose || false;
- if (window.jQuery)
- {
- if ($(window).load)
- {
- if (verbose == true) { console.log('Javascript loaded using $(window).load method'); };
- return $(window).load(function() { func(); });
- }
- else if ($(window).ready)
- {
- if (verbose == true) { console.log('Javascript loaded using $(window).ready method'); };
- return $(window).ready(function() { func(); });
- };
- }
- else if (document.addEventListener)
- {
- if (verbose == true) { console.log('Javascript loaded using document.addEventListener method'); };
- document.addEventListener('DOMContentLoaded', function(event)
- {
- return func();
- });
- }
- else if (document.attachEvent)
- {
- if (verbose == true) { console.log('Javascript loaded using document.attachEvent method'); };
- document.attachEvent('load', function()
- {
- return func();
- });
- }
- else
- {
- if (verbose == true) { console.log('Javascript loaded using setTimeout method'); };
- return setTimeout(function() { func(); }, 5000);
- };
- };
- //=======================================================================================================
- // Miscellaneous functions
- //=======================================================================================================
- // Function to search a string in an array and, if it matches, returns the according string
- function searchStringInArray (str, strArray)
- {
- for (var j=0; j<strArray.length; j++) {
- if (strArray[j].match(str)) return strArray[j];
- }
- return -1;
- };
- // Locates field to be modified by its ID, Tag or Class and sets its CSS (optional)
- function locateTgt (tgtType, tgtVal, tgtCSS, tgtIdx)
- {
- tgtType = tgtType || 'id';
- tgtVal = tgtVal;
- tgtCSS = tgtCSS || '';
- tgtIdx = tgtIdx || '';
- switch (tgtType)
- {
- case 'id':
- var tgt = document.getElementById(tgtVal);
- break;
- case 'tag' :
- var tgt = document.getElementsByTagName(tgtVal)[tgtIdx];
- break;
- case 'class':
- var tgt = document.getElementsByClassName(tgtVal)[tgtIdx];
- break;
- };
- if (tgtCSS !== '')
- {
- setAttr(tgt, 'style', tgtCSS);
- };
- return tgt;
- };
- // Locates main picture (i.e. comic picture) in a collection of images based on its 'src' attribute
- function locatePic (rgx)
- {
- var imgColl = document.getElementsByTagName('img');
- for(var i=0; i<imgColl.length; i++)
- {
- if(imgColl[i] && imgColl[i].src.match(rgx) && imgColl[i].height > 120)
- {
- return imgColl[i];
- };
- };
- }
- // Converts base64 code to HTMLImageElement ('<img>' node)
- function base64ToImage (b64Code, nodeId)
- {
- nodeId = nodeId || '';
- var image = new Image();
- image.src = b64Code;
- image.id = nodeId;
- return image;
- }
- //=======================================================================================================
- // Allows navigation to next picture as specified by the 'Next' node
- // on any comic page just by clicking on the main picture
- //=======================================================================================================
- function showtime ()
- {
- //Arrow pointer converted to base64
- //Src : https://openclipart.org/image/36px/svg_to_png/191324/cyberscooty-fleche-verte.png
- var picB64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAYCAMAAAClZq98AAAACXBIWXMAAAsTAAALEwEAmpwYAAABI1BMVEUAAAAzgAA5cQA2eQA1dQszego5cQk3dgk1cgk3dQc1ggY9egY7gQQ/gQQ8gwQ9gQRAhgdAhQY7gQg/hghCjQU+hQdAiAdBhglAiQhBighDjAlCigdBighBiwhBiQdBiwdBjAdCjAdDjAdAhwdBiwhCiwZCiAdCiQdBiQdDjgdHlAhJlwhJlwlHlghHlghHlghLnghMoQhFkQhMoAlRpgpPpglPqAlVqxBcshdSrwlXuApXuApjvxdvxStavwpexgttziCE1kFhzAthzQtk0wxm1wxn2Qxo2wxv3RZx3Rtz2iCB4TSC2D+I4EGM202O5EqQ5EyQ5U2T3VmV5FWX5lia512b32We6GOe6GSf6GWg6Gav7H6+8Je/8JjJ8qjO87D////03ckAAAAAQ3RSTlMAChITGBkbHB0lKy5BQURHTFhfYWVvb3Z7hZWbpKmtra2tr7PDyM7S1NnZ2trb3ODg4OHh4+Xl5ufr8PHz9fb7/P3+7RRtNQAAAAFiS0dEYMW3fBAAAAD###RBVCjPjdPVDgIxEEDR4u7u7u6ui7u7/P9fsMACISk73LdJTtKknSKESyVEcI6YHEb2UV4PItvmWrFAyLq4Xho+3ntm8TG5JufzaRmWvZAnhCkxPpKtczoKRbb7V7tP+8O9VdlModn8d9O6l/1AQ9oGQfEd9enrpTUk6kIVjX+gjBpEnagEPK7p5yAIVZ3Pe6IzBQP1LBFMqfbDxBXUszC5mFwESVoBEf2qkKjmZiAIlUzg0hFZLbi+1qQU/ghKwdd4A8oUdYndVNudAAAAAElFTkSuQmCC';
- // Creates hidden node w/ mouse cursor picture converted from base64 to remove external dependencies
- var hiddenDiv = base64ToImage(picB64);
- // Regex to match main picture node 'src'
- var rgx = /^.*\/media\/global\/images\/library\/.*(jpg|png|gif)$/;
- // Locates 'Next' node
- var next = locateTgt('class', 'folder_nav_next', null, '0');
- // Locates main picture node
- var pic = locatePic(rgx);
- if (next && next.href && pic && pic.src && pic.src.match(rgx))
- {
- pic.style.cursor = "url('" + hiddenDiv.src + "'), auto";
- pic.setAttribute('onclick', "javascript:window.location='" + next.href + "';");
- // Makes sure there is no event or link for parent node
- if (pic.parentNode && pic.parentNode.onclick)
- {
- pic.parentNode.removeAttribute('onclick');
- };
- if (pic.parentNode && pic.parentNode.href)
- {
- pic.parentNode.removeAttribute('href');
- };
- };
- };
- //=======================================================================================================
- // Showtime !
- //=======================================================================================================
- XBLoad(showtime);