/* Dynamic External Content Loading */

var _dynoLoader = new DynoLoader();

function DynoLoader()
{
	/* Properties */
	this._isBusy = false;
	this._url = null;
	this._targetContainer = null;
	this._callback = null;
	this._callbackArguments = null;
	this._request = null;
	this._responseCache = new Object();
	this._isCaching = true;
	
	/* Methods */
	this._loadXmlDocument = function(url, target, callback, callbackArgs, cache)
	{
		if(this._loadXmlDocument.arguments.length == 5)
			this._isCaching = cache;

		if(this._isCaching && this._responseCache[url])
		{
			if(target)
				this._renderDocument(target, this._responseCache[url].responseText);
		
			if(callback)
			{
				if(target)
					callback(callbackArgs);
				else
					callback(this._responseCache[url], callbackArgs);
			}
			
			return;
		}
		
		if(!this._isBusy)
		{
			this._isBusy = true;
			this._url = url;
			this._targetContainer = target;
			this._callback = callback;
			this._callbackArguments = callbackArgs;
			this._request = this._getRequestObject();
			this._request.onreadystatechange = _onRequestStateChange;
			
			/* FIXME*** - Look this up in some reference */
			this._request.open("GET", url, true);
			this._request.send(null);
		}
	};
	
	this._getRequestObject = function()
	{
		var req = null;
		
		if(window.XMLHttpRequest)
		{
    		try
    		{
				req = new XMLHttpRequest();
			} catch(ex) {
				/* FIXME*** - Redirect to a special error page */
			}
		} else if(window.ActiveXObject) {
       		try
       		{
        		req = new ActiveXObject("Msxml2.XMLHTTP");
      		} catch(ex) {
        		try
        		{
          			req = new ActiveXObject("Microsoft.XMLHTTP");
        		} catch(ex) {
          			/* FIXME*** - Redirect to a special error page */
        		}
			}
		}
		
		return req;
	};
	
	this._renderDocument = function(target, html)
	{
		/* FIXME*** - Find better way to load document */
		target.innerHTML = html;
	}
}

function _onRequestStateChange()
{
	if(_dynoLoader._request.readyState == 4)
	{
		if(_dynoLoader._request.status == 200)
		{
			if(_dynoLoader._isCaching)
				_dynoLoader._responseCache[_dynoLoader._url] = _dynoLoader._request;
			
			if(_dynoLoader._targetContainer)
				_dynoLoader._renderDocument(_dynoLoader._targetContainer, 
					_dynoLoader._request.responseText);
			
			if(_dynoLoader._callback)
			{
				if(_dynoLoader._targetContainer)
					_dynoLoader._callback(_dynoLoader._callbackArguments);
				else
					_dynoLoader._callback(_dynoLoader._request, _dynoLoader._callbackArguments);
			}
		} else {
			/* FIXME*** - Display special error dialog */
		}
		
		_dynoLoader._isBusy = false;
	}
}