+ return d + " " + rcpad2(h) + ":" + rcpad2(m) + ":" + rcpad2(s);
+ }
+
+ function rcaddservertimestamptohover(message, server) {
+ var divs = message.UI.getElementsByTagName("div");
+ var t = message.ServerTimes[server];
+ for (var i in divs) {
+ if (divs[i].getAttribute && divs[i].getAttribute("class") == "servertimestamps") {
+ var d = document.createElement("div");
+ var text = t.getFullYear() + "-" +
+ rcpad2(t.getMonth()) + "-" +
+ rcpad2(t.getDay()) + " " +
+ rcformattime(t) + "." +
+ rcpad3(t.getMilliseconds()) + " " +
+ server;
+ d.appendChild(document.createTextNode(text));
+ divs[i].appendChild(d);
+ }
+ }
+ }
+
+ function rcmakemessageUI(message) {
+ message.UI = document.createElement("div");
+
+ // 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 {
+ 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));