//                                        updated: 12-22-2009
//              JS_BestDebtClockUSA.js
//		 ©2007, Steve Conover
//
//  by Steve Conover, Sr. with major ghost-writing
//  assistance from Steve Conover, Jr., April 2006.	

UPDATE_INTERVAL_MILLIS = 999;

function updateForever() {
  DebtClockSnapshot();
  setTimeout(function() {updateForever();}, UPDATE_INTERVAL_MILLIS);
}

function DebtClockSnapshot() {

//========================================================
//    This section to be updated with new data each month,
//	as soon as the BEA releases the latest GDP
//	estimates, and the 2-quarter GDP growth model
//	is run to generate GDP growth per quarter.
//	(Each month's BEA estimate of recent-quarter GDP 
//	 yields a new estimate of quarterly GDP growth.)
//
//	Note: When the Public Debt is published for the
//	end of a new month, the "LastBEA" date will be 
//	advanced to that date, and the GDP will be estimated
//	for that date using the most recent growth rate.
//========================================================
	var LastBEA= "30 nov 2009";

	var LastNominalGdpBillion= 14263.5;
	var LastNominalGdpPctGrowthPerQuarter= 0.226;

	var LastTotDebtBillion= 12113.0;
	var LastTotDebtPctGrowthPerQuarter= 3.553;

	var LastPubHeldDebtBillion= 7712.4;
	var LastPubHeldDebtPctGrowthPerQuarter= 5.087;
//========================================================
//    Calculations and output
//========================================================
	// "BEAmilliTime" is the millisecond date of the 
	// last official GDP estimate by the BEA.  The most 
	// recent quarter GDP was forecasted forward to 
	// that date, and the Debt numbers (Gross and 
	// Publicly-held) are as of that date, from the 
	// Bureau of Public Debt.

	var lbrk= "<br>";
	var BEAmilliTime= 1+Date.parse(LastBEA);
	var NowData= new Date();

	var LNGB= LastNominalGdpBillion;
	var LNGPG= LastNominalGdpPctGrowthPerQuarter;
	var LTDB= LastTotDebtBillion;
	var LTDPG= LastTotDebtPctGrowthPerQuarter;
	var LPDB= LastPubHeldDebtBillion;
	var LPDPG= LastPubHeldDebtPctGrowthPerQuarter;
	var DaysPerQtr= 91.25;

	var LastNominalGdp= LNGB*1000000000;
	var GdpPerQtr= LastNominalGdp*(LNGPG/100);
	var GdpPerMillisec= GdpPerQtr/DaysPerQtr/24/60/60/1000;

	var LastTotDebt= LTDB*1000000000;
	var TdebtPerQtr= LastTotDebt*(LTDPG/100);
	var TdebtPerMillisec= TdebtPerQtr/DaysPerQtr/24/60/60/1000;

	var LastPubDebt= LPDB*1000000000;
	var PdebtPerQtr= LastPubDebt*(LPDPG/100);
	var PdebtPerMillisec= PdebtPerQtr/DaysPerQtr/24/60/60/1000;

	var LNG= LastNominalGdp;
	var LTD= LastTotDebt;
	var LPD= LastPubDebt;

	var TDPMs= TdebtPerMillisec;
	var PDPMs= PdebtPerMillisec;

	var NowMilliTime= NowData.getTime();
	var MilliSinceLastGdp= NowMilliTime-BEAmilliTime;

	var GPMs= GdpPerMillisec;
	var GdpNow= LNG+(GPMs*MilliSinceLastGdp);
	var TdebtNow= LTD+(TDPMs*MilliSinceLastGdp);
	var TdebtGdpRatio= 100*TdebtNow/GdpNow;
	var PdebtNow= LPD+(PDPMs*MilliSinceLastGdp);
	var PdebtGdpRatio= 100*PdebtNow/GdpNow;

	var GdpTril= GdpNow/1000000000000;
	var TdebtTril= TdebtNow/1000000000000;
	var PdebtTril= PdebtNow/1000000000000;
	var ClockTitle= "Best Debt Clock";
	var ClockTitle2= "in the USA:";
	var cSkeptOpt= "by The Skeptical Optimist";
	var Divider1= "Tot.Debt =";
	var Divider2= "GDP =";
	var Divider3= "TotDebt-to-GDP Ratio";
	var Divider4= "Pub.Debt =";
	var Divider5= "PubDebt-to-GDP Ratio";

	document.getElementById("divide").innerHTML = Divider1;
	document.getElementById("divide2").innerHTML = Divider2;
	document.getElementById("divide3").innerHTML = Divider3;
	document.getElementById("divide4").innerHTML = Divider4;
	document.getElementById("divide5").innerHTML = Divider5;
	document.getElementById("CTitle").innerHTML = ClockTitle;
	document.getElementById("CTitle2").innerHTML = ClockTitle2;
	document.getElementById("cSO").innerHTML = cSkeptOpt;
	document.getElementById("gdp_now").innerHTML =
		to2TDollars(GdpNow);
	document.getElementById("tdebt_now").innerHTML =
		to1TDollars(TdebtNow);
	document.getElementById("tdebt_to_gdp").innerHTML =
		toPercent(TdebtGdpRatio);
	document.getElementById("pdebt_now").innerHTML =
		to1TDollars(PdebtNow);
	document.getElementById("pdebt_to_gdp").innerHTML =
		toPercent(PdebtGdpRatio);
	}
//--------------------------------------
function to2TDollars(number) {
     var str = "" + number.toFixed(2);
     var integerPart = str.split(".")[0];
     var decimalPart = str.split(".")[1];
     var integerPartWithCommas = "";
     var len = integerPart.length;

  for (var i=len-1; i>=0; i--) {
       var positionLeftFromDecimalPoint = (len-1-i);
       if (positionLeftFromDecimalPoint > 0 &&

    positionLeftFromDecimalPoint % 3 == 0) {
         integerPartWithCommas = "," + integerPartWithCommas;
    }

       integerPartWithCommas = integerPart.charAt(i) + integerPartWithCommas;
  }

     return "$" + integerPartWithCommas + "." + decimalPart;
}
//--------------------------------------
function to1TDollars(number) {
     var str = "" + number.toFixed(2);
     var integerPart = str.split(".")[0];
     var decimalPart = str.split(".")[1];
     var integerPartWithCommas = "";
     var len = integerPart.length;

  for (var i=len-1; i>=0; i--) {
       var positionLeftFromDecimalPoint = (len-1-i);
       if (positionLeftFromDecimalPoint > 0 &&

    positionLeftFromDecimalPoint % 3 == 0) {
         integerPartWithCommas = "," + integerPartWithCommas;
    }

       integerPartWithCommas = integerPart.charAt(i) + integerPartWithCommas;
  }

     return "$ " + integerPartWithCommas + "." + decimalPart;
}
//--------------------------------------
function toPercent(number) {
     var str = "" + number.toFixed(8);
     var integerPart = str.split(".")[0];
     var decimalPart = str.split(".")[1];
     var integerPartWithCommas = "";
     var len = integerPart.length;

  for (var i=len-1; i>=0; i--) {
       var positionLeftFromDecimalPoint = (len-1-i);
       if (positionLeftFromDecimalPoint > 0 &&

    positionLeftFromDecimalPoint % 3 == 0) {
         integerPartWithCommas = "" + integerPartWithCommas;
    }

       integerPartWithCommas = integerPart.charAt(i) + integerPartWithCommas;
  }

     return "= "+integerPartWithCommas+"."+decimalPart+"%";
}
//========================================================





