Files
Facilitor/APPL/Shared/header.inc

598 lines
26 KiB
C++

<% /*
$Revision$
$Id$
File: shared/header.inc
Description: Generieke serverside header functie.
Stelt de HTML header samen op basis van de meegegeven eisen.
Parameters: params:
title
outputmode (default 0=screen)
plugins []
js []
Context: Eenmalig per ASP, automatisch via shared.inc
Result:
Note: Gebruikt veel de globale rooturl die tegenwoordig autodetect is
Deprecated aanroepen als volgt kunnen gewoon verwijderd worden
FCLTHeader.Generate({ root: "../../appl/" });
FCLTHeader.Set({root: "../../../appl/"});
*/
/************************************************************/
// Huidige jQuery versie: 3.6.0
// Huidige jQuery versie gebruikt voor mobile: 2.2.4 (!= jquery.mobile versie)
// (nog) geen nieuwere versie ivm incompatibiliteit tussen laatste stable jQuery-mobile (1.4.5) & jQuery 3.x+
// Huidige jQuery-ui versie: 1.13.2
if (typeof FCLTHeader != "undefined")
{
Response.Write("common.inc is indirect dubbel included. Dat mag niet.")
Response.End;
}
FCLTHeader =
{
filters: null,
advfilters: null,
_plugins : [],
_params: { title: getQParam("_titel_", null),
outputmode: 0,
plugins: [], js: [], css: [], extrahead: [] },
_myPush: function (arr, itm)
{
var j;
for (j = 0; j < arr.length; j++)
{
if (typeof itm == "string" && arr[j].toLowerCase() == itm.toLowerCase()
|| arr[j] == itm)
return; // hij is er al
}
arr.push(itm);
},
Title: function(title)
{
// TODO: Titel van het tabje zetten.
FCLTHeader._params.title = title;
},
Set: function(params)
{
var i;
for (i in params)
FCLTHeader._params[i] = params[i];
},
Requires: function(params)
{
if (JSON_Result)
__SafeLog("<span style='background-color:#0ff'>JSON_Result staat aan, dan is FCLTHeader.Requires erg onlogisch.</span>");
if (!params) params = {};
var i, j;
// 'Explodeer' de plugins naar onderdelen
if (params.plugins)
for (i = 0; i < params.plugins.length; i++)
{
this._plugins[params.plugins[i]] = true;
var i;
switch (params.plugins[i])
{
case "bootstrap":
FCLTHeader.Requires({css: [rooturl + "/appl/localscripts/bootstrap/css/bootstrap.min.css"]});
case "masonry":
FCLTHeader.Requires({js: [rooturl + "/appl/localscripts/masonry/masonry.min.js"]});
case "jQuery":
FCLTHeader.Requires({js: ["jQuery.js", "FcltJquery.js"]});
FCLTHeader.Requires({js: ["jquery.toast.min.js"],
css: [rooturl + "/appl/localscripts/jquery.toast.min.css"]});
break;
case "suggest":
FCLTHeader.Requires({js: [rooturl + "/appl/shared/suggest/suggest.js"],
css: [rooturl + "/appl/shared/suggest/suggest.css"]});
break;
case "kenmerk":
FCLTHeader.Requires({js: ["jquery-ui.js", "modal_kenmerken.js", "date.js", rooturl + "/appl/shared/kenmerk_js.asp", "jquery.timepicker-table.js"],
css: ["timePicker-table.css"]});
break;
case "modernizr":
FCLTHeader.Requires({js: [rooturl + "/appl/Localscripts/modernizr/modernizr.js"]});
break;
default: _AiAi("INTERNAL_ERROR_PLUGIN_"+params.plugins[i]+"_IS_ONBEKEND");
}
}
if (params.js)
for (i = 0; i < params.js.length; i++)
{
if (params.js[i].toLowerCase() != "fcltmgr.js")
FCLTHeader._myPush(FCLTHeader._params.js, params.js[i]);
};
if (params.css)
for (i = 0; i < params.css.length; i++)
{
FCLTHeader._myPush(FCLTHeader._params.css, params.css[i]);
};
if (params.extrahead)
FCLTHeader._myPush(FCLTHeader._params.extrahead, params.extrahead);
},
_fso:Server.CreateObject("Scripting.FileSystemObject"),
AddTimeStamp: function(fPath, isOptional)
{
fPath = fPath.toLowerCase(); // canonical can improve caching
if (fPath.indexOf(rooturl.toLowerCase()) == 0)
fPath = rooturl + fPath.substring(rooturl.length); // Afblijven van rooturl-deel, cookies verdwijnen anders
try
{
var f = this._fso.GetFile(Server.MapPath(fPath));
var ts=new Date(f.DateLastModified);
return fPath + "?" + Math.floor(ts.getTime()/1000);
}
catch(e)
{
if (isOptional)
return false; // niet erg
Response.Write("\"></script></style></head><p><b>Internal error: kan bestand " + fPath + " niet vinden/openen</b></p>");
Response.Write(e.description);
Response.End;
}
},
AddStylesheet: function(fPath, isOptional, embedformail)
{
if (getQParamInt("formail", 0) == 1)
{
if (!embedformail)
return;
var fcss = this._fso.OpenTextFile(Server.MapPath(fPath));
var tekst = fcss.ReadAll();
fcss.Close();
Response.Write("\n<style>/*embedding shared/default-print.css*/\n" + tekst + "\n</style>");
return;
}
var timedpath = this.AddTimeStamp(fPath, isOptional);
if (timedpath)
{
%>
<link rel="stylesheet" href="<%=timedpath%>" type="text/css"><%
}
},
_customCss: rooturl + "/cache/" + customerId + ".css",
// params
// cssmode: 0: is normale customer css
// 1: is default css
// 2: concept css uit params.csstemplate
// forceInlineExcel: geen native xlsx maar inline
Generate: function (params)
{
if (!params) params = {};
if (params.outputmode == 2 || params.outputmode == 6) // Excel (incl. flex)
{
if (S("excel_mode") == 1)
{
params.outputmode = 4;
}
else if (params.forceInlineExcel || S("excel_mode") != 2)
{
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader ("content-disposition", "inline; filename=facilitor.xls");
%> <meta http-equiv="Content-Type" content="text/html;charset=<%=Response.Charset%>"><%
return; // Excel is heel kaal
}
}
if (params.outputmode == 4) // csv
{
Response.ContentType = "text/csv";
Response.AddHeader ("content-disposition", "attachment; filename=facilitor.csv");
return; // csv is heel kaal
}
%> <meta http-equiv="Content-Type" content="text/html;charset=<%=Response.Charset%>">
<%=S("http_meta_head")%>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<%
// FSN#14103 Voorkom back-button problemen
// user_lang en rooturl resp. voor date.js en FcltMgr.js
%> <script type="text/javascript">
<% if (!params.mobile) { %>
window.history.forward(1);
<% } %>
var user_lang = "<%=safe.jsstring(user_lang)%>";
var rooturl = "<%=safe.jsstring(rooturl)%>";
var S_fontawesomestyle = '<%=safe.jsstring(S("fontawesomestyle"))%>';
<% if (Response.Expires <= 0) { /* niet als gecached, te irritant */ %>
var userId = "<%=safe.jsstring(customerId)+"/"+user_key%>";
<% } %>
var LCL = {}; // Bouw het clientside LCL-array voor teksten die in js gebruikt worden
var RVT_token = "<%=safe.jsstring(protectRequest.theToken())%>";
<% lcl.buildClientLCL();
if (getQParamInt("has_filters", 0) == 1)
{
var fsql = " SELECT fac_menu_filter, fac_menu_advfilter"
+ " FROM fac_menu"
+ " WHERE (prs_perslid_key = " + user_key
+ " OR fac_menu_altgroep = 9)" // Widgets zijn niet persoonsgebonden
+ " AND fac_menu_key = " + getQParamInt("tab_menu_key");
var foRs = Oracle.Execute( fsql );
if (foRs.Eof)
{
Response.Write("</script>");
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/fontawesome.min.css");
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/light.min.css");
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/regular.min.css");
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/solid.min.css");
Response.Write("</head><body>" + L("lcl_shared_pin_removed_error") + "</body></html>");
Response.End;
}
else
{
this.filters = foRs("fac_menu_filter").Value || "";
this.advfilters = foRs("fac_menu_advfilter").Value || "";
}
foRs.Close();
}
if (this.filters)
{
try {
this.filters = JSON.parse(this.filters);
for (x in this.filters) {
if (typeof this.filters[x] === "string" && ("show_" + x in this.filters) && this.filters[x].match(/^:[dwmqy][pn]?\d{0,6}$/i)) {
var parsedDate = defaultDate(this.filters[x].substr(1));
this.filters[x] = new Date(parsedDate).getTime();
this.filters["show_" + x] = toDateString(parsedDate);
}
}
this.filters = JSON.stringify(this.filters);
} catch (e) {
/* Dat kan haast niet, we maken dit object immers zelf (clientside) */
__DoLog("INTERNAL_ERROR parsing filters; " + e.description);
}
Response.Write("\nvar fcltfilters = '" + safe.jsstring(this.filters) + "';");
}
if (this.advfilters)
{
Response.Write("\nvar advfilters = '" + safe.jsstring(this.advfilters) + "';");
}
if (typeof placeholder_icons !== "undefined") /* uit icons.inc, is aanwezig indien iface.inc */
{ /* Stel dan de placeholder iconen ook clientside beschikbaar, voor iface.js */ %>
var placeholder_icons = {
<% for (i in placeholder_icons)
{
%> "<%=i%>": "<%=placeholder_icons[i]%>",
<% } /* Trailing comma in object literals is allowed in supported browsers */
%> }; <%
} %>
</script>
<%
if (FCLTHeader._params.title)
{
%><title><%=safe.html(FCLTHeader._params.title)%></title><%
}
// FcltMgr.js altijd
%> <script type="text/javascript" src="<%=this.AddTimeStamp(rooturl + '/appl/LocalScripts/FcltMgr.js')%>"></script><%
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/fontawesome.min.css");
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/light.min.css");
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/regular.min.css");
FCLTHeader.AddStylesheet(rooturl + "/appl/fontawesome/css/solid.min.css");
if (params.outputmode == 1 || params.outputmode == 5) { // Printen is vrij kaal
FCLTHeader.AddStylesheet(rooturl+"/appl/shared/default-print.css", false, true); // embedformail
if (getQParam('autosortby', "") || getFParam('autosortby', "")) // Deze zijn wel nodig bij printen
{
%><script type="text/javascript" src="<%=this.AddTimeStamp(rooturl+'/appl/LocalScripts/jquery.min.js')%>"></script><%
%><script type="text/javascript" src="<%=this.AddTimeStamp(rooturl+'/appl/LocalScripts/FcltJquery.js')%>"></script><%
%><script type="text/javascript" src="<%=this.AddTimeStamp(rooturl+'/appl/LocalScripts/modernizr/modernizr.js')%>"></script><%
%><script type="text/javascript" src="<%=this.AddTimeStamp(rooturl+'/appl/LocalScripts/iface.js')%>"></script><%
%><script type="text/javascript" src="<%=this.AddTimeStamp(rooturl+'/appl/LocalScripts/sorttable.js')%>"></script><%
}
return;
}
var theme = // S("cssfordesktop") ||
"/appl/Localscripts/theme/jquery-ui.min.css";
FCLTHeader.AddStylesheet(rooturl + theme);
for (var i = 0; i < FCLTHeader._params.css.length; i++)
{
var pad = FCLTHeader._params.css[i];
if (pad.indexOf("/") == -1)
pad = rooturl+"/appl/shared/" + pad;
FCLTHeader.AddStylesheet(pad);
}
FCLTHeader.AddStylesheet(rooturl+"/appl/shared/variables.css");
if (params.mobile) {
FCLTHeader.AddStylesheet(rooturl+"/appl/pda/default.css");
} else {
FCLTHeader.AddStylesheet(rooturl+"/appl/shared/default.css");
}
this.testTemplateCssRefresh();
if (!this._fso.FileExists(Server.MapPath(this._customCss)))
this.generateTemplateCss(undefined, undefined, params.mobile);
FCLTHeader.AddStylesheet(this._customCss, true); // Deze altijd, technisch gezien optioneel
if (params.mobile)
{
FCLTHeader.AddStylesheet(getCustCss("m"), true);
}
else
{
// 0=normaal, 1=kale default, 2=concept
var previewfile = rooturl + "/cache/" + customerId + "_concept.css";
switch (params.cssmode)
{
case 2:
this.generateTemplateCss(params.csstemplate, previewfile);
FCLTHeader.AddStylesheet(previewfile);
break
case 1:
this.generateTemplateCss(FCLTHeader.defaultTemplate, previewfile);
FCLTHeader.AddStylesheet(previewfile);
break
}
if (Session("interface") == "touch")
FCLTHeader.AddStylesheet(rooturl+"/appl/shared/touch.css");
if (Session("interface") == "mobile")
FCLTHeader.AddStylesheet(rooturl+"/appl/pda/default.css");
if ((params.cssmode || 0) == 0)
{
FCLTHeader.AddStylesheet(getCustCss(), true); // optional
FCLTHeader.AddStylesheet(custpath + "/custenv.css", true); // optional, handig voor testomgevingen
}
}
for (var i = 0; i < FCLTHeader._params.js.length; i++)
{
var pad = FCLTHeader._params.js[i];
if (__Logging == 0)
{
if (pad.toLowerCase() == "jquery.js")
{
if (params.mobile)
pad = "jquerymob.min.js";
else
pad = "jquery.min.js";
}
if (pad.toLowerCase() == "jquery-ui.js")
pad = "jquery-ui.min.js";
}
else
{
if (pad.toLowerCase() == "jquery.js")
{
if (params.mobile)
pad = "jquerymob.js";
else
pad = "jquery.js";
}
if (pad.toLowerCase() == "jquery-ui.js")
pad = "jquery-ui.js";
}
if (pad.indexOf("/") == -1)
pad = rooturl+"/appl/LocalScripts/" + pad;
%>
<script type="text/javascript" src="<%=this.AddTimeStamp(pad)%>"></script><%
}
for (var i = 0; i < FCLTHeader._params.extrahead.length; i++)
{
FCLTHeader._params.extrahead[i]();
}
},
defaultTemplate : // De defaults
{
fontfamily: "Segoe UI, fclt-skolar-sans, Verdana, Tahoma, Arial, Helvetica, sans-serif",
fontfamily_alt: "Tahoma, Arial, Helvetica, sans-serif",
fontfamily_titles: "Segoe UI, fclt-skolar-sans, sans-serif",
headerimage: "banner.png",
loginbgimage: "loginbg.jpg",
logincolor: "#FFFFFF",
loginbackgroundcolor: "#062889",
loginiconcolor: "#FF7F62",
newsbgimage: "loginbg.jpg",
newscolor: "#FFFFFF",
portalmenubgimage: "loginbg.jpg",
portalmenucardbgimage: "portalcardbg.jpg",
portalbgimage: "framebodybg.jpg",
framebgimage: "framebodybg.jpg",
textcolor: "#384152",
inputbackgroundcolor: "#EBEFFF",
linkcolor: "#0237FF",
linkhovercolor: "#F26522",
requiredbordercolor: "#D50000",
mayberequiredbordercolor: "#ff9900",
headerbackgroundcolor: "#FFFFFF",
headercolor: "#666666",
dividercolor: "#DDDDDD",
portalkopcolor: "#FFFFFF", /* should fit the backgroundimage */
activetabbackgroundcolor: "#FCFCFC",
activetabcolor: "#002C67", /* Aareon Ink Blue */
inactivetabbackgroundcolor: "#848A93", /* Urban Grey 50% */
inactivetabcolor: "#E6E8EA",
buttonbackgroundcolor: "#EBE3DC", // Aareon: Sand
buttoncolor: "#081326", /* default, emphasishigh*/
buttonhoverbackgroundcolor: "#0552E8", /* zoals Aareon */
buttonhovercolor: "#FFFFFF",
buttonbackgroundcolormediumlow: "#F7F3F0",
buttoncolormediumlow: "#081326", /* emphasismedium, emphasislow */
frameheaderbackgroundcolor: "#EBE3DC", // Aareon: Sand
frameheadercolor: "#000000", // Aareon: Headline black 081326
inlineactionbackgroundcolor: "#FFFFFF",
inlineactioncolor: "#F26522",
flexlabelbackgroundcolor: "transparent",
flexlabelcolor: "#DF742F",
listsubjectcolor: "#343F4D", /* textcolor. meldingonderwerp in de lijst */
menubackgroundcolor: "#F8F8F8",
menucolor: "#002C67",
menuiconcolor: "#002C67", // rather "#CC5252", but let's keep it compatible
menukophoverbackgroundcolor: "#B6DFFA",
menukophovercolor: "#0237FF",
menuitembackgroundcolor: "#FFFFFF",
menuitemcolor: "#000000",
menuitemhoverbackgroundcolor: "#E6EFFA",
menuitemhovercolor: "#000000",
notesbackgroundcolor: "#F59D04",
welcomebackgroundcolor: "#FFFFFF", // =backgroundcolor
welcomecolor: "#FF7F62",
tableheaderbackgroundcolor: "#F7F3F0",
tableheadercolor: "#000000", //081326
/* if mobile_enabled */
mobilefontfamily: "",
mobilebackgroundcolor: "#FAFAFA",
mobiletextcolor: "#343F4D",
mobileheaderimage: "mfbanner.png",
mobileheaderbackgroundcolor: "",
mobileheadercolor: "",
mobilefooterbackgroundcolor: "",
mobilefootercolor: "",
mobileiconcolor: "#002C67",
mobileicontextcolor: "#000000",
mobileiconbackgroundcolor: "",
mobilelistbackgroundcolor: "#FFFFFF",
mobilelisttextcolor: "#343F4D",
mobilelisttitlecolor: "#0237FF",
mobilelistsubtitlecolor: "",
mobilesubiconcolor: "#E02D93"
/* end if mobile_enabled */
},
// tpl en cssfile worden alleen gebruikt bij concept/preview, anders zijn ze leeg
generateTemplateCss : function(tpl, cssfile, mobile)
{
if (!this._fso.FolderExists(Server.MapPath(rooturl + "/cache/")))
{
Response.Write("ERROR: Folder {0} does not exist on the Webserver".format(Server.MapPath(rooturl + "/CACHE")));
Response.Write("<br>Please create it and make sure IUSR user has modify permissions to this folder on the webserver (just like on TEMP)");
Response.End;
}
if (typeof tpl == "undefined")
var custtemplate = S("csstemplate");
else
var custtemplate = tpl;
var outfname = Server.MapPath(cssfile || this._customCss);
__Log("Regenerating template {0}".format(outfname));
var inCss = ":root {\n";
for (itm in this.defaultTemplate) // Vervang alle bekende variabelen
{
var val = this.defaultTemplate[itm];
if (itm in custtemplate)
val = custtemplate[itm];
if (val) {
if (itm.slice(-5) === "image") {
if (itm in custtemplate) {
if (custtemplate[itm] === "## grijstint ##") {
val = HTTP.urlzelfnoroot() + rooturl + "/APPL/Pictures/nobg.jpg";
} else if (custtemplate[itm] === "## transparant ##") {
val = HTTP.urlzelfnoroot() + rooturl + "/APPL/Pictures/transparant.png";
} else {
val = HTTP.urlzelfnoroot() + S("style_image_path") + sharedTrim(val); // Hier staan de custom plaatjes
}
} else {
val = "../Pictures/" + val; // Hier staan de default plaatjes
}
inCss += "--" + itm + ": url(\"" + val + "\");\n";
} else {
inCss += "--" + itm + ": " + val + ";\n";
}
}
}
inCss += "}";
try
{
var outFile = this._fso.OpenTextFile(outfname, 2, true); // 2=write, true=create?
}
catch (e)
{
Response.Write("ERROR: Unable to write " + outfname + "<br>" + e.description);
if (this._fso.FileExists(outfname))
Response.Write("<br>File owner: " + getFileOwner(outfname));
Response.Write("<br>Make sure " + getUserContext() + " user has modify permissions to this folder on the webserver");
Response.End;
}
outFile.WriteLine("/*********************************");
outFile.WriteLine(" * GENERATED FILE, DO NOT MODIFY *");
outFile.WriteLine(" *********************************/\n");
outFile.WriteLine("/*************************");
outFile.WriteLine(" * Global CSS variables *");
outFile.WriteLine(" *************************/");
outFile.Write(inCss);
if (S("csscust"))
{
outFile.WriteLine("\n\n/*********************");
outFile.WriteLine(" * Setting 'csscust' *");
outFile.WriteLine(" *********************/");
outFile.WriteLine(S("csscust"));
}
if (S("cssenvcust"))
{
outFile.WriteLine("\n\n/************************");
outFile.WriteLine(" * Setting 'cssenvcust' *");
outFile.WriteLine(" ************************/");
outFile.WriteLine(S("cssenvcust"));
}
__Log("Template file {0} has been generated.".format(outfname));
outFile.Close();
},
// Kijk of default.csx nieuwer is dan onze temp-css. Dan verversen
testTemplateCssRefresh: function ()
{
if (this._fso.FileExists(Server.MapPath(this._customCss))) {
var fcss = this._fso.GetFile(Server.MapPath(this._customCss));
var tcss = new Date(fcss.DateLastModified);
}
else
tcss = 0;
var hinc = this._fso.GetFile(Server.MapPath(rooturl + "/appl/shared/header.inc"));
var tinc = new Date(hinc.DateLastModified);
if (tinc > tcss)
{
__Log("{0} is older ({1}) than header.inc ({2}), refreshing it.".format(this._customCss, toISODateTimeString(tcss, true), toISODateTimeString(tinc, true)));
this.generateTemplateCss(undefined, undefined);
}
}
}
%>