var elVisitors = null; 
var elMessages = null;
var elInput = null;
var elRecipient = null;
var ServerSideScriptURI = null;
var pflag = null;
var currentUserId = 0;

var intervalID = null;

var messageCount = 0;
var messageLimit = 30;

var isProcessing = 0;
var checkInterval = 10000;
var Months = new Array ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');


function chatInit(ScriptURI, MessagesLimit) {
	ServerSideScriptURI = ScriptURI;
	messageLimit = MessagesLimit;
	elVisitors = document.getElementById('ChatVisitors');
	elMessages = document.getElementById('ChatMessages');
	elInput = document.getElementById('ChatInputLine');
	elRecipient = document.getElementById('ChatRecipient');
	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()){
		chatStartProcessing();
		var text = '';
		if( send ){
			// take text from input field
			text = chatGetInputValue();
		}
		
		// create new object Subsys_JsHttpRequest_Js.
		var req = new JsHttpRequest();
		
		// when data load this code will start authomatically
		req.onreadystatechange = function() {
			if ( req.readyState == 4 ) {
				if ( req.responseJS ) {
					// update chat messages and users
					if ( currentUserId == 0 && req.responseJS.current ){
						currentUserId = req.responseJS.current.user_id;
					}
					chatRemoveChildren(elVisitors); 
					elVisitors.appendChild(chatBuildVisitor(req.responseJS.visitor));
					chatRedraw(req.responseJS.messages, req.responseJS.current.vnickreplace);
					chatStartSchedule();
					chatStopProcessing();
				}
			}
		}
		
		// disable caching
		req.caching = false;
    	
		// prepare object
		req.open(null, ServerSideScriptURI, true);
    	
		// send request
		req.send( { 'text': text, 'recipient': chatGetRecipient() } );
	}
}


function chatDoSendMessage(){
	chatDoLoad(true);
	chatClearInputValue();
	chatFocusInput();
}

function chatGetInputValue(){
	return '' + elInput.value;
}

function chatFormatSid(txt){
	txtl = txt.length;
	if ( txtl >= 30){
		aid = txt.substring(0,4) + '...' + txt.substring(txtl-4,txtl);
	        return aid;
	} else {
		return txt;
	}
}

function chatSetInputValue(value){
	elInput.value = value;
}

function chatClearInputValue(){
	chatSetInputValue('');
}

function chatFocusInput(){
//	elInput.focus();
}

function chatRedraw (messages, vnr) {
	if( messages && messages.length > 0 ){
            if (pflag != messages[0].id) {
//                playSound('/classes/chat/sound2');
		pflag = messages[0].id;
		if (newLoadPage != 1) {
		   showIllustration('chat');
		} else { newLoadPage=0; }
		var bIsAtBottom = (elMessages.scrollTop > elMessages.scrollHeight - elMessages.clientHeight) ? true : false;
		chatRemoveChildren(elMessages);
		for (var i = messages.length-1; i >= 0; i--) {
			elMessages.appendChild(chatBuildMessage(messages[i], vnr));
		} 
		elMessages.scrollTop = elMessages.scrollHeight - elMessages.clientHeight;
             }
	}
}


function chatStartProcessing() {
	isProcessing = 1;
}


function chatStopProcessing() {
	isProcessing = 0;
}


function chatIsProcessing(){
	return isProcessing;
}


function chatRemoveChildren(el, limit) {
	var cnt = isNaN(parseInt(limit)) ? 65535 : parseInt(limit);
	while ( el.firstChild && cnt > 0 ){
		el.removeChild(el.firstChild);
		cnt--;
	}
}

function chatBuildVisitor(visitor) {
	var elDiv = document.createElement('DIV');
	elDiv.className = 'ChatVisitor';
	elDiv.setAttribute('id', '1');
	var elVisitor = document.createElement('DIV');
	elVisitor.setAttribute('visitor_name', '1');
	elVisitor.className = 'Name Current';
	elVisitor.innerHTML = visitor;
	elDiv.appendChild(elVisitor);
	return elDiv;
}

function chatBuildMessage(message, vnickreplace) {
	var vnr =  'Консультант';
        if (vnickreplace != null) {vnr = vnickreplace;}
	var elDiv = document.createElement('DIV');
	elDiv.setAttribute('id', message.id);
	elDiv.className = 'ChatMessage';
	
	if ( message.id == 0 ){
		chatStopSchedule();
	}

	var elTime = document.createElement('SPAN');
	elTime.className = 'Time';
	elTime.appendChild(document.createTextNode('[' + chatPrintMessageDate(message.dt) + ']'));

	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">$1</a>');

	var elMessage = document.createElement('SPAN');
	elMessage.className = 'Text';
	if (message.from_id.length >= 30){
	   elMessage.innerHTML = 'Вы: ' + elMessageText;
	} else {
//	   if (message.to_id != 'all'){ elMessage.innerHTML = '<font color=#ff0000>' + chatFormatSid(message.from_id) + ': ' + elMessageText + '</font>';} else {
//	   elMessage.innerHTML = '<font color=#ff0000><i>' + chatFormatSid(message.from_id) + ': ' + elMessageText + '</i></font>';
//	   if (message.to_id != 'all'){ 
	   elMessage.innerHTML = '<font color=#ff0000>' + vnr + ': ' + elMessageText + '</font>';
//	   } else { elMessage.innerHTML = '<font color=#ff0000><i>' + vnr + ': ' + elMessageText + '</i></font>'; }
	}
	elDiv.appendChild(elTime);
	elDiv.appendChild(elMessage);
	
	return elDiv;
}


function chatBuildHref(sHref){
	var elA = document.createElement('A');
	elA.setAttribute('href', sHref);
	elA.appendChild(document.createTextNode(sHref));
	return elA;
}


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 chatSetRecipient(value){
	elRecipient.value = value;
}

function chatGetRecipient(){
	return elRecipient.value;
}

function chatClearRecipient(){
	chatSetRecipient('');
	chatFocusInput();
}
