<%@language = "javascript" %>
<% /*
     $Revision$
     $Id$

    File:               opdr_edit_uren.asp
    Description:        Muteerscherm voor uren bij opdrachten
    Parameters:
                        opdr_uren_key
    Context:
    Note:               Submit naar opdr_edit_uren_save.asp
*/ %>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/iface.inc" -->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="mld.inc" -->

<%
FCLTHeader.Requires({ plugins:["jQuery"],
                      js: ["jquery-ui.js"]
                    })

/***** Get webform parameters *****/

var urole = getQParamSafe("urole", "fe");
var datefrom = getQParamDate("datefrom"); // Moet een maandag zijn
var prs_key = getQParamInt("prs_key", user_key);
var withCollegas = getQParamInt("collegas", 0) == 1; // Toon ook de opdrachten van collega's
var withImprod = getQParamInt("improd", 0) == 1; // Toon ook de improductief 'opdrachten'
var withOnkosten = getQParamArray("onkosten", [""]).join(","); // Toon onkosten velden voor deze regels

var userinfo = new Perslid(prs_key);

var autfunction = {fe: "WEB_UURUSE", fo: "WEB_UURFOF", bo: "WEB_UURBOF"}[urole];
/***** End get webform parameters *****/

var authparams = user.checkAutorisation(autfunction);
var canWrite = authparams.PRSwritelevel < 9;
if (urole != "fe" && canWrite)
{   // (heel flexibel) controleren of wij (user_key) WEB_UURFOF schrijfrechten hebben
    // op minstens één discipline waar prs_key WEB_MLDORD rechten op heeft
    // Dan staan we toe dat je alle regels mag wijzigen.
    // We ondersteunen gewoon niet dat je enkele regels mag bewerken of goedkeuren etc.

    // Alle mogelijke uitvoerenden (mensen die MLDORD rechten hebben)
    // waarbij ikzelf MLD_UURxxx leesrechten heb op dezelfde discipline
    var uitvSQL = "SELECT DISTINCT f.prs_perslid_key"
                + "  FROM fac_v_webgebruiker f,"      // persoon met urenbriefje
                + "       fac_functie ff,"
                + "       fac_v_webgebruiker fzelf"  // ikzelf
                + " WHERE f.fac_functie_key = ff.fac_functie_key"
                + "   AND ff.fac_functie_code = 'WEB_MLDORD'"
                + "   AND f.fac_gebruiker_prs_level_read <9"
                + "   AND f.fac_gebruiker_alg_level_read <9"
                + "   AND fzelf.fac_functie_key = " + authparams.autfunctionkey
                + "   AND fzelf.fac_gebruiker_prs_level_write <9" // in opdr_ures_list.inc staat hier _read!
                + "   AND fzelf.fac_gebruiker_alg_level_write <9"
                + "   AND fzelf.prs_perslid_key = " + user_key;

    uitvSQL += "  AND f.prs_perslid_key = " + prs_key;
    uitvSQL += "  AND f.ins_discipline_key = fzelf.ins_discipline_key"; // UURFOF en UURBOF hebben nauwkeurig minlevel
    canWrite = !Oracle.Execute(uitvSQL).Eof;
}
%>

<html>
  <head>
    <% FCLTHeader.Generate(); %>
<% if (!withCollegas) { // initieel handlerkolom uit
%>
<style>
    .colhandler { display:none; }
</style>
<% } %>
    <script type="text/javascript">
        var anyChange = false; // Voorkom te veel refreshes

        function showCollegaOpdrachten()
        {
            window.location.href ="<%=Request.ServerVariables("SCRIPT_NAME")+"?collegas=1"+transitQS()%>"
        }
        function showImproductief()
        {
            window.location.href ="<%=Request.ServerVariables("SCRIPT_NAME")+"?improd=1"+transitQS()%>"
        }
        function showOnkosten(idcode)
        {
            window.location.href ="<%=Request.ServerVariables("SCRIPT_NAME")+"?x=1"+transitQS()%>&onkosten=" + idcode;
        }

        // Onchange urenveldje
        function updateDag(veld, millisec, remark)
        {
        		var setting_mld_opdr_minuren = (<%=(S("mld_opdr_minuren")?1:0)%> == 1);
            if (!sanitizeHours(veld, setting_mld_opdr_minuren))
            {
                veld.focus();
                veld.select();
                return false;
            }
            anyChange = true;
            var tr = $(veld).closest("table").closest("tr")[0]; // <table><tr> <td>opdrachtnr</td> <td>omschrijving</td> <td><table><tr><td> <input><img> </td></tr></table> <td>...</td> ... <td>Restant</td></tr></table>
            var uPlanned = hourToDecimal($("input#fldmldurenplan"  ,tr)[0].value) || 0;
            var uBefore  = hourToDecimal($("input#fldmldurenbooked",tr)[0].value) || 0;
            var uOpdrtyp = parseInt($("input#fldopdrtypematch",tr)[0].value) || 0;
            var som = 0;
            var rest = 0;
            $("input", tr).each(function()
            {
                if (this.id == "fldmldurentotal") // som-veld
                {
                    this.value = decimalToHour(som)||0;
                    rest = uPlanned - uBefore - som;
                    $("input#fldmldurenrest", tr)[0].value = decimalToHour(rest) || 0;
                    return false; // stop de loop
                }
                else
                    som += hourToDecimal(this.value);
            });

            if (uOpdrtyp == 7 && rest < 0)
            {   // Bij overschrijding van maximaal geregistreerde uren (mld_typeopdr_matchtype=7) dit melden en wijziging niet opslaan.
                alert(L("lcl_mlduren_max_exceeded"));
                return false;
            }

            var mld_opdr_key = -1;
            var mld_impropdr_key = -1;
            if (tr.id.substr(0,1) == "O")
                mld_opdr_key = parseInt(tr.id.substr(1));
            else
                mld_impropdr_key = parseInt(tr.id.substr(1));

            var uren = hourToDecimal(veld.value);

            // Veld is het inputveld. Vind het bijbehorende img jquery object.
            var imgveld = $("img", $(veld).closest("tr")); // <table><tr><td> <input><img> </td></tr></table>
            if (uren == 0)
            {
              imgveld.attr("src", "../../appl/Pictures/comment_empty.png");
              imgveld.css("visibility", "hidden"); // Uren zijn verwijderd.
            }
            else
              imgveld.css("visibility", "visible"); // Uren zijn toegevoegd of aangepast.

            // Kleur/stijl aanpassen bij afwijkingen
            if ($("#fldmldurentotal", tr).val() == $("#fldmldurenplan", tr).val())
                $("#fldmldurentotal", tr).removeClass("afwijk");
            else
                $("#fldmldurentotal", tr).addClass("afwijk");

            var data = { prs_key: <%=prs_key%>,
                         mld_opdr_key: mld_opdr_key,
                         mld_impropdr_key: mld_impropdr_key,
                         datum: millisec,
                         uren: uren
                       };
            if (remark != null)
              data.remark = (remark || "")

            <% protectRequest.dataToken("data"); %>
            $.post("opdr_edit_uren_save.asp?urole=<%=urole%>",
                   data,
                   FcltCallbackAndThen(
                     function (data)
                     {
                       if (data.refresh)
                         window.location.reload(); // bijvoorbeeld als kosten vervallen
                     }),
                   "json");
        }

        // Onchange kostenveldje
        function updateKosten(veld, millisec)
        {
            anyChange = true;
            var tr = $(veld).closest("tr")[0]
            if (veld.type=="checkbox")
                var kosten = veld.checked?1:0;
            else
            {
                if (0&&!sanitizeInteger(veld))
                {
                    veld.focus();
                    veld.select();
                    return false;
                }
                var kosten = parseInt(veld.value, 10);
            }
            var kosten_key = parseInt(tr.getAttribute("kosten_key"), 10);

            var data = { mld_opdruren_key: veld.getAttribute("ukey"),
                         kosten_key: kosten_key,
                         kosten: kosten
                       };
            <% protectRequest.dataToken("data"); %>
            $.post("opdr_edit_urenkosten_save.asp?urole=<%=urole%>",
                   data,
                   FcltCallback,
                   "json");
        }

        // klaar met urenbriefje voor deze week
        function weekDone(goedkeuren)
        {
            if (confirm((goedkeuren?"<%=L("lcl_mlduren_approve")%>":"<%=L("lcl_mlduren_close")%>") + "?"))
            {
              var data = { prs_key: <%=prs_key%>,
                           datum: <%=datefrom.getTime()%>,
                           done: (goedkeuren?"3":"2")
                         };
              <% protectRequest.dataToken("data"); %>
              $.post("opdr_edit_uren_save.asp?urole=<%=urole%>",
                     data,
                     FcltCallbackAndThen(function (data)
                                          {
                                            FcltMgr.closeDetail(window, {refresh: true});
                                          }
                                        ),
                     "json");
            }
        }

        function editRemarkCallback(data, img, millisec)
        {
          if (data.success)
          { // Bijhouden of het inputveldje nu een opmerking heeft.
            var imgicon = "../../appl/Pictures/comment" + (data.remark == ""? "_empty" : "") + ".png";
            $(img).attr("src", imgicon);
            var texticon = data.remark == ""? "" : (data.remark.length > 50?data.remark.substr(0, 50) + "..." : data.remark);
            $(img).attr("title", texticon);

            // Vind het inputveld jquery object.
            var inputfield = $("input", $(img).closest("tr"))[0]; // <table><tr><td> <input><img> </td></tr></table>
            updateDag(inputfield, millisec, data.remark)
          }
        }

        function edit_remark(img, millisec)
        {
          var inputveld = $("input", $(img).closest("tr"))[0]; // <table><tr><td> <input><img> </td></tr></table>
          var tr = $(inputveld).closest("table").closest("tr")[0]; // <table><tr> <td>opdrachtnr</td> <td>omschrijving</td> <td><table><tr><td> <input><img> </td></tr></table> <td>...</td> ... <td>Restant</td></tr></table>

          var mld_opdr_key = -1;
          var mld_impropdr_key = -1;
          if (tr.id.substr(0,1) == "O")
              mld_opdr_key = parseInt(tr.id.substr(1));
          else
              mld_impropdr_key = parseInt(tr.id.substr(1));


          var url = "../mld/opdr_uren_remark.asp?prs_key=<%=prs_key%>"
                  + "&datum=" + millisec
                  + "&mld_opdr_key=" + mld_opdr_key
                  + "&mld_impropdr_key=" + mld_impropdr_key;
          FcltMgr.openModalDetail(url,
                                  L("lcl_remark"),
                                  { callback: function(data, text)
                                              {
                                                editRemarkCallback(data, img, millisec)
                                              }
                                  });
        }
    </script>
  </head>

  <body class="modal" id="opdruren">

<%  var buttons = [];
    if (canWrite && urole=="bo")
      buttons.push({title: L("lcl_mlduren_approve"), icon: "close.png", action:"weekDone(true)"});
    else if (canWrite && !anyKlaar)
      buttons.push({title: L("lcl_mlduren_close"), icon: "finish.png", action:"weekDone(false)"});
    buttons.push({title: L("lcl_close_window"), icon: "undo.png", action:"FcltMgr.closeDetail(window, {refresh: anyChange})"});

    IFRAMER_HEADER(urole == "fe"? L("lcl_menu_mld_uren_fe") : (urole == "fo"? L("lcl_menu_mld_uren_fo") : L("lcl_menu_mld_uren_bo")), buttons);
%>
      <form name="u2" method="post">
<%
        // mld_opdr_uren_keys bevat een array met { key: opdr_uren_key } van een enkele opdrachtregel
        // full: toon ook de regels waar (nog) geen kosten op geboekt zijn
        function emitOnkosten(mld_opdr_uren_keys, reado, full)
        {
            // Eerst de eerder gemaakte onkosten er bij halen
            var has_kosten_key = []; // kostenkeys waar op geboekt is.
            for (ii in mld_opdr_uren_keys)
            {
                mld_opdr_uren_keys[ii].onkosten = []; // per kosten_key
                var sql = "SELECT mld_kosten_key, mld_opdruren_kosten_besteed"
                        + "  FROM mld_opdruren_kosten"
                        + " WHERE mld_opdr_uren_key = " + mld_opdr_uren_keys[ii].key;
                var oRs = Oracle.Execute(sql);
                while (!oRs.Eof)
                {
                    has_kosten_key[oRs("mld_kosten_key").Value] = true;
                    mld_opdr_uren_keys[ii].onkosten[oRs("mld_kosten_key").Value] = oRs("mld_opdruren_kosten_besteed").Value;
                    oRs.MoveNext;
                }
            }
            // -------------------------------------
            // De echte onkosten regels
            // -------------------------------------
            var sql = "SELECT mld_kosten_key,"
                    + "       "+lcl.xsqla('mld_kosten_omschrijving', 'mld_kosten_key')+","
                    + "       "+lcl.xsqla('mld_kosten_eenheid', 'mld_kosten_key')+","
                    + "       mld_kosten_type"
                    + "  FROM mld_kosten";
            var oRsk = Oracle.Execute(sql);
            while (!oRsk.Eof)
            {
                if (!has_kosten_key[oRsk("mld_kosten_key").Value] && !full)
                {
                    oRsk.MoveNext;
                    continue;
                }

                %><tr class="mldopdrurenkosten" kosten_key="<%=oRsk("mld_kosten_key")%>"><%
                %><td class="colhandler"></td><td><%
                %><td><%= oRsk("mld_kosten_omschrijving")%> (<%=oRsk("mld_kosten_eenheid")%>)</td><%
                for (var dag2=0; dag2<7; dag2++)
                {
                    var datum = new Date(datefrom);
                    datum.setDate(datefrom.getDate()+dag2);
                    datum.setHours(0,0,0,0);
                    var dezeCell = mld_opdr_uren_keys[dag2];
                    %><td><%
                    if (dezeCell) // er zijn uren op deze dag
                    {
                        var dezeDag = 1;
                        switch (oRsk("mld_kosten_type").Value) {
                            case 1: // checkbox
                                %><input type="checkbox"
                                         <%= dezeCell.onkosten&&dezeCell.onkosten[oRsk("mld_kosten_key")]?"CHECKED ":"" %>
                                         <% if (reado) { %>
                                         disabled="1"
                                         <% } else { %>
                                         ukey=<%=dezeCell.key%>
                                         onChange="return updateKosten(this, <%=datum.getTime()%>)"
                                         <% } %>
                                      >
                                 <%
                                break;
                            case 2: // inputbox
                                %><input type="text" class="fldmldkosten"
                                         value="<%= dezeCell.onkosten?dezeCell.onkosten[oRsk("mld_kosten_key")]:"" %>"
                                         <% if (reado) { %>
                                         disabled="1"
                                         <% } else { %>
                                         ukey=<%=dezeCell.key%>
                                         onFocus="this.select()"
                                         onChange="return updateKosten(this, <%=datum.getTime()%>)"
                                         <% } %>
                                      >
                                 <%
                                 break;
                        }
                    }
                    %></td><%
                }
                %><td colspan="<%=(urole == "bo"?5:4)%>"></td><%
                %></tr><%
                oRsk.MoveNext;
            }
        };

        BLOCK_START("opdrUren", L("lcl_opdr_frame_algemeen") + " " + safe.html(userinfo.naam()), true);

        // -------------------------------------
        // Alle al eerder ingevulde uren ophalen
        // -------------------------------------
        var sql = "SELECT mld_opdr_uren.mld_opdr_uren_key"
                + "     , mld_opdr_key"
                + "     , mld_impropdr_key"
                + "     , mld_opdr_uren_datum"
                + "     , mld_opdr_uren_besteed"
                + "     , mld_opdr_uren_status"
                + "     , mld_opdr_uren_opmerking"
                + "     , count(mld_opdruren_kosten_key) hasonkosten"
                + "  FROM mld_opdr_uren, mld_opdruren_kosten"
                + " WHERE mld_opdr_uren_datum BETWEEN "+datefrom.toSQL()+" AND " + datefrom.endToSQL() + " + 6"
                + "   AND mld_opdr_uren.prs_perslid_key = " + prs_key
                + "   AND mld_opdr_uren.mld_opdr_uren_key = mld_opdruren_kosten.mld_opdr_uren_key(+)"
                + " GROUP BY mld_opdr_uren.mld_opdr_uren_key"
                + "     , mld_opdr_key"
                + "     , mld_impropdr_key"
                + "     , mld_opdr_uren_datum"
                + "     , mld_opdr_uren_besteed"
                + "     , mld_opdr_uren_status"
                + "     , mld_opdr_uren_opmerking";
        var oRs = Oracle.Execute(sql);
        existingUren = [];
        var opdrkeys = [];
        var anyKlaar = false;
        while (!oRs.Eof)
        {
            anyKlaar = anyKlaar || (oRs("mld_opdr_uren_status")>1)
            var opdr_key = oRs("mld_opdr_key").Value;
            var impropdr_key = oRs("mld_impropdr_key").Value;
            var arrKey = opdr_key? ("O" + opdr_key ): ("I" + impropdr_key);
            if (!existingUren[arrKey])
            {
                if (opdr_key>0)
                    opdrkeys.push(opdr_key);
                else
                    withImprod = true; // zeker tonen
                existingUren[arrKey] = [];
                existingUren[arrKey].hasonkosten = false;
            }
            existingUren[arrKey].hasonkosten = existingUren[arrKey].hasonkosten || oRs("hasonkosten").Value>0;
            existingUren[arrKey] [ new Date(oRs("mld_opdr_uren_datum").Value).getTime() ]
                = { key: oRs("mld_opdr_uren_key").Value,
                    besteed: oRs("mld_opdr_uren_besteed").Value,
                    status: oRs("mld_opdr_uren_status").Value,
                    opmerking: oRs("mld_opdr_uren_opmerking").Value == null? "" : oRs("mld_opdr_uren_opmerking").Value
                  };
            oRs.MoveNext;
        }

        // Alle mld_opdr-achten waar ik op mag boeken
        var sql = "SELECT mld_opdr_key,"
                + "       -1 mld_impropdr_key,"
                + "       mld_melding_key,"
                + "       cnt_contract_key,"
                + "       '' mld_impropdr_code,"
                + "       mld_opdr_uren,"
                + "       mld_opdr_bedrijfopdr_volgnr,"
                + "       1 canonkosten,"
                + "       mld_opdr_omschrijving,"
                + "       mo.mld_uitvoerende_keys,"
                + "       COALESCE(prs_perslid_naam_full, pb.prs_bedrijf_naam) naam,"
                + "       mld_opdr_datumbegin,"
                + "       mld_opdr_einddatum,"
                + "       mld_typeopdr_matchtype"
                + "  FROM mld_opdr mo, "
                + "       mld_typeopdr mto,"
                + "       prs_v_perslid_fullnames_all pf,"
                + "       prs_bedrijf pb"
                + " WHERE mo.mld_typeopdr_key = mto.mld_typeopdr_key"
                + "   AND mo.mld_uitvoerende_keys = pf.prs_perslid_key(+)"
                + "   AND mo.mld_uitvoerende_keys = pb.prs_bedrijf_key(+)"
                + "   AND mto.mld_typeopdr_matchtype IN (3,6,7)"; // uren per week / totaal te besteden uren / maximaal aantal uren

        filter = "        mo.mld_opdr_datumbegin <= " + (datefrom.endToSQL() + " + 6")
                + "   AND mo.mld_statusopdr_key IN (4, 5, 6, 8, 9)" // minstens gefiatteerd
                + "   AND COALESCE(fac.gettrackingdate('ORDAFM', mld_opdr_key), "+datefrom.toSQL()+") >= " + datefrom.toSQL() // hij was *toen* nog niet afgemeld
                + "   AND TRUNC(mld_opdr_einddatum) >= " + datefrom.toSQL();

        if (withCollegas)
        { // alle opdrachten van meldingen van vakgroepen waar prs_key als uitvoerende gezet had kunnen worden
             // TODO: Ook ALG_scope van MLDORD meenemen?
            filter +=" AND EXISTS ("
                   + "    SELECT mm.mld_melding_key"
                   + "      FROM mld_melding mm, mld_stdmelding sm, fac_v_webgebruiker fw, fac_functie ff"
                   + "     WHERE fw.fac_functie_key = ff.fac_functie_key"
                   + "       AND ff.fac_functie_code = 'WEB_MLDORD'"
                   + "       AND mm.mld_stdmelding_key = sm.mld_stdmelding_key"
                   + "       AND sm.mld_ins_discipline_key = fw.ins_discipline_key"
                   + "       AND fw.prs_perslid_key = " + prs_key
                  //AND mm.mld_melding_status < 7? Nee, opdracht is leidend
                   + "       AND mm.mld_melding_key = mo.mld_melding_key)";
        }
        else
        {
            filter += " AND mo.mld_uitvoerende_keys = " + prs_key;
        }
        if (opdrkeys.length)
            filter = "(("+filter+") OR mld_opdr_key IN (" + opdrkeys.join(",") + "))"; //Waar ik in de periode al op geboekt heb?

        sql += " AND (" + filter + ")";

        if (withImprod)
        {
            sql +=" UNION ALL "
                + "SELECT -1 mld_opdr_key,"
                + "       mld_impropdr_key,"
                + "       -1 mld_melding_key,"
                + "       -1 cnt_contract_key,"
                + "       mld_impropdr_code,"
                + "       0 mld_opdr_uren,"
                + "       -1 mld_opdr_bedrijfopdr_volgnr,"
                + "       mld_impropdr_onkosten canonkosten,"
                + "       "+lcl.xsqla('mld_impropdr_omschrijving', 'mld_impropdr_key')+","
                +         prs_key + " mld_uitvoerende_keys,"
                + "       '' naam,"
                + "       null mld_opdr_datumbegin,"
                + "       null mld_opdr_einddatum,"
                + "       0 mld_typeopdr_matchtype"
                + "  FROM mld_impropdr mo,"
                + "       prs_v_perslid_fullnames_all pf"
                + " WHERE pf.prs_perslid_key = " + prs_key
                + "   AND (  (mo.mld_impropdr_verwijder is null) "
                + "       OR (mo.mld_impropdr_verwijder >= " + datefrom.toSQL() + ")"
                + "       )";
        }

        // NULLS LAST zodat improductief etc. zeker achteraan komt
        sql = "SELECT * FROM ("+sql+") ORDER BY naam, mld_melding_key, cnt_contract_key, mld_opdr_bedrijfopdr_volgnr, mld_opdr_omschrijving NULLS LAST"
        var oRs = Oracle.Execute(sql);

        // - Als matchttype de oude "3" is moet er geen kolom "Restant" bijkomen:
        // Voor ATCH moet er niets veranderen (of juist wel zo laten: anders kom je in de problemen
        // als er verschillende opdrachttypes door elkaar staan?)
        // Je weet pas achteraf welke mld_typeopdr_matchtype s er gebruikt zijn.
%>      <thead><tr><th><%=L("lcl_mld_opdr_number")%></th>
                 <th class="colhandler"><%=L("lcl_handler")%></th>
                 <th><%=L("lcl_descr")%></th>
            <%
                for (var dag=0; dag<7; dag++)
                {
                    var datum = new Date(datefrom);
                    datum.setDate(datefrom.getDate()+dag);
                    datum.setHours(0,0,0,0);
                    %><th><%= datum.getDate()+"<br>"+calendar_names.daysMin[(dag+1)%7]%></th><%
                }
            %>
                 <th title="<%=L("lcl_mlduren_onkosten")%>"><%=L("lcl_shared_inlinecolumnclosed")%></th>
                 <th><%=L("lcl_total")%></th>
                 <th><%=L("lcl_mlduren_planned")%></th>
                 <th><%=L("lcl_mlduren_rest")%></th>
            <% if (urole == "bo") { %>
                <th><%=L("lcl_status")%></th>
            <% } %>
             </tr>
        </thead>
<%
        var anyNotSelf = false; // Dan gaan we op het laatst de handlercolom aanzetten
        while (!oRs.Eof)
        {
            var ttl="";
            if (oRs("mld_melding_key").value > 0) {
                var txt = oRs("mld_melding_key").value+"/"+oRs("mld_opdr_bedrijfopdr_volgnr").value;
                ttl = oRs("mld_opdr_omschrijving").Value;
                if (S("mld_uren_omschrijving") == 1) {  // care laat client zien.
                    var tsql = "SELECT prs_perslid_naam_full"
                             + "  FROM prs_v_perslid_fullnames_all pf, "
                             + "       mld_melding m "
                             + " WHERE m.prs_perslid_key=pf.prs_perslid_key"
                             + "   AND m.mld_melding_key = " + oRs("mld_melding_key").value;
                    var toRs = Oracle.Execute(tsql);
                    var oms = toRs("prs_perslid_naam_full").Value;
                    toRs.Close();
                }
                else {
                    var tsql = "SELECT ins_srtdiscipline_prefix,"
                             + "       SUBSTR(ins_discipline_omschrijving || '/' || mld_stdmelding_omschrijving, 1,40) omschrijving "
                             + "  FROM ins_srtdiscipline sd, "
                             + "       ins_tab_discipline d, "
                             + "       mld_stdmelding std, "
                             + "       mld_melding m "
                             + " WHERE d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key(+) "
                             + "   AND std.mld_ins_discipline_key = d.ins_discipline_key "
                             + "   AND m.mld_stdmelding_key = std.mld_stdmelding_key "
                             + "   AND m.mld_melding_key = " + oRs("mld_melding_key").value;
                    var toRs = Oracle.Execute(tsql);
                    txt = toRs("ins_srtdiscipline_prefix").Value + txt;
                    if (S("mld_uren_omschrijving") == 2 || !ttl) // meldingomschrijving primair tonen
                    {
                        var oms = toRs("omschrijving").Value;
                    }
                    else // 3 opdracht omschrijving primair tonen
                    {
                        var oms = ttl.substring(0, 40) + (ttl.length>40?"...":"");
                        ttl = toRs("omschrijving").Value + "\n" + ttl;
                    }
                    toRs.Close();
                }
            } else if (oRs("cnt_contract_key").value > 0) {
                var txt = "C"+oRs("cnt_contract_key").value+"/"+oRs("mld_opdr_bedrijfopdr_volgnr").value;
                var oms = oRs("mld_opdr_omschrijving").Value;
            }
            else // waarschijnlijk improductief
            {
                var txt = oRs("mld_impropdr_code").Value;
                var oms = oRs("mld_opdr_omschrijving").Value;
            }
            var cls="";
            if (oRs("mld_uitvoerende_keys").Value != user_key)
            {
                cls = "notperfect";
                anyNotSelf |= (oRs("mld_uitvoerende_keys").Value != user_key);
            }
            var ttl1 = L("lcl_from") + ": " + toDateString(oRs("mld_opdr_datumbegin").Value)
                                + " - " + toDateString(oRs("mld_opdr_einddatum").Value);

            var totalBooked = 0;
            if (oRs("mld_opdr_key").Value > 0)
            {
                var exUren = existingUren["O"+oRs("mld_opdr_key").Value] || [];
                var idcode = "O" + oRs("mld_opdr_key").Value;
                cls += " mldopdruren";
                //
                // Totaal bestede uren voor deze week op deze opdracht
                // Alleen als mld_typeopdr_matchtype=6
                if (oRs("mld_typeopdr_matchtype").Value == 6 || oRs("mld_typeopdr_matchtype").Value == 7)
                {
                  var bsql = "SELECT nvl(sum(mld_opdr_uren_besteed),0) tbooked"
                           + "  FROM mld_opdr_uren"
                           + " WHERE (  (mld_opdr_uren_datum < " + datefrom.toSQL() + ")"
                           + "       OR (mld_opdr_uren_datum > " + (datefrom.endToSQL() + " + 6") + "))"
                           + " AND mld_opdr_key = " + oRs("mld_opdr_key").Value
                  var tbRs = Oracle.Execute(bsql);
                  totalBooked = tbRs("tbooked").value;
                  tbRs.close();
                }
            }
            else
            {
                var exUren = existingUren["I" + oRs("mld_impropdr_key").Value] || [];
                var idcode = "I" + oRs("mld_impropdr_key").Value;
                cls += " mldimpropdruren";
            }
          %><tr id="<%=idcode%>" class="<%=cls%>">
                <td title="<%=ttl1%>"><%= txt %></td>
                <td class="colhandler"><%= safe.html(oRs("naam").Value) %></td>
                <td title="<%=safe.htmlattr(ttl)%>"><%= safe.html(oms) %></td>
          <%
            minStatus = 9;
            var totaal = 0;
            var mld_opdr_uren_keys = []; // die met onkosten
            // Uren bevriezen indien
            // 1) geen schrijfrechten (hele week)
            // 2) geen BO en 1 dag van de week heeft status > 1 (hele week)
            // 3) status = 4 (dag)
            var reado = (!canWrite || (anyKlaar && urole != "bo")); // deze regel
            for (var dag = 0; dag < 7; dag++)
            {
                var datum = new Date(datefrom);
                datum.setDate(datefrom.getDate()+dag);
                datum.setHours(0,0,0,0);
                var dezeCell = exUren[datum.getTime()] || {};
                if (dezeCell.key && (exUren.hasonkosten || withOnkosten.indexOf(idcode) != -1))
                    mld_opdr_uren_keys[dag] = { key: dezeCell.key, onkosten: [] };
                minStatus = Math.min(minStatus, dezeCell.status || 9);
                var dezeDag = dezeCell.besteed || 0;
                totaal += dezeDag;
                // Zorgen dat het type van dezeCell.opmerking altijd een String is (desnoods een lege string).
                dezeCell.opmerking = dezeCell.opmerking? dezeCell.opmerking : "";
                %><td>
                   <table><tr><td>
<%                   // Als het urenveldje readonly en leeg is dan hoeft er geen inputveld getoond te worden.
                     if ((!reado && dezeCell.status != 4) || dezeDag != 0)
                     { %>
                       <input type="text" class="fldmlduren <% if ((reado || dezeCell.status == 4) && dezeCell.opmerking != "") { %> fldmldhasopm <% } %>"
                              value="<%= decimalToHour(dezeDag) %>"
                              <% if (reado || dezeCell.status == 4) { %>
                              readonly="1"
                              <% } else { %>
                              onFocus="this.select()"
                              onChange="return updateDag(this, <%=datum.getTime()%>)"
                              <% } %>
                              <% if ((reado || dezeCell.status == 4) && dezeCell.opmerking != "") { %>
                              title="<%=dezeCell.opmerking%>"
                              <% } %>
                       >
<%                   } %>
                     </td>
                     <td>
                     <% if (!reado && dezeCell.status != 4) { %>
                     <img src="../../appl/Pictures/comment<%=dezeCell.opmerking == ""? "_empty" : ""%>.png"
                          class="details"
                          title="<%=dezeCell.opmerking == ""? "" : (String(dezeCell.opmerking).length > 50? dezeCell.opmerking.substr(0, 50) + "..." : dezeCell.opmerking)%>"
                          style="visibility: <%=dezeDag == 0? "hidden" : "visible"%>"
                          <% if (!reado && dezeCell.status != 4) { %>
                          onclick="edit_remark(this, <%=datum.getTime()%>)"
                          <% } %>
                     >
                     <% } %>
                   </td></tr></table>
                 </td><%
            }
            // som van de uren
            var restant = oRs("mld_opdr_uren").value - totalBooked - totaal;

          cls="";
          if (oRs("mld_typeopdr_matchtype").Value == 6 || oRs("mld_typeopdr_matchtype").Value == 7)
          {
            if (restant.toFixed(2) != (0).toFixed(2))
              cls="afwijk";
          }
          else
          {
            if (totaal.toFixed(2) != (oRs("mld_opdr_uren").value || 0).toFixed(2))
              cls="afwijk";
          }

          if (!reado && oRs("canonkosten").Value) { // onkosten toggle
            %><td title="<%=L("lcl_mlduren_onkosten")%>" onclick="showOnkosten('<%=idcode%>')"><%=L("lcl_shared_inlinecolumnclosed")%></td><%
          }
          else
          { %><td></td><%
          }
          %>
            <td><input type="text" id="fldmldurentotal" class="<%=cls%>" readonly="1" style="width: 40px;" value="<%= decimalToHour(totaal)||0 %>"></td>
            <td><input type="text" id="fldmldurenplan"  readonly="1" style="width: 40px;" value="<%= decimalToHour(oRs("mld_opdr_uren").value)||0 %>"></td>
            <td><input type="text" id="fldmldurenrest"  readonly="1" style="width: 40px;" value="<%= decimalToHour(restant)||0 %>">
                <input type="hidden" id="fldmldurenbooked" value="<%= decimalToHour(totalBooked)||0 %>">
                <input type="hidden" id="fldopdrtypematch" value="<%=parseInt(oRs("mld_typeopdr_matchtype").value)%>">
            </td>
          <%
               if (urole == "bo") {
                var stattext = [ L("lcl_mld_uren_status_1"), L("lcl_mld_uren_status_2"), L("lcl_mld_uren_status_3"), L("lcl_mld_uren_status_4")][minStatus-1];
                %>
                <td><%= stattext %></td>
            <% } %>
            </tr>
            <%
            // -------------------------------------
            // Onkosten regels alleen als er kosten zijn
            // -------------------------------------
            if (mld_opdr_uren_keys.length)
            {
                emitOnkosten(mld_opdr_uren_keys, reado, withOnkosten.indexOf(idcode) != -1);

            }
            oRs.MoveNext;
        }
        if (S("mld_uren_more") && canWrite && (urole=="bo"||!anyKlaar) && !withCollegas)
        {
          %><tr><td colspan="10"><div class="weekbrieflimited" onclick="showCollegaOpdrachten()">
             <a><%=L("lcl_mlduren_more")%></a>
            </div></td></tr>
          <%
        }

        if (canWrite && (urole=="bo"||!anyKlaar) && !withImprod)
        {
          %><tr><td colspan="10"><div class="weekbrieflimited" onclick="showImproductief(this)">
             <a><%=L("lcl_mlduren_impr_more")%></a>
            </div></td></tr>
          <%
        }

        BLOCK_END();

        if (anyNotSelf)
        { %>
          <script type="text/javascript">
            $(document).ready(function () {$(".colhandler").show()});
          </script>
<%      }
        IFACE.FORM_END();
%>
    </form>
  </body>
</html>
