// XML Chat v1.0
// (c) Kimmo Kyyhkynen
// http://www.kyyhkynen.net

var chatForm = "xmlchat";
var chatOutput = "xmlchatoutput";
var chatServer = "/xmlchat/xmlchat.php";
var chatUpdateInterval = 5000;
var chatLastMsgId = 0;
var chatHttpObj = null;
var chatTimeOut = null;
// Event handling function by Mike West
// http://mikewest.org/blog/id/12
function handleEvent(obj, event, func) {
	try {
		obj.addEventListener(event, func, false);
	} catch (e) {
		if (typeof obj['on'+event] == "function") {
			var existing = obj['on'+event];
			obj['on'+event] = function () { existing(); func(); };
		} else {
			obj['on'+event] = func;                        
		}
	}
}

yellowFade = function(element) {
	this.e = element;
	this.f = 0;
	this.fade();
}
yellowFade.prototype.fade = function() {
	var thisObj = this;
	this.timer = setInterval( function() {
		if (thisObj.f < 255) {
			thisObj.e.style.backgroundColor = "rgb(255,255,"+thisObj.f+")";
			thisObj.f += 15;
		} else
			clearInterval(thisObj.timer);
	}, 100);
}

function initChat() {
	if (document.getElementsByTagName) {
		var chatInputs = document.forms[chatForm].getElementsByTagName('input');
		for (var i = 0; i < chatInputs.length; i++) chatInputs[i].setAttribute('autocomplete','off');
	}
	handleEvent(document.forms[chatForm], "submit", sendChatText);
	handleEvent(document.forms[chatForm].elements['chatt'], "focus", checkStatus);
	handleEvent(document.forms[chatForm].elements['chatt'], "blur", checkStatus);
	handleEvent(document.forms[chatForm].elements['chatt'], "keyup", checkStatus);
	handleEvent(document.forms[chatForm].elements['chatn'], "focus", checkStatus);
	handleEvent(document.forms[chatForm].elements['chatn'], "blur", checkStatus);
	handleEvent(document.forms[chatForm].elements['chatn'], "keyup", checkStatus);
	chatLastMsgId = document.getElementById(chatOutput).getElementsByTagName("dt")[0].id.substr(4);
	chatHttpObj = getXMLHttpObj();
	checkName();
	checkStatus();
	getChatText();
}

function getChatText() {
	if (chatHttpObj.readyState == 4 || chatHttpObj.readyState == 0) {
  	chatHttpObj.open("GET",chatServer + '?last=' + chatLastMsgId + '&' + (new Date()).getTime());
    chatHttpObj.onreadystatechange = handleHttpChat; 
  	chatHttpObj.send(null);
	}
}

function handleHttpChat() {
  if (chatHttpObj.readyState == 4) {
    var xmlDoc = chatHttpObj.responseXML;
		//if (xmlDoc.documentElement.hasAttribute("frequency"))
		//	chatUpdateInterval = parseInt(xmlDoc.documentElement.getAttribute("frequency"));
		var msgs = xmlDoc.documentElement.getElementsByTagName("message");
		for (var i = 0; i < msgs.length; i++) {
			addMessage(msgs[i]);
			chatLastMsgId = msgs[i].getAttribute('id');
    }
    chatTimeOut = setTimeout('getChatText();',chatUpdateInterval);
  }
}

//inserts the new content into the page
function addMessage(xml) {
	var output = document.getElementById(chatOutput);
	var oDt = document.createElement('dt');
	var oDd = document.createElement('dd');
	var oSpan = document.createElement('span');
	var oTime = document.createTextNode(xml.getElementsByTagName('time')[0].firstChild.nodeValue);
	oDt.innerHTML = xml.getElementsByTagName('name')[0].firstChild.nodeValue
	oDd.innerHTML = xml.getElementsByTagName('text')[0].firstChild.nodeValue;
	//var oName = document.createTextNode(xml.getElementsByTagName('name')[0].firstChild.nodeValue);
	//var oText = document.createTextNode(xml.getElementsByTagName('text')[0].firstChild.nodeValue);
	oSpan.appendChild(oTime);
	//oDt.appendChild(oName);
	oDt.appendChild(oSpan);
	//oDd.appendChild(oText);
	output.insertBefore(oDd, output.firstChild);
	output.insertBefore(oDt, output.firstChild);
	oDt.f = new yellowFade(oDt);
	oDd.f = new yellowFade(oDd);
}

function sendChatText(evt) {
	evt = (evt) ? evt : ((event) ? event : null);
	if (evt.preventDefault)
		evt.preventDefault();
	else 
		evt.returnValue = false;
	var chatText = escape(document.forms[chatForm].elements['chatt'].value);
	var chatName = escape(document.forms[chatForm].elements['chatn'].value);
	if (chatText != '' & (chatHttpObj.readyState == 4 || chatHttpObj.readyState == 0)) {
		clearTimeout(chatTimeOut);
		var content = 'chatn=' + chatName + '&chatt=' + chatText + "&last=" + chatLastMsgId;	
		chatHttpObj.open("POST", chatServer, true);
		chatHttpObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  	chatHttpObj.onreadystatechange = handleHttpChat;
  	chatHttpObj.send(content);
  	document.forms[chatForm].elements['chatt'].value = '';
	} else {
		setTimeout('sendChatText();',1000);
	}
	checkStatus();
	return false;
}



function checkStatus() {
	var currentChatText = document.forms[chatForm].elements['chatt'].value;
	var currentChatName = document.forms[chatForm].elements['chatn'].value;
	if (currentChatText != '' && currentChatName != '') {
		document.forms[chatForm].elements['submit'].disabled = false;
	} else {
		document.forms[chatForm].elements['submit'].disabled = true;
	}
}

function checkName() {
	var currentName = document.forms[chatForm].elements['chatn'];
	if (currentName.value == '') {
		currentName.value = 'vieras_'+ Math.floor(Math.random() * 10000);
	}
}


function getXMLHttpObj() {
  var xmlhttp;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
    }
  @else
  xmlhttp = false;
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

handleEvent(window, "load", initChat);

