var sendpath =  "/games/spin/spin_response.php";  /* path for sending requests */
var initpath =  "/games/spin/spin_view_init.php"; /* path for sending init request */
var XHO_send = class_ajax_create_XmlHttp_RequestObject();   /* XmlHttpObject */
var request_cache = new Array();   /* initialize the url_cache */
var LastStatus = 0;            /*  LastStatus - status of current condition */
var request_interval = 4000;       //if there is a queue of requests, interval to send next request
var MaxRequestTime = 20000;		//Max time in miliseconds. Time for waiting a response of the one request

//var request_status = 0;            //status of request. 0 - ready to use, 1 - in use.


//temp vars
var LastAnswer = '';
var LastRequestTime = 0;		//Time, when last request was sended.
var FlagSending = false;              //Flag posilki zaprosa

//_________________________________________________________________________SERVER ANSWER PARSE FUNCTIONS
/* makes asynchronous request to server */

function make_request(RequestMode)
{
  // don't send void messages
  // if (trim(oCurrentMes) != "")
  //
    if (RequestMode == 'Spin') 
    {
      params =  'stake=' + CurrentStake + '&lines=' + CurrentLines;
	}
    if (RequestMode == 'Risk') 
    {
      params =  'risk=1';
    }

    // add the message to the queue (queue is only 1 element)
    if (request_cache.length < 1)
	  request_cache.push(params);
	
    send_new_request('play');
}

//_________________________________________________________________________
/* Send asynchronous request to server */

function send_new_request(Mode)
{  
  // only continue if XHO_send isn't void
  if (XHO_send)
  {
    try
    {
      // don't start another server operation if such an operation is already in progress 
      if (XHO_send.readyState == 4 || XHO_send.readyState == 0) 
      {
        // we will store the parameters used to make the server request
        var params = "";
        if (Mode == 'play')
        {
          // if there are requests stored in queue, take the oldest one
          if (request_cache.length > 0)
          {
            params = request_cache.shift();
            // call the server page to execute the server-side operation
            XHO_send.open("POST", sendpath, true);
            XHO_send.setRequestHeader("Content-Type", 
                                   "application/x-www-form-urlencoded");
            XHO_send.onreadystatechange = handle_server_answer;
            
          //Control request code
            LastRequestTimeSet();
            FlagSending = true;
            
          //send request
            XHO_send.send(params);
            //..............setTimeout("send_new_request('play');", request_interval);
          }  
        }  // end of if (Mode == 'play')
        
        if (Mode == 'init')
        {
          params = "";
          XHO_send.open("POST", initpath, true);
          XHO_send.setRequestHeader("Content-Type", 
                                   "application/x-www-form-urlencoded");
          XHO_send.onreadystatechange = handle_server_answer;
          
          FlagSending = true;
                    
          XHO_send.send(params);
        }  // end of if (Mode == 'Init')
      }
      else
      {
        // we will try to send request again
        {
          setTimeout("send_new_request('play');", request_interval);
        }
      }
    }
    catch(e)
    {
      //............     
      displayError(e.toString() + ' Send new request situation.');
    }
  } else
  {
    displayError(e.toString() + 'Huyasebe! Send new request situation.');
  }
}

/* function that handles the http response */

function handle_server_answer() 
{
  // continue if the process is completed
  if (XHO_send.readyState == 4) 
  {
    // continue only if HTTP status is "OK"
    if (XHO_send.status == 200) 
    {
      try
      {
        // process the server's response
        read_server_answer();
      }
      catch(e)
      {
        // display the error message
        displayError(e.toString() + ' Read server answer situation.');
      }
      
      FlagSending = false;  //Zapros obrabotan, aktiviruem vozmojnost puska spina
    } 
    else
    {
      // display the error message
      displayError(XHO_send.statusText + ' - XHO_send.status != 200 situation.');
    }
  } 
}

//________________________________@@@@@@@@@@@?  Getting SERVERS RESPONSE
/* function that processes the server's response */

function read_server_answer()
{  
  var FlagOk = false;

//  alert(XHO_send.responseText);
  LastAnswer = XHO_send.responseText;
  
  response = XHO_send.responseXML.documentElement;  // retrieve the document element

  server_SpinMsg = response.getElementsByTagName("msg").item(0).firstChild.nodeValue;
  if (server_SpinMsg == 'ok')
  {
	FlagOk = true;

    // retrieve the Slot arrays from the server's response     
	server_Slot = response.getElementsByTagName("slot");  
	
	// retrieve spin array values
    server_SpinVals = server_Slot.item(0).getElementsByTagName("spin");
    for (var i = 0; i < server_SpinVals.length ; i++) 
    { 
      Spin = server_SpinVals.item(i).getAttribute("id");
      SpinVal[Spin] = SpinImgPos[Spin][parseInt(server_SpinVals.item(i).firstChild.nodeValue)];
    } 

    //___retrieve Lines
    server_lines = server_Slot.item(0).getElementsByTagName("line");
    CurrentWinLines = server_lines.length;
    for (var i = 0; i < CurrentWinLines; i++) 
    { WinLines[i] = parseInt(server_lines.item(i).firstChild.nodeValue);
    } 
    
    Money = RoundNumber(response.getElementsByTagName("money")[0].firstChild.nodeValue, 10);
    
    //___change GameResult
    GameResult = response.getElementsByTagName("win")[0].firstChild.nodeValue;
    //There was a risk game
    if (WinLines[0] == '-1') ProcessGameResult(GameResult, Money);
  } else if (server_SpinMsg == 'init')
  {
	FlagOk = true;
	Money = RoundNumber(response.getElementsByTagName("money")[0].firstChild.nodeValue, 10);
    ChangeInfoWin('MoneyInfo', Money);
  } 
  
  //Is Server answer OK?
  if (FlagOk)
  {
    NewPlayMode = response.getElementsByTagName("mode")[0].firstChild.nodeValue;
    if (NewPlayMode != PlayMode)
    {
      PlayMode = NewPlayMode;
      ChangePlayMode(PlayMode);
    }
  } else 
  {
	ShowMessageInWin(server_SpinMsg);
	SpinEmergencyStop();
  } 

}

function LastRequestTimeSet()  //function, that sets the time of the last request
{
  var TimeNow = new Date();
  LastRequestTime = TimeNow.getTime();
}

function LastRequestTimeCheck()  //function, that check if the request was made too long time ago and did not be answered.
{
  if (FlagSending)
  {
	var TimeNow = new Date();
	TimeSec = TimeNow.getTime() - LastRequestTime;
	if (TimeSec > MaxRequestTime)
	{
	  //stop spin, if it reel;
	  XHO_send = class_ajax_create_XmlHttp_RequestObject();
	  FlagSending = 0;

	  SpinEmergencyStop();
	}
  }
    
}  


