var ajax =[];
function
pjx (args, fname, method)
{
  this.target = args[1];
  this.args = args[0];
  method = (method) ? method : 'GET';
  if (method == 'post')
    {
      method = 'POST';
    }
  this.method = method;
  this.r = ghr ();
  this.url = this.getURL (fname);
}

function
formDump ()
{
  var all =[];
  var fL = document.forms.length;
  for (var f = 0; f < fL; f++)
    {
      var els = document.forms[f].elements;
      for (var e in els)
	{
	  var tmp = els[e].id || els[e].name;
	  if (tmp)
	    {
	    all[all.length] = tmp}
	}
    }
  return all;
}

function
getVal (id)
{
  if (id.constructor == Function)
    {
      return id ();
    }
  if (typeof (id) != 'string')
    {
      return id;
    }
  var element = document.getElementById (id)
    || document.forms[0].elements[id];
  if (!element)
    {
      alert ('ERROR: Cant find HTML element with id or name: ' + id +
	     '. Check that an element with name or id=' + id + ' exists');
      return 0;
    }
  if (element.type == 'select-multiple' || element.type == 'select')
    {
      var ans =[];
      var k = 0;
      for (var i = 0; i < element.length; i++)
	{
	  if (element[i].selected)
	    {
	      ans[k++] = element[i].value;
	    }
	}
      return ans;
    }
  if (element.type == 'radio')
    {
      var ans =[];
      var elms = document.getElementsByTagName ('input');
      var endk = elms.length;
      var i = 0;
      for (var k = 0; k < endk; k++)
	{
	  if (elms[k].type == 'radio' && elms[k].checked && elms[k].id == id)
	    {
	      ans[i++] = elms[k].value;
	    }
	}
      return ans;
    }
  if (element.type == 'div'
      || (element.tagName && element.tagName.toUpperCase () == 'SPAN'))
    {
      return element.innerHTML;
    }
  else
    {
      return element.value;
    }
}
function
fnsplit (arg)
{
  var url = "";
  if (arg == 'NO_CACHE')
    {
    return '&pjxrand=' + Math.random ()}
  if (arg.indexOf ('__') != -1)
    {
      arga = arg.split (/__ /);
      url += '&' + arga[0] + '=' + encodeURIComponent (arga[1]);
    }
  else
    {
      var res = getVal (arg) || '';
      if (res.constructor != Array)
	{
	res =[res]}
      for (var i = 0; i < res.length; i++)
	{
	  url +=
	    '&args=' + encodeURIComponent (res[i]) + '&' + arg + '=' +
	    encodeURIComponent (res[i]);
	}
    }
  return url;
}

pjx.prototype =
{
send2perl:function ()
  {
    var r = this.r;
    var dt = this.target;
    this.pjxInitialized (dt);
    var url = this.url;
    var postdata;
    if (this.method == "POST")
      {
	var idx = url.indexOf ('?');
	postdata = url.substr (idx + 1);
	url = url.substr (0, idx);
      }
    r.open (this.method, url, true);;
    if (this.method == "POST")
      {
	r.setRequestHeader ("Content-Type",
			    "application/x-www-form-urlencoded");
	r.send (postdata);
      }
    if (this.method == "GET")
      {
	r.send (null);
      }
    r.onreadystatechange = handleReturn;
  }
, pjxInitialized:function ()
  {
  }
, pjxCompleted:function ()
  {
  }
, readyState4:function ()
  {
    var rsp = this.r.responseText;	/* the response from perl */
    var splitval = '__pjx__';	/* to split text *//* fix IE problems with undef values in an Array getting squashed */
    rsp = rsp.replace (splitval + splitval + 'g', splitval + " " + splitval);
    var data = rsp.split (splitval);
    dt = this.target;
    if (dt.constructor != Array)
      {
	dt =[dt];
      }
    if (data.constructor != Array)
      {
	data =[data];
      }
    if (typeof (dt[0]) != 'function')
      {
	for (var i = 0; i < dt.length; i++)
	  {
	    var div = document.getElementById (dt[i]);
	    if (div.type == 'text' || div.type == 'textarea'
		|| div.type == 'hidden')
	      {
		div.value = data[i];
	      }
	    else
	      {
		div.innerHTML = data[i];
	      }
	  }
      }
    else if (typeof (dt[0]) == 'function')
      {
	var d = data;
	var str = "dt[0](";
	for (m = 0; m < d.length - 1; m++)
	  {
	    str += "d[" + m + "],";
	  }
	str += "d[" + m + "])";
	eval (str);
      }
    this.pjxCompleted (dt);
  }
, getURL:function (fname)
  {
    var args = this.args;
    var url = 'fname=' + fname;
    for (var i = 0; i < args.length; i++)
      {
	url = url + args[i];
      }
    return url;
  }
};

handleReturn = function ()
{
  for (var k = 0; k < ajax.length; k++)
    {
      if (ajax[k].r == null)
	{
	  ajax.splice (k--, 1);
	  continue;
	}
      if (ajax[k].r.readyState == 4)
	{
	  ajax[k].readyState4 ();
	  ajax.splice (k--, 1);
	  continue;
	}
    }
};
var ghr = getghr ();
function
getghr ()
{
  if (typeof XMLHttpRequest != "undefined")
    {
      return function ()
      {
	return new XMLHttpRequest ();
      }
    }
  var msv =
    ["Msxml2.XMLHTTP.7.0", "Msxml2.XMLHTTP.6.0", "Msxml2.XMLHTTP.5.0",
     "Msxml2.XMLHTTP.4.0", "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",
     "Microsoft.XMLHTTP"];
  for (var j = 0; j <= msv.length; j++)
    {
      try
      {
	A = new ActiveXObject (msv[j]);
	if (A)
	  {
	    return function ()
	    {
	      return new ActiveXObject (msv[j]);
	    }
	  }
      }
      catch (e)
      {
      }
    }
  return false;
}

function
jsdebug ()
{
  var tmp = document.getElementById ('pjxdebugrequest').innerHTML =
    "<br><pre>";
  for (var i = 0; i < ajax.length; i++)
    {
      tmp +=
	'<a href= ' + ajax[i].url + ' target=_blank>' +
	decodeURI (ajax[i].url) + ' </a><br>';
    }
  document.getElementById ('pjxdebugrequest').innerHTML = tmp + "</pre>";
}

function clear_recently ()
{
  var args = clear_recently.arguments;
  for (var i = 0; i < args[0].length; i++)
    {
      args[0][i] = fnsplit (args[0][i]);
    }
  var l = ajax.length;
  ajax[l] = new pjx (args, "clear_recently", args[2]);
  ajax[l].url = 'ajax.pl?' + ajax[l].url;
  ajax[l].send2perl ();;
}

function clear_all_recently ()
{
  var args = clear_all_recently.arguments;
  for (var i = 0; i < args[0].length; i++)
    {
      args[0][i] = fnsplit (args[0][i]);
    }
  var l = ajax.length;
  ajax[l] = new pjx (args, "clear_all_recently", args[2]);
  ajax[l].url = 'ajax.pl?' + ajax[l].url;
  ajax[l].send2perl ();;
}
