Performance = new function(){

  var _div = null;
	
	var _measures = new Array();
	
	
	this.AddSection = function(){

	}
	
	this.Conclude = function(param)
	{
     var m = Performance.GetMeasure(param);
		 m.Stop();
		 Performance.Show(m);
		 Performance.Remove(m);	
	}

	this.Create= function(strName)
	{
    var m = new PerformanceMeasure(strName);
		var i = _measures.length;
		m.index = i;
		_measures[i] = m;
		return m;
	}
	
	this.GetMeasure = function(param)
	{
	  try{
	
  	  switch(typeof param)
  		{
  		  case "number":
  			  return _measures[param];
  			  break;
  		
   		  case "string":
    			var _measure = null;
    			var i = 0;
    			
    			while( (i < _measures.length) && (_measure == null))
    			{
    			  if(_measures[i].Name == param)
    				  _measure = _measures[i];
  
    				i++;
    			}
    			
    			return _measure;
  			  break;

  		  case "object":
  			  return param;
  			  break;
  		}
	
	
		}catch(err){Log.Add("Performance.GetMeasure", err, LogType.Error);}
	}
	
	
	this.Initialize = function(DivElement){
	
    _div = $(DivElement).find("div.performances");;
		
		_measures = new Array();
	
	}
	
	this.Remove = function(param)
	{
	  var m = Performance.GetMeasure(param);
		var i = m.index;
		_measures.splice(i, 1);
		m = null;
	}
	
	
	this.Start = function(param){
	  try{
		
			var m = Performance.GetMeasure(param);

			m.Start();
		
		}catch(err){Log.Add("Performance.Start", err, LogType.Error);}
	}
	
	this.Stop = function(param){
	  try{
		
  	  if(_measures == null)
	  	  return;		
		
			var m = Performance.GetMeasure(param);
			
			m.Stop();
	
		}catch(err){Log.Add("Performance.Stop", err, LogType.Error);}
	}	
	
	this.Show = function(param){
	  try{
		
			var m = Performance.GetMeasure(param);

			var d  = m.GetPerformance();
			
			_div.append(d);
			
			Performance.Remove(m);
					
		}catch(err){Log.Add("Performance.Show", err, LogType.Error);}
   	
	}

}




function PerformanceMeasure(strName)
{
  var _name = strName;
	
	var _caption = "";

  this.Name = strName;

	this.index = null;
	
	var _start = 0;
	
	var _stop = 0;
	
	var _measures = new Array();
	
	this.AddMeasure = function(measure)
	{
	  _measures[_measures.length] = measure;
	}
	
	this.SetCaption = function(strCaption)
	{
	  _caption = strCaption;
	}
	
	this.Start = function(){
	  _start = new Date().getTime();
	}

  this.Stop = function(){
	  _stop = new Date().getTime();

		this.Time = _stop - _start;	
	}
	
	this.Time = -1;
	
	this.GetPerformance = function(){

    var _div = $("<div class='measure'/>");
		
		var _title = $("<div class='title'/>");

		var _l = $("<div class='caption'/>");

		_l.html( _name + " - " + _caption);

		_title.append(_l);
		
	  var _r = $("<div class='time'/>");
		
		_r.html(this.Time);
		
		_title.append(_r);
		
		_title.append($("<div style='clear:both;'></div>"));
		
		_div.append(_title);
		
		for(var i = 0; i < _measures.length; i++)
		{
      _div.append(_measures[i].GetPerformance());
		}
		
		return _div;
	}
	
}


