<!--
 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.                                           *
-->
<lift:surround with="base" at="left">
	<head>
		<!-- STYLESHEETS  -->
                 <link type="text/css" href="../style/jqueryui-theme/jquery-ui-1.8.2.custom.css" rel="stylesheet" />  
		<link type="text/css" href="../style/dialog.css" rel="stylesheet" />
		<script type="text/javascript" src="../scripts/jquery-ui-1.8.2.custom.min.js">    </script>
		<script type="text/javascript" src="../scripts/dialog_track.js">    </script>
		<lift:TableSorterSnip/>
		<script type="text/javascript" src="../scripts/esme.js">    </script>
		<script type="text/javascript" src="../scripts/esme_table_sorter_track.js"></script>
	</head>
	<div id="back-header">
		<h1>
			<lift:loc>ui_track_manage</lift:loc>
		</h1>
		<div class="container-settings">
			<div id="messages"></div>
			<span id="TrackSpan">
				<lift:ignore>
					<!--                        The displayTracking snippet *MUST* appear on the page before                        the main snippet                        -->
					</lift:ignore>
				<lift:displayTracking the_id="TrackSpan">
					<table id="esme-table" class="tablesorter">
						<thead>
							<tr>
								<th class="tipelement" title="This is the text that you are tracking.">
									<lift:loc>ui_track_manage_track</lift:loc>
								</th>
								<th class="tipelement" title="Whether this text is being tracked or not.">
									<lift:loc>ui_track_manage_active</lift:loc>
								</th>
								<th></th>
							</tr>
						</thead>
						<tbody>
							<disp:item>
								<tr class ="esme-tr">
									<td>
										<item:pattern/>
									</td>
									<td>
										<item:enabled/>
									</td>
									<td align="center">
										<item:remove/>
									</td>
								</tr>
							</disp:item>
						</tbody>
					</table>
				</lift:displayTracking>
			</span>
			<div id="dialog-form" style="display: none" title="Create a new track">
				<p class="validateTips">
					<lift:loc>ui_form_all_fields_required</lift:loc>
				</p>
				<form id="track_new_dialog" onsubmit="false">
					<lift:main>
						<fieldset>
							<label for="name">
								<lift:loc>ui_track_new_track_what</lift:loc>
							</label>
							<main:track class="text ui-widget-content ui-corner-all tipelement" title="This is the text that you want to follow." />
						</fieldset>
					</lift:main>
				</form>
			</div>
			<div class="post-form-row">
				<div class="submit-btn tipelement" title="Create a new track" >
					<input type="image" onclick="javascript:$('#dialog-form').dialog('open')" id="create-user" src="../images/new1.gif" />
				</div>
			</div>
		</div>
		<!-- End demo -->
		</div>
	<!-- End demo -->
	</lift:surround>
