/*
 * xhr.js - XMLHttpRequest helper class
 * (c) 2008 Jo-Philipp Wich
 * $Id: xhr.js 182 2008-12-18 16:15:53Z Jo-Philipp.Wich $
 * $HeadURL: svn://frontenddb/app_whitelabel_billigflieger/server/js/xhr.js $
 */

BAS_XHR = function()
{
	this.reinit = function()
	{
		if( window.XMLHttpRequest ) {
			this._xmlHttp = new XMLHttpRequest();
		}
		else if( window.ActiveXObject ) {
			this._xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
		}
		else {
			alert("xhr.js: XMLHttpRequest is not supported by this browser!");
		}
	}

	this.get = function(url,data,callback)
	{
		this.reinit();

		var xhr  = this._xmlHttp;
		var code = this._encode( data );

		url = 'http://' + location.hostname +
			( location.port ? ':' + location.port : '' ) + url;

		if( code )
			if( url.substr(url.length-1,1) == '&' )
				url += code;
			else
				url += '?' + code;

		xhr.open( 'GET', url, true );

		xhr.onreadystatechange = function()
		{
			if( xhr.readyState == 4 ) {
				callback( xhr );
			}
		}

		xhr.send( null );
	}

	this.post = function(url,data,callback)
	{
		this.reinit();

		var xhr  = this._xmlHttp;
		var code = this._encode( data );

		xhr.onreadystatechange = function()
		{
			if( xhr.readyState == 4 )
				callback( xhr );
		}

		xhr.open( 'POST', url, true );
		xhr.setRequestHeader( 'Content-type', 'application/x-www-form-urlencoded' );
		xhr.setRequestHeader( 'Content-length', code.length );
		xhr.setRequestHeader( 'Connection', 'close' );
		xhr.send( code );
	}

	this.cancel = function()
	{
		this._xmlHttp.onreadystatechange = function(){};
		this._xmlHttp.abort();
	}

	this.send_form = function(form,callback,extra_values)
	{
		var code = '';

		for( var i = 0; i < form.elements.length; i++ )
		{
			var e = form.elements[i];

			if( e.options )
			{
				code += ( code ? '&' : '' ) +
					form.elements[i].name + '=' + encodeURIComponent(
						e.options[e.selectedIndex].value
					);
			}
			else if( e.length )
			{
				for( var j = 0; j < e.length; j++ )
					if( e[j].name ) {
						code += ( code ? '&' : '' ) +
							e[j].name + '=' + encodeURIComponent( e[j].value );
					}
			}
			else
			{
				code += ( code ? '&' : '' ) +
					e.name + '=' + encodeURIComponent( e.value );
			}
		}

		if( typeof extra_values == 'object' )
			for( var key in extra_values )
				code += ( code ? '&' : '' ) +
					key + '=' + encodeURIComponent( extra_values[key] );

		return(
			( form.method == 'get' )
				? this.get( form.getAttribute('action'), code, callback )
				: this.post( form.getAttribute('action'), code, callback )
		);
	}

	this._encode = function(obj)
	{
		if( typeof obj == 'object' )
		{
			var code = '';
			var self = this;

			for( var k in obj )
				code += ( code ? '&' : '' ) +
					k + '=' + encodeURIComponent( obj[k] );
			return code;
		}

		return obj;
	}
}

