diff --git a/4chan_x.js b/4chan_x.js
index 3bf24d0ef..bfefa1bd6 100644
--- a/4chan_x.js
+++ b/4chan_x.js
@@ -59,7 +59,7 @@
*/
(function() {
- var $, $$, NAMESPACE, autoWatch, callback, changeCheckbox, changeValue, config, d, delform, el, expand, expandComment, expandThread, g, imageClick, imageExpand, imageExpandClick, imageHover, imageResize, imageThumb, imageToggle, imageType, imageTypeChange, keybinds, log, nav, navtopr, nodeInserted, option, options, pathname, qr, recaptcha, recaptchaListener, recaptchaReload, redirect, replyHiding, replyNav, report, scroll, scrollThread, temp, text, threadHiding, tzOffset, ui, updateFavicon, updateTitle, updater, watcher, _config, _i, _j, _k, _len, _len2, _len3, _ref, _ref2, _ref3, _ref4;
+ var $, $$, NAMESPACE, autoWatch, callback, changeCheckbox, changeValue, config, d, delform, el, expand, expandComment, expandThread, g, imageClick, imageExpand, imageExpandClick, imageHover, imageResize, imageThumb, imageToggle, imageType, imageTypeChange, keybinds, log, nav, navtopr, nodeInserted, option, options, pathname, qr, recaptcha, recaptchaListener, recaptchaReload, redirect, replyHiding, report, scroll, scrollThread, temp, text, threadHiding, tzOffset, ui, updateFavicon, updateTitle, updater, watcher, _config, _i, _j, _k, _len, _len2, _len3, _ref, _ref2, _ref3, _ref4;
var __slice = Array.prototype.slice;
if (typeof console != "undefined" && console !== null) {
log = console.log;
@@ -418,11 +418,6 @@
}
return _results;
};
- autoWatch = function() {
- var autoText;
- autoText = $('textarea', this).value.slice(0, 25);
- return GM_setValue('autoText', "/" + g.BOARD + "/ - " + autoText);
- };
expandComment = {
init: function() {
var a, _i, _len, _ref, _results;
@@ -670,98 +665,6 @@
}
}
};
- imageClick = function(e) {
- if (e.shiftKey || e.altKey || e.ctrlKey) {
- return;
- }
- e.preventDefault();
- return imageToggle(this);
- };
- imageToggle = function(image) {
- var ch, cw, imageType, thumb;
- thumb = image.firstChild;
- cw = d.body.clientWidth;
- ch = d.body.clientHeight;
- imageType = $("#imageType").value;
- if (thumb.className === 'hide') {
- return imageThumb(thumb);
- } else {
- return imageExpand(thumb, cw, ch, imageType);
- }
- };
- imageTypeChange = function() {
- var ch, cw, image, imageType, images, _i, _len, _results;
- images = $$('img[md5] + img');
- cw = d.body.clientWidth;
- ch = d.body.clientHeight;
- imageType = this.value;
- _results = [];
- for (_i = 0, _len = images.length; _i < _len; _i++) {
- image = images[_i];
- _results.push(imageResize(cw, ch, imageType, image));
- }
- return _results;
- };
- imageExpandClick = function() {
- var ch, cw, imageType, thumb, thumbs, _i, _j, _len, _len2, _results, _results2;
- thumbs = $$('img[md5]');
- g.expand = this.checked;
- cw = d.body.clientWidth;
- ch = d.body.clientHeight;
- imageType = $("#imageType").value;
- if (this.checked) {
- _results = [];
- for (_i = 0, _len = thumbs.length; _i < _len; _i++) {
- thumb = thumbs[_i];
- _results.push(thumb.className !== 'hide' ? imageExpand(thumb, cw, ch, imageType) : void 0);
- }
- return _results;
- } else {
- _results2 = [];
- for (_j = 0, _len2 = thumbs.length; _j < _len2; _j++) {
- thumb = thumbs[_j];
- _results2.push(thumb.className === 'hide' ? imageThumb(thumb) : void 0);
- }
- return _results2;
- }
- };
- imageExpand = function(thumb, cw, ch, imageType) {
- var image, link;
- thumb.className = 'hide';
- link = thumb.parentNode;
- image = $.el('img', {
- src: link.href
- });
- link.appendChild(image);
- return imageResize(cw, ch, imageType, image);
- };
- imageResize = function(cw, ch, imageType, image) {
- var ih, iw, ratio, _, _ref;
- _ref = $.x("preceding::span[@class][1]/text()[2]", image).textContent.match(/(\d+)x(\d+)/), _ = _ref[0], iw = _ref[1], ih = _ref[2];
- iw = Number(iw);
- ih = Number(ih);
- switch (imageType) {
- case 'full':
- image.removeAttribute('style');
- break;
- case 'fit width':
- if (iw > cw) {
- image.style.width = '100%';
- image.style.margin = '0px';
- }
- break;
- case 'fit screen':
- ratio = Math.min(cw / iw, ch / ih);
- if (ratio < 1) {
- image.style.width = Math.floor(ratio * iw);
- return image.style.margin = '0px';
- }
- }
- };
- imageThumb = function(thumb) {
- thumb.className = '';
- return $.remove(thumb.nextSibling);
- };
keybinds = {
init: function() {
$.bind(d, 'keydown', keybinds.cb.keydown);
@@ -1002,48 +905,6 @@
return window.scrollBy(0, top);
}
};
- scrollThread = function(count) {
- var hash, idx, temp, thread, top, _ref;
- _ref = getThread(), thread = _ref[0], idx = _ref[1];
- top = thread.getBoundingClientRect().top;
- if (idx === 0 && top > 1) {
- idx = -1;
- }
- if (count < 0 && top < -1) {
- count++;
- }
- temp = idx + count;
- if (temp < 0) {
- hash = '';
- } else if (temp > 9) {
- hash = 'p9';
- } else {
- hash = "p" + temp;
- }
- return location.hash = hash;
- };
- nodeInserted = function(e) {
- var callback, dialog, target, _i, _len, _ref, _results;
- target = e.target;
- if (target.nodeName === 'TABLE') {
- _ref = g.callbacks;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- callback = _ref[_i];
- _results.push(callback(target));
- }
- return _results;
- } else if (target.id === 'recaptcha_challenge_field' && (dialog = $('#qr'))) {
- $('#recaptcha_image img', dialog).src = "http://www.google.com/recaptcha/api/image?c=" + target.value;
- return $('#recaptcha_challenge_field', dialog).value = target.value;
- }
- };
- changeCheckbox = function() {
- return GM_setValue(this.name, this.checked);
- };
- changeValue = function() {
- return GM_setValue(this.name, this.value);
- };
options = {
init: function() {
var a, home;
@@ -1362,76 +1223,6 @@
}
}
};
- recaptchaListener = function(e) {
- if (e.keyCode === 8 && this.value === '') {
- return recaptchaReload();
- }
- };
- recaptchaReload = function() {
- return window.location = 'javascript:Recaptcha.reload()';
- };
- redirect = function() {
- var url;
- switch (g.BOARD) {
- case 'a':
- case 'g':
- case 'lit':
- case 'sci':
- case 'tv':
- url = "http://green-oval.net/cgi-board.pl/" + g.BOARD + "/thread/" + g.THREAD_ID;
- break;
- case 'cgl':
- case 'jp':
- case 'm':
- case 'tg':
- url = "http://archive.easymodo.net/cgi-board.pl/" + g.BOARD + "/thread/" + g.THREAD_ID;
- break;
- case '3':
- case 'adv':
- case 'an':
- case 'c':
- case 'ck':
- case 'co':
- case 'fa':
- case 'fit':
- case 'int':
- case 'k':
- case 'mu':
- case 'n':
- case 'o':
- case 'p':
- case 'po':
- case 'soc':
- case 'sp':
- case 'toy':
- case 'trv':
- case 'v':
- case 'vp':
- case 'x':
- url = "http://archive.no-ip.org/" + g.BOARD + "/thread/" + g.THREAD_ID;
- break;
- default:
- url = "http://boards.4chan.org/" + g.BOARD;
- }
- return location.href = url;
- };
- replyNav = function() {
- var direction, op;
- if (g.REPLY) {
- return window.location = this.textContent === '▲' ? '#navtop' : '#navbot';
- } else {
- direction = this.textContent === '▲' ? 'preceding' : 'following';
- op = $.x("" + direction + "::span[starts-with(@id, 'nothread')][1]", this).id;
- return window.location = "#" + op;
- }
- };
- report = function() {
- var input;
- input = $.x('preceding-sibling::input[1]', this);
- input.click();
- $('input[value="Report"]').click();
- return input.click();
- };
threadHiding = {
init: function() {
var a, hiddenThreads, node, op, thread, _i, _len, _ref, _results;
@@ -1544,33 +1335,6 @@
}
}
};
- updateFavicon = function() {
- var clone, favicon, href, len;
- len = g.replies.length;
- if (g.dead) {
- if (len > 0) {
- href = g.favDeadHalo;
- } else {
- href = g.favDead;
- }
- } else {
- if (len > 0) {
- href = g.favHalo;
- } else {
- href = g.favDefault;
- }
- }
- favicon = $('link[rel="shortcut icon"]', d);
- clone = favicon.cloneNode(true);
- clone.href = href;
- return $.replace(favicon, clone);
- };
- updateTitle = function() {
- var len;
- len = g.replies.length;
- d.title = d.title.replace(/\d+/, len);
- return updateFavicon();
- };
updater = {
init: function() {
var autoUpT, checked, conf, dialog, html, input, interva, name, title, updNow, verbose, _i, _len, _ref;
@@ -1796,6 +1560,232 @@
return watcher.addLink(props);
}
};
+ scrollThread = function(count) {
+ var hash, idx, temp, thread, top, _ref;
+ _ref = getThread(), thread = _ref[0], idx = _ref[1];
+ top = thread.getBoundingClientRect().top;
+ if (idx === 0 && top > 1) {
+ idx = -1;
+ }
+ if (count < 0 && top < -1) {
+ count++;
+ }
+ temp = idx + count;
+ if (temp < 0) {
+ hash = '';
+ } else if (temp > 9) {
+ hash = 'p9';
+ } else {
+ hash = "p" + temp;
+ }
+ return location.hash = hash;
+ };
+ nodeInserted = function(e) {
+ var callback, dialog, target, _i, _len, _ref, _results;
+ target = e.target;
+ if (target.nodeName === 'TABLE') {
+ _ref = g.callbacks;
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ callback = _ref[_i];
+ _results.push(callback(target));
+ }
+ return _results;
+ } else if (target.id === 'recaptcha_challenge_field' && (dialog = $('#qr'))) {
+ $('#recaptcha_image img', dialog).src = "http://www.google.com/recaptcha/api/image?c=" + target.value;
+ return $('#recaptcha_challenge_field', dialog).value = target.value;
+ }
+ };
+ autoWatch = function() {
+ var autoText;
+ autoText = $('textarea', this).value.slice(0, 25);
+ return GM_setValue('autoText', "/" + g.BOARD + "/ - " + autoText);
+ };
+ imageClick = function(e) {
+ if (e.shiftKey || e.altKey || e.ctrlKey) {
+ return;
+ }
+ e.preventDefault();
+ return imageToggle(this);
+ };
+ imageToggle = function(image) {
+ var ch, cw, imageType, thumb;
+ thumb = image.firstChild;
+ cw = d.body.clientWidth;
+ ch = d.body.clientHeight;
+ imageType = $("#imageType").value;
+ if (thumb.className === 'hide') {
+ return imageThumb(thumb);
+ } else {
+ return imageExpand(thumb, cw, ch, imageType);
+ }
+ };
+ imageTypeChange = function() {
+ var ch, cw, image, imageType, images, _i, _len, _results;
+ images = $$('img[md5] + img');
+ cw = d.body.clientWidth;
+ ch = d.body.clientHeight;
+ imageType = this.value;
+ _results = [];
+ for (_i = 0, _len = images.length; _i < _len; _i++) {
+ image = images[_i];
+ _results.push(imageResize(cw, ch, imageType, image));
+ }
+ return _results;
+ };
+ imageExpandClick = function() {
+ var ch, cw, imageType, thumb, thumbs, _i, _j, _len, _len2, _results, _results2;
+ thumbs = $$('img[md5]');
+ g.expand = this.checked;
+ cw = d.body.clientWidth;
+ ch = d.body.clientHeight;
+ imageType = $("#imageType").value;
+ if (this.checked) {
+ _results = [];
+ for (_i = 0, _len = thumbs.length; _i < _len; _i++) {
+ thumb = thumbs[_i];
+ _results.push(thumb.className !== 'hide' ? imageExpand(thumb, cw, ch, imageType) : void 0);
+ }
+ return _results;
+ } else {
+ _results2 = [];
+ for (_j = 0, _len2 = thumbs.length; _j < _len2; _j++) {
+ thumb = thumbs[_j];
+ _results2.push(thumb.className === 'hide' ? imageThumb(thumb) : void 0);
+ }
+ return _results2;
+ }
+ };
+ imageExpand = function(thumb, cw, ch, imageType) {
+ var image, link;
+ thumb.className = 'hide';
+ link = thumb.parentNode;
+ image = $.el('img', {
+ src: link.href
+ });
+ link.appendChild(image);
+ return imageResize(cw, ch, imageType, image);
+ };
+ imageResize = function(cw, ch, imageType, image) {
+ var ih, iw, ratio, _, _ref;
+ _ref = $.x("preceding::span[@class][1]/text()[2]", image).textContent.match(/(\d+)x(\d+)/), _ = _ref[0], iw = _ref[1], ih = _ref[2];
+ iw = Number(iw);
+ ih = Number(ih);
+ switch (imageType) {
+ case 'full':
+ image.removeAttribute('style');
+ break;
+ case 'fit width':
+ if (iw > cw) {
+ image.style.width = '100%';
+ image.style.margin = '0px';
+ }
+ break;
+ case 'fit screen':
+ ratio = Math.min(cw / iw, ch / ih);
+ if (ratio < 1) {
+ image.style.width = Math.floor(ratio * iw);
+ return image.style.margin = '0px';
+ }
+ }
+ };
+ imageThumb = function(thumb) {
+ thumb.className = '';
+ return $.remove(thumb.nextSibling);
+ };
+ changeCheckbox = function() {
+ return GM_setValue(this.name, this.checked);
+ };
+ changeValue = function() {
+ return GM_setValue(this.name, this.value);
+ };
+ recaptchaListener = function(e) {
+ if (e.keyCode === 8 && this.value === '') {
+ return recaptchaReload();
+ }
+ };
+ recaptchaReload = function() {
+ return window.location = 'javascript:Recaptcha.reload()';
+ };
+ redirect = function() {
+ var url;
+ switch (g.BOARD) {
+ case 'a':
+ case 'g':
+ case 'lit':
+ case 'sci':
+ case 'tv':
+ url = "http://green-oval.net/cgi-board.pl/" + g.BOARD + "/thread/" + g.THREAD_ID;
+ break;
+ case 'cgl':
+ case 'jp':
+ case 'm':
+ case 'tg':
+ url = "http://archive.easymodo.net/cgi-board.pl/" + g.BOARD + "/thread/" + g.THREAD_ID;
+ break;
+ case '3':
+ case 'adv':
+ case 'an':
+ case 'c':
+ case 'ck':
+ case 'co':
+ case 'fa':
+ case 'fit':
+ case 'int':
+ case 'k':
+ case 'mu':
+ case 'n':
+ case 'o':
+ case 'p':
+ case 'po':
+ case 'soc':
+ case 'sp':
+ case 'toy':
+ case 'trv':
+ case 'v':
+ case 'vp':
+ case 'x':
+ url = "http://archive.no-ip.org/" + g.BOARD + "/thread/" + g.THREAD_ID;
+ break;
+ default:
+ url = "http://boards.4chan.org/" + g.BOARD;
+ }
+ return location.href = url;
+ };
+ report = function() {
+ var input;
+ input = $.x('preceding-sibling::input[1]', this);
+ input.click();
+ $('input[value="Report"]').click();
+ return input.click();
+ };
+ updateFavicon = function() {
+ var clone, favicon, href, len;
+ len = g.replies.length;
+ if (g.dead) {
+ if (len > 0) {
+ href = g.favDeadHalo;
+ } else {
+ href = g.favDead;
+ }
+ } else {
+ if (len > 0) {
+ href = g.favHalo;
+ } else {
+ href = g.favDefault;
+ }
+ }
+ favicon = $('link[rel="shortcut icon"]', d);
+ clone = favicon.cloneNode(true);
+ clone.href = href;
+ return $.replace(favicon, clone);
+ };
+ updateTitle = function() {
+ var len;
+ len = g.replies.length;
+ d.title = d.title.replace(/\d+/, len);
+ return updateFavicon();
+ };
NAMESPACE = 'AEOS.4chan_x.';
g = {
cache: {},
diff --git a/script.coffee b/script.coffee
index 9235a1ace..47671ccb1 100644
--- a/script.coffee
+++ b/script.coffee
@@ -274,11 +274,6 @@ $$ = (selector, root=d.body) ->
node for node in result
#funks
-autoWatch = ->
- #TODO look for subject
- autoText = $('textarea', this).value.slice(0, 25)
- GM_setValue('autoText', "/#{g.BOARD}/ - #{autoText}")
-
expandComment =
init: ->
for a in $$ 'span.abbr a'
@@ -474,83 +469,6 @@ imageHover =
$.unbind target, 'mousemove', imageHover.cb.mousemove
$.unbind target, 'mouseout', imageHover.cb.mouseout
-imageClick = (e) ->
- return if e.shiftKey or e.altKey or e.ctrlKey
- e.preventDefault()
- imageToggle this
-
-imageToggle = (image) ->
- # 'image' is actually the container
- thumb = image.firstChild
- cw = d.body.clientWidth
- ch = d.body.clientHeight
- imageType = $("#imageType").value
- if thumb.className is 'hide'
- imageThumb thumb
- else
- imageExpand thumb, cw, ch, imageType
-
-imageTypeChange = ->
- images = $$ 'img[md5] + img'
- cw = d.body.clientWidth
- ch = d.body.clientHeight
- imageType = @value
- for image in images
- imageResize cw, ch, imageType, image
-
-imageExpandClick = ->
- thumbs = $$ 'img[md5]'
- g.expand = @checked
- cw = d.body.clientWidth
- ch = d.body.clientHeight
- imageType = $("#imageType").value
- if @checked #expand
- for thumb in thumbs
- if thumb.className isnt 'hide'
- #hide the thumb and show image
- imageExpand thumb, cw, ch, imageType
- else #contract
- for thumb in thumbs
- if thumb.className is 'hide'
- #unhide thumb and remove image
- imageThumb thumb
-
-
-imageExpand = (thumb, cw, ch, imageType) ->
- thumb.className = 'hide'
- link = thumb.parentNode
- image = $.el 'img',
- src: link.href
- link.appendChild image
-
- imageResize cw, ch, imageType, image
-
-imageResize = (cw, ch, imageType, image) ->
- [_, iw, ih] =
- $.x("preceding::span[@class][1]/text()[2]", image)
- .textContent.match(/(\d+)x(\d+)/)
- iw = Number iw
- ih = Number ih
-
- switch imageType
- when 'full'
- image.removeAttribute 'style'
- return
- when 'fit width'
- if iw > cw
- image.style.width = '100%'
- image.style.margin = '0px'
- break
- when 'fit screen'
- ratio = Math.min cw/iw, ch/ih
- if ratio < 1
- image.style.width = Math.floor ratio * iw
- image.style.margin = '0px'
-
-imageThumb = (thumb) ->
- thumb.className = ''
- $.remove thumb.nextSibling
-
keybinds =
init: ->
$.bind d, 'keydown', keybinds.cb.keydown
@@ -757,40 +675,6 @@ nav =
{top} = nav.threads[i].getBoundingClientRect()
window.scrollBy 0, top
-scrollThread = (count) ->
- [thread, idx] = getThread()
- top = thread.getBoundingClientRect().top
- if idx is 0 and top > 1
- #we haven't scrolled to the first thread
- idx = -1
- if count < 0 and top < -1
- #we've started scrolling past this thread,
- # but now want to read from the beginning
- count++
- temp = idx + count
- if temp < 0
- hash = ''
- else if temp > 9
- hash = 'p9'
- else
- hash = "p#{temp}"
- location.hash = hash
-
-nodeInserted = (e) ->
- target = e.target
- if target.nodeName is 'TABLE'
- for callback in g.callbacks
- callback target
- else if target.id is 'recaptcha_challenge_field' and dialog = $ '#qr'
- $('#recaptcha_image img', dialog).src = "http://www.google.com/recaptcha/api/image?c=" + target.value
- $('#recaptcha_challenge_field', dialog).value = target.value
-
-changeCheckbox = ->
- GM_setValue @name, @checked
-
-changeValue = ->
- GM_setValue @name, @value
-
options =
init: ->
home = $ '#navtopr a'
@@ -1057,39 +941,6 @@ qr =
}
GM_setValue 'watched', JSON.stringify g.watched
-recaptchaListener = (e) ->
- if e.keyCode is 8 and @value is ''
- recaptchaReload()
-
-recaptchaReload = ->
- window.location = 'javascript:Recaptcha.reload()'
-
-redirect = ->
- switch g.BOARD
- when 'a', 'g', 'lit', 'sci', 'tv'
- url = "http://green-oval.net/cgi-board.pl/#{g.BOARD}/thread/#{g.THREAD_ID}"
- when 'cgl', 'jp', 'm', 'tg'
- url = "http://archive.easymodo.net/cgi-board.pl/#{g.BOARD}/thread/#{g.THREAD_ID}"
- when '3', 'adv', 'an', 'c', 'ck', 'co', 'fa', 'fit', 'int', 'k', 'mu', 'n', 'o', 'p', 'po', 'soc', 'sp', 'toy', 'trv', 'v', 'vp', 'x'
- url = "http://archive.no-ip.org/#{g.BOARD}/thread/#{g.THREAD_ID}"
- else
- url = "http://boards.4chan.org/#{g.BOARD}"
- location.href = url
-
-replyNav = ->
- if g.REPLY
- window.location = if @textContent is '▲' then '#navtop' else '#navbot'
- else
- direction = if @textContent is '▲' then 'preceding' else 'following'
- op = $.x("#{direction}::span[starts-with(@id, 'nothread')][1]", this).id
- window.location = "##{op}"
-
-report = ->
- input = $.x('preceding-sibling::input[1]', this)
- input.click()
- $('input[value="Report"]').click()
- input.click()
-
threadHiding =
init: ->
node = $ 'form[name=delform] > *'
@@ -1190,28 +1041,6 @@ threadHiding =
unless node.nodeName is 'CENTER'
threadHiding.thread node
-updateFavicon = ->
- len = g.replies.length
- if g.dead
- if len > 0
- href = g.favDeadHalo
- else
- href = g.favDead
- else
- if len > 0
- href = g.favHalo
- else
- href = g.favDefault
- favicon = $ 'link[rel="shortcut icon"]', d
- clone = favicon.cloneNode true
- clone.href = href
- $.replace favicon, clone
-
-updateTitle = ->
- len = g.replies.length
- d.title = d.title.replace /\d+/, len
- updateFavicon()
-
updater =
init: ->
html = "
"
@@ -1406,6 +1235,169 @@ watcher =
watcher.addLink props
+# TODO rewrite these
+scrollThread = (count) ->
+ [thread, idx] = getThread()
+ top = thread.getBoundingClientRect().top
+ if idx is 0 and top > 1
+ #we haven't scrolled to the first thread
+ idx = -1
+ if count < 0 and top < -1
+ #we've started scrolling past this thread,
+ # but now want to read from the beginning
+ count++
+ temp = idx + count
+ if temp < 0
+ hash = ''
+ else if temp > 9
+ hash = 'p9'
+ else
+ hash = "p#{temp}"
+ location.hash = hash
+
+nodeInserted = (e) ->
+ target = e.target
+ if target.nodeName is 'TABLE'
+ for callback in g.callbacks
+ callback target
+ else if target.id is 'recaptcha_challenge_field' and dialog = $ '#qr'
+ $('#recaptcha_image img', dialog).src = "http://www.google.com/recaptcha/api/image?c=" + target.value
+ $('#recaptcha_challenge_field', dialog).value = target.value
+
+autoWatch = ->
+ #TODO look for subject
+ autoText = $('textarea', this).value.slice(0, 25)
+ GM_setValue('autoText', "/#{g.BOARD}/ - #{autoText}")
+
+imageClick = (e) ->
+ return if e.shiftKey or e.altKey or e.ctrlKey
+ e.preventDefault()
+ imageToggle this
+
+imageToggle = (image) ->
+ # 'image' is actually the container
+ thumb = image.firstChild
+ cw = d.body.clientWidth
+ ch = d.body.clientHeight
+ imageType = $("#imageType").value
+ if thumb.className is 'hide'
+ imageThumb thumb
+ else
+ imageExpand thumb, cw, ch, imageType
+
+imageTypeChange = ->
+ images = $$ 'img[md5] + img'
+ cw = d.body.clientWidth
+ ch = d.body.clientHeight
+ imageType = @value
+ for image in images
+ imageResize cw, ch, imageType, image
+
+imageExpandClick = ->
+ thumbs = $$ 'img[md5]'
+ g.expand = @checked
+ cw = d.body.clientWidth
+ ch = d.body.clientHeight
+ imageType = $("#imageType").value
+ if @checked #expand
+ for thumb in thumbs
+ if thumb.className isnt 'hide'
+ #hide the thumb and show image
+ imageExpand thumb, cw, ch, imageType
+ else #contract
+ for thumb in thumbs
+ if thumb.className is 'hide'
+ #unhide thumb and remove image
+ imageThumb thumb
+
+imageExpand = (thumb, cw, ch, imageType) ->
+ thumb.className = 'hide'
+ link = thumb.parentNode
+ image = $.el 'img',
+ src: link.href
+ link.appendChild image
+
+ imageResize cw, ch, imageType, image
+
+imageResize = (cw, ch, imageType, image) ->
+ [_, iw, ih] =
+ $.x("preceding::span[@class][1]/text()[2]", image)
+ .textContent.match(/(\d+)x(\d+)/)
+ iw = Number iw
+ ih = Number ih
+
+ switch imageType
+ when 'full'
+ image.removeAttribute 'style'
+ return
+ when 'fit width'
+ if iw > cw
+ image.style.width = '100%'
+ image.style.margin = '0px'
+ break
+ when 'fit screen'
+ ratio = Math.min cw/iw, ch/ih
+ if ratio < 1
+ image.style.width = Math.floor ratio * iw
+ image.style.margin = '0px'
+
+imageThumb = (thumb) ->
+ thumb.className = ''
+ $.remove thumb.nextSibling
+
+changeCheckbox = ->
+ GM_setValue @name, @checked
+
+changeValue = ->
+ GM_setValue @name, @value
+
+recaptchaListener = (e) ->
+ if e.keyCode is 8 and @value is ''
+ recaptchaReload()
+
+recaptchaReload = ->
+ window.location = 'javascript:Recaptcha.reload()'
+
+redirect = ->
+ switch g.BOARD
+ when 'a', 'g', 'lit', 'sci', 'tv'
+ url = "http://green-oval.net/cgi-board.pl/#{g.BOARD}/thread/#{g.THREAD_ID}"
+ when 'cgl', 'jp', 'm', 'tg'
+ url = "http://archive.easymodo.net/cgi-board.pl/#{g.BOARD}/thread/#{g.THREAD_ID}"
+ when '3', 'adv', 'an', 'c', 'ck', 'co', 'fa', 'fit', 'int', 'k', 'mu', 'n', 'o', 'p', 'po', 'soc', 'sp', 'toy', 'trv', 'v', 'vp', 'x'
+ url = "http://archive.no-ip.org/#{g.BOARD}/thread/#{g.THREAD_ID}"
+ else
+ url = "http://boards.4chan.org/#{g.BOARD}"
+ location.href = url
+
+report = ->
+ input = $.x('preceding-sibling::input[1]', this)
+ input.click()
+ $('input[value="Report"]').click()
+ input.click()
+
+updateFavicon = ->
+ len = g.replies.length
+ if g.dead
+ if len > 0
+ href = g.favDeadHalo
+ else
+ href = g.favDead
+ else
+ if len > 0
+ href = g.favHalo
+ else
+ href = g.favDefault
+ favicon = $ 'link[rel="shortcut icon"]', d
+ clone = favicon.cloneNode true
+ clone.href = href
+ $.replace favicon, clone
+
+updateTitle = ->
+ len = g.replies.length
+ d.title = d.title.replace /\d+/, len
+ updateFavicon()
+
#main
NAMESPACE = 'AEOS.4chan_x.'
g =