/*************************\
* ITALCOM S.p.A.          *
* Target:  IE 5.5, NE 6.0 *
* Library: Core.js        *
* Version: 1.0            *
* Require: none           *
* Objects: CQueryArgs     *
\*************************/

/* Definitions */
function EmptyFunction(){};
function NullFunction(){return null};

/* 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]});
}

function ErrorAlert(e, fName)
{
	try
	{
		var msg = "";
		if ( arguments.length > 1 )
			msg += fName;
		msg += "\n"+ e.name +" "+ e.number;
		msg += "\n"+ e.description;
		if ( e.description != e.message )
			msg += "\n"+ e.message;
		window.alert(msg);		
	}
	catch(e)
	{	
		window.alert("Unknown exception event");
	}
}


/*** 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);
    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]);
		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 GetLicense(drvpath)
{
	var result = null;
	try
	{
		var fso, d, s, t;
		fso = new ActiveXObject("Scripting.FileSystemObject");
		if (IsEmpty(fso))
			result = "Error 1";
		d = fso.GetDrive(fso.GetDriveName(fso.GetAbsolutePathName("c:")));
		result = d.SerialNumber;
	}
	catch(e)
	{
		result = null;
	}
	return result;
}


//============
// CQueryArgs
//============
function CQueryArgs()
{
	this.args = [];
	this.init();
}

CQueryArgs.prototype.init
=//======================
function ()
{
try
{
	var str = document.location.search;
	if ( IsEmpty(str) )
		return [];
	var tmp = str.split(/[\?&]/);
	for (var i=0; i<tmp.length; i++)
	{
		tmp[i] = tmp[i].split("=");
		tmp[i][0] = unescape(tmp[i][0]);
		tmp[i][1] = unescape(tmp[i][1]);
	}
	this.args = tmp;
}
catch(e)
{
	this.args = [];
}
}

CQueryArgs.prototype.getArg
=//========================
function (name)
{
	for (var i=0; i<this.args.length; i++)
	{
		if ( this.args[i][0] == name )
			return this.args[i][1];
	}		
	return null;
}


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;
}


/* CLIPBOARD */
function ClipboardGet(idClip)
{
	var result = "";
	try
	{
		var clip = window.clipboardData.getData("Text");
		if (!IsEmpty(idClip))
		{
			if ( clip.slice(0, idClip.length) == idClip )
				result = clip.slice(idClip.length);
		}
		else
			result = clip;
	}
	catch (e)
	{
		result = "";
	}
	return result;
}

function ClipboardSet(idClip, value)
{
	try
	{
		window.clipboardData.clearData("Text");
		window.clipboardData.setData("Text", idClip+value);
		return true;
	}
	catch(e)
	{
		return false;
	}
}

 //////////
// 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) 
{
	if (IsEmpty(name)) return document.cookie;
	
	// cookies are separated by semicolons
	var aCookie = document.cookie.split(/;\s*/);
	var aCrumb;
	for (var i=0; i < aCookie.length; i++)
	{
		// a name/value pair (a crumb) is separated by an equal sign
		aCrumb = aCookie[i].split("=");
		if (name == aCrumb[0])
		{
			if (aCrumb.length > 1)
				return unescape(aCrumb[1]);
			else
				return "";
		}
	}
	// 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);
}


/*** DEBUGGING ***/

function Debug(expr)
{
	window.alert(expr);
}

function DebugPoint()
{
	if ( window.confirm("Debug?") )
		window.ale();
}

function DebugProperties(target)
{
	var p;
	var str = "";

	for (p in target)
		str += "\n" + p + " = " + target[p];
	return str;
}

/*** LOW LEVEL ***/
function ODD_INT(i)    	{ return (i & 0x01) ? true : false };
function EVEN_INT(i)    { return (i & 0x00) ? true : false };
var NIBBLE_TO_ESA =     "0123456789ABCDEF";
var ESA_CHAR =          ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"];

function StringToEsa(str)
{
	var strEsa = "";
	for (i=0; i<str.length; i++)
	{
		h = (str.charCodeAt(i) & 0xf0) >> 4;
		l = (str.charCodeAt(i) & 0x0f);
		strEsa += ESA_CHAR[h];
		strEsa += ESA_CHAR[l];
	}
	return strEsa;
}


function EsaToString(esaChar)
{
	if (IsEmpty(esaChar)) return "";
	var str = "";
	var currByte = EsaToByte(esaChar, 0, esaChar.length);
	for (var i=0; i<currByte.length; i++)
		str += String.fromCharCode(currByte[i]);
	return str;
}


function ByteToEsa(byteArray, start, nLong)
{
	var h, l;
	var end = start+nLong;
	var strEsa = "";
	for (i=start; i<end; i++)
	{
		h = (byteArray[i] & 0xf0) >> 4;
		l = (byteArray[i] & 0x0f);
		strEsa += ESA_CHAR[h] + ESA_CHAR[l];
	}
	return strEsa;
}


function EsaToByte(esaChar, start, nChar)
{   
    var i, j, c;
    var low, high;    
    var outByte = new Array(nChar/2);
        
    esaChar = esaChar.toUpperCase();
    for (i=start, j=0; i<nChar; i++)
    {		
		c = esaChar.charAt(i);
        if ( (('0' <= c) && (c <= '9')) || (('A' <= c) && (c <= 'F')) )
        {
            if ( ODD_INT(i) )
                low = NIBBLE_TO_ESA.indexOf(c);
            else
                high = NIBBLE_TO_ESA.indexOf(c) << 4;
        }
        else 
        {
			return null;
        }
        if ( ODD_INT(i) )
            outByte[j++] = high | low;
    }    
    return outByte;
}


function StringPadding(str, padStr, mod)
{
	var n = str.length % mod;
	if ( n == 0 )
		n = str.length;
	else
		n = str.length + (mod - n);
	while ( str.length < n )
			str += padStr;
	return str.slice(0, n);
}


/*** IS FUNCTIONS ***/

var undefined;
function IsUndefined(v) { return (v == undefined); }
function IsEmptyString(v) { return (v == undefined || v === ""); }
function IsEmpty(v) { try {	return (v == undefined || v == null || v === ""); } catch (e) {	return false; } }
function IsInList(item, list, sep)
{
try
{
	if (IsEmpty(item))
		return false;
	if (IsEmpty(list))
		return false;
	if (IsEmpty(sep))
		sep = ",";
	var l = list.split(sep);
	for (var i=0; i<l.length; i++)
		if (Trim(item) == Trim(l[i]))
			return true;
}
catch(e) {}
	return false;
}

/*** TRIM ***/

function TrimLeft(s, c, nMax)
{
	if (!IsEmpty(c))
	{
		var re;
		if (IsEmpty(nMax))
		{
			re = new RegExp("(^"+ c +"*)","");
			return s.replace(re, ""); 
		}
		else
		{
			var result = s;
			re = new RegExp("(^"+ c +")","");
			for (var i=0; i<nMax; i++)
				result = result.replace(re, "");
			return result;
		}
	}
	else
		return s.replace(/(^\s*)/, "");
}
function TrimRight(s, c, nMax) 
{
	if (!IsEmpty(c))
	{
		var re;
		if (IsEmpty(nMax))
		{
			re = new RegExp("("+ c +"*$)","");
			return s.replace(re, "");
		}
		else
		{
			var result = s;
			re = new RegExp("("+ c +"$)","");
			for (var i=0; i<nMax; i++)
				result = result.replace(re, "");
			return result;
		}
	}
	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 TrimSearchExpression(s)
{
	// Sostituzione di cr, tab, ecc. con spazi singoli
	s = s.replace(/(\f|\n|\r|\t|\v)+/g, " ");
	// Raddoppio degli apici e trim degli spazi
	return Trim(s.replace(/'/g, "''"));
}

function NormalizeString(s)
{
	// Semplificazione whitespace
	return s.replace(/\s+/g, " ");
}

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)+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);
			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, def){if (arguments.length<2) def = ""; try {return attr.text;} catch(e) {return def}}

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;
}

function OpenInnerLink(){}
function OpenInnerRef(){}