

	
	var MAX_MESSAGE_LENGTH = 1024; 
	
	//
	// Functions
	//
	function OnLoadResponse( in_response )
	{
		UpdateAdminName();
		UpdateUserName();
		OnMessageKeyUp();
		
		setTimeout( "OnTimerTick()", g_updateTimeout );
		
		if ( "exists" == in_response )
		{
			LoadConversation();
		}
	}
	
	function OnMessageKeyPressed( event )
	{
		if ( event.ctrlKey  &&  ( event.keyCode == 0xA  ||  event.keyCode == 0xD ) )
		{
			OnSendButtonClicked();
		}
		
	}
	
	function OnMessageKeyUp()
	{
		var messageTextarea = document.getElementById( 'messageText' ); 
		var length = messageTextarea.value.length;
		if ( length > MAX_MESSAGE_LENGTH )
		{
			messageTextarea.value = messageTextarea.value.substr( 0, MAX_MESSAGE_LENGTH );
			length = MAX_MESSAGE_LENGTH;
		}
		document.getElementById('charsNumber').innerHTML = 'Осталось ' + ( MAX_MESSAGE_LENGTH - length ) + ' символов';
	}
	
	function OnSendButtonClicked()
	{
		$messageText = document.getElementById( 'messageText' ).value;
		
		if ( "" === $messageText )
		{
			alert( "Введите Ваше сообщение" );
			return false;	
		}
		else if ( !$messageText )
		{
			alert( "Не удалось отправить сообщение" );
			return false;	
		}
		else
		{
			var query = engineURL + "send=" + encodeURIComponent( $messageText );
			SendRequest( query, OnSendResponse );
		}
	}
	
	function OnSendResponse( in_response )
	{
		var stamp = new Date();
		var messageText = "";
		
		messageText += "<b>" + GetSenderName() + "</b>, ";
		messageText += stamp.getHours() + ":";
		var minutes = stamp.getMinutes();
		minutes = ( minutes < 10 ) ? "0" + minutes : minutes;		
		messageText += minutes + "<br />";
		messageText += document.getElementById( 'messageText' ).value + "<br /><br />";
		
		document.getElementById( 'messageText' ).value = "";
		
		var messagesHistoryDiv = document.getElementById( 'messageHistory' );
		messagesHistoryDiv.innerHTML += messageText;
		messagesHistoryDiv.scrollTop = messagesHistoryDiv.scrollHeight;
		
		document.getElementById( 'messageText' ).focus();
	}
	
	function LoadUnreadMessages()
	{
		var query = engineURL + "getUnreadMessages";
		SendRequest( query, OnLoadUnreadMessagesResponse, "xml" );
	}
	
	function OnLoadUnreadMessagesResponse( in_response )
	{
		var messages = ParseMessages( in_response );
		
		var messageHistory = "";
		
		for ( var item in messages )
		{
			message = messages[ item ];
			messageHistory += "<b>" + ( ( "client" == message.side ) ? g_userName : g_adminName ) + "</b>";
			messageHistory += ", " + message.time + "<br />";
			messageHistory += message.text + "<br /><br />"; 
		}
		
		var messagesHistoryDiv = document.getElementById( 'messageHistory' );
		messagesHistoryDiv.innerHTML += messageHistory;
		
		if ( messageHistory )
		{
			messagesHistoryDiv.scrollTop = messagesHistoryDiv.scrollHeight;
		}
	}
	
	function LoadConversation()
	{
		var query = engineURL + "loadConversation";
		SendRequest( query, OnLoadConversationResponse, "xml");
	}
	
	function OnLoadConversationResponse( in_response )
	{	
		var messages = ParseMessages( in_response );
		
		var messageHistory = "";
		
		for ( var item in messages )
		{
			message = messages[ item ];
			messageHistory += "<b>" + ( ( "client" == message.side ) ? g_userName : g_adminName ) + "</b>";
			messageHistory += ", " + message.time + "<br />";
			messageHistory += message.text + "<br /><br />"; 
		}
		
		var messagesHistoryDiv = document.getElementById( 'messageHistory' );
		messagesHistoryDiv.innerHTML = messageHistory;
		messagesHistoryDiv.scrollTop = messagesHistoryDiv.scrollHeight;
	}
	
	function UpdateAdminName()
	{
		var query = engineURL + "administratorName";
		SendRequest( query, OnUpdateAdminNameResponse );
	}
	
	function OnUpdateAdminNameResponse( in_response )
	{
		g_adminName = in_response;
	}
	
	function UpdateUserName()
	{
		var query = engineURL + "userName";
		SendRequest( query, OnUpdateUserNameResponse );
	}
	
	function OnUpdateUserNameResponse( in_response )
	{
		if ( in_response )
		{
			g_userName = in_response;
		}
		document.getElementById( 'userName' ).value = g_userName;
	}
	
	function OnUserNameChanged()
	{
		var newUserName = document.getElementById( 'userName' ).value;
		if ( newUserName != g_userName  &&  newUserName )
		{
			var query = engineURL + "changeName=" + encodeURIComponent( newUserName );
			SendRequest( query, OnChangeNameResponse );
		}
	}
	
	function OnChangeNameResponse( in_response )
	{
		g_userName = document.getElementById( 'userName' ).value;
	}
	
	
	
	function ParseMessages( in_xmldoc )
	{
		if ( "Microsoft Internet Explorer" == navigator.appName )
		{
			return ParseMessages_IE( in_xmldoc );
		}
    	else
    	{
    		return ParseMessages_OpFx( in_xmldoc );
    	}
	}
	
	function ParseMessages_OpFx( xmldoc )
	{
    	var root = xmldoc.getElementsByTagName( "messages" );

		if ( !root[0] )
		{
			return false;
		}
        var messageNodes = root[0].getElementsByTagName( "message" );
        
        var result = new Array( messageNodes.length );
        
        for ( var i = 0; i < messageNodes.length; i++ )
        {        

			var time = '', side = '', text = '';
			if ( messageNodes[ i ].getElementsByTagName( "time" )[ 0 ].firstChild )
			{
				time = messageNodes[ i ].getElementsByTagName( "time" )[ 0 ].firstChild.nodeValue;
			}
			if ( messageNodes[ i ].getElementsByTagName( "side" )[ 0 ].firstChild )
			{
				side = messageNodes[ i ].getElementsByTagName( "side" )[ 0 ].firstChild.nodeValue;
			}
			if ( messageNodes[ i ].getElementsByTagName( "text" )[ 0 ].firstChild )
			{
				text = messageNodes[ i ].getElementsByTagName( "text" )[ 0 ].firstChild.nodeValue;
			}
		    
		    result[ i ] = { time:time, side:side, text:text };
		}
			
		return result;
	}
	
	function ParseMessages_IE( in_xmlString )
	{	
		xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" );
		xmlDoc.async = "false";
		xmlDoc.loadXML( in_xmlString );
    	
    	return ParseMessages_OpFx( xmlDoc );
	}
	
	function SendRequest( in_url, in_callBackProc, in_xml )
	{
		//
		// Initialization
		//
		var httpRequest = false;
		var isIE = false;
				
		if ( window.ActiveXObject ) 
		{ // IE
			isIE = true;
			try 
			{
				httpRequest = new ActiveXObject( "Msxml2.XMLHTTP" );
			} 
			catch (e) 
			{
				try 
				{
					httpRequest = new ActiveXObject( "Microsoft.XMLHTTP" );
				} 
				catch ( e ) 
				{}
			}
		}
		else if ( window.XMLHttpRequest )
		{ // Mozilla, Safari, ...
			httpRequest = new XMLHttpRequest();
			if ( httpRequest.overrideMimeType ) 
			{
				httpRequest.overrideMimeType('text/xml');
			}
		} 
		
		if ( !httpRequest ) 
		{
			return false;
		}
		
		//
		// Payload
		//
		var result = false;
		httpRequest.onreadystatechange = function() 
		{
			if ( 4 == httpRequest.readyState ) 
			{
				if ( 200 == httpRequest.status ) 
				{
					result = true;
					if ( in_xml  &&  !isIE )
					{
						in_callBackProc( httpRequest.responseXML );
					}
					else
					{
						in_callBackProc( httpRequest.responseText );
					}	
				}
			}	
		};
		httpRequest.open( 'GET', in_url, true );
		httpRequest.send( null );
		
		
		return result;
	}
	
	function var_dump( $var )
	{
		var result = "";
		if ( $var )
		{
			for ( var item in $var ) 
			{
				var value = $var[ item ];
				result += item + "=" + value + '\n';
	  		}
	  		return result;
	  	}
	  	else
	  	{
	  		return "null";
	  	}
	}