/* tworzy obiekty XMLHttpRequest, które zaktualizują wiadomości rozmowy i pobiorą wybrany kolor*/
var xmlHttpGetMessages = createXmlHttpRequestObject();
/* zmienna, która określa jak często łączyć się z serwerem*/
var updateInterval = 500; // w milisekundach
/* lastMessageID - tidentyfikator najświeższej wiadomości rozmowy */
var lastMessageID = -1; 
var c = "";

/* tworzy instancję obiektu XMLHttpRequest */
function createXmlHttpRequestObject() 
{
  //przechowa referencję do obiektu XMLHttpRequest 
  var xmlHttp;
  // powinno zadziałać dla przeglądarek nowszych niż IE6
  try
  {
    // próbuje utworzyć obiekt XMLHttpRequest
    xmlHttp = new XMLHttpRequest();
  }
  catch(e)
  {
    // zakładając że przeglądarką jest IE6 lub starsza
    var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
                                    "MSXML2.XMLHTTP.5.0",
                                    "MSXML2.XMLHTTP.4.0",
                                    "MSXML2.XMLHTTP.3.0",
                                    "MSXML2.XMLHTTP",
                                    "Microsoft.XMLHTTP");
    // sprawdza każdy prog id, aż któryś zadziała
    for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) 
    {
      try 
      { 
        // próbuje utworzyć obiekt XMLHttpRequest
        xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
      } 
      catch (e) {}
    }
  }
  // zwraca utworzony obiekt lub wyświetla wiadomość o błędzie
  if (!xmlHttp)
    alert("Błąd podczas tworzenia obiektu XMLHttpRequest.");
  else 
    return xmlHttp;
}


/* funkcja rozpoczyna rozmowę; jest wykonywana w chwili załadowania strony */
function init() 
{

  // pobiera odwołanie do okna tekstowego, w którym użytkownik wpisuje nową wiadomość
  var oMessageBox = document.getElementById("messageBox");
  // zapobiega uruchomieniu funkcji autouzupełniania
  oMessageBox.setAttribute("autocomplete", "off");    
  // rozpoczyna aktualizację nowego okna
  requestNewMessages();
}


/* funkcja wywołana po wciśnięciu przycisku "Wyślij"*/
function sendMessage()
{
  // zachowuje wiadomość w zmiennych lokalnych i czyści okienko tekstowe
  var oCurrentMessage = document.getElementById("messageBox");
  var currentUser = document.getElementById("userName").value;
  // nie wysyła pustych wiadomości
  if (trim(oCurrentMessage.value) != "" ) {
    // jeśli musimy wysłać i pobrać wiadomość
    params =  "mode=SendAndRetrieveNew" +
              "&id=" + encodeURIComponent(lastMessageID) + 
              "&name=" + encodeURIComponent(currentUser) + 
              "&message=" + encodeURIComponent(oCurrentMessage.value);
	
	// wywołuje działania po stronie serwera
        xmlHttpGetMessages.open("POST", "czat/chat.php", true);
        xmlHttpGetMessages.setRequestHeader("Content-Type", 
                                   "application/x-www-form-urlencoded");
        xmlHttpGetMessages.onreadystatechange = handleReceivingMessages;
 
        xmlHttpGetMessages.send(params);
		
    oCurrentMessage.value = "";
  }
}


/* funkcja wywołana po wciśnięciu przycisku "Usuń wszystko" */
function deleteMessages()
{
  // ustawia flagę, która określa, że wiadomości są usuwane
  params = "mode=DeleteAndRetrieveNew";  
  // dodaje wiadomość do kolejki
  c = params;
}


/* wysyła asynchroniczne żądanie, aby pobrać nowe wiadomości, wysłać je lub usunąć*/
function requestNewMessages()
{  	
  // pobiera nazwę użytkownika i kolor ze strony
  var currentUser = document.getElementById("userName").value;
  // kontynuuje jeśli xmlHttpGetMessages nie jest pusty
  if(xmlHttpGetMessages)
  {
    try
    {
      // nie zaczyna nowej operacji na serwerze, jeśli jakaś jest wykonywana
      if (xmlHttpGetMessages.readyState == 4 || 
          xmlHttpGetMessages.readyState == 0) 
      {
        // przechowa parametry potrzebne do wykonania żądania na serwerze
        if ( c == '' ) {
          params = "mode=RetrieveNew"+"&id="+lastMessageID;
		} else {
          params = c;
	    }
        // wywołuje działania po stronie serwera
        xmlHttpGetMessages.open("POST", "czat/chat.php", true);
        xmlHttpGetMessages.setRequestHeader("Content-Type", 
                                   "application/x-www-form-urlencoded");
        xmlHttpGetMessages.onreadystatechange = handleReceivingMessages;
 
        xmlHttpGetMessages.send(params);
		params = "";
		c = "";
      }
      else
      {
        // sprawdza ponownie czy są nowe wiadomości
        setTimeout("requestNewMessages();", updateInterval);
      }
    }
    catch(e)
    {
      displayError(e.toString());
    }
  }
}


/* funkcja obsługująca odpowiedź HTTP podczas aktualizacji wiadomości*/
function handleReceivingMessages() 
{
  // kontynuuje jeśli proces jest zakończony
  if (xmlHttpGetMessages.readyState == 4) 
  {
    // kontynuuje, jeśli status HTTP ma wartość "OK"
    if (xmlHttpGetMessages.status == 200) 
    {
      try
      {
        // przetwarza odpowiedź serwera
        readMessages();
      }
      catch(e)
      {
        // wyświetla wiadomość o błędzie
        displayError(e.toString());
      }
    } 
    else
    {
      // wyświetla wiadomość o błędzie
      displayError(xmlHttpGetMessages.statusText);
    }
  }
}


/* funkcja obsługująca odpowiedź serwera podczas aktualizacji wiadomości*/
function readMessages()
{
  // pobiera odpowiedź serwera
  var response = xmlHttpGetMessages.responseText;
  // błąd serwera?
  if (response.indexOf("ERRNO") >= 0 
      || response.indexOf("błąd:") >= 0
      || response.length == 0)
    throw(response.length == 0 ? "Pusta odpowiedź serwera." : response);
  // pobiera element dokumentu
  response = xmlHttpGetMessages.responseXML.documentElement;
  // pobiera flagę określającą czy okno rozmowy zostało wyczyszczone czy nie
  clearChat = 
           response.getElementsByTagName("clear").item(0).firstChild.data;
  // jeśli flaga ma wartość true, trzeba wyczyścić okno wiadomości
  if(clearChat == "true")
  {
    // czyści okno wiadomości i zeruje id
    document.getElementById("scroll").innerHTML = "";
    lastMessageID = -1;
 
  }
  // pobiera tablice z odpowiedzi serwera
  idArray = response.getElementsByTagName("id");
  nameArray = response.getElementsByTagName("name");
  timeArray = response.getElementsByTagName("time");
  messageArray = response.getElementsByTagName("message");
   // przechowuje lokalnie ID ostatniej otrzymanej wiadomości
  if(idArray.length>0){
    lastMessageID = idArray.item(idArray.length - 1).firstChild.data;}
  // dodaje nową wiadomość do okna rozmowy
  displayMessages(idArray, nameArray, timeArray, messageArray);
 
  // ponownie uruchamia sekwencję
  setTimeout("requestNewMessages();", updateInterval);
}


/* funkcja dodająca nowe wiadomości do okna rozmowy */
function displayMessages(idArray, nameArray, timeArray, messageArray)
{
  
  // każdy przebieg pętli dodaje nową wiadomość
  for(var i=0; i<idArray.length; i++)
  {
    // pobiera szczegóły wiadomości
	var id	 = idArray.item(i).firstChild.data.toString();
    var time = timeArray.item(i).firstChild.data.toString();
    var name = nameArray.item(i).firstChild.data.toString();
    var message = messageArray.item(i).firstChild.data.toString();
    
    if(id%2)
    kolor = '#eeeeee';
    else
    kolor = '#e4e6e5';
    
    // tworzy kod HTML, który wyświetli wiadomość
    var htmlMessage = "";
	htmlMessage += "<div style=\"background-color: " + kolor + "\" class=\"item\" \">"; 
    htmlMessage += "<div class=\"timme\">" + time + "</div>  <span style=\"padding-right: 5px\">"+name+":</span> ";
    htmlMessage += message.toString();
    htmlMessage += "</div>";
    // wyświetla wiadomość
    displayMessage (htmlMessage);
  }
}


// wyświetla wiadomość
function displayMessage(message)
{
  // pobiera obiekt scroll
  var oScroll = document.getElementById("scroll");
  // sprawdza, czy pasek jest przewinięty
  var scrollDown = (oScroll.scrollHeight - oScroll.scrollTop <= 
                    oScroll.offsetHeight );
  // wyświetla wiadomość
  oScroll.innerHTML += message;
  // przewija na dół pasek przewijania
  oScroll.scrollTop = scrollDown ? oScroll.scrollHeight : oScroll.scrollTop;
}


// funkcja wyświetlająca komunikat o błędzie
function displayError(message)
{
  // wyświetla wiadomość o błędzie
  displayMessage("Błąd podczas dostępu do serwera!"+message);
}


/*obsługuje zdarzenie keydown aby określić, kiedy wciśnięto Enter*/ 
function handleKey(e) 
{
  // pobiera zdarzenie
  e = (!e) ? window.event : e;
  // pobiera kod wciśniętego znaku
  code = (e.charCode) ? e.charCode : ((e.keyCode) ? e.keyCode :
    ((e.which) ? e.which : 0));
  // obsługuje zdarzenie keydown
  if (e.type == "keydown") 
  {
    // jeśli został wciśnięty Enter (kod 13) 
    if(code == 13)
    {
      // wysyła bieżącą wiadomość
      sendMessage();
    }
  }
}


/* usuwa spacje z początku i końca łańcucha*/
function trim(s)
{
    return s.replace(/(^\s+)|(\s+$)/g, "")
}

function pokaz(){
	document.getElementById('emots').style.display="block";	
}

function clos(){
	document.getElementById('emots').style.display="none";	
}

function emota(em){
	d = document.getElementById("messageBox").value;
	document.getElementById("messageBox").value = d+' '+em;
}