NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript== // @name L-E's FA Helper // @version 0.4 // @description Useful tools to improve your FA experience. // @author Elizabeth Harper <elliefops@gmail.com> // @match https://www.furaffinity.net/* // @match http://www.furaffinity.net/* // @supportURL https://github.com/EllieFops/FA-Helper/issues // @homepage https://github.com/EllieFops/FA-Helper // @grant GM_openInTab // @grant GM_setValue // @grant GM_getValue // ==/UserScript== (function() { var octFAH = { component: {}, core: {}, http: {}, module: {}, util: {} }; octFAH.component.Component = (function () { "use strict"; var _app; function Component(app, element) { _app = app; this._element = element; } Component.prototype.show = function () { this._element.style.display = "block"; return this; }; Component.prototype.hide = function () { this._element.style.display = "none"; return this; }; Component.prototype.topLeft = function (top, left) { this._element.style.top = top.toString() + "px"; this._element.style.left = left.toString() + "px"; return this; }; Component.prototype.topRight = function (top, right) { this._element.style.top = top.toString() + "px"; this._element.style.right = right.toString() + "px"; return this; }; Component.prototype.bottomLeft = function (bottom, left) { this._element.style.bottom = bottom.toString() + "px"; this._element.style.left = left.toString() + "px"; return this; }; Component.prototype.bottomRight = function (bottom, right) { this._element.style.bottom = bottom.toString() + "px"; this._element.style.right = right.toString() + "px"; return this; }; Component.prototype.element = function () { return this._element; }; return Component; })(); octFAH.component.HoverView = (function () { "use strict"; var _app, _img, _pane, _settings; function HoverView(app) { _pane = document.createElement("DIV"); _app = app; _img = document.createElement("IMG"); _settings = app.getSettings(); octFAH.component.Component.call(this, app, _pane); init(this); } HoverView.prototype = Object.create(octFAH.component.Component.prototype); function handleMouseOver(e) { if (!_settings.showPreviews) { return; } _pane.style.display = "block"; _img.setAttribute("src", e.target.getAttribute("src").replace("@200", "@" + _settings.previewSize.toString())); } function handleMouseMove(self) { return function (e) { if (!_settings.showPreviews) { return; } var x, y, i; i = _img.getBoundingClientRect(); x = e.clientX + window.scrollX + 30; if (x + i.width > window.innerWidth) { x = e.clientX + window.scrollX - i.width - 30; } y = (e.clientY - i.height / 2) + window.scrollY; if (y < window.scrollY) { y += window.scrollY - y; } else if (y + i.height > window.innerHeight + window.scrollY) { y -= y + i.height - (window.innerHeight + window.scrollY); } self.topLeft(y, x); }; } function handleMouseOut() { _pane.style.display = "none"; } function init(self) { _pane.appendChild(_img); _app.getHTMLUtil().style( _pane, { display: "none", position: "absolute", zIndex: 10000, border: "2px solid pink" } ); document.querySelector("body").appendChild(_pane); var i, a; a = document.querySelectorAll("b img"); for (i = 0; i < a.length; i++) { a[i].addEventListener("mouseover", handleMouseOver); a[i].addEventListener("mouseout", handleMouseOut); a[i].addEventListener("mousemove", handleMouseMove(self)); } } return HoverView; })(); octFAH.component.ModalComponent = (function () { "use strict"; var _app; var _curtain; function ModalComponent(app, element) { _app = app; this._element = element; octFAH.component.Component.call(this, app, element); init(this); } ModalComponent.prototype = Object.create(octFAH.component.Component.prototype); ModalComponent.prototype.show = function () { octFAH.component.Component.prototype.show.call(this); _curtain.style.display = "block"; }; function init(self) { if (typeof _curtain === "undefined") { initCurtain(); } initElement(self); } function initCurtain() { _curtain = _app .wrap("div") .style( { position: "fixed", top: "0px", bottom: "0px", left: "0px", right: "0px", width: "100%", height: "100%", zIndex: "9999", background: "#333", opacity: "0.8", display: "none" } ) .attribute("class", "octModal") .click( function () { var i, a; a = document.querySelectorAll(".octModal"); for (i = 0; i < a.length; i++) { a[i].style.display = "none"; } } ) .element(); document.querySelector("body").appendChild(_curtain); } function initElement(self) { var e = self._element; _app .wrap(e) .style( { position: "fixed", display: "none", zIndex: "10000", border: "15px solid #666", borderRadius: "20px", width: "500px", height: "300px", marginTop: "-155px", marginLeft: "-255px", top: "50%", left: "50%" } ); document.querySelector("body").appendChild(e); } return ModalComponent; })(); octFAH.component.SettingsMenu = (function () { "use strict"; var _app; var _self; function SettingsMenu(app) { _self = this; _app = app; var div = document.createElement("div"); octFAH.component.ModalComponent.call(this, app, div); init(this, div); } SettingsMenu.prototype = Object.create(octFAH.component.ModalComponent.prototype); function init(self, div) { initDiv(div); initForm(div); modUI(self); } function handleShow(self) { return function () { self.show(); }; } function previewSizeChange(e) { _app.getSettings().previewSize = e.target.value; _app.pushSettings(); } function previewToggle(e) { _app.getSettings().showPreviews = e.target.checked; _app.pushSettings(); } function modUI(self) { var el, but, li; but = _app.wrap("a") .click(handleShow(self)) .style({cursor: "pointer", color: "#cfcfcf"}) .element(); li = document.createElement("li"); li.appendChild(but); el = document.querySelector("table.block-menu-top ul.dropdown-left li:nth-child(2)"); if (!el) { el = document.querySelector("#nav li:nth-child(4)"); } else { but.style.fontWeight = "bold"; } but.innerHTML = "Helper"; el.parentNode.insertBefore(li, el); } function initDiv(div) { var title; title = _app.wrap("span") .html("FA Helper Settings") .style( { fontWeight: "bold", fontSize: "1.2em", display: "block", textAlign: "center", padding: "0 20px 10px 20px" } ); _app.wrap(div).addClass("octModal").append(title); } function initForm(div) { var form, util, select, i, labels, opt, check, text, v, sett; sett = _app.getSettings(); util = _app.getHTMLUtil(); v = _app.getHelperUtil(); select = _app .wrap("select") .attribute("id", "octPrevSizeSel") .change(previewSizeChange) .element(); text = _app .wrap("textarea") .style({width: "300px", height: "5em"}) .input( function () { sett.watchShoutText = text.value || ""; _app.pushSettings(); } ) .element(); check = _app .wrap(util.makeCheckBox("", "", _app.getSettings().showPreviews)) .change(previewToggle) .element(); form = _app .wrap("form") .style({margin:"10px"}) .append( [ util.makeWrapperLabel("Enable Previews", check), util.makeWrapperLabel("Preview Size", select), util.makeWrapperLabel("Watcher Auto Shout Text", text) ] ) .element(); if (sett.watchShoutText.length > 0) { text.value = sett.watchShoutText; } else { text.value = ""; } for (i = 200; i <= 400; i += 100) { opt = util.makeSelectOption(i, v.toPx(i)); if (i === sett.previewSize || i.toString() === sett.previewSize.toString()) { opt.setAttribute("selected", "selected"); } select.appendChild(opt); } labels = form.querySelectorAll("label > span"); for (i = 0; i < labels.length; i++) { labels[i].parentNode.style.display = "block"; labels[i].parentNode.style.marginBottom = "5px"; util.style(labels[i], {display: "block", padding: "5px", fontSize: "1.1em", width: "200px"}); } div.appendChild(form); } return SettingsMenu; })(); octFAH.component.StatusBox = (function () { "use strict"; var _app; function StatusBox(app) { _app = app; var outer = document.createElement("div"); octFAH.component.Component.call(this, app, outer); this._completion = 0; this._progress = null; init(this, outer); } StatusBox.prototype = Object.create(octFAH.component.Component.prototype); StatusBox.prototype.setCompletion = function (percent) { this._completion = percent; updateProgress(this); }; StatusBox.prototype.getCompletion = function () { return this._completion; }; function init(self, outer) { var s; makeOuterDiv(outer); self._progress = makeProgressBar(); s = makeProgressContainer(); s.appendChild(self._progress); outer.appendChild(s); } function makeOuterDiv(div) { _app.getHTMLUtil().style( div, { padding: "25px", position: "fixed", border: "4px solid pink", borderRadius: "10px", bottom: "50px", right: "50px", display: "none" } ); } function makeProgressContainer() { var div; div = document.createElement("div"); _app.getHTMLUtil().style( div, { height: "24px", width: "200px", borderRadius: "5px", border: "1px solid #444", overflow: "hidden" } ); return div; } function makeProgressBar() { var div; div = document.createElement("div"); _app.getHTMLUtil().style( div, { height: "100%", backgroundColor: "#3379aa" } ); return div; } function updateProgress(con) { con._progress.style.width = con.toString() + "%"; } return StatusBox; })(); octFAH.component.WatchShoutForm = (function () { "use strict"; var _app; function WatchShoutForm(application) { _app = application; this._div = document.createElement("div"); this._num = null; this._check = null; this._text = null; this._sendButton = null; this.shoutText = ""; octFAH.component.ModalComponent.call(this, _app, this._div); this._setupForm(); } WatchShoutForm.prototype = Object.create(octFAH.component.ModalComponent.prototype); WatchShoutForm.prototype.setSelCount = function (num) { this._num.value = num; }; WatchShoutForm.prototype.getUseDefaultElement = function () { return this._check; }; WatchShoutForm.prototype.getShoutTextElement = function () { return this._text; }; WatchShoutForm.prototype.getSendButton = function () { return this._sendButton; }; WatchShoutForm.prototype._setupForm = function () { var sett, util, cLab, tLab, nLab, self; self = this; util = _app.getHTMLUtil(); sett = _app.getSettings(); this.shoutText = ""; this._num = _app.wrap("input") .attributes({disabled: "disabled", type: "number", "default": "0"}) .style({width: "25px"}) .element(); this._text = _app.wrap("textarea") .style({width: "200px", height: "8em"}) .element(); this._check = util.makeCheckBox("", "", (sett.watchShoutText.length >= 4)); this._text.value = sett.watchShoutText || ""; if (this._text.value.length >= 4) { this._text.setAttribute("disabled", "disabled"); } this._sendButton = util.makeButton("Send"); nLab = util.makeWrapperLabel("Selected Watchers", this._num); cLab = util.makeWrapperLabel("Use default watcher shout", this._check, false); tLab = util.makeWrapperLabel("Shout Text", this._text); util.style([tLab.firstElementChild, cLab, tLab, nLab.firstElementChild], {display: "block"}); util.style([tLab, cLab, nLab], {marginBottom: "5px", fontSize: "1.1em"}); this._check.addEventListener( "change", function () { if (self._check.checked) { self._text.setAttribute("disabled", "disabled"); self.shoutText = self._text.value || ""; self._text.value = sett.watchShoutText; } else { self._text.removeAttribute("disabled"); if (self.shoutText.length) { self._text.value = self.shoutText; } } } ); _app.wrap(this._div).attribute("id", "octWatchShoutDiv").addClass("octModal").append( _app.wrap("form").style({margin: "25px"}).append( [ _app.wrap("p").style({fontSize: "1.1em"}).html("Warning: do not use this on slow connections!").element(), nLab, cLab, tLab, _app.wrap("div").style({textAlign: "right"}).append([this._sendButton]).element() ] ) .element() ); }; return WatchShoutForm; }()); octFAH.core.Application = (function () { "use strict"; var _browserUtil; var _browser; var _defSet; var _helperUtil; var _htmlUtil; var _location; var _module; var _self; var _settings; var _settingsMenu; var _storage; function Application() { _location = window.location.href; _htmlUtil = new octFAH.util.HTMLUtils(this); _helperUtil = new octFAH.util.Helpers(this); _storage = new octFAH.util.Storage(); _browserUtil = new octFAH.util.Browser(); _browser = _helperUtil.getBrowserType(); _defSet = { previewSize: 400, showPreviews: true, watchShoutText: "", favShoutText: "" }; _settings = _storage.fetchValue("octFASettings", _defSet); _module = null; _self = this; init(this); } function init(context) { updateSettings(context); getModule(); _settingsMenu = new octFAH.component.SettingsMenu(_self); } Application.prototype.getSettings = function () { return _settings; }; Application.prototype.pushSettings = function () { _storage.pushValue("octFASettings", _settings); }; Application.prototype.getHTMLUtil = function () { return _htmlUtil; }; Application.prototype.getHelperUtil = function () { return _helperUtil; }; function getModule() { var c, m; c = octFAH.core.Config; m = octFAH.module; if (_location.indexOf(c.subPage) !== -1) { _module = new m.SubmissionModule(_self); } else if (_location.indexOf(c.browsePage) !== -1) { _module = new m.BrowseModule(_self); } else if (_location.indexOf(c.searchPage) !== -1) { _module = new m.SearchModule(_self); } else if (_location.indexOf(c.userPage) !== -1) { } else if (_location.indexOf(c.watchesPage) !== -1) { _module = new m.MessageModule(_self); } } Application.prototype.makeArtLink = function (i) { return octFAH.core.Config.viewPage + i; }; Application.prototype.openArtTab = function (link) { _browserUtil.makeNewTab(link, false); }; Application.prototype.getLocation = function () { return _location; }; function updateSettings(self) { var update, key; update = false; for (key in _defSet) { if (!_defSet.hasOwnProperty(key)) { continue; } if (typeof _settings[key] === "undefined") { update = true; _settings[key] = _defSet[key]; } } if (update) { self.pushSettings(); } } Application.prototype.getHelperUtil = function () { return _helperUtil; }; Application.prototype.wrap = function (element) { return new octFAH.util.HTML(element); }; return Application; }()); octFAH.core.Config = { viewPage: "//www.furaffinity.net/view/", subPage: "//www.furaffinity.net/msg/submissions/", basePage: "//www.furaffinity.net/", browsePage: "//www.furaffinity.net/browse/", userPage: "//www.furaffinity.net/user/", searchPage: "//www.furaffinity.net/search/", watchesPage: "//www.furaffinity.net/msg/others/", previewPage: "//t.facdn.net/" }; octFAH.http.PostRequest = (function () { "use strict"; function PostRequest(u) { this.url = u || ""; this.data = ""; this.load = []; this.error = []; this.abort = []; this.head = {}; this.http = new XMLHttpRequest(); } PostRequest.prototype.onLoad = function (func) { this.load.push(func); return this; }; PostRequest.prototype.onError = function (func) { this.error.push(func); return this; }; PostRequest.prototype.onAbort = function (func) { this.abort.push(func); return this; }; PostRequest.prototype.onAny = function (func) { this.onAbort(func); this.onError(func); this.onLoad(func); return this; }; PostRequest.prototype.setUrl = function (url) { this.url = url; return this; }; PostRequest.prototype.setData = function (data) { this.data = data; return this; }; PostRequest.prototype.setHeader = function (key, val) { this.head[key] = val; return this; }; PostRequest.prototype.send = function () { var i; this.http.open("POST", this.url); for (i in this.head) { if (this.head.hasOwnProperty(i)) { this.http.setRequestHeader(i, this.head[i]); } } this.http.addEventListener("load", genHandler(this.load, this)); this.http.addEventListener("abort", genHandler(this.abort, this)); this.http.addEventListener("error", genHandler(this.error, this)); this.http.send(this.data); }; function genHandler(backs, self) { return function (e) { var i; for (i = 0; i < backs.length; i++) { backs[i](e, self.http); } }; } return PostRequest; })(); octFAH.module.BrowseModule = (function () { "use strict"; var _app; var _hoverView; function BrowseModule(app) { _app = app; _hoverView = new octFAH.component.HoverView(_app); } return BrowseModule; })(); octFAH.module.MessageModule = (function () { "use strict"; var _app; var _charLimit; var _selected = []; var _shoutForm = null; var _watchesForm = null; var _outGets = 0; var _outPosts = 0; var _collected = {}; function MessageModule(application) { _app = application; _charLimit = 222; _selected = []; init(); } function init() { _watchesForm = document.getElementById("messages-watches"); _watchesForm.addEventListener( "click", function () { fetchSelected(); _shoutForm.setSelCount(_selected.length); } ); _shoutForm = new octFAH.component.WatchShoutForm(_app); _shoutForm.getSendButton().addEventListener("click", submitShouts); modUI(); } function fetchSelected() { var i, butt, ht; ht = []; butt = _watchesForm.querySelectorAll("table input:checked"); for (i = 0; i < butt.length; i++) { ht.push(_app.wrap(butt[i]).parent("table").element().querySelector("a").getAttribute("href")); } _selected = ht; } function fetchData(url) { var req, data; data = {key: "", action: "shout", name: ""}; req = new XMLHttpRequest(); req.open("GET", url); req.responseType = "document"; req.addEventListener("load", parseForKey(req, data)); req.addEventListener("abort", subOutGets); req.addEventListener("error", subOutGets); _outGets++; req.send(); return data; } function subOutGets() { _outGets--; send(); } function subOutPosts() { _outPosts--; removeSelected(); } function parseForKey(req, data) { return function () { var el; try { el = req.responseXML.getElementById("JSForm"); data.key = el.querySelector("input[name=key]").getAttribute("value"); data.name = el.querySelector("input[name=name]").getAttribute("value"); data.action = "shout"; } catch (e) { } finally { subOutGets(); } }; } function send() { var i, text, temp; if (_outGets !== 0) { return; } text = _shoutForm.getShoutTextElement().value; for (i in _collected) { if (!_collected.hasOwnProperty(i)) {continue;} temp = _collected[i]; if (!temp.name || !temp.action || !temp.key) { continue; } submitShout(temp.key, temp.name, temp.action, text); } } function submitShout(key, name, action, shout, func) { var post; post = new octFAH.http.PostRequest(); post.setUrl(octFAH.core.Config.userPage + name); post.setHeader("Content-type", "application/x-www-form-urlencoded") .setData( "action=" + action + "&key=" + key + "&name=" + name + "&shout=" + shout + "&chars_left=" + (_charLimit - shout.length).toString() ); if (func) { post.onAny(func); } post.onAny(subOutPosts); post.send(); _outPosts++; } function modUI() { var watches, watchControls, swButt, u; u = _app.getHTMLUtil(); watches = document.getElementById("messages-watches"); watchControls = watches.querySelector("li.section-controls"); swButt = u.makeButton("Mass Shout Selected", showShoutWatchDiv); swButt.setAttribute("class", "button octModalShow"); watchControls.insertBefore(swButt, watchControls.querySelector("input.remove")); } function showShoutWatchDiv() { _shoutForm.show(); } function submitShouts() { var i, l, d; l = _selected.length; for (i = 0; i < l; i++) { try { d = fetchData(_selected[i]); _collected[d.name] = d; } catch (err) { } } _shoutForm.hide(); } function removeSelected() { if (_outPosts > 0) {return;} _watchesForm.querySelector("input.remove").click(); } return MessageModule; })(); octFAH.module.SearchModule = (function () { "use strict"; var _app; var _hoverView; function SearchModule(app) { _app = app; _hoverView = new octFAH.component.HoverView(_app); } return SearchModule; })(); octFAH.module.SubmissionModule = (function () { "use strict"; var _app; var _form; var _self; var _hoverView; function SubmissionModule(app) { _app = app; _form = document.getElementById("messages-form"); _self = this; init(); } function init() { _hoverView = new octFAH.component.HoverView(_app); modSubmissionUI(); } function modSubmissionUI() { var forms; forms = document.querySelectorAll(".actions"); for (var i = 0; i < forms.length; i++) { forms[i].appendChild(makeTabsButton()); } } function makeTabsButton() { return _app .wrap(_app.getHTMLUtil().makeButton("Load In Tabs", handleTabsButton)) .attribute("class", "octoTabsButton button") .element(); } function handleTabsButton() { var boxes = _form.querySelectorAll("input[type=checkbox]:checked"); var id, i; for (i = 0; i < boxes.length; i++) { id = parseInt(boxes[i].getAttribute("value")); if (id > 0) { _app.openArtTab(_app.makeArtLink(id)); } } } return SubmissionModule; })(); octFAH.util.HTML = (function () { "use strict"; function HTML(element) { this._element = (element instanceof Element) ? element : document.createElement(element); } HTML.prototype.append = function (children) { var i; if (children instanceof HTML || children instanceof octFAH.util.HTML) { this._element.appendChild(children.element()); } else if (children instanceof Element) { this._element.appendChild(children); } else if (children instanceof Array) { for (i = 0; i < children.length; i++) { this._element.appendChild(children[i]); } } return this; }; HTML.prototype.style = function (style) { var key, css, e; e = this._element; css = e.style; for (key in style) { if (!style.hasOwnProperty(key)) { continue; } if (typeof css[key] === "undefined") { continue; } css[key] = style[key]; } return this; }; HTML.prototype.parent = function (search) { var parent, i; parent = this._element.parentNode; for (i = 0; i < 300; i++) { if (this.matches(search, parent)) { return new HTML(parent); } parent = parent.parentNode; } return null; }; HTML.prototype.element = function () { return this._element; }; HTML.prototype.click = function (func) { this._element.addEventListener("click", func); return this; }; HTML.prototype.input = function (func) { this._element.addEventListener("input", func); return this; }; HTML.prototype.change = function (func) { this._element.addEventListener("change", func); return this; }; HTML.prototype.attribute = function (key, val) { if (typeof val === "undefined") { return this._element.getAttribute(key); } this._element.setAttribute(key, val); return this; }; HTML.prototype.attributes = function (vals) { var a; for (a in vals) { if (!vals.hasOwnProperty(a)) { continue; } this._element.setAttribute(a, vals[a]); } return this; }; HTML.prototype.matches = function (selector, ref) { if (typeof ref.matches === "function") { return ref.matches(selector); } if (typeof ref.webkitMatchesSelector === "function") { return ref.webkitMatchesSelector(selector); } if (typeof ref.mozMatchesSelector === "function") { return ref.mozMatchesSelector(selector); } if (typeof ref.msMatchesSelector === "function") { return ref.msMatchesSelector(selector); } return false; }; HTML.prototype.addClass = function (c) { var a; a = this._element.classList; if (c instanceof Array) { a.add.apply(a, c); } else if (typeof c === "string") { a.add(c); } return this; }; HTML.prototype.html = function (inner) { if (typeof inner === "undefined") { return this._element.innerHTML; } this._element.innerHTML = inner; return this; }; return HTML; }()); octFAH.util.HTMLUtils = (function () { "use strict"; var _app; function HTMLUtils(app) { _app = app; } HTMLUtils.prototype.append = function (element, children) { var i; for (i = 0; i < children.length; i++) { element.appendChild(children[i]); } return element; }; HTMLUtils.prototype.style = function (element, style) { var key, css, i; if (element instanceof Array) { for (i = 0; i < element.length; i++) { this.style(element[i], style); } return null; } css = element.style; for (key in style) { if (!style.hasOwnProperty(key)) { continue; } if (typeof css[key] === "undefined") { continue; } css[key] = style[key]; } return element; }; HTMLUtils.prototype.makeButton = function (text, click) { var el = document.createElement("input"); el.setAttribute("type", "button"); el.setAttribute("value", text); if (click) { el.addEventListener("click", click); } return el; }; HTMLUtils.prototype.makeCheckBox = function (name, value, checked) { var check = document.createElement("input"); check.setAttribute("type", "checkbox"); if (name) { check.setAttribute("name", name); } if (value) { check.setAttribute("value", value); } if (checked) { check.setAttribute("checked", "checked"); } return check; }; HTMLUtils.prototype.makeSelectOption = function (val, text) { var o = document.createElement("option"); o.setAttribute("value", val); o.innerHTML = text; return o; }; HTMLUtils.prototype.makeSpan = function (text) { var s = document.createElement("span"); s.innerHTML = text; return s; }; HTMLUtils.prototype.makeWrapperLabel = function (text, element, before) { var label, span; before = (typeof before === "undefined") ? true : before; label = document.createElement("label"); span = document.createElement("span"); span.innerHTML = text; label.appendChild(before ? span : element); label.appendChild(before ? element : span); return label; }; HTMLUtils.prototype.parent = function (search, ref) { var parent, i; parent = ref.parentNode; for (i = 0; i < 300; i++) { if (this.matches(search, parent)) { return parent; } parent = parent.parentNode; } return null; }; HTMLUtils.prototype.matches = function (selector, ref) { if (typeof ref.matches === "function") { return ref.matches(selector); } if (typeof ref.webkitMatchesSelector === "function") { return ref.webkitMatchesSelector(selector); } if (typeof ref.mozMatchesSelector === "function") { return ref.mozMatchesSelector(selector); } if (typeof ref.msMatchesSelector === "function") { return ref.msMatchesSelector(selector); } return false; }; HTMLUtils.prototype.jsonToHTML = function (json) { var e, t; t = _app.wrap(json.type); if (json.id) { t.attribute("id", json.id); } if (json.attributes && typeof json.attributes === "object") { t.attributes(json.attributes); } if (json.classes && json.classes instanceof Array) { t.addClass(json.classes); } if (json.text) { t.element.innerHTML = json.text; } if (json.children && typeof json.children === "object") { for (e in json.children) { if (!json.children.hasOwnProperty(e)) { continue; } if (json.children[e] instanceof Element) { t.element.appendChild(json.children[e]); } else { t.element.appendChild(this.jsonToHTML(json.children[e])); } } } return t.element(); }; return HTMLUtils; })(); octFAH.util.Helpers = (function () { "use strict"; var app; var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; var ARGUMENT_NAMES = /([^\s,]+)/g; function Helpers(application) { app = application; } Helpers.prototype.toPx = function (i) { return i.toString() + "px"; }; Helpers.prototype.getBrowserType = function () { var agent, tem, matches; agent = navigator.userAgent; matches = agent.match(/(opera|chrome|safari|firefox|msie|trident(?=\/))\/?\s*(\d+)/i) || []; if (/trident/i.test(matches[1])) { tem = /\brv[ :]+(\d+)/g.exec(agent) || []; return {name: "IE", version: (tem[1] || "")}; } if (matches[1] === "Chrome") { tem = agent.match(/\bOPR\/(\d+)/); if (tem !== null) { return {name: "Opera", version: tem[1]}; } } matches = matches[2] ? [matches[1], matches[2]] : [navigator.appName, navigator.appVersion, "-?"]; tem = agent.match(/version\/(\d+)/i); if (tem !== null) { matches.splice(1, 1, tem[1]); } return { name: matches[0], version: matches[1] }; }; Helpers.prototype.forEach = function (collection, func) { var length, i, key, a, keys, s; s = this.getParamNames(func).length; if (collection instanceof Array) { a = true; length = collection.length; } else if (collection instanceof Object) { a = false; keys = Object.keys(collection); length = keys.length; } else { return false; } for (i = 0; i < length; i++) { key = a ? i : keys[i]; if (s === 1) { if (func(collection[key]) === false) { return; } } else if (s > 1) { if (func(key, collection[key]) === false) { return; } } else { if (func() === false) { return; } } } }; Helpers.prototype.getParamNames = function (func) { var fnStr, result; fnStr = func.toString().replace(STRIP_COMMENTS, ""); result = fnStr.slice(fnStr.indexOf("(") + 1, fnStr.indexOf(")")).match(ARGUMENT_NAMES); if (result === null) { result = []; } return result; }; return Helpers; }()); octFAH.util.Browser = (function () { "use strict"; function Browser() { } Browser.prototype.makeNewTab = function (url, background) { GM_openInTab(url, background); }; return Browser; })(); octFAH.util.Storage = (function () { "use strict"; function Storage() { } Storage.prototype.fetchValue = function (key, defValue) { return GM_getValue(key, defValue); }; Storage.prototype.pushValue = function (key, value) { GM_setValue(key, value); }; return Storage; })(); var app; app= new octFAH.core.Application(); })();