You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

690 lines
20 KiB

/*
Copyright (c) 2012-2017 Open Lab
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
var muteAlertOnChange = false;
// isRequired ----------------------------------------------------------------------------
//return true if every mandatory field is filled and highlight empty ones
jQuery.fn.isFullfilled = function () {
var canSubmit = true;
var firstErrorElement = "";
this.each(function () {
var theElement = $(this);
theElement.removeClass("formElementsError");
//if (theElement.val().trim().length == 0 || theElement.attr("invalid") == "true") { //robicch 13/2/15
if (theElement.is("[required]") && theElement.val().trim().length == 0 || theElement.attr("invalid") == "true") {
if (theElement.attr("type") == "hidden") {
theElement = theElement.prevAll("#" + theElement.prop("id") + "_txt:first");
} else if (theElement.is("[withTinyMCE]")){
if (tinymce.activeEditor.getContent()=="")
theElement=$("#"+theElement.attr("name")+"_tbl");
else
return true;// in order to continue the loop
}
theElement.addClass("formElementsError");
canSubmit = false;
if (firstErrorElement == "")
firstErrorElement = theElement;
}
});
if (!canSubmit) {
// get the tabdiv
var theTabDiv = firstErrorElement.closest(".tabBox");
if (theTabDiv.length > 0)
clickTab(theTabDiv.attr("tabId"));
// highlight element
firstErrorElement.effect("highlight", { color:"red" }, 1500);
}
return canSubmit;
};
function canSubmitForm(formOrId) {
//console.debug("canSubmitForm",formOrId);
if (typeof formOrId != "object")
formOrId=$("#" + formOrId);
return formOrId.find(":input[required],:input[invalid=true]").isFullfilled();
}
function showSavingMessage() {
$("#savingMessage:hidden").fadeIn();
$("body").addClass("waiting");
$(window).resize();
}
function hideSavingMessage() {
$("#savingMessage:visible").fadeOut();
$("body").removeClass("waiting");
$(window).resize();
}
/* Types Function */
function isValidURL(url) {
var RegExp = /^(([\w]+:)?\/\/)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(\/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?$/;
return RegExp.test(url);
}
function isValidEmail(email) {
//var RegExp = /^((([a-z]|[0-9]|!|#|$|%|&|'|\*|\+|\-|\/|=|\?|\^|_|`|\{|\||\}|~)+(\.([a-z]|[0-9]|!|#|$|%|&|'|\*|\+|\-|\/|=|\?|\^|_|`|\{|\||\}|~)+)*)@((((([a-z]|[0-9])([a-z]|[0-9]|\-){0,61}([a-z]|[0-9])\.))*([a-z]|[0-9])([a-z]|[0-9]|\-){0,61}([a-z]|[0-9])\.)[\w]{2,4}|(((([0-9]){1,3}\.){3}([0-9]){1,3}))|(\[((([0-9]){1,3}\.){3}([0-9]){1,3})\])))$/;
var RegExp = /^.+@\S+\.\S+$/;
return RegExp.test(email);
}
function isValidInteger(n) {
reg = new RegExp("^[-+]{0,1}[0-9]*$");
return reg.test(n) || isNumericExpression(n);
}
function isValidDouble(n) {
var sep = Number.decimalSeparator;
reg = new RegExp("^[-+]{0,1}[0-9]*[" + sep + "]{0,1}[0-9]*$");
return reg.test(n) || isNumericExpression(n);
}
function isValidTime(n) {
return !isNaN(millisFromHourMinute(n));
}
function isValidDurationDays(n) {
return !isNaN(daysFromString(n));
}
function isValidDurationMillis(n) {
return !isNaN(millisFromString(n));
}
function isNumericExpression(expr) {
try {
var a = eval(expr);
return typeof(a) == 'number';
} catch (t) {
return false;
}
}
function getNumericExpression(expr) {
var ret;
try {
var a = eval(expr);
if (typeof(a) == 'number')
ret = a;
} catch (t) {
}
return ret;
}
/*
supports almost all Java currency format e.g.: ###,##0.00EUR €#,###.00 #,###.00€ -$#,###.00 $-#,###.00
*/
function isValidCurrency(numStr) {
//first try to convert format in a regex
var regex = "";
var format = Number.currencyFormat + "";
var minusFound = false;
var numFound = false;
var currencyString = "";
var numberRegex = "[0-9\\" + Number.groupingSeparator + "]+[\\" + Number.decimalSeparator + "]?[0-9]*";
for (var i = 0; i < format.length; i++) {
var ch = format.charAt(i);
if (ch == "." || ch == "," || ch == "0") {
//skip it
if (currencyString != "") {
regex = regex + "(?:" + RegExp.quote(currencyString) + ")?";
currencyString = "";
}
} else if (ch == "#") {
if (currencyString != "") {
regex = regex + "(?:" + RegExp.quote(currencyString) + ")?";
currencyString = "";
}
if (!numFound) {
numFound = true;
regex = regex + numberRegex;
}
} else if (ch == "-") {
if (currencyString != "") {
regex = regex + "(?:" + RegExp.quote(currencyString) + ")?";
currencyString = "";
}
if (!minusFound) {
minusFound = true;
regex = regex + "[-]?";
}
} else {
currencyString = currencyString + ch;
}
}
if (!minusFound)
regex = "[-]?" + regex;
if (currencyString != "")
regex = regex + "(?:" + RegExp.quote(currencyString) + ")?";
regex = "^" + regex + "$";
var rg = new RegExp(regex);
return rg.test(numStr) || isNumericExpression(numStr);
}
function getCurrencyValue(numStr) {
if (!isValidCurrency(numStr))
return NaN;
var ripul = numStr.replaceAll(Number.groupingSeparator, "").replaceAll(Number.decimalSeparator, ".");
return getNumericExpression(ripul) || parseFloat(ripul.replace(/[^-0123456789.]/, ""));
}
function formatCurrency(numberString) {
return formatNumber(numberString, Number.currencyFormat);
}
function formatNumber(numberString, format) {
if (!format)
format = "##0.00";
var dec = Number.decimalSeparator;
var group = Number.groupingSeparator;
var neg = Number.minusSign;
var round = true;
var validFormat = "0#-,.";
// strip all the invalid characters at the beginning and the end
// of the format, and we'll stick them back on at the end
// make a special case for the negative sign "-" though, so
// we can have formats like -$23.32
var prefix = "";
var negativeInFront = false;
for (var i = 0; i < format.length; i++) {
if (validFormat.indexOf(format.charAt(i)) == -1) {
prefix = prefix + format.charAt(i);
} else {
if (i == 0 && format.charAt(i) == '-') {
negativeInFront = true;
} else {
break;
}
}
}
var suffix = "";
for (var i = format.length - 1; i >= 0; i--) {
if (validFormat.indexOf(format.charAt(i)) == -1)
suffix = format.charAt(i) + suffix;
else
break;
}
format = format.substring(prefix.length);
format = format.substring(0, format.length - suffix.length);
// now we need to convert it into a number
//while (numberString.indexOf(group) > -1)
// numberString = numberString.replace(group, '');
//var number = new Number(numberString.replace(dec, ".").replace(neg, "-"));
var number = new Number(numberString);
var forcedToZero = false;
if (isNaN(number)) {
number = 0;
forcedToZero = true;
}
// special case for percentages
if (suffix == "%")
number = number * 100;
var returnString = "";
if (format.indexOf(".") > -1) {
var decimalPortion = dec;
var decimalFormat = format.substring(format.lastIndexOf(".") + 1);
// round or truncate number as needed
if (round)
number = new Number(number.toFixed(decimalFormat.length));
else {
var numStr = number.toString();
numStr = numStr.substring(0, numStr.lastIndexOf('.') + decimalFormat.length + 1);
number = new Number(numStr);
}
var decimalValue = number % 1;
var decimalString = new String(decimalValue.toFixed(decimalFormat.length));
decimalString = decimalString.substring(decimalString.lastIndexOf(".") + 1);
for (var i = 0; i < decimalFormat.length; i++) {
if (decimalFormat.charAt(i) == '#' && decimalString.charAt(i) != '0') {
decimalPortion += decimalString.charAt(i);
} else if (decimalFormat.charAt(i) == '#' && decimalString.charAt(i) == '0') {
var notParsed = decimalString.substring(i);
if (notParsed.match('[1-9]')) {
decimalPortion += decimalString.charAt(i);
} else {
break;
}
} else if (decimalFormat.charAt(i) == "0") {
decimalPortion += decimalString.charAt(i);
}
}
returnString += decimalPortion;
} else {
number = Math.round(number);
}
var ones = Math.floor(number);
if (number < 0)
ones = Math.ceil(number);
var onesFormat = "";
if (format.indexOf(".") == -1)
onesFormat = format;
else
onesFormat = format.substring(0, format.indexOf("."));
var onePortion = "";
if (!(ones == 0 && onesFormat.substr(onesFormat.length - 1) == '#') || forcedToZero) {
// find how many digits are in the group
var oneText = new String(Math.abs(ones));
var groupLength = 9999;
if (onesFormat.lastIndexOf(",") != -1)
groupLength = onesFormat.length - onesFormat.lastIndexOf(",") - 1;
var groupCount = 0;
for (var i = oneText.length - 1; i > -1; i--) {
onePortion = oneText.charAt(i) + onePortion;
groupCount++;
if (groupCount == groupLength && i != 0) {
onePortion = group + onePortion;
groupCount = 0;
}
}
// account for any pre-data padding
if (onesFormat.length > onePortion.length) {
var padStart = onesFormat.indexOf('0');
if (padStart != -1) {
var padLen = onesFormat.length - padStart;
// pad to left with 0's or group char
var pos = onesFormat.length - onePortion.length - 1;
while (onePortion.length < padLen) {
var padChar = onesFormat.charAt(pos);
// replace with real group char if needed
if (padChar == ',')
padChar = group;
onePortion = padChar + onePortion;
pos--;
}
}
}
}
if (!onePortion && onesFormat.indexOf('0', onesFormat.length - 1) !== -1)
onePortion = '0';
returnString = onePortion + returnString;
// handle special case where negative is in front of the invalid characters
if (number < 0 && negativeInFront && prefix.length > 0)
prefix = neg + prefix;
else if (number < 0)
returnString = neg + returnString;
if (returnString.lastIndexOf(dec) == returnString.length - 1) {
returnString = returnString.substring(0, returnString.length - 1);
}
returnString = prefix + returnString + suffix;
return returnString;
}
//validation functions - used by textfield and datefield
jQuery.fn.validateField = function () {
var isValid = true;
this.each(function () {
var el = $(this);
el.clearErrorAlert();
var value = el.val();
if (value) {
var rett = true;
var type = (el.attr('entryType')+"").toUpperCase();
var errParam;
if (type == "INTEGER") {
rett = isValidInteger(value);
} else if (type == "DOUBLE") {
rett = isValidDouble(value);
} else if (type == "PERCENTILE") {
rett = isValidDouble(value);
} else if (type == "URL") {
rett = isValidURL(value);
} else if (type == "EMAIL") {
rett = isValidEmail(value);
} else if (type == "DURATIONMILLIS") {
rett = isValidDurationMillis(value);
} else if (type == "DURATIONDAYS") {
rett = isValidDurationDays(value);
} else if (type == "DATE") {
rett = Date.isValid(value, el.attr("format"), true);
if (!rett)
errParam = el.attr("format");
} else if (type == "TIME") {
rett = isValidTime(value);
} else if (type == "CURRENCY") {
rett = isValidCurrency(value);
}
if (!rett) {
el.createErrorAlert(i18n.ERROR_ON_FIELD, i18n.INVALID_DATA + (errParam ? " " + errParam : ""));
isValid=false;
}
//check limits minValue : maxValue
if (rett && (el.attr("minValue") || el.attr("maxValue"))){
var val=value;
var min=el.attr("minValue");
var max=el.attr("maxValue");
if (type == "INTEGER") {
val=parseInt(value);
min=parseInt(min);
max=parseInt(max);
} else if (type == "DOUBLE" || type == "PERCENTILE") {
val=parseDouble(value);
min=parseDouble(min);
max=parseDouble(max);
} else if (type == "URL") {
val=value;
} else if (type == "EMAIL") {
val=value;
} else if (type == "DURATIONMILLIS") {
val=millisFromString(value);
min=millisFromString(min);
max=millisFromString(max);
} else if (type == "DURATIONDAYS") {
val=daysFromString(value);
min=daysFromString(min);
max=daysFromString(max);
} else if (type == "DATE") {
val=Date.parseString(value, el.attr("format"),true).getTime();
min=Date.parseString(min, el.attr("format"),true).getTime();
max=Date.parseString(max, el.attr("format"),true).getTime();
} else if (type == "TIME") {
val = millisFromHourMinute(value);
min = millisFromHourMinute(min);
max = millisFromHourMinute(max);
} else if (type == "CURRENCY") {
val=getCurrencyValue(value);
min=getCurrencyValue(min);
max=getCurrencyValue(max);
}
if (el.attr("minValue") && val<min){
el.createErrorAlert(i18n.ERROR_ON_FIELD, i18n.OUT_OF_BOUDARIES + " ("+el.attr("minValue")+" : "+(el.attr("maxValue")?el.attr("maxValue"):"--")+")");
rett=false;
isValid=false;
$("body").trigger("error");
}
if (rett && el.attr("maxValue") && val>max){
el.createErrorAlert(i18n.ERROR_ON_FIELD, i18n.OUT_OF_BOUDARIES + " ("+(el.attr("minValue")?el.attr("minValue"):"--")+" : "+el.attr("maxValue")+")");
rett=false;
isValid=false;
}
}
}
});
return isValid;
};
jQuery.fn.clearErrorAlert = function () {
this.each(function () {
var el = $(this);
el.removeAttr("invalid").removeClass("formElementsError");
$("#" + el.prop("id") + "error").remove();
});
return this;
};
jQuery.fn.createErrorAlert = function (errorCode, message) {
this.each(function () {
var el = $(this);
el.attr("invalid", "true").addClass("formElementsError");
if ($("#" + el.prop("id") + "error").length <= 0) {
var errMess = (errorCode ? errorCode : "") + ": " + (message ? message : "");
var err = "<span class='formElementExclamation' id=\"" + el.prop("id") + "error\" error='1'";
err += " onclick=\"alert($(this).attr('title'))\" border='0' align='absmiddle'>&nbsp;";
err += "</span>\n";
err = $(err);
err.prop("title", errMess);
el.after(err);
}
});
return this;
};
// button submit support BEGIN ------------------
function saveFormValues(idForm) {
var formx = obj(idForm);
formx.setAttribute("savedAction", formx.action);
formx.setAttribute("savedTarget", formx.target);
var el = formx.elements;
for (i = 0; i < el.length; i++) {
if (el[i].getAttribute("savedValue") != null) {
el[i].setAttribute("savedValue", el[i].value);
}
}
}
function restoreFormValues(idForm) {
var formx = obj(idForm);
formx.action = formx.getAttribute("savedAction");
formx.target = formx.getAttribute("savedTarget");
var el = formx.elements;
for (i = 0; i < el.length; i++) {
if (el[i].getAttribute("savedValue") != null) {
el[i].value = el[i].getAttribute("savedValue");
}
}
}
function changeActionAndSubmit(action,command){
var f=$("form:first");
f.prop("action",action);
f.find("[name=CM]").val(command);
f.submit();
}
// textarea limit size -------------------------------------------------
function limitSize(ob) {
if (ob.getAttribute("maxlength")) {
var ml =parseInt(ob.getAttribute("maxlength"));
var val = ob.value;//.replace(/\r\n/g,"\n");
if (val.length > ml) {
ob.value = val.substr(0, ml);
$(ob).createErrorAlert("Error",i18n.ERR_FIELD_MAX_SIZE_EXCEEDED);
} else {
$(ob).clearErrorAlert();
}
}
return true;
}
// verify before unload BEGIN ----------------------------------------------------------------------------
function alertOnUnload(container) {
//console.debug("alertOnUnload",container,muteAlertOnChange);
if (!muteAlertOnChange) {
//first try to call a function eventually defined on the page
if (typeof(managePageUnload) == "function")
managePageUnload();
container=container||$("body");
var inps= $("[alertonchange=true]",container).find("[oldValue=1]");
for (var j = 0; j < inps.length; j++) {
var anInput = inps.eq(j);
//console.debug(j,anInput,anInput.isValueChanged())
var oldValue = anInput.getOldValue() + "";
if (!('true' == '' + anInput.attr('excludeFromAlert'))) {
if (anInput.attr("maleficoTiny")) {
if (tinymce.EditorManager.get(anInput.prop("id")).isDirty()) {
return i18n.FORM_IS_CHANGED + " \"" + anInput.prop("name") + "\"";
}
} else if (anInput.isValueChanged()) {
var inputLabel = $("label[for='" + anInput.prop("id") + "']").text(); //use label element
inputLabel = inputLabel ? inputLabel : anInput.prop("name");
return i18n.FORM_IS_CHANGED + " \"" + inputLabel + "\"";
}
}
}
}
return undefined;
}
function canILeave(){
var ret = window.onbeforeunload();
if (typeof(ret)!="undefined" && !confirm(ret+" \n"+i18n.PROCEED))
return false;
else
return true;
}
// ---------------------------------- oldvalues management
// update all values selected
jQuery.fn.updateOldValue = function () {
this.each(function () {
var el = $(this);
var val=(el.is(":checkbox,:radio")?el.prop("checked"):el.val())+"";
el.data("_oldvalue", val);
});
return this;
};
// return true if at least one element has changed
jQuery.fn.isValueChanged = function () {
var ret = false;
this.each(function () {
var el = $(this);
var val=(el.is(":checkbox,:radio")?el.prop("checked"):el.val())+"";
if (val != el.data("_oldvalue") + "") {
//console.debug("io sono diverso "+el.prop("id")+ " :"+el.val()+" != "+el.data("_oldvalue"));
ret = true;
return false;
}
});
return ret;
};
jQuery.fn.getOldValue = function () {
return $(this).data("_oldvalue");
};
jQuery.fn.fillJsonWithInputValues = function (jsonObject) {
var inputs = this.find(":input");
$.each(inputs.serializeArray(),function(){
if (this.name) {
jsonObject[this.name] = this.value;
}
});
inputs.filter(":checkbox[name]").each(function () {
var el = $(this);
jsonObject[el.attr("name")] = el.is(":checked") ? "yes" : "no";
})
return this;
};
function enlargeTextArea(immediate) {
//console.debug("enlargeTextArea",immediate);
var el = $(this);
var delay=immediate===true?1:300;
el.stopTime("taResizeApply");
el.oneTime(delay,"taResizeApply",function(){
var miH = el.is("[minHeight]") ? parseInt(el.attr("minHeight")) : 30;
var maH = el.is("[maxHeight]") ? parseInt(el.attr("maxHeight")) : 400;
var inc = el.is("[lineHeight]") ? parseInt(el.attr("lineHeight")) : 30;
//si copiano nel css per sicurezza
el.css({maxHeight:maH,minHeight:miH});
var domEl = el.get(0);
var pad = el.outerHeight()-el.height();
//devo allargare
if (domEl.scrollHeight>el.outerHeight() && el.outerHeight()<maH){
var nh=domEl.scrollHeight-pad + inc;
nh=nh>maH-pad?maH-pad:nh;
el.height(nh);
} else if (el.height()>miH){
//devo stringere
el.height(el.height()-inc);
while(el.outerHeight()-domEl.scrollHeight > 0 && el.height()>miH){
el.height(el.height()-inc);
}
var newH=domEl.scrollHeight-pad +inc;
//newH=newH<minH?minH:newH;
el.height(newH);
}
el.stopTime("winResize");
});
}