function createCookie(name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name)
{
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name)
{
	createCookie(name,"",-1);
}

Catboxer.Request = function(encodeduri,whencomplete) {
  // Initialise an xmlhttp object
  var xmlhttp=false;
  /*@cc_on @*/
  /*@if (@_jscript_version >= 5)
  // JScript gives us Conditional compilation, we can cope with old IE version
  // and security blocked creation of the objects.
  try {
  xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
  try {
  xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
  } catch (E) {
  xmlhttp = false;
  }
  }
  @end @*/
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }

  this.transport=xmlhttp;

  this.transport.open("GET", encodeduri, true);
  this.transport.onreadystatechange=function() {
    if (xmlhttp.readyState==4) {
      if (whencomplete) {
	whencomplete(xmlhttp.responseXML);
      }
    }
  }
  xmlhttp.send(null);
}


Catboxer.sendMessage = function(message) {
  catboxer.message.setAttribute("class","oddrow");
  catboxer.sending.style.display="inline";
  catboxer.talk.style.display="none";
  catboxer.lastsaid.style.display="none";
  var encmessage = encodeURIComponent(message);
  var url = "/index.pl?node=Universal+Message+XML+Ticker&links_noparse=1&backtime=10&op=message&message="+encmessage; 
  var cboxrequest = new Catboxer.Request(url,Catboxer.treatRoomXML);
  var pmurl = "/index.pl?node=Universal+Message+XML+Ticker&links_noparse=1&for_node=me&msglimit="+catboxer.lastindex;

  var messtobedeleted = "";
  var potentialinputs = catboxer.cbform.getElementsByTagName("input");
  for (var i=0;i<potentialinputs.length;i++) {
    var name = potentialinputs[i].getAttribute("name");
    var checked = potentialinputs[i].checked;
    if (checked && /deletemsg_/.test(name)) {
      messtobedeleted+="&"+name;
      potentialinputs[i].style.display="none";
      var node = potentialinputs[i].nextSibling; 
      while (node!=null && (node.tagName!="INPUT") && node!=catboxer.pmbox) {
	node.parentNode.removeChild(node);
	node=potentialinputs[i].nextSibling;
      };
      potentialinputs[i].checked=false;
    }
  }

  if (messtobedeleted!=""){
    pmurl+="&op=message"+messtobedeleted;
  }
  var pmrequest = new Catboxer.Request(pmurl,Catboxer.treatPrivateXML);
};

Catboxer.treatPrivateXML = function(xmldoc) {
  catboxer.currentxml="private";
  //alert(xmldoc.getElementsByTagName("msg").length);
  if (xmldoc.getElementsByTagName("msg").length>0) {  
    catboxer.pmbox.appendChild(Catboxer.roomToHtml(xmldoc.getElementsByTagName("msglist")[0]));
  }
  
}

Catboxer.treatRoomXML = function(xmldoc) {
  catboxer.currentxml="room";
  catboxer.message.setAttribute("class","");
  catboxer.sending.style.display="none";
  catboxer.talk.style.display="";
  var lastmessage=catboxer.message.value;
  catboxer.message.value="";

  if (lastmessage.substring(0,5)=="/msg ") {
    if (catboxer.lastsaid.hasChildNodes()) {
      catboxer.lastsaid.removeChild(catboxer.lastsaid.firstChild);
    }
    lastmessage=lastmessage.substr(5);
    var alastmessage=lastmessage.split(" ");
    var saidtotext = alastmessage.shift();
    lastmessage=alastmessage.join(" ");
    var saidtolink = document.createElement("a");
    saidtolink.appendChild(document.createTextNode(saidtotext));
    saidtolink.setAttribute("href","/index.pl?node="+saidtotext);
    var newspan= document.createElement("span");
    newspan.appendChild(Catboxer.parseLinks(document.createTextNode('You said "'+lastmessage+'" to ')));
    newspan.appendChild(saidtolink);
    catboxer.lastsaid.appendChild(newspan);
    catboxer.lastsaid.style.display="block";
  }


  if (lastmessage.substring(0,11)=="/chatteroff") {
    createCookie("chatteroff","true",10);
 } else if (lastmessage.substring(0,10)=="/chatteron") {
    eraseCookie("chatteroff");
  }

  var newcbox=null;
  if (readCookie("chatteroff")) {
    newcbox = document.createElement("div");
    newcbox.style.fontStyle="italic";
    newcbox.appendChild(document.createTextNode("your earplugs are in ("));
    var earpluglink = document.createElement("a");
    earpluglink.appendChild(document.createTextNode("remove them"));
    earpluglink.href="http://www.everything2.com/index.pl?RemoveEarPlugs=1";
    earpluglink.onmousedown= function() {
      eraseCookie("chatteroff");
      return true;
    }
    newcbox.appendChild(earpluglink);
    newcbox.appendChild(document.createTextNode(")"));
  } else if (xmldoc.getElementsByTagName("msg").length>0) {
    newcbox = Catboxer.roomToHtml(xmldoc.getElementsByTagName("msglist")[0]); 
  } else {
    newcbox = document.createElement("div");
    newcbox.style.fontStyle="italic";
    newcbox.appendChild(document.createTextNode("and all is quiet..."));
  }
  catboxer.cbform.replaceChild(newcbox,catboxer.catbox);
  catboxer.catbox=newcbox; 
}

Catboxer.roomToHtml = function(xmlnode) {
  var retnode=null;
  switch(xmlnode.nodeName) {
  case "msglist":
    //alert("starting msglist");
    retnode=document.createElement("div");
    for (var child=xmlnode.firstChild;child!=null;child=child.nextSibling) {
      var cnode = Catboxer.roomToHtml(child);
      if (cnode) retnode.appendChild(cnode);
    }
    if (catboxer.currentxml=="room") {
      retnode.style.paddingBottom="1em";
    }
    break;
  case "msg":
    if (xmlnode.getAttribute("archive")!=1){
      //    alert("a message");
      retnode=document.createElement("div");
      retnode.setAttribute("id",xmlnode.getAttribute("msg_id"));
      
      if (catboxer.currentxml=="private") {
	var inputbox=document.createElement("input");
	inputbox.setAttribute("type","checkbox");
	inputbox.setAttribute("name","deletemsg_"+xmlnode.getAttribute("msg_id"));
	inputbox.setAttribute("value","yup");
	retnode.appendChild(inputbox);
      }
      
      for (var child=xmlnode.firstChild;child!=null;child=child.nextSibling) {
	var cnode = ((xmlnode.getElementsByTagName("txt")[0].firstChild.data.substring(0,4)=="/me ") && (catboxer.currentxml=="room"))?
	  Catboxer.emoteToHtml(child):Catboxer.roomToHtml(child);
	if (cnode) retnode.appendChild(cnode);
      }
      if (catboxer.currentxml=="private") {
	catboxer.lastindex=xmlnode.getAttribute("msg_id");
      }
    }
    break;
    case "from":
    //alert("a from");
    switch(catboxer.currentxml) {
    case "room":
      retnode=document.createElement("span");
      retnode.appendChild(document.createTextNode("<"));
      retnode.appendChild(Catboxer.roomToHtml(xmlnode.firstChild));
      retnode.appendChild(document.createTextNode("> "));
      break;
    case "private":
      retnode=document.createElement("span");
      var replyto=document.createElement("a");
      var replyperson=xmlnode.firstChild.firstChild.data.split(" ").join("_");
      replyto.setAttribute("href","javascript:replyToCB('"+replyperson+"')");
      replyto.appendChild(document.createTextNode("r"));
      retnode.appendChild(document.createTextNode(" ("));
      retnode.appendChild(replyto);
      retnode.appendChild(document.createTextNode(") "));
      var usersez=document.createElement("span");
      usersez.style.fontStyle="italic";
      usersez.appendChild(Catboxer.roomToHtml(xmlnode.firstChild));
      usersez.appendChild(document.createTextNode(" says "));
      retnode.appendChild(usersez);
      break;
    default:
    }
    break;
  case "grp":
    if (catboxer.currentxml=="private") {
      retnode=document.createElement("span");
      var replyto=document.createElement("a");
      var replyperson=xmlnode.firstChild.firstChild.data.split(" ").join("_");
      replyto.setAttribute("href","javascript:replyToCB('"+replyperson+"')");
      replyto.appendChild(document.createTextNode("ra"));
      retnode.appendChild(document.createTextNode(" ("));
      retnode.appendChild(replyto);
      retnode.appendChild(document.createTextNode(")("));
      retnode.appendChild(Catboxer.roomToHtml(xmlnode.firstChild));
      retnode.appendChild(document.createTextNode(") "));
    }
    break;
  case "e2link":
    //alert("a link");
    retnode=document.createElement("a");
    retnode.setAttribute("href","/index.pl?node_id="+xmlnode.getAttribute("node_id"));
    retnode.appendChild(document.createTextNode(xmlnode.firstChild.data));
    break;
  case "txt":
    //alert("a text");
    //alert("text is: "+xmlnode.firstChild.data);
    retnode=document.createElement("span");
    retnode.appendChild(Catboxer.parseLinks(xmlnode.firstChild));
    break;
  default:
    break;
  }
  return retnode;
}

Catboxer.emoteToHtml = function(xmlnode) {
  var retnode=null;
  switch(xmlnode.nodeName) {
  case "from":
    retnode=Catboxer.roomToHtml(xmlnode.firstChild);
    retnode.style.fontStyle="italic";
    break;
  case "txt":
    retnode=document.createElement("span");
    retnode.style.fontStyle="italic";
    xmlnode.firstChild.data=xmlnode.firstChild.data.substr(3);
    retnode.appendChild(Catboxer.parseLinks(xmlnode.firstChild));
    break;
  default:
    break;
  }
  return retnode;
}


Catboxer.parseLinks = function(textnode) {
  // parse links also inserts a space in words of more than 20 chars.
  var entitytext=textnode.data;
  var entityfreetext=Catboxer.parseEntities(entitytext)
  var textarray=entityfreetext.split("[");
  var retnode = document.createElement("span");
  retnode.appendChild(document.createTextNode(Catboxer.textSplit(textarray[0])));
  for(var i=1;i<textarray.length;i++) { //start with 1 as 0 is not a link.
    var piecearray=textarray[i].split("]");
    var pipetext=piecearray[0];
    var aftertext=piecearray.slice(1).join("]");
    var linkarray=pipetext.split("|");
    var linknode=document.createElement("a");
    if (linkarray[0].match(/^(http:\/\/|www\.).+/)) {
      linknode.setAttribute("href",linkarray[0].replace(/^www/,"http://www"));
    } else {
      linknode.setAttribute("href","/index.pl?node="+linkarray[0]);
    }
    linknode.setAttribute("title",linkarray[0]);
    linknode.appendChild(document.createTextNode(Catboxer.textSplit((linkarray.length>1)?linkarray[1]:linkarray[0])));
    retnode.appendChild(linknode);
    retnode.appendChild(document.createTextNode(Catboxer.textSplit(aftertext)));
  }
  return retnode;
}

Catboxer.textSplit = function (str) {
  var strarray = str.split(" ");
  for (var i=0; i<strarray.length;i++) {
    for (j=20; j<strarray[i].length;j=j+21) {
      strarray[i]=strarray[i].substring(0,j)+" "+strarray[i].substr(j);
    }
  }
  return strarray.join(" ");
}

Catboxer.parseEntities = function(str) {
  var span = document.createElement("span");
  span.innerHTML=str;
  return span.firstChild?(span.firstChild.data || str):str;
}

function Catboxer() {
  this.cbform=document.formcbox;

  if (this.cbform) {
    this.cbform.onsubmit = this.interceptSubmit;
  }

  this.message=document.formcbox.message;
  this.talk=document.formcbox.message_send;

  var hr=this.message;

  while (!(hr.tagName && hr.tagName=="HR")) { //case sensitive
    hr=hr.previousSibling;
  }
  this.catbox=document.createElement("div");
  
  while (hr.nextSibling!=this.message) {
    var node = hr.nextSibling;
    this.cbform.removeChild(node);
    this.catbox.appendChild(node);
  }
  this.cbform.insertBefore(this.catbox,this.message);

  var lastinput = hr;
 
  while (!(lastinput.tagName && lastinput.tagName=="INPUT")) { //case sensitive
    lastinput=lastinput.previousSibling;
  }

  this.lastindex=lastinput.name.split("deletemsg_")[1];
  //alert(this.lastindex);

  var br = hr;

  while (!(br.tagName && br.tagName=="BR")) { //case sensitive
    br=br.previousSibling;
  }

  this.pmbox=document.createElement("div");
  this.cbform.insertBefore(this.pmbox,br);

  this.lastsaid=document.createElement("p");
  this.lastsaid.style.display="none";
  this.lastsaid.style.border="dashed black 1px";
  this.lastsaid.style.padding="2px";
  this.lastsaid.style.fontFamily="sans-serif";
  this.lastsaid.style.fontSize="smaller";
  this.cbform.insertBefore(this.lastsaid,this.message);

  this.sending = document.createElement("img");
  this.sending.setAttribute("src",
			    "http://www.tirno.com/images/spinner.gif");
  this.sending.style.display="none";
  this.cbform.insertBefore(this.sending,this.talk);
}

Catboxer.prototype.interceptSubmit = function() {
  Catboxer.sendMessage(catboxer.message.value);
  return false;
}

var catboxer=null;

if (window.onload) {
  var f=window.onload;
  window.onload= function() {catboxer=new Catboxer();f()};
} else {
  window.onload = function() {catboxer=new Catboxer();};
}

