<% /*
     $Revision$
     $Id$
*/
%>
<!-- #include file="../PRS/prs.inc" -->
<%

var BIND_RUIMTE = 0x01;
var BIND_WERKPL = 0x02;
var BIND_TERREI = 0x04;
var BIND_AFDELI = 0x08;
var BIND_PERSOO = 0x10;
var BIND_INSDEE = 0x20; // Onderdeel

ins = {checkAutLevel:
           function (pAutfunction, pUser_key)
           {
               // De DISTINCT in het volgende statement is erg belangrijk
               // We staan multiedit toe van objecten van verschillende disciplines
               //    echter alleen als de gebruiker voor al die disciplines exact dezelfde
               //    alg_level_write en prs_level_write heeft. Anders wordt het véél te complex.
               var sql =  "SELECT distinct fac_gebruiker_alg_level_write, fac_gebruiker_prs_level_write "
                        + "  FROM fac_v_webgebruiker w, fac_functie f, ins_deel idd "
                        + " WHERE w.ins_discipline_key = idd.ins_discipline_key "
                        + "   AND w.fac_functie_key = f.fac_functie_key "
                        + "   AND w.prs_perslid_key = " + pUser_key
                        + "   AND fac_functie_code = '"+pAutfunction+"' "
                        + "   AND ins_deel_key IN (" + inskeystring + ")"

               var oRs = Oracle.Execute(sql)
               if (oRs.eof)
                   return false;

               /*globaal*/ alg_level = oRs("fac_gebruiker_alg_level_write").Value;
               /*globaal*/ prs_level = oRs("fac_gebruiker_prs_level_write").Value;

               if (alg_level==9 && prs_level==9)
                   return false; // Alleen leesrechten op *alle* objecten blijkbaar

               oRs.MoveNext();
               if (!oRs.eof)
                   return false; // "Autorisatie te complex! Kies alleen objecten van dezelfde discipline");

               return true; // Okido
           },

       setinspectstatus:
           function (deelsrtcontrole_key, ins_inspect_status_key, uitvoerende)
           { // Zet de status en geef de bijpassende tracking en notificatie.
             var sql = "BEGIN ins.setinspectstatus(" + deelsrtcontrole_key + ", " + ins_inspect_status_key + ", " + user_key + "); END;"
             Oracle.Execute(sql);
           },

       trackinspectupdate:
           // Let op: dit moet wellicht niet altijd (aangeroepen na save)
           function (deelsrtcontrole_key, ptxt)
           {
               shared.trackaction("INSCUP", deelsrtcontrole_key, ptxt);
           },

       getBindingItemString:
           function(bind, bind_key, parent_key)
           {
             var binding_item = L("lcl_unknown");
             switch (bind)
             {
                 case 'A':
                 {
                     sql = "SELECT " + S("prs_dep_string")
                         + " FROM prs_v_afdeling d"
                         + " WHERE d.prs_afdeling_key = " + bind_key;
                     break;
                 }

                 case 'P':
                 {
                     sql = "SELECT prs_perslid_naam_full"
                         + " FROM prs_v_perslid_fullnames_all pf"
                         + " WHERE pf.prs_perslid_key = " + bind_key;
                     break;
                 }

                 case 'C':
                 {
                     sql = "SELECT cp.prs_contactpersoon_naam"
                         + " FROM prs_contactpersoon cp"
                         + " WHERE cp.prs_contactpersoon_key = " + bind_key;
                     break;
                 }

                 case 'R':
                 {
                     sql = "SELECT o.alg_plaatsaanduiding || DECODE(o.alg_plaatsomschrijving, '','' ,' (' || o.alg_plaatsomschrijving || ')')"
                         + "  FROM ins_v_alg_overzicht o "
                         + " WHERE o.alg_ruimte_key = " + bind_key;
                     break;
                 }

                 case 'W':
                 {
                     sql = "SELECT pa.alg_plaatsaanduiding || DECODE(a.alg_ruimte_omschrijving,NULL,'',' (' || a.alg_ruimte_omschrijving || ')')"
                         + " FROM alg_ruimte a"
                         + ", ins_v_alg_overzicht pa"
                         + " WHERE a.alg_ruimte_key = pa.alg_ruimte_key"
                         + " AND pa.prs_werkplek_key = " + bind_key;
                     break;
                 }

                 case 'T':
                 {
                     sql = "SELECT pa.alg_plaatsaanduiding || DECODE(t.alg_terreinsector_omschrijving,NULL,'',' (' || t.alg_terreinsector_omschrijving || ')')"
                         + " FROM alg_terreinsector t"
                         + ", ins_v_alg_overzicht pa"
                         + " WHERE t.alg_terreinsector_key = pa.alg_onroerendgoed_keys"
                         + " AND t.alg_terreinsector_key = " + bind_key;
                   break;
                 }

                 case 'I':
                 {
                     sql = "SELECT ins_deel_omschrijving"
                         + " FROM ins_deel d"
                         + " WHERE d.ins_deel_key = " + parent_key;
                   break;
                 }
             }
             oRs = Oracle.Execute(sql);
             if (!oRs.eof)
                 binding_item = oRs(0).Value;
             return binding_item;
           },

       getGGD:
           function(obj_keys)
           {
             if (obj_keys.length > 0)
             {
               var sql = "SELECT dg.prs_perslid_key"
                       + "     , dg.prs_afdeling_key"
                       + "     , dg.alg_locatie_key"
                       + "     , dg.alg_gebouw_key"
                       + "     , dg.alg_terreinsector_key"
                       + "     , dg.alg_verdieping_key"
                       + "     , dg.alg_ruimte_key"
                       + "     , " + S("alg_loc_string") + " loc_oms"
                       + "     , g.alg_gebouw_code || ' ' || g.alg_gebouw_naam" + " geb_oms"
                       + "     , t.alg_terreinsector_code || ' ' || t.alg_terreinsector_naam" + " ter_oms"
                       + "     , v.alg_verdieping_omschrijving ver_oms"
                       + "     , g.alg_gebouw_code || '-' || v.alg_verdieping_code || '-' || r.alg_ruimte_nr rui_oms"
                       + "  FROM ins_v_deel_gegevens_keys dg"
                       + "     , alg_v_aanweziglocatie l"
                       + "     , alg_v_aanweziggebouw g"
                       + "     , alg_v_aanwezigterreinsector t"
                       + "     , alg_v_aanwezigverdieping v"
                       + "     , alg_v_aanwezigruimte r"
                       + " WHERE dg.alg_locatie_key = l.alg_locatie_key(+)"
                       + "   AND dg.alg_gebouw_key = g.alg_gebouw_key(+)"
                       + "   AND dg.alg_terreinsector_key = t.alg_terreinsector_key(+)"
                       + "   AND dg.alg_verdieping_key = v.alg_verdieping_key(+)"
                       + "   AND dg.alg_ruimte_key = r.alg_ruimte_key(+)"
                       + "   AND dg.ins_deel_key IN (" + obj_keys.join(",") + ")"
                       + " ORDER BY prs_perslid_key DESC"; // Eerst de plaatsgebonden objecten.
               var oRs = Oracle.Execute(sql);
               var nrPlaatsGebondenObjects = 0;
               var diffL = false; // Meegegeven objecten bevinden zich op verschillende locaties.
               var diffG = false; // Meegegeven objecten bevinden zich in verschillende gebouwen.
               var diffT = false; // Meegegeven objecten bevinden zich in verschillende terreinen.
               var diffV = false; // Meegegeven objecten bevinden zich op verschillende verdiepingen.
               var diffR = false; // Meegegeven objecten bevinden zich in verschillende ruimten.
               var prs_key = oRs("prs_perslid_key").Value;
               var afd_key = oRs("prs_afdeling_key").Value;
               var loc_key = oRs("alg_locatie_key").Value;
               var geb_key = oRs("alg_gebouw_key").Value;
               var ter_key = oRs("alg_terreinsector_key").Value;
               var ver_key = oRs("alg_verdieping_key").Value;
               var rui_key = oRs("alg_ruimte_key").Value;
               var loc_oms = oRs("loc_oms").Value;
               var geb_oms = oRs("geb_oms").Value;
               var ter_oms = oRs("ter_oms").Value;
               var ver_oms = oRs("ver_oms").Value;
               var rui_oms = oRs("rui_oms").Value;
               if (prs_key == null && afd_key == null)
                 nrPlaatsGebondenObjects++;
               oRs.MoveNext();
               while (!oRs.eof)
               {
                 if (oRs("prs_perslid_key").Value == null && oRs("prs_afdeling_key").Value == null)
                 { // Object is niet persoons- of afdelingsgebonden.
                   nrPlaatsGebondenObjects++;
                   if (!diffL && loc_key != oRs("alg_locatie_key").Value)
                     diffL = diffG = diffV = diffR = true;
                   else if (!diffG && (geb_key != oRs("alg_gebouw_key").Value || oRs("alg_gebouw_key").Value == null))
                     diffG = diffV = diffR = true;

                   if (!diffT && (ter_key != oRs("alg_terreinsector_key").Value || oRs("alg_terreinsector_key").Value == null))
                     diffT = true;

                   if (!diffV && ver_key != oRs("alg_verdieping_key").Value)
                     diffV = diffR = true;
                   else if (!diffR && rui_key != oRs("alg_ruimte_key").Value)
                     diffR = true;
                 }
                 oRs.MoveNext();
               }
               oRs.Close();
               if (nrPlaatsGebondenObjects == 0)
                 return null; // Er zijn geen plaatsgebonden objecten gevonden.
               else if (!diffR)
                 return {alg_key: rui_key, alg_type: "R", alg_oms: rui_oms, ver_key: ver_key, ver_oms: ver_oms, geb_key: geb_key, geb_oms: geb_oms, loc_key: loc_key, loc_oms: loc_oms};
               else if (!diffV)
                 return {alg_key: ver_key, alg_type: "V", alg_oms: ver_oms, geb_key: geb_key, geb_oms: geb_oms, loc_key: loc_key, loc_oms: loc_oms};
               else if (!diffT)
                 return {alg_key: ter_key, alg_type: "T", alg_oms: ter_oms, loc_key: loc_key, loc_oms: loc_oms};
               else if (!diffG)
                 return {alg_key: geb_key, alg_type: "G", alg_oms: geb_oms, loc_key: loc_key, loc_oms: loc_oms};
               else if (!diffL)
                 return {alg_key: loc_key, alg_type: "L", alg_oms: loc_oms};
               else
                 return null;
             }
             else
              return null;
           },

       getinsstatustext:
           function (p)
           {
             var statustekst = "??";
             var s = parseInt(p, 10);
             switch (s) {
                 case 0: { statustekst = L("lcl_ins_controle_pending"); break; }
                 case 2: { statustekst = L("lcl_ins_controle_gestart"); break; }
                 case 5: { statustekst = L("lcl_ins_controle_afgemeld"); break; }
                 case 6: { statustekst = L("lcl_ins_controle_verwerkt"); break; }
             }
             if (Session("logging")>0)
               statustekst += " ("+String(p)+")";
             return statustekst;
          },

       updateKenmerkdeel:
           function(ins_key, params)
           { // Wijzigbare flexkenmerken altijd opslaan
             params = params || [];
             currentKenmerkenSQL = "SELECT v.ins_kenmerk_key, v.ins_kenmerkdeel_waarde"
                                 + "  FROM ins_kenmerkdeel v"
                                 + " WHERE v.ins_kenmerkdeel_verwijder IS NULL"
                                 + "   AND v.ins_deel_key = " + ins_key;

             allKenmerkenSQL     = "SELECT " + lcl.xsql('isk.ins_srtkenmerk_omschrijving', 'isk.ins_srtkenmerk_key') + " kenmerk_omschrijving"
                                 + ",      isk.ins_srtkenmerk_key srtkenmerk_key"
                                 + ",      fac_kenmerkdomein_key"
                                 + "  FROM ins_kenmerk ik, "
                                 + "       ins_srtkenmerk isk"
                                 + " WHERE ik.ins_srtkenmerk_key = isk.ins_srtkenmerk_key"
                                 + "   AND ik.ins_kenmerk_key = "; /* wordt in saveFlexkenmerken uitgebreid */

             var flextrack = saveFlexKenmerken(ins_key,
                                               { kenmerkTable: "ins_kenmerkdeel",
                                                 kenmerkParentKey : "ins_deel_key",
                                                 kenmerkWaarde: "ins_kenmerkdeel_waarde",
                                                 kenmerkKey: "ins_kenmerk_key",
                                                 currentKenmerkenSQL: currentKenmerkenSQL,
                                                 allKenmerkenSQL: allKenmerkenSQL,
                                                 requestQF: Request.Form,
                                                 isNew: params.isnew,
                                                 flexPath: "INS/I",
                                                 multiMode: params.multimode,
                                                 tracking: true,
                                                 module: "INS"
                                               });
             return flextrack;
           },

       isSleCil:
           // Niveau kan de volgende waarden hebben:
           // null  : ins_deel (niet meegegeven)
           // 'S'   : ins_srtdeel
           // 'G'   : ins_srtgroup (Not used yet)
           // 'D'   : ins_discipline
           function(key, niveau)
           { // Is de key een ins_deel_key of ins_srtdeel_key vsleutel of een cilinder
             var isSC;
             switch (niveau)
             {
               case "S": // ins_srtdeel
                         var sql = "SELECT sd.ins_srtgroep_key"
                                 + "  FROM ins_srtdeel sd"
                                 + " WHERE sd.ins_srtdeel_key = " + key;
                         break;
               case "G": // ins_srtgroep
                         var sql = "SELECT sg.ins_srtgroep_key"
                                 + "  FROM ins_srtgroep sg"
                                 + " WHERE sg.ins_srtgroep_key = " + key;
                         break;
               case "D": // ins_discipline
                        var sql = "SELECT sg.ins_srtgroep_key"
                                + "  FROM ins_srtgroep sg"
                                + " WHERE sg.ins_discipline_key = " + key;
                             break;
               default: // ins_deel
                        var sql = "SELECT sd.ins_srtgroep_key"
                                + "  FROM ins_deel d"
                                + "     , ins_srtdeel sd"
                                + " WHERE d.ins_srtdeel_key = sd.ins_srtdeel_key"
                                + "   AND d.ins_deel_key = " + key;
             }
             var oRs = Oracle.Execute(sql);
             var groep_key = oRs("ins_srtgroep_key").Value;
             oRs.Close;
             return (groep_key == S("sle_ins_srt_groep_key") || groep_key == S("cil_ins_srt_groep_key"));
           },

       //PF: idee om dit te versnellen door voorkennis te vergaren. De selecties zijn erg zwaar
       // eerste stap: in singlerecordmode zo weinig mogelijk query doen.
       // Bepaalt of we op het één object schrijfrechten hebben
       // return True als het mag, false als het niet mag
       // Pas op: parameter alg_key kan ook prs_perslid of afdeling zijn afhankelijk van bind!!
       checkAutSQL:
           function (pUser_key, bind, alg_key, disc_key)
           {
               // Helaas, we moeten 'ingewikkeld' gaan controleren
               // We weten ondertussen al de fac_gebruiker_alg_level_write dus het volgende kan
               // heel efficient.....
               // Alle ruimtes op maximaal afstand 'alg_level' van *mij*
               var fac_v_my_disc_onrgoed_write = ""
                    + "SELECT a.alg_ruimte_key"
                    + "  FROM alg_v_onrgoed_familie a,"
                    + "       alg_v_onrgoed_familie aa,"
                    + "       alg_v_my_room mr"
                    + " WHERE mr.alg_ruimte_key = aa.alg_ruimte_key"
                    + "   AND mr.prs_perslid_key = " + pUser_key
                    + "   AND a.alg_onrgoed_elder_key = aa.alg_onrgoed_elder_key"
                    + "   AND aa.niveau = a.niveau" // Noodzakelijk want ALG_LOCATIE heeft eigen sequence
                    + "   AND aa.niveau >= " + alg_level

               // Alle afdelingen op maximaal afstand 'alg_level' van *mij*
               var fac_v_my_disc_afdelingen_write = ""
                    +   "SELECT a.prs_afdeling_key "
                    + "     FROM prs_v_afdeling_familie a, "
                    + "          prs_v_afdeling_familie aa "
                    + "    WHERE aa.prs_afdeling_key = " + user.prs_afdeling_key()
                    + "      AND a.prs_afdeling_elder_key = aa.prs_afdeling_elder_key "
                    + "      AND aa.niveau = a.niveau "
                    + "      AND aa.niveau >= " + prs_level

               switch (bind)
               {
                 case 'R':
                 case 'W':
                 case 'T':
                   if (alg_level == 9)  return false; // Zeker niet op basis van alg_scope
                   if (alg_level == -1) return true; // Zeker wel op basis van alg_scope
                   if (bind == 'T') // Speciaal geval voor terreinsectoren
                   {
                       if (alg_level > 2)  return false; // Zeker niet op basis van alg_scope
                       rsql = " SELECT 1"
                           + "   FROM alg_v_my_location avml, alg_terreinsector ats"
                           + "  WHERE avml.alg_locatie_key = ats.alg_locatie_key"
                           + "   AND avml.prs_perslid_key = " + pUser_key
                           + "   AND ats.alg_terreinsector_key = " + alg_key
                   }
                   else
                       rsql = " SELECT 1"   // plaatsgebonden en gebruiker heeft een plaats (werkplek)
                           + "   FROM ("+fac_v_my_disc_onrgoed_write+") oga"
                           + "  WHERE oga.alg_ruimte_key = " + alg_key
                       break;

                 case 'P':
                   if (prs_level == 9)  return false; // Zeker niet op basis van prs_scope
                   if (prs_level == -1) return true; // Zeker wel op basis van prs_scope
                    rsql= " SELECT 2"    // persoonsgebonden
                       + "   FROM ("+fac_v_my_disc_afdelingen_write+") aa, prs_perslid p"
                       + "  WHERE p.prs_perslid_key = " + alg_key
                       + "    AND aa.prs_afdeling_key = p.prs_afdeling_key"
                       + "    AND rownum=1";
                       break;

                 case 'A':
                   if (prs_level == 9)  return false; // Zeker niet op basis van prs_scope
                   if (prs_level == -1) return true; // Zeker wel op basis van prs_scope
                   rsql= " SELECT 3"   // afdelingsgebonden
                       + "   FROM ("+fac_v_my_disc_afdelingen_write+") aa"
                       + "  WHERE aa.prs_afdeling_key = " + alg_key
                       + "    AND rownum=1";
                       break;
               }
               return !(Oracle.Execute(rsql).eof);
           },

       // Check de autorisatie van alle objecten. We eisen overal schrijfrechten op
       // We testen per unieke ins_alg_ruimte_type, ins_alg_ruimte_key, ins_discipline_key
       // waardoor er een sterke performanceverbetering is als bijvoorbeeld
       // alle objecten van dezelfde discipline zijn en van dezelfde ruimte/persoon/afdeling
       checkAutSQLMultiple:
           function (autfunction)
           {
               var sql, oRs;
               sql = "SELECT ins_alg_ruimte_type, ins_alg_ruimte_key, ins_discipline_key "
                   + "  FROM ins_deel WHERE ins_deel_key IN (" + inskeystring + ")"
                   + " GROUP BY ins_alg_ruimte_type, ins_alg_ruimte_key, ins_discipline_key";
               oRs = Oracle.Execute( sql );

               while (mayEdit && !oRs.Eof)
               {
                   var bind = oRs("ins_alg_ruimte_type").Value;
                   var alg_key = oRs("ins_alg_ruimte_key").Value; // Kan ook prs_perslid of afdeling zijn!!
                   var disc_key = oRs("ins_discipline_key").Value;

                   mayEdit = ins.checkAutSQL(user_key, bind, alg_key, disc_key);

                   oRs.moveNext();
               }
               return mayEdit;
           },

        ins_disciplineinfo:
           function _ins_disciplineinfo(ins_discipline_key) {
               var sql = "SELECT ins_discipline_key"
                       + "     , (SELECT COUNT(*)"
                       + "          FROM fac_faq ff"
                       + "             , mld_stdmeldingfaq sf"
                       + "         WHERE ff.fac_faq_key = sf.fac_faq_key"
                       + "           AND sf.ins_discipline_key = md.ins_discipline_key"
                       + "           AND BITAND (fac_faq_level, 1) = 1"   // Voor fe
                       + "           AND fac_faq_datum < SYSDATE"
                       + "           AND (fac_faq_lang = " + safe.quoted_sql(user_lang) + " OR fac_faq_lang IS NULL)) aantal_fefaq"
                       + "     , (SELECT COUNT(*)"
                       + "          FROM fac_faq ff"
                       + "             , mld_stdmeldingfaq sf"
                       + "         WHERE ff.fac_faq_key = sf.fac_faq_key"
                       + "           and sf.ins_discipline_key = md.ins_discipline_key"
                       + "           AND BITAND (fac_faq_level, 2) = 2"   // Voor fo
                       + "           AND fac_faq_datum < SYSDATE"
                       + "           AND (fac_faq_lang = " + safe.quoted_sql(user_lang) + " OR fac_faq_lang IS NULL)) aantal_fofaq"
                       + "     , ins_discipline_module"
                       + "     , ins_discipline_omschrijving"
                       + "     , ins_discipline_min_level"
                       + "     , ins_srtdiscipline_key"
                       + "     , ins_discipline_kpnverplicht"
                       + "     , prs_kostensoort_key"
                       + "     , ins_discipline_email"
                       + "     , ins_discipline_btw"
                       + "     , ins_discipline_opmerking"
                       + "     , ins_discipline_ktopercentage"
                       + "     , ins_discipline_ktodrempel"
                       + "     , ins_discipline_volgnr"
                       + "  FROM mld_discipline md"
                       + " WHERE md.ins_discipline_key = " + ins_discipline_key;
               var oRs = Oracle.Execute(sql);

               var result = { ins_discipline_key: oRs("ins_discipline_key").Value,
                              aantal_fefaq: oRs("aantal_fefaq").Value,
                              aantal_fofaq: oRs("aantal_fofaq").Value,
                              module: oRs("ins_discipline_module").Value,
                              omschrijving: oRs("ins_discipline_omschrijving").Value,
                              min_level: oRs("ins_discipline_min_level").Value,
                              ins_srtdiscipline_key: oRs("ins_srtdiscipline_key").Value,
                              kpnverplicht: oRs("ins_discipline_kpnverplicht").Value,
                              prs_kostensoort_key: oRs("prs_kostensoort_key").Value,
                              email: oRs("ins_discipline_email").Value,
                              btw: oRs("ins_discipline_btw").Value,
                              opmerking: oRs("ins_discipline_opmerking").Value,
                              ktopercentage: oRs("ins_discipline_ktopercentage").Value,
                              ktodrempel: oRs("ins_discipline_ktodrempel").Value,
                              volgnr: oRs("ins_discipline_volgnr").Value
                            };

                if (result.aantal_fefaq > 0)
                {
                    result.canFAQUSEread = user.checkAutorisation("WEB_FAQUSE", true)!=null;
                }
                if (result.aantal_fofaq > 0)
                {
                    result.canFAQFOFread = user.checkAutorisation("WEB_FAQFOF", true)!=null;
                }
               oRs.Close();

               return result;
        },

       func_enabled_deel: // Wat mag ik zoal op dit specifieke object?
                          // autodetect sleutels
           function (pins_deel_key, params)
           {
               var isql = "SELECT d.ins_discipline_key"
                        + ",      d.ins_alg_ruimte_key"
                        + ",      d.ins_alg_ruimte_type"
                        + ",      d.ins_alg_ruimte_key_org"
                        + ",      d.ins_alg_ruimte_type_org"
                        + ",      isd.ins_srtgroep_key"
                        + "  FROM ins_deel d, ins_srtdeel isd"
                        + " WHERE d.ins_srtdeel_key = isd.ins_srtdeel_key"
                        + "   AND d.ins_deel_key = " + pins_deel_key;
               var ioRs = Oracle.Execute(isql);
               var srtgroep_key = ioRs("ins_srtgroep_key").Value;
               var isSleCil = (srtgroep_key == S("sle_ins_srt_groep_key") || srtgroep_key == S("cil_ins_srt_groep_key"));
               if (isSleCil)
               {
                 var alg_key = ioRs("ins_alg_ruimte_key_org").Value? ioRs("ins_alg_ruimte_key_org").Value : ioRs("ins_alg_ruimte_key").Value;
                 var iresult = user.func_enabled("SLE",
                                                 null, // ins_discipline doet niet ter zake
                                                 alg_key, // alg_key
                                                 null); // hier zou alleen een prs_key in mogen, we testen zo afzonderlijk

                 iresult.readslebof = iresult.canRead("WEB_SLEBOF");
                 var writeslebof = iresult.canWrite("WEB_SLEBOF");
                 var writeslefof = iresult.canWrite("WEB_SLEFOF");
                 iresult.writeslebof = writeslebof;
                 iresult.writeslefof = writeslefof;
                 iresult.canDelete = writeslebof; // Verwijderen
                 iresult.canChange = writeslebof; // Wijzigen
                 iresult.canChangeAlg = iresult.canChange; // Wijzigen algemene gegevens
                 iresult.canCopy = writeslebof; // Kopiëren
                 iresult.isSleCil = true;
               }
               else // Gewone objecten
               {
                   var iresult = ins.func_enabled_scope(ioRs("ins_discipline_key").Value,
                                                        ioRs("ins_alg_ruimte_type").Value,
                                                        ioRs("ins_alg_ruimte_key").Value);
                   user.auth_required_or_abort(iresult);
               }
               ioRs.Close();

               return iresult;
           },

       func_enabled_scope: // Wat mag ik zoal op deze specifieke scope?
                           // levert null als zelfs nog geen leesrechten
           function (ins_discipline_key, ins_alg_ruimte_type, ins_alg_ruimte_key)
           {
               var iresult = {canDelete: false, canChange: false}; // Verwijderen en Wijzigen
               if (ins_alg_ruimte_type == "A")
               {
                 var afd_key = ins_alg_ruimte_key;

                 var iresult = user.func_enabled("INS",
                                                 ins_discipline_key,
                                                 null, // alg_key is nvt
                                                 null, // hier zou alleen een prs_key in mogen, we testen zo afzonderlijk
                                                 false, // pessimist
                                                 true); // nog even optional
                 if (!iresult || !iresult.anyfound)
                    return null;
                 var canWriteINSMAN = prs.canWriteAfdeling(afd_key, "WEB_INSMAN");
                 var canWriteINSUSE = prs.canWriteAfdeling(afd_key, "WEB_INSUSE");
                 iresult.writeman = canWriteINSMAN;
                 iresult.writeuse = canWriteINSUSE;
                 iresult.canDelete = canWriteINSMAN; // Verwijderen
                 iresult.canChange = canWriteINSMAN || canWriteINSUSE; // Wijzigen
                 iresult.canChangeAlg = canWriteINSMAN; // Wijzigen algemene gegevens
                 iresult.canCopy = canWriteINSMAN; // Kopiëren
               }
               else if (ins_alg_ruimte_type == "P")
               {
                 var iresult = user.func_enabled("INS",
                                                 ins_discipline_key,
                                                 null, // alg_key is nvt
                                                 ins_alg_ruimte_key,
                                                 false, // pessimist
                                                 true); // nog even optional
                 if (!iresult || !iresult.anyfound)
                    return null;
                 iresult.writeman = iresult.canWrite("WEB_INSMAN");
                 iresult.writeuse = iresult.canWrite("WEB_INSUSE");
                 iresult.canDelete = iresult.canWrite("WEB_INSMAN"); // Verwijderen
                 iresult.canChange = iresult.canWrite("WEB_INSMAN") || iresult.canWrite("WEB_INSUSE"); // Wijzigen
                 iresult.canChangeAlg = iresult.canWrite("WEB_INSMAN"); // Wijzigen algemene gegevens
                 iresult.canCopy = iresult.canWrite("WEB_INSMAN"); // Kopiëren
               }
               else
               {
                 var alg_ruimte_key = ins_alg_ruimte_key;
                 var alg_ruimte_type = ins_alg_ruimte_type;

                 if (alg_ruimte_type == "W")
                 {
                   var sql = "SELECT w.prs_alg_ruimte_key"
                           + " FROM prs_werkplek w"
                           + " WHERE w.prs_werkplek_key = " + alg_ruimte_key;
                   var oRs = Oracle.Execute(sql);
                   alg_ruimte_key = oRs("prs_alg_ruimte_key").Value;
                   oRs.Close();
                 }
                 else if (alg_ruimte_type == "T")
                 {
                   var sql = "SELECT t.alg_locatie_key"
                           + " FROM alg_terreinsector t"
                           + " WHERE t.alg_terreinsector_key = " + alg_ruimte_key;
                   var oRs = Oracle.Execute(sql);
                   alg_ruimte_key = oRs("alg_locatie_key").Value;
                   oRs.Close();
                 }
                 // Voor alg_ruimte_type = "P" heeft alg_ruimte_key al de juiste waarde

                 var iresult = user.func_enabled("INS",
                                                 ins_discipline_key,
                                                 alg_ruimte_key,
                                                 null,
                                                 false, // Pessimist.
                                                 true);
                 if (!iresult || !iresult.anyfound)
                    return null;

                 // Alleen backoffice mag verwijderen, dus "WEB_INSMAN" als autorisatie functie nemen.
                 iresult.writeman = iresult.canWrite("WEB_INSMAN");
                 iresult.writeuse = iresult.canWrite("WEB_INSUSE");
                 iresult.canDelete = iresult.canWrite("WEB_INSMAN"); // Verwijderen.
                 iresult.canChange = iresult.canWrite("WEB_INSMAN") || iresult.canWrite("WEB_INSUSE"); // Wijzigen.
                 iresult.canChangeAlg = iresult.canWrite("WEB_INSMAN"); // Wijzigen algemene gegevens.
                 iresult.canCopy = iresult.canWrite("WEB_INSMAN"); // Kopiëren.
               }
               iresult.canInspect = iresult.canWrite("WEB_INSUSE"); // Kopiëren.
               iresult.canShowInsp = iresult.canRead("WEB_INSUSE"); // Inzien.
               iresult.canChangeXcp = iresult.canWrite("WEB_INSMAN"); // Interval kenmerken/parameters wijzigen (waarden in ins_srtcontroledl_xcp tabel).
               return iresult;
           }
}
%>