Saturday, January 22, 2011

Automatically loads entire SERIES (not just one chapter!) on ONE page. Scroll down to automatically load new chapters! Works on Firefox and Chrome.


// ==UserScript==
// @name           MangaReader Easy Viewing
// @namespace      NoxTox
// @description    Formats MangaReader to view your manga easier
// @include        http://www.mangareader.net/*/*
// ==/UserScript==

if (document.evaluate('//select[@id="pageMenu"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.selectedIndex == 0)
{
var chapters = document.evaluate('//select[@id="chapterMenu"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
var firstIndex = unsafeWindow.document.chapterno;
var currentIndex = firstIndex;
var numPages = document.evaluate('//select[@id="pageMenu"]/option', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null).snapshotLength;
var isrc = document.evaluate('//img[@id="img"]', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.src;
var series = document.evaluate('//h1/a', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
var numLoaded = 0;
var blockLoad = true;
var loadAll = false;
if (isrc.substring(isrc.lastIndexOf("/")+1).indexOf("_") > -1)
{
 var isrc1 = isrc.substring(0, isrc.lastIndexOf("/")+1);
 var isrc2 = isrc.substring(isrc.lastIndexOf("/")+1, isrc.lastIndexOf("_"));
 var isrc3 = isrc.substring(isrc.lastIndexOf("_"));
}
else
{
 var isrc1 = isrc.substring(0, isrc.lastIndexOf("-")+1);
 var isrc2 = isrc.substring(isrc.lastIndexOf("-")+1, isrc.lastIndexOf("."));
 var isrc3 = isrc.substring(isrc.lastIndexOf("."));
}

document.getElementsByTagName("head")[0].innerHTML = "";
document.body.innerHTML = "";
document.title = series.innerHTML.replace("Manga", "") + "@ Mangareader Easy Viewing";

addStyle('body {margin: 0px; text-align:center; background-color:black;} #content {width:'+ (window.innerWidth - 247) +'px; margin-left:230px; color:#AAAAAA;} #menudiv {position:fixed; left:0px; top:0px; height:98%; padding:5px; overflow:hidden; text-align:left;} a {color:red; font-size: 14px} #menudiv a:hover {background-color:red; color:black;} p {color:red; font-weight:bold; margin:0px};');

chapters.style.cssFloat = "none";
chapters.style.width = "230px";
chapters.style.backgroundColor = "black";
chapters.style.color = "red";

d = document.createElement("div");
d.id = "menudiv";

var a1 = document.createElement("a");
a1.href = "/";
a1.innerHTML = "Homepage";
d.appendChild(a1);
d.appendChild(document.createElement("br"));

var a2 = document.createElement("a");
a2.href = series.href;
a2.innerHTML = series.innerHTML + " Series Page";
d.appendChild(a2);
d.appendChild(document.createElement("br"));

d.appendChild(chapters);
d.appendChild(document.createElement("br"));

document.body.appendChild(d);

var contents = document.createElement("div");
contents.id="content";

document.body.appendChild(contents);

unsafeWindow.document.onkeydown = null;
document.addEventListener("keydown", function(e) {
 if (e.keyCode == 32 || e.keyCode == 40) //spacebar, "down"
 {
  var scroller = setInterval("scrollBy(0,25)", 3);
  setTimeout("clearInterval("+scroller+")", 125);
  e.preventDefault();
 }   
 else if (e.keyCode == 38) //"up"
 {
  var scroller = setInterval("scrollBy(0,-25)", 3);
  setTimeout("clearInterval("+scroller+")", 125);
  e.preventDefault();
 }
 else if (e.keyCode == 76) loadAll = !loadAll;
}, false);

var sI = setInterval(function() {
 if (chapters && chapters.childNodes.length > Math.max(currentIndex-2, 0))
 {
  preloadChapter();
  
  if (currentIndex < chapters.length)
   setInterval(function () {
    if (!blockLoad && (document.body.clientHeight-window.pageYOffset-window.innerHeight < 15000 || loadAll || currentIndex == firstIndex) && currentIndex < chapters.length) 
    {
     blockLoad = true;
     loadNextChapter(currentIndex++);
    }
   }, 3000);
  
  clearInterval(sI);
 }
}, 250);

}

//Functions

var rxp1 = /<select id="pageMenu" .+?>((?:\s*<option .+?>[^<]+<\/option>)+\s*)<\/select>/;
var rxp2 = /<img .+? src="(.+?)" .+? \/>/;

function preloadChapter() {
 var aa= document.createElement("a");
 aa.name = currentIndex;
 contents.appendChild(aa);
 var ar = document.createElement("a");
 ar.href = "#" + currentIndex;
 ar.innerHTML = "Chapter " + currentIndex;
 d.appendChild(ar);
 d.appendChild(document.createElement("br"));
 loadPage(0);
}

function loadPage(iter) {
 var imgNode = document.createElement("img");
 imgNode.src = isrc1 + isrc2 + isrc3;
 imgNode.name = isrc2;
 imgNode.addEventListener("error", ierr, false);
 imgNode.addEventListener("load", iload, false);
 var imgPage = document.createElement("p");
 imgPage.innerHTML = "Chapter " + currentIndex;
 imgPage.className = "unpaginated";
 contents.appendChild(imgPage);
 contents.appendChild(imgNode);
 contents.appendChild(document.createElement("hr"));
 isrc2++;
 
 if (numLoaded < numPages && iter < numPages*2 + 10)
 setTimeout(function () {loadPage(++iter);}, 100);
 else {
  if (numLoaded < numPages)
  GM_log("Note: Stopped preloading images based on preset limit. # pages loaded: " + numLoaded + ", # pages expected: " + numPages + ", preset limit: " + iter);
  unBlock();
 }
}

function loadNextChapter(chapterIndex) {
GM_xmlhttpRequest({
 method: 'GET',
 url: chapters.childNodes[chapterIndex].value,
 onload: function(responseDetails) {
 if (responseDetails.status == 200)
 {
  numPages = responseDetails.responseText.match(rxp1)[1].split("<option").length-1;
  isrc = responseDetails.responseText.match(rxp2)[1];

  if (isrc.substring(isrc.lastIndexOf("/")+1).indexOf("_") > -1)
  {
   isrc1 = isrc.substring(0, isrc.lastIndexOf("/")+1);
   isrc2 = isrc.substring(isrc.lastIndexOf("/")+1, isrc.lastIndexOf("_"));
   isrc3 = isrc.substring(isrc.lastIndexOf("_"));
  }
  else
  {
   isrc1 = isrc.substring(0, isrc.lastIndexOf("-")+1);
   isrc2 = isrc.substring(isrc.lastIndexOf("-")+1, isrc.lastIndexOf("."));
   isrc3 = isrc.substring(isrc.lastIndexOf("."));
  }

  preloadChapter();
 }
 else
 {
  GM_log("xmlHttpRequest Loaded, Failed: " + responseDetails.statusText);
  currentIndex--;
 }
 },
 onerror: function(responseDetails) {
  GM_log("xmlHttpRequest Error, Failed: " + responseDetails.statusText);
  currentIndex--;
  blockLoad = false;
     }
});
}

function ierr() {
 this.removeEventListener("error", ierr, false);
 this.removeEventListener("load", iload, false);
 this.parentNode.removeChild(this.nextSibling);
 this.parentNode.removeChild(this.previousSibling);
 this.parentNode.removeChild(this);
};

function iload() {
 numLoaded++;
 this.removeEventListener("error", ierr, false);
 this.removeEventListener("load", iload, false);
}

function unBlock() {
 var unpaginated = document.evaluate('//p[@class="unpaginated"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
 if (unpaginated.snapshotLength > numPages) setTimeout(unBlock, 1000);
 else
 {
  if (numLoaded != numPages) 
   GM_log("Warning: Number of pages loaded (" + numLoaded + ") does not equal number of pages expected (" + numPages + ") for chapter " + currentIndex + ".");
  for (var i=0; i<unpaginated.snapshotLength; i++)
  {
   unpaginated.snapshotItem(i).innerHTML = "Chapter " + currentIndex + " Page " + (i+1) + "/" + numPages;
   unpaginated.snapshotItem(i).className = "";
  }


  if (currentIndex == chapters.length)
   contents.appendChild(document.createTextNode("~End of Series~"));
  else
  {
   numLoaded = 0;
   blockLoad = false;
  }

 }
}

function addStyle(css) {
 var head = document.evaluate('//head', document, null, XPathResult.ANY_UNORDERED_NODE_TYPE, null).singleNodeValue;
 if (!head) return;
 var style = document.createElement('style');
 style.type = 'text/css';
 style.innerHTML = css;
 head.appendChild(style);
}

var SUC_script_num = 84045;
try{function updateCheck(forced){if ((forced) || (parseInt(GM_getValue('SUC_last_update', '0')) + 432000000 <= (new Date().getTime()))){try{GM_xmlhttpRequest({method: 'GET',url: 'http://userscripts.org/scripts/source/'+SUC_script_num+'.meta.js?'+new Date().getTime(),headers: {'Cache-Control': 'no-cache'},onload: function(resp){var local_version, remote_version, rt, script_name;rt=resp.responseText;GM_setValue('SUC_last_update', new Date().getTime()+'');remote_version=parseInt(/@uso:version\s*(.*?)\s*$/m.exec(rt)[1]);local_version=parseInt(GM_getValue('SUC_current_version', '-1'));if(local_version!=-1){script_name = (/@name\s*(.*?)\s*$/m.exec(rt))[1];GM_setValue('SUC_target_script_name', script_name);if (remote_version > local_version){if(confirm('There is an update available for the Greasemonkey script "'+script_name+'."\nWould you like to go to the install page now?')){GM_openInTab('http://userscripts.org/scripts/show/'+SUC_script_num);GM_setValue('SUC_current_version', remote_version);}}else if (forced)alert('No update is available for "'+script_name+'."');}else GM_setValue('SUC_current_version', remote_version+'');}});}catch (err){if (forced)alert('An error occurred while checking for updates:\n'+err);}}}GM_registerMenuCommand(GM_getValue('SUC_target_script_name', '???') + ' - Manual Update Check', function(){updateCheck(true);});updateCheck(false);}catch(err){};

0 comments:

Post a Comment