"use strict";
/*
     $Revision$
     $Id$

     Clientside functions for shared/plaatsselector.inc

     Zou nog kunnen worden verfijnd, maar dan gaan we al zeuren:
      MGE DONE: - naar boven toe terug-escaleren of terug-invalideren indien de bovenste zichtbare waarde wijzigt
      - automatisch keuze maken indien er maar eentje is.
      - verfijndere focus-handling
*/

var plaatsselector =
{
    fillLowerLevels: function(json, textStatus)
    {
      if (textStatus == "success")
      {
        //if (json.level) FcltMgr.alert(json.level);
        var sgRoom = psObject[json.idadd].sgRoom;
        var sgFlr = psObject[json.idadd].sgFlr;
        var sgBld = psObject[json.idadd].sgBld;
        var sgLoc = psObject[json.idadd].sgLoc;
        var sgDis = psObject[json.idadd].sgDis;
        var sgReg = psObject[json.idadd].sgReg;
        var escalateOnChUp = psObject[json.idadd].escalateOnChUp;
        var onRegChange = psObject[json.idadd].onRegChange;
        var onDisChange = psObject[json.idadd].onDisChange;
        var onLocChange = psObject[json.idadd].onLocChange;
        var onGebChange = psObject[json.idadd].onGebChange;
        var onVerChange = psObject[json.idadd].onVerChange;
        var onRuiChange = psObject[json.idadd].onRuiChange;
        switch(json.level)
        { // Naar boven toe terug-escaleren:
          // Levels: werkplek (6), ruimte (5), verdieping (4), gebouw/terrein (3), locatie (2), district (1), regio (0).
          // Waarde zetten met de functie setValue(key, txt, doonChange, checkExist, extraParam, lastTry).
          // Geen onChange (doonChange) uitvoeren met de functie setValue(). Dan worden de functies plaatsselector.xxxChanged uitgevoerd en lagere velden weer leeggemaakt.
          // Als escalateOnChUp is gezet moet alleen de params.onLocChange functies worden uitgevoerd, maar niet de plaatsselector.xxxChanged functies.
          // Let op, er is geen break aan het eind van elke case
          case 6: if (typeof(sgRoom) != "undefined" && $("#ruimtekey").val() == -1)
                  {
                    sgRoom.setValue(json.ruimte_key, json.ruimte_oms);
                    if (escalateOnChUp) eval(onRuiChange);
                  }
          case 5: if (typeof(sgFlr) != "undefined" && $("#verdiepingkey").val() == -1)
                  {
                    sgFlr.setValue(json.verdieping_key, json.verdieping_oms);
                    if (escalateOnChUp) eval(onVerChange);
                  }
          case 4: if (typeof(sgBld) != "undefined" && $("#gebouwkey").val() == -1)
                  {
                     // Als level 4 is dan heeft of gebouw_key of terrein_key een geldige waarde
                    if (json.gebouw_key > 0)
                      sgBld.setValue(json.gebouw_key, json.gebouw_oms, false, false, 'B');
                    else
                      sgBld.setValue(json.terrein_key, json.terrein_oms, false, false, 'T');
                    if (escalateOnChUp) eval(onGebChange);
                  }
          case 3: if (typeof(sgLoc) != "undefined" && $("#locatiekey").val() == -1)
                  {
                    sgLoc.setValue(json.locatie_key, json.locatie_oms);
                    if (escalateOnChUp) eval(onLocChange);
                  }
          case 2: if (typeof(sgDis) != "undefined" && $("#districtkey").val() == -1)
                  {
                    sgDis.setValue(json.district_key, json.district_oms);
                    if (escalateOnChUp) eval(onDisChange);
                  }
          case 1: if (typeof(sgReg) != "undefined" && $("#regiokey").val() == -1)
                  {
                    sgReg.setValue(json.regio_key, json.regio_oms);
                    if (escalateOnChUp) eval(onRegChange);
                  }
                  break;
        }
      }
      else
        FcltMgr.alert("fillLowerLevels: " + textStatus);
    },

    checkLowerLevels: function(suggestlevel, alg_key, idadd)
    {
      // Levels: werkplek (6), ruimte (5), verdieping (4), gebouw/terrein (3), locatie (2), district (1), regio (0).
      if ((suggestlevel == 6 && $("#ruimtekey").val() <= 0) ||
          (suggestlevel == 5 && $("#verdiepingkey").val() <= 0) ||
          (suggestlevel == 4 && $("#gebouwkey").val() <= 0) ||
          (suggestlevel == 3 && $("#locatiekey").val() <= 0) ||
          (suggestlevel == 2 && $("#districtkey").val() <= 0) ||
          (suggestlevel == 1 && $("#regiokey").val() <= 0))
      { // Onderliggende level heeft geen ingevulde waarde
        // Haal alle plaats keys op. De callback functie fillLowerLevels moet dan de waarden invullen voor onderliggende levels.
        // Alleen gegevens ophalen. Dus hier get gebruiken. (Dan wordt er ook gecached, wat ten goede komt in de performance)
        // Synchroon zodat verdere code (Cascade functies) er vanuit kan gaan dat de onderliggende waarden zijn ingevuld.
        var returndata = FcltSyncgetJSON("../Shared/get_alg_info.asp",
                                         { level: suggestlevel,
                                           alg_key: alg_key,
                                           idadd: idadd
                                         });
        plaatsselector.fillLowerLevels(returndata, returndata.textStatus)
      }
    },

    regChanged: async function(key, idadd = 0)
    {
      if (typeof(psObject[idadd].sgDis) != "undefined")
      {
        var sgDis = psObject[idadd].sgDis;
        if (!sgDis.isMulti()) sgDis.setValue(-1, "");
        plaatsselector.disChanged(-1);
        if (key > 0 && $("#district" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
          await sgDis.CheckJustOne();
      }
      if (key > 0 && (typeof(psObject[idadd].sgDis) == "undefined" || $("#districtkey" + (idadd? idadd : "")).val() < 0))
        eval(onRegCascade[idadd]);
    },

    disChanged: async function(key, idadd = 0)
    {
      if (typeof(psObject[idadd].sgLoc) != "undefined")
      {
        var sgLoc = psObject[idadd].sgLoc;
        if (!sgLoc.isMulti()) sgLoc.setValue(-1, "");
        plaatsselector.locChanged(-1);
        if (key > 0) plaatsselector.checkLowerLevels(1, key, idadd);
        if (key > 0 && $("#locatie" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
          await sgLoc.CheckJustOne();
      }
      if (typeof(psObject[idadd].sgReg) != "undefined")
        if (key > 0) plaatsselector.checkLowerLevels(1, key, idadd);
      if (key > 0 && (typeof(psObject[idadd].sgLoc) == "undefined" || $("#locatiekey" + (idadd? idadd : "")).val() < 0))
        eval(onDisCascade[idadd]);
    },

    locChanged: async function(key, idadd = 0)
    {
      if (typeof(psObject[idadd].sgBld) != "undefined")
      {
        var sgBld = psObject[idadd].sgBld;
        var autosel = plaatsselector._autoSelect("alg_locatie_key", key, "alg_gebouw_key", "alg_gebouw_naam", "alg_gebouw_code");
        if (!sgBld.isMulti()) sgBld.setValue(autosel.key, autosel.desc);
        if (autosel.key > 0)
          $("#bttype" + (idadd? idadd : "")).val("B"); // De functie _autoSelect heeft een gebouw gevonden. Werkplekken zitten altijd in een gebouw en niet op een terrein.
        else
          $("#bttype" + (idadd? idadd : "")).val("");
        plaatsselector.gebChanged(autosel.key);
        if (key > 0 && autosel.key < 0 && $("#gebouw" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
          await sgBld.CheckJustOne();
      }
      if (typeof(psObject[idadd].sgDis) != "undefined")
        if (key > 0) plaatsselector.checkLowerLevels(2, key, idadd);
      if (key > 0 && (typeof(psObject[idadd].sgBld) == "undefined" || $("#gebouwkey" + (idadd? idadd : "")).val() < 0))
        eval(onLocCascade[idadd]);
    },

    gebChanged: async function(key, idadd = 0)
    {
      if (typeof(psObject[idadd].sgFlr) != "undefined")
      {
        var sgFlr = psObject[idadd].sgFlr;
        var autosel = plaatsselector._autoSelect("alg_gebouw_key", key, "alg_verdieping_key", "alg_verdieping_naam", "alg_verdieping_code");
        if (!sgFlr.isMulti()) sgFlr.setValue(autosel.key, autosel.desc);
        plaatsselector.verChanged(autosel.key);
        if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
        { // Indien een terrein gekozen is, maak dan onderstaande velden readonly
          if (requiredlevel >= 4) // Verplichtheid eraf halen indien required.
            $("#verdieping" + (idadd? idadd : "")).removeClass("required");
          sgFlr.makeReadOnly();
          if (typeof(psObject[idadd].sgRoom) != "undefined")
          {
            if (requiredlevel >= 5) // Verplichtheid eraf halen indien required.
              $("#ruimte" + (idadd? idadd : "")).removeClass("required");
            psObject[idadd].sgRoom.makeReadOnly();
          }
          if (typeof(psObject[idadd].sgWpl) != "undefined")
          {
            if (requiredlevel >= 6) // Verplichtheid eraf halen indien required.
              $("#werkplek" + (idadd? idadd : "")).removeClass("required");
            psObject[idadd].sgWpl.makeReadOnly();
          }
        }
        else // ($("#bttype" + (idadd? idadd : "")).val() == 'B')
        { // Indien een gebouw gekozen is, maak dan onderstaande velden "weer" wijzigbaar
          if (requiredlevel >= 4) // Verplichtheid er weer opzetten indien required.
            $("#verdieping" + (idadd? idadd : "")).addClass("required");
          sgFlr.undoReadOnly();
          if (typeof(psObject[idadd].sgRoom) != "undefined")
          {
            if (requiredlevel >= 5) // Verplichtheid er weer opzetten indien required.
              $("#ruimte" + (idadd? idadd : "")).addClass("required");
            psObject[idadd].sgRoom.undoReadOnly();
          }
          if (typeof(psObject[idadd].sgWpl) != "undefined")
          {
            if (requiredlevel >= 6) // Verplichtheid er weer opzetten indien required.
              $("#werkplek" + (idadd? idadd : "")).addClass("required");
            psObject[idadd].sgWpl.undoReadOnly();
          }
        }
        if (key > 0 && autosel.key < 0 && $("#verdieping" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
          await sgFlr.CheckJustOne();
      }
      if (typeof(psObject[idadd].sgLoc) != "undefined")
        if (key > 0) plaatsselector.checkLowerLevels(3, key, idadd);
      if (key > 0 && (typeof(psObject[idadd].sgFlr) == "undefined" || $("#verdiepingkey" + (idadd? idadd : "")).val() < 0))
        eval(onGebCascade[idadd]);
      var pbttype
      if ($("#gebouw" + (idadd? idadd : "")).prop("tagName") == "SELECT")
      {
        for (var i = 0; i < $("#gebouw").find(":selected").length; i++)
        {
          if (i == 0)
          {
            pbttype = $("#gebouw").find(":selected")[i].getAttribute("extra");
          }
          else if (pbttype != $("#gebouw").find(":selected")[i].getAttribute("extra"))
          {
            pbttype = "BT"
            break;
          }
        }
        $("#bttype").val(pbttype);
      }
    },

    verChanged: async function(key, idadd = 0)
    {
      if (typeof(psObject[idadd].sgRoom) != "undefined")
      {
        var sgRoom = psObject[idadd].sgRoom;
        var autosel = plaatsselector._autoSelect("alg_verdieping_key", key, "alg_ruimte_key", "alg_ruimte_naam");
        if (!sgRoom.isMulti()) sgRoom.setValue(autosel.key, autosel.desc);
        plaatsselector.ruiChanged(autosel.key);
        if (key > 0 && autosel.key < 0 && $("#ruimte" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
          await sgRoom.CheckJustOne();
      }
      if (typeof(psObject[idadd].sgBld) != "undefined")
        if (key > 0) plaatsselector.checkLowerLevels(4, key, idadd);
      if (key > 0 && (typeof(psObject[idadd].sgRoom) == "undefined" || $("#ruimtekey" + (idadd? idadd : "")).val() < 0))
        eval(onVerCascade[idadd]);
    },

    ruiChanged: async function(key, idadd = 0)
    {
      if (typeof(psObject[idadd].sgWpl) != "undefined")
      {
        var sgWpl = psObject[idadd].sgWpl;
        //plaatsselector._autoSelect("alg_ruimte_key", key);
        if (!sgWpl.isMulti()) sgWpl.setValue(-1, "");
        plaatsselector.werChanged(-1);
        if (key > 0 && $("#werkplek" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
          await sgWpl.CheckJustOne();
      }
      if (typeof(psObject[idadd].sgFlr) != "undefined")
        if (key > 0) plaatsselector.checkLowerLevels(5, key, idadd);
      if (key > 0)
        eval(onRuiCascade[idadd]);
    },

    werChanged: async function(key, idadd = 0)
    {
      if (typeof(psObject[idadd].sgRoom) != "undefined")
        if (key > 0) plaatsselector.checkLowerLevels(6, key, idadd);
    },

    checkReadonlyVer: function (idadd)
    {
      if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
      { // Indien een terrein gekozen is, maak dan onderstaande velden readonly
        if (requiredlevel >= 4) // Verplichtheid eraf halen indien required.
          $("#verdieping" + (idadd? idadd : "")).removeClass("required");
        var sgFlr = psObject[idadd? idadd : 0].sgFlr;
        sgFlr.makeReadOnly();
        $("#verdieping" + (idadd? idadd : "")).val("");
      }
    },

    checkReadonlyRui: function (idadd)
    {
      if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
      { // Indien een terrein gekozen is, maak dan onderstaande velden readonly
        if (requiredlevel >= 5) // Verplichtheid eraf halen indien required.
          $("#ruimte" + (idadd? idadd : "")).removeClass("required");
        var sgRoom = psObject[idadd? idadd : 0].sgRoom;
        sgRoom.makeReadOnly();
        $("#ruimte" + (idadd? idadd : "")).val("");
      }
    },

    checkReadonlyWer: function (idadd)
    {
      if ($("#bttype" + (idadd? idadd : "")).val() == 'T')
      { // Indien een terrein gekozen is, maak dan onderstaande velden readonly
        if (requiredlevel >= 6) // Verplichtheid eraf halen indien required.
          $("#werkplek" + (idadd? idadd : "")).removeClass("required");
        var sgWpl = psObject[idadd? idadd : 0].sgWpl;
        sgWpl.makeReadOnly();
        $("#werkplek" + (idadd? idadd : "")).val("");
      }
    },

    _werkplekken: [], // Deze proberen we te autoselecten. Komen uit prs_info.werkplekken
    _werklocatie: {}, // Deze word gebruikt worden om preciezer te autoselecten (op welke plaats zit ik nu/vandaag ?)
    _werkplaats: {}, // Hier wordt het beste van beiden opgeslagen, zoals in _setWerkplaats ge-evalueerd
    // Deze functie vult plaatsselector._werkplaats in en returned (boolean) of dat gelukt is of niet
    _setWerkplaats: function(werkplekken, werklocatie)
    {
        plaatsselector._resetWerkplaats();
        if (!plaatsselector._setWerkplaatsByWL(werklocatie)) {
          plaatsselector._setWerkplaatsByWP(werkplekken);
        }

        if (plaatsselector._werkplaats.alg_ruimte_naam && plaatsselector._werkplaats.alg_ruimte_naam.charAt(0) == '_')
        {
            plaatsselector._werkplaats.alg_ruimte_key = -1;
            plaatsselector._werkplaats.alg_ruimte_naam = "";
        }
    },
    _resetWerkplaats: function ()
    {
        plaatsselector._werkplaats = {
            alg_locatie_key: -1,
            alg_locatie_naam: "",
            alg_gebouw_key: -1,
            alg_gebouw_naam: "",
            alg_verdieping_key: -1,
            alg_verdieping_naam: "",
            alg_ruimte_key: -1,
            alg_ruimte_naam: ""
        }
    },
    // Bepaal plaatsselector._werkplaats met inachtneming van de werklocatie
    _setWerkplaatsByWL: function(werklocatie)
    {
        var hasWerklocatie;
        for (var i = 0; i < Object.values(werklocatie).length && !hasWerklocatie; i++) {
          hasWerklocatie |= Object.values(werklocatie)[i] > 0;
        }
        if (hasWerklocatie) {
          plaatsselector._werkplaats = werklocatie;
        }
        return hasWerklocatie;
    },
    // Bepaal plaatsselector._werkplaats alleen op basis van de werkplekken; zoek de specifiekste common denominator tussen de werkplekken
    _setWerkplaatsByWP: function(werkplekken)
    {
        var result = JSON.parse(JSON.stringify(plaatsselector._werkplaats)); // Copy
        if (!werkplekken || werkplekken.length == 0)
            return false;
        var commonL = 1;
        var commonG = 1;
        var commonV = 1;
        var commonR = 1;

        var locKey    = plaatsselector._werkplekken[0].alg_locatie_key;
        var bldKey    = plaatsselector._werkplekken[0].alg_gebouw_key;
        var flrKey    = plaatsselector._werkplekken[0].alg_verdieping_key;
        var roomKey   = plaatsselector._werkplekken[0].alg_ruimte_key;

        for (var i = 1; i < werkplekken.length; i++)
        {
            if (locKey == werkplekken[i].alg_locatie_key)
                commonL++;
            if (bldKey == werkplekken[i].alg_gebouw_key)
                commonG++;
            if (flrKey == werkplekken[i].alg_verdieping_key)
                commonV++;
            if (roomKey == werkplekken[i].alg_ruimte_key)
                commonR++;
        }

        var niveauFound = -1;
        if (commonR == werkplekken.length)      // Alle werkplekken hebben dezelfde Ruimte
            niveauFound = 5;
        else if (commonV == werkplekken.length) // Alle werkplekken hebben dezelfde Verdieping
            niveauFound = 4;
        else if (commonG == werkplekken.length) // Alle werkplekken hebben hetzelfde Gebouw
            niveauFound = 3;
        else if (commonL == werkplekken.length) // Alle werkplekken hebben dezelfde Locatie
            niveauFound = 2;

        switch (niveauFound)
        { // Geen break's
            case 5:     result.alg_ruimte_key       = plaatsselector._werkplekken[0].alg_ruimte_key;
                        result.alg_ruimte_naam      = plaatsselector._werkplekken[0].alg_ruimte_naam;
            case 4:     result.alg_verdieping_key   = plaatsselector._werkplekken[0].alg_verdieping_key;
                        result.alg_verdieping_naam  = plaatsselector._werkplekken[0].alg_verdieping_naam;
            case 3:     result.alg_gebouw_key       = plaatsselector._werkplekken[0].alg_gebouw_key;
                        result.alg_gebouw_naam      = plaatsselector._werkplekken[0].alg_gebouw_naam;
            case 2:     result.alg_locatie_key      = plaatsselector._werkplekken[0].alg_locatie_key;
                        result.alg_locatie_naam     = plaatsselector._werkplekken[0].alg_locatie_naam;
                        break;
            default:    return false;
        }
        plaatsselector._werkplaats = result;
        return true;
    },
    hasWerkplaats: function()
    {
        var hasWerkplaats = false;
        for (var i = 0; i < Object.values(plaatsselector._werkplaats).length && !hasWerkplaats; i++) {
            hasWerkplaats |= Object.values(plaatsselector._werkplaats)[i] > 0; // Werkt ook voor String (naam)
        }
        return hasWerkplaats;
    },
    // Vind een goede default plaats op basis van werkplek/locatie en vul die in
    preferWerkplekken: function(werkplekken, werklocatie, idadd = 0)
    {
        plaatsselector._werkplekken = werkplekken;
        plaatsselector._werklocatie = werklocatie || {};

        var sgLoc     = psObject[idadd].sgLoc;
        var sgBld     = psObject[idadd].sgBld;
        var sgFlr     = psObject[idadd].sgFlr;
        var sgRoom    = psObject[idadd].sgRoom;

        // Bepaal beste default op basis van werkplek(ken) en werklocatie, en sla die op in plaatsselector._werkplaats
        plaatsselector._setWerkplaats(werkplekken, werklocatie);

        // Nu dan ook invullen, 1 niveau is voldoende, de rest cascadeert wel middels _autoSelect
        if (plaatsselector.hasWerkplaats()) { // Alleen verrijken, niet leegmaken
          if (!sgLoc.isReadOnly()) {
            sgLoc.setValue(plaatsselector._werkplaats.alg_locatie_key, plaatsselector._werkplaats.alg_locatie_naam, true, true);
          } else if (!sgBld.isReadOnly()) {
            sgBld.setValue(plaatsselector._werkplaats.alg_gebouw_key, plaatsselector._werkplaats.alg_gebouw_naam, true, true);
          } else if (!sgFlr.isReadOnly()) {
            sgFlr.setValue(plaatsselector._werkplaats.alg_verdieping_key, plaatsselector._werkplaats.alg_verdieping_naam, true, true);
          } else if (!sgRoom.isReadOnly()) {
            sgRoom.setValue(plaatsselector._werkplaats.alg_ruimte_key, plaatsselector._werkplaats.alg_ruimte_naam, true, true);
          }
        }

        return plaatsselector.hasWerkplaats();
    },

    // Vul de plaatsselector in op basis van de bepaalde _werkplaats
    _autoSelect: function(level, key, childKey, childDesc, childCode)
    {
        // De huidige level is dezelfde als mijn werklocatie en mijn werklocatie kent de child
        if (plaatsselector._werkplaats[level] == key && plaatsselector._werkplaats[childKey] > 0)
            return { key: plaatsselector._werkplaats[childKey], desc: plaatsselector._werkplaats[childDesc] };
        return { key: -1, desc: "" };
    },

    locatiedetails: function (fieldName)
    {
        var pkey=$(fieldName)[0].value;
        if (pkey != -1) {
            FcltMgr.openDetail("appl/alg/alg_locatie.asp?key=" + pkey);
        }
    },
    gebouwdetails: function (fieldName, bttypefield)
    {
        var pkey=$(fieldName)[0].value;
        if (pkey != -1) {
          if ($(bttypefield)[0].value == "B")
            FcltMgr.openDetail("appl/alg/alg_gebouw.asp?key=" + pkey);
          else if ($(bttypefield)[0].value == "T")
            FcltMgr.openDetail("appl/alg/alg_terreinsector.asp?ter_key=" + pkey);
        }
    },
    verdiepingdetails: function (fieldName)
    {
        var pkey=$(fieldName)[0].value;
        if (pkey != -1) {
            FcltMgr.openDetail("appl/alg/alg_verdieping.asp?key=" + pkey);
        }
    },
    ruimtedetails: function (fieldName)
    {
        var pkey=$(fieldName)[0].value;
        if (pkey != -1) {
            FcltMgr.openDetail("appl/alg/alg_ruimte.asp?key=" + pkey);
        }
    },
    showmap: function (idadd, params)
    {
      var rkey = $("#ruimtekey" + idadd)[0].value;
      var vkey = $("#verdiepingkey" + idadd)[0].value;
      var url = "../cad/showroom.asp?vKey=" + vkey + "&rKey=" + rkey
              + "&caddwgx=" + params.caddwgx + "&caddwgy=" + params.caddwgy
              + (params.mld_key_dwgxy
                ? "&mld_key_dwgxy=" + params.mld_key_dwgxy
                : "")
              + (has_cadShowdiscfn
                ? "&discs=" + cadShowdiscfn()
                : "")
              + (has_cadShowthemafn
                ? "&thema=" + cadShowthemafn()
                : "");
      FcltMgr.openModalDetail(url,
                L("lcl_select_ruimte"),
                {
                  callback: function (data)
                            {
                               // var a = 1;
                            }
                });
    }
}
