/* Simple AJAX Code-Kit (SACK) v1.6.1 */
/* Œ2005 Gregory Wild-Smith */
/* www.twilightuniverse.com */
/* Software licenced under a modified X11 licence,
   see documentation or authors website for more details */

/* Compatibility with IE 5.0 */
if( typeof( encodeURIComponent ) == 'undefined' )
{
	encodeURIComponent = function( uri )
	{
		return ( escape( uri ) );
	}
}

function sack( file )
{
	this.xmlhttp   = null;

	this.resetData = function( )
	{
		this.method               = 'POST';
		this.queryStringSeparator = '?';
		this.argumentSeparator    = '&';
		this.URLString            = '';
		this.encodeURIString      = true;
 		this.execute              = false;
 		this.element              = null;
		this.elementObj           = null;
		this.requestFile          = file;
		this.vars                 = new Object( );
		this.responseStatus       = new Array( 2 );
  };

	this.resetFunctions = function( )
	{
  	this.onLoading     = function( ) { };
  	this.onLoaded      = function( ) { };
  	this.onInteractive = function( ) { };
  	this.onCompletion  = function( ) { };
  	this.onError       = function( ) { };
  	this.onFail        = function( ) { };
	};

	this.reset = function( )
	{
		this.resetFunctions( );
		this.resetData( );
	};

	this.createAJAX = function( )
	{
		try
		{
			this.xmlhttp = new ActiveXObject( 'Msxml2.XMLHTTP' );
		}
		catch( e1 )
		{
			try
			{
				this.xmlhttp = new ActiveXObject( 'Microsoft.XMLHTTP' );
			}
			catch( e2 )
			{
				this.xmlhttp = null;
			}
		}

		if( ! this.xmlhttp )
		{
			if( typeof XMLHttpRequest != 'undefined' )
			{
				this.xmlhttp = new XMLHttpRequest( );
			}
			else
			{
				this.failed = true;
			}
		}
	};

	this.setVar = function( name, value )
	{
		this.vars[ name ] = Array( value, false );
	};

	this.encVar = function( name, value, returnvars )
	{
		if( true == returnvars )
		{
			return Array( encodeURIComponent( name ), encodeURIComponent( value ) );
		}
		else
		{
			this.vars[ encodeURIComponent( name ) ] = Array( encodeURIComponent( value ), true );
		}
	}

	this.processURLString = function( string, encode )
	{
		encoded  = encodeURIComponent( this.argumentSeparator );
		regexp   = new RegExp( this.argumentSeparator + '|' + encoded );
		varArray = string.split( regexp );

		for( var i = 0, tmpLen = varArray.length; i < tmpLen; i++ )
		{
			urlVars = varArray[ i ].split( '=' );
			if( true == encode )
			{
				this.encVar( urlVars[ 0 ], urlVars[ 1 ] );
			}
			else
			{
				this.setVar( urlVars[ 0 ], urlVars[ 1 ] );
			}
		}
	}

	this.createURLString = function( urlstring )
	{
		if( this.encodeURIString && this.URLString.length )
		{
			this.processURLString( this.URLString, true );
		}

		if( urlstring )
		{
			this.URLString += ( this.URLString.length ? this.argumentSeparator : '' ) + urlstring;
		}

		// prevents caching of URLString
		this.setVar( 'rndval', new Date( ).getTime( ) );

		urlstringtemp = [ ];
		for( key in this.vars )
		{
			if( false == this.vars[ key ][ 1 ] && true == this.encodeURIString )
			{
				encoded                  = this.encVar( key, this.vars[ key ][ 0 ], true );
				delete this.vars[ key ];
				this.vars[encoded[ 0 ] ] = Array( encoded[ 1 ], true );
				key                      = encoded[ 0 ];
			}

			urlstringtemp[ urlstringtemp.length ] = key + '=' + this.vars[ key ][ 0 ];
		}

		this.URLString += ( urlstring ? this.argumentSeparator : '' ) + urlstringtemp.join( this.argumentSeparator );
	}

	this.runResponse = function( )
	{
		eval( this.response );
	}

	this.runAJAX = function( urlstring )
	{
		if( this.failed )
		{
			this.onFail( );
		}
		else
		{
			this.createURLString( urlstring );
			if( this.element )
			{
				this.elementObj = $( this.element );
			}

			if( this.xmlhttp )
			{
				var self = this;

				if( this.method == 'GET' )
				{
					totalurlstring = this.requestFile + this.queryStringSeparator + this.URLString;
					this.xmlhttp.open( this.method, totalurlstring, true );
				}
				else
				{
					this.xmlhttp.open( this.method, this.requestFile, true );

					try
					{
						this.xmlhttp.setRequestHeader( 'Content-Type', 'application/x-www-form-urlencoded' )
					}
					catch( e ) { }
				}

				this.xmlhttp.onreadystatechange = function( )
				{
					switch( self.xmlhttp.readyState )
					{
						case 1:
							self.onLoading( );
							break;

						case 2:
							self.onLoaded( );
							break;

						case 3:
							self.onInteractive( );
							break;

						case 4:
							self.response            = self.xmlhttp.responseText;
							self.responseXML         = self.xmlhttp.responseXML;
							self.responseStatus[ 0 ] = self.xmlhttp.status;
							self.responseStatus[ 1 ] = self.xmlhttp.statusText;

							if( self.execute )
							{
								self.runResponse( );
							}

							if( self.elementObj )
							{
								elemNodeName = self.elementObj.nodeName;
								elemNodeName.toLowerCase( );
								if( elemNodeName == 'input'
								|| elemNodeName == 'select'
								|| elemNodeName == 'option'
								|| elemNodeName == 'textarea' )
								{
									self.elementObj.value = self.response;
								}
								else
								{
									self.elementObj.innerHTML = self.response;
								}
							}
							if( self.responseStatus[ 0 ] == '200' )
							{
								self.onCompletion( );
							}
							else
							{
								self.onError( );
							}

							self.URLString = '';
							break;
					}
				};

				this.xmlhttp.send( this.URLString );
			}
		}
	};

	this.reset( );
	this.createAJAX( );
}

var ajaxSettings = [];

function getSettingsAjax( page )
{
	var index                          = ajaxSettings.length;
	ajaxSettings[ index ]              = new sack( );
	ajaxSettings[ index ].requestFile  = page;
	ajaxSettings[ index ].onCompletion = function( ){ setSettingsAjax( index ) };
	ajaxSettings[ index ].runAJAX( );
}

function setSettingsAjax( code2Execute )
{
	eval( ajaxSettings[ code2Execute ].response );
}
