509 lines
16 KiB
JavaScript
509 lines
16 KiB
JavaScript
/*
|
|
$Revision$
|
|
$Id$
|
|
|
|
File: iface.js
|
|
Description: clientside functions for shared/iface.inc
|
|
*/
|
|
var secfilters;
|
|
// Toggle-t de zichtbaarheid van secundaire zoekvelden
|
|
// Gebruikt globale boolean secfilters om de huidige status te onthouden
|
|
// iface.inc definieert de strings
|
|
function iface_toggleSecondarySearchblock(m)
|
|
{
|
|
if (!secfilters) {
|
|
$(".secsearch").show();
|
|
secfilters = true; // en vervang label door <% =L("lcl_less") %>
|
|
$("#btnMoreLess").text(L("lcl_shared_less"));
|
|
} else {
|
|
$(".secsearch").hide();
|
|
secfilters = false; // en vervang label door <% =L("lcl_more") %>
|
|
$("#btnMoreLess").text(L("lcl_shared_more"));
|
|
}
|
|
}
|
|
|
|
|
|
iface =
|
|
{
|
|
button:
|
|
{
|
|
click: function(evt, btn)
|
|
{
|
|
FcltMgr.stopPropagation(evt);
|
|
|
|
if (btn.getAttribute("singlepress") && btn.getAttribute("isactive")=="true")
|
|
{ //alert("Heb geduld");
|
|
return;
|
|
}
|
|
if (btn.getAttribute("singlepress"))
|
|
{
|
|
iface.button.disable(btn);
|
|
}
|
|
var elem = btn.getAttribute("fcltclick");
|
|
|
|
var result = eval(elem);
|
|
// Dit lijkt erg onzinning (we zitten binnen iface) maar soms als
|
|
// een scherm/dialoog net gesloten is door de action van de button
|
|
// blijkt de code toch nog hier te komen terwijl iface weg is
|
|
if (typeof iface == "undefined")
|
|
return;
|
|
|
|
if (!result)
|
|
{
|
|
iface.button.enable(btn);
|
|
}
|
|
|
|
},
|
|
disable: function(btn)
|
|
{
|
|
if (typeof btn == "string")
|
|
{
|
|
btn = document.getElementById(btn);
|
|
}
|
|
if (btn)
|
|
{
|
|
btn.setAttribute("isactive", "true");
|
|
$(btn).addClass("btn_disabled");
|
|
$(btn).children().addClass("btn_disabled");
|
|
}
|
|
},
|
|
enable: function(btn)
|
|
{
|
|
if (typeof btn == "string")
|
|
btn = document.getElementById(btn);
|
|
if (btn)
|
|
{
|
|
$(btn).removeClass("btn_disabled");
|
|
$(btn).children().removeClass("btn_disabled");
|
|
btn.setAttribute("isactive", "false");
|
|
}
|
|
}
|
|
},
|
|
translate: function (kolomnaam, key, lbl, deftxt, typ)
|
|
{
|
|
var url = "../fac/fac_locale_data.asp?kolomnaam="+kolomnaam+"&kolomkeyval=" + key
|
|
+ "&kolomkeydata=" +escape(deftxt)
|
|
+ "&lbl=" +escape(lbl)
|
|
+ "&typ=" +typ;
|
|
FcltMgr.openModalDetail(url, L("lcl_lcl_vertaling"), {xheight: 200, width: 600 } );
|
|
|
|
},
|
|
formToString: function (stringForm)
|
|
{
|
|
formObject = { };
|
|
stringForm.find("input, select").each(function(){
|
|
var nm = this.id || this.name || null;
|
|
if (!nm)
|
|
return;
|
|
|
|
if ($(this).attr("type") == 'checkbox' || $(this).attr("type") == 'radio')
|
|
{
|
|
formObject[nm] = $(this).prop("checked");
|
|
}
|
|
else
|
|
{
|
|
formObject[nm] = $(this).val();
|
|
}
|
|
})
|
|
return JSON.stringify(formObject);
|
|
},
|
|
|
|
stringToForm: function (formString, stringForm)
|
|
{
|
|
formObject = JSON.parse(formString)
|
|
stringForm.find("input, select").each(function(){
|
|
var nm = this.id || this.name || null;
|
|
if (!nm)
|
|
return;
|
|
|
|
if (this.id)
|
|
input = stringForm.find("#" + nm)
|
|
else
|
|
input = stringForm.find("[name=" + nm + "]");
|
|
if (input.attr("type")=="checkbox" || input.attr("type")=="radio" )
|
|
{
|
|
input.prop("checked", !!formObject[nm])
|
|
}
|
|
else
|
|
{
|
|
input.val(formObject[nm])
|
|
}
|
|
})
|
|
},
|
|
// Persoonselector functies
|
|
persoonDetails: function (fieldName, info)
|
|
{
|
|
var pkey=$('#'+fieldName)[0].value;
|
|
var pname=$('#'+fieldName+'_show')[0].value;
|
|
if (info == 'PRS')
|
|
{
|
|
FcltMgr.openDetail("appl/prs/prs_perslid.asp?prs_key=" + pkey, { reuse: true });
|
|
}
|
|
else // Standaard fac_user info aanroepen.
|
|
{
|
|
if (pkey != -1)
|
|
FcltMgr.openDetail("appl/fac/fac_user.asp?prs_key=" + pkey, { reuse: true });
|
|
else
|
|
FcltMgr.openDetail("appl/fac/fac_user.asp", { reuse: true }); // self
|
|
}
|
|
},
|
|
showCaller: function (zelf)
|
|
{
|
|
var callerinfo=FcltMgr.getCaller();
|
|
if (callerinfo)
|
|
{
|
|
zelf.title=callerinfo.prs_naam;
|
|
}
|
|
else
|
|
zelf.title="beller beschikbaar";
|
|
},
|
|
setCaller: function (suggestfield)
|
|
{
|
|
var callerinfo=FcltMgr.getCaller();
|
|
if (callerinfo)
|
|
{
|
|
suggestfield.setValue(callerinfo.prs_key, callerinfo.prs_naam, true, true); // wel checkExist doen!
|
|
}
|
|
}
|
|
}
|
|
// params: checkOnly : [] beperkt array met velden die gecontroleerd moeten worden
|
|
// (default alles met class 'required')
|
|
// relaxed : alleen controle, geen class aanpassingen of alerts
|
|
function validateForm(fName, params)
|
|
{ // TODO: Alleen binnen fName kijken?
|
|
|
|
params = params || {};
|
|
function _isGoodCurrency(str, checkInteger)
|
|
{
|
|
var anum = /^([-\+]?\d+[.,]?|[-\+]?\d+[.,]\d+$)$/
|
|
return anum.test(str);
|
|
}
|
|
|
|
function _isGoodTextFormat(aObject)
|
|
{
|
|
var regexptekst = aObject.getAttribute("regexp");
|
|
var re = new RegExp(regexptekst);
|
|
var hint = '';
|
|
var vIsGood = true;
|
|
|
|
if (!re.test($(aObject).val()))
|
|
{
|
|
var spantitle = $("label[for="+ aObject.name +"] span");
|
|
if (spantitle)
|
|
{
|
|
hint = spantitle[0].getAttribute("title");
|
|
if (hint == '')
|
|
{
|
|
hint = L("lcl_shared_validator_format");
|
|
}
|
|
if (validatorHint == '')
|
|
{
|
|
validatorHint = validatorHint + '\n';
|
|
}
|
|
validatorHint = validatorHint + (spantitle[0].textContent || spantitle[0].innerText) + ' ' + hint + '\n';
|
|
}
|
|
vIsGood = false;
|
|
}
|
|
return vIsGood;
|
|
}
|
|
|
|
document.activeElement && document.activeElement.blur(); // trigger laatste onChanges
|
|
|
|
var clsName = "missing";
|
|
var anyMissing = anyBad = false;
|
|
var validatorHint = "";
|
|
|
|
var selector = ".required";
|
|
var jqcheckonly="*";
|
|
if (params.checkOnly) // slechts enkele velden controleren
|
|
jqcheckonly = "#" + params.checkOnly.join(",#");
|
|
|
|
if (params.relaxed)
|
|
clsName = "";
|
|
|
|
$(selector).filter(jqcheckonly).each(function (i)
|
|
{
|
|
switch (this.tagName)
|
|
{
|
|
case "SELECT":
|
|
{
|
|
$(this).removeClass(clsName);
|
|
$("#req_"+this.name + ",#" + this.name).removeClass(clsName);
|
|
var opt = $(this).find("option:selected");
|
|
if (this.options.length == 0 || opt.length == 0|| opt.val() == "-1" || opt.val() == "") // flex 'R' heeft leeg
|
|
{
|
|
$("#req_"+this.name).addClass(clsName); // Dit zal/moet een divje zijn?
|
|
if (this.options.length)
|
|
opt.addClass(clsName);
|
|
else
|
|
$("#" + this.name).addClass(clsName);
|
|
anyMissing = true;
|
|
}
|
|
break;
|
|
}
|
|
case "INPUT":
|
|
{
|
|
if (this.type == 'button')
|
|
{ // specifiek voor de bijlage knop, om te kijken of er bijlagen zijn indien dit vereist wordt.
|
|
if (this.getAttribute("isBijlage")==1)
|
|
{
|
|
anyMissing = (this.getAttribute("nBijlagen") == 0); // Als het aantal op de button 0 is, dan isMissing
|
|
if (anyMissing) $(this).addClass(clsName);
|
|
}
|
|
break;
|
|
}
|
|
if (this.type == 'text' && this.getAttribute("hasvalue"))
|
|
{ // de class missing moet op de div boven de input staan.
|
|
$("#req_"+this.name).removeClass(clsName);
|
|
if (this.getAttribute("hasvalue") == 0)
|
|
{
|
|
$("#req_"+this.name).addClass(clsName);
|
|
anyMissing = true;
|
|
}
|
|
break;
|
|
}
|
|
// voor andere type=text doorvallen naar textarea
|
|
}
|
|
case "TEXTAREA":
|
|
// bij currency zijn we extra streng: 0.0 wordt niet geaccepteerd.
|
|
$(this).removeClass(clsName);
|
|
if ($(this).val() == "" ||
|
|
($(this).hasClass("currency") && parseFloat($(this).val().replace(',', '.')) == 0) ||
|
|
$(this).hasClass("suggestBad") ||
|
|
($(this).hasClass("suggest") && this.getAttribute("sgKey") < 0))
|
|
{
|
|
$(this).addClass(clsName);
|
|
anyMissing = true;
|
|
}
|
|
// JGL: Waarom eigenlijk? Geeft problemen als required + nog iets anders als regexp
|
|
// else if ($(this).hasClass("bad"))
|
|
// {
|
|
// $(this).addClass(clsName);
|
|
// anyBad = true;
|
|
// break
|
|
// }
|
|
|
|
// else geen break maar doorvallen
|
|
break;
|
|
}
|
|
}
|
|
)
|
|
|
|
$(".suggestBad").each(function (i)
|
|
{
|
|
if($(this).val() != "" && !$(this).hasClass("missing"))
|
|
{
|
|
anyBad = true;
|
|
}
|
|
}
|
|
)
|
|
|
|
$(".number").filter(jqcheckonly).each(function (i)
|
|
{
|
|
if ($(this).val() != "" && isNaN(parseInt($(this).val()), 10))
|
|
{
|
|
$(this).addClass("bad");
|
|
anyBad = true;
|
|
}
|
|
else
|
|
{
|
|
$(this).removeClass("bad"); // Een eventuele attention blijft er op staan!
|
|
}
|
|
}
|
|
)
|
|
$(".float").filter(jqcheckonly).each(function (i)
|
|
{
|
|
if ($(this).val() != "" && !isFinite(parseFloat($(this).val())))
|
|
{
|
|
$(this).addClass("bad");
|
|
anyBad = true;
|
|
}
|
|
else
|
|
{
|
|
$(this).removeClass("bad"); // Een eventuele attention blijft er op staan!
|
|
}
|
|
}
|
|
)
|
|
$(".currency").filter(jqcheckonly).each(function (i)
|
|
{
|
|
if ($(this).val() != "" && !_isGoodCurrency($(this).val().replace(',', '.')))
|
|
{
|
|
$(this).addClass("bad");
|
|
anyBad = true;
|
|
}
|
|
else
|
|
{
|
|
$(this).removeClass("bad"); // Een eventuele attention blijft er op staan!
|
|
}
|
|
}
|
|
)
|
|
$("input[regexp]").filter(jqcheckonly).each(function (i)
|
|
{
|
|
if (($(this).hasClass("required") || $(this).val()) && (!_isGoodTextFormat(this)))
|
|
{
|
|
$(this).addClass("bad");
|
|
anyBad = true;
|
|
}
|
|
else
|
|
{
|
|
$(this).removeClass("bad"); // Een eventuele attention blijft er op staan!
|
|
}
|
|
}
|
|
)
|
|
$("textarea[regexp]").filter(jqcheckonly).each(function (i)
|
|
{
|
|
if (($(this).hasClass("required") || $(this).val()) && (!_isGoodTextFormat(this)))
|
|
{
|
|
$(this).addClass("bad");
|
|
anyBad = true;
|
|
}
|
|
else
|
|
{
|
|
$(this).removeClass("bad"); // Een eventuele attention blijft er op staan!
|
|
}
|
|
}
|
|
)
|
|
|
|
// Klap dichtgeklaptje flexkenmerken eventueel open
|
|
$(".missing,.bad").each(function(i)
|
|
{
|
|
var labels = $(this).closest("tr").prevAll("tr.trlabel.flexlabel");
|
|
if (labels.length && $(labels[0]).hasClass("flexcollapsed"))
|
|
{
|
|
$(labels[0]).click();
|
|
}
|
|
});
|
|
|
|
if (params.relaxed && (anyMissing || anyBad))
|
|
return false;
|
|
|
|
if (anyMissing)
|
|
{
|
|
alert(L("lcl_shared_validator_missing"));
|
|
return false;
|
|
}
|
|
else if (anyBad)
|
|
{
|
|
if (validatorHint == '')
|
|
{
|
|
validatorHint = L("lcl_shared_validator_format");
|
|
}
|
|
alert(validatorHint);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
// Functies t.b.v. tijd velden
|
|
// werk veld om naar h:mm syntax
|
|
// 1.5 ==> 1:30, 1:5==>1:05, 1:50==>1:50, 1.50==>1:30,
|
|
// 2==>2:00, 10==>0:10, 40==>0:40, 10:00==>10:00 etc.
|
|
function sanitizeHours(veld, minvalue)
|
|
{
|
|
if (!minvalue)
|
|
{
|
|
var TIME_RE = /^(\d*)([\/\.\,\-\:])?(\d\d?)?$/;
|
|
}
|
|
else
|
|
{
|
|
var TIME_RE = /^(\-)?(\d*)([\/\.\,\-\:])?(\d\d?)?$/;
|
|
}
|
|
|
|
var tmtxt = $(veld).val();
|
|
var posstime = tmtxt.match(TIME_RE);
|
|
|
|
if (posstime && posstime.length
|
|
&& !isNaN(parseInt(posstime, 10))
|
|
) // er moet minstens iets goed zijn
|
|
{ // De indexen van posstime verschuiven 1 positie als minvalue = true
|
|
// omdat op plaats 0 nu eventueel het -teken komt te staan.
|
|
var pt_sep = (minvalue?3:2); // index van uur/minuut seperator
|
|
var pt_mm = pt_sep + 1; // index van minuten
|
|
|
|
var hh = Math.abs(parseInt(posstime, 10) || 0);
|
|
var mm = 0;
|
|
if (posstime.length > pt_sep && posstime[pt_mm] != "")
|
|
{
|
|
var mm = parseInt(posstime[pt_mm], 10) || 0;
|
|
if (posstime[pt_sep] == "." || posstime[pt_sep] == ",")
|
|
{
|
|
mm = Math.floor(0.5 + 60 * parseFloat("0." + posstime[pt_mm]));
|
|
// 2.5 moet 2:30 worden en niet 2.05, 2.25 moet 2:15 worden
|
|
}
|
|
// else // 2:5 wordt 2:05
|
|
}
|
|
else // 40 voor 0:40
|
|
if (hh >= 10)
|
|
{
|
|
mm = hh % 60;
|
|
hh = Math.floor(hh / 60);
|
|
}
|
|
hh = hh % 24;
|
|
mm = mm % 60;
|
|
var hm = hh + mm/60;
|
|
// Opgeschoonde waarde opslaan
|
|
if (minvalue && posstime[1] == '-')
|
|
{
|
|
hm = -1 * hm;
|
|
}
|
|
$(veld).val(decimalToHour(hm));
|
|
}
|
|
else
|
|
if (tmtxt != "")
|
|
{
|
|
alert(L("lcl_shared_validator_format"));
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
// Usage: "Wilt U melding {0} afmelden?".format(12345)
|
|
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;
|
|
};
|
|
|
|
// altijd :-syntax
|
|
function hourToDecimal(val)
|
|
{
|
|
if (!val || val == "")
|
|
return 0;
|
|
var hhmm = String(val).split(":");
|
|
var mintime = hhmm[0].indexOf('-') >= 0 ; // is tijd negatief of positief
|
|
var dtime = Math.abs(parseInt(hhmm[0], 10));
|
|
if (hhmm.length != 1)
|
|
{
|
|
dtime = dtime + parseInt(hhmm[1], 10) / 60;
|
|
}
|
|
return (mintime ? -1 * dtime : dtime);
|
|
}
|
|
|
|
// altijd :-syntax
|
|
function decimalToHour(val)
|
|
{
|
|
if (!val || val == 0)
|
|
return "";
|
|
var mintime = Math.abs(val) != val; // is tijd negatief of positief
|
|
var hh = Math.floor(Math.abs(val) + 0.5 / 60); // reken met positief tijd
|
|
var mm = Math.floor((Math.abs(val) - hh) * 60 + 0.5);
|
|
|
|
var timestr = String(hh) + ":" + String((mm < 10? "0" : "") + mm);
|
|
return (mintime ? "-" + timestr : timestr); // voeg eventueel weer min-teken toe
|
|
}
|
|
|
|
// Clientside variant van de shared.inc versie
|
|
var protectRequest =
|
|
{
|
|
dataToken: function (dataName) // Voeg aan een data hash een input token toe
|
|
{
|
|
dataName["__RequestVerificationToken"] = window.RVT_token;
|
|
}
|
|
} |