// Joe's iccle tiny AJAX library..

var aj_request_prefix = 'RPC/' 
var aj_popcount=0;

function createRequestObject() {
  var ro;

  if(window.XMLHttpRequest){
    ro = new XMLHttpRequest();
  }else{
    ro = new ActiveXObject("Microsoft.XMLHTTP");
  }

  return ro;
}


var http = createRequestObject();
function callInProgress() {
  switch ( http.readyState ) {
    case 1: case 2: case 3:
      return true;
      break;

      // Case 4 and 0
    default:
      return false;
      break;
  }
}

// Queue initialisation
var queue=new Array();
var queueSpace=0;

// Enqueues the specified item
function enqueue(item){
  queue[queue.length++]=item;
}

// Dequeues an item, returning undefined if the queue is empty
function dequeue(){
  var item=undefined;
  if (queue.length){
    item=queue[queueSpace];
    if ((++queueSpace)*2 >= queue.length){
      for (var i=queueSpace;i<queue.length;i++) queue[i-queueSpace]=queue[i];
      queue.length-=queueSpace;
      queueSpace=0;
    }
  }
  return item;
}
 
function aj_setReqPrefix( prefix )
{
    aj_request_prefix = prefix
}

function aj_path_request( action_path, params, options )
{
    options || (options = {});
    options.request_prefix = action_path;
    aj_sndReq( undefined, params, options );
}


var aj_int=false;
function aj_sndReq(action, params, options) {
  options || (options = {});
  
  if(document.getElementById('ajax_loading')){
      document.getElementById('ajax_loading').style.display='block'
  }


  enqueue({ action: action + params, opts: options});


  //Perhaps make queueing behavior FF only?
  if(aj_int == false){
    aj_int =  window.setInterval(
        function (action, params) {
        if(!callInProgress()){ // stop new req. crashing old

            var ent = dequeue();

            //retrigger loading as it may have been cancelled by the time
            //_we_ get here
            if(document.getElementById('ajax_loading')){
                document.getElementById('ajax_loading').style.display='block'
             }

            http.open('POST', (ent.opts.request_prefix || aj_request_prefix), true);//true makes this async
            http.onreadystatechange = aj_handleResponse;
            http.setRequestHeader('Content-Type',
                                'application/x-www-form-urlencoded; charset=UTF-8');
          
            var rq = 'request=' + ent.action + '&xmlplease=1';

          
            http.send(rq);
            if(queue.length==0){
              //alert("queueclear");
              clearInterval(aj_int);
              aj_int=false;
            }
        }
      }

      ,10);
  }  
  
}


function _set( set_mech, sets ){

    for(var i=0;i<sets.length;i++)
      {          
          var elt = document.getElementById(sets[i].getElementsByTagName('target')[0].firstChild.data);
          
          if( ! elt )
          {
              continue;
          }

          var elt_parent = elt.parentNode;

          var newdata='';
          var textnode = sets[i].getElementsByTagName('text')[0];
          var content = aj_extract_content(textnode);
          
          try
          {
              if( set_mech == 'set' ){
                  
                  elt.innerHTML = content;
                  
              }
              else{

                  var dummy_span = document.createElement('span');
                  dummy_span.innerHTML = content;
                  
                  elt_parent.replaceChild( dummy_span.firstChild, elt);
                 
              }
          }
          catch(e)
          {
              alert(e.name + ': ' + e.message + ', ' + elt + ', ' + content);
          }
      }
}
function aj_handleResponse() {
  if(http && http.readyState == 4){

    var xmldoc = http.responseXML;
      
    //
    // UNCOMMENT TO DEBUG RESPONSE !
    // (actually, just use firebug)
    //alert(http.responseText);
      
      
    if(!xmldoc){
      return false;
    }

    var pexml_blocks = xmldoc.getElementsByTagName('pe_xml_req');

    if(pexml_blocks.length >0)
    {
      var xml = pexml_blocks[0];        


          
      //Set elements contenta
      var sets = xml.getElementsByTagName('set');
      _set( 'set', sets );
      var replacements = xml.getElementsByTagName('replace');
      _set( 'replace', replacements );
      
      var evals = xml.getElementsByTagName('eval')
        for(var i=0; i<evals.length; i++)
        {
          var jeval = evals[i];
                
          eval(aj_extract_content(jeval));
      
        }

      //popup alerts
      var alerts = xml.getElementsByTagName('alert');

      for(i=0;i<alerts.length;i++)
      {
        alert(alerts[i].firstChild.data);								
      }

      //popup windows with content
      var popups = xml.getElementsByTagName('newwindow');
				
      for(var i=0;i<popups.length;i++)
      {

        var popup = popups[i];

        var title =
          aj_extract_content(popup.getElementsByTagName('title')[0]);

        var content =
					aj_extract_content(popup.getElementsByTagName('content')[0]);
        var width =
					aj_extract_content(popup.getElementsByTagName('width')[0]);
        var height =
					aj_extract_content(popup.getElementsByTagName('height')[0]);


        var newWindow = window.open('','peajwin' + (aj_popcount++), "width="+width+",height="+height+",scrollbars=yes, resizeable=yes, dependent=yes, status=no");
        newWindow.document.write(content);
        newWindow.document.close();
      }


      var redirects = xml.getElementsByTagName('redirect');

      if(redirects.length > 0){
        //Only ever one redirect, and we do nothing else!
        window.location.href = aj_extract_content(redirects[0]);
      }

    }
     
  
    //get rid of loading indicator (if we have one)
    if(document.getElementById('ajax_loading')){
      document.getElementById('ajax_loading').style.display='none'
        }
  

  }
}

function aj_extract_content(node)
{
	data = '';

	children = node.childNodes;

	for(var i=0; i < children.length; i++)
	{
		data += children[i].nodeValue;
	}
  
	return data;	
}
function aj_collect_form(name)
{
  var form = document.getElementById(name);
  var elements = form.elements;
  var uri;

  for(var i=0; i<elements.length; i++)
  { 
    var element = elements[i];
    if(element.nodeName == "INPUT"){
      uri += '&' + element.name + '=' + escape(element.value);
    }    
  }

  return uri;
}



