﻿// Load XML as a string into a XML document object /////////////////////////////////////////////////

function createXMLDocument(text)
{
  var xmlDoc = null;

  if ((typeof text == 'object') && (text['#text'])) // Firefox
  {                                                 // Firefox
    text = text['#text'];                           // Firefox
  }                                                 // Firefox

  text = prepareXML(text);

  if (window.ActiveXObject)
  {
    xmlDoc = new ActiveXObject('Microsoft.XMLDOM');
    xmlDoc.async = false;
    xmlDoc.loadXML(text);
  }
  else if (window.DOMParser)
  {
    parser = new DOMParser();
    xmlDoc = parser.parseFromString(text, 'text/xml');
  }

  return xmlDoc;
}

// Load XML from a file into a XML document object /////////////////////////////////////////////////

function loadXMLDocument(filename)
{
  var xmlHttp = createXMLHttpRequest();

  xmlHttp.open("GET", filename, false);
  xmlHttp.send();
  
  return xmlHttp.responseXML;
}

// Return a XML element value //////////////////////////////////////////////////////////////////////

function xmlNodeValue(node)
{
  try
  {
    return notSet(node.text, notSet(node.textContent, node.nodeValue));
  }
  catch (error)
  {
    return '';
  }
}

// Transform XML with XSL //////////////////////////////////////////////////////////////////////////

function transformXML(xmlString, xslFilename, element)
{
  xmlDoc = createXMLDocument(xmlString);
  xslDoc = loadXMLDocument(xslFilename);

  element = document.getElementById(element);

  if (window.ActiveXObject) // Internet Explorer
  {
    element.innerHTML = xmlDoc.transformNode(xslDoc);
  }
  else if ((document.implementation) && (document.implementation.createDocument)) // Firefox, Opera, etc.
  {
    var xsltProcessor = new XSLTProcessor();
    xsltProcessor.importStylesheet(xslDoc);
    
    if ((element.hasChildNodes) && (element.removeChild))
    {
      while (element.hasChildNodes())
      {
        element.removeChild(element.lastChild);
      }
    }

    var resultDocument = xsltProcessor.transformToFragment(xmlDoc, document);

    try
    {
      element.appendChild(resultDocument); // causes problems in Chrome, Firefox and Safari
    }
    catch (err)
    {
      confirm(err.toString());
    }
  }
}

// Serialise XML document to string ////////////////////////////////////////////////////////////////

function serialiseXMLDocToString(xmlDoc)
{
  if (window.ActiveXObject) // Internet Explorer
  {
    return xmlDoc.xml;
  }
  else // Chrome, Firefox, Safari
  {
    return (new XMLSerializer()).serializeToString(xmlDoc);
  }
}

// Prepare XML /////////////////////////////////////////////////////////////////////////////////////

function prepareXML(xml)
{
  xml = xml.replace(/&amp;/g, '&');
  xml = xml.replace(/&/g, '&amp;');

  return xml;
}

