// ******************************************
// * $Id$
// *
// *   applyIni()
// *   S()
// *   settings
// *
// * Bevat de functies die nodig zijn om de PutOrders.ini in te lezen en de settings bij te werken,
// * en het object Settings die de instellingen voor PutOrders uit FAC_SETTING leest en deze in een globale variabele zet.
// * Deze settings kunnen dan gebruikt worden met de functie S().
// *
// * Uses: scr="./puo_shared.js"
// *       scr="../wsf_shared.js"
// *
// ******************************************
    function applyIni()
    {
      // Als er nog een ini-bestand aanwezig is, kopieer dan deze instellingen naar de database.
      //
      var fso = new ActiveXObject("Scripting.FileSystemObject");
      var puoini = "putorders.ini";
      if (fso.FileExists(puoini))
      {
        Log2File(0, "Applying " + fso.GetAbsolutePathName(puoini));
        var f = fso.OpenTextFile(puoini, 1); // 1=ForReading
        var tekst = f.ReadAll();
        f.Close();
        var secties = tekst.split("\n[");
        for (var sectie in secties)
        {
          var lines = secties[sectie].split("\n");
          var sectienaam = trimall(lines[0].replace(/[\[|\]]/ig, "")).toUpperCase();
          if (sectienaam == "ADO" || sectienaam == "SYSTEM")
            continue;
          //
          __Log("sectie: '" + sectienaam + "' " + lines.length + " lines");

          for (var l in lines)
          {
            if (lines[l].substr(0,1) == ';')
              continue;
            if (lines[l].substr(0,2) == '//')
              continue;
            var sp = lines[l].split("=");
            if (sp.length < 2)
              continue;
            var nm = "puo_" + trimall(sp[0]).toLowerCase();
            // logdestination staat onbewust vaak op 3 ('ook naar database')
            // Die zetten we bij iedereen terug op de default 1 ('alleen putorders.log')
            if (nm == "puo_logdestination")
                continue;
            //
            var vd = sp[1].split(";");
            var vl = trimall(vd[0]);
            //
            var sql = "SELECT fac_setting_key"
                    + "     , fac_setting_type"
                    + "  FROM fac_setting"
                    + " WHERE fac_setting_name = " + safe.quoted_sql(nm);
            var oRs = Oracle.Execute(sql);
            if (oRs.Eof)
            {
                __Log("Setting " + nm + "not found");
            }
            else
            {
                __Log("Set customer setting " + nm + "=" + vl);
                vl = (oRs("fac_setting_type").value=="boolean"?(vl=="1"?"true":"false"):vl);
                sql = "UPDATE fac_setting"
                    + "   SET fac_setting_pvalue = " + safe.quoted_sql(vl)
                    + " WHERE fac_setting_key = " + oRs("fac_setting_key").value;
                Oracle.Execute(sql);
            }
            oRs.Close();
          }
        } // for
        var jsDate = new Date;
        var backupTime = String(jsDate.getFullYear()) + padout(jsDate.getMonth() + 1) + padout(jsDate.getDate()) + "_"
                       + padout(jsDate.getHours()) + padout(jsDate.getMinutes())+ padout(jsDate.getSeconds());
        var backupName = "putorders_" + backupTime + ".ini";
        Log2File(0, "backupName " + backupName);
        fso.MoveFile(puoini, backupName);
      }
      else
      {
        __Log("Applying settings of " + puoini + " not needed.");
      }
    }



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" },

                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)
                            {
                                switch (n)
                                {
                                    case "flexfilespath":
                                        v = fso.GetAbsolutePathName(custabspath + "/flexfiles");
                                        break;
                                    case "bdradrfiles_path":
                                        v = fso.GetAbsolutePathName(custabspath + "/bdradrfiles");
                                        break;
                                }
                            }
                            this[n]= {v: v, t: t};
                            oRs.MoveNext();
                        }
                        oRs.Close();
                        Log2File(2, "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
                    tryOverrule("../../custenv.wsc");
                    tryOverrule("../custenv.wsc");
                    tryOverrule("./custenv.wsc"); // deze is het sterkst sterker
                },
                get_setting : function (s, defval)
                {
                    try
                    {
                        var v = this[s].v;
                        if (typeof v == "undefined")
                        {
                            throw { description: "Setting is missing. Perhaps it is time to upgrade the database." };
                        }
                        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)
                    {
                        if (typeof defval != "undefined")
                        {
                            return defval;
                        }
                        else
                        {
                            __Log("INTERNAL_ERROR_MISSING_SETTING: "+s);
                            WScript.Quit();
                        }
                    }
                },
                overrule_setting : function (s, v)
                {
                    if (settings[s.toLowerCase()])
                    {
                        Log2File(0, s + " overruled to: " + v);
                        settings[s.toLowerCase()].v = v;
                    }
                }
            }

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

function tryOverrule(path)
{
    var fso = new ActiveXObject("Scripting.FileSystemObject");
    var hookfile = fso.GetAbsolutePathName(path);
    if (fso.FileExists(hookfile))
    {
        Log2File(0, "Using overrule " + 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, waarde)
            {
                return; // doen we niets mee hier
            },
            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
                       };
        hook.custenv(null, puo_data);
        hook = null; // zorg dat de GC het object kan opruimen.
    }
}
