floating navlinks

This commit is contained in:
James Campos 2011-04-09 00:16:04 -07:00
parent de6794515f
commit b1b46f6d90
2 changed files with 170 additions and 143 deletions

View File

@ -59,7 +59,7 @@
*/ */
(function() { (function() {
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, updater, updaterMake, watcher, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _ref, _ref2, _ref3, _ref4; var $, $$, NAMESPACE, a, as, autoWatch, callback, changeCheckbox, changeValue, config, d, delform, el, expand, expandComment, expandThread, g, imageClick, imageExpand, imageExpandClick, imageHover, imageResize, imageThumb, imageToggle, imageType, imageTypeChange, keyModeInsert, keyModeNormal, keydown, keypress, log, nav, navtopr, nodeInserted, omitted, onloadComment, onloadThread, option, options, parseResponse, pathname, qr, recaptcha, recaptchaListener, recaptchaReload, redirect, replyHiding, replyNav, report, request, scroll, scrollThread, span, temp, text, threadHiding, tzOffset, ui, updateAuto, updateCallback, updateFavicon, updateInterval, updateNow, updateTime, updateTitle, updateVerbose, updater, updaterMake, watcher, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _m, _ref, _ref2, _ref3, _ref4;
var __slice = Array.prototype.slice; var __slice = Array.prototype.slice;
if (typeof console != "undefined" && console !== null) { if (typeof console != "undefined" && console !== null) {
log = console.log; log = console.log;
@ -452,17 +452,6 @@
id: id id: id
}); });
}; };
getThread = function() {
var bottom, i, thread, threads, _len;
threads = $$('div.thread');
for (i = 0, _len = threads.length; i < _len; i++) {
thread = threads[i];
bottom = thread.getBoundingClientRect().bottom;
if (bottom > 0) {
return [thread, i];
}
}
};
replyHiding = { replyHiding = {
init: function() { init: function() {
return g.callbacks.push(replyHiding.cb.node); return g.callbacks.push(replyHiding.cb.node);
@ -842,6 +831,89 @@
return watch.call(watchButton); return watch.call(watchButton);
} }
}; };
nav = {
init: function() {
var down, span, up;
span = $.el('span', {
id: 'navlinks'
});
up = $.el('a', {
textContent: '▲'
});
down = $.el('a', {
textContent: '▼'
});
$.bind(up, 'click', nav.up);
$.bind(down, 'click', nav.down);
$.append(span, up, $.tn(' '), down);
return $.append(d.body, span);
},
up: function() {
var i, rect, thread, top, _ref;
_ref = nav.getThread(), thread = _ref[0], i = _ref[1], rect = _ref[2];
top = rect.top;
if (top > 1) {
i = -1;
} else if (Math.floor(Math.abs(top)) === 0) {
i -= 1;
}
return nav.setThread(i);
},
down: function() {
var i, rect, thread, _ref;
_ref = nav.getThread(), thread = _ref[0], i = _ref[1], rect = _ref[2];
if (!(rect.top > 1)) {
i += 1;
}
return nav.setThread(i);
},
getThread: function() {
var bottom, i, rect, thread, threads, _len;
nav.threads = threads = $$('div.thread');
for (i = 0, _len = threads.length; i < _len; i++) {
thread = threads[i];
rect = thread.getBoundingClientRect();
bottom = rect.bottom;
if (bottom > 0) {
return [thread, i, rect];
}
}
},
setThread: function(i) {
var top;
if (i === -1) {
window.scrollTo(0, 0);
return;
}
if (i === 10) {
window.location = "" + (g.PAGENUM + 1) + "#p0";
return;
}
top = nav.threads[i].getBoundingClientRect().top;
window.scrollBy(0, top);
return delete nav.threads;
}
};
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) { nodeInserted = function(e) {
var callback, dialog, target, _i, _len, _ref, _results; var callback, dialog, target, _i, _len, _ref, _results;
target = e.target; target = e.target;
@ -1303,26 +1375,6 @@
$('input[value="Report"]').click(); $('input[value="Report"]').click();
return input.click(); return input.click();
}; };
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;
};
threadHiding = { threadHiding = {
init: function() { init: function() {
var a, hiddenThreads, id, node, thread, _i, _len, _ref, _results; var a, hiddenThreads, id, node, thread, _i, _len, _ref, _results;
@ -1866,13 +1918,13 @@
iframe {\ iframe {\
display: none;\ display: none;\
}\ }\
span.navlinks {\ #navlinks {\
position: absolute;\ position: fixed;\
top: 25px;\
right: 5px;\ right: 5px;\
}\ }\
span.navlinks > a {\ #navlinks > a {\
font-size: 16px;\ font-size: 16px;\
text-decoration: none;\
}\ }\
.hide {\ .hide {\
display: none;\ display: none;\
@ -2142,51 +2194,11 @@
$.bind($('form[name=post]'), 'submit', autoWatch); $.bind($('form[name=post]'), 'submit', autoWatch);
} }
if ($.config('Thread Navigation')) { if ($.config('Thread Navigation')) {
arr = $$('div > span.filesize, form > span.filesize'); nav.init();
l1 = arr.length - 1;
for (i = 0, _len3 = arr.length; i < _len3; i++) {
el = arr[i];
span = $.el('span', {
className: 'navlinks',
id: 'p' + i
});
if (i) {
textContent = '▲';
href = "#p" + (i - 1);
} else if (g.PAGENUM) {
textContent = '◀';
href = "" + (g.PAGENUM - 1) + "#p0";
} else {
textContent = '▲';
href = "#navtop";
}
up = $.el('a', {
className: 'pointer',
textContent: textContent,
href: href
});
if (i < l1) {
textContent = '▼';
href = "#p" + (i + 1);
} else {
textContent = '▶';
href = "" + (g.PAGENUM + 1) + "#p0";
}
down = $.el('a', {
className: 'pointer',
textContent: textContent,
href: href
});
$.append(span, up, $.tn(' '), down);
$.before(el, span);
}
if (location.hash === '#p0') {
window.location = window.location;
}
} }
if ($.config('Thread Expansion')) { if ($.config('Thread Expansion')) {
omitted = $$('span.omittedposts'); omitted = $$('span.omittedposts');
for (_k = 0, _len4 = omitted.length; _k < _len4; _k++) { for (_k = 0, _len3 = omitted.length; _k < _len3; _k++) {
span = omitted[_k]; span = omitted[_k];
a = $.el('a', { a = $.el('a', {
className: 'pointer omittedposts', className: 'pointer omittedposts',
@ -2198,14 +2210,14 @@
} }
if ($.config('Comment Expansion')) { if ($.config('Comment Expansion')) {
as = $$('span.abbr a'); as = $$('span.abbr a');
for (_l = 0, _len5 = as.length; _l < _len5; _l++) { for (_l = 0, _len4 = as.length; _l < _len4; _l++) {
a = as[_l]; a = as[_l];
$.bind(a, 'click', expandComment); $.bind(a, 'click', expandComment);
} }
} }
} }
_ref4 = g.callbacks; _ref4 = g.callbacks;
for (_m = 0, _len6 = _ref4.length; _m < _len6; _m++) { for (_m = 0, _len5 = _ref4.length; _m < _len5; _m++) {
callback = _ref4[_m]; callback = _ref4[_m];
callback(); callback();
} }

View File

@ -304,13 +304,6 @@ expandThread = ->
id: id id: id
} }
getThread = ->
threads = $$ 'div.thread'
for thread, i in threads
bottom = thread.getBoundingClientRect().bottom
if bottom > 0 #we have not scrolled past
return [thread, i]
replyHiding = replyHiding =
init: -> init: ->
g.callbacks.push replyHiding.cb.node g.callbacks.push replyHiding.cb.node
@ -617,6 +610,79 @@ keyModeNormal = (e) ->
watchButton = $ "span.filesize ~ img", root watchButton = $ "span.filesize ~ img", root
watch.call watchButton watch.call watchButton
nav =
#
init: ->
span = $.el 'span',
id: 'navlinks'
up = $.el 'a',
textContent: ''
down = $.el 'a',
textContent: ''
$.bind up, 'click', nav.up
$.bind down, 'click', nav.down
$.append span, up, $.tn(' '), down
$.append d.body, span
up: ->
[thread, i, rect] = nav.getThread()
{top} = rect
if top > 1
i = -1
else if Math.floor(Math.abs(top)) == 0
#only move to prev thread if we're at the start of current one
#XXX fucking fractional scrolls
i -= 1
nav.setThread i
down: ->
[thread, i, rect] = nav.getThread()
unless rect.top > 1 # if rect.top > 1, we're above the first thread
i += 1
nav.setThread i
getThread: ->
nav.threads = threads = $$ 'div.thread'
for thread, i in threads
rect = thread.getBoundingClientRect()
{bottom} = rect
if bottom > 0 #we have not scrolled past
return [thread, i, rect]
setThread: (i) ->
if i == -1
window.scrollTo 0, 0
return
if i == 10
window.location = "#{g.PAGENUM + 1}#p0"
return
{top} = nav.threads[i].getBoundingClientRect()
window.scrollBy 0, top
delete nav.threads
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) -> nodeInserted = (e) ->
target = e.target target = e.target
if target.nodeName is 'TABLE' if target.nodeName is 'TABLE'
@ -965,25 +1031,6 @@ report = ->
$('input[value="Report"]').click() $('input[value="Report"]').click()
input.click() input.click()
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
threadHiding = threadHiding =
init: -> init: ->
node = $ 'form[name=delform] > *' node = $ 'form[name=delform] > *'
@ -1475,13 +1522,13 @@ $.addStyle '
iframe { iframe {
display: none; display: none;
} }
span.navlinks { #navlinks {
position: absolute; position: fixed;
top: 25px;
right: 5px; right: 5px;
} }
span.navlinks > a { #navlinks > a {
font-size: 16px; font-size: 16px;
text-decoration: none;
} }
.hide { .hide {
display: none; display: none;
@ -1679,39 +1726,7 @@ else #not reply
$.bind $('form[name=post]'), 'submit', autoWatch $.bind $('form[name=post]'), 'submit', autoWatch
if $.config 'Thread Navigation' if $.config 'Thread Navigation'
arr = $$ 'div > span.filesize, form > span.filesize' nav.init()
l1 = arr.length - 1
for el, i in arr
span = $.el 'span',
className: 'navlinks'
id: 'p' + i
if i
textContent = ''
href = "#p#{i - 1}"
else if g.PAGENUM
textContent = ''
href = "#{g.PAGENUM - 1}#p0"
else
textContent = ''
href = "#navtop"
up = $.el 'a',
className: 'pointer'
textContent: textContent
href: href
if i < l1
textContent = ''
href = "#p#{i + 1}"
else
textContent = ''
href = "#{g.PAGENUM + 1}#p0"
down = $.el 'a',
className: 'pointer'
textContent: textContent
href: href
$.append span, up, $.tn(' '), down
$.before el, span
if location.hash is '#p0'
window.location = window.location
if $.config 'Thread Expansion' if $.config 'Thread Expansion'
omitted = $$('span.omittedposts') omitted = $$('span.omittedposts')