// value vars
var onBoardSales;
var avgTransaction;
var percSalesLost;
var avgCCFees;
var percProfitMargin;
var costPerCCTransaction;
var incTransactionValue;
var percCCReductionFee;
var percSalesRecovered;
var costPerAircraft;
var totalAircraft;

// calculation vars	  
var annualProfit; var annualProfit5;
var higherAvgTransaction;
var annualSalesIncrease; var annualSalesIncrease5;
var annualCostRealized; var annualCostRealized5;
var recoveredSales; var recoveredSales5;
var revisedAnnualProfit; var revisedAnnualProfit5;
var totalOneTimeCost; var totalOneTimeCost5;
var annualCostPerTransaction; var annualCostPerTransaction5;
var profitIncrease;
var roiPayback;

/*
  Start calculations for ROI
*/
function calcAnnualProfit(){
  annualProfit = (onBoardSales-(onBoardSales*(percSalesLost + avgCCFees))) * percProfitMargin
  annualProfit5 = annualProfit * 5
  updateDiv('annual_profit', formatCurrencyRound(annualProfit)) ;
  updateDiv('annual_profit5', formatCurrencyRound(annualProfit5)) ;
}

function calcHigherAvgTransaction(){
  //=C12+(C12*C20)
  higherAvgTransaction = avgTransaction + (avgTransaction * incTransactionValue);
  updateDiv('higher_avg_transaction', formatCurrency(higherAvgTransaction)) ;
}

function calcAnnualSalesIncrease(){
  //=(C11/C12)*(C21-C12)
  annualSalesIncrease = (onBoardSales / avgTransaction) * (higherAvgTransaction - avgTransaction);
  annualSalesIncrease5 = annualSalesIncrease * 5;
  updateDiv('annual_sales_increase', formatCurrencyRound(annualSalesIncrease));
  updateDiv('annual_sales_increase5', formatCurrencyRound(annualSalesIncrease5));
}

function calcAnnualCostRealized(){
  //=C25*(C11+C22)
  annualCostRealized = percCCReductionFee * (onBoardSales + annualSalesIncrease);
  annualCostRealized5 = annualCostRealized * 5;
  updateDiv('annual_cost_realized', formatCurrencyRound(annualCostRealized));
  updateDiv('annual_cost_realized5', formatCurrencyRound(annualCostRealized5));
}

function calcRecoveredSales(){
  //=(C13*C29)*(C11+C22)
  recoveredSales = (percSalesLost * percSalesRecovered) * (onBoardSales + annualSalesIncrease);
  recoveredSales5 = recoveredSales * 5;
  updateDiv('recovered_sales', formatCurrencyRound(recoveredSales));
  updateDiv('recovered_sales5', formatCurrencyRound(recoveredSales5));
}

function calcRevisedAnnualProfit(){
  //=((C11+C22)-((C11+C22)*(C14-C25))-((C11+C22)*((1-C29)*C13)))*C15
  //=((C11+C22+C30)-((C11+C22+C30)*(C14-C25))-((C11+C22+C30)*(C13*(1-C29))))*C15
  revisedAnnualProfit = ((onBoardSales + annualSalesIncrease + recoveredSales) - ((onBoardSales + annualSalesIncrease + recoveredSales) * (avgCCFees - percCCReductionFee)) - ((onBoardSales + annualSalesIncrease + recoveredSales)   * ( percSalesLost * (1-percSalesRecovered)))) * percProfitMargin;
  revisedAnnualProfit5 = revisedAnnualProfit * 5;
  updateDiv('revised_annual_profit', formatCurrencyRound(revisedAnnualProfit));
  updateDiv('revised_annual_profit5', formatCurrencyRound(revisedAnnualProfit5));
}

function calcTotalOneTimeCost(){
  //=C34*C35
  totalOneTimeCost = costPerAircraft * totalAircraft;
  totalOneTimeCost5 = totalOneTimeCost;
  updateDiv('total_one_time_cost', formatCurrencyRound(totalOneTimeCost));
  updateDiv('total_one_time_cost5', formatCurrencyRound(totalOneTimeCost5));
}

function calcAnnualCostPerTransaction(){
  //=((C11+C22)/C21)*C17
  annualCostPerTransaction = ((onBoardSales + annualSalesIncrease) / higherAvgTransaction) * costPerCCTransaction;
  annualCostPerTransaction5 = annualCostPerTransaction * 5
  updateDiv('annual_cost_per_transaction', formatCurrencyRound(annualCostPerTransaction));
  updateDiv('annual_cost_per_transaction5', formatCurrencyRound(annualCostPerTransaction5));
}

function calcProfitIncrease(){
  //=D31-D36-D37-D16
  profitIncrease = revisedAnnualProfit5 - totalOneTimeCost5 - annualCostPerTransaction5 - annualProfit5;
  updateDiv('profit_increase', formatCurrencyRound(profitIncrease));
}

function calcROIPayback(){
  //=C31-C16
  calc1 = revisedAnnualProfit - annualProfit
  //=G31*2
  calc2 = calc1 * 2
  //=D36+(C37*2)
  calc3 = totalOneTimeCost5 + (annualCostPerTransaction * 2)
  //=G35-G32
  calc4 = calc3 - calc2
  //=(G31-C37)/12
  calc5 = (calc1 - annualCostPerTransaction) / 12
  //=24+(G36/G37)
  roiPayback = 24 + (calc4 / calc5);
  updateDiv('roi_payback', formatCurrencyRound(roiPayback));
}
/*
 End of ROI calculations
*/


/*
  Initialize function for window loading
*/
function init(){
  initVars();  
  incTransactionValue =  parseFloat(o('inc_transaction_value').value) / 100.00;  
  percCCReductionFee = parseFloat(o('perc_cc_reduction_fee').value) / 100.00;
  percSalesRecovered = parseFloat(o('perc_sales_recovered').value) / 100.00;
  costPerAircraft = parseFloat(o('cost_per_aircraft').value);
  doCalculations();
}

/*
  Recalculate roi form
*/
function updateROI(){
  initVars();
  if ( !checkVars() ){
    alert('Could not complete the calculation!\r\nPlease ensure all entries are valid numbers.');
  }else{
    doCalculations();
    formatUserInput();
  }
}

/*
  Reset form to original state
*/
function resetROI(){
  document.roi_calculator.reset(); 
  updateROI();
}

/*
  Check each user input and flag errors
*/
function checkVars(){
  
  var errors = false;
  
  if ( !validate(o('on_board_sales').value) ){
    o('on_board_sales_err').innerHTML = '*';
    errors = true;
  }else{
    o('on_board_sales_err').innerHTML = '';
  }
  
  if( !validate(o('avg_transaction').value) ){
    o('avg_transaction_err').innerHTML = '*';
    errors = true;
  }else{
    o('avg_transaction_err').innerHTML = '';
  }
  
  if( !validatePerc(o('perc_sales_lost').value) ){
    o('perc_sales_lost_err').innerHTML = '*';
    errors = true;
  }else{
    o('perc_sales_lost_err').innerHTML = '';
  }
   
  if( !validatePerc(o('avg_cc_fees').value) ){
    o('avg_cc_fees_err').innerHTML = '*';
    errors = true;
  }else{
    o('avg_cc_fees_err').innerHTML = '';
  }
  
  if( !validatePerc(o('perc_profit_margin').value) ){
    o('perc_profit_margin_err').innerHTML = '*';
    errors = true;
  }else{
    o('perc_profit_margin_err').innerHTML = '';
  }
  
  if( !validate(o('cost_per_cc_transaction').value) ){
    o('cost_per_cc_transaction_err').innerHTML = '*';
    errors = true;
  }else{
    o('cost_per_cc_transaction_err').innerHTML = '';
  }
  
  if( !validate(o('total_aircraft').value) ){
    o('total_aircraft_err').innerHTML = '*';
    errors = true;
  }else{
    o('total_aircraft_err').innerHTML = '';
  }
  
  return !errors;
}

/*
  Initialize Variables
*/
function initVars(){
  onBoardSales = parseFloat(stripChars(o('on_board_sales').value));
  avgTransaction = parseFloat(stripChars(o('avg_transaction').value));
  percSalesLost = parseFloat(stripChars(o('perc_sales_lost').value)) / 100.00; 
  avgCCFees = parseFloat(stripChars(o('avg_cc_fees').value)) / 100.00; 
  percProfitMargin = parseFloat(stripChars(o('perc_profit_margin').value)) / 100.00; 
  costPerCCTransaction = parseFloat(stripChars(o('cost_per_cc_transaction').value))
  totalAircraft = parseFloat(stripChars(o('total_aircraft').value));
}

/*
 Do all the calculations in order as some calcultaions rely on others
*/
function doCalculations(){
  calcAnnualProfit(); 
  calcHigherAvgTransaction();   
  calcAnnualSalesIncrease();  
  calcAnnualCostRealized();
  calcRecoveredSales();
  calcRevisedAnnualProfit();
  calcTotalOneTimeCost();
  calcAnnualCostPerTransaction();
  calcProfitIncrease();
  calcROIPayback();
}

/*
  Ensure user currency input is formatted correctly
*/
function formatUserInput(){
  o('on_board_sales').value = formatCurrencyRound(onBoardSales)
  o('avg_transaction').value = formatCurrencyRound(avgTransaction)
  o('cost_per_cc_transaction').value = formatCurrencyRound(costPerCCTransaction)
}

/*
  Validate currency
*/
function validate(val){
  var objRegExp = /^([0-9,]+(?:|\.[0-9]{1,2}))$/
  return objRegExp.test(val)
}

/*
  Validate percentage
*/
function validatePerc(val){
  var objRegExp = /^([0-9]+(?:|\.[0-9]{1,2})+(?:|\%))$/
  return objRegExp.test(val)
}

/*
  Helper function to remove commas from calculations as parseFloat converts
  them to values
*/
function stripChars(input){
 var i;
 var strip = ","
 var returnString = '';
 for (i = 0; i<input.length;i++){
   var c = input.charAt(i);
   if (strip.indexOf(c)==-1) returnString += c;
 }
 return returnString;
}

/*
  Helper function to return object by element
*/
function o(id){
  var d=document;
  return d.getElementById?d.getElementById(id):(d.all?d.all[id]:(d.layers?d.layers[id]:null));
}

/*
  Helper function to correctly format currency
*/
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);
}

function formatCurrencyRound(num) {
  num = num.toString().replace(/\$|\,/g,'');
  if(isNaN(num))
  num = "0";
  sign = (num == (num = Math.abs(num)));
  num = Math.round(num).toString();
  //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 );
}

/*
  Helper function to replace contents of an element
*/
function updateDiv(id, value){
  o(id).innerHTML = value;
}

/*
  Onload calculate roi
*/
window.onload = init; 