/*
  $Id$


    File:           utils_settings.js
    Description:    Reguliere ASP-code heeft via default.inc toegang tot een functie S("....") om settings uit te lezen
                    Sommige UTILS functies worden zowel vanuit ASP (via wsc) als los 'scheduled' (via wsf) gebruikt.
                    In die laatste context is er geen toegang tot default.asp maar is het toch wel erg handig om
                    S() te hebben. Daarom wordt die hier gedefinieerd voor wsf bestanden

    Context:        Gebruik: neem in de wsf(!) file op:
                    <script language="JScript" src="../utils_settings.js"/>
                    en doe in de wsf een var custabspath = fso.GetAbsolutePathName("../");
    Note:           Alleen settings waarvan de naam begint met 'puo_' worden ondersteund
                    (en als extra: flexfilespath)
*/

var settings = { // defaults voordat parameters gelezen zijn; fouten gaan nog alleen naar file (want geen db bekend)
                puo_loglevel: { v: 1, t: "string" },
                puo_logdestination: { v: 1, t: "string" },
                overrule: {},
                loaded: false,

                loadSet : function()
                {   // Laad alle settings voor put_orders uit de database
                    var fso = new ActiveXObject("Scripting.FileSystemObject");
                    try
                    {
                        var sql = "SELECT fac_setting_name"
                                + "     , fac_setting_type"
                                + "     , COALESCE(fac_setting_pvalue, fac_setting_default) fac_setting_value"
                                + "  FROM fac_setting"
                                + " WHERE fac_setting_module = 'PUO'"
                                + "    OR fac_setting_name = 'flexfilespath'";
                        var oRs = Oracle.Execute(sql);
                        while (!oRs.Eof)
                        {
                            var n = oRs("fac_setting_name").Value;
                            var t = oRs("fac_setting_type").Value;
                            var v = oRs("fac_setting_value").Value;
                            if (!v || (n == "flexfilespath" && v == "@"))
                            {
                                switch (n)
                                {
                                    case "flexfilespath":
                                        v = fso.GetAbsolutePathName(custabspath + "/flexfiles");
                                        break;
                                    case "bdradrfiles_path":
                                        v = fso.GetAbsolutePathName(custabspath + "/bdradrfiles");
                                        break;
                                }
                            }
                            else
                            {
                                if (n == "flexfilespath" && v.substr(0,1) == '*') // *_DATA wordt branch20163_DATA of FPlace5i_DATA
                                {
                                    var fso = new ActiveXObject("Scripting.FileSystemObject");
                                    v = fso.GetAbsolutePathName(custabspath + "../../..")
                                                 + v.substr(1) + "/" + customerId;
                                    __Log("Path {0} is set to {1}".format(n, v));
                                }
                            }
                            this[n]= {v: v, t: t};
                            oRs.MoveNext();
                        }
                        oRs.Close();
                        //__Log(this["flexfilespath"].v);
                        __Log("Settings loaded from database.");
                    }
                    catch(err)
                    {
                        __Log("Error loading settings from database: " + err.description);
                    }

                    // Optionele overrules in cust/custenv.wsc en cust/XXXX/custenv.inc
                    tryOverrules();
                },
                get_setting : function (s)
                {
                    if (!this.loaded)
                    {
                        this.loadSet();
                        this.loaded = true;
                    }

                    if (s.toLowerCase() in settings.overrule)
                        return settings.overrule[s.toLowerCase()];

                    try
                    {
                        if (!(s in this))
                        {
                            throw { description: "Setting is missing. Perhaps it is time to upgrade the database." };
                        }
                        var v = this[s].v;
                        var t = this[s].t;
                        switch (t)
                        {
                            case "string":
                                v = v || "";
                                break;
                            case "number":
                                v = parseInt(v);
                                break;
                            case "float":
                                v = parseFloat(v);
                                break;
                            case "boolean":
                                v = (v == "true") || (v == "1") || (v.toLowerCase() == "yes");
                                break;
                            case "array":
                                v = v? v.split(",") : [];
                                break;
                            case "json":
                                try
                                {
                                  v = eval("(" + v + ")");
                                }
                                catch(e)
                                {   // Zou niet mogen gebeuren maar vanwege zeer hoge impact (gebruiker
                                    // kan echt niets meer) toch maar onderscheppen.
                                    __Log("eval van options mislukt: " + e.description);
                                    v = "";
                                }
                                break;
                        }
                        return v;
                    }
                    catch(e)
                    {
                        __Log("Bad or missing value '" + v + "' for setting '" + s + "'\n" + e.description);
                        WScript.Quit();
                    }
                },
                overrule_setting: function (s, v)
                {
                    if (settings[s.toLowerCase()])
                    {
                        __Log("  Overruling " + (s + "                ").substr(0, 22) + " to: " + v);
                        settings.overrule[s.toLowerCase()] = v;
                    }
                }
            }

function S(s, defval)
{
    return settings.get_setting(s, defval)
}

function tryOverrules(domain, username)
{
    settings.overrule = {};
    tryOverrule("../../custenv.wsc", domain, username);
    tryOverrule("../custenv.wsc", domain, username); // deze is sterker
    tryOverrule("./custenv.wsc", domain, username); // deze is het sterkst sterker
}

// ASP-code heeft zijn eigen variant, deze is voor Putorders.bat/wsf
function tryOverrule(path, domain, username)
{
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var hookfile = fso.GetAbsolutePathName(path);
    if (fso.FileExists(hookfile))
    {
        var hook = GetObject("script:"+hookfile);
        // Deze mag de hookfile gebruiken
        hook.Overrule =
        {
            SET: function (naam, waarde)
            {
                settings.overrule_setting(naam.toLowerCase(), waarde);
            },
            DEFAULT: function (naam, type, waarde)
            {
                if (naam in settings)
                {
                    __Log("  Default    " + (naam + "                ").substr(0, 22) + " has already value " + settings[naam].v);
                }
                else
                {
                    settings[naam]= {v: waarde, t: type};
                    __Log("  Defaulting " + (naam + "                ").substr(0, 22) + " to: " + waarde);
                }
            return;
            },
            LCL: function (naam, waarde)
            {
                return; // doen we nog niets mee hier
                //overrule_lcl[naam] = waarde;
            },
            APPLICATION: function (naam, waarde)
            {
                return; // doen we niets mee hier
            }
        }
        var WshNetwork = new ActiveXObject("WScript.Network");

        var puo_data = { customerId: customerId,
                         custabspath: custabspath,
                         Computername: WshNetwork.ComputerName,
                         Username: username || WshNetwork.UserName,
                         Userdomain: domain || WshNetwork.UserDomain
                       };
        __Log("Using overrule " + hookfile + " with user " + WshNetwork.UserName);

        hook.custenv(null, puo_data);
        hook = null; // zorg dat de GC het object kan opruimen.
    }
}
