+/* Blerg is (C) 2011 The Dominion of Awesome, and is distributed under a
+ * BSD-style license. Please see the COPYING file for details.
+ */
+
// Config
var baseURL = '';
var recordTemplate = new Template(
'<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" href="/\##{author}">@#{author}</a> on #{date}</div></div>'
+);
+var latestRecordsTemplate = new Template(
+ '<div class="record"><a class="author" href="/\##{author}">@#{author}</a> #{data}</div>'
);
// Page elements
new Ajax.Request(baseURL + '/login', {
parameters: {
username: username,
- password: password,
+ password: password
},
onSuccess: function(r) {
var j = r.responseText.evalJSON();
LoginStatus.prototype.logout = function() {
new Ajax.Request(baseURL + '/logout', {
parameters: {
- username: this.username,
+ username: this.username
},
onSuccess: function(r) {
this.loggedIn = false;
document.cookie = "auth=; expires=1-Jan-1970 00:00:00 GMT";
this.update();
- }.bind(this),
+ }.bind(this)
});
document.cookie = "username=; expires=1-Jan-1970 00:00:00 GMT";
}
LoginStatus.prototype.update = function() {
if (this.loggedIn) {
- $('userlink').href = '#' + this.username;
+ $('userlink').href = '/#' + this.username;
$('userlink').update('@' + this.username);
+ $('reflink').href = '/#ref/' + this.username;
$('login').hide();
$('logout').show();
} else {
LoginStatus.prototype.post = function(msg) {
if (!this.loggedIn) {
alert("You are not logged in!");
- exit(0);
+ return;
}
new Ajax.Request(baseURL + '/put', {
if (j && j.status == 'success') {
$('post.content').value = '';
if (location.hash != '#' + this.username) {
- location.hash = this.username;
+ location.href = '/#' + this.username;
hashSwitch();
} else {
currentPager.itemCount++;
this.itemCount = parseInt(j.record_count);
this.displayItems();
}
- }.bind(this),
+ }.bind(this)
});
}
User.prototype = new Pager();
$$('[name=section]').each(function(v) { v.update(' @' + this.username) }.bind(this));
$('welcome').hide();
items.show();
- $('reflink').href = '#ref/' + this.username;
$('rss').show();
$('rsslink').href = '/rss/' + this.username;
}
record.recInt = parseInt(record.record);
// Sanitize HTML input
- record.data = record.data.replace('&', '&').replace('<', '<').replace('>', '>');
+ record.data = record.data.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
// Turn HTTP URLs into links
- record.data = record.data.replace(/(\s|^)(https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/(\S*[^.!,;?()\s])?)?)/g, '$1<a href="$2">$2</a>');
+ record.data = record.data.replace(/(\s|^)(https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/([^\s"]*[^.!,;?()\s])?)?)/g, '$1<a href="$2">$2</a>');
// Turn markdown links into links
- record.data = record.data.replace(/(\s|^)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/[^)]*?)?)\)/, '$1<a href="$3">$2</a>');
+ record.data = record.data.replace(/(\s|^)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/[^)"]*?)?)\)/g, '$1<a href="$3">$2</a>');
+
+ // Turn *foo* into italics and **foo** into bold
+ record.data = record.data.replace(/(\s)\*\*([^*]+)\*\*(\s)/g, '$1<b>$2</b>$3');
+ 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">#$2</a>');
+ record.data = record.data.replace(/(\s|^)@([A-Za-z0-9_-]+)/g, '$1<a href="#$2">@$2</a>');
// Turn newlines into linebreaks and paragraphs
record.data = record.data.replace(/\r?\n\r?\n/g, "<p>").replace(/\r?\n/g, "<br>");
new Ajax.Request(baseURL + '/create', {
parameters: {
username: username,
- password: password,
+ password: password
},
onSuccess: function(r) {
$('signup').hide();
- location.hash = username;
+ location.href = '/#' + username;
hashSwitch();
loginStatus.login(username, password);
}, 150);
}
+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 fadeOut(p) {
+}
+
+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 < 5 && 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) {
+ var j = r.responseText.evalJSON();
+
+ $('latest-tags').update();
+ j.tags.each(function(v) {
+ var a = new Element('a', {href: '/#tag/' + v});
+ a.insert('#' + v);
+ $('latest-tags').insert(a);
+ $('latest-tags').appendChild(document.createTextNode(' '));
+ });
+
+ $('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 = location.hash.match(/^#((ref|tag)\/)?(\w+)(:(\d+))?/);
- if (m) {
- if (m[1]) {
- currentPager = new Tag(m[2], m[3]);
- currentPager.show();
- } else {
- if (!currentPager || currentPager.username != m[3])
- currentPager = new User(m[3]);
- currentPager.show();
- loginStatus.update();
-
- if (m[5]) {
- var r = parseInt(m[5]);
- currentPager.showRecord = r;
- if (currentPager.recordCache[r]) {
- currentPager.displayItems();
- } else {
- currentPager.loadItems((r >= 49 ? r - 49 : 0), r);
- }
+ 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)\/([A-Za-z0-9_-]+)$/)) {
+ currentPager = new Tag(m[1], m[2]);
+ currentPager.show();
+ } else if (m = location.hash.match(/^#([A-Za-z0-9_-]+)(:(\d+))?$/)) {
+ if (!currentPager || currentPager.username != m[1])
+ currentPager = new User(m[1]);
+ currentPager.show();
+ loginStatus.update();
+
+ if (m[3]) {
+ var r = parseInt(m[3]);
+ currentPager.showRecord = r;
+ if (currentPager.recordCache[r]) {
+ currentPager.displayItems();
} else {
- currentPager.pageStart = currentPager.itemCount - 1;
- currentPager.loadItems();
+ currentPager.loadItems((r >= 49 ? r - 49 : 0), r);
}
+ } else {
+ currentPager.pageStart = currentPager.itemCount - 1;
+ currentPager.loadItems();
}
} else {
$$('[name=section]').each(function(v) { v.update('Welcome') });
$('older_link').hide();
$('welcome').show();
$('rss').hide();
+ loadLatest();
}
}
event.stop();
}
});
+ $('post.content').addEventListener('keyup', function(event) {
+ event.stopPropagation();
+ }, true);
}