function BPADataSet(){
	// Costs for current process
	this.avgCycleTimeOfProcess = 0.0;
	this.avgCostPerHourOneFTECurrentProcess = 0.0;
	this.processVolumeNumber = 0;
	this.processVolumeUnit = '';
	this.avgErrorRate = 0.0;
	this.avgTimeForErrorRateHandling = 0;
	
	// Current IT project costs
	this.projectTimeframe = 0;
	this.avgCostPerHourOneFTECurrentProject = 0.0;
	this.avgNumEnhancementsPerProject = 0;
	this.enhancementProjectTimeframe = 0;
	this.timeBetweenEnhancementsNumber = 0;
	this.timeBetweenEnhancementsUnit = '';
	
	// Plan Process Implementations
	this.year1Processes = 0;
	this.year2Processes = 0;
	this.year3Processes = 0;
	this.year4Processes = 0;
	this.year5Processes = 0;
	this.year2to5Processes = 0;
	
	// Amount Invested
	this.hardwareMiddlewareCost = 0.0;
	this.consultingCost = 0.0;
	this.trainingCost = 0.0;

	// calculation constants
	this.processCostFactor = 0.5;
	this.projectCostFactor = 0.85;
	this.netPresentValueRate = 0.1;
	
	// calculation variables
	this.simpleCalculation = true;
	this.netPresentValue = 0.0;
	this.returnOnInvestment = 0.0;
}	

// Simple scenario
BPADataSet.prototype.initializeSimpleScenario = function(){
	// Costs for current process
	this.avgCycleTimeOfProcess = .5;
	this.avgCostPerHourOneFTECurrentProcess = 30;
	this.processVolumeNumber = 4;
	this.processVolumeUnit = 'day';
	this.avgErrorRate = .05;
	this.avgTimeForErrorRateHandling = .5;
	
	// Current IT project costs
	this.projectTimeframe = 100;
	this.avgCostPerHourOneFTECurrentProject = 50;
	this.avgNumEnhancementsPerProject = 2;
	this.enhancementProjectTimeframe = 48;
	this.timeBetweenEnhancementsNumber = 1.5;
	this.timeBetweenEnhancementsUnit = 'year';
	
	// Plan Process Implementations
	this.year1Processes = 3;
	this.year2Processes = 0;
	this.year3Processes = 0;
	this.year4Processes = 0;
	this.year5Processes = 0;
	this.year2to5Processes = 5;
	
	// Amount Invested
	this.hardwareMiddlewareCost = 93917;
	this.consultingCost = 24000;
	this.trainingCost = 1800;

	this.simpleCalculation = true;
}

// Complex scenario
BPADataSet.prototype.initializeComplexScenario = function(){
	// Costs for current process
	this.avgCycleTimeOfProcess = .25;
	this.avgCostPerHourOneFTECurrentProcess = 30;
	this.processVolumeNumber = 75;
	this.processVolumeUnit = 'day';
	this.avgErrorRate = .05;
	this.avgTimeForErrorRateHandling = 1;
	
	// Current IT project costs
	this.projectTimeframe = 160;
	this.avgCostPerHourOneFTECurrentProject = 50;
	this.avgNumEnhancementsPerProject = 2;
	this.enhancementProjectTimeframe = 80;
	this.timeBetweenEnhancementsNumber = 1;		//can make this more dynamic in second interation, for now keep as 1
	this.timeBetweenEnhancementsUnit = 'year';
	
	// Plan Process Implementations
	this.year1Processes = 7;
	this.year2Processes = 0;
	this.year3Processes = 0;
	this.year4Processes = 0;
	this.year5Processes = 0;
	this.year2to5Processes = 10;
	
	// Amount Invested
	this.hardwareMiddlewareCost = 423232;
	this.consultingCost = 225000;
	this.trainingCost = 3600;

	this.simpleCalculation = true;
}
BPADataSet.prototype.getTotalInvestment = function(){						return parseInt(this.hardwareMiddlewareCost) + parseInt(this.consultingCost) + parseInt(this.trainingCost);								}

// Process completion return 
BPADataSet.prototype.getProcessCompletionValue = function(){				return this.avgCycleTimeOfProcess * this.avgCostPerHourOneFTECurrentProcess * this.getProcessVolumeValue();	}
BPADataSet.prototype.getProcessCompletionValueBPA = function(){				return this.getProcessCompletionValue() * this.processCostFactor;											}
BPADataSet.prototype.getProcessCompletionValueReturn = function(){			return this.getProcessCompletionValue() - this.getProcessCompletionValueBPA();								}

// Error process time return 
BPADataSet.prototype.getErrorProcessTimeValue = function(){					return this.avgErrorRate * this.getProcessVolumeValue() * this.avgTimeForErrorRateHandling;					}
BPADataSet.prototype.getErrorProcessTimeValueBPA = function(){				return this.getErrorProcessTimeValue() * this.processCostFactor;											}
BPADataSet.prototype.getErrorProcessTimeValueReturn = function(){			return this.getErrorProcessTimeValue() - this.getErrorProcessTimeValueBPA();								}

// Process cost per process
BPADataSet.prototype.getProcessCostPerProcessValue = function(){			return this.getProcessCompletionValue() + this.getErrorProcessTimeValue();									}
BPADataSet.prototype.getProcessCostPerProcessValueBPA = function(){			return this.getProcessCompletionValueBPA() + this.getErrorProcessTimeValueBPA();							}
BPADataSet.prototype.getProcessCostPerProcessValueReturn = function(){		return this.getProcessCostPerProcessValue() - this.getProcessCostPerProcessValueBPA();						}

// Initial project
BPADataSet.prototype.getInitialProjectValue = function(){					return this.projectTimeframe * this.avgCostPerHourOneFTECurrentProject;										}
BPADataSet.prototype.getInitialProjectValueBPA = function(){				return this.getInitialProjectValue() * this.projectCostFactor;												}
BPADataSet.prototype.getInitialProjectValueReturn = function(){				return this.getInitialProjectValue() - this.getInitialProjectValueBPA();									}

// Enhancement projects
BPADataSet.prototype.getEnhancementProjectValue = function(){ 				return this.enhancementProjectTimeframe * this.avgCostPerHourOneFTECurrentProject;							}
BPADataSet.prototype.getEnhancementProjectValueBPA = function(){			return this.getEnhancementProjectValue() * this.projectCostFactor; 											}
BPADataSet.prototype.getEnhancementProjectValueReturn = function(){			return this.getEnhancementProjectValue() - this.getEnhancementProjectValueBPA(); 							}

// Project cost per process
BPADataSet.prototype.getProjectCostPerProcessValue = function(){			return this.getInitialProjectValue() + this.getEnhancementProjectValue(); 									}
BPADataSet.prototype.getProjectCostPerProcessValueBPA = function(){			return this.getInitialProjectValueBPA() + this.getEnhancementProjectValueBPA(); 							}
BPADataSet.prototype.getProjectCostPerProcessValueReturn = function(){		return this.getProjectCostPerProcessValue() - this.getProjectCostPerProcessValueBPA();						}

// Total cost per process
BPADataSet.prototype.getTotalCostPerProcessValue = function(){				return this.getProcessCostPerProcessValue() + this.getProjectCostPerProcessValue();							}
BPADataSet.prototype.getTotalCostPerProcessValueBPA = function(){			return this.getProcessCostPerProcessValueBPA() + this.getProjectCostPerProcessValueBPA();					}
BPADataSet.prototype.getTotalCostPerProcessValueReturn = function(){		return this.getTotalCostPerProcessValue() - this.getTotalCostPerProcessValueBPA();							}

// Total process expenses per year
BPADataSet.prototype.getProcessCurrentExpensesByYear = function(year){		return this.getProcessCostPerProcessValue() * this.getProcessCountByYear(year); 							}
BPADataSet.prototype.getProcessBPAExpensesByYear = function(year){			return this.getProcessCostPerProcessValueBPA() * this.getProcessCountByYear(year); 							}

// Total project expenses per year
BPADataSet.prototype.getProjectCurrentExpensesByYear = function(year){		return this.getProjectCostPerProcessValue() * this.getProcessCountByYear(year); 							}
BPADataSet.prototype.getProjectBPAExpensesByYear = function(year){			return this.getProjectCostPerProcessValueBPA() * this.getProcessCountByYear(year); 							}

// Total cost per year
BPADataSet.prototype.getTotalCostByYear = function(year){					return this.getTotalCostByYearAndType(year,'');		}
BPADataSet.prototype.getTotalCostBPAByYear = function(year){				return this.getTotalCostByYearAndType(year,'bpa');	}

BPADataSet.prototype.getTotalInitialProjectReturnByYear = function(year){	return (this.getProcessCostPerProcessValueReturn() * this.getProcessCountByYear(year)) + (this.getInitialProjectValueReturn() * this.getProcessCountByYear(year));	}

//NOTE:  This function is most likely incorrect
//Sent an email to wendy to clarify logic 20090306 15:41
BPADataSet.prototype.getTotalEnhancementReturnByYear = function(year){
	if(year <= 1){ 
		return 0; 
	} else if(year == 2){
		return (this.getProcessCountByYear(1) * this.getProcessCostPerProcessValueReturn()) + 
			   (this.getProcessCountByYear(1) * this.getEnhancementProjectValueReturn());
	} else if(year == 3){
		return (this.getProcessCountByYear(1) * this.getProcessCostPerProcessValueReturn()) + 
			   (this.getProcessCountByYear(1) * this.getEnhancementProjectValueReturn())    +
			   (this.getProcessCountByYear(3) * this.getProcessCostPerProcessValueReturn()) + 
			   (this.getProcessCountByYear(3) * this.getEnhancementProjectValueReturn());
	} else if(year == 4){
		return this.avgNumEnhancementsPerProject * 
				(this.getProcessCountByYear(4) * this.getProcessCostPerProcessValueReturn() + 
				 this.getProcessCountByYear(4) * this.getEnhancementProjectValueReturn()); 
	} else if(year == 5){
		return this.avgNumEnhancementsPerProject * 
				(this.getProcessCountByYear(5) * this.getProcessCostPerProcessValueReturn() + 
				 this.getProcessCountByYear(5) * this.getEnhancementProjectValueReturn()); 
	} else {
		alert('error in getTotalEnhancementReturnByYear method.  invalid year.  year = ' + year);
	}
}
BPADataSet.prototype.getTotalAnnualReturnByYear = function(year){			return this.getTotalInitialProjectReturnByYear(year) + this.getTotalEnhancementReturnByYear(year); }
BPADataSet.prototype.getTotalAnnualReturnArray = function(year){			return [getTotalAnnualReturnByYear(1),getTotalAnnualReturnByYear(2),getTotalAnnualReturnByYear(3),getTotalAnnualReturnByYear(4),getTotalAnnualReturnByYear(5)]; }

//returns the 5 year roi
BPADataSet.prototype.getROI = function(){	return this.netPresentValue / this.getTotalInvestment();	}
BPADataSet.prototype.getNetPresentValueByYear = function(year){		return this.getTotalAnnualReturnByYear(year)/Math.pow((1+this.netPresentValueRate),year);}
BPADataSet.prototype.getNetPresentValuesForAllYearsArray = function(){
	var npvArray = [];
	for(var i = 1; i <= 5; i++){
		npvArray[npvArray.length] = this.getNetPresentValueByYear(i);
	}
	return npvArray;
}

BPADataSet.prototype.getROIDatapoints = function(){
  var dataPoints = [];
	var npvArray = this.getNetPresentValuesForAllYearsArray();

  //sum preceeding years into npv value
  for(var k=npvArray.length-1; k>=0; k--){
    for(var i=k-1; i>=0; i--){
      npvArray[k] += npvArray[i];
    }
  }
  this.netPresentValue = npvArray[4];
  var divisor = this.getTotalInvestment();
  if(divisor == 0) divisor = 1;

  for(var i = 0; i < npvArray.length; i++){
  	dataPoints[i] = [(i+1), npvArray[i] / divisor];
  }

  // set final ROI - note that datapoints is an array of array's for the roi graph, so grab the second index of the last array for the final roi value
  this.returnOnInvestment = dataPoints[dataPoints.length -1][1];
  return dataPoints;
}

// year - the year to get values for.  valid values: 1,2,3,4,5
// type - bpa or not.  valid values: bpa,current
BPADataSet.prototype.getTotalCostByYearAndType = function(year, type){
	var total = 0;
	switch(type){
		case "current": total = this.getProcessCountByYear(year) * this.getTotalCostPerProcessValue(); break;
		case "bpa": total = this.getProcessCountByYear(year) * this.getTotalCostPerProcessValueBPA(); break;
	}
//	alert('total' + total + '\nyear: ' + year + '\ntype: ' + type);
	return total;
}

// returns the count of processes for a given year
// year - number of processes.  valid values: 1,2,3,4,5
// when the type selected is for simple calculation, return the year2to5processes when years 2 - 5 count requested
BPADataSet.prototype.getProcessCountByYear = function(year){
	switch(year){
		case 1: return this.year1Processes; 
		case 2: if(this.simpleCalculation){return this.year2to5Processes;} else {return this.year2Processes;}
		case 3: if(this.simpleCalculation){return this.year2to5Processes;} else {return this.year3Processes;}
		case 4: if(this.simpleCalculation){return this.year2to5Processes;} else {return this.year4Processes;}
		case 5: if(this.simpleCalculation){return this.year2to5Processes;} else {return this.year5Processes;}
	}
}

BPADataSet.prototype.getCurrentExpenseTotal = function(){							return bpaMoneyFormatter(this.getExpenseTotalByType('current'));	}
BPADataSet.prototype.getAutomationExpenseTotal = function(){						return bpaMoneyFormatter(this.getExpenseTotalByType('bpa'));		}
BPADataSet.prototype.getAutomationInvestmentTotal = function(){						return bpaMoneyFormatter(this.getTotalInvestment());				}
BPADataSet.prototype.getNetPresentValueTotal = function(){							return bpaMoneyFormatter(this.netPresentValue);						}
BPADataSet.prototype.getReturnOnInvestmentValueTotalDecimalFormat = function(){		return bpaTwoDecimalNumberFormatter(this.returnOnInvestment);		}
BPADataSet.prototype.getReturnOnInvestmentValueTotalPercentFormat = function(){		return bpaPercentFormatter(this.returnOnInvestment-1);				}


// type - bpa or not.  valid values: bpa,current
BPADataSet.prototype.getExpenseTotalByType = function(type){
	var total = 0;	
	for(var i=1; i <=5; i++){
		total += this.getTotalCostByYearAndType(i,type);
	}
	return total;
}

// when switching from simple to advanced view, copy the value from the year2to5Processes to the individual year properties
BPADataSet.prototype.copy2to5ProcessesToYearValues = function(){
	this.year2Processes = this.year2to5Processes;
	this.year3Processes = this.year2to5Processes;
	this.year4Processes = this.year2to5Processes;
	this.year5Processes = this.year2to5Processes;
}

// converts the value entered in processVolumeNumber field to days
BPADataSet.prototype.getProcessVolumeValue = function(){
	var unit = this.processVolumeUnit;
	var processVolumeValue = this.processVolumeNumber;
	var processVolumeDayFactor = 254;	// 254 days in a year (5day/week * 52 weeks - 6 holidays)
	var processVolumeWeekFactor = 52;	// 52 weeks in a year
	var processVolumeMonthFactor = 12;	// 12 months in a year
	var processVolumeYearFactor = 1;	// 1 year = 1 year
	
	if(unit == 'day'){
		return processVolumeValue * processVolumeDayFactor;
	} else if(unit == 'week'){
		return processVolumeValue * processVolumeWeekFactor;
	} else if(unit == 'month'){
		return processVolumeValue * processVolumeMonthFactor;
	} else if(unit == 'year'){
		return processVolumeValue * processVolumeYearFactor;
	} else {
		alert('Error this.processVolumeUnit not found.  unit = [' + this.processVolumeUnit + ']');
		return 0;
	}
}

// shows current field values
BPADataSet.prototype.showFieldValues = function(){
	return "" + 
	"\navgCycleTimeOfProcess: [" + this.avgCycleTimeOfProcess + "]" + 
	"\navgCostPerHourOneFTECurrentProcess: [" + this.avgCostPerHourOneFTECurrentProcess + "]" + 
	"\nprocessVolumeNumber: [" + this.processVolumeNumber + "]" + 
	"\nprocessVolumeUnit: [" + this.processVolumeUnit + "]" + 
	"\navgErrorRate: [" + this.avgErrorRate + "]" + 
	"\navgTimeForErrorRateHandling: [" + this.avgTimeForErrorRateHandling + "]" + 
	"\n" +
	// Current IT project costs
	"\nprojectTimeframe: [" + this.projectTimeframe + "]" + 
	"\navgCostPerHourOneFTECurrentProject: [" + this.avgCostPerHourOneFTECurrentProject + "]" + 
	"\navgNumEnhancementsPerProject: [" + this.avgNumEnhancementsPerProject + "]" + 
	"\nenhancementProjectTimeframe: [" + this.enhancementProjectTimeframe + "]" + 
	"\ntimeBetweenEnhancementsNumber: [" + this.timeBetweenEnhancementsNumber + "]" + 
	"\ntimeBetweenEnhancementsUnit: [" + this.timeBetweenEnhancementsUnit + "]" + 
	"\n" +
	// Plan Process Implementations
	"\nyear1Processes: [" + this.year1Processes + "]" + 
	"\nyear2Processes: [" + this.year2Processes + "]" + 
	"\nyear3Processes: [" + this.year3Processes + "]" + 
	"\nyear4Processes: [" + this.year4Processes + "]" + 
	"\nyear5Processes: [" + this.year5Processes + "]" + 
	"\nyear2to5Processes: [" + this.year2to5Processes + "]" + 
	"\n" +
	// Amount Invested
	"\nhardwareMiddlewareCost: [" + this.hardwareMiddlewareCost + "]" + 
	"\nconsultingCost: [" + this.consultingCost + "]" + 
	"\ntrainingCost: [" + this.trainingCost + "]" + 
	"\n" +
	// calculation constants
	"\nprocessCostFactor: [" + this.processCostFactor + "]" + 
	"\nprojectCostFactor: [" + this.projectCostFactor + "]" + 
	"\nnetPresentValueRate: [" + this.netPresentValueRate + "]" + 
	"\n" +
	"\nsimpleCalculation: [" + this.simpleCalculation + "]" + 
	"\nnetPresentValue: [" + this.netPresentValue + "]" + 
	"\nreturnOnInvestment: [" + this.returnOnInvestment + "]" + 
	"";
}

// shows current calculated values
BPADataSet.prototype.showCalculationValues = function(){
	return "" + 
	"Calculations:" + 
	"\ngetTotalInvestment(): [" + this.getTotalInvestment() + "]" + 
	"\n" +
	"\ngetProcessCompletionValue(): [" + this.getProcessCompletionValue() + "]" + 
	"\ngetProcessCompletionValueBPA(): [" + this.getProcessCompletionValueBPA() + "]" + 
	"\ngetProcessCompletionValueReturn(): [" + this.getProcessCompletionValueReturn() + "]" + 
	"\n" +
	"\ngetErrorProcessTimeValue(): [" + this.getErrorProcessTimeValue() + "]" + 
	"\ngetErrorProcessTimeValueBPA(): [" + this.getErrorProcessTimeValueBPA() + "]" + 
	"\ngetErrorProcessTimeValueReturn(): [" + this.getErrorProcessTimeValueReturn() + "]" + 
	"\n" +
	"\ngetProcessCostPerProcessValue(): [" + this.getProcessCostPerProcessValue() + "]" + 
	"\ngetProcessCostPerProcessValueBPA(): [" + this.getProcessCostPerProcessValueBPA() + "]" + 
	"\ngetProcessCostPerProcessValueReturn(): [" + this.getProcessCostPerProcessValueReturn() + "]" + 
	"\n" +
	"\ngetInitialProjectValue(): [" + this.getInitialProjectValue() + "]" + 
	"\ngetInitialProjectValueBPA(): [" + this.getInitialProjectValueBPA() + "]" + 
	"\ngetInitialProjectValueReturn(): [" + this.getInitialProjectValueReturn() + "]" + 
	"\n" +
	"\ngetEnhancementProjectValue(): [" + this.getEnhancementProjectValue() + "]" + 
	"\ngetEnhancementProjectValueBPA(): [" + this.getEnhancementProjectValueBPA() + "]" + 
	"\ngetEnhancementProjectValueReturn(): [" + this.getEnhancementProjectValueReturn() + "]" +
	"\n" +
	"\ngetProjectCostPerProcessValue(): [" + this.getProjectCostPerProcessValue() + "]" + 
	"\ngetProjectCostPerProcessValueBPA(): [" + this.getProjectCostPerProcessValueBPA() + "]" + 
	"\ngetProjectCostPerProcessValueReturn(): [" + this.getProjectCostPerProcessValueReturn() + "]" + 
	"\n" +
	"\ngetTotalCostPerProcessValue(): [" + this.getTotalCostPerProcessValue() + "]" + 
	"\ngetTotalCostPerProcessValueBPA(): [" + this.getTotalCostPerProcessValueBPA() + "]" + 
	"\ngetTotalCostPerProcessValueReturn(): [" + this.getTotalCostPerProcessValueReturn() + "]" + 
	"";
}

BPADataSet.prototype.showCalculationTotals = function(){
	return "" + 
	"Calculation Results" + 
	"\nCurrent Expense Total: " + this.getCurrentExpenseTotal() + 
	"\nAutomation Expense Total: " + this.getAutomationExpenseTotal() + 
	"\nCurrent Expense Total - Automation Expense Total: " + (this.getCurrentExpenseTotal() - this.getAutomationExpenseTotal()) + 
	
	"\nAutomation Investment Total: " + this.getAutomationInvestmentTotal() + 
	"\nNPV: " + this.getNetPresentValueTotal() + "" + 
	"\n5-year ROI: " + this.getReturnOnInvestmentValueTotalDecimalFormat() +
	"";
}
