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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title></title>
</head>
<body>

    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.0/jquery.min.js" type="text/javascript"></script>
    <script type="text/javascript" src="js/x_workflow_monitor.js" ></script>

    <h1>Get Experiment IDs</h1>
    <button name="btn2">Click</button>

    <table id="display"></table>

    <textarea id="experiment-list" rows="5" cols="150" placeholder="Experiment List">
    </textarea>

    <h1>Get Experiment Data</h1>
    Experiment ID : <input type="text" name="experimentId" id="experimentId1" size="75"><br/>
    <button name="btn3">Click</button>

    <textarea id="experiment-data" rows="5" cols="150" placeholder="Experiment Data">
    </textarea>

</body>
</html>