Files
Facilitor/APPL/Localscripts/iface.js
Erik Groener f14f9b0fe5 FSN#22273 FireFox/Safari innerText bestaat niet
svn path=/Website/trunk/; revision=5577
2012-02-16 07:46:46 +00:00

410 lines
12 KiB
JavaScript

/*
$Revision: 28 $
$Modtime: 16-02-12 9:39 $
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(btn)
{
if (window.event)
window.event.cancelBubble = true;
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);
if (!result)
{
iface.button.enable(btn);
}
},
disable: function(btn)
{
if (typeof btn == "string")
{
btn = 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_shared_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).attr("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.attr("checked", !!formObject[nm])
}
else
{
input.val(formObject[nm])
}
})
}
}
// 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;
}
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":
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)
{
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
{
var hh = parseInt(posstime, 10) || 0;
var mm = 0;
if (posstime.length > 2 && posstime[3] != "")
{
var mm = parseInt(posstime[3], 10) || 0;
if (posstime[2] == "." || posstime[2] == ",")
{
mm = Math.floor(0.5 + 60 * parseFloat("0." + posstime[3]));
// 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;
// Opgeschoonde waarde opslaan
$(veld).val(decimalToHour(hh + mm/60));
}
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(":");
if (hhmm.length == 1)
return parseInt(hhmm[0], 10)
return parseInt(hhmm[0], 10) + parseInt(hhmm[1], 10) / 60;
}
// altijd :-syntax
function decimalToHour(val)
{
if (!val || val == 0)
return "";
var hh = Math.floor(val);
var mm = Math.floor((val - hh) * 60 + 0.5);
return String(hh) + ":" + String((mm < 10? "0" : "") + mm);
}