<html>
<head>
<title>PTP Update Site</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>@import url("web/site.css");</style>
<script type="text/javascript">
    var transformDone = false;
    var stylesheet, xmlFile;

    function loadXMLDoc(url, callback) {
        if (window.XMLHttpRequest) {
            var req = new XMLHttpRequest();

            function processReqChange() {
                if (req.readyState == 4) {    // only if req shows "loaded"
                    if (req.status == 200) {  // only if "OK"
                        callback(req.responseXML);
                    } else {
                        alert("There was a problem retrieving the XML data:\n" + req.statusText);
                    }
                }
            }

            req.onreadystatechange = processReqChange;
            req.open("GET", url, true);
            req.send(null);
        }
    }

    function init() {
        if (window.ActiveXObject) {
            xmlFile = new ActiveXObject("msxml2.DOMDocument.3.0");
            xmlFile.async = false;
            xmlFile.load("site.xml");
            stylesheet = new ActiveXObject("msxml2.FreeThreadedDOMDocument.3.0");
            stylesheet.async = false;
            stylesheet.load("web/site.xsl");
            cache = new ActiveXObject("msxml2.XSLTemplate.3.0");
            cache.stylesheet = stylesheet;
            transformDataIE();
        } else {
            xmlFile = stylesheet = null;
            transformDone = false;
	    loadXMLDoc("site.xml",
                function(result) {
		    xmlFile = result;
                    transform();
                }
            );
            loadXMLDoc("web/site.xsl",
                function(result) {
                    stylesheet = result;
                    transform();
                }
	    );
        }
    }
    function transform() {
        if (!transformDone && xmlFile && stylesheet) {
            var processor = new XSLTProcessor();
            processor.importStylesheet(stylesheet);
            var doc = processor.transformToDocument(xmlFile);
            var dataDivBody = document.getElementById("data");
//          alert(new XMLSerializer().serializeToString(doc.documentElement.innerHTML));
            dataDivBody.innerHTML = doc.documentElement.innerHTML;
            transformDone = true;
        }
    }
    function transformDataIE() { // separate transformation function for IE 6.0+
        var processor = cache.createProcessor();
        processor.input = xmlFile;
	processor.transform();
	data.innerHTML = processor.output;
    }
</script>
</head>
<body onload="init();">
<!--[insert static HTML here]-->
<div id="data"><!-- this is where the transformed data goes --></div>
</body>
</html>
