var pendingMessages = new Array();
var syncTimer = null;

ajaxCaller.shouldDebug = false;
ajaxCaller.shouldMakeHeaderMap = false;

var MIN_TEXTAREA_ROWS = 3;
var MAX_TEXTAREA_ROWS = 30;

window.onload = function() {
  synchronise();
  startPeriodicSync();
}

function startPeriodicSync() {
  stopPeriodicSync();
  syncTimer = setInterval(synchronise, 5000);
}

function stopPeriodicSync() {
  clearInterval(syncTimer);
}

function resize(textarea) {

    var textRows = textarea.value.split('\n');
    var newRowAmount = textRows.length + 2;

    for ( var i=0; i<textRows.length; i++ ) {
      if ( textRows[i].length > textarea.cols ) {
        newRowAmount += Math.floor(textRows[i].length/textarea.cols);
      }
    }
    newRowAmount = Math.max(newRowAmount, 3);
    newRowAmount = Math.min(newRowAmount, 30);
    textarea.rows = newRowAmount;

}

function onMessagesLoaded(xml, callingContext) {
  window.status = "loaded";
  var wikiMessages = xml.getElementsByTagName("message");
  var messagesHTML = "";
  while ($("messages").hasChildNodes()) {
    $("messages").removeChild($("messages").firstChild);
  }
  for (var i=0; i<wikiMessages.length; i++) {
    var messageNode = wikiMessages[i];
    var content = getChildValue(messageNode, "content");
    content = (content==null ? "" : unescape(content));
    var serverMessage = {
        id: this.getChildValue(messageNode, "id"),
        lastAuthor: this.getChildValue(messageNode, "lastAuthor"),
        ranking: this.getChildValue(messageNode, "ranking"),
        content: content
    };
    var messageArea = document.createElement("textarea");
    messageArea.className = "messageArea";
    messageArea.id = serverMessage.id;
    messageArea.serverMessage = serverMessage;
    messageArea.rows = 3;
    messageArea.cols = 80;
    messageArea.value = serverMessage.content;
    messageArea.onmouseout = onMessageMouseOut;
    messageArea.onmouseover = onMessageMouseOver;
    messageArea.onfocus = onMessageFocus;
    messageArea.onblur = onMessageBlur;

    lastAuthor = document.createElement("div");
    lastAuthor.className = "lastAuthor";
    lastAuthor.innerHTML = serverMessage.id + "."
      + "<em>" + serverMessage.lastAuthor + "</em>"+"."
      + serverMessage.ranking+"."+i;

    messageDiv = document.createElement("div");
    messageDiv.className = "messageDiv";
    messageDiv.appendChild(lastAuthor);
    messageDiv.appendChild(messageArea);

    $("messages").appendChild(createSpacer());
    $("messages").appendChild(messageDiv);
    $("messages").appendChild(createSpacer());

    resize(messageArea);

  }
}

function getChildValue(parentNode, childName) {
  var childNode = parentNode.getElementsByTagName(childName)[0];
  return childNode.firstChild == null ? null : childNode.firstChild.nodeValue;
}

function createSpacer(event) {
  var div = document.createElement("div");
  div.className = "spacer";
  div.appendChild(document.createTextNode(" "));
  return div;
}

function getMessage(event) {
  event = event || window.event;
  return event.target || event.srcElement;
}

function onMessageMouseOver(event) {
  var message = getMessage(event);
  if (!message.hasFocus) {
    message.style.borderStyle="dotted";
    message.style.borderColor="black";
  }
}

function onMessageMouseOut(event) {
  var message = getMessage(event);
  if (!message.hasFocus) {
    message.style.borderStyle="solid";
    message.style.borderColor="white";
  }
}

function onMessageFocus(event) {
  var message = getMessage(event);
  message.hasFocus=true;
  message.style.borderStyle="solid";
  message.style.borderColor="black";
  message.style.backgroundColor="white";
  stopPeriodicSync();
}

function onMessageBlur(event) {
  var message = getMessage(event);
  message.hasFocus=false;
  message.style.borderStyle="solid";
  message.style.borderColor="white";
  message.style.backgroundColor="#cccccc";
  resize(message);

  var initialMessageContent = message.serverMessage.content;

  if (message.value != initialMessageContent) {
    pendingMessages[message.id] = true;
    message.style.backgroundColor = "#ffcc33";
  }

  startPeriodicSync();

}

function synchronise() {

  if (pendingMessages.length > 0) {
    uploadMessages(pendingMessages, onMessagesLoaded);
    pendingMessages = new Array();
  } else {
    ajaxCaller.getXML("content.phtml?messages", onMessagesLoaded);
  }

}

