/*
   Datei: benchmark.js
   Autor: Struppi struebig@gmx.net
   Datum: 12:46 06.11.2008
*/

function Benchmark() {
	var count = arguments[0];
	var test  = arguments[1];
	var onready = arguments[2];
	
	if(!test || test.constructor != Object) return alert('wrong argument, usage Benchmark(count, object)');
	var NL = '\n';
	var auswertung = [];
	var calls = [];
	for(var t in test) calls.push(t);
	function run() {
		var func = calls.pop();
		window.status = 'Run ' + func + ' ' + count + ' Mal.';
		
		var d1 = new Date();
		for(var i = 0; i < count; i++) test[func]();
		var d2 = new Date();
		
		var per_second = parseInt(count / (d2 - d1)  * 1000);
		auswertung.push( {
		time: (d2 - d1),
		text: (func + ':').fix(15, '.')
		+ '\t' + ((d2 - d1) + 'ms').fix(5, ' ', RIGHT) + ' = '
		+ (per_second.format(0) + '/sekunde').fix(15, '.') + NL
		});
		
		if(calls.length) window.setTimeout(run, 1);
		else {
			auswertung.sort(function(a, b) { return a.time < b.time ? -1 : a.time > b.time ? 1 : 0;});
			if(onready)onready(
			'JS Benchmark.'.fix(35, ' ', CENTER) + NL+ NL
			+ ('Anzahl der DurchlÃ¤ufe: ' + count.format()).fix(35) + NL
			+ ''.fix(45, '-') + NL + NL
			+ ( function() {
				var tmp = '';
				for(var i = 0; i < auswertung.length; i++) tmp += auswertung[i].text;
				return tmp;
				})()
			);
		}
	}
	window.setTimeout(run, 1);
}

String.prototype.fix = function(width, c , align) {
   if(!width) return null;
   if(!c) c = " ";
   if(!align) align = LEFT;

   var tmp = "";
   var j = 0;

   var start = 0;
   if (align == RIGHT) start = width - this.length;
   else if(align == CENTER) start = width/2 - (this.length/2);

   if (start < 0 ) start = 0;
   start = parseInt(start);
   for(var i = 0; i < width;i++)
   {
       if(i == start)
       {
           if(j < this.length)
           {
             tmp += this.charAt(j++);
             start++;
             continue;
           }
       }
       tmp += c;
   }
   return tmp;
}
window.CENTER = 1;
window.LEFT = 2;
window.RIGHT = 3;

Number.prototype.format = function(k, fixLength) {
    if(!k) k = 0;
    var neu = '';
    var f = Math.pow(10, k);
    var zahl = '' + parseInt( this * f + (.5 * (this > 0 ? 1 : -1)) ) / f ;

    // Komma ermittlen
    var idx = zahl.indexOf('.');
    // fehlende Nullen einfügen
    if(fixLength) {
         zahl += (idx == -1 ? '.' : '' )
         + f.toString().substring(1);
    }
    // Nachkommastellen ermittlen
    idx = zahl.indexOf('.');
    if( idx == -1) idx = zahl.length;
    else neu = Number.decPoint  + zahl.substr(idx + 1, k);
 
    // Tausendertrennzeichen
    while(idx > 0)
    {
        if(idx - 3 > 0)
        neu = Number.thousand_sep + zahl.substring( idx - 3, idx) + neu;
        else
        neu = zahl.substring(0, idx) + neu;
        idx -= 3;
    }
    return neu;
}
Number.decPoint = ',';
Number.thousand_sep = '.';

