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

    File:        mld_melding_worker.asp
    Description: Levert JSON op voor een shared/fullcalendar.asp
                 met mijn lopende meldingen
    Parameters:  date-from/date-to
    Context:

*/
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<%
// fullCalendar werkt een factor 1000 kleiner met hun datums dan wij.
  var date_from = new Date(getQParamInt("start") * 1000);
  var date_to = new Date(getQParamInt("end") * 1000);
  var behkey = getQParamInt("bk");
  var disckey = getQParamInt("disc");
  var stdmkey = getQParamInt("stdm");
  var kleur = [];

  var autfunction = ["WEB_MLDFOF", "WEB_MLDBOF"];
  var authparams = user.checkAutorisation(autfunction, false, disckey);

  function fnNodeColorStatus(oRs)
  {
    var lecolor = "#ccc";
    switch (oRs("mld_melding_status").Value)
    {
      // ja, eigenlijk naar css
      case 0: lecolor = "#007000"; break;
      case 4: lecolor = "#F27E20"; break;
      case 7: lecolor = "#009000"; break;
    }
    return lecolor;
  }

  function getRandomColor()
  {
    var letters = "0123456789ABCDEF".split("");
    var color = "#";
    for (var i = 0; i < 6; i++)
    {
      color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
  }

  var aantal_beh = 0;
  function fnNodeColorBeheerder(oRs)
  {
    var mld_melding_behandelaar_key = oRs("mld_melding_behandelaar_key").Value || 0;

    if (kleur[mld_melding_behandelaar_key] == null)
    {
      if (mld_melding_behandelaar_key == user_key)
        kleur[mld_melding_behandelaar_key] = "#E69900"; // De user altijd dezelfde kleur.
      else
      {
        switch (aantal_beh)
        {
          // ja, eigenlijk naar css
          // De eerste 5 kleuren vast kiezen zodat de eerste 5 kleuren bij elke maand hetzelfde zijn. Daarnaast wordt het dan niet steeds een kleur spektakel.
          case 0:  kleur[mld_melding_behandelaar_key] = "#6EA428"; break;
          case 1:  kleur[mld_melding_behandelaar_key] = "#007000"; break;
          case 2:  kleur[mld_melding_behandelaar_key] = "#009000"; break;
          case 3:  kleur[mld_melding_behandelaar_key] = "#008B8B"; break;
          case 4:  kleur[mld_melding_behandelaar_key] = "#007070"; break;
          default: kleur[mld_melding_behandelaar_key] = getRandomColor(); break; // Indien er meer dan 5 behandelaars zijn, dan worden de kleuren voor de volgende behandelaars random gekozen.
        }
      }
      aantal_beh++;
    }
    return kleur[mld_melding_behandelaar_key];
  }

  var result = [];
  if (behkey > -1 || disckey > -1)  // Minimaal een van beiden moet gegeven zijn. Zo niet dan een leeg array als resultaat geven.
  {
    var sql = "SELECT COUNT(mld_stdmelding_key) aantal"
            + "  FROM mld_stdmelding s"
            + " WHERE BITAND (s.mld_stdmelding_planbaar, 4) = 4";
    var oRs = Oracle.Execute(sql);
    var actiedatum_actief = oRs("aantal").Value > 0;
    oRs.Close();

    // Raar maar waar: er blijkt behandelaar mogelijk buiten de autorisatie die je hebt
    // Ik vind Behandelaar zijn een prima autorisatie, het is gek als daar nog 3D overheen moet.
    sql = "SELECT item||' '||detail oms"            // de externe referentie (meldingnummer)
        + "     , item_key key"                    // de interne referentie (key)
        + "     , datum1 van"                      // de datum van de service (varieert)
        + "     , datum2 tot "                     // de datum van de service (varieert)
        + "     , 'default.asp?internal=1&u=melding&k='||item_key fclturl"   // de url naar de details
        + "     , mld_melding_status "             // te gebruiken voor styling
        + "     , mld_melding_behandelaar_key"     // te gebruiken voor styling
        + " FROM (SELECT mld_melding_key item_key"
        + "            , sd.ins_srtdiscipline_prefix||mld_melding_key item"  // +prefix
        + "            , mld_melding_onderwerp detail"
        // Als de actiedatum is ingevuld, dan alleen een balk op de actiedatum en niet van begin- tot einddatum.
        // Zowel de begin- als de einddatum de waarde van de actiedatum geven als die is ingevuld.
        + "            , COALESCE(mld_melding_actiedatum, mld_melding_datum) datum1"
        + "            , COALESCE(mld_melding_actiedatum, mld_melding_einddatum) datum2"
        + "            , mld_melding_status"
        + "            , mld_melding_behandelaar_key"
        + "         FROM mld_melding m"
        + "            , mld_stdmelding s"
        + "            , ins_tab_discipline d"
        + "            , ins_srtdiscipline sd"
        + "        WHERE m.mld_stdmelding_key = s.mld_stdmelding_key"
        + "          AND s.mld_ins_discipline_key = d.ins_discipline_key"
        + (disckey == -1
          ? ""
          : "        AND d.ins_discipline_key = " + disckey)
        + (stdmkey == -1
          ? ""
          : "        AND s.mld_stdmelding_key = " + stdmkey)
        + "          AND d.ins_srtdiscipline_key = sd.ins_srtdiscipline_key"
        + "          AND m.mld_melding_status IN (0,2,4,7)"  // lopende
        + "          AND m.fac_activiteit_key IS NULL"
        + (behkey == -1
          ? ""
          : "        AND m.mld_melding_behandelaar_key = " + behkey)
        + "          AND m.mld_melding_datum <= " + date_to.toSQL(true)
        + "          AND m.mld_melding_einddatum >= " + date_from.toSQL(true)
        // Alleen meldingen met een actiedatum tonen in de kalender indien er stdmeldingen met een actiedatum actief zijn.
        + (actiedatum_actief
          ? "        AND m.mld_melding_actiedatum IS NOT NULL" // Alleen meldingen met een actiedatum tonen in de kalender.
          : "")
        +       ")"
        + " ORDER BY mld_melding_behandelaar_key";

    oRs = Oracle.Execute(sql);

    while (!oRs.Eof)
    {
        result.push({ title:     oRs("oms").Value||L("lcl_unknown"),
                      start:     new Date(oRs("van").Value).getTime() / 1000,
                      end:       new Date(oRs("tot").Value).getTime() / 1000,
                      fclturl:   oRs("fclturl").Value,
                      color:     behkey > -1? fnNodeColorStatus(oRs) : fnNodeColorBeheerder(oRs),
                      textColor: "#fff",
                      allDay: false
                    });

        oRs.MoveNext();
    }
    oRs.Close();
  }

  Response.Write(JSON.stringify(result));
%>
<% ASPPAGE_END(); %>
