/*
   (c) copyright, Payscale.com 2005 onwards. All rights reserved. 
   Any use of this code except by Payscale.com is a copyright violation.
*/

/*
	AJAX MESSAGING CLASSES
*/

function ajax_timer(timeout, expression)
{
	this.timeout = timeout;
	this.expression = expression;
	this.started = false;
	
	this.start = ajax_timerStart;
	this.stop = ajax_timerStop;
}

function ajax_timerStart()
{
	if (!this.started)
	{
		this.timerID = window.setTimeout(this.expression, this.timeout);
		this.started = true;
	}
}

function ajax_timerStop()
{
	if (this.started)
	{
		window.clearTimeout(this.timerID);
		this.started = false;
	}
}

var ajax_statusUnitialized = 0;
var ajax_statusLoading = 1;
var ajax_statusLoaded = 2;
var ajax_statusInteractive = 3;
var ajax_statusComplete = 4;
var ajax_requestHeader = "ajaxRequest";
var ajax_errorNoXmlHttp = "NoXmlHttp";

function ajax_createXmlHTTP()
{
	if (window.ActiveXObject)
	{
		return new ActiveXObject("Microsoft.XmlHTTP");
	}
	if	(window.XMLHttpRequest)
	{
		return new XMLHttpRequest();
	}
	
	throw new Error("XmlHTTP unavailable");
}

// Workaround Firefox bugs
function ajax_getXmlHTTPRequestHeader(transport)
{
	var header = "";
	try
	{
		header = transport.getResponseHeader(ajax_requestHeader)
	}
	catch(e)
	{
	}
	
	return header;
}

// Global request table
var g_ajax = new ps_ajax();

function ps_ajax()
{
	this.requestTable = new Object(); 
	this.requestQueue = new Array();  	
	this.activeQueuedRequestCount = 0;
	this.internalIdentity = 0;
}

function ajax_requestNextID()
{
    return 'AJAX_ID_' + g_ajax.internalIdentity++;
}

function ajax_addRequest(request)
{
	g_ajax.requestTable[request.requestID] = request;
}

function ajax_getRequest(requestID)
{
	return g_ajax.requestTable[requestID];
}

function ajax_removeRequest(requestID)
{
	delete g_ajax.requestTable[requestID];
}

function ajax_request_callback(requestID, url, requestTimeout, retryInterval, callbackFunction)
{
    this.ajax_request(ajax_requestNextID(), url, requestTimeout, retryInterval);
    this.OnResponse = callbackFunction;
}

// An ajax request with default callback. 
function ajax_request(requestID, url, requestTimeout, retryInterval)
{	
	// Private Fields
	this.transport = null;
	this.responseHandler = function()
	{
		processAjaxResponse(requestID);
	};
	this.isQueued = false;
	
	// Public fields
	this.requestID = requestID;
	this.url = url;	
	this.postContent = null; // when !null, posts this content. Otherwise Get
	
	this.acceptRedirects = false;
	this.requestTimer = (requestTimeout > 0) ? ajax_createRequestTimer(requestTimeout, this) : null;
	this.retryTimer = (retryInterval > 0) ? ajax_createRetryTimer(retryInterval, this) : null;
	this.retryCount = (null != this.retryTimer) ? 1 : 0;
		
	// Events	
	this.onStart = null;
	this.onResponse = null;
	this.onResponseError = null;
	this.onRedirect = null;
	this.onStatus = null;
	this.onRequestTimeout = null;
	
	// Private Methods
	this.processReadyState = ajax_processReadyState;
	this.processError = ajax_processError;
	this.processEnd = ajax_endRequest;
	this.processTimeout = ajax_processTimeout;
	this.processRetryTimeout = ajax_processRetryTimeout;
	
	// Public methods
	this.send = ajax_beginRequest;
	this.queue = ajax_queueRequest;
	this.stop = ajax_requestClose;
    
}

function ajax_queueRequest()
{
	this.isQueued = true;
	g_ajax.requestQueue.push(this);	
	return ajax_beginQueuedRequest();
}

function ajax_requestClose()
{
	if (null != this.transport && this.transport.readyState != ajax_statusComplete)
	{
		this.transport.abort();
	}
	if (null != this.requestTimer)
	{
		this.requestTimer.stop();
	}
	if (null != this.retryTimer)
	{
		this.retryTimer.stop();
	}

	ajax_removeRequest(this.requestID);	
	if (this.isQueued)
	{
		ajax_removeQueuedRequest(this.requestID);
	}
}

function ajax_processReadyState()
{
	if (null != this.onStatus)
	{
		this.onStatus(this);
	}	
	
	if (ajax_statusComplete == this.transport.readyState)
	{
		this.processEnd();
	}
}

function ajax_beginRequest()
{
	if (null != ajax_getRequest(this.requestID))
	{
		// already active
		return false;
	}
	
	this.transport = null;
	this.transport = ajax_createXmlHTTP();
	this.transport.onreadystatechange = this.responseHandler;
	
	ajax_addRequest(this);	
	if (null != this.onStart)
	{
		this.onStart(this);
	}
	
	if (null != this.postContent)
	{
		this.transport.open("POST", this.url, true);
	}	
	else
	{
		this.transport.open("GET", this.url, true);
	}
	this.transport.setRequestHeader(ajax_requestHeader, this.url);
	this.transport.send(this.postContent);
	
	if (null != this.requestTimer)
	{
		this.requestTimer.start();
	}
	
	return true;
}

function ajax_endRequest()
{	
	try
	{
		this.stop();
		
		var responseText = this.transport.responseText;
		var status = this.transport.status;
		var ajaxResponse = new ajax_response(this, status, responseText);
		
		if ("" == responseText || status >= 400)
		{
			if (this.processError(ajaxResponse))
			{
				this.transport = null;
				return;
			}
		}			
		else if (ajax_getXmlHTTPRequestHeader(this.transport) != this.url && this.acceptRedirects)
		{
			if (null != this.onRedirect)
			{
				this.onRedirect(ajaxResponse);
			}
		}						
		else if (200 == status)
		{
			if (null != this.onResponse)
			{
				this.onResponse(ajaxResponse);
			}			
		}
		
		delete ajaxResponse;
		this.transport = null;
	}
	catch(e)
	{
		// Eat all async exceptions
	}

	if (this.isQueued)
	{
		g_ajax.activeQueuedRequestCount--;	
		ajax_beginQueuedRequest();
	}
}

function ajax_processError(ajaxResponse)
{
	if (null != this.onResponseError)
	{
		this.onResponseError(ajaxResponse);
	}			

	if (null != this.retryTimer && this.retryCount > 0)
	{
		ajax_addRequest(this);
		this.retryTimer.start();
		return true;
	}
	
	return false;
}

function ajax_processTimeout()
{
	if (null != this.transport && ajax_statusComplete == this.transport.readyState)
	{
		return;
	}	

	if (null != this.onRequestTimeout)
	{
		this.onRequestTimeout(this);
	}
	else
	{
		this.stop();
		this.processError(new ajax_response(ajaxRequest, 408, "Request Timed out. Please try again."));
	}
}

function ajax_processRetryTimeout()
{
	this.stop();	
	this.retryCount--;
	this.send();
}

function ajax_beginQueuedRequest()
{	
	if (g_ajax.requestQueue.length > 0 && 0 == g_ajax.activeQueuedRequestCount)
	{
		ajaxRequest = g_ajax.requestQueue.shift();
		g_ajax.activeQueuedRequestCount++;
		if (!ajaxRequest.send())
		{
			g_ajax.activeQueuedRequestCount--;
		}
		return true;
	}
	
	return false;
}

function ajax_removeQueuedRequest(requestID)
{
	var i;
	for (i = 0; i < g_ajax.requestQueue.length; ++i)
	{
		if (g_ajax.requestQueue[i].requestID == requestID)
		{
			g_ajax.requestQueue.splice(i, 1);
		}
	}	
}

function processAjaxResponse(requestID)
{
	var request = ajax_getRequest(requestID);
	if (null != request)
	{
		request.processReadyState();		
	}
}

// A response to an ajax request
function ajax_response(ajaxRequest, status, responseText)
{
	this.request = ajaxRequest;
	this.status = status;
	this.responseText = responseText;
}

function ajax_requestTimeoutCallback(requestID)
{
	var ajaxRequest = ajax_getRequest(requestID);
	if (null != ajaxRequest)
	{
		ajaxRequest.processTimeout();
	}	
}

// Great for loading parts using timers
function ajax_retryLoadTimerCallback(requestID)
{
	var ajaxRequest = ajax_getRequest(requestID);
	if (null != ajaxRequest)
	{
		ajaxRequest.processRetryTimeout();
	}
}

function ajax_createRequestTimer(timeout, ajaxRequest)
{
	return new ajax_timer(timeout, "ajax_requestTimeoutCallback(\"" + ajaxRequest.requestID + "\")");
}

function ajax_createRetryTimer(retryInterval, ajaxRequest)
{
	return new ajax_timer(retryInterval, "ajax_retryLoadTimerCallback(\"" + ajaxRequest.requestID + "\")");
}

/*
	AJAX DHTML HELPERS
*/

var ajax_dhtmlNodeState_Null = "";
var ajax_dhtmlNodeState_Loading = "loading";
var ajax_dhtmlNodeState_LoadError = "loadError";
var ajax_dhtmlNodeState_Loaded = "loaded";

function ajax_dhtmlOnResponse(ajaxResponse)
{
	var node = ajaxResponse.request.node;	
	node.loadState = ajax_dhtmlNodeState_Loaded;
	node.innerHTML = ajaxResponse.responseText;
}

function ajax_dhtmlOnError(ajaxResponse)
{
	var node = ajaxResponse.request.node;	

	node.loadState = ajax_dhtmlNodeState_LoadError;

	var ajaxRequest = ajaxResponse.request;
	errorMsg = "Error loading data.";
	if (null != ajaxRequest.retryTimer && ajaxRequest.retryCount > 0)
	{
		errorMsg = errorMsg + " Retrying in " + ajaxRequest.retryTimer.timeout/1000 + " seconds.";
	}
	else
	{
		errorMsg = errorMsg + " Please try again.";
	}
	node.innerHTML = errorMsg;
}

function ajax_dhtmlOnRedirect(ajaxResponse)
{
	ajaxResponse.request.node.loadState = ajax_dhtmlNodeState_LoadError;
	window.location.reload(true);
}

function ajax_dhtmlOnStart_Loading(ajaxRequest)
{
	ajaxRequest.node.loadState = ajax_dhtmlNodeState_Loading;
	return true;
}

function ajax_dhtmlShowLoadingImg(ajaxRequest)
{
	ajaxRequest.node.loadState = ajax_dhtmlNodeState_Loading;
	ajaxRequest.node.innerHTML = "<img SRC=\"/images/loading.gif\">";
	return true;
}

// If the given node isn't loaded, creates a request that you can use to load..
function ajax_dhtmlCreateGetPartRequest(node, url, retryInterval)
{
	if (null == url)
	{
		if ("" == (url = node.getAttribute("href")))
		{
			return null;
		}
	}	
	
	var request = new ajax_request(node.id, url, 1000, retryInterval);	
	node.loadState = ajax_dhtmlNodeState_Null;
	request.node = node;
	request.onStart = ajax_dhtmlOnStart_Loading;
	// We use the request timeout functionality to set our downloading image...
	// If we took more than 1 second, we'll show the downloading gif
	request.onRequestTimeout = ajax_dhtmlShowLoadingImg;
	request.onResponse = ajax_dhtmlOnResponse;
	request.onResponseError = ajax_dhtmlOnError;
	request.onRedirect = ajax_dhtmlOnRedirect;

	return request;
}

function ajax_dhtmlGetPartLoadState(node)
{
	var state = node.loadState;
	return (null != state) ? state : ajax_dhtmlNodeState_Null;
}

function ajax_dhtmlIsPartLoaded(node)
{
	return (ajax_dhtmlNodeState_Loaded == ajax_dhtmlGetPartLoadState(node));
}

function ajax_submitCallbackRequest(url, retryInterval, requestTimeout, callbackFunction, errorFunction, timeoutFunction)
{
    var id = ajax_requestNextID();
	var request = new ajax_request(id, url, requestTimeout, retryInterval);	
	request.onRequestTimeout = timeoutFunction;
	request.onResponse = callbackFunction;
	request.onResponseError = errorFunction;
	request.queue();
	return request;


}


function ajax_dhtmlEnsurePartLoaded(node, url, retryInterval)
{
	if (null == node)
	{
		return;
	}
	
	var requestID = node.id;	
	if (ajax_dhtmlNodeState_Null != ajax_dhtmlGetPartLoadState(node) || null != ajax_getRequest(requestID))
	{
		// Already in progress or already loaded	
		return;	
	}
	
	var request = ajax_dhtmlCreateGetPartRequest(node, url, retryInterval);
	if (null != request && !request.queue())
	{
		// We had to queue the request. Immediately show the waiting icon
		ajax_dhtmlShowLoadingImg(request);
	}
}

function setItemDisplay(item, displayStyle)
{
	if (null != item)
	{
		item.style.display= displayStyle;
	}
}
/*
   (c) copyright, Payscale.com 2005 onwards. All rights reserved. 
   Any use of this code except by Payscale.com is a copyright violation.
*/

/*
	AJAX MESSAGING CLASSES
*/

function ajax_timer(timeout, expression)
{
	this.timeout = timeout;
	this.expression = expression;
	this.started = false;
	
	this.start = ajax_timerStart;
	this.stop = ajax_timerStop;
}

function ajax_timerStart()
{
	if (!this.started)
	{
		this.timerID = window.setTimeout(this.expression, this.timeout);
		this.started = true;
	}
}

function ajax_timerStop()
{
	if (this.started)
	{
		window.clearTimeout(this.timerID);
		this.started = false;
	}
}

var ajax_statusUnitialized = 0;
var ajax_statusLoading = 1;
var ajax_statusLoaded = 2;
var ajax_statusInteractive = 3;
var ajax_statusComplete = 4;
var ajax_requestHeader = "ajaxRequest";
var ajax_errorNoXmlHttp = "NoXmlHttp";

function ajax_createXmlHTTP()
{
	if (window.ActiveXObject)
	{
		return new ActiveXObject("Microsoft.XmlHTTP");
	}
	if	(window.XMLHttpRequest)
	{
		return new XMLHttpRequest();
	}
	
	throw new Error("XmlHTTP unavailable");
}

// Workaround Firefox bugs
function ajax_getXmlHTTPRequestHeader(transport)
{
	var header = "";
	try
	{
		header = transport.getResponseHeader(ajax_requestHeader)
	}
	catch(e)
	{
	}
	
	return header;
}

// Global request table
var g_ajax = new ps_ajax();

function ps_ajax()
{
	this.requestTable = new Object(); 
	this.requestQueue = new Array();  	
	this.activeQueuedRequestCount = 0;
	this.internalIdentity = 0;
}

function ajax_requestNextID()
{
    return 'AJAX_ID_' + g_ajax.internalIdentity++;
}

function ajax_addRequest(request)
{
	g_ajax.requestTable[request.requestID] = request;
}

function ajax_getRequest(requestID)
{
	return g_ajax.requestTable[requestID];
}

function ajax_removeRequest(requestID)
{
	delete g_ajax.requestTable[requestID];
}

function ajax_request_callback(requestID, url, requestTimeout, retryInterval, callbackFunction)
{
    this.ajax_request(ajax_requestNextID(), url, requestTimeout, retryInterval);
    this.OnResponse = callbackFunction;
}

// An ajax request with default callback. 
function ajax_request(requestID, url, requestTimeout, retryInterval)
{	
	// Private Fields
	this.transport = null;
	this.responseHandler = function()
	{
		processAjaxResponse(requestID);
	};
	this.isQueued = false;
	
	// Public fields
	this.requestID = requestID;
	this.url = url;	
	this.postContent = null; // when !null, posts this content. Otherwise Get
	
	this.acceptRedirects = false;
	this.requestTimer = (requestTimeout > 0) ? ajax_createRequestTimer(requestTimeout, this) : null;
	this.retryTimer = (retryInterval > 0) ? ajax_createRetryTimer(retryInterval, this) : null;
	this.retryCount = (null != this.retryTimer) ? 1 : 0;
		
	// Events	
	this.onStart = null;
	this.onResponse = null;
	this.onResponseError = null;
	this.onRedirect = null;
	this.onStatus = null;
	this.onRequestTimeout = null;
	
	// Private Methods
	this.processReadyState = ajax_processReadyState;
	this.processError = ajax_processError;
	this.processEnd = ajax_endRequest;
	this.processTimeout = ajax_processTimeout;
	this.processRetryTimeout = ajax_processRetryTimeout;
	
	// Public methods
	this.send = ajax_beginRequest;
	this.queue = ajax_queueRequest;
	this.stop = ajax_requestClose;
    
}

function ajax_queueRequest()
{
	this.isQueued = true;
	g_ajax.requestQueue.push(this);	
	return ajax_beginQueuedRequest();
}

function ajax_requestClose()
{
	if (null != this.transport && this.transport.readyState != ajax_statusComplete)
	{
		this.transport.abort();
	}
	if (null != this.requestTimer)
	{
		this.requestTimer.stop();
	}
	if (null != this.retryTimer)
	{
		this.retryTimer.stop();
	}

	ajax_removeRequest(this.requestID);	
	if (this.isQueued)
	{
		ajax_removeQueuedRequest(this.requestID);
	}
}

function ajax_processReadyState()
{
	if (null != this.onStatus)
	{
		this.onStatus(this);
	}	
	
	if (ajax_statusComplete == this.transport.readyState)
	{
		this.processEnd();
	}
}

function ajax_beginRequest()
{
	if (null != ajax_getRequest(this.requestID))
	{
		// already active
		return false;
	}
	
	this.transport = null;
	this.transport = ajax_createXmlHTTP();
	this.transport.onreadystatechange = this.responseHandler;
	
	ajax_addRequest(this);	
	if (null != this.onStart)
	{
		this.onStart(this);
	}
	
	if (null != this.postContent)
	{
		this.transport.open("POST", this.url, true);
	}	
	else
	{
		this.transport.open("GET", this.url, true);
	}
	this.transport.setRequestHeader(ajax_requestHeader, this.url);
	this.transport.send(this.postContent);
	
	if (null != this.requestTimer)
	{
		this.requestTimer.start();
	}
	
	return true;
}

function ajax_endRequest()
{	
	try
	{
		this.stop();
		
		var responseText = this.transport.responseText;
		var status = this.transport.status;
		var ajaxResponse = new ajax_response(this, status, responseText);
		
		if ("" == responseText || status >= 400)
		{
			if (this.processError(ajaxResponse))
			{
				this.transport = null;
				return;
			}
		}			
		else if (ajax_getXmlHTTPRequestHeader(this.transport) != this.url && this.acceptRedirects)
		{
			if (null != this.onRedirect)
			{
				this.onRedirect(ajaxResponse);
			}
		}						
		else if (200 == status)
		{
			if (null != this.onResponse)
			{
				this.onResponse(ajaxResponse);
			}			
		}
		
		delete ajaxResponse;
		this.transport = null;
	}
	catch(e)
	{
		// Eat all async exceptions
	}

	if (this.isQueued)
	{
		g_ajax.activeQueuedRequestCount--;	
		ajax_beginQueuedRequest();
	}
}

function ajax_processError(ajaxResponse)
{
	if (null != this.onResponseError)
	{
		this.onResponseError(ajaxResponse);
	}			

	if (null != this.retryTimer && this.retryCount > 0)
	{
		ajax_addRequest(this);
		this.retryTimer.start();
		return true;
	}
	
	return false;
}

function ajax_processTimeout()
{
	if (null != this.transport && ajax_statusComplete == this.transport.readyState)
	{
		return;
	}	

	if (null != this.onRequestTimeout)
	{
		this.onRequestTimeout(this);
	}
	else
	{
		this.stop();
		this.processError(new ajax_response(ajaxRequest, 408, "Request Timed out. Please try again."));
	}
}

function ajax_processRetryTimeout()
{
	this.stop();	
	this.retryCount--;
	this.send();
}

function ajax_beginQueuedRequest()
{	
	if (g_ajax.requestQueue.length > 0 && 0 == g_ajax.activeQueuedRequestCount)
	{
		ajaxRequest = g_ajax.requestQueue.shift();
		g_ajax.activeQueuedRequestCount++;
		if (!ajaxRequest.send())
		{
			g_ajax.activeQueuedRequestCount--;
		}
		return true;
	}
	
	return false;
}

function ajax_removeQueuedRequest(requestID)
{
	var i;
	for (i = 0; i < g_ajax.requestQueue.length; ++i)
	{
		if (g_ajax.requestQueue[i].requestID == requestID)
		{
			g_ajax.requestQueue.splice(i, 1);
		}
	}	
}

function processAjaxResponse(requestID)
{
	var request = ajax_getRequest(requestID);
	if (null != request)
	{
		request.processReadyState();		
	}
}

// A response to an ajax request
function ajax_response(ajaxRequest, status, responseText)
{
	this.request = ajaxRequest;
	this.status = status;
	this.responseText = responseText;
}

function ajax_requestTimeoutCallback(requestID)
{
	var ajaxRequest = ajax_getRequest(requestID);
	if (null != ajaxRequest)
	{
		ajaxRequest.processTimeout();
	}	
}

// Great for loading parts using timers
function ajax_retryLoadTimerCallback(requestID)
{
	var ajaxRequest = ajax_getRequest(requestID);
	if (null != ajaxRequest)
	{
		ajaxRequest.processRetryTimeout();
	}
}

function ajax_createRequestTimer(timeout, ajaxRequest)
{
	return new ajax_timer(timeout, "ajax_requestTimeoutCallback(\"" + ajaxRequest.requestID + "\")");
}

function ajax_createRetryTimer(retryInterval, ajaxRequest)
{
	return new ajax_timer(retryInterval, "ajax_retryLoadTimerCallback(\"" + ajaxRequest.requestID + "\")");
}

/*
	AJAX DHTML HELPERS
*/

var ajax_dhtmlNodeState_Null = "";
var ajax_dhtmlNodeState_Loading = "loading";
var ajax_dhtmlNodeState_LoadError = "loadError";
var ajax_dhtmlNodeState_Loaded = "loaded";

function ajax_dhtmlOnResponse(ajaxResponse)
{
	var node = ajaxResponse.request.node;	
	node.loadState = ajax_dhtmlNodeState_Loaded;
	node.innerHTML = ajaxResponse.responseText;
}

function ajax_dhtmlOnError(ajaxResponse)
{
	var node = ajaxResponse.request.node;	

	node.loadState = ajax_dhtmlNodeState_LoadError;

	var ajaxRequest = ajaxResponse.request;
	errorMsg = "Error loading data.";
	if (null != ajaxRequest.retryTimer && ajaxRequest.retryCount > 0)
	{
		errorMsg = errorMsg + " Retrying in " + ajaxRequest.retryTimer.timeout/1000 + " seconds.";
	}
	else
	{
		errorMsg = errorMsg + " Please try again.";
	}
	node.innerHTML = errorMsg;
}

function ajax_dhtmlOnRedirect(ajaxResponse)
{
	ajaxResponse.request.node.loadState = ajax_dhtmlNodeState_LoadError;
	window.location.reload(true);
}

function ajax_dhtmlOnStart_Loading(ajaxRequest)
{
	ajaxRequest.node.loadState = ajax_dhtmlNodeState_Loading;
	return true;
}

function ajax_dhtmlShowLoadingImg(ajaxRequest)
{
	ajaxRequest.node.loadState = ajax_dhtmlNodeState_Loading;
	ajaxRequest.node.innerHTML = "<img SRC=\"/images/loading.gif\">";
	return true;
}

// If the given node isn't loaded, creates a request that you can use to load..
function ajax_dhtmlCreateGetPartRequest(node, url, retryInterval)
{
	if (null == url)
	{
		if ("" == (url = node.getAttribute("href")))
		{
			return null;
		}
	}	
	
	var request = new ajax_request(node.id, url, 1000, retryInterval);	
	node.loadState = ajax_dhtmlNodeState_Null;
	request.node = node;
	request.onStart = ajax_dhtmlOnStart_Loading;
	// We use the request timeout functionality to set our downloading image...
	// If we took more than 1 second, we'll show the downloading gif
	request.onRequestTimeout = ajax_dhtmlShowLoadingImg;
	request.onResponse = ajax_dhtmlOnResponse;
	request.onResponseError = ajax_dhtmlOnError;
	request.onRedirect = ajax_dhtmlOnRedirect;

	return request;
}

function ajax_dhtmlGetPartLoadState(node)
{
	var state = node.loadState;
	return (null != state) ? state : ajax_dhtmlNodeState_Null;
}

function ajax_dhtmlIsPartLoaded(node)
{
	return (ajax_dhtmlNodeState_Loaded == ajax_dhtmlGetPartLoadState(node));
}

function ajax_submitCallbackRequest(url, retryInterval, requestTimeout, callbackFunction, errorFunction, timeoutFunction)
{
    var id = ajax_requestNextID();
	var request = new ajax_request(id, url, requestTimeout, retryInterval);	
	request.onRequestTimeout = timeoutFunction;
	request.onResponse = callbackFunction;
	request.onResponseError = errorFunction;
	request.queue();
	return request;


}


function ajax_dhtmlEnsurePartLoaded(node, url, retryInterval)
{
	if (null == node)
	{
		return;
	}
	
	var requestID = node.id;	
	if (ajax_dhtmlNodeState_Null != ajax_dhtmlGetPartLoadState(node) || null != ajax_getRequest(requestID))
	{
		// Already in progress or already loaded	
		return;	
	}
	
	var request = ajax_dhtmlCreateGetPartRequest(node, url, retryInterval);
	if (null != request && !request.queue())
	{
		// We had to queue the request. Immediately show the waiting icon
		ajax_dhtmlShowLoadingImg(request);
	}
}

function setItemDisplay(item, displayStyle)
{
	if (null != item)
	{
		item.style.display= displayStyle;
	}
}
