
			function createXMLHttpRequest()
			{
				if (window.ActiveXObject )
				{
					xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
				}
				else if( window.XMLHttpRequest )
				{
					xmlHttp = new XMLHttpRequest();
				}
			}
			function callServer( xml, n_img )
			{
				time1 = new Date();
				//showDebug( xml );
				if( link_status == null )
				{
					link_status = 1;
					createXMLHttpRequest();

					var url = "test_server.php?timeStamp=" + new Date().getTime();

					xmlHttp.open("POST", url, true);
					xmlHttp.onreadystatechange = handleStateChange;
					xmlHttp.setRequestHeader("content-Type", "application/x-www-form-urlencoded");
					xmlHttp.send(xml);

					if( ! n_img )
					{
						net_status = document.getElementById("network_status");
						var net_img = makeImg( "./img/network_active.gif", 20, 20, "net_stat_img", "Network Activity" );
						net_status.appendChild(net_img);
					}
				}
				else
					addFuncBuffer( xml );
				
			}
			function handleStateChange()
			{
				if( xmlHttp.readyState == 4 )
				{
					if( xmlHttp.status == 200 )
					{
						if( xmlHttp.responseXML )
						{
							time2 = new Date();

							data = xmlHttp.responseXML;
							playerData = xmlVal( data, "playerData" );
							grid = xmlVal( data, "gridData" );

							middle_pane = document.getElementById("middle_pane");

							//showDebug( xmlHttp.responseText );
						
							var res_mode = xmlVal( data, "response" );

							if( !res_mode )
								showDebug( xmlHttp.responseText );

							if( res_mode )
							{
								var func_list = xmlList( data, "res_func" );

								for( var f = 0, func; func = func_list[f]; f++ )
								{
									var func_call = xmlVal( func, "name" )+"( ";

									var func_args = xmlList( func, "arg" );
									for( var a = 0, arg; arg = func_args[a]; a++ )
									{
										switch( xmlVal( arg, "type" ) )
										{
											case "string":
												func_call += "'"+xmlVal( arg, "val" )+"'";
												break
											case "int":
												func_call += parseInt( xmlVal( arg, "val" ) );
												break
											case "float":
												func_call += parseFloat( xmlVal( arg, "val" ) );
												break
											case "bool":
												func_call += xmlVal( arg, "val" );
												break
											case "js_var":
												func_call += xmlVal( arg, "val" );
												break
											default:
												func_call += "null";
										}
										func_call += ( parseInt( a ) + 1 < func_args.length ? ', ' : '' );
									}
									func_call += " );";
//alert(func_call);
									var exec_func_call = new Function( "return "+func_call );
									exec_func_call();
								}

								
								var xml_refresh = null;
								if( xml_refresh = xmlVal( data, "client_auto_refresh" ) )
								{
									if( xml_refresh )
									{
										clearInterval( timers[xmlVal( xml_refresh, "key" )] );

										if( xmlVal( xml_refresh, "time" ) )
											timers[xmlVal( xml_refresh, "key" )] = setInterval( xmlVal( xml_refresh, "name" ) +"()", parseInt( xmlVal( xml_refresh, "time" ) ) );
									}
								}
								
							}
							user_level = xmlVal( data, 'user_level' );
							clearElement( document.getElementById("network_status") );
							//net_status.removeChild( document.getElementById("net_stat_img") );
							link_status = null;

							time3 = new Date();

							killFloatDiv();
							//calcTime();

							processFuncQueue();
							processFuncBuffer();
						}
					}
				}
			}
			function autoRefreshData()
			{
				if( views['view1'] == "game_main" )
				{
					displayFloatDiv( "Automatic Data Refresh...", true );
					refreshData();
				}
				else
					clearInterval( timers['game_main'] );
			}
			function autoChatter()
			{
				navRecord = false;
				var view = views['chatter_box'];
				if( view )
					defaultAJAX( 'getChatter', new Array( chatter_time, 1 ), new Array( view.substring( 0, 1 ) ), null, null, null, true );
				else
					clearInterval( timers['chatter'] );
				navRecord = true;
			}
			function headlineNews()
			{
				defaultAJAX( 'getNews', null, new Array( 'headlines' ) );
			}
			function processFuncQueue()
			{
				for( var f = 0, func; func = func_queue[f]; f++ )
				{
					var temp_func = new Function( "return "+func+"();" );
					temp_func();
				}
				func_queue = new Array();
			}
			function addFuncQueue( func )
			{
				func_queue[func_queue.length] = func;
			}

			function processFuncBuffer()
			{
				if( func_buffer.length > 0 )
					callServer( func_buffer.shift() );
			}

			function addFuncBuffer( xml )
			{
				func_buffer[func_buffer.length] = xml;
			}

			function createXML( mode_function, int_vals, strings )
			{
				var xml = "xml=<request>";
					xml += "<function>"+mode_function+"<\/function>";
					xml += "<args>";
						xml += "<player>"+player_id+"<\/player>";
						xml += "<page>"+page+"</page>";
						xml += "<ints>";
						if( int_vals )
						{
							if( int_vals.length > 0 )
							{
								for( var i = 0; i < int_vals.length; i++ )
									xml += "<val>"+parseInt(int_vals[i])+"</val>";
							}
						}
						xml += "</ints>";
						xml += "<strings>";
						if( strings )
						{
							if( strings.length > 0 )
							{
								for( var i = 0; i < strings.length; i++ )
									xml += "<val><![CDATA["+strings[i]+"]]></val>";
							}
						}
						xml += "</strings>";
					xml += "</args>";
				xml += "<\/request>";
				return xml;
			}
			function refreshData()
			{
				if( navRecord )
					currentHistory();

				var func = "default";
				var ints = new Array();
				var strings = new Array();
				var xml = createXML( func, ints, strings );
				callServer( xml );
			}
			function submitTrade( sort )
			{
				var tag = null;
				if( sort )
					sub_view = sort;

				if( sub_view == "resources" )
					var tag = "r";
				else if( sub_view == "equipment" )
					var tag = "i";

				if( navRecord )
					currentHistory();

				var func = "submitTrade";
				var ints = new Array();
				var strings = new Array();
				ints[0] = cur_type;
				ints[1] = cur_price;
				ints[2] = cur_price_type;
				ints[3] = cur_quant;
				strings[0] = tag;
				var xml = createXML( func, ints, strings );
				callServer( xml );
			}
			function submitSplit( item, sort )
			{	
				var tag = null;

				if( sort )
					sub_view = sort;

				if( item )
				{
					if( sub_view == "resources" )
						var tag = "r";
					else if( sub_view == "equipment" )
						var tag = "i";
				}
				if( navRecord )
					currentHistory();

				var func = "splitStack";
				var ints = new Array();
				var strings = new Array();
				ints[0] = item;
				ints[1] = cur_quant;
				strings[0] = tag;
				var xml = createXML( func, ints, strings );
				callServer( xml );	
			}
			function submitStack( item, sort )
			{	
				var tag = null;

				if( sort )
					sub_view = sort;

				if( item )
				{
					if( sub_view == "resources" )
						var tag = "r";
					else if( sub_view == "equipment" )
						var tag = "i";
				}
				if( navRecord )
					currentHistory( "backtrack" );

				var func = "stackStack";
				var ints = new Array();
				var strings = new Array();
				ints[0] = item;
				ints[1] = cur_type;
				strings[0] = tag;
				var xml = createXML( func, ints, strings );
				callServer( xml );	
			}
			function submitFormAJAX( func, form_ints, form_strings, ints, strings, rec_name, f_views, mpage, n_img, disp_text, hist, clear_grid )
			{
				if( form_ints )
				{
					if( ! ints )
						var ints = new Array();
					for( var i = 0, form_ele; form_ele = form_ints[i]; i++ )
					{
						if( typeof form_ele == "object" )
						{
							var ele_type = form_ele[0];
							var ele_id = form_ele[1];
						}
						else
						{
							var ele_type = null;
							var ele_id = form_ele;
						}
						if( ele_type == 'radio' )
							var ele = document.getElementsByName( ele_id );
						else
							var ele = document.getElementById( ele_id );
						if( ele )
						{
							if( ele_type == "select" )
							{
								ints[ints.length] = ele.options[ele.selectedIndex].value;
							}
							else if( ele_type == "radio" )
							{
								var len = ele.length;
								for( var r = 0; r < len; r++ )
								{
									if( ele[r].checked )
									{
										ints[ints.length] = ele[r].value;
										break;
									}
								}
							}
							else
							{
								ints[ints.length] = ele.value;
								ele.value = '';
							}
						}
						else
							ints[ints.length] = null;
					}
				}
				if( form_strings )
				{
					if( !strings )
						var strings = new Array();
					for( var i = 0, form_ele; form_ele = form_strings[i]; i++ )
					{
						var ele = document.getElementById( form_ele );
						if( ele )
						{
							strings[strings.length] = ele.value;
							ele.value = '';
						}
						else
							strings[strings.length] = null;
					}
				}

				defaultAJAX( func, ints, strings, rec_name, f_views, mpage, n_img, disp_text, hist, clear_grid );
			}
			function defaultAJAX( func, ints, strings, rec_name, f_views, mpage, n_img, disp_text, hist, clear_grid )
			{
				if( disp_text )
					displayFloatDiv( disp_text, true );
				if( clear_grid )
					clearGrid = true;
				if( f_views )
				{
					for( var f = 0, f_view; f_view = f_views[f]; f++ )
					{
						views[f_view[0]] = f_view[1];
					}
				}
				if( rec_name )
				{
					if( navRecord )
						currentHistory( rec_name, "defaultAJAX", new Array( func, ints, strings, rec_name, f_views, mpage, n_img, disp_text, hist, clear_grid ) );
				}
				else
				{
					if( navRecord )
						currentHistory( hist );
				}
				page = mpage;
				var xml = createXML( func, ints, strings );
				callServer( xml, n_img );
			}
