function AjaxClient() {

	this.extraParams = new Object();
	
	this.response = '';
	
	this.error = '';

	this.onSuccess = 	function () {
							alert( 'Please override onSuccess callback.' );
						};
	this.onLoading = 	function () {
							//alert( 'Please override onLoading callback.' );
						};
	this.onError = 		function ( err) {
							alert( err );
						};
						
						
						
	this.submitForm =      function(obj, serverClass, serverMethod) {
                                
                                var params = new Object();

                                for ( i=0; i<obj.elements.length; i++ ) {
                                    
                                    var element = obj.elements[i];
                                    
                                    if ( element.disabled ) {
                                        continue;
                                    }
                                    
                                    var sTagType = element.type.toUpperCase();    
                                                                            
                                    switch ( sTagType ) {
                                        case "TEXT":
                                        case "PASSWORD":
                                        case "HIDDEN":
                                        case "TEXTAREA": 
                                                    params[element.name] = element.value;
                                                    break;
                                        case "CHECKBOX" :
                                        case "RADIO":
                                                    if ( element.checked ) {
                                                        params[element.name] = element.value;
                                                    }
                                                    break;
                                        case "SELECT-ONE":
                                                    if ( element.selectedIndex >= 0 ) {
                                                        params[element.name] = element.options[element.selectedIndex].value
                                                    }
                                                    break;
                                        case "SELECT-MULTIPLE":
                                                    for ( var nr2 = 0; nr2 < e.options.length; nr2++ ) {
                                                        if ( element.options[nr2].selected ) {
                                                            params[element.name] = element.options[nr2].value
                                                        }
                                                    }
                                                    break;                                                    
                                    }
                                    
                                }
                             
                                this.call(obj.action, obj.method, serverClass, serverMethod, params);
	    
	                       };				
	
	this.call = 		function( uri, method, serverClass, serverMethod, params ) {
			
 							var args = '';
							var selfReference = this;
							
							if( method.toUpperCase() == 'POST'){
								args 	+= '__serverClass=' + serverClass + '&__serverMethod=' + serverMethod;
 
								this.http.open( 'POST',  uri );
								this.http.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=iso-8859-1');
								this.http.onreadystatechange = function(){CIAO_AJAX_stateHandler(selfReference );}
								
								for ( property in params ) {
								    var sValue = '' + params[ property ];
								    sValue = escape( sValue.replace( /%/g, "%25" ) );
								    args += '&' + property + '=' + sValue;
								}									
									
								this.http.send(args);
							}else{
								
								uri 	+= '?__serverClass=' + serverClass + '&__serverMethod=' + serverMethod;
							
								for ( property in params ) {
								    var sValue = '' + params[ property ];
								    sValue = escape( sValue.replace( /%/g, "%25" ) );
									uri += '&' + property + '=' + sValue;
								}
								this.http.open( 'get', uri );
								this.http.setRequestHeader('Content-Type', 'text/html; charset=iso-8859-1');

								this.http.onreadystatechange = function(){CIAO_AJAX_stateHandler(selfReference );}
								this.http.send( null );
								
							}
	
						};
	
	this.createRequestObject = 	function () {
									var request_o; //declare the variable to hold the object.
									var browser = navigator.appName; //find the browser name
									if( browser == "Microsoft Internet Explorer" ){
										/* Create the object using MSIE's method */
										request_o = new ActiveXObject( "Microsoft.XMLHTTP" );
									}else{
										/* Create the object using other browser's method */
										request_o = new XMLHttpRequest();
									}
									return request_o; //return the object
								};
						
	this.http = this.createRequestObject();

}

function CIAO_AJAX_stateHandler(client) {
	/* Make sure that the transaction has finished. The XMLHttpRequest object 
		has a property called readyState with several states:
		0: Uninitialized
		1: Loading
		2: Loaded
		3: Interactive
		4: Finished */
	if( client.http.readyState == 4 ){ 
		var response = '';
		eval("response = " + unescape( client.http.responseText.replace( /%/g, "%25" ) ) );		
		if( client.http.status != 200 ) {
			client.onError( 'HTTP Error, received status ' + client.http.status + ' instead of expected 200', null );
		} else if( response[ 'error' ] != '' ) {
			client.onError( response[ 'error' ], response[ 'result' ] );
		} else {
			client.onSuccess( response[ 'result' ] );
		}
	} else if( client.http.readyState == 1 ) {
		client.onLoading();
	}
}

function debugToDiv ( oToDebug, sDivId, iIndent ) {
	for ( mProperty in oToDebug ) {
		var oMember = oToDebug[ mProperty ];
		var j = 0;
	
		for( j=0; j<iIndent; j++ ) {
			document.getElementById( sDivId ).innerHTML += '	';
		}
		if( typeof( oMember ) == 'object' ) {
			document.getElementById( sDivId ).innerHTML += mProperty + ' (Object) <br />';
			debugToDiv( oMember, sDivId, iIndent + 1 );
		} else {
			document.getElementById( sDivId ).innerHTML += ( mProperty + ' => ' + oMember + '<br />' );
		}
	}
}

