function dmChatClass() {
  this.timestamp = 0;
  this.hash = 0;
  this.showedMessages = new Array(); // TODO — probably messages can duplicate
  this.getInProgress = false;
  this.sendInProgress = false;
  this.highlightTimeout = false;
  this.isAdmin = false;
  this.interval = false;
  this.adminName = 'Operator';
  this.queryInterval = 2000;
}

// constructor
dmChatClass.prototype.init = function() {
  this.relogin();
  this.interval = setInterval('dmChat.getMessages();', this.queryInterval);
}

// Send message
dmChatClass.prototype.sendMessage = function() {
  // If user not logged — login him
  if(this.sendInProgress) {
    return false;
  }
  this.sendInProgress = true;
  if(!this.hash) {
    this.login();
    this.sendInProgress = false;
    return false;
  }
  var comment = $('chatComment');
  if(!comment.value) {
    comment.className = 'chatInputError';
    comment.focus();
    this.sendInProgress = false;
    return false;
  }
  comment.className = '';
  var jsonRequest = new Request.HTML({url: "/chat_ajax.php", onSuccess: function(elTree, elList, elHtml){
    dmChat.getMessages();
    dmChat.sendInProgress = false;
    $('chatComment').value = '';
  }}).post({'action':'send', 'hash': this.hash, 'comment': comment.value, 'isAdmin': this.isAdmin-0});
}

// Recive last messages/all messages
dmChatClass.prototype.getMessages = function() {
  if(this.getInProgress) {
    return false;
  }
  this.getInProgress = true;
  var jsonRequest = new Request.JSON({url: "/chat_ajax.php", onSuccess: function(messages){
    var i;
    if(messages) {
      for(i in messages) {
        if(typeof messages[i]['dated'] != 'undefined') {
          dmChat.displayMessage(messages[i]);
        }
      }
      $('chatWindow').scrollTo(0, $('chatWindow').scrollHeight);
    }
    dmChat.getInProgress = false;
    dmChat.highlightTimeout = true;
  }}).post({'action':'get', 'hash': this.hash, 'timestamp': this.timestamp});
}

dmChatClass.prototype.displayMessage = function(message) {
  var div = document.createElement('div');
  if(this.highlightTimeout && !this.isAdmin) {
    div.className = 'chatMessage chatMessageHightlighted';
    setTimeout('$("chatMessage'+message['id']+'").className = "chatMessage";', 3000);
  } else {
    div.className = 'chatMessage';
  }
  div.id = 'chatMessage' + message['id'];

  var nick = document.createElement('span');
  if(message['user_id'] > 0) {
    nick.className = 'nick';
    nick.innerHTML = message['nick'] + ': ';
  } else {
    nick.className = 'operator';
    nick.innerHTML = this.adminName + ': ';
  }
  div.appendChild(nick);
  
/*
  var spacer = document.createTextNode(' — ');
  div.appendChild(spacer);

  var dated = document.createElement('span');
  dated.className = 'dated';
  dated.innerHTML = message['dated'];
  div.appendChild(dated);

  var br = document.createElement('br');
  div.appendChild(br);
*/  

  var comment = document.createTextNode(message['comment']);
  div.appendChild(comment);
    
  $('chatWindow').appendChild(div);
  
  if(message['tstamp'] > this.timestamp) {
    this.timestamp = message['tstamp'];
  }
}

dmChatClass.prototype.login = function() {
  var nick = $('chatNick');
  if(!nick.value) {
    nick.className = 'chatInputError';
    nick.focus();
  } else {
    nick.className = '';
    nick.disabled = 'disabled';
    nick.className = 'chatLoginOk';
    var jsonRequest = new Request.HTML({url: "/chat_ajax.php", onSuccess: function(elTree, elList, elHtml){
      dmChat.hash = elHtml;
      Cookie.write('dmChatHash', elHtml, {'path':'/', 'duration':365})
      dmChat.sendMessage();
      dmChat.getMessages();
    }}).post({'action':'login', 'name': nick.value});
  }
}

dmChatClass.prototype.relogin = function() {
  var hash = '';
  if(hash = Cookie.read('dmChatHash')) {
    var jsonRequest = new Request.HTML({url: "/chat_ajax.php", onSuccess: function(elTree, elList, elHash){
      if(elHash) {
				dmChat.hash = hash;
				$('chatNick').value = elHash;
				$('chatNick').disabled = 'disabled';
				$('chatNick').className = 'chatLoginOk';
				dmChat.getMessages();
      }
    }}).post({'action':'whois', 'hash': hash});
  }
}

dmChatClass.prototype.now = function() {
  //return (new Date).getTime();
}

var dmChat = new dmChatClass();
