var MAX_SIZE = 'max';

var DB_NONE_IDX = -1;

// Data Field Types (keep those synchronized with db_types.inc.php)
var DFIELD_DUMMY_IDX = -99;
var DFIELD_ID_IDX = 1;
var DFIELD_TEXT_IDX = 2;
var DFIELD_CHECK_IDX = 3;
var DFIELD_COMBO_IDX = 4;
var DFIELD_DATE_IDX = 5;
var DFIELD_TEXTAREA_IDX = 6;
var DFIELD_LINK_IDX = 7;
var DFIELD_IZCMFILE_IDX = 8;
var DFIELD_TIMESTAMP_IDX = 9;
var DFIELD_QUERY_IDX = 10;
var DFIELD_INSBY_IDX = 11;
var DFIELD_INSDATE_IDX = 12;
var DFIELD_UPDBY_IDX = 13;
var DFIELD_UPDDATE_IDX = 14;
var DFIELD_LANGID_IDX = 15;
var DFIELD_MASTERID_IDX = 16;
var DFIELD_USERID_IDX = 17;
var DFIELD_REPOSITORY_IDX = 18;
var DFIELD_FILE_IDX = 19;
var DFIELD_FILEPRIV_IDX = 20;
var DFIELD_MULTICOMBO_IDX = 21;
var DFIELD_PASSWORD_IDX = 22;
var DFIELD_TIME_IDX = 23;
var DFIELD_INSBYNAME_IDX = 24;
var DFIELD_UPDBYNAME_IDX = 25;
var DFIELD_DBFNC_IDX = 26;
var DFIELD_RADIO_IDX = 27;
var DFIELD_NUMERIC_IDX = 28;
var DFIELD_DATETIME_IDX = 29;
var DFIELD_HIDDEN_IDX = 30;
var DFIELD_CURRENCY_IDX = 31;
var DFIELD_HTMLEDITOR_IDX = 32;
var DFIELD_DATASET_IDX = 33;
var DFIELD_MULTIDATASET_IDX = 34;
var DFIELD_VERSION_IDX = 35;
var DFIELD_SUBVERSION_IDX = 36;
var DFIELD_VERSIONTYPE_IDX = 37;
var DFIELD_EMAIL_IDX = 38;
var DFIELD_CUSTOM_IDX = 39;

// Javascript special cheracters (keep those synchronized with db_types.inc.php)
var JS_NWL = "_nwl;";
var JS_QTE = "_apx;";
var JS_DBLQTE = "_dapx;";

// JSDEBUG serve per esguire il debug dei blocchi try catch
// Quando questa variabile e' settata a 1 le funzioni vengono
// chiamate direttamente senza essere racchiusi in un blocco
// try catch, facendo in modo che gli errori vengono visualizzati
var JSDEBUG = false;

// Tempo in millisecondi che deve intercorrere tra un messaggio e l'altro.
var TIMESLOT = 50;

// Codici d'errore restituiti dalle funzioni di controllo.
var NO_ERROR = 0;
var BAD_FORMAT = 1;
var BAD_DATE = 2;

var isNav = (navigator.appName == "Netscape");
var isIE = (navigator.appName == "Microsoft Internet Explorer");

function getNextTimeSlot() {
	TIMESLOT++;
	return TIMESLOT;
}

function showContent(){
	if (isIE){
		var divcentrale = document.getElementById('content');
		divcentrale.style.display = "";
	}
}

function hideContent(){
	if (isIE){
		var hasCmb = false;
		for (var i=0; i<document.forms.length;i++) {
			for (var j=0; j<document.forms[i].elements.length;j++) {
				var otype = document.forms[i].elements[j].type;
				if ((otype == 'select-one') || (otype == 'select-multiple')) {
					hasCmb = true;
					break;
				}
			}
			if (hasCmb)
				break;
		}
		if (hasCmb) {
			var divcentrale = document.getElementById('content');
			divcentrale.style.display = "none";
		}
	}
}

function search(str)
{
	for (var i = 0; i < this.length; i++) {
		if (this[i] == str)
			return true;
	}
	return false;
}

Array.prototype.search = search;

function trim(trc)
{
	var trc = nvl(trc, "\\s");
	var re = new RegExp("\^" + trc + "\+\|" + trc + "\+\$", "g");
	return this.replace(re, "");
}

String.prototype.trim = trim;

function nvl(val, altval)
{
	if ((typeof(val) != 'undefined') && (val !== '') && (val !== null))
		return val;
	else
		return altval;
}

function ifval(val, testval, altval)
{
	if (val == testval) return val;
	else return altval;
}

function ifnotval(val, testval, altval)
{
	if (val != testval) return val;
	else return altval;
}

function exist(o)
{
	return (typeof(o) != 'undefined') && (o !== null);
}

function isupdatable(e)
{
	return (exist(e) && e.type != 'hidden');
}

function goToRelUrl(url)
{
	var baseUrl = window.location.protocol + '//' + window.location.host;
	var currPath = window.location.pathname;
	currPath = currPath.substr(0, currPath.lastIndexOf('/'));

	url = url.replace(/%2F/g, '/');
	while ((url.indexOf('../') != -1) && (url.indexOf('../') <= 2)) {
		url = url.substr(url.indexOf('../')+3);
		currPath = currPath.substr(0, currPath.lastIndexOf('/'));
	}
	var newUrl = baseUrl + currPath + '/' + url;
	self.location.assign(newUrl);
}

////////////////////////////////////////////////////////////////////////////////
// Collection Class                                                           //
////////////////////////////////////////////////////////////////////////////////
function CCollection() {
	var _count = 0;
	var _data = new Object();

	this.data = _data;
	this.add = _add;
	this.remove = _remove;
	this.isEmpty = _isEmpty;
	this.count = _count;
	this.clear = _clear;

	function _add(newItem, idx) {
		if (newItem == null) return;
		this.count++;
		if (idx == null)
			idx = this.count;
		this.data[idx] = newItem;
	}

	function _remove(idx) {
		if (idx < 0 || idx > this.count - 1) return;
		delete this.data[idx]
		this.count--;
	}

	function _isEmpty() { return this.count == 0 }

	function _clear() {
		for (var i in this.data)
			delete this.data[i];

		this.count = 0;
	}
}
///////////////////////////// Collection Class End /////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// DOM Functions                                                              //
////////////////////////////////////////////////////////////////////////////////
function setEvent(obj, evt, fnc) {
	if (obj.addEventListener)
		obj.addEventListener(evt, fnc, false);
	else if (obj.attachEvent)
		obj.attachEvent("on" + evt, fnc);
}

function getTarget(evt) {
	return elem = (evt.target) ? evt.target : evt.srcElement;
}

function replaceDomNode(parentNode, newChildNode, oldChildNode)
{
	if (!oldChildNode)
		oldChildNode = parentNode.firstChild;
	parentNode.replaceChild(newChildNode, oldChildNode);
}

function createTxt(txt, w)
{
	var win = nvl(w, self);
	return win.document.createTextNode(txt);
}

function createImg(iSrc, iTitle, w)
{
	var win = nvl(w, self);
	var newImg = win.document.createElement("img");
	newImg.src = iSrc;
	newImg.border = 0;
	newImg.alt = iTitle;
	newImg.title = iTitle;
	return newImg;
}

function createAnchor(alink, acontent, w)
{
	var win = nvl(w, self);
	var newa = win.document.createElement("A");
	newa.href = alink;
	newa.appendChild(acontent);
	return newa;
}

function createTable(params, w)
{
	var win = nvl(w, self);
	var newtable = win.document.createElement("TABLE");

	return newtable;
}

function createTd(tdcontent, w)
{
	var win = nvl(w, self);
	var newtd = win.document.createElement("TD");
	if (tdcontent != null)
		newtd.appendChild(tdcontent);
	return newtd;
}

function createForm(fName, w)
{
	var win = nvl(w, self);
	if (isIE)
		var newForm = win.document.createElement('<form name="' + fName + '">');
	else {
		var newForm = win.document.createElement("form");
		newForm.name = fName;
	}
	newForm.method = "post";
	var bodynode = document.getElementsByTagName("body").item(0);
	bodynode.appendChild(newForm);
	return newForm;
}

function createSelect(sName, w)
{
	var win = nvl(w, self);
	if (isIE)
		var newSel = win.document.createElement('<select name="' + sName + '">');
	else {
		var newSel = win.document.createElement("select");
		newSel.name = sName;
	}
	newSel.className = "inputbox";
	return newSel;
}

function createInput(iName, iType, w)
{
	var win = nvl(w, self);
	if (isIE)
		var newInput = win.document.createElement('<input name="' + iName + '" type="' + iType + '">');
	else {
		var newInput = win.document.createElement("input");
		newInput.name = iName;
		newInput.type = iType;
	}
	newInput.className = "inputbox";
	return newInput;
}

function createOption(val, desc, w)
{
	var win = nvl(w, self);
	var newopt = win.document.createElement("option");
	var optdesc = win.document.createTextNode(desc);
	newopt.value = val;
	newopt.appendChild(optdesc);
	return newopt;
}

/////////////////////////////// End DOM Functions //////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// Array Functions                                                            //
////////////////////////////////////////////////////////////////////////////////
function in_array(arr, val)
{
	for (var i=0; i<arr.length; i++) {
		if (arr[i] == val)
			return true;
	}
	return false;
}

function array_removeval(arr, val)
{
	var bi = 0;
	for (var i=0; i<arr.length; i++) {
		if (arr[i] == val)
			arr.splice(i, i + 1);
	}
	return arr;
}

/////////////////////////////// End Array Functions //////////////////////////////


////////////////////////////////////////////////////////////////////////////////
// IZCM Functions                                                             //
////////////////////////////////////////////////////////////////////////////////

function openPopup(URL, Name, width, height, resizable, scrollbars, left, top,toolbar) {
	var a,b;
	width = nvl(width, 300);
	height = nvl(height, 300);
	resizable = nvl(resizable, "yes")
	scrollbars = nvl(scrollbars, "yes");
	toolbar = nvl(toolbar, "0");
	left = nvl(left, (self.screen.width - width)/2);
	top = nvl(top, 10);

	// Modifico la URL pe passare un parametro alla pagina che indica
	// che si tratta di una popup
	if (URL.indexOf("?") != -1) {
		URL = URL+"&popup=1";
	} else {
		a = URL.substr(0,URL.indexOf("?"));
		URL = a +"?popup=1";
	}

	if (height == MAX_SIZE) {
		var sh = window.screen.height;
		height = (sh - top) - 100;
	}
	if (width == MAX_SIZE) {
		left = 10;
		var sw = window.screen.width;
		width = (sw - left) - 100;
	}
	wndAttr = "width="+width+",height="+height+",left="+left+",top="+top+
				 ",resizable="+resizable+",scrollbars="+scrollbars+",status=1"+
				 ",toolbar="+toolbar;
	w = window.open(URL, Name, wndAttr);
	w.focus();
	return w;
}

function addWinAttr(wAttr, newAttr)
{
	if (wAttr != "") wAttr += ",";
	return wAttr += newAttr;
}

function openPopup2(wUrl, wAttr, wName, doRetWin)
{
	var wLeftDef = 50;
	var wTopDef = 50;
	var wWidthDef = 500;
	var wHeightDef = 400;

	doRetWin = nvl(doRetWin, false);

	wAttr = nvl(wAttr, "");
	if (!exist(wName)) {
		wName = wUrl.substr(wUrl.lastIndexOf('/')+1);
		wName = wName.substr(0, ifnotval(wName.lastIndexOf('?'), -1, wName.length));
		wName = wName.replace(/\./g, "");
	}
	if (wAttr.search(/resizable\s*=/gi) == -1)
		wAttr = addWinAttr(wAttr, "resizable=yes");

	if (wAttr.search(/scrollbars\s*=/gi) == -1)
		wAttr = addWinAttr(wAttr, "scrollbars=yes");

	if (wAttr.search(/toolbar\s*=/gi) == -1)
		wAttr = addWinAttr(wAttr, "toolbar=no");

	if (wAttr.search(/width\s*=/gi) == -1)
		wAttr = addWinAttr(wAttr, "width="+wWidthDef);
	else if (wAttr.search(/width\s*=\s*max/gi) != -1) {
		var sw = window.screen.width;
		var wWidth = (sw - wLeftDef) - 100;
		wAttr = wAttr.replace(/width\s*=\s*max/gi, "width="+wWidth);
		if (wAttr.search(/left\s*=/gi) == -1)
			wAttr = addWinAttr(wAttr, "left="+wLeftDef);
		else
			wAttr = wAttr.replace(/left\s*=\s*\d+/gi, "left="+wLeftDef);
	}

	if (wAttr.search(/height\s*=/gi) == -1)
		wAttr = addWinAttr(wAttr, "height="+wHeightDef);
	else if (wAttr.search(/height\s*=\s*max/gi) != -1) {
		var sh = window.screen.height;
		wHeight = (sh - wTopDef) - 100;
		wAttr = wAttr.replace(/height\s*=\s*max/gi, "height="+wHeight);
		if (wAttr.search(/top\s*=/gi) == -1)
			wAttr = addWinAttr(wAttr, "top="+wTopDef);
		else
			wAttr = wAttr.replace(/top\s*=\s*\d+/gi, "top="+wTopDef);
	}

	if (wAttr.search(/left\s*=/gi) == -1) {
		var wWidth = wAttr.match(/width\s*=\s*\d+/gi);
		wLeft = (self.screen.width - parseInt(wWidth.toString().replace(/width\s*=\s*/, ""))) / 2;
		wAttr = addWinAttr(wAttr, "left="+wLeft);
	}

	if (wAttr.search(/top\s*=/gi) == -1)
		wAttr = addWinAttr(wAttr, "top="+wTopDef);

	w = window.open(wUrl, wName, wAttr);
	w.focus();
	if (doRetWin)
		return w;
}


var canShowErrorMessage = true;
var errorMessages = new Object();

function getFieldValue(fObj) {
	if (exist(fObj)) {
		switch (fObj.type) {
			case 'select-one':
				var val = (fObj.selectedIndex >= 0)
					? fObj.options[fObj.selectedIndex].value
					: null;
				break;
			case 'select-multiple':
				var o = fObj.options;
				var val = new Array();
				var j = 0;
				for (i=0; i<o.length; i++) {
					if (o[i].selected) {
						val[j] = o[i].value;
						j++;
					}
				}
				break;
			case 'checkbox':
				var val = (fObj.checked) ? fObj.value : "";
				break;
			case 'radio':
				if (fObj.checked)
					var val = fObj.value;
				break;
			case undefined:
				rl = nvl(fObj.length, 0);
				for (var i=0; i<rl; i++) {
					if (fObj[i].checked) {
						var val = fObj[i].value;
					}
				}
				break;
			default:
				var val = fObj.value;
		}
		if (!isNaN(val) && (val != ""))
			val = parseInt(val);
		return val;
	}
	else
		return null;
}

function getFieldValue2(fldName, frm)
{
	if (typeof frm == 'undefined')
		frm = document.forms[0];
	return getFieldValue(frm.elements[fldName]);
}

function setFieldValue(fObj, v) {
	if (exist(fObj)) {
		switch (fObj.type) {
			case "select-one":
			case "select-multiple":
				for (var i=0; i<fObj.options.length; i++) {
					if (fObj.options[i].value == v) {
						fObj.selectedIndex = i;
						break;
					}
				}
				break;
			case "checkbox":
				fObj.checked = (fObj.value == v);
				break;
			case undefined:
				rl = nvl(fObj.length, 0);
				for (var i=0; i<rl; i++) {
					if (fObj[i].value == v)
					fObj[i].checked = true;
				}
				break;
			default:
				fObj.value = v;
		}
	}
}

function setFieldValue2(fldName, fldVal, frm)
{
	if (typeof frm == 'undefined')
		frm = document.forms[0];
	setFieldValue(frm.elements[fldName], fldVal);
}

function setIzFieldValue(fldName, fldVal, frm)
{
	setFieldValue2(fldName, fldVal, frm);
	var roVal = document.getElementById(fldName+"_ro");
	if (typeof roVal == "object")
		roVal.innerHTML = fldVal;
}

function getElementForm(feId) {
	var fe = document.getElementById(feId);
	return fe.form;
}

function setFieldFocus(fObj) {
	setTimeout(function(){fObj.focus();}, getNextTimeSlot());
}

function ParseError(errMsg, errParams) {
	if (typeof errParams == "undefined")
		errParams = new Array();
	else if (typeof errParams != "object") {
		alert("errParams must be an array.");
		return;
	}
	var re = new RegExp(JS_QTE, "g");
	errMsg = errMsg.replace(re, "'");
	var re = new RegExp(JS_DBLQTE, "g");
	errMsg = errMsg.replace(re, "\"");
	var re = new RegExp(JS_NWL, "g");
	var i = errParams.length;
	while (i >= 1) {
		errMsg = errMsg.replace("#*#"+i, errParams[i-1]);
		i--;
	}
	return errMsg.replace(re, "\n");
}

function izalert(msg)
{
	alert(ParseError(msg));
}

function izconfirm(msg)
{
	return confirm(ParseError(msg));
}

function displayErrorMessage(errMsg) {
	if (canShowErrorMessage)
		izalert(errMsg);
}

function dispatchErrorMessage(errMsg) {
	setTimeout(function(){displayErrorMessage(errMsg);}, 200);
}

function getCtlErrorMsg(fT, fId) {
	var errMsg = errorMessages[fT];
	if (errMsg) {
		return errMsg.replace("@flbl@",  getFieldLabel(fId));
	}
	else
		return errorMessages[DB_NONE_IDX].replace("#*#1", fT);
}

function getFieldLabel(fId) {
	var lblContainer = document.getElementById("lbl_"+fId);
	if (lblContainer)
		return lblContainer.firstChild.nodeValue;
	else
		return fId;
}

function setFieldDefault(fObj) {
	setTimeout(function(){setFieldValue(fObj, fObj.defaultValue);}, getNextTimeSlot());
}

function _ctlNumber(fObj) {
	var num = fObj.value.replace(",", ".");
	if (num != "" && isNaN(num)) {
		setFieldDefault(fObj);
		setFieldFocus(fObj);
		return false;
	}
	else
		return true;
}

function ctlNumber2(fObj, errMsg) {
	if (!_ctlNumber(fObj)) {
		canShowErrorMessage = true;
		dispatchErrorMessage(errMsg);
	}
}

function _ctlEmail(fObj) {
	var email = fObj.value;
	var emailPattern = /^[\w.\-_]+\@(\w+\.)+\w+\s*$/;
	if (email != "" && !emailPattern.test(email)) {
		setFieldDefault(fObj);
		setFieldFocus(fObj);
		return false;
	}
	else
		return true;
}

function ctlEmail(fObj, errMsg) {
	if (!_ctlEmail(fObj)) {
		canShowErrorMessage = true;
		dispatchErrorMessage(errMsg);
	}
}

function getDateObj(dateStr, error) {
	dateStr = dateStr.trim();
	if (!exist(error))
		var error = new Object();
	error.code = NO_ERROR;
	// Controllo formato 10 caratteri con separatori oppure 8 caratteri senza separatori
	// + eventuale ora
	datePattern = /^\d{2}(\/|-|\.)?\d{2}(\/|-|\.)?\d{4}(\s+(\d{1,2}((:|,|\.)?\d{1,2})?((:|,|\.)?\d{1,2})?))?\s*$/;
	if (!datePattern.test(dateStr)) {
		error.code = BAD_FORMAT;
	}
	else {
		var arrDateTime = dateStr.split(/\s+/);
		var _date = arrDateTime[0];
		var _time = nvl(arrDateTime[1], "");
		var arrDate = _date.split(/\/|\-|\./);
		if (arrDate.length < 3) {
			arrDate[0] = _date.substr(0, 2);
			arrDate[1] = _date.substr(2, 2);
			arrDate[2] = _date.substr(4, 4);
		}
		var arrTime = new Array;
		_time = _time.trim();
		// Eseguo il controllo sull'orario
		arrTime = _time.split(/:|,|\./);
		if (arrTime.length < 2) {
			// Eseguo lo split per posizione dei caratteri
			arrTime[0] = _time.substr(0, 2);
			arrTime[1] = _time.substr(2, 2);
			arrTime[2] = _time.substr(4, 2);
		}
		arrTime[0] = parseInt(nvl(arrTime[0], 0), 10);
		arrTime[1] = parseInt(nvl(arrTime[1], 0), 10);
		arrTime[2] = parseInt(nvl(arrTime[2], 0), 10);

		var newtime = arrTime[0] + "." + arrTime[1] + "." + arrTime[2];
		if ((arrTime[0] < 0) || (arrTime[0] > 23)
				|| (arrTime[1] < 0) || (arrTime[1] > 59)
				|| (arrTime[2] < 0) || (arrTime[2] > 59)
			) {
			error.code = BAD_DATE;
			return false;
		}

		var dateObj = new Date(arrDate[2], arrDate[1]-1, arrDate[0], arrTime[0], arrTime[1], arrTime[2], 0);
		day = dateObj.getDate();
		month = dateObj.getMonth()+1;
		year = dateObj.getFullYear();

   	if (parseInt(arrDate[0], 10) != day
			|| parseInt(arrDate[1], 10) != month
			|| parseInt(arrDate[2], 10) != year)
		{
			error.code = BAD_DATE;
		}
	}
	if (error.code == NO_ERROR)
		return dateObj;
	else
		return false;
}


function _ctlDate(fObj, error) {
	error.code = NO_ERROR;
	var dateStr = fObj.value;

	if (dateStr != "") {
		getDateObj(dateStr, error)
	}
	if (error.code != NO_ERROR) {
		setFieldDefault(fObj);
		setFieldFocus(fObj);
		return false;
	}
	else
		return true;
}

function ctlDate2(fObj, errMsg1, errMsg2) {
	var error = new Object();
	error.code = NO_ERROR;
	if (!_ctlDate(fObj, error)) {
		canShowErrorMessage = true;
		var errMsg = (error.code == BAD_FORMAT) ? errMsg1 : errMsg2;
		dispatchErrorMessage(errMsg);
	}
}

function _ctlTime(fObj, error) {
	error.code = NO_ERROR;
	var timeStr = fObj.value.trim();
	if (timeStr != "") {
		// Controllo formato 5 caratteri con separatori oppure 4 caratteri senza separatori
		timePattern = /^\d{1,2}((:|,|\.)?\d{1,2})?((:|,|\.)?\d{1,2})?$/;
		if (!timePattern.test(timeStr)) {
			error.code = BAD_FORMAT;
		}
		else {
			arrTime = timeStr.split(/:|,|\./);
			if (arrTime.length < 2) {
				arrTime[0] = timeStr.substr(0, 2);
				arrTime[1] = timeStr.substr(2, 2);
				arrTime[2] = timeStr.substr(4, 2);
			}

			arrTime[0] = parseInt(nvl(arrTime[0], 0));
			arrTime[1] = parseInt(nvl(arrTime[1], 0));
			arrTime[2] = parseInt(nvl(arrTime[2], 0));
			var newtime = arrTime[0] + "." + arrTime[1] + "." + arrTime[2];
			if ((arrTime[0] < 0) || (arrTime[0] > 23)
					|| (arrTime[1] < 0) || (arrTime[1] > 59)
					|| (arrTime[2] < 0) || (arrTime[2] > 59)
			) {
				error.code = BAD_DATE;
			}
		}
	}
	if (error.code != NO_ERROR) {
		setFieldDefault(fObj);
		setFieldFocus(fObj);
		return false;
	}
	else
		return true;
}

function ctlTime2(fObj, errMsg1, errMsg2) {
	var error = new Object();
	error.code = NO_ERROR;
	if (!_ctlTime(fObj, error)) {
		canShowErrorMessage = true;
		var errMsg = (error.code == BAD_FORMAT) ? errMsg1 : errMsg2;
		dispatchErrorMessage(errMsg);
	}
}

function ctlDataType(fObj, fId, fType) {
	var errMsg = "";
	switch (parseInt(fType)) {
		case DFIELD_NUMERIC_IDX:
		case DFIELD_CURRENCY_IDX:
			if (!_ctlNumber(fObj))
				errMsg += getCtlErrorMsg(fType, fId);
			break;
		case DFIELD_DATE_IDX:
			var error = new Object();
			error.code = NO_ERROR;
			if (!_ctlDate(fObj, error))
				errMsg += getCtlErrorMsg(fType + "_" + error.code, fId);
			break;
		case DFIELD_TIME_IDX:
			var error = new Object();
			error.code = NO_ERROR;
			if (!_ctlTime(fObj, error))
				errMsg += getCtlErrorMsg(fType + "_" + error.code, fId);
			break;
		case DFIELD_EMAIL_IDX:
			if (!_ctlEmail(fObj))
				errMsg += getCtlErrorMsg(fType, fId);
			break;
	}
	return errMsg;
}

function ctlMandatory(fObj, fId, fType) {
	var errMsg = "";
	var check = (getFieldValue(fObj) !== "");
	if ((fType == DFIELD_FILE_IDX) || (fType == DFIELD_FILEPRIV_IDX)) {
		fObj2 = fObj.form.elements["curr_"+fObj.name];
		check = check || (getFieldValue(fObj2) !== "");
	}
	if (!check) {
		//errMsg = fObj.name + ": " + getFieldValue(fObj) + " :: " + getCtlErrorMsg("M", fId);
		errMsg = getCtlErrorMsg("M", fId);
	}
	return errMsg;
}

function _ctldata(f) {
	canShowErrorMessage = false;
	var e = f.elements;
	var errMsg = "";
	for (var i=0; i<e.length; i++) {
		if (e[i].name.indexOf("_FLDNFO") != -1) {
			var fldNfoAttr = e[i].value.split("|");
			var fName = fldNfoAttr[0];
			var fType = fldNfoAttr[2];
			if (fldNfoAttr[1] == 1)
				errMsg += ctlMandatory(e[fName], fName, fType);
			errMsg += ctlDataType(e[fName], fName, fType);
		}
	}
	return ParseError(errMsg);
}

function setFieldMandatory(f, fieldName, mandatory)
{
	var e = f.elements;
	var mand = nvl(mandatory, 1) ? 1 : 0;
	for (var i=0; i<e.length; i++) {
		if (e[i].name.indexOf("_FLDNFO") != -1) {
			var fldNfoAttr = e[i].value.split("|");
			// This is the field attrib to change
			if (fldNfoAttr[0] == fieldName) {
				if (fldNfoAttr[1] != mand)
					e[i].value = fldNfoAttr[0]+"|"+mand+"|"+fldNfoAttr[2];
			}
		}
	}
}
////////////////////////////// End IZCM Functions //////////////////////////////

function ctlCap_alert(fObj) {
	var errMsg = ctlCap(fObj)
	if (errMsg != "") {
		canShowErrorMessage = true;
		dispatchErrorMessage(errMsg);
		return false;
	}
	else
		return true;
}

function ctlCap(fObj) {
	var cap = fObj.value;
	var len = cap.length;
	var errMsg = "";
	if (!_ctlNumber(fObj))
		errMsg += cap + " non e' un CAP corretto!\n"
	else if ((len > 0) && (len < 5))
		errMsg += "Il CAP deve essere composto da un numero di 5 cifre\n";
	if (errMsg != "") {
		setFieldDefault(fObj);
		setFieldFocus(fObj);
	}
	return errMsg;
}

/*

function ctlCap(element) {
	var testo = element.value;
	var len = testo.length;
	if (!ctlNumber(element, "", true)) {
		errMsg = testo + " non e' un CAP corretto!"
		return errMsg;
}
	else if ((len > 0) && (len < 5)) {
		errMsg = 'Il CAP deve essere composto da un numero di 5 cifre';
		return errMsg;
}
	return true;
}
*/


function getDateFromStr(dateStr) {
	dateArr = dateStr.split(/\/|\-|\.| /);
  	if (dateArr.length < 3) {
  		dateArr[0] = dateStr.substr(0, 2);
  		dateArr[1] = dateStr.substr(2, 2);
  		dateArr[2] = dateStr.substr(4, 4);
  	}
  	return new Date(dateArr[1] + "/" + dateArr[0] + "/" + dateArr[2]);
}

function BuildCsvList(List, newVal, isString) {
	if (newVal != "") {
		isString = nvl(isString, false);
		apx = isString ? "'" : "";
		List += ((List != "") ? "," : "") + apx + newVal + apx;
	}
	return List
}

function openCalendar(calendarscript, fieldid, dtype) {
	var datetoshowvar = document.getElementById(fieldid);
	openPopup(calendarscript+"?datetoshow="+datetoshowvar.value+"&fieldid="+fieldid+"&dtype="+dtype, "Calendario", 300, 290, "no", "no");
}

function openMultiSelect(lib_path, fieldName, fieldId) {
	var SelElem = document.getElementById(fieldName+'_id').value;
	openPopup(lib_path+"multiselect.php?fieldName="+fieldName+"&fieldId="+fieldId+"&SelElem="+SelElem, "multiselect", 480, 280);
}

function showUpload(strSezione, strCampo){
	openPopup("upload.php?campo="+strCampo+"&sezione="+strSezione, "wndUpload");
}

function deleteUpload(strFileName, strNomeCampo){
	openPopup("deleteUpload.php?fileName="+strFileName+"&nomeCampo="+strNomeCampo, "wndUplad");
}

function htmlentities(intext, toent) {
	var transtable = new Array();
	transtable["&"] = "&amp;";
	/*transtable["¡"] = "&iexcl;";
	transtable["¢"] = "&cent;";
	transtable["£"] = "&pound;";
	transtable["¤"] = "&curren;";
	transtable["¥"] = "&yen;";
	transtable["¦"] = "&brvbar;";
	transtable["§"] = "&sect;";
	transtable["¨"] = "&uml;";
	transtable["©"] = "&copy;";
	transtable["ª"] = "&ordf;";
	transtable["«"] = "&laquo;";
	transtable["¬"] = "&not;";
	transtable["®"] = "&reg;";
	transtable["¯"] = "&macr;";
	transtable["°"] = "&deg;";
	transtable["±"] = "&plusmn;";
	transtable["²"] = "&sup2;";
	transtable["³"] = "&sup3;";
	transtable["´"] = "&acute;";
	transtable["µ"] = "&micro;";
	transtable["¶"] = "&para;";
	transtable["·"] = "&middot;";
	transtable["¸"] = "&cedil;";
	transtable["¹"] = "&sup1;";
	transtable["º"] = "&ordm;";
	transtable["»"] = "&raquo;";
	transtable["¼"] = "&frac14;";
	transtable["½"] = "&frac12;";
	transtable["¾"] = "&frac34;";
	transtable["¿"] = "&iquest;";
	transtable["À"] = "&Agrave;";
	transtable["Á"] = "&Aacute;";
	transtable["Â"] = "&Acirc;";
	transtable["Ã"] = "&Atilde;";
	transtable["Ä"] = "&Auml;";
	transtable["Å"] = "&Aring;";
	transtable["Æ"] = "&AElig;";
	transtable["Ç"] = "&Ccedil;";
	transtable["È"] = "&Egrave;";
	transtable["É"] = "&Eacute;";
	transtable["Ê"] = "&Ecirc;";
	transtable["Ë"] = "&Euml;";
	transtable["Ì"] = "&Igrave;";
	transtable["Í"] = "&Iacute;";
	transtable["Î"] = "&Icirc;";
	transtable["Ï"] = "&Iuml;";
	transtable["Ð"] = "&ETH;";
	transtable["Ñ"] = "&Ntilde;";
	transtable["Ò"] = "&Ograve;";
	transtable["Ó"] = "&Oacute;";
	transtable["Ô"] = "&Ocirc;";
	transtable["Õ"] = "&Otilde;";
	transtable["Ö"] = "&Ouml;";
	transtable["×"] = "&times;";
	transtable["Ø"] = "&Oslash;";
	transtable["Ù"] = "&Ugrave;";
	transtable["Ú"] = "&Uacute;";
	transtable["Û"] = "&Ucirc;";
	transtable["Ü"] = "&Uuml;";
	transtable["Ý"] = "&Yacute;";
	transtable["Þ"] = "&THORN;";
	transtable["ß"] = "&szlig;";
	transtable["à"] = "&agrave;";
	transtable["á"] = "&aacute;";
	transtable["â"] = "&acirc;";
	transtable["ã"] = "&atilde;";
	transtable["ä"] = "&auml;";
	transtable["å"] = "&aring;";
	transtable["æ"] = "&aelig;";
	transtable["ç"] = "&ccedil;";
	transtable["è"] = "&egrave;";
	transtable["é"] = "&eacute;";
	transtable["ê"] = "&ecirc;";
	transtable["ë"] = "&euml;";
	transtable["ì"] = "&igrave;";
	transtable["í"] = "&iacute;";
	transtable["î"] = "&icirc;";
	transtable["ï"] = "&iuml;";
	transtable["ð"] = "&eth;";
	transtable["ñ"] = "&ntilde;";
	transtable["ò"] = "&ograve;";
	transtable["ó"] = "&oacute;";
	transtable["ô"] = "&ocirc;";
	transtable["õ"] = "&otilde;";
	transtable["ö"] = "&ouml;";
	transtable["÷"] = "&divide;";
	transtable["ø"] = "&oslash;";
	transtable["ù"] = "&ugrave;";
	transtable["ú"] = "&uacute;";
	transtable["û"] = "&ucirc;";
	transtable["ü"] = "&uuml;";
	transtable["ý"] = "&yacute;";
	transtable["þ"] = "&thorn;";*/
	transtable["\""] = "&quot;";
	transtable["<"] = "&lt;";
	transtable[">"] = "&gt;";

	var texttr = intext;
	if (toent) {
		for (i in transtable) {
			re = new RegExp(i, "g");
			texttr = texttr.replace(re, transtable[i]);
		}
	}
	else {
		for (i in transtable) {
			re = new RegExp(transtable[i], "g");
			texttr = texttr.replace(re, i);
		}
	}
	return texttr;
}

function ctlArea(fObj, len, errMsg, NoError) {
	var intext = fObj.value;
	//var texttr = htmlentities(intext, true);
	texttr = intext;
	if (texttr.length > len) {
		if (!NoError) {
			texttr = texttr.substr(0, len);
			texttr = texttr.replace(/&\w+$/, "");
			//outtext = htmlentities(texttr, false);
			outtext = texttr;
			fObj.value = outtext;
			alert(ParseError(errMsg));
			setFieldFocus(fObj);
		}
		return false
	}
	else
		return true
}

function ctlNumber(fObj, errMsg, NoError) {
	var num = fObj.value.replace(",", ".");
	if (num != "" && isNaN(num)) {
		if (!NoError) {
			alert(ParseError(errMsg));
			setFieldDefault(fObj);
			setFieldFocus(fObj);
		}
		return false;
	}
	else
		return true;
}

function ctlDate(fObj, errMsg1, errMsg2, NoError) {
	var errore = false;
	var dateStr = fObj.value;
	var errMsg = "";

	if (dateStr != "") {
		// Controllo formato 10 caratteri con separatori oppure 8 caratteri senza separatori
		datePattern = /^\d{2}(\/|\-|\.)?\d{2}(\/|\-|\.)?\d{4}$/;
		if (!datePattern.test(dateStr)) {
  			errore = true;
			errMsg += errMsg1;
		}
		else {
		  	dateArr = dateStr.split(/\/|\-|\./);
  			if (dateArr.length < 3) {
  				dateArr[0] = dateStr.substr(0, 2);
  				dateArr[1] = dateStr.substr(2, 2);
  				dateArr[2] = dateStr.substr(4, 4);
  			}
  			int_date = new Date(dateArr[1] + "/" + dateArr[0] + "/" + dateArr[2]);
  			day = int_date.getDate();
  			month = int_date.getMonth()+1;
  			year = int_date.getFullYear();

		  	if (parseInt(dateArr[0], 10) != day
  					|| parseInt(dateArr[1], 10) != month
  					|| parseInt(dateArr[2], 10) != year) {
				errore = true;
				errMsg += errMsg2;
			}
		}

		if (errore) {
			if (!NoError) {
				alert(ParseError(errMsg));
				setFieldDefault(fObj);
				setFieldFocus(fObj);
			}
			return false;
		}
	}
	return true;
}

function ctlTime(fObj, errMsg1, errMsg2, NoError) {
	var error = false;
	var timeStr = fObj.value.trim();
	var errMsg = "";
	if (timeStr != "") {
		// Controllo formato 8 caratteri con separatori oppure 6 caratteri senza separatori
		timePattern = /^\d{1,2}((:|,|\.)?\d{1,2})?((:|,|\.)?\d{1,2})?$/;
		if (!timePattern.test(timeStr)) {
			error = true;
			errMsg += errMsg1;
		}
		else {
			timeArr = timeStr.split(/:|,|\./);
			if (timeArr.length < 2) {
				timeArr[0] = timeStr.substr(0, 2);
				timeArr[1] = timeStr.substr(2, 2);
				timeArr[2] = timeStr.substr(4, 2);
			}
			if ((timeArr[0] < 0) || (timeArr[0] > 23)
					|| (timeArr[1] < 0) || (timeArr[1] > 59)
					|| (timeArr[2] < 0) || (timeArr[2] > 59)) {
				error = true;
				errMsg += errMsg2;
			}
		}

		if (error) {
			if (!NoError) {
				alert(ParseError(errMsg));
				setFieldDefault(fObj);
				setFieldFocus(fObj);
			}
			return false;
		}
	}
	return true;
}

function izParseInt(inVal) {
	var outVal = parseInt(inVal);
	return (isNaN(outVal)) ? 0 : outVal;
}

function checkDateTime(dini, oini, dfin, ofin) {
	var j = 0;
	var dateArr = dini.split(/\/|\-|\./);
	var dateArrF = dfin.split(/\/|\-|\./);
//   var oraIni = f.elements["oraInizio["+j+"]"].value;
//   var oraFin = f.elements["oraFine["+j+"]"].value;
	var oraArr = oini.split(/:|\.|,/);
	var oraArrF = ofin.split(/:|\.|,/);
	x = new Date(dateArr[2],dateArr[1]-1,dateArr[0],oraArr[0],oraArr[1]);
	y = new Date(dateArrF[2],dateArrF[1]-1,dateArrF[0],oraArrF[0],oraArrF[1]);
	z = new Date();
	if (x > y) {
		return false;
	}
	return true;
}

function setup_hidden(f, fObjName, fObjValue, w) {
	if (exist(f.elements[fObjName]))
		//f.elements[fObjName].value = fObjValue;
		setFieldValue(f.elements[fObjName], fObjValue);
	else {
		var hdnObj = createInput(fObjName, "hidden", w);
		hdnObj.value = fObjValue;
		f.appendChild(hdnObj);
	}
}

function _scan_dblcmb(f) {
	var e = f.elements;
	for (var i=0; i<e.length; i++) {
		var cmbsel_name = e[i].name;
		if (cmbsel_name.search(/_.*_sel/) != -1) {
			var fname = cmbsel_name.replace(/^_|_sel$/g, "");
			var o = e[cmbsel_name].options;
			var val = "";
			for (var j=0; j<o.length; j++)
				val += ((val != "") ? "," : "") + o[j].value;
			//document.getElementById(fid).value = val;
			setup_hidden(f, fname, val);
		}
	}
}

function _scan_multicmb(f) {
	var e = f.elements;
	for (var i=0; i<e.length; i++) {
		var cmbsel_name = e[i].name;
		if (cmbsel_name.search(/_.*_multi/) != -1) {
			var fname = cmbsel_name.replace(/^_|_multi$/g, "");
			var o = e[cmbsel_name].options;
			var val = "";
			for (var j=0; j<o.length; j++) {
				if (o[j].selected)
					val += ((val != "") ? "," : "") + o[j].value;
			}
			//document.getElementById(fid).value = val;
			setup_hidden(f, fname, val);
		}
	}
}

function _reload(f, callobj) {
	_scan_dblcmb(f);
	_scan_multicmb(f);
	setup_hidden(f, "_doreload", "1");
	if (exist(callobj)) {
		if (exist(callobj.id))
			f.action += "#" + callobj.id;
	}
	f.submit();
}

function _dblcmb_search(seId, minChars) {
	var se = document.getElementById(seId);
	var srch_str = se.value;
	if (srch_str.length < minChars) {
		alert("Per eseguire una ricerca inserire almeno "+minChars+" caratteri.");
		return;
	}
	var srch_str_nojolly = srch_str.replace(/(\*|%)/, "");
	if (srch_str_nojolly.length < minChars) {
		alert("Per eseguire una ricerca inserire almeno "+minChars+" caratteri, non jolly (*,%).");
		return;
	}

	var f = se.form;
	_reload(f);
}

function translateser(instr, protect) {
	var transtable = new Array();
	transtable["\""] = "&a@";
	transtable[":"] = "&c@";
	transtable[";"] = "&s@";

	var outstr = instr;
	if (protect) {
		for (i in transtable) {
			re = new RegExp(i, "g");
			outstr = outstr.replace(re, transtable[i]);
		}
	}
	else {
		for (i in transtable) {
			re = new RegExp(transtable[i], "g");
			outstr = outstr.replace(re, i);
		}
	}
	return outstr;
}

function unserializecombo(f, cmbName) {
	var cmbObj = f.elements[cmbName];
	var ser_hdnObj = f.elements[cmbName + "_ser"];

	if (ser_hdnObj
			&& cmbObj
			&& ((cmbObj.type == "select-one")
				|| (cmbObj.type == "select-multiple")
			)
		)
	{
		var serData = ser_hdnObj.value;
		if (serData.length > 0)
		{
			var arrData = serData.split(";");
			for (var i=0; i<arrData.length; i++)
			{
				optData = arrData[i].split(":");
				cmbObj.options[i] = new Option(
						translateser(optData[1], false)
						,translateser(optData[0], false)
					);
			}
		}
	}
}

function serializecombo(f, cmbName) {
	var cmbObj = f.elements[cmbName];
	if (cmbObj
			&& ((cmbObj.type == "select-one")
				|| (cmbObj.type == "select-multiple")
			)
		)
	{
		var optObj = cmbObj.options;
		var serData = "";
		for (var i=0; i<optObj.length; i++)
		{
			serData += ((serData != "") ? ";" : "")
				+ translateser(optObj[i].value, true)
				+ ":" + translateser(optObj[i].text, true);
		}
		setup_hidden(f, cmbName + "_ser", serData);
	}
}

function xmlunentities(xmlval) {
	xmlval = xmlval.replace(/&#([0-9]+);/g, function getAscii(str0, str1) {return String.fromCharCode(str1)});
	return xmlval;
}

var STR_PAD_LEFT = 1;
var STR_PAD_RIGTH = 2;
var STR_PAD_BOTH = 3;

function strpad(length, padstr, padtype) {
	var pcl = 0;
	var pcr = 0;
	var str = this;
	var addlen = length - this.length;
	switch (nvl(padtype, STR_PAD_RIGTH)) {
		case STR_PAD_LEFT:
			pcl = addlen;
			break;
		case STR_PAD_RIGTH:
			pcr = addlen;
			break;
		case STR_PAD_BOTH:
			pcr = Math.ceil(addlen / 2);
			pcl = addlen - pcr;
			break;
	}
	for (var i=0; i<pcl; i++)
		str = padstr + str;

	for (var i=0; i<pcr; i++)
		str += padstr;

	return str;
}

String.prototype.pad = strpad;

function strip(input, chars) {  // strip all characters in 'chars' from input
	var output = "";  // initialise output string
	for (var i=0; i < input.length; i++)
		if (chars.indexOf(input.charAt(i)) == -1)
			output += input.charAt(i);
	return output;
}

function separate(input, separator) {  // format input using 'separator' to mark 000's
	input = "" + input;
	var output = "";  // initialise output string
	for (var i=0; i < input.length; i++) {
		if (i != 0 && (input.length - i) % 3 == 0) output += separator;
		output += input.charAt(i);
	}
	return output;
}

// CONSTANTS
var separator = ".";  // use comma as 000's separator
var decpoint = ",";  // use period as decimal point
var percent = "%";
var currency = "";  // use dollar sign for currency
var isEuro = decpoint == ",";

function formatNumber(number, format, print) {  // use: formatNumber(number, "format")
	if (print) document.write("formatNumber(" + number + ", \"" + format + "\")<br>");
	if (number) number = number.toString();
		else number = "0";
	if (isEuro) number = number.replace(",", ".");

	if (number - 0 != number) return null;  // if number is NaN return null
	var useSeparator = format.indexOf(separator) != -1;  // use separators in number
	var usePercent = format.indexOf(percent) != -1;  // convert output to percentage
	var useCurrency = format.indexOf(currency) != -1;  // use currency format
	var isNegative = (number < 0);

	number = Math.abs (number);
	if (usePercent) number *= 100;
	format = strip(format, separator + percent + currency);  // remove key characters
	number = "" + number;  // convert number input to string
	if (isEuro) number = number.replace(".", ",");

	// split input value into LHS and RHS using decpoint as divider
	var dec = number.indexOf(decpoint) != -1;
	var nleftEnd = (dec) ? number.substring(0, number.indexOf(decpoint)) : number;
	var nrightEnd = (dec) ? number.substring(number.indexOf(decpoint) + 1) : "";

	// split format string into LHS and RHS using decpoint as divider
	dec = format.indexOf(decpoint) != -1;
	var sleftEnd = (dec) ? format.substring(0, format.indexOf(decpoint)) : format;
	var srightEnd = (dec) ? format.substring(format.indexOf(decpoint) + 1) : "";
	// adjust decimal places by cropping or adding zeros to LHS of number
	if (srightEnd.length < nrightEnd.length) {
		var nextChar = nrightEnd.charAt(srightEnd.length) - 0;
		nrightEnd = nrightEnd.substring(0, srightEnd.length);
		if (nextChar >= 5) nrightEnd = "" + ((nrightEnd - 0) + 1);  // round up

		// patch provided by Patti Marcoux 1999/08/06
		while (srightEnd.length > nrightEnd.length) {
			nrightEnd = "0" + nrightEnd;
		}

		if (srightEnd.length < nrightEnd.length) {
			nrightEnd = nrightEnd.substring(1);
			nleftEnd = (nleftEnd - 0) + 1;
		}
	}
	else {
		for (var i=nrightEnd.length; srightEnd.length > nrightEnd.length; i++) {
			if (srightEnd.charAt(i) == "0") nrightEnd += "0";  // append zero to RHS of number
			else break;
		}
	}

	// adjust leading zeros
	sleftEnd = strip(sleftEnd, "#");  // remove hashes from LHS of format
	while (sleftEnd.length > nleftEnd.length) {
		nleftEnd = "0" + nleftEnd;  // prepend zero to LHS of number
	}

	if (useSeparator) nleftEnd = separate(nleftEnd, separator);  // add separator
	var output = nleftEnd + ((nrightEnd != "") ? decpoint + nrightEnd : "");  // combine parts
	output = ((useCurrency) ? currency : "") + output + ((usePercent) ? percent : "");
	if (isNegative) {
		// patch suggested by Tom Denn 25/4/2001
		output = (useCurrency) ? "(" + output + ")" : "-" + output;
	}
	return output;
}

////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////

function Quicksort(vec, loBound, hiBound) {
	var pivot, loSwap, hiSwap, temp;

	// Two items to sort
	if (hiBound - loBound == 1) {
		loOptTxt = vec[loBound].text;
		hiOptTxt = vec[hiBound].text;
		if (loOptTxt > hiOptTxt) {
			temp = new Option(vec[loBound].text, vec[loBound].value);
			vec[loBound] = new Option(vec[hiBound].text, vec[hiBound].value);
			vec[hiBound] = temp;
		}
		return;
	}

	// Three or more items to sort
	pivotIdx = parseInt((loBound + hiBound) / 2, 10);
	pivot = new Option(vec[pivotIdx].text, vec[pivotIdx].value);
	vec[pivotIdx] = new Option(vec[loBound].text, vec[loBound].value);
	vec[loBound] = pivot;
	loSwap = loBound + 1;
	hiSwap = hiBound;

	do {
		// Find the right loSwap
		while (loSwap <= hiSwap && vec[loSwap].text <= pivot.text)
			loSwap++;

		// Find the right hiSwap
		while (vec[hiSwap].text > pivot.text)
			hiSwap--;

		// Swap values if loSwap is less than hiSwap
		if (loSwap < hiSwap) {
			temp = new Option(vec[loSwap].text, vec[loSwap].value);
			vec[loSwap] = new Option(vec[hiSwap].text, vec[hiSwap].value);
			vec[hiSwap] = temp;
		}
	} while (loSwap < hiSwap);

	vec[loBound] = new Option(vec[hiSwap].text, vec[hiSwap].value);
	vec[hiSwap] = pivot;

	// Recursively call function...  the beauty of quicksort

	// 2 or more items in first section
	if (loBound < hiSwap - 1)
		Quicksort(vec, loBound, hiSwap - 1);

	// 2 or more items in second section
	if (hiSwap + 1 < hiBound)
		Quicksort(vec, hiSwap + 1, hiBound);
}

function SortCombo(cmbObj) {
	var cmbOpts = new Array();
	cmbOpts = cmbObj.options;
	loBound = 0;
	hiBound = cmbOpts.length-1;
	if (hiBound-loBound > 0)
		Quicksort(cmbOpts, loBound, hiBound);
	for(var i=0; i<cmbOpts.length; i++)
		cmbObj.options[i] = new Option(cmbOpts[i].text, cmbOpts[i].value);
}

function LeftToRightAll(lSel, rSel, doSort) {
	doSort = nvl(doSort, true);
	for (var i=0; i<lSel.options.length; i++) {
		var Opt = lSel.options[i];
		var newOpt = new Option(Opt.text, Opt.value);

		if(Opt.value != "0") {	// !separator
			rSel.options[rSel.options.length] = newOpt;
			lSel.options[i--] = null;
		}
	}
	if (doSort)
		SortCombo(rSel);
}

function RightToLeftAll(lSel, rSel, doSort) {
	doSort = nvl(doSort, true);
	for(var i=0; i<rSel.options.length; i++) {
		var Opt = rSel.options[i];
		var newOpt = new Option(Opt.text, Opt.value);

		if(Opt.value != "0") {	// !separator
			lSel.options[lSel.options.length] = newOpt;
			rSel.options[i--] = null;
		}
	}
	if (doSort)
		SortCombo(lSel);
}

function LeftToRight(lSel, rSel, doSort) {
	doSort = nvl(doSort, true);
	for(var i=0; i<lSel.options.length; i++) {
		var Opt = lSel.options[i];
		var newOpt = new Option(Opt.text, Opt.value);

		if(Opt.selected) {
			if(Opt.value < 0) {	// separator
				Opt.selected = false;
			}
			else {
				rSel.options[rSel.options.length] = newOpt;
				lSel.options[i--] = null;
			}
		}
	}
	if (doSort)
		SortCombo(rSel);
}

function RightToLeft(lSel, rSel, doSort) {
	doSort = nvl(doSort, true);
	for(var i=0; i<rSel.options.length; i++) {
		var Opt = rSel.options[i];
		var newOpt = new Option(Opt.text, Opt.value);

		if(Opt.selected) {
			if(Opt.value < 0) {	// separator
				Opt.selected = false;
			}
			else {
				lSel.options[lSel.options.length] = newOpt;
				rSel.options[i--] = null;
			}
		}
	}
	if (doSort)
		SortCombo(lSel);
}

function isEmptyElement(e) {
	if (e && !e.disabled) {
		var t = e.type.toLowerCase();
		switch (t) {
			case "checkbox":
				return false;
				break;
			case "select-one":
				return (e.options[e.selectedIndex].value == "");
				break;
			case "select-multiple":
				return (e.selectedIndex == -1);
				break;
			default:
				return (e.value.replace(/\s+/g, "") == "");
		}
	}
	else
		return false;
}

// SMART TABLE FUNCTIONS
function orderresult(formname, name) {
	var f;
	var pos;

	if (formname != "")
		f = document.forms[formname];
	else
		f = document.forms[0];
	f.orderfield.value = name;
	f.submit();
}


function openMasterPlan(path) {
	openPopup(path+"masterplan.php", "Masterplan", 1024, 768, "no", "no");
}

function doClose() {
	window.close();
}

function openRecord(tablename, id, param)  {
   openPopup('upd'+tablename+'.php?id='+id, tablename, 400, 400);
}

function addRecord(tablename, param)  {
   openPopup('insert'+tablename+'.php?' + param, tablename, 400, 400);
}

function smt_stdadd(url, params)
{

}

function gonext(formname) {
        var f;
        var pos;
        f = document.forms[formname];

        pos = f.pageposition.value;
        if (pos != "")
            f.pageposition.value++;

		  f.submit();
}

function goprevious(formname) {
        var f;
        var pos;
        f = document.forms[formname];
        pos = f.pageposition.value;
        if (pos != "")
                f.pageposition.value--;
        f.submit();
}

function golast(formname) {
        var f;
        var last;
        var pos;

        f = document.forms[formname];
        last = f.lastpage.value;
        f.pageposition.value = last;
        f.submit();
}

function gofirst(formname) {
        var f;
        var pos;

        f = document.forms[formname];
        f.pageposition.value = 1;
        f.submit();
}

function gopageposition(formname) {
        var f;
        var pos;

        f = document.forms[formname];
        pos = f.pagelocation.value;
		  if ((pos > 0) && (pos <= f.lastpage.value)) {
				f.pageposition.value = pos;
            f.submit();
        } else {
            f.pageposition.value = f.pageposition.value;
        }
};
// Inizio aggiunta di Luca
function e(n) {
	window.open("../documenti/createDoc.php?parSezID="+n,'wndNewDoc','width=600,height=500,resizable=yes,scrollbars=yes,toolbar=no,status=yes,location=no,left=100,top=30');
};
// Fine aggiunta di Luca


function apriAnagrafica(){
	openPopup('../anagrafica/anagrafica.php', 'Anagrafica', 500, 400, 'yes', 'yes');
}


/////////////////////// SMART TABLE FUNCTIONS ///////////////////////
// Funzioni della SmartTable sincronizzare con
// quelle presenti in smarttable.inc.php
var SMT_FIRST = 1;
var SMT_PREV = 2;
var SMT_NEXT = 3;
var SMT_LAST = 4;
var SMT_PAGE = 5;
var SMT_ORDER = 6;

function smtorderby(col, formname, smtId) {
	var f = document.forms[nvl(formname, 0)];
	setup_hidden(f, "_smtorderby"+smtId, col);
	setup_hidden(f, "_smtfunction"+smtId, SMT_ORDER);
	f.submit();
}

function smtopenrec(tablename, id)  {
   openPopup(tablename+".php?id="+id, tablename, 650, 600);
}

function smtaddrec(tablename)  {
   openPopup(tablename+".php", tablename, 650, 600);
}


function smtgotopage(smtfunction, formname, smtId) {
	var f = document.forms[nvl(formname, 0)];
	if (f.elements["_smtpagepos"+smtId])
		var page = nvl(f.elements["_smtpagepos"+smtId].value, 1);

	switch (smtfunction) {
		case SMT_FIRST:
			page = 1;
			break;
		case SMT_PREV:
			page--;
			break;
		case SMT_NEXT:
			page++;
			break;
		case SMT_LAST:
			page = f.elements["_smtlastpage"+smtId].value;
			break;
	}

	if (f.elements["_smtpagepos"+smtId])
		f.elements["_smtpagepos"+smtId].value = page;
	setup_hidden(f, "_smtfunction"+smtId, smtfunction);
	f.submit();
}

function smtdetaddrec(w, f, rec) {
	setup_hidden(f, '_smtaddrec', rec, w);
}

// Implementa il check-all
function smtcheckall(elementname, formname, smtId) {
	var f = document.forms[formname];
	var ischecked = nvl(getFieldValue(f.elements["_smtcheckedall"+smtId]), 0);
	for (i=0;  i<f.elements.length; i++) {
		var el = f.elements[i];
		if ((el.type == "checkbox") && (el.name.indexOf(elementname) != -1))
			el.checked = !(ischecked == 1);
	}
	setup_hidden(f, "_smtcheckedall"+smtId, (ischecked == 1) ? 0 : 1);
}


///////////////////// SMART TABLE FUNCTIONS END /////////////////////

// Funzione per le ricerche. Se esiste la funzione _beforesearch questa viene chiamata
// Questa funzione deve ritornare un dato booleano. La ricerca viene eseguita se true.
function _search(f, resetpag) {
	if (typeof f == 'undefined')
		f = document.forms["_fsearch"];
	var dosearch = true;
	// Se JSDEBUG e' true allora la funzione _beforesearch viene chiamata
	// direttamente in modo da generare eventuali errori javascript
	if (typeof(_beforesearch) == "function") {
		dosearch = _beforesearch(f);
	}
	if (dosearch) {
		setup_hidden(f, "_dosearch", 1);
		f.action = f.elements["formaction"].value;
		f.target = self.name;
		if (resetpag)
			setup_hidden(f, "_smtpagepos", 1);
		f.submit();
	}
}

function _testsaving(f, errMsg)
{
	var errMsg = nvl(errMsg, "");
	// Se il messaggio d'errore contiene anche dei messaggi di conferma
	// Ovvero messaggi racchiusi tra :confirm: ad esempio:
	// ":confirm:Sei sicuro di voler proseguire?:confirm:"
	// Questi vengono caricati nell'array confirmMsgs tramite
	// string.match() e rimossi dal messaggio d'errore.
	var confirmMsgs = "";
	if (errMsg.indexOf(":confirm:") != -1) {
		confirmMsgs = errMsg.match(/:confirm:(.*)?:confirm:/ig);
		for (var i = 0; i < confirmMsgs.length; i++) {
			errMsg = errMsg.replace(confirmMsgs[i], "");
		}
	}
	errMsg += _ctldata(f);
	if ((errMsg != "") && (errMsg != "_STOP")) {
		errMsg = errMsg.replace("_STOP", "");
		alert(ParseError(errMsg));
		return false;
	}
	else {
		if (errMsg != "_STOP") {
			var doSave = true;
			// Viene eseguito un ciclo sui messaggi di conferma
			if (confirmMsgs != "") {
				for (var i = 0; i < confirmMsgs.length; i++) {
					doSave = confirm(ParseError(confirmMsgs[i].replace(/:confirm:/ig, "")));
					if (!doSave)
						break;
				}
			}
		}
		else {
			var doSave = false;
		}
		return doSave;
	}
}

function _savedata(f, errMsg) {
	/*var errMsg = nvl(errMsg, "");
	// Se il messaggio d'errore contiene anche dei messaggi di conferma
	// Ovvero messaggi racchiusi tra :confirm: ad esempio:
	// ":confirm:Sei sicuro di voler proseguire?:confirm:"
	// Questi vengono caricati nell'array confirmMsgs tramite
	// string.match() e rimossi dal messaggio d'errore.
	var confirmMsgs = "";
	if (errMsg.indexOf(":confirm:") != -1) {
		confirmMsgs = errMsg.match(/:confirm:(.*)?:confirm:/ig);
		for (var i = 0; i < confirmMsgs.length; i++) {
			errMsg = errMsg.replace(confirmMsgs[i], "");
		}
	}
	errMsg += _ctldata(f);
	if ((errMsg != "") && (errMsg != "_STOP")) {
		errMsg = errMsg.replace("_STOP", "");
		alert(ParseError(errMsg));
		return false;
	}
	else {
		if (errMsg != "_STOP") {
			var doSave = true;
			// Viene eseguito un ciclo sui messaggi di conferma
			if (confirmMsgs != "") {
				for (var i = 0; i < confirmMsgs.length; i++) {
					doSave = confirm(ParseError(confirmMsgs[i].replace(/:confirm:/ig, "")));
					if (!doSave)
						break;
				}
			}
		}
		else {
			var doSave = false;
		}*/
		var doSave = _testsaving(f, errMsg);
		if (doSave) {
			setup_hidden(f, '_dosave', '1');
			f.submit();
			return true;
		}
		else
			return false;
	//}
}

// Funzione per il salvataggio dati. Se esiste la funzione _beforesave questa
// viene chiamata. Questa funzione deve ritornare un stringa. Se la stringa
// e' vuota il salvataggio viene eseguito, in caso contrario la stringa viene
// concatenata a quelle generate dai controlli standard e viene mostrato il
// messaggio d'errore senza salvare.
function std_save(f, errMsg) {
	var errMsg = nvl(errMsg, "");
	// Se JSDEBUG e' true allora la funzione _beforesave viene chiamata
	// direttamente in modo da generare eventuali errori javascript
	if (typeof(_beforesave) == "function") {
		errMsg += _beforesave(f);
	}
	_scan_dblcmb(f);
	_scan_multicmb(f);
	_savedata(f, errMsg);
}

function std_save_butt(fname) {
	var f = document.forms[fname];
	std_save(f);
}


// Rimuove l'utima pagina dallo stack delle chiamate se questa e' la
// pagina stessa
function removeselfpage(f) {
	var backpages = getFieldValue(f.elements["_backpages"]);
	var pageself = getFieldValue(f.elements["_pageself"]);
	var srchStr = new RegExp("\\|\\|"+pageself+"$");
	setFieldValue(f.elements["_backpages"], backpages.replace(srchStr, ""));
}


function getBackPage(element) {
	var pos = element.value.lastIndexOf("||");
	var pagpre;
	if (pos != -1) {
		pagpre = element.value.substr(pos+2);
		element.value = element.value.substr(0, pos);
	}
	else {
		pagpre = element.value;
		element.value = "";
	}
	return pagpre;
}

function createBackForm(fData) {
	var fBack = createForm("_backfrm");
	setup_hidden(fBack, "_backdata", getFieldValue(fData.elements["_backdata"]));
	setup_hidden(fBack, "_backpages", getFieldValue(fData.elements["_backpages"]));
	setup_hidden(fBack, "_lastpage", getFieldValue(fData.elements["_lastpage"]));
	return fBack;
}

function _goback(fData) {
//	var fBack = createForm("_backfrm");
//	fBack.action = getPaginaPrecedente(fData.elements['paginaprecedente']);
//	setup_hidden(fBack, "_backdata", fData.elements["_backdata"].value);
//	fBack.submit();
	var fBack;
	if (fData.name == "_backfrm")
		fBack = fData;
	else
		fBack = createBackForm(fData);
	fBack.action = getBackPage(fBack.elements["_backpages"]);
	setup_hidden(fBack, "_isback", "1");
	//fData.action = getPaginaPrecedente(fData.elements['paginaprecedente']);
	//fBack.submit();
	fBack.submit();
}

// Funzione per tornare indietro. Se esiste la funzione _beforegoback questa
// viene chiamata. Questa funzione deve ritornare un dato booleano. Il ritorno
// viene eseguito se true.
function std_goback(fData) {
	// Se JSDEBUG e' true allora la funzione _beforegoback viene chiamata
	// direttamente in modo da generare eventuali errori javascript
	var dogoback = true;
	if (typeof(_beforegoback) == "function") {
		dogoback = _beforegoback(fData);
	}
	if (dogoback)
		_goback(fData);
}

function std_goback_butt(fname) {
	var f = document.forms[fname];
	removeselfpage(f);
	std_goback(f);
}

function _execreport(f, errMsg) {
	var errMsg = nvl(errMsg, "");
	errMsg += _ctldata(f);
	if (errMsg != "") {
		alert(errMsg);
		return false;
	}
		else {
		setup_hidden(f, "_doreport", "1");
		var oldtarget = f.target;
		var oldaction = f.action;
		//function openPopup(URL, Name, width, height, resizable, scrollbars, left, top,toolbar) {
		var wPop = openPopup("../lib/blank.htm", "Report", 700, 500,"yes","yes",100,100,"1");
		f.target = wPop.name;
		f.submit();
		f.target = oldtarget;
		f.action = oldaction;
		return true;
	}
}

// Funzione per l'esecuzione dei report. Se esiste la funzione
// _beforeexecreport questa viene chiamata. Questa funzione deve
// ritornare una stringa. Il report viene eseguito se la stringa
// e' vuota altrimeti viene mostrato un messaggio d'errore, ovvero
// la stringa ritornata.
function std_execreport(f) {
	var errMsg = "";
	// Se JSDEBUG e' true allora la funzione _beforeexecreport viene chiamata
	// direttamente in modo da generare eventuali errori javascript
	if (typeof(_beforeexecreport) == "function") {
		errMsg += _beforeexecreport(f);
	}
	_execreport(f, errMsg);
}

function std_execreport_butt(fname) {
	var f = document.forms[fname];
	std_execreport(f);
}

// Funzioni per ridurre ed espandere le combo in IE
// Esempio di utilizzo:
//<select name="sname"
//   onmouseover="expandCombo(this, 'auto')"
//   onmouseout="reduceComboMouseOut(this, '100px')"
//   onfocusin="setComboActive(this)"
//   onfocusout="reduceCombo(this, '100px')
//></select>
var activeElement = "";
var overElement = ""

function setComboActive(cmbObj) {
	if (isIE) {
		activeElement = cmbObj.name;
	}
}

function reduceComboMouseOut(cmbObj, dim) {
	if (isIE) {
		if (activeElement != cmbObj.name) {
			setTimeout(function () {cmbObj.style.width = dim;}, 200);
			overElement = "";
		}
	}
}

function expandCombo(cmbObj, dim) {
	if (isIE) {
		overElement = cmbObj.name;
		setTimeout(function(){if(overElement == cmbObj.name) cmbObj.style.width=dim;}, 200);
	}
}

function reduceCombo(cmbObj, dim) {
	if (isIE) {
		cmbObj.style.width = dim;
		activeElement = "";
	}
}
// Fine funzioni per ridurre ed espandere le combo in IE

function OverRow(objrow)
{
	objrow.className += "__over";
}

function OutRow(objrow)
{
	objrow.className = objrow.className.replace("__over", "");
}

function getPaginaPrecedente(element) {
	var pos = element.value.lastIndexOf(",");
	var pagpre;

	if (pos != -1) {
	  pagpre = element.value.substr(pos+1);
	  element.value = element.value.substr(0,pos);
	} else {
	  pagpre = element.value;
	}
	return pagpre;
}

//funzione utilizzata per visualizzare o meno i campi riepilogativi nel footer

function visualizzaInf(el,num){
	/*var display = el.style.display ? '' : 'none';
	el.style.display = display;*/
	switch (num){
		case 1:
			el.style.display = '';
			document.getElementById("footimg").style.display = 'none';
			document.getElementById("contrai").style.display = '';
			break;
		case 0:
			el.style.display = 'none';
			document.getElementById("footimg").style.display = '';
			document.getElementById("contrai").style.display = 'none';
			break;
	}

}

function CalcolaRis(path){
if (parseInt(navigator.appVersion) > 3){
   	if (screen.width <= 1024){

			document.body.style.backgroundImage ='url('+path+'sfondo1.jpg)';
			document.body.style.repeat = 'repeat';
			document.body.style.backgroundAttachment='fixed';
		}else{
			document.body.style.backgroundImage ='url('+path+'sfondo2.jpg)';
			document.body.style.repeat = 'repeat';
			document.body.style.backgroundAttachment='fixed';
		}
   }else{
		document.body.style.backgroundImage ='url('+path+'sfondo1.jpg)';
		document.body.style.repeat = 'repeat';
		document.body.style.backgroundAttachment='fixed';
	}

}


function chiudi(){
	window.close();
};

function PlaceToolbar(){
	var path = "../images/";
	var toolbar = document.getElementById("toolbar");
	var footer = document.getElementById("foot");
	var content =  document.getElementById("content");
	if (toolbar) {
		content.style.bottom = "40px";
		footer.style.height = "40px";
		if (isIE){
			content.style.borderBottom = "40px solid #ffffff";
			if (screen.width <= 1024){
				footer.style.backgroundImage = 'url('+path+'bottom1.jpg)';
				footer.style.backgroundPosition = "bottom left";
			}else{
				footer.style.backgroundImage = 'url('+path+'sfondo2.jpg)';
				footer.style.backgroundPosition = "bottom left";
			}
		}
		footer.innerHTML = toolbar.innerHTML;
	}
	else {
		content.style.bottom = "1px";
		footer.style.height = "1px";
	}
}

function PlaceToolbarPopUp(){
	var path = "../images/";
	var toolbar = document.getElementById("toolbar");
	var footer = document.getElementById("footPop");
	var content =  document.getElementById("contentPop");
	if (toolbar){
		content.style.bottom = "40px";
		footer.style.height = "40px";
		if (isIE){
			content.style.borderBottom = "40px solid #ffffff";
			if (screen.width <= 1024){
				footer.style.backgroundImage = 'url('+path+'bottom1.jpg)';
				footer.style.backgroundPosition = "bottom left";
			}else{
				footer.style.backgroundImage = 'url('+path+'sfondo2.jpg)';
				footer.style.backgroundPosition = "bottom left";
			}
		}
		footer.innerHTML = toolbar.innerHTML;
	}
	else {
		content.style.bottom = "1px";
		footer.style.height = "1px";
	}
}

function doDelete(f, hid) {
	if (!confirm(ParseError(errorMessages['DEL']))) return;
	f.action += "?toDelete=" + hid;
	f.submit();
}

function doSubmitWF(f) {
	//if (!confirm(ParseError(errorMessages['WFSUB']))) return ;
	if (!confirm("Continue")) return ;
	f.action += "?toSubmit=1";
	f.submit();
}

// ---------------- COOKIES

function createCookieWin(win, name,value,days)
{
	if (days)
	{
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	win.document.cookie = name+"="+value+expires+"; path=/";
}

function readCookieWin(win, name)
{
	var nameEQ = name + "=";
	var ca = win.document.cookie.split(';');
	for(var i=0;i < ca.length;i++)
	{
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function createCookie(name,value,days)
{
	createCookieWin(self, name,value,days);
}

function readCookie(name)
{
	return readCookieWin(self, name);
}

function _switchFileIface(fId)
{
	var fOpO = document.getElementById("fileoper_"+fId);
	var fInO = document.getElementById("fileinput_"+fId);
	if (fOpO.style.display == '') {
		fOpO.style.display = 'none';
		fInO.style.display = '';
	}
	else {
		fOpO.style.display = ''
		fInO.style.display = 'none';
	}
}

function _deleteFile(fId)
{
	var frms = document.forms;
	for (var fc = 0; fc < frms.length; fc++) {
		if (frms[fc].elements[fId])
			setFieldValue(frms[fc].elements[fId], "");
		if (frms[fc].elements["curr_"+fId]) {
			setFieldValue(frms[fc].elements["curr_"+fId], "");
			setup_hidden(frms[fc], "delfile_"+fId, 1);
		}
	}
	document.getElementById("fileoper_"+fId).style.display = 'none';
	document.getElementById("fileeditico_"+fId).style.display = 'none';
	document.getElementById("fileinput_"+fId).style.display = '';
}


// ---- PAGE BUILDER ----
function pbgoto(pbwhere)
{
	var f = document.forms["pbfrm"];
	var e = f.elements;
	var errMsg = "";
	var privacyOk = true;
	if (e["privacy"]) {
		privacyOk = (getFieldValue(e["privacy"]) == 1);
	}
	if (privacyOk)
		setup_hidden(f, "pbwhere", pbwhere);
	else
		errMsg = "Acconsentire al trattamento dei dati personali" + JS_NWL;

	if (getFieldValue(e["ispreview"]) == 1) {
		if (_testsaving(f, errMsg))
			alert('Test avvenuto con successo');
	}
	else {
		if (document.forms["pbgetvars"]) {
			var e1 = document.forms["pbgetvars"].elements;
			f.action = f.action.replace(/\?.*/, "");
			for (i=0; i<e1.length; i++) {
				f.action += (i == 0) ? "?" : "&";
				f.action += e1[i].name + "=" + escape(e1[i].value);
			}
			//alert(f.action)
		}
		//console.log(f.action);
		std_save(f, errMsg);
	}
}

function apriZenShare(fieldNameOnDb, fieldName) {
  var directoryid = document.forms[0].elements[fieldNameOnDb].value;
  openPopup(
    "../admin_zenshare/index.php?first=1parArgID=1&field=" + fieldName + "&parSezID=" + directoryid,
    "izcmDir", 800, 600, "yes", "no", 100, 100, "no")
}

function eliminaLinkZenshare(fieldNameOnDb, fieldName) {
  document.forms[0].elements[
      izcmDirectory_idField[fieldName]
    ].value = "";
    document.forms[0].elements[
      izcmDirectory_directoyField[fieldName + "_DIRECTORY"]
    ].value = "";
}