var elVisitors = null;
var elMessages = null;
var elInput = null;
var elRecipient = null;
var elColor = null;

var ServerSideScriptURI = null;

var currentUserId = 0;

var responseTimeoutID = null; // таймер запроса
var intervalID = null;		// таймер обновления чата

var messageCount = 0;
var messageLimit = 100;

var isProcessing = 0;
var processStartTime = 0;		// время начала запроса

var checkInterval = 5000;		// время обновления чата
var responseTimeout = 5000;	// время ожидания ответа сервера
var Months = new Array ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Dec');


function chatInit(ScriptURI, MessagesLimit) {

	ServerSideScriptURI = ScriptURI;
	messageLimit = MessagesLimit;
	elVisitors = document.getElementById('ChatVisitors');
	elMessages = document.getElementById('ChatMessages');
	elInput = document.getElementById('ChatInputLine');
	
	elSendButton = document.getElementById('ChatSendButton');
	
	elColor = document.getElementById('ChatColor');
	elRecipient = document.getElementById('ChatRecipient');
	
	if( elVisitors && elMessages){
//		chatFocusInput();
		chatStartSchedule();
	}
}


function chatStartSchedule() {
	if ( checkInterval > 0 ){
		if ( intervalID ) {
			clearTimeout(intervalID);
		} else {
			chatDoLoad();
		}
		intervalID = setInterval('chatDoLoad()', checkInterval);
	}
}


function chatStopSchedule(){
	if ( intervalID ) {
		clearTimeout(intervalID);
	}
	checkInterval = 0;
}

function chatDoLoad(send) {
	if(!chatIsProcessing()){
		
		var processStart = new Date();
		processStartTime = processStart.getTime();
		
//		document.title = processStart.toLocaleString();  // проверка
		
		var text = '';
		
		if( send  && elInput ){     // если пошла отправка текста
		
			chatStartProcessing(); // ставим флаг "Идет отправка"
			
			responseTimeoutID = setTimeout('chatStopProcessing();chatDoLoad(true)', responseTimeout); // таймер повторной отправки
			
			text = chatGetInputValue(); // take text from input field
			
			chatClearInputValue();
			
			if(!text){
				chatStartSchedule();
				 return;
			}
		}
		
		// create new object Subsys_JsHttpRequest_Js.
		var req = new Subsys_JsHttpRequest_Js();
		
		// when data load this code will start authomatically
		req.onreadystatechange = function() {
			if ( req.readyState == 4 ) {
				if ( req.responseJS 									// есть скрипт ответа
					&& chatIsCurrentProcess(processStart.getTime())		// и идет обработка текущего процесса
				){
					
//					document.title = 'Чат';   // проверка
					
					if (req.responseJS.current){
						currentUserId = req.responseJS.current.user_id;
						if(currentUserId){
							setTimeout('chatEnableInputValue();chatStartSchedule()',1000);
						} else {
							chatRemoveChildren(elMessages);
							chatDisableInputValue();
						}
					}
					
					chatRedraw(req.responseJS.visitors, req.responseJS.messages, req.responseJS.authors);
					
					if(chatIsProcessing()){
						chatFocusInput();
						chatStopProcessing();
					}
					if(responseTimeoutID){
						clearTimeout(responseTimeoutID); // останавливаем ожидание ответа сервера
					}
				}
			}
		}
		
		// disable caching
		req.caching = false;
    	
		// prepare object
		req.open('POST', ServerSideScriptURI, true);
    	
		// send request
		req.send( { 'text': text, 'last': chatGetLastMessageId(), 'recipient': chatGetRecipient(), 'color': (chatGetColor()||'') } );
		
//		document.title = 'text=['+ text+ '] last=['+ chatGetLastMessageId()+ '] recipient=[' + chatGetRecipient()+ '] color['+ chatGetColor() + ']';
	}
}


function chatDoSendMessage(){
//	chatStopProcessing();
	
	chatDisableInputValue();
	
	chatDoLoad(true);
	
//	chatClearInputValue();
	
//	chatFocusInput();
}


function chatStartProcessing() {
	isProcessing = 1;
}


function chatStopProcessing() {
	isProcessing = 0;
	processStartTime = 0;
}


function chatIsProcessing(){
	return isProcessing;
}


////////////////////////////////////////////////////////////////////////////////////////
function chatIsCurrentProcess(processStart){
	return (processStart == processStartTime);
}


function chatDisableInputValue(){
	if(elSendButton) elSendButton.disabled = 1;
	if(elInput) elInput.disabled = 1;
}

function chatEnableInputValue(){
	if(elSendButton) elSendButton.disabled = 0;
	if(elInput) elInput.disabled = 0;
}

////////////////////////////////////////////////////////////////////////////////////////

function chatGetInputValue(){
	return '' + elInput.value;
}


function chatSetInputValue(value){
	elInput.value = value;
}

function chatClearInputValue(){
	chatSetInputValue('');
}


function chatFocusInput(){
	elInput.focus();
}



////////////////////////////////////////////////////////////////////////////////////////
function chatGetColor(){
	if(elColor){
		if ( elColor.tagName == 'SELECT' ){
			return elColor.options[elColor.selectedIndex].value;
		} else {
			return elColor.getAttribute('rgb');
		}
	}
}
function chatSetColor(color){
	if(elColor){
		if ( elColor.tagName == 'SELECT' ){
		} else {
			elColor.style.color = color;
			elColor.setAttribute('rgb', color);
		}
	}
}
function chatChooseColor(){
	alert(1);
}



////////////////////////////////////////////////////////////////////////////////////////
function chatRedraw (visitors, messages, authors) {
	if ( visitors && visitors.length > 0 ){
		chatRedrawVisitors(visitors, 0);
	}
	if ( messages && messages.length > 0 ){
		chatRedrawMessages(messages, authors);
	}
}

function chatRemoveChildren(el, limit) {
	var cnt = isNaN(parseInt(limit)) ? 65535 : parseInt(limit);
	while ( el.firstChild && cnt > 0 ){
		el.removeChild(el.firstChild);
		cnt--;
	}
}

function chatBuildMessage(message, authors) {
	var elDiv = document.createElement('DIV');
	elDiv.setAttribute('id', message.id);
	elDiv.className = 'ChatMessage';
	
	if ( message.id == 0 ){
		chatStopSchedule();
	}
	
	if ( message.color != '' ){
		elDiv.style.color = message.color;
	}

	var elTime = document.createElement('SPAN');
	elTime.className = 'Time';
//	elTime.appendChild(document.createTextNode('[' + chatPrintMessageDate(message.dt) + ']'));

	var elAuthor = document.createElement('SPAN');
	
	var authorId = message.from_id;
	if( message.to_id == 0 ){
		var charBefore = '';
		var charAfter = ':';
		elAuthor.className = 'Author';
	} else {
		if ( message.from_id == message.to_id ) {
			authorId = message.to_id;
			var charAfter = '';
			var charBefore = '* ';
		} else {
			var charAfter = ']:';
			if ( message.from_id == currentUserId ) {
				authorId = message.to_id;
				var charBefore = '« [для ';
			} else {
				var charBefore = '» [от ';
			}
		}
		elAuthor.className = 'AuthorEvent';
	}
	var authorName = '';
	for (var i = 0; i < authors.length; i++ ){
		if ( authorName == '' & authors[i].id == authorId ){
			authorName = authors[i].name;
		}
	}
	var elAuthorName = document.createTextNode( charBefore + authorName + charAfter );
	elAuthor.appendChild(elAuthorName);

	elAuthor.setAttribute('id', authorId);
	elAuthor.setAttribute('visitor_name', authorName);
	elAuthor.setAttribute('title', 'Вставить имя в сообщение.');
//	elAuthor.setAttribute('onclick', 'document.all.message.value = authorName+", "+document.all.message.value');
//	elAuthor.onclick = "document.all.message.value = authorName+', '+document.all.message.value";
	elAuthor.onclick = visitorClick1;
//	alert(elAuthor.className);
	
	var elMessageText = message.message;
	elMessageText = elMessageText.replace( new RegExp('<', 'g'), '&lt;');
	elMessageText = elMessageText.replace( new RegExp('>', 'g'), '&gt;');
	elMessageText = elMessageText.replace( new RegExp('((?:https?://|ftp://|mailto:)(?:[:a-zA-Z0-9_+~%{}./?=&@#\*-]+))', 'gi'), '<a href="$1" target="_blank">$1</a>');
	elMessageText = elMessageText.replace( new RegExp('\\[([bi])\\](.+?)\\[/\\1\\]', 'gi'), '<$1>$2</$1>');
	elMessageText = elMessageText.replace( new RegExp('\\[([bi])\\](.+?)\\[/\\1\\]', 'gi'), '<$1>$2</$1>');
	elMessageText = elMessageText.replace( new RegExp('\\[([q])\\](.+?)\\[/\\1\\]', 'gi'), '&laquo;$2&raquo;');
	
	elMessageText = elMessageText.replace( new RegExp('\\:\\)', 'g'), '<img src="/_images/smile_fun.gif" align=middle alt=":)">');
	elMessageText = elMessageText.replace( new RegExp('\\:\\(', 'g'), '<img src="/_images/smile_sad.gif" align=middle alt=":(">');
	elMessageText = elMessageText.replace( new RegExp('\\;\\)', 'g'), '<img src="/_images/smile_wink.gif" align=middle alt=";)">');
	elMessageText = elMessageText.replace( new RegExp('\\:-P', 'g'), '<img src="/_images/smile_tongue.gif" align=middle alt=":-P">');

	var elMessage = document.createElement('SPAN');
	elMessage.className = 'Text';
	elMessage.innerHTML = elMessageText;

	elDiv.appendChild(elTime);
	elDiv.appendChild(elAuthor);
	elDiv.appendChild(elMessage);
	
	return elDiv;
}


function chatPrintMessageDate(date){
	var d = new Date( 1000 * date );
	return '' + d.getDate() + ' ' + Months[d.getMonth()] + ' ' + chatPrintTimeNumber( d.getHours() ) + ':' + chatPrintTimeNumber( d.getMinutes() );
}


function chatPrintTimeNumber(value){
	return ( value < 10 ) ? '0' + value : value;
}


function chatClearMessages() {
	chatRemoveChildren(elMessages);
}

function chatRedrawMessages(messages, authors){
	var is_new = 0;
	if( messages.length > 0 ){
		var banned = chatGetBanned();
		var diff = 0;
		for (var i = 0; i < messages.length; i++) {
			if( !isBanned(messages[i].user_id, banned) ){
				diff++;
			}
		}
		
		var bIsAtBottom = (elMessages.scrollTop > elMessages.scrollHeight - elMessages.clientHeight) ? true : false;
		var bIsFirstLoad = (messageCount == 0) ? true : false;
		if( diff > 0 ){
			messageCount = messageCount + diff;
			if ( messageCount > messageLimit ){
				chatRemoveChildren(elMessages, messageCount - messageLimit);
				messageCount = messageLimit;
			}
			for (var i = 0; i < messages.length; i++) {
				if( !isBanned(messages[i].user_id, banned) ){
					elMessages.appendChild(chatBuildMessage(messages[i], authors));
					if ( messages[i].from_id != currentUserId ) is_new = 1;
				}
			}
			if( bIsFirstLoad || bIsAtBottom ){
				elMessages.scrollTop = elMessages.scrollHeight - elMessages.clientHeight + 20;
			}
		}
	}
	if(is_new && window.location.indexOf('/chat') != -1) alert('Новые сообщения!');
}



function chatBuildVisitor(visitor, banned){
	var elDiv = document.createElement('DIV');
	elDiv.className = 'ChatVisitor';
	elDiv.setAttribute('id', visitor.id);
	
	var elNobr = document.createElement('NOBR');
	
	var disabled = false;
	if( visitor.id == currentUserId ){
		disabled = true;
	}

	if( document.all && !window.opera ){
		var addon = '';
		if ( disabled ){
			addon = addon + ' disabled="disabled"';
		}
		if ( !isBanned(visitor.id, banned) ){
			addon = addon + ' checked="checked"';
		}
		var elIn = document.createElement('<input type="checkbox" name="ChatIgnore" value="' + visitor.id + '"' + addon + ' />');
	} else {
		var elIn = document.createElement('INPUT');
		elIn.setAttribute('type', 'checkbox');
		elIn.setAttribute('name', 'ChatIgnore');
		elIn.setAttribute('value', visitor.id);
		elIn.disabled = disabled;
		elIn.checked = !isBanned(visitor.id, banned);
	}
	elDiv.appendChild(elIn);
	
//////////////////////////////////////////////////////////////////////////////////	
// 			Аватарчег!															//
	var elAvatarLink = document.createElement('A');
	elAvatarLink.setAttribute('href', '/info/profiles/?user='+visitor.id);
	elAvatarLink.setAttribute('target', '_blank');
	
	var elAvatar = document.createElement('IMG');
	if(visitor.is_avatar == 1){
		elAvatar.setAttribute('src', '/users/'+visitor.id+'/avatar.gif');
	} else {
		elAvatar.setAttribute('src', '/_images/smile_fun.gif');
	}
	elAvatar.setAttribute('align', 'middle');
	elAvatar.setAttribute('border', '0');
	elAvatarLink.appendChild(elAvatar);
	elDiv.appendChild(elAvatarLink);
 																				//
//////////////////////////////////////////////////////////////////////////////////	

		
	var elVisitor = document.createElement('SPAN');
	elVisitor.setAttribute('visitor_name', visitor.name);
	if ( visitor.id == currentUserId ){
		elVisitor.className = 'Name Current';
		elVisitor.setAttribute('title', 'Написать сообщение о себе');
	} else {
		elVisitor.className = 'Name';
		elVisitor.setAttribute('title', 'Написать сообщение в приват');
	}
	elVisitor.onclick = visitorClick;
	elVisitor.appendChild(document.createTextNode(visitor.name));
	
	elNobr.appendChild(elVisitor);
	elDiv.appendChild(elNobr);
	
//	alert(elDiv.outerHTML)
	
	
	return elDiv;
}


function chatSetRecipient(value){
	elRecipient.value = value;
}


function chatGetRecipient(){
	return elRecipient.value;
}


function chatClearRecipient(){
	chatSetRecipient('');
	chatFocusInput();
}


function chatGetLastMessageId(){
	var last_message_id = 0;
	if( elMessages.lastChild && elMessages.lastChild.id ){
		last_message_id = elMessages.lastChild.id;
	}
	return last_message_id;
}


function visitorClick(evt){
	var currElem = (evt)? evt.currentTarget : event.srcElement;
	chatSetRecipient(currElem.getAttribute('visitor_name'));
	chatFocusInput();
}

function visitorClick1(evt){
	chatFocusInput();
	var currElem = (evt)? evt.currentTarget : event.srcElement;
	document.all.message.value = currElem.getAttribute('visitor_name')+', '+document.all.message.value;
}


function chatClearVisitors() {
	chatRemoveChildren(elVisitors);
}


function chatRedrawVisitors(visitors){
	var banned = chatGetBanned();
	chatClearVisitors();
	for ( var i = 0; i < visitors.length; i++ ) {
		elVisitors.appendChild( chatBuildVisitor(visitors[i], banned) );
	}
}


function chatGetBanned(){
	var banned = new Array();
	var num = 0;
	var currElem = elVisitors.firstChild;
	while ( currElem ) {
		if ( currElem.firstChild && !currElem.firstChild.checked ) {
			banned[num] = currElem.firstChild.value;
			num++;
		}
		currElem = currElem.nextSibling
	}
	return banned;
}


function isBanned(visitor_id, banned) {
	var r = false;
	for ( var j = 0; j < banned.length; j++ ){
		if ( banned[j] == visitor_id ){
			r = true;
		}
	}
	return r;
}
