function jsRPC(href)
{
  this.href = href;
  this.execute = fc;
  this.loadById = jsRPC_loadById;
  this.saveItem = jsRPC_save;
  this.deleteItem = jsRPC_delete;
  this.processForm = jsRPC_processForm;
  this.refreshList = jsRPC_refreshList;
  this.first = 1;
  this.last = '';
}

function jsRPC_refreshList(first, last)
{
  if (!first)
  {
    // they didn't pass in a first, so use the old values.
  }
  else
  {
    this.first = first;
    this.last = last;
  }
  var href = this.href + '?action=refreshList&&first=' + escape(this.first) + '&last=' + escape(this.last) + '&rnd=' + Math.random();
  fc(href); 
}

function jsRPC_loadById(id)
{
  var href = this.href + '?action=loadById&id=' + escape(id) + '&rnd=' + Math.random();
  fc(href);
}


function jsRPC_processForm(form)
{
  if (form.elements.action.value == 'save')
    this.saveItem(form);

  if (form.elements.action.value == 'delete')
    this.deleteItem(form);
}


function jsRPC_delete(form)
{
  var id = form.elements.id.value;
  var href = this.href + '?action=delete&id=' + id + '&rnd=' + Math.random();
  fc(href);
}

function jsRPC_save(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 + '?action=save&' + qs_text + '&rnd=' + Math.random();
  fc(href);
}

function jb()
{
  var A=null;
  try
  {
    A=new ActiveXObject("Msxml2.XMLHTTP")
  }
  catch(e)
  {
    try
    {
      A=new ActiveXObject("Microsoft.XMLHTTP")
    }
    catch(oc)
    {
      A=null
    }
  }
  if(!A&&typeof XMLHttpRequest!="undefined")
  {
    A=new XMLHttpRequest()
  }
  return A
}    
var k = new Object();
var ki = 0;
function fc(Rb)
{
  if (!Rb) Rb = this.href;
  var i = ki++;
  k[i]=jb();
  if(k[i])
  {
    var d = new Date();
    if (Rb.indexOf('?') == -1)
      Rb += '?'; else Rb += '&';
    Rb += 'tz=' + escape(d.getTimezoneOffset()) + '&rnd=' + Math.random();
    k[i].open("GET", Rb, true);
    k[i].onreadystatechange = fch(i);
    k[i].send(null)
  }
}

function fch(i) {

  return (
    function handler()
    {
      if(k[i].readyState==4 && k[i].responseText)
      {
        try
        {
          // alert(k[i].responseText);
          eval(k[i].responseText);
        }
        catch(e)
        {
          alert(k[i].responseText);
        }
        k[i] = null;
      }
    }
  );
}

function handleResponse(action, data, data2)
{
  if (action == 'loadById')
  {
    var div = document.getElementById('div_form');
    var form = div.getElementsByTagName('form')[0];
    form.reset();
    
    for (var i in data[0])
      form.elements[i].value = data[0][i];

    var div = document.getElementById('div_list');
    div.style.display = 'none';
    var div = document.getElementById('div_form');
    div.style.display = 'block';
  }
  if (action == 'save')
  {
    rpc.refreshList();
//    alert(data);
  }
  
  if (action == 'delete')
  {
    rpc.refreshList();
//    alert(data);
  }
  
  if (action == 'refreshList')
  {
    updatePagination(parseInt(data2));
    handleRefreshList(data);
  }
}

function updatePagination(recordcount)
{
}

function handleRefreshList(data)
{
  
  try
  {
    handleRefreshListCustom(data)
  }
  catch (e)
  {}
  
  // now that the custom handling is done, show the list.
  
  var div = document.getElementById('div_list');
  div.style.display = 'block';
  var div = document.getElementById('div_form');
  div.style.display = 'none';

  return false;
}

function deleteSingleItem(id)
{
  var div = document.getElementById('div_form');
  var form = div.getElementsByTagName('form')[0];
  form.elements.id.value = id;
  rpc.deleteItem(form);
}


// Start of the code that supports the RPC version of pagination

var pagination = new Array();

function pagination()
{
  this.controls = new Array();
  this.updateRecordCount = pagination_updateRecordCount;
  this.setPageSize = pagination_setPageSize;
  this.setPage = pagination_setPage;
  this.setFirst = pagination_setFirst;
  this.setLast = pagination_setFirst;
  
  this.refreshList = pagination_refreshList;
  this.display = pagination_display;
}
