Files
Facilitor/APPL/Localscripts/plaatsselector.js
Jos Groot Lipman 4a52b95275 FSN#35167 Virtuele verdiepingen en gebouwen beter negeren
svn path=/Website/trunk/; revision=28623
2016-03-24 14:28:48 +00:00

476 lines
22 KiB
JavaScript
Raw Blame History

/*
$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) 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
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 <20><>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 <20><>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 <20><>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);
}
}
}