/**
*   @version $Id: advajax.js 105 2007-03-27 08:24:47Z piotrj $
*/

/**
*	AdvancedAJAX 1.1.2
*	(c) 2005-2006 Lukasz Lach
*	mail: anakin@php5.pl
*	www:	http://advajax.anakin.us/
*			http://anakin.us/
*	http://creativecommons.org/licenses/LGPL/2.1/
*/

function advAJAX()
{
    var obj = new Object();
    obj.url = window.location.href;
    obj.method = "GET";
    obj.parameters = new Object();
    obj.jsonParameters = new Object();
    obj.headers = new Object();
    obj.async = true;
    obj.mimeType = "text/xml";
    obj.username = null;
    obj.password = null;
    obj.form = null;
    obj.disableForm = true;
    obj.unique = true;
    obj.uniqueParameter = "_uniqid";
    obj.requestDone = false;
    obj.queryString = "";
    obj.responseText = null;
    obj.responseXML = null;
    obj.status = null;
    obj.statusText = null;
    obj.aborted = false;
    obj.timeout = 0;
    obj.retryCount = 0;
    obj.retryDelay = 1000;
    obj.tag = null;
    obj.group = null;
    obj.progressTimerInterval = 50;
    obj.xmlHttpRequest = null;
    obj.onInitialization = null;
    obj.onFinalization = null;
    obj.onReadyStateChange = null;
    obj.onLoading = null;
    obj.onLoaded = null;
    obj.onInteractive = null;
    obj.onComplete = null;
    obj.onProgress = null;
    obj.onSuccess = null;
    obj.onFatalError = null;
    obj.onError = null;
    obj.onTimeout = null;
    obj.onRetryDelay = null;
    obj.onRetry = null;
    obj.onGroupEnter = null;
    obj.onGroupLeave = null;
    obj.createXmlHttpRequest = function()
		{
			if( typeof XMLHttpRequest != "undefined" )
			{
				return new XMLHttpRequest();
			}
			var xhrVersion = [ "MSXML2.XMLHttp.5.0", "MSXML2.XMLHttp.4.0", "MSXML2.XMLHttp.3.0", "MSXML2.XMLHttp", "Microsoft.XMLHttp" ];
			for( var i = 0; i < xhrVersion.length; i++ )
			{
				try
				{
					var xhrObj = new ActiveXObject( xhrVersion[i] );
					return xhrObj;
				}
				catch( e )
				{}
        }
        obj.raiseEvent( "FatalError" );
        return null;
    };
    obj._oldResponseLength = null;
    obj._progressTimer = null;
    obj._progressStarted = navigator.userAgent.indexOf( 'Opera' ) == -1;
    obj._onProgress = function()
		{
			if( ( typeof obj.onProgress == "function" ) && ( typeof obj.xmlHttpRequest.getResponseHeader == "function" ) )
			{
				var contentLength = obj.xmlHttpRequest.getResponseHeader( "Content-length" );
				if( ( contentLength != null ) && ( contentLength != '' ) )
				{
					var responseLength = obj.xmlHttpRequest.responseText.length;
					if( responseLength != obj._oldResponseLength )
					{
						obj.raiseEvent( "Progress", obj, responseLength, contentLength );
						obj._oldResponseLength = obj.xmlHttpRequest.responseText.length;
					}
				}
			}
			if( obj._progressStarted ) return;
			obj._progressStarted = true;
			var _obj = this;
			this.__onProgress = function()
				{
					obj._onProgress();
					obj._progressTimer = window.setTimeout( _obj.__onProgress, obj.progressTimerInterval );
				}
			_obj.__onProgress();
		}
    obj._onInitializationHandled = false;
    obj._initObject = function()
		{
			if( obj.xmlHttpRequest != null )
			{
				delete obj.xmlHttpRequest[ "onreadystatechange" ];
				obj.xmlHttpRequest = null;
			}
			if( ( obj.xmlHttpRequest = obj.createXmlHttpRequest() ) == null ) return null;
			if( typeof obj.xmlHttpRequest.overrideMimeType != "undefined" )
			{
				obj.xmlHttpRequest.overrideMimeType( obj.mimeType );
			}
			obj.xmlHttpRequest.onreadystatechange = function()
				{
					if( ( obj == null ) || ( obj.xmlHttpRequest == null ) ) return;
					obj.raiseEvent( "ReadyStateChange", obj, obj.xmlHttpRequest.readyState );
					obj._onProgress();
					switch( obj.xmlHttpRequest.readyState )
					{
						case 1:
							obj._onLoading();
							break;
						case 2:
							obj._onLoaded();
							break;
						case 3:
							obj._onInteractive();
							break;
						case 4:
							obj._onComplete();
							break;
					}
				};
			obj._onLoadingHandled =
            obj._onLoadedHandled =
            obj._onInteractiveHandled =
            obj._onCompleteHandled = false;
		};
    obj._onLoading = function()
		{
			if( obj._onLoadingHandled ) return;
			if( !obj._retry && ( obj.group != null ) )
			{
				if( typeof advAJAX._groupData[obj.group] == "undefined" )
				{
					advAJAX._groupData[obj.group] = 0;
				}
				advAJAX._groupData[obj.group]++;
				if( ( typeof obj.onGroupEnter == "function" ) && ( advAJAX._groupData[obj.group] == 1 ) )
				{
					obj.onGroupEnter( obj );
				}
			}
			obj.raiseEvent( "Loading", obj );
			obj._onLoadingHandled = true;
		};
    obj._onLoaded = function()
		{
			if( obj._onLoadedHandled ) return;
			obj.raiseEvent( "Loaded", obj );
			obj._onLoadedHandled = true;
		};
    obj._onInteractive = function()
		{
			if( obj._onInteractiveHandled ) return;
			obj.raiseEvent( "Interactive", obj );
			obj._onInteractiveHandled = true;
			if( !obj._progressStarted )
			{
				obj._onProgress();
			}
		};
    obj._onComplete = function()
		{
			if( obj._onCompleteHandled || obj.aborted ) return;
			if( obj._progressStarted )
			{
				window.clearInterval( obj._progressTimer );
				obj._progressStarted = false;
			}
			obj.requestDone = true;
			with( obj.xmlHttpRequest )
			{
				obj.responseText = responseText;
				obj.responseXML = responseXML;
				if( typeof status != "undefined" )
				{
					obj.status = status;
				}
				if( typeof statusText != "undefined" )
				{
					obj.statusText = statusText;
				}
			}
			obj.raiseEvent( "Complete", obj );
			obj._onCompleteHandled = true;
			if( obj.status == 200 )
			{
				obj.raiseEvent( "Success", obj );
			}
			else
			{
				obj.raiseEvent( "Error", obj );
			}
			delete obj.xmlHttpRequest[ 'onreadystatechange' ];
			obj.xmlHttpRequest = null;
			if( obj.disableForm )
			{
				obj.switchForm( true );
			}
			obj._groupLeave();
			obj.raiseEvent( "Finalization", obj );
		};
    obj._groupLeave = function()
		{
			if( obj.group != null )
			{
				advAJAX._groupData[obj.group]--;
				if( advAJAX._groupData[obj.group] == 0 )
				{
					obj.raiseEvent( "GroupLeave", obj );
				}
			}
		};
    obj._retry = false;
    obj._retryNo = 0;
    obj._onTimeout = function()
		{
			if( ( obj == null ) || ( obj.xmlHttpRequest == null ) || ( obj._onCompleteHandled ) ) return;
			obj.aborted = true;
			obj.xmlHttpRequest.abort();
			obj.raiseEvent( "Timeout", obj );
			obj._retry = true;
			if( obj._retryNo != obj.retryCount )
			{
				obj._initObject();
				if( obj.retryDelay > 0 )
				{
					obj.raiseEvent( "RetryDelay", obj );
					startTime = new Date().getTime();
					while( ( new Date().getTime() - startTime ) < obj.retryDelay );
				}
				obj._retryNo++;
				obj.raiseEvent( "Retry", obj, obj._retryNo );
				obj.run();
			}
			else
			{
				delete obj.xmlHttpRequest[ "onreadystatechange" ];
				obj.xmlHttpRequest = null;
				if( obj.disableForm )
				{
					obj.switchForm( true );
				}
				obj._groupLeave();
				obj.raiseEvent( "Finalization", obj );
			}
		};
    obj.run = function()
		{
			obj._initObject();
			if( obj.xmlHttpRequest == null ) return false;
			obj.aborted = false;
			if( !obj._onInitializationHandled )
			{
				obj.raiseEvent( "Initialization", obj );
				obj._onInitializationHandled = true;
			}
			if( ( obj.method == "GET" ) && obj.unique )
			{
				obj.parameters[encodeURIComponent( obj.uniqueParameter )] = new Date().getTime().toString().substr(5) + Math.floor( Math.random() * 100 ).toString();
			}
			if( !obj._retry )
			{
				for( var a in obj.parameters )
				{
					if( obj.queryString.length > 0 )
					{
						obj.queryString += "&";
					}
					if( typeof obj.parameters[a] != "object" )
					{
						obj.queryString += encodeURIComponent( a ) + "=" + encodeURIComponent( obj.parameters[a] );
					}
					else
					{
						for( var i = 0; i < obj.parameters[a].length; i++ )
						{
							obj.queryString += encodeURIComponent( a ) + "=" + encodeURIComponent( obj.parameters[a][i] ) + "&";
						}
						obj.queryString = obj.queryString.slice( 0, -1 );
					}
				}
				for( var a in obj.jsonParameters )
				{
					var useJson = typeof [].toJSONString == 'function';
					if( obj.queryString.length > 0 )
					{
						obj.queryString += "&";
					}
					obj.queryString += encodeURIComponent(a) + "=";
					if( useJson )
					{
						obj.queryString += encodeURIComponent( obj.jsonParameters[a].toJSONString() );
					}
					else
					{
						obj.queryString += encodeURIComponent( obj.jsonParameters[a] );
					}
				}
				if( ( obj.method == "GET" ) && ( obj.queryString.length > 0 ) )
				{
					obj.url += ( obj.url.indexOf( "?" ) != -1 ? "&" : "?" ) + obj.queryString;
				}
			}
			if( obj.disableForm )
			{
				obj.switchForm( false );
			}
			try
			{
				obj.xmlHttpRequest.open( obj.method, obj.url, obj.async, obj.username || '', obj.password || '' );
			}
			catch( e )
			{
				obj.raiseEvent( "FatalError", obj, e );
				return;
			}
			if( obj.timeout > 0 )
			{
				setTimeout( obj._onTimeout, obj.timeout );
			}
			if( typeof obj.xmlHttpRequest.setRequestHeader != "undefined" )
			{
				for( var a in obj.headers )
				{
					obj.xmlHttpRequest.setRequestHeader( encodeURIComponent( a ), encodeURIComponent( obj.headers[a] ) );
				}
			}
			if( ( obj.method == "POST" ) && ( typeof obj.xmlHttpRequest.setRequestHeader != "undefined" ) )
			{
				obj.xmlHttpRequest.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );
				obj.xmlHttpRequest.send( obj.queryString );
			}
			else if( obj.method == "GET" )
			{
				obj.xmlHttpRequest.send( '' );
			}
		};

    obj.handleArguments = function( args )
		{
			if( ( typeof args.form == "object" ) && ( args.form != null ) )
			{
				obj.form = args.form;
				obj.appendForm();
			}
			for( a in args )
			{
				if( typeof obj[a] == "undefined" )
				{
					obj.parameters[a] = args[a];
				}
				else
				{
					if( ( a != "parameters" ) && ( a != "headers" ) )
					{
						obj[a] = args[a];
					}
					else
					{
						for( b in args[a] )
                        obj[a][b] = args[a][b];
					}
				}
			}
			obj.method = obj.method.toUpperCase();
		};
    obj.switchForm = function( enable )
		{
			if( ( typeof obj.form != "object" ) || ( obj.form == null ) ) return;
			with( obj.form )
			{
				for( var nr = 0; nr < elements.length; nr++ )
				{
					if( !enable )
					{
						if( elements[nr]["disabled"] )
						{
							elements[nr]["_disabled"] = true;
						}
						else
						{
							elements[nr]["disabled"] = "disabled";
						}
					}
					else
					{
						if( typeof elements[nr]["_disabled"] == "undefined" )
						{
							elements[nr].removeAttribute( "disabled" );
						}
					}
				}
			}
		};
    obj.appendForm = function()
		{
			with( obj.form )
			{
				obj.method = getAttribute( "method" ).toUpperCase();
				obj.url = getAttribute( "action" );
				for( var nr = 0; nr < elements.length; nr++ )
				{
					var e = elements[nr];
					if( e.disabled ) continue;
					switch( e.type )
					{
						case "text":
						case "password":
						case "hidden":
						case "textarea":
							obj.addParameter( e.name, e.value );
							break;
						case "select-one":
							if( e.selectedIndex >= 0 )
							{
								obj.addParameter( e.name, e.options[e.selectedIndex].value );
							}
							break;
						case "select-multiple":
							for( var nr2 = 0; nr2 < e.options.length; nr2++ )
							{
								if( e.options[nr2].selected )
								{
									obj.addParameter( e.name, e.options[nr2].value );
								}
							}
							break;
						case "checkbox":
						case "radio":
							if( e.checked )
							{
								obj.addParameter( e.name, e.value );
							}
							break;
					}
				}
			}
		};
    obj.addParameter = function( name, value )
		{
			if( typeof obj.parameters[name] == "undefined" )
			{
				obj.parameters[name] = value;
			}
			else if( typeof obj.parameters[name] != "object" )
			{
				obj.parameters[name] = [obj.parameters[name], value];
			}
			else
			{
				obj.parameters[name][obj.parameters[name].length] = value;
			}
		};
    obj.delParameter = function( name )
		{
			delete obj.parameters[name];
		};
    obj.raiseEvent = function( name )
		{
			var args = [];
			for( var i = 1; i < arguments.length; i++ )
			{
				args.push( arguments[i] );
			}
			if( typeof obj["on" + name] == "function" )
			{
				obj["on" + name].apply( null, args );
			}
			if( name == "FatalError" )
			{
				obj.raiseEvent( "Finalization", obj );
			}
		}
    if( typeof advAJAX._defaultParameters != "undefined" )
	{
        obj.handleArguments( advAJAX._defaultParameters );
	}
    return obj;
}

advAJAX.get = function( args )
{
    return advAJAX.handleRequest( "GET", args );
};

advAJAX.post = function( args )
{
    return advAJAX.handleRequest( "POST", args );
};

advAJAX.head = function( args )
{
    return advAJAX.handleRequest( "HEAD", args );
};

advAJAX.submit = function( form, args )
{
    if( ( typeof args == "undefined" ) || ( args == null ) )
	{
        return -1;
	}
    if( ( typeof form != "object" ) || ( form == null ) )
	{
        return -2;
	}
    var request = new advAJAX();
    args["form"] = form;
    request.handleArguments( args );
    return request.run();
};

advAJAX.assign = function( form, args )
{
    if( ( typeof args == "undefined" ) || ( args == null ) )
	{
        return -1;
	}
    if( ( typeof form != "object" ) || ( form == null ) )
	{
        return -2;
	}
    if( typeof form["onsubmit"] == "function" )
	{
        form["_onsubmit"] = form["onsubmit"];
	}
    form["advajax_args"] = args;
    form["onsubmit"] = function()
		{
			if( ( typeof this["_onsubmit"] != "undefined" ) && ( this["_onsubmit"]() === false ) )
			{
				return false;
			}
			if( advAJAX.submit( this, this["advajax_args"] ) == false )
			{
				return true;
			}
			return false;
		}
    return true;
};

advAJAX.download = function( targetObj, url )
	{
		if( typeof targetObj == "string" )
		{
			targetObj = document.getElementById( targetObj );
		}
		if( !targetObj )
		{
			return -1;
		}
		advAJAX.get(
				{
					url: url,
					onSuccess : function( obj )
					{
						targetObj.innerHTML = obj.responseText;
					}
				}
			);
	};

advAJAX.scan = function()
	{
		var obj = document.getElementsByTagName( "a" );
		for( var i = 0; i < obj.length; )
		{
			if( ( obj[i].getAttribute( "rel" ) == "advancedajax" ) && ( obj[i].getAttribute( "href" ) !== null ) )
			{
				var url = obj[i].getAttribute( "href" );
				var div = document.createElement( "div" );
				div.innerHTML = obj[i].innerHTML;
				div.className = obj[i].className;
				var parent = obj[i].parentNode;
				parent.insertBefore( div, obj[i] );
				parent.removeChild( obj[i] );
				advAJAX.download( div, url );
			}
			else
			{
				i++;
			}
		}
	};

advAJAX.handleRequest = function( requestType, args )
	{
		if( ( typeof args == "undefined" ) || ( args == null ) )
		{
			return -1;
		}
		var request = new advAJAX();
		window.advajax_obj = request;
		request.method = requestType;
		request.handleArguments( args );
		return request.run();
	};

advAJAX._defaultParameters = new Object();

advAJAX.setDefaultParameters = function( args )
	{
		advAJAX._defaultParameters = new Object();
		for( a in args )
		{
			advAJAX._defaultParameters[a] = args[a];
		}
	};

advAJAX._groupData = new Object();
