/////////////////////////////////////////////////////////
// Copyright (C) 2005-2006 by Akond Lab www.akond.com  //
// All rights reserved.                                //
// Please do not use, copy, modify or publish any part //
// of this code without licence form Akond Lab.        //
/////////////////////////////////////////////////////////

var chats = new Object();
var statusCheckTimeout = '';

// --------[ CHAT ]-------------------------------------------------------------------

function beginGroupChat(chatId){
	if(statusCheckTimeout!=''){
		clearTimeout(statusCheckTimeout);
		statusCheckTimeout='';
	}
	var connection = initDefaultConnection(chatId, "group");
	if (connection){
		connection.params.GRP = modChatConf.getGroup();
		connection.params.CID = makeUniqueParam();
	}
	showChat(chatId, connection, window.document, '25');
}

function showNewMessages(console, chat_response) {
	var xmldoc = chat_response.responseXML;
	var messages, sysCommands;
	try {
		var applications = 0;
		if (window.ActiveXObject) { // IE
			var xml_doc = new ActiveXObject("Microsoft.XMLDOM");
			xml_doc.loadXML(chat_response.responseText);
			applications = xml_doc.getElementsByTagName('application');
		} else if (window.XMLHttpRequest) { // Mozilla, Safari,...
			applications = xmldoc.getElementsByTagName('application');
		}

		for (var i = 0; applications && i < applications.length; i++){
			switch (applications[i].getAttribute("name")){
				case "chat":
				messages = applications[i].getElementsByTagName('message');
				break;
				case "commander":
				sysCommands = applications[i].getElementsByTagName('command');
				break;
			}
		}
	} catch (e) {
		console.showIfNew();
		console.addMsgNode("ModularChat", "MSG", "", "Asynchroniczne czytanie danych nie powiodło się.<br/>Najprawdopodobniej brak obsługi asynchronicznych zapytań.<br/>"+e,"system");
		return;
	}

	for (var i = 0; sysCommands && i < sysCommands.length; i++){
		switch(sysCommands[i].getAttribute("cmd")){
			case "sys_msg":
			chats[console.id] = undefined;
			alert(sysCommands[i].getAttribute("param"));
			return;
			case "session_already_open":
			chats[console.id] = undefined;
			alert('Najprawdopodobniej masz już otwartego czata!\nZamknij stonę z czatem i spróbuj jeszcze raz');
			return;
		}
	}

	var init = true;
	var end = false;
	if (messages){
		for (var i = 0; i < messages.length; i++){
			var name = messages[i].getAttribute("name");
			var dateStr = messages[i].getAttribute("date")
			var date = dateStr.substr(0, 10);
			var time = dateStr.substr(11, 8);
			var text = messages[i].firstChild;
			var sytle_sufix;
			if (text == null) {
				text = '* * * No message * * *';
				sytle_sufix = "Red";
			} else if (name == "ModularChat"){
				text = text.nodeValue;
				sytle_sufix = "Red";
			} else {
				text = text.nodeValue;
				if (name == console.speaker)
				sytle_sufix = "Blue";
				else
				sytle_sufix = "Green";
			}
			console.addMsgNode(name, date, time, text, sytle_sufix);
		}
		if (messages.length > 0){
			var no = messages[messages.length - 1].getAttribute("no");
			if (no)
			console.lastViewed = parseInt(no);
			var system = messages[messages.length - 1].getAttribute("system");
			if (system){
				if (system == "no_free_consultant")
				init = false;
				else if(system == "end_chat")
				end = true;
			}
		}
	}
	console.showIfNew();
	console.chatRequest = 0;

	var consoleSendQuestion = function() {
		if (init)
		console.sendQuestion();
		else
		console.initQuestion(25);
	};

	if (!end && !console.endChat){
		if (init)
		setTimeout(consoleSendQuestion, 500);
		else
		setTimeout(consoleSendQuestion, 5000);
	}
	else{
		document.getElementById("Style_Input").innerHTML = "";
		document.getElementById("Style_Input").style.display = 'none';
	}
}

// -----------------------------------------------------------------------------------

function makeElement(ctrl,className,parentDiv,innerHTML){
	var div = document.createElement(ctrl);
	div.className = className;
	if (parentDiv)
	parentDiv.appendChild(div);
	if (innerHTML)
	div.innerHTML = innerHTML;
	return div;
}

// -----------------------------------------------------------------------------------

function makeButton(className,parentDiv){
	var div = makeElement("div",className,parentDiv);

	div.onmouseover = function(){
		div.className=className+" "+className+"_on";
	}
	div.onmousedown = function(){
		div.className=className+" "+className+"_down";
	}
	div.onmouseout = function(){
		div.className=className;
	}
	return div;
}

// -----------------------------------------------------------------------------------

function makeSwitcher(className,parentDiv,on){
	var div = makeElement("div",className +(on?" "+className+"_pressed":""),parentDiv);
	div.on = on;

	div.onmousedown = function(){
		div.className=className+" " +className+"_down"
	}
	div.onmouseout = function(){
		div.className=className+(div.on?" " +className+"_pressed":"");
	}
	div.toggle = function(){
		div.on = !div.on;
		div.className=className+(div.on?" " +className+"_pressed":"");
		return div.on;
	}
	return div;
}

// -----------------------------------------------------------------------------------
// console object
var Console = function(url, id, speaker, parentSpan, doc) {
	var self = this;
	this.url = url;
	this.id = id;
	//	viewChat = this.id;
	this.speaker = speaker;
	this.lastViewed = -1;
	this.chatRequest = 0;

	var autoscroll = true;
	var newConsone = 1;

	var uiDiv = makeElement("div","Style_Console",parentSpan);
	uiDiv.style.display = "none";
	uiDiv.style.zIndex = 1000; // wpis tymczasowy - chat zawsze na wierzchu
	
	var topBar = makeElement("div","topBar",uiDiv);
	var uiTitle = makeElement("div","Style_ConsoleTitle",uiDiv);
	makeElement("div","Style_ChatLogo",uiTitle);
	var uiClear = makeButton("Style_ChatClear",uiTitle);
	uiClear.title = "Wyczyść";
	var uiScroll = makeSwitcher("Style_ChatScroll",uiTitle,true);
	uiScroll.title = "Przewijaj (wł./wył.)";
	var uiClose = makeButton("Style_ChatClose",uiTitle);
	uiClose.title = "Zamknij";
	var uiContent = makeElement("div","Style_ConsoleBody",uiDiv);
	var uiTracing = makeElement("div","Style_Tracing Style_Message",uiContent);
	var uiInput = makeElement("div","Style_Input",uiDiv);
	uiInput.id = "Style_Input";
	var uiText = makeElement("textarea","Style_InputMessage",uiInput);
	var uiSubmit = makeButton("Style_Submit",uiInput);
	uiSubmit.title = "Wyślij";
	makeElement("div","bottomBar",uiDiv);

	//handlers
	uiText.onkeydown=function(e){
		e=e?e:event;
		if(e.keyCode!=13){
			return true;
		}
		self.sendMessage();
		return false;
	}

	uiSubmit.onclick = function(){
		self.sendMessage();
	}
	uiClear.onclick = function(){
		while (uiTracing.hasChildNodes()) {
			uiTracing.removeChild(uiTracing.firstChild);
		}
	}
	uiScroll.onclick = function(){
		autoscroll = this.toggle();
	}
	uiClose.onclick = function(){
		uiDiv.style.display = "none";
		endChat(self.id);
		modChatCheckStatus();
	}

	//functions
	this.sendMessage = function() {
		if (uiText.value != ''){
			var msg = uiText.value;
			if (msg != ''){
				var u = this.url + '&UNQ=' + makeUniqueParam();
				AJAXRequest.post(this, null, u, msg);
				uiText.value = '';
			}
		}
		uiText.focus();
	}

	this.addMsgNode = function(speaker, date, time, msg, style_sufix) {
		this.lastNode = this.createMsgNode(speaker, date, time, msg, style_sufix);
		uiTracing.appendChild(this.lastNode);
		if (autoscroll && this.lastNode)
		this.lastNode.scrollIntoView(false);
		//		this.lastNode.scrollTop = this.lastNode.scrollHeight;
	}

	this.createMsgNode = function(speaker, date, time, msg, style_sufix) {
		var headerDiv = makeElement("div","Style_MessageHeader"+style_sufix,uiTracing);
		makeElement("div","Style_UserName",headerDiv,speaker);
		makeElement("div","Style_Date",headerDiv,date);
		makeElement("div","Style_Hour",headerDiv,time);
		return makeElement("div","Style_MessageBody"+style_sufix,uiTracing,msg);
	}


	this.show = function() {
		uiDiv.style.display = "";
		this.focusInput();
	}

	this.showIfNew = function() {
		if (newConsone){
			newConsone = 0;
			uiDiv.style.display = "";
			if (autoscroll && this.lastNode)
			this.lastNode.scrollIntoView(false);
			this.focusInput();
		}
	}

	this.sendQuestion = function(){
		var u = this.url + '&LV=' + this.lastViewed+ '&UNQ=' + makeUniqueParam();
		this.chatRequest = AJAXRequest.get(this, showNewMessages, u);
	}

	this.initQuestion = function(count){
		var u = this.url + '&CV=' + count + '&URL=' + window.location;// + '&UNQ=' + makeUniqueParam();
		AJAXRequest.get(this, showNewMessages, u);
	}

	this.end = function(count){
		this.endChat=true;
		var u = this.url + '&ACT=end&UNQ=' + makeUniqueParam();
		AJAXRequest.post(this, null, u, '');
	}

	this.focusInput = function(){
		uiText.focus();
	}

	var chat_x_position = 200;
	var workspace_width = document.body.clientWidth;
	if (workspace_width && workspace_width != "undefined") chat_x_position = (workspace_width-268)/2;
	Drag.initDrag(uiDiv, topBar, doc, chat_x_position, 150);
	Drag.initDrag(uiDiv, uiTitle, doc, chat_x_position, 158);
}

// -----------------------------------------------------------------------------------

function initDefaultConnection(chatId, ct){
	if (chats[chatId]) return null;

	var connection = new Object();
	connection.url = modChatConf.getProxyUrl();
	var params = new Object();
	params.AN = "chat";
	params.CT = ct;
	params.SID = makeUniqueParam();
	connection.params = params;
	return connection;
}

// -----------------------------------------------------------------------------------

function showChat(chatId, connection, doc, count) {

	if (!chats[chatId]){
		connection.chatId = chatId;
		var speaker = "Ty";
		//		speaker = window.prompt("Podaj identyfikator");
		//		if (!speaker || speaker == "undefined"){
		//			window.alert("Identyfikator jest niepoprawny");
		//			return;
		//		}
		connection.params.SPK = speaker;
		connection.params.SIP = modChatConf.getUserIP();

		var parentSpan=doc.createElement("div");
		parentSpan.id=chatId
		doc.body.appendChild(parentSpan);

		var url = connection.url+"?"+generateParameters(connection.params);
		chats[chatId] = new Console(url, chatId, speaker, parentSpan, doc);
		chats[chatId].initQuestion(count);
	} else {
		chats[chatId].show()
	}
}

// -----------------------------------------------------------------------------------

var endChat = function(chatId) {
	if (chats[chatId]) {
		chats[chatId].end();
		chats[chatId] = undefined;
	}
}

// -----------------------------------------------------------------------------------

window.onunload=function(event){
	for (var a in chats) {
		endChat(a);
	}
}

// --------[ STATUS ]-----------------------------------------------------------------

function modChatCheckStatus(){
	var params = 'STS='+modChatConf.getGroup()+'&AN=chat&SID='+makeUniqueParam()+'&ACT=end';
	AJAXRequest.get('', displayChatStatus, modChatConf.getProxyUrl()+'?'+params);
}

// -----------------------------------------------------------------------------------

function displayChatStatus(empty_params, chat_status_resp) {
	var status;
	try {
		if (window.ActiveXObject) { // IE
			var xml_doc = new ActiveXObject("Microsoft.XMLDOM");
			xml_doc.loadXML(chat_status_resp.responseText);
			status = xml_doc.getElementsByTagName('status');
		} else if (window.XMLHttpRequest) { // Mozilla, Safari,...
			var xmldoc = chat_status_resp.responseXML;
			status = xmldoc.getElementsByTagName('status');
		}
	}
	catch(e){
		return;
	}

	var modular_id = document.getElementById(modChatConf.getModularLogoId());
	if(status.length>0){
		var available = status[0].getAttribute("available");
		if(available=="true"){
			modular_id.innerHTML = "<a href=\"#\" onclick=\"beginGroupChat('chat_1'); return false;\" style=\"position: relative; top: 7px;\">"+modChatConf.getChatConsultAvail()+"<br/><span class=\"akond\">Akond</span><span class=\"lab\">Lab</span></a>";
		}else{
			var email = modChatConf.getEmailIfNotAvailable();
			if(email!=''){
				modular_id.innerHTML = "<a href=\"mailto:"+email+"\" style=\"position: relative; top: 12px; left: -8px;\">Napisz do nas</a>";
			}
			else modular_id.innerHTML = "<span style=\"position: relative; top: 7px; \">"+modChatConf.getChatNoConsultAvail()+"<br/><span class=\"akond\">Akond</span><span class=\"lab\">Lab</span></span>";
		}
	}
	else{
		// np. brak polaczenia z serwerem - mozna wstawic jakies info - "chat niedostepny"
		modular_id.innerHTML = "<span style=\"position: relative; top: 7px; \">"+modChatConf.getChatNoConsultAvail()+"<br/><span class=\"akond\">Akond</span><span class=\"lab\">Lab</span></span>";
	}
	startCheckingStatus();
	return;
}

function startCheckingStatus(){
	if(statusCheckTimeout!=''){
		clearTimeout(statusCheckTimeout);
		statusCheckTimeout='';
	}
	var checkStatusAgain = function() {
		modChatCheckStatus(modChatConf.getGroup())
	};
	statusCheckTimeout = setTimeout(checkStatusAgain, 20000); //pingowanie co 20s
}
