/**
	Standard global variables
**/
var num_lastId = 0;
var num_totalUsers = 0;
var num_maxMessageHistory = 20;

/**
	Boolean to configure history behaviour
**/
var boo_descHistory = true;

/**
	HTML-elements used by JS
**/
var obj_talk;
var obj_text;
var obj_users;
var obj_history;
var ajx_request = xHttpRequest();

/**
	Callbacks to use for external addons
**/
var func_dataSentCallback = function(){};
var func_onlineUpdatedCallback = function(){};
var func_historyUpdatedCallback = function(){};
var func_historyTruncatedCallback = function(){};
var func_talkStartedCallback = function(){};

/**
	If there is earler defined window.onload, pass it to window.onload in talk
**/
var func_prevOnload = window.onload ? window.onload: function(){};

/**
	Domready call to make sure domtree is loaded
**/
/*window.onload = function(){								//NON-MOOTOOLS (Pointer-bugg in Chrome)
	func_prevOnload();
	
	obj_text = document.getElementById( 'talk-text' );
	obj_users = document.getElementById( 'talk-users' );
	obj_history = document.getElementById( 'talk-history' );	
	obj_talk = document.getElementById( 'talk' );	
	
	func_talkStartedCallback();
	requestData( true );
}*/
window.addEvent( 'domready', function(){  					//MOOTOOLS
	obj_text = $( 'talk-text' );
	obj_users = $( 'talk-users' );
	obj_history = $( 'talk-history' );
	obj_talk = $( 'talk' );

	func_talkStartedCallback();
	requestData( true );						 
});

/**
	KeyboardEvent to listen for ENTER in text-field
**/
function keyboardEvent( e ){
	var keycode;
	if( window.event ){ 
		keycode = window.event.keyCode; 
	}else if( e ){ 
		keycode = e.which; 
	}
	if( keycode == 13 ){ 
		sendData(); 
		return false; 
	} 
	return true; 
}

/**
	Creates an xhttpRequest
**/
function xHttpRequest(){
	try{ 
		return new XMLHttpRequest(); 
	}catch( e ){
		try{ 
			return new ActiveXObject( 'microsoft.xmlhttp' ); 
		}catch( e ){
			try{ 
				return new ActiveXObject( 'msxml2.xmlhttp' ); 
			}catch( e ){	
			}
		}
	}
	return null;
}
function stopXhttp(){
	if( ajx_request ){
		ajx_request.abort();
	}
}


/**
	Uses xhttp to fetch possible new data from server
**/
function requestData( boo_page ){
	ajx_request.open( 'get', '/poll?time=' + new Date().getTime() + '&channel=0&last=' + num_lastId + '&page=' + boo_page, true );
	ajx_request.onreadystatechange = onResponse;
	try{
		ajx_request.send( null );	 
	}catch( e ){}
}

/**
	Uses xhttp to send message to server
**/
function sendData(){
	obj_text.value = obj_text.value.clean();
	if( obj_text.value == '' ){
		return false;
	}
    var ajx_send = xHttpRequest();
    ajx_send.open( 'get', '/broadcast?time=' + new Date().getTime() + '&channel=0&last=' + num_lastId + '&text=' + encodeURIComponent( obj_text.value ), true );
	try{
		ajx_send.send( null );
	}catch( e ){}
	func_dataSentCallback();
	obj_text.value = '';
}

/**
	Callback for requestData, sends response to parseResult
**/
function onResponse(){
	if( ajx_request.readyState == 4 ){
		try{
			if( ajx_request.status == 200 ){
				parseResult( eval( '(' + ajx_request.responseText + ')' ) );
			}
		}catch( e ){}
	}
}

/**
	Parse the poll-result and start and restart the poll
**/
function parseResult( jso_result ){
	if( jso_result ){
		if( jso_result.online != num_totalUsers ){
			updateUsers( jso_result.online );
		}
		if( jso_result.length > 0 ){
			updateHistory( jso_result.message );
		}
		if( num_lastId != jso_result.last ){
			num_lastId = jso_result.last;
		}
	}
	requestData( false );
}

/**
	Changes the number of users online
**/
function updateUsers( num_users ){
	num_totalUsers = num_users.toString( 10 );
	obj_users.innerHTML = num_totalUsers;
	func_onlineUpdatedCallback();
}

/**
	Adds new rows into the message history, also scrolls down, if DESC.
**/
function updateHistory( jso_message ){
	var autoScroll = false;
	if( obj_history.scrollTop == ( obj_history.scrollHeight - obj_history.clientHeight ) || obj_history.scrollTop == 0 ){
		autoScroll = true;	
	}
	for( var i = 0; i < jso_message.length; i++ ){
		str_newline = '<div class="talk-row"><span class="talk-user-icon" style="background-color:#' + jso_message[i].color + ';"></span>' + jso_message[i].text + '</div>';
		if( boo_descHistory ){
			obj_history.innerHTML += str_newline;	
		}else{
			obj_history.innerHTML = str_newline + obj_history.innerHTML;
		}
	}
	if( autoScroll && boo_descHistory ){
		obj_history.scrollTop = obj_history.scrollHeight;
	}	
	func_historyUpdatedCallback();
	truncateHistory();
}

/**
	Remove messages count larger than set by num_maxMessageHistory, default = 20
**/
function truncateHistory(){
	if( num_maxMessageHistory < obj_history.childNodes.length ){
		while( num_maxMessageHistory < obj_history.childNodes.length ){
			if( boo_descHistory ){
				var obj_remove = obj_history.childNodes[0];	
			}else{
				var obj_remove = obj_history.childNodes[obj_history.childNodes.length-1];
			}
			obj_history.removeChild( obj_remove )
		}
		func_historyTruncatedCallback();
	}
}