-
-// Object to render user pages
-function User(username) {
- this.initPager();
- this.username = username;
- this.baseFrag = username;
-}
-User.prototype = new Pager();
-User.prototype.constructor = User;
-
-User.prototype.show = function() {
- $$('[name=section]').each(function(v) { v.update(' @' + this.username) }.bind(this));
- $('welcome').hide();
- 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.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 j = r.responseText.evalJSON();
- if (j) {
- this.itemCount = parseInt(j.record_count);
- if (!this.pageStart)
- this.showPageAt(this.itemCount - 1);
- }
- }.bind(this)
- });
-}
-
-User.prototype.loadItems = function(from, to, continuation) {
- 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 = ['<p>'];
- var endpush = null;
- var listMode = false;
- lines.each(function(l) {
- if (l == '') {
- if (out[out.length - 1] == '<br>') {
- out[out.length - 1] = '<p>';
- }
- if (out[out.length - 1] == '</li>') {
- out.push('</ul>');
- out.push('<p>');
- listMode = false;
- }
- return;
- }
-
- // Put quoted material into a special paragraph
- if (l[0] == '>') {
- var pi = out.lastIndexOf('<p>');
- if (pi != -1) {
- out[pi] = '<p class="quote">';
- l = l.replace(/^>\s*/, '');
- }
- }
-
- // Sanitize HTML input
- 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>');
-
- // Turn markdown links into 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
- l = l.replace(/([^\w\\]|^)\*\*(\w[^*]*)\*\*(\W|$)/g, '$1<b>$2</b>$3');
- l = l.replace(/([^\w\\]|^)\*(\w[^*]*)\*(\W|$)/g, '$1<i>$2</i>$3');
-
- // Turn refs and tags into links
- l = l.replace(/(\s|^)#([A-Za-z0-9_-]+)/g, '$1<a href="#/tag/$2" class="ref" onclick="return qlink()">#$2</a>');
- l = l.replace(/(\s|^)@([A-Za-z0-9_-]+)/g, '$1<a href="#$2" class="ref" onclick="return qlink()">@$2</a>');
-
- // Create lists when lines begin with *
- if (l[0] == '*') {
- if (!listMode) {
- var pi = out.lastIndexOf('<p>');
- out[pi] = '<ul>';
- listMode = true;
- }
- l = l.replace(/^\*\s*/, '');
- out.push('<li>');
- endpush = '</li>';
- }
-
- // Create headers when lines begin with = or #
- if (l[0] == '=' || l[0] == '#') {
- var m = l.match(/^([=#]+)/);
- var depth = m[1].length;
- if (depth <= 5) {
- l = l.replace(/^[=#]+\s*/, '').replace(/\s*[=#]+$/, '');
- out.push('<h' + depth + '>');
- endpush = '</h' + depth + '>';
- }
- }
-
- // Remove backslashes from escaped metachars
- l = l.replace(/\\([*\[\]@#])/g, '$1');
-
- out.push(l);
- if (endpush) {
- out.push(endpush);
- endpush = null;
- } else {
- out.push('<br>');
- }
- });
- while (out[out.length - 1] == '<br>' || out[out.length - 1] == '<p>')
- out.pop();
- if (listMode)
- out.push('</ul>');
-
- record.data = out.join('');
- record.date = (new Date(record.timestamp * 1000)).toString();
- record.html = template.evaluate(record);
-}
-