<html>
<head>
<title>Target Management Project Updates</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style>@import url("web/site.css");</style>
<script type="text/javascript">
	var returnval = 0;
	var stylesheet, xmlFile, cache, doc;
	function init(){
		// NSCP 7.1+ / Mozilla 1.4.1+ / Safari
		// Use the standard DOM Level 2 technique, if it is supported
		if (document.implementation && document.implementation.createDocument) {
			xmlFile = document.implementation.createDocument("", "", null);
			stylesheet = document.implementation.createDocument("", "", null);
			if (xmlFile.load){
				xmlFile.load("site.xml");
				stylesheet.load("web/site.xsl");
			} else {
				alert("Document could not be loaded by browser.");
			}
			xmlFile.addEventListener("load", transform, false);
			stylesheet.addEventListener("load", transform, false);
		}
		//IE 6.0+ solution
		else 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;
			transformData();
		}
	}
	// separate transformation function for IE 6.0+
	function transformData(){
		var processor = cache.createProcessor();
		processor.input = xmlFile;
		processor.transform();
		data.innerHTML = processor.output;
	}
	// separate transformation function for NSCP 7.1+ and Mozilla 1.4.1+ 
	function transform(){
		returnval+=1;
		if (returnval==2){
			var processor = new XSLTProcessor();
			processor.importStylesheet(stylesheet); 
			doc = processor.transformToDocument(xmlFile);
			document.getElementById("data").innerHTML = doc.documentElement.innerHTML;
		}
	}
</script>
</head>
<body onload="init();">
	<div align="right" width="230">
	  <a href="http://www.eclipse.org/dsdp/tm/images/RSESample.gif">
        <img src="http://www.eclipse.org/dsdp/tm/images/RSESample_4x.gif" alt="[RSE Sample Screenshot]" border="0" width="230" height="165" title="RSE Sample Screenshot" />
      </a>
    </div>

	<h1 class="title">Target Management Project Updates</h1>
	<h2>Just getting started?</h2>
      <p><b>See <a href="http://www.eclipse.org/dsdp/tm/tutorial/">http://www.eclipse.org/dsdp/tm/tutorial/</a></b></p>
    <hr/>
    <p>For getting the software on this site, you need to use the Eclipse
    <a href="http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.user/tasks/tasks-34.htm">
    Update Manager</a> (choose <i>Help &gt; Software Updates &gt; Find and Install</i>
    in Eclipse 3.2 or later).<br/>
    Define a new remote update site named "Target Management Updates",
    and specify</p>
    <p><code>&nbsp;&nbsp;&nbsp;http://download.eclipse.org/dsdp/tm/updates/</code></p>
    <p>as the URL to use.
    See <a href="http://help.eclipse.org/help32/index.jsp?topic=/org.eclipse.platform.doc.user/tasks/tasks-34.htm">
      Eclipse Help</a> for general information about using Update Manager.</p>
    <p>If you do not have Eclipse installed yet, better use the 
    <a href="http://download.eclipse.org/dsdp/tm/downloads/">downloads from this site</a>.</p>
<!--[insert static HTML here]-->
<div id="data"><!-- this is where the transformed data goes --></div>
</body>
</html>
