<%
// Licensed to the Apache Software Foundation (ASF) under one or more contributor
// license agreements.  See the NOTICE.txt 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.
%>
<% /* 
	* External libraries that might be used for this JSP (maybe none) 
	*/ 
%>
<%@ page
	import="java.util.List"
	import="java.util.ArrayList"
	import="java.util.Iterator"
	import="java.util.Map"
%>

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"
%>

<%@page 
    import="org.apache.oodt.cas.curation.servlet.CuratorConfMetKeys"
%>
<jsp:include page="views/common/cas-curator-header.jsp" />

<%@ include file="tools/requireLogin.jsp"%>


<div class="page">
	<div class="container browsers">
		<div id="browseStagingContainer">
		<h5>Staging Area</h5>
			<div id="browseStagingPath" class="pathbar">initializing...</div>
			<div id="browseStaging" class="browser">
				<div id="browseStagingNav">
					<ul class="fileTree">
						<li class="directory nav"><a id="stagingNavUpRoot" href="#" rel=".">.</a></li>
						<li class="directory nav"><a id="stagingNavUpOne"  href="#" rel="..">..</a></li>
					</ul>
				</div>
				<div id="browseStagingContents"></div>
			</div>
			<div id="stagedMetadataWorkbench"   class="editor">
				<div id="infoNoMetadataExtractorDefined" class="info overlay">
					<div class="infoContent">
						No Metadata Detected...<br/>
					</div>
				</div>
				<div id="stagingMetContainer">				
					<div id="stagingMetExtractorSelection">
						<select id="stagingMetExtractorConfigList">
							<option value="-1">Initializing...</option>
						</select>
						<input id="stagingMetExtractorRefreshButton" type="button" value="Refresh"/>
						&nbsp;
						
					</div>
					<div id="stagedMetadataWorkbenchContent"></div>
				</div>
			</div>
		</div>
		<div id="browseCatalogContainer">
		<h5>File Manager Catalog</h5>
			<div id="browseCatalogPath" class="pathbar">initializing...</div>
			<div id="browseCatalog" class="browser">
				<div id="browseCatalogNav">
					<ul class="fileTree">
						<li class="directory nav"><a id="catalogNavUpRoot" href="#" rel=".">.</a></li>
						<li class="directory nav"><a id="catalogNavUpOne"  href="#" rel="..">..</a></li>
					</ul>
				</div>
				<div id="browseCatalogContents"></div>
			</div>
			<div id="catalogMetadataWorkbench" class="editor">
				<div id="catalogMetadataWorkbenchContent"></div>
			</div>
		</div>
		<br class="clr"/>
	</div>
	<div class="container tasks">
		<div id="ingestionTaskList">
			<h5>File Manager Ingestion Task List</h5>
			<div id="ingestionTaskListContent">
			<table cellspacing="0" cellpadding="0" id="ingestionTaskListItems">
			  <thead>
			  <tr>
			    <th style="width:50px;">TaskId</th>
			    <th>Created</th>
			    <th>Files</th>
			    <th>Policy</th>
			    <th>ProductType</th>
			    <th>MetExtractor</th>
			    <th>MetExt Config</th>
			    <th>Status</th>
			    <th style="border-right-width:0px;">Action</th>
			  </tr>
			  </thead>
			  <tbody>
			  
			</table>
			</div>
		</div>
	</div>
</div>

<!-- product type workbench -->
<div id="productTypeWorkbenchContents" style="display:none">
	<ul>
		<li><a href='#ptwbAddProducts'>Add Products</a></li>
		<li><a href='#ptwbMetadata'>View Metadata</a></li>
	</ul><br class="clr"/>
	<div id="ptwbAddProducts">
		<span class="instructions">
		Add files from the staging area by dragging them into the target box below. Once you have 
		Finished, click 'Save as Ingestion Task' to finalize.
		</span>
		<div id="droppedFileTarget" class="ptwbSectionBox">
			<h5>File Drop Target...</h5>
		
		</div>
		<div id="droppedFileList" class="ptwbSectionBox">
			<h5>Files to be ingested...</h5>
			<ul></ul>
		</div>
		<div id="itMetExtractorSelector" class="ptwbSectionBox">
			<h5>Metadata Extraction Configuration...</h5>
			<span class="instructions">Choose a metadata extractor configuration from
				the list below:
			</span>
			<select name="itMetExtractorConfigId" id="itMetExtractorConfigId">
				<option value="">Initializing...</option>
			</select><br/><br/>
		</div>
		<div id="itCreateIngestionTaskButton">
			<span class="instructions">Click here to create an ingestion task for these files</span>
			<input type="button" value="Save as Ingestion Task" onclick="createIngestionTask();"/>
		</div>
	
	</div>
    <div id="ptwbMetadata">
      	<span class="instructions">
      		The following metadata has been defined for this product type.
      	</span>
      	<div class="ptwbMetadataList"></div>
    </div>
</div>


<jsp:include page="views/common/cas-curator-footer.jsp"/>
