diff --git a/4chan_x.js b/4chan_x.js index 85eb46427..be6fe9445 100644 --- a/4chan_x.js +++ b/4chan_x.js @@ -58,7 +58,7 @@ */ (function() { - var $, $$, NAMESPACE, a, arr, as, autoWatch, callback, changeCheckbox, changeValue, clearHidden, config, d, delform, down, editSauce, el, expand, expandComment, expandThread, g, getThread, href, i, imageClick, imageExpand, imageExpandClick, imageHover, imageResize, imageThumb, imageToggle, imageType, imageTypeChange, keyModeInsert, keyModeNormal, keydown, keypress, l1, log, navbotr, navtopr, nodeInserted, omitted, onloadComment, onloadThread, option, options, parseResponse, pathname, qr, recaptcha, recaptchaListener, recaptchaReload, redirect, replyHiding, replyNav, report, request, scroll, scrollThread, span, temp, text, textContent, threadHiding, tzOffset, ui, up, updateAuto, updateCallback, updateFavicon, updateInterval, updateNow, updateTime, updateTitle, updateVerbose, updaterMake, watcher, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _ref, _ref2, _ref3, _ref4; + var $, $$, NAMESPACE, a, arr, as, autoWatch, callback, changeCheckbox, changeValue, config, d, delform, down, el, expand, expandComment, expandThread, g, getThread, href, i, imageClick, imageExpand, imageExpandClick, imageHover, imageResize, imageThumb, imageToggle, imageType, imageTypeChange, keyModeInsert, keyModeNormal, keydown, keypress, l1, log, navtopr, nodeInserted, omitted, onloadComment, onloadThread, option, options, parseResponse, pathname, qr, recaptcha, recaptchaListener, recaptchaReload, redirect, replyHiding, replyNav, report, request, scroll, scrollThread, span, temp, text, textContent, threadHiding, tzOffset, ui, up, updateAuto, updateCallback, updateFavicon, updateInterval, updateNow, updateTime, updateTitle, updateVerbose, updaterMake, watcher, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _ref, _ref2, _ref3, _ref4; var __slice = Array.prototype.slice; if (typeof console != "undefined" && console !== null) { log = console.log; @@ -226,6 +226,14 @@ return object; }; $.extend($, { + cb: { + checked: function() { + return GM_setValue(this.name, this.checked); + }, + value: function() { + return GM_setValue(this.name, this.value); + } + }, deleteValue: function(name) { name = NAMESPACE + name; return delete localStorage[name]; @@ -380,21 +388,6 @@ autoText = $('textarea', this).value.slice(0, 25); return GM_setValue('autoText', "/" + g.BOARD + "/ - " + autoText); }; - clearHidden = function() { - $.deleteValue("hiddenReply/" + g.BOARD + "/"); - $.deleteValue("hiddenThread/" + g.BOARD + "/"); - this.value = "hidden: 0"; - return g.hiddenReplies = {}; - }; - editSauce = function() { - var ta; - ta = $('#options textarea'); - if (ta.style.display) { - return $.show(ta); - } else { - return $.hide(ta); - } - }; expandComment = function(e) { var a, href, r; e.preventDefault(); @@ -898,37 +891,77 @@ changeValue = function() { return GM_setValue(this.name, this.value); }; - options = function() { - var checked, description, div, hiddenNum, hiddenThread, html, input, option, value, _i, _len, _ref; - if (div = $('#options')) { - $.remove(div); - return; + options = { + init: function() { + var a, home; + home = $('#navtopr a'); + a = $.el('a', { + textContent: '4chan X' + }); + $.bind(a, 'click', options.toggle); + $.replace(home, a); + home = $('#navbotr a'); + a = $.el('a', { + textContent: '4chan X' + }); + $.bind(a, 'click', options.toggle); + return $.replace(home, a); + }, + toggle: function() { + var dialog; + if (dialog = $('#options')) { + return $.remove(dialog); + } else { + return options.dialog(); + } + }, + dialog: function() { + var checked, dialog, hiddenNum, hiddenThread, html, input, name, title, _i, _len, _ref; + html = "
Options X
"; + for (name in config) { + title = config[name][1]; + checked = $.config(name) ? "checked" : ""; + html += "
"; + } + html += "
Flavors
"; + html += "
"; + hiddenThread = $.getValue("hiddenThread/" + g.BOARD + "/", {}); + hiddenNum = Object.keys(g.hiddenReply).length + Object.keys(hiddenThread).length; + html += "
"; + html += "
"; + html += "
support throd
"; + html += '
Donate
'; + dialog = ui.dialog('options', { + top: '25%', + left: '50%' + }, html); + _ref = $$('input[type=checkbox]', dialog); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + input = _ref[_i]; + $.bind(input, 'click', $.cb.checked); + } + $.bind($('input[type=button]', dialog), 'click', options.cb.clearHidden); + $.bind($('a[name=flavors]', dialog), 'click', options.flavors); + $.bind($('textarea', dialog), 'change', $.cb.value); + return $.append(d.body, dialog); + }, + flavors: function() { + var ta; + ta = $('#options textarea'); + if (ta.style.display) { + return $.show(ta); + } else { + return $.hide(ta); + } + }, + cb: { + clearHidden: function(e) { + $.deleteValue("hiddenReply/" + g.BOARD + "/"); + $.deleteValue("hiddenThread/" + g.BOARD + "/"); + this.value = "hidden: 0"; + return g.hiddenReplies = {}; + } } - hiddenThread = $.getValue("hiddenThread/" + g.BOARD + "/", {}); - hiddenNum = Object.keys(g.hiddenReply).length + Object.keys(hiddenThread).length; - html = '
Options X
'; - for (option in config) { - value = config[option]; - description = value[1]; - checked = $.config(option) ? "checked" : ""; - html += "
"; - } - html += "
Flavors
"; - html += "
"; - html += "
"; - html += "
"; - html += "
support
"; - html += '
Donate
'; - div = ui.dialog('options', 'center', html); - _ref = $$('input[type="checkbox"]', div); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - input = _ref[_i]; - $.bind(input, 'change', changeCheckbox); - } - $.bind($('a.sauce', div), 'click', editSauce); - $.bind($('textarea', div), 'change', changeValue); - $.bind($('input[type="button"]', div), 'click', clearHidden); - return $.append(d.body, div); }; parseResponse = function(responseText) { var body, opbq, replies; @@ -1650,7 +1683,7 @@ favDeadHalo: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAWUlEQVR4XrWSAQoAIAgD/f+njSApsTqjGoTQ5oGWPJMOOs60CzsWwIwz1I4PUIYh+WYEMGQ6I/txw91kP4oA9BdwhKp1My4xQq6e8Q9ANgDJjOErewFiNesV2uGSfGv1/HYAAAAASUVORK5CYII=', favDefault: ((_ref = $('link[rel="shortcut icon"]', d)) != null ? _ref.href : void 0) || '', favEmpty: 'data:image/gif;base64,R0lGODlhEAAQAJEAAAAAAP///9vb2////yH5BAEAAAMALAAAAAAQABAAAAIvnI+pq+D9DBAUoFkPFnbs7lFZKIJOJJ3MyraoB14jFpOcVMpzrnF3OKlZYsMWowAAOw==', - flavors: ['http://regex.info/exif.cgi?url=', 'http://iqdb.org/?url=', 'http://saucenao.com/search.php?db=999&url=', 'http://tineye.com/search?url='].join('\n'), + flavors: ['http://regex.info/exif.cgi?url=', 'http://iqdb.org/?url=', 'http://tineye.com/search?url='].join('\n'), xhrs: [] }; g.favHalo = /ws/.test(g.favDefault) ? 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAZklEQVR4XrWRQQoAIQwD+6L97j7Ih9WTQQxhDqJQCk4Mranuvqod6LgwawSqSuUmWSPw/UNlJlnDAmA2ARjABLYj8ZyCzJHHqOg+GdAKZmKPIQUzuYrxicHqEgHzP9g7M0+hj45sAnRWxtPj3zSPAAAAAElFTkSuQmCC' : 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAgMAAABinRfyAAAADFBMVEUAAABmzDP///8AAABet0i+AAAAAXRSTlMAQObYZgAAAExJREFUeF4tyrENgDAMAMFXKuQswQLBG3mOlBnFS1gwDfIYLpEivvjq2MlqjmYvYg5jWEzCwtDSQlwcXKCVLrpFbvLvvSf9uZJ2HusDtJAY7Tkn1oYAAAAASUVORK5CYII='; @@ -1785,19 +1818,7 @@ return; } if (navtopr = $('#navtopr a')) { - a = $.el('a', { - textContent: '4chan X', - className: 'pointer' - }); - $.bind(a, 'click', options); - $.replace(navtopr, a); - navbotr = $('#navbotr a'); - a = $.el('a', { - textContent: '4chan X', - className: 'pointer' - }); - $.bind(a, 'click', options); - $.replace(navbotr, a); + options.init(); } else if ($.config('404 Redirect') && d.title === '4chan - 404') { redirect(); } else { @@ -1942,7 +1963,7 @@ } if ($.config('Quick Report')) { g.callbacks.push(function(root) { - var arr, el, _i, _len, _results; + var a, arr, el, _i, _len, _results; arr = $$('span[id^=no]', root); _results = []; for (_i = 0, _len = arr.length; _i < _len; _i++) { diff --git a/script.coffee b/script.coffee index 6a5ed616b..49ad74d37 100644 --- a/script.coffee +++ b/script.coffee @@ -128,6 +128,11 @@ $.extend = (object, properties) -> object $.extend $, + cb: + checked: -> + GM_setValue @name, @checked + value: -> + GM_setValue @name, @value deleteValue: (name) -> name = NAMESPACE + name delete localStorage[name] @@ -243,18 +248,6 @@ autoWatch = -> autoText = $('textarea', this).value.slice(0, 25) GM_setValue('autoText', "/#{g.BOARD}/ - #{autoText}") -clearHidden = -> - #'hidden' might be misleading; it's the number of IDs we're *looking* for, - # not the number of posts actually hidden on the page. - $.deleteValue "hiddenReply/#{g.BOARD}/" - $.deleteValue "hiddenThread/#{g.BOARD}/" - @value = "hidden: 0" - g.hiddenReplies = {} - -editSauce = -> - ta = $ '#options textarea' - if ta.style.display then $.show ta else $.hide ta - expandComment = (e) -> e.preventDefault() a = this @@ -656,33 +649,62 @@ changeCheckbox = -> changeValue = -> GM_setValue @name, @value -options = -> - if div = $ '#options' - $.remove div - return +options = + init: -> + home = $ '#navtopr a' + a = $.el 'a', + textContent: '4chan X' + $.bind a, 'click', options.toggle + $.replace home, a + home = $ '#navbotr a' + a = $.el 'a', + textContent: '4chan X' + $.bind a, 'click', options.toggle + $.replace home, a - hiddenThread = $.getValue "hiddenThread/#{g.BOARD}/", {} - hiddenNum = Object.keys(g.hiddenReply).length + Object.keys(hiddenThread).length - html = '
Options X
' - for option, value of config - description = value[1] - checked = if $.config option then "checked" else "" - html += "
" - html += "
Flavors
" - html += "
" - html += "
" - html += "
" - html += "
support
" - html += '
Donate
' + toggle: -> + if dialog = $ '#options' + $.remove dialog + else + options.dialog() - div = ui.dialog 'options', 'center', html + dialog: -> + html = "
Options X
" + for name of config + title = config[name][1] + checked = if $.config name then "checked" else "" + html += "
" + html += "
Flavors
" + html += "
" - for input in $$ 'input[type="checkbox"]', div - $.bind input, 'change', changeCheckbox - $.bind $('a.sauce', div), 'click', editSauce - $.bind $('textarea', div), 'change', changeValue - $.bind $('input[type="button"]', div), 'click', clearHidden - $.append d.body, div + hiddenThread = $.getValue "hiddenThread/#{g.BOARD}/", {} + hiddenNum = Object.keys(g.hiddenReply).length + Object.keys(hiddenThread).length + html += "
" + + html += "
" + html += "
support throd
" + html += '
Donate
' + + dialog = ui.dialog 'options', top: '25%', left: '50%', html + for input in $$ 'input[type=checkbox]', dialog + $.bind input, 'click', $.cb.checked + $.bind $('input[type=button]', dialog), 'click', options.cb.clearHidden + $.bind $('a[name=flavors]', dialog), 'click', options.flavors + $.bind $('textarea', dialog), 'change', $.cb.value + $.append d.body, dialog + + flavors: -> + ta = $ '#options textarea' + if ta.style.display then $.show ta else $.hide ta + + cb: + clearHidden: (e) -> + #'hidden' might be misleading; it's the number of IDs we're *looking* for, + # not the number of posts actually hidden on the page. + $.deleteValue "hiddenReply/#{g.BOARD}/" + $.deleteValue "hiddenThread/#{g.BOARD}/" + @value = "hidden: 0" + g.hiddenReplies = {} parseResponse = (responseText) -> body = $.el 'body', @@ -1280,7 +1302,6 @@ g = flavors: [ 'http://regex.info/exif.cgi?url=' 'http://iqdb.org/?url=' - 'http://saucenao.com/search.php?db=999&url=' 'http://tineye.com/search?url=' ].join '\n' xhrs: [] @@ -1416,17 +1437,7 @@ if location.hostname is 'sys.4chan.org' qr.sys() return if navtopr = $ '#navtopr a' - a = $.el 'a', - textContent: '4chan X' - className: 'pointer' - $.bind a, 'click', options - $.replace navtopr, a - navbotr = $ '#navbotr a' - a = $.el 'a', - textContent: '4chan X' - className: 'pointer' - $.bind a, 'click', options - $.replace navbotr, a + options.init() else if $.config('404 Redirect') and d.title is '4chan - 404' redirect() else