<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements.  See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->
<wicket:panel>
<wicket:link>
  <script type="text/javascript" src="Trace.js" language="Javascript"></script>
  <link rel="stylesheet" type="text/css" href="Trace.css"/>
</wicket:link>

<wicket:remove>
  <script type="text/javascript" language="Javascript">
  <!--
  var openImg = new Image();
  openImg.src = "open.gif";
  var closedImg = new Image();
  closedImg.src = "closed.gif";

  function showBranch(branch) {
  	var objBranch = document.getElementById(branch).style;
  	if (objBranch.display == "block")
  		objBranch.display = "none";
  	else
  		objBranch.display = "block";
  }

  function swapFolder(img) {
  	objImg = document.getElementById(img);
  	if (objImg.src.indexOf('closed.gif') > -1)
  		objImg.src = openImg.src;
  	else
  		objImg.src = closedImg.src;
  }  
  //-->  
  </script>
</wicket:remove>


<h3 id="upstream_pedigree_heading">Upstream Pedigree</h3>
<span id="upstream_pedigree_tree" wicket:id="upstream_pedigree_tree">
</span>

<h3 id="downstream_pedigree_heading">Downstream Pedigree</h3>
<span wicket:id="downstream_pedigree_tree" id="downstream_pedigree_tree">
</span>
</wicket:panel>

<wicket:remove>
<div class="trigger"
	onClick="javascript:showBranch('branch1.1');swapFolder('folder1.1');">
		<img src="closed.gif" border="0" id="folder1.1" />
	testfile.txt
</div>
<span class="branch" id="branch1.1">
	<div class="trigger"
		onClick="javascript:showBranch('branch2.1');swapFolder('folder2.1');">
			<img src="closed.gif" border="0" id="folder2.1" />
		testfile2.txt
    </div>
	<span class="branch" id="branch2.1">
			<img src="doc.gif" />
		testfile3.txt<br />

				<img src="doc.gif" />
			testfile4.txt<br />
   </span>   
</span>

</wicket:remove>

