// $FreeBSD: clickon/volgograd_neo/js/jabberchat.js,v 1.16 2007/02/01 09:56:40 skiv Exp $
//-------------------------//
// Скрипты для жаббер-чата //
//-------------------------//

var answer = '';
var change_name = 0;
var cmdurl = '/cgi-bin/jadviser.cgi';

// переменные ростера
var guest_roster_names = new Array();
var grni = 0;

// цвета чата
var color_nick = '559922';	// все ники и /me сообщения
var color_pers = 'BB4477';	// ник отправителя личного сообщения типа "user: ..."
var color_priv = 'CC6633';	// ник отправителя приватного сообщения
var color_self = '224400';	// свой ник
var color_sulci = '0033CC'; // ник бота sulci
var color_presence = 'CCCCCC'; // сообщения присутствия

// цвета ростера
var color_moderator = 'CC6600';		// модераторы
var color_visitor = 'BBBBBB';		// гости (без права голоса)
var color_participant = '000000';	// участники
var color_away = '999999';			// участник отошел
var color_private = 'FF0000';		// приватное сообщение

function getHTTPObject() {
	var isDOM = document.getElementById;
	var isO   = isO5 = window.opera && isDOM;
	var isIE  = document.all && document.all.item && !isO;
	var isIE5 = isIE && isDOM;
	try {
		var control = (isIE5) ? 'Microsoft.XMLHTTP' : 'Msxml2.XMLHTTP';
		xmlhttp = new ActiveXObject(control);
	} catch (e) {
		xmlhttp = false;
	}
	if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
		try {
			xmlhttp = new XMLHttpRequest();
		} catch (e) {
			xmlhttp = null;
		}
	}
	return xmlhttp;
}

// получение сообщений
function recievemsg(sUrl,oRes,repl){
	if(connected){
		var http_ready = 0;
		var xmlhttp = getHTTPObject();
		// alert(sUrl);
		xmlhttp.open("GET", sUrl, true);
		xmlhttp.setRequestHeader('If-Modified-Since', 'Thu, 22 Nov 2001 00:00:01 GMT');
		xmlhttp.onreadystatechange = function(){
			if(xmlhttp.readyState == 4) {
				if (xmlhttp.status == 200) {
					if (xmlhttp.responseText != ''){
						if(xmlhttp.responseText == 'no_such_connection'){
							alert("Вы отключены.");
							connected = 0;
						}{
							answer = '';
							if(repl){grni = 0;guest_roster_names = new Array();}
							if(xmlhttp.responseXML.documentElement){
								if(!is_private){unset_privat();}
								parse_node(xmlhttp.responseXML.documentElement);
							}
							if(repl){
								oRes.innerHTML = answer;
								clear_users();// чистим панель юзеров для гостевого соединения
							}
							else{
								oRes.innerHTML = oRes.innerHTML + answer;
							}
							//if(answer != ""){
								oRes.scrollTop = oRes.scrollHeight + 100;
							//}
							can_reload = true;
						}
					} else {
						alert("Жаббер недоступен.");
						connected = 0;
					}
				} else {
					alert("Ошибка доставки данных:\nНевозможно получить ответ от сервера.");
					connected = 0;
				};
			}
		}
		xmlhttp.send(null);
	}
}

// проверка присутствия пользователя
function check_presence(sUrl,iName){
	var http_ready = 0;
	var xmlhttp = getHTTPObject();
	xmlhttp.open("GET", sUrl, true);
	xmlhttp.setRequestHeader('If-Modified-Since', 'Thu, 22 Nov 2001 00:00:01 GMT');
	xmlhttp.onreadystatechange = function(){
		if(xmlhttp.readyState == 4) {
			if (xmlhttp.status == 200) {
				if (xmlhttp.responseText != ''){
					if(xmlhttp.responseText == 'no_such_connection'){
						alert("Нет соединения с жаббером.");
						connected = 0;
					}{
						if(xmlhttp.responseXML.documentElement){
							var l = xmlhttp.responseXML.documentElement.childNodes.length;
							for (var i=0; i < l; i++) {
								var n = xmlhttp.responseXML.documentElement.childNodes.item(i);
								if (n.nodeType == 1 && n.nodeName == 'adviser'){
									inp = document.getElementById(iName);
									if(n.getAttribute('presence') == '1'){
										inp.disabled = false;
									}else{
										inp.disabled = true;
									}
								}
							}
						}
					}
				} else {
					alert("Жаббер недоступен.");
					connected = 0;
				}
			} else {
				alert("Ошибка доставки данных:\nНевозможно получить ответ от сервера.");
				connected = 0;
			};
		}
	}
	xmlhttp.send(null);
}

// отправка сообщения
function sendmsg(parameters){
	var http_ready = 0;
	var xmlhttp = getHTTPObject();
	var isO = window.opera && document.getElementById;
	var IE7 = navigator.userAgent.indexOf("MSIE 7");
//	var IE7 = ua.indexOf("MSIE ");
//	var MSIEVersionNumber = parseFloat(ua.substring(IEoffset+5, ua.indexOf(";", IEoffset)));
//	var isMZ  = document.getElementById && (navigator.appName=="Netscape");
	var enc = document.getElementById("encode");
	if(isO || IE7 || (enc && enc.checked)){
		parameters = parameters + "&isO=true";
	}
	xmlhttp.open('POST', cmdurl, true);
	xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
	xmlhttp.setRequestHeader("Content-length", parameters.length);
	xmlhttp.setRequestHeader("Connection", "close");
	xmlhttp.onreadystatechange = function(){
		if(xmlhttp.readyState == 4) {
			if (xmlhttp.status != 200) {
				send_error = "Не могу отправить сообщение. E" + xmlhttp.status;
			}
		};
	}
	xmlhttp.send(parameters);
}

// подключение
function connect(ulogin,acc){
	var http_ready = 0;
	var xmlhttp = getHTTPObject();
	xmlhttp.open("GET", cmdurl + "?cmd=new&user=" + ulogin + "&account=" + acc, true);
	xmlhttp.onreadystatechange = function(){
		if(xmlhttp.readyState == 4) {
			if (xmlhttp.status == 200) {
				sid = xmlhttp.responseText;
				connected = 1;
				reload_chat();
			}
			else{
				alert("Не могу подключиться. Ошибка при получении сессии.");
			}
		};
	}
	xmlhttp.send(null);
}

// отключение
function disconnect(){
	var http_ready = 0;
	var xmlhttp = getHTTPObject();
	xmlhttp.open("GET", cmdurl + "?cmd=exit&sid=" + sid, true);
	xmlhttp.onreadystatechange = function(){
		if(xmlhttp.readyState == 4) {
			if (xmlhttp.status != 200) {
				alert("Ошибка при отключении.");
			}
			else{
				connected = 0;
				alert("Вы отключены.");
			}
		};
	}
	xmlhttp.send(null);
}

// разбор XML от сервера
function parse_node(n){
	if (n.nodeType == 1) { // если это NODE_ELEMENT
		if(n.nodeName == 'time') {	// разбираем тэг времени
			var h = n.getAttribute('hour');
			var m = n.getAttribute('min');
			if(m <= 9){m = "0" + m}
			if(h <= 9){h = "0" + h}
			message_time = h + ':' + m;
		}
		if(n.nodeName == 'message') {
			if(is_private){
				messagetext = parse_message_private(n);
			}
			else{
				messagetext = parse_message(n);
			}
			if(messagetext){
				answer += "<br/>" + get_message_time(n) + messagetext;
			}
		}
		if(n.nodeName == 'presence' && sid && !is_private) {
			answer += parse_presence(n);
		}
		// ростер в гостевом соединении
		if(n.nodeName == 'people') {
			tmp = add_user(n.firstChild.nodeValue, "", color_presence);
			guest_roster_names[grni] = n.firstChild.nodeValue;
			grni++;
		}
		// тема в гостевом соединении
		if(n.nodeName == 'subj' && n.childNodes.length) {
			var subj = document.getElementById("subject");
			subj.innerHTML = n.firstChild.nodeValue;
		}
		// есть приватные сообщения
		if(n.nodeName == 'private'){
			set_privat(n.firstChild.nodeValue);
			//if(confirm('Приватное сообщение от ' + n.firstChild.nodeValue + '. Открыть окно привата?')){
			//	var newwin = window.open("/chat/private.p3?sid=" + sid + "&interlocutor=" + n.firstChild.nodeValue, "");
			//}
		}
		if(n.nodeName == 'document'){
			var l = n.childNodes.length;
			for (var i=0; i < l; i++) {
				parse_node(n.childNodes.item(i));
			}
		}
	}
}


// обработка сообщений
function parse_message(n){
	// получение ника
	var from = n.getAttribute('from');
	nickname = getnickname(from);
	// стандартный цвет ника
	var color = color_nick;
	// подсветка sulci
	if(nickname == 'sulci'){
		color = color_sulci;
	}
	if(nickname == user_login + '[web]'){
		color = color_self;
	}
	// обработка subject
	var subject_element = n.getElementsByTagName('subject').item(0);
	if(subject_element && subject_element.childNodes.length){
		var subj = document.getElementById("subject");
		subjtext = subject_element.firstChild.nodeValue;
		subjtext = subjtext.replace(/</g, "&lt;");
		subjtext = subjtext.replace(/>/g, "&gt;");
		subj.innerHTML = '<b>Тема:</b>&nbsp;'+subjtext;
		var body_element = n.getElementsByTagName('body').item(0);
		if(body_element && body_element.childNodes.length){
			var subjbody = body_element.firstChild.nodeValue;
			subjbody = subjbody.replace(/has set the subject to/g, "установил тему");
		}
		if(subjbody){
			return "<span style='color:#" + color + "'>-- " + subjbody + "</span>";
		}
		else{
			return "<span style='color:#" + color + "'>-- " + nickname + " установил тему: " + subjtext + "</span>";
		}
	}
	else{
		// обработка body
		var body_element = n.getElementsByTagName('body').item(0);
		if(body_element && body_element.childNodes.length){
			var message_text = body_element.firstChild.nodeValue;
			message_text = message_text.substr(0,1000);

			// подсветка личных сообщений
			var message_type = n.getAttribute('type');
			if(message_type == "chat"){
				color = color_priv;
			}
			return parse_text(message_text, color, nickname);
		}
	}
}

// обработка только приватных сообщений
function parse_message_private(n){
	// получение ника
	var from = n.getAttribute('from');
	nickname = getnickname(from);
	// цвет
	color = color_nick;
	if(nickname == user_login + '[web]'){
		color = color_self;
	}
	// обработка body
	var body_element = n.getElementsByTagName('body').item(0);
	if(body_element && body_element.childNodes.length){
		var message_text = body_element.firstChild.nodeValue;
		message_text = message_text.substr(0,1000);
		var message_type = n.getAttribute('type');
		if(message_type == "chat"){
			return parse_text(message_text, color, nickname);
		}
	}
}

// обработка текста сообщения
function parse_text(msgtext,color,nickname){
	// поиск своего имени в сообщении
	var pattern = eval('/' + user_login + '\\[web\\]/g');
	var resultArray = msgtext.match(pattern);
	if (resultArray) {
		color = color_pers;
		msgtext = msgtext.replace(pattern, '<b>' + user_login + '[web]</b>');
	}
	// обработка /me
	var resultArray = msgtext.match(/^(\/me)(.*)/g);
	if (resultArray) {
		return "<span style='color:#" + color + "'>* " + nickname + " " + msgtext.substr(3) + "</span>";
	}
	else{
		return "<span style='color:#" + color + "' title='"+nickname+"'>&lt;" + nickname + "&gt;</span> " + msgtext;
	}
}

// обработка только сообщений присутствия
function parse_presence(n){
	var res="";
	try{
		var color = color_presence;
		from = n.getAttribute('from');
		nickname = getnickname(from);
		presence_type = n.getAttribute('type');
		if(presence_type == null || presence_type == ''){
			// получаем тип - модератор/участнег
			var role = "";
			var x_element = n.getElementsByTagName('x').item(0);
			if(x_element){
				var item_element = x_element.getElementsByTagName('item')
				if(item_element){
					iel = item_element.item(0);
					if(iel){
						role = iel.getAttribute('role');
					}
				}
			}
			away = 0;
			var showEl = n.getElementsByTagName('show').item(0);
			if(showEl){
				if(showEl.firstChild.nodeValue == 'xa'){away = 1;}
			}
			res = add_user(nickname, role, color, away);
			if(change_name){
				res = "";
				change_name = 0;
			}
			if(nickname == user_login + '[web]'){
				if(role == 'visitor'){
					alert("Вам запретили говорить!");
					var typestr = document.getElementById('msg');
					typestr.disabled = true;
				}
				if(role == 'participant'){
					var typestr = document.getElementById('msg');
					typestr.disabled = false;
				}
			}
		}
		if(presence_type == 'unavailable'){
			var x_element = n.getElementsByTagName('x').item(0);
			var status_element = x_element.getElementsByTagName('status').item(0);
			if(status_element){
				var status_code = status_element.getAttribute('code');
				// если есть <status code='303'/>, то это смена ника на <item affiliation='none' nick='nick' role='participant'/>
				if(status_code == '303'){
					var item_element = x_element.getElementsByTagName('item').item(0);
					var new_nickname = item_element.getAttribute('nick');
					change_name = 1; // была смена имени а не выход
					res = "<span style='color:#" + color + "'>--- " + nickname + " изменил(а) имя на " + new_nickname + "</span>";
				}
				// если есть <status code='307'/>, то это кик
				if(status_code == '307'){
					res = "<span style='color:#" + color + "'>--- " + nickname + " выгнали из комнаты</span>";
					if(nickname == user_login + '[web]'){
						disconnect();
						// запоминаем, что товарища кикнули
						var xmlhttp = getHTTPObject(); 
						xmlhttp.open("GET", "/chat/control.p3?action=kick", true);
						xmlhttp.send(null);
					}
				}
			}
			var table = document.getElementById('users');
			var i = 0;
			while(i<=table.rows.length-1){
				if(table.rows.item(i).id == 'user_'+nickname){
					table.deleteRow(i);
				}
				else{
					i++;
				}
			}
			if(res == ""){
				res = "<span style='color:#" + color + "'>--- " + nickname + " вышел из комнаты</span>";
			}
		}
	}
	catch(e){
		res = "script error: " + e;
	}
	if(res != ""){
		return "<br>" + get_message_time(n) + res;
	}
	else{
		return "";
	}
}

// обозначение наличия приватных сообщений
function set_privat(nick){
	privlink = document.getElementById('priv_user_'+nick);
	if(privlink){
		privlink.style.color = "#" + color_private;
		//privlink.style.fontWeight = "bold";
	}
}

// снятие выделения приватных сообщений
function unset_privat(){
	var table = document.getElementById('users');
	if(table){
		var i = 0;
		while(i<=table.rows.length-1){
			privlink = document.getElementById('priv_'+table.rows.item(i).id);
			if(privlink){
				privlink.style.color = "";
				//privlink.style.fontWeight = "400";
			}
			i++;
		}
	}
}

// вывод пользователя в ростер
function add_user(nickname, role, color, away){
	user = document.getElementById('user_'+nickname);
	if(!user){
		var table = document.getElementById('users');
		newRow = table.insertRow(table.rows.length);
		newRow.id = 'user_'+nickname;
		tdcontrol = newRow.insertCell(0);
		if(role == 'moderator'){
			tdcontrol.style.color = "#" + color_moderator;
		}
		if(role == 'visitor'){
			tdcontrol.style.color = "#" + color_visitor;
		}
		if(role == 'participant'){
			tdcontrol.style.color = "#" + color_participant;
		}
		if(away){
			tdcontrol.style.color = "#" + color_away;
		}
		tdcontrol.innerHTML = nickname;
		if(user_login != 'guest'){
			// установка обработчика клика
			tdcontrol.style.cursor = 'hand';
			setupEventHandler(tdcontrol, 'click', set_name);
			// кнопка привата
			tdcontrol = newRow.insertCell(1);
			if(nickname != 'eye[bot]' && nickname != user_login + '[web]'){
				tdcontrol.innerHTML = "<a href='/chat/private.p3?sid=" + sid + "&interlocutor=" + nickname + "' target='_blank' title='Приват' id='priv_user_" + nickname + "' style='font75'>[приват]</a>";
			}
		}
		return "<span style='color:#" + color + "'>--- " + nickname + " вошел в комнату</span>";
	}
	else{
		tdcontrol = user.cells.item(0);
		if(role == 'moderator'){
			tdcontrol.style.color = "#" + color_moderator;
		}
		if(role == 'participant'){
			tdcontrol.style.color = "#" + color_participant;
		}
		if(role == 'visitor'){
			tdcontrol.style.color = "#" + color_visitor;
		}
		if(away){
			tdcontrol.style.color = "#" + color_away;
		}
		return "";
	}
}

// очистка пользователей
function clear_users(){
	var table = document.getElementById('users');
	var i = 1;
	while(i<=table.rows.length-1){
		var j = 0;
		var delrow = 1;
		while(j<=guest_roster_names.length-1){
			if(table.rows.item(i).id == 'user_' + guest_roster_names[j]){
				delrow = 0;
			}
			j++;
		}
		if(delrow){
			table.deleteRow(i);
		}
		else{
			i++;
		}
	}
}

// дата-время
function get_message_time(n){
	var x_element = n.getElementsByTagName('x').item(0);
	if(x_element != null){
		try{
			var stamp = x_element.getAttribute('stamp');
		}catch(e){
		}
	}
	if(stamp != null && stamp != ""){
		elements = stamp.split('T');
		thetime = elements[1];
		elements = thetime.split(':');
		return "[" + eval(parseInt(elements[0]) + 3) + ":" + elements[1] + "] ";
	}
	else{
		if(message_time != ""){
			return "[" + message_time + "] ";
			message_time = "";
		}
		else{
			var mydate = new Date();
			var h = mydate.getHours();
			var m = mydate.getMinutes();
			if(m <= 9){m = "0" + m}
			if(h <= 9){h = "0" + h}
			return "[" + h + ":" + m + "] ";
		}
	}
}

// клик по имени участнега, пришивается динамически
function set_name(e){
	if (!e) e = window.event;
	if(e.currentTarget){
//		nick = e.currentTarget.innerHTML;
//		nick = e.currentTarget.cells.item(0).innerHTML;
 		if(e.target.data){
 			nick = e.target.data;
 		}
 		else{
 			nick = e.target.innerHTML;
 		}
	}
	else{
//		nick = e.srcElement.parentElement.innerText;
		nick = e.srcElement.innerText;
	}
	var msg_string = document.getElementById('msg');
	msg_string.value = nick + ": " + msg_string.value;
	msg_string.focus();
}

// кроссбраузерная установка хэндлера
function setupEventHandler(oElement, sEventType, pHandler) {
	if (oElement.attachEvent){
		oElement.attachEvent('on'+sEventType, pHandler);
	}
	if ( oElement.addEventListener ){
		oElement.addEventListener(sEventType, pHandler, false);
	}
}

// получение ника
function getnickname(jid){
	try {
		var re = new RegExp("^([^@]*)@([^/]*)\/(.*)","g");
		arr = re.exec(jid);
		nickname = RegExp.$3;
		if(!nickname || firstpart){
			nickname = RegExp.$1;
		}
	} catch (e) {
		arr = jid.split('/');
		nickname = arr[1];
		if(!nickname){
			nickname = arr[0];
		}
	}
	if(!nickname){nickname = 'guest';}
	return nickname;
}

/*
<presence from='preved@conference.jabber.volgograd.ru/skiv[web]' to='_@volgograd.ru/13915807031160481685249683' xml:lang='en'><x xmlns='http://jabber.org/protocol/muc#user'><item affiliation='none' role='visitor'/></x></presence></entry>
разрешение говорить
<presence from='preved@conference.jabber.volgograd.ru/skiv[web]' to='_@volgograd.ru/13915807031160481685249683' xml:lang='en'><x xmlns='http://jabber.org/protocol/muc#user'><item affiliation='none' role='participant'/></x></presence></entry>
кик
<presence from='preved@conference.jabber.volgograd.ru/skiv[web]' to='_@volgograd.ru/13915807031160481685249683' type='unavailable'><x xmlns='http://jabber.org/protocol/muc#user'><item affiliation='none' role='none'/><status code='307'/></x></presence></entry>
*/
