<!--
Copyright 2006 Google Inc.

Licensed 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.
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
Author: Steffen Meschkat (mesch@google.com)
Interactive jstemplates test page, specifically to demonstrate
recursive templates
-->
  <head>
    <title>Interactive tests for jstemplate</title>
    <script src="util.js" type="text/javascript"></script>
    <script src="jsevalcontext.js" type="text/javascript"></script>
    <script src="jstemplate.js" type="text/javascript"></script>
    <script src="jstemplate_example.js" type="text/javascript"></script>
    <style type="text/css">
      .section { border: 1px solid silver; margin: 1em; }
      .section TEXTAREA { border: none; width: 100%; }
    </style>
  </head>
  <body onload="jsinit()">
    <table summary="Test setup">
      <tr>
        <th>template</th>
        <th>data</th>
      </tr>
      <tr>
        <td>
          <textarea id="template" rows="15" cols="80"></textarea>
        </td>
        <td>
          <textarea id="js" rows="15" cols="80">
{ title: "title1", items: [
  { title: "title2", items: [
    { title: "title2", items: [
      { title: "title3", items: []},
      { title: "title4", items: []}
    ]},
    { title: "title5", items: []}
  ]},
  { title: "title3", items: []},
  { title: "title4", items: []},
  { title: "title5", items: []}
],
  testArray: ["", "", "1", "2"]
}
</textarea>
        </td>
      </tr>
      <tr>
        <td colspan="2">
          <a href="javascript:jstest(false)">process</a>
          <a href="javascript:jstest(true)">reprocess</a>
        </td>
      </tr>
      <tr>
        <th>output HTML</th>
        <th>output display</th>
      </tr>
      <tr>
        <td>
          <textarea id="html" rows="15" cols="80"></textarea>
        </td>
        <td>
          <div id="out" class="section"></div>
        </td>
      </tr>
    </table>
    <p><a href="javascript:jstest(false)">Process</a> the
    <b>template</b>, upper left, with the <b>data</b>, upper
    right. See the resulting DOM in <b>output display</b>, lower
    right, and the corresponding HTML text in <b>output HTML</b>,
    lower left. Notice, however, that the template processing happens
    directly on the HTML DOM, and the HTML text shown is merely the
    <code>innerHTML</code> of that DOM.</p>
    <p>Now, change the <b>data</b> and <a
    href="javascript:jstest(true)">reprocess</a> the DOM of the <b>output
    display</b> with the changed data, and see that the <b>output
    display</b> reflects the change. Notice that the reprocessing
    takes place on the DOM of <b>output display</b>, i.e. on the
    result of the previous template processing.</p>
    <div style="display:none" id="tc">
      <div id="t">
        <span jscontent="title"></span>
        <ul jsdisplay="items.length">
          <li jsselect="items">
            <div transclude="t"></div>
          </li>
        </ul>
        <div jsselect="testArray">
          content: <span jscontent="$this"></span>
        </div>
      </div>
    </div>
  </body>
</html>