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

     File:         ins_edit_deel_save.asp
     Description:  SUBMIT-form
*/ %>

<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../shared/save2db.inc" -->
<!-- #include file="../Shared/kenmerk_common.inc" -->
<!-- #include file="./ins.inc" -->


<% FCLTHeader.Requires({ plugins:["jQuery"],
                         js: []
                       }) %>
<%
var obj_key = getQParamInt( "ins_key", -1 );
var urole = getQParamSafe("urole");
var parent_key = getQParamInt("parent_key", -1);

var bind = "";
var bind_key = -1;
var flextrackarray = [];

var free = getFParamInt("free", 0);

var loc = getFParamInt("locatiekey", -1);
var dept_key = getFParamInt ("sDept", -1 );
var prs_key = getFParamInt ("sPerson", -1 );
var bld_key = getFParamInt ("gebouwkey", -1 );
var floor_key = getFParamInt ("verdiepingkey", -1);
var room_key = getFParamInt ("ruimtekey", -1 );
var wp_key = getFParamInt ("werkplekkey", -1 );
var desc = getFParam("desc", "");

var lent_out_person = getFParamInt("lent_out_person", -1);

var sort = getFParamInt("srtdeel");
if (ins.isSleCil(sort, "S"))
  var autfunction = "WEB_SLEBOF";
else
  var autfunction = urole == "fo"? "WEB_INSFOF" : "WEB_INSMAN";

var authparams = user.checkAutorisation(autfunction);

if(dept_key > 0)
{
  bind_key = dept_key;
  bind = "A";
}

if(prs_key > 0)
{
  bind_key = prs_key;
  bind = "P";
}

if(bld_key > 0)
 {
  bind_key = bld_key;
  bind = "T";
 }

if(room_key > 0)
{
  bind_key = room_key;
  bind = "R";
}

if(wp_key > 0)
{
  bind_key = wp_key;
  bind = "W";
}

var warning = "";
if (obj_key > 0)
{ // Let op als je hier nieuwe velden toevoegt: nieuwe objecten hebben eigen fields-object (MGE: Dan ook maar binnen if statement declareren)
  var fields =  [ { dbs: "ins_deel_x",                       typ: "float",   frm: "xcoord",       track: L("lcl_obj_geoxcoord") },
                  { dbs: "ins_deel_y",                       typ: "float",   frm: "ycoord",       track: L("lcl_obj_geoycoord") },
                  { dbs: "ins_alg_locatie_key",              typ: "key",     frm: "locatiekey"    /* tracking niet nodig */ },
                  { dbs: "ins_deel_vervaldatum",             typ: "date",    frm: "vervaldatum",  track: L("lcl_ins_vervaldatum") },
                  { dbs: "ins_deel_aanmaak",                 typ: "date",    frm: "aanmaakdatum", track: L("lcl_last_action") },
                  { dbs: "prs_perslid_key_beh",              typ: "key",     frm: "ins_manager", track: L("lcl_ins_manager"), foreign: "prs_perslid"  },
                  { dbs: "ins_deel_opmerking",               typ: "varchar", frm: "opmerk"} ];

  // Checken of het eenheden selectveld met dagen/uren bij "Uitvoertijd" niet readonly was en wel is meegegeven.
  // Als dit eenheden selectieveld readonly was dan is er geen waarde voor uitvoertijd ingevuld en moeten beide waarden null worden.
  fields = shared.add_time_field(fields, "ins_deel_t_uitvoertijd",   "uitvoertijd",   "dayshours", {tracktijdsduur: L("lcl_ins_uitvoertijd"), trackeenheid: L("lcl_ins_uitvoertijd_eenheid")});

  if (bind_key > 0 && bind_key != "")
  {
    fields.push({ dbs: "ins_alg_ruimte_key",   typ: "key",     val: bind_key,      track: true /* afzonderlijke tracking, wel oldjsval */ });
    fields.push({ dbs: "ins_alg_ruimte_type",  typ: "varchar", val: bind,          track: true /* afzonderlijke tracking, wel oldjsval */ });
  }

  // Heb ik de juiste rechten
  var this_ins = ins.func_enabled_deel(obj_key);
  user.auth_required_or_abort(this_ins.canChange); // dat is toch wel het minste

  if (urole != "fo")
  {
    sql = "SELECT r.alg_verdieping_key"
        + "  FROM alg_ruimte r, ins_deel d"
        + " WHERE R.alg_ruimte_key = d.ins_alg_ruimte_key"
        + "   AND d.ins_alg_ruimte_type = 'R'"
        + "   AND d.ins_deel_key = " + obj_key;
    oRs = Oracle.Execute(sql);
    if (!oRs.eof)
    {
      var verd_key = oRs("alg_verdieping_key").Value;
      if (verd_key != floor_key)
      {
        fields.push({ dbs: "ins_deel_dwgx", typ: "float", val: "" });
        fields.push({ dbs: "ins_deel_dwgy", typ: "float", val: "" });
      }
    }

    fields.push({ dbs: "ins_deel_omschrijving",      typ: "varchar",      val: desc});

    //sql = buildUpdate("ins_deel", fields) + " ins_deel_key = " + obj_key;
    // insUpd heeft na afloop handige oldjsvals
    var insUpd = buildTrackingUpdate("ins_deel", " ins_deel_key = " + obj_key, fields);

    // Submit the changed data
    var err = Oracle.Execute(insUpd.sql, true);
    if (err.friendlyMsg)
        warning = err.friendlyMsg;

    // tracking plaats/eigenaar is ingewikkelder (key en type en slechts één track gewenst), die doen we handmatig
    // ins_alg_ruimte_key (bind_key) en ins_alg_ruimte_type (bind) bevatten reeds de nieuwe waardes
    var newtxt = ins.getBindingItemString(bind, bind_key, parent_key);
    var oldtxt = ins.getBindingItemString(insUpd.oldjsvals["ins_alg_ruimte_type"], insUpd.oldjsvals["ins_alg_ruimte_key"], parent_key); // parent_key kan niet gewijzigd worden.
    if (oldtxt != newtxt)
      insUpd.trackarray.push(L("lcl_owner_info") + ": " + buildTrackText("varchar", oldtxt, newtxt, { nodiff: true }));

    if (!warning)
    {
        // Kenmerken updaten.
        flextrackarray = ins.updateKenmerkdeel(obj_key);
    }

    var update_string = L("lcl_ins_is_insupd") + "\n" + insUpd.trackarray.concat(flextrackarray).join("\n")
    shared.trackaction("INSUPD", obj_key, update_string);
  }
}
else
{ // nieuw
  var i_count = getFParamInt("count", -1);
  var sort = getFParamInt("srtdeel");

  // Voor objecten die geen sleutels/cilinders zijn de schrijfrechten controleren i.v.m. scope. Voor nieuwe sleutels/cilinders is standaard autorisatie voldoende.
  // Autorisatie kan scherper
  if (ins.isSleCil(sort, "S"))
  { //  Het is een nieuwe sleutel/cilinder. Alleen alg scope
    var iresult = user.func_enabled("SLE",
                                    null, // ins_discipline doet niet ter zake
                                    bind_key, // alg_key
                                    null); // hier zou alleen een prs_key in mogen, we testen zo afzonderlijk
    if (!iresult || !iresult.canWrite("WEB_SLEBOF"))
      abort_with_warning(L("lcl_obj_notallowed")); // Schrijven niet toegestaan
  }
  else
  { // Objecten die geen sleutel/cilinder zijn. Discipline en alg scope
    sql = "SELECT ins_discipline_key"
        + "  FROM ins_srtdeel isd, ins_srtgroep isg"
        + " WHERE isd.ins_srtgroep_key = isg.ins_srtgroep_key"
        + "   AND ins_srtdeel_key = " + sort;
    oRs = Oracle.Execute(sql);
    var disc_key = oRs("ins_discipline_key");

    // De schrijfrechten controleren i.v.m. discipline en alg scope
    var iresult = ins.func_enabled_scope(disc_key, bind, bind_key);
    if (!iresult || !iresult.canChange)
      abort_with_warning(L("lcl_obj_notallowed")); // combinatie niet toegestaan
  }

  if( isNaN(i_count) || i_count < 1 )
    i_count = 1;

    for( c = 0; c < i_count; c++ )
    {
      var fields = [];
      var fields =  [ { dbs: "ins_deel_x",                         typ: "float",       frm: "xcoord" },
                      { dbs: "ins_deel_y",                         typ: "float",       frm: "ycoord" },
                      { dbs: "ins_alg_locatie_key",                typ: "key",         frm: "locatiekey" },
                      { dbs: "ins_deel_vervaldatum",               typ: "date",        frm: "vervaldatum" },
                      { dbs: "ins_deel_aanmaak",                   typ: "date",        frm: "aanmaakdatum" },
                      { dbs: "prs_perslid_key_beh",                typ: "key",         frm: "ins_manager", foreign: "prs_perslid" },
                      { dbs: "ins_deel_opmerking",                 typ: "varchar",     frm: "opmerk"},
                      { dbs: "ins_alg_ruimte_key",                 typ: "key",         val: bind_key },
                      { dbs: "ins_alg_ruimte_type",                typ: "varchar",     val: bind } ];

      // Checken of het eenheden selectveld met dagen/uren bij "Uitvoertijd" niet readonly was en wel is meegegeven.
      // Als dit eenheden selectieveld readonly was dan wordt deze niet opgeslagen en dan moet de tijdsduur ook niet opgeslagen worden.
      fields = shared.add_time_field(fields, "ins_deel_t_uitvoertijd",   "uitvoertijd",   "dayshours");

      if (c == 0)
      {
          fields.push({ dbs: "ins_deel_omschrijving",   typ: "varchar",  val: desc})
      }
      else
      { // Get default description for object for sequence of inserts
        // Als een nummer is gegeven als default code voor een onderdeel dan nummeren we stug door.
        // Als voor de discipline is aangegeven dat niet automatische genummerd dient te worden zal dat voor multi objecten toch altijd moeten blijven.
        if (parent_key > 0 && !isNaN(parseInt(desc, 10)))
        {
          __Log("Stug doornummeren van onderdelen. Na " + desc + " komt ...")
          desc = '' + (1 + parseInt(desc,10))

          fields.push({ dbs: "ins_deel_omschrijving",   typ: "varchar",  val: desc})
        }
        else
        {
          sql = "SELECT  ins.get_description(" + safe.quoted_sql(parent_key < 0 ? "LPN_INS_DEEL" : "LPN_INS_ONDERDEEL")
              + "     ," + (parent_key < 0 ? loc : parent_key)  // scope for uniqueness could be location (unused) or parent
              + "     , ins_srtdeel_code_upper)"
              + "  FROM ins_srtdeel"
              + " WHERE ins_srtdeel_key = " + sort;
          oRs = Oracle.Execute(sql);
          if (!oRs.eof)
          {
            desc = oRs(0).Value;
            fields.push({ dbs: "ins_deel_omschrijving",   typ: "varchar",  val: desc})
          }
          oRs.Close();
        }
      }
        fields.push({ dbs: "ins_deel_key",           typ: "key",      seq: "ins_s_ins_inst_keys" });
        fields.push({ dbs: "ins_srtdeel_key",        typ: "key",      val: sort });

        if (parent_key > 0)
          fields.push({ dbs: "ins_deel_parent_key",        typ: "key",      val: parent_key });

        var regIns = buildInsert("ins_deel", fields);
        var obj_key = regIns.sequences["ins_deel_key"];
        sql = regIns.sql;
        var err = Oracle.Execute(sql, true);

        if (err.friendlyMsg)
          warning = err.friendlyMsg;

        if (!warning)
        {
          // Kenmerken opslaan.
          flextrackarray = ins.updateKenmerkdeel (obj_key, {isnew: true});
          // Flextrackarray wordt niet gebruikt voor tracking bij nieuw object. Alle velden zijn nieuw
          shared.trackaction("INSNEW", obj_key);
        }
    } // for i_count
  }
%>
<html>
  <head>
    <%  FCLTHeader.Generate() %>
    <script>
        $(document).ready(function () {
            FcltMgr.closeDetail(window, { ins_key: <%=obj_key%>,
                                          warning: "<%=safe.jsstring(warning)%>",
                                          keepForm: <%=warning?"true":"false"%>,
                                          urole: "<%=urole%>",
                                          refresh: true
                                         }); } );
    </script>
  </head>
  <body>
  </body>
</html>
