﻿/* Global variables */
var mmunicator = null;
var guidEmtpy = "00000000-0000-0000-0000-000000000000";

function $(id) {
  return document.getElementById(id);
}

function isInFrame() {
  var result = false;

  window.rnd = Math.round(Math.random() * 10000);

  if (!top["rnd"] || top.rnd != window.rnd) {
    result = true;
  }

  window.rnd = null;
  return result;
}

function initialize(userId) {
  mmunicator = new Mbizo.Mmunicator.General();
  mmunicator.userId = userId;
  mmunicator.getDescriptor();
  mmunicator.intervalId = setInterval('mmunicator.getDescriptor();', 1000);
}

function onKeyUp(e) {
  if (window.event) {
    e = window.event;
  }

  if (e.keyCode == 13) {
    mmunicator.createMessage();
  }
}

/* Global namespaces */
var Mbizo = { Mmunicator: {} };

/* General class */
Mbizo.Mmunicator.General = function () {
  this.userId = guidEmtpy;
  this.starterId = guidEmtpy;
  this.interlocutorId = guidEmtpy;
  this.lastCall = 630822816000000000;
  this.intervalId = null;
  this.msgShown = false;
}

Mbizo.Mmunicator.General.prototype =
{
  /* Public functions */
  createMessage: function () {
    var messageText = $("message-text");

    Mmunicator.MmunicatorWebService.CreateMessage(
      messageText.value,
      this.lastCall,
      function () {
      }
    );

    messageText.value = "";
  },

  getDescriptor: function () {
    var $this = this;

    Mmunicator.MmunicatorWebService.GetDescriptor(
      this.lastCall,
      function (descriptor) {
        $this.processDescriptor(descriptor);
      }
    );
  },

  /* Private functions */
  processDescriptor: function (descriptor) {
    if (!descriptor.Success) {
      this.setNeutralMessage("Эта беседа уже завершена, сожалеем…");

      if (this.intervalId != null) {
        clearInterval(this.intervalId);
      }

      return;
    }

    if (descriptor.InterlocutorId == this.userId && this.interlocutorId == guidEmtpy) {
      this.setNeutralMessage("Вы присоединились, поприветствуйте собеседника!");
    }

    else if (descriptor.InterlocutorId != guidEmtpy && this.interlocutorId == guidEmtpy) {
      this.setNeutralMessage("Собеседник присоединился, поприветствуйте его!");
    }

    else if (descriptor.InterlocutorId == guidEmtpy && this.interlocutorId != guidEmtpy) {
      this.setNeutralMessage("Собеседник отсоединился!");
      this.msgShown = false;
    }

    else if (descriptor.InterlocutorId == guidEmtpy && !this.msgShown) {
      this.setNeutralMessage("Ожидание собеседника…");
      this.setNeutralMessage("Во время ожидания собеседника, робот будет высылать новости по теме беседы…");
      this.msgShown = true;
    }

    this.starterId = descriptor.StarterId;
    this.interlocutorId = descriptor.InterlocutorId;
    this.lastCall = descriptor.LastCall;
    this.processMessages(descriptor.Messages);
  },

  processMessages: function (messages) {
    for (var i = 0; i != messages.length; i++) {
      if (messages[i].UserId == guidEmtpy) {
        this.setNeutralMessage(messages[i].Text);
      }
      
      else if (messages[i].UserId == userId) {
        this.setYouMessage(messages[i].Text);
      }

      else {
        this.setInterlocutorMessage(messages[i].Text);
      }
    }
  },

  setNeutralMessage: function (message) {
    $("messages").innerHTML += '<div class="message neutral"><div class="type">!</div><div class="text">' + message + '</div></div>';
    $("messages").scrollTop = $("messages").scrollHeight;
  },

  setYouMessage: function (message) {
    $("messages").innerHTML += '<div class="message you"><div class="type">→</div><div class="text">' + message + '</div></div>';
    $("messages").scrollTop = $("messages").scrollHeight;
  },

  setInterlocutorMessage: function (message) {
    $("messages").innerHTML += '<div class="message interlocutor"><div class="type">←</div><div class="text">' + message + '</div></div>';
    $("messages").scrollTop = $("messages").scrollHeight;
  }

  /* Callbacks */

}
