NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Overdrive Libraries // @namespace http://home.comcast.net/~mailerdaemon // @include https://*.libraryreserve.com/*/SignIn.htm* // @include * // @version 1.0 // ==/UserScript== var server = document.location.host; var page; //http://digitallibrary.delcolibraries.org/1BC4F70D-19D8-4384-BF95-472FEE9144FE/10/374/en/ContentDetails.htm?ID={0889499B-ECE8-41DF-A725-258B93037B2C} //http://search.overdrive.com/TitleInfo.asp?TitleReserveID={0889499B-ECE8-41DF-A725-258B93037B2C}&TitleFormatID=25 //TitleFormatID // 25 - OverDrive WMA Audiobook // 30 - OverDrive Music // 35 - OverDrive Video // 40 - OverDrive Video (mobile) // 50 - Adobe PDF eBook // 410 - Adobe EPUB eBook // 425 - OverDrive MP3 Audiobook // 900 - Mobipocket eBook var domains = { values:null, setup:function(){ if(this.values == null) { var me = this.values = {}; var stored = GM_getValue("domains", ""); if(stored) stored.split("/").forEach(function(f){ me[f]=true;}); } }, prod:function(host, bool){ this.setup(); if(bool === true || bool === false) { this.values[host] = bool; var me = this.values; var out = ""; var next = function(f){return "/" + f;} var first = function(f){go = next; return f;} var go = first; for(var a in me) if(me[a] === true) out += go(a); GM_setValue("domains", out); return bool; } else return (this.values[host] === true); } }; if(/^search\.overdrive\.com$/.test(server)) { GM_addStyle("a.subscribed {background-color: rgba(0,255,0, 0.5);} a.not-subscribed {background-color: rgba(255,0,0, 0.25);}"); Array.forEach(document.links, function(a){ switch(domains.values[a.host]) { case true: a.className += " subscribed"; break; case false: a.className += " not-subscribed"; break; } }); } else { if(/^secure\d+\.libraryreserve\.com$/.test(server)) {//it could be a config page ^_^ rConfig = /^\/(([^\/]+)\/[0-9A-Fa-f]{8}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{4}-[0-9A-Fa-f]{12}\/\d+\/\d+\/en\/)([^.]+)\.htm$/ if(m = rConfig.exec(document.location.pathname)) { server = m[2]; page = m[4]; if(m[3] == "SignIn") { var checkbox = document.createElement("input"); { var form = Array.filter(document.forms, function(f){return f.getAttribute("action") == "BANGAuthenticate.dll";})[0]; var submit = Array.filter(form.elements, function(f){return f.type == "submit";})[0]; var row = GetParentNodeByTag(submit, "tr"); var tr = document.createElement("tr"); tr.appendChild(document.createElement("td")); tr.appendChild(document.createElement("td")); var td = tr.appendChild(document.createElement("td")); var label = td.appendChild(document.createElement("label")); label.appendChild(checkbox); label.htmlFor = checkbox.id = "add"; label.appendChild(document.createTextNode(" Include this library")); checkbox.type="checkbox"; checkbox.checked = domains.prod(server); insertAfter(tr, row); } addEvent(checkbox, "click", function(event){ domains.prod(server, this.checked); GM_setValue(server, m[1]); }); } } } if(domains.prod(server)) { var node = { ContentDetails:function(){ $Z("//tr[td[text()='Release date:\xa0\xa0']]", function(r,i,p){ var tr = document.createElement("tr"); tr.vAlign="top"; var title = tr.appendChild(document.createElement("td")); title.appendChild(document.createTextNode("Other libraries:\x0a\x0a")); var td = tr.appendChild(document.createElement("td")); { var id = document.location.search.match(/(?:^\?ID=|&ID=)([^&]+)/)[1]; var szFormatType = $X("../script[contains(text(), 'szFormatType')]", r).textContent.match(/szFormatType = "([^"]*)"/)[1]; var a = td.appendChild(document.createElement("a")); a.href = "http://search.overdrive.com/TitleInfo.asp?TitleReserveID="+id+"&TitleFormatID="+szFormatType; a.appendChild(document.createTextNode("search.overdrive.com")); td.appendChild(document.createElement("br")); } //var next = false; //log(domains); for(var d in domains.values) { if((d != server) && (p = GM_getValue(d, ""))) { var a = td.appendChild(document.createElement("a")); a.href = "http://"+p + "ContentDetails.htm"+document.location.search; a.appendChild(document.createTextNode(d)); td.appendChild(document.createElement("br")); // next = true; } } //if(next) insertAfter(tr, r); }); }, } if(!page) page = /\/([^.\/]+)\.htm$/.exec(document.location.pathname)[1]; if(typeof(node[page]) == "function") node[page](); //log(page); } } function $X(_xpath, node){return document.evaluate(_xpath, node?node:document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null).snapshotItem(0);} function $Y(_xpath, node){return document.evaluate(_xpath, node?node:document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);} function $Z(_xpath, func, node, payload, j){ var res = document.evaluate(_xpath, node?node:document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); var i; if(j == null) j = 0; for (i = j = 0; link = res.snapshotItem(i); ++i) j += func(link, i, payload); return j; } function GetParentNodeByTag(child, tag, bad) { tag = tag.toUpperCase(); while((child = child.parentNode) && child.tagName != tag); return child?child:bad; } function insertAfter(insert, after){return after.parentNode.insertBefore(insert, after.nextSibling);} function insertBefore(insert, before){return before.parentNode.insertBefore(insert, before);} function addEvent( obj, type, fn, capture ) { obj.addEventListener( type, fn, capture?capture:false ); } function removeEvent( obj, type, fn, capture ) { obj.removeEventListener( type, fn, capture?capture:false ); } function getFirstNonTextChild(obj){ if(obj.firstChild.nodeName != "#text") return obj.firstChild; return getNextNonTextSibling(obj.firstChild); } function getNextNonTextSibling(obj){ while((obj=obj.nextSibling) && (obj.nodeName == "#text")); return obj; } function log(){ var arg; switch(arguments.length) { case 1: arg = arguments[0]; break; case 0: arg = null; break; default: arg = arguments; break; } if(JSON && JSON.stringify) arg = JSON.stringify(arg); if(typeof(unsafeWindow.console) != "undefined" && typeof(unsafeWindow.console.log) != "undefined") unsafeWindow.console.log(arg); else if(typeof(GM_log) != "undefined") GM_log(arg); return arg; }