//
// !COPYRIGHT!
//                      Copyright (c) 2009 Teleformix LLC
//                       All Rights Reserved
// 
// 
// THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF TELEFORMIX LLC
// 
// The copyright notice above does not evidence any
// actual or intended publication of such source code.
// 
// This document contains trade secret data and proprietary information of
// Teleformix, LLC and should be treated as confidential.  No part of this 
// information may be copied, or disclosed in part or in whole as permitted 
// by Teleformix LLC
// 
// Copyright (c) 1998-2009 by Teleformix, LLC.
// All Rights Reserved
// 
// $Id: ajax_wrapper.js,v 1.5 2009/06/19 04:55:20 pdiverde Exp $
// !!
//

var _DAO_PRIMARY_NAME		= "";
var _AJAX_URL				= "";
var _SESSION_ID				= "1";
var _PRINT_TAGS;
var _PRINT_TAGS_TEXT		= "";
var _ASYNC_TICKETS			= new Object();
var _PARAM_TYPE				= "application/x-www-form-urlencoded";
var _tags					= new Object();
var _scriptData				= new Object();
var _sessionData			= new Object();
var _dateCache				= new Object();
var _CURRENT_STATE			= 0;
var _CURRENT_STATE_TEXT		= "IDLE";
var _CURRENT_PAGE			= "";
var _trainMode				= false;
var _isRegistered;
var _isRecording			= false;
var _defaultEchoServer;
var _defaultEchoUrl;
var _defaultEchoPort;
var _campEchoServer;
var _campEchoPort;
var _baseEchoUrl;
var _SPI;
var _extn					= "xxxx";
var _userid;
var _siteid;
var _poll_cnt				= 0;
var _noop_cnt				= 0;
var _callTrackFunction		= "top.body.finishCallTrack()";
var _defaultAsyncPrefix		= "top.body";
var poller;


function trim(str)
{
	var ch;

	if (str == null)
	{
		return null;
	}

	ch = str.charAt(str.length - 1);

	// Rip space off end
	while ((ch == "\n") || (ch == "\r") || (ch == " ") ||
		   (ch == "\t") || (ch == "\f"))
	{
		str = str.substring(0, str.length - 1);
		ch = str.charAt(str.length - 1);
	}

	return str;
}



// Both the constructor and "class" definition
function AjaxAccess()
{
}


function AjaxAccess_initialize(url)
{
	var _req 				= this.getRequestObject();
	var serviceManager;
	var agentServer;
	var tmp;


	if (url == null)
	{
		return false;
	}

	_AJAX_URL = url;

	if (arguments.length > 1)
	{
		serviceManager = arguments[1];
		agentServer = arguments[2];
	}

	if (_req == null)
	{
		return false;
	}

	try
	{
		_req.open("POST", url, false);
	}
	catch (err)
	{
		alert(err + "\n" + url);
		return false;
	}

	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "register");

	
	if (arguments.length > 1)
	{
		_req.send("SERVICE_MANAGER=" + serviceManager +
				  "&AGENT_SERVER=" + agentServer);
	}
	else
	{
		_req.send("");
	}

	_isRegistered = (this.checkStatus(_req) == 200);

	if ((_isRegistered) && (_req.responseText) && (_req.responseText != "") &&
		(_req.responseText != _AJAX_URL))
	{
		if ((_req.responseText) && 
			(_req.responseText.substring(0, 4) == "http"))
		{
			_AJAX_URL = _req.responseText;
		}
		else
		{
			tmp = JSON.parse(_req.responseText);

			try
			{
				_AJAX_URL = tmp[0];
				_SESSION_ID = tmp[1];
			}
			catch (err)
			{
				return false;
			}
		}

		_AJAX_URL = _AJAX_URL.replace(/\r|\n|\r\n/g, "");
	}

	this.readyState = 4;

	return true;
}


function AjaxAccess_isInitialized()
{
	return _isRegistered;
}


function AjaxAccess_getRequestObject()
{
	var _req;


	try
	{
		_req = new ActiveXObject("Microsoft.XMLHTTP");
	}
	catch (err)
	{
		try
		{
			_req = new XMLHttpRequest();
		}
		catch (err2)
		{
			return null;
		}
	}

	return _req
}


function AjaxAccess_setCallTrackFunction(funcName)
{
	_callTrackFunction = funcName;
}

function AjaxAccess_setDefaultAsyncPrefix(prefix)
{
	_defaultAsyncPrefix = prefix;
}


function AjaxAccess_setPrimaryDaoName(newDao)
{
	_DAO_PRIMARY_NAME = newDao;
}


function AjaxAccess_getPrimaryDaoName()
{
	return ((_DAO_PRIMARY_NAME != null) && _DAO_PRIMARY_NAME != "") ?
												_DAO_PRIMARY_NAME : "primary";
}


function AjaxAccess_parseTagDescriptor(value)
{
	var strarray	= new Array();
	var daoname;
	var tagname;
	var colname;
	var tmp;
	var	at_idx;
	var colon_idx;

	if (value == null)
	{
		return null;
	}

	try
	{
		value = trim(value);
	}
	catch (err)
	{
	}

	at_idx = value.indexOf("@");
	colon_idx = value.indexOf(":");

	// If @ and : are present @ must come first
	if (((colon_idx != -1) && (at_idx != -1)) && (colon_idx < at_idx))
	{
		return null;
	}

	if (at_idx == -1)
	{
		daoname = this.getPrimaryDaoName();
		tmp = value;
	}
	else
	{
		if (value.indexOf("@", (at_idx + 1)) != -1)
		{
			return null;
		}

		daoname = value.substring(0, at_idx);
		tmp = value.substring(at_idx + 1);
	}

	colon_idx = tmp.indexOf(":");

	if (colon_idx == -1)
	{
		tagname = tmp;
	}
	else
	{
		if (tmp.indexOf(":", (colon_idx + 1)) != -1)
		{
			return null;
		}

		tagname = tmp.substring(0, colon_idx);
		colname = tmp.substring(colon_idx + 1);
	}

	strarray[0] = daoname;
	strarray[1] = tagname;
	strarray[2] = colname;

	return strarray;
}


function AjaxAccess_getParameters(daoName)
{
	var _req		= this.getRequestObject();
	var tagName;
	var tags;
	var tag;

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "getParameters");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);

	_req.send("daoName=" + daoName);
    
    if (this.checkStatus(_req) != 200)
    {   
        return false;
    }

	tags = JSON.parse(trim(_req.responseText));

	if (tags == null)
	{
		return false;
	}

	if (! _tags[daoName])
	{
		_tags[daoName] = new Object();
	}

	for (tagName in tags)
	{
		if (! _tags[daoName][tagName])
		{
	    	_tags[daoName][tagName] = tags[tagName];
		}
	}

	return true;
}


function AjaxAccess_getTag(daoName, tagName)
{
	var _req;
	var tag;
	var force	= false;

	if (arguments.length == 3)
	{
		force = arguments[2];
	}

	if ((! force) && (_tags[daoName]))
	{
		if (_tags[daoName][tagName])
		{
			return _tags[daoName][tagName];
		}
	}

	_req = this.getRequestObject();

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "serverGet");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("daoName=" + daoName + "&tagName=" + tagName);

	if (this.checkStatus(_req) != 200)
	{
		return null;
	}

	tag = JSON.parse(trim(_req.responseText));

	if (tag == null)
	{
		return null;
	}

	// Make a blank row for the copy tags
	if (tag.data == null)
	{
		tag.data = new Array(1);
	}

	if (tag.data[0] == null)
	{
		tag.data[0] = new Array(tag.columns.length);

		for (var i = 0; i < tag.columns.length; i++)
		{
			tag.data[0][i] = null;
		}
	}

	if (! _tags[daoName])
	{
		_tags[daoName] = new Object();
	}

	_tags[daoName][tagName] = tag;

	return tag;
}


function AjaxAccess_execSimpleBool(methodName)
{
	var _req = this.getRequestObject();

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", methodName);
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("");

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	return trim(_req.responseText) == "true";
}


function AjaxAccess_execSimpleString(methodName)
{
	var _req = this.getRequestObject();

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", methodName);
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("");

	if (this.checkStatus(_req) != 200)
	{
		return "";
	}

	return (trim(_req.responseText) == "null") ? "" : trim(_req.responseText);
}


function AjaxAccess_setParameter(tagcol, value)
{
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;

	if (tagInfo == null)
	{
		return false;
	}

	tag = this.getTag(tagInfo[0], tagInfo[1]);

	if (tag == null)
	{
		return false;
	}

	if (value == undefined)
	{
		value = null;
	}

	for (var i = 0; i < tag.params.length; i++)
	{
		if (tag.params[i][0] == tagInfo[2])
		{
			tag.params[i][1] = value;
			return true;
		}
	}

	return false;
}


function AjaxAccess_getEventValue(tagcol)
{
	var tagInfo = this.parseTagDescriptor(tagcol);
	var rownum	= 0;
	var tag;

	if (tagInfo == null)
	{
		return "";
	}

	tag = this.getTag(tagInfo[0], tagInfo[1]);

	if (tag == null)
	{
		return "";
	}

	if (arguments.length == 2)
	{
		try
		{
			rownum = parseInt(arguments[1]);
		}
		catch (err)
		{
			return "";
		}
	}

	if (tagInfo[2] == "_error_message")
	{
		return ((tag.errorMessage == null) ? "" : tag.errorMessage);
	}

	if ((typeof (tag.data) == 'undefined') || (tag.data == null))
	{
		return "";
	}

	if (rownum >= tag.data.length)
	{
		return "";
	}

	for (var i = 0; i < tag.columns.length; i++)
	{
		if (tag.columns[i] == tagInfo[2])
		{
			return (tag.data[rownum][i] == null) ? "" : tag.data[rownum][i];
		}
	}

	if (rownum != 0)
	{
		return "";
	}

	for (var i = 0; i < tag.params.length; i++)
	{
		if (tag.params[i][0] == tagInfo[2])
		{
			return (tag.params[i][1] == null) ? "" : tag.params[i][1];
		}
	}

	return "";
}


function AjaxAccess_getNumRows(tagcol)
{
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;

	if (tagInfo != null)
	{
		tag = this.getTag(tagInfo[0], tagInfo[1]);

		if (tag != null)
		{
			return tag.rowCount;
		}
	}

	return 0;
}


function AjaxAccess_doesTagExist(tagcol)
{
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;

	if (tagInfo == null)
	{
		return false;
	}

	tag = this.getTag(tagInfo[0], tagInfo[1]);

	return tag != null;
}


function AjaxAccess_executeOld(tagcol)
{
	var _req	= this.getRequestObject();
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;
	var params;
	var retval;

	if (tagInfo == null)
	{
		return false;
	}

	tag = this.getTag(tagInfo[0], tagInfo[1]);

	if (tag == null)
	{
		return false;
	}

	// Do not send the names back
	params = new Array();

	for (i = 0; i < tag.params.length; i++)
	{
		params[i] = tag.params[i][1];
	}

	params = JSON.stringify(params);

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", "text/plain");
	_req.setRequestHeader("Pharaoh-Call", "execute");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.setRequestHeader("Pharaoh-daoName", tagInfo[0]);
	_req.setRequestHeader("Pharaoh-tagName", tagInfo[1]);
	_req.send(params);

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	retval = (trim(_req.responseText) == "true");

	this.getTag(tagInfo[0], tagInfo[1], true);

	return retval;
}


function AjaxAccess_execute(tagcol)
{
	var _req	= this.getRequestObject();
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;
	var params;
	var retobj;

	if (tagInfo == null)
	{
		return false;
	}

	tag = this.getTag(tagInfo[0], tagInfo[1]);

	if (tag == null)
	{
		return false;
	}

	// Do not send the names back
	params = new Array();

	for (i = 0; i < tag.params.length; i++)
	{
		params[i] = tag.params[i][1];
	}

	params = JSON.stringify(params);

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", "text/plain");
	_req.setRequestHeader("Pharaoh-Call", "exec_data");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.setRequestHeader("Pharaoh-daoName", tagInfo[0]);
	_req.setRequestHeader("Pharaoh-tagName", tagInfo[1]);
	_req.send(params);

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	if (trim(_req.responseText) == "false")
	{
		return false;
	}

	retobj = JSON.parse(trim(_req.responseText));

	if ((! retobj) || (retobj == ""))
	{
		return false;
	}

	_tags[tagInfo[0]][tagInfo[1]] = retobj.tag;

	return retobj.retval;
}


function AjaxAccess_asyncExecute(tagcol)
{
	var _req		= this.getRequestObject();
	var tagInfo		= this.parseTagDescriptor(tagcol);
	var tag;
	var params;
	var retval;
	var callback;
	var obj;

	if (arguments.length < 2)
	{
		callback = "NONE";
	}
	else
	{
		callback = arguments[1];

		if ((callback.indexOf("top.") != 0) && 
			(callback.indexOf("self.") != 0) &&
			(callback.indexOf("parent.") != 0) &&
			(callback.indexOf("window.") != 0) &&
			(callback.indexOf("document.") != 0))
		{
			callback = _defaultAsyncPrefix + "." + callback;
		}
	}

	if (tagInfo == null)
	{
		return "";
	}

	tag = this.getTag(tagInfo[0], tagInfo[1]);

	if (tag == null)
	{
		return "";
	}

	// Do not send the names back
	params = new Array();

	for (i = 0; i < tag.params.length; i++)
	{
		params[i] = tag.params[i][1];
	}

	params = JSON.stringify(params);

	obj = new Object();
	obj.daoName = tagInfo[0];
	obj.tagName = tagInfo[1];
	obj.callback = callback;

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", "text/plain");
	_req.setRequestHeader("Pharaoh-Call", "asyncExecute");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.setRequestHeader("Pharaoh-daoName", tagInfo[0]);
	_req.setRequestHeader("Pharaoh-tagName", tagInfo[1]);
	_req.send(params);

	if (this.checkStatus(_req) != 200)
	{
		return "";
	}

	retval = trim(_req.responseText);

	if (retval == "null")
	{
		return "";
	}

	_ASYNC_TICKETS[retval] = obj;

	return retval;
}


function AjaxAccess_notifyAsyncExec(ticket, retval)
{
	var obj;
	var cmd;

	obj = _ASYNC_TICKETS[ticket];

	if (obj == null)
	{
		return false;
	}

	daoClient.getTag(obj.daoName, obj.tagName, true);

	cmd = obj.callback + "('" + ticket + "', " + retval + ")";

	setTimeout("try { " + cmd + " } catch (err) {}", 0);
}


function AjaxAccess_purgeTag(tagcol)
{
	var tagInfo = this.parseTagDescriptor(tagcol);

	if (tagInfo == null)
	{
		return false;
	}

	if ((_tags[tagInfo[0]]) && (_tags[tagInfo[0]][tagInfo[1]]))
	{
		_tags[tagInfo[0]][tagInfo[1]] = null;
	}

	return true;
}


function AjaxAccess_copyTag(tagIn, tagOut)
{
	var tagInfo1 = this.parseTagDescriptor(tagIn);
	var tagInfo2 = this.parseTagDescriptor(tagOut);
	var tag1;
	var tag2;
	var name;
	var value;

	if ((tagInfo1 == null) || (tagInfo2 == null))
	{
		return false;
	}

	tag1 = this.getTag(tagInfo1[0], tagInfo1[1]);
	tag2 = this.getTag(tagInfo2[0], tagInfo2[1]);

	if ((tag1 == null) || (tag2 == null))
	{
		return false;
	}

	if ((tag1.data != null) && (tag1.data[0].length != 0))
	{
		for (var i = 0; i < tag1.columns.length; i++)
		{
			name = tag1.columns[i];
			value = tag1.data[0][i];

			if (! this.setTestEventValue(tagOut + ":" + name, value))
			{
				this.setParameter(tagOut + ":" + name, value);
			}
		}
	}

	for (var i = 0; i < tag1.params.length; i++)
	{
		name = tag1.params[i][0];
		value = tag1.params[i][1];

		if (! this.setParameter(tagOut + ":" + name, value))
		{
			this.setTestEventValue(tagOut + ":" + name, value);
		}
	}

	return true;
}


function AjaxAccess_login(siteid, switch_siteid, userid, user_name, switch_id,
						 extn, skill, eventMode, trainMode)
{
	var _req		= this.getRequestObject();


	if ((arguments.length < 8))
	{
		return false;
	}

	_trainMode = trainMode;

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "login");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("siteid=" + siteid + "&switch_siteid=" + switch_siteid +
				  "&user_id=" + userid + "&user_name=" + user_name +
				  "&switch_id=" + switch_id + "&extn=" + extn +
				  "&skilldao=" + skill + "&eventMode=" + eventMode +
				  "&trainMode=" + trainMode);

	_extn = (extn != null && (extn != "")) ? extn : "xxxx";
	_userid = userid;
	_siteid = siteid;

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	poll();

	if (window.login)
	{
		window.login(siteid, switch_siteid, userid, user_name, switch_id,
					 extn, skill, eventMode, trainMode);
	}

	return (trim(_req.responseText) == "true");
}


function AjaxAccess_logout()
{
	return this.execSimpleBool("logout");
}


function AjaxAccess_registerDaoClient(daoName, location)
{
	var _req	= this.getRequestObject();


	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "registerDaoClient");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("daoName=" + daoName + "&location=" + location);

	return;
}


function AjaxAccess_disconnect()
{
	return this.execSimpleBool("cleanup");
}


function AjaxAccess_disconnectDao(daoname)
{
	var _req	= this.getRequestObject();


	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "disconnectDao");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("daoName=" + daoname);

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	return trim(_req.responseText) == "true";
}


function AjaxAccess_endOfEvent()
{
	var _req	= this.getRequestObject();
	var dao;
	var tag;

	try
	{  
		eval(_callTrackFunction);
	}
	catch (err)
	{
	}

	dao = _tags["primary"];

	// Truncate all but the first data row
	for (var tagName in dao)
	{
		tag = dao[tagName];

		if ((tag != null) && (tag.rowCount) && (tag.data) && (tag.rowCount > 1))
		{
			dao[tagName].data.length = 1;
			dao[tagName].rowCount = 1;
		}
	}

	msgTxt = JSON.stringify(dao);

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", "text/plain");
	_req.setRequestHeader("Pharaoh-Call", "endOfEvent");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send(msgTxt);

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	_tags = new Object();
	_scriptData = new Object();
	_ASYNC_TICKETS = new Object();

	return trim(_req.responseText) == "true";
}


function AjaxAccess_ready()
{
	return this.execSimpleBool("ready");
}


function AjaxAccess_getErrorString()
{
	var errorString;
	var _req			= this.getRequestObject();


	if (! _isRegistered)
	{
		return "Registration failed";
	}

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "getErrorString");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("");

	if (this.checkStatus(_req) != 200)
	{
		return "DAO Communication Failure";
	}

	errorString = (trim(_req.responseText) == "null") ? 
												"" : trim(_req.responseText);

	return ((errorString != "") && (errorString != null)) ? errorString : "";
}


function AjaxAccess_getANI()
{
	if (_SPI != null)
	{
		return (_SPI.ani != null) ? _SPI.ani : "";
	}

	return "";
}


function AjaxAccess_getUUI()
{
	if (_SPI != null)
	{
		return (_SPI.uui != null) ? _SPI.uui : "";
	}

	return "";
}


function AjaxAccess_getVDN()
{
	if (_SPI != null)
	{
		return (_SPI.vdn != null) ? _SPI.vdn : "";
	}

	return "";
}


function AjaxAccess_getDigits()
{
	if (_SPI != null)
	{
		return (_SPI.collected_digits != null) ? _SPI.collected_digits : "";
	}

	return "";
}


function AjaxAccess_setScriptValue(name, value)
{
	if (name == null)
	{
		return false;
	}

	if ((value == undefined) || (value == null))
	{
		_scriptData[name] = "";
	}
	else
	{
		_scriptData[name] = value + "";
	}

	return true;
}


function AjaxAccess_getScriptValue(name)
{
	if (name == null)
	{
		return "";
	}

	return _scriptData[name] != null ? _scriptData[name] : "";
}


function AjaxAccess_setSessionValue(name, value)
{
	var tmp;

	if (name == null)
	{
		return false;
	}

	if (name == "ECHO_INFO")
	{
		tmp = value.split("|");

		if (tmp.length >= 3)
		{
			_defaultEchoServer = tmp[0];
			_defaultEchoPort = tmp[1]
			_defaultEchoUrl = tmp[2]
		}
	}

	if ((value == undefined) || (value == null))
	{
		_sessionData[name] = "";
	}
	else
	{
		_sessionData[name] = value + "";
	}

	return true;
}


function AjaxAccess_getSessionValue(name)
{
	if (name == null)
	{
		return "";
	}

	return _sessionData[name] != null ? _sessionData[name] : "";
}


// FIXME
function AjaxAccess_useServerService(host, port)
{
	return false;
}


// FIXME
function AjaxAccess_sendServiceMessage(tagname)
{
	return false;
}


function AjaxAccess_startRecording()
{
	return this.baseRecord(false);
}


function AjaxAccess_startSCAP()
{
	return this.baseRecord(true);
}


function AjaxAccess_baseRecord(scap)
{
	var _req		= this.getRequestObject();
	var camp;
	var filename;
	var echo_url;
	var echoimage;
	var errorMsg;

	if (_extn == 'xxxx')
	{
		return false;
	}

	if (_isRecording)
	{
		return true;
	}

	camp = _scriptData["CURRENT_CAMP"];
	filename = _scriptData["ECHO_FILENAME"];

	if ((filename == null) || (filename == ""))
	{
		eventid = _scriptData["EVENT_ID"];
		filename = _siteid + "." + camp + "." + _userid + "." + eventid;
		_scriptData["ECHO_FILENAME"] = filename;
	}

	if (_trainMode)
	{
		_isRecording = true;
		return true;
	}

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", 
						  (scap) ? "ECHO_startSCAP" : "ECHO_startRecording");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("extn=" + _extn + "&userid=" + _userid + "&campaign=" + camp +
			  "&filename=" + filename);

	if (this.checkStatus(_req) != 200)
	{
		echoimage = "F";
		echo_url = "FAILED";
		_scriptData["ECHO_FAIL_REASON"] =
								"Communication Failure (" + _req.status + ")";
	}
	else if (trim(_req.responseText) == "true|")
	{
		echoimage = "T";
		echo_url = "http://" + _baseEchoUrl + "/audio/" + filename + ".mp3";
		_isRecording = true;
	}
	else
	{
		echoimage = "F";
		echo_url = "FAILED";

		errorMsg = trim(_req.responseText);

		if ((errorMsg) && (errorMsg.substring(0, 6) == "false|"))
		{
			errorMsg = errorMsg.substring(6);
		}

		_scriptData["ECHO_FAIL_REASON"] = errorMsg;
	}

	this.setTestEventValue("primary@_echo:echoimage", echoimage);
	this.setTestEventValue("primary@_echo:echo_url", echo_url);
	this.setTestEventValue("primary@_echo:scap", (scap) ? "T" : "F");

	return (echoimage == "T");
}


function AjaxAccess_stopRecording()
{
	var _req		= this.getRequestObject();
	var filename;

	if (! _isRecording)
	{
		return false;
	}

	if (_trainMode)
	{
		_isRecording = false;
		return true;
	}

	filename = _scriptData["ECHO_FILENAME"];

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "ECHO_stopRecording");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("&filename=" + filename);

	_isRecording = false;
	return true;
}


function AjaxAccess_doesURLExist(url)
{
	var _req		= this.getRequestObject();
	var obj			= new Object();
	var tmp;
	var hostname	= "";
	var msgTxt;

	if ((url == null) || (url == ""))
	{
		return false
	}

	tmp = url.split("/");

	if (tmp.length > 3)
	{
		hostname = tmp[2];

		if (hostname.indexOf(":") != -1)
		{
			hostname = hostname.split(":")[0];
		}
	}

	if (hostname == document.location.hostname)
	{
		try
		{
			_req.open("HEAD", url, false);
			_req.send("");
		}
		catch (err)
		{
			return false;
		}

		return (this.checkStatus(_req) == 200)
	}
	else
	{
		obj.url = url;
		msgTxt = JSON.stringify(obj);

		_req.open("POST", _AJAX_URL, false);
		_req.setRequestHeader("Content-Type", "text/plain");
		_req.setRequestHeader("Pharaoh-Call", "doesURLExist");
		_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
		_req.send(msgTxt);

		return trim(_req.responseText) == "true";
	}
}


function AjaxAccess_isTrainMode()
{
	return _trainMode;
}


function AjaxAccess_isRecording()
{
	return _isRecording;
}


function AjaxAccess_createTestTag(tagcol, columns, numRows)
{
	var tagInfo;
	var tag;
	var daoName;
	var tagName;

	try
	{
		numRows = parseInt(numRows);
	}
	catch (Err)
	{
		return false;
	}

	if ((tagcol == null) || (columns == null) ||
		(tagcol == "") || (columns == ""))
	{
		return false;
	}

	tagInfo = this.parseTagDescriptor(tagcol);

	if (tagInfo == null)
	{
		return false;
	}

	daoName = tagInfo[0];
	tagName = tagInfo[1];

	tag = new Object();
	tag.params = new Array();
	tag.columns = columns.split("|");
	tag.rowCount = numRows;
	tag.data = new Array();

	for (i = 0; i < numRows; i++)
	{
		tag.data[i] = new Array();
	}

	if (! _tags[daoName])
	{
		_tags[daoName] = new Object();
	}

	_tags[daoName][tagName] = tag;

	return true;
}


function AjaxAccess_setTestEventValue(tagcol, value, rownum)
{
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;

	if (tagInfo == null)
	{
		return false;
	}

	if (rownum == null)
	{
		rownum = 0;
	}

	try
	{
		rownum = parseInt(rownum);
	}
	catch (Err)
	{
		return false;
	}

	if (rownum < 0)
	{
		return false;
	}

	tag = this.getTag(tagInfo[0], tagInfo[1]);

	//if ((tag == null) || (tag.rowCount <= rownum))
	if ((tag == null) || (tag.data == null) || (tag.data[rownum] == null))
	{
		return false;
	}

	if (value == undefined)
	{
		value = null;
	}

	for (var i = 0; i < tag.columns.length; i++)
	{
		if (tag.columns[i] == tagInfo[2])
		{
			tag.data[rownum][i] = value;
			return true;
		}
	}

	return false;
}


function AjaxAccess_getTimeLong()
{
	return this.execSimpleString("getTimeLong");
}


function AjaxAccess_getTimeFormat(format)
{
	var _req	= this.getRequestObject();


	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "getTimeFormat");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("format=" + format);

	if (this.checkStatus(_req) != 200)
	{
		return "";
	}

	return trim(_req.responseText);
}


function AjaxAccess_reformatDate(timein, oldFmt, newFmt)
{
	var _req	= this.getRequestObject();
	var idx		= timein + "|" + oldFmt + "|" + newFmt;
	var ret;


	if (_dateCache[idx])
	{
		return _dateCache[idx];
	}

	// Most common date conversions
	if (((oldFmt == "yyyy-MM-dd") || (oldFmt == "yyyy/MM/dd") ||
		 (oldFmt == "yyyy-MM-dd HH:mm:ss") ||
		 (oldFmt == "yyyy/MM/dd HH:mm:ss")) && 
		((newFmt == "MM-dd-yyyy") || (newFmt == "MM/dd/yyyy")) && 
		(timein.length == oldFmt.length))
	{
		ret = timein.substring(5, 7) + newFmt.charAt(2) + 
			  timein.substring(8, 10) + newFmt.charAt(2) + 
			  timein.substring(0, 4);

		_dateCache[idx] = ret;
		return ret;
	}
	else if (((oldFmt == "yyyy-MM-dd HH:mm:ss") || 
			  (oldFmt == "yyyy/MM/dd HH:mm:ss")) && 
			 ((newFmt == "MM/dd/yyyy HH:mm:ss") || 
			  (newFmt == "MM-dd-yyyy HH:mm:ss")) && 
			 (timein.length == oldFmt.length))
	{
		ret = timein.substring(5, 7) + newFmt.charAt(2) + 
			  timein.substring(8, 10) + newFmt.charAt(2) + 
			  timein.substring(0, 4) + timein.substring(10);

		_dateCache[idx] = ret;
		return ret;
	}

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "reformatDate");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("timein=" + timein + "&oldFmt=" + oldFmt + "&newFmt=" + newFmt);

	if (this.checkStatus(_req) != 200)
	{
		return "";
	}

	ret = (trim(_req.responseText) == "null") ? null : trim(_req.responseText);

	_dateCache[idx] = ret;
	
	return ret;
}


function AjaxAccess_cleanup()
{
	return this.execSimpleBool("cleanup");
}


function AjaxAccess_printTags()
{
	var dao;
	var win;
	var win_opts	= ""
	var text		= "";

	daoname = (arguments.length == 1) ? arguments[0] : "primary";

	text = "<HTML><HEAD><TITLE>DAO: " + daoname + "</TITLE></HEAD><BODY><PRE>";

	if (! _tags[daoname])
	{
		text += "ERROR: There is no DAO named: " + daoname;
	}
	else
	{
		for (tagname in _tags[daoname])
		{
			tag = _tags[daoname][tagname];

			if (tag == null)
			{
				continue;
			}

			text += tagname + " ResultSet RowCount=" + tag.rowCount + "\n";

			//for (var i = 0; i < tag.rowCount; i++)
			for (var i = 0; i < tag.data.length; i++)
			{
				text += tagname + ": data" + i + "->";

				for (var j = 0; j < tag.columns.length; j++)
				{
					text += tag.columns[j] + "=" + tag.data[i][j] + ";"
				}
				
				text += "\n";
			}

			text += tagname + ": parameters->";

			for (var i = 0; i < tag.params.length; i++)
			{
				text += tag.params[i][0] + "=" + tag.params[i][1] + ";"
			}

			text += "\n";
		}
	}

	text += "</PRE><CENTER><INPUT TYPE=\"button\" onClick='window.close()' " + 
			"VALUE=\"Close\"></CENTER></BODY></HTML>";

	if ((_PRINT_TAGS != null) && (! _PRINT_TAGS.closed))
	{
		_PRINT_TAGS.close();
	}

	_PRINT_TAGS = window.open("about:blank", "PRINTTAGS", 
				"height=400,width=600,location=no,menubar=no,toolbar=no");
	_PRINT_TAGS.document.writeln(text);
	_PRINT_TAGS.focus();
}


function AjaxAccess_setAuxMode(mode)
{
	var _req	= this.getRequestObject();


	try
	{
		mode = parseInt(mode);
	}
	catch (err)
	{
		return false;
	}

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "setAuxMode");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("mode=" + mode);

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	return trim(_req.responseText) == "true";
}


function AjaxAccess_getState()
{
	return _CURRENT_STATE;
}


function AjaxAccess_getStateText()
{
	return _CURRENT_STATE_TEXT;
}


function AjaxAccess_setCurrentPage(pagename)
{
	_CURRENT_PAGE = pagename;
}


function AjaxAccess_serverPrint(message)
{
	var _req	= this.getRequestObject();
	var obj		= new Object();
	var msgTxt;

	obj.message = message;
	msgTxt = JSON.stringify(obj);

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", "text/plain");
	_req.setRequestHeader("Pharaoh-Call", "serverPrint");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send(msgTxt);
}


function AjaxAccess_setKeepAlive(daoName, value)
{
	var _req	= this.getRequestObject();


	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "setKeepAlive");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("daoName=" + daoName + "&value=" + value);
}


function AjaxAccess_indexOf(tagcol, value)
{
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;
	var colidx;
	var idx		= 0;
		
	if (arguments.length == 3)
	{
		idx = parseInt(arguments[2]);
	}

	if ((tagInfo == null) || (! _tags[tagInfo[0]]) ||
		(! _tags[tagInfo[0]][tagInfo[1]]))
	{
		return -1;
	}

	tag = _tags[tagInfo[0]][tagInfo[1]];

	if (tag.rowCount <= idx)
	{
		return -1;
	}

	for (var i = 0; i < tag.columns.length; i++)
	{
		if (tag.columns[i] == tagInfo[2])
		{
			colIdx = i;
			break;
		}
	}

	for (var i = idx; i < tag.rowCount; i++)
	{
		if (tag.data[i][colIdx] == value)
		{
			return i;
		}
	}

	return -1;
}


function AjaxAccess_clearParameters(tagcol)
{
	var tagInfo = this.parseTagDescriptor(tagcol);
	var tag;

	if ((tagInfo == null) || (! _tags[tagInfo[0]]) ||
		(! _tags[tagInfo[0]][tagInfo[1]]))
	{
		return;
	}

	tag = _tags[tagInfo[0]][tagInfo[1]];

	for (var i = 0; i < tag.params.length; i++)
	{
		tag.params[i][1] = null;
	}
}


function AjaxAccess_getSystemProperty(propName)
{
	// Simulate the applet
	return "1.5.0_01-b08";
}


function AjaxAccess_generateCampList(siteid, nonEvent)
{
	var _req	= this.getRequestObject();


	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "generateCampList");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("siteid=" + siteid + "&nonEvent=" + nonEvent);

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	return trim(_req.responseText) == "true";
}


function AjaxAccess_setNextCall(extn, vdn, ani, uui, digits)
{
	var _req	= this.getRequestObject();


	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "setNextCall");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("extn=" + extn + "&vdn=" + vdn + "&ani=" + ani + "&uui=" + uui +
			  "&digits=" + digits + "&simUrl=" + SIMULATOR_URL);

	if (this.checkStatus(_req) != 200)
	{
		return false;
	}

	return trim(_req.responseText) == "true";
}


function AjaxAccess_setForegroundColor(color)
{
	if (window.setForegroundColor)
	{
		window.setForegroundColor(color);
	}
}


function AjaxAccess_setBackgroundColor(color)
{
	if (window.setBackgroundColor)
	{
		window.setBackgroundColor(color);
	}
}


function AjaxAccess_showPanel(panel)
{
	if (window.showPanel)
	{
		window.showPanel(panel);
	}
}


function AjaxAccess_redirect(spi_raw)
{
	var _req	= this.getRequestObject();
	var newTag;

	// Clear Data
	_tags = new Object();
	_scriptData = new Object();

	this.createTestTag("primary@_echo", "echo_url|echoimage|scap", 1);
	this.setTestEventValue("primary@_echo:echo_url", "");
	this.setTestEventValue("primary@_echo:echoimage", "F");
	this.setTestEventValue("primary@_echo:scap", "F");

	_SPI = eval("(" + spi_raw + ")" );

	if ((_SPI.echoRecorderId != null) && (_SPI.echoRecorderId.length == 3))
	{
		_campEchoServer = _SPI.echoRecorderId[0];
		_campEchoPort = _SPI.echoRecorderId[1];
		_baseEchoUrl = _SPI.echoRecorderId[2];
	}
	else
	{
		_campEchoServer = _defaultEchoServer;
		_campEchoPort = _defaultEchoPort;
		_baseEchoUrl = _defaultEchoUrl;
	}

	if ((_SPI.campaign == null) || (_SPI.campaign == ""))
	{
		_SPI.campaign = "Unknown CCAI";
	}

	this.setScriptValue("EVENT_ID", _SPI.eventId);
	this.setScriptValue("CURRENT_CAMP", _SPI.campaign);
	this.setScriptValue("CURRENT_CAMPTYPE", _SPI.campaignType);

	_req.open("POST", _AJAX_URL, false);
	_req.setRequestHeader("Content-Type", _PARAM_TYPE);
	_req.setRequestHeader("Pharaoh-Call", "ECHO_login");
	_req.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	_req.send("extn=" + _extn + "&echoServer=" + _campEchoServer +
			  "&echoPort=" + _campEchoPort + "&userid=" + _userid +
			  "&campaign=" + _SPI.campaign);

	if ((_SPI.preViewBuff) && (_SPI.preViewBuff.length != 0))
	{
		newTag = new Object();
		newTag.params = new Array();
		newTag.rowCount = _SPI.masterRowCount;
		newTag.columns = new Array();
		newTag.data = new Array();
		newTag.data[0] = new Array();

		for (var i = 0; i < _SPI.preViewBuff[0].length; i++)
		{
			newTag.columns[i] = _SPI.preViewBuff[0];
			newTag.data[0][i] = _SPI.preViewBuff[1];
		}

		if (_tags["primary"] != null)
		{
			_tags["primary"] = new Object();
		}

		_tag["primary"]["_master"] = newTag;
	}

	if (window.processRedirect)
	{
		window.processRedirect(_SPI.screenPopURL)
	}
}


function AjaxAccess_setClientState(state, stateText)
{
	_CURRENT_STATE = state;
	_CURRENT_STATE_TEXT = stateText;

	if (window.setClientState)
	{
		window.setClientState(state, stateText);
	}
}


function AjaxAccess_checkStatus(hxr)
{
	if (hxr.status == 403)
	{
		document.onerror = new Function("return true");
		setTimeout("top.document.writeln('<HTML><HEAD><TITLE>Access Denied</TITLE><SCRIP" + "T LANGUAGE=\"JavaScript\">document.onerror = new Function(\"return true\")</SC" +  "RIPT></HEAD><BODY><CENTER><H1>Access Denied</H1></CENTER></BODY></HTML>')", 100);
		return 403;
	}
	else
	{
		return hxr.status;
	}
}


AjaxAccess.prototype.initialize = AjaxAccess_initialize;
AjaxAccess.prototype.isInitialized = AjaxAccess_isInitialized;
AjaxAccess.prototype.getRequestObject = AjaxAccess_getRequestObject;
AjaxAccess.prototype.setCallTrackFunction = AjaxAccess_setCallTrackFunction;
AjaxAccess.prototype.setDefaultAsyncPrefix = AjaxAccess_setDefaultAsyncPrefix;
AjaxAccess.prototype.parseTagDescriptor = AjaxAccess_parseTagDescriptor;
AjaxAccess.prototype.setPrimaryDaoName = AjaxAccess_setPrimaryDaoName;
AjaxAccess.prototype.getPrimaryDaoName = AjaxAccess_getPrimaryDaoName;
AjaxAccess.prototype.getParameters = AjaxAccess_getParameters;
AjaxAccess.prototype.getTag = AjaxAccess_getTag;
AjaxAccess.prototype.execSimpleBool = AjaxAccess_execSimpleBool;
AjaxAccess.prototype.execSimpleString = AjaxAccess_execSimpleString;
AjaxAccess.prototype.setParameter = AjaxAccess_setParameter;
AjaxAccess.prototype.setEventValue = AjaxAccess_setParameter;
AjaxAccess.prototype.getEventValue = AjaxAccess_getEventValue;
AjaxAccess.prototype.getEventValueRow = AjaxAccess_getEventValue;
AjaxAccess.prototype.getNumRows = AjaxAccess_getNumRows;
AjaxAccess.prototype.doesTagExist = AjaxAccess_doesTagExist;
AjaxAccess.prototype.execute = AjaxAccess_execute;
AjaxAccess.prototype.asyncExecute = AjaxAccess_asyncExecute;
AjaxAccess.prototype.notifyAsyncExec = AjaxAccess_notifyAsyncExec;
AjaxAccess.prototype.purgeTag = AjaxAccess_purgeTag;
AjaxAccess.prototype.copyTag = AjaxAccess_copyTag;
AjaxAccess.prototype.login = AjaxAccess_login;
AjaxAccess.prototype.logout = AjaxAccess_logout;
AjaxAccess.prototype.registerDaoClient = AjaxAccess_registerDaoClient;
AjaxAccess.prototype.disconnect = AjaxAccess_disconnect;
AjaxAccess.prototype.disconnectDao = AjaxAccess_disconnectDao;
AjaxAccess.prototype.endOfEvent = AjaxAccess_endOfEvent;
AjaxAccess.prototype.ready = AjaxAccess_ready;
AjaxAccess.prototype.getErrorString = AjaxAccess_getErrorString;
AjaxAccess.prototype.getANI = AjaxAccess_getANI;
AjaxAccess.prototype.getUUI = AjaxAccess_getUUI;
AjaxAccess.prototype.getVDN = AjaxAccess_getVDN;
AjaxAccess.prototype.getDigits = AjaxAccess_getDigits;
AjaxAccess.prototype.setScriptValue = AjaxAccess_setScriptValue;
AjaxAccess.prototype.getScriptValue = AjaxAccess_getScriptValue;
AjaxAccess.prototype.setSessionValue = AjaxAccess_setSessionValue;
AjaxAccess.prototype.getSessionValue = AjaxAccess_getSessionValue;
AjaxAccess.prototype.useServerService = AjaxAccess_useServerService;
AjaxAccess.prototype.sendServiceMessage = AjaxAccess_sendServiceMessage;
AjaxAccess.prototype.baseRecord = AjaxAccess_baseRecord;
AjaxAccess.prototype.startRecording = AjaxAccess_startRecording;
AjaxAccess.prototype.startSCAP = AjaxAccess_startSCAP;
AjaxAccess.prototype.stopRecording = AjaxAccess_stopRecording;
AjaxAccess.prototype.doesURLExist = AjaxAccess_doesURLExist;
AjaxAccess.prototype.isTrainMode = AjaxAccess_isTrainMode;
AjaxAccess.prototype.isRecording = AjaxAccess_isRecording;
AjaxAccess.prototype.createTestTag = AjaxAccess_createTestTag;
AjaxAccess.prototype.setTestEventValue = AjaxAccess_setTestEventValue;
AjaxAccess.prototype.getTimeLong = AjaxAccess_getTimeLong;
AjaxAccess.prototype.getTimeFormat = AjaxAccess_getTimeFormat;
AjaxAccess.prototype.reformatDate = AjaxAccess_reformatDate;
AjaxAccess.prototype.cleanup = AjaxAccess_cleanup;
AjaxAccess.prototype.printTags = AjaxAccess_printTags;
AjaxAccess.prototype.setAuxMode = AjaxAccess_setAuxMode;
AjaxAccess.prototype.getState = AjaxAccess_getState;
AjaxAccess.prototype.getStateText = AjaxAccess_getStateText;
AjaxAccess.prototype.setCurrentPage = AjaxAccess_setCurrentPage;
AjaxAccess.prototype.serverPrint = AjaxAccess_serverPrint;
AjaxAccess.prototype.setKeepAlive = AjaxAccess_setKeepAlive;
AjaxAccess.prototype.indexOf = AjaxAccess_indexOf;
AjaxAccess.prototype.clearParameters = AjaxAccess_clearParameters;
AjaxAccess.prototype.getSystemProperty = AjaxAccess_getSystemProperty;
AjaxAccess.prototype.generateCampList = AjaxAccess_generateCampList;
AjaxAccess.prototype.setNextCall = AjaxAccess_setNextCall;
AjaxAccess.prototype.setForegroundColor = AjaxAccess_setForegroundColor;
AjaxAccess.prototype.setBackgroundColor = AjaxAccess_setBackgroundColor;
AjaxAccess.prototype.showPanel = AjaxAccess_showPanel;
AjaxAccess.prototype.redirect = AjaxAccess_redirect;
AjaxAccess.prototype.setClientState = AjaxAccess_setClientState;
AjaxAccess.prototype.checkStatus = AjaxAccess_checkStatus;

daoClient = new AjaxAccess();


function poll()
{
	try
	{
		poller = new ActiveXObject("Microsoft.XMLHTTP");
	}
	catch (err)
	{
		poller = new XMLHttpRequest();
	}

	poller.onreadystatechange = pollReceiver;

	poller.open("POST", _AJAX_URL,  true);
	poller.setRequestHeader("Content-Type", "text/plain");
	poller.setRequestHeader("Pharaoh-Call", "poll");
	poller.setRequestHeader("Pharaoh-Sess", _SESSION_ID);
	poller.send("");
}


function pollReceiver()
{
	var msg_list;
	var message;

	if (poller == null)
	{
		return;
	}

	if ((poller.readyState == 4) && (poller.status == 200))
	{
		if (top.debug)
		{
			try
			{
				top.debug.setSpanValue("ajax_time", new Date());
				top.debug.setSpanValue("ajax_mesg", poller.responseText);
			}
			catch (err)
			{
			}
		}

		msg_list = poller.responseText.split("@@@@");

		_poll_cnt++;

		for (var i = 0; i < msg_list.length; i++)
		{
			message = msg_list[i].split("|");

			if (message[0] == "notifyAsyncExec")
			{
				setTimeout("daoClient.notifyAsyncExec('" + message[1] + "', " +
						   message[2] + ")", 500);
			}
			else if (message[0] == "redirect")
			{
				daoClient.redirect(message[1]);
			}
			else if (message[0] == "setClientState")
			{
				if ((message[2] == "TALK") && (AJAX_POLL_INTERVAL != 0))
				{
					AJAX_POLL_INTERVAL = 2500;
				}

				daoClient.setClientState(message[1], message[2]);
			}
			else if (message[0] == "NOOP")
			{
				_noop_cnt++;
			}
		}

		if (top.debug)
		{
			try
			{
				top.debug.setSpanValue("ajax_poll", _poll_cnt + "");
				top.debug.setSpanValue("ajax_noop", _noop_cnt + "");
			}
			catch (err)
			{
			}
		}

		// Independant Statement
		if (message[0] != "disconnect")
		{
			setTimeout("poll()", AJAX_POLL_INTERVAL);
		}
	}
	else if (poller.readyState == 4)
	{
		if ((poller.status == 500) && 
			(poller.responseText.toLowerCase().indexOf("not registered") != -1))
		{
			setTimeout("alert(\"ERROR: Connection lost to server!\")", 0);
			return;
		}

		setTimeout("poll()", AJAX_POLL_INTERVAL);
	}
}
