//
//   File Name :			jsLibFormat.js
//   Author :					Jim Guild
//   Date :						01/06/00
//   Description :		field formatting routines
//				also includes "controlSelect" routine
//   Requires :				none
//   Revisions :
//


//Formats a number with the mask "###,###,##0"
function formatAmount (pvControl, plNbrDecimalPlaces) {
var lbParameterIsObject;
var loFormatObject = new Object();

	lbParameterIsObject = typeof (pvControl) == 'object';

	loFormatObject.prefix = '';
	loFormatObject.suffix = '';
	loFormatObject.suppressLeadingZero = false;
	
	if (lbParameterIsObject) {
		loFormatObject.input = '' + pvControl.value;
	}
	else {
		loFormatObject.input = '' + pvControl;
	}
	
	formatTheInput (loFormatObject, plNbrDecimalPlaces);

	if (lbParameterIsObject) {
		pvControl.value = loFormatObject.formattedValue;
		return loFormatObject.value;
	}
	else {
		return loFormatObject.formattedValue;
	}
}

//Formats a number with the mask "$###,###,##0"
function formatCurrency (pvControl, plNbrDecimalPlaces) {

var lbParameterIsObject;
var loFormatObject = new Object();

	lbParameterIsObject = typeof (pvControl) == 'object';
	
	loFormatObject.prefix = '$';
	loFormatObject.suffix = '';
	loFormatObject.suppressLeadingZero = false;
	
	if (lbParameterIsObject) {
		loFormatObject.input = '' + pvControl.value;
	}
	else {
		loFormatObject.input = '' + pvControl;
	}
	
	formatTheInput (loFormatObject, plNbrDecimalPlaces);
	
	if (lbParameterIsObject) {
		pvControl.value = loFormatObject.formattedValue;
		return loFormatObject.value;
	}
	else {
		return loFormatObject.formattedValue;
	}
}

//Formats a number with the mask "##0%"
function formatPercent (pvControl, plNbrDecimalPlaces) {

var lbParameterIsObject;
var loFormatObject = new Object();

	lbParameterIsObject = typeof (pvControl) == 'object';
	
	loFormatObject.prefix = '';
	loFormatObject.suffix = '%';
	loFormatObject.suppressLeadingZero = false;
	
	if (lbParameterIsObject) {
		loFormatObject.input = '' + pvControl.value;
	}
	else {
		loFormatObject.input = '' + pvControl;
	}
	
	formatTheInput (loFormatObject, plNbrDecimalPlaces);
	
	if (lbParameterIsObject) {
		pvControl.value = loFormatObject.formattedValue;
		return loFormatObject.value;
	}
	else {
		return loFormatObject.formattedValue;
	}
}

function formatTheInput (poFormatObject, plNbrDecimalPlaces) {

	setSignCharacter (poFormatObject);
	
	findFormatParts (poFormatObject, plNbrDecimalPlaces);
	
	formatThousands (poFormatObject);
	
	poFormatObject.formattedValue = poFormatObject.sign + poFormatObject.prefix + poFormatObject.wholeNumber + poFormatObject.decimal + poFormatObject.suffix;
	
}

function setSignCharacter (poFormatObject) {

var lsSign = '';

	if (poFormatObject.input.charAt (0) == '-') lsSign = '-';
	
	poFormatObject.sign = lsSign;
	
}

function findFormatParts (poFormatObject, plNbrDecimalPlaces) {

var llScaleFactor;
var lsInputWork;
var llWorkLength;

	if (isNaN (plNbrDecimalPlaces)) plNbrDecimalPlaces = 0;
	
	llScaleFactor = Math.pow (10, plNbrDecimalPlaces);
	
	poFormatObject.input = stripNumberForFormat (poFormatObject.input);

	if (isNaN (poFormatObject.input)) poFormatObject.input = 0;

	lsInputWork = Math.round(poFormatObject.input * llScaleFactor) + '';
	while (lsInputWork.length < plNbrDecimalPlaces) {
		lsInputWork = '0' + lsInputWork;
	}
	if (lsInputWork.length == plNbrDecimalPlaces) {
		if (poFormatObject.suppressLeadingZero == false) lsInputWork = '0' + lsInputWork;
	}
	
	llWorkLength = lsInputWork.length - plNbrDecimalPlaces;
	if (plNbrDecimalPlaces > 0) {
		poFormatObject.decimal = '.' + lsInputWork.substr (llWorkLength, plNbrDecimalPlaces);
	}
	else poFormatObject.decimal = '';
	
	poFormatObject.wholeNumber = lsInputWork.substr (0,llWorkLength);

	poFormatObject.value = (poFormatObject.sign + poFormatObject.wholeNumber + poFormatObject.decimal) -0;
}

function stripNumberForFormat (psInputString) {

var llCharPointer;
var lsCharacter;
var lsOutputString = '';

	psInputString=psInputString+"";
	for (llCharPointer = 0; llCharPointer < psInputString.length; llCharPointer++) {
		lsCharacter = psInputString.charAt (llCharPointer);
		if ((lsCharacter >= '0') && (lsCharacter <= '9')) {
			lsOutputString += lsCharacter;
		}
		else if (lsCharacter == '.') {
			lsOutputString += lsCharacter;
		}
	}
	return lsOutputString;
}

function stripNonDigits (psInputString) {

var llCharPointer;
var lsCharacter;
var lsOutputString = '';

	psInputString=psInputString+"";
	for (llCharPointer = 0; llCharPointer < psInputString.length; llCharPointer++) {
		lsCharacter = psInputString.charAt (llCharPointer);
		if ((lsCharacter >= '0') && (lsCharacter <= '9')) {
			lsOutputString += lsCharacter;
		}
		else if (lsCharacter == '.') {
			lsOutputString += lsCharacter;
		}
		else if (lsCharacter == '-') {
			lsOutputString += lsCharacter;
		}
	}
	return lsOutputString;
}
function formatThousands (poFormatObject) {

var lsWholeNumber;
var llAmountLength;
var lsFormattedAmount = '';
var llNbrLeadingDigits;
var llAmountPosition;

	lsWholeNumber = poFormatObject.wholeNumber;
	llAmountLength = lsWholeNumber.length;

	if (llAmountLength <= 3) {
		lsFormattedAmount = lsWholeNumber;
	}
	else {
		llNbrLeadingDigits = llAmountLength % 3;
		if (llNbrLeadingDigits != 0) {
			lsFormattedAmount = lsWholeNumber.substr (0, llNbrLeadingDigits) + ',';
		}
		llAmountLength -= 3;
		for (llAmountPosition = llNbrLeadingDigits; llAmountPosition < llAmountLength; llAmountPosition +=3) {
			lsFormattedAmount += lsWholeNumber.substr (llAmountPosition, 3) + ',';
		}
		lsFormattedAmount = lsFormattedAmount + lsWholeNumber.substr (llAmountPosition, 3);
	}
	
	poFormatObject.wholeNumber = lsFormattedAmount;
	
}

//does the "select" of the value in the control
//also re-assigns the value of the control to overcome effects of "control.focus" command
function controlSelect (poControl) {

	//poControl.value = poControl.value;
	poControl.select();
	
}

//does the "select" of the value in the control
//also re-assigns the value of the control to overcome effects of "control.focus" command
function dateSelect (poControl) {

	poControl.value = poControl.value;
	poControl.select();
	
}

function validateDateInput(pvInput, plDatePortion, plDateType, plYearLimit, pbEnforceType){
var lsDate;	 
var loDate; 
var loCurrentDate;

	lsDate = convertString(pvInput.value);	 		

	if (lsDate.length > 0) {
		loDate = new pwDate(lsDate, plDatePortion, plDateType, plYearLimit);
	
		if (loDate.isDateValid()) {
			if (pbEnforceType) {
				loCurrentDate = new Date();	
/*
				if (((plDateType == dtDATEFuture()) && 
						(loDate.oDate.getFullYear() <= loCurrentDate.getFullYear()))
						||((plDateType == dtDATEPast()) && 
						(loDate.oDate.getFullYear() >= loCurrentDate.getFullYear()))
					  ) 
*/
				if ((plDateType == dtDATEFuture()) && (!isDateFuture(loDate.oDate, loCurrentDate)) 
					|| ((plDateType == dtDATEPast()) && !isDatePast(loDate.oDate, loCurrentDate)))
				{
					pvInput.value = loCurrentDate.getFullYear() + 1;
					return false;
				}
			}				
			pvInput.value = loDate.getFormattedDate();
			return true;
		}
		else {
			pvInput.select();
			pvInput.focus();
			return false;
		}
	}
	else {
		return true;
	}		
}

function isDatePast(poTestDate, poToday) {

	if (poTestDate.getFullYear() > poToday.getFullYear()) {

		return false;

	} else if (poTestDate.getFullYear() == poToday.getFullYear()) {

		if (poTestDate.getMonth() > poToday.getMonth()) {

			return false;

		} else if (poTestDate.getMonth() == poToday.getMonth()) {		

			if (poTestDate.getDate() > poToday.getDate()) {
				return false; 
			}
		}
	}

	return true;
}

function isDateFuture(poTestDate, poToday) {

	if (poTestDate.getFullYear() < poToday.getFullYear()) {

		return false;

	} else if (poTestDate.getFullYear() == poToday.getFullYear()) {

		if (poTestDate.getMonth() < poToday.getMonth()) {

			return false;

		} else if (poTestDate.getMonth() == poToday.getMonth()) {		

			if (poTestDate.getDate() < poToday.getDate()) {
				return false; 
			}
		}
	}

	return true;
}

function validateDateInputAllowToday(pvInput, plDatePortion, plDateType, plYearLimit, pbEnforceType){
var lsDate;	 
var loDate; 
var loCurrentDate;

	lsDate = convertString(pvInput.value);	
		
	if (lsDate.length > 0) {
		loDate = new pwDate(lsDate, plDatePortion, plDateType, plYearLimit);
	
		if (loDate.isDateValid()) {
			if (pbEnforceType) {
				loCurrentDate = new Date();	
				if (((plDateType == dtDATEFuture()) && 
						(loDate.oDate.getFullYear() < loCurrentDate.getFullYear()))
						||((plDateType == dtDATEPast()) && 
						(loDate.oDate.getFullYear() >= loCurrentDate.getFullYear()))
					  ) 
				{
					pvInput.value = loCurrentDate.getFullYear() + 1;
					return false;
				}
			}				
			pvInput.value = loDate.getFormattedDate();
			return true;
		}
		else {
			pvInput.select();
			pvInput.focus();
			return false;
		}
	}
	else {
		return true;
	}		
}
function validateSSNInput(pvInput){
var lsSSN;
var lsLeft;
var lsMid;
var lsRight;
var lsSSNArray;

	lsSSN = convertString(pvInput.value);	 		
	
	if (lsSSN.length == 0) {
		return true;
	}
	else {
		switch (lsSSN.length) {
		case 9:
			if (isNaN(lsSSN)) {
				pvInput.select();
				pvInput.focus();
				return null;
			}
			else {
				lsLeft = lsSSN.substr(0, 3);
				lsMid = lsSSN.substr(3, 2);
				lsRight = lsSSN.substr(5, 4);
				
				pvInput.value = sFormattedSSN(lsLeft, lsMid, lsRight);

				return true;
			}
			
			break;
		case 11:
			lsSSNArray = lsSSN.split(msSLASH);
			if (lsSSNArray.length != 3) {
				lsSSNArray = lsSSN.split(msDASH);
			}	
			lsLeft = lsSSNArray[0]
			lsMid = lsSSNArray[1]
			lsRight = lsSSNArray[2]
			if (isNaN(lsLeft) || isNaN(lsMid) || isNaN(lsRight)) {
				pvInput.select();
				pvInput.focus();
				
				pvInput.value = sFormattedSSN(lsLeft, lsMid, lsRight);

				return true;
			}
			else {
				return null;
			}
			break;
		default:
			pvInput.select();
			pvInput.focus();
			return null;
			break;
		}
	}
}

function sFormattedSSN(psLeftPortion, psMidPortion, psRightPortion) {
	return (psLeftPortion + msDASH + psMidPortion + msDASH + psRightPortion);
}

function validatePhoneInput(pvInput){
var lsPhone;
var lsLeft;
var lsMid;
var lsRight;
var lsPhoneArray;

	lsPhone = convertString(pvInput.value);	 		

	
	if (lsPhone.length == 0) {
		return true;
	}
	else {
		switch (lsPhone.length) {
		case 10:
			if (isNaN(lsPhone)) {
				pvInput.select();
				pvInput.focus();
				return null;
			}
			else {
				lsLeft = lsPhone.substr(0, 3);
				lsMid = lsPhone.substr(3, 3);
				lsRight = lsPhone.substr(6, 4);
				
				pvInput.value = sFormattedPhone(lsLeft, lsMid, lsRight);
				return true;
			}
			
			break;
		case 12:
			lsPhoneArray = lsPhone.split(msSLASH);
			if (lsPhoneArray.length != 3) {
				lsPhoneArray = lsPhone.split(msDASH);
			}	

			lsLeft = lsPhoneArray[0]
			lsMid = lsPhoneArray[1]
			lsRight = lsPhoneArray[2]
			if (isNaN(lsLeft) || isNaN(lsMid) || isNaN(lsRight)) {
				pvInput.select();
				pvInput.focus();
				
				pvInput.value = sFormattedPhone(lsLeft, lsMid, lsRight);

				return null;
			}
			else {
				return true;
			}
			break;
		default:
			pvInput.select();
			pvInput.focus();
			return null;
			break;
		}
	}
}

function sFormattedPhone(psLeftPortion, psMidPortion, psRightPortion) {
	return (psLeftPortion + msDASH + psMidPortion + msDASH + psRightPortion);
}

