Files
Facilitor/APPL/Shared/kenmerk_js.asp
Jos Groot Lipman a7f468be0b Merge 2022.1 Gold C/D/E patches
svn path=/Website/trunk/; revision=55878
2022-05-12 12:40:24 +00:00

504 lines
22 KiB
Plaintext
Raw Blame History

<%@language = "javascript"%>
<% /*
$Revision$
$Id$
*/ %>
<%
var ANONYMOUS_Allowed = 1;
var DOCTYPE_Disable = 1;
var FCLTEXPIRES = 8*60; // geen database interactie tenslotte
%>
<!-- #include file="../Shared/common.inc" -->
<%
Response.ContentType = "text/javascript";
%>
/*
i volgnr
ktype 'D', 'C', 'N' etc.
klen lengte
kdec decimalen
kmin kmax
*/
function checkRequiredGroup(group, params)
{
params = params || {};
var has_emptyvalue = typeof(params.emptyvalue) != "undefined"; // Er kan een empty waarde meegegeven zijn die als lege waarde opgevat moet worden, bijvoorbeeld als aantal 0 is.
var requiredgroup = "required" + group;
var groupisrequired = false;
var rgroup = $("." + requiredgroup);
for (var i = 0; i < rgroup.length; i++)
{
var rgvalue = rgroup[i].value;
var tagName = rgroup[i].tagName;
var tagType = rgroup[i].type;
var isbijlage = rgroup[i].getAttribute("isBijlage")==1;
var bijlage = rgroup[i].getAttribute("nBijlagen");
var ischecked = rgroup[i].checked;
var hasInput = false;
var hasSelect = (tagName == "SELECT" && rgvalue > 0);
var hasBijlage = (tagName == "INPUT" && isbijlage && bijlage > 0);
var hasCheckbox = false;
if (tagType == "checkbox")
hasCheckbox = (tagName == "INPUT" && tagType == "checkbox" && ischecked);
else
hasInput = (((tagName == "INPUT" || tagName == "TEXTAREA") &&
((!has_emptyvalue && rgvalue != "") || (has_emptyvalue && rgvalue != 0))) &&
!isbijlage);
if (hasInput || hasSelect || hasBijlage || hasCheckbox)
{
groupisrequired = true;
break;
}
}
if (groupisrequired)
{
$("." + requiredgroup).addClass("required")
.attr("required", "required");
for (var i = 0; i < rgroup.length; i++)
{ // Als checkbox dan toch verplicht is, vink maar aan.
if (rgroup[i].type == "checkbox" && !rgroup[i].checked)
{
rgroup[i].checked = true;
$(rgroup[i]).change();
}
}
}
else
{
$("." + requiredgroup).removeClass("required")
.removeAttr("required");
}
}
var in_use = false; // Semaphore(Seinvlag) om nested loop van de alerts van twee velden met te lange invoer te vermijden.
function checkKenmerk(field, show, ktype, klen, kdec, kmin, kmax, params)
{
params = params || {};
var valid = true;
if (!in_use)
{
in_use = true;
var value = field.value;
var error = "<%=L("lcl_mld_invalid_kenmerk_format")%>";
if (value != '')
{
if (ktype == 'D')
{
$(field).change(cal_show_onChange);
// Native datepicker of jQuery datepicker?
// Kopie uit kenmerk_common.inc
var touchdevice = (typeof window.orientation !== "undefined") || (typeof window.ontouchstart !== "undefined") || (navigator.userAgent.indexOf('IEMobile') !== -1);
var native = !(typeof Modernizr == "undefined" || !Modernizr.inputtypes.date || !touchdevice);
// Test of er nu een geldig datumformaat staat.
// [YYYY-MM-DD] for native pickers,
// [DD-MM-YYYY] voor jQuery datepicker
var regex = native ? /^(\d{1,4})[-](\d{1,2})[-](\d{1,2})$/
: /^(\d{1,2})[-](\d{1,2})[-](\d{1,4})$/;
var arr = regex.exec(value);
if (arr)
{
var date = native ? arr[3] : arr[1];
var month = arr[2];
var year = native ? arr[1] : arr[3];
var dt = new Date(year, month-1, date);
if (date != dt.getDate() || month != dt.getMonth() + 1 || (year != dt.getYear() && year != dt.getFullYear()))
{
valid = false;
}
}
else valid = false;
}
else if (ktype == 'T')
{
// sta toe 14 -> 14:00h
// sta toe 930 -> 9:30h
// sta ook allerlei separators toe.
var TIME_RE = /^(\d*)[\/\.\-\: ]?(\d\d?)?$/;
posstime = value.match(TIME_RE);
if (posstime && posstime.length && !isNaN(parseInt(posstime, 10))) // er moet minstens iets goed zijn
{
var hh = parseInt(posstime, 10);
mm = 0;
if (posstime.length > 1 && posstime[2])
{
var mm = parseInt(posstime[2],10);
}
else // 930 voor 9:30h
if (hh > 100)
{
mm = hh % 100;
hh = Math.floor(hh / 100);
}
hh = hh % 24;
mm = mm % 60;
// Opgeschoonde waarde opslaan
$(field).val(String((hh<10?"0":"")+hh) + ":" + String((mm<10?"0":"")+mm), true);
if (kmin || kmax)
{
var kval = parseFloat(hh + "." + mm);
kmin = kmin ? parseFloat(kmin.split(":").join(".")) : 0;
kmax = kmax ? parseFloat(kmax.split(":").join(".")) : 24;
if (kmin > kval || kval > kmax)
{
valid = false;
error = "<%=L("lcl_mld_kenmerk_out_range")%>";
}
}
}
else
valid = false;
}
else if (ktype == 'C' || ktype == 'L' || ktype == 'Q')
{ // newlines verdubbelen naar %0D%0A dus aantal regels bijtellen
if (value.length + (value.split("\n").length-1) > klen) valid = false;
}
// new fieldtype "checkbox"
else if (ktype == 'V')
{
var requiredgroup = field.className.match(/required\d*S\d*/g); // requiredgroup is tested somewhere else
valid = $(field).hasClass("required") && !requiredgroup && !$(field).prop("checked")? false : true;
if (!valid) { error = "<%=L("lcl_mld_verplicht")%>"; }
t = (field.checked?1:0);
}
else if (ktype == 'N')
{
allowInputExpression(field);
value = field.value; // mogelijk gewijzigd
var arrValue = [value];
for (var i = 0; i < arrValue.length; i++)
{
if (kdec)
{
var l1 = klen-kdec;
var l2 = kdec;
// Als een punt <20>n een komma in een getal behouden we alleen de laatste
if (arrValue[i].lastIndexOf(".") > arrValue[i].lastIndexOf(","))
{
value.replace(arrValue[i], arrValue[i].replace(/\,/ig, ""));
field.value = value;
}
if (arrValue[i].lastIndexOf(",") > arrValue[i].lastIndexOf("."))
{
value.replace(arrValue[i], arrValue[i].replace(/\./ig, ""));
field.value = value;
}
var s = '^\\-?(\\d{1,'+Math.max(1, l1)+'}[.,]?|\\d{0,'+l1+'}[.,]\\d{1,'+l2+'})$';
valid = arrValue[i].match(new RegExp(s)) && valid;
if (valid) { var t = parseFloat(arrValue[i].replace(',','.'));}
}
else
{
var s = '^\\-?\\d{1,'+klen+'}[.,]?$';
valid = arrValue[i].match(new RegExp(s)) && valid;
if (valid) { var t = parseInt(arrValue[i]);}
}
}
if (valid && ktype != 'T') // Time wordt hierboven al gecontroleerd
{
if ((kmin !== null) && (t < kmin)) { valid = false; error = "<%=L("lcl_mld_kenmerk_out_range")%>"; }
if ((kmax !== null) && (t > kmax)) { valid = false; error = "<%=L("lcl_mld_kenmerk_out_range")%>"; }
}
}
}
validateField(field, valid, error);
if (!show && valid && field.className.match(/required\d*S\d*/g) && field.className.match(/required\d*S\d*/g).length > 0)
{ // Er is een required groep aanwezig.
var requiredgroup = field.className.match(/required\d*S\d*/g)[0];
var group = requiredgroup.substr(8);
checkRequiredGroup(group, params);
}
in_use = false;
return valid;
}
return false; // inuse
}
// Op een generieke manier documenten openen
// DWF bestanden worden eventueel met de SLNKDWF viewer geopend
// Poweruser IE feature: Ctrl ingedrukt opent DWF bestanden toch 'gewoon'
function openDoc(filepath)
{
<%if (S("view_dwf_with_slnkdwf"))
{ %>
if (!(window.event && event.ctrlKey) && filepath.toUpperCase().match('.DWF'))
FcltMgr.windowopen("../SLNKDwf/ShowDWF.asp?relfile=" + filepath,'facDoc',"");
else
<%} %>
FcltMgr.windowopen(filepath);
// Unsafe:
// FcltMgr.windowopen(filepath, 'facDoc', "");
}
//Data komt terug van de closeModal
function bijlagen_callback(data, orgParams)
{
if (orgParams.params.objButton)
{
if (orgParams.params.multi) // ktype == "M"
{
orgParams.params.objButton.value = L("lcl_appendixes_teller").format(data.cnt);
orgParams.params.objButton.setAttribute("nBijlagen", data.cnt);
}
else
{
orgParams.params.objButton.nextSibling.setAttribute("nBijlagen", data.cnt);
orgParams.params.objButton.value = data.fileName||"";
$(orgParams.params.objButton).toggle(data.fileName != "");
$(orgParams.params.objButton).next().find("input").toggle(data.fileName == ""); // de 'Add' knop
if (data.fullPath) // handtekening
{
$(orgParams.params.objButton).nextAll("img").one("load", function () { FcltMgr.resized(); });
$(orgParams.params.objButton).nextAll("img").show()[0].src = data.fullPath;
}
else
{
$(orgParams.params.objButton).nextAll("img").hide();
FcltMgr.resized();
}
}
if (orgParams.params.objButton.onchange)
orgParams.params.objButton.onchange(); // Omdat input veld readonly is wordt de onchange niet automatisch uitgevoerd.
}
if (orgParams.params.saveUrl)
{
$.post(orgParams.params.saveUrl, { flexVal: data.fileName }); // DIRECT opslaan in de database
}
}
// encrypt geeft aan of bestand encrypted moet worden.
function onBijlagen(formurl, // protected
saveUrl, // protected
multi,
objButton)
{
var params = { multi: multi, objButton: objButton};
// Voor de zekerheid slaan we wijziging van de bestandsnaam direct op.
// op het filesysteem is het namelijk ook al 'gecommit'
params.saveUrl = saveUrl;
allparams = {params: params,
callback: bijlagen_callback,
XXXXalwaysCallback: true,
noClose: true // Voor bijlagenscherm dus geen close-knopje (kruisje) in rechter bovenhoek.
};
FcltMgr.openModalDetail(formurl, L("lcl_appendixes"), allparams );
}
function xmlNodeDetails(key, xmlnode)
{
var url = "";
switch (xmlnode.toLowerCase())
{
case "afdeling" : url = "appl/prs/prs_afdeling.asp?key=" + key; break;
case "afspraak" : url = "appl/bez/bez_afspraak.asp?afspr_key=" + key + "&urole=fo"; break;
case "bedrijf" : url = "appl/prs/prs_bedrijf.asp?bedrijf_key=" + key; break;
case "bestelling" : url = "appl/bes/bes_bestelling.asp?bes_key=" + key + "&urole=fo"; break;
case "bestelopdr" : url = "appl/bes/bes_opdr.asp?ordernr=" + key + "&urole=fo"; break;
case "contract" : url = "appl/cnt/cnt_contract.asp?cnt_key=" + key + "&urole=bo"; break;
case "deel" : url = "appl/ins/ins_deel.asp?ins_key=" + key + "&urole=bo"; break;
case "factuur" : url = "appl/fin/fin_factuur.asp?fin_key=" + key; break;
case "gebouw" : url = "appl/alg/alg_gebouw.asp?key=" + key; break;
case "locatie" : url = "appl/alg/alg_locatie.asp?key=" + key; break;
case "melding" : url = "appl/mld/mld_melding.asp?mld_key=" + key + "&urole=fo"; break;
case "message" : url = "appl/msg/msg_message.asp?message_key=" + key + "&urole=bo"; break;
case "opdracht" : url = "appl/mld/mld_opdr.asp?opdr_key=" + key + "&urole=bo"; break;
case "perslid" : url = "appl/prs/prs_perslid.asp?prs_key=" + key; break;
case "reservering" : url = "appl/res/res_reservering.asp?rsv_ruimte_key=" + key + "&urole=fo"; break;
case "xreservering" : url = "appl/res/res_reservering.asp?reservering_key=" + key + "&urole=fo"; break;
case "ruimte" : url = "appl/alg/alg_ruimte.asp?key=" + key; break;
case "scenario" : url = "appl/prj/prj_scenario.asp?prj_key=" + key; break;
case "verdieping" : url = "appl/alg/alg_verdieping.asp?key=" + key; break;
default : break;
}
if (url != "")
FcltMgr.openDetail(url, "<%=L("lcl_bes_srtprod")%>", {callback: FcltMgr.reload});
}
var fvalid; // definition of fvalid in case a HTML element uses its value without declaring first
$(function() {
if ($(".flexshow").length) {
var row_triggers;
var name_parts;
var flex_triggers = $(".initTriggerChange[onchange]");
// check if there are rows (currently BEZ specific)
if (flex_triggers.filter("[name^=flex]").length > 0)
{
name_parts = flex_triggers.filter("[name^=flex]").first().attr("name").split("_");
if (name_parts.length > 1) {
// 1 trigger for the same item in each row
row_triggers = flex_triggers.filter("[name^=flex]").filter("[name$=_" + name_parts[1] + "]");
setTimeout(function() { row_triggers.change(); }); // just enough to give initialisations a chance
}
}
else
// edit screen, 1 trigger only
{
// call only calculateFlexExpressions unconditionally
setTimeout(function() {
$(".initTriggerChange[onchange]:first").each(function() {
var parms_arr = $(this).attr("onchange")
.split("calculateFlexExpressions")[1] // parms of calculateFlexExpressions as a string
.replace(/\(|\)|\;|\"/g, "") // clean the parms in the string
.split(", "); // split the parms to an array
calculateFlexExpressions(this, parms_arr[1], parms_arr[2], parms_arr[3], parms_arr[4], parms_arr[5]);
});
// De velden met een voorwaarde zijn er wel, maar de velden waar deze van afhankelijk zijn niet; dan maar handmatig activeren
if ($(".initTriggerChange[onchange]:first").length === 0 && $(":input.expression, span.fld.expression").length > 0)
$(":input.expression, span.fld.expression").eq(0).blur();
});
}
}
});
function callback_flex_expr_info(json)
{
for (var kenmerk=0; kenmerk < json.length; kenmerk++)
{
// save initial visibility state of field
var initialVisible = $("#" + json[kenmerk].kfieldid + "val").is(":visible");
// Fill the attribute "default" if it isn't defined yet. The parameter "json[kenmerk].waarde" contains the current/correct value for new and existing calls.
if ($("#" + json[kenmerk].kfieldid + "val").attr("default") == undefined)
$("#" + json[kenmerk].kfieldid + "val").attr("default", json[kenmerk].waarde);
if ($("#" + json[kenmerk].kfieldid + "val").hasClass("flexshow") ||
$("#Suggest" + json[kenmerk].kfieldid + "_show").hasClass("flexshow") ||
(["L", "X"].indexOf(json[kenmerk].kenmerktype) > -1 && $("label[for=" + json[kenmerk].kfieldid + "val]").hasClass("flexshow")) ||
(["L"].indexOf(json[kenmerk].kenmerktype) > -1 && $("label[for=" + json[kenmerk].kfieldid + "val]").closest("tr").hasClass("flexlabel")) ||
(["l"].indexOf(json[kenmerk].kenmerktype) > -1 && $("#" + json[kenmerk].kfieldid + "val").closest("div.card").hasClass("flexlabel")) ||
($(".flexshow", $("#" + json[kenmerk].kfieldid + "val").closest("tr")).length > 0)
)
{
if (typeof mobile == "object") // PDA has in mobile.inc an object "mobile" while the desktop has not
{
if (json[kenmerk].kenmerktype == "L")
{
var $fld = $("label[for=" + json[kenmerk].kfieldid + "val]").closest("div");
$fld.toggle(json[kenmerk].exprwaarde != 0 && json[kenmerk].exprwaarde != null);
}
else if (json[kenmerk].kenmerktype == "S")
{
var $fld = $("#Suggest" + json[kenmerk].kfieldid + "_show").closest("div").not('[data-role=content]').not('div.ui-collapsible-content');
$fld.add($("label[for=" + json[kenmerk].kfieldid + "val]")).toggle(json[kenmerk].exprwaarde != 0 && json[kenmerk].exprwaarde != null);
}
else
{
var $fld = $("#" + json[kenmerk].kfieldid + "val:not(textarea)").closest("div").not('[data-role=content]').not('div.ui-collapsible-content');
if ($fld.length == 0)
{
$fld= $("textarea#" + json[kenmerk].kfieldid + "val"); // textarea has no parent div
}
$fld.add($("label[for=" + json[kenmerk].kfieldid + "val]")).toggle(json[kenmerk].exprwaarde != 0 && json[kenmerk].exprwaarde != null);
}
}
else
{
if (json[kenmerk].kenmerktype == "L")
{
var $td = $("label[for=" + json[kenmerk].kfieldid + "val]").closest("td");
$td.add($td.next(".lhint")).toggle(json[kenmerk].exprwaarde != 0 && json[kenmerk].exprwaarde != null);
}
else if (json[kenmerk].kenmerktype == "l")
{
var $div = $("#" + json[kenmerk].kfieldid + "val").closest("div.card");
if (json[kenmerk].exprwaarde != 0 && json[kenmerk].exprwaarde != null)
$div.show();
else
$div.hide();
}
else
{
// hide table row when characteristic is invisible
$("#" + json[kenmerk].kfieldid + "val").closest("tr").toggle(json[kenmerk].exprwaarde != 0 && json[kenmerk].exprwaarde != null);
}
}
var $fld = $("#" + json[kenmerk].kfieldid + "val");
var $fld_show = $("#Suggest" + json[kenmerk].kfieldid + "_show");
if (json[kenmerk].exprwaarde == 0 || json[kenmerk].exprwaarde == null)
{
// save default value in flex field
if (initialVisible)
{
if ($fld.length && $fld.attr("type") == "checkbox") { $fld.attr("default", $fld.prop("checked") ? "1" : "0"); }
$("#" + json[kenmerk].kfieldid + "val").attr("default", json[kenmerk].waarde);
var $fld = $("#" + json[kenmerk].kfieldid + "val");
if ($fld.length && $fld.attr("type") == "checkbox" && !$fld.prop("checked")) { $fld.prop("checked", $fld.attr("default") == "1"); }
}
// erase the value when the field is hidden and the field has a value
if ($fld.length && $fld.attr("type") == "checkbox") { if ($fld.prop("checked")) $fld.prop("checked", false); } // uncheck checkbox
else if ($fld_show.length && $fld_show.attr("sgcurrentvalue")) { $fld_show.attr("sgcurrentvalue", "").val(""); } // empty suggest
else if (!$fld.attr("nBijlagen") && $fld.val()) { $fld.attr("disabled", "disabled"); } // disable the field so the value doesn't get submitted
}
// restore the fields value when the field changes from invisible to visible
else if (!initialVisible)
{
if ($fld.length && $fld.attr("type") == "checkbox") { if (!$fld.prop("checked")) $fld.prop("checked", $fld.attr("default") == "1"); } // default check/uncheck checkbox
else if ($fld_show.length && !$fld_show.attr("sgcurrentvalue")) { $fld_show.attr("sgcurrentvalue", "").val($fld.attr("default")); } // defaultvalue for suggest
else if (!$fld.attr("nBijlagen") && $fld.val()) { $fld.removeAttr("disabled"); } // reinstate the previously filled out value
else if (!$fld.attr("nBijlagen") && !$fld.val()) { $fld.val($fld.attr("default")); } // default value for field
}
}
else
{
// Indien het een expressie kenmerk veld is zoals bij objecten, met een volgnummer 900 of hoger, dan wordt het kenmerk readonly weergegeven voor BO.
// De functie isReadonly in de bestanden xxx_flexkenmerk.inc regelen die readonly status.
// De waarde van het kenmerk komt dan tussen een <div> of <span> tag te staan.
// Mocht de functie isReadonly false opleveren en dus niet readonly, dan zorg de EXPRESSIE er wel voor dat het kenmerk readonly wordt weergegeven.
// De waarde komt dan echter wel in een <input> of <textarea> veld te staan.
// Staat de waarden in een input of textarea veld, dan moet de waarde met een ".val()" aangepast worden.
// Staat de waarde tussen een div of span, dan moet de waarde op een iets andere manier worden aangepast.
if (!$("#" + json[kenmerk].kfieldid + "val").is(":hidden"))
$("#" + json[kenmerk].kfieldid + "val").val(json[kenmerk].waarde);
else if ($("#" + json[kenmerk].kfieldid + "val").closest("td").find("div").length) // Betreft readonly 900+ karakterveld met 50 tekens of meer (Tussen <div>).
$("#" + json[kenmerk].kfieldid + "val").closest("td").find("div").text(json[kenmerk].waarde)
else if ($("#" + json[kenmerk].kfieldid + "val").closest("td").find("span").length) // Betreft readonly 900+ karakterveld met minder dan 50 tekens (Tussen <span>).
$("#" + json[kenmerk].kfieldid + "val").closest("td").find("span").text(json[kenmerk].waarde)
}
}
$("div.time-holder").each(function() { $(this).css('top', "").css('left', ""); });
FcltMgr.resized();
// make known that calculating the characteristics have finished
$("input.initTriggerChange").first().closest("div.block-wrapper").trigger("calculated");
}
function calculateFlexExpressions(field, module, refkey, niveau, nameprefix, extraserie)
{
if (field.form && $("[name=" + field.form.name + "]").has("div.bad").length == 0)
{ // execute only when the field is on a form (which is not the case when on a modal screen like "advanced")
var params = $("[name=" + field.form.name + "]").serialize()
+ "&module=" + module
+ "&refkey=" + refkey
+ "&niveau=" + niveau
+ "&nameprefix=" + nameprefix
+ "&extraserie=" + (extraserie? 1 : 0)
+ "&RVT_token=" + encodeURIComponent(window.RVT_token);
$.post(rooturl+"/appl/Shared/calculate_flex_expr.asp",
params,
FcltCallbackAndThenAlways(callback_flex_expr_info),
"json");
}
}
<% ASPPAGE_END(); %>