//****************************************************
// ToNumeric
// converts a string to a number as long as the string is > "-999999"
//****************************************************
function ToNumeric(sString)
{
	if (sString.length<1) return 0;
	return Math.max(-99999,sString);
}
//*******************************
// IsEmailOK
//*******************************
function IsEmailOK(sEmail)
{
	return (sEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1);
}
//*****************************
// InitializeCharLimitFields
// Looks for any form fields with a charlimit='xxx' attribute
// and dynamically adds text below to show user how many 
// chars they have left
//*****************************
function InitializeCharLimitFields()
{
	// for each textarea that contains an attribute called charlimit...
	$("form textarea[charlimit]").each(function() {
		
		// get the designated char limit for this control
		var maxlimit = $(this).attr('charlimit');
		
		// init the "current count"
		var cur = 0;
		
		// get the control's current text
		//var val = $(this).attr('value');
		var val = $(this).val(); // mfindlay, use .val() which will fetch textarea values.
		
		// mfindlay
		// SPECIAL: On init: Dreamweaver's "Apply Source Formatting" can wrap html controls
		//                   in a way that 'inserts' space chars into the gap between the 
		//                   <textarea> and the </textarea> if it is on the next line.
		//                   So inspect for purely spaces, and if so, set val to empty string.
		if (val)
		{
			val = $.trim(val);
			
			// if trimming of spaces results in a completely empty string, then 
			// empty val.
			if (val.length <= 0) 
			{
				val='';
				$(this).val(""); // also remove the spaces from the control
			}
			else
			{
				$(this).val(val);
			}
		}
		
		// set the "current count" to the length of the string currently in the control
		// if value="", or no value (such as in the case with a text area), will cause an error
		// so check to make sure we have a value first.
		if (val) cur = val.length;
		
		// set the "remaining count" to the max designated for the control, minus the length of the 
		// current string in the control
		var remaining = maxlimit-cur;
		
		// append to the control a div containing our counter text
		$(this).after("<div class='counter'>" + remaining.toString()+" remaining"+"</div>");
		// You can use something like this to align the 'counter' to the right of the input field.
		
		// fetch the 'counter' div we just appended to our control and set its width and CSS 
		var c = $(this).next(".counter");
		c.width(120);
		c.css("font","12px Georgia")
		c.css("color","gray");
		
		// Bind a custom function to the 'keyup' event that will check the length of the 
		// current text and disallow further entry once the limit is reached.
		
		// keyup keypress. e is the event, so you could examine the e.keyCode if you like
		$(this).keyup(function(e) {
			// fetch the max limit
			//var maxlimit = $(this).attr('charlimit');
			
			// fetch the current text value in the control
			var val = $(this).attr('value');
			var cur = 0;
			
			if(val) 
			{
				cur = val.length;
			}
			var remaining = maxlimit-cur;
			
			// if user has reached max limit, disallow the keypress and truncate the string.
			if (remaining < 0) 
			{
				val = val.substr(0,maxlimit);
				$(this).val(val);
				remaining=0;
			}
			
			// set the counter text
			$(this).next(".counter").text(remaining.toString() + " remaining");
			return this;
		}); // $(this).keyup(function(i)
	}); //$("form textarea[@charlimit]").each(function()
}

//****************************************************
// Move the selected item in the listbox up or down
//****************************************************
function listbox_move(listID, direction) {

	var listbox = document.getElementById(listID);
	var selIndex = listbox.selectedIndex;

	if(-1 == selIndex) {
		//alert("Please select an option to move.");
		return;
	}

	var increment = -1;
	if(direction == 'up')
		increment = -1;
	else
		increment = 1;

	if((selIndex + increment) < 0 ||
		(selIndex + increment) > (listbox.options.length-1)) {
		return;
	}

	var selValue = listbox.options[selIndex].value;
	var selText = listbox.options[selIndex].text;
	listbox.options[selIndex].value = listbox.options[selIndex + increment].value
	listbox.options[selIndex].text = listbox.options[selIndex + increment].text

	listbox.options[selIndex + increment].value = selValue;
	listbox.options[selIndex + increment].text = selText;

	listbox.selectedIndex = selIndex + increment;
}


//**********************************************
// isNumberFloat
//**********************************************
function isNumberFloat(inputString)
{
  return (!isNaN(parseFloat(inputString))) ? true : false;
}
//***********************************************
// FormatCurrency
//***********************************************
function FormatCurrency(num) 
{
	num = num.toString().replace(/\$|\,/g,'');
	
	if (isNaN(num))
	{
		num = "0";
	}
	
	sign = (num == (num = Math.abs(num)));
	num = Math.floor(num*100+0.50000000001);
	cents = num%100;
	num = Math.floor(num/100).toString();
	
	if (cents<10)
	{
		cents = "0" + cents;
	}
	
	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
	{
		num = num.substring(0,num.length-(4*i+3))+','+ num.substring(num.length-(4*i+3));
	}
	
	return (((sign)?'':'-') + '$' + num + '.' + cents);
}
//*******************************
// IsValueInStringList
//*******************************
function IsValueInStringList(sValue,sReturnList)
{
	var arrList = sReturnList.split(",");
	var nLen = arrList.length;
	
	for (var x = 0; x<nLen; x++)
	{
		sWrk = arrList[x];
		if (sWrk == sValue)
		{
			return true;
		}
	}
	
	return false;
}
//**********************************************
// isNumberInt
//**********************************************
function isNumberInt(inputString)
{
  return (!isNaN(parseInt(inputString))) ? true : false;
}

//***************************************
// IsValidNumber
//DESCRIPTION: Validates that a string contains only valid numbers.
//
//PARAMETERS:
//   strValue - String to be tested for validity
//
//RETURNS:
//   True if valid, otherwise false.
//***************************************
function  IsValidNumber( strValue ) 
{
  //var objRegExp  =  /^((\d*)|(\d*\.\d{1})|(\d*\.\d{2}))$/;  // for full currency
  var objRegExp  =  /^(\d*)$/;
  //check for numeric characters
  return objRegExp.test(strValue);
}


//****************************************************
// IsNumberFloat
//****************************************************
function IsNumberFloat(inputString)
{
  return (!isNaN(parseFloat(inputString))) ? true : false;
}	
//*******************************
// IsValidEmail
//*******************************
function IsValidEmail(sEmail)
{
	return (sEmail.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1);
}
//**************************************************
// ValidateIntInput
//**************************************************
function ValidateIntInput(objEvent)
{
/*
	objEvent properties: See http://www.javascriptkit.com/domref/domevent.shtml
	See also: http://msdn.microsoft.com/en-us/library/ms535863(VS.85).aspx
	
	altKey, ctrlKey, shiftKey:   Boolean properties that indicate whether the Alt, Ctrl, and Shift keys were pressed at time of the event.
	button:   An integer indicating which mouse button was pressed or released, 
	          1 = left, 2 = right, 4 = middle. If multiple buttons are pressed, 
			  the value is the sum of both buttons, such as 3 (1+2) for left and right.  
    cancelBubble:  Set to true to prevent the event from bubbling. 
	clientX, clientY: Returns the mouse coordinates at the time of the event relative to upper-left corner of the window. 
	fromElement, toElement:  For mouseover and mouseout events, these properties indicate the elements the mouse 
	                         is leaving from and moving onto, respectively. relatedTarget 
	keyCode: Property indicating the Unicode for the key pressed. Use String.fromCharCode(keyCode) to convert code to string. 
	         (see also charCode in Netscape)
	offsetX, offsetY:  Returns the mouse coordinates relative to the originating element. 
	returnValue:  Set to false to cancel any default action for the event. 
					see also preventDefault() 
	srcElement:  The element in which the event occurred on. 
					see also target
	type: A string indicating the type of event, such as "mouseover", "click", etc. 
*/
	// disallow any accelerator keys
	if (objEvent.altKey || objEvent.ctrlKey ||  objEvent.shiftKey)
	{
		return false;	
	}
	
	var nKeyCode = objEvent.keyCode;

	// dis-allow shift key
	if (nKeyCode == 16) return false;

	//alert(event.data);
	// allow 0 through 9 on regular keyboard
	if ((nKeyCode >= 48) && (nKeyCode <= 57)) return true;
	// allow 0 through 9 on keypad
	if ((nKeyCode >= 96) && (nKeyCode <= 105)) return true;
	
	// allow backspace
	if (nKeyCode == 8) return true;
	
	// allow delete key
	if (nKeyCode == 46) return true;
	
	// allow tab key
	if (nKeyCode == 9) return true;
	
	return false;
}
//**********************************************
// ValidateNumericInput
// usage: from html input form: onkeydown="return ValidateNumericInput(event.keyCode)"
//**********************************************
function ValidateNumericInput(objEvent)
{
/*
	objEvent properties: See http://www.javascriptkit.com/domref/domevent.shtml
	See also: http://msdn.microsoft.com/en-us/library/ms535863(VS.85).aspx
	
	altKey, ctrlKey, shiftKey:   Boolean properties that indicate whether the Alt, Ctrl, and Shift keys were pressed at time of the event.
	button:   An integer indicating which mouse button was pressed or released, 
	          1 = left, 2 = right, 4 = middle. If multiple buttons are pressed, 
			  the value is the sum of both buttons, such as 3 (1+2) for left and right.  
    cancelBubble:  Set to true to prevent the event from bubbling. 
	clientX, clientY: Returns the mouse coordinates at the time of the event relative to upper-left corner of the window. 
	fromElement, toElement:  For mouseover and mouseout events, these properties indicate the elements the mouse 
	                         is leaving from and moving onto, respectively. relatedTarget 
	keyCode: Property indicating the Unicode for the key pressed. Use String.fromCharCode(keyCode) to convert code to string. 
	         (see also charCode in Netscape)
	offsetX, offsetY:  Returns the mouse coordinates relative to the originating element. 
	returnValue:  Set to false to cancel any default action for the event. 
					see also preventDefault() 
	srcElement:  The element in which the event occurred on. 
					see also target
	type: A string indicating the type of event, such as "mouseover", "click", etc. 
*/
	// disallow any accelerator keys
	if (objEvent.altKey || objEvent.ctrlKey ||  objEvent.shiftKey)
	{
		return false;	
	}
	
	var nKeyCode = objEvent.keyCode;

	// allow 0 through 9 on regular keyboard
	if ((nKeyCode >= 48) && (nKeyCode <= 57)) return true;
	// allow 0 through 9 on keypad
	if ((nKeyCode >= 96) && (nKeyCode <= 105)) return true;
	
	// allow backspace
	if (nKeyCode == 8) return true;
	
	// allow delete key
	if (nKeyCode == 46) return true;
	
	// allow tab key
	if (nKeyCode == 9) return true;
	// allow shift key
	if (nKeyCode == 16) return true;
	
	return false;
}
//**********************************************
// ValidateDecimalInput
// usage: from html input form: onkeydown="return ValidateDecimalInput(event.keyCode)" -allows numeric and . (decimal point) and comma
//**********************************************
function ValidateDecimalInput(objEvent)
{
/*
	objEvent properties: See http://www.javascriptkit.com/domref/domevent.shtml
	See also: http://msdn.microsoft.com/en-us/library/ms535863(VS.85).aspx
	
	altKey, ctrlKey, shiftKey:   Boolean properties that indicate whether the Alt, Ctrl, and Shift keys were pressed at time of the event.
	button:   An integer indicating which mouse button was pressed or released, 
	          1 = left, 2 = right, 4 = middle. If multiple buttons are pressed, 
			  the value is the sum of both buttons, such as 3 (1+2) for left and right.  
    cancelBubble:  Set to true to prevent the event from bubbling. 
	clientX, clientY: Returns the mouse coordinates at the time of the event relative to upper-left corner of the window. 
	fromElement, toElement:  For mouseover and mouseout events, these properties indicate the elements the mouse 
	                         is leaving from and moving onto, respectively. relatedTarget 
	keyCode: Property indicating the Unicode for the key pressed. Use String.fromCharCode(keyCode) to convert code to string. 
	         (see also charCode in Netscape)
	offsetX, offsetY:  Returns the mouse coordinates relative to the originating element. 
	returnValue:  Set to false to cancel any default action for the event. 
					see also preventDefault() 
	srcElement:  The element in which the event occurred on. 
					see also target
	type: A string indicating the type of event, such as "mouseover", "click", etc. 
*/
	// disallow any accelerator keys
	if (objEvent.altKey || objEvent.ctrlKey ||  objEvent.shiftKey)
	{
		return false;	
	}
	
	var nKeyCode = objEvent.keyCode;

	// allow 0 through 9 on regular keyboard
	if ((nKeyCode >= 48) && (nKeyCode <= 57)) return true;
	// allow 0 through 9 on keypad
	if ((nKeyCode >= 96) && (nKeyCode <= 105)) return true;
	
	// allow backspace
	if (nKeyCode == 8) return true;
	
	// allow delete key
	if (nKeyCode == 46) return true;
	
	// allow tab key
	if (nKeyCode == 9) return true;
	// allow shift key
	if (nKeyCode == 16) return true;
	
	// allow decimal point key
	if (nKeyCode == 190) return true;
	if (nKeyCode == 110) return true;
	// allow , comma key
	if (nKeyCode == 188) return true;
	return false;
}
//**********************************************
// ValidateDecimalInputNoCommas
// usage: from html input form: onkeydown="return ValidateDecimalInputNoCommas(event.keyCode)" -allows numeric and . (decimal point)
//**********************************************
function ValidateDecimalInputNoCommas(objEvent)
{
/*
	objEvent properties: See http://www.javascriptkit.com/domref/domevent.shtml
	See also: http://msdn.microsoft.com/en-us/library/ms535863(VS.85).aspx
	
	altKey, ctrlKey, shiftKey:   Boolean properties that indicate whether the Alt, Ctrl, and Shift keys were pressed at time of the event.
	button:   An integer indicating which mouse button was pressed or released, 
	          1 = left, 2 = right, 4 = middle. If multiple buttons are pressed, 
			  the value is the sum of both buttons, such as 3 (1+2) for left and right.  
    cancelBubble:  Set to true to prevent the event from bubbling. 
	clientX, clientY: Returns the mouse coordinates at the time of the event relative to upper-left corner of the window. 
	fromElement, toElement:  For mouseover and mouseout events, these properties indicate the elements the mouse 
	                         is leaving from and moving onto, respectively. relatedTarget 
	keyCode: Property indicating the Unicode for the key pressed. Use String.fromCharCode(keyCode) to convert code to string. 
	         (see also charCode in Netscape)
	offsetX, offsetY:  Returns the mouse coordinates relative to the originating element. 
	returnValue:  Set to false to cancel any default action for the event. 
					see also preventDefault() 
	srcElement:  The element in which the event occurred on. 
					see also target
	type: A string indicating the type of event, such as "mouseover", "click", etc. 
*/
	// disallow any accelerator keys
	if (objEvent.altKey || objEvent.ctrlKey ||  objEvent.shiftKey)
	{
		return false;	
	}
	
	var nKeyCode = objEvent.keyCode;

	// allow 0 through 9 on regular keyboard
	if ((nKeyCode >= 48) && (nKeyCode <= 57)) return true;
	// allow 0 through 9 on keypad
	if ((nKeyCode >= 96) && (nKeyCode <= 105)) return true;
	
	// allow backspace
	if (nKeyCode == 8) return true;
	
	// allow delete key
	if (nKeyCode == 46) return true;
	
	// allow tab key
	if (nKeyCode == 9) return true;
	// allow shift key
	if (nKeyCode == 16) return true;
	
	// allow decimal point key
	if (nKeyCode == 190) return true;
	if (nKeyCode == 110) return true;
	return false;
}
//**********************************************
// ValidateDecimalInputMinusOKNoCommas
// usage: from html input form: onkeydown="return ValidateDecimalInputNoCommas(event.keyCode)" -allows numeric and . (decimal point)
//**********************************************
function ValidateDecimalInputMinusOKNoCommas(objEvent)
{
/*
	objEvent properties: See http://www.javascriptkit.com/domref/domevent.shtml
	altKey, ctrlKey, shiftKey:   Boolean properties that indicate whether the Alt, Ctrl, and Shift keys were pressed at time of the event.
	button:   An integer indicating which mouse button was pressed or released, 
	          1 = left, 2 = right, 4 = middle. If multiple buttons are pressed, 
			  the value is the sum of both buttons, such as 3 (1+2) for left and right.  
    cancelBubble:  Set to true to prevent the event from bubbling. 
	clientX, clientY: Returns the mouse coordinates at the time of the event relative to upper-left corner of the window. 
	fromElement, toElement:  For mouseover and mouseout events, these properties indicate the elements the mouse 
	                         is leaving from and moving onto, respectively. relatedTarget 
	keyCode: Property indicating the Unicode for the key pressed. Use String.fromCharCode(keyCode) to convert code to string. 
	         (see also charCode in Netscape)
	offsetX, offsetY:  Returns the mouse coordinates relative to the originating element. 
	returnValue:  Set to false to cancel any default action for the event. 
					see also preventDefault() 
	srcElement:  The element in which the event occurred on. 
					see also target
	type: A string indicating the type of event, such as "mouseover", "click", etc. 
*/
	// disallow any accelerator keys
	if (objEvent.altKey || objEvent.ctrlKey ||  objEvent.shiftKey)
	{
		return false;	
	}
	
	var nKeyCode = objEvent.keyCode;

	// allow 0 through 9 on regular keyboard
	if ((nKeyCode >= 48) && (nKeyCode <= 57)) return true;
	// allow 0 through 9 on keypad
	if ((nKeyCode >= 96) && (nKeyCode <= 105)) return true;
	
	// allow backspace
	if (nKeyCode == 8) return true;
	
	// allow delete key
	if (nKeyCode == 46) return true;
	
	// allow tab key
	if (nKeyCode == 9) return true;
	// allow shift key
	if (nKeyCode == 16) return true;
	
	// allow decimal point key
	if (nKeyCode == 190) return true;
	if (nKeyCode == 110) return true;
	
	// allow minus sign or dash  key
	if (nKeyCode == 109) return true;
	if (nKeyCode == 189) return true;
	return false;
}
//****************************************************
// StripStringOfCommas
// Removes commas and minus sign from a string
//****************************************************
function StripStringOfCommas(sString)
{
	
	var s = sString.replace(/,/g,"");  	// remove commas from string
	s = s.replace(/-/g,"");  //remove the minus sign
	return s;
}
//****************************************************
// IsMac
//****************************************************
function IsMac()
{
  if(navigator.appVersion.indexOf("Win") != -1)
  {
    return false;
  }
  else if(navigator.appVersion.indexOf("Mac") != -1)
  {
    return true;
  }
  else return false;
}
//****************************************************
// ConvertHTML
// Converts the opening and closing HTML tags to parens
//****************************************************
function ConvertHTML(sInput)
{
	var sOutput = sInput;
    sOutput=sOutput.replace(/</g,"(");
    sOutput=sOutput.replace(/>/g,")");
	return sOutput;
}
//****************************************************
// CleanWordChars
//****************************************************
function CleanWordChars(inputString)
{
	//alert("entry to CleanWords");
	
	var returnString = inputString;
	
	var nLen = returnString.length;
	
	//alert("before: " + returnString);
	
	// clean special MSWord chars
	/*
	returnString = returnString.replace(//g,"...");  			// replace elipses with ascii ...
	returnString = returnString.replace(//g,"'");  			// replace apos with ascii apos
	returnString = returnString.replace(//g,"\"");  			// replace ending quotes with ascii ending quotes
	returnString = returnString.replace(//g,"\"");  			// replace beginning quotes with ascii ending quotes
	returnString = returnString.replace(//g,"1/2");  			// replace  with 1/2
	*/
	
	//alert("after: " + returnString);

	for (var x=0; x<nLen; x++)
	{
		var c = returnString.charAt(x);
		
		// standard alpha chars
		if ((c >='a') && (c <='z')) continue;
		if ((c >='A') && (c <='Z')) continue;
		if ((c >='0') && (c <='9')) continue;
		
		// standard keyboard special chars
		switch(c)
		{
			// Allow the < and the > since the calling code takes care of editing it.
			case '>' : continue;	
			case '<' : continue;	
			
			case ' ' : continue;	
			case '.' : continue;	
			case ',' : continue;	
			case '?' : continue;	
			case '!' : continue;	
			case '"' : continue;	
			case '-' : continue;	
			case '@' : continue;	
			case '#' : continue;	
			case '$' : continue;	
			case '%' : continue;	
			case '^' : continue;	
			case '*' : continue;	
			case '&' : continue;	
			case '(' : continue;	
			case ')' : continue;	
			case '_' : continue;	
			case '+' : continue;	
			case '=' : continue;	
			case '[' : continue;	
			case ']' : continue;	
			case '{' : continue;	
			case '}' : continue;	
			case '&' : continue;	
			case '\'' : continue;	
			case ';' : continue;	
			case ':' : continue;	
			case '`' : continue;	
			case '~' : continue;	
			case '/' : continue;	
			case '|' : continue;	
			case '\\' : continue;	
			case '\t' : continue;	
			case '\r' : continue;	
			case '\n' : continue;	
			case '\r\n' : continue;	
		}
		
		//alert("Replacing char: [" + c + "] with space");
		
		// drop this unknown char
		//returnString[x]=' '; 
		returnString = returnString.replace(c," ");  
	}
	
	return returnString;
}
//****************************************************
// StripStringOfVulnerableChars 
// Removes vulnerable chars from a string
//****************************************************
function StripStringOfVulnerableChars(sString,bStripSpaces)
{
	
	var s = sString.replace(/'/g,"");  	// remove tics from string
	s = s.replace(/;/g,"");  			// remove semicolons from string
	s = s.replace(/\(/g,"");  			// remove lefts paren from string
	s = s.replace(/\)/g,"");  			// remove right parens from string
	s = s.replace(/\*/g,"");  			// remove asterisk from string
	s = s.replace(/"/g,"");  			// remove double quotes from string
	s = s.replace(/--/g,"");  			// remove double dash from string
	s = s.replace(/=/g,"");  			// remove equal signs from string

	//s = s.replace(/#/g,"");  			// remove pound signs from string
	if (bStripSpaces)
	{
		s = s.replace(/ /g,"");  		// remove spaces from string
	}
	return s;
}

//****************************************************
// JSTrim
// Removes LEADING and TRAILING spaces ONLY from a string
// optional 3rd and 4th parms: BOOL BOOL
// 3rd parm: BOOL  - strip vulnerable chars
// 4th parm: BOOL  - strip internal spaces as part of strip
//****************************************************
function JSTrim (inputString, removeChar) 
{
	// Clean MSWord chars et al.
	var returnString = CleanWordChars(inputString);
	if (removeChar.length)
	{
	  while(''+returnString.charAt(0)==removeChar)
		{
		  returnString=returnString.substring(1,returnString.length);
		}
		while(''+returnString.charAt(returnString.length-1)==removeChar)
	  {
	    returnString=returnString.substring(0,returnString.length-1);
	  }
	}
	var s = ConvertHTML(returnString);
	
	// check to see if additional parms were passed to tell us to 
	// strip out dangerous security risk chars
	var bCheckForVulnerabilities = (JSTrim.arguments.length > 2) ? JSTrim.arguments[2] : false;
	var bStripSpacesFromString = (JSTrim.arguments.length > 3) ? JSTrim.arguments[3] : false;
	
	// if requested, strip also for vulnerabilities
	if (bCheckForVulnerabilities) 
	{
		s = StripStringOfVulnerableChars(s,bStripSpacesFromString);
	}
	else
	{
		// just clean of all spaces?
		if (bStripSpacesFromString)
		{
			s = s.replace(/ /g,"");  		// remove spaces from string
		}
	}
	
	return s;
}
//****************************************************
// JSTrimSpace
// Removes leading and trailing spaces from a string
// optional 2nd and 3rd parms: BOOL BOOL
// 2nd parm: BOOL  - strip vulnerable chars
// 3rd parm: BOOL  - strip internal spaces as part of strip
//****************************************************
function JSTrimSpace(inputString)
{
	// strip vulnerable chars?
	var bCheckForVulnerabilities = (JSTrimSpace.arguments.length > 1) ? JSTrimSpace.arguments[1] : false;
	var bStripSpacesFromString = (JSTrimSpace.arguments.length > 2) ? JSTrimSpace.arguments[2] : false;

	return JSTrim(inputString,' ',bCheckForVulnerabilities,bStripSpacesFromString);
}

//****************************************************
// CCTrim (credit card trim)
// Removes dashes from a string
// Removes spaces from anywhere within the string
//****************************************************
function CCTrim(sString)
{
	var s = sString.replace(/-/g,"");  // remove dashes from string
	s = s.replace(/ /g,"");  // remove spaces from string
	return s;
}

//****************************************************
// IsPositiveInt
// Returns true if a string >= zero.
//****************************************************
function IsPositiveInt(sString)
{
	if (sString.length < 1) return false;
	
	for (var x=0; x<sString.length; x++)
	{
		// Make sure the tax rates are numeric only, with the exception of the '.'
		if (sString.charAt(x) < "0" || 
			sString.charAt(x) > "9")
		{
			return false;
		}
	}
	return true;
}
//*******************************
// IsValidCCNumber
//*******************************
function IsValidCCNumber(s) {
	// remove non-numerics
	var v = "0123456789";
	var w = "";
	for (i=0; i < s.length; i++) {
	x = s.charAt(i);
	if (v.indexOf(x,0) != -1)
	w += x;
	}
	// validate number
	j = w.length / 2;
	if (j < 6.5 || j > 8 || j == 7) return false;
	k = Math.floor(j);
	m = Math.ceil(j) - k;
	c = 0;
	for (i=0; i<k; i++) {
	a = w.charAt(i*2+m) * 2;
	c += a > 9 ? Math.floor(a/10 + a%10) : a;
	}
	for (i=0; i<k+m; i++) c += w.charAt(i*2+1-m) * 1;
	return (c%10 == 0);
}
//****************************************************
// AreDatesInSequence
// determines if from date is < = to date
//****************************************************
function AreDatesInSequence(strFROM, strTO)
{
	var dtFrom = new Date(strFROM);
	var dtTo = new Date(strTO);
	
	if (dtFrom.getFullYear() < dtTo.getFullYear()) { return true; }
	
	if (dtFrom.getFullYear() == dtTo.getFullYear()) 
	{
		if (dtFrom.getMonth() < dtTo.getMonth()) { return true; }
	}
	
	if (dtFrom.getFullYear() == dtTo.getFullYear()) 
	{
		if (dtFrom.getMonth() == dtTo.getMonth()) 
		{
			if (dtFrom.getDate() <= dtTo.getDate()) { return true; } 
		}
	}
	
	return false;
}
var popUpLinkWin=0;
//****************************************************
// popUpLinkWindow
// optional arguments: width,height,left,top
//****************************************************
function popUpLinkWindow(url)
{
  	if(popUpLinkWin)
  	{
    	if(!popUpLinkWin.closed) popUpLinkWin.close();
  	}
	
	var nWidth=600;
	var nHeight=400;
	var nLeft=10;
	var nTop=10;
	
	if (popUpLinkWindow.arguments.length > 1)
	{
		nWidth = parseInt(popUpLinkWindow.arguments[1])
	}
	if (popUpLinkWindow.arguments.length > 2)
	{
		nHeight = parseInt(popUpLinkWindow.arguments[2])
	}
	if (popUpLinkWindow.arguments.length > 3)
	{
		nLeft = parseInt(popUpLinkWindow.arguments[3])
	}
	if (popUpLinkWindow.arguments.length > 4)
	{
		nTop = parseInt(popUpLinkWindow.arguments[4])
	}
	
	popUpLinkWin = open(url, 'link', 'height=' + nHeight + ',width=' + nWidth + ',left=' + nLeft + ',top=' + nTop + ',toolbar=yes,menubar=yes,scrollbars=yes,resizable=yes,location=yes,directories=yes,status=yes');
	popUpLinkWin.focus();
}
//****************************************************
// popUpLinkWindow
// optional arguments: width,height,left,top
//****************************************************
function popUpLinkWindow2(url)
{
  	if(popUpLinkWin)
  	{
    	if(!popUpLinkWin.closed) popUpLinkWin.close();
  	}
	
	var nWidth=600;
	var nHeight=400;
	var nLeft=10;
	var nTop=10;
	
	if (popUpLinkWindow2.arguments.length > 1)
	{
		nWidth = parseInt(popUpLinkWindow2.arguments[1])
	}
	if (popUpLinkWindow2.arguments.length > 2)
	{
		nHeight = parseInt(popUpLinkWindow2.arguments[2])
	}
	if (popUpLinkWindow2.arguments.length > 3)
	{
		nLeft = parseInt(popUpLinkWindow2.arguments[3])
	}
	if (popUpLinkWindow2.arguments.length > 4)
	{
		nTop = parseInt(popUpLinkWindow2.arguments[4])
	}
	
	popUpLinkWin = open(url, 'link', 'height=' + nHeight + ',width=' + nWidth + ',left=' + nLeft + ',top=' + nTop + ',toolbar=no,menubar=no,scrollbars=yes,resizable=yes,location=yes,directories=yes,status=yes');
	popUpLinkWin.focus();
}
var winopts = "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=no,resizable=no,height=510,width=510,copyhistory=0,"; 
var winopts2 = "toolbar=0,location=0,directories=0,status=0,menubar=0,scrollbars=no,resizable=yes,height=460,width=700,copyhistory=0,"; 
var smallwindow = null;
function setEvent() {
     return false;
}
function historywin(filename) {
    fileURL=filename;
     if (parseInt(navigator.appVersion) < 4) {
        if (smallwindow != null) smallwindow.close();
   }  
    timerID= setTimeout('Opener(fileURL)',100);
                              }
function Opener(winname)
{
	var useopts = winopts;
  	filename = winname;
  
  	// if circlepix, set different window size
  	if (filename.indexOf("circlepix") != -1)
  	{
  		useopts = winopts2;
  	}
  
  	winname = "historywin"
 
  	smallwindow = window.open(filename,winname,useopts)
  
  	if( navigator.appVersion.indexOf("(X11") != -1 || 
  	navigator.appVersion.indexOf("(Mac") != -1)
  	{
       smallwindow = window.open(filename,winname,useopts)
  	}

  	if( navigator.appVersion.indexOf("MSIE") == -1 )
  	{
      smallwindow.mainWin = this;
  	}
    
	WindowFocus();
}

//*********************************************
// WindowFocus
//*********************************************
function WindowFocus()
{
  
	if( navigator.appVersion.indexOf("2.") == -1 &&  navigator.appVersion.indexOf("MSIE") == -1 )
	{
	   smallwindow.focus();
	}
}
//******* END VIRTUAL TOUR FUNCTIONS *************************************************************************
//*****************************
// TurnOffMouseWheel
//*****************************
function TurnOffMouseWheel()
{
	$("select").each(function(){
				$(this).bind("mousewheel", function(e){
					//alert("mousewheel detected");
      				return false;
    			}); // bind
					
			}); // each
}



