X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=www%2Fjs%2Fblerg.js;h=4efad6a33b881fcbc605272a21f26915a1823a87;hb=53272b3c1ec9303c69ccd55facfd5b90598a376c;hp=7bb5fe24788262f65a82eacdec390165f0de6fa8;hpb=6ce5fb7ab6e31f76e57639e4d04e32af33e77ee6;p=blerg.git diff --git a/www/js/blerg.js b/www/js/blerg.js index 7bb5fe2..4efad6a 100644 --- a/www/js/blerg.js +++ b/www/js/blerg.js @@ -1,10 +1,17 @@ +/* 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( '
#{data}
Posted #{date}
' ); var tagRecordTemplate = new Template( - '
#{data}
Posted by @#{author} on #{date}
' + '
#{data}
Posted by @#{author} on #{date}
' +); +var latestRecordsTemplate = new Template( + '
@#{author} #{data}
' ); // Page elements @@ -35,7 +42,7 @@ LoginStatus.prototype.login = function(username, password) { new Ajax.Request(baseURL + '/login', { parameters: { username: username, - password: password, + password: password }, onSuccess: function(r) { var j = r.responseText.evalJSON(); @@ -60,21 +67,22 @@ LoginStatus.prototype.login = function(username, password) { 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 { @@ -87,7 +95,7 @@ LoginStatus.prototype.update = function() { LoginStatus.prototype.post = function(msg) { if (!this.loggedIn) { alert("You are not logged in!"); - exit(0); + return; } new Ajax.Request(baseURL + '/put', { @@ -100,7 +108,7 @@ LoginStatus.prototype.post = function(msg) { 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++; @@ -180,6 +188,28 @@ function User(username) { 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) { @@ -188,7 +218,7 @@ function User(username) { this.itemCount = parseInt(j.record_count); this.displayItems(); } - }.bind(this), + }.bind(this) }); } User.prototype = new Pager(); @@ -198,9 +228,12 @@ User.prototype.show = function() { $$('[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; + $$('[name=user.reflink]').each(function(e) { + e.href = '/#ref/' + this.username; + }.bind(this)); + $('usercontrols').show(); } User.prototype.loadItems = function(from, to) { @@ -240,17 +273,21 @@ function mangleRecord(record, template) { record.recInt = parseInt(record.record); // Sanitize HTML input - record.data = record.data.replace('&', '&').replace('<', '<').replace('>', '>'); + record.data = record.data.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$2'); + record.data = record.data.replace(/(\s|^)(https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/([^\s"]*[^.!,;?()\s])?)?)/g, '$1$2'); // Turn markdown links into links - record.data = record.data.replace(/(\s|^)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/[^)]*?)?)\)/, '$1$2'); + record.data = record.data.replace(/(\s|^)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/[^)"]*?)?)\)/g, '$1$2'); + + // Turn *foo* into italics and **foo** into bold + record.data = record.data.replace(/(\s)\*\*([^*]+)\*\*(\s)/g, '$1$2$3'); + record.data = record.data.replace(/(\s)\*([^*]+)\*(\s)/g, '$1$2$3'); // Turn refs and tags into links - record.data = record.data.replace(/(\s|^)#(\w+)/g, '$1#$2'); - record.data = record.data.replace(/(\s|^)@(\w+)/g, '$1@$2'); + record.data = record.data.replace(/(\s|^)#([A-Za-z0-9_-]+)/g, '$1#$2'); + record.data = record.data.replace(/(\s|^)@([A-Za-z0-9_-]+)/g, '$1@$2'); // Turn newlines into linebreaks and paragraphs record.data = record.data.replace(/\r?\n\r?\n/g, "

").replace(/\r?\n/g, "
"); @@ -321,6 +358,7 @@ Tag.prototype.show = function() { $('newer_link').hide(); $('rss').hide(); items.show(); + $('usercontrols').hide(); } function postPopup() { @@ -345,11 +383,11 @@ function signup() { 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); @@ -375,6 +413,50 @@ function older_page() { 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) @@ -394,30 +476,106 @@ function resizePostContent() { }, 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 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) { + var j = r.responseText.evalJSON(); + + $('latest-tags').update(); + j.tags.each(function(v) { + var a = new Element('a', {href: '/#tag/' + v}); + a.insert('#' + v); + a.className = 'ref'; + $('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, '>'); + 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') }); @@ -428,6 +586,8 @@ function hashSwitch() { $('older_link').hide(); $('welcome').show(); $('rss').hide(); + $('usercontrols').hide(); + loadLatest(); } } @@ -454,4 +614,7 @@ function init() { event.stop(); } }); + $('post.content').addEventListener('keyup', function(event) { + event.stopPropagation(); + }, true); }