// frontend_user.js $Rev: 33750 $ $Date: 2008-07-25 11:44:23 -0700 (Fri, 25 Jul 2008) $
var typingSent = false;
var startupMessage = "_startup";
var typingBody = "";
var input;
var logindiv;
var chatdiv;
var chatlog;
var noAgentsAvailable;
var trackingCode;
var firstVisit = true;
var popupWindow = null;//used by an EXT command
var popupUrl = null;
var urlParams = null;
var logLastOnly;
var typingIndicator; //status_typing
var messageHistory = new Array();
var prevAnchorMessage = null;
var anchorMessageQueue = new Array();
var backChannelUrl = null;
var backChannelSendQueue = [];
var backChannelLastMsgId = -1;
var backChannelLastMsgTime = 0;
var requestMoreHistoryCount;
var requestMoreHistoryText;

/////////////////////////
/////    Events    //////
/////////////////////////

function page_onload()
{
    this.input = document.getElementById(elInput);
    this.logindiv = document.getElementById('logindiv');
    this.chatdiv = document.getElementById('chatdiv');
    this.chatlog = document.getElementById(elChatlog);
    
    this.urlParams = getUrlParams();
    
    if(!siteCode && !token)
    {
        logindiv.style.display = "none";
        nositecodediv = document.getElementById('nositecodediv');
        nositecodediv.style.display = "block";
    }
    else
    {
	    this.intSendMessage = setInterval("intSendMessageTick(this)", 100);
	    setInterval("sendTyping()", 1500);
        setInterval("maintainTokenCookie()", 60*1000);
        setInterval("doSendBackChanMessage()", 100);
	    
        var inputLoginName = document.getElementById(elInputLoginName);
        
        if(!this.token) this.token = getCookie("ara.token");
	    
        if(this.token)
        {
            processLogin({"t":this.token});
            requestHistory();
            setAway(false);
            
        }
        else if(autoLogin)
        {
            inputLoginName.value = String(Math.random()).substring(2,7);
            login();
        }
        else//ask for user nickname
        {
            logindiv.style.display = "block";
            inputLoginName.focus();
        }
    }
}

function page_unload()
{
    if(token)
    {
        var m = new Object();
        m[variableNames['FUNCTION']] = 'setAwayStatus';
        m[variableNames['TOKEN']] = token;
        m[variableNames['BODY']] = "1";
        m["__sync__"] = true;//force syncronous for away
        query(m);
    }
}

function input_onkeypress()
{
    //if(token && !typingSent)
    //    sendTyping();
}


/////////////////////////
/////   OUTBOUND   //////
/////////////////////////

function login()
{
    try
    {
        var loginButton = document.getElementById(elLoginButton);
        var inputLoginName = document.getElementById(elInputLoginName);
        typingIndicator = document.getElementById("status_typing")
        if(inputLoginName && inputLoginName.value && logindiv && chatdiv && input)
        {
            loginButton.disabled = "disabled";
            setLog("Connecting..."); 
            
            setTrackingCode();
            
            if(this.firstVisit)
                startupMessage = "_startup";
            else
                startupMessage = "_returnvisitor";
            
            var m = new Object();
            m[variableNames['FUNCTION']] = 'login';
            m[variableNames['NAME']] = inputLoginName.value;
            m[variableNames['SITE_CODE']] = siteCode;
            m[variableNames['TRACKING_CODE']] = this.trackingCode;
            sendQueue.push(m);
        }
    }
    catch(e)
    {
        if(debug)
            alert("error: " + e);
    }
}

function logout()
{
    if(token)
    {
        var m = new Object();
        m[variableNames['FUNCTION']] = 'logout';
        m[variableNames['TOKEN']] = token;
        m["__sync__"] = true;//force syncronous for logout
        query(m);
    }
}

function requestHistory(count)
{
    var m = new Object();
    m[variableNames['FUNCTION']] = 'getMessageHistory';
    m[variableNames['TOKEN']] = token;
    if(messageHistory.length > 0)
    {
        var first = 0;
        for(var i = 0; i < messageHistory.length; i++) {
            if(messageHistory[i] != undefined) {
                first = i;
                break;
            }
        }
        m[variableNames['BEFORE']] = first;
    }
    if(count)
        m[variableNames['COUNT']] = count;
    else
        m[variableNames['COUNT']] = 2;
    sendQueue.push(m);
}

function poll()
{
    var m = new Object();
    m[variableNames['FUNCTION']] = 'getMessages';
    m[variableNames['TOKEN']] = token;
    sendQueue.push(m);
}

function sendMessage()
{
    if(input && token)
    {
        delayFlag = true;
        var inputText = input.value.replace(/^\s*|\s*$/g,"");//trim
        if(inputText != "")
        {
            getReply(inputText);
            
            input.value = "";
            typingSent = false;
            typingBody = "";
        }
    }
}

function getReply(text)
{
	if(logLastOnly)
		setLog("");
	
    appendLog("<span class=\"username\">You: </span><span class=\"usertext\">" + text + "</span><br />", true);
    
    if(token && text && text != "")
    {           
        var m = new Object();
        m[variableNames['FUNCTION']] = 'sendTextMessage';
        m[variableNames['TOKEN']] = token;
        m[variableNames['BODY']] = text;
        sendQueue.push(m);
    }
}

function getReplySilent(text)
{
    if(logLastOnly)
		setLog("");
	
    if(token && text && text != "")
    {           
        var m = new Object();
        m[variableNames['FUNCTION']] = 'sendTextMessage';
        m[variableNames['TOKEN']] = token;
        m[variableNames['BODY']] = text;
        sendQueue.push(m);
    }
}

function sendTyping()
{
    if(token && input && typingBody != input.value)
    {
        var m = new Object();
        m[variableNames['FUNCTION']] = 'sendTypingMessage';
        m[variableNames['TOKEN']] = token;
        if(input.value.indexOf(typingBody) == 0)
            m[variableNames['BODY']] = '+' + input.value.substring(typingBody.length);
        else
            m[variableNames['BODY']] = '=' + input.value;
        sendQueue.push(m);
        typingBody = input.value;
        typingSent = true;
    }
}

function setAway(away)
{
    if(token)
    {
        var m = new Object();
        m[variableNames['FUNCTION']] = 'setAwayStatus';
        m[variableNames['TOKEN']] = token;
        m[variableNames['BODY']] = away ? "1" : "0";
        sendQueue.push(m);
    }
}

function setEngineData(data)
{
    if(token)
    {
        var dataStr = "";
        for(var k in data) {
            if(typeof(k) == "string") {
                dataStr += URLencode(k) + "=" + URLencode(data[k]) + "&";
            }
        }
        if(dataStr != "") {
            var m = new Object();
            m[variableNames['FUNCTION']] = 'setData';
            m[variableNames['TOKEN']] = token;
            m[variableNames['BODY']] = dataStr;
            sendQueue.push(m);
        }
    }
}



/////////////////////////
/////   INBOUND    //////
/////////////////////////

function processResponse(resp)
{
    switch(resp[variableNames['FUNCTION']])
    {
        case 'login':
            processLogin(resp);
            break;
        case 'getMessages':
            processMessages(resp[variableNames['MESSAGES']]);
            break;
        case 'getMessageHistory':
            if(resp[variableNames['SUCCESS']])
            {
                processHistoricMessages(resp[variableNames['MESSAGES']]);
            }
            else
            {
                //start over
                this.token = null;
                setCookie("ara.token", "");
                page_onload();
            }
            break;
        case 'sendTextMessage':
            break;
        case 'sendTypingMessage':
            break;
        default:
            break;
    }
}//processResponse(resp)

function processLogin(resp)
{
    if(resp[variableNames['TOKEN']] && resp[variableNames['TOKEN']] != "")
    {   
        //if this is the first login
        if(this.token != resp[variableNames['TOKEN']])
        {
            this.token = resp[variableNames['TOKEN']];
            this.setLog("");
            
            if(startupMessage)
            {
                var m = new Object();
                m[variableNames['FUNCTION']] = 'sendTextMessage';
                m[variableNames['TOKEN']] = token;
                m[variableNames['BODY']] = startupMessage;
                sendQueue.push(m);
            }
        }
        maintainTokenCookie();
            
	    //start polling
	    this.intGetMessage = setInterval("intGetMessageTick(this)", 1000);
        
        //toggle view
        logindiv.style.display = "none";
        chatdiv.style.display = "block";
        chatdiv.focus();
        input.focus();
        
        if(this.urlParams['getreply'] != null && this.urlParams['getreply'] != "")
            getReply(this.urlParams['getreply']);
        else if(this.urlParams['getreplysilent'] != null && this.urlParams['getreplysilent'] != "")
            getReplySilent(this.urlParams['getreplysilent']);
    }
}
function processMessages(messages)
{
    for(var i in messages)
    {
        var message = messages[i];
        
        if(message == null || typeof(message) == "function") continue;
        
        if(this.messageHistory[message[variableNames['SERIAL_NUMBER']]])
            continue;
        else
            this.messageHistory[message[variableNames['SERIAL_NUMBER']]] = message;
        
        if(message[variableNames['TYPE']] == messageTypes['text'])
        {
            var displayName = message[variableNames['NAME']];
            if(!showIndividuals)
                displayName = accountDisplayName;
                
            var body = message[variableNames['BODY']];
            body = body.replace(/^\s*|\s*$/g, "");//trim
            body = convertAnchorsToJS(body);
            
            if(message[variableNames['SOURCE']] == sourceTypes['engine'])
            {
                if(delayFlag && delayWPM)
                {
                    delayFlag = false;
                    var words = body.split(' ');
                    var delay = 0;
                    if(delayWPM)
                        delay = words.length * 60000 / delayWPM;
                    if(delayMin > delay)
                        delay = delayMin;
                    else if(delayMax < delay)
                        delay = delayMax;
                    delayShow("<span class=\"enginename\">" + displayName + ": </span><span class=\"enginetext\">" + body + "</span><br />", message[variableNames['EXT']], delay, true);
                }
                else
                {
                    if(body != "")
                        appendLog("<span class=\"enginename\">" + displayName + ": </span><span class=\"agenttext\">" + body + "</span><br />", true);
                    handleExts(message[variableNames['EXT']]);
                }
            }
            else if(message[variableNames['SOURCE']] == sourceTypes['agent'])
            {
                if(body != "")
                    appendLog("<span class=\"agentname\">" + displayName + ": </span><span class=\"agenttext\">" + body + "</span><br />", true);
                hideTyping();
                handleExts(message[variableNames['EXT']]);
            }
        }
        else if(message[variableNames['TYPE']] == messageTypes['typing'])
        {
            if(showIndividuals)
            {
                showTyping();
            }
        }
        else if(message[variableNames['TYPE']] == messageTypes['leave'])
        {
            if(showIndividuals)
            {
                appendLog("<b>" + message[variableNames['NAME']] + " has left.</b><br />");
                hideTyping();
            }
        }
        //join
        else if(message[variableNames['TYPE']] == messageTypes['join'] && message[variableNames['SOURCE']] == sourceTypes['agent'])
        {
            if(showIndividuals)
            {
                appendLog("<b>" + message[variableNames['NAME']] + " has entered.</b><br />");
                hideTyping();
            }
            else if(escalationMessage)
            {
                appendLog(escalationMessage + "<br />");
            }
        }
    }
}

function processHistoricMessages(messages)
{
    var text = "";
    var firstMessage = null;
    
    for(var i in messages)
    {
        var message = messages[i];        
        if(message == null || typeof(message) == "function") continue;
                
        this.messageHistory[message[variableNames['SERIAL_NUMBER']]] = message;
            
        if(firstMessage == null)
            firstMessage = message;
            
        if(message[variableNames['TYPE']] == messageTypes['text'])
        {
            var displayName = message[variableNames['NAME']];
            if(!showIndividuals)
                displayName = accountDisplayName;

            var body = message[variableNames['BODY']];
            body = body.replace(/^\s*|\s*$/g, "");//trim
            body = convertAnchorsToJS(body);
            
            if(body != "")
            {
                if(message[variableNames['SOURCE']] == sourceTypes['engine'])
                {
                    text += "<span class=\"enginename\">" + displayName + ": </span><span class=\"enginetext\">" + body + "</span><br />"
                }
                else if(message[variableNames['SOURCE']] == sourceTypes['user'])
                {
                    if(body.indexOf("_") == -1)
                    {
	                    if(logLastOnly)
		                    text = "";
		                text += "<span class=\"username\">You: </span><span class=\"usertext\">" + body + "</span><br />";
                    }
                }
                else//from agent
                {
                    text += "<span class=\"agentname\">" + displayName + ": </span><span class=\"agenttext\">" + body + "</span><br />";
                }
            }
        }
        else if(message[variableNames['TYPE']] == messageTypes['leave'])
        {
            if(showIndividuals)
            {
                text += "<b>" + message[variableNames['NAME']] + " has left.</b><br />";
            }
        }
        //join
        else if(message[variableNames['TYPE']] == messageTypes['join'] && message[variableNames['SOURCE']] == sourceTypes['agent'])
        {
            if(showIndividuals)
            {
                text += "<b>" + message[variableNames['NAME']] + " has entered.</b><br />";
            }
            else if(escalationMessage)
            {
                text += escalationMessage + "<br />";
            }
        }
    }//end foreach message
    
    //create link for more (as needed)
    var startingUp = false;
    var requestHistoryDiv = document.getElementById('requestHistoryDiv');
    if(requestHistoryDiv)
        requestHistoryDiv.parentNode.removeChild(requestHistoryDiv);
    else
        startingUp = true;
    
    if(firstMessage[variableNames['SERIAL_NUMBER']] != 0)
    {
        if(!requestMoreHistoryCount)
            requestMoreHistoryCount = 10;
        if(!requestMoreHistoryText)
            requestMoreHistoryText = "-more-";
        text = "<div id=\"requestHistoryDiv\"><a href=\"#\" onclick=\"requestHistory(" + requestMoreHistoryCount + ");return false;\">" + requestMoreHistoryText + "</a></div>"
                + text;
    }
    
    //show the new HTML
	setInnerHTML(elChatlog, text + chatlog.innerHTML);
	if(startingUp)
	    scrollToLastInput(false);
}
 
///////////////////////
/// Nuevo GUI Stuff ///
///////////////////////
function showTyping()
{
    if(typeof(typingIndicator) != 'undefined' && typingIndicator)
        typingIndicator.style.display = "inline";
}

function hideTyping()
{
    if(typeof(typingIndicator) != 'undefined' && typingIndicator)
        typingIndicator.style.display = "none";
}

/////////////////////
/// Tracking Code ///
/////////////////////

function setTrackingCode()
{
	//sets this.sessionid from a cookie, or creats a new one
	this.trackingCode = getCookie("tc");
	if(this.trackingCode == null || this.trackingCode == "")
	{
		createNewTrackingCode();
	}
	else
	{
		this.firstVisit = false;
		if(rememberTrackingCode)
		    setCookie("tc", this.trackingCode, 60*24*30);//refresh
		else//clear
		    setCookie("tc", '');
	}
}

function createNewTrackingCode()
{
    this.firstVisit = true;
	this.trackingCode = String(Math.random()).substring(2,18);
	if(rememberTrackingCode)
	    setCookie("tc", this.trackingCode, 60*24*30);
	else//clear
	    setCookie("tc", '');
	return this.trackingCode;
}


///////////////////
/////// EXT ///////
///////////////////
function handleExts(exts)
{
    if(exts != null)
    {
	    var extArr = exts.split("\n");
	    for(var i = 0; i < extArr.length; i++)
		    handleExt(extArr[i]);
    }
}

function handleExt(ext)
{
	var command = ext.replace(/^\s*|\s*$/g,"");
	var args = "";
	var pos = ext.indexOf(":");
	if(pos != -1)
	{
		command = ext.substring(0, pos).replace(/^\s*|\s*$/g,"");
		if(pos < ext.length)
			args = ext.substring(pos+1).replace(/^\s*|\s*$/g,"");
	}

	command = command.toUpperCase();
	switch(command)
	{
		case "JAVASCRIPT":
			eval(args);
			break;
		case "OPENMAIN":
			if(opener != null)//this was opened as a popup
				opener.location = args;
			else if(window.top != self)//in an embedded frame
			    window.top.location.replace(args); 
			else
				window.open(args, "main");
			appendLog("[<a href=\""+args+"\" target=\"main\">link</a>]<br />");
			break;
		case "OPENBLANK":
			window.open(args, "_blank");
			appendLog("[<a href=\""+args+"\" target=\"_blank\">link</a>]<br />");
			break;
		case "DELAYOPEN":
			var argArray = args.split(",");
			var delay = argArray[0];
			var url = argArray[1];
			var target = argArray[2];
			if(delay != null && url != null)
				window.setTimeout("openUrl('"+url+"', '"+target+"')", delay);
			break;
		case "POPUPWIN":
			var winArray = args.split(",");
			var urlWin = winArray[0];
			var winNameWin = winArray[1];
			var wWin = winArray[2];
			var hWin = winArray[3];
			var toolbarWin = 0;
			var locationWin = 0;
			var directoriesWin = 0;
			var statusWin = 0;
			var menubarWin = 0;
			var scrollbarsWin = winArray[4];
			var resizableWin = 0;
			var top = (screen.height/2)-(hWin/2);
			var left = (screen.width/2)-(wWin/2);
			var options = "width="+wWin+",height="+hWin+",toolbar="+toolbarWin+",location="+locationWin+",directories="+directoriesWin+",status="+statusWin+",menubar="+menubarWin+",scrollbars="+scrollbarsWin+",resizable="+resizableWin+",top="+top+",left="+left;
			popUrl(urlWin, winNameWin, options);
			appendLog("[<a href=\"#\" onclick=\"popUrl('"+urlWin+"','"+winNameWin+"','"+options+"');return false;\">link</a>]<br />");
			break;
		case "HTMLMENU":
			if($(elMenu))
			{
			    setInnerHTML(elMenu, args);
			    $(elMenu).scrollTop = 0;
			}
			break;
		case "LOADHTMLMENU":
			if($(elMenu))
			{
			    asyncLoadHtml(elMenu, args);
			}
			break;
		case "HTMLCONTENT":
			if(!contentIsModal && $(elContent))
			{
				setInnerHTML(elContent, args);
			    $(elContent).scrollTop = 0;
			}
			break;
		case "LOADHTMLCONTENT":
		    if($(elContent))
		    {
			    if(contentIsModal)
			    {
				    //TODO: this needs some work
				    if(args.indexOf('prc') != -1)
					    asyncLoadHtml(elContent, args);
			    }
			    else
			    {
				    cpHistGo(args);
				    cpHistUpdateButtons();
			    }
			}
			break;
		case "SETINNERHTML":
			var commaIndex = args.indexOf(",");
			if(commaIndex != -1 && commaIndex < args.length - 1)
			{
				var targetElement = args.substring(0, commaIndex);
				var html = args.substring(commaIndex+1);
				html = html.replace(/^\s*|\s*$/g, "");//trim it
				targetElement = targetElement.replace(/^\s*|\s*$/g, "");//trim it
				if($(targetElement))
				    setInnerHTML(targetElement, html);
			}
			break;
		case "LOADINNERHTML":
			var commaIndex = args.indexOf(",");
			if(commaIndex != -1 && commaIndex < args.length - 1)
			{
				var targetElement = args.substring(0, commaIndex);
				var url = args.substring(commaIndex+1);
				url = url.replace(/^\s*|\s*$/g, "");//trim it
				targetElement = targetElement.replace(/^\s*|\s*$/g, "");//trim it
				if($(targetElement))
				    asyncLoadHtml(targetElement, url);
			}
            break;
		default:
			break;
	}//switch
}

function openUrl(url, target)
{
    if(target == null || target == "_self")
        document.location=url;
    else if(target == "_parent" && parent != null)
        parent.location=url;
    else
        window.open(url, target);
}

function popUrl(url, winName, options)
{
	if(popupWindow == null || popupWindow.closed || popupUrl != url)
	{
		popupUrl = url;
		popupWindow = window.open(url, winName, options);
	}
	else
	{
		popupWindow.focus();
	};
}

///////////////////
////  General  ////
///////////////////

function maintainTokenCookie()
{
    if(this.token)
        setCookie("ara.token", this.token, 20);
}

function receiveMessageFromOuter(msg) {
    var colPos1 = msg.indexOf(":");
    var colPos2 = msg.indexOf(":", colPos1 + 1);
    if(colPos1 > 0 && colPos2 > colPos1 + 1)
    {
        var msgId = msg.substring(0, colPos1);
        var command = unescape(msg.substring(colPos1 + 1, colPos2));
        var args = "";
        if(colPos2 < msg.length - 1)
            args = unescape(msg.substring(colPos2 + 1));

        switch(command)
        {
            case "ack":
                if(args == backChannelLastMsgId) {
                    var existingIframe = document.getElementById('backChannelIFrame');
                    if(existingIframe != null)
                        document.body.removeChild(existingIframe);
                    backChannelLastMsgTime = 0;
                }
                break;
            case "getReply":
                getReply(args);
                break;
            case "getReplySilent":
                getReplySilent(args);
                break;
            case "setLocation":
                setEngineData({"_location":args});
                break;
            case "setBackChannel":
                backChannelUrl = args;
                //embedHiddenIFrame('backChannelIFrame', args);
                break;
            default:
                break;            
        }

        if(command != "ack")
            sendBackChanMessage("ack", msgId);
    }
}

function sendBackChanMessage(command, args) {
  var msg =  escape(command) + ':' + escape(args);
  backChannelSendQueue.push(msg);
}

function doSendBackChanMessage(msg) {
    if(backChannelSendQueue.length > 0 && backChannelLastMsgTime + 500 < (new Date()).getTime()) {
        var msg = backChannelSendQueue.shift();
        
        if(backChannelUrl != null) {
            backChannelLastMsgId++;
            backChannelLastMsgTime = new Date().getTime();

            var existingIframe = document.getElementById('backChannelIFrame');
            if(existingIframe != null)
                document.body.removeChild(existingIframe);

            var iframe = document.createElement('iframe');
            iframe.id = 'backChannelIFrame';
            iframe.src = backChannelUrl + "#" + backChannelLastMsgId + ':' + msg;
            iframe.style.position = "absolute";
            iframe.style.visibility = "hidden";
            iframe.style.top = iframe.style.left = iframe.style.width = iframe.style.height = "0";
            
            document.body.appendChild(iframe);
        }
    }
}

