<!--
    * 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>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 
    <title>Apache PhotArk - Photo Gallery</title>

    <link href="css/styles.css" rel="stylesheet">

    <script type="text/javascript" src="js/constants.js"></script>
    <script type="text/javascript" src="dojo/dojo.js"></script>
    <script type="text/javascript" src="js/gallery.js"></script>
</head>

<body onload="initGallery()">
  <div style="float:right;width:50%;font-size:1em;text-align:right;">
   <div>&nbsp;</div>
      <span><input id="search-input" type="text" value="" size="20" alt="search"/><input type="button" onclick="search();" value="Search"/></span>
      <div id="loginLinks"><span><a href="./admin/authenticate"><u>Super admin</u></a></span>&nbsp;&nbsp;<span><a href="./home/authenticate"><u>Login</u></a></span>&nbsp;&nbsp;<span><a href="./logout/"><u>Logout</u></a></span></div>
  </div>
  <div style="clear:both"></div>
    <div>
        <h1>Apache PhotArk Gallery</h1>
    </div>
        
    <br>

    <div id="gallery" style="display:none;visibility:hidden;">
         <table id='tableGallery' style="margin-left:auto; margin-right:auto;width:720px;" border="0"
                cellspacing="0" cellpadding="1">
         </table>
         <h1>Remote Albums</h1>
         <table id='remoteTableGallery' style="margin-left:auto; margin-right:auto;width:720px;" border="0"
                cellspacing="0" cellpadding="1">
         </table>
    </div>
    
    <div id="search" style="display:none;visibility:hidden;">
         <table id='tableSearch' style="margin-left:auto; margin-right:auto;width:720px;" border="0"
                cellspacing="0" cellpadding="1">
         </table>
    </div>

    <div id="album" style="display:none;visibility:hidden;">
      <table style="margin-left:auto; margin-right:auto; height:54px;" cellspacing="0" cellpadding="0" border="0">
         <tr>
            <td valign="middle">
               <!-- Navigation Header -->
               <table style="width:100%;" cellspacing="0" cellpadding="0" border="0">
                 <tr>
                    <td style="width:31px;">
                        <a href="javascript:displayGallery()" onmouseover="document.index.src=index_on.src"
                           onmouseout="document.index.src=index_off.src" onmousedown="beforeClick();">
                            <img src="images/index.gif" width="31" height="31" border="0" title="Index page"
                                 name="index" alt="" />
                        </a>
                    </td>
                    <td style="width:31px;">
                        <a href="javascript:goPrevious()" onmouseover="onGoPreviousMouseOver();"
                           onmouseout="document.previous.src=prev_off.src" onmousedown="beforeClick();">
                            <img src="images/prev.gif" width="31" height="31" border="0" title="Previous image"
                                 name="previous" alt="" />
                        </a>
                    </td>
                    <td style="width:31px;">
                        <a href="javascript:goNext()" onmouseover="onGoNextMouseOver();"
                           onmouseout="document.next.src=next_off.src" onmousedown="beforeClick();">
                            <img src="images/next.gif" width="31" height="31" border="0" title="Next image"
                                 name="next" alt="" />
                        </a>
                    </td>
                    <td style="width:31px;">
                        <a href="javascript:goSlideShow()" onmouseover="onSlideShow();" onmouseout="offSlideShow();">
                            <img src="images/slide_before_start.gif" width="31" height="31" border="0"
                                 title="Start(Slow)/Fast/Stop slideshow" name="show" alt=""/>
                        </a>
                    </td>
                 </tr>
               </table>
            </td>
        </tr>
      </table>

      <table style="margin-left:auto; margin-right:auto;width:720px;" border="0" cellspacing="0" cellpadding="0">
        <tr>
        	<td align="left"> 
        		<table  style="margin-left:auto; margin-right:auto;width:150px;" border="0"
			                cellspacing="0" cellpadding="1">
			         </table>
        	</td>
            <td align="center"> <!-- Image without original -->
                <img id="albumImage" src="images/space.gif" class="slideImage" width="720" height="540" ondragstart="return false"
                     onselectstart="return false" oncontextmenu="return false" galleryimg="no" usemap="#imagemap" alt=""/>
            </td>
             <td align="left"> 
                <div id="tags">
    	 			<input id="addtag-input" style="width:20;" type="text" style="display:inline;" value="" size="20" alt="add tag..."/><input type="button" onclick="addTag();" style="display:inline;" value="Add Tag"/><input type="button" onclick="showFacebookFriends();" style="display:inline;" value="facebook"/>
			         <table id='tableTags' style="margin-left:auto; margin-right:auto;width:150;" border="0"
			                cellspacing="0" cellpadding="1">
			         </table>
			    </div>
            </td>
        </tr>
      </table>
    </div>

</body>
</html>
