// chat.js custom object for asynchronous messaging
// jsmx (engine.js)


function Chat(c) {
	this.messages=new Array();
	this.throttleCounter=0;	
	this.frozen=1;
	
	this.containerElement=$(c.containerElement);
	this.refreshIndicatorElement=$(c.refreshIndicatorElement);	
	this.bodyElement=$(c.bodyElement);
	this.inputElement=$(c.inputElement);
	this.toggleElement=$(c.toggleElement);
	
	this.displaySize=c.displaySize;
	this.refreshRate=c.refreshRate;
	this.minRefreshRate=c.minRefreshRate;
	this.baseRefreshRate=c.refreshRate;
	this.bufferSize=c.bufferSize;
	this.throttleThreshold=c.throttleThreshold;
	this.throttleIncrement=c.throttleIncrement;
	this.lineSpacing=c.lineSpacing;
	this.fontSize=c.fontSize;
	
	this.render();
	
	if(c.activate) {
		this.start();
		this.show();
	}	
	
	return this;
}

Chat.prototype.render = function() {

	var prefix;
	var message;
	
	for(i=this.bufferSize;i>0;i--) {
		row = document.createElement("tr");
		row.setAttribute("id","messageRow" + i);
		row.setAttribute("className","messageRow");
		row.setAttribute("class","messageRow");
		
		prefix = document.createElement("td");
		prefix.setAttribute("className","messagePrefix");
		prefix.setAttribute("class","messagePrefix");
		prefix.setAttribute("id","messagePrefix" + i);
		
		message = document.createElement("td");
		message.setAttribute("className","message");
		message.setAttribute("class","message");
		message.setAttribute("id","message" + i);
		
		row.appendChild(prefix);
		row.appendChild(message);
		this.bodyElement.appendChild(row);
	}
	this.setRowVisibility();
	this.setLineSpacing(this.lineSpacing);
	this.setFontSize(this.fontSize);
	this.setRefreshRate(this.refreshRate);
}

Chat.prototype.hide = function() {
	Element.hide(this.containerElement);
}

Chat.prototype.show = function() {
	Element.show(this.containerElement);
}

Chat.prototype.start = function()  {
	this.frozen=0;
}

Chat.prototype.stop = function()  {
	this.frozen=1;
}

Chat.prototype.toggle = function() {
	this.frozen=(this.frozen?0:1);
	if(this.frozen)  {
		Element.update(this.toggleElement,"resume chat");
		this.inputElement.value="chat paused";
		Element.setStyle(this.inputElement,{backgroundColor:"#FFF"});
		this.inputElement.readOnly=true;
		Element.update(this.refreshIndicatorElement,"chat paused");
	} else {
		Element.update(this.toggleElement,"pause chat");
		this.inputElement.value="";
		Element.setStyle(this.inputElement,{backgroundColor:""});
		this.inputElement.readOnly=false;
		this.inputElement.focus();
		this.receive();
		this.setRefreshRate(this.refreshRate);
	}		
}

Chat.prototype.trimBuffer = function() {
	while(this.messages.length > this.bufferSize) {
		this.messages.pop();
	}
}

Chat.prototype.populate = function() {
	var n,l,message;
	var sl=0;
	var w=0;
	var count = (this.bufferSize > this.messages.length?this.messages.length:this.bufferSize);

	var lDelta=11;
	var lBase=180;

	for(var i=0;i<count;i++) {
		if(i<this.displaySize) {
			l=this.messages[i].username.length-8;
			sl=(l>sl?l:sl);
		}
	}
	w=(sl > 0 ? sl*lDelta : 0);
	w+=lBase;
	var count = (this.bufferSize > this.messages.length?this.messages.length:this.bufferSize);
	for(i=0;i < count;i++) {
		message = this.messages[i];
		if (!message.message) { return }
		n=i+1;
		var prefixHTML = '&lt;' + formatMessageDate(message.dateposted) + '&nbsp;<a href="javascript:void(0);" onClick="command.parse(\'/user ' + message.username + '\');">' + (message.username=='Calahn'&&global.user.username!=='Calahn'?'Sugar Britches':message.username) + '</a>&gt;';
		Element.update('messagePrefix' + n,prefixHTML);
		Element.setStyle('messagePrefix'+n,{width:w+'px'});
		if(message.username=='R6-N4' && global.user.username!=='Calahn'){
			message.message=message.message.replace(/Calahn/g,'Sugar Britches');
		}
		Element.update('message' + n,this.clean(message.message));		
		var o = {color:"#000",fontWeight:"normal"};
		if(message.type=="system") {
			o={color:"#888",fontWeight:"bold"}; 
		} else if (message.type=="echo") {
			o={color:"red",fontWeight:"normal"};
		}
		Element.setStyle('message' + n,o);
	}
	this.trimBuffer();
	setPanelHeight();
}

Chat.prototype.clean = function(s) {
	s=s.replace(/\[\[\[pct\]\]\]/g,'%');
	s=s.replace(/\[\[\[plus\]\]\]/g,'+');
	s=s.replace(/\[\[\[amp\]\]\]/g,'&amp;');
	return s;
}
	


Chat.prototype.restoreRefreshRate = function() {
	this.throttleCounter=0;	
	this.setRefreshRate(this.baseRefreshRate);
}

Chat.prototype.incrementThrottleCounter = function() {
	alert(this.throttleCounter);
	this.throttleCounter = parseInt(this.throttleCounter + this.refreshRate);
	if(this.throttleCounter >= this.throttleThreshold) {
		var r = this.refreshRate + this.throttleIncrement;
		this.setRefreshRate(r > this.minRefreshRate ? this.minRefreshRate : this.refreshRate);
		this.throttleCounter = 0;
		//Element.update(this.refreshIndicatorElement,this.refreshRate/1000);
	}
}

Chat.prototype.setRefreshRate = function(n) {
	this.refreshRate = n;
	Element.update(this.refreshIndicatorElement,"&nbsp;refresh:" + n/1000 + "s");
}

Chat.prototype.setLineSpacing = function(v) {
	var options={single:6,double:12,triple:18};
	this.lineSpacing=v;
	for(i=this.displaySize;i>0;i--) {
		Element.setStyle("message" + i,{paddingBottom:options[v] + 'px'});
		Element.setStyle("messagePrefix" + i,{paddingBottom:options[v] + 'px'});		
	}	
	for(opt in options) {
		$('cs' + opt).style.fontWeight='normal';
	}
	$('cs' + v).style.fontWeight='bold';
	setPanelHeight();
}

Chat.prototype.setDisplaySize = function(n) {
	this.displaySize=n;
	this.setRowVisibility();
	this.setLineSpacing(this.lineSpacing);
	this.populate();	
}

Chat.prototype.setFontSize = function(v)  {
	var options={small:'Small',medium:'Medium',large:'Large'};
	this.fontSize=v;
	for(i=this.displaySize;i>0;i--) {
		$("message" + i).className="message" + options[v];
		$("messagePrefix" + i).className="messagePrefix" + options[v];	
	}	
	for(opt in options) {
		$('cs' + opt).style.fontWeight='normal';
	}
	$('cs' + v).style.fontWeight='bold';
	setPanelHeight();	
}

Chat.prototype.setRowVisibility = function()  {
	for(i=1;i<=this.bufferSize;i++) {
		Element.setStyle("messageRow"+i,{display:(i<=this.displaySize?"block":"none")});
	}
}

Chat.prototype.isPopulated = function() {
	return (this.messages.length?1:0);
}

Chat.prototype.send = function(msg) {
	
	msg=msg.replace(/\%/g,'[[[pct]]]');
	msg=msg.replace(/\+/g,'[[[plus]]]');
	msg=msg.replace(/\&/g,'[[[amp]]]');
	
	if(msg.length == 0 || chat.frozen) {return false;}
	
	args = new Object();
	args.object="message";
	args.method="send";
	args.message=msg;

	http('POST','index.cfm',chat.send_Response,args);
}

Chat.prototype.send_Response=function(obj) {
	chat.restoreRefreshRate();
}

Chat.prototype.receive=function() {
	if(chat.frozen) { return; }

	args = new Object();
	args.object="message";
	args.method="receive";
	args.newOnly=chat.isPopulated();
	http('POST','index.cfm',chat.receive_Response,args);

}

Chat.prototype.receive_Response=function(obj) {
	var msg,u;
	if(obj.data.length)  {
		var a = obj.data.reverse();
		for(var i=0;i < a.length;i++) {
			msg = a[i].message;			
			chat.messages.unshift(a[i]);
		}
		chat.populate();
	}			
	if(!chat.frozen) { setTimeout('chat.receive()',chat.refreshRate);}
}	

Chat.prototype.echo=function(o) {
	chat.messages.unshift({username:'R6-N4',dateposted:new Date().getTime(),message:o.message,type:'echo'});
	chat.populate();
}


	
	

		