/*
 * Returns given number with commas every 3 digits.
 */
function formatNumber(number) {
  number += '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(number)) {
    number = number.replace(rgx, '$1' + ',' + '$2');
  }
  return number;
}

/*
 * Examples:
 *   plural(5, 'comment', 'comments') // '5 comments'
 *   plural(1, 'comment', 'comments') // '1 comment'
 *   plural(0, 'comment', 'comments') // '0 comments'
 *   plural(10, 'comment', 'comments', true) // 'comments'
 */
function plural(count, singular, plural, omitNumber) {
  return (omitNumber ? '' : formatNumber(count) + ' ') + (count == 1 ? singular : plural);
}

/*
 * Returns given string with special characters properly encoded.
 */
function htmlspecialchars(str) {
  var div = document.createElement('div');
  var text = document.createTextNode(str);
  div.appendChild(text);
  return div.innerHTML;
}

/*
 * Returns given string with special characters properly encoded, with lines wrapped every 15 characters.
 */
function htmlspecialcharsWrap(string) {
  string = htmlspecialchars(string);
  var pattern = '/([a-zA-Z0-9]{15})([a-zA-Z0-9]{15})/gi';
  var replacement = '$1&shy;$2';
  string = string.replace(pattern, replacement);
  string = string.replace(/\r\n/g, "<br/>");
  return string;
}

/*
 * Returns an appropriate class name for the given count and high/medium thresholds.
 * Used to put a varying amount of emphasis on a number on a page.
 */
function emphasis(count, high, med) {
  return count >= high ? 'high' : (count >= med ? 'med' : 'low');
}

/*
 * Scrolls to the element with the given id and sets the location hash to that id.
 */
function goTo(id) {
  scrollToPosition = $('#' + id).offset().top;
  $('html, body').animate({
    scrollTop: scrollToPosition
  }, 1000);
  setTimeout(function() {
    location.hash = id;
  }, 1100);
}

function createButton(text, onclickHandler, className) {
  return $('<div></div>', {
    'class': 'button_template ' + (className ? className : ''),
    click:   onclickHandler,
    html:    '<div class="button_bg"></div><div class="button_text">' + text + '</div>'
  });
}

function reportSpamComment(author,comment) {
	var isPrivate = (location.pathname == "/user_inbox");
	location.href='/feedback?subject=spam&message='+escape("I am reporting a "+(isPrivate ? "private message" : "comment")+" by "+author+" as inappropriate:\n"+comment+"\n\n"+document.URL);
}

var page = {
  currentRequest: null,
  initPart: function(name, id, url, displayHandler, arg) {
    var data = LocalStorage.get(name, id);
    if (!data || LocalStorage.isStale(name, id)) {
      page.currentRequest = $.ajax({
        url: url,
        success: function(data, status) {
          displayHandler(data, arg);
          LocalStorage.set(name, id, data);
        },
        error: function(data, status) {
          page.displayError(JSON.parse(data.responseText));
          displayHandler(arg);
        }
      });
    } else { displayHandler(data, arg); }
  },
  displayError: function(response) {
    alert("Uh oh. Something went wrong: (" + response.code + ") " + response.message + ".");
  }
};
