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

     File:      pda/getLocation.asp
                Gets the nearest alg-key of systemselected ALG-level based on the given latitude,longitude
                that is within the scope of this user
                SO result.alg_key depends on Level:
                    L: alg_location_key
                    G: alg_gebouw_key
                    V: alg_verdieping_key (lowest floor of selected building)
     Status:    Ready
     Context:   vanaf setlocation.asp
     Parameters:
                lat, lng
*/
%>
<%
JSON_Result = 1;
%>
<!-- #include file="../Shared/common.inc" -->
<!--#include file="../Shared/json2.js" -->
<%

var lat = getQParamFloat("lat");
var lng = getQParamFloat("lng");

var lvl = S("mobile_alg_level");
var result = {};

// Kies heel ruim waar je autorisatie op hebt (uit: setlocation.asp)
// Let op dat je hier alleen autorisaties met plaats-component toevoegt (fac_functie_minlevel & 8)
var sql = "SELECT COALESCE(MIN(fac_gebruiker_alg_level_write), 9) writelevel"
        + "  FROM fac_v_webgebruiker g, fac_functie f "
        + " WHERE g.fac_functie_key = f.fac_functie_key "
        + "   AND f.fac_functie_code IN ('WEB_MLDUSE', 'WEB_INSMAN', 'WEB_INSUSE', 'WEB_ALGMAN', 'WEB_ALGUSE', 'WEB_MLDBO2', 'WEB_ORDBO2', 'WEB_MLDBOF', 'WEB_BEZUSE', 'WEB_RESUSE', 'WEB_MLDUSE')"
        + "   AND g.prs_perslid_key = " + user_key;
var oRs = Oracle.Execute(sql);
var autlevel = oRs("writelevel").Value; // Pas op: kan ook '0' zijn (regio)
oRs.Close();

    sql = "";

    if (lvl == 'L') {
        sql = "SELECT alg_locatie_key alg_key"
            + "  FROM alg_locatie"
            + " WHERE alg_locatie_verwijder IS NULL"
            + "   AND alg_locatie_x IS NOT NULL"
            + "   AND alg_locatie_y IS NOT NULL";
        if (autlevel >= 0)
            sql +=   " AND alg_locatie_key IN"
                   + " (SELECT alg_locatie_key FROM fac_v_my_locations"
                   + "  WHERE prs_perslid_key = " + user_key
                   + "  AND niveau = " + autlevel + ")";
        sql += " ORDER BY SQRT (POWER (alg_locatie_x - " + lat + ", 2) + POWER (alg_locatie_y - " + lng + ", 2))";

    } else if (lvl == 'G' || lvl == 'V') {
        sql = "SELECT g.alg_gebouw_key alg_key"
            + "  FROM alg_gebouw g, alg_srtgebouw sg, alg_locatie l"
            + " WHERE sg.alg_srtgebouw_key = g.alg_srtgebouw_key"
            + "   AND g.alg_locatie_key = l.alg_locatie_key"
            + "   AND sg.alg_srtgebouw_passief IS NULL"  // Alleen de facilitair actieve gebouwen
            + "   AND g.alg_gebouw_verwijder IS NULL"
            + "   AND alg_gebouw_x IS NOT NULL"
            + "   AND alg_gebouw_y IS NOT NULL";
        if (autlevel >= 0)
            sql +=  " AND g.alg_gebouw_key IN"
                   + " (SELECT alg_gebouw_key FROM fac_v_my_buildings"
                   + "  WHERE prs_perslid_key = " + user_key
                   + "  AND niveau = " + autlevel + ")";
        sql += " ORDER BY SQRT (POWER (alg_gebouw_x - " + lat + ", 2) + POWER (alg_gebouw_y - " + lng + ", 2))";
    }

    // Het eerste record moet het dichtsbijzijnde zijn van alles waarvan de plaats bekend is
    if (sql != "") {
        oRs = Oracle.Execute(sql);
        if (!oRs.eof) {
            result.alg_key = oRs("alg_key").value;
            if (lvl == 'V' && result.alg_key) {
                // Er wordt een verdiepingskey gevraagd, pak de laagste niet-kelder dan maar
                // (ik besef me dat deze variabelen hierdoor herbruikt worden)
                sql = "SELECT alg_verdieping_key "
                    + "  FROM alg_verdieping"
                    + " WHERE alg_gebouw_key = " + result.alg_key
                    + "  AND alg_verdieping_verwijder IS NULL"
                    + " ORDER BY ABS (alg_verdieping_volgnr), alg_verdieping_volgnr DESC";
                oRs = Oracle.Execute(sql);
                if (!oRs.eof) {
                    result.alg_key = oRs("alg_verdieping_key").value;
                }
                else {
                    // ik heb wel een GPS, maar geen geldige verdiepingkey, en die wordt gevraagd
                    result.alg_key = -1;
                }
            }
        }
    }

    Response.Write(JSON.stringify(result)); //key van het gevraagde type, anders -1
%>
