﻿var g_visitorId = -1;
var g_siteId = 0;
var g_planId = 0;
var g_ServerUri = GetServerUri();
var g_BaseUri = g_ServerUri + "/LiveChatVisitorHandler.ashx";
var g_PostChatUri = g_ServerUri + "/PostChat.aspx";
var g_OfflienMessageUri = g_ServerUri + "/OfflineMessage.aspx";
/* EnumChatAction*/
var g_enumSystemEndChat = 0;
var g_enumSystemPromoteOfflineMesage = 1;
var g_enumSystemEndVoiceChat = 2;
var g_enumVisitorAddTextMessage = 50;
var g_enumVisitorRequestChat = 51;         //the corresponding message is the planid
var g_enumVisitorAcceptChat = 52;
var g_enumVisitorRefuseChat = 53;
var g_enumVisitorEndChat = 54;
var g_enumVisitorRequestVoice = 55;
var g_enumVisitorAcceptVoice = 56;
var g_enumVisitorRefuseVoice = 57;
var g_enumVisitorEndVoice = 58;
var g_enumVisitorSetName = 59;
var g_enumVisitorSetEmail = 60;
var g_enumVisitorHeartBeatForChat = 83;
var g_enumOperatorAddTextMessage = 102;
var g_enumOperatorInviteChat = 103;
var g_enumOperatorAcceptChat = 104;
var g_enumOperatorRefuseChat = 105;
var g_enumOperatorEndChat = 106;
var g_enumOperatorJoinChat = 107;
var g_enumOperatorTransferChat = 108; 
var g_enumOperatorRequestVoice = 109;
var g_enumOperatorAcceptVoice = 110;
var g_enumOperatorRefuseVoice = 111;
var g_enumOperatorEndVoide = 112;
var g_enumOperatorSendUrl = 113;

var EnumTextMessageType = {
    enumSystemMessage: 0,
    enumVisitorMessage: 1,
    enumOperatorMessage: 2  
};

/* Html Elements*/
var g_NameOfIframeForRequest = "iframeForRequest";
var g_NameOfIframeForRequestIE = "SPAN" + g_NameOfIframeForRequest;
var g_NameOfFormForRequest = "formForRequest";
var g_UriMaxLength = 2000;
var g_NameOfVoiceChatFrame = "voiceChatFrame";

/* Configs*/
var g_intervalForChat = 2000;
var g_isChatting = false;
var g_hasChat = false;
var g_currentPromtAction = g_enumSystemPromoteOfflineMesage;
var g_windowDefaultWidth = 552;
var g_windowDefaultHeight = 550;
var g_promtTableHeight = 75;
var g_getFlashHeight = 80;
var g_ifGetFlashShow = false;
var g_flashMicrophoneDiaglogHeight = 138;
var g_ifIsPromt = false;
var g_totalHeightNoChatFrame = 0;
var g_ifVoiceChatting = false;
var g_voiceName = "Visitor";
var g_ifVoiceChatSupported = true;
var g_ifRedirectToPostChatPage = false;
var g_garbagePeriod = 60;
var g_promtActionList = [];
var PromtMessage = function() {
    this.action = 0;
    this.message = "";
}
var g_promtActionListIndex = -1;
var g_latestRecievedChatMessageId = -1;
var g_WebClient = new WebClient("");
var g_messageQueueManager = new MessageQueueManager();

var $ = function(id) { return document.getElementById(id); };
String.prototype.trim = function() {
    return this.replace(/(^\s*)|(\s*$)/g, '');
}

function InitGlobalVariablesForChat() {
    g_siteId = UrlQueryString("siteId", g_siteId);
    g_visitorId = $("txtVisitorId").value;  //UrlQueryString("visitorId", g_visitorId);
    g_planId = UrlQueryString("planId", g_planId);
}

function StartHeartBeat() {
    g_WebClient.uri = g_BaseUri + "?action=" + g_enumVisitorHeartBeatForChat;
    setTimeout("SendMessageFromQueue()", g_intervalForChat);
}

function SendMessageFromQueue() {  
    var visitorActionInput = new VisitorActionInput();
    visitorActionInput.s = g_siteId;
    visitorActionInput.v = g_visitorId;
    visitorActionInput.l = g_latestRecievedChatMessageId;
    visitorActionInput.m = g_messageQueueManager.GetMessages();
    var textToSend = visitorActionInput.toJSONString();  
    g_WebClient.SendRequest(textToSend);
    setTimeout("SendMessageFromQueue()", g_intervalForChat);    
}

/* VisitorActionInput*/
function VisitorActionInput()
{
     this.s = 0;
     this.v = 0;
     this.l = 0;
     this.m = new Array();
 }

/* MessageTransmission*/
function MessageTransmission()
{
    this.c = 0;
    this.b = "";
    this.a = "";
    this.d  = 0;
}

function MessageQueueManager() {
    this._maxCommandId = 0;
    this._messageQueue = new Array();
}

MessageQueueManager.prototype.Add = function(action, message)
{
    var messageTransmission = new MessageTransmission();
    messageTransmission.c = action;
    messageTransmission.a = message;
    this._maxCommandId++;
    messageTransmission.d = this._maxCommandId;
    this._messageQueue.push(messageTransmission);     
    return this._maxCommandId;
}

MessageQueueManager.prototype.RemoveWithMaxId = function(maxCommandId) {
    var queueSize = this._messageQueue.length;
    for (var index = 0; index < queueSize; index++) {
        if (this._messageQueue[index] == null || this._messageQueue[index].d == undefined) {
            continue;
        }
        if (this._messageQueue[index].d == maxCommandId) {           
            var removedElement = this._messageQueue.splice(0, index + 1);          
            break;
        }
    }
}

MessageQueueManager.prototype.GetMessages = function() {
    return this._messageQueue.slice(0);  
}

/* WebClient class*/
function WebClient(uri) {
    this.uri = uri;
    this.browser = GetBrowserType();
    this.charset = "UTF-8";
    this.ifIframeInUse = false;
    this.iframeTimer = 0;
    this.callbackIds = [];
    this.callId = 0;
}

WebClient.prototype.SendRequestByIframe = function(message) {
    if (this.ifIframeInUse == true) {
        if (this.iframeTimer < 30) {
            this.iframeTimer++;
            return;
        }
        else {
            this.iframeTimer = 0;
        }
    }
    this.ifIframeInUse = true;

    this.usedget = false;
    var iframeForRequest = '';
    if (!$(g_NameOfIframeForRequest)) {
        iframeForRequest = this.CreateIframeForRequest();
    }
    else {
        if (this.browser == 'IE') {
            document.body.removeChild($(g_NameOfIframeForRequestIE));
            iframeForRequest = this.CreateIframeForRequest();
        } else {
            iframeForRequest = $(g_NameOfIframeForRequest);
        }
    }
    var out_str = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=" + this.charset + "'></head><body>";
    out_str += "<form name='" + g_NameOfFormForRequest + "' id='" + g_NameOfFormForRequest + "' method='post' target='_self' action='" + this.uri + "&r=" + Math.round(10000 * Math.random()) + "' accept-charset='UTF-8'>";
    out_str += "<input type='hidden' name='i' id='i'></form></body></html>";
    var doc;

    if (this.browser == "IE") {
        doc = iframeForRequest.document;
    }
    else {
        if (this.browser == 'FF' || this.browser == 'SAFARI') {
            doc = iframeForRequest.contentDocument;
        } else {
            //other browser
            doc = iframeForRequest.contentDocument;
        }
    }
 
    doc.open();
    doc.write(out_str);
    doc.close();
    doc.getElementById("i").value = message;
    doc.forms[g_NameOfFormForRequest].submit();
};

WebClient.prototype.SendRequestByScript = function(callUri, callId) {
    var headLoc = document.getElementsByTagName("head").item(0);
    var scriptObj = document.createElement("script");
    scriptObj.setAttribute("type", "text/javascript");
    scriptObj.setAttribute("src", callUri);
    scriptObj.setAttribute("id", "lcScript_" + callId);
    headLoc.appendChild(scriptObj);
};
	
WebClient.prototype.CreateIframeForRequest=function(){
	var iframeForRequestName=g_NameOfIframeForRequest;
	var iframeForRequest;
	switch(this.browser){
	case'NS':
		iframeForRequest=new Layer(100);
		iframeForRequest.name=iframeForRequestName;
		iframeForRequest.visibility='hidden';
		iframeForRequest.clip.width=100;
		iframeForRequest.clip.height=100;
		iframeForRequest.visibility='hidden';
		break;
	case'IE':
		document.body.insertAdjacentHTML('afterBegin',"<span id='SPAN"+iframeForRequestName+"'></span>");
		var span=document.all("SPAN"+iframeForRequestName);
		var html="<iframe name='"+iframeForRequestName+"' src=\"javascript:''\"></iframe>";
		span.innerHTML=html;
		span.style.display='none';
		span.style.visibility='hidden';
		span.style.position='absolute';
		span.style.width='0px';
		span.style.height='0px';
		iframeForRequest=window.frames[iframeForRequestName];
		document.all("SPAN"+iframeForRequestName).style.display='none';
		break;
	case'OPR':
		var span=document.createElement('SPAN');
		span.id="SPAN"+iframeForRequestName;
		document.body.appendChild(span);
		var iframe=document.createElement('IFRAME');
		iframe.name=iframeForRequestName;
		iframe.id=iframeForRequestName;
		iframe.frameBorder=0;iframe.width=0;iframe.height=0;
		span.appendChild(iframe);
		iframeForRequest=iframe;$("SPAN"+iframeForRequestName).style.visibility='hidden';
		break;
	case'KONQ':
		var span=document.createElement('SPAN');
		span.id="SPAN"+iframeForRequestName;
		document.body.appendChild(span);
		var iframe=document.createElement('IFRAME');iframe.name=iframeForRequestName;
		iframe.id=iframeForRequestName;
		span.appendChild(iframe);
		iframeForRequest=iframe;
		span.style.display=none;
		iframe.style.display=none;
		iframe.style.visibility='hidden';
		iframe.height=0;
		iframe.width=0;
		break;
	default:
		var iframe=document.createElement('IFRAME');
		iframe.setAttribute("id",iframeForRequestName);
		iframe.setAttribute("name",iframeForRequestName);
		iframe.setAttribute("src","");
		iframe.frameBorder=0;
		iframe.scrolling='no';
		iframe.style.top="0px";
		iframe.style.left="0px";
		iframe.style.position='absolute';
		iframe.style.width='0px';
		iframe.style.height='0px';
		iframe.style.visibility='hidden';
		document.body.appendChild(iframe);
		iframeForRequest=iframe;
		break;
	}
	return iframeForRequest;
};

WebClient.prototype.SendRequest = function(message) {
    var callUri = "";
    if (this.uri.indexOf("?") != -1) {
        callUri = this.uri + "&";
    }
    else {
        callUri = this.uri + "?";
    }

    callUri += "calltype=1&i=" + encodeURIComponent(message) + "&callId=" + this.callId + "&r=" + Math.round(10000 * Math.random());

    if (callUri.length >= g_UriMaxLength) {
        this.SendRequestByIframe(message);
    }
    else
        this.SendRequestByScript(callUri, this.callId);

    this.callId++;
};

/* Get Browser Type*/
function GetBrowserType() { 
    var agt = navigator.userAgent.toLowerCase();   
    if (agt.indexOf("safari") != -1)
    { return 'SAFARI'; }
    if (document.layers) { return "NS"; }
    if (document.all) {
        var is_opera = (agt.indexOf("opera") != -1);
        var is_konq = (agt.indexOf("konqueror") != -1);
        if (is_opera) { return "OPR"; }
        else {
            if (is_konq) { return "KONQ"; }
            else { hcIE = true; return "IE"; }
        }
    }
    if ($) {
        var is_ff = (agt.indexOf("firefox") != -1);
        if (is_ff) { return "FF"; }
        return "MOZ";
    }
    return "MOZ";
}
/* Check if is enter event*/
function isEnter(evt) {   
    evt = (evt) ? evt : event;
    var keyCode = (evt.charCode) ? evt.charCode : ((evt.which) ? evt.which : evt.keyCode);
    return keyCode == 13;
}
/* Add Chat Content Line*/
function GetLineHtml(sender, lineText, textType) {

    var textClass = "SystemMessage";
    var nameClass = "VisitorName";

    if (textType == EnumTextMessageType.enumVisitorMessage) {
        sender = sender + ": ";      
        textClass = "VisitorMessage";
    } else if (textType == EnumTextMessageType.enumOperatorMessage) {
        sender = sender + ": ";  
        nameClass = "OperatorName";
        textClass = "OperatorMessage";
    }
       
    sender = HtmlEncode(sender);

    var reg = new RegExp("\r\n", "g");
    var lineToShow = lineText.replace(reg, "<br />");

    reg = new RegExp("\n", "g");   
    lineToShow = lineToShow.replace(reg, "<br />");

    reg = new RegExp("\r", "g");
    lineToShow = lineToShow.replace(reg, "<br />");

    htmlLine = "<p class=\"" + textClass + "\"><span class=\"" + nameClass + "\">" + sender + "</span>" +
           lineToShow + "</p>\n";

    return htmlLine;
}

function GetEncodedLineHtml(sender, lineText, textType) {
    return GetLineHtml(sender, HtmlEncode(lineText), textType);
}

/* Html encode*/
function HtmlEncode(text) {
    var encodedText = text;
    var reg = new RegExp("&", "g");
    encodedText = encodedText.replace(reg, "&amp;");
    reg = new RegExp("<", "g");
    encodedText = encodedText.replace(reg, "&lt;");
    reg = new RegExp(">", "g");
    encodedText = encodedText.replace(reg, "&gt;");
    reg = new RegExp("\"", "g");
    encodedText = encodedText.replace(reg, "&quot;");
    return encodedText;
}

/* Get query string from url*/
function UrlQueryString(param, defaultValue) {
    var url = location.href;
    var paramString = url.substring(url.indexOf("?") + 1, url.length).split("&");
   
    var paramObj = {};
    for (var i = 0; j = paramString[i]; i++) {
        paramObj[j.substring(0, j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=") + 1, j.length);
    }
  
    var returnValue = paramObj[param.toLowerCase()];
    if (typeof (returnValue) == "undefined") {
        return defaultValue;
    }
    
    return returnValue;    
}

function GarbageCollection() {
    var headLoc = document.getElementsByTagName("head").item(0);

    for (var i = 0, iMax = g_WebClient.callbackIds.length; i < iMax; i++) {
        if (g_WebClient.callbackIds[i] != null && $("lcScript_" + g_WebClient.callbackIds[i]))
            headLoc.removeChild($("lcScript_" + g_WebClient.callbackIds[i]));
    }
    var removedItems = g_WebClient.callbackIds.splice(0, g_WebClient.callbackIds.length);
}

/* For Debug*/
function HandleException(e,method) {
    if (e && e.message) {      
        alert(e.message + " [" + method+"]");
    }
}

function HandleErrorFromServer(errorCode, errorMessage) {

    if (errorCode) {
        var messageToShow = "#" + errorCode + ": " + errorMessage;
        if ($("lblMessage"))
            $("lblMessage").innerHTML = messageToShow;
    }
}

function GetServerUri() {
    var JSProtocol = "";

    var src = location.href;
    var pos = src.indexOf('//');
    if (-1 == pos) { return null; }
    JSProtocol = src.substring(0, pos + 2);
    var srcWithoutProtocol = src.substring(pos + 2);
    pos = srcWithoutProtocol.indexOf('/');
    if (-1 == pos) return JSProtocol + srcWithoutProtocol;
    return JSProtocol + srcWithoutProtocol.substring(0, pos);
}

function GetWindowWidth() {
    return window.innerWidth ? window.innerWidth : document.documentElement.clientWidth;
}

function GetWindowHeight() {
    return window.innerHeight ? window.innerHeight : document.documentElement.clientHeight;
}

var g_garbageTimer = setInterval("GarbageCollection()", g_garbagePeriod * 1000);