1010 lines
35 KiB
PHP
1010 lines
35 KiB
PHP
<% /*
|
||
$Revision$
|
||
$Id$
|
||
|
||
File: shared.inc
|
||
Description: Generieke functies die door elke pagina gebruikt worden.
|
||
Parameters:
|
||
Context: Vanuit ELK asp bestand
|
||
Note: Dus gebruik met mate
|
||
|
||
*/ %>
|
||
<%
|
||
var shared = {
|
||
trackaction:
|
||
function (paction, pkey, poms) /* paction is something like 'BEZMUT', 'MLDAFM' etc */
|
||
{
|
||
if (typeof poms == 'undefined')
|
||
//pcode VARCHAR2 , prefkey NUMBER, puserkey NUMBER, pdatum DATE, poms VARCHAR2
|
||
var sql = "BEGIN fac.trackaction(" + safe.quoted_sql(paction) + ", " + pkey + ", " + user_key + ", NULL, NULL); END;"
|
||
else
|
||
var sql = "BEGIN fac.trackaction(" + safe.quoted_sql(paction) + ", " + pkey + ", " + user_key + ", NULL, " + safe.quoted_sql(poms, 2000) + "); END;"
|
||
Oracle.Execute(sql);
|
||
// noot: trackaction genereert ook eventuele notificaties
|
||
},
|
||
|
||
// Verondersteld dat head al is geweest.
|
||
simpel_body: function(bodyhtml)
|
||
{
|
||
Response.Write("<body class='simpelpage'>");
|
||
Response.Write(bodyhtml);
|
||
Response.Write("</body></html>");
|
||
Response.End;
|
||
},
|
||
|
||
// Maak een heel simpele pagina.
|
||
// Als DOCTYPE_Disable dan veronderstellen we een JSON-vraag en sturen we JSON terug
|
||
// (Anders zou er waarschijnlijk een Ajax Error optreden)
|
||
simpel_page: function(bodyhtml)
|
||
{
|
||
if (typeof DOCTYPE_Disable == "undefined" || typeof JSON == "undefined")
|
||
{
|
||
Response.Clear();
|
||
Response.Write("<html><head>");
|
||
if (typeof FCLTHeader != "undefined" && FCLTHeader.Generate) // API overschrijven (foutief) globale FCLTHeader
|
||
FCLTHeader.Generate();
|
||
Response.Write("</head>");
|
||
shared.simpel_body(bodyhtml);
|
||
}
|
||
else
|
||
{
|
||
Response.Clear();
|
||
Response.Write(JSON.stringify({success: false, message: bodyhtml}));
|
||
Response.End;
|
||
}
|
||
},
|
||
|
||
internal_error: function (message)
|
||
{
|
||
shared.simpel_page(L("lcl_internal_error") + "<p>" + message + "</p>");
|
||
},
|
||
|
||
record_not_found: function (html)
|
||
{
|
||
shared.simpel_page(L("lcl_recnotfound_error") + html);
|
||
},
|
||
|
||
// Geeft true als het bestelde bedrag boven de profiel-limiet van prs_key komt
|
||
// en dus goedkeuring vereist zal zijn.
|
||
exceeds_profiel: function(bestelbedrag, prs_key, dis_key)
|
||
{
|
||
var exceed = true; // geen profiel is altijd te hoog.
|
||
var sql = "SELECT prs.getprofiellimiet(" + prs_key + ", " + dis_key + ") limiet FROM DUAL";
|
||
var oRs = Oracle.Execute(sql);
|
||
|
||
if (oRs("limiet").value != null)
|
||
{
|
||
exceed = (oRs("limiet").value < bestelbedrag);
|
||
}
|
||
oRs.Close();
|
||
return exceed;
|
||
},
|
||
|
||
// Geeft true als het bestelde bedrag boven de profiel-limiet van prs_key komt
|
||
// en dus goedkeuring vereist zal zijn.
|
||
exceeds_limietagb: function(bestelbedrag, prs_key, dis_key)
|
||
{
|
||
var exceed = true; // geen profiel is altijd te hoog.
|
||
var sql = "SELECT prs.getlimietagb(" + prs_key + ", " + S("prs_approvemethod") + ", " + dis_key + ") limiet FROM DUAL";
|
||
var oRs = Oracle.Execute(sql);
|
||
|
||
if (oRs("limiet").value != null)
|
||
{
|
||
exceed = (oRs("limiet").value < bestelbedrag);
|
||
}
|
||
oRs.Close();
|
||
return exceed;
|
||
},
|
||
|
||
random: function (len)
|
||
{
|
||
len = len || 32;
|
||
var sql = "SELECT DBMS_RANDOM.string ('a', " + len + ") FROM DUAL"; // 52 lower en uppercase letters*32 is 182 bits equivalent
|
||
var oRs = Oracle.Execute(sql);
|
||
var rnd = oRs(0).Value;
|
||
oRs.Close();
|
||
return rnd;
|
||
},
|
||
|
||
isGoodNumber: function(str, intOnly, posOnly, numLen, numDec)
|
||
{
|
||
var posOnlyStr = (posOnly ? "" : "\\-?");
|
||
var numLenStr = (numLen == -1 ? "" : (numDec == -1 ? numLen : (intOnly ? numLen : numLen - numDec)));
|
||
var numDecStr = (numDec == -1 ? "" : numDec);
|
||
|
||
var intOnlyStr = "\\d{1," + numLenStr + "}";
|
||
var dblOnlyStr = "\\d{0," + numLenStr + "}[.,]\\d{1," + numDecStr + "}" + "|"
|
||
+ "\\d{1," + numLenStr + "}[.,]\\d{0," + numDecStr + "}" ;
|
||
|
||
var anum = "^"
|
||
+ posOnlyStr + "(" + intOnlyStr
|
||
+ (intOnly ? "" : "[.,]?" + "|" + dblOnlyStr)
|
||
+ ")"
|
||
+ "$";
|
||
|
||
var patt = new RegExp(anum);
|
||
return patt.test(str);
|
||
}
|
||
|
||
};
|
||
|
||
// Check for parameter pName and return the value
|
||
// If not specified return defVal
|
||
// If defVal not specified pName a required parameter
|
||
function getQParam(pName, defVal)
|
||
{
|
||
return _get_Param(Request.Querystring, pName, defVal);
|
||
}
|
||
function getFParam(pName, defVal)
|
||
{
|
||
return _get_Param(Request.Form, pName, defVal);
|
||
}
|
||
function hasQParam(pName)
|
||
{
|
||
return Request.Querystring(pName).Count > 0;
|
||
}
|
||
function hasFParam(pName)
|
||
{
|
||
return Request.Form(pName).Count > 0;
|
||
}
|
||
function _get_Param(pColl, pName, defVal)
|
||
{
|
||
var rq = pColl(pName);
|
||
if (rq.count > 0)
|
||
return rq(1);
|
||
else
|
||
{
|
||
if (typeof defVal != 'undefined')
|
||
return defVal;
|
||
else // Error message will get to client and/or IIS logfiles
|
||
{
|
||
__DoLogForm("#FF0000");
|
||
eval("INTERNAL_ERROR_PARAMETER_" + pName + "_IS_MISSING"); // A required parameter was not supplied
|
||
}
|
||
}
|
||
}
|
||
|
||
// Check for parameter pName and return the Integer value
|
||
// If not specified return defVal
|
||
// If defVal not specified pName is a required parameter
|
||
// If relaxed==true then return defVal on invalid number
|
||
function getQParamInt(pName, defVal, relaxed)
|
||
{
|
||
return _get_ParamInt(Request.Querystring, pName, defVal, relaxed);
|
||
}
|
||
|
||
// only plain ASCII charachters are allowed: a-z, A-Z and digits
|
||
function getQParamSafe(pName, defVal, relaxed)
|
||
{
|
||
var txt = _get_Param(Request.Querystring, pName, defVal);
|
||
if (txt.match(/[^a-zA-Z0-9]/))
|
||
eval("INTERNAL_ERROR_PARAMETER_" + pName + "_IS_BAD");
|
||
return txt;
|
||
}
|
||
|
||
// only plain ASCII charachters are allowed: a-z, A-Z and digits
|
||
function getFParamSafe(pName, defVal, relaxed)
|
||
{
|
||
var txt = _get_Param(Request.Form, pName, defVal);
|
||
if (txt.match(/[^a-zA-Z0-9]/))
|
||
eval("INTERNAL_ERROR_PARAMETER_" + pName + "_IS_BAD");
|
||
return txt;
|
||
}
|
||
|
||
function getFParamInt(pName, defVal, relaxed)
|
||
{
|
||
return _get_ParamInt(Request.Form, pName, defVal, relaxed);
|
||
}
|
||
function _get_ParamInt(pColl, pName, defVal, relaxed)
|
||
{
|
||
var strval = _get_Param(pColl, pName, defVal);
|
||
if (strval == "") return defVal;
|
||
if (strval == defVal) return defVal;
|
||
if (relaxed)
|
||
strval = String(strval).replace(/[^0-9]*/, ''); // strip leading non-digits
|
||
var val = parseInt(strval, 10);
|
||
if (isNaN(val))
|
||
{
|
||
if (relaxed)
|
||
return defVal;
|
||
else
|
||
// Error message will get to client and/or IIS logfiles
|
||
eval("INTERNAL_ERROR_PARAMETER_" + pName + "_IS_NOT_INTEGER"); // A required parameter was not supplied
|
||
}
|
||
else
|
||
return val;
|
||
}
|
||
|
||
// Check for parameter pName and return the Float value
|
||
// If not specified return defVal
|
||
// If defVal not specified pName is a required parameter
|
||
// If relaxed==true then return defVal on invalid number
|
||
function getQParamFloat(pName, defVal, relaxed)
|
||
{
|
||
return _get_ParamFloat(Request.Querystring, pName, defVal, relaxed)
|
||
}
|
||
function getFParamFloat(pName, defVal, relaxed)
|
||
{
|
||
return _get_ParamFloat(Request.Form, pName, defVal, relaxed)
|
||
}
|
||
function _get_ParamFloat(pColl, pName, defVal, relaxed)
|
||
{
|
||
var strval = _get_Param(pColl, pName, defVal);
|
||
if (strval == "") return defVal;
|
||
if (strval == defVal) return defVal;
|
||
var val = parseFloat(strval.replace(/,/g,"."));
|
||
if (isNaN(val) || !isFinite(val))
|
||
{
|
||
if (relaxed)
|
||
return defVal;
|
||
else
|
||
// Error message will get to client and/or IIS logfiles
|
||
eval("INTERNAL_ERROR_PARAMETER_" + pName + "_IS_NOT_FLOAT"); // A required parameter was not supplied
|
||
}
|
||
else
|
||
return val;
|
||
}
|
||
|
||
// Check for parameter pName and return the Date value
|
||
// If not specified return defVal
|
||
// If defVal not specified pName is a required parameter
|
||
// defVal can be a date object or null
|
||
function getQParamDate(pName, defVal)
|
||
{
|
||
return _get_ParamDate(Request.Querystring, pName, defVal)
|
||
}
|
||
function getFParamDate(pName, defVal)
|
||
{
|
||
return _get_ParamDate(Request.Form, pName, defVal)
|
||
}
|
||
function _get_ParamDate(pColl, pName, defVal)
|
||
{
|
||
var val = _get_ParamInt(pColl, pName, -1);
|
||
if (val>0)
|
||
return new Date(val);
|
||
|
||
if (defVal instanceof Date)
|
||
{
|
||
return defVal;
|
||
}
|
||
if (defVal === null) // bewust triple===
|
||
{
|
||
return null;
|
||
}
|
||
// Error message will get to client and/or IIS logfiles
|
||
eval("INTERNAL_ERROR_PARAMETER_" + pName + "_IS_NOT_DATE"); // A required parameter was not supplied
|
||
}
|
||
|
||
// Check for parameter pName and return all values
|
||
// Levert een array op, eventueel leeg
|
||
// Controleert dat het Integers zijn
|
||
// Ondersteunt beide formaten: &key=1&key=2&key=3&key=4 etc.
|
||
// en ook: &key=1,2,3,4
|
||
function getQParamIntArray(pName, defVal)
|
||
{
|
||
return _get_ParamIntArray(Request.Querystring, pName, defVal)
|
||
}
|
||
function getFParamIntArray(pName, defVal)
|
||
{
|
||
return _get_ParamIntArray(Request.Form, pName, defVal)
|
||
}
|
||
function _get_ParamIntArray(pColl, pName, defVal)
|
||
{
|
||
var rf = pColl(pName);
|
||
var arr = [];
|
||
if (rf.count > 0)
|
||
{
|
||
var i;
|
||
for (i=1; i <= rf.count; i++)
|
||
{
|
||
if (rf(i).indexOf(",") >= 0)
|
||
{
|
||
arr = arr.concat(rf(i).split(","));
|
||
}
|
||
else if (rf(i) != "")
|
||
{
|
||
arr.push(rf(i));
|
||
}
|
||
}
|
||
// Nu nog conversie/controle naar integers
|
||
for (i in arr)
|
||
{
|
||
arr[i] = parseInt(arr[i], 10);
|
||
if (isNaN(arr[i]))
|
||
{
|
||
eval("INTERNAL_ERROR_PARAMINTARRAY_" + pName + "_IS_NOT_ALL_INTEGER"); // A required parameter was not supplied
|
||
}
|
||
}
|
||
if (arr.length == 1 && arr[0] == -1)
|
||
arr = []; // *alleen* -1 betekent vaak dat iemand 'alle' gekozen heeft
|
||
// dat behandelen we effectief als een leeg array
|
||
}
|
||
if (arr.length)
|
||
return arr;
|
||
else
|
||
{
|
||
if (typeof defVal != 'undefined')
|
||
return defVal;
|
||
else // Error message will get to client and/or IIS logfiles
|
||
eval("INTERNAL_ERROR_PARAMINTARRAY_" + pName + "_IS_MISSING"); // A required parameter was not supplied
|
||
}
|
||
}
|
||
|
||
// Check for parameter pName and return all values
|
||
// Levert een array op, eventueel leeg
|
||
// Als de xxxIntxxx variant maar dan zonder controle dat het Integers zijn
|
||
// Ondersteunt beide formaten: &key=E&key=I&key=L&key=A etc.
|
||
// en ook: &key=E,I,L,A
|
||
// Bij nosplit wordt alleen de eerste ondersteund
|
||
function getQParamArray(pName, defVal, nosplit)
|
||
{
|
||
return _get_ParamArray(Request.Querystring, pName, defVal, nosplit)
|
||
}
|
||
function getFParamArray(pName, defVal, nosplit)
|
||
{
|
||
return _get_ParamArray(Request.Form, pName, defVal, nosplit)
|
||
}
|
||
function _get_ParamArray(pColl, pName, defVal, nosplit)
|
||
{
|
||
var rf = pColl(pName);
|
||
if (rf.count > 0)
|
||
{
|
||
var arr = [];
|
||
var i;
|
||
for (i=1; i <= rf.count; i++)
|
||
{
|
||
if (!nosplit && rf(i).indexOf(",") >= 0)
|
||
{
|
||
arr = arr.concat(rf(i).split(","));
|
||
}
|
||
else
|
||
arr.push(rf(i));
|
||
}
|
||
return arr;
|
||
}
|
||
else
|
||
{
|
||
if (typeof defVal != 'undefined')
|
||
return defVal;
|
||
else // Error message will get to client and/or IIS logfiles
|
||
eval("INTERNAL_ERROR_PARAMARRAY_" + pName + "_IS_MISSING"); // A required parameter was not supplied
|
||
}
|
||
}
|
||
|
||
// Check for parameter pName and return all values
|
||
// Levert een array op, eventueel leeg
|
||
// Controleert dat het Datums zijn
|
||
// Ondersteunt beide formaten: &key=1&key=2&key=3&key=4 etc.
|
||
// en ook: &key=1,2,3,4
|
||
function getQParamDateArray(pName, defVal)
|
||
{
|
||
return _get_ParamDateArray(Request.Querystring, pName, defVal)
|
||
}
|
||
function getFParamDateArray(pName, defVal)
|
||
{
|
||
return _get_ParamDateArray(Request.Form, pName, defVal)
|
||
}
|
||
function _get_ParamDateArray(pColl, pName, defVal)
|
||
{
|
||
var rf = pColl(pName);
|
||
if (rf.count > 0)
|
||
{
|
||
var arr = [];
|
||
var i;
|
||
for (i=1; i <= rf.count; i++)
|
||
{
|
||
if (rf(i).indexOf(",") >= 0)
|
||
{
|
||
arr = arr.concat(rf(i).split(","));
|
||
}
|
||
else if (rf(i) != "")
|
||
{
|
||
arr.push(rf(i));
|
||
}
|
||
}
|
||
// Nu nog conversie/controle naar integers
|
||
for (i in arr)
|
||
{
|
||
arr[i] = new Date(parseInt(arr[i], 10));
|
||
if (!(arr[i] instanceof Date || arr[i] === null)) // bewust triple===
|
||
{
|
||
// Error message will get to client and/or IIS logfiles
|
||
eval("INTERNAL_ERROR_PARAMETER_" + pName + "_IS_NOT_DATE"); // A required parameter was not supplied
|
||
}
|
||
}
|
||
return arr;
|
||
}
|
||
else
|
||
{
|
||
if (typeof defVal != 'undefined')
|
||
return defVal;
|
||
else // Error message will get to client and/or IIS logfiles
|
||
eval("INTERNAL_ERROR_PARAMINTARRAY_" + pName + "_IS_MISSING"); // A required parameter was not supplied
|
||
}
|
||
}
|
||
|
||
// Usage: "Wilt U melding {0} afmelden?".format(12345)
|
||
// Localscripts/iface.js heeft de clientside versie
|
||
String.prototype.format = function()
|
||
{
|
||
var formatted = this;
|
||
for (var i = 0; i < arguments.length; i++)
|
||
{
|
||
var regexp = new RegExp('\\{'+i+'\\}', 'gi');
|
||
formatted = formatted.replace(regexp, arguments[i]);
|
||
}
|
||
return formatted;
|
||
};
|
||
|
||
|
||
// lijst is een array van parameter namen ["loc_key", "geb_key"]
|
||
// params is optioneel een hash { loc_key: 345, geb_key: 34 }
|
||
// (zonder params wordt QueryString genomen)
|
||
// resultaat: "&loc_key=345&geb_key=34"
|
||
function buildTransitParam(lijst, params)
|
||
{
|
||
var i;
|
||
var result="";
|
||
for (i=0; i<lijst.length; i++)
|
||
{
|
||
var itm = lijst[i];
|
||
if (params && params[itm]) // meegegeven
|
||
result = result + "&" + itm + "=" + Server.URLencode(params[itm]);
|
||
else
|
||
{
|
||
var urlparams = getQParamArray(itm, []); // 0, 1 of meer (o.a. punchout terugkomst)
|
||
var j;
|
||
for (j in urlparams)
|
||
{
|
||
result = result + "&" + itm + "=" + Server.URLencode(urlparams[j]);
|
||
}
|
||
}
|
||
}
|
||
return result;
|
||
}
|
||
|
||
// Op een XSS veilige manier de complete QueryString door kunnen geven
|
||
function transitQS()
|
||
{
|
||
var result="";
|
||
for (var i = 1; i <= Request.QueryString.count; i++)
|
||
{
|
||
var itm = Request.QueryString.key(i);
|
||
var urlparams = Request.QueryString.item(i);
|
||
result = result + "&" + itm + "=" + Server.URLencode(urlparams);
|
||
}
|
||
return result;
|
||
}
|
||
|
||
function padout(number) { return (number < 10) ? "0" + number : number; }
|
||
|
||
// This function should only be used to format display,
|
||
// <20> never as part of a computation.
|
||
function toTimeString(jsDate, bWithSeconds)
|
||
{
|
||
if (jsDate===null)
|
||
return "";
|
||
|
||
if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/)
|
||
jsDate = new Date(jsDate.value);
|
||
if (typeof jsDate == "date") // een oRs("datum").value
|
||
jsDate = new Date(jsDate);
|
||
|
||
if (!jsDate)
|
||
return "";
|
||
|
||
jsDate = new Date(jsDate.valueOf() + 1); // rounding errors
|
||
|
||
ret = padout(jsDate.getHours()) + ":" + padout(jsDate.getMinutes());
|
||
if (bWithSeconds) ret += ":" + padout(jsDate.getSeconds());
|
||
return ret;
|
||
}
|
||
function toDateString(jsDate, noDay)
|
||
{
|
||
if (jsDate===null)
|
||
return "";
|
||
|
||
if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/)
|
||
jsDate = new Date(jsDate.value);
|
||
|
||
if (typeof jsDate == "date") // een oRs("datum").value
|
||
jsDate = new Date(jsDate);
|
||
|
||
if (!jsDate)
|
||
return "";
|
||
|
||
return (noDay?"":calendar_names.daysMin[jsDate.getDay()] + " ") +
|
||
padout(jsDate.getDate()) + "-" + padout(jsDate.getMonth() + 1) + "-" + padout(jsDate.getFullYear());
|
||
}
|
||
function toDateTimeString(jsDate, bWithSeconds, noDay)
|
||
{
|
||
if (jsDate===null)
|
||
return "";
|
||
|
||
if (typeof jsDate == "object" && jsDate.type == 135/*adDBTimeStamp, oRs("datum")*/)
|
||
jsDate = new Date(jsDate.value);
|
||
|
||
if (typeof jsDate == "date") // een oRs("datum").value
|
||
jsDate = new Date(jsDate);
|
||
|
||
return toDateString(jsDate, noDay) + " " + toTimeString(jsDate, bWithSeconds)
|
||
}
|
||
|
||
// Zie document"z:\Project\Sm44\DOC\Intern\Facilitor5i\Facilitor 5i Quotes en Escape.doc"
|
||
safe = {
|
||
|
||
// getal 0 blijft 0
|
||
nvl: function (x)
|
||
{
|
||
if (x == null)
|
||
return "";
|
||
else
|
||
return x;
|
||
},
|
||
// Bijvoorbeeld <textarea>< % =safe.textarea(waarde)% ></textarea>
|
||
textarea: function(waarde)
|
||
{
|
||
return Server.HTMLEncode(safe.nvl(waarde));
|
||
},
|
||
// Bijvoorbeeld <div>< % =omschr% ></div>
|
||
html: function (waarde)
|
||
{
|
||
return Server.HTMLEncode(safe.nvl(waarde)).replace(/\n/g, "<br>");
|
||
},
|
||
// bijvoorbeeld <input value="< % =safe.htmlattr(waarde) % >">
|
||
htmlattr: function (waarde)
|
||
{
|
||
return Server.HTMLEncode(safe.nvl(waarde)).replace(/\'/g,''').replace(/\"/g,'"');
|
||
},
|
||
// Altijd quotes er om, we verdubbelen interne
|
||
csv: function (waarde)
|
||
{
|
||
if (waarde==null)
|
||
return "";
|
||
return "\"" + String(waarde).replace(/\"/g,'""') + "\"";
|
||
},
|
||
// Levert een getal op als string met een komma of een punt, afhankelijk van de
|
||
// decimaal scheider die de gebruiker op zijn eigen PC heeft ingesteld
|
||
// Merk op: g<><67>n 1000-separator, dat is te lastig
|
||
// Te gebruiken voor readonly presentatie van bedragen
|
||
displayfloat: function (fnum, decimals, trimZeros)
|
||
{
|
||
if (fnum == null)
|
||
return "";
|
||
|
||
if (typeof decimals == "undefined")
|
||
decimals = 2;
|
||
fnum = fnum.toFixed(decimals);
|
||
var waarde2 = (1.5).toLocaleString(); // Eventueel gewenste komma, dank zij LCID gezet in appl\FAC\facilitor.inc
|
||
fnum = fnum.substring(0, fnum.length - decimals - 1) + waarde2.substring(2, 1) + fnum.substring(fnum.length - decimals);
|
||
if (trimZeros)
|
||
{
|
||
while (fnum.substring(fnum.length-1) == "0")
|
||
fnum = fnum.substring(0, fnum.length-1);
|
||
if (fnum.substring(fnum.length-1) == waarde2.substring(2, 1))
|
||
fnum = fnum.substring(0, fnum.length-1);
|
||
}
|
||
return fnum;
|
||
},
|
||
// luxe variant: gewenste punt/komma en ook duizendscheiders
|
||
curr: function (waarde)
|
||
{
|
||
if (waarde == null)
|
||
return "";
|
||
if (waarde && !isNaN(waarde))
|
||
waarde = waarde.toLocaleString();
|
||
return waarde;
|
||
},
|
||
// Editable willen we er echt geen duizend-scheiders in hebben
|
||
// Die zijn namelijk heel moeilijk terug te converteren naar number
|
||
// Te gebruiken voor bewerkbare velden met bedragen
|
||
editablefloat: function(fnum, decimals)
|
||
{
|
||
return safe.displayfloat(fnum, decimals); // die heeft toch geen duizend-scheiders
|
||
},
|
||
curreditable: function (waarde)
|
||
{
|
||
return safe.editablefloat(waarde, 2);
|
||
},
|
||
// alert("< % =safe.jsstring(waarde) % >")
|
||
// </script> is ook funest!
|
||
jsstring: function (waarde)
|
||
{
|
||
return (safe.nvl(waarde)).replace(/\\/g,'\\\\').replace(/\n/g,'\\n')
|
||
.replace(/\r/g,'').replace(/\'/g,'\\047').replace(/\"/g,'\\042')
|
||
.replace(/\</g, '\\074').replace(/\>/g, '\\076');
|
||
},
|
||
// var S("res_t1")=< % =safe.jsfloat(S("res_t1"))% >
|
||
jsfloat: function (fnum)
|
||
{
|
||
return(String(fnum)).replace(',','.');
|
||
},
|
||
quoted_sql: function (tekst, maxlen) // maxlen is optioneel
|
||
{
|
||
if (tekst == null)
|
||
return "NULL";
|
||
if (!maxlen)
|
||
maxlen = 4000;
|
||
// Haal alle lage bytes (muv TAB (x09), LF (x0A) en CR (x0D)) er uit. Die representeren
|
||
// geen geldig karakter in Windows-1252 of iso-8859. Ook in UTF-8 staan ze niet voor
|
||
// tekst, mochten we dat ooit willen gaan ondersteunen.
|
||
// Voor ultieme veiligheid ook maar de hoge unicodes er uit? Neen, EURO is ten slotte
|
||
// ook een 'hoge' unicode
|
||
tekst = tekst.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F]+/g, "?");
|
||
tekst = tekst.substr(0, maxlen);
|
||
return "'" + tekst.replace(/\'/g,"''") + "'";
|
||
},
|
||
|
||
quoted_sql_upper: function (tekst, maxlen)
|
||
{
|
||
if (tekst == null)
|
||
return "NULL";
|
||
return safe.quoted_sql(tekst.toUpperCase(), maxlen);
|
||
},
|
||
|
||
quoted_sql_wild: function (tekst, maxlen)
|
||
{
|
||
if (tekst == null)
|
||
return "NULL";
|
||
return safe.quoted_sql(tekst.toUpperCase().replace(/\*/g, "%"), maxlen);
|
||
},
|
||
|
||
filename: function (naam) // geen 'lage' karakters een geen (back)slashes, *,%,<,>, '"', ':', '?' and '|'
|
||
{
|
||
return naam.replace(/[\x00-\x1F|\/|\\|\*|\%\<\>\"\:\?\|]+/g, "_"); // " syntax highlight correctie
|
||
},
|
||
|
||
UserContext: function ()
|
||
{
|
||
try
|
||
{
|
||
var _oAbout = Server.CreateObject('SLNKDWF.About');
|
||
return "UserContext: " + _oAbout.UserContext;
|
||
}
|
||
catch (e)
|
||
{
|
||
return "UserContext: no SLNKDWF.About " + e.description;
|
||
}
|
||
}
|
||
}
|
||
|
||
function abort_with_warning(warning)
|
||
{
|
||
if (JSON_Result && JSON)
|
||
{
|
||
Response.Write(JSON.stringify({ warning: warning, keepForm: true }));
|
||
}
|
||
else
|
||
{
|
||
%>
|
||
<html>
|
||
<head>
|
||
<% FCLTHeader.Generate() %>
|
||
<script type='text/javascript'>
|
||
FcltMgr.closeDetail(window, { warning: "<%=safe.jsstring(warning)%>",
|
||
keepForm: true
|
||
});
|
||
</script>
|
||
</head>
|
||
<body>
|
||
</body>
|
||
</html>
|
||
<%
|
||
}
|
||
Response.End
|
||
}
|
||
|
||
var protectQS =
|
||
{
|
||
sha1 : null,
|
||
// Alleen geschikt als tijdelijk geheim, doorgaans wordt
|
||
// IIS elke nacht gerecycled en dan zijn we deze kwijt
|
||
getProtectSecret: function ()
|
||
{
|
||
var appsecret = Application(customerId + "_protectsecret");
|
||
if (typeof appsecret == "undefined")
|
||
{
|
||
appsecret = shared.random(32);
|
||
Application.Lock();
|
||
Application(customerId + "_protectsecret") = appsecret;
|
||
Application.UnLock();
|
||
}
|
||
return appsecret;
|
||
},
|
||
|
||
// Bescherm de url tegen tampering door een hmac achteraan toe te voegen
|
||
// Te controleren aan de ontvangende kant met protectQS.verify()
|
||
// PAS OP: protectQS.wsc bevat voor Facmgt nog (even) hetzelfde algoritme
|
||
create: function(url, params)
|
||
{
|
||
params = params || {};
|
||
params.sleutel = params.sleutel || protectQS.getProtectSecret();
|
||
|
||
var splitter = url.split("?");
|
||
var pad = splitter[0];
|
||
var qs = splitter.length>1?splitter[1]:"x=x";
|
||
var padsplitter = pad.split("/");
|
||
var file = padsplitter[padsplitter.length-1]; // laatste component
|
||
if (!protectQS.sha1)
|
||
{
|
||
protectQS.sha1 = GetObject("script:"+Server.MapPath(rooturl+"/appl/shared/sha1.wsc"));
|
||
}
|
||
var ts = String(Math.round((new Date).getTime() / 1000));
|
||
// TODO Session("ASPFIXATION") er bij in?
|
||
// Let op dat verify dezelfde data hasht
|
||
// Let op dat protectQS.wsc hetzelfde doet voor Facmgt
|
||
var data = ts + ":" + (params.no_user_key?"":(user_key + ":")) + file.toUpperCase() + "?" + qs;
|
||
__Log("hmacdata: " + data);
|
||
var hmac = protectQS.sha1.b64_hmac_sha1(params.sleutel, data);
|
||
protectQS.sha1 = null; // Caching klinkt leuk maar Oracle sessies blijven langer hangen?
|
||
return pad + "?" + qs + "&hmac="+ts+":"+Server.URLencode(hmac);
|
||
},
|
||
|
||
// params: expire: in minuten. Default 720
|
||
// allowparams []: bijv. 'outputmode'. Deze worden er voor de HMAC berekening uitgestript
|
||
verify: function (params) // expire
|
||
{ // een heel kritische functie kan zichzelf scherper beschermen
|
||
params = params || {};
|
||
params.expire = params.expire || 720;
|
||
var expTime = new Date;
|
||
expTime.setMinutes(expTime.getMinutes()-params.expire); // max expire in het verleden
|
||
var future = new Date;
|
||
future.setMinutes(future.getMinutes() + 3); // Over 3 minuten begint de toekomst :-)
|
||
// Voorkomt misbruik tijdens zomer/wintertijd wissel
|
||
var hmacArr = getQParam("hmac").split(":");
|
||
var createTimeInt = parseInt(hmacArr[0],10);
|
||
var createTime = new Date(createTimeInt*1000);
|
||
if (!createTimeInt || !createTime || createTime < expTime || createTime > future)
|
||
{
|
||
createTime.setMinutes(createTime.getMinutes() + params.expire);
|
||
__Log("HMAC: Te laat: je had voor {0} moeten zijn.".format(toDateTimeString(createTime, true)));
|
||
if (params.errorpage)
|
||
Response.Redirect(params.errorpage);
|
||
else
|
||
INTERNAL_ERROR_HMAC_LATE;
|
||
}
|
||
|
||
var indexHmac = String(Request.QueryString).indexOf("&hmac=");
|
||
|
||
if (String(Request.QueryString).substring(indexHmac+1).indexOf("&") >=0)
|
||
{
|
||
INTERNAL_ERROR_HMAC_URL_EXTENSION;
|
||
}
|
||
|
||
var qs = String(Request.QueryString).substring(0,indexHmac);
|
||
|
||
if (params.allowparams)
|
||
{
|
||
var i;
|
||
for (i in params.allowparams)
|
||
{
|
||
var param = params.allowparams[i];
|
||
if (Request.QueryString(param).Count > 0)
|
||
{ // die rekenen we niet mee in de HMAC
|
||
qs = qs.replace(param + "=" + Request.QueryString(param) + "&", "");
|
||
}
|
||
}
|
||
}
|
||
var pad = String(Request.ServerVariables("SCRIPT_NAME"));
|
||
var padsplitter = pad.split("/");
|
||
var file = padsplitter[padsplitter.length-1]; // laatste component
|
||
var sha1 = GetObject("script:"+Server.MapPath("../shared/sha1.wsc"));
|
||
|
||
// Let op dat create dezelfde data hasht
|
||
var data = String(createTimeInt) + ":" + user_key + ":" + file.toUpperCase() + "?" +qs;
|
||
var should_hmac = sha1.b64_hmac_sha1(protectQS.getProtectSecret(), data);
|
||
if (hmacArr[1]!=should_hmac && params.allow_anonymous)
|
||
{ // Testen met user_key == -1
|
||
var data = String(createTimeInt) + ":" + "-1" + ":" + file.toUpperCase() + "?" +qs;
|
||
var should_hmac = sha1.b64_hmac_sha1(protectQS.getProtectSecret(), data);
|
||
}
|
||
if (hmacArr[1]!=should_hmac)
|
||
{
|
||
__Log("HMAC: " + hmacArr[1]);
|
||
__Log("SHOULD: " + should_hmac);
|
||
if (params.errorpage)
|
||
Response.Redirect(params.errorpage);
|
||
else
|
||
INTERNAL_ERROR_HMAC_TAMPERING;
|
||
}
|
||
}
|
||
}
|
||
|
||
var protectRequest =
|
||
{
|
||
theToken: function () { return Session("ASPFIXATION") }, // Session ASPFIXATION token wordt gebruikt als cookie voor anti CSRF Cross Site
|
||
theVar: "__RequestVerificationToken", // De form-name. Komt ook terug in FacmgtTools.asp
|
||
inputToken: function () // Maak een hidden inputveld met token
|
||
{
|
||
%>
|
||
<input name="<%=protectRequest.theVar%>" id="<%=protectRequest.theVar%>" type="hidden" value="<%=safe.htmlattr(protectRequest.theToken())%>">
|
||
<%
|
||
},
|
||
// Van dataToken is ook een clientside variant in iface.js
|
||
dataToken: function (dataName) // Voeg aan een data hash een input token toe
|
||
{ %>
|
||
<%=dataName%>.<%=protectRequest.theVar%> = "<%=safe.jsstring(protectRequest.theToken())%>";
|
||
<%
|
||
},
|
||
|
||
validateToken: function ()
|
||
{ // De token van het hidden inputveld valideren met de token van de cookie
|
||
var verificationToken = getFParam(protectRequest.theVar, "");
|
||
var cookieToken = protectRequest.theToken()||""; // is leeg bij self_register.asp als we nog niet zijn ingelogd.
|
||
if (verificationToken != cookieToken)
|
||
{ // Is deze functie vanuit een post aangeroepen? Dan afhandeling door post functie af laten handelen.
|
||
if (typeof DOCTYPE_Disable != "undefined" && DOCTYPE_Disable == 1 && typeof JSON != "undefined")
|
||
{
|
||
var result = {message: L("lcl_authentication_error")};
|
||
Response.Write(JSON.stringify(result));
|
||
Response.End;
|
||
}
|
||
else
|
||
abort_with_warning(L("lcl_authentication_error"));
|
||
}
|
||
}
|
||
}
|
||
|
||
var cache = {
|
||
whenTrue: function _whenTrue(b)
|
||
{
|
||
if (b)
|
||
{
|
||
var eTag = user.lang() + "_" + /* S("cache_changecounter") + "_" + */ Session("ASPFIXATION"); // Hoogstens zo lang je ingelogd bent
|
||
Response.AddHeader("ETag", eTag);
|
||
Response.AddHeader("Last-Modified", new Date().toGMTString());
|
||
if (Request.ServerVariables("HTTP_IF_NONE_MATCH") == eTag)
|
||
{ // We hebben een match!
|
||
var tm = "";
|
||
if (Request.ServerVariables("HTTP_IF_MODIFIED_SINCE").Count)
|
||
tm = " (" + toDateTimeString(new Date(Request.ServerVariables("HTTP_IF_MODIFIED_SINCE")), true) + ")";
|
||
__Log("Geslaagde caching" + tm + ": we geven status 304 terug en stoppen.");
|
||
Response.Clear();
|
||
Response.Status = "304 Not modified";
|
||
Response.End;
|
||
}
|
||
}
|
||
},
|
||
|
||
whenNoRecords: function _whenNorecords(sql)
|
||
{
|
||
var oRs = Oracle.Execute(sql);
|
||
this.whenTrue(oRs.Eof);
|
||
oRs.Close();
|
||
}
|
||
}
|
||
// Datum functies
|
||
Date.prototype.toSQL = function toSQL(withTime)
|
||
{
|
||
var str = padout(this.getDate()) + "-" + padout(this.getMonth() + 1) + "-" + padout(this.getFullYear())
|
||
if (withTime)
|
||
{
|
||
str += " " + padout(this.getHours()) + ":" + padout(this.getMinutes());
|
||
return "to_date(" + safe.quoted_sql(str) + ", 'DD-MM-YYYY HH24:MI')";
|
||
}
|
||
else
|
||
return "to_date(" + safe.quoted_sql(str) + ", 'DD-MM-YYYY')";
|
||
}
|
||
|
||
Date.prototype.beginToSQL = function beginToSQL()
|
||
{
|
||
var theDateStart = new Date(this);
|
||
theDateStart.setHours(0, 0);
|
||
return theDateStart.toSQL(true);
|
||
}
|
||
|
||
Date.prototype.endToSQL = function endToSQL()
|
||
{
|
||
var theDateEnd = new Date(this);
|
||
theDateEnd.setHours(23, 59);
|
||
return theDateEnd.toSQL(true);
|
||
}
|
||
|
||
Date.prototype.midnight = function midnight()
|
||
{
|
||
var midn = new Date(this);
|
||
midn.setHours(0,0,0,0);
|
||
return midn;
|
||
}
|
||
|
||
|
||
// Bepaalt de customerId (en rooturl)
|
||
// Na afloop is de globale variabele customerId gezet en opgeslagen in Session("customerId")
|
||
function determineCustomerId()
|
||
{
|
||
// autodetect rooturl. Al onze pagina's beginnen met /cust of met /appl
|
||
var pad = String(Request.ServerVariables("PATH_INFO"));
|
||
var lowerpad = pad.toLowerCase();
|
||
var i1 = lowerpad.indexOf("/cust/");
|
||
if (i1 < 0)
|
||
i1 = lowerpad.indexOf("/appl/");
|
||
if (i1 < 0)
|
||
i1 = lowerpad.indexOf("/default.asp"); // API's
|
||
/* global */ rooturl = pad.substr(0, i1);
|
||
|
||
if ( typeof Session("customerId") == "undefined" ) // ASP-Sessie verlopen of nieuw binnen.
|
||
{
|
||
if (Request.QueryString("api").Count>0 && Request.QueryString("apikey").Count>0)
|
||
{
|
||
Session.Abandon(); // Voorkom dat een session ontstaat doordat we een API-call doen.
|
||
// When the Abandon method is called, the current Session object is queued for deletion
|
||
// but is not actually deleted until all of the script commands on the current page have
|
||
// been processed. This means that you can access variables stored in the Session object
|
||
// on the same page as the call to the Abandon method but not in any subsequent Web pages.
|
||
}
|
||
|
||
// is var customerId al gezet door /default.asp?
|
||
if (typeof customerId != 'undefined' && customerId != "XXXX")
|
||
Session("customerId") = customerId.toUpperCase();
|
||
else if (String(Request.Cookies("fcltcust"))) // Remember me knop
|
||
Session("customerId") = String(Request.Cookies("fcltcust"));
|
||
|
||
// TODO: is er maar <20><>n cust-folder met een Oracle.udl? Gebruik die
|
||
// TODO: is de url van het formaat XXXX(*).facilitor(labs).[nl|de|fr|local]? Gebruik de eerste vier letters
|
||
}
|
||
|
||
// Deze overruled alles:
|
||
if (Request.QueryString("fac_id").Count>0)
|
||
Session("customerId") = String(Request.QueryString("fac_id")).toUpperCase();
|
||
|
||
/* global */ customerId = Session("customerId");
|
||
|
||
if (typeof customerId == "undefined")// Ik geef het op.
|
||
{
|
||
if (String(Request.ServerVariables("HTTP_ACCEPT")).match(/application\/json/) != null)
|
||
{
|
||
var msg = "Your session has expired.\nPlease restart FACILITOR."; // L("xxx") vertrouw ik ook niet meer
|
||
Response.Write("FCLTExpired:" + msg); // FCLTExpired wordt zo opgepikt door FcltJquery.js ajaxSetup error handler
|
||
Response.End;
|
||
}
|
||
Response.Redirect(rooturl + "/appl/shared/expired.asp");
|
||
}
|
||
}
|
||
|
||
// Merk op dat we een beetje browser capabilities en device capabilities
|
||
// op <20><>n hoop gooien. Goed genoeg vooralsnog
|
||
device =
|
||
{ // lower 8 bits
|
||
isSupported: 0x0001,
|
||
isDesktop : 0x0002,
|
||
isTouch : 0x0004,
|
||
isMobile : 0x0008,
|
||
// next 8 bits
|
||
canPrint : 0x0100, // Show print buttons
|
||
canExcel : 0x0200, // Show Excel buttons
|
||
canUpload : 0x0400, // Can upload files
|
||
canDownload: 0x0800, // Can download files
|
||
|
||
_devicebits: 0xff01, // Default desktop, alle capabilities
|
||
|
||
init: function ()
|
||
{
|
||
if (typeof Session("devicebits") != "undefined")
|
||
this._devicebits = Session("devicebits")
|
||
else
|
||
Session("devicebits") = this._devicebits;
|
||
},
|
||
test: function (bits)
|
||
{
|
||
return ( (this._devicebits & bits) == bits);
|
||
},
|
||
testAll: function (bits)
|
||
{
|
||
return test(bits);
|
||
},
|
||
testAny: function (bits)
|
||
{
|
||
return ( (this._devicebits & bits) != 0);
|
||
},
|
||
set: function (bits, newval)
|
||
{
|
||
if (newval || typeof newval == "undefined")
|
||
this._devicebits = this._devicebits | bits;
|
||
else // reset
|
||
this._devicebits = this._devicebits & (~bits);
|
||
Session("devicebits") = this._devicebits;
|
||
}
|
||
}
|
||
|
||
%>
|