<%--

    Copyright (C) 2000 - 2024 Silverpeas

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    As a special exception to the terms and conditions of version 3.0 of
    the GPL, you may redistribute this Program in connection with Free/Libre
    Open Source Software ("FLOSS") applications as described in Silverpeas's
    FLOSS exception.  You should have received a copy of the text describing
    the FLOSS exception, and it is also available here:
    "http://www.silverpeas.org/docs/core/legal/floss_exception.html"

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

--%>
<%@page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://www.silverpeas.com/tld/viewGenerator" prefix="view" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://www.silverpeas.com/tld/silverFunctions" prefix="silfn" %>

<%@ include file="check.jsp"%>
<fmt:setLocale value="${requestScope.resources.language}" />
<view:setBundle bundle="${requestScope.resources.multilangBundle}" />
<view:setBundle bundle="${requestScope.resources.iconsBundle}" var="icons" />
<c:set var="currentUserLanguage" value="${requestScope.resources.language}"/>
<c:set var="sessionController" value="${requestScope.DelegatedNews}" />
<c:set var="listNewsJSON" value="${requestScope.ListNewsJSON}"/>
<c:set var="listNews" value="${requestScope.ListNews}"/>
<c:set var="isAdmin" value="${sessionController.admin}" />
<c:set var="componentId" value="${requestScope.browseContext[3]}"/>

<view:sp-page angularJsAppName="silverpeas.delegatedNews">
  <view:sp-head-part withCheckFormScript="true">
    <view:includePlugin name="datepicker"/>
    <view:includePlugin name="toggle"/>
    <script type="text/javascript">
    function openPublication(pubId, instanceId) {
      let url = "OpenPublication?PubId="+pubId+"&InstanceId="+instanceId;
      SP_openWindow(url,'publication','850','600','scrollbars=yes, noresize, alwaysRaised');
    }
    
    function validateDelegatedNews(pubId) {
      document.listDelegatedNews.action = "ValidateDelegatedNews";
      document.listDelegatedNews.PubId.value = pubId;
      document.listDelegatedNews.submit();
    }

    function refuseDelegatedNews(pubId) {
      document.listDelegatedNews.PubId.value = pubId;
      $("#refuseDialog").dialog("open");
    }
    
    function updateDateDelegatedNews(pubId, BeginDate, BeginHour, EndDate, EndHour) {
      document.listDelegatedNews.PubId.value = pubId;
      $("#datesDialog #BeginDate").val(BeginDate);
      $("#datesDialog #BeginHour").val(BeginHour);
      $("#datesDialog #EndDate").val(EndDate);
      $("#datesDialog #EndHour").val(EndHour);
      $("#datesDialog").dialog("open");
    }
    
    function ifDatesCorrectExecute(callback) {
      let errorMsg = "";
      let errorNb = 0;

      let beginDate = {dateId : 'BeginDate', hourId : 'BeginHour'};
      let endDate = {dateId : 'EndDate', hourId : 'EndHour', defaultDateHour : '23:59'};
      let dateErrors = isPeriodEndingInFuture(beginDate, endDate);
      $(dateErrors).each(function(index, error) {
        errorMsg += " - " + error.message + "\n";
        errorNb++;
      });
         
      switch(errorNb) {
      	case 0 :
          callback.call(this);
          break;
		case 1 :
          errorMsg = '<fmt:message key="GML.ThisFormContains"/> 1 <fmt:message key="GML.error"/> : \n' + errorMsg;
          jQuery.popup.error(errorMsg);
          break;
		default :
          errorMsg = '<fmt:message key="GML.ThisFormContains" /> ' + errorNb + ' <fmt:message key="GML.errors"/> :\n' + errorMsg;
          jQuery.popup.error(errorMsg);
	    }
    }
    
    $(function() {
        $("#refuseDialog").dialog({
        autoOpen: false,
        resizable: false,
        modal: true,
        height: "auto",
        width: 600,
        buttons: {
          "<fmt:message key="GML.ok"/>": function() {
            var message = $("#txtMessage").val();
            document.listDelegatedNews.action = "RefuseDelegatedNews";
              document.listDelegatedNews.RefuseReasonText.value = message;
              document.listDelegatedNews.submit();
          },
          "<fmt:message key="GML.cancel" />": function() {
            $(this).dialog("close");
          }
        }
      });
        
        $("#datesDialog").dialog({
        autoOpen: false,
        resizable: false,
        modal: true,
        height: "auto",
        width: 500,
        buttons: {
          "<fmt:message key="GML.ok"/>": function() {
            ifDatesCorrectExecute(function() {
              document.listDelegatedNews.action = "UpdateDateDelegatedNews";
              document.listDelegatedNews.BeginDate.value = $("#datesDialog #BeginDate").val();
              document.listDelegatedNews.BeginHour.value = $("#datesDialog #BeginHour").val();
              document.listDelegatedNews.EndDate.value = $("#datesDialog #EndDate").val();
              document.listDelegatedNews.EndHour.value = $("#datesDialog #EndHour").val();
              document.listDelegatedNews.submit();
            });
          },
          "<fmt:message key="GML.cancel" />": function() {
            $(this).dialog("close");
          }
        }
      });
    });

    let listDelegatedNewsJSON = ${listNewsJSON};
    
    $(document).ready(function() {
        $('#newsList tbody').bind('sortupdate', function(event, ui) {
            var updatedDelegatedNews = new Array(); //tableau de DelegatedNewsEntity réordonnés sérialisés en JSON
            var data = $('#newsList tbody').sortable('toArray'); //tableau de valeurs delegatedNews_{pubId} réordonnés
            for (let i=0; i<data.length; i++)
            {
              let pubId = data[i]; //delegatedNews_{pubId}
              pubId = pubId.substring(14); //{pubId}
              
              for (let j=0; j<listDelegatedNewsJSON.length; j++)
              {
                let delegatedNewsJSON = listDelegatedNewsJSON[j];
                if(pubId === delegatedNewsJSON.pubId) {
                  updatedDelegatedNews[i] = delegatedNewsJSON;
                }
              }
            }
            sortDelegatedNews(updatedDelegatedNews);
          });
      });
      
      function sortDelegatedNews(updatedDelegatedNewsJSON){
        let url = webContext + "/services/delegatednews/${componentId}";
        let ajaxRequest = window.sp.ajaxRequest(url).byPutMethod();
        ajaxRequest.sendAndPromiseJsonResponse(updatedDelegatedNewsJSON).then(function(data) {
          listDelegatedNewsJSON = data;
        });
      }
      
      function deleteDelegatedNews(pubId) {
        let listDNToDelete = new Array(pubId);
        let updatedDelegatedNews = new Array(); //tableau de DelegatedNewsEntity sans l'élément supprimé sérialisés en JSON
        let k = 0;
        for (let i=0; i<listDelegatedNewsJSON.length; i++) {
          let delegatedNewsJSON = listDelegatedNewsJSON[i];
          let pubIdJSON = delegatedNewsJSON.pubId;
          if(! isAppartient(pubIdJSON, listDNToDelete)) {
            updatedDelegatedNews[k] = delegatedNewsJSON;
            k++;  
          }
        }
        jQuery.popup.confirm('<fmt:message key="delegatednews.deleteOne.confirm"/>', function() {
          deleteDelegagedNews(updatedDelegatedNews);
        });
      }
      
      function deleteSelectedDelegatedNews() {

        let nbNews = listDelegatedNewsJSON.length;
        if (nbNews > 0) {
          // array of JSON-serialized DelegatedNewsEntity objects without the removed items
          let updatedDelegatedNews = [];
          let listDNToDelete = $("input:checked");
          let k = 0;
          for (let i = 0; i < nbNews; i++) {
            let delegatedNewsJSON = listDelegatedNewsJSON[i];
            let pubIdJSON = delegatedNewsJSON.pubId;
            if (!isAppartient(pubIdJSON, listDNToDelete)) {
              updatedDelegatedNews[k] = delegatedNewsJSON;
              k++;
            }
          }
          if (nbNews > updatedDelegatedNews.length) { //on a coché au - une news à supprimer
            jQuery.popup.confirm('<fmt:message key="delegatednews.delete.confirm"/>', function() {
              deleteDelegagedNews(updatedDelegatedNews);
            });
          }
        }
      }
      
      function deleteDelegagedNews(updatedDelegatedNews) {
        let url = webContext + "/services/delegatednews/${componentId}";
        let ajaxRequest = window.sp.ajaxRequest(url).byPutMethod();
        ajaxRequest.sendAndPromiseJsonResponse(updatedDelegatedNews).then(function(data) {
          let listPubIdToDelete = getAllPubIdToDelete(data);
          for (let i=0; i<listPubIdToDelete.length; i++) {
            let trToDelete = "#delegatedNews_" + listPubIdToDelete[i];
            $(trToDelete).remove();
          }
          listDelegatedNewsJSON = data;
        });
      }
      
      function isAppartient(id, list) {
        for (let i = 0; i < list.length; i++) {
          let value = list[i].value;
          if (value == null) {
            value = list[i];
          }
          if (id === value) {
            return true;
          }
        }
        return false;
      }
      
      function getAllPubIdToDelete(listDelegatedNewsAfterDelete) {
        let result = [];
        let k = 0;
        for (let i=0; i<listDelegatedNewsJSON.length; i++) {
          let delegatedNewsJSON = listDelegatedNewsJSON[i];
          let pubIdJSON = delegatedNewsJSON.pubId;
          let trouve = false;
          for (let j=0; j<listDelegatedNewsAfterDelete.length; j++) {
            let newDelegatedNewsJSON = listDelegatedNewsAfterDelete[j];
            if (pubIdJSON === newDelegatedNewsJSON.pubId) {
              trouve = true;
              break;
            }
          }
          if (!trouve) {
            result[k] = pubIdJSON;
            k++;
          }
        }
        return result;
      }
      
    </script>
  </view:sp-head-part>

  <fmt:message var="listNewsTitle" key="delegatednews.listNews"/>
  <fmt:message var="columnTitle" key="delegatednews.news.title"/>
  <fmt:message var="columnUpdateDate" key="delegatednews.updateDate"/>
  <fmt:message var="columnContributor" key="delegatednews.contributor"/>
  <fmt:message var="columnState" key="delegatednews.news.state"/>
  <fmt:message var="columnVisibilityBeginDate" key="delegatednews.visibilityBeginDate"/>
  <fmt:message var="columnVisibilityEndDate" key="delegatednews.visibilityEndDate"/>

  <fmt:message var="labelModify" key="GML.modify"/>
  <fmt:message var="labelValidate" key="delegatednews.action.validate"/>
  <fmt:message var="labelRefuse" key="delegatednews.action.refuse"/>
  <fmt:message var="labelDelete" key="GML.delete"/>
  <fmt:message var="labelOperations"  key="GML.operations"/>

  <c:url var="updateIcon" value="/util/icons/update.gif"/>
  <c:url var="validateIcon" value="/util/icons/ok.gif"/>
  <c:url var="refuseIcon" value="/util/icons/wrong.gif"/>
  <c:url var="deleteIcon" value="/util/icons/delete.gif"/>

  <view:sp-body-part>
    <c:if test="${isAdmin}">
      <fmt:message key="delegatednews.action.delete" var="deleteAllAction" />
      <view:operationPane>
        <view:operation altText="${deleteAllAction}" icon="${deleteIcon}" action="javascript:onClick=deleteSelectedDelegatedNews();" />
      </view:operationPane>
    </c:if>
    <view:window>
      <view:frame>
        <view:componentInstanceIntro componentId="${componentId}" language="${currentUserLanguage}"/>
        <c:if test="${isAdmin}">
          <div class="inlineMessage"><fmt:message key="delegatednews.homePageMessage"/></div>
          <br/>
        </c:if>
      <form name="tabForm" method="post">
        <view:arrayPane title="${listNewsTitle}" var="newsList" routingAddress="Main" movableLines="true" summary="true">
          <view:arrayColumn title="${columnTitle}"
                            compareOn="${r -> r.news.publicationDetail.name}"/>
          <view:arrayColumn title="${columnUpdateDate}" compareOn="${r -> r.news.publicationDetail.lastUpdateDate}"/>
          <view:arrayColumn title="${columnContributor}"/>
          <view:arrayColumn title="${columnState}"/>
          <view:arrayColumn title="${columnVisibilityBeginDate}"  compareOn="${r -> r.news.beginDate}"/>
          <view:arrayColumn title="${columnVisibilityEndDate}" compareOn="${r -> r.news.endDate}"/>
          <c:if test="${isAdmin}">
            <view:arrayColumn title="${labelOperations}" sortable="true"/>
            <view:arrayColumn title=""/>
          </c:if>
          <c:forEach items="${listNews}" var="news" varStatus="status">
            <c:set var="pubId" value="${news.pubId}"/>
            <c:set var="instanceId" value="${news.instanceId}"/>
            <view:arrayLine id="delegatedNews_${pubId}">
              <view:arrayCellText>
                <a href="javascript:onClick=openPublication('${pubId}','${instanceId}');">${news.publicationDetail.name}</a>
              </view:arrayCellText>
              <view:arrayCellText>
                ${silfn:formatDateAndHour(news.publicationDetail.lastUpdateDate, currentUserLanguage)}
              </view:arrayCellText>
              <view:arrayCellText>
                <view:username userId="${news.contributorId}"/>
              </view:arrayCellText>

              <fmt:message var="status" key="delegatednews.status.${news.status}"/>
              <view:arrayCellText text="${status}"/>

              <c:set var="beginDate" value="${silfn:formatDate(news.beginDate, currentUserLanguage)}"/>
              <c:set var="endDate" value="${silfn:formatDate(news.endDate, currentUserLanguage)}"/>
              <c:set var="beginHour" value="${silfn:formatDateHour(news.beginDate, currentUserLanguage)}"/>
              <c:set var="endHour" value="${silfn:formatDateHour(news.endDate, currentUserLanguage)}"/>
              <view:arrayCellText>
                <c:if test="${not empty news.beginDate}">
                  ${silfn:formatDateAndHour(news.beginDate, currentUserLanguage)}
                </c:if>
              </view:arrayCellText>
              <view:arrayCellText>
                <c:if test="${not empty news.endDate}">
                  ${silfn:formatDateAndHour(news.endDate, currentUserLanguage)}
                </c:if>
              </view:arrayCellText>
              <view:arrayCellText>
                <c:if test="${isAdmin}">
                  <view:icons>
                    <c:set var="updateAction" value="javascript:onClick=updateDateDelegatedNews('${pubId}','${beginDate}','${beginHour}','${endDate}','${endHour}');"/>
                    <view:icon iconName="${updateIcon}" altText="${labelModify}" action="${updateAction}"/>

                    <c:set var="validateAction" value="javascript:onClick=validateDelegatedNews('${pubId}');"/>
                    <view:icon iconName="${validateIcon}" altText="${labelValidate}" action="${validateAction}"/>

                    <c:set var="refuseAction" value="javascript:onClick=refuseDelegatedNews('${pubId}');"/>
                    <view:icon iconName="${refuseIcon}" altText="${labelRefuse}" action="${refuseAction}"/>

                    <c:set var="deleteAction" value="javascript:onClick=deleteDelegatedNews('${pubId}');"/>
                    <view:icon iconName="${deleteIcon}" altText="${labelDelete}" action="${deleteAction}"/>
                  </view:icons>
                </c:if>
              </view:arrayCellText>
              <view:arrayCellCheckbox checked="false" name="checkedDelegatedNews" value="${pubId}"/>
            </view:arrayLine>
          </c:forEach>
      </view:arrayPane>
      </form>
      </view:frame>
    </view:window>

<!-- Dialog to refuse --> 
<div id="refuseDialog" title="<fmt:message key="delegatednews.action.refuse"/>">
  <form>
    <div class="skinFieldset">
      <div class="fields">
        <div  class="field entireWidth">
          <label class="txtlibform" for="txtMessage">
            <fmt:message key="GML.notification.message"/>
          </label>
          <div class="champs">
            <textarea name="txtMessage" id="txtMessage" cols="60" rows="8"></textarea>
          </div>
        </div>
      </div>
    </div>
  </form>
</div>

<!-- Dialog to edit dates -->
<div id="datesDialog" title="<fmt:message key="GML.modify"/>">
  <form>
    <div class="skinFieldset">
      <div id="beginArea" class="fields">
        <div class="field entireWidth">
          <label class="txtlibform" for="BeginDate">
            <fmt:message key="delegatednews.visibilityBeginDate"/>
          </label>
          <div class="champs">
            <input type="text" class="dateToPick" id="BeginDate" value="" size="12" maxlength="10"/>
            <span class="txtsublibform" for="BeginHour">&nbsp;
              <fmt:message key="delegatednews.hour"/>&nbsp;
            </span>
            <input type="text" name="BeginHour" id="BeginHour" value="" size="5" maxlength="5"/>
            &nbsp;<i>(hh:mm)</i>
          </div>
        </div>
      </div>
      <div id="endArea" class="fields">
        <div class="field entireWidth">
          <label class="txtlibform" for="EndDate">
            <fmt:message key="delegatednews.visibilityEndDate"/>
          </label>
          <div class="champs">
            <input type="text" class="dateToPick" id="EndDate" value="" size="12" maxlength="10"/>
            <span class="txtsublibform" for="EndHour">&nbsp;
              <fmt:message key="delegatednews.hour"/>&nbsp;
            </span>
            <input type="text" name="EndHour" id="EndHour" value="" size="5" maxlength="5"/>
            &nbsp;<i>(hh:mm)</i>
          </div>
        </div>
      </div>
    </div>
  </form>
</div>

<form name="listDelegatedNews" action="" method="post">
  <input type="hidden" name="PubId"/>
    <input type="hidden" name="RefuseReasonText"/>
    <input type="hidden" name="BeginDate"/>
    <input type="hidden" name="BeginHour"/>
    <input type="hidden" name="EndDate"/>
    <input type="hidden" name="EndHour"/>
</form>

</view:sp-body-part>
</view:sp-page>