﻿

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Constants = new Object();
Constants.Invalid_ID = -1;
Constants.SystemMessageID = -1;
Constants.SystemMessageName = "System";

ESettingType = new Object();
ESettingType.INVALID = 0, // Invalid Setting type.
ESettingType.USER_STATUS = 1	// seek the User status type (EUserStatusType)

EUserStatusType = new Object();
EUserStatusType.INVALID = 0; // Invalid status type.
EUserStatusType.ONLINE = 1; // User is Online.
EUserStatusType.INVISIBLE = 2; // User appears as Offline.
EUserStatusType.OFFLINE = 3; // User is Offline.

EPeerType = new Object();
EPeerType.INVALID = 0; // Invalid peer type.
EPeerType.USER = 1; // User peer type (unicast)
EPeerType.GROUP = 2; // Group peer type (multicast)
EPeerType.COURSE = 3; // Course peer type (broadcast)

ERequestMessageType = new Object();
ERequestMessageType.INIT = 0, // The latest/newest chunk of messages.
ERequestMessageType.NEW = 1, // All new messages which haven't been sent to the user.
ERequestMessageType.OLD = 2	// A chuck of older messages which haven't been sent to the user. 

EMessageType = new Object();
EMessageType.INVALID = 0; // Invalid message type.
EMessageType.USER = 1;  // User initiated message type
EMessageType.SYSTEM = 2; // System initiated message type.

EPingType = new Object();
EPingType.INVALID = 0, // The Invalid type.
EPingType.PERIODICALLY = 1, // Set the user status to online for preset amount of time.
EPingType.LOGIN = 2, // Set the user status to online untill logout is been called.
EPingType.LOGOUT = 3	// Set the user status to logoff.
// ERRORS ///////////////////////////////////////////////////////////////////////
// Chat Server APIs return codes.
EErrorCode = new Object();
// General Errors.
EErrorCode.E_OK = 0;
EErrorCode.E_GENERAL_FAILURE = -1;
EErrorCode.E_FALSE = 1;
// IDs Errors.
EErrorCode.E_INVALID_USER_ID = -10;
EErrorCode.E_INVALID_COURSE_ID = -11;
		// Type Errors.
EErrorCode.E_INVALID_PEER_TYPE = -20;
		// Message error.
EErrorCode.E_SELF_MESSAGE = -31;
EErrorCode.E_EMPTY_MESSAGE = -32;
EErrorCode.E_TOO_LONG_MESSAGE = -33;
		// Status Errors.
EErrorCode.E_SENDER_IS_OFFLINE = -40;
EErrorCode.E_RECIPIENT_IS_OFFLINE = -41;
		// Restriction errors.
EErrorCode.E_ACCESSDENIED = -51;
EErrorCode.E_NON_ENROLLED_USER = -52;

EChatStatus = new Object();
EChatStatus.INVALID = 0; // Invalid
EChatStatus.DISABLED = 1; // Disabled.
EChatStatus.NO_MSG = 2; // No new messages.
EChatStatus.PUBLIC_MSG = 3; // Public messages available.
EChatStatus.PRIVATE_MSG = 4; // Private messages available.

var g_bDebug = false;

function GetUserErrorMessage(nErrorCode ,sUserName)
{
  var sRetVal = "";
  switch (nErrorCode)
  {
    case EErrorCode.E_RECIPIENT_IS_OFFLINE:
      sRetVal = sUserName + " is no longer online. Message was not sent." 
    break;
    default:
    break;
  }
  return sRetVal;
}
	
// UTILS ///////////////////////////////////////////////////////////////////////
//-----------------------------------------------------------------------
function IsObject(obj)
{
  return obj != null && typeof obj == "object";
} // IsObject

//-----------------------------------------------------------------------
function IsString(str) // Non empty string.
{
  return typeof str == "string" && str.length != 0;
} // IsString

//-----------------------------------------------------------------------
function IsFunction(fn)
{
  return typeof fn == "function";
} // IsFunction

//-----------------------------------------------------------------------
function IsBool(nBool)
{
  return typeof nBool == "boolean";
} // IsBool

//-----------------------------------------------------------------------
String.prototype.Trim = function()
{
  return this.replace(/^\s+|\s+$/g, "");
} // String.Trim

//-----------------------------------------------------------------------
function Error(sMessage)
{
  if (g_bDebug)
    alert(sMessage);
}

//-----------------------------------------------------------------------
function IsEnter(oEvent)
{
  var oLocalEvent = IsObject(oEvent) ? oEvent : window.event;
  var nKeyNum = oLocalEvent.keyCode ? oLocalEvent.keyCode : oLocalEvent.which;
  if (nKeyNum == 13)
    return true;
  else
    return false;
}
//--------------------------------------------------------------------------------------
function AddEvent(obj, type, fn)
{
  if (obj.addEventListener)
    obj.addEventListener(type, fn, false);
  if (obj.attachEvent)
  {
    type = "on" + type;
    obj.attachEvent(type, fn);
  }
}

//--------------------------------------------------------------------------------------
var URL_REGEXP_PATTERN = new RegExp("^((http|https|ftp|udp|telnet)\://)|(mailto\:)((([a-z_0-9\-]+)+(([\:]?)+([a-z_0-9\-]+))?)(\@+)?)?(((((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5])))\.(((([0-1])?([0-9])?[0-9])|(2[0-4][0-9])|(2[0-5][0-5]))))|((([a-z0-9\-])+\.)+([a-z]{2}\.[a-z]{2}|[a-z]{2,4})))(([\:])(([1-9]{1}[0-9]{1,3})|([1-5]{1}[0-9]{2,4})|(6[0-5]{2}[0-3][0-6])))?$");
function IsValidURL(sText)
{
  return ValidatePattern(URL_REGEXP_PATTERN, sText);
} // IsValidURL

//-----------------------------------------------------------------------
function ValidatePattern(sPattern, sText)
{
  if ((!IsString(sPattern) && !('test' in sPattern)) || !IsString(sText))
    return false;
  else
    return sPattern.test(sText);
} // ValidatePattern

//--------------------------------------------------------------------------------------
function _Rect(Left, Top, Width, Height)
{
  this.left = (Left >= 0) ? Left : 0;
  this.top = (Top >= 0) ? Top : 0;
  this.width = (Width >= 0) ? Width : 0;
  this.height = (Height >= 0) ? Height : 0;
  this.bottom = this.top + this.height;
  this.right = this.left + this.width;

  this.toString = function()
  {
    return "_Rect[ L:" + this.left + " T:" + this.top + " W:" + this.width + " H:" + this.height + " ]";
  }
} // _Rect Class

//-----------------------------------------------------------------------
function _SetDivRect(oDiv, oRect)
{
  oDiv.style.left = oRect.left + "px";
  oDiv.style.top = oRect.top + "px";
  oDiv.style.width = oRect.width + "px";
  oDiv.style.height = oRect.height + "px";
}

//-----------------------------------------------------------------------
function GetCookie(name)
{
  var start = document.cookie.indexOf(name + "=");
  var len = start + name.length + 1;
  if ((!start) && (name != document.cookie.substring(0, name.length)))
  {
    return null;
  }
  if (start == -1) return null;
  var end = document.cookie.indexOf(';', len);
  if (end == -1) end = document.cookie.length;
  return unescape(document.cookie.substring(len, end));
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////
var EChatData = new Object();
EChatData.Visible = "CHAT_SHOWN";
EChatData.OpenedTabsIds = "CHAT_OPENED_TABS_IDS";
EChatData.SelectedTabId = "CHAT_SELECTED_TAB_ID";
EChatData.Rect = "CHAT_RECT";
EChatData.Text = "CHAT_TEXT";
EChatData.UserName = "CHAT_USERNAME";

g_oMemObj = new MemObj();

function MemObj()
{
  this.Delimiter0 = "#?#";
  this.Delimiter1 = "+#+";
} // MemObj

//------------------------------------------------------------
MemObj.prototype.SetUserName = function(bVal)
{
  this.Set(EChatData.UserName, bVal.toString());
} // MemObj.SetVisible

//------------------------------------------------------------
MemObj.prototype.GetUserName = function()
{
  var sStr = this.Get(EChatData.UserName);
  return (IsString(sStr))? sStr : null;
}    // MemObj.GetVisible

//------------------------------------------------------------
MemObj.prototype.SetVisible = function(bVal)
{
  this.Set(EChatData.Visible, bVal.toString());
} // MemObj.SetVisible

//------------------------------------------------------------
MemObj.prototype.GetVisible = function()
{
  var sStr = this.Get(EChatData.Visible);
  if (sStr == "true")
    return true;
  else
    return false;
}    // MemObj.GetVisible

//------------------------------------------------------------
MemObj.prototype.SetText = function(sText)
{
  this.Set(EChatData.Text, sText);
} // MemObj.SetVisible

//------------------------------------------------------------
MemObj.prototype.GetText = function()
{
  var sStr = this.Get(EChatData.Text);
  if (!IsString(sStr))
    sStr = "";
  return sStr;
}     // MemObj.GetVisible

//------------------------------------------------------------
MemObj.prototype.SetOpenTabs = function(oArrChatroomData)
{
  if (oArrChatroomData.length == 0)
    return;

  var sStr = "";
  for (var i = 0; i < oArrChatroomData.length; i++)
  {
    var sId = oArrChatroomData[i].sId;
    var sTitle = oArrChatroomData[i].sTitle;
    sStr += sId + this.Delimiter1 + sTitle;
    if (i != oArrChatroomData.length - 1)
      sStr += this.Delimiter0;
  }

  this.Set(EChatData.OpenedTabsIds, sStr);
}       // MemObj.SetOpenTabs

//------------------------------------------------------------
MemObj.prototype.GetOpenTabs = function()
{
  var sStr = this.Get(EChatData.OpenedTabsIds);
  if (sStr == null || sStr == "")
    return null;

  var oArrItems = sStr.split(this.Delimiter0);
  if (oArrItems == null)
    return null;

  if (oArrItems.length == 0)
    return null;

  var oArrChatroomData = new Array();

  for (var i = 0; i < oArrItems.length; i++)
  {
    var oItem = oArrItems[i].split(this.Delimiter1);
    if (oItem == null)
      continue;
      
    var oObj = new Object();
    oObj.sId = oItem[0];
    oObj.sTitle = oItem[1];
    oArrChatroomData.push(oObj);
  }

  return oArrChatroomData;
}     // MemObj.GetOpenTabs

//------------------------------------------------------------
MemObj.prototype.SetSelected = function(sId)
{
  this.Set(EChatData.SelectedTabId, sId);
} // MemObj.SetSelected

//------------------------------------------------------------
MemObj.prototype.GetSelected = function()
{
  var sStr = this.Get(EChatData.SelectedTabId);

  sStr = (sStr == "") ? null : sStr;

  return sStr;
}   // MemObj.GetSelected

//------------------------------------------------------------
MemObj.prototype.SetRect = function(oRect)
{
  var sStr = "";
  sStr += "L:" + oRect.left + this.Delimiter0;
  sStr += "T:" + oRect.top + this.Delimiter0;
  sStr += "W:" + oRect.width + this.Delimiter0;
  sStr += "H:" + oRect.height;

  this.Set(EChatData.Rect, sStr);
} // MemObj.SetRect

//------------------------------------------------------------
MemObj.prototype.GetRect = function()
{
  var oRect = null;
  do
  {
    var sStr = this.Get(EChatData.Rect);
    if (sStr == null || sStr == "")
      break;

    var oArrDims = sStr.split(this.Delimiter0);
    if (oArrDims.length == 0)
      break;

    var nTop = 0;
    var nLeft = 0;
    var nWidth = 0;
    var nHeight = 0;

    for (var i = 0; i < oArrDims.length; i++)
    {
      var sItem = oArrDims[i].split(":");
      if (sItem == null)
        break;

      var nName = sItem[0];
      var nValue = sItem[1];

      switch (nName)
      {
        case "L":
          nLeft = parseInt(nValue);
          break;
        case "T":
          nTop = parseInt(nValue);
          break;
        case "W":
          nWidth = parseInt(nValue);
          break;
        case "H":
          nHeight = parseInt(nValue);
          break;

      }
    }
    if (nWidth != 0 && nHeight != 0)
      oRect = new _Rect(nLeft, nTop, nWidth, nHeight);
  }
  while (false);

  return oRect;
}  // MemObj.GetRect

//------------------------------------------------------------
MemObj.prototype.Clear = function(sType)
{
  if (!IsString(sType))
  {
    this.Set(EChatData.Visible, "");
    this.Set(EChatData.OpenedTabsIds, "");
    this.Set(EChatData.SelectedTabId, "");
    this.Set(EChatData.Rect, "");
    this.Set(EChatData.Text, "");
  }
  else
    this.Set(sType, "");
}  // MemObj.Clear

//------------------------------------------------------------
MemObj.prototype.Set = function(sName, sValue)
{
  document.cookie = sName + '=' + escape(sValue) + ";";
} // MemObj.Set

//------------------------------------------------------------
MemObj.prototype.Get = function(sName)
{
  var nStart = document.cookie.indexOf(sName + "=");
  var nLength = nStart + sName.length + 1;

  if ((!nStart) && (sName != document.cookie.substring(0, sName.length)))
    return null;

  if (nStart == -1)
    return null;

  var nEnd = document.cookie.indexOf(';', nLength);
  if (nEnd == -1)
    nEnd = document.cookie.length;

  var sRetVal = unescape(document.cookie.substring(nLength, nEnd));

  if (sRetVal == "")
    return null;

  return sRetVal;
}  // MemObj.Get
