/*
     $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
*/

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

    disChanged: function(key, idadd)
    {
      if (!idadd) idadd = 0;
      if (typeof(psObject[idadd].sgLoc) != "undefined")
      {
        var sgLoc = psObject[idadd].sgLoc;
        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
          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: function(key, idadd)
    {
      if (!idadd) idadd = 0;
      if (typeof(psObject[idadd].sgBld) != "undefined")
      {
        var sgBld = psObject[idadd].sgBld;
        var autosel = plaatsselector._autoSelectByWP("alg_locatie_key", key, "alg_gebouw_key", "alg_gebouw_naam", "alg_gebouw_code");
        sgBld.setValue(autosel.key, autosel.desc);
        if (autosel.key > 0)
          $("#bttype" + (idadd? idadd : "")).val("B"); // De functie _autoSelectByWP 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
          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: function(key, idadd)
    {
      if (!idadd) idadd = 0;
      if (typeof(psObject[idadd].sgFlr) != "undefined")
      {
        var sgFlr = psObject[idadd].sgFlr;
        var autosel = plaatsselector._autoSelectByWP("alg_gebouw_key", key, "alg_verdieping_key", "alg_verdieping_naam", "alg_verdieping_code");
        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
          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]);
    },

    verChanged: function(key, idadd)
    {
      if (!idadd) idadd = 0;
      if (typeof(psObject[idadd].sgRoom) != "undefined")
      {
        var sgRoom = psObject[idadd].sgRoom;
        var autosel = plaatsselector._autoSelectByWP("alg_verdieping_key", key, "alg_ruimte_key", "alg_ruimte_naam");
        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
          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: function(key, idadd)
    {
      if (!idadd) idadd = 0;
      if (typeof(psObject[idadd].sgWpl) != "undefined")
      {
        var sgWpl = psObject[idadd].sgWpl;
        //plaatsselector._autoSelectByWP("alg_ruimte_key", key);
        sgWpl.setValue(-1, "");
        plaatsselector.werChanged(-1);
        if (key > 0 && $("#werkplek" + (idadd? idadd : "")).is(".required,.autoselect")) // Required moet ook gelden voor CheckJustOne
          sgWpl.CheckJustOne();
      }
      if (typeof(psObject[idadd].sgFlr) != "undefined")
        if (key > 0) plaatsselector.checkLowerLevels(5, key, idadd);
      if (key > 0)
        eval(onRuiCascade[idadd]);
    },

    werChanged: function(key, idadd)
    {
      if (!idadd) 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
    preferWerkplekken: function(werkplekken, idadd)
    {
      if (!idadd) idadd = 0;
      var sgLoc = psObject[idadd].sgLoc;
      var sgBld = psObject[idadd].sgBld;
      var sgFlr = psObject[idadd].sgFlr;
      var sgRoom = psObject[idadd].sgRoom;
      plaatsselector._werkplekken = werkplekken;
      if (plaatsselector._werkplekken.length > 0)
      {
        var locKey = plaatsselector._werkplekken[0].alg_locatie_key;
        var locDesc = plaatsselector._werkplekken[0].alg_locatie_naam;
        var bldKey = plaatsselector._werkplekken[0].alg_gebouw_key;
        var bldDesc = plaatsselector._werkplekken[0].alg_gebouw_naam;
        var flrKey = plaatsselector._werkplekken[0].alg_verdieping_key;
        var flrDesc = plaatsselector._werkplekken[0].alg_verdieping_naam;
        var roomKey = plaatsselector._werkplekken[0].alg_ruimte_key;
        var roomDesc = plaatsselector._werkplekken[0].alg_ruimte_naam;
        if (roomDesc && roomDesc.charAt(0) == '_')
        {
            roomDesc = "";
            roomKey = -1;
        }
      }
      switch (plaatsselector._werkplekken.length)
      {
          case 0:
              break; // Doe niets of clearen?
          case 1:
              if (!sgLoc.isReadOnly())
                sgLoc.setValue(locKey, locDesc, true, true); // rest cascadeert wel.
                // true true voor doonChange en checkExist (UWVA#17530).
              else if (!sgBld.isReadOnly())
              {
                if (sgLoc.getValue() == locKey)
                  // De readonly locatie is eigen werkplek. Dan kan ik het gebouw nu ook invullen en dan cascadeert de rest wel.
                  sgBld.setValue(bldKey, bldDesc, true, true); // Rest cascadeert wel.
                else
                  // De readonly locatie is geen eigen werkplek. Maak het gebouw leeg.
                  sgBld.setValue(-1, "", true, true); // rest cascadeert wel.
              }
              else if (!sgFlr.isReadOnly())
              {
                if (sgBld.getValue() == bldKey)
                  // Het readonly gebouw is eigen werkplek. Dan kan ik de verdieping nu ook invullen en dan cascadeert de rest wel.
                  sgFlr.setValue(flrKey, flrDesc, true, true); // Rest cascadeert wel.
                else
                  // Readonly gebouw is geen eigen werkplek. Maak de verdieping leeg.
                  sgFlr.setValue(-1, "", true, true); // Rest cascadeert wel.
              }
              else if (!sgRoom.isReadOnly())
              {
                var flrKey = plaatsselector._werkplekken[0].alg_verdieping_key;
                if (sgFlr.getValue() == flrKey)
                  // De readonly verdieping is eigen werkplek. Dan kan ik de ruimte nu ook invullen en dan cascadeert de rest wel.
                  sgRoom.setValue(roomKey, roomDesc, true, true); // Rest cascadeert wel.
                else
                  // Readonly gebouw is geen eigen werkplek. Maak de verdieping leeg.
                  sgRoom.setValue(-1, "", true, true); // Rest cascadeert wel.
              }
              break;
          default: // meer dan één
              // Er zijn meerdere werkplekken. Degene met de hoogste bezetting staat bovenaan (element [0]), daarna op alfabet.

              // Indien voor de meerdere werkplekken de locatie hetzelfde is,
              // dan locatie invullen (via _autoSelectByWP cascadeert het wel juist verder),
              // anders plaatsselector leeg maken
              var teller = 1;
              var locKey = plaatsselector._werkplekken[0].alg_locatie_key;
              var locDesc = plaatsselector._werkplekken[0].alg_locatie_naam;
              for (var i = 1; i < plaatsselector._werkplekken.length; i++)
              {
                if (plaatsselector._werkplekken[i].alg_locatie_key == locKey)
                {
                  teller++;
                }
              }
              if (teller == plaatsselector._werkplekken.length)
              { // Alle werkplekken hebben dezelfde locatie
                sgLoc.setValue(locKey, locDesc, true, true); // rest cascadeert wel (via _autoSelectByWP)
                plaatsselector.locChanged(locKey, idadd);
              }
              else
              { // Werkplakken hebben verschillende locaties, plaatsselector leeg maken
                if (!sgLoc.isReadOnly())
                {
                  sgLoc.setValue(-1, ""); // rest cascadeert wel (via _autoSelectByWP)
                  locKey = -1;
                  plaatsselector.locChanged(locKey, idadd);
                  eval(onLocCascade[idadd]);
                }
                else if (!sgBld.isReadOnly())
                {
                  sgBld.setValue(-1, ""); // rest cascadeert wel (via _autoSelectByWP)
                  bldKey = -1;
                  plaatsselector.gebChanged(bldKey, idadd);
                  eval(onGebCascade[idadd]);
                }
                else if (!sgFlr.isReadOnly())
                {
                  sgFlr.setValue(-1, ""); // rest cascadeert wel (via _autoSelectByWP)
                  flrKey = -1;
                  plaatsselector.verChanged(flrKey, idadd);
                  eval(onVerCascade[idadd]);
                }
                else if (!sgRoom.isReadOnly())
                {
                  sgRoom.setValue(-1, ""); // rest cascadeert wel (via _autoSelectByWP)
                  roomKey = -1;
                  plaatsselector.ruiChanged(roomKey, idadd);
                  eval(onRuiCascade[idadd]);
                }
              }
              break;
      }
    },

    // Autoselect op basis van werkplekken
    // Als er maar één werkplek op/onder gekozen level/key aanwezig
    // dan wordt de key, description van de 1e child level opgeleverd
    // Levert { -1, "" ) als geen autoselect mogelijk
    _autoSelectByWP: function(level, key, childKey, childDesc, childCode)
    {
      var foundKey = null;
      var foundDesc = null;
      // geeft true terug als er één werkplek is
      var aantalChilds = 0;
      var same_child_teller = 0;
      if (plaatsselector._werkplekken.length > 0)
        var firstChildKey = plaatsselector._werkplekken[0][childKey];
      for (var i = 0; i < plaatsselector._werkplekken.length; i++)
      {
        if (plaatsselector._werkplekken[i][level] == key)
        {
          foundKey = plaatsselector._werkplekken[i][childKey];
          foundDesc = plaatsselector._werkplekken[i][childDesc];
          var virtualtester = childCode?plaatsselector._werkplekken[i][childCode]:foundDesc;
          if ((childKey == "alg_ruimte_key" || childKey == "alg_verdieping_key" || childKey == "alg_gebouw_key")
                &&  virtualtester && virtualtester.charAt(0) == "_")
            continue; // Sla ruimtes die beginnen met underscore over
          aantalChilds++;
          if (firstChildKey == foundKey)
            same_child_teller++;
        }
      }
      if (aantalChilds == 1 || (aantalChilds > 1 && same_child_teller == aantalChilds))
        // Er is maar 1 child of alle childs zijn hetzelfde. Gegevens van child doorgeven.
        return { key: foundKey, desc: foundDesc };
      else
        // Er zijn verschillende childs. Lege child doorgeven
        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);
        }
    }
}
