(function () {

var viewer = document.querySelector('.two-pane-viewer');

if (viewer) {
  var browser = viewer.querySelector('.browser.bp3-tree');
  var iframe = viewer.querySelector('.viewer iframe');
  if (browser && iframe) {

    function selectItem (item) {
      for (var el of browser.querySelectorAll('a')) {
        el.classList.remove('selected');
      }
      item.classList.add('selected');
    }

    for (var el of browser.querySelectorAll('.bp3-tree-node-label a')) {
      el.addEventListener('click', function (evt) {
        iframe.setAttribute('src', 'about:blank');

        var itemUrl = evt.target.getAttribute('href');
        // var extension = itemUrl.slice('-1');
        fetchResource(itemUrl, function () {
          if (this.responseXML) {
            try {
              iframe.setAttribute('src', 'about:blank');
              iframe.contentWindow.document.open();
              iframe.contentWindow.document.write(
                '<pre>' +
                new Option(prettyPrintXML(this.responseXML)).innerHTML +
                '</pre>');
              iframe.contentWindow.document.close();

            } catch (e) {
              iframe.setAttribute('src', itemUrl);
            }
          } else {
            iframe.setAttribute('src', itemUrl);
          }
        });

        selectItem(evt.target);

        evt.preventDefault();
        return false;
      });
    }
  }
}

function fetchResource(url, handleResourceResponse) {
  var oReq = new XMLHttpRequest();
  oReq.addEventListener("load", handleResourceResponse);
  oReq.open("GET", url);
  // oReq.overrideMimeType("text/plain; charset=x-user-defined");
  oReq.send();
}

function prettyPrintXML(xmlDoc) {
  var xsltDoc = new DOMParser().parseFromString([
    // describes how we want to modify the XML - indent everything
    '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
    '  <xsl:strip-space elements="*"/>',
    '  <xsl:template match="para[content-style][not(text())]">', // change to just text() to strip space in text nodes
    '    <xsl:value-of select="normalize-space(.)"/>',
    '  </xsl:template>',
    '  <xsl:template match="node()|@*">',
    '    <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>',
    '  </xsl:template>',
    '  <xsl:output indent="yes"/>',
    '</xsl:stylesheet>',
  ].join('\n'), 'application/xml');

  var xsltProcessor = new XSLTProcessor();    
  xsltProcessor.importStylesheet(xsltDoc);
  var resultDoc = xsltProcessor.transformToDocument(xmlDoc);
  var resultXml = new XMLSerializer().serializeToString(resultDoc);
  return resultXml;
};

}());