'<div class="record">#{data}<div class="info">Posted #{date}</div></div>'
);
var tagRecordTemplate = new Template(
- '<div class="record">#{data}<div class="info">Posted by <a href="/\##{author}">@#{author}</a> on #{date}</div></div>'
+ '<div class="record">#{data}<div class="info">Posted by <a class="author ref" href="/\##{author}">@#{author}</a> on #{date}</div></div>'
+);
+var latestRecordsTemplate = new Template(
+ '<div class="record"><a class="author ref" href="/\##{author}">@#{author}</a> #{data}</div>'
);
// Page elements
LoginStatus.prototype.post = function(msg) {
if (!this.loggedIn) {
alert("You are not logged in!");
- exit(0);
+ return;
}
new Ajax.Request(baseURL + '/put', {
this.initPager();
this.username = username;
+ $$('[name=user.obsesslink]').each(Element.hide);
+ $$('[name=user.unobsesslink]').each(Element.hide);
+
+ if (loginStatus.loggedIn) {
+ new Ajax.Request(baseURL + '/feedinfo/' + username, {
+ method: 'post',
+ parameters: {
+ username: loginStatus.username
+ },
+ onSuccess: function(r) {
+ var json = r.responseText.evalJSON();
+ if (json.subscribed) {
+ $$('[name=user.obsesslink]').each(Element.hide);
+ $$('[name=user.unobsesslink]').each(Element.show);
+ } else {
+ $$('[name=user.obsesslink]').each(Element.show);
+ $$('[name=user.unobsesslink]').each(Element.hide);
+ }
+ }
+ });
+ }
+
new Ajax.Request(baseURL + '/info/' + username, {
method: 'get',
onSuccess: function(r) {
items.show();
$('rss').show();
$('rsslink').href = '/rss/' + this.username;
+ $$('[name=user.reflink]').each(function(e) {
+ e.href = '/#ref/' + this.username;
+ }.bind(this));
+ $('usercontrols').show();
}
User.prototype.loadItems = function(from, to) {
record.data = record.data.replace(/(\s)\*([^*]+)\*(\s)/g, '$1<i>$2</i>$3');
// Turn refs and tags into links
- record.data = record.data.replace(/(\s|^)#(\w+)/g, '$1<a href="#tag/$2">#$2</a>');
- record.data = record.data.replace(/(\s|^)@(\w+)/g, '$1<a href="#$2">@$2</a>');
+ record.data = record.data.replace(/(\s|^)#([A-Za-z0-9_-]+)/g, '$1<a href="#tag/$2" class="ref">#$2</a>');
+ record.data = record.data.replace(/(\s|^)@([A-Za-z0-9_-]+)/g, '$1<a href="#$2" class="ref">@$2</a>');
// Turn newlines into linebreaks and paragraphs
record.data = record.data.replace(/\r?\n\r?\n/g, "<p>").replace(/\r?\n/g, "<br>");
$('newer_link').hide();
$('rss').hide();
items.show();
+ $('usercontrols').hide();
}
function postPopup() {
currentPager.olderPage();
}
+function obsess() {
+ new Ajax.Request(baseURL + '/subscribe/' + currentPager.username, {
+ method: 'post',
+ parameters: {
+ username: loginStatus.username
+ },
+ onSuccess: function(r) {
+ var response = r.responseText.evalJSON();
+ if (response.status == 'success') {
+ alert("You call " + currentPager.username + " and begin breathing heavily into the handset.");
+ $$('[name=user.obsesslink]').each(Element.hide);
+ $$('[name=user.unobsesslink]').each(Element.show);
+ } else {
+ alert('Failed to obsess. This is probably for the best');
+ }
+ },
+ onFailure: function(r) {
+ alert('Failed to obsess. This is probably for the best');
+ }
+ });
+}
+
+function unobsess() {
+ new Ajax.Request(baseURL + '/unsubscribe/' + currentPager.username, {
+ method: 'post',
+ parameters: {
+ username: loginStatus.username
+ },
+ onSuccess: function(r) {
+ var response = r.responseText.evalJSON();
+ if (response.status == 'success') {
+ alert("You come to your senses.");
+ $$('[name=user.obsesslink]').each(Element.show);
+ $$('[name=user.unobsesslink]').each(Element.hide);
+ } else {
+ alert('You are unable to tear yourself away (because something failed on the server)');
+ }
+ },
+ onFailure: function(r) {
+ alert('You are unable to tear yourself away (because something failed on the server)');
+ }
+ });
+}
+
var resizePostContentTimeout = null;
function resizePostContent() {
if (resizePostContentTimeout)
}, 150);
}
-function loadNewThings() {
- new Ajax.Request(baseURL + '/newtags.json', {
+var tickerTimer = null;
+var tickerHead, tickerTail;
+
+function tickerFader(a, b, p) {
+ var p2 = 1 - p;
+
+ a.style.opacity = p;
+ a.style.lineHeight = (100 * p) + '%';
+
+ b.style.opacity = p2;
+ b.style.lineHeight = (100 * p2) + '%';
+ if (p == 1.0)
+ b.hide();
+}
+
+function ticker() {
+ tickerHead.show();
+ Bytex64.FX.run(tickerFader.curry(tickerHead, tickerTail), 0.5);
+ tickerHead = tickerHead.nextSibling;
+ tickerTail = tickerTail.nextSibling;
+ if (tickerHead == null) {
+ stopTicker();
+ loadLatest.delay(10);
+ }
+}
+
+function startTicker() {
+ stopTicker();
+ for (var elem = $('latest-posts').firstChild; elem != null; elem = elem.nextSibling) {
+ elem.hide();
+ }
+
+ // Show the first five
+ tickerHead = $('latest-posts').firstChild;
+ for (var i = 0; i < 10 && tickerHead; i++) {
+ tickerHead.show();
+ tickerHead = tickerHead.nextSibling;
+ }
+ tickerTail = $('latest-posts').firstChild;
+ tickerTimer = setInterval(ticker, 5000);
+}
+
+function stopTicker() {
+ if (tickerTimer)
+ clearInterval(tickerTimer);
+ tickerTimer = null;
+}
+
+function loadLatest() {
+ new Ajax.Request(baseURL + '/latest.json', {
onSuccess: function(r) {
- $('newtags').update();
- r.responseText.evalJSON().each(function(v) {
+ var j = r.responseText.evalJSON();
+
+ $('latest-tags').update();
+ j.tags.each(function(v) {
var a = new Element('a', {href: '/#tag/' + v});
a.insert('#' + v);
- $('newtags').insert(a);
- $('newtags').insert(new Element('br'));
+ a.className = 'ref';
+ $('latest-tags').insert(a);
+ $('latest-tags').appendChild(document.createTextNode(' '));
});
- }
- });
- new Ajax.Request(baseURL + '/newusers.json', {
- onSuccess: function(r) {
- $('newusers').update();
- r.responseText.evalJSON().each(function(v) {
- var a = new Element('a', {href: '/#' + v});
- a.insert('@' + v);
- $('newusers').insert(a);
- $('newusers').insert(new Element('br'));
+ $('latest-posts').update();
+ j.records.each(function(v) {
+ v.data = v.data.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
+ v.date = (new Date(v.timestamp * 1000)).toString();
+ var html = latestRecordsTemplate.evaluate(v);
+ $('latest-posts').insert(html);
});
+ startTicker();
}
});
}
function hashSwitch() {
var m;
+ stopTicker();
if (m = location.search.match(/^\?post\/([^/]+)\/(.+)/)) {
$('post').show();
$('post.content').value = '[' + decodeURIComponent(m[1]).replace(']','').replace('[','') + '](' + decodeURIComponent(m[2]) + ')';
- } else if (m = location.hash.match(/^#(ref|tag)\/(\w+)$/)) {
+ } else if (m = location.hash.match(/^#(ref|tag)\/([A-Za-z0-9_-]+)$/)) {
currentPager = new Tag(m[1], m[2]);
currentPager.show();
- } else if (m = location.hash.match(/^#(\w+)(:(\d+))?$/)) {
+ } else if (m = location.hash.match(/^#([A-Za-z0-9_-]+)(:(\d+))?$/)) {
if (!currentPager || currentPager.username != m[1])
currentPager = new User(m[1]);
currentPager.show();
$('older_link').hide();
$('welcome').show();
$('rss').hide();
- loadNewThings();
+ $('usercontrols').hide();
+ loadLatest();
}
}