//////////////////////////////////////////////
// Italcom Spa
// Browser: IE 6.0, Netscape 7.0, Mozilla 1.4
// Library: Core.js
// Version 1.0
// Require: .
//          
//          
// Objects:
//////////////////////////////////////////////



var tableEscapedChars = [];

// escaping dei codici ascii inferiori al 32

function escapeString(s)
{
	var result = '';
	var backSlash = "\\".charCodeAt(0);
	
	if (tableEscapedChars.length == 0)
	{
		// init 
		for (var charCode=0;charCode<32;charCode++)
		{
			if (charCode < 16)
			{
				tableEscapedChars[charCode] = "\\x0" + charCode.toString(16);
			}
			else if (charCode < 32)
			{
				tableEscapedChars[charCode] = "\\x" + charCode.toString(16);
			}
		}
	}

	for (var i=0; i<s.length;i++)
	{
		var charCode = s.charCodeAt(i);
		if (charCode < 32)
		{
			result += tableEscapedChars[charCode];
		}
		else if (charCode == backSlash)
		{
			result += "\\\\";
		}
		else
			result += s.charAt(i);

	}
	return result;
}

function unescapeString(s)
{
	var result = '';
	var backSlash = "\\".charCodeAt(0);
	var charZero = "0".charCodeAt(0);
	
	var i = 0;
	
	while (i<s.length)
	{
		if ( (s.charCodeAt(i) == backSlash) )
		{
			if (s.charCodeAt(i+1) == backSlash)
			{
				result += "\\";
				i+=2;
			}
			else
			{
				result += String.fromCharCode(parseInt("0" + s.substring(i+1, i+4)));
				i+=4;
			}
		}
		else
		{
			result += s.charAt(i);
			i++;
		}

	}

	return result;
}


// Escaping delle virgolette in entita xml.
function escapeXmlAttribute(attrvalue)
{
 	var tmp = attrvalue.replace(/["&]/gi, 
 		function(str)
 		{
 			return "&#x" + str.charAt(0).charCodeAt(0).toString(16) + ";"
 		}
 	);
 	
 	return tmp;
 		
}

/*** 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; } }


/*** TRIM ***/

function TrimLeft(s) { return s.replace(/(^\s*)/, ""); }
function TrimRight(s) { return s.replace(/(\s*$)/, ""); }
function Trim(s) { return TrimRight(TrimLeft(s)); }

/* 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);
}


function GetHiddenData()
{
	return (document.getElementById('_txtXmlHidden').value == null ? "" : 	document.getElementById('_txtXmlHidden').value);
}

function PutHiddenData(xmldata)
{
	document.getElementById('_txtXmlHidden').value = xmldata;
}

function DefaultNull(value,def){
	if(def==null)
		def='';
	if(value==null) 
		return def; 
	
	return value;
}

function Round(value, decimals)
{
	if ( isNaN(value) )  return 0;
	return Math.round (value * Math.pow(10, decimals)) / Math.pow(10, decimals);
}

function GetNumericValue(s, defaultvalue)
{
	s=""+s;
	s=s.replace(/\./gi, "").replace(/,/gi, ".");
	return isNaN(parseFloat(s)) ? defaultvalue : parseFloat(s);
}

function DoLocation(page, bpostStatus)
{

	var stopLeavePage = false;

	if (DoLocation.prototype.onLeavePage != null) stopLeavePage = DoLocation.prototype.onLeavePage ();
	
	if (stopLeavePage) return;
	
	if (!bpostStatus)
		document.location = page;
	else
	{
		if (document._formhidden != null)		
		{
			document._formhidden.action = page;
			document._formhidden.submit();
		}
		else	// se non ci sono informazioni di stato si fa un semplice trasferimento. 
			document.location = page;
	}
}

DoLocation.prototype.onLeavePage = null;


function OpenDialog(url, height, width, targetName)
{
	var features = "directories=no,location=no,scrollbars=no,resizable=yes,top=0,left=0";
	if ( arguments.length == 2 )
		features += ",height=" + height;
	else if ( arguments.length >= 2 )
		features += ",height=" + height + ",width=" + width;

	var hwnd = window.open(url, targetName, features);
	hwnd.focus();
}

function GetDateValue(s, defaultvalue)
{
	var regExp = new RegExp("(\\d{1,2})\/(\\d{1,2})\/(\\d{4}$)", "g");
	var matches = regExp.exec("" + s);
	var result = defaultvalue;
	if ( matches != null )
	{

		var d = parseInt(matches[1],10);
		var m = parseInt(matches[2],10);
		var y = parseInt(matches[3],10);

		var days = 31;
		if ( (m < 1) || (m > 12) )
			return result;

		if ( (m == 10) || (m == 4) || (m == 6) || (m == 9) )
			days = 30;

		if (m == 2)
		{
			var isleap = ( ( ((y % 4) == 0) && ((y % 100) !=0) ) || ((y % 400) == 0) );
			days  = isleap ? 29 : 28;
		}

		if ( (d<1) || (d>days) )
			return result;
		result = new Date(y,m-1,d);
	}
	
	return result;
}

function FormatDateTime(dateTime)
{
	if (!(dateTime instanceof Date)) return null;
	
	return dateTime.getDate() + "/" + (dateTime.getMonth() + 1) + "/" + dateTime.getFullYear();
	
}

function GetQuerystringParameterValue(querystring,parameter)
{
	var result="";
	
	querystring=querystring.substring(1, querystring.length);
	var arrayquerystring = querystring.split('&');
	for (var i=0;i<arrayquerystring.length;i++)
	{
		var key = arrayquerystring[i].split('=')[0];
		var keyvalue = arrayquerystring[i].split('=')[1];
		if(key==parameter)
			return keyvalue;
	}
	
	return result;
	
}

function GetFormattedCurrency(value)
{
	var result="";
	for (var index=value.length-1,charcount=1; index>=0; index--,charcount++)
	{
		result = value.charAt(index) + result;
		if (((charcount % 3)==0) && (charcount > 0) && (index >0))  result = "." + result;
	}
	return result;
}

function FormatCurrency(target, decimals)
{
	var tmpval = ""+target;
	var decimalpos = tmpval.indexOf(".");
	var fmtval="";
	var integerpart;
	var decimalpart;
	
	
	if (tmpval.charAt(0) == '-')
	{
		sign = "-";
		tmpval = tmpval.substring(1);
	}
	else
		sign = "";
	
	

	if (decimalpos >= 0)
	{
		decimalpart = "," + tmpval.substring(decimalpos + 1);
		integerpart = tmpval.substring(0, decimalpos);
	}
	else
	{
		decimalpart="";
		integerpart=tmpval;
	}
	
	
	if (decimals != null)
	{
		
		if (decimalpart == "") decimalpart += ","
	
		decimalpart += "000000";

		if (decimals == 0)
			decimalpart = "";
		else
			decimalpart = decimalpart.substr(0,1+decimals);
	}

	fmtval = sign + GetFormattedCurrency(integerpart) + decimalpart;


	return fmtval;
}

function FormatInputValue(target)
{
	target.value = FormatCurrency(target.value);
	return target.value;
}

function DateFormatSql(dt)
{
	return dt.getFullYear() + "-" + dt.getDate() + "-" + (dt.getMonth() + 1);
}


function parseDiscount(discount)
{
	var m = ("" + discount).split('+');
	var result = 1;
	
	if (Trim(DefaultNull(discount, "")) == "")
		return 1;

	for (var i in m)
	{
		var tempmi = GetNumericValue(m[i],0);
		if ( isNaN(tempmi) )
			return null;
		result *= (1 - ( ( (tempmi > 100) || (tempmi < 0) ? 0 : tempmi) / 100));
	}
	return Round(result,5);
}