function ajaxObject( f , layer, url ) 
{       
        var test = false;                                             
							// This is the object constructor
	var that=this;                                                    		// A workaround for some javascript idiosyncrocies
	var updating = false;                                             		// Set to true if this object is already working on a request
	this.callback = function() {}                                     		// A post-processing call -- a stub you overwrite.

	//alert( f + ' : ' + layer + ' : ' + url );

	this.update = function(passData)
	{                                // Initiates the server call.
		if (updating==true) { return false; }                          		// Abort if we're already processing a call.

		updating=true;                                                 		// Set the updating flag.
		var AJAX = null;                                               		// Initialize the AJAX variable.
if ( test ) alert( 1 );
		if (window.XMLHttpRequest) 
		{                                   					// Are we working with mozilla?
			AJAX=new XMLHttpRequest();                                  	//  Yes -- this is mozilla.
		} else {                                                       		// Not Mozilla, must be IE
			AJAX=new ActiveXObject("Microsoft.XMLHTTP");                	//  Wheee, ActiveX, how do we format c: again?
		}                                                              		// End setup Ajax.
if ( test ) alert( 2 );

		if (AJAX==null) 
		{                                              				// If we couldn't initialize Ajax...
			alert("Your browser doesn't support AJAX.");                	// Sorry msg.						
			return false;                                                	// Return false (WARNING - SAME AS ALREADY PROCESSING!)
		}else 
		{
if ( test ) alert( 3 );
			AJAX.onreadystatechange = function() 
			{       					               	// When the browser has the request info..
				if (AJAX.readyState==4 || AJAX.readyState=="complete") 
				{ 							//   see if the complete flag is set.
					LayerID.innerHTML=AJAX.responseText;                  //   It is, so put the new data in the object's layer
					delete AJAX;                                          //   delete the AJAX object since it's done.
					updating=false;                                       //   Set the updating flag to false so we can do a new request
					that.callback();                                      //   Call the post-processing function.
				}                                                        // End Ajax readystate check.
         		}
if ( test ) alert( 4 );

			var e = getFormValues( f , "validate" ); 
			AJAX.open( "POST" , url , true );
			AJAX.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8'); 

if ( test ) alert( 5 );

			AJAX.setRequestHeader('Cache-Control', 'no-cache'); 
			//AJAX.onreadystatechange = stateChanged;
			AJAX.send( e );
                            
if ( test ) alert( 6 );
     	
						// End create post-process fucntion block.
			//var timestamp = new Date();                                 	// Get a new date (this will make the url unique)
			//var uri=urlCall+'?'+passData+'&timestamp='+(timestamp*1);   	// Append date to url (so the browser doesn't cache the call)
			//AJAX.open("GET", uri, true);                                	// Open the url this object was set-up with.
			//AJAX.send(null);                                            	// Send the request.
			return true;                                                	// Everything went a-ok.
		}                                                             		// End Ajax setup aok if/else block                 
	}
      
	// This area set up on constructor calls.
	var LayerID = document.getElementById(layer);                     		// Remember the layer associated with this object.
	var urlCall = url;                                                		// Remember the url associated with this object.
}                                                                    			// End AjaxObject


function processData( obj ) 
{
	layerID = document.getElementById( obj );
	data = layerID.innerHTML;

	// rest of code processes data which is just a giant string containing all the data recieved from the server.
}

function getFormValues( fobj ) 
{ 


	var str = ""; 
	var valueArr = null; 
	var val = ""; 
	var cmd = ""; 

//if( fobj != null )
//{

	for( var i = 0 ; i < fobj.elements.length ; i++ ) 
	{
		//alert( fobj.elements[i].type );
		switch( fobj.elements[i].type ) 
		{ 

			case "text": 
				str += fobj.elements[i].name + "=" + escape(fobj.elements[i].value) + "&"; 

			break; 

			case "select-one": 

				if( fobj.elements[i].selectedIndex != -1 )
				{
					str += fobj.elements[i].name + "=" + fobj.elements[i].options[fobj.elements[i].selectedIndex].value + "&"; 
				}
				
			break; 

			case "select-multiple": 

				if( fobj.elements[i].id == 'cr' )
				{
					sel = fobj.elements[i];
					for (var j = 0; j < sel.length; j ++)
					{
						str += fobj.elements[i].name + '[]=' + sel.options[j].value + '&';
					}

				}
			break; 


			case "radio": 
				if( fobj.elements[i].checked != false )
				{
					str += fobj.elements[i].name + "=" + fobj.elements[i].value + "&"; 
				}
			break; 

			case "checkbox": 
				if( fobj.elements[i].checked != false )
				{
					str += fobj.elements[i].name + "=" + fobj.elements[i].value + "&"; 
				}
			break; 

			case "hidden":
				str += fobj.elements[i].name + "=" + fobj.elements[i].value + "&"; 
			break;

       		} 

   	} 

	str = str.substr( 0 , ( str.length - 1) ); 

//}


	//alert( str );
   return str; 

}