/*======================================================================*\
|| #################################################################### ||
|| #  				  Imperial Bulletin Board v1.x                    # ||
|| # ---------------------------------------------------------------- # ||
|| #  For license, version and changelog questions or concerns,       # ||
|| #  navigate to the docs/ folder or visit the forums at the		  # ||
|| #  website, http://www.imperialbb.com/forums. with your questions. # ||
|| # ---------------------------------------------------------------- # ||
|| # Name: js_ajax.js                                                 # ||
|| # ---------------------------------------------------------------- # ||
|| #               "Copyright(c) 2007 The iBB Group"                  # ||
|| # ---------------------------------------------------------------- # ||
|| #################################################################### ||
\*======================================================================*/

var AJAX_GET 	  = 0;
var AJAX_POST 	  = 1;
var AJAX_MODE_TXT = 0;
var AJAX_MODE_XML = 1;

function ibb_ajax ( )
{
	var self 	  = this;
	this.allowuse = false;

	this.xmlhttp = function ( )
	{
		try
		{
			self.httpRequest = new XMLHttpRequest ( );
			this.allowuse = true;
		}
		catch ( e )
		{
			try
			{
				self.httpRequest = new ActiveXObject ( "Msxml2.XMLHTTP" );
				this.allowuse = true;
			}
			catch ( e )
			{
				var success = false;
				var MSXML_XMLHTTP_PROGIDS = new Array ( 'Microsoft.XMLHTTP', 'MSXML2.XMLHTTP', 'MSXML2.XMLHTTP.5.0', 'MSXML2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0' );
				for ( var i = 0; i < MSXML_XMLHTTP_PROGIDS.length && !success; i++ )
				{
					try
					{
						self.httpRequest = new ActiveXObject ( MSXML_XMLHTTP_PROGIDS[ i ] );
						success = true;
						this.allowuse = true;
					}
					catch ( e )
					{
						this.allowuse 	 = false;
						self.httpRequest = null;
					}
				}
			}
		}
		return ( self.httpRequest );
	};

	this.set_arg = function ( type, name, value )
	{
		self.args[ type ].push ( new Array ( name, escape ( value ) ) );
	};

	this.send = function ( url, mode )
	{
		self.mode = mode;
		if ( ( typeof self.httpRequest.abort ) != "undefined" && self.httpRequest.readyState != 0 )
		{
			self.httpRequest.abort ( );
		}
		self.httpRequest.onreadystatechange = self.callback;
		requestType = "GET";
		var urlGet = ( ( url.indexOf ( "?" ) != -1 ) ? "&" : "?" );
		for ( var key in self.args[ AJAX_GET ] )
		{
			urlGet += self.args[ AJAX_GET ][ key ][ 0 ]+"="+self.args[ AJAX_GET ][ key ][ 1 ]+"&";
		}
		var urlPost = "";
		for ( key in self.args[ AJAX_POST ] )
		{
			requestType = "POST";
			urlPost += self.args[ AJAX_POST ][ key ][ 0 ]+"="+self.args[ AJAX_POST ][ key ][ 1 ]+"&";
		}
		self.httpRequest.open ( requestType, url+urlGet, true );
		if ( typeof ( self.httpRequest.setRequestHeader ) != "undefined" )
		{
			if ( mode == AJAX_MODE_XML && typeof ( self.httpRequest.overrideMimeType ) == "function" )
			{
				self.httpRequest.overrideMimeType ( 'text/xml' );
			}
			self.httpRequest.setRequestHeader ( 'Content-Type', 'application/x-www-form-urlencoded' );
		}
		self.httpRequest.send ( urlPost );
		return ( true );
	};

	this.callback = function ( )
	{
		if ( ( self.httpRequest.readyState == 4 && self.httpRequest.status == 200 ) || ( self.httpRequest.readyState == 4 && self.httpRequest.status == 0 ) )
		{
			if ( self.onload )
			{
				switch ( self.mode )
				{
					case AJAX_MODE_TXT :
						self.onload ( self.httpRequest.responseText );
					break;
	                    
					case AJAX_MODE_XML :
						self.onload ( self.normalize_whitespace ( self.httpRequest.responseXML ) );
					break;
				}
			}
		}
		else if ( self.httpRequest.readyState == 3 )
		{
			if ( self.onprogress && !document.all )
			{
				var contentLength = 0;
				try
				{
					contentLength = self.httpRequest.getResponseHeader ( "Content-Length" );
				}
				catch ( e )
				{
					contentLength = -1;
				}
				self.onprogress ( self.httpRequest.responseText.length, contentLength );
			}

		}
		else if ( self.httpRequest.readyState == 4 )
		{
			if ( self.onfail )
			{
				self.onfail ( self.httpRequest.status );
			}
			else
			{
				throw new Error ( "The HTTP request has failed with the status "+self.httpRequest.status+"\nResponse received : "+self.httpRequest.responseText );
			}
		}
	};

	this.normalize_whitespace = function ( domObj )
	{
		if ( document.createTreeWalker )
		{
			var filter = {
				acceptNode: function ( node )
				{
					if ( /\S/.test ( node.nodeValue ) )
					{
						return NodeFilter.FILTER_SKIP;
					}
					return NodeFilter.FILTER_ACCEPT;
				}
			}
			if ( !IBB.is_saf )
			{
				var treeWalker = document.createTreeWalker ( domObj, NodeFilter.SHOW_TEXT, filter, true );
				while ( treeWalker.nextNode ( ) )
				{
					treeWalker.currentNode.parentNode.removeChild ( treeWalker.currentNode );
					treeWalker.currentNode = domObj;
				}
			}
			return ( domObj );
		}
		else
		{
			return ( domObj );
		}
	};

	this.ajax_enabled = function ( )
	{
		var ret = 0;
		if ( !this.xmlhttp ( ) )
		{
			ret = 0;
		}
		else
		{
			ret = 1;
		}
		return ( ret );
	};

	self.args 			 	= new Array ( );
	self.args[ AJAX_GET ]  	= new Array ( );
	self.args[ AJAX_POST ] 	= new Array ( );
	self.httpRequest 	 	= null;
	self.mode 			 	= AJAX_MODE_TXT;
	self.onload 		 	= null;
	self.onfail			 	= null;
	if ( !this.xmlhttp ( ) )
	{
		throw new Error ( "Unable to load ajax object ( XMLHttpRequest )" );
	};
};

/*======================================================================*\
|| #################################################################### ||
|| #                "Copyright(c) 2007 The iBB Group"                 # ||
|| #################################################################### ||
\*======================================================================*/