function getXMLHttp() {
  var XMLHttp;
  try {    
    XMLHttp = new XMLHttpRequest(); // firefox, opera, safari
  } catch(e) { 
    try {
      XMLHttp = new ActiveXObject("Microsoft.XMLHTTP"); // ie 5.5+
    } catch(e) {
      try {
        XMLHttp = new ActiveXObject("Msxml2.XMLHTTP.3.0"); // ie 6.0+
      } catch (e) {
        return false;
      }
    }
  }
  return XMLHttp;
}      

var XMLHttp = getXMLHttp(); // AJAX object -> only have one instance so we can abort searches etc.
var abn_wait = null;
var abn_cancel = null;

function cancelLookup() {	
	XMLHttp.abort();
  if(document.getElementById('abn_cancel')) {abn_cancel = document.getElementById('abn_cancel');}
  if(document.getElementById('abn_wait')) {abn_wait = document.getElementById('abn_wait');}
	abn_wait.style.display = "";
	abn_cancel.style.display = "";
}

function abnLookup(fieldID_orgname, fieldLABEL_orgname, formname, fieldID_orgtype, fieldID_orgnumber, fieldID_orgentitytype) {
  var orgname = document.getElementById(fieldID_orgname);
  var orgname_value = trim(orgname.value);
  var abn_lookup = document.getElementById('abn_lookup');
  var abn_wait = document.getElementById('abn_wait');
  var form = document.getElementById(formname);
  
  if(orgname_value == "") { alert('Please enter your ' + fieldLABEL_orgname); orgname.focus(); return false; }
          
  if(abn_wait.style.display == "") {
    if(document.getElementById('abn_cancel')) {abn_cancel = document.getElementById('abn_cancel');}
    if(document.getElementById('abn_wait')) {abn_wait = document.getElementById('abn_wait');}		
    abn_wait.style.display = "inline";
		abn_cancel.style.display = "inline";
  } else {
    return false; // still waiting for results
  }
  
  //var XMLHttp = getXMLHttp();
  
  if(XMLHttp) {   
    XMLHttp.onreadystatechange = function() {
      if(XMLHttp.readyState == 4) { // request is complete (Could be because the user cancelled)

        var XMLResponse = XMLHttp.responseXML;
				if(!XMLResponse) {return} // No response, user has probably cancelled
				
        var doc_root = XMLResponse.getElementsByTagName("abn_lookup")[0];
        var records = XMLResponse.getElementsByTagName("record");          
        var actualRecords = [];
        // filter out any ABN that is not active
        for(var i = 0; i < records.length; i++) { // loop each record
          if( (records[i].getElementsByTagName("status")[0].firstChild.nodeValue == "Active") && (records[i].getElementsByTagName("iscurrentindicator")[0].firstChild.nodeValue == "Y") ) {                              
            // Because removeChild is dynamic records.length actually changes as we go along,
            // So we can't move the index forward manually - we are already at the next element!
            // To make matters worse, IE doesn't follow this convention so we need to be careful
            actualRecords[actualRecords.length] = records[i];
          }
        }
        // This works across browsers
        records = actualRecords;
        
        var div = document.createElement('div'); // create div element
        div.id = 'abn_div';
        abn_lookup.appendChild(div);
        
        var abn_div = document.getElementById('abn_div');
    
        if(records.length > 0) {
          
          var table = document.createElement('table'); // create table element
          table.id = 'abn_table';
          abn_div.appendChild(table);
          var abn_table = document.getElementById('abn_table');
          
          var tbody = document.createElement('tbody'); // create tbody element
          tbody.id = 'abn_tbody';
          abn_table.appendChild(tbody);
          var abn_tbody = document.getElementById('abn_tbody');
          
          // create header row
          
          var tr = document.createElement('tr');

          var td_abn = document.createElement('td');
          var td_name = document.createElement('td');
          var td_state = document.createElement('td');
          var td_postcode = document.createElement('td');
          
          td_abn.className = "header";
          td_name.className = "header";
          td_state.className = "header";
          td_postcode.className = "header";
          
          td_abn.innerHTML = "ABN";
          td_name.innerHTML = "Entity Name";
          td_state.innerHTML = "State";
          td_postcode.innerHTML = "Postcode";
          
          tr.appendChild(td_abn);
          tr.appendChild(td_name);
          tr.appendChild(td_state);
          tr.appendChild(td_postcode);
          
          abn_tbody.appendChild(tr);
          
          for(var i = 0; i < records.length; i++) { // loop each record
            
            tr = document.createElement('tr'); // create data row

            // if(i % 2 == 0) { tr.className = 'even'; }
            
            // set event handlers: add/remove hover effects + set abn value
            tr.onmouseover = function() { this.className += " highlight"; }
            tr.onmouseout = function() { this.className = this.className.replace("highlight", ""); }
            tr.onmousedown = function() {
              
              document.getElementById(fieldID_orgtype).value = "ABN";
              if(this.getElementsByTagName("td")[0].firstChild) {document.getElementById(fieldID_orgnumber).value = this.getElementsByTagName("td")[0].firstChild.nodeValue;}
							if(this.getElementsByTagName("td")[1].firstChild) {document.getElementById(fieldID_orgname).value = this.getElementsByTagName("td")[1].firstChild.nodeValue;}
              // explicitly call onchange functions if set
              if(document.getElementById(fieldID_orgtype) && typeof(document.getElementById(fieldID_orgtype).onchange) == "function") document.getElementById(fieldID_orgtype).onchange();
              if(document.getElementById(fieldID_orgtype) && typeof(document.getElementById(fieldID_orgtype).onchange) == "function") document.getElementById(fieldID_orgnumber).onchange();
							if(document.getElementById(fieldID_orgentitytype) && typeof(document.getElementById(fieldID_orgentitytype).onchange) == "function") document.getElementById(fieldID_orgentitytype).onchange();
            }
            
            td_abn = document.createElement('td');
            td_name = document.createElement('td');
            td_state = document.createElement('td');
            td_postcode = document.createElement('td');
            
            if(records[i].getElementsByTagName("abn")[0].firstChild) {td_abn.innerHTML = records[i].getElementsByTagName("abn")[0].firstChild.nodeValue;}
            if(records[i].getElementsByTagName("name")[0].firstChild) {td_name.innerHTML = records[i].getElementsByTagName("name")[0].firstChild.nodeValue;}
            if(records[i].getElementsByTagName("state")[0].firstChild) {td_state.innerHTML = records[i].getElementsByTagName("state")[0].firstChild.nodeValue;}
            if(records[i].getElementsByTagName("postcode")[0].firstChild) {td_postcode.innerHTML = records[i].getElementsByTagName("postcode")[0].firstChild.nodeValue;}
            
            tr.appendChild(td_abn);
            tr.appendChild(td_name);
            tr.appendChild(td_state);
            tr.appendChild(td_postcode);
            
            abn_tbody.appendChild(tr);

          }
          
          if(abn_div.offsetHeight > 150) { abn_div.style.height = "150px"; } // hack required for IE5-6
          
        } else { // no records found
          var p = document.createElement('p');
          p.innerHTML = "No records found matching: " + orgname_value;                
          abn_div.appendChild(p);              
        }
        
		    if(document.getElementById('abn_cancel')) {abn_cancel = document.getElementById('abn_cancel');}
		    if(document.getElementById('abn_wait')) {abn_wait = document.getElementById('abn_wait');}				
        abn_wait.style.display = "";    // hide 'please wait' message
        abn_cancel.style.display = "";  // hide cancel link
				        
        // clear search results when user clicks anywhere
        document.getElementsByTagName("body")[0].onmousedown = function(e) {              
          if(!e) e = window.event;
          target = (e.target) ? e.target : e.srcElement; // IE uses srcElement                
          if(document.getElementById('abn_div') && target.id != 'abn_div') { cancelLookup(); abn_lookup.removeChild(abn_div); }
        }

        // SiteCatalyst Implementation
        if ('function' === typeof afterAjaxPage)
        {
          afterAjaxPage('abn-lookup');
        }
      }
    } 
		// Append a timestamp so that these calls aren't cached!
		var date = new Date();
		var time = date.getUTCMilliseconds()*date.getUTCSeconds()*date.getUTCMinutes()*date.getUTCHours()*date.getUTCFullYear();
    XMLHttp.open("GET", "/cc/soap/abn_lookup?name=" + encodeURI(orgname_value) + "&time=" + time, true);
    XMLHttp.send(null);
    
  } else {
    alert("Sorry, ABN Lookup function failed");
  }
}