
// +-----------------------------------------+
// | Utility method used for the search link |
// | which validates the criteria entered,   |
// | then does the post for the search.      |
// +-----------------------------------------+
// | IMacNeill 01.23.06 v1.0                 |
// +-----------------------------------------+
function PushSearch()
{
	if (CheckSearch() == true)
	{
		oObj = FindDotNetObject("hypSearch");
		if (oObj != undefined)
		{
			if (oObj.click)
				oObj.click();
			else
				eval(oObj.href);
		}
	}
}

// +---------------------------------------+
// | Utility method to make sure that user |
// | has entered something for a search.   |
// +---------------------------------------+
// | IMacNeill 01.23.06 v1.0               |
// | IMacNeill 10.04.07 v1.1               |
// | - Assigning result of StripCSS/WS to  |
// |   search result box before posting.   |
// +---------------------------------------+
function CheckSearch()
{
	oFld = FindDotNetField("tbSiteSearch");

	if (oFld != "undefined")
	{
		sVal = new String(oFld.value);
		sSrc = StripCSS(TrimWS(sVal));
		
		if (sSrc.length > 0)
		{
			oFld.value = sSrc;
			return true;
		}
		else
		{
			oFld.value = "";
			alert("Please enter search term(s).");
			oFld.focus();
			return false;
		}
	}
	else
	{
		alert("An error has occurred while attempting to perform search validation.\n\nPlease contact your account administrator or sales representative\nregarding this error.");
		return false;
	}
}	

// +--------------------------------------+
// | Utility to normalize calls to attach |
// | a javascript event handler.          |
// +--------------------------------------+
// | Obtained script from the following:  |
// | http://www.onlinetools.org/articles/ |
// | unobtrusivejavascript/chapter4.html  |
// +--------------------------------------+
// | IMacNeill 02.01.06 v1.0              |
// +--------------------------------------+
function addEvent(obj, evType, fn)
{ 
	if (obj.addEventListener)
	{ 
		obj.addEventListener(evType, fn, false); 
		return true; 
	} 
	else if (obj.attachEvent)
	{ 
		var r = obj.attachEvent("on"+evType, fn); 
		return r; 
	} 
	else 
	{
		return false; 
	} 
}

// +---------------------------------------+
// | Utility javascript function to format |
// | a numeric string to US currency.      |
// +---------------------------------------+
// | IMacNeill 11.30.05 v1.0               |
// | IMacNeill 04.17.06 v1.1               |
// | - Update to fix single digit bug.     |
// +---------------------------------------+
function FormatCurrency( dVal )
{
	sFnl = new String("");
	sCur = new String(Math.round(dVal * 100) / 100);

	if (sCur == "0")
		sFnl = "$0.00";
	else
	{	
		// Make sure that we have at least one decimal
		iDecPos = sCur.indexOf(".");

		if (iDecPos == -1)
			sCur += ".00";
		else if (iDecPos == sCur.length - 2)
			sCur += "0";

		iIdx = sCur.lastIndexOf(".");
		sFnl = sCur.substr(iIdx,3);
		
		iCtr = 0;
		while ( iIdx > 0)
		{
			iIdx--;
			sFnl = sCur.substr(iIdx,1) + sFnl;
			iCtr++;
			if ((iCtr == 3) && (iIdx > 0))
			{
				sFnl = "," + sFnl;
				iCtr = 0;
			}
		}

		sFnl = "$" + sFnl;
	}	

	return sFnl;
}

// +----------------------------------------+
// | Utility procedure to seek for a server |
// | control by name, and to return a       |
// | reference to it if found.              |
// +----------------------------------------+
// | IMacNeill 12.05.05 v1.0                |
// +----------------------------------------+
function FindDotNetField( sSrcFld )
{
	var oRetFld = undefined;

	var oFrm = document.forms[0];
	for (iFld = 0; iFld < oFrm.elements.length; iFld++)
	{
		oFld = oFrm.elements[iFld];
		sFld = new String(oFld.name);

		if (sFld.indexOf(sSrcFld) > -1)
		{
			oRetFld = oFld;
			break;
		}
	}
	
	return oRetFld;
}

// +-----------------------------------+
// | Utility function to seek for page |
// | element, and return reference.    |
// +-----------------------------------+
// | IMacNeill 12.22.05 v1.0           |
// | IMacNeill 02.03.06 v1.1           |
// | > Update to handle non IE browser |
// +-----------------------------------+
function FindDotNetObject( sSrcObj )
{
	var oRetEle = undefined;

	if (document.all)
	{
		var oAll = document.all;
		var bCnt = true;

		for (iFld = 0; ((iFld < oAll.length) && (bCnt == true)); iFld++)
		{
			oFld = oAll[iFld];
			sFld = new String(oFld.id);

			if (sFld.indexOf(sSrcObj) > -1)
			{
				oRetEle = oFld;
				break;
			}
		}
	}
	else	// Parse the DOM for object
		oRetEle = ParseDOM( document, sSrcObj );
	
	return oRetEle;
}

// +-------------------------------------+
// | Utility method to recursively parse |
// | the DOM for an object reference.    |
// +-------------------------------------+
// | IMacNeill 02.03.06 v1.0             |
// +-------------------------------------+
function ParseDOM( oSrcNde, sName )
{
	var oRetNde = null;

	if (oSrcNde.childNodes.length > 0)
	{
		for (var iNde = 0; iNde < oSrcNde.childNodes.length; iNde++)
		{
			oCurNde = oSrcNde.childNodes[iNde];

			var bFnd = false;			
			if ((oCurNde.id != undefined) && (oCurNde.id != ""))
			{
				var sNdeID = new String(oCurNde.id);
						
				if (sNdeID.length > 0)
				{
					if (sNdeID.indexOf(sName) > -1)
						bFnd = true;
				}
			}

			if (bFnd == true)
			{
				oRetNde = oCurNde;
				break;
			}
			else if (oCurNde.childNodes.length > 0)
			{				
				oRetNde = ParseDOM( oCurNde, sName );
				if (oRetNde != null)
					break;
			}
		}
	}

	return oRetNde;
}

// +-------------------------------------+
// | Utility method to recursively parse |
// | the DOM for tag name.               |
// +-------------------------------------+
// | IMacNeill 07.10.06 v1.0             |
// +-------------------------------------+
function ParseDOMForTag( oSrcNde, sTagName )
{
	var oRetNde = null;

	if (oSrcNde.childNodes.length > 0)
	{
		for (var iNde = 0; iNde < oSrcNde.childNodes.length; iNde++)
		{
			oCurNde = oSrcNde.childNodes[iNde];

			var bFnd = false;			
			if ((oCurNde.tagName != undefined) && (oCurNde.tagName != ""))
			{
				var sNdeTag = new String(oCurNde.tagName);
						
				if (sNdeTag.length > 0)
				{
					if (sNdeTag.indexOf(sTagName) > -1)
						bFnd = true;
				}
			}

			if (bFnd == true)
			{
				oRetNde = oCurNde;
				break;
			}
			else if (oCurNde.childNodes.length > 0)
			{				
				oRetNde = ParseDOMForTag( oCurNde, sTagName );
				if (oRetNde != null)
					break;
			}
		}
	}

	return oRetNde;
}

// +-------------------------------------+
// | Utility method to strip non numeric |
// | characters from source string.      |
// +-------------------------------------+
// | IMacNeill 12.20.05 v1.0             |
// | IMacNeill 02.13.07 v1.1             |
// | - If input string is wrapped in ()  |
// |   then assume negative amount.      |
// +-------------------------------------+
function StripNonNumeric( sSrcStr, bIncDec )
{
	var sNewStr = new String("");

	// IMM 021307
	if ((sSrcStr.substr(0,1) == "(") && (sSrcStr.substr(sSrcStr.length-1,1) == ")"))
		sNewStr += "-";

	var sCmpStr = (bIncDec == true ? "0123456789." : "0123456789");

	for ( var iIdx = 0; iIdx < sSrcStr.length; iIdx++ )
		if (sCmpStr.indexOf(sSrcStr.substr(iIdx,1)) > -1)
			sNewStr += sSrcStr.substr(iIdx,1);

	return sNewStr;
}

// +----------------------------------------+
// | Utility method to trim any whitespace  |
// | from supplied string, then return it.  |
// +----------------------------------------+
// | IMacNeill 12.07.05 v1.0                |
// +----------------------------------------+
function TrimWS( sSrcStr )
{
	var sNewStr = new String("");
	var bBegChr = false;
	
	for ( var iIdx = 0; iIdx < sSrcStr.length; iIdx++ )
	{
		if (bBegChr == false)
		{
			if (sSrcStr.charCodeAt( iIdx ) != 32)
				bBegChr = true;
		}
		
		if (bBegChr == true)
			sNewStr += sSrcStr.substr( iIdx, 1 );
	}
	
	var sFnlStr = new String("");
	bBegChr = false;
	for ( iIdx = sNewStr.length - 1; iIdx >= 0; iIdx-- )
	{
		if (bBegChr == false)
		{
			if (sNewStr.charCodeAt( iIdx ) != 32)
				bBegChr = true;
		}
		
		if (bBegChr == true)
			sFnlStr = sNewStr.substr( iIdx, 1 ) + sFnlStr;
	}
	
	return sFnlStr;
}

// +------------------------------------------+
// | Utility function to strip any whitespace |
// | from passed string, then return it.      |
// +------------------------------------------+
// | IMacNeill 01.13.06 v1.0                  |
// +------------------------------------------+
function StripWS( sSrcStr )
{
	var sNewStr = new String("");

	for (var iIdx = 0; iIdx < sSrcStr.length; iIdx++ )
	{
		if (sSrcStr.charCodeAt( iIdx ) != 32)
			sNewStr += sSrcStr.substr( iIdx, 1 );
	}

	return sNewStr;
}

// +-----------------------------------------------+
// | Utility function to strip out any potentially |
// | dangerous characters from input.              |
// +-----------------------------------------------+
// | IMacNeill 01.26.06 v1.0                       |
// | IMacNeill 10.04.07 v1.1                       |
// | > Added apostrophe and double quote to list   |
// |   of bad characters to filter out.            |
// +-----------------------------------------------+
function StripCSS( sSrcStr )
{
	var sNewStr = new String("");

	for (var iIdx = 0; iIdx < sSrcStr.length; iIdx++ )
	{
		if ("'\"<>{};%".indexOf(sSrcStr.substr(iIdx,1)) == -1)
			sNewStr += sSrcStr.substr( iIdx, 1 );
	}

	return sNewStr;
}

// +-------------------------------------------+
// | Utility function to enforce numeric input |
// | on a textbox field.                       |
// +-------------------------------------------+
// | IMacNeill 12.07.05 v1.0                   |
// +-------------------------------------------+
function keyPress_NumericOnly( oFld, oEvt, bAllowDec, bAllowRet )
{
	var bRetVal = false;

	var keyCode = ((window.event) ? window.event.keyCode : oEvt.which);
	var keyChar = String.fromCharCode(keyCode);

	// Allow basic control keys
	if ((keyCode == null) || (keyCode == 0) || (keyCode == 8) || (keyCode == 9) || (keyCode == 27))
		bRetVal = true;
	else if (("0123456789").indexOf(keyChar) > -1)
		bRetVal = true;
	else if ((bAllowDec == true) && (keyChar == "."))
		bRetVal = true;
	else if ((bAllowRet == true) && (keyCode == 13))
		bRetVal = true;
	else
		bRetVal = false;

	return bRetVal;
}

// +-------------------------------------------------+
// | Utility function to enforce phone number format |
// +-------------------------------------------------+
// | IMacNeill 12.20.05 v1.0                         |
// | IMacNeill 06.28.07 v1.1                         |
// | - Fixed bug which prevented Firefox users from  |
// |   deleting or replacing characters.             |
// +-------------------------------------------------+
function keyPress_FormatPhone( oFld, oEvt ) 
{
	var bRetVal = false;

	var keyCode = ((window.event) ? window.event.keyCode : oEvt.which);
	var keyChar = String.fromCharCode(keyCode);

	// Allow basic control keys
	if ((keyCode == null) || (keyCode == 0) || (keyCode == 8) || (keyCode == 9) || (keyCode == 27))
		bRetVal = true;
	else if (("0123456789").indexOf(keyChar) > -1)
	{
		var sNewStr = StripNonNumeric(oFld.value + keyChar,false);
		var sPhnNum = new String("");
		var iSeq = 0;
		for ( var iPos = 0; iPos < sNewStr.length; iPos++ )
		{
			if (iSeq == 0)
				sPhnNum += "(";
			else if (iSeq == 3)
				sPhnNum += ") ";
			else if (iSeq == 6)
				sPhnNum += "-";
			else if (iSeq == 10)
				sPhnNum += " x";

			sPhnNum += sNewStr.substr(iPos,1);
			iSeq++;
		}

		oFld.value = sPhnNum;
		bRetVal = false;
	}
	else
		bRetVal = false;

	return bRetVal;
}

// +--------------------------------------------+
// | Utility function to validate email address |
// +--------------------------------------------+
// | IMacNeill 12.13.05 v1.0                    |
// +--------------------------------------------+
function validateEmail( sEmlAdr )
{
	var emailReg = /^[a-zA-Z0-9._-]+@([a-zA-Z0-9.-]+\.)+[a-zA-Z0-9.-]{2,4}$/;
	var regex = new RegExp(emailReg);
	
	return regex.test(sEmlAdr);
}

// +---------------------------------------+
// | Function to store a cookie to browser |
// +---------------------------------------+
// | IMacNeill 01.05.06 v1.0               |
// +---------------------------------------+
function setCookie( vName, vValue )
{
	document.cookie = vName + "=" + escape(vValue);
}

// +-----------------------------------+
// | Function to retrieve cookie value |
// +-----------------------------------+
// | IMacNeill 01.05.06 v1.0           |
// +-----------------------------------+
function getCookie( vName )
{
	var sCookies = new String(document.cookie);
	var aCookies = sCookies.split(";");
	var sValue = "";

	for (var iCke = 0; iCke < aCookies.length; iCke++)
	{
		sCookie = aCookies[iCke];

		aParts = sCookie.split("=");
		sName = StripWS(aParts[0]);
		if (vName.toString() == sName.toString())
		{
			sValue = unescape(aParts[1]);
			break;
		}
	}	

	return sValue;
}

// +------------------------------------+
// | These are globals which control if |
// | Ajax XmlHttp object is initialized |
// | and whether a call is in progress. |
// +------------------------------------+
// | IMacNeill 05.19.06 v1.0            |
// +------------------------------------+
var g_AjaxInit = false;
var g_AjaxProc = false;

// +--------------------------------------+
// | Function which attempts to return an |
// | XmlHttp object, browser dependant.   |
// +--------------------------------------+
// | IMacNeill 05.19.06 v1.0              |
// +--------------------------------------+
function GetXmlHttpObject()
{
	var oHttp;

	if (window.XMLHttpRequest)
	{
		oHttp = new XMLHttpRequest();
        
		if (oHttp.overrideMimeType) 
			oHttp.overrideMimeType('text/xml');
		
		g_AjaxInit = true;
	}
	else if (window.ActiveXObject)
	{
		try
		{
			oHttp = new ActiveXObject("Msxml2.XMLHTTP");
			g_AjaxInit = true;
		}
		catch (e)
		{
			try
			{
				oHttp = new ActiveXObject("Microsoft.XMLHTTP");
				g_AjaxInit = true;
			}
			catch (e)
			{
			}
		}
	}

	return oHttp;
}

// +-------------------------------------------+
// | Function which uses passed XmlHttp object |
// | along with URL and hanlder function to    |
// | initiate an Ajax Http request.            |
// +-------------------------------------------+
// | IMacNeill 05.19.06 v1.0                   |
// +-------------------------------------------+
function MakeXmlHttpGetRequest( oHttp, sUrl, fHandler, sAction )
{
	// Make sure that Ajax object is initialized
	if (g_AjaxInit == true)
	{
		// Make sure that ajax request is not in progress
		if (g_AjaxProc == false)
		{
			oHttp.open( sAction, sUrl, true );

			// If sAction is POST, assign header
			if ((sAction == "POST") || (sAction == "post"))
				oHttp.setRequestHeader( "Content-type", "application/x-www-form-urlencoded" );

			// Mark Http object is in process
			g_AjaxProc = true;

			// Link up the event handler for return
			oHttp.onreadystatechange = fHandler;

			// Actually performs the call...
			oHttp.send(null);
		}
	}
}

// +-------------------------------------------+
// | Function which handles display of maximum |
// | number of characters remaining for a text |
// | entry form field.                         |
// +-------------------------------------------+
// | IMacNeill 06.01.06 v1.0                   |
// +-------------------------------------------+
function setMaxText( oTxt, oCnt, iLen )
{
	sCur = new String(oTxt.value);
	iCur = sCur.length;
	iRem = iLen - iCur;

	oCnt.value = iRem;

	if (iRem == 0)
		alert("Maximum number of characters reached.");
}

// +----------------------------------------+
// | Function to normalize rounding numbers |
// +----------------------------------------+
// | IMacNeill 09.07.07 v1.0                |
// +----------------------------------------+
function roundNumber( dNum, iDgt )
{
	var dNew = 0.0;
	var sNum = new String(dNum);
	sNum = StripNonNumeric(sNum,true);

	if (sNum.length > 0)
	{
		var dTmp = new Number(sNum);
		dNew = Math.round( dTmp * Math.pow(10,iDgt) ) / Math.pow(10,iDgt);
	}

	return dNew;
}