NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name Numeric Grades // @namespace popmundo // @include http://*.popmundo.com/* // @grant GM_log // @grant GM_getValue // @grant GM_setValue // @grant GM_openInTab // @grant GM_xmlhttpRequest // @version 4.9 // ==/UserScript== /* x = name && name[1] TO DO LIST */ var multiline = function (fn) { var reCommentContents = /\/\*!?(?:\@preserve)?[ \t]*(?:\r\n|\n)([\s\S]*?)(?:\r\n|\n)\s*\*\//; var match = reCommentContents.exec(fn.toString()); return match[1]; }; var NG = { utils: { toArray: function (t) { var arr = []; for (var i = 0; i < t.length; i++) arr.push(t[i]); return arr; }, injectCSS: function (css) { if (css.length < 1) return; var heads = document.getElementsByTagName("head"); if (heads.length > 0) { var node = document.createElement("style"); node.type = "text/css"; node.appendChild(document.createTextNode(css)); heads[0].appendChild(node); } } }, features: { /* name: { init: function => main function exec: function => function to be called upon DOM change options: { enabled => on/off. generates checkbox on UI text => UI menu item text tab => UI menu tab selected => selected from optionList. generatex select on UI path => REGEX match for document.location.pathname help => help url listen => call exec() on DOM change }, optionList: { item: { name: "dropdown name", ... } item: } }*/ progressBars: { init: function () { NG.utils.injectCSS('.PPM2_Numeric_Grades_Bar { color: #000; line-height: 8px; font-size: 9px; font-weight: normal; font-family: "Tahome, Geneva, sans-serif", display: inline; width: 0px; }'); this.exec(document.getElementById('wrapper')); }, exec: function (c) { if (!c || !c.tagName || c.tagName == 'BODY') { return } var a, b, d, e, i; if (c.classList && c.classList.contains('progressBar')) { b = NG.utils.toArray([c]); } else { b = c.querySelectorAll(".blueProgressBar, .greenProgressBar, .progressBar"); } for (i = b.length; i-- ;) { a = b[i], d = a.firstChild; e=!0==/(%{0,1}[\d]+%{0,1})/i.test(a.title) ? a.title.match(/(%{0,1}[\d]+%{0,1})/i)[1] : a.title, (d && d.style) ? ( d.textContent=e+"\u00a0", //nbsp d.align="right", d.style.lineHeight="9px", d.style.fontSize="10px", d.style.color= "#000" ):( a.textContent=e, a.style.color="#000" ); } b = c.getElementsByClassName("plusMinusBar"); for (i = b.length; i-- ;) { a=b[i]; if (1>a.getElementsByClassName("PPM2_Numeric_Grades_Bar").length) { e = document.createElement("div"); e.textContent = a.title.match(/(-*[\d]+%)/i)[1]; e.className = "PPM2_Numeric_Grades_Bar"; if (0<a.getElementsByClassName("neg").length) { a.childNodes[0].firstChild.appendChild(e); a.getElementsByClassName('posholder')[0].style.cssFloat = 'none'; } else if (0<a.getElementsByClassName("pos").length) { a.childNodes[1].firstChild.appendChild(e); } else { a.childNodes[1].firstChild.appendChild(e); a.childNodes[1].firstChild.style.width = "0%"; } } } return!0 }, options: { enabled: true, text: "Numeric Progress Bars", tab: "main", help: 'http://s3.amazonaws.com/uso_ss/20748/large.png?1363553739', listen: true } }, numericGrades: { init: function () { NG.utils.injectCSS('a.PPM2_Numeric_Grades + span { display: inline-block; margin-left: 5px; padding: 0 5px; border: 5px; font-weight: bold; border-radius: 10px; text-shadow: none; }'); this.exec(); }, exec: function (c) { c||(c=document); var b = c.href ? Array(c) : c.querySelectorAll('a[href*="Help/Scoring/"]'); for (var i=b.length;i--;) { var a = b[i]; if (!a.classList.contains("PPM2_Numeric_Grades") && a.href.indexOf('Help/Scoring/')>-1) { var e = a.href.match(/\/Help\/Scoring\/(\d+)/i)[1]-1, h = NG.features.numericGrades.optionList[NG.features.numericGrades.options.selected][e], j = document.createElement("span"); j.style.color = h[1]; j.style.backgroundColor = h[0]; j.textContent = " "+e; a.className = "PPM2_Numeric_Grades"; a.parentNode.insertBefore(j, a.nextSibling) } } }, options: { enabled: true, text: "Numeric Grades", selected: "rain", tab: "main", help: "http://s3.amazonaws.com/uso_ss/20751/large.png?1363553875", listen: true }, optionList: { grad: { name: "Gradient", 0: ["rgb(245,245,245)", "rgb(0,0,0)"], 1: ["rgb(236,236,236)", "rgb(0,0,0)"], 2: ["rgb(226,226,226)", "rgb(0,0,0)"], 3: ["rgb(217,217,217)", "rgb(0,0,0)"], 4: ["rgb(207,207,207)", "rgb(0,0,0)"], 5: ["rgb(198,198,198)", "rgb(0,0,0)"], 6: ["rgb(188,188,188)", "rgb(0,0,0)"], 7: ["rgb(179,179,179)", "rgb(0,0,0)"], 8: ["rgb(170,170,170)", "rgb(0,0,0)"], 9: ["rgb(160,160,160)", "rgb(0,0,0)"], 10: ["rgb(151,151,151)", "rgb(0,0,0)"], 11: ["rgb(141,141,141)", "rgb(255,255,255)"], 12: ["rgb(132,132,132)", "rgb(255,255,255)"], 13: ["rgb(122,122,122)", "rgb(255,255,255)"], 14: ["rgb(113,113,113)", "rgb(255,255,255)"], 15: ["rgb(103,103,103)", "rgb(255,255,255)"], 16: ["rgb(94,94,94)", "rgb(255,255,255)"], 17: ["rgb(85,85,85)", "rgb(255,255,255)"], 18: ["rgb(75,75,75)", "rgb(255,255,255)"], 19: ["rgb(66,66,66)", "rgb(255,255,255)"], 20: ["rgb(56,56,56)", "rgb(255,255,255)"], 21: ["rgb(47,47,47)", "rgb(255,255,255)"], 22: ["rgb(37,37,37)", "rgb(255,255,255)"], 23: ["rgb(28,28,28)", "rgb(255,255,255)"], 24: ["rgb(18,18,18)", "rgb(255,255,255)"], 25: ["rgb(9,9,9)", "rgb(255,255,255)"], 26: ["rgb(0,0,0)", "rgb(255,255,255)"] }, rain: { name: "Rainbow", 0: ["#ff0000", "rgb(255,255,255)"], 1: ["#ff0036", "rgb(255,255,255)"], 2: ["#ff006c", "rgb(255,255,255)"], 3: ["#ff00a2", "rgb(255,255,255)"], 4: ["#ff00d8", "rgb(255,255,255)"], 5: ["#f000ff", "rgb(255,255,255)"], 6: ["#ba00ff", "rgb(255,255,255)"], 7: ["#8400ff", "rgb(255,255,255)"], 8: ["#4e00ff", "rgb(255,255,255)"], 9: ["#1900ff", "rgb(255,255,255)"], 10: ["#001dff", "rgb(255,255,255)"], 11: ["#0053ff", "rgb(255,255,255)"], 12: ["#0089ff", "rgb(255,255,255)"], 13: ["#00bfff", "rgb(255,255,255)"], 14: ["#00f5ff", "rgb(0,0,0)"], 15: ["#00ffd3", "rgb(0,0,0)"], 16: ["#00ff9d", "rgb(0,0,0)"], 17: ["#00ff67", "rgb(0,0,0)"], 18: ["#00ff31", "rgb(0,0,0)"], 19: ["#05ff00", "rgb(0,0,0)"], 20: ["#3bff00", "rgb(0,0,0)"], 21: ["#71ff00", "rgb(0,0,0)"], 22: ["#a7ff00", "rgb(0,0,0)"], 23: ["#ddff00", "rgb(0,0,0)"], 24: ["#ffeb00", "rgb(0,0,0)"], 25: ["#ffb500", "rgb(0,0,0)"], 26: ["#ff8000", "rgb(0,0,0)"] } } }, tabs: { init: function () { if (document.location.hash) { var notes = document.querySelectorAll("div#top-menu-notifications-list div.notification-item > a:nth-of-type(2)"); for (var hash = document.location.hash.replace("#",""), i=0; i < notes.length; i++) { if ((notes[i].onclick) && (-1<String(notes[i].onclick).indexOf(hash))) { notes[i].click(); break; } } } this.exec(document); }, exec: function (e) { var notes; if (!e || !(notes = e.querySelectorAll('.notification-item > a:nth-of-type(2)'))) { return; } for (var i = 0; i < notes.length; i++) { if (!/["'](.*)["']/gi.test(notes[i].onclick)) { continue; } notes[i].addEventListener("mousedown",this.clickHandler,!0); notes[i].addEventListener("click",this.clickHandler,!0); notes[i].href = "#"+String(notes[i].onclick).match(/["'](.*)["']/gi)[0].replace(/["']/g,""); } }, clickHandler: function (c) { if (1==c.which&&(c.ctrlKey||c.shiftKey)||2==c.which) { c.stopPropagation(); c.preventDefault(); c.cancelBubble=!1; this.removeEventListener("mousedown",NG.features.tabs.clickHandler,!0); this.removeEventListener("click",NG.features.tabs.clickHandler,!0); this.focus(); var c = JSON.stringify({ ts: new Date().getTime(), arg: String(this.onclick).match(/\(this, (.*)\)/i)[1].replace(/[\'"]/g,"") },null), b = document.location.protocol+"//"+document.location.hostname+"/WebServices/A/Open.asmx/ClickNotification", d = new XMLHttpRequest; this.parentNode.parentNode.removeChild(this.parentNode); 1>document.querySelectorAll("#notifications ul li").length&&(document.getElementById("notifications").className="hidden"); d.onreadystatechange = function() { if (4==d.readyState && 200==d.status){ var a=document.createElement("div"); a.innerHTML = d.responseText.replace(/<script(.|\s)*?\/script>/ig,""); ret = document.location.protocol+"//"+document.location.hostname+"/"+a.innerHTML.match(/\/(.*)\\"/)[1]; GM_openInTab?GM_openInTab(ret):window.open(ret) } }; d.open("POST",b,!0); d.setRequestHeader("Content-type","application/json;charset=utf-8"); d.setRequestHeader("Content-length",c.length); d.send(c); this.parentNode.parentNode.removeChild(this.parentNode); return!1 } }, options: { enabled: true, text: "Notifications in seperate tabs", tab: "main", help: "http://s3.amazonaws.com/uso_ss/20753/large.png?1363554044", listen: true } }, /*active: { fn: function () { var c=document.getElementById("sidemenu").getElementsByTagName("a"),b=document.location.href; if(b.match(/\w+(?:$|\/\d+)/i)==(c[0]?c[0].href.match(/(\w+)(?:$|\/\d+)/i)[1]:!1))return c[0].parentNode.style.backgroundColor="#FFF",!0; for(i=c.length; i--;) if (b == c[i].href) return c[i].parentNode.style.backgroundColor="#FFF",!0 }, options: { enabled: true, text: "Highlight active page on side menu", tab: "extras" } },*/ hideText: { init: function () { if(!(0<document.location.pathname.indexOf("/Thread/"))){ var b; b=-1<navigator.userAgent.toLowerCase().indexOf("firefox")?"-moz":"-webkit"; var d=document.getElementById("content").getElementsByTagName("p"); for (var i=d.length-1;0<=i;i--) !(1<d[i].childNodes.length)&&"ctl00_cphLeftColumn_ctl00_divNoteFromManagement"!=d[i].parentNode.id&&"ctl00_cphLeftColumn_ctl00_divBlog"!=d[i].parentNode.id&&(6>d[i].parentNode.childNodes.length?0===d[i].parentNode.childNodes[1].tagName.indexOf("H")&& 2>d[i].offsetHeight/parseInt(window.getComputedStyle(d[i],"").lineHeight):2>=d[i].offsetHeight/parseInt(window.getComputedStyle(d[i],"").lineHeight,10)||(d[i].setAttribute("style",b+"-transition: max-height 0.5s;"),d[i].style.maxHeight="20px",d[i].style.overflow="hidden",d[i].style.cursor="pointer",d[i].style.marginBottom="2px",d[i].style.borderBottom="dotted 1px",d[i].addEventListener("click",NG.features.hideText.clickHandler,!0))); } }, clickHandler: function (a) { a = a.target; "P"==a.tagName?0<window.getSelection().toString().length&&a==window.getSelection().getRangeAt(0).startContainer.parentNode||("20px"==a.style.maxHeight?(a.style.maxHeight="999px",a.style.borderBottom="none",a.style.marginBottom="15px"):(a.style.maxHeight="20px",a.style.borderBottom="dotted 1px",a.style.marginBottom="2px")):0==a.tagName.indexOf("H")&&(a=a.parentNode.getElementsByTagName("P"),1>a.length||(a=a[0],"7px"==a.style.maxHeight?(a.style.maxHeight="999px",a.style.borderBottom="none"): (a.style.maxHeight="7px",a.style.borderBottom="dotted 1px"))) }, options: { enabled: false, text: "Collapse long text", tab: 'extras' } }, update: { init: function () { // disabled return; if (NG.features.update.options.updateAvailable) { NG.features.update.notify(); } else if (parseInt(+new Date().valueOf()-NG.features.update.options.lastCheck) > 604800000) { // 1 week GM_xmlhttpRequest({ method: 'GET', url: NG.features.update.options.updateUrl, onload: function (res) { NG.options.set('update','lastCheck',new Date().valueOf()); var remoteVersion = res.responseText.match(/\/\/\s+@version\s+([\d\.]+)$/mi); if (!remoteVersion) { GM_log('Error parsing remote file!'); return; } if (remoteVersion[1] > NG.version) { NG.options.set('update','updateAvailable',true); NG.features.update.notify(); } } }); } }, notify: function () { var aClose = document.createElement('div'); aClose.textContent = 'Numeric Grades Update Available'; aClose.classList.add('notification-success'); aClose.onclick = function (t) { NG.options.set('update','updateAvailable',false); GM_openInTab(NG.features.update.options.url); t.target.parentNode.removeChild(t.target); if (document.querySelectorAll('#notifications > div').length < 1) { document.getElementById('notifications').classList.add('hidden'); document.getElementById('notifications').style.display = 'none'; } }; var nots = document.getElementById('notifications'); nots.appendChild(aClose); nots.classList.remove('hidden'); nots.style.display = 'block'; }, options: { enabled: true, text: "Auto update", tab: "extras", url: "http://userscripts.org/scripts/source/135906.user.js", updateUrl: "http://userscripts.org/scripts/source/135906.meta.js", site: 'http://userscripts.org/scripts/show/135906', lastCheck: 0, updateAvailable: false } }, seconds: { init: function () { unsafeWindow._ptrn = NG.features.seconds.optionList[NG.features.seconds.options.selected].set; if (unsafeWindow.updateGameClock) setTimeout( function () { unsafeWindow.updateGameClock(); }, 0); }, options: { enabled: true, text: "Show seconds in game clock", tab: "extras", selected: "AMPM" }, optionList: { AMPM: { name: "AM-PM", set: "h:mm:ss tt" }, 24: { name: "24 Hour Clock", set: "HH:mm:ss" } } } }, options: { set: function (module, option, value) { if (!module || !option || value == null) return false; var data = NG.options.load(); // because I don't want to save default values NG.features[module].options[option] = value; if (!data[module]) data[module] = {}; data[module][option] = value; NG.options.save(data); return true; }, get: function (module, option) { }, save: function (data) { if (!data) return undefined; GM_setValue('numeric_grades_options', JSON.stringify(data)); return true; /*for (i in data) { for (j in data[i]) alert(i+'.options.'+j+' = '+data[i][j]) }*/ }, load: function () { var data = GM_getValue('numeric_grades_options','{}'); if (data.length < 1) data = '{}'; data = JSON.parse(data); for (i in data) { for (j in data[i]) { if (NG.features[i]) NG.features[i].options[j] = data[i][j]; //alert(i+'.options.'+ j + ' = ' + data[i][j]) } } return data; } }, UI: { beaker: function () { var c = document.createElement("A"); c.className = "icon"; c.title = "Numeric Grades"; c.id = "ppm_numeric_grades"; c.style.cursor = "pointer"; var b = document.createElement("img"); b.src = "/Static/Icons/beaker.png"; b.id = "ppm_numeric_grades_menu"; c.appendChild(b); // try 'more shortcuts' first and if it fails switch to regular shortcuts b = document.getElementById('ctl00_ctl05_ucCharacterBar_divMoreShortcuts'); if (!b) { b = document.getElementById('character-tools-shortcuts'); } if (!b) return; // we must be logged out from the game b.appendChild(c); document.getElementById("ppm_numeric_grades_menu").addEventListener("click", NG.UI.userInterface,!0); }, userInterface: function () { if (document.getElementById("ppm_numeric_grades_options")) return; document.querySelector('body').classList.remove('ng_options_recover'); document.querySelector('body').classList.add('ng_options_disabled'); NG.utils.injectCSS(multiline(function(){/* #ppm_numeric_grades_options { cursor: auto; position: fixed; color: #FFF; font-family: Tahoma !important; font-size: 11px !important; width: 100%; height: 100%; top: 0; left: 0; background: rgba(0, 0, 0, 0.3); } #ppm_numeric_grades_options_container { z-index:2; position: fixed; left: 50%; margin-left: -250px; width: 500px; height: 440px; background: none repeat scroll 0% 0% #7F8c8d; border: 1px solid #000; box-shadow: 2px 4px 2px rgba(0, 0, 0, 0.65); padding: 10px; } #ppm_numeric_grades_options_titlebar { background-color: #2C3E50; color: #ECf0f1; margin: -10px -10px 10px -10px; padding: 0 10px; border-bottom: 1px solid #000; cursor: default; } #ppm_numeric_grades_options_close { font-size: 12px; position: absolute; right: 10px; bottom: 8px; cursor: pointer; margin: 0 0 0 0; color: #222; background-color: #c0392b; padding: 6px 40px; font-weight: bold; border: 1px solid #000; border-radius: 2px; -webkit-transition: background-color 0.3s; -moz-transition: background-color 0.3s; transition: background-color 0.3s; } #ppm_numeric_grades_options_close:hover { background-color: #e74c3c; color: #222; border: 1px solid #33647D; } .ppm_numeric_grades_tab { float: left; background-color: #2C3E50; padding: 2px; height: 26px; border-radius: 4px 0 0 4px; } .ppm_numeric_grades_tab:last-of-type { padding: 2px 4px; border-radius: 0 4px 4px 0; } .ppm_numeric_grades_tab:last-of-type:after { display: block; content: ''; background-color: #2C3E50; position: absolute; height: 30px; width: 90%; right: 10px; top: 26px; border-radius: 4px 4px; z-index: -1; } .ppm_numeric_grades_tab > label { color: #FFF; font-weight: normal; padding: 5px 10px; cursor: pointer; display: block; width: 60px; height: 15px; text-transform: capitalize; text-align: center; letter-spacing: 0.1em; } .ppm_numeric_grades_tab > label:hover { text-decoration: underline; } #ppm_numeric_grades_options_container [type=radio]:checked ~ label { color: #FFF; background: #16a085; z-index: 4; border-radius: 2px; } .ppm_numeric_grades_tab [type=radio] { display: none; } .ppm_numeric_grades_content { position: absolute; top: 70px; left: 0; right: 0; bottom: 0; margin: 0 10px 50px; padding: 5px; overflow: hidden; background: #2C3E50; text-align: left; border-radius: 4px; } #ng_about ~ .ppm_numeric_grades_content { text-align: center; color: #FFF; } .ppm_numeric_grades_content > * { -wekbit-transition: opacity 1.0s; -moz-transition: opacity 1.0s; transition: opacity 1.0s; opacity: 0; } .ppm_numeric_grades_content a { font-weight: bold; text-decoration: none; color: #16a085; float: none !important; letter-spacing: 0.1em; } .ppm_numeric_grades_content a:hover { text-decoration: underline; } .ppm_numeric_grades_content select { border: 1px solid #000; font-size: 14px !important; height: 25px; width: 90% !important; border-radius: 5px; margin: 10px 0px 0px 25px !important; background: -moz-linear-gradient(center top, #FFFFFF, #EFEFEF) repeat scroll 0 0 transparent; background: -webkit-linear-gradient(center top, #FFFFFF, #EFEFEF) repeat scroll 0 0 transparent; } .ppm_numeric_grades_content > div { margin-bottom: 5px; padding: 10px; background: #34495E; position: relative; } #ppm_numeric_grades_options_container [type=radio]:checked ~ label ~ .ppm_numeric_grades_content { z-index: 3; } #ppm_numeric_grades_options_container [type=radio]:checked ~ label ~ .ppm_numeric_grades_content > * { opacity: 3; } .ppm_numeric_grades_content > label { float: left; } #ppm_numeric_grades_options_container input[type='checkbox'] { opacity: 0; float: none; display: none; width: 18px; } #ppm_numeric_grades_options_container input[type='checkbox'] + label { cursor: pointer; color: #FFF; } #ppm_numeric_grades_options_container input[type='checkbox'] + label:before { content: '✔'; display: inline-block; width: 20px; height: 20px; text-align: center; font-size: 16px; color: #95a5a6; background-color: #95a5a6; border-radius: 2px; margin-right: 5px; position: relative; top: 3px; padding-bottom: 2px; } #ppm_numeric_grades_options_container input[type='checkbox']:checked + label:before { color: #FFF; } .ng_help { background-color: #FFFFFF; border-radius: 100%; padding: 0 4px; position: absolute; right: 5px; top: 50%; margin-top: -10px; border: 1px solid #000000; font-size: 12px; text-decoration: none !important; } body.ng_options_disabled { perspective: 800px; perspective-origin: 50% 50%; overflow: hidden; } body.ng_options_disabled form#aspnetForm { animation: andrew 0.5s 1 forwards; transform-origin: 0 50%; transition: all 0.5s ease; pointer-events: none; } body.ng_options_recover form#aspnetForm { animation: recover 0.5s 1 forwards; } #ppm_numeric_grades_options_container { animation: main 0.5s ease 0s 1 forwards; transform-origin: 0 50%; transition: all 0.5s ease; } @keyframes main { 0% { opacity: 0.3; transform: rotateX(90deg); } 50% { opacity: 0.3; transform: rotateX(45deg); } 100% { } } @keyframes andrew { 0% { transform: translateY(-15%) rotateX(0deg); } 50% { transform: translateY(-15%) rotateX(15deg); } 100% { opacity: 0.2; transform: translate(5%, -15%) rotateX(15deg) scale(0.9); } } @keyframes recover { 100% { } 99% { opacity: 0.2; transform: translate(0%) rotateX(0deg); transform-origin: 0 50%; transition: all 0.3s ease; pointer-events: none; } 0% { opacity: 0.2; transform: translate(5%, -15%) rotateX(15deg) scale(0.9); transform-origin: 0 50%; transition: all 0.3s ease; pointer-events: none; } } */})); var main = document.createElement('DIV'), titlebar = document.createElement('DIV'), container = document.createElement('DIV'), close = document.createElement('DIV'); main.id = 'ppm_numeric_grades_options'; container.id = 'ppm_numeric_grades_options_container'; titlebar.id = 'ppm_numeric_grades_options_titlebar'; titlebar.textContent = 'Numeric Grades'; close.id = 'ppm_numeric_grades_options_close'; close.textContent = 'Close'; container.appendChild(titlebar); container.appendChild(close); // for generating checkboxes and selects for features for (i in NG.features) { if (!NG.features[i].options || !NG.features[i].options.tab) { continue; } var tab, contenter, c = document.createElement('div'); if (container.querySelector('#ng_tab_'+NG.features[i].options.tab) == null) { // create new tab tab = document.createElement('DIV'), contenter = document.createElement('DIV'); var tabControl = document.createElement('input'), label = document.createElement('label'); tabControl.type = "radio"; tabControl.id = 'ng_tab_'+NG.features[i].options.tab; tabControl.name = 'ng_tab'; tab.appendChild(tabControl); label.textContent = NG.features[i].options.tab; label.setAttribute("for",'ng_tab_'+NG.features[i].options.tab); tab.appendChild(label); tab.className = 'ppm_numeric_grades_tab'; contenter.className = 'ppm_numeric_grades_content'; tab.appendChild(contenter); container.appendChild(tab); } else { // find existing tab contenter = container.querySelector('#ng_tab_'+NG.features[i].options.tab+' ~ .ppm_numeric_grades_content') } if (NG.features[i].options.enabled != undefined && NG.features[i].options.text) { // create a checkbox var ck = document.createElement('input'), label = document.createElement("label"); ck.type = 'checkbox'; ck.id = "ng_"+i; NG.features[i].options.enabled && (ck.checked = "checked"); c.appendChild(ck); label.setAttribute("for","ng_"+i); label.textContent = NG.features[i].options.text; c.appendChild(label); } if (NG.features[i].options.selected != undefined && NG.features[i].optionList) { // create a dropdown var sel = document.createElement('select'); sel.id = "ng_"+i+"_sel"; for (j in NG.features[i].optionList) { var op = document.createElement('option'); op.value = j; op.textContent = NG.features[i].optionList[j].name; (NG.features[i].options.selected == j) && (op.selected = true); sel.appendChild(op); } c.appendChild(sel); } if (c.childNodes.length > 0) { // help link if only module has an UI item if (NG.features[i].options.help) { // create help link var h = document.createElement('a'); h.href = NG.features[i].options.help; // add url check here h.className = 'ng_help'; h.target = "_blank"; h.textContent = '?'; c.appendChild(h); } contenter.appendChild(c); } } // inserting about tab var aboutTab = document.createElement('div'), about = document.createElement('div'), radio = document.createElement('input'), radioLabel = document.createElement('label'); radio.type = 'radio'; radio.id = 'ng_about'; radio.name = 'ng_tab'; radioLabel.setAttribute('for','ng_about'); radioLabel.textContent = 'about'; aboutTab.className = 'ppm_numeric_grades_tab'; about.className = 'ppm_numeric_grades_content'; about.innerHTML = '<br/><br/><br/>Popmundo Numeric Grades '+NG.version+'<br/><br/>by<br/><br/><a href="/World/Popmundo.aspx/Character/206394">Feeney Danielson</a><br/><br/><br/><br/><a href="'+NG.features.update.options.site+'" target="_blank">Visit Script\'s Website</a>'; aboutTab.appendChild(radio); aboutTab.appendChild(radioLabel); aboutTab.appendChild(about); container.appendChild(aboutTab); // about tab complete // select the active tab aka version control container.querySelector('.ppm_numeric_grades_tab').firstChild.checked = true; main.appendChild(container); document.querySelector('body').appendChild(main); main.addEventListener('click',NG.UI.UIClickHandler,true); main.addEventListener('change',NG.UI.UIClickHandler,true); }, UIClickHandler: function (e) { if ((e.type == 'click') && (e.target.id == 'ppm_numeric_grades_options_close')) { document.querySelector('body').removeChild(document.getElementById("ppm_numeric_grades_options")); document.querySelector('body').classList.remove('ng_options_disabled'); document.querySelector('body').classList.add('ng_options_recover'); setTimeout(function () { document.querySelector('body').classList.remove('ng_options_recover') }, 500); } if ((e.type == 'click') && (e.target.tagName == 'INPUT') && (e.target.type == "checkbox")) { var l = e.target.id.match(/ng_(\w+)/)[1]; NG.options.set(l, 'enabled', e.target.checked); } else if ((e.type == 'change') && (e.target.tagName == 'SELECT')) { var l = e.target.id.match(/ng_(\w+)_sel/)[1]; NG.options.set(l, 'selected', e.target[e.target.selectedIndex].value); } } }, init: function () { NG.options.load(); // load preferences NG.UI.beaker(); // insert menu button to statusbar var active = []; for (i in NG.features) { if ((NG.features[i].options.enabled) && (typeof(NG.features[i].init) === "function")) { if (NG.features[i].options.path != undefined) { if (document.location.pathname.match(NG.features[i].options.path) != null) { NG.features[i].init(); if (NG.features[i].options.listen && (typeof NG.features[i].exec) === "function") { active.push(NG.features[i]); } } } else { NG.features[i].init(); if (NG.features[i].options.listen && (typeof NG.features[i].exec) === "function") { active.push(NG.features[i]); } } } } // launch .features if (active.length < 1) { return } // bind DOM mutation listeners var Observer = window.MutationObserver || window.WebKitMutationObserver; var observer = new Observer(function (records) { NG.utils.toArray(records).forEach(function (record) { if (record.addedNodes) { NG.utils.toArray(record.addedNodes).forEach(function (node) { if (!node.tagName) { return } for (var i = active.length; i--;) { active[i].exec(node) } return; }) } }); }); observer.observe(document.body,{ childList: true, subtree: true }); }, version: "4.9" } NG.init(); /* progCall = 0; progTime = 0; var timing = new Date().getTime(); timing = (new Date().getTime() - timing); progTime += timing; progCall++; if (timing > -1) { //GM_log(c.tagName); //GM_log(c.outerHTML || c.innerHTML); GM_log('progressBars('+progCall+'): '+timing+'/'+progTime+' ms'); } */