

//<script>

/* Definitions */
function EmptyFunction(){};
function NullFunction(){return null};

/* Is functions */
function IsNull(o){return o===null}
function IsEmpty(o)
{
	if (o==null || o==="")
		return true;
	if (IsArray(o))
	{
		for(var i in o)
			return false;
		return true;
	}
	return false;
}
function IsBoolean(o){return typeof o=="boolean"}
function IsNumber(o){return typeof o=="number"}
function IsString(o){return typeof o=="string"}
function IsFunction(o){return typeof o=="function"}
function IsDate(o){return o instanceof Date}
function IsArray(o){return o instanceof Array}
function IsRegExp(o){return o instanceof RegExp}
function IsObject(o){return o instanceof Object}
function IsStrictObject(o){return IsObject() && !(IsDate(o) || IsArray(o) || IsRegExp(o))}
function TypeOf(o)
{
	if (o===null)
		return "null";
	var result = typeof o;
	if (result == "object")
	{
		if (o instanceof RegExp) return "regexp";
		if (o instanceof Date) return "date";
		if (o instanceof Array) return "array";
	}
	return result;
}
function IsInList(strItem, strList, sep)
{
	try
	{
		if (IsEmpty(strItem)) return false;
		if (IsEmpty(strList)) return false;
		if (IsEmpty(sep)) sep = ",";
		var l = strList.split(sep);
		for (var i=0; i<l.length; i++)
			if (Trim(strItem) == Trim(l[i]))
				return true;
	}
	catch(e){}
	return false;
}

/* Default functions */
function DefaultNullValue(value, defaultValue){return IsNull(value) ? defaultValue : value} 
function DefaultEmptyValue(value, defaultValue){return IsEmpty(value) ? defaultValue : value} 

/* Trim functions */
function TrimRight(s, c, nMax) 
{
	if (!IsEmpty(c))
	{
		var re;
		if (IsEmpty(nMax))
			re = new RegExp("("+ c +")*$","");
		else
			re = new RegExp("("+ c +"){0,"+nMax+"}$","");
		return s.replace(re, "");
	}
	else
		return s.replace(/(\s*)$/, "");
}
function TrimLeft(s, c, nMax)
{
	if (!IsEmpty(c))
	{
		var re;
		if (IsEmpty(nMax))
			re = new RegExp("^("+ c +")*","");
		else
			re = new RegExp("^("+ c +"){0,"+nMax+"}","");
		return s.replace(re, ""); 
	}
	else
		return s.replace(/^(\s*)/, "");
}
function Trim(s, c, nMax)
{ 
	if (!IsEmpty(c))
		return TrimRight(TrimLeft(s, c, nMax), c, nMax);
	else
		return TrimRight(TrimLeft(s));
}
function TrimSqlExpression(s){return Trim(s.replace(/'/g, "''"))}

/* Split */
function SplitLineHtml(html, lineCount, lineSize)
{
	var p = n = 0;
	var re = /(<p)|(<br)|(<hr)|(<span)|(<[^ &\/])/gi;
	var str = html.substr(0, lineCount*lineSize);
	var m = re.exec(str);
	while (m!==null)
	{
		switch (m[0].toLowerCase())
		{
			case '<p':
			case '<br':
			case '<hr':
				n++;
				break;
			case '<span':
				break;
			default:
				p = m.index;
		}
		if (n>=lineCount)
			p = m.index;
		if (p>0)
			break;
		m = re.exec(str);
	}
	if (p==0)
	{
		p = html.indexOf(' ', str.length);
		if (p<0)
			p = html.length;
	}
	return [html.substr(0, p), html.substr(p)];
}

/* Macros */
function MacroReplace(str, list, flag)
{
	if (flag == null) flag = "g";
	var re = "("+ list[0][0] +")";
	var val = [];
	val[list[0][0]] = list[0][1]
	for (var i=1; i<list.length; i++)
	{
		re += "|("+ list[i][0] +")";
		val[list[i][0]] = list[i][1]
	}
	re = new RegExp(re, flag);
	return str.replace(re, function($0){return val[$0]});
}

/* Debugging */
function DebugPoint(){if(window.confirm("Debug?")) window.ale(); return}
function DebugProperties(o){var p, str=TypeOf(o)+" with value: "+o+"\n"; for (p in o) str += p + " = " + o[p] + "\n"; return str }
var DebugDeepSeparator = "  ";
var DebugObjectFunction = false;
function DebugObject(o, maxDeep, bFunction)
{
	maxDeep = parseInt(maxDeep, 10);
	bFunction = bFunction == null ? DebugObjectFunction : bFunction;
	if (isNaN(maxDeep) || maxDeep<0) maxDeep = 0;
	var tab = arguments[3] == null ? "" : arguments[3];
	var level = arguments[4] == null ? 0 : arguments[4];
	var str = tab == "" ? tab + TypeOf(o) +" with value: "+ o +"\n" : "";
	if (maxDeep > 0 && maxDeep < level)
		return str;
	var p;
	try
	{
		for (p in o)
		{
			if (TypeOf(o[p]) == "object" || TypeOf(o[p]) == "array")
			{
				str += tab + p + " = " + TypeOf(o[p]) +" with value: "+ o[p] +"\n";
				str += DebugObject(o[p], maxDeep, bFunction, tab + DebugDeepSeparator, level+1);
			}
			else if (TypeOf(o[p]) == "function")
			{
				if (bFunction)
					str += tab + p + " = " + o[p] + "\n"; 
			}
			else
				str += tab + p + " = " + o[p] + "\n"; 
		}
	}
	catch(e){}
	return str;
}

/* Messages */
function MsgFormat(msg)
{
	try
	{
		for (var i=1; i<arguments.length; i++)
			msg = msg.replace(new RegExp("\\{"+(i-1)+"\\}", "g"), arguments[i])
		return msg;
	}
	catch(e){return msg}
}
function MsgException(e, prefix, bVerbose)
{
	var msg = "";
	if (IsEmpty(bVerbose)) bVerbose == false;
	try
	{
		if (!IsEmpty(prefix))
			msg += prefix;
		if (bVerbose)
			msg += DebugProperties(e);
		else
		{
			msg += "\nname = "+e.name;
			msg += "\nmessage = "+e.message;
		}
		return msg;
	}
	catch(e)
	{
		msg = Msg_ExceptionUnknown;
		if (!IsEmpty(prefix))
			msg = prefix+"\n"+msg;
		return msg;
	}
}

/* Clipboard */
var Clipboard = new Object();
Clipboard.text = "";
Clipboard.clearText = function()
{
	try	
	{ 
		Clipboard.text = "";
		window.clipboardData.clearData();
	}
	catch(e){}
}
Clipboard.setText = function(id, value)
{
	try
	{
		Clipboard.text = arguments.length > 1 ? id+":"+value : id;
		window.clipboardData.clearData("Text");
		window.clipboardData.setData("Text", Clipboard.text);
	}
	catch(e){}
}
Clipboard.getText = function(id)
{
	var result = "";
	try
	{
		Clipboard.text = window.clipboardData.getData("Text");
	}
	catch(e){}
	if (IsEmpty(id))
		return Clipboard.text;
	try
	{
		id += ":";
		if (Clipboard.text.slice(0, id.length) == id)
			return Clipboard.text.slice(id.length);
	}
	catch(e){}
	return "";
}

/* Cookie */
function CookieSet(name, value, date, path, domain, bSecure) 
{
	var result = escape(name) + "=" + escape(value) + ";";	
	if (date !== null)
	{
		if (IsEmpty(date)) 
			date = new Date(2029,10,30);
		result += " expires=" + date.toGMTString() + ";";
	}
	if ( path !== null )
	{
		if (IsEmpty(path)) 
			path = "/";
		result += " path=" + path + ";";
	}
	if (!IsEmpty(domain))
		result += " domain=" + domain + ";";
	if (!IsEmpty(bSecure) && bSecure)
		result += " secure;";
	document.cookie = result;
	return result;
}
function CookieGet(name) 
{
	// cookies are separated by semicolons
	var result = [];
	var i, crumb, list = document.cookie.split(/;\s*/);
	for (i=0; i < list.length; i++)
	{
		crumb = list[i].split("=");
		if (crumb.length > 0)
		{
			// a name/value pair (a crumb) is separated by an equal sign
			crumb[0] = unescape(crumb[0]);
			if (crumb.length > 1)
				crumb[1] = unescape(crumb[1]);
			else
				crumb[1] = "";
		}
		result[result.length] = crumb;	
	}
	if (IsEmpty(name))
		return result;
	for (i=0; i<result.length; i++)
		if (name == result[i][0])
			return result[i][1];
	// a cookie with the requested name does not exist
	return null;
}
function CookieDel(name) 
{
	var date=new Date(2000,10,30); 
	return CookieSet(name, "", date);
}

/* QueryString */
var QueryStringParams = null;
function QueryString(param)
{
	var i, tmp, result = [];
	if (QueryStringParams == null)
	{
		tmp = document.location.search.split(/[\?&]/);
		for (i=0; i<tmp.length; i++)
		{
			tmp[i] = tmp[i].split("=");
			tmp[i][0] = Utf8Unescape(tmp[i][0]);
			tmp[i][1] = Utf8Unescape(tmp[i][1]);
		}
		QueryStringParams = tmp;
	}
	if (IsEmpty(param))
		return QueryStringParams;
	for (i=0; i<QueryStringParams.length; i++)
	{
		if (param == QueryStringParams[i][0])
			result[result.length] = QueryStringParams[i][1];
	}
	return result;
}
function Utf8Escape(str)
{
	return IsEmpty(str) ? "" : escape(str).replace(/%(['A-Fa-f0-9]{2})/gi, "%u00$1");
}
function Utf8Unescape(str)
{
	return IsEmpty(str) ? "" : unescape(str.replace(/%u00/gi, "%"));
}

/* Page */
window.Init = EmptyFunction;
window.onload = function(){Page.init()};
var Page = new Object();
Page.loading = false;
Page.init = function()
{
	this.loading = true;
	var xml, name, r = null;
	try	
	{ 
		xml = document.forms[0].PageStatusElement.value;
		if (!IsEmpty(xml))
			for (;;)
			{
				r = __reOwner.exec(xml);
				if (r == null)
					break;
				name = __reName.exec(r[1]);
				if (name && name[1])
					this.status[name[1]] = r[1];
			}
	}
	catch(e){}
	window.Init();
	this.loading = false;
}
Page.submitting = false;
Page.submit = function (action, target)
{
	var i, o, s = t = "";
	Page.submitting = true;
	for (i in Page.status)
	{			
		try 
		{
			eval("o="+ i);
			t = o.status.serialize();
		}
		catch(e) { t = ""; }
		s += t;
	}
	try 
	{
		if (!IsEmpty(action))
			document.forms[0].action = action;
		document.forms[0].PageStatusElement.value = "<PageStatus>"+ s +"</PageStatus>";
		document.forms[0].target = target == null ? "_self" : target;
		document.forms[0].submit();
	}
	catch(e){}
	Page.submitting = false;
}
Page.status = new Object(); // Page.status.<ownerId> = <xmlOwnerString>

/* CStatus */
function CStatus(owner)
{
	this.owner = owner;
	this.clientStatus = new Object();
	this.serverRequest = new Object();
	this.serverResponse = new Object();
	this.beforeSerialize = EmptyFunction;
	this.afterDeserialize = EmptyFunction;
}
CStatus.prototype.subscribe = function(){ try { if (Page.status[this.owner] == undefined) Page.status[this.owner] = "";	} catch(e){} }
CStatus.prototype.unsubscribe = function(){ try { delete Page.status[this.owner] } catch(e){} }
CStatus.prototype.serialize = function()
{
	this.beforeSerialize();
	var p, t, result ='<owner n="'+ this.owner +'">';
	for (p in this.clientStatus)
	{
		result += '<client>'+ Serialize(this.clientStatus, "clientStatus") +'</client>';
		break;
	}
	for (p in this.serverRequest)
	{
		result += '<server>'+ Serialize(this.serverRequest, "serverRequest") +'</server>';
		break;
	}
	return result += '</owner>';
}
CStatus.prototype.deserialize = function()
{
	var r;
	r = Page.status[this.owner].match(__reClient);
	if (r && r[1])
		Deserialize(r[1], this.owner+".status")
	r = Page.status[this.owner].match(__reServer);
	if (r && r[1])
		Deserialize(r[1], this.owner+".status")
	this.afterDeserialize();
}

/* CArguments */
function CPageArguments(id)
{
	this.id = id;
	this.status = new CStatus(id);
	this.status.subscribe();
}

/* Serialization */
var __reString1 = /(&)|(<)|(>)|(')|(")|(\t)|(\n)|(\v)|(\f)|(\r)/gm;
var __reString2 = /(&x0009;)|(&x000A;)|(&x000B;)|(&x000C;)|(&x000D;)|(&quot;)|(&apos;)|(&gt;)|(&lt;)|(&amp;)/gm;
var __reTag = /(<(?:\s|\S)*?>)/gm;
var __reType = /<(\/?\S*)(\s|>)/m;
var __reName = /\sn="([^"]*)"/m;
var __reValue = /\sv="([^"]*)"/m;
var __reOwner = /(<owner(?:\s|\S)*?>(?:\s|\S)*?<\/owner>)/gi;
var __reClient = /(<client(?:\s|\S)*?>(?:\s|\S)*?<\/client>)/m;
var __reServer = /(<server(?:\s|\S)*?>(?:\s|\S)*?<\/server>)/m;
function SerializeString(s)
{
	return s.replace
	(
		__reString1,
		function($0)
		{
			switch($0)
			{
				case "&": return "&amp;";
				case "<": return "&lt;";
				case ">": return "&gt;";
				case "'": return "&apos;";
				case '"': return "&quot;";
				case "\t": return "&x0009;";
				case "\n": return "&x000A;";
				case "\v": return "&x000B;";
				case "\f": return "&x000C;";
				case "\r": return "&x000D;";
				default: return $0;
			}
		}
	)
}
function SerializeDate(d) { return d.getFullYear() +'-'+ ('0'+(d.getMonth()+1)).slice(-2) +'-'+ ('0'+d.getDate()).slice(-2) +' '+ ('0'+d.getHours()).slice(-2) +':'+ ('0'+d.getMinutes()).slice(-2) +':'+ ('0'+d.getSeconds()).slice(-2) +':'+ ('00'+d.getMilliseconds()).slice(-3) }
function Serialize(__o, __id)
{
	var __xml = arguments[2] == undefined ? "" : arguments[2];
	var __result = "";
	var __i;
	switch (TypeOf(__o))
	{
		case "number": return '<n n="'+ __id +'" v="'+ __o +'"/>';
		case "string": return '<s n="'+ __id +'" v="'+ SerializeString(__o) +'"/>';
		case "boolean": return '<b n="'+ __id +'" v="'+ (__o?1:0) +'"/>';
		case "date": return '<d n="'+ __id +'" v="'+ SerializeDate(__o) +'"/>';
		case "regexp": return '<r n="'+ __id +'" v="'+ SerializeString(__o.toString()) +'"/>';
		case "array": for (__i in __o) __result += Serialize(__o[__i], __i, __xml); return __xml += '<a n="'+ __id +'">'+ __result +'</a>';
		case "object": for (__i in __o) __result += Serialize(__o[__i], __i, __xml); return __xml += '<o n="'+ __id +'">'+ __result +'</o>';
		default: return "";
	}
}
function DeserializeString(s)
{
	if (s==null)
		return "";
	return s.replace
	(
		__reString2,
		function($0)
		{
			switch($0)
			{
				case "&amp;": return "&";
				case "&lt;": return "<";
				case "&gt;": return ">";
				case "&apos;": return "'";
				case "&quot;": return '"';
				case "&x0009;": return "\t";
				case "&x000A;": return "\n";
				case "&x000B;": return "\v";
				case "&x000C;": return "\f";
				case "&x000D;": return "\r";
				default: return $0;
			}
		}
	)
}
function DeserializeDate(s) { return new Date(parseInt(s.slice(0,4), 10), parseInt(s.slice(5,7), 10)-1, parseInt(s.slice(8,10), 10), parseInt(s.slice(11,13), 10), parseInt(s.slice(14,16), 10), parseInt(s.slice(17,19), 10), parseInt(s.slice(20,22), 10)) }
function Deserialize(__xml, __parentObjectId)
{
	__parentObjectId = __parentObjectId == null ? "" : __parentObjectId;
	var __i, __j, __k, __node;
	var __r = __xml.match(__reTag);
	for (__i=0; __i<__r.length; __i++)
	{
		__node = new Object();
		__node.type = __reType.exec(__r[__i]);
		if (__node.type)
			__node.type = __node.type[1];
		__node.name = __reName.exec(__r[__i]);
		if (__node.name)
			__node.name = __node.name[1];
		__node.value = __reValue.exec(__r[__i]);
		if (__node.value)
		{
			__node.value = __node.value[1];
			switch (__node.type)
			{
				case "n": __node.value = parseFloat(__node.value); break;
				case "s": __node.value = DeserializeString(__node.value); break;
				case "b": __node.value = __node.value = '1' ? true : false; break;
				case "d": __node.value = DeserializeDate(__node.value); break;
				case "r": __node.value = __node.value.toString(); break;
			}
		}
		__r[__i] = __node;
	}
	for (__i=0; __i<__r.length; __i++)
	{
		switch (__r[__i].type)
		{
			case "a":
				for (__j=__i+1, __k=0; __j<__r.length; __j++)
				{
					if (__r[__j].type == "/a" || __r[__j].type == "/o")
					{
						__k--;
						if (__k<=0 && __r[__j].type == "/a") break;
						continue;
					}
					if (__k==0)
					{
						if (isNaN(parseInt(__r[__j].name, 10)))
							__r[__j].name = __r[__i].name +'["'+ __r[__j].name +'"]';
						else
							__r[__j].name = __r[__i].name +'['+ __r[__j].name +']';
					}
					if (__r[__j].type == "a" || __r[__j].type == "o")
						__k++;
				}
				break;
			case "o":
				for (__j=__i+1, __k=0; __j<__r.length; __j++)
				{
					if (__r[__j].type == "/a" || __r[__j].type == "/o")
					{
						__k--;
						if (__k<=0 && __r[__j].type == "/o") break;
						continue;
					}
					if (__k==0)
						__r[__j].name = __r[__i].name +'.'+ __r[__j].name;
					if (__r[__j].type == "a" || __r[__j].type == "o")
						__k++;
				}
				break;
		}
	}
	if (__parentObjectId !== "")
	{
		if ( eval("typeof "+__parentObjectId) != "object" )
			eval( __parentObjectId +"= new Object()");
		__parentObjectId += ".";
	}
	for (__i=0; __i<__r.length; __i++)
	{
		switch (__r[__i].type)
		{
			case "n":
			case "s":
			case "b":
			case "d":
			case "r":
				eval(__parentObjectId + __r[__i].name +'= __r[__i].value'); 
				break;
			case "a":
				eval(__parentObjectId + __r[__i].name +"=[]");
				break;
			case "o":
				eval(__parentObjectId + __r[__i].name +"= new Object()");
				break;
		}
	}
}

/* Eventi */
Page.Event = new Object();
Page.Event.leftButton = function(e)
{
	if (window.event != null)
		return window.event.button == 1 ? true : false;
	else 
		return (e.which == 1 || e.button == 0) ? true : false;
}
Page.Event.rightButton = function(e)
{ 
	if (window.event != null)
		return window.event.button == 3 ? true : false;
	else
		return (e.which == 3 || e.button == 2) ? true : false;
}
Page.Event.metaKey = function(e)
{
	if (window.event != null)
		return window.event.altKey || window.event.ctrlKey || window.event.shiftKey;
	else
		return e.altKey || e.ctrlKey || e.shiftKey || e.metaKey;
}

/* Popup */
Page.Popup = new Object();
Page.Popup.active = null;
Page.Popup.opened = null;
Page.Popup.over = function (popup) { this.active = popup };
Page.Popup.out = function () { this.active = null };
Page.Popup.close = function () { if (this.active == null && this.opened != null) this.opened.close() };
Page.Popup.open = function (popup) { if (this.opened != null && this.opened != popup) this.opened.close(); this.opened = popup };

document.body.onmousedown = function (e)
{
	if ( Page.Event.metaKey(e) )
		return;
	if ( Page.Event.leftButton(e) )
		Page.Popup.close();
}

/* Window */
function WindowPos(item, idStopParent)
{
	if (IsEmpty(idStopParent)) idStopParent = null;
	var pos = [0, 0];
	for(;;)
	{
		if (item.id === idStopParent || item.style.position == "absolute")
			break;
		pos[0] += item.offsetLeft;
		pos[1] += item.offsetTop;
		if (item.offsetParent == null )
			break;
		item = item.offsetParent;
	}
	return pos;
}


  /*******************************************/
 /****************** TODO *******************/
/*******************************************/
var XmlRegExp1 = /(<!\[CDATA\[[.\n]*\]\])|(<\/[.\n]*>)|(<[.\n]*\/>)|(<[.\n]*>)|([.\n]*)(?=<)/;
var	XmlRegExp1 = /(<!\[CDATA\[(?:.|\n)*?\]\])|(<\/(?:.|\n)*?>)|(<(?:.|\n)*?\/>)|(<(?:.|\n)*?>)|(?=>)((?:.|\n)+)(?=<)/gm;
var XmlRegExp1 = /(<!\[CDATA\[(?:\s|\S)*?\]\])|(<(?:\s|\S)*?>)|(?=>)((?:.|\n)+)(?=<)/gm;



/*** BROWSER IDENTIFICATION ***/

/*
Per i nostri scopi il browser è:
Internet Explorer < 5.5
Internet Explorer >= 5.5
Netscape < 6.0
Netscape >= 6.0
*/

var IE = 0;
var NE = 0;
function BrowserIdentification()
{
	var pos, tmp;
    var userAgent = navigator.userAgent.toLowerCase();
    var majorVersion = parseInt(navigator.appVersion, 10);
    var minorVersion = parseFloat(navigator.appVersion);
    
    // Internet Explorer -> 5 o x.x
	var tmp = userAgent.match(/msie\s*(\d*)\D(\d*)/);
	if (tmp != null)
	{
		IE = parseInt(tmp[1], 10);
		if (IE==5)
			 IE = parseFloat(tmp[1]+"."+tmp[2]);
	}
	// Netscape Navigator -> 4 o 6
	else
	{
		NE = 4;
		if (majorVersion >= 5)
			NE = 6;
	}
}
BrowserIdentification();

function BrowserAlert(verb)
{
	if (arguments.length<1) 
		verb = "knos dynweb cookie";
	else
		verb = verb.toLowerCase();

	if (verb.indexOf("knos")!=-1)
	{	
		if (IE<5.5)
		{
			window.alert("Funzionalità accessibile solo con Microsoft Internet Explorer ver. 5.5 o successive.");
			return false;
		}
		verb += "cookie";
	}

	if (verb.indexOf("dynweb")!=-1)
	{
		if (IE<5.5 && NE<6)
		{
			window.alert("Funzionalità accessibile solo con Microsoft Internet Explorer ver. 5.5 o successive o Netscape Navigator versione 6.0 o successive.");
			return false;
		}
	}

	if (verb.indexOf("cookie")!=-1)
	{
		if ( !navigator.cookieEnabled )
		{
			window.alert("Per accedere al servizio occorre abilitare i Cookie.");
			return false;
		}
	}
	
	return true;
}






function GetPageName(url)
{
	if ( IsEmpty(url) )
		return "";
	url = unescape(url);
	var pos1 = url.lastIndexOf('/') + 1;
	var pos2 = url.lastIndexOf('\\') + 1;
	var pos = pos1 > pos2 ? pos1 : pos2;
	return url.slice(pos).toLowerCase();
}


function GetStyleAttribute(style, attribute, defValue)
{
try
{
	if ( IsEmpty(style) )
		return defValue;
	var tmp = style.split(/;/);
	for (var i=0; i<tmp.length; i++)
	{
		tmp[i] = tmp[i].split(":");
		if (tmp[i][0] == attribute)
			return tmp[i][1];
	}
}
catch(e)
{}
	return defValue;
}







function LikeSearchExpression(field, value)
{
	var s = ""+ value;
	return "["+ field +"] LIKE '%<!_CDATA_"+ s.replace(/'/g, "''") +"__>%'";
}

function WildDateExpression(colName, stdDateTime_Date)
{
	if (stdDateTime_Date === null || stdDateTime_Date === "")
		return "";
	var d = new Object();
	StdDateTimeObject(stdDateTime_Date, d);
	return "dbo.fn_ReplaceWildDate("+ colName +",'"+ d.year +"','"+ d.month +"','"+ d.day +"','"+ (parseInt(d.year, 10)+1) +"')";
}

function OpenUrl(url, target, features)
{
	if ( IsEmpty(url) )
		return;
	
	switch ( target )
	{
		case "_same": 
			window.location = url;
			break;
		
		case "_replace":
			window.location.replace(url);
			break;
		
		default:	
			if ( IsEmpty(features) )
				window.open(url, target);
			else
				window.open(url, target, features);
	}	
}


/* CHECKED INPUT */

// Ottenimento di un valore intero
// Ritorna:
//	"" se il valore e' in bianco
//	null se non è un intero valido
//	
function GetCheckedInteger(target, bAlert)
{
	if (IsEmpty(bAlert)) bAlert = true;
	
	target.value = Trim(target.value+"");
	if (IsEmptyString(target.value))
		return "";
	if (isNaN(target.value) || parseInt(target.value,10) != target.value)
	{
		if (bAlert)
		{
			window.alert("Inserire un'espressione numerica intera valida");
			target.focus();
		}
		return null;
	}
	return target.value;
}


// Ottenimento di un valore float
// Ritorna:
//	"" se il valore e' in bianco
//	null se non è un float valido
//
function GetCheckedFloat(target, bAlert)
{
	if (IsEmpty(bAlert)) bAlert = true;	
	target.value = Trim(target.value);
	if (IsEmptyString(target.value))
		return "";
	if (isNaN(target.value))
	{
		if (bAlert)
		{
			window.alert("Inserire un'espressione numerica valida (come separatore decimali usare il punto '.')");
			target.focus();
		}
		return null;
	}
	return target.value;
}


/* ARROTONDAMENTO */

// Arrotondamento di un numero con nDecimali specificati
// se sono indicati cPoint o bZero ritorna una stringa
function Round(value, nDecimal, cPoint, bZero)
{
try
{
	var defZero = false;
	if (IsEmpty(nDecimal)) nDecimal = 4;
	if (IsEmpty(cPoint)) { cPoint = null; } else { defZero = true; }
	if (!IsEmpty(bZero)) defZero = bZero;
	bZero = defZero;
	
	var dec = Math.pow(10, nDecimal);
	var result = Math.round(value * dec) / dec;
	if ( !bZero && cPoint === null )
		return result;

	strResult = result.toString();
	if (bZero)
	{
		var z = strResult.lastIndexOf(".");
		if (z < 0)
		{
			strResult += ".";
			z = nDecimal;
		}
		else
			z = z + nDecimal + 1 - strResult.length;
		for (var i=0; i<z; i++)
			strResult += "0";
	}

	if (!IsEmpty(cPoint))
		strResult = strResult.replace(/\./g, cPoint);

	return strResult;
}
catch(e)
{
	return 0;
}
}


/*** FORMATI STANDARD ***/

// Format
var Format_bool_1 = ["0", "1", "0", "1"];
var Format_bool_t = ["F", "V", "F", "T"];
var Format_bool_T = ["Falso", "Vero", "False", "True"];
var Format_bool_y = ["N", "S", "N", "Y"];
var Format_bool_Y = ["No", "Si", "No", "Yes"];
var Format_month = ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre", "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

function Format(str, fmt)
{
	var val, result;

	// Formato		
	if ( IsEmptyString(fmt) )
		return "?";
	var result = fmt.match(/\s*([^:]*):([^|]*)\|*([^$]*)/);
	if ( result == null )
		return "?";
	var tipo = result[1].toLowerCase();
	var campi = result[2];
	var opzioni = result[3].toLowerCase();

	// Lettura Opzioni
	
	// lang + separatori decimali e migliaia
	var o_lang = opzioni.match(/\S*lang=([^ ,]*)/);
	var o_dsep = ",";
	var o_tsep = ".";
	if ( o_lang == null )
		o_lang = "it";
	else
	{
		o_lang = o_lang[1];
		if ( o_lang == "en" )
		{
			o_dsep = ",";
			o_tsep = ".";
		}
	}
	// case
	var o_case = opzioni.match(/\S*case=([^ ,]*)/);
	if ( o_case == null )
		o_case = "c";
	else
		o_case = o_case[1];
	// curr
	var o_curr = opzioni.match(/\S*curr=([^ ,]*)/);
	if ( o_curr == null )
		o_curr = "";
	else
		o_curr = o_curr[1];
	
	// Costruzione del risultato
	switch (tipo)
	{
		case "bool":	// Es. "bool:%Y|lang=it"
			val = parseInt(str, 10);
			if ( !isNaN(val) )
				val = val ? 1 : 0;
			else
				val = ( str.search(/^t|v|s|y/i) >= 0 )? 1 : 0;
			// Opzione lang
			if ( o_lang == "en" )
				val += 2;
			result = campi.replace(/%1/, Format_bool_1[val]);
			result = result.replace(/%t/, Format_bool_t[val]);
			result = result.replace(/%T/, Format_bool_T[val]);
			result = result.replace(/%y/, Format_bool_y[val]);
			result = result.replace(/%Y/, Format_bool_Y[val]);
			// Opzione case
			switch ( o_case )
			{
				case "l": return result.toLowerCase();
				case "u": return result.toUpperCase();
				default: return result;;
			}
			break;
						
		case "dt":
			// Il valore da rappresentare e' in formato fisso:
			//	YYYY-MM-DDThh:mm:ss 
			//	1    2  3  4  5  6
			var val = str.match(/(\d*)-(\d*)-(\d*)T(\d*):(\d*):(\d*)/);			
			if ( val == null )
				return "";
			result = campi.replace(/%Y/, val[1]);
			result = result.replace(/%y/, val[1].slice(-2));
			result = result.replace(/%mm/, Format_month[val[2]-1+(o_lang=="en"?12:0)]);
			result = result.replace(/%m/, val[2]);
			result = result.replace(/%d/, val[3]);			
			result = result.replace(/%H/, val[4]);
			result = result.replace(/%M/, val[5]);
			result = result.replace(/%S/, val[6]);
			// Opzione case
			switch ( o_case )
			{
				case "l": return result.toLowerCase();
				case "u": return result.toUpperCase();
				default: return result;;
			}
			break;

		case "number":
			break;
		
		default:
			return "?";
	}		
}


/* HTML */
function TextToHTML(text)
{
	if (IsEmpty(text)) return "&nbsp;";
	
	var result = "" + text;
	result = result.replace(/&/g, "&amp;");
	result = result.replace(/\s\s/g, " &nbsp;");
	result = result.replace(/"/g, "&quot;");
	result = result.replace(/</g, "&lt;");
	return result.replace(/>/g, "&gt;");
}


/* XML */

function XMLAttributeValue(attr){try {return attr.text;} catch(e) {return "";}}

function XMLAttributeValueToHTML(attr)
{
	var result;
	try
	{
		result = attr.xml.replace(/[^"]*"/, "");
		result = result.replace(/\"[^$]*/, "");
	} 
	catch(e)
	{
		result = ""
	} 
	if (IsEmpty(result))
		result = "&nbsp;";
	return result;
}

function XMLCreateNode(dom, name, data, attributes)
{
try
{
	var node = dom.createElement(name);
	if (data !== null)
		node.appendChild(dom.createCDATASection(data));
	if (!IsEmpty(attributes))
		for (var i=0; i<attributes.length; i++)
			node.setAttribute(attributes[i][0], attributes[i][1]);
	return node;
}
catch(e)
{
	return null;
}
}

function XMLAppendNode(dom, parentName, childName, data, attributes)
{
try
{
	var parent = dom.selectSingleNode(parentName);
	var node = XMLCreateNode(dom, childName, data, attributes);
	parent.appendChild(node);
	return node;
}
catch(e)
{
	return null;
}
}

function XMLGetNodeText(dom, nodeName, defaultResult)
{
	if (arguments.length<3) defaultResult = null; 
	try
	{
		return dom.selectSingleNode("//"+nodeName).text
	}
	catch(e)
	{
		return defaultResult;
	}
}

function XMLGetAttributeText(node, attrName, defaultResult)
{
	if (arguments.length<3) defaultResult = null; 
	try
	{
		return node.attributes.getNamedItem(attrName).text;
	}
	catch(e)
	{
		return defaultResult;
	}
}

function XMLGetNodeAttributeText(dom, nodeName, attrName, defaultResult)
{
	if (arguments.length<4) defaultResult = null; 
	try
	{		
		return dom.selectSingleNode("//"+nodeName).attributes.getNamedItem(attrName).text;
	}
	catch(e)
	{
		return defaultResult;
	}
}

function XMLEnumString(list, colValue)
{
	if (IsEmpty(colValue)) colValue = null;

	var result = "<Vs>";
	for (i=0; i<list.length; i++)
		result += "<V><![CDATA["+ ((colValue==null) ? list[i] : list[i][colValue]) +"]]></V>";
	result += "</Vs>";
	return result;
}

function XMLEnumValues(enumString)
{
	var result = [];
	var t, s = enumString.split("]]></V>");
	for (var i=0; i<s.length-1; i++)
	{
		t = s[i].split("<![CDATA[");
		if (t.length>1)
			result[result.length] = t[1];
	}
	return result;
}

/* CTableInfo */
function CTableInfo(id)
{
	this.id = id;
	this.info = [];
}
CTableInfo.prototype.getInfo = function(pos_keyValueList)
{
try
{
	if (IsNumber(pos_keyValueList))
	{	
		for (var i in this.info)
			if (pos_keyValueList-- == 0)
				return this.info[i];
	}
	else if (IsArray(pos_keyValueList))
	{
		// Se non è un array di coppie ma una sola coppia stringa-valore va bene lo stesso
		if (IsString(pos_keyValueList[0]))
			pos_keyValueList = [pos_keyValueList];
		var item, hit;
		for (var i in this.info)
		{
			item = this.info[i];
			hit = 0;
			for (var j=0; j<pos_keyValueList.length; j++)
			{
				if (item[pos_keyValueList[j][0]] != pos_keyValueList[j][1])
					break;
				hit++;
			}
			if (hit == pos_keyValueList.length)
				return item;
		}
	}
}
catch(e){}
	return null;
};
CTableInfo.prototype.getPos = function(key_item_propKey, propValue)
{
	var item, pos = 0;
	if (propValue == null)
	{
		if (IsString(key_item_propKey)) item = this.info[key_item_propKey];
		else item = key_item_propKey;
		for (var i in this.info)
			if (this.info[i] == item) return pos;
			else pos++;
	}
	else
	{
		for (var i in this.info)
			if (this.info[i][key_item_propKey] == propValue) return pos;
			else pos++;
	}
	return -1;
}
CTableInfo.prototype.add = function(key, infoList)
{
	if (this.info[key] == null)
		this.info[key] = [];
	for (var i=0; i<infoList.length; i++)
		this.info[key][infoList[i][0]] = infoList[i][1];
}

/* SERIALIZATION 
Boolean.prototype.serialize = function() { return this.valueOf(); }
Number.prototype.serialize = function() { return this.valueOf(); }
String.prototype.serialize = function() { return "\""+ this.toString().replace(/\\/g, '\\\\').replace(/"/g, '\\\"') +"\""; }
Array.prototype.serialize = function()
{
	var s = "[";
	for (var i=0; i<this.length; i++)
	{
		if (s!="[")
			s += ",";
		try { s += this[i].serialize();	} catch(e) { s += "null"; }
	}
	return s += "]";
}
*/

// Messaggi in italiano


var Msg_ExceptionUnknown = "Eccezione non riconosciuta";

// o in inglese per le altre lingue


//</script>
 

