function AsyncRequest(method, url, handler, data, contentType) {
  var req = null;
  if (window.XMLHttpRequest) req = new XMLHttpRequest();
  else if (window.ActiveXObject) req = new ActiveXObject("Microsoft.XMLHTTP");
  if (!req) return;
  req.open(method, url, true);
  req.onreadystatechange = function() {
    if (req.readyState == 4) handler(req.status, req.responseXML);
  }
  if (contentType) req.setRequestHeader('Content-Type', contentType);
  req.send(data);
}

function AsyncGetRequest(url, handler) {
  AsyncRequest('GET', url, handler, null, null);
}

function AsyncPostRequest(url, data, contentType, handler) {
  AsyncRequest('POST', url, handler, data, contentType);
}

/* ---------- ---------- ---------- ---------- ---------- */

function ExecuteXMLScripts(xml) {
  var root = xml.getElementsByTagName('response')[0];
  var items = xml.getElementsByTagName('script');
  for (var i=0; i<items.length; i++) {
    var item = items[i];
    var script = item.firstChild.nodeValue;
    eval(script);
  }
}

function RawServerCall(url, data, contentType) {
  AsyncPostRequest(url, data, contentType, function(s, x) { if (s == 200) ExecuteXMLScripts(x); else alert('Server Error: ' + s); });
}

function ServerCall(url, params) {
  var items = new Array();
  for (var key in params) items.push(key + '=' + params[key]);
  RawServerCall(url, items.join('&'), 'application/x-www-form-urlencoded');
}

/* ---------- ---------- ---------- ---------- ---------- */

function getObj(id) {
  return document.getElementById(id);
}

function getVal(id) {
  return getObj(id).value;
}

function show(id, visible) {
  var obj = getObj(id);
  if (obj) {
    if (visible) display = 'block';
    else         display = 'none';
    obj.style.display = display;
  }
}

function SetContent(idObj, content) {
  var obj = getObj(idObj);
  if (obj) obj.innerHTML = content;
}

function AddContent(idObj, content) {
  var obj = getObj(idObj);
  if (obj) obj.innerHTML += content;
}

function PrependContent(idObj, content) {
  var obj = getObj(idObj);
  if (obj) obj.innerHTML = content + obj.innerHTML;
}

function setErr(id, err) {
  var obj = getObj(id);
  if (err) {
    obj.style.borderStyle = 'solid';
    obj.style.borderColor = 'Red';
    obj.style.borderWidth = '3px';
  } else {
    obj.style.borderStyle = '';
    obj.style.borderColor = '';
    obj.style.borderWidth = '';
  }
}

function MoreMsgs() {
  show('moremsg', true);
  show('morelink', false);
}

function PopulateBoard(board) {
  var par = new Array();
  par['action'] = 'populate';
  par['board'] = board;
  ServerCall('board.xml', par);
}

function WriteMessage(board) {
  var par = new Array();
  par['action'] = 'form';
  par['board'] = board;
  ServerCall('board.xml', par);
}

function SendMessage(board) {
  var err = false;
  
  var nick = getVal('nick');
  if ((nick.length < 3) || (nick.length > 24)) { setErr('nick', true); err = true; }
  else setErr('nick', false);
  
  var message = getVal('message');
  if ((message.length < 3) || (message.length > 4096)) { setErr('message', true); err = true; }
  else setErr('message', false);
  
  if (!err) {
    var par = new Array();
    par['action'] = 'post';
    par['nick'] = nick;
    par['message'] = message;
    par['board'] = board;
    ServerCall('board.xml', par);
  }
}

function DelMessage(id) {
  var par = new Array();
  par['action'] = 'del';
  par['id'] = id;
  ServerCall('board.xml', par);
}

