<%--
  Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  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.  For additional information regarding
  copyright in this work, please see the NOTICE file in the top level
  directory of this distribution.
--%>
<%@ include file="/WEB-INF/jsps/taglibs-struts2.jsp" %>

<s:form id="createPostForm" action='entryAddWithMediaFile'>
	<s:hidden name="salt" />
    <input type="hidden" name="weblog" value='<s:property value="actionWeblog.handle" />' />
    <input type="hidden" name="selectedImage" id="selectedImage" />
    <input type="hidden" name="type" id="type" />
</s:form>


<%-- ********************************************************************* --%>

<%-- Subtitle and folder path --%>

<s:if test='currentDirectory.name.equals("default")'>

    <p class="subtitle">
        <s:text name="mediaFileView.subtitle" >
            <s:param value="weblog" />
        </s:text>
    </p>
    <p class="pagetip">
        <s:text name="mediaFileView.rootPageTip" />
    </p>

</s:if>

<s:elseif test='pager'>

    <p class="subtitle">
        <s:text name="mediaFileView.searchTitle" />
    </p>
    <p class="pagetip">

        <%-- display summary of the search results and terms --%>

        <s:if test="pager.items.size() > 0">
            <s:text name="mediaFileView.matchingResults">
                <s:param value="pager.items.size()" />
            </s:text>
        </s:if>
        <s:else>
            <s:text name="mediaFileView.noResults" />
        </s:else>
        <s:text name="mediaFileView.searchInfo" />

        <ul>
            <s:if test="!bean.name.isEmpty()">
                <li>
                    <s:text name="mediaFileView.filesNamed">
                        <s:param value="bean.name" />
                    </s:text>
                </li>
            </s:if>
            <s:if test="bean.size > 0">
                <li>
                    <s:text name="mediaFileView.filesOfSize">
                        <s:param value='bean.sizeFilterTypeLabel' />
                        <s:param value='bean.size' />
                        <s:param value='bean.sizeUnitLabel' />
                    </s:text>
                </li>
            </s:if>
            <s:if test="!bean.type.isEmpty()">
                <li>
                    <s:text name="mediaFileView.filesOfType">
                        <s:param value='bean.typeLabel' />
                    </s:text>
                </li>
            </s:if>
            <s:if test="!bean.tags.isEmpty()">
                <li>
                    <s:text name="mediaFileView.filesTagged">
                        <s:param value="bean.tags" />
                    </s:text>
                </li>
            </s:if>
        </ul>

</s:elseif>

<s:else>

    <p class="subtitle">
        <s:text name="mediaFileView.folderName"/>: <s:property value="%{currentDirectory.name}" />
    </p>
    <p class="pagetip">
        <s:text name="mediaFileView.dirPageTip" />
    </p>

</s:else>


<s:if test="childFiles || (pager && pager.items.size() > 0)">

  <s:form id="mediaFileViewForm" name="mediaFileViewForm" action="mediaFileView" theme="bootstrap" >
	<s:hidden name="salt" />
    <s:hidden name="weblog" />
    <s:hidden name="directoryId" />
    <s:hidden name="newDirectoryName" />
    <input type="hidden" name="mediaFileId" value="" />

      <div class="image-controls">

          <s:if test="!allDirectories.isEmpty">
              <%-- Folder to View combo-box --%>
              <span><s:text name="mediaFileView.viewFolder"/>:</span>
              <s:select id="viewDirectoryMenu" name="viewDirectoryId"
                        list="allDirectories" listKey="id" listValue="name" onchange="onView()"/>
          </s:if>

          <span><s:text name="mediaFileView.sortBy"/>:</span>
          <s:select id="sortByMenu" name="sortBy" list="sortOptions" listKey="key" listValue="value"
                    onchange="document.mediaFileViewForm.submit();"/>

      </div>


    <%-- ***************************************************************** --%>

    <%-- Media file folder contents --%>

    <script>
        function highlight(el, flag) {
            if (flag) {
                $(el).addClass("highlight");
            } else {
                $(el).removeClass("highlight");
            }
        }
    </script>

    <div id="imageGrid">

        <ul>

            <s:if test="!pager">

                <%-- ----------------------------------------------------- --%>

                <%-- NOT SEARCH RESULTS --%>

                <s:if test="childFiles.size() ==0">
                    <s:text name="mediaFileView.noFiles"/>
                </s:if>

                <%-- List media files --%>

                <s:iterator var="mediaFile" value="childFiles">

                    <li class="align-images"
                            onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">

                        <div class="mediaObject"
                             onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" >

                            <s:if test="#mediaFile.imageFile">
                                <img border="0" src='<s:property value="%{#mediaFile.thumbnailURL}" />'
                                     width='<s:property value="#mediaFile.thumbnailWidth"/>'
                                     height='<s:property value="#mediaFile.thumbnailHeight"/>'
                                     title='<s:property value="#mediaFile.name" />'
                                     onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" />
                            </s:if>

                            <s:else>
                                <s:url var="mediaFileURL" value="/images/page.png" />
                                <img border="0" src='<s:property value="%{mediaFileURL}" />'
                                     style="padding:40px 50px;" alt="logo"
                                     onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" />
                            </s:else>

                        </div>

                        <div class="mediaObjectInfo" >

                            <input type="checkbox"
                                   name="selectedMediaFiles"
                                   value="<s:property value="#mediaFile.id"/>" />
                            <input type="hidden" id="mediafileidentity"
                                   value="<s:property value='#mediaFile.id'/>" />

                            <str:truncateNicely lower="47" upper="47">
                                <s:property value="#mediaFile.name" />
                            </str:truncateNicely>

                       </div>

                    </li>

                </s:iterator>

            </s:if>

            <s:else>

                <%-- ----------------------------------------------------- --%>

                <%-- SEARCH RESULTS --%>

                <s:iterator var="mediaFile" value="pager.items">

                    <li class="align-images"
                            onmouseover="highlight(this, true)" onmouseout="highlight(this, false)">

                        <div class="mediaObject"
                             onclick="onClickEdit('<s:property value="#mediaFile.id"/>')" >

                            <s:if test="#mediaFile.imageFile">
                                <img border="0" src='<s:property value="%{#mediaFile.thumbnailURL}" />'
                                     width='<s:property value="#mediaFile.thumbnailWidth"/>'
                                     height='<s:property value="#mediaFile.thumbnailHeight"/>'
                                     title='<s:property value="#mediaFile.name" />' />
                            </s:if>

                            <s:else>
                                <s:url var="mediaFileURL" value="/images/page.png"></s:url>
                                <img border="0" src='<s:property value="%{mediaFileURL}" />'
                                     style="padding:40px 50px;" />
                            </s:else>

                        </div>

                        <div class="mediaObjectInfo">

                                <input type="checkbox"
                                       name="selectedMediaFiles"
                                       value="<s:property value="#mediaFile.id"/>"/>
                                <input type="hidden" id="mediafileidentity"
                                       value="<s:property value='#mediaFile.id'/>">

                                <str:truncateNicely lower="40" upper="50">
                                    <s:property value="#mediaFile.name" />
                                </str:truncateNicely>

                                <span class="button" id="addbutton-<s:property value='#mediaFile.id' />">
                                    <img id="addbutton-img<s:property value='#mediaFile.id' />"
                                         src="<s:url value="/images/add.png"/>" />
                                </span>

                        </div>

                    </li>

                </s:iterator>

            </s:else>

        </ul>

    </div>

    <div style="clear:left;"></div>

      <s:if test="(!pager && childFiles.size() > 0) || (pager && pager.items.size() > 0) || (currentDirectory.name != 'default' && !pager)">

        <div class="image-controls">

            <s:if test="(!pager && childFiles.size() > 0) || (pager && pager.items.size() > 0)">
                <input id="toggleButton" type="button" class="btn" style="display: inline"
                       value='<s:text name="generic.toggle" />' onclick="onToggle()" />

                <input id="deleteButton" type="button"  class="btn btn-danger" style="display: inline"
                       value='<s:text name="mediaFileView.deleteSelected" />' onclick="onDeleteSelected()" />

                <input id="moveButton" type="button" class="btn btn-primary" style="display: inline"
                       value='<s:text name="mediaFileView.moveSelected" />' onclick="onMoveSelected()" />

            </s:if>

            <s:select id="moveTargetMenu" name="selectedDirectory" cssStyle="display: inline; width: 15em"
                list="allDirectories" listKey="id" listValue="name" />

            <s:if test="currentDirectory.name != 'default' && !pager">
                <s:submit value="%{getText('mediaFileView.deleteFolder')}" cssClass="btn"
                          action="mediaFileView!deleteFolder" onclick="onDeleteFolder();return false;"/>
            </s:if>

        </div>

      </s:if>

</s:form>

</s:if>


<%-- ================================================================================================ --%>

<%-- view image modal --%>

<div id="mediafile_edit_lightbox" class="modal fade" tabindex="-1" role="dialog">

    <div class="modal-dialog modal-lg">

        <div class="modal-content">

            <div class="modal-header">

            </div> <%-- modal header --%>

            <div class="modal-body">

                <s:if test="bean.isImage">
                    <div class="mediaFileThumbnail">
                        <a href='<s:property value="bean.permalink" />' target="_blank">
                            <img align="right" alt="thumbnail" src='<s:property value="bean.thumbnailURL" />'
                                 title='<s:text name="mediaFileEdit.clickToView" />'/>
                        </a>
                    </div>
                </s:if>

                <p class="subtitle">
                    <s:text name="mediaFileEdit.subtitle">
                        <s:param value="bean.name"/>
                    </s:text>
                </p>

                <p class="pagetip">
                    <s:text name="mediaFileEdit.pagetip"/>
                </p>

                <s:form id="entry" action="mediaFileEdit!save" method="POST" enctype="multipart/form-data"
                    theme="bootstrap" class="form-vertical">

                    <s:hidden name="salt"/>
                    <s:hidden name="weblog"/>
                    <s:hidden name="mediaFileId" id="mediaFileId"/>
                    <s:hidden name="bean.permalink"/>

                    <%-- ================================================================== --%>
                    <%-- Title, category, dates and other metadata --%>

                    <s:textfield name="bean.name" size="35" maxlength="100" tabindex="1"
                                 label="%{getText('generic.name')}"/>

                    <label for="fileInfo"><s:text name="mediaFileEdit.fileInfo"/></label>
                    <s:text name="mediaFileEdit.fileTypeSize">
                        <s:param value="bean.contentType"/>
                        <s:param value="bean.length"/>
                    </s:text>
                    <s:if test="bean.isImage">
                        <s:text name="mediaFileEdit.fileDimensions">
                            <s:param value="bean.width"/>
                            <s:param value="bean.height"/>
                        </s:text>
                    </s:if>

                    <s:url var="linkIconURL" value="/images/link.png" />

                    <a href='<s:property value="bean.permalink" />' target="_blank"
                       title='<s:text name="mediaFileEdit.linkTitle" />'>
                        <img border="0" src='<s:property value="%{linkIconURL}" />' style="padding:2px 2px;" alt="link"/>
                    </a>

                    <input type="text" id="clip_text" size="50" style="width:90%"
                           value='<s:property value="bean.permalink" />' readonly/>


                    <s:textarea name="bean.description" cols="50" rows="2" tabindex="2" style="width:70%"
                                label="%{getText('generic.description')}"/>

                    <s:textfield name="bean.tagsAsString" size="30" maxlength="100" tabindex="3" style="width:70%"
                                 label="%{getText('mediaFileEdit.tags')}"/>

                    <s:textfield name="bean.copyrightText" size="30" maxlength="100" tabindex="4" style="width:70%"
                                 label="%{getText('mediaFileEdit.copyright')}"/>

                    <s:select name="bean.directoryId" list="allDirectories"
                              listKey="id" listValue="name" tabindex="5" label="%{getText('')}"/>

                    <s:checkbox name="bean.sharedForGallery" tabindex="6" label="%{getText('')}"/>
                    <s:text name="mediaFileEdit.includeGalleryHelp"/>

                    <div id="fileControldiv" class="miscControl">
                        <s:file id="fileControl" name="uploadedFile" size="30" label="%{getText('')}"/>
                    </div>

                    <!-- original path from base URL of ctx/resources/ -->
                    <s:if test="getBooleanProp('mediafile.originalPathEdit.enabled')">
                        <div id="originalPathdiv" class="miscControl">
                            <s:textfield name="bean.originalPath" id="originalPath" size="30"
                                         maxlength="100" tabindex="3"/>
                        </div>
                    </s:if>

                    <div class="control">
                        <input type="submit" tabindex="7"
                               value="<s:text name="generic.save" />" name="submit"/>
                        <input type="button" tabindex="8"
                               value="<s:text name="generic.cancel" />" onClick="window.parent.onEditCancelled();"/>
                    </div>

                </s:form>

            </div> <%-- modal body --%>

            <div class="modal-footer">

            </div> <%-- modal footer --%>

        </div> <%-- modal content --%>

    </div> <%-- modal dialog --%>

</div> <%-- modal --%>


<script>
    toggleState = 'Off'

    function onClickEdit(mediaFileId) {
        <s:url var="mediaFileEditURL" action="mediaFileEdit">
            <s:param name="weblog" value="%{actionWeblog.handle}" />
        </s:url>
        $("#mediaFileEditor").attr('src', '<s:property value="%{mediaFileEditURL}" />' + '&mediaFileId=' + mediaFileId);

        $('#mediafile_edit_lightbox').modal({show: true});
    }

    function onEditSuccess() {
        onEditCancelled();
        document.mediaFileViewForm.submit();
    }

    function onEditCancelled() {
        $("#mediafile_edit_lightbox").dialog("close");
        $("#mediaFileEditor").attr('src','about:blank');
    }


    function onSelectDirectory(id) {
        window.location = "<s:url action="mediaFileView" />?directoryId="
            + id + "&weblog=" + '<s:property value="actionWeblog.handle" />';
    }

    function onToggle() {
        if (toggleState === 'Off') {
            toggleState = 'On';
            toggleFunction(true, 'selectedMediaFiles');
            $("#deleteButton").attr('disabled',false);
            $("#moveButton").attr('disabled',false);
            $("#moveTargetMenu").attr('disabled',false);
        } else {
            toggleState = 'Off';
            toggleFunction(false, 'selectedMediaFiles');
            $("#deleteButton").attr('disabled',true);
            $("#moveButton").attr('disabled',true);
            $("#moveTargetMenu").attr('disabled',true)
        }
    }

    function onDeleteSelected() {
        if ( confirm("<s:text name='mediaFile.delete.confirm' />") ) {
            document.mediaFileViewForm.action='<s:url action="mediaFileView!deleteSelected" />';
            document.mediaFileViewForm.submit();
        }
    }

    function onDeleteFolder() {
        if (confirm("<s:text name='mediaFile.deleteFolder.confirm' />")) {
            document.bookmarks.action='<s:url action="mediaFileView!deleteFolder" />';
            document.bookmarks.submit();
        }
    }

    function onMoveSelected() {
        if ( confirm("<s:text name='mediaFile.move.confirm' />") ) {
            document.mediaFileViewForm.action='<s:url action="mediaFileView!moveSelected" />';
            document.mediaFileViewForm.submit();
        }
    }

    function onView() {
        document.mediaFileViewForm.action = "<s:url action='mediaFileView!view' />";
        document.mediaFileViewForm.submit();
    }

    <%-- code to toggle buttons on/off as media file/directory selections change --%>

    $(document).ready(function() {
        $("#deleteButton").attr('disabled',true);
        $("#moveButton").attr('disabled',true);
        $("#moveTargetMenu").attr('disabled',true);

        $("input[type=checkbox]").change(function() {
            var count = 0;
            $("input[type=checkbox]").each(function(index, element) {
                if (element.checked) count++;
            });
            if (count === 0) {
                $("#deleteButton").attr('disabled',true);
                $("#moveButton").attr('disabled',true);
                $("#moveTargetMenu").attr('disabled',true)
            } else {
                $("#deleteButton").attr('disabled',false);
                $("#moveButton").attr('disabled',false);
                $("#moveTargetMenu").attr('disabled',false)
            }
        });
    });

</script>