window.onerror = function (e) { alert(e); }
var SubmitUtil = {
containerId: 'submit-iframe-container'
, hasXHR : false
, setUp : function () {
//this.hasXHR = window.XMLHttpRequest == undefined;
this.hasXHR = false;
if (!this.hasXHR) {
this.submitIframe = Mobirc.createFormIframe(this.containerId);
this.submitIframe.style.width = "0px";
this.submitIframe.style.height = "0px";
}
}
, initialize : function () {
if (!this.hasXHR) {
try { this.submitIframe.contentWindow.document.charset = "Shift_JIS"; } catch (e) {}
this.submitIframe.contentWindow.document.writeln("
");
}
}
, submit : function (channelEsc, msg) {
if (this.hasXHR)
this.submitInternalXHR(channelEsc, msg);
else
this.submitInternalIframe(channelEsc, msg);
}
, submitInternalXHR : function (channelEsc, msg) {
var xhr = new XMLHttpRequest();
xhr.open("POST", path, true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status >= 200 && xhr.status < 400) {
eval(xhr.responseText);
}
}
xhr.send("msg="+encodeURIComponent(msg));
}
, submitInternalIframe : function (channelEsc, msg) {
var doc = this.submitIframe.contentWindow.document;
doc.body.innerHTML = "";
if (document.all && window.opera == undefined) {
IFrameUtil.bindEvent(this.submitIframe, 'readystatechange', this.onFormIframeLoaded);
} else {
IFrameUtil.bindEvent(this.submitIframe, 'load', this.onFormIframeLoaded);
}
var form = doc.createElement('form');
form.acceptCharset = "Shift_JIS";
form.action = Mobirc.docroot + 'mobile-ajax/channel?channel=' + encodeURIComponent(channelEsc);
form.method = 'POST';
var input = doc.createElement('input');
input.name = 'msg';
input.value = msg;
form.appendChild(input);
doc.body.appendChild(form);
form.submit();
}
, onFormIframeLoaded : function (sender) {
// on submit
try {
eval(SubmitUtil.submitIframe.contentWindow.document.body.innerHTML);
} catch (e) { Mobirc.onTick(); }
}
};
var Mobirc = {
docroot : ___docroot,
interval : 15 * 1000,
useIFrame : true,
timerId : null,
setUp : function () {
this.channelIframe = this.createInheritedIframe('channel-iframe-container');
this.recentLogIframe = this.createInheritedIframe('recentlog-iframe-container');
SubmitUtil.setUp();
// nice tenuki.
setTimeout(function() {
SubmitUtil.initialize();
Mobirc.initialize();
Mobirc.startInterval();
}, 5000);
}
, initialize : function () {
try {
// Reference Error: Opera 8.6 (au)
this.recentDoc.charset = document.charset;
this.channelDoc.charset = document.charset;
} catch (e) { }
var styleSheet = document.getElementById("stylesheet");
if (!this.channelIframe.init) this.channelIframe.contentWindow.document.writeln("");
if (!this.recentLogIframe.init) this.recentLogIframe.contentWindow.document.writeln("");
this.channelIframe.contentWindow.document.getElementById('lines').innerHTML = "";
this.recentLogIframe.contentWindow.document.getElementById('lines').innerHTML = "";
this.onChangeChannel();
// TODO: re-implement
// this.requestJsonp('mobile-ajax/recent', true);
}
, createFormIframe : function (container) {
var styleSheet = document.getElementsByTagName("style")[0];
var iframe = IFrameUtil.createAndInsertIframe(container, this.onFormIframeLoaded, false);
//iframe.contentWindow.document.charset = "Shift_JIS";
//iframe.contentWindow.document.writeln("");
return iframe;
}
, createInheritedIframe : function (container) {
var styleSheet = document.getElementsByTagName("style")[0];
var iframe = IFrameUtil.createAndInsertIframe(container, this.onInheritedIframeCreated, false);
if (iframe.contentWindow) {
iframe.init = true;
iframe.contentWindow.document.charset = "Shift_JIS";
iframe.contentWindow.document.writeln("");
}
return iframe;
}
, onInheritedIframeCreated : function (sender) {
}
, requestJsonp : function (path, recent)
{
var joinner = (path.indexOf('?') == -1) ? '?' : '&';
var uri = this.docroot + path + joinner + 't=' +(new Date()).valueOf();
if (window.XMLHttpRequest) {
XHRUtil.requestJsonp(uri);
} else if (this.useIFrame) {
IFrameUtil.jsonpContainerId = "jsonp-container";
IFrameUtil.requestJsonp(uri);
} else {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', uri);
//script.setAttribute('charset', 'UTF-8');
var scripts = document.getElementById('jsonp-container');
scripts.appendChild(script);
}
}
, startInterval : function () {
this.stopInterval();
this.timerId = setInterval(this._onTick, this.interval);
}
, stopInterval : function () {
if (this.timerId) {
clearInterval(this.timerId);
this.timerId = null;
}
}
, onChangeChannel : function () {
this.stopInterval();
this.channelIframe.contentWindow.document.getElementById('lines').innerHTML = "";
this.requestJsonp('mobile-ajax/channel?channel=' + encodeURIComponent(document.getElementById('channel').value));
this.startInterval();
}
, _onTick : function () { Mobirc.onTick(); }
, onTick : function () {
this.requestJsonp('mobile-ajax/channel?recent=1&channel=' + encodeURIComponent(document.getElementById('channel').value));
// this.requestJsonp('mobile-ajax/recent', true); TODO: reimplement
}
, onSubmit : function () {
try {
var msg = document.getElementById('msg');
SubmitUtil.submit(document.getElementById('channel').value, msg.value);
msg.value = "";
} catch (e) { alert(e.description || e.toString()); }
return false;
}
, onClick : function (e) {
var a = (e.target || e.srcElement);
Mobirc.selectChannel(a.title);
return false;
}
, callbackChannel : function (lines) {
if (lines != null && lines.length < 1)
return;
var doc = this.channelIframe.contentWindow.document;
var ul = doc.getElementById('lines');
var html = "";
for (var i = 0, n = lines.length; i < n; i++) {
html += ""+this.unescapeHTML(lines[i])+"";
}
ul.innerHTML = html + ul.innerHTML;
if (ul.childNodes.length > 50) {
ul.removeChild(ul.lastChild);
}
}
// DOM
, callbackChannel__ : function (lines) {
if (lines != null && lines.length < 1)
return;
var doc = this.channelIframe.contentWindow.document;
var ul = doc.getElementById('lines');
for (var i = lines.length-1; i >= 0; i--) {
var li = doc.createElement('li');
li.innerHTML = this.unescapeHTML(lines[i]);
ul.insertBefore(li, ul.firstChild);
}
if (ul.childNodes.length > 50) {
ul.removeChild(ul.lastChild);
}
}
, callbackRecent : function (recents) {
if (recents != null && recents.length < 1)
return;
try {
var doc = this.recentLogIframe.contentWindow.document;
var ul = doc.getElementById('lines');
for (var n = 0; n < recents.length; n++) {
var lines = recents[n].lines;
for (var i = 0, j = lines.length; i < j; i++) {
var a = doc.createElement('a');
a.appendChild(doc.createTextNode(recents[n].channel));
a.title = recents[n].channel_enc;
a.href = "javascript:";
if (a.addEventListener) {
a.addEventListener('click', this.onClick, false);
} else if (a.attachEvent) {
a.attachEvent('onclick', this.onClick);
}
var li = doc.createElement('li');
li.innerHTML = "> " + this.unescapeHTML(lines[i]);
li.insertBefore(a, li.firstChild);
ul.insertBefore(li, ul.firstChild);
}
if (ul.childNodes.length > 50) {
ul.removeChild(ul.lastChild);
}
}
} catch (e) { alert(e); }
}
, selectChannel : function (chanUriName) {
var select = document.getElementById('channel');
select.value = chanUriName;
for (var i = 0; i < select.options.length; i++) {
select.options[i].selected = (select.options[i].value == chanUriName);
}
this.onChangeChannel();
}
, unescapeHTML : function (s) {
return (s.replace(/</g, '<').replace(/>/g, '>').replace(/"/g, '"').replace(/&/g, '&'));
}
};
var XHRUtil = {
requestJsonp : function (path) {
var xhr = new XMLHttpRequest();
xhr.open("GET", path, true);
xhr.onreadystatechange = function () {
if (xhr.readyState == 4 && xhr.status >= 200 && xhr.status < 400) {
eval(xhr.responseText);
}
}
xhr.send(null);
}
};
var IFrameUtil = {
jsonpContainerId : "container"
, iframe : null
, requestQueue : []
, createAndInsertIframe : function (containerId, onloadHandler, requireInit) {
var e = document.createElement("iframe");
document.getElementById(containerId).appendChild(e);
if (document.all && window.opera == undefined) {
this.bindEvent(e, 'readystatechange', function () { if (e.readyState == "complete" && onloadHandler) onloadHandler(e);});
} else {
this.bindEvent(e, 'load', function () { if (onloadHandler) onloadHandler(e);});
}
if (requireInit)
e.contentWindow.document.writeln("");
return e;
}
, bindEvent : function (E, eventName, handler) {
if (E.addEventListener) {
E.addEventListener(eventName, handler, false);
} else if (E.attachEvent) {
E.attachEvent('on'+eventName, handler);
}
}
, requestJsonp : function (path) {
if (this.iframe == null) {
this.iframe = this.createAndInsertIframe(this.jsonpContainerId, IFrameUtil.onLoad_, false);
this.iframe.style.display = 'none';
}
this.requestQueue.push(path);
if (this.requestQueue.length == 1) {
this.processNextRequest();
}
return this.iframe;
}
, onLoad_ : function () { IFrameUtil.onLoad(event.srcElement || event.target); }
, onLoad : function (sender) {
try {
eval(sender.contentWindow.document.body.innerHTML);
} catch (e) {};
if (this.iframe.src != "") {
this.requestQueue.shift();
this.processNextRequest();
}
}
, processNextRequest : function () {
if (this.requestQueue.length > 0) {
this.iframe.src = this.requestQueue[0];
}
}
};
Mobirc.setUp();