+
+ // Server count
+ var servercount = document.createElement("span");
+ servercount.setAttribute("class", "servercount");
+ servercount.appendChild(document.createTextNode(Object.keys(message.ServerTimes).length));
+ message.UI.appendChild(servercount);
+ message.UI.appendChild(document.createTextNode(" "));
+
+ // Timestamp
+ var timestamp_text = message.Time ? rcformattime(message.Time) : "";
+ var timestamp = document.createElement("span");
+ timestamp.setAttribute("class", "timestamp");
+ timestamp.appendChild(document.createTextNode(timestamp_text));
+ message.UI.appendChild(timestamp);
+ message.UI.appendChild(document.createTextNode(" "));
+
+ // Timestamp hover
+ var timestamp_hover = document.createElement("div");
+ timestamp_hover.setAttribute("class", "servertimestamps");
+ timestamp.appendChild(timestamp_hover);
+ for (var server in message.ServerTimes) {
+ rcaddservertimestamptohover(message, server);
+ }
+
+ // Classify different message types
+ var text_span = document.createElement("span");
+ var type;
+ if (/^\*\*\* /.test(message.Text)) {
+ type = "status";
+ } else if (/^\* /.test(message.Text)) {
+ type = "me";
+ } else if (/^-!- /.test(message.Text)) {
+ type = "local";
+ } else {
+ type = "text";
+ }
+ if (Object.keys(message.ServerTimes).length == 0) {
+ type += " self";
+ }
+ text_span.setAttribute("class", type);
+
+ // URL detection
+ var text = message.Text;
+ var URL_re = /\bhttps?:\/\/\S+/;
+ while (URL_re.test(text)) {
+ var match = URL_re.exec(text);
+ var leading_text = text.substr(0, match.index);
+ if (leading_text) {
+ text_span.appendChild(document.createTextNode(leading_text));
+ }
+ var anchor = document.createElement("a");
+ anchor.setAttribute("rel", "nofollow");
+ anchor.setAttribute("href", encodeURI(match[0]));
+ anchor.appendChild(document.createTextNode(match[0]));
+ text_span.appendChild(anchor);
+ text = text.substr(match.index + match[0].length);
+ }
+ if (text) {
+ text_span.appendChild(document.createTextNode(text));
+ }
+
+ message.UI.appendChild(text_span);
+ }
+
+ function rcaddmessagetohistory(message) {
+ var message_i;
+ if (message.Time) {
+ for (var i = hist.length - 1; ; i--) {
+ if (i < 0 || (hist[i].Time && message.Time >= hist[i].Time)) {
+ message_i = i+1;
+ hist.splice(message_i, 0, message);
+ break;
+ }
+ }
+ } else {
+ hist.push(message);
+ message_i = hist.length-1;
+ }
+ if (message_i + 1 < hist.length) {
+ rcaddmessagetoUI(message, hist[message_i + 1].UI);
+ } else {
+ rcaddmessagetoUI(message, null);
+ }
+ }
+
+ function rcaddmessagetoUI(message, before) {
+ if (!message.UI) {
+ rcmakemessageUI(message);
+ }