X-Git-Url: http://git.bytex64.net/?a=blobdiff_plain;f=www%2Fjs%2Fblerg.js;h=2125c5bef86f5faace6e856f7249cf3f2d4bd543;hb=4c3823106abb40d31797b51eeb047018698afc12;hp=6d555b8868058767eaa942c5af84b623a825c443;hpb=21db04ef3e4f66d7b5c4c9be2be36703b18cbcaa;p=blerg.git diff --git a/www/js/blerg.js b/www/js/blerg.js index 6d555b8..2125c5b 100644 --- a/www/js/blerg.js +++ b/www/js/blerg.js @@ -14,89 +14,6 @@ var latestRecordsTemplate = new Template( '
@#{author} #{data}
' ); -// Page elements -var items; - -// Other globals -var currentPager; -var loginStatus; - -// Object to keep track of login status -function LoginStatus() { - var cookies = {}; - document.cookie.split(/;\s+/).each(function(v) { - kv = v.split('='); - cookies[kv[0]] = kv[1]; - }); - if (cookies.auth && cookies.username) { - this.loggedIn = true; - this.username = cookies.username; - this.requestFeedStatus(); - this.feedStatusUpdateInterval = setInterval(this.requestFeedStatus.bind(this), 900000); - } else { - this.loggedIn = false; - this.username = null; - } - this.update(); -} - -LoginStatus.prototype.login = function(username, password) { - new Ajax.Request(baseURL + '/login', { - parameters: { - username: username, - password: password - }, - onSuccess: function(r) { - var j = r.responseText.evalJSON(); - if (j && j.status == 'success') { - this.loggedIn = true; - this.username = username; - document.cookie = "username=" + username; - $('login.password').value = ''; - this.requestFeedStatus(); - this.feedStatusUpdateInterval = setInterval(this.requestFeedStatus.bind(this), 900000); - this.update(); - } else { - alert("Could not log in"); - $('login.username').focus(); - } - }.bind(this), - onFailure: function(r) { - alert("Could not log in"); - $('login.username').focus(); - } - }); -} - -LoginStatus.prototype.logout = function() { - new Ajax.Request(baseURL + '/logout', { - parameters: { - username: this.username - }, - onComplete: function(r) { - this.loggedIn = false; - document.cookie = "auth=; expires=1-Jan-1970 00:00:00 GMT"; - this.update(); - clearInterval(this.feedStatusUpdateInterval); - }.bind(this) - }); - document.cookie = "username=; expires=1-Jan-1970 00:00:00 GMT"; -} - -LoginStatus.prototype.update = function() { - if (this.loggedIn) { - $('userlink').href = baseURL + '/#' + this.username; - $('userlink').update('@' + this.username); - $('reflink').href = baseURL + '/#/ref/' + this.username; - $('login').hide(); - $('logout').show(); - } else { - $('post').hide(); - $('login').show(); - $('logout').hide(); - } -} - LoginStatus.prototype.post = function(msg) { if (!this.loggedIn) { alert("You are not logged in!"); @@ -128,20 +45,6 @@ LoginStatus.prototype.post = function(msg) { }); } -LoginStatus.prototype.requestFeedStatus = function() { - new Ajax.Request('/feedinfo', { - parameters: { username: this.username }, - onSuccess: function(r) { - var j = r.responseText.evalJSON(); - if (j['new'] > 0) { - $('newFeedMessages').update('(' + j['new'] + ' new)'); - } else { - $('newFeedMessages').update(''); - } - } - }); -} - // Base object for paged data function Pager() { this.itemsPerPage = 10; @@ -241,318 +144,10 @@ Pager.prototype.showRecord = function(r) { Pager.prototype.loadItems = function(from, to, continuation) { } - -// Object to render user pages -function User(m) { - Pager.call(this); - this.username = m[1]; - this.baseFrag = m[1]; - this.permalink = (m[2] != 'p'); - this.pageStart = parseInt(m[3]); -} -User.prototype = new Pager(); -User.prototype.constructor = User; - -User.prototype.updateState = function(m) { - if (m[1] != this.username) - return false; - - this.permalink = (m[2] != 'p'); - this.pageStart = parseInt(m[3]); - this.show(); - - return true; -} - -User.prototype.show = function() { - Pager.prototype.show.call(this); - - $$('[name=section]').each(function(v) { v.update(' @' + this.username) }.bind(this)); - $('rss').show(); - $('rsslink').href = '/rss/' + this.username; - $$('[name=user.reflink]').each(function(e) { - e.href = baseURL + '/#/ref/' + this.username; - }.bind(this)); - $('usercontrols').show(); - - if (this.permalink && this.pageStart >= 0) { - this.showRecord(this.pageStart); - } else if (this.pageStart >= 0) { - this.showPageAt(this.pageStart); - } else { - this.reload(); - } -} - -User.prototype.hide = function() { - Pager.prototype.hide.call(this); - $('signup').hide(); - $('rss').hide(); - $('usercontrols').hide(); -} - -User.prototype.reload = function() { - this.pageStart = null; - - $$('[name=user.subscribelink]').each(Element.hide); - $$('[name=user.unsubscribelink]').each(Element.hide); - - if (loginStatus.loggedIn) { - new Ajax.Request(baseURL + '/feedinfo/' + this.username, { - method: 'post', - parameters: { - username: loginStatus.username - }, - onSuccess: function(r) { - var json = r.responseText.evalJSON(); - if (json.subscribed) { - $$('[name=user.subscribelink]').each(Element.hide); - $$('[name=user.unsubscribelink]').each(Element.show); - } else { - $$('[name=user.subscribelink]').each(Element.show); - $$('[name=user.unsubscribelink]').each(Element.hide); - } - } - }); - } - - new Ajax.Request(baseURL + '/info/' + this.username, { - method: 'get', - onSuccess: function(r) { - var response = r.responseText.evalJSON(); - if (response) { - this.itemCount = parseInt(response.record_count); - this.showPageAt(this.itemCount - 1); - } - }.bind(this) - }); -} - -User.prototype.loadItems = function(from, to, continuation) { - if (to < 0) - return; - - var url; - if (from != undefined && to != undefined) { - url = baseURL + '/get/' + this.username + '/' + from + '-' + to; - this.pageStart = to; - } else { - url = baseURL + '/get/' + this.username; - } - - new Ajax.Request(url, { - method: 'get', - onSuccess: function(r) { - var records = r.responseText.evalJSON(); - if (records && records.length > 0) { - records.each(function(v) { - v.id = v.record; - v.author = this.username; - mangleRecord(v, recordTemplate); - }.bind(this)); - this.addItems(records); - if (!this.pageStart) - this.pageStart = records[0].recInt; - } - continuation(); - }.bind(this), - onFailure: function(r) { - this.displayItems(); - }.bind(this), - on404: function(r) { - displayError('User not found'); - } - }); -} - -function mangleRecord(record, template) { - record.recInt = parseInt(record.record); - - var lines = record.data.split(/\r?\n/); - if (lines[lines.length - 1] == '') - lines.pop(); - - var out = ['

']; - var endpush = null; - var listMode = false; - lines.each(function(l) { - if (l == '') { - if (out[out.length - 1] == '
') { - out[out.length - 1] = '

'; - } - if (out[out.length - 1] == '') { - out.push(''); - out.push('

'); - listMode = false; - } - return; - } - - // Put quoted material into a special paragraph - if (l[0] == '>') { - var pi = out.lastIndexOf('

'); - if (pi != -1) { - out[pi] = '

'; - l = l.replace(/^>\s*/, ''); - } - } - - // Sanitize HTML input - l = l.replace(/&/g, '&').replace(//g, '>'); - - // Turn HTTP URLs into links - l = l.replace(/(\s|^)(https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/([^\s"]*[^.!,;?()\s])?)?)/g, '$1$2'); - - // Turn markdown links into links - var re; - - // Craft a regex that finds URLs that end in the extensions specified by BlergMedia.audioExtensions. - re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9]\\/[^)"]*?\\.(' + BlergMedia.audioExtensions.join('|') + '))\\)', 'g'); - l = l.replace(re, '$1$2 '); - - // Ditto, but use the extended markdown link syntax to specify the format - re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\\/[^)"]*?)?)\\s+audio:(' + BlergMedia.audioExtensions.join('|') + ')\\)', 'g'); - l = l.replace(re, '$1$2 '); - - // Craft a regex that finds URLs that end in the extensions specified by BlergMedia.videoExtensions. - re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9]\\/[^)"]*?\\.(' + BlergMedia.videoExtensions.join('|') + '))\\)', 'g'); - l = l.replace(re, '$1$2 '); - - // Ditto, but use the extended markdown link syntax to specify the format - re = new RegExp('(\\s|^)\\[([^\\]]+)\\]\\((https?:\\/\\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\\/[^)"]*?)?)\\s+video:(' + BlergMedia.videoExtensions.join('|') + ')\\)', 'g'); - l = l.replace(re, '$1$2 '); - - // Regular markdown links - l = l.replace(/(\s|^)\[([^\]]+)\]\((https?:\/\/[a-zA-Z0-9.-]*[a-zA-Z0-9](\/[^)"]*?)?)\)/g, '$1$2'); - - // Turn *foo* into italics and **foo** into bold - l = l.replace(/([^\w\\]|^)\*\*(\w[^*]*)\*\*(\W|$)/g, '$1$2$3'); - l = l.replace(/([^\w\\]|^)\*(\w[^*]*)\*(\W|$)/g, '$1$2$3'); - - // Turn refs and tags into links - l = l.replace(/(\s|^)#([A-Za-z0-9_-]+)/g, '$1#$2'); - l = l.replace(/(\s|^)@([A-Za-z0-9_-]+)(\/\d+)?/g, '$1@$2'); - - // Create lists when lines begin with * - if (l[0] == '*') { - if (!listMode) { - var pi = out.lastIndexOf('

'); - out[pi] = '

'); - - record.data = out.join(''); - record.date = (new Date(record.timestamp * 1000)).toString(); - record.html = template.evaluate(record); -} - function displayError(msg) { items.innerText = msg; } - -// Object for browsing tags -function Tag(m) { - Pager.call(this); - this.type = m[1]; - this.tag = m[2]; - this.pageStart = parseInt(m[3]); - - var url = baseURL + "/tag/"; - switch(this.type) { - case 'tag': - //url += '%23'; - url += 'H'; // apache is eating the hash, even encoded. Probably a security feature. - this.baseFrag = '/tag/' + this.tag; - break; - case 'ref': - url += '%40'; - this.baseFrag = '/ref/' + this.tag; - break; - default: - alert('Invalid tag type: ' + this.type); - return; - } - url += this.tag; - - new Ajax.Request(url, { - method: 'get', - onSuccess: function(r) { - var j = r.responseText.evalJSON(); - if (j) { - var maxid = j.length - 1; - j.each(function(v, i) { - v.id = maxid - i; - mangleRecord(v, tagRecordTemplate) - }); - this.addItems(j); - if (!this.pageStart) - this.pageStart = j.length - 1; - this.itemCount = j.length; - } - this.displayItems(); - }.bind(this), - onFailure: function(r) { - this.displayItems(); - }.bind(this) - }); - -} -Tag.prototype = new Pager(); -Tag.prototype.constructor = Tag; - -Tag.prototype.updateState = function(m) { - if (this.type != m[1] || this.tag != m[2]) - return false; - - this.pageStart = parseInt(m[3]) || this.itemCount - 1; - this.displayItems(); - - return true; -} - -Tag.prototype.show = function() { - Pager.prototype.show.call(this); - - var ctype = {ref: '@', tag: '#'}[this.type]; - - $$('[name=section]').each(function(v) { - v.update(' about ' + ctype + this.tag); - }.bind(this)); -} - - // Pager for browsing subscription feeds function Feed(m) { Pager.call(this); @@ -721,25 +316,6 @@ function unsubscribe() { }); } -var resizePostContentTimeout = null; -function resizePostContent() { - if (resizePostContentTimeout) - clearTimeout(resizePostContentTimeout); - resizePostContentTimeout = setTimeout(function() { - var c = $('post.content'); - var lines = Math.floor(c.value.length / (100 * (c.clientWidth / 1000))) + 1; - var m = c.value.match(/\r?\n/g); - if (m) - lines += m.length; - if (lines <= 3) { - c.style.height = ""; - } else { - c.style.height = (lines * 17) + "pt"; - } - resizePostContentTimeout = null; - }, 150); -} - var tickerTimer = null; var tickerHead, tickerTail; @@ -816,20 +392,6 @@ function loadLatest() { }); } -function qlink(loc) { - if (loc) { - location.hash = loc; - } else if (event && event.target) { - location.href = event.target.href; - } else { - // Bogus qlink - return; - } - lastHash = location.hash; - urlSwitch(); - return false; -} - function ExternalURLPost(m) { this.title = decodeURIComponent(m[1]).replace(']','').replace('[',''); this.url = decodeURIComponent(m[2]);