﻿// api.js $Rev: 33750 $ $Date: 2008-07-25 11:44:23 -0700 (Fri, 25 Jul 2008) $

//needed input:
//  postUrl
//  function processResponse

var token = null;

var sendQueue = new Array();
//interval references
var intSendMessage = null;
var intGetMessage = null;

var req = null;
var contentDest = null;

//message structure:
//source (sourceTypes enum)
//type (messageTypes enum)
//sender_id
//c_id //conversation id
//body
//sender_name

//message types 'enum'
var messageTypes = new Object();
messageTypes['text'] = 1;
messageTypes['typing'] = 2;
messageTypes['login'] = 3;
messageTypes['logout'] = 4;
messageTypes['transfer_request'] = 5;
messageTypes['chat_assigned'] = 6;
messageTypes['join'] = 7;
messageTypes['leave'] = 8;
messageTypes['set_site_code'] = 9;
messageTypes['escalation_failed'] = 10;
messageTypes['shortcut_used'] = 11;
messageTypes['note'] = 12;
messageTypes['suggestion'] = 13;
messageTypes['observe'] = 14;
messageTypes['stop_observing'] = 15;
messageTypes['cap5_get_data'] = 16;
messageTypes['invite'] = 17;
messageTypes['away_start'] = 19;
messageTypes['away_end'] = 20;

//source types 'enum'
var sourceTypes = new Object();
sourceTypes['user'] = 1;
sourceTypes['agent'] = 2;
sourceTypes['system'] = 3;
sourceTypes['engine'] = 4;

var variableNames = new Object();
variableNames['AVAILABLE'] = "a";
variableNames['AVAILABLE_AGENTS'] = "aa";
variableNames['ACCOUNT_NAME'] = "an";
variableNames['AGENT_ID'] = "aid";
variableNames['BEFORE'] = "bfr";
variableNames['BODY'] = "b";
variableNames['CALLBACK'] = "cb";
variableNames['CAP5_OBJECT_ID'] = "co_id";
variableNames['CONVERSATION_ID'] = "cid";
variableNames['CONVERSATIONS'] = "cons";
variableNames['COUNT'] = "cnt";
variableNames['EDITED_SUGGESTION'] = "es";
variableNames['END_DATE'] = "end_date";
variableNames['EXT'] = "ext";
variableNames['FUNCTION'] = "f";
variableNames['INVITED_BU_ID'] = "ibu";
variableNames['IS_ESCALATED'] = "ie";
variableNames['NAME'] = "n";
variableNames['OBSERVE'] = "obs";
variableNames['PASSWORD'] = "pw";
variableNames['SEARCH_TERMS'] = "search_terms";
variableNames['SENDER_ID'] = "sid";
variableNames['SERIAL_NUMBER'] = "sn";
variableNames['SERVER_ID'] = "si";
variableNames['SHORTCUTS'] = "shc";
variableNames['SITE_CODE'] = "sc";
variableNames['SITE_ID'] = "site_id";
variableNames['SOURCE'] = "source";
variableNames['START_DATE'] = "start_date";
variableNames['STATUS_ID'] = "status_id";
variableNames['SUCCESS'] = "s";
variableNames['TOKEN'] = "t";
variableNames['TYPE'] = "type";
variableNames['TRACKING_CODE'] = "tc";
variableNames['MESSAGES'] = "m";
variableNames['USED_SUGGESTION'] = "us";
variableNames['USER_ID'] = "u_id";


////////////////////////////
//// Interrupt Handlers ////
////////////////////////////
//sends outbound messages as the connection comes available
function intSendMessageTick(sender)
{
    if(typeof(sendQueueLengthSpan) != 'undefined' && sendQueueLengthSpan)
        sendQueueLengthSpan.innerHTML = sender.sendQueue.length;
	if(sender.sendQueue.length != 0 && sender.req == null)
	{
		var m = sender.sendQueue.shift();//shift=dequeue
		//if(sender.postUrl.indexOf("http://") == 0 || sender.postUrl.indexOf("https://") == 0)
		//    sender.remoteQuery(m);
		//else
		
		sender.query(m);
	}
}

//Poll for new messages
function intGetMessageTick(sender)
{
	if(sender.token != null)
	{
		sender.poll();
	}
}


/////////////////////////
///// COMMUNICATION /////
/////////////////////////
function query(data)
{
	if (window.XMLHttpRequest)
        req = new XMLHttpRequest();
	else if (window.ActiveXObject)
        req = new ActiveXObject("Microsoft.XMLHTTP");
	
	if(req != null)
	{
	    var url = postUrl;
	    var method = "POST";
	    var async = true;
	    if(data["__contentDest__"] && data["__url__"])
	    {
	        //it's an async page load
	        contentDest = data["__contentDest__"];
	        delete data["__contentDest__"];
	        url = data["__url__"];	        
	        delete data["__url__"];
	        method = "GET";
	    }
	    if(data["__sync__"])
	    {
	        async = false;
	        delete data["__sync__"];
	    }
	    
		req.onreadystatechange = reqStateChange;
		req.open(method, url, async);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		
		var datastr = "";
		for(var x in data)
		{
			if(typeof(data[x]) != 'function')
			{
				datastr += URLencode(x)+"="+URLencode(data[x])+"&";
			}
		}
		req.send(datastr);
	}
}//query(data)

function reqStateChange()
{
	if(typeof(req) != "undefined" && req != null && req.readyState == 4)
	{
	    var reqStatus = "";
	    try
	    {
	        reqStatus = req.status    
	        
		}catch(err)
		{
		    reqStatus = "Moz.Disconnect";
		}
		    
		//0 = OK running locally
		//200 = OK
		//304 = Not Modified		
		if(reqStatus == 0 || reqStatus == 200 || reqStatus == 304)
		{
			if(req.responseText != null && req.responseText != "")
			{
		        try
		        {
		            if(contentDest)
		            {
		                if(setInnerHTML && $(contentDest))
		                {
		                    setInnerHTML(contentDest, req.responseText);
			                $(contentDest).scrollTop = 0;
		                }
		            }
		            else
		            {
			            processResponse(eval("(" + req.responseText + ")"));
		            }
			    }
			    catch(err)
			    {
			        if(typeof(debug) != "undefined" && debug)
			            alert("error: " + err.message + "\nprocessing response: " + req.responseText);
			    }
			}
		}
		else//change to only listen for 4xx?
		{
		    if(typeof(processError) == 'function')
		        processError(reqStatus);
		}
	    contentDest = null;
	    url = null;
		req = null;//ready to handle another request
	}//if(req.readyState == 4)
}//reqStateChange()
function remoteQuery(data)
{
    data['callback'] = "processResponse";
    data['t'] = (new Date()).getTime();
    var datastr = "";
	for(var x in data)
	{
		if(typeof(data[x]) != 'function')
		{
			datastr += URLencode(x)+"="+URLencode(data[x])+"&";
		}
	}
	
	var queryJS = document.createElement("script");
	var src = this.postUrl + "?" + datastr;
    queryJS.setAttribute("src", src);
    document.body.appendChild(queryJS);
}

////////////////////////////
///// COOKIE FUNCTIONS /////
////////////////////////////

function setCookie(name, value, minutes)
{
	var expires = null;

	var fullcookie = name + "=" + escape(value);
	if(minutes != null && minutes != "")
	{
		var expDate = new Date((new Date()).getTime() + (minutes*60*1000));
		var expires = expDate.toGMTString();
		fullcookie += "; expires=" + expires;
	}
	
	document.cookie = fullcookie;
}//setCookie(name, value, minutes)

function getCookie(name)
{
	var value = null;
	var allcookies = document.cookie;
	var start = allcookies.indexOf(name+'=');
	if(start != -1)
	{
		var end = allcookies.indexOf(';', start);
	    if(end == -1) end = allcookies.length;
	    var thiscookie = allcookies.substring(start, end);
	    value = unescape(thiscookie.substring((name+'=').length));
	}
	return value;
}//getCookie(name)


////////////////////////////
/////  URL PROCESSING  /////
////////////////////////////

function URLencode(s)
{
	if(s != null)
		return escape(s).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27');
	else
		return "";
}

function URLdecode(s) {
	if(s != null)
		return unescape(s.replace(/\+/g, " ").replace(/%2B/g, "+").replace(/%22/g, "\"").replace(/%27/g, "'"));
	else
		return "";
}

function getUrlParams()
{
	//returns an 'associative array' with lowercase keys from window.location.search
    var data = new Object();
    var s = window.location.search;
    if(s.length > 1)
    {
        if(s.charAt(0) == '?')
            s = s.substring(1, s.length);//remove leading '?'
        var params = s.split("&");
        for(var i = 0; i < params.length; i++)
        {
            var nv = params[i].toString().split("=");
            if(nv.length == 2)
                data[URLdecode(nv[0]).toLowerCase()] = URLdecode(nv[1]);
        }
    }
    return data;
}//getUrlParams()

////////////////////////////
/////  ARRAY FUNCTIONS /////
////////////////////////////

if( typeof Array.prototype.removeAll === 'undefined' ) 
{
    Array.prototype.removeAll = function(element) 
    {
        for (var i = 0; i< this.length; i++)
        {
            if(this[i] === element)
            {
                this.splice(i,1);
                i--;
            }
        }
    };
}

if(typeof(String.prototype.padLeft) == "undefined")
{
    String.prototype.padLeft = function(length, padString) {
        var outString = this;
        while(outString.length < length)
            outString = padString + outString;
        return outString;
    };
}
if(typeof(String.prototype.padRight) == "undefined")
{
    String.prototype.padRight = function(length, padString) {
        var outString = this;
        while(outString.length < length)
            outString += padString;
        return outString;
    };
}
