function EscapeToWin(AStr){
	if (typeof(AStr)!='string') return AStr;
	var Result='',cc;
	for(var i=0;i<AStr.length;i++) {
		if(AStr.charAt(i)>='А' && AStr.charAt(i)<='я') {
			cc=AStr.charCodeAt(i)-0x0410; Result+='%'+'CDEF'.charAt(cc>>>4);
			cc&=0x0F; Result+=(cc>9) ? 'ABCDEF'.charAt(cc-10): cc;
		} else if(AStr.charAt(i)=='Ё')
			Result+='%A8';
		else if(AStr.charAt(i)=='ё')
			Result+='%B8';
		else if(AStr.charAt(i)=='=')
			Result+='%3D';
		else if(AStr.charAt(i)=='&')
			Result+='%26';
		else
			Result+=AStr.charAt(i);
	}
	return Result;
}

var cons,xml_users,xml_msg,conf_id,msg2send=[];

var config = {
	xml_src : "/lib/xcons.php",
	img_path  : "/img/u_photos/",
	usr_var   : "uid",
	usr_delay : 5000,
	msg_delay : 2000,
	dialog    : "us-dialog",
	err_comm  : 'err',
	no_users  : 'no'
}

function message(mNode) {
	this.id=parseInt(mNode.getAttribute("id"));
	this.typ=mNode.getAttribute("typ");
	this.img=mNode.getAttribute("img");
	this.msg=unescape(mNode.getAttribute("msg"));
}

function getTime() {
	var tmp=new Date();
	var h = tmp.getHours(); if (h<10) h = '0' + h;
	var m = tmp.getMinutes(); if (m<10) m = '0' + m;
	return h + ':' + m;
}

function user(id,uNode) {
	this.id=id;
	this.name=uNode.getAttribute("name");
	this.img=uNode.getAttribute("img");
	this.total=parseInt(uNode.getAttribute("total"));
	this.last_shown=0;
	this.shown=0;
	this.valid=true;
	this.msgs =[];
	this.time = getTime();

	this.update = function(id,uNode) {
		this.total=parseInt(uNode.getAttribute("total"));
		this.valid=true;
	}

	this.draw_user = function() {
		var diff = this.total-this.shown, sgn='';
		if (diff<0) sgn='?'; else if (diff>0)
		sgn=" (" + diff + ")";
		var s = "<tr><td width=200 id=\"usr" + this.id + "\" height=10 bgcolor=#F2F1F1 onMouseOver=\"bgColor='#CFEFFC';\" onMouseOut=\"bgColor='#F2F1F1';\"><a  class=blink href=\"javascript:switch_user(" + this.id + ")\">"
			+ this.name + ' ' + this.time + sgn +"</a></td></tr>";
		return s;
	}

	this.deactivate = function() {
		var elm=document.getElementById("usr"+this.id);
		elm.style.fontWeight="normal";
	}

	this.activate = function() {
		var elm=document.getElementById("usr"+this.id);
		elm.style.fontWeight="bold"; this.shown=0;
	}

	this.show_msg = function(all) {
		var n=this.msgs.length;
		if (n==0) return; var s='';
		for (var i=0; i < n;  i++) {
			if (all || this.last_shown<this.msgs[i].id) {
				s+=this.make_msg(this.msgs[i],i);
				this.last_shown=this.msgs[i].id;
				this.shown++;
			}
		}
		var elm=document.getElementById(config.dialog);
		elm.innerHTML=elm.innerHTML+s;
	}

	this.make_msg = function(msg,i) {
		if (msg.typ == "0") var nm=this.name; else var nm='Operator';
		var s = '<p><b>' + nm + ':</b> <span class="p">' + msg.msg + '</span></p>';
		//var s = '<p><input class="radio" type="radio" id="radio' + i + '" value="'+msg.id+'" name="n'+msg.typ+'" onclick="mark_msg(this,'+i+')">'+'<b>' + nm + ':</b> <span class="p">' + msg.msg + '</span></p>';
		return s;
	}

	this.load_msg = function (xml_doc) {
		if( xml_doc == null || xml_doc.documentElement == null) {
			var elm=document.getElementById(config.dialog);
			elm.innerHTML="Can't load messages for user '"+ this.name + "'";
			return;
		}
		var cn = xml_doc.documentElement.childNodes, j = 0;
		for (var i = 0; i < cn.length; i++) {
			if (cn[i].tagName == "msg") this.msgs.push(new message(cn[i]));
		}
	}
}

function consulter() {
	this.error  = 0;
	this.users  = [];
	this.active = 0;
	this.uTimer = 0;

	this.find_user = function(uid) {
//		alert(this.users.length);
		for (var i=0; i<this.users.length; i++) {
//			alert (uid+' i:'+i+' uid:'+this.users[i].id);
			if (this.users[i].id == uid) return i;
		}
		return -1;
	}

	this.invalidate = function() {
		for (var i=0; i<this.users.length; i++) {
			this.users[i].valid = false;
		}
	}

	this.clear = function() {
		var usr = [];
		for (var i=0; i<this.users.length; i++) {
			if (this.users[i].valid) usr.push(this.users[i]);
			else if (i==this.active) this.deactivate();
		}
		this.users=usr;
	}

	this.load_users = function (xml_doc) {
		if( xml_doc == null || xml_doc.documentElement == null) {
			this.error++; return;
		}
		this.error=0;
		// mark users as invalid
		var n=this.users.length;
		this.invalidate();
		// read XML doc
		var cn = xml_doc.documentElement.childNodes, j = 0;
		for (var i = 0; i < cn.length; i++) {
			if (cn[i].tagName == "user") {
				var uid=parseInt(cn[i].getAttribute("id"));
				var ui=this.find_user(uid);
				if (ui!=-1) this.users[ui].update(uid,cn[i]);
				else this.users.push(new user(uid,cn[i]));
			}
		}
		this.clear();
		return n - this.users.length;
	}

	this.activate = function (uid) {
		var i=cons.find_user(uid);
		if (i!=-1) {
			this.deactivate(i);
			this.active=this.users[i].id;
			get_message(uid,true);
			this.uTimer=window.setInterval("get_message(" + this.active + ")", config.msg_delay);
		}
	}

	this.deactivate = function (i) {
		if (this.uTimer) window.clearInterval(this.uTimer);
		if (this.active) this.users[i].deactivate();
		this.active=0; this.uTimer=0;
		var elm=document.getElementById(config.dialog);
		elm.innerHTML='';
	}

	this.show_users = function(snd) {
		var elm = document.getElementById("us-users");
		elm.innerHTML='';
		var s = "", j = 0;
		for (var i=0; i<this.users.length; i++) {
			s = s + this.users[i].draw_user(); j++;
		}
		if (j == 0) {
			if (this.error)
				s='<td>'+config.err_comm+'</td>';
			else
				s="<td>"+config.no_users+"</td>";
		}
		elm.innerHTML = "<table width=100% cellPadding=2 cellSpacing=1 align=center border=0>" + s + "</table>";
	}

}

function switch_user(uid) {
	cons.activate(uid);
}

function mark_msg(elm,i) {
	msg2send[elm.name]=[elm.value,elm.id];
	if (msg2send.n0[0]!=0 && msg2send.n1[0]!=0) {
		var elm=document.getElementById('public'); elm.innerHTML=config.active_pub;
	}
}

function get_message(uid,all) {
	var i=cons.find_user(uid);
	if (i!=-1) {
		var usr = cons.users[i];
		xml_msg.open("GET", config.xml_src + "?" + config.usr_var + '=' + usr.id + '&last=' + usr.last_shown, false);	// sync
		xml_msg.send(null);
		usr.load_msg(xml_msg.responseXML);
		usr.show_msg(all);
	}
}

function get_users() {
	var lock = true;
	//alert('GETTING:'+config.xml_src + "?" + config.usr_var + '=list&cnf='+conf_id);
	document.getElementById('debug').innerHTML=config.xml_src + "?" + config.usr_var + '=list&cnf='+conf_id;
	xml_users.open("GET", config.xml_src + "?" + config.usr_var + '=list&cnf='+conf_id, true);	// async
	xml_users.onreadystatechange = function () {
		if (xml_users.readyState == 4 && lock) {
			lock=false; cons.show_users(cons.load_users(xml_users.responseXML));
		}
	};
	window.setTimeout(function () { xml_users.send(null); }, 10);
}

function post() {
	var elm = document.getElementById("us-input");
	if (elm.value=='' || cons.active==0) return;
	var post='&msg=' + EscapeToWin(elm.value);
	xml_msg.open("GET", config.xml_src + "?uid=" + cons.active + post, false);	// sync
	xml_msg.send(null);
	elm.innerHTML='';
	elm.value='';
	//alert(elm);
}

function post2conf() {
	if (msg2send.n0[0]==0 || msg2send.n1[0]==0) return alert('Не выбраны сообщения для отправки!');
	var post=config.xml_src + '?uid='+ cons.active +'&cnf='+conf_id + '&que=' + msg2send.n0[0] + '&ans=' + msg2send.n1[0];
	xml_msg.open("GET", post, false);	// sync
	xml_msg.onreadystatechange = function () {
		if (xml_msg.readyState == 4 ) {
			var elm=document.getElementById('public'); elm.innerHTML=config.inactive_pub;
			elm=document.getElementById(msg2send.n0[1]); if (elm) elm.checked=false;
			elm=document.getElementById(msg2send.n1[1]); if (elm) elm.checked=false;
			msg2send.n0=0; msg2send.n1=0;
		}
	}
	xml_msg.send(null); msg2send.n0=0; msg2send.n1=0;
}

function init() {
	cons = new consulter();
	xml_msg= XmlHttp.create();
	var tmp=document.location.href.split('/'); conf_id=parseInt(tmp[tmp.length-1],10);
	xml_users= XmlHttp.create(); get_users(); msg2send.n0=[0,'']; msg2send.n1=[0,''];
	var elm=document.getElementById('public'); elm.innerHTML=config.inactive_pub;
	window.setInterval("get_users()", config.usr_delay);
}

