<!--
 * 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.
-->
<html>

  <head>
    <base target=xtc_menu>
  </head>

  <body bgcolor=#ffffff>

    <center><h1>Server-side XSL transformations</h1><p></center>

    <script language="JavaScript">

      function getURI() {
        var root = "http://gobsheen.ireland/morten/Sun/XTC/demo/plays/";
	var menu = document.XMLinput.elements[0];
        var play = menu.options[menu.selectedIndex].value;
        return(root+play);
      }

      function getTranslet() {
	var menu = document.XMLinput.elements[1];
        var translet = menu.options[menu.selectedIndex].value;
	return(translet);
      }

      function setHTMLlocation(translet) {
        var uri = getURI();
        var translet = getTranslet();
        var source = "http://gobsheen:8000/Transform/Transform?"+
                     "document="+uri+"&translet="+translet;
        open(source,"bottom");
      }

      function setXMLlocation() {
        var target = parent.frames.demo_bottom;
        var uri = getURI();
        open(uri,"bottom");
      }

    </script>

    <form name="XMLinput">

    <table>
    <tr>
      <td>
        <b>Source document:</b>
      </td>
      <td>
        <select name="dropdown">
          <option value="AsYouLikeIt.xml">As You Like It
          <option value="Cymbeline.xml">Cymbeline
          <option value="Hamlet.xml">The Tragedy of Hamlet
          <option value="HenryV.xml">The Life of Henry V
          <option value="HenryVIII.xml">The Famous History of the Life of Henry VIII
          <option value="KingJohn.xml">The Life and Death of King John
          <option value="KingLear.xml">The Tragedy of King Lear
          <option value="KingRichardII.xml">The Tragedy of King Richard II
          <option value="MeasureForMeasure.xml">Measure for Measure
          <option value="MerchantOfVenice.xml">The Merchant of Venice
          <option value="MerryWivesOfWindsor.xml">The Merry Wives of Windsor
          <option value="MidsummerNightsDream.xml">A Midsummer Night's Dream
          <option value="MuchAdoAboutNothing.xml">Much Ado about Nothing
          <option value="PericlesPrinceOfTyre.xml">Pericles, Prince of Tyre
          <option value="RomeoAndJuliet.xml">The Tragedy of Romeo and Juliet
          <option value="TamingOfTheShrew.xml">The Taming of the Shrew
          <option value="TheTempest.xml">The Tempest
          <option value="TimonOfAthens.xml">The Life of Timon of Athens
          <option value="TragedyOfCoriolanus.xml">The Tragedy of Coriolanus
          <option value="TragedyOfJuliusCaesar.xml">The Tragedy of Julius Caesar
          <option value="TragedyOfOthello.xml">The Tragedy of Othello, the Moor of Venice
          <option value="TroilusAndCresida.xml">The History of Troilus and Cressida
          <option value="TwelfthNight.xml">Twelfth Night, or What You Will
          <option value="TwoGentlementOfVerona.xml">The Two Gentlemen of Verona
          <option value="WintersTale.xml">The Winter's Tale
        </select>
      </td>
    </tr>
    <tr>
      <td>
        <b>Transformation:</b>
      </td>
      <td>
        <select name="dropdown">
          <option value="PlayToHTML">Full
          <option value="PlayToSpeakers">Speakers
          <option value="PlayToIndex">Index
        </select>
      </td>
    </tr>
    <tr>
      <td>
        <b>Method:</b>
      </td>
      <td>
        <input type="button" value="Transform" onClick="setHTMLlocation()">
        <input type="button" value="XML source" onClick="setXMLlocation()">
      </td>
    </tr>
  </table>
  </form>

  </body>

</html>
