/* nthist_spinner.js */
/* USAGE  spinner.spin_start( <number to spin>, <element for number>[,<call back>] );
	displays the number passed in the element designated,
	lets the rightmost digits change while freezing the eleftmost digits one at a time.
	when the number is finished displaying, the "call back" function ( if passed) is called.
*/
var spinner={
	do_step_sz : 25 ,
	do_millis : 500 ,
	target:	"" ,
	kkk : 0,
	rsz : 0,
	span1 : null ,
	span2 : null ,
	stepInerval : null ,
	onComplete : null ,
	jumpstart : 0 ,
	spin_jump : function() {
		spinner.rsz /= 10;
		spinner.kkk -= 1;
		if( spinner.kkk > 0 ) { spinner.start_spin_step(); }
		if( spinner.kkk == 0 && spinner.onComplete) { spinner.onComplete(); }
		}	,
	spin_step : function (){
		if( performance.now()  -  spinner.jumpstart  > spinner.do_millis ) {
			clearInterval( spinner.stepInerval );
			spinner.spin_jump();
		}
		spinner.span1.innerHTML=spinner.target.slice(0,spinner.target.length - spinner.kkk);
		spinner.span2.innerHTML=( spinner.kkk < 1 ) ? "" : 
			10 ** spinner.kkk - 1 - Math.floor(Math.random() * spinner.rsz );
	} ,
	start_spin_step : function (){
		spinner.jumpstart = performance.now() ;
		stepInerval = setInterval( spinner.spin_step, spinner.do_step_sz );
	}	,
	spin_start : function( display_value , display_target , call_back ){
		spinner.target = display_value;
		spinner.kkk = spinner.target.length;
		display_target.innerHTML="";
		if( ! spinner.span1 ) { spinner.span1 = document.createElement( "SPAN" ); }
		display_target.appendChild( spinner.span1 );
		if( ! spinner.span2 ) { spinner.span2 = document.createElement( "SPAN" ); }
		display_target.appendChild( spinner.span2 );
		if( call_back ) { spinner.onComplete = call_back ; }
		spinner.rsz =  10 ** spinner.kkk ;
		spinner.start_spin_step();
	} ,
} ;