// util
if(typeof(util)=="undefined")
{
	var util = new Object();
}

util.string = new Object();

util.string.arrayScan = function(list, value)
{
	var i;
	for(i=0; ((i<list.length) && (list[i]!=value)); i++);
	return((i==list.length)? (-1):(i));
};

util.string.arrayToString = function(a, sep, skip)
{
	var s='';
	for (var i=0; i<a.length; i++)
	{
		s +=(((skip) && (a[i]==''))? '':(sep + a[i]));
	}
	return(s.substring(sep.length));
};

util.string.stringToArray = function(str, sep, skip)
{
	var a=str.split(sep);
	if(skip)
	{
		var b=new Array();
		for(var i=0; i<a.length; i++)
		{
			if(a[i]!='')
			{
				b[b.length]=a[i];
			}
		}
		a=b;
	}
	return(a);
};

util.string.left = function(str, len)
{
	if(len>str.length + 1)
	{
		len = str.length + 1;
	}
	return(str.substring(0, len));
};

util.string.right = function(str, len)
{
	if(len>str.length + 1)
	{
		len = str.length + 1;
	}
	return(str.substring(str.length-len, str.length));
};

util.string.mid = function(str, start, len)
{
	if(start<1)
	{
		start=1;
	}
	if(start+len>str.length)
	{
		len=str.length-start+1;
	}
	return(str.substring(start-1, start+len-1));
};

util.string.javascriptEncode = function(str)
{
	str = str.replace(/\"/g, "\\\"");
	str = str.replace(/\'/g, "\\\'");
	return(str);
};

util.string.SQLEncode = function(str)
{
	return(str.replace(/'/g, "\'\'"));
};

util.string.urlEncode = function(str)
{
	return(encodeURIComponent(str));
	
	str = str.replace(/\%/g, "%25");
	str = str.replace(/\?/g, "%3F");
	str = str.replace(/\=/g, "%3D");
	str = str.replace(/\&/g, "%26");
	str = str.replace(/\#/g, "%23");
	str = str.replace(/\+/g, "%2B");
	return(str);
};

util.string.attributeEncode = function(str)
{
	str = str.replace(/\"/g, "&quot;");
	str = str.replace(/\'/g, "&apos;");
	return(str);
};

util.string.htmlEncode = function(str)
{
	str = str.replace(/\"/g, "&quot;");
	str = str.replace(/</g, "&lt;");
	return(str);
}


util.string.urlDecode = function(str)
{
	return(decodeURIComponent(str));
	
	str = str.replace(/(\%3F)/g, "?");
	str = str.replace(/(\%3D)/g, "=");
	str = str.replace(/(\%26)/g, "&");
	return(str);
};

util.string.caselessCompare = function(str1, str2)
{
	// this function is meant to be used by the .sort property.
	// it will make string comparison not case sensitive.
	// the method .toLowerCase is used instead of the .toUpperCase to have
	// characters such as "_" listed at the top.
		
	var s1, s2;
	s1=str1.toLowerCase();
	s2=str2.toLowerCase();
		
	if(s1<s2)
	{
		return(-1);
	}
	if(s1>s2)
	{
		return(1);
	}
	return(0);
};

util.string.parseDecimal = function(val, precision)
{
	val = parseFloat(val);
	if(isNaN(val))
	{
		val = 0;
	}
	if(precision==null)
	{
		precision = 0;
	}
	return(parseInt(val * Math.pow(10, precision)) / Math.pow(10, precision));
};

util.string.round = function(val, digits)
{
	val = parseFloat(val);
	return(Math.round(val / Math.pow(10, digits)) * Math.pow(10, digits));
};

util.string.parseUsing = function(val, intPrecision, decimalPrecision)
{
	var val = parseFloat(val);
	var valInt = parseInt(val);
	var valFloat = val - valInt;
	var valFloat = util.string.parseExact(valFloat, decimalPrecision);
	var valInt  = valInt.toString();
	for(var i=valInt.length; i<intPrecision; i++)
	{
		valInt = "0" + valInt;
	}
	if(parseFloat(valFloat)!=0)
	{
		valInt += "." + parseFloat;
	}
	return(valInt);
};

util.string.parseExact = function(val, precision)
{
	val = util.string.parseDecimal(val, precision).toString();
//	precision ++;
	var index = val.indexOf(".");
	if(index<0)
	{
		val += ".";
	}
	index = val.indexOf(".") + 1;
	val = val.substring(0, index + precision);
	for(var i=val.length - index; i<precision; i++)
	{
		val += "0";
	}
	return(val);
};

String.prototype.Trim = function()
{
   var ichar, icount;
   var strValue = this;
   ichar = strValue.length - 1;
   icount = -1;
   while (strValue.charAt(ichar)==' ' && ichar > icount)
       --ichar;
   if (ichar!=(strValue.length-1))
       strValue = strValue.slice(0,ichar+1);
   ichar = 0;
   icount = strValue.length - 1;
   while (strValue.charAt(ichar)==' ' && ichar < icount)
       ++ichar;
   if (ichar!=0)
       strValue = strValue.slice(ichar,strValue.length);
   return strValue.toString();
};

String.prototype.startsWith = function(startStr)
{
	var str = this;
	var  l = startStr.length;
	if(str.length<l)
	{
		return(false);
	}
	return(str.substring(0, l)==startStr);
};

String.prototype.endsWith = function(endStr)
{
	var str = this;
	var eL = endStr.length;
	var l = str.length;
	if(l<eL)
	{
		return(false);
	}
	return(str.substring(l-eL)==endStr);
};

util.string.capitalizeFirst = function(str)
{
	return(str.substring(0, 1).toUpperCase() + str.substring(1));
};

util.string.uncapitalizeFirst = function(str)
{
	return(str.substring(0, 1).toLowerCase() + str.substring(1));
};

Array.prototype.indexOf = function(val)
{
	var index = -1;
	var l = this.length;
	for(var i=0; i<l; i++)
	{
		if(this[i]==val)
		{
			index = i;
			break;
		}
	}
	return(index);
};

Array.prototype.lastIndexOf = function(val)
{
	var index = -1;
	var l = this.length;
	for(var i=l-1; i>=0; i--)
	{
		if(this[i]==val)
		{
			index = i;
			break;
		}
	}
	return(index);
};

util.string.leftTrimChar = function(str, c)
{
	while(str.substring(0, 1)==c)
	{
		str = str.substring(1);
	}
	return(str);
};

util.string.rightTrimChar = function(str, c)
{
	while(str.substring(str.length-1, 1)==c)
	{
		str = str.substring(0, str.length-2);
	}
	return(str);
};

util.string.trimChar = function(str, c)
{
	str = StringUtilsLeftTrimChar(str, c);
	str = StringUtilsRightTrimChar(str, c);
	return(str);
};

util.string.dateRendererEx = function(d, format)
{
	if((d==null) || (d==""))
	{
		return("");
	}
	var mNames = new Array("January","February","March","April","May","June","July","August",
		"September","October","November","December");
	var Dow   = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");

	if(typeof(d)=="string")
	{
		if(isNaN(Date.parse(d)))
		{
			return("");
		}
		d = new Date(d);
	}
	var dateRender = "{mm}/{dd}/{yyyy}";
	if(format!=null)
	{
		dateRender = format;
	}
  dateRender = dateRender.replace(/\{d\}/g, d.getDate());
  dateRender = dateRender.replace(/\{dd\}/g, util.string.parseUsing(d.getDate(), 2, 0));
  dateRender = dateRender.replace(/\{D\}/g, Dow[d.getDay()].substring(0, 2));
  dateRender = dateRender.replace(/\{DD\}/g, Dow[d.getDay()]);
  dateRender = dateRender.replace(/\{m\}/g, d.getMonth()+1);
  dateRender = dateRender.replace(/\{mm\}/g, util.string.parseUsing(d.getMonth() + 1, 2, 0));
  dateRender = dateRender.replace(/\{M\}/g, mNames[d.getMonth()].substring(0, 3));
  dateRender = dateRender.replace(/\{MM\}/g, mNames[d.getMonth()]);
  dateRender = dateRender.replace(/\{yy\}/g, d.getYear());
  dateRender = dateRender.replace(/\{yyyy\}/g, d.getFullYear());

	return(dateRender);
};

util.string.crop = function(str, len, suffix)
{
	if(str.length<=len)
	{
		return(str);
	}
	str = str.substring(0, len);
	if(suffix!=null)
	{
		str += suffix;
	}
	return(str);
};

util.string.splitURL = function(url)
{
	if(url==null)
	{
		url = window.location.href;
	}
	var index = url.indexOf("?");
	if(index<0)
	{
		index = url.length;
		url += "?";
	}
	var a = new Object();
	a.pathName = url.substring(0, index);
	a.search = url.substring(index + 1, url.length);
	return(a);
};

util.string.searchToObject = function(search)
{
	if(search==null)
	{
		search= window.location.search;
	}
	if(search.startsWith("?"))
	{
		search = search.substring(1);
	}
	var o = util.string.stringToObject(search, "&", "=");
	for(key in o)
	{
		o[key] = util.string.urlDecode(o[key]);
	}
	return(o);
};

util.string.stringToObject = function(str, listSeparator, keySeparator)
{
	var str = util.string.stringToArray(str, listSeparator, true);
	var l = str.length;
	var o = new Object();
	var elt, index;
	for(var i=0; i<l; i++)
	{
		index = str[i].indexOf(keySeparator);
		elt = str[i].split(keySeparator);
		o[str[i].substring(0, index)] = str[i].substring(index + 1);
	}
	return(o);
};

util.string.objectToString = function(obj, listSeparator, keySeparator)
{
	var str = new Array();
	for(key in obj)
	{
		str.push(key + keySeparator + obj[key]);
	}
	return(str.join(listSeparator));
};