//------------------------------------------------------------------------------------------------------------
var digits = "0123456789";
var decimalPoint = ".";
var alphas = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var space = " ";
var hyphen = "-";
var alphaNumerics = alphas + digits;
var alphaNumericsWithSpace = alphaNumerics + space;
var alphasWithSpace = alphas + space;
var floatNbrs = digits + decimalPoint;
var hyphenatedNbrs = digits + hyphen;
var hyphenatedAlphaNumerics = alphas + digits + hyphen;
//------------------------------------------------------------------------------------------------------------
function centerPopup(w, h)
{
	var screenAvailWidth = screen.availWidth;
	var screenAvailHeight = screen.availHeight;
	var windowPosX = ((screenAvailWidth / 2) - (w / 2));
	var windowPosY = ((screenAvailHeight / 2) - (h / 2));

	self.resizeTo(w, h);
	self.moveTo(windowPosX, windowPosY);
}
//------------------------------------------------------------------------------------------------------------
function ensureInBag(str, bag)
{
    	for (i = 0; i < str.length; i++)
   		{
		var c = str.charAt(i);
        	if (bag.indexOf(c) == -1) { return false; }
    	}
    	return true;
}
//------------------------------------------------------------------------------------------------------------
function ensureOnlyOneDecimalPoint(str)
{
	var c = "";
	var decimalFound = false;

	for (i = 0; i < str.length; i++)
	{   
		c = str.charAt(i);
		if (c == decimalPoint)
		{
			if (decimalFound != false) { return false; }
			else { decimalFound = true; }
		}
	}
	return true;
}
//------------------------------------------------------------------------------------------------------------
function checkDecimalPlaces(str, places)
{
	var trueLength = str.length - 1;

	switch (places)
	{
		case 0:
			if ((str.indexOf(decimalPoint) != -1) && (str.indexOf(decimalPoint) != trueLength)) { return false; }
			break;
		default:
			if ((str.indexOf(decimalPoint) != -1) && ((trueLength - str.indexOf(decimalPoint)) > places)) { return false; }
			break;
	}

	return true;
}
//------------------------------------------------------------------------------------------------------------
function jsTrimUp(str)
{
	str = str.replace(/^\s*|\s*$/g,"");
	return str.toUpperCase();
}
//------------------------------------------------------------------------------------------------------------
function jsTrimUpTextField(elem)
{
	if (elem.value != "") { elem.value = jsTrimUp(elem.value); }
}
//------------------------------------------------------------------------------------------------------------
function jsSpacePadLeftTextField(elem, spaces)
{
	if ((elem.value != "") && (elem.value.length != spaces)) { elem.value = jsSpacePadLeft(elem.value, spaces); }
}
//------------------------------------------------------------------------------------------------------------
function jsSpacePadLeft(str, spaces)
{
	var str2 = str;
	while (str2.length < spaces) { str2 = " "+str2; }

	return str2;
}
//------------------------------------------------------------------------------------------------------------
function jsLeft(str, n)
{
	if (n <= 0) { return ""; }
	else if (n > String(str).length) { return str; }
	else { return String(str).substring(0,n); }
}
//-------------------------------------------------------------------------------------------------------------------------------------------
function jsRight(str, n)
{
	if (n <= 0) { return ""; }
	else if (n > String(str).length) { return str; }
	else
	{
		var iLen = String(str).length;
		return String(str).substring(iLen, iLen - n);
	}
}
//-------------------------------------------------------------------------------------------------------------------------------------------
function jsMid(str, start, len)
{
	if (start < 0 || len < 0) { return ""; }

	var iEnd, iLen = String(str).length;

	if ((start + len) > iLen) { iEnd = iLen; }
	else { iEnd = start + len; }

	return String(str).substring(start,iEnd);
}
//-------------------------------------------------------------------------------------------------------------------------------------------
function jsDateDiff(p_Interval, p_Date1, p_Date2, p_firstdayofweek, p_firstweekofyear)
{
	var dt1 = new Date(p_Date1);
	var dt2 = new Date(p_Date2);

	// get ms between dates (UTC) and make into "difference" date
	var iDiffMS = dt2.valueOf() - dt1.valueOf();
	var dtDiff = new Date(iDiffMS);

	// calc various diffs
	var nYears  = dt2.getUTCFullYear() - dt1.getUTCFullYear();
	var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears!=0 ? nYears*12 : 0);
	var nQuarters = parseInt(nMonths/3);	//<<-- different than VBScript, which watches rollover not completion
	
	var nMilliseconds = iDiffMS;
	var nSeconds = parseInt(iDiffMS/1000);
	var nMinutes = parseInt(nSeconds/60);
	var nHours = parseInt(nMinutes/60);
	var nDays  = parseInt(nHours/24);
	var nWeeks = parseInt(nDays/7);


	// return requested difference
	var iDiff = 0;		
	switch(p_Interval.toLowerCase()){
		case "yyyy": return nYears;
		case "q": return nQuarters;
		case "m": return nMonths;
		case "y": 		// day of year
		case "d": return nDays;
		case "w": return nDays;
		case "ww":return nWeeks;		// week of year	// <-- inaccurate, WW should count calendar weeks (# of sundays) between
		case "h": return nHours;
		case "n": return nMinutes;
		case "s": return nSeconds;
		case "ms":return nMilliseconds;	// millisecond	// <-- extension for JS, NOT available in VBScript
		default: return "invalid interval: '" + p_Interval + "'";
	}
}
//-------------------------------------------------------------------------------------------------------------------------------------------
function doTruncateFieldLength(elem, allowedLen)
{
	if (elem.value.length > allowedLen) { elem.value = jsLeft(elem.value, allowedLen); }
	else { return true; }
}
//------------------------------------------------------------------------------------------------------------
function doValidateEmailSyntax(elem)
{
//	email addresses must follow the syntax:  a@b.c

	var emailValid = false;
	var str = elem.value;

	if (str.length > 4)
	{
		emailArr = str.split("@");
		if (emailArr.length == 2)
		{
			if (emailArr[1].length > 2)
			{
				domainArr = emailArr[1].split(".");
				if (domainArr.length > 1) { emailValid = true; }
			}
		}
	}

	if (!emailValid) { alert("The Email Address supplied is not valid.\n\nPlease correct and resubmit."); elem.focus(); }

	return emailValid;
}
//------------------------------------------------------------------------------------------------------------
function doValidateEmailSyntaxValue(val)
{
//	email addresses must follow the syntax:  a@b.c

	var emailValid = false;

	if (val.length > 4)
	{
		emailArr = val.split("@");
		if (emailArr.length == 2)
		{
			if (emailArr[1].length > 2)
			{
				domainArr = emailArr[1].split(".");
				if (domainArr.length > 1) { emailValid = true; }
			}
		}
	}

	if (!emailValid) { alert("The Email Address supplied is not valid.\n\nPlease correct and resubmit."); }

	return emailValid;
}
//------------------------------------------------------------------------------------------------------------
function doUpdateFieldCharCounter(srcElem, countElem)
{
	countElem.innerHTML = jsRight('00'+srcElem.value.length, 2);
}
//------------------------------------------------------------------------------------------------------------
function jsDateDiff2(strDate1, strDate2)
{
     datDate1 = Date.parse(strDate1);
     datDate2 = Date.parse(strDate2);
     alert((datDate2-datDate1)/(24*60*60*1000));
}
//------------------------------------------------------------------------------------------------------------

