<% /*
    $Revision$
    $Id$

    File:               opdr_plan.inc
    Description:        Definieert de serverside functie opdr_plan() die een planbord van opdrachten toont die
                        voldoen aan de gegeven parameters/criteria.
                        Zoals altijd wordt hierbij wel autorisatie betrokken,
                        maar verder geen contextafhankelijke zaken; dat behoort de aanroeper te doen.
    Parameters:
    Context:            vanuit opdr_search_list.asp
    Note:
*/ %>

<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/discx3d.inc" -->
<!-- #include file="../mld/mld.inc" -->

<%
FCLTHeader.Requires({plugins: ["jQuery"],
                     js:      ["./mld.js",
                               "jquery-ui.js"],  // Voor het slepen.
                     css:     ["../mld/mld.css"]
                    });

// Om planbord kaarten in een kaartenbak te groeperen.
var __cardboxactive__ = false;
function CARDBOX_START(id, params)
{
  params = params || {};
  if (__cardboxactive__) ERROR_NESTED_BLOCK_START_DETECTED;
    __cardboxactive__ = true;
%><!-- CARDBOX_START <%=id%> -->
  <td><div id="<%=id%>" style="display:inline-block" class="fcltcardbox <%=params.cardclass? params.cardclass : ""%>" <%=params.hidden? ' style="display:none"' : ''%> <%=params.html? " " + params.html : ""%>><%
}
function CARDBOX_END()
{
  if (!__cardboxactive__) ERROR_BLOCK_END_WITHOUT_BLOCKSTART;
    __cardboxactive__ = false;
%></div></td>
<!-- CARDBOX_END --><%
}

// Om velden in een planbord kaart te groeperen.
var __cardactive__ = false;
function CARD_START(id, params)
{
  params = params || {};
  if (__cardactive__) ERROR_NESTED_BLOCK_START_DETECTED;
    __cardactive__ = true;
%><!-- CARD_START <%=id%> -->
  <div id="<%=id%>" class="fcltcard <%=params.cardclass? params.cardclass : ""%>" <%=params.hidden? ' style="display:none"' : ''%> <%=params.html? " " + params.html : ""%>>
    <table class="fcltcardtab" width="100%"><%
}
function CARD_END()
{
  if (!__cardactive__) ERROR_BLOCK_END_WITHOUT_BLOCKSTART;
    __cardactive__ = false;
%>  </table>
  </div>
<!-- CARD_END --><%
}

function opdr_plan(params)
{
  var urole = params.urole;
  var fronto = (urole == "fo");
  var backo = (urole == "bo");
  var frontend  = (urole == "fe");
  var bgtmode  = (urole == "bgt");

  // Voor resulttable de globalen zetten; zou ng anders moeten.
  var outputmode = params.outputmode; // print to 0 = screen, 1 = printer, 2 = excel, etc.
  var isPrinting = (outputmode == 1 || outputmode == 5);
  var isExcel = (outputmode == 2 || outputmode == 6);
  var showAll = params.showall;

  var mld_key = params.mld_key;

  var mldstpen = params.mldstpen;
  var mldstnew = params.mldstnew;
  var mldstacc = params.mldstacc;
  var mldstuit = params.mldstuit;
  var mldstrej = params.mldstrej;
  var mldstafm = params.mldstafm;
  var mldstver = params.mldstver;
  var mldnieto = params.mldnieto;
  var mldopdrstrej = params.mldopdrstrej;
  var mldopdrstnak = params.mldopdrstnak;
  var mldopdrsttfi = params.mldopdrsttfi;
  var mldopdrstfia = params.mldopdrstfia;
  var mldopdrstuit = params.mldopdrstuit;
  var mldopdrstafm = params.mldopdrstafm;
  var mldopdrstver = params.mldopdrstver;
  var mldopdrstacp = params.mldopdrstacp;
  var mldopdrstafr = params.mldopdrstafr;
  var mldopdrstgoe = params.mldopdrstgoe;

  var showstatus = "";
  if (mldstpen)  showstatus = (showstatus == ""? "" : showstatus + ",") + "0";
  if (mldstrej)  showstatus = (showstatus == ""? "" : showstatus + ",") + "1";
  if (mldstnew)  showstatus = (showstatus == ""? "" : showstatus + ",") + "2";
  if (mldstacc)  showstatus = (showstatus == ""? "" : showstatus + ",") + "4";
  if (mldstafm)  showstatus = (showstatus == ""? "" : showstatus + ",") + "5";
  if (mldstver)  showstatus = (showstatus == ""? "" : showstatus + ",") + "6";
  if (mldstuit)  showstatus = (showstatus == ""? "" : showstatus + ",") + "7";
  if (mldnieto)  showstatus = (showstatus == ""? "" : showstatus + ",") + "99";
  var from_mld = (showstatus != "");
  params.showstatus = showstatus;
  params.from_mld = from_mld;

  var showopdrstatus = "";
  if (mldopdrstrej) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "1";
  if (mldopdrstnak) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "2";
  if (mldopdrsttfi) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "3"; // Verderop wordt wel bepaald of 'b2' status 3 mag zien
  if (mldopdrstfia) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "4";
  if (mldopdrstuit) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "5";
  if (mldopdrstafm) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "6";
  if (mldopdrstver) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "7";
  if (mldopdrstacp) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "8";
  if (mldopdrstafr) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "9";
  if (mldopdrstgoe) showopdrstatus = (showopdrstatus == ""? "" : showopdrstatus + ",") + "10"; // Verderop wordt wel bepaald of 'b2' status 10 mag zien
  params.showopdrstatus = showopdrstatus;
  params.mldopdrstrej = mldopdrstrej;
  params.mldopdrstafm = mldopdrstafm;
  params.mldopdrstver = mldopdrstver;

  //var groepering_key = params.groepering_key; // Voor maninfo. 2 en 16 ondersteund

  params.uitvoerder = false;
  if (frontend)
  {
    // Dan zijn het alleen opdrachten van *mijn* meldingen waarop ik MLDUSE-read rechten heb
    // en van het type waarbij mld_typeopdr_zichtbaarfe = 1  als ik een mld_key heb
    // Omdat uitsluitend vanuit subframe van mld_melding wordt aangeroepen in deze mode veronderstellen we dat geregeld.
    // OF het zijn de opdrachten waarvan ik uitvoerende ben (MLDORD)
    if (mld_key)
      var pautfunction = "WEB_MLDUSE";
    else
    {
      var pautfunction = "WEB_MLDORD";
      params.uitvoerder = true;
    }
  }
  else if (from_mld)
    var pautfunction = ["WEB_EXTORD","WEB_ORDBO2","WEB_ORDBOF"];
  else if (urole == 'b2')
    var pautfunction = ["WEB_EXTORD","WEB_ORDBO2"];
  else if (urole == 'bgt')
    var pautfunction = "WEB_BGTORD";
  else
    var pautfunction = "WEB_ORDBOF";

  // De functie checkAutorisation(autfunction) geeft een Response.End indien er geen autorisatie voor autfunction wordt gevonden
  var authparams = user.checkAutorisation(pautfunction);

  if (mld_key)
  { // Bestaat de gezochte melding?
    var sql = "SELECT '1' FROM mld_melding WHERE mld_melding_key = " + mld_key;
    var oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    { // Melding bestaat. Dan kan de info opgevraagd worden.
      var mld_melding = mld.mld_melding_info(mld_key);
      lcl.set_dialect(mld_melding.srtdisc_key, "MLD_SRTDISCIPLINE_KEY");
      // Moet hier eigenlijk niet ook gecontroleerd worden of ik de opdrachten van deze melding wel mag zien?
      // var this_mld = mld.func_enabled_melding(mld_key, {verynew: verynew}); // Wat heb ik zoal aan rechten op deze specifieke melding
      // var hasFOBOread = this_mld.canFOread || this_mld.canBOread;
    }
    oRs.Close();
  }
%>

  <html id="planhtml">
    <head>
<%    FCLTHeader.Generate({ outputmode: params.outputmode }); %>
      <script type="text/javascript">
        function sort(pcardboxid)
        {
          var sortableList = $("#" + pcardboxid);
          var listitems = $("div", sortableList);

          listitems.sort(function (a, b)
                         { // Sorteervolgorde: 1) Active opdrachten (active == 1) bovenaan. Daar zijn ze mee bezig. (Beheerder is ook actief).
                           //                  2) Onderbroken.
                           //                  3) Prioriteit
                           //                  4) Einddatum, wat het eerst klaar moet zijn staat boven aan (kleinste waarde bovenaan).
                           //                  5) Meldingnummer (A12345/1) (kleinste waarde bovenaan).
          return (
           ( $(a).attr("active") == "1"? "0" : "1") + "/"  +
           $(a).attr("halt") + "/"  +
           $(a).attr("spoed") + "/" +
           $(a).attr("einddatum") + "/" +
           $(a).attr("opdracht")
           >
           ( $(b).attr("active") == "1"? "0" : "1") + "/"  +
           $(b).attr("halt") + "/"  +
           $(b).attr("spoed") + "/" +
           $(b).attr("einddatum") + "/" +
           $(b).attr("opdracht")
          ) ? 1 : -1;

                         });
          sortableList.append(listitems);
        }

        var mld_show_cards = <%=S("mld_show_cards")%>;
        function showMaxCards(pcardbehid, pshowall)
        {
          lcard = $("#" + pcardbehid).next();
          lteller = 0;
          while (lcard.length == 1)
          {
            if (lcard.attr("id") == "cardasc" || lcard.attr("id") == "carddesc")
            {
              if ((pshowall && lcard.attr("id") == "cardasc") || (!pshowall && lcard.attr("id") == "carddesc"))
                lcard.show();
              else
                lcard.hide();
            }
            else
            {
              lteller++;
              if (pshowall || lteller <= mld_show_cards)
                lcard.show();
              else
                lcard.hide();
            }
            lcard = lcard.next();
          }
        }

        var selectedCard;
        var selectedCurrentCard;
        var lastClickedCardboxid;
        var lastClickedCard;
        var received = false;
        var prs_key_received = -1;
        var uitv_key_received = -1;
        var uitv_type_received = "";
        var cardboxid_received = "";
        var selectedCardArray = [];
        $(function()
        {
          $("div.cardbox").on("mousedown",
                      "div.cardorders",
                      function (e)
                      {
                        if ($(this).hasClass("disable-sort-item"))
                          return;

                        var cardboxid_clicked = $(this).parent().attr("id");

                        if (lastClickedCardboxid && lastClickedCardboxid != cardboxid_clicked)
                          lastClickedCard = null;  // Laatste aangeklikte kaart was in een andere kolom. Dan wordt lastClickedCard null.

                        // Deselecteer alle kaarten van andere rijen.
                        $(".ui-sortable div.cardorders").not($(this).parent().find("div.cardorders"), ".legenda").removeClass("selectedcard");

                        if (selectedCurrentCard != undefined &&
                            selectedCurrentCard.text() != $(this).text() &&
                            !selectedCurrentCard.next("div.cardorders").hasClass("pholder") &&
                            selectedCurrentCard.hasClass("selectedcard") &&
                            ($(this).hasClass("selectedcard") || (e.ctrlKey || e.metaKey))
                           )
                        {
                          // Voeg een clone kaart toe aan de kaart die hiervoor WAS geselecteerd (selectedCurrentCard).
                          selectedCurrentCard.after(selectedCurrentCard.clone().removeClass("selectedcard").addClass("pholder").hide());
                        }

                        // Als shift key is ingedrukt dan voorgaande geselecteerde kaart tot aangeklikte kaart selecteren.
                        if (e.shiftKey)
                        { // Shift key is aan geklikt. Dan alle kaarten selecteren tussen huidige kaart en lastClickedCard.
                          // Als lastClickedCard null is dan is de laatste kaart niet in deze kolom aangeklikt.
                          if (lastClickedCard == null)
                            lastClickedCard = $(this).parents().children("div.cardorders").first(); // De eerste kaart in de kolom.

                          if (lastClickedCard.attr("sortid") < $(this).attr("sortid"))
                          {
                            start = lastClickedCard;
                            end = $(this);
                          }
                          else
                          {
                            start = $(this);
                            end = lastClickedCard;
                          }

                          // Alle kaarten deselecteren en alle clonen verwijderen.
                          $(".selectedcard").not(".legenda").removeClass("selectedcard");
                          $(".pholder").remove();

                          // Nu de juiste kaarten selecteren.
                          var icard = start; // iterator kaarten.
                          while (icard.prop("tagName") == "DIV" && icard.attr("sortid") != end.attr("sortid"))
                          {
                            // Geblokkeerde kaarten en clonen overslaan.
                            if (!icard.hasClass("disable-sort-item") && !icard.hasClass("pholder"))
                            {
                              if (icard.next("div.cardorders").hasClass("pholder"))
                              {
                                //$(this).next("div.cardorders").remove();
                              }
                              else
                                icard.after(icard.clone().addClass("pholder").hide());
                              icard.addClass("selectedcard");
                            }
                            icard = icard.next();
                          }
                          icard.after(icard.clone().addClass("pholder").hide());
                          icard.addClass("selectedcard");
                        }
                        else if (e.ctrlKey || e.metaKey)
                        { // Ctrl key is aangeklikt.
                          // Verwijder alle clonen van andere rijen.
                          $(".ui-sortable div.cardorders.pholder").not($(this).parent().find("div.cardorders")).remove();

                          // Als de kaart al geselecteerd is dan deselecteren, anders alsnog selecteren.
                          if ($(this).next("div.cardorders").hasClass("pholder"))
                            $(this).next("div.cardorders").remove();
                          else
                            $(this).after($(this).clone().addClass("pholder").hide());
                          $(this).toggleClass("selectedcard");
                        }
                        else
                        {
                          // Pas in de mousup alle clonen verwijderen en daarna pas clone van geselecteerde kaart aanmaken.
                          // Anders is in de mouseup de $(this) de clone en niet het orgineel.
                        }

                        selectedCurrentCard = $(this); // De aangeklikte kaart.
                        selectedCard = $(this).clone().removeClass("selectedcard"); // De clone van de aangeklikte kaart.

                        lastClickedCardboxid = cardboxid_clicked;
                        lastClickedCard = $(this);
                      });

          $("div.cardbox").on("mouseup",
                     "div.cardorders",
                     function (e)
                     { // Receive en stop worden na de mousup uitgevoerd.
                       if ($(this).hasClass("disable-sort-item"))
                         return;

                       if (e.shiftKey || e.ctrlKey || e.metaKey)
                       {
                       }
                       else
                       {
                         // Deselecteer alle gesleept kopie kaarten, behalve diegene die gesleept/aangeklikt is. Die wordt vanzelf verwijderd/gedeselecteerd.
                         $(this).addClass("selectedcard").siblings().removeClass("selectedcard");

                         // Alle clonen verwijdern.
                         $(".pholder").remove();
                         // Nu wel een clone aanmaken voor de net geselecteerde kaart.
                         $(this).after($(this).clone().removeClass("selectedcard").addClass("pholder").hide());
                       }
                     });
          $("div.cardbox").on("dblclick",
                     "div.cardorders",
                     function (e)
                     {
                       var opdr_key_dblclick = $(this).attr("opdr_key");
                       var url = "appl/mld/mld_opdr.asp?urole=bo&opdr_key=" + opdr_key_dblclick;
                       FcltMgr.openDetail(url, { reuse: true });
                     });
          $("div.cardbox").on("dblclick",
                     "div.cardbeheerder",
                     function (e)
                     {
                       var uitv_key_dblclick = $(this).attr("uitv_key");
                       var prs_key_dblclick = $(this).attr("prs_key");
                       if ($(this).hasClass("uitvpi"))
                         var url = "appl/prs/prs_perslid.asp?prs_key=" + uitv_key_dblclick;
                       else if ($(this).hasClass("uitvbi"))
                         var url = "appl/prs/prs_perslid.asp?prs_key=" + (prs_key_dblclick > 0? prs_key_dblclick : uitv_key_dblclick);
                       else
                         var url = "appl/prs/prs_bedrijf.asp?bedrijf_key=" + uitv_key_dblclick;
                       FcltMgr.openDetail(url, { reuse: true });
                     });
          $("div.cardbox").on("click",
                     "div.cardasc",
                     function (e)
                     {
                       showMaxCards($(this).parent().children(".cardbeheerder").first().attr("id"), false);
                       FcltMgr.resized(window);
                       window.parent.$("#workFrame").height(window.parent.$("#workFrame").height() + 100);
                     });
          $("div.cardbox").on("click",
                     "div.carddesc",
                     function (e)
                     {
                       showMaxCards($(this).parent().children(".cardbeheerder").first().attr("id"), true);
                       FcltMgr.resized(window);
                       window.parent.$("#workFrame").height(window.parent.$("#workFrame").height() + 100);
                     });
        });

        function cardboxbehSortable(uitv_type, uitv_key, prs_key)
        {
          if (uitv_type != "BE")
          {
            $(function() {
                $("#cardboxbeh" + uitv_key + (uitv_type == "BI"? "_" + prs_key : "")).sortable({
                    items: '.sortable:not(.disable-sort-item)',
                    connectWith: ".cardbox",
                    opacity: 0.7,
                    cursor: "move",
                    delay: 150, // Nodig om te voorkomen dat per ongeluk wordt gesleept, wanneer wordt geprobeerd om te selecteren.
                    revert: 0,
                    placeholder: "placeholderclass",
                    forcePlaceholderSize: true,
                    tolerance: "pointer",
                    helper: function (e, item)
                            {
                              // In principe, als je een unhighlighted item sleept, moeten alle andere items geunhighlighted worden.
                              // Behalve als de Ctrl of Shift toets ook was ingedrukt.
                              if (!item.hasClass("selectedcard"))
                              {
                                //item.addClass("selectedcard").siblings().removeClass("selectedcard");

                                if (e.shiftKey || e.ctrlKey || e.metaKey)
                                {
                                }
                                else
                                {
                                  // Deselecteer alle gesleept kopie kaarten, behalve diegene die gesleept/aangeklikt is. Die wordt vanzelf verwijderd/gedeselecteerd.
                                  item.addClass("selectedcard").siblings().removeClass("selectedcard");

                                  // Alle clonen verwijdern.
                                  $(".pholder").remove();
                                  // Nu wel een clone aanmaken voor de net geselecteerde kaart.
                                  item.after(item.clone().removeClass("selectedcard").addClass("pholder").hide());
                                }
                              }

                              ///////////////////////////////////////////////////////////////////
                              // Nu de geselecteerde kaarten doorgeven aan de "stop()" functie //
                              ///////////////////////////////////////////////////////////////////

                              // Clone de geselecteerde kaarten in een array elements.
                              var elements = item.parent().children(".selectedcard").clone();

                              // Voeg een property "multidrag" met de elements toe aan "item" die de geselecteerde elementen bevat van de orginele/bron lijst.
                              item.data("multidrag", elements).siblings(".selectedcard").remove();

                              // De geselecteerde kaarten in het geheugen bestaan nu en zijn aan het "item" is gekoppeld,
                              // dus kunnen we ze later benaderen waneer we in de "stop()" callback functie zijn.

                              // Create the helper. De kaarten als een DOM element meegeven.
                              var helper = $("<div></div>");
                              return helper.append(elements);
                            },
                    start: function (e, ui)
                           { // Wordt uitgevoerd door de bronlijst als het slepen start.
                             // De geselecteerde kaarten zijn normaal tijdens het slepen niet meer zichtbaar.
                             // Daarom de clonen laten zien. Wel zorgen dat ze dezelfde kleur hebben.
                             //ui.item.show(); // Laat de orginele kaart (waar op geklikt is) zien tijdens het slepen.
                             $(".pholder").hide(); // Laat de clonen zien.
                           },
                    stop: function (e, ui)
                          { // Wordt uitgevoerd door de bronlijst als het slepen stopt.
                            // Mouseup en receive worden voor de stop uitgevoerd.

                            // De originele highlighted kaart waar op geklikt is verdwijnt vanzelf.
                            // De originele highlighted kaarten waar niet op geklikt is, moeten nog verwijderd worden.
                            // Ook alle clonen verwijderen.

                            //selectedCard.remove();
                            //$(".pholder").remove();

                            // Nu benaderen we de kaarten die we opgeslagen hebben in "item"'s data!
                            // Haal de elementen uit de helper.
                            var elements = ui.item.data("multidrag");
                            var cardbox_src = this;

                            // Met de class "cardmoved" aangeven dat de kaarten zijn verplaatst.
                            // Als de kaarten naar de eigen lijst zijn versleept dan class "cardmoved" niet toevoegen
                            if (received)
                              elements.addClass("cardmoved");
                            // "elements" bevat nu de originele geselecteerde items vanuit de orginele lijst (de gesleepte items)!!


                            // Uiteindelijk voeg ik de geselecteerde items toe achter "het item" (aangeklikte en gesleepte item) in de nieuwe lijst.
                            // Daarna "het item" in de lijst verwijderen omdat het net ook (dubbel) is toegevoegd.
                            ui.item.after(elements).remove();

                            // Alle kaarten deselecteren. Het (gekopieerde) aangeklikte en gesleepte item (die in elements zat) waren nog geselecteerd.
                            // Mocht er een cardnotmoved kaart tussen zitten, dan kan de class er nu weer af.
                            $(".selectedcard").not(".legenda").removeClass("selectedcard").removeClass("cardnotmoved");

                            if (received)
                            { // Sorteer de lijst waar de items aan zijn toegevoegd.
                              sort(cardboxid_received);

                              // Nu werkelijk de behandelaar aanpassen van de verschoven opdrachten.
                              var opdr_key_array = [];;
                              for (var i = 0; i < elements.length; i++)
                              {
                                opdr_key_array.push(elements.eq(i).attr("opdr_key"));
                              }

                              // Bepaal de uitv_key en prs_key van de lijst waar de items naar toe worden gekopieerd (destination).
                              var uitv_key_dest = uitv_key_received;
                              var prs_key_dest = prs_key_received;
                              var uitv_type_dest = uitv_type_received;
                              var uitv_key_src = uitv_key;
                              var prs_key_src = prs_key;

                              var data = { uitv_key: uitv_key_dest,
                                           prs_key: prs_key_dest,
                                           uitv_type: uitv_type_dest,
                                           opdr_key_arr: opdr_key_array.join(",") };
                              protectRequest.dataToken(data);
                              $.post("../mld/opdr_handlerchange.asp",
                                     data,
                                      FcltCallbackAndThen(function (data)
                                                          {
                                                            var notmoved_opdrkeys = [];
                                                            if (data.notmoved != "")
                                                              notmoved_opdrkeys = data.notmoved.split(",");
                                                            for (var i = 0; i < notmoved_opdrkeys.length; i++)
                                                            {
                                                              for (var j = 0; j < elements.length; j++)
                                                              {
                                                                var element_opdrkey = elements[j].id.substr(8); // "opdrcard" eraf halen en je houdt de opdracht key over.
                                                                if (element_opdrkey == notmoved_opdrkeys[i])
                                                                { // Element terug plaatsen.
                                                                  // cardbox_src.lastChild.after(elements[j]); werkt wel voor Firefox maar niet voor IE11.
                                                                  // In IE11 is de functie after() niet gedefinieerd als je de lastChild opvraagt.
                                                                  // Blijkbaar in IE11 levert lastChild geen jquery object op.
                                                                  // Dan maar eerst een jquery object er van maken.
                                                                  $("#" + cardbox_src.lastChild.id).after(elements[j]);
                                                                  $(cardbox_src.lastChild).removeClass("cardmoved").addClass("cardnotmoved");
                                                                  break;
                                                                }
                                                              }
                                                            }

                                                            if (notmoved_opdrkeys.length > 0)
                                                            {
                                                              sort("cardboxbeh" + uitv_key + (uitv_type == "BI"? "_" + prs_key : ""));
                                                              FcltMgr.alert(L("lcl_opdr_notmovedintern").format(notmoved_opdrkeys.length));
                                                             }
                                                          }),
                                     "json");
                            }
                            else
                              // Verplaats naar de eigen lijst. Wel weer even sorteren.
                              sort("cardboxbeh" + uitv_key + (uitv_type == "BI"? "_" + prs_key : ""));
                            received = false;
                          },
                    receive: function (e, ui)
                             { // Wordt uitgevoerd door de lijst die ontvangt. Wordt niet uitgevoerd als het dezelfde lijst is als de zender.
                               // Mouseup en stop worden voor de receive uitgevoerd.
                               received = true;
                               prs_key_received = prs_key;
                               uitv_key_received = uitv_key;
                               uitv_type_received = uitv_type;
                               cardboxid_received = "cardboxbeh" + uitv_key + (uitv_type == "BI"? "_" + prs_key : "");
                             },
                    create: function (event, ui)
                            {
                              sort("cardboxbeh" + uitv_key + (uitv_type == "BI"? "_" + prs_key : ""));
                            },
                    over: function (event, ui)
                          {
                            $(".cardbeheerder", this).toggleClass("goto");
                          },
                    out: function (event, ui)
                         {
                           $(".cardbeheerder", this).toggleClass("goto");
                         },
                    sort: function (event, ui)
                          {
                            //if (!ui.helper.parent().is('body')) {
                            //  ui.helper.appendTo($('body'));
                            //}
                            ui.helper.offset(ui.offset); // JQuery bug: helper/placeholder verschuift t.o.v. muis bij scrollable scherm. Deze regel verhelpt dat.
                          }
                });
            });
          }
          else
          {
            // Bedrijven Extern (BE) alleen even sorteren en daarna mogen ze niet meer sortable zijn. Minimale sortable code nodig.
            $(function() {
                $("#cardboxbeh" + uitv_key).sortable({
                    items: '.sortable:not(.disable-sort-item)',
                    create: function (event, ui)
                            {
                              sort("cardboxbeh" + uitv_key);
                            }
                });
                $("#cardboxbeh" + uitv_key).sortable("disable");
            });
          }
        }

      </script>
    </head>

    <body id="planbody">
<%
      var buttons = [];
      buttons.push({ icon: "fa-list-ul",  title: L("lcl_res_legenda"), action: "openLegenda()" });
      // PF: bang van niet.. buttons.push({ icon: "fa-print",  title: L("lcl_print_table"), action: "opdr_print()" });

      IFRAMER_HEADER(L("lcl_orders"), buttons);
%>
      <div id='pbMaxHistoryB'><span id='pbMaxHistoryInfoB'><div></div></span></div>
      <div id="collapseblock">
        <div id="planbodylist"><table><tr>
<%
          // TODO width van planbodylist gebruiken om horizontale scrollbar te verkrijgen.
          // jquery scrollbar kun je nog gebruiken? jQuery('.textarea-scrollbar').scrollbar();??
          var sql = mld.getopdroverzicht_sql(pautfunction, params);
          var oRs = Oracle.Execute(sql);

          var prs_key = -1;  // Melder key.
          var uitv_key = -1;
          var uitv_type = "";
          var olduitv_key = -2;
          var oldprs_key = -2;
          var aantal_int = 0;
          var aantal_ext = 0;
          var nrCardsInCardbox = 0;
          for (var cnt = 0; (cnt < S("qp_maxrows") || showAll) &&
                            (cnt < S("qp_maxrows2") || isExcel) && // Naar excel altijd alle regels (meer dan S("qp_maxrows2")) weergeven.
                            !oRs.eof; cnt++)
          {
            uitv_key = oRs("uitv_key").Value || -1;
            uitv_type = oRs("uitv_type").Value;
            prs_key = uitv_type == "BI"? oRs("prs_perslid_key").Value || -1 : -1; // Behandelaar
            var opdr_key = oRs("mld_opdr_key").Value;
            var behandelaar = oRs("behandelaar").Value;  // Behandelaar
            var B_OF_P = oRs("B_OF_P").Value;
            var uitv_naam = oRs("uitv_naam").Value;
            var opdracht = oRs("ins_srtdiscipline_prefix").Value + oRs("mld_melding_key").Value + "/" + oRs("mld_opdr_bedrijfopdr_volgnr").Value;
            // Voor einddatum de COALESCE van plandatum en einddatum. COALESCE(mld_opdr_plandatum, mld_opdr_einddatum)
            var einddatum = oRs("mld_opdr_plandatum").Value != null? new Date(oRs("mld_opdr_plandatum").Value).getTime() : (oRs("mld_opdr_einddatum").Value != null? new Date(oRs("mld_opdr_einddatum").Value).getTime() : null);
            var now = new Date().getTime();
            var mld_statusopdr_key = oRs("mld_statusopdr_key").Value;
            var mld_opdr_omschrijving = oRs("mld_opdr_omschrijving").Value || "";
            var plaatsmelding = oRs("plaatsmelding").Value || "";
            var meldinggroep = oRs("mld_stdmeldinggroep_naam").Value || "";
            var vakgroep = oRs("ins_discipline_omschrijving").Value || "";
            var mld_melding_spoed = oRs("mld_melding_spoed").Value || "";
            var flagkey = oRs("mld_opdr_flag").Value||0;

            var uitvclass = uitv_type;
            if (uitv_type == "BE")
              aantal_ext++;
            else
              aantal_int++;
            if (uitv_type == "BI" && prs_key < 0)
              uitvclass = "NT" // Niet Toegewezen.

            // Ik wil weten of ik de opdracht mag wijzigen.
            // Als de opdracht niet te wijzigen is, dan mag ik deze niet slepen.
            // Een niet te wijzigen opdracht heeft ook een icon "fa-lock" voor het opdrachtnummer.
            // Voor externe bedrijven hoef ik de rechten niet op te vragen. Ik mag toch niet wijzigen/slepen in dit scherm.
            if (uitv_type == "BE")
              var this_opdr = { canChange: false };
            else
              var this_opdr = mld.func_enabled_opdracht(opdr_key); // Wat mag ik zoal op deze opdracht?

            if ((uitv_type != "BI" && uitv_key != olduitv_key) ||
                (uitv_type == "BI" && (uitv_key != olduitv_key || prs_key != oldprs_key)))
            {
              CARDBOX_START("cardboxbeh" + uitv_key + (uitv_type == "BI"? "_" + prs_key : ""),
                            {cardclass: "cardbox cbsortable uitv" + uitvclass.toLowerCase(),
                             html: "uitv_key=" + uitv_key + " prs_key=" + (uitv_type == "BI"? prs_key : "-1")
                            });
                nrCardsInCardbox = 0;
%>
                <script type="text/javascript">
                  cardboxbehSortable("<%=uitv_type%>", <%=uitv_key%>, <%=prs_key%>);
                </script>
<%
                CARD_START("cardbeh" + uitv_key + (uitv_type == "BI"? "_" + prs_key : ""),
                           { cardclass: "cardbeheerder uitv" + uitvclass.toLowerCase(),
                             html: "uitv_key='" + uitv_key + "' prs_key='" + prs_key + "' opdr_key='-1'" + " einddatum='-1'" + " opdracht='-1' active='1' halt='0' spoed='-1'"
                           });
                  switch(uitv_type)
                  {
                    case "BI": if (prs_key < 0)
                               { // Niet Toegewezen.
%>                                <tr><td><span class="cardname"><%=L("lcl_opdr_unassigned") + " " + safe.html(uitv_naam)%></span></td></tr>
<%                             }
                               else
                               { // Toegewezen.
                                 var thisUser = new Perslid(prs_key); // geeft ook handige informatie
%>                               <tr>
                                   <td rowspan="2" class='profile'><img id='photo' alt='<%=safe.htmlattr(L("fac_profiel")) + " " + safe.htmlattr(L("lcl_photos"))%>' class='profile' src='<%=safe.htmlattr(thisUser.photoinfo().photopaththumb) %>'></td>
                                   <td><span class="cardname"><%=safe.html(uitv_naam)%><br><%=safe.html(behandelaar)%></span></td>
                                 </tr>
                                 <tr>
                                 <td><span class="cardsubname">
                                  <%=  safe.html(thisUser.prs_srtperslid())%>
                                  <%= thisUser.prs_perslid_telefoonnr() ? "<br>" + I("fa-phone-alt") + "&nbsp;"+safe.html(thisUser.prs_perslid_telefoonnr()) : "" %>
                                 </span></td>
                               </tr>
<%
                               }
                               break;
                    case "PI": var thisUser = new Perslid(uitv_key); // geeft ook handige informatie
%>                             <tr>
                                 <td rowspan="2" class='profile'><img id='photo' alt='<%=safe.htmlattr(L("fac_profiel")) + " " + safe.htmlattr(L("lcl_photos"))%>' class='profile' src='<%=safe.htmlattr(thisUser.photoinfo().photopaththumb) %>'></td>
                                 <td><span class="cardname"><%=safe.html(thisUser.naam())%></span></td>
                               </tr>
                               <tr>
                                 <td><span class="cardsubname">
                                 <%=  safe.html(thisUser.prs_srtperslid())+"<br>"%>
                                  <%= thisUser.prs_perslid_telefoonnr() ? I("fa-phone-alt") + "&nbsp;"+safe.html(thisUser.prs_perslid_telefoonnr()) : "" %>
                                 </span></td>
                               </tr>
<%                             break;
                    case "BE":
                               var bsql = "SELECT COALESCE(prs_bedrijf_bezoek_plaats, prs_bedrijf_post_plaats) plaats"
                                        + "       , COALESCE(prs_bedrijf_contact_telefoon, prs_bedrijf_telefoon, prs_bedrijf_telefoon2)  telefoon "
                                        + " FROM prs_bedrijf WHERE prs_bedrijf_key = " + uitv_key;
                               boRs = Oracle.Execute(bsql);
                               var uitv_plaats = "";
                               var uitv_telefoon = "";
                               if (!boRs.eof) {
                                  uitv_plaats = boRs("plaats").value;
                                  uitv_telefoon = boRs("telefoon").value;
                                  }
                               boRs.close();
%>
                               <tr>
                                 <td><span class="cardname"><%=safe.html(uitv_naam)%></span></td>
                               </tr>
                               <tr>
                                 <td><span class="cardsubname">
                                  <%= uitv_plaats ? safe.html(uitv_plaats) + "<br>" : ""%>
                                  <%= uitv_telefoon ? I("fa-phone-alt") + "&nbsp;"+safe.html(uitv_telefoon) : "" %>
                                 </span></td>
                               </tr>
<%                             break;
                  }

                CARD_END();
                if (S("mld_show_cards") > 0)
                { %>
                  <script type="text/javascript">
                    $(function()
                    {
                      showMaxCards("cardbeh" + "<%=uitv_key + (uitv_type == "BI"? "_" + prs_key : "")%>", false);
                    });
                  </script>

<%              }
            }

            if (isPrinting || S("rs_maxchar") < 0 || mld_opdr_omschrijving.length < S("rs_maxchar") * 1.20) // 'Meer' moet minstens 20% extra tekst opleveren.
              var safe_mld_opdr_omschrijving = safe.html(oRs("mld_opdr_omschrijving").Value); // simpelweg hele tekst
            else
            {
              // Oke, op scherm afkappen na S("rs_maxchar") karakters.
              // Probeer op de eerste spatie maar die moet wel binnen 20% karakters komen
              var full_mld_opdr_omschrijving = mld_opdr_omschrijving;
              var spatie = String(mld_opdr_omschrijving).substr(S("rs_maxchar")).indexOf(" ");
              if (spatie < 0 || spatie > S("rs_maxchar")/5)
                spatie = 0;
              var part_mld_opdr_omschrijving = full_mld_opdr_omschrijving.substr(0, S("rs_maxchar") + spatie + 1);
              // pas op: val is al 'html-safe' terwijl we dat voor afkappen niet kunnen hebben?
              // in ieder geval geen safe.htmlattr.
              var safe_mld_opdr_omschrijving = safe.html(part_mld_opdr_omschrijving)
                                             + "<span class='rsTruncmore' " // Dubbel encoderen hieronder, anders html-injections was achter de Meer... mogelijk
                                             + " resttxt='" + safe.htmlattr(safe.html(full_mld_opdr_omschrijving.substr(S("rs_maxchar") + spatie + 1))) + "'"
                                             + " title='" + L("lcl_rs_truncmore") + "'"
                                             + " onclick='return expandTruncate(event, this)'"
                                             + ">" + L("lcl_rs_truncated") + "</span>";
            }

            var extended_opdr_status = mld.getextendedopdrstatus(mld_statusopdr_key, opdr_key);
            nrCardsInCardbox++;
            CARD_START("opdrcard" + opdr_key,
                       { cardclass: "cardorders" +
                                    (!this_opdr.canUitvChange || !this_opdr.canChange || (mld_statusopdr_key == 8 && extended_opdr_status == 81) || uitv_type == "BE"? "" : " sortable") +
                                    (!this_opdr.canUitvChange || !this_opdr.canChange || (mld_statusopdr_key == 8 && extended_opdr_status == 81) || uitv_type == "BE"? " disable-sort-item" : "") +
                                    (mld_statusopdr_key == 8 ? " activecard" + (extended_opdr_status == 81 ? " halt" : ""): "") +
                                    (mld_statusopdr_key == 1 ? " afgewezen" : "") +
                                    (mld_melding_spoed? " cardprio"+mld_melding_spoed : "") +
                                    (einddatum && einddatum < now? " latecard" : ""),
                         html: "opdr_key='" + opdr_key + "'"
                             + " opdracht='" + safe.html(opdracht) + "'"
                             + " einddatum='" + (einddatum? einddatum : now) + "'" // Als er geen datum is ingevuld, neem ik maar nu.
                             + " spoed='" + mld_melding_spoed + "'"
                             + " active='" + (mld_statusopdr_key == 8? "1" : "0") + "'"
                             + " halt='" + (extended_opdr_status == 81? "1" : "0") + "'"
                             + " sortid='" + (mld_statusopdr_key == 8? "0" : "1") + mld_melding_spoed + "/" + (einddatum? einddatum : now) + "/" + opdracht + "'",
                         hidden: S("mld_show_cards") > 0? true : false
                       });
%>            <tr>
                <td>
<%                if (!this_opdr.canChange) { %>
                    <span class="cardopdrnochange" aria-hidden="true"><%=I("fa-lock")%></span>
<%                } else if (mld_statusopdr_key == 1) { %>
                    <span class="afgewezen" aria-hidden="true"><%=I("fa-xmark")%></span>
<%                } else if (mld_statusopdr_key == 8) {
                    if (extended_opdr_status == 81) { %>
                    <span aria-hidden="true"><%=I("fa-pause")%></span>
<%                  } else { %>
                    <span aria-hidden="true"><%=I("fa-hourglass-half")%></span>
<%                  }
                  }
                  else
                  { %>
                    <span aria-hidden="true"><%=I("fa-chevron-right")%></span>
<%                } %>
                  <span class="cardopdrnr"><%=safe.html(opdracht)%></span>
<%               if (oRs("mld_opdr_plandatum").Value != null)
                  {
                      %><span class="carddate"><%=I("fa-clock")%><%=toDateTimeString(oRs("mld_opdr_plandatum").Value, false,false, true)%></span><%
                  } else {  // straks ook de startdatum
                      %><span class="carddate"><%=I("fa-calendar-check")%><%=toDateTimeString(oRs("mld_opdr_einddatum").Value, false,false, true)%></span><%
                  }
                  var displ = "<span class='pricon' id='urg_prio"+mld_melding_spoed+"' title='" + mld.getpriotext(mld_melding_spoed)+"'>" + I(mld.getpriocon(mld_melding_spoed)) + "</span>";
                  %><span class="cardspoed"><%=displ%></span><%
                  if (plaatsmelding && plaatsmelding.length > 1 ) {
                      %><br><span class="cardplace"><%=I("fa-map-marker")%>&nbsp;<%=plaatsmelding.length < 40 ? safe.html(plaatsmelding) : safe.html(plaatsmelding.substr(0,36)) + "&hellip;" %>
                            </span><%
                  }
                  var mvarray = [];
                  if (meldinggroep) mvarray.push(meldinggroep.length < 20 ? safe.html(meldinggroep) : safe.html(meldinggroep.substr(0,16)) + "&hellip;");
                  if (vakgroep) mvarray.push(vakgroep.length < 20 ? safe.html(vakgroep) : safe.html(vakgroep.substr(0,16)) + "&hellip;");
                  %><br><span class="cardgroep"><%=I("fa-tag")%>&nbsp;<%=mvarray.join(" / ")%>
                        </span>
                  <%=(flagkey ? "<br><span class='planopdrflag" + flagkey + "'>" + I("fa-fclt-flag") + "</span><span class='planopdrflag'>&nbsp;" + L("lcl_opdr_flag" + flagkey) + "</span>" : "")%>
                </td></tr>
              <tr><td><span class="cardopdrtxt"><%=safe_mld_opdr_omschrijving%></span></td></tr>
<%          CARD_END();

            if (S("mld_show_cards") > 0 && nrCardsInCardbox == (S("mld_show_cards") + 1))
            {
              CARD_START("cardasc",
                         { cardclass: "cardasc disable-sort-item",
                           html: "opdr_key='-1'  opdracht='-1' einddatum='0' active='0' halt='2' spoed='-1'",
                           hidden: true
                         });
%>
              <tr>
                <td width="100%">
                  <center><span aria-hidden="true"><%=I("fa-sort-up")%></span></center>
                </td>
              </tr>
<%            CARD_END();
              CARD_START("carddesc",
                         { cardclass: "carddesc disable-sort-item",
                           html: "opdr_key='-1'  opdracht='-1' einddatum='-1' active='0' halt='3' spoed='-1'"
                         });
%>
              <tr>
                <td width="100%">
                  <center><span aria-hidden="true"><%=I("fa-sort-down")%></span></center>
                </td>
              </tr>
<%            CARD_END();
            }

            olduitv_key = uitv_key;
            oldprs_key = prs_key;
            oRs.MoveNext();
            if (oRs.eof || ((uitv_type != "BI" && (oRs("uitv_key").Value || -1) != olduitv_key) ||
                            (uitv_type == "BI" && ((oRs("uitv_key").Value || -1) != olduitv_key || (oRs("prs_perslid_key").Value || -1) != oldprs_key))))
              CARDBOX_END();
          }
%>
        </tr></table></div>
      </div>

<%    if (S("mld_show_cards") > 0)
      { %>
        <script type="text/javascript">
          $(function()
          {
            showMaxCards("cardbeh" + "<%=uitv_key + (uitv_type == "BI"? "_" + prs_key : "")%>", false);
          });
        </script>
<%    } %>

      <div id='pbMaxHistoryE'><span id='pbMaxHistoryInfoE'><div></div></span></div>
<%
      var hisInfo = "empty";
      if (!oRs.eof)
      {
        var a_element = "<a href='" + safe.jsstring(Request.ServerVariables("SCRIPT_NAME") + "?showall=1" + transitQS()) + "' target='_self" + "'>"
                      + L("lcl_qp_maxcards1").format(S("qp_maxrows"))
                      + "</a>";
        hisInfo = (cnt <= S("qp_maxrows")
                  ? a_element
                  : L("lcl_qp_maxcards2").format(S("qp_maxrows2")))
      }
      oRs.Close();

      var extraTitle = [];
      if (aantal_int > 0)
        extraTitle.push(L("lcl_opdr_internuit") + " " + aantal_int);
      if (aantal_ext > 0)
        extraTitle.push(L("lcl_opdr_externuit") + " " + aantal_ext);
%>
      <script type="text/javascript">
        $(function()
        {
          if ("<%=hisInfo%>" == "empty")
          {
            $("#pbMaxHistoryB").hide();
            $("#pbMaxHistoryE").hide();
          }
          else
          {
            $("#pbMaxHistoryInfoB")[0].innerHTML = "<%=hisInfo%>";
            $("#pbMaxHistoryInfoE")[0].innerHTML = "<%=hisInfo%>";
          }
          FcltMgr.setHeaderExtraTitle("<%=safe.html(extraTitle.join(", "))%>");

          // Breedte van het scherm zetten. Elke cardbox (kolom) is 200 pixels breed plus 2 maal border van 10 pixels plus 5 pixels tussenruimte = 225.
          FcltMgr.resized(window);
          window.parent.$("#workFrame").height(window.parent.$("#workFrame").height() + 100);
        });
      </script>

      <!-- LEGENDA  -->
      <script type="text/javascript">
        function openLegenda()
        {
            var myPosition = "right top+30";
            if (elems.$originalHeaderRow && elems.$originalHeaderRow.length)
                myPosition = "right-15 top+"+(parseInt(elems.$fcltFrameHeader.css("top"))+30);
            params = { width: 220,
                       resizable: false,
                       position: { my: "right top", at: myPosition },
                       title: "<%=L("lcl_res_legenda")%>",
                       create: FcltMgr.fnCreateCloseButton("div#legenda")
                     };
            $('div#legenda').dialog(params).dialog('open');
            FcltMgr.resized();
        }
      </script>
      <div id="legenda" style="display:none; line-height: 30px;">
        <table id="opdrachtlegenda">
         <tr><td colspan="2"><div class="legenda selectedcard"><%=I("fa-chevron-right")%>&nbsp;<%= L("lcl_opdr_selected") %></div></td></tr>
         <tr><td><div class="cardmoved"><%=I("fa-chevron-right")%>&nbsp;<%= L("lcl_opdr_moved") %></div></td></tr>
         <tr><td><div class="activecard"><%=I("fa-hourglass-half")%>&nbsp;<%= L("lcl_opdr_active") %></div></td></tr>
         <tr><td><div class="activecard halt"><%=I("fa-pause")%>&nbsp;<%= L("lcl_mld_ord_hlt") %></div></td></tr>
         <tr><td><div class="afgewezen"><%=I("fa-times")%>&nbsp;<%= L("lcl_mld_ord_afgewzen") %></div></td></tr>
         <tr><td><div class="latecard"><%=I("fa-chevron-right")%>&nbsp;<%= L("lcl_opdr_late") %></div></td></tr>
         <tr><td><div class="cardnotmoved"><%=I("fa-chevron-right")%>&nbsp;<%= L("lcl_opdr_notmoved") %></div></td></tr>
         <tr><td><div class="disable-sort-item"><%=I("fa-lock cardopdrnochange")%>&nbsp;<%= L("lcl_blokkade") %></div></td></tr>
         <tr><td><div class="legendaleft">Ctrl + Click:&nbsp;</div><div class="legenda legendaright selectedcard"><%="Multi select"%></div></td></tr>
         <tr><td><div class="legendaleft">Shift + Click:&nbsp;</div><div class="legenda legendaright selectedcard"><%="Multi select"%></div></td></tr>
         </table>
      </div>
    </body>
  </html>
<%
}
%>
