/**
* Returns an XMLHttp instance to use for asynchronous
* downloading. This method will never throw an exception, but will
* return NULL if the browser does not support XmlHttp for any reason.
* @return {XMLHttpRequest|Null}
*/
function createXmlHttpRequest() {
 try {
  if (typeof ActiveXObject!='undefined') { return new ActiveXObject('Microsoft.XMLHTTP'); }
  else if (window["XMLHttpRequest"]) { return new XMLHttpRequest(); } }
 catch(e) { changeStatus(e); }
 return null; };

/**
* This functions wraps XMLHttpRequest open/send function.
* It lets you specify a URL and will call the callback if
* it gets a status code of 200.
* @param {String} url The URL to retrieve
* @param {Function} callback The function to call once retrieved.
*/
function downloadUrl(url,callback) {
 var status=-1;
 var request=createXmlHttpRequest();
 if (!request) { return false; }

 request.onreadystatechange=function() {
 if (request.readyState==4) {
  try {
   status=request.status; }
  catch(e) { }
  // Usually indicates request timed out in FF.
  if (status==200) {
   callback(request.responseXML,request.status);
   request.onreadystatechange=function() {}; } } }

 request.open('GET',url,true);
 try { request.send(null); }
 catch (e) { changeStatus(e); } };

/**
 * Parses the given XML string and returns the parsed document in a
 * DOM data structure. This function will return an empty DOM node if
 * XML parsing is not supported in this browser.
 * @param {string} str XML string.
 * @return {Element|Document} DOM.
 */
function xmlParse(str) {
 if (typeof ActiveXObject!='undefined' && typeof GetObject!='undefined') {
  var doc=new ActiveXObject('Microsoft.XMLDOM');
  doc.loadXML(str);
  return doc; }

 if (typeof DOMParser!='undefined') {
  return (new DOMParser()).parseFromString(str,'text/xml'); }
 return createElement('div',null); }

/**
 * Appends a JavaScript file to the page.
 * @param {string} url
 */
function downloadScript(url) {
 var script=document.createElement('script');
 script.src=url;
 document.body.appendChild(script); }

function clearPreviousResults() {
 var detailsX=document.getElementById("details");
 while (detailsX.childNodes.length>0) { detailsX.removeChild(detailsX.childNodes[0]); } }

function parseXML(data) {
 var ld=document.createElement("div");
 var lName="";
 var lType="";
 var lAddr="";
 var lCSZ="";
 var lHours="";
 var lPhone="";
 var lLong=0;
 var lLat=0;
 var lURL="";
 var lAuthor="";
 var lID=0;
 var lCool=0;
 var lDive=0;
 var zLine="";
 var line1="";
 var xVar="";
 var lNotes="";
 var lnTime="";
 var lnType="";
 var lnCool="";
 var lnDive="";
 var lnText="";
 var lnAuthor="";
 var lnT="";
 var lnR="";
 var lnC="";
 var lnS1="";
 var lnS2="";
 var lnS3="";
 var gN;
 var gA;
 var gC;
 var gI;
 var gL;
 var gNZ;
 var zz;
 var gKey;
 var rStyle0="nCellGD0";
 var rStyle1="nCellGD1";
 var rStyle;
 var rCount=0;
 var gameCO=0;
 var gameCN=0;
 var lz=document.createElement("p");
 var gameCX=Array("Unknown","Perfect","Excellent","Good","Playable","Warning","Serious Issues","It's Dead, Jim");
 var gameZ=Array();
 lz.setAttribute((IE ? "className" : "class"),"item1");
 // Get and set up location data.
 var locStuff=data.documentElement.getElementsByTagName("lData");
 try { lName=data.documentElement.getElementsByTagName("lA")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lType=data.documentElement.getElementsByTagName("lB")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lAddr=data.documentElement.getElementsByTagName("lC")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lCSZ=data.documentElement.getElementsByTagName("lD")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lHours=data.documentElement.getElementsByTagName("lE")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lPhone=data.documentElement.getElementsByTagName("lF")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lLong=data.documentElement.getElementsByTagName("lG")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lLat=data.documentElement.getElementsByTagName("lH")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lURL=data.documentElement.getElementsByTagName("lI")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lAuthor=data.documentElement.getElementsByTagName("lJ")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lID=data.documentElement.getElementsByTagName("lK")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lCool=data.documentElement.getElementsByTagName("lL")[0].childNodes[0].nodeValue; }
 catch(e) { }
 try { lDive=data.documentElement.getElementsByTagName("lM")[0].childNodes[0].nodeValue; }
 catch(e) { }
 if (lURL) {
  xVar=document.createElement("a");
  xVar.setAttribute("href",lURL);
  xVar.setAttribute((IE ? "className" : "class"),"itemHead");
  xVar.appendChild(document.createTextNode(lName)); }
 else {
  xVar=document.createElement("span");
  xVar.setAttribute((IE ? "className" : "class"),"head1");
  xVar.appendChild(document.createTextNode(lName)); }
 lz.appendChild(xVar);
 lz.appendChild(document.createElement("br"));
   
 if (lType) {
  xVar=document.createElement("span");
  xVar.setAttribute((IE ? "className" : "class"),"head2");
  xVar.appendChild(document.createTextNode(lType));
  lz.appendChild(xVar);
  lz.appendChild(document.createElement("br")); }
    
 if (lAddr) {
  lz.appendChild(document.createTextNode(lAddr));
  lz.appendChild(document.createElement("br")); }
  
 if (lCSZ) {
  lz.appendChild(document.createTextNode(lCSZ));
  lz.appendChild(document.createElement("br")); }
    
 if (lPhone) {
  lz.appendChild(document.createTextNode(lPhone));
  lz.appendChild(document.createElement("br")); }

 if (lHours) {
  lz.appendChild(document.createTextNode("Hours: "+lHours));
  lz.appendChild(document.createElement("br")); }
    
 if (lCool!="X") {
  lz.appendChild(document.createTextNode("Cool-O-Meter: "+lCool));
  lz.appendChild(document.createElement("br")); }

 if (lDive!="X") {
  lz.appendChild(document.createTextNode("Dive-O-Meter: "+lDive));
  lz.appendChild(document.createElement("br")); }

 if (lAuthor) {
  lz.appendChild(document.createElement("br"));
  lz.appendChild(document.createTextNode("Reported by "+lAuthor));
  lz.appendChild(document.createElement("br")); }

 var zz;
 zz=document.createElement("a");
 zz.setAttribute("href","http://www.laughingotter.com/pinball/drivingDirections.php?thisLoc="+lID);
 zz.setAttribute("target","_blank");
 zz.setAttribute((IE ? "className" : "class"),"itemHead");
 zz.setAttribute("title","Driving Directions");
 zz.appendChild(document.createTextNode("Driving Directions"));
 lz.appendChild(zz);
 lz.appendChild(document.createElement("br"));
 zz=document.createElement("a");
 zz.setAttribute("href","http://www.laughingotter.com/pinball/notesThingy.php?xT=LO&xI="+lID);
 zz.setAttribute("target","_blank");
 zz.setAttribute((IE ? "className" : "class"),"itemHead");
 zz.setAttribute("title","Enter Location Notes");
 zz.appendChild(document.createTextNode("Enter Location Notes"));
 lz.appendChild(zz);
 lz.appendChild(document.createElement("br"));
 ld.appendChild(lz);

 // Get and create this location's game list.
 var lz=document.createElement("table");
 lz.setAttribute((IE ? "className" : "class"),"pDisplay");
  
 line1=document.createElement("tr");
 line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
 line2=document.createElement("td");
 line2.setAttribute((IE ? "className" : "class"),"nHead");
 line2.appendChild(document.createTextNode("Games"));
 line1.appendChild(line2);
 lz.appendChild(line1);

 var lgStuff=data.documentElement.getElementsByTagName("game");
 for (i=0;i<lgStuff.length;i++) {
  gN=lgStuff[i].childNodes[0].nodeValue;
  gNZ=gN;
  gA=lgStuff[i].attributes;
  gC=gA.getNamedItem("c").value;
  gI=gA.getNamedItem("i").value;
  gL=gA.getNamedItem("l").value;
  gCZ=(gC==0) ? "" : " ("+gameCX[gC]+")";
  if (gCZ!="") { gN+=gCZ; }
  
  zKey="G"+gL;
  gameZ[zKey]=gNZ;
  rStyle=(rCount++%2==0) ? rStyle0 : rStyle1;
  
  line1=document.createElement("tr");
  line1.setAttribute((IE ? "className" : "class"),"am");
  line2=document.createElement("td");
  line2.setAttribute((IE ? "className" : "class"),rStyle);
 
  if (gI!="") {
   line3=document.createElement("a");
   line3.setAttribute("href",("http://www.ipdb.org/machine.cgi?id="+gI));
   line3.setAttribute((IE ? "className" : "class"),"itemLink");
   line3.setAttribute("target","_blank");
   line3.setAttribute("title","Internet Pinball Database Entry");
   line3.appendChild(document.createTextNode(gN)); }
  else { line3=document.createTextNode(gN); }
  line2.appendChild(line3);
  line2.appendChild(document.createElement("br"));

  line4=document.createElement("a");
  line4.setAttribute("href",("http://www.laughingotter.com/pinball/notesThingy.php?xT=LG&xI="+gL));
  line4.setAttribute((IE ? "className" : "class"),"itemLink");
  line4.setAttribute("target","_blank");
  line4.setAttribute("title","Enter Notes");
  line4.appendChild(document.createTextNode("Notes"));
  line5=document.createElement("a");
  line5.setAttribute("href",("http://www.laughingotter.com/pinball/notesThingy.php?xT=CC&xI="+gL));
  line5.setAttribute((IE ? "className" : "class"),"itemLink");
  line5.setAttribute("target","_blank");
  line5.setAttribute("title","Change Game Condition");
  line5.appendChild(document.createTextNode("Condition"));
  line6=document.createElement("a");
  line6.setAttribute("href",("http://www.laughingotter.com/pinball/notesThingy.php?xT=HS&xI="+gL));
  line6.setAttribute((IE ? "className" : "class"),"itemLink");
  line6.setAttribute("target","_blank");
  line6.setAttribute("title","High Score Entry");
  line6.appendChild(document.createTextNode("High Score"));

  zz=document.createElement("span");
  zz.appendChild(document.createTextNode("[ "));
  zz.appendChild(line4);
  zz.appendChild(document.createTextNode(" * "));
  zz.appendChild(line5);
  zz.appendChild(document.createTextNode(" * "));
  zz.appendChild(line6);
  zz.appendChild(document.createTextNode(" ]"));
  zz.appendChild(document.createElement("br"));
  line2.appendChild(zz);
  line1.appendChild(line2);
  lz.appendChild(line1); }
  
 line1=document.createElement("tr");
 line1.setAttribute((IE ? "className" : "class"),"am");
 line2=document.createElement("td");
 line2.setAttribute((IE ? "className" : "class"),"nCellLC");
 line3=document.createElement("p");
 line4=document.createElement("a");
 line4.setAttribute("href",("http://www.laughingotter.com/pinball/locationEdit2.php?locationID="+lID));
 line4.setAttribute((IE ? "className" : "class"),"itemLink");
 line4.setAttribute("target","_blank");
 line4.setAttribute("title","Edit Location Data");
 line4.appendChild(document.createTextNode("Edit Location"));
 line3.appendChild(line4);
 line2.appendChild(line3);
 line3=document.createElement("p");
 line4=document.createElement("a");
 line4.setAttribute("href",("http://www.laughingotter.com/pinball/locationGameGrid.php?locationID="+lID));
 line4.setAttribute((IE ? "className" : "class"),"itemLink");
 line4.setAttribute("target","_blank");
 line4.setAttribute("title","Change Location Lineup");
 line4.appendChild(document.createTextNode("Lineup Change"));
 line3.appendChild(line4);
 line2.appendChild(line3);
 line1.appendChild(line2);
 lz.appendChild(line1);
 ld.appendChild(lz);

 // Get and create the location notes block.
 lX=0;
 try {
 var lnNodes=data.documentElement.getElementsByTagName("lNotes");
 var yNodes=lnNodes[0].getElementsByTagName("lNote");

 if (yNodes.length>0) {
  var lNotes=document.createElement("table");
  lNotes.setAttribute((IE ? "className" : "class"),"pDisplay");
  
  line1=document.createElement("tr");
  line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
  line2=document.createElement("td");
  line2.setAttribute((IE ? "className" : "class"),"nHead");
  line2.appendChild(document.createTextNode("Location Notes"));
  line1.appendChild(line2);
  lNotes.appendChild(line1); }
  
 for (j=0;j<yNodes.length;j++) {
  yN=yNodes[j];
  lnType=yN.getElementsByTagName("lnZ")[0].firstChild.nodeValue;
  lnTime=yN.getElementsByTagName("lnT")[0].firstChild.nodeValue;
  lnAuthor=yN.getElementsByTagName("lnA")[0].firstChild.nodeValue;
  // Location note itself may or may not be there.
  try { lnText=yN.getElementsByTagName("lnX")[0].firstChild.nodeValue; }
  catch(e) { lnText=""; }
  line1=document.createElement("tr");
  line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
  line2=document.createElement("td");
  line2.setAttribute((IE ? "className" : "class"),"nCellT1O");
  line2.appendChild(document.createTextNode(lnTime+" - "+lnAuthor));
  line1.appendChild(line2);
  lNotes.appendChild(line1);

  if (lnType=="R") {
   // Rating 
   lnS1=(lnText!="") ? "nCellM1O" : "nCellM1C";
   try { lnCool=yN.getElementsByTagName("lnC")[0].firstChild.nodeValue; }
   catch(e) { lnCool=""; }
   try { lnDive=yN.getElementsByTagName("lnD")[0].firstChild.nodeValue; }
   catch(e) { lnDive=""; }
   line1=document.createElement("tr");
  line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
   line2=document.createElement("td");
   line2.setAttribute((IE ? "className" : "class"),lnS1);
   if (lnCool!="") {
    line2.appendChild(document.createTextNode("Cool-O-Meter: "+lnCool));
    line2.appendChild(document.createElement("br")); }
   if (lnDive!="") {
    line2.appendChild(document.createTextNode("Dive-O-Meter: "+lnDive));
    line2.appendChild(document.createElement("br")); }
   line1.appendChild(line2);
   lNotes.appendChild(line1); }
  if (lnText) {
   line1=document.createElement("tr");
   line1.setAttribute((IE ? "className" : "class"),"am");
   line2=document.createElement("td");
   line2.setAttribute((IE ? "className" : "class"),"nCellC1O");
   line2.appendChild(document.createTextNode(lnText));
   line1.appendChild(line2);
   lNotes.appendChild(line1); } }
 lX=1; }
 catch(e) { lX=0; }

 // Get and create the game notes block.
 var gX=0;
 try {
  var gnNodesX=data.documentElement.getElementsByTagName("gNotesX");
  var gGNodesX=gnNodesX[0].getElementsByTagName("gNotes");
  var gGX=gGNodesX.length;
  if (gGX>0) {
   gX=1;
   var gNotes=document.createElement("table");
   gNotes.setAttribute((IE ? "className" : "class"),"pDisplay");
  
   line1=document.createElement("tr");
   line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
   line2=document.createElement("td");
   line2.setAttribute("width","pDispR");
   line2.setAttribute((IE ? "className" : "class"),"nHead");
   line2.appendChild(document.createTextNode("Game Notes"));
   line1.appendChild(line2);
   gNotes.appendChild(line1); }
  for (j=0;j<gGX;j++) {
   gA=gGNodesX[j].attributes;
   gC=gA.getNamedItem("g").value;
   gKey="G"+gC;
   var gGNodes=gGNodesX[j].getElementsByTagName("gNote");
   var gGL=gGNodes.length;
   try {
    line1=document.createElement("tr");
    line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
    line2=document.createElement("td");
    line2.setAttribute((IE ? "className" : "class"),"nCellG1O");
    line2.appendChild(document.createTextNode(gameZ[gKey]));
    line1.appendChild(line2);
    gNotes.appendChild(line1); }
   catch(e) { alert(e); }
   for (i=0;i<gGL;i++) {
    var yN=gGNodes[i];
    try { gnType=yN.getElementsByTagName("gnZ")[0].firstChild.nodeValue; }
    catch(e) { gnType=""; }
    try { gnTime=yN.getElementsByTagName("gnT")[0].firstChild.nodeValue; }
    catch(e) { gnTime=""; }
    try { gnAuthor=yN.getElementsByTagName("gnA")[0].firstChild.nodeValue; }
    catch(e) { gnAuthor=""; }
    // Game note itself may or may not be there.
    try { gnText=yN.getElementsByTagName("gnX")[0].firstChild.nodeValue; }
    catch(e) { gnText=""; }
    gnS1=(gnText!="") ? "nCellM1O" : "nCellM1C";
    try { gnDesc=yN.getElementsByTagName("gnD")[0].firstChild.nodeValue; }
    catch(e) { gnDesc=""; }
    line1=document.createElement("tr");
    line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
    line2=document.createElement("td");
    line2.setAttribute((IE ? "className" : "class"),"nCellT1O");
    line2.appendChild(document.createTextNode(gnTime+" - "+gnAuthor));
    line1.appendChild(line2);
    gNotes.appendChild(line1);
    nlX="";
    if (gnType=="H") { nlX="High Score: "; }
    if (gnType=="C") { nlX="Condition change: "; }
    if (nlX!="") {
     if (gnType=="H") { nlX+=gnDesc; }
     if (gnType=="C") {
      gnDX=parseInt(gnDesc);
      if (gnDX<10) { gnCOld=0; gnCNew=gnDX; }
      else { gnCOld=parseInt(gnDX/10); gnCNew=gnDX%10; }
      nlX+=gameCX[gnCOld]+" to "+gameCX[gnCNew]; }
     line1=document.createElement("tr");
     line1.setAttribute((IE ? "className" : "class"),"pDispHdr");
     line2=document.createElement("td");
     line2.setAttribute((IE ? "className" : "class"),gnS1);
     line2.appendChild(document.createTextNode(nlX));
     line2.appendChild(document.createElement("br"));
     line1.appendChild(line2);
     gNotes.appendChild(line1); }	
    if (gnText) {
     line1=document.createElement("tr");
     line1.setAttribute((IE ? "className" : "class"),"am");
     line2=document.createElement("td");
     line2.setAttribute((IE ? "className" : "class"),"nCellC1O");
     line2.appendChild(document.createTextNode(gnText));
     line1.appendChild(line2);
     gNotes.appendChild(line1); } } } }
 catch(e) { gX=0; }

 document.getElementById("details").appendChild(ld);
 if (lX==1) { document.getElementById("details").appendChild(lNotes); }
 if (gX==1) { document.getElementById("details").appendChild(gNotes); } }
