var rpcDebug = true;

function jsRPC(href)
{
  this.href = href;
  this.execute = fc;
  this.sendForm = jsRPC_sendForm;
  this.first = 1;
  this.last = '';
}

// Provide the XMLHttpRequest class for IE 5.x-6.x:
if( typeof XMLHttpRequest == "undefined" ) XMLHttpRequest = function() {
  try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
  try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
  try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
  try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
  throw new Error( "This browser does not support XMLHttpRequest." )
};


var k = new Object();
var kh = new Object();
var ki = 0;
function fc(Rb)
{
  if (!Rb) Rb = this.href;
  var i = ki++;
  k[i] = new XMLHttpRequest();
  if(k[i])
  {
    var d = new Date();
    if (Rb.indexOf('?') == -1)
      Rb += '?'; else Rb += '&';
    Rb += 'tz=' + escape(d.getTimezoneOffset()) + '&rnd=' + Math.random();
    kh[i] = Rb;
    k[i].open("GET", Rb, true);
    k[i].onreadystatechange = fch(i);
    k[i].send(null)
  }
}

function showError(message, line, href, text)
{
  var div = document.getElementById('rpc-error-div');
  if (!div)
  {
    div = document.createElement('div');
    div.id = 'rpc-error-div';
    div.style.position = 'absolute';
    div.style.bottom = '0';
    div.style.left = '0';
    div.style.width = '100%';
    div.style.height = '200px';
    div.style.overflowY = 'scroll';
    div.style.zIndex = '10000';
    div.style.color = '#FFFF00';
    div.style.backgroundColor = '#0000CC';
    document.getElementsByTagName('body')[0].appendChild(div);
  }
  else
    div.style.display = 'block';
  div.innerHTML = '<button onclick="document.getElementById(\'rpc-error-div\').style.display = \'none\'; return false;" style="float: right;">Close Error Window</button>Error: ' + message + ' (line: ' + line + ')<br />Href: ' + href + '<br /><br />' + text;
  
}

function fch(i) {

  return (
    function handler()
    {
      if(k[i].readyState==4 && k[i].responseText)
      {
        try
        {
          eval(k[i].responseText);
        }
        catch(e)
        {
          if (rpcDebug)
          {
            showError(e.message, e.lineNumber, kh[i], k[i].responseText);
          }
        }
        k[i] = null;
      }
    }
  );
}

function jsRPC_sendForm(form)
{
  // collect all the values
  var qs = new Array();
  for (var i = 0; i < form.elements.length; i++)
  {
    // determine which type of field it is then add it to the array
    el = form.elements[i];
    if (el.type == 'textarea')
    {
      var t = new Object();
      t.name = el.name;
      t.value = el.value;
      qs[qs.length] = t;
    }
    
    if (el.type == 'hidden')
    {
      var t = new Object();
      t.name = el.name;
      t.value = el.value;
      qs[qs.length] = t;
    }
    
    if (el.type == 'text')
    {
      var t = new Object();
      t.name = el.name;
      t.value = el.value;
      qs[qs.length] = t;
    }

    if (el.type == 'checkbox')
    {
      if (el.checked)
      {
        var t = new Object();
        t.name = el.name;
        t.value = el.value;
        qs[qs.length] = t;
      }
    
    }

    if (el.type == 'radio')
    {
      if (el.checked)
      {
        var t = new Object();
        t.name = el.name;
        t.value = el.value;
        qs[qs.length] = t;
      }    
    }

    if (el.options && (el.type == 'select-one'))
    {
      var t = new Object();
      t.name = el.name;
      t.value = el.options[el.options.selectedIndex].value;
      qs[qs.length] = t;
    }
    
    if (el.options && (el.type == 'select-multiple'))    
    {
      for (var j = 0; j < el.options.length; j++)
        if (el.options[j].selected)
        {
          var t = new Object();
          t.name = el.name;
          t.value = el.options[j].value;
          qs[qs.length] = t;
        }
    }
  }
  
  // create a query string
  var qs_text = '';
  for (var i = 0; i < qs.length; i++)
  {
    qs_text += escape(qs[i].name) + '=' + escape(qs[i].value) + '&';
  }
  
  // post the data
  var href = this.href + '?' + qs_text;
  fc(href);
}
