// Config
var baseURL = '';
var recordTemplate = new Template(
- '<div class="record">#{data}<div class="info">Posted #{date}. <a href="/\##{author}/#{record}" onclick="return qlink()">[permalink]</a> <a href="#" onclick="postPopup(\'@#{author}/#{record}: \'); return false">[reply]</a></div></div>'
+ '<div class="record">#{data}<div class="info">Posted #{date}. <a href="' + baseURL + '/\##{author}/#{record}" onclick="return qlink()">[permalink]</a> <a href="#" onclick="postPopup(\'@#{author}/#{record}: \'); return false">[reply]</a></div></div>'
);
var tagRecordTemplate = new Template(
- '<div class="record">#{data}<div class="info">Posted by <a class="author ref" href="/\##{author}" onclick="return qlink()">@#{author}</a> on #{date}. <a href="/\##{author}/#{record}" onclick="return qlink()">[permalink]</a> <a href="#" onclick="postPopup(\'@#{author}/#{record}: \'); return false">[reply]</a></div></div>'
+ '<div class="record">#{data}<div class="info">Posted by <a class="author ref" href="/\##{author}" onclick="return qlink()">@#{author}</a> on #{date}. <a href="' + baseURL + '/\##{author}/#{record}" onclick="return qlink()">[permalink]</a> <a href="#" onclick="postPopup(\'@#{author}/#{record}: \'); return false">[reply]</a></div></div>'
);
var latestRecordsTemplate = new Template(
- '<div class="record"><a class="author ref" href="/\##{author}" onclick="return qlink()">@#{author}</a> #{data}</div>'
+ '<div class="record"><a class="author ref" href="' + baseURL + '/\##{author}" onclick="return qlink()">@#{author}</a> #{data}</div>'
);
// Page elements
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.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");
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 = '/#' + this.username;
+ $('userlink').href = baseURL + '/#' + this.username;
$('userlink').update('@' + this.username);
- $('reflink').href = '/#/ref/' + this.username;
+ $('reflink').href = baseURL + '/#/ref/' + this.username;
$('login').hide();
$('logout').show();
} else {
});
}
+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() {
}
if (this.pageStart < this.itemCount - 1) {
- $('newer_link').href = '/#' + this.baseFrag + '/p' + (this.pageStart + this.itemsPerPage);
+ $('newer_link').href = baseURL + '/#' + this.baseFrag + '/p' + (this.pageStart + this.itemsPerPage);
$('newer_link').show();
} else {
$('newer_link').hide();
}
if (this.pageStart >= 10) {
- $('older_link').href = '/#' + this.baseFrag + '/p' + (this.pageStart - this.itemsPerPage);
+ $('older_link').href = baseURL + '/#' + this.baseFrag + '/p' + (this.pageStart - this.itemsPerPage);
$('older_link').show();
} else {
$('older_link').hide();
$('rss').show();
$('rsslink').href = '/rss/' + this.username;
$$('[name=user.reflink]').each(function(e) {
- e.href = '/#/ref/' + this.username;
+ e.href = baseURL + '/#/ref/' + this.username;
}.bind(this));
$('usercontrols').show();
- if (this.permalink && this.pageStart) {
+ if (this.permalink && this.pageStart >= 0) {
this.showRecord(this.pageStart);
- } else if (this.pageStart) {
+ } else if (this.pageStart >= 0) {
this.showPageAt(this.pageStart);
} else {
this.reload();
}
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;
l = l.replace(/&/g, '&').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<a href="$2">$2</a>');
+ l = l.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
+ 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<a href="$3">$2</a> <a href="$3" onclick="play_audio(); return false"><img src="/images/play.png"></a>');
+
+ // 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<a href="$3">$2</a> <a href="$3" onclick="play_audio(); return false"><img src="/images/play.png"></a>');
+
+ // 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<a href="$3">$2</a> <a href="$3" onclick="play_video(); return false"><img src="/images/play.png"></a>');
+
+ // 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<a href="$3">$2</a> <a href="$3" onclick="play_video(); return false"><img src="/images/play.png"></a>');
+
+ // Regular markdown links
l = l.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
if (!this.pageStart)
this.pageStart = response.length - 1;
this.itemCount = response.length;
+ loginStatus.requestFeedStatus();
}
this.displayItems();
}.bind(this),
urlSwitch();
}
+function passwd() {
+ var old_password = $('passwd.old_password').value;
+ var new_password = $('passwd.new_password').value;
+
+ new Ajax.Request(baseURL + '/passwd', {
+ parameters: {
+ username: loginStatus.username,
+ password: old_password,
+ new_password: new_password
+ },
+ onSuccess: function(r) {
+ if (r.responseJSON.status == 'success') {
+ alert('Password changed');
+ passwd_cancel();
+ } else {
+ alert('Password change failed. Your password has NOT been changed.');
+ }
+ },
+ onFailure: function(r) {
+ alert('Password change error');
+ }
+ });
+}
+
+function passwd_cancel() {
+ $('passwd').hide();
+ $('navigation').show();
+ urlSwitch();
+}
+
function subscribe() {
new Ajax.Request(baseURL + '/subscribe/' + currentPager.username, {
method: 'post',
function loadLatest() {
new Ajax.Request(baseURL + '/latest.json', {
+ method: 'GET',
onSuccess: function(r) {
var j = r.responseText.evalJSON();
$('latest-tags').update();
j.tags.each(function(v) {
- var a = new Element('a', {href: '/#/tag/' + v});
+ var a = new Element('a', {href: baseURL + '/#/tag/' + v});
a.insert('#' + v);
a.onclick = "return qlink()";
a.className = 'ref';
$('welcome').hide();
}
+Welcome.prototype.updateState = function() {
+ this.show();
+}
+
function ExternalURLPost(m) {
this.title = decodeURIComponent(m[1]).replace(']','').replace('[','');
this.url = decodeURIComponent(m[2]);