/****************************************
SendReceive - A library to automate remote JSON formatted requests
Copyright (C) 2006  Jeremy Nicoll

Compressed version - the uncompressed file (SendRecieve.js) can be
retreived from www.SeeMySites.net

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

Please see lgpl.txt for a copy of the license - this notice must remain intact
and the file lgpl.txt must accompany this code.

Please go to www.SeeMySites.net/forum for questions and support.
********************************************/
function SendReceive()
{
  this.sendRequest=SGPR.sendRequest;
  this.getRequest=SGPR.getRequest;
}

var SGPR={
  sendRequest:function(url,request,receiver,quiet)
  {
    if(receiver)
    {
      this.receiver=receiver;
    }
    if(typeof(this.receiver)!='function'&&this.async!==false)
    {
      alert('Function not supplied for callback.');
      return false;
    }
    if(quiet===null||quiet===undefined)
    {
      this.quiet=false;
    }
    
    var jRequest=JSON.stringify(request);
    this.remote=new getHTTPRequest();
    if(this.async==false)
    {
      dont_wait=false;
    }
    else
    {
      dont_wait=true;
    }

    var ref=this;
    if(dont_wait) 
    {
      this.remote.onreadystatechange=function()
      {
        ref.getRequest(ref.remote,ref);
      };
    }
  
    this.remote.open('POST',url,dont_wait);
    this.remote.setRequestHeader("Content-type","text/plain");
    this.remote.setRequestHeader("Content-length",jRequest.length);
    this.remote.setRequestHeader("Connection","close");
    this.remote.send(jRequest);
    if(!dont_wait)
    {
      this.response=eval('('+this.remote.responseText+')');
    }
  },
  getRequest:function(remote,obj)
  {
    if(remote.readyState==4)
    {
      if(remote.status==200)
      {
        var getBack=eval('('+remote.responseText+')');
        obj.receiver(getBack);
      }
      else
      {
        if(!obj.quiet)
        {
          alert('There was a problem with the request. Error code: '+this.remote.status);
        }
        else
        {
          obj.receiver({status:'remote',error_msg:remote.status});
        }
      }
    }
  }
};

function RepeatGetAction(page,request,interval,successFunc,failFunc,stopOnFail)
{
  page=page||'';request=request||{};
  interval=interval||3000;
  succssFunc=successFunc||'';
  failFunc=failFunc||'';
  if(stopOnFail===null||stopOnFail===undefined)
  {
    stopOnFail=true;
  }

  this.init(page,request,interval,successFunc,failFunc,stopOnFail);
}

RepeatGetAction.prototype={
  init:function(page,request,interval,successFunc,failFunc,stopOnFail)
  {
    this.page=page;
    this.request=request;
    this.interval=interval;
    this.successFunc=successFunc;
    this.failFunc=failFunc;
    this.stopOnFail=stopOnFail;
    if(this.checkVals())
    {
      this.start();
    }
  },
  sendRequest:SGPR.sendRequest,
  getRequest:SGPR.getRequest,
  checkVals:function()
  {
    if(this.page!==''&&parseInt(this.interval)>0&&typeof(this.interval)=='number'&&typeof(this.failFunc)=='function'&&typeof(this.successFunc)=='function'&&(typeof(this.request)=='object'||typeof(this.request)=='array'))
    {
      return true;
    }
    else
    {
      return false;
    }
},start:function(){if(!this.checkVals()){return false;}var ref=this;this.timerVar=setInterval(function(){ref.start_ref();},this.interval);},start_ref:function(){this.sendRequest(this.page,this.request,this.receive,true);},receive:function(getBack){if(!getBack){this.stop();alert('No response sent back to receive function.');}else if(getBack.status=='error'){if(this.stopOnFail){this.stop();}this.failFunc(getBack);}else if(getBack.status=='remote'){this.stop();alert('There was a problem with the request. Error code: '+getBack.error_msg);}else{this.successFunc(getBack);}},stop:function(){clearInterval(this.timerVar);}};function getHTTPRequest(){http_request=false;if(window.XMLHttpRequest){http_request=new XMLHttpRequest();}else if(window.ActiveXObject){try{http_request=new ActiveXObject("Msxml2.XMLHTTP");}catch(e){try{http_request=new ActiveXObject("Microsoft.XMLHTTP");}catch(e){}}}return http_request;}function $(text){return document.getElementById(text);}

