
var gtid = null;
var goReq = null;
var gnLast = 0;
var goRooms = {};
var goLines = [];

function getRadio(form, sName)
{
  return Form.serialize($(form)).toQueryParams()[sName];
}

function sEnableETag1(sText, sT, s1, s2)
{
  while (sText.match(new RegExp('^(.*)&lt;' + sT + '\\s+' + s1 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*&gt;(.*)$', 'i')))
  {
    var sL = RegExp.$1;
    var sV = RegExp.$3 ? RegExp.$3 : RegExp.$4;
    sText = sL + '<' + sT + ' ' + s1 + '="' + sV + '"' + s2 + '>' + RegExp.$5;
  }
  return sText;
}

function sEnableETag2(sText, sT, s1, s2)
{
  while (sText.match(new RegExp('^(.*)&lt;' + sT + '\\s+' + s1 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*' + s2 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*&gt;(.*)$', 'i')))
  {
    var sL = RegExp.$1;
    var sA = RegExp.$3 ? RegExp.$3 : RegExp.$4;
    var sB = RegExp.$6 ? RegExp.$6 : RegExp.$7;
    sText = sL + '<' + sT + ' ' + s1 + '="' + sA + '" ' + s2 + '="' + sB + '">' + RegExp.$8;
  }
  while (sText.match(new RegExp('^(.*)&lt;' + sT + '\\s+' + s2 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*' + s1 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*&gt;(.*)$', 'i')))
  {
    var sL = RegExp.$1;
    var sB = RegExp.$3 ? RegExp.$3 : RegExp.$4;
    var sA = RegExp.$6 ? RegExp.$6 : RegExp.$7;
    sText = sL + '<' + sT + ' ' + s1 + '="' + sA + '" ' + s2 + '="' + sB + '">' + RegExp.$8;
  }
  return sText;
}

function sEnableTag0(sText, sT)
{
  while (sText.match(new RegExp('^(.*)&lt;' + sT + '\\s*&gt;(.*)$', 'i')))
  {
    var sL = RegExp.$1;
    if (! RegExp.$2.match(new RegExp('^(.*?)&lt;\/' + sT + '\\s*&gt;(.*)$', 'i'))) { break; }
    sText = sL + '<' + sT + '>' + RegExp.$1 + '</' + sT + '>' + RegExp.$2;
  }
  return sText;
}

function sEnableTag1(sText, sT, s1, s2)
{
  while (sText.match(new RegExp('^(.*)&lt;' + sT + '\\s+' + s1 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*&gt;(.*)$', 'i')))
  {
    var sL = RegExp.$1;
    var sV = RegExp.$3 ? RegExp.$3 : RegExp.$4;
    if (! RegExp.$5.match(new RegExp('^(.*?)&lt;\/' + sT + '\\s*&gt;(.*)$', 'i'))) { break; }
    sText = sL + '<' + sT + ' ' + s1 + '="' + sV + '"' + s2 + '>' + RegExp.$1 + '</' + sT + '>' + RegExp.$2;
  }
  return sText;
}

function sEnableTag2(sText, sT, s1, s2)
{
  while (sText.match(new RegExp('^(.*)&lt;' + sT + '\\s+' + s1 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*' + s2 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*&gt;(.*)$', 'i')))
  {
    var sL = RegExp.$1;
    var sA = RegExp.$3 ? RegExp.$3 : RegExp.$4;
    var sB = RegExp.$6 ? RegExp.$6 : RegExp.$7;
    if (! RegExp.$8.match(new RegExp('^(.*?)&lt;\/' + sT + '\\s*&gt;(.*)$', 'i'))) { break; }
    sText = sL + '<' + sT + ' ' + s1 + '="' + sA + '" ' + s2 + '="' + sB + '">' + RegExp.$1 + '</' + sT + '>' + RegExp.$2;
  }
  while (sText.match(new RegExp('^(.*)&lt;' + sT + '\\s+' + s2 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*' + s1 + '\\s*=\\s*(&quot;([^&]+)&quot;|([^&\\s]+))\\s*&gt;(.*)$', 'i')))
  {
    var sL = RegExp.$1;
    var sB = RegExp.$3 ? RegExp.$3 : RegExp.$4;
    var sA = RegExp.$6 ? RegExp.$6 : RegExp.$7;
    if (! RegExp.$8.match(new RegExp('^(.*?)&lt;\/' + sT + '\\s*&gt;(.*)$', 'i'))) { break; }
    sText = sL + '<' + sT + ' ' + s1 + '="' + sA + '" ' + s2 + '="' + sB + '">' + RegExp.$1 + '</' + sT + '>' + RegExp.$2;
  }
  return sText;
}

function sEnableTag(sText)
{
  sText = sText.replace(/&/g, '&amp;');
  sText = sText.replace(/</g, '&lt;');
  sText = sText.replace(/>/g, '&gt;');
  sText = sText.replace(/"/g, '&quot;');
  sText = sText.replace(/&lt;br\s*\/?&gt;/ig, '<br>');
  var sE1 = [['img', 'src', ' alt="Image"']];
  for (var n = 0; n < sE1.length; n++) { sText = sEnableETag1(sText, sE1[n][0], sE1[n][1], sE1[n][2]); }
  var sE2 = [['img', 'src', 'alt']];
  for (var n = 0; n < sE2.length; n++) { sText = sEnableETag2(sText, sE2[n][0], sE2[n][1], sE2[n][2]); }
  var sT0 = ['b', 'i', 'u', 's', 'tt', 'big', 'small', 'sub', 'sup', 'center'];
  for (var n = 0; n < sT0.length; n++) { sText = sEnableTag0(sText, sT0[n]); }
  var sT1 = [['a', 'href', ' target="_blank"'], ['div', 'align', ''], ['font', 'color', ''], ['font', 'size', '']];
  for (var n = 0; n < sT1.length; n++) { sText = sEnableTag1(sText, sT1[n][0], sT1[n][1], sT1[n][2]); }
  var sT2 = [['font', 'color', 'size']];
  for (var n = 0; n < sT2.length; n++) { sText = sEnableTag2(sText, sT2[n][0], sT2[n][1], sT2[n][2]); }
  while (sText.match(/^(.*)&lt;ruby\s*&gt;(.*)/i))
  {
    var sL = RegExp.$1;
    if (! RegExp.$2.match(/^(.*?)&lt;\/ruby\s*&gt;(.*)$/i)) { break; }
    var sR = RegExp.$2;
    var sB = RegExp.$1;
    var sO = '(';
    var sT = '';
    var sC = ')';
    if (sB.match(/^&lt;rb\s*&gt;(.*)&lt;\/rb\s*&gt;&lt;rp\s*&gt;(.*)&lt;\/rp\s*&gt;&lt;rt\s*&gt;(.*)&lt;\/rt\s*&gt;&lt;rp\s*&gt;(.*)&lt;\/rp\s*&gt;$/i)
     || sB.match(/^(.*)(\()(.*?)(\))$/i)
     || sB.match(/^(.*)(（)(.*?)(）)$/i)) {
      sB = RegExp.$1;
      sO = RegExp.$2;
      sT = RegExp.$3;
      sC = RegExp.$4;
    } else {
      if (sB.match(/(.*)&lt;rt\s*&gt;(.*?)&lt;\/rt\s*&gt;(.*)/i)) { sT = RegExp.$2; sB = RegExp.$1 + RegExp.$3; }
      if (sB.match(/(.*)&lt;rp\s*&gt;(.*?)&lt;\/rp\s*&gt;(.*)/i)) { sO = RegExp.$2; sB = RegExp.$1 + RegExp.$3; }
      if (sB.match(/(.*)&lt;rp\s*&gt;(.*?)&lt;\/rp\s*&gt;(.*)/i)) { sC = RegExp.$2; sB = RegExp.$1 + RegExp.$3; }
      if (sB.match(/(.*)&lt;rb\s*&gt;(.*?)&lt;\/rb\s*&gt;(.*)/i)) { sB = RegExp.$1 + RegExp.$2 + RegExp.$3; }
    }
    sText = sL + '<ruby><rb>' + sB + '</rb><rp>' + sO + '</rp><rt>' + sT + '</rt><rp>' + sC + '</rp></ruby>' + sR;
  }
  var s1 = sText;
  sText = '';
  while (s1.match(/^(.*?)((https?|ftp)\:\/\/[\w\!\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\=\?\@\~]+|(No\.?|Umi|&gt;&gt;|＞＞|Mii|Loc)([0-9\,\-]+))(.*)$/i))
  {
    sText += RegExp.$1;
    var sA = RegExp.$2;
    var sT = RegExp.$2;
    s1 = RegExp.$6;
    if (RegExp.$4) {
      sT = RegExp.$4 + RegExp.$5
      sA
       = (RegExp.$4.toLowerCase() == 'loc')
       ? ('http://umineko.locker.jp/bbs/?mode=red&no=0&namber=' + RegExp.$5)
       : (RegExp.$4.toLowerCase() == 'mii')
       ? ('http://rena07.com/Cgi/cbbs_mxi/cbbs.cgi?mode=red&no=0&namber=' + RegExp.$5)
       : ('http://naderika.com/Cgi/mxisxi_index/link.cgi?mode=red&bbs=u_No&no=0&namber=' + RegExp.$5);
    }
    sText += (sText.match(/(a href|img src)="$/i) && s1.match(/^"/i)) ? sA : ('<a href="' + sA + '" target="_blank">' + sT + '</a>');
  }
  sText += s1;
  return sText;
}

function sZero(nNum) {
  return (nNum < 10) ? ('0' + nNum) : nNum;
}

function sTime(oDate) {
  return (oDate == null) ? '<font class="back">00/00 00:00:00</font>'
   : (sZero(1 + oDate.getMonth()) + '/' + sZero(oDate.getDate()) + ' ' + sZero(oDate.getHours()) + ':' + sZero(oDate.getMinutes()) + ':' + sZero(oDate.getSeconds()));
}

function toDate(sTime) {
  return (sTime == null) ? null : new Date(sTime * 1000);
}

function fontColor(sText, sCol) {
  return ((sCol != '') ? ('<font color="' + sCol + '">' + sText + '</font>') : sText);
}

function makeLink(sText, sHref) {
  return '<nobr>[' + ((sHref == '') ? sText : ('<a href="' + sHref + '"' + (gbFrame ? ' target="_parent"' : '') + '>' + sText + '</a>')) + ']</nobr>';
}

function makeRoomLink(sText, sRoom) {
  return makeLink(sText, (sRoom == '') ? '' : ('?mode=' + (gbFrame ? 'frm0' : '') + '&amp;room=' + sRoom));
}

function makePastLink(sText, sRoom, sSign, sPast)
{
  return makeLink(sText, (sRoom == '' || sSign == '' || sPast == '') ? '' : ('?mode=' + (gbFrame ? 'frm0' : '') + '&amp;room=' + sRoom + '&amp;sign=' + sSign + '&amp;past=' + sPast));
}

function makePastLinks(oRoom, oPasts) {
  var sHtml = '';
//  [ '最初', '前へ', '前年', '前月', '前日', '翌日', '翌月', '翌年', '次へ' ];
  $H(oPasts).keys().each(function (sText) { sHtml += makePastLink(sText, oRoom.room, oPasts[sText] ? oPasts[sText][0] : '', oPasts[sText] ? oPasts[sText][1] : ''); });
  if ($H(oPasts).keys().length > 2) {
    sHtml += makeRoomLink('最新', oRoom.room);
    sHtml += ' <font size="-1">過去ログ' + ((oRoom.flag == '2') ? '（１時間以内）' : '（無制限）') + '表示中 自動更新停止</font>';
  } else {
    sHtml += ' <font size="-1">過去ログ' + ((oRoom.flag == '2') ? '（１時間以内）' : '（無制限）') + '</font>';
  }
  return sHtml;
}

function makeLine(oLine, oRoom, bRoom) {
  if (oLine.type != '1' && oLine.text == '') {
    var sName = fontColor(oLine.name, oLine.ncol);
    if (oLine.type == '2') { oLine.text = sName + '<font color="#cccccc" size="-1">さんが' + oRoom.name + 'に入室しました</font>'; }
    if (oLine.type == '3') { oLine.text = sName + '<font color="#cccccc" size="-1">さんが' + oRoom.name + 'を退室しました</font>'; }
    if (oLine.type == '4') { oLine.text = sName + '<font color="#cccccc" size="-1">さんが' + oRoom.name + 'から自動退室しました</font>'; }
    if (oLine.type == '5') { oLine.text = sName + '<font color="#cccccc" size="-1">さんが議題を削除しました</font>'; }
    oLine.name = 'システム';
    oLine.ncol = '#cccccc';
    oLine.icon = (oLine.type == '5') ? 'katayoku.gif' : 'chou.gif';
  } else if (oLine.type == '5') {
    oLine.icon = 'katayoku.gif';
  }
  return '<div><font size="-1"><font color="#cccccc">' + sTime(toDate(oLine.post)) + '</font>' + (bRoom ? (' ' + makeRoomLink(oRoom.name, oRoom.room) + ' ') : '')
   + '</font> <img class="icon' + goIcons[oLine.icon] + '" src="./icon/' + oLine.icon + '" alt="' + oLine.icon + '"' + ($('ctgli').checked ? '' : ' style="display: none"') + '> ' + fontColor(oLine.name, oLine.ncol) + ' &gt; <span class="text">' + oLine.text + '</span><br></div>';
}

function makeRoomHead(oRoom, sTime) {
  var sHtml = '';
  sHtml += '<div class="hr"></div>';
  sHtml += '<font size="-1">' + sTime + ' ' + makeRoomLink(oRoom.name, oRoom.room) + ' <font color="#cccccc">' + oRoom.head + '</font></font><br>';
  if (oRoom.subj && oRoom.subj.text != '') { sHtml += makeLine(oRoom.subj, oRoom, false); }
  sHtml += '<div align="right"><font size="-2">';
  for (var n = 0; n < oRoom.user.length; n++) { sHtml += fontColor(oRoom.user[n].name, oRoom.user[n].ncol) + ' '; }
  if (oRoom.user.length) { sHtml += '<font color="#cccccc">入室 ' + oRoom.user.length + ' 人</font> '; }
  sHtml += '<font color="#cccccc">閲覧 ' + oRoom.host + ' 人</font> ';
  sHtml += '</font></div>';
  return sHtml;
}

function sText() {
  if (! $('text')) { return ''; }
  var sText = $('text').value;
  if ($('tcol').value != '') { sText = fontColor(sText, $('tcol').value); }
  if ($('tsizl').checked) { sText = '<font size="' + $('tsizl').value + '">' + sText + '</font>'; }
  if ($('tsizs').checked) { sText = '<font size="' + $('tsizs').value + '">' + sText + '</font>'; }
  if ($('tfntb').checked) { sText = '<b>' + sText + '</b>'; }
  if ($('tfnti').checked) { sText = '<i>' + sText + '</i>'; }
  if ($('tfntu').checked) { sText = '<u>' + sText + '</u>'; }
  if ($('tfnts').checked) { sText = '<s>' + sText + '</s>'; }
  return sText;
}

function preview() {
  if ($('divPrev') == null || ! $('divPrev').visible()) { return; }
  var icon = getRadio('form1', 'icon');
  $('divPrev').innerHTML = ($('name').value == '') ? '<font size="-1">名前を入れてそのまま発言すると自動的に入室します</font>'
   : ('<font color="#cccccc" size="-1">' + sTime(new Date())
    + '</font> <img class="icon' + goIcons[icon] + '" src="./icon/' + icon + '" alt="' + icon + '"' + ($('ctgli').checked ? '' : ' style="display: none"')
    + '> ' + fontColor($('name').value, $('ncol').value) + ' &gt; <span class="text">' + sEnableTag(sText()) + '</span>');
}

function setCookie() {
  var oParams = {};
  document.cookie.split(';').each(function (value) { if (value.match(new RegExp('^\\s*' + gsCookieName + '=' + '(.*)$', 'i'))) { oParams = RegExp.$1.toQueryParams(); } });
  oParams['n_id'] = gsUserId;
  if ($('name')) { oParams['name'] = $('name').value; }
  if ($('ncol')) { oParams['ncol'] = $('ncol').value; }
  if (getRadio('form1', 'icon')) { oParams['icon'] = getRadio('form1', 'icon'); }
  if ($('ctgln')) { oParams['tgln'] = $('ctgln').checked; }
  if ($('ctglo')) { oParams['tglo'] = $('ctglo').checked; }
  if ($('ctgld')) { oParams['tgld'] = $('ctgld').checked; }
  if ($('ctglp')) { oParams['tglp'] = $('ctglp').checked; }
  if ($('ctglc')) { oParams['tglc'] = $('ctglc').checked; }
  if ($('ctglr')) { oParams['tglr'] = $('ctglr').checked; }
  if ($('ctgli')) { oParams['tgli'] = $('ctgli').checked; }
  var oDate = new Date();
  oDate.setTime(oDate.getTime() + 90 * 24 * 60 * 60 * 1000);
  document.cookie = gsCookieName + '=' + $H(oParams).toQueryString() + '; expires=' + oDate.toGMTString();
  preview();
}

function setColor(sMode) {
  var opts = $('m' + sMode).options;
  $(sMode).value = $(sMode).value.replace(/^\s+/, '').replace(/\s+$/, '').toLowerCase();
  if ($(sMode).value.match(/^#([0-9a-f])([0-9a-f])([0-9a-f])$/)) { $(sMode).value = '#' + RegExp.$1 + RegExp.$1 + RegExp.$2 + RegExp.$2 + RegExp.$3 + RegExp.$3; }
  if (! $(sMode).value.match(/^#[0-9a-f]{6}$/)) { for (var n = 0; n < opts.length; n++) { if (opts[n].text == $(sMode).value) { $(sMode).value = opts[n].value; } } }
  if (! $(sMode).value.match(/^#[0-9a-f]{6}$/)) { $(sMode).value = ''; }
  for (var n = 0; n < opts.length; n++) { if (opts[n].value == $(sMode).value) { opts[n].selected = true; } }
  if ($('m' + sMode).value != $(sMode).value) { opts[0].selected = true; }
  setCookie();
}

function updateLog(request) {
  var oRes = request.responseText.evalJSON();
  $H(oRes.rooms).values().each(function (oRoom) {
    if ('name' in oRoom) { goRooms[oRoom.room] = oRoom; }
    if ('last' in oRoom) { goRooms[oRoom.room].last = oRoom.last; }
    if ('host' in oRoom) { goRooms[oRoom.room].host = oRoom.host; }
  });
  if (oRes.lines) {
    goLines = goLines.concat(oRes.lines).sort(function (o1, o2) { return (o1.post < o2.post) ? 1 : (o1.post > o2.post) ? -1 : (o1.id < o2.id) ? 1 : (o1.id > o2.id) ? -1 : 0; });
    goLines = goLines.select(function (oLine, nIndex) {
      return (nIndex == 0 || oLine.id != goLines[nIndex - 1].id) && (oLine.flag == 1 || (oLine.flag == 2 && toDate(oLine.post).getTime() >= (new Date()).getTime() - 60 * 60 * 1000));
    });
    if (goLines.length > gnMaxLines) { goLines.length = gnMaxLines; }
  }
  $('divHead').update(makeRoomHead(goRooms[oRes.room], sTime(toDate(oRes.last))));
  var sPasts = makePastLinks(goRooms[oRes.room], oRes.pasts);
  $$('.divPast').each(function (past) { past.update('<div class="hr"></div><font color="#cccccc" size="-1">' + sPasts + '</font><br>'); });
  var sLines = '';
  goLines.each(function (oLine) { if (oLine) { sLines += '<div class="hr"></div>' + makeLine(oLine, goRooms[oLine.room], (oLine.room != oRes.room)); } });
  if (sLines == '') { sLines += '<div class="hr"></div><font size="-1">発言がありません</font>'; }
  $('divLine').update(sLines);
  var sRooms = '';
  $H(goRooms).values().sort(function (o1, o2) {
    return (o1.last < o2.last) ? 1 : (o1.last > o2.last) ? -1 : (o1.id < o2.id) ? 1 : (o1.id > o2.id) ? -1 : 0;
  }).each(function (oRoom) { if (oRoom.room != oRes.room) { sRooms += makeRoomHead(oRoom, sTime(toDate(oRoom.last))); } });
  $('divRoom').update(sRooms);
  gnLast = oRes.last;
  gtid = setTimeout("reload({ last: gnLast })", 2000);
}

function reload(oParams) {
  if (! gbAjax) { return true; }
  if (gtid != null) { clearTimeout(gtid); }
  if (goReq != null) { goReq.transport.abort(); }
  goReq = new Ajax.Request('?_XDEBUG_PROFILE=' + new Date(), { method: 'post', parameters: $H(oParams).merge($H({ mode: 'data', room: gsRoomId })).toQueryString(), onComplete: updateLog });
}

function send(event, oParams) {
  if(oParams && oParams.type
   && ! window.confirm((oParams.type == 'exit') ? '退室しますか？' : $('text').value ? '議題を変更しますか？' : '議題を削除しますか？')) {
    Event.stop(event);
    return false;
  }
  reload($H(oParams).merge($H({ name: $('name') ? $('name').value : '', ncol: $('ncol') ? $('ncol').value : '', icon: getRadio('form1', 'icon'), text: sText() })));
  if (goReq == null) { return true; }
  if ($('text')) {
    $('text').value = '';
    $('text').focus();
    $('tcol').value = '';
    $('tcolw').click();
    $('tsizm').click();
    $('tfntb').checked = false;
    $('tfnti').checked = false;
    $('tfntu').checked = false;
    $('tfnts').checked = false;
  }
  Event.stop(event);
  return false;
}

function init() {
//  if ($('room')) { $('room').focus(); }
  reload();
  preview();
}

function quit() {
  if (goReq != null) { goReq.transport.abort(); }
}

//document.observe('dom:loaded', function() { init(); });
//Event.observe(window, 'load', function() { init(); });
//Event.observe(window, 'unload', function() { quit(); });

