<%@language = "javascript" %>
<% /*
     $Revision$
     $Id$
*/
ANONYMOUS_Allowed = 1;
var JSON_Result = true;

%>
<!--#include file="../Shared/common.inc"-->
<% settings.overrule_setting("multi_language_option", 0); %>
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/send_mail.inc"-->
<!-- #include file="../aut/login.inc" -->
<%
if (S("self_register") != 1)
    shared.simpel_page(L("lcl_no_auth"));

var result = { rsuccess: 1, warning: "" };

var email = getFParam("prs_email", "");
email = email.replace(/^\s+|\s+$/g,""); // trim spaces

var password = getFParam("password1");

if ( password != getFParam("password2") )
    abort_with_warning(L("lcl_pwd_mismatch"));

validatePassword(-1, password, [email, getFParam("prs_naam",""), getFParam("prs_vrnaam","")]);

// Uberhaupt syntactisch geldige e-mail?
if (!new RegExp(S("email_regexp_single"), "ig").test(email))
		abort_with_warning(L("lcl_invalid_email"));

// En valt het ook binnen onze eventuele white-list?
if (S("self_register_email_whitelist") && !new RegExp(S("self_register_email_whitelist"), "ig").test(email))
    abort_with_warning(L("lcl_self_register_email_wrong")); // Email niet geaccepteerd

var sql = "SELECT prs_perslid_key, "
        + "       prs_perslid_aanmaak, "
        + "       prs_perslid_flags"
        + "  FROM prs_v_aanwezigperslid"
        + " WHERE (UPPER(prs_perslid_email) =" + safe.quoted_sql_upper(email) + " OR "
        + "        UPPER(prs_perslid_oslogin) = " + safe.quoted_sql_upper(email, 256) + ")";
oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
    if (oRs("prs_perslid_flags").Value & 2) // Unapproved
    {
        var aanmaak = new Date(oRs("prs_perslid_aanmaak").Value);
        var expire = new Date();
        expire.setMinutes(expire.getMinutes() - S("self_register_expire"));
        if (expire > aanmaak)
        {
          // Referenties in tabellen naar deze pers_perslid_key moeten eerst verwijderd worden.
          // Door cascade verwijderen van deze record onstaan audits op die tabellen die audit tracking hebben.
          // Daardoor onstaan "ORA-04091:table VLKC.FAC_AUDIT is mutating, trigger/function may not see it" foutmeldingen
          // op de delete van de prs_perslid_key uit de prs_perslid tabel.
          // De tabellen prs_kostenplaats, prs_kostenplaatsgrp, prs_perslidkostenplaats en fac_gebruikersgroep hebben een prs_perslid_key referentie en audit tracking.
          // Hier alleen regel uit fac_gebruikersgroep verwijderen omdat deze is aangemaakt. Regels uit de andere tabellen kunnen nog niet aangemaakt zijn.
          var prs_key = oRs("prs_perslid_key").Value;
          Oracle.Execute("DELETE FROM fac_gebruikersgroep WHERE prs_perslid_key = " + prs_key);

          var sql = "DELETE prs_v_aanwezigperslid"
                  + " WHERE prs_perslid_key = " + prs_key;
          Oracle.Execute(sql); // Cascadeert ook de bookmark weg trouwens
        }
        else
            abort_with_warning(L("lcl_self_register_active")); // Er loopt nog een aanvraag
    }
    else
        abort_with_warning(L("lcl_self_register_duplicate"));
}

var fields =  [ { dbs: "prs_perslid_naam",       typ: "varchar",  frm: "prs_naam" },
                { dbs: "prs_perslid_voornaam",   typ: "varchar",  frm: "prs_vrnaam" },
                { dbs: "prs_perslid_telefoonnr", typ: "varchar",  frm: "prs_telnr" },
                //{ dbs: "prs_perslid_email",      typ: "varchar",  val: email }, nog niet, we willen mogelijk _DEFAULT niet krijgen
                { dbs: "prs_perslid_mobiel",     typ: "varchar",  frm: "prs_mobiel" },
                { dbs: "prs_afdeling_key",       typ: "key",      val: S("self_register_afdeling_key") },
                { dbs: "prs_srtperslid_key",     typ: "key",      val: S("self_register_srtperslid_key") },
                { dbs: "prs_perslid_ingids",     typ: "sql",      val: "NULL" },
                { dbs: "prs_perslid_flags",      typ: "number",   val: 0x0002 }, // 2 = yet unapproved user
                { dbs: "prs_perslid_key",        typ: "key",  seq: "prs_s_prs_alluitvoerende_keys" } ];
var regIns = buildInsert("prs_perslid", fields);
var prs_key = regIns.sequences["prs_perslid_key"];
sql = regIns.sql;
Oracle.Execute(sql);

if (S("self_register_groep_keys").length)
{
    var fac_groep_key = getFParamInt("fac_groep_key", S("self_register_groep_keys")[0]);

    if (!inArray(fac_groep_key, S("self_register_groep_keys")))
        abort_with_warning(L("lcl_self_register_group_invalid"));

    sql = "INSERT INTO fac_gebruikersgroep"
        + "           (fac_groep_key, prs_perslid_key)"
        + "  VALUES (" + fac_groep_key + ", " + prs_key + ")";

    Oracle.Execute(sql);
}
// else komt die _DEFAULT groep wel zodra we prs_perslid_oslogin of prs_perslid_email zetten

sql = "UPDATE prs_perslid"
    + "   SET prs_perslid_oslogin = " + safe.quoted_sql(email, 256)
    + "     , prs_perslid_email = " + safe.quoted_sql(email, 200)
    + " WHERE prs_perslid_key = " + prs_key;
Oracle.Execute(sql);

// Geen doLogin hier want dat is te gemakkelijk te misbruiken. Wel even voor
// de rest van *dit* bestand user_key en user zetten zodat we kunnen tracken
user_key = prs_key;
user = new Perslid(user_key);
shared.trackaction("PRSNEW", prs_key);

bookmarkId = shared.random(32); //
sql = "INSERT INTO fac_bookmark ( "
    + "   fac_bookmark_id, "
    + "   prs_perslid_key, "
    + "   fac_bookmark_naam, "
    + "   fac_bookmark_path, "
    + "   fac_bookmark_query, "
    + "   fac_bookmark_flags, "
    + "   fac_bookmark_expire ) "
    + " VALUES ( "
    +     safe.quoted_sql(bookmarkId) + ", "
    +     prs_key + ", "
    + "   'Self-registration', "
    + "   'appl/prs/self_register_confirm.asp', "
    +     safe.quoted_sql("user_key=" + prs_key) + ", " // is straks beschermd met HMAC
    +     "0," // Zelfs onzichtbaar voor PRSSYS
    + "   sysdate+("+S("self_register_expire")+"/24/60) )"
Oracle.Execute(sql);

setpassword(prs_key, password);

// Pas er op met de afzender: als het e-mail adres niet bestaat of incorrect is
// krijgt de afzender de gebouncte e-mail en zou daar zo maar kunnen klikken.
fac_send_bookmark(bookmarkId, email, L("lcl_self_register_subject"), L("lcl_self_register_body"),
								{ FromAddress: S("self_fromaddress"), ReplyAddress: S("self_replyaddress") });

// Klantspecifieke check functie (hookfunction) voor de invoer
var pResult = new HookResult();
if (!custfunc.prsself_postsave(prs_key, pResult))
{
  abort_with_warning(pResult.errmsg);
}

var result = { success: true, message: L("lcl_self_register_email_sent").format(email) };

Response.Write(JSON.stringify(result));

ASPPAGE_END();
%>
