	var spf_EXT
	var spf_bUseParen

	var RE6_MAXNUMBER = 10000000000
	var RE6_MINNUMBER = -10000000000

	var NS_ALLOWNEGATIVE = 1
	var NS_ALLOWDECIMAL = 2
	var NS_REMOVECURRENCY = 4
	var NS_CHECKMAXVAL = 8

	function FormatNumber(sTemp,nCheckDesc) {

		var tmp = rawnum(sTemp)
		if (tmp.length > 0) {
			switch (nCheckDesc) {
				case fmtNUMBER:
				case fmtNUMBER_NEGATIVE:
					if (tmp==0) {tmp=''}
					break

				case fmtNUMBER_FORMATTED:
					tmp = AddNumberFormatting(tmp)
					break
				case fmtNUMBER_DECIMAL:
					tmp = fixed(tmp)
					break
				case fmtNUMBER_4DECIMAL:
					tmp = fixed(tmp, 4)
					break

				case fmtNUMBER_THREE_DECIMAL_CUT_ZEROS:
					tmp = fixed(tmp,3)
					//trim zeros after decimal
					tmp = Number(tmp)
					if (isNaN(tmp)) {tmp = sTemp}
					break

				case fmtRATE:
					if ((tmp.length > 0) && (tmp.substr(tmp.length-1) == ServerDecimalSep)) {
						tmp = tmp.substring(0,tmp.length-1)
					}
					tmp = fixed(tmp,3)
					break
				case fmtANNUAL_RATE:
					if ((tmp.length > 0) && (tmp.substr(tmp.length-1) == ServerDecimalSep)) {
						tmp = tmp.substring(0,tmp.length-1)
					}
					tmp = fixed(tmp,5)
					break

				case fmtGPA:
					tmp = FormatGPA(tmp)
					break
			}

			return tmp
		} else {
			return sTemp
		}
	}

	function FormatAmount(sTemp,nCheckDesc) {

		var nFlags = 0
		var nTemp = rawnum(sTemp)
		var bIsNegative = false

		if (oLibPage.OneOf(nCheckDesc,fmtAMOUNT_NEGATIVE,fmtAMOUNT_NEGATIVE_NOCURRENCY,fmtAMOUNT_NEGATIVE_THREE_DECIMAL,fmtAMOUNT_NEGATIVE_FORMAT_ZERO)) {
			nFlags = NS_ALLOWNEGATIVE
			bIsNegative = (nTemp<0)
			nTemp = Math.abs(nTemp)
		}

		var bOk = ValidAmount(sTemp,nFlags)

		if (!bOk) {
			return sTemp
		}

		//if (((nTemp==0) && bOk && (nCheckDesc != bbCD_AMOUNT_FORMAT_ZERO)) || (nTemp.length==0)) {
		if ((nCheckDesc != fmtAMOUNT_ALLOW_ZERO) && (nCheckDesc != fmtAMOUNT_NEGATIVE_FORMAT_ZERO) && ((nTemp==0) || (nTemp.length==0))) {
			return ''
		}

		return (bIsNegative?'(':'') + currency(nTemp, nCheckDesc) + (bIsNegative?')':'')
	}


	function ValidAmount(sTemp,nFlags) {
		// Amounts must be >= 0, unless otherwise indicated

		if (ValidAmount.arguments.length < 2) {
			nFlags = 0
		}

		var tmp = rawnum(sTemp)

		if ((sTemp.length > 0) && (tmp.length==0)) {
			return false
		}


		if ((nFlags & NS_ALLOWNEGATIVE) == 0) {
			if (tmp < 0) {
				return false
			}
		}

		return ((tmp < RE6_MAXNUMBER) && (tmp > RE6_MINNUMBER))

	}

	function ValidNumber(nTemp,nFlags) {
		var tmp
		var sTemp = nTemp.toString()

		if (sTemp.length == 0) {
			return true
		}

		//check Max Value by default
		nFlags |= NS_CHECKMAXVAL

		tmp = rawnumCheck(sTemp)
		if (tmp == 'NaN') {
			return false
		}

		if ((tmp.length == 0) || (isNaN(tmp))) {
			//sTemp had Invalid Chars
			return false
		}


		if ((nFlags & NS_ALLOWNEGATIVE) == 0) {
			if ((tmp < 0) || (sTemp.indexOf('-') > -1)) {
				return false
			}
		}

		if ((nFlags & NS_ALLOWDECIMAL) == 0) {
			if ((sTemp.indexOf('.') > -1)) {
				return false
			}
		}

		if ((nFlags & NS_CHECKMAXVAL) == NS_CHECKMAXVAL) {
			if (tmp >= RE6_MAXNUMBER) {
				return false
			}
		}

		return true

	}

	function NumberInRange(value, nCheckValue, bCheckMin) {
		return bCheckMin?(value >=nCheckValue):(value <=nCheckValue)
	}

	function AddNumberFormatting(anynum){
		var intnum
		var intstr
		var intlen, temp1, temp2
		var retval
		var decstr

		var sNum = '' + fixed(anynum)

		var ptr = sNum.indexOf(ServerDecimalSep)

		intnum = 1 * (sNum.substring(0,ptr))
		intstr = '' + intnum
		decstr = sNum.substr(ptr+1)

		if (intnum >= 1000) {
			intlen = intstr.length
			temp1 = parseInt('' + (intnum/1000))
			temp2 = intstr.substring(intlen-3,intlen)
			intstr = temp1 + ServerThousandSep + temp2
		}

		if (intnum >= 1000000) {
			intlen = intstr.length
			temp1 = parseInt('' + (intnum/1000000))
			temp2 = intstr.substring(intlen-7,intlen)
			intstr = temp1 + ServerThousandSep + temp2
		}

		if (intnum >= 1000000000) {
			intlen = intstr.length
			temp1 = parseInt('' + (intnum/1000000000))
			temp2 = intstr.substring(intlen-11,intlen)
			intstr = temp1 + ServerThousandSep + temp2
		}

		return intstr
	}

	function currency(anynum, iFmt) {
		//returns number as string in $xxx,xxx.xx format.
		var retval
		var idecimals
		if (iFmt == fmtAMOUNT_THREE_DECIMAL) {
			idecimals = 3
		} else {
			idecimals = 2
		}
		var sNum = '' + fixed(anynum, idecimals)
		var ptr = sNum.indexOf(ServerDecimalSep)
		var intnum = 1 * (sNum.substring(0,ptr))
		var intstr = '' + intnum
		var decstr = sNum.substr(ptr+1)

		intstr = AddNumberFormatting(intstr)
		retval = intstr + ServerDecimalSep + decstr
		if (anynum < 0) {
			retval='('+retval+')'
		}

		switch (iFmt) {
			case fmtAMOUNT_NOCURRENCY:
				return retval
				break
			default:
				return addCurrencySymbol(retval)
		}
	}


	function fixed(anynum,decplaces) {
		//returns number in xxxxxx.xx format.
		var intnum
		var nFactor

		if (decplaces == null) {decplaces = 2}
		nFactor = Math.pow(10, decplaces)

		anynum = '' + (anynum + '').replace(/^0+/,'')
		if ((anynum.length==0) || (anynum=='.')){ anynum = '0' }
		if ((anynum < 1) && (anynum > -1)) {
			intnum = 0
		} else {
			intnum = parseInt(anynum) //isolate integer portion
			intnum = Math.abs(intnum)
		}

		var xf = parseFloat(anynum) * nFactor //100

		if ((anynum < 1) && (anynum > -1)) {
			var xi = 0
		} else {
			var xi = parseInt(anynum) * nFactor //100
		}
		var decnum = xf-xi

		var decstr = '' + Math.abs(Math.round(decnum))
		//var decstr = '' + Math.abs(parseInt(decnum))

		//if (decstr == '100') {
		if (decstr == '' + nFactor) {
			intnum = intnum + 1
			//decstr = '00'
			decstr = String(nFactor).substr(1)
		}
		while (decstr.length < decplaces) {decstr = '0' + decstr}
		if (anynum < 0) { intnum = '-' + intnum}
		return (intnum + '.' + decstr)

	}

	function integer(anynum) {
		//returns just the integer portion of anynum.
		return parseInt(anynum)
	}

	function isdiv(anynum,divisor) {
		//returns true if anynum is evenly divisible by divisor.
		var retval = false
		if (parseInt(anynum/divisor) == parseFloat (anynum/divisor)) {
				retval = true
		}
		return retval
	}

	function iseven(anynum) {
		//returns true if anynum is an even number.
		var retval = false
		if (parseInt(anynum/2) == parseFloat (anynum/2)) {
				retval = true
		}
		return retval
	}

	function isodd(anynum) {
		//returns true if anynum is an odd number.
		var retval = true
		if (parseInt(anynum/2) == parseFloat (anynum/2)) {
				retval = false
		}
		return retval
	}

	function rawnum(anynum) {
		//returns a number with illegal dollar signs, commas, etc. removed.
		var thischar

		var sTmp = '' + anynum
		var retval=''
		var negnum=false

		if (sTmp.length != 0) {
			var firstchar = sTmp.substring(0,1)
			for (var i=0; i <= sTmp.length; i++) {
				thischar = sTmp.charAt(i)
				if (thischar == '(') {negnum = true}
				if ((thischar >= '0' && thischar <='9') || thischar == ServerDecimalSep) {
					if (thischar == ServerDecimalSep) {thischar = '.'}
					retval = retval + thischar
				}
			}
			if (firstchar == '-') {negnum = true}
			if (negnum) {retval = '-' + retval}
		}

		return retval
	}

	function rawnumCheck(anynum) {
		//checks number for illegal characters
		// returns rawnum if no bad chars otherwise returns 'Nan'
		var thischar

		var sTmp = '' + anynum
		var retval=''
		var negnum=false
		if (sTmp.length != 0) {
			var firstchar = sTmp.substring(0,1)
			var i=0
			if (firstchar == '-') {
				negnum = true
				i=1
			}
			for (; i < sTmp.length; i++) {
				thischar = sTmp.charAt(i)
				if (thischar == '(') {negnum = true}
				if ((thischar >= '0' && thischar <='9') || thischar == ServerDecimalSep) {
					if (thischar == ServerDecimalSep) {thischar = '.'}
					retval = retval + thischar
				}else{
					if (thischar != ServerThousandSep){
						return 'NaN'
					}
				}
			}
			if (negnum) {retval = '-' + retval}
		}

		return retval
	}


	function allNumbers(sTmp) {

		var thischar

		for (var i=0; i < sTmp.length; i++) {
			thischar = sTmp.charAt(i)
			if (thischar < '0' || thischar > '9') {
				return false
			}
		}
		return true
	}

	function addCurrencySymbol(sValue) {

		switch (ServerCurrencyPlacement-0) {
			case 0:
				return ServerCurrencySymbol + sValue
			case 1:
				return sValue + ServerCurrencySymbol
			case 2:
				return ServerCurrencySymbol + ' ' + sValue
			case 3:
				return sValue + ' ' + ServerCurrencySymbol
			default:
				alert('You have specified an unknown currency placement value.')
		}
	}

	function setNumberFormat(sCurrency,sThousandSep,sDecimalSep,nPlacement) {

		ServerCurrencySymbol = sCurrency
		ServerThousandSep = sThousandSep
		ServerDecimalSep = sDecimalSep
		ServerCurrencyPlacement = 1 * nPlacement
	}

	function resetNumberFormat() {
		ServerCurrencySymbol = defaultServerCurrencySymbol
		ServerThousandSep = defaultServerThousandSep
		ServerDecimalSep = defaultServerDecimalSep
		ServerCurrencyPlacement = defaultServerCurrencyPlacement
	}

	function FormatPhone(sInTemp, nUserPhoneFormat) {
		if (nUserPhoneFormat != null){
			UserPhoneFormat = nUserPhoneFormat
		}

		var sFormattedPhone
		var nextIndex

		//sInTemp must be > 6 chars & contain all numbers, -, (, or )
		sTemp = sInTemp.replace(/[\(\)\- ]/g, '')
		sTemp = sTemp.replace(/ext|x/gi, '')		//remove 'ext' and x (for the extension)

		if ( ((sTemp.length < 7) && oLibPage.OneOf(UserPhoneFormat,'1','2','3','4','5','7','9'))
				|| ((sTemp.length < 6) && oLibPage.OneOf(UserPhoneFormat,'6','8')) ) {

				return sInTemp
		}

		if (!allNumbers(sTemp)) {return sInTemp}
		if (!oLibPage.OneOf(UserPhoneFormat,'1','2','3','4','5','6','7','8','9')) {return sInTemp}

		SetPhoneFormatVars()
		var ln = sTemp.length
		switch (UserPhoneFormat) {
			case '1':
			case '2':
			case '3':
			case '4':
				switch (ln) {
					case 7:
						sFormattedPhone = sTemp.substr(0,3) + '-' + sTemp.substr(3,4)
						break
					case 10:
						sFormattedPhone = ((spf_bUseParen)?'(':'') + sTemp.substr(0,3) + ((spf_bUseParen)?') ':'-') + sTemp.substr(3,3) + '-' + sTemp.substr(6,4)
						break
					default:
						if (sTemp.length < 11) {
							return sInTemp
						}
						if ((sTemp.charAt(0) == '0') || (sTemp.charAt(0) == '1')) {
							sFormattedPhone = ((spf_bUseParen)?'(':'') + sTemp.substr(1,3) + ((spf_bUseParen)?') ':'-') + sTemp.substr(4,3) + '-' + sTemp.substr(7,4)
							if (sTemp.charAt(0) == '1') {
								sFormattedPhone = '1' + ((spf_bUseParen)?' ':'-') + sFormattedPhone
							}
							nextIndex = 11
						} else {
							sFormattedPhone = ((spf_bUseParen)?'(':'') + sTemp.substr(0,3) + ((spf_bUseParen)?') ':'-') + sTemp.substr(3,3) + '-' + sTemp.substr(6,4)
							nextIndex = 10
						}

						if (sTemp.length > nextIndex) {
							sFormattedPhone = sFormattedPhone + spf_EXT + sTemp.substr(nextIndex)
						}
				}
				break

			case '5' :
				switch (ln) {
					case 7:		//sFmt = "### ####"
						sFormattedPhone = sTemp.substr(0,3) + ' ' + sTemp.substr(3,4)
						break
					case 9:		//sFmt = "(##) ### ####"
						sFormattedPhone = "(" + sTemp.substr(0,2) + ') ' + sTemp.substr(2,3) + ' ' + sTemp.substr(5,4)
						break
					default:
						sFormattedPhone = sInTemp
						break
				}
				break
			case '6' :
				switch (ln) {
					case 6:		//sFmt = "### ###"
						sFormattedPhone = sTemp.substr(0,3) + ' ' + sTemp.substr(3,3)
						break
					case 10:	//sFmt = "#### ### ###"
						sFormattedPhone = sTemp.substr(0,4) + ' ' + sTemp.substr(4,3) + ' ' + sTemp.substr(7,3)
						break
					default:
						sFormattedPhone = sInTemp
						break
				}
				break
			case '7' :
				switch (ln) {
					case 7:		//sFmt = "### ####"
						sFormattedPhone = sTemp.substr(0,3) + ' ' + sTemp.substr(3,4)
						break
					case 11:	//sFmt = "#### ### ####"
						sFormattedPhone = sTemp.substr(0,4) + ' ' + sTemp.substr(4,3) + ' ' + sTemp.substr(7,4)
						break
					default:
						sFormattedPhone = sInTemp
						break
				}
				break
			case '8' :
				switch (ln) {
					case 6:		//sFmt = "### ###"
						sFormattedPhone = sTemp.substr(0,3) + ' ' + sTemp.substr(3,3)
						break
					case 9:		//sFmt = "### ### ###"
						sFormattedPhone = sTemp.substr(0,3) + ' ' + sTemp.substr(3,3) + ' ' + sTemp.substr(6,3)
						break
					default:
						sFormattedPhone = sInTemp
						break
				}
				break
			case '9' :
				switch (ln) {
					case 7:		//sFmt = "### ####"
						sFormattedPhone = sTemp.substr(0,3) + ' ' + sTemp.substr(3,4)
						break
					case 10:	//sFmt = "### ### ####"
						sFormattedPhone = sTemp.substr(0,3) + ' ' + sTemp.substr(3,3) + ' ' + sTemp.substr(6,4)
						break
					default:
						sFormattedPhone = sInTemp
						break
				}
				break
			default:
				sFormattedPhone = sInTemp
		}


		return sFormattedPhone

	}

	function SetPhoneFormatVars() {
		//sets vars for standard formats (1-4), other (NZ/AUS) formats are handled above
		switch (UserPhoneFormat) {
			case '1':					//# (###) ###-#### Ext ####
				spf_bUseParen = true
				spf_EXT = ' Ext '
				break
			case '2':					//#-###-###-#### Ext ####
				spf_bUseParen = false
				spf_EXT = ' Ext '
				break
			case '3':					//# (###) ###-#### x####
				spf_bUseParen = true
				spf_EXT = ' x'
				break
			case '4':					//#-###-###-#### x####
				spf_bUseParen = false
				spf_EXT = ' x'
				break
			default:
				spf_bUseParen = false
				spf_EXT = ''
				break
		}
	}

	function Val(s){
		var sStr = s.toString()
		sStr = sStr.replace(/^0+/g, '') //replace leading zeros
		var n = parseInt(sStr)
		if (isNaN(n)){n = 0}
		return n
	}



	function FormatGPA(sTemp) {
		if (sTemp == '0') { sTemp = '' }
		switch (sTemp.length) {
			case 1:
				sTemp = sTemp + '.00'
				break
			case 2:
				sTemp = sTemp.substr(0,1) + '.' + sTemp.substr(1,1)
				break
		}
		return sTemp
	}

	function floatAdd(x,y,nDecimalPlaces) {
		if (!nDecimalPlaces) {nDecimalPlaces=2}
		if (nDecimalPlaces==-1) {
			//determine greatest number of decimal places from x and y
			nDecimalPlaces=Math.max(getSignificantDecimalPlaces(x),getSignificantDecimalPlaces(y))
		}
		x=fixed(x,nDecimalPlaces)-0
		y=fixed(y,nDecimalPlaces)-0
		return (fixed(x+y,nDecimalPlaces)-0)
	}

	function getSignificantDecimalPlaces(x) {
		var s
		s=(x-0)+''
		var nPosition=s.indexOf('.')
		return (nPosition>=0?s.length-nPosition:0)
	}
