﻿var chatPage;
var userCredentialsPopUp;
var CurrentTimeOutID = null;
var urlTracePopupWindow = null;

function InitChatPage()
{
    //window.onbeforeunload = OnBeforeUnloadPage;
   
    PROTECTOR_LAYER = document.getElementById("transparentDiv");

    if (CURRENT_USER_NAME == null || CURRENT_USER_NAME == '' || CURRENT_USER_EMAIL == null || CURRENT_USER_EMAIL == '') 
    {
        // user login component object
        userCredentialsPopUp = new ctlUserCredentialsPopUp();
        
        var userCredentialsDiv = document.getElementById('userCredentialsDiv');
        userCredentialsPopUp.Init(userCredentialsDiv);
        LockApplicationScreen();
        
        // Pop up the login page component, passing the method to be executed when ok button is clicked
        userCredentialsPopUp.Show(OnInformCredentials);
    }
    else
        InitiateChat();
        
    //$.ui.dialog.defaults.bgiframe = true;
    //$('#userCredentialsDiv').dialog({ modal: true });
    //$('#userCredentialsDiv').dialog({ draggable: false, top: '150px'  });
    //$("#userCredentialsDiv").dialog();
    
}

function OnInformCredentials(userName, email)
{
    CURRENT_USER_NAME = userName;
    CURRENT_USER_EMAIL = email;
    UnLockApplicationScreen();
    InitiateChat();
}

function InitiateChat() {
        
    // chat page javascript object. ("Chat.js" file)
    chatPage = new ctlChat();
    if (chatPage != null) 
    {
        var chatPageMainDiv = document.getElementById('chatPageMainDiv');
        // call init method in the chat.js file
        chatPage.Init(chatPageMainDiv);
    }
}

function TClicker( func, var1, var2, var3, var4 )
{
    var Function = func;
    var Var1 = var1;
    var Var2 = var2;
    var Var3 = var3;
    var Var4 = var4;
    this.Click=function()
    {
        Function(Var1,Var2,Var3,Var4);
    }
}

function getChildById(par,chid)
{
    var obj = null;
    for (var i=0; obj==null && i < par.childNodes.length; ++i)
    {
        if (par.childNodes[i].attributes)
        {
            var att=par.childNodes[i].attributes["id"];
            if (att && att.value==chid)
                obj = par.childNodes[i];
        }
        if (obj==null)
            obj=getChildById(par.childNodes[i],chid)
    }
    return obj;
}

function GetOfficesArrayFromConfig()
{
    var result = new Array();
    if (locations != null)
    {
        var locationArray = new Array();
        locationArray = locations.split(';');
        for (idx = 0; idx < locationArray.length; idx++)
        {
            var keyPair = locationArray[idx].split('=');
            if (keyPair != null && keyPair.length == 2)
            {
                var item = new Location();
                item.SetKey(keyPair[0]);
                item.SetValue(keyPair[1]);
                result.push(item);
            }
        }
    } 
    return result;
}

function GetWebServiceLocation(queueName)
{
    if (locations != null)
    {
        var locationArray = new Array();
        locationArray = locations.split(';');
        for (idx = 0; idx < locationArray.length; idx++)
        {
            var keyPair = locationArray[idx].split('=');
            if (keyPair != null && keyPair.length == 2)
            {
                if (keyPair[0] == queueName)
                return keyPair[1];
            }
        }
    } 
}

function Location()
{
    var key = '';
    var val = '';
    
    this.SetKey = function(keyParam)
    {
        key = keyParam;
    }
    this.GetKey = function()
    {
        return key;
    }
    
    this.SetValue = function(ValueParam)
    {
        val = ValueParam;
    }
    this.GetValue = function()
    {
        return val;
    }
}

function SetApplicationTimeOut(timeOut)
{
    if (CurrentTimeOutID != null)
        clearTimeout(CurrentTimeOutID);

    CurrentTimeOutID = window.setTimeout('ClientLogOut()', new Number(timeOut*60*1000));
}

function ClientLogOut()
{
    //LogOut();
    //window.location.href = "";
}

function removeAllChildren(obj)
{
    while (obj.childNodes.length>0)
        obj.removeChild(obj.childNodes[obj.childNodes.length-1]);
}

// ChatTracker Push Filter -------------
function AddChatTrackerPushFilter(chatUserId, pbxReference)
{
    PostHttpResponse(ROOT + "General.asmx/AddChatTrackerPushFilter?ChatUserId=" + chatUserId + "&PbxReference=" + pbxReference, '', AddChatTrackerPushFilterCallBack, AddChatTrackerPushFilterError, true);
}

function AddChatTrackerPushFilterCallBack(json)
{ 
}

function AddChatTrackerPushFilterError(err)
{ 
    AbortApplicationError(err);
}

// Delete Filter
function DeleteDataPushFilter(filterName) 
{
    PostHttpResponse(ROOT + "General.asmx/DeleteDataPushFilter?UserSessionID=" + CURRENT_USER_SESSION + "&filterName=" + filterName, '', DeleteDataPushFilterCallBack, DeleteDataPushFilterError, true);
}

function DeleteDataPushFilterCallBack(json) 
{
}

function DeleteDataPushFilterError(err) 
{
    //AbortApplicationError(err);
}
// ----------------------------------------

function CheckForUpdates() 
{
    if (CURRENT_USER_SESSION != null) 
        PostHttpResponse(ROOT + "General.push/CheckForUpdates?UserSessionID=" + CURRENT_USER_SESSION, "", CheckForUpdatesCallBack, CheckForUpdatesError, true, true);
}

function CheckForUpdatesCallBack(json) 
{
    // loop method responsible for accept any server updates regards to the current chat call

    if (chatPage != null) 
    {
        if (json != null && json.WEB_CHAT_CONNECTED != null)
        {
            var chatMessageJson = json.WEB_CHAT_CONNECTED[0];
            chatPage.SetConnected(chatMessageJson.ParticipantName);
        }
        
        if (json != null && json.WEB_CHAT_MESSAGE != null) 
        {
            var chatMessageJson = json.WEB_CHAT_MESSAGE[0];
            chatPage.AddChatMessageToList(chatMessageJson.p_sCALLERNAME, chatMessageJson.p_sMESSAGE, false, true);
        }

        /*if (json != null && json.WEB_CHAT_OFFERING_STATUS != null) 
        {
            var chatOfferingJson = json.WEB_CHAT_OFFERING_STATUS[0];
            chatPage.SetIncomingMessage(chatOfferingJson.p_sCALLERNAME, chatOfferingJson.p_sMESSAGE, chatOfferingJson.p_sCALLERID, chatOfferingJson.p_dwPBXREF);
        }*/

        if (json != null && json.WEB_CHAT_USER_TYPING != null) 
        {
            var chatUserTypingJson = json.WEB_CHAT_USER_TYPING[0];
            if (chatUserTypingJson.p_sCALLERNAME != CURRENT_USER_NAME)
                chatPage.SetFooterText(chatUserTypingJson.p_sCALLERNAME + ' is typing a message');
        }
        
        if (json != null && json.WEB_CHAT_CLEAR_USER_TYPING != null) 
        {
            var chatUserTypingJson = json.WEB_CHAT_CLEAR_USER_TYPING[0];
            if (chatUserTypingJson.p_sCALLERNAME != CURRENT_USER_NAME)
                chatPage.SetFooterText('');
        }
        
        if (json != null && json.WEB_CHAT_MESSAGE_URL != null) 
        {
            var chatMessageURLJson = json.WEB_CHAT_MESSAGE_URL[0];
            chatPage.AddChatURLMessageToList(chatMessageURLJson.p_sCALLERNAME, chatMessageURLJson.p_sMESSAGE, true);
        }
        
        if (json != null && json.WEB_CHAT_DISCONNECTED != null) 
        {
            chatPage.SetDisconnected();
        }
        
        if (json != null && json.WEB_CHAT_CONTROLDATA != null)
        {
            var chatMessageJson = json.WEB_CHAT_CONTROLDATA[0];
            if (chatMessageJson.dwID != null &&
                chatMessageJson.dwID != 'CHAT_CONTROL_CHAT_OFFERING' &&
                chatMessageJson.dwID != 'CHAT_CONTROL_CHAT_FINISHED' &&
                chatMessageJson.dwID != 'CHAT_CONTROL_CHAT_ABANDONED') 
            {
                chatPage.AddChatMessageToList('', chatMessageJson.p_sMESSAGE, true, false);
            }
        }

        if (json != null && json.WEB_CHAT_JOIN_PARTICIPANT != null) 
        {
            var chatMessageJson = json.WEB_CHAT_JOIN_PARTICIPANT[0];
            chatPage.AddChatMessageToList('', MSG("WC_JOINED",{NAME:chatMessageJson.ParticipantName}), true, false);
        }
        
        if (json != null && json.WEB_CHAT_LEFT_PARTICIPANT != null) 
        {
            var chatMessageJson = json.WEB_CHAT_LEFT_PARTICIPANT[0];
            var agentUsername;
            if (CURRENT_USER_NAME == chatMessageJson.ParticipantName) {
                agentUsername = chatMessageJson.ParticipantName + MSG("WC_AGENT");
            } else {
                agentUsername = chatMessageJson.ParticipantName;
            }
            chatPage.AddChatMessageToList('', MSG("WC_LEFT", {NAME:agentUsername}), true, false);
        }
        
        if (json != null && json.WEB_CHAT_OUT_OF_SERVICE_PARTICIPANT != null) 
        {
            var chatMessageJson = json.WEB_CHAT_OUT_OF_SERVICE_PARTICIPANT[0];
            chatPage.AddChatMessageToList('', MSG("WC_OFFL",{NAME:chatMessageJson.ParticipantName}), true, false);
        }
        
        if (json != null && json.WEB_CHAT_IN_SERVICE_PARTICIPANT != null) 
        {
            var chatMessageJson = json.WEB_CHAT_IN_SERVICE_PARTICIPANT[0];
            chatPage.AddChatMessageToList('', MSG("WC_ONL",{NAME:chatMessageJson.ParticipantName}), true, false);
        }
        
        if (json != null && json.WEB_CHAT_CALL_TRANSFERED != null) 
        {
            var chatMessageJson = json.WEB_CHAT_CALL_TRANSFERED[0];
            chatPage.AddChatMessageToList('', MSG("WC_TFR",{NAME:chatMessageJson.DestinationAgentName}), true, false);
        }
    }
    CheckForUpdates();
}

function CheckForUpdatesError(err) 
{
    AbortApplicationError(err);
}

function LockApplicationScreen()
{
    if (PROTECTOR_LAYER)
        PROTECTOR_LAYER.style.display = '';
}

function UnLockApplicationScreen()
{
    if (PROTECTOR_LAYER)
        PROTECTOR_LAYER.style.display = 'none';
}

function IsUrl(url) 
{
	var regexp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;
	return regexp.test(url);
}

function IsEmptyString(str)
{
    reWhiteSpace = new RegExp(/^\s+$/);
    var result = reWhiteSpace.test(str);
    return result;
}

//PM: Disable the F5 key in firefox
document.onkeydown = function(event) {
    if (!event)
        event = window.event;

   if (event.keyCode == 116) {
       CANCEL_BEFORE_UNLOAD = true
       return false;
   }
}


function OnBeforeUnloadPage()
{
    if (!event)
        event = window.event;

    if (CANCEL_BEFORE_UNLOAD == true)
    {
        if (CURRENT_PBX_REF != null && CURRENT_PBX_REF != 0 && CURRENT_PBX_REF != '') {
            //if ((window.event.clientX < 0) || (window.event.clientY < 0)) 
            //{
            event.returnValue = MSG("WC_SESEND");

            //            if (confirm("Do you want to end your chat session? \r\n Press OK to end, or Cancel to continue the chat.")) {
            ////                OnExitChatSession();
            //                alert('Your chat session has been cancelled');
            //                return;
            //            }
            //        }
        }
    }
    CANCEL_BEFORE_UNLOAD = false;
    return;
}

function OnUnloadPage() {

    if (CANCEL_BEFORE_UNLOAD == false) {
        if (CURRENT_PBX_REF != null && CURRENT_PBX_REF != 0 && CURRENT_PBX_REF != '') {
            OnExitChatSession();
            alert(MSG("WC_CSC"));
            return;
        }
    }
    return;
}

function OnExitChatSession()
{
    PostHttpResponse(ROOT + "Chat.asmx/ExitChatSession", "UserSessionID=" + CURRENT_USER_SESSION + "&PbxReference=" + CURRENT_PBX_REF + "&Address=",
                    OnExitChatSessionCallBack, OnExitChatSessionError);
   
    //ForceFormSubmit();
}

function OnExitChatSessionCallBack(json)
{ 
}

function OnExitChatSessionError(err) 
{ 
    AbortApplicationError(err);
}

function ForceFormSubmit()
{
    // This method forces the form to be posted and is called in orther to "fix" a firefox issue. 
    // On the event "onbeforeunload" firefox does not post the page after the execution, so the method responsable for
    // dropping the call was not been called if user press F5 using firefox.
    
    if (document.forms != null && document.forms.length > 0)
        document.forms[0].submit();
}

function CloseWindow()
{
    window.close();
}

function AbortApplicationError(err) 
{
    if (chatPage != null) 
    {
        chatPage.SetDisconnected();
        //alert(MSG(err));
        alert(MSG("WC_GENERR"));
        AJAXRequestEnded();
    }
}

function OpenNewURL(urlText)
{
    CANCEL_BEFORE_UNLOAD = true;
    
    if (urlText.indexOf('http', 0) != 0 && urlText.indexOf('https', 0) != 0 && urlText.indexOf('ftp', 0) != 0)
        urlText = 'http://' + urlText;

    if (urlTracePopupWindow == null || urlTracePopupWindow.closed)
        urlTracePopupWindow = window.open(urlText);
    else
        urlTracePopupWindow.location.href = urlText;
    
    //CANCEL_BEFORE_UNLOAD = false;
}

function MSG(src, param)
{
    var code = src.Code ? src.Code : src;
    
    var tmpl = null;
    for(var i=0; CustomMessages!=null && i<CustomMessages.length; i++)
    {
        if (CustomMessages[i].Code===code)
        {
            tmpl=CustomMessages[i].Message;
            break;
        }
    }
    if (!tmpl) return src.Message ? src.Message : src;

    if (!param) return tmpl;
    var p0=0;
    do
    {
        p0 = tmpl.indexOf('${',p0);
        if (p0>=0)
        {
            var p1 = tmpl.indexOf('}',p0);
            if (p1>p0)
            {
                var tag = tmpl.substring(p0+2,p1);
                var val = null;
                try { eval("val=param."+tag+";") } catch(ex){}
                tmpl = tmpl.replace("${"+tag+"}",val!=null?val:"");
                p0++;
            }
            else p0=-1;
        }
    } while (p0>=0);

    return tmpl;
}

