// init data

// debug uption

var debug = 0;

// default input values

var maxTapes = 300;           // Tape ROI Calculator.D2
var maxPackages = 100;        // Tape ROI Calculator.D3 

var mainLocations = 1;        // Tape ROI Calculator.D6
var otherLocations = 5;       // Tape ROI Calculator.D7 
 
// configurator 

var CentralMediaBasePrice = 50000;   // Configurator.E23
var CentralMediaExpPrice  = 25000;   // Configurator.E24
var ServerMediaAgentPrice = 7500;    // Ccofigurator.E44

var years = 3;                       // years
var months = years*12;

// asumtion values

var CostToDub = 100;           // Assumtions.D2
var CostToShip = 100;          // Assumtions.D3
var MainServerCost = 5000;     // Assumtions.D16
var SatelliteCost = 3000;      // Assumtions.D17
var ImplementMain = 25000;     // Assumtions.D19
var ImplementSat  = 5000;      // Assumtions.D20
var BandwidthPrice = [0, 300, 1500, 5000, 7500, 10000, 25000];  // Assumtions.E7:E12
var MonthlyGain  = new Array(months);
var Npv = 0;                  // Assumtions.G27  
var discount_rate = 5/12; 

// color definitions

var scaleColor = "#879193";
var selectedColor = "#75B4C6";
var savedColor;

// internal setup values

var graphDot = "http://www.signiant.com/Portals/919/calculator/dot.png";

// init controls

document.getElementById('tapes').value = maxTapes;
document.getElementById('packages').value = maxPackages;
document.getElementById('mainloc').value = mainLocations;
document.getElementById('otherloc').value = otherLocations;

// main function

function recalc() {

  // get input data 

  var tapesVal     = Number(document.getElementById('tapes').value);
  var packagesVal  = Number(document.getElementById('packages').value);
  var mainlocVal   = Number(document.getElementById('mainloc').value);
  var otherlocVal  = Number(document.getElementById('otherloc').value);
  var mainBandwidthObj    = document.getElementById('mainBandwidth');
  var mainBandwidthVal    = Number(mainBandwidthObj.options[mainBandwidthObj.selectedIndex].value);

  var branchBandwidthObj  = document.getElementById('branchBandwidth');
  var branchBandwidthVal  = Number(branchBandwidthObj.options[branchBandwidthObj.selectedIndex].value);

  // get control objects  

  var monthlyCostObj  = document.getElementById('monthlyCost');
  var annualCostObj   = document.getElementById('annualCost');

  var threeYearNoSigniantCostObj   = document.getElementById('threeYearNoSigniantCost');
  var threeYearWithSigniantCostObj = document.getElementById('threeYearWithSigniantCost');

  var roiObj = document.getElementById('roi');
  var NPVSavingsObj = document.getElementById('NPVSavings');
  var paybackObj = document.getElementById('payback');

  var mainBandwidthCostObj   = document.getElementById('mainBandwidthCost');
  var branchBandwidthCostObj  = document.getElementById('branchBandwidthCost');
  var totalBandwidthCostObj   = document.getElementById('totalBandwidthCost');

  var GraphObj   = document.getElementById('Graph');

  var hardwareCostObj = document.getElementById('hardwareCost');
  var softwareCostObj = document.getElementById('softwareCost');
  var implCostObj     = document.getElementById('implCost');
  var totalCostObj    = document.getElementById('totalCost');

  var debugObj    = document.getElementById('debug');

  // setup configurator values

  var TotalServers = mainlocVal + otherlocVal; // // Configurator.C3

  var CentralMediaBaseQty   = 1;       // Configurator.F23
  var CentralMediaBasefCost  = CentralMediaBasePrice*CentralMediaBaseQty; // Configurator.G23
  
  var CentralMediaExpQty    = 1;       // Configurator.F24
  var CentralMediaExpCost   = CentralMediaExpPrice*CentralMediaExpQty; // Configurator.G24

  var ServerMediaAgentCost  = ServerMediaAgentPrice*TotalServers;   // Configurator.G44

  var TotalSoftLicCost = CentralMediaBasefCost + CentralMediaExpCost + ServerMediaAgentCost; //  Configurator.G3
  var MaintCost = TotalSoftLicCost * 0.2;                        //  Configurator.G4
  var ServiceCost = 0;                //  Configurator.G8
  var Discount    = 0;                // Configurator.G11

  // calculate values

  var monthlyCost = tapesVal*CostToDub + packagesVal*CostToShip;   
  var annualCost  = monthlyCost*12;

  var mainBandwidthCost   = mainlocVal*BandwidthPrice[mainBandwidthVal];
  var branchBandwidthCost = otherlocVal*BandwidthPrice[branchBandwidthVal];
  var totalBandwidthCost = mainBandwidthCost + branchBandwidthCost;

  var hardwareCost = mainlocVal*MainServerCost + otherlocVal*SatelliteCost;
  var totalSoftCost = TotalSoftLicCost + MaintCost + ServiceCost - Discount;
  var implementCost = mainlocVal*ImplementMain + otherlocVal*ImplementSat;
  var totalCost  = hardwareCost + totalSoftCost + implementCost;

  var threeYearNoSigniantCost = annualCost*years;
  var threeYearWithSigniantCost = months*totalBandwidthCost + totalCost;

  var roi = Math.floor(((threeYearNoSigniantCost - threeYearWithSigniantCost) / threeYearWithSigniantCost) * 100);
  var monthInvDif = monthlyCost - totalBandwidthCost;
  var payback = Math.round((totalCost / monthInvDif)*10)/10;

  // build monthly gain array

  debugObj.innerHTML = "";
  Npv = 0;

  for (var i = 0; i < MonthlyGain.length; i++) {

     if ( i == 0) {
       MonthlyGain[i] = 0 - totalCost;
       var value =  MonthlyGain[i];
     } else {
       MonthlyGain[i] = MonthlyGain[i-1] + monthInvDif;
       var value =  monthInvDif;
     }
      
     var pv = value/ Math.pow(1+(discount_rate/100), i); 
    
     Npv += pv;
     Npv = Math.round(Npv*10)/10;

     // if (debug == 1) { debugObj.innerHTML += MonthlyGain[i] + " &nbsp; " + pv   + " &nbsp; " + Npv + "<br/>"; }

  }

  // set controls
  
  monthlyCostObj.innerHTML = showDollar(monthlyCost, 0);
  annualCostObj.innerHTML  = showDollar(annualCost, 1);

  mainBandwidthCostObj.innerHTML  = showDollar(mainBandwidthCost, 0);
  branchBandwidthCostObj.innerHTML  = showDollar(branchBandwidthCost, 0);
  totalBandwidthCostObj.innerHTML  = showDollar(totalBandwidthCost, 1);

  threeYearNoSigniantCostObj.innerHTML  = showDollar(threeYearNoSigniantCost, 0);
  threeYearWithSigniantCostObj.innerHTML  = showDollar(threeYearWithSigniantCost, 0);

  NPVSavingsObj.innerHTML = Npv > 0 ? showDollar(Npv, 0) : "NA";

  roiObj.innerHTML  = roi > 0 ? roi + "%" : "NA";
  
  paybackObj.innerHTML =payback > 0 ? payback + " month" : "NA";

  GraphObj.innerHTML = doGraph ();

  hardwareCostObj.innerHTML  = showDollar(hardwareCost, 0);
  softwareCostObj.innerHTML  = showDollar(totalSoftCost, 0); 
  implCostObj.innerHTML  = showDollar(implementCost, 0); 
  totalCostObj.innerHTML  = showDollar(totalCost, 1); 

}

// event handles

function tapesChangeHandler() {

  var tapes     = document.getElementById('tapes');

  cleanIntBox(tapes);
  recalc();
}

function packagesChangeHandler() {

  var packages    = document.getElementById('packages');

  cleanIntBox(packages);
  recalc();
}

function mainlocChangeHandler() {

  var mainloc   = document.getElementById('mainloc');

  cleanIntBox(mainloc);
  recalc();
}

function otherlocChangeHandler() {

  var otherloc   = document.getElementById('otherloc');

  cleanIntBox(otherloc);
  recalc();
}

// utility function 

function doGraph () {

  var table = "";
  var borderStyle = "";
  var borderStyle2 = "";
  var posetive = true;
  var content = "";

  if (MonthlyGain[months-1] <= 0) return table;

  table += "<table id='graphTable'>\n";
  table += "<thead>\n";
  table += "<tr>\n";

  table += "<th>&nbsp;</th>\n";
  table += "<th colspan='" + (months/2 +1 ) +"'>Cash Flow from Replacing Tape with File Transfers</th>\n";

  table += "</tr>\n";
  table += "</thead>\n";

  table += "<tbody>\n";

  var xVal = 19;
  var yVal = 1;

  for (var i = months -1; i >= 0; i -= 2) {

    if (posetive && MonthlyGain[i] < 0) {
      
      borderStyle = "style='border-top:1px solid #000 '";
      borderStyle2 = "style='border-top:1px solid #000;  border-left:1px solid " + scaleColor + "'";
      
      posetive = false;

    } else {
         
      borderStyle = "";    
      borderStyle2 = "style='border-left:1px solid " + scaleColor + "'";
	
    }

    table += "<tr>\n";

    table += "<td " + borderStyle  + " nowrap>" + showDollar(MonthlyGain[i],0) + "</td>\n";

    table += "<td " +  borderStyle2 + "></td>\n";

    for (var i2 = 1; i2 < months; i2 += 2) {

      if (i2 == i) {
	
        var imgId = "img" + i;
	var eventHdl = "onmouseover='showSelected(" + yVal + "," 
                                                    + xVal + ",\"" 
                                                    + imgId + "\"," 
                                                    + i + "," 
                                                    + MonthlyGain[i-1] + ","
                                                    + MonthlyGain[i] + ")' " +
	  "onmouseout='unshowSelected(" + yVal + "," + xVal + ")' ";

	content = "<img src='" + graphDot + "'" + eventHdl  + "id='" + imgId + "'/>";


      } else {

	content = "&nbsp;";

      }


      table += "<td " + borderStyle  + ">" + content  + "</td>\n";
      

      
    }
    
    yVal ++;
    xVal --;

    table += "</tr>\n";
  }

  table += "</tbody>\n";

  table += "<tfoot>\n";

  table += "<tr>\n";
  
  table += "<td style='border-top:1px solid " + scaleColor + "'>&nbsp;</td>\n";
  table += "<td style='border-top:1px solid " + scaleColor + "; border-left:1px solid " + scaleColor  + "'></td>\n";

  var space = "&nbsp;&nbsp;";
 
  for (var i = 1; i < months; i += 2) {

    borderStyle = "style='border-top:1px solid " + scaleColor  + "'";

    if (i >= 9) { space = ""; }

    table += "<td " + borderStyle + ">" +  space + (i + 1)  + "</td>\n";
      
  }

  table += "</tr>\n";
  table += "<tr id='helpLN'>\n";

  table += "<td>&nbsp;</td>\n";
  table += "<td colspan='" + (months/2 +1 ) +"' >Move mouse over dot to see more data </td>\n";

  table += "</tr>\n";

  table += "</tfoot>\n";

  table += "</table>\n";

  return table;

}

function showSelected(y, x, imgId, month, dollar1, dollar2) {

  var graphTableObj  = document.getElementById('graphTable');
  var toolTipObj     = document.getElementById('xtooltip');
  var imgObj         = document.getElementById(imgId); 
  var ttTableObj     = document.getElementById('xtooltipTable'); 

  savedColor = graphTableObj.rows[0].cells[0].bgColor;
  graphTableObj.rows[y].cells[0].bgColor = selectedColor;
  var idx = months/2+1;
  graphTableObj.rows[idx].cells[x].bgColor = selectedColor;

  var xPos = xstooltip_findPosX(imgObj) + 10;
  var yPos = xstooltip_findPosY(imgObj) + 20;
        
  toolTipObj.style.top = yPos + 'px';
  toolTipObj.style.left = xPos + 'px';

  ttTableObj.rows[2].cells[0].innerHTML = month;
  ttTableObj.rows[2].cells[1].innerHTML = showDollar(dollar1,0);
  ttTableObj.rows[1].cells[0].innerHTML = month+1;
  ttTableObj.rows[1].cells[1].innerHTML = showDollar(dollar2,0);

  toolTipObj.style.visibility = 'visible'; 

}

function unshowSelected(y, x) {

  var graphTableObj  = document.getElementById('graphTable');
  var toolTipObj     = document.getElementById('xtooltip');

  graphTableObj.rows[y].cells[0].bgColor = savedColor;
  var idx = months/2+1;
  graphTableObj.rows[idx].cells[x].bgColor = savedColor;

  toolTipObj.style.visibility = 'hidden'; 

}

function showDollar(amount, strong) {

  var dollarSing = "$";

  if (amount < 0 ) {

    amount  = Math.abs(amount);
    dollarSing = "-$"

  } 

  var value = amount.toString();
  var DollarOut = "";
  var rgx = /(\d+)(\d{3})/;

  while (rgx.test(value)) {
     value = value.replace(rgx, '$1' + ',' + '$2');
  }

  if (strong == 1) { DollarOut = "<strong>"; }
  DollarOut += dollarSing;
  DollarOut += value;

  if (strong == 1) { DollarOut += "</strong>"; }

  return(DollarOut);
}

function cleanIntBox(formField){
	var re = /[^0-9]/gi;

	var inValue = formField.value;
	var outValue = inValue.replace(re, "");

	formField.value = outValue;
	return(1);
}

function xstooltip_findPosX(obj) 
{
  var curleft = 0;
  if (obj.offsetParent) 
  {
    while (obj.offsetParent) 
        {
            curleft += obj.offsetLeft
            obj = obj.offsetParent;
        }
    }
    else if (obj.x)
        curleft += obj.x;
    return curleft;
}

function xstooltip_findPosY(obj) 
{
    var curtop = 0;
    if (obj.offsetParent) 
    {
        while (obj.offsetParent) 
        {
            curtop += obj.offsetTop
            obj = obj.offsetParent;
        }
    }
    else if (obj.y)
        curtop += obj.y;
    return curtop;
}

