if (!Framework.Debugging)
{
	Framework.Debugging = {};
}

Framework.Debugging.Bar = Class.create({
	
	initialize: function(wrapper)
	{
		this.wrapper = $(wrapper);
		this.wrapper.observe('click', this._onClick.bind(this));
		this.errorCounterSpan = this.wrapper.down('span.errorCounter');
		
		this.wrapper.select('div.debugServerSideConsole .toggleCollapsed').each(function(el){
			
			el.observe('mouseover', this._onServerSideConsoleMouseOver.bind(this));
			el.observe('mouseout', this._onServerSideConsoleMouseOut.bind(this));
			el.observe('click', this._onServerSideConsoleClick.bind(this));
			
		}, this);
	},
	
	toggleDebug: function()
	{
		this.wrapper.down('div.debugConsole').toggle();
	},
	
	toggleTimers: function()
	{
		this.wrapper.down('div.timers').toggle();
	},
	
	toggleServerSideConsole: function()
	{
		this.wrapper.down('div.debugServerSideConsole').toggle();
	},
	
	toggleDebugErrors: function()
	{
		this.wrapper.down('div.debugErrors').toggle();
	},
	
	toggleClientSideConsole: function()
	{
		this.wrapper.down('div.clientSideConsole').toggle();
	},
	
	printClientSideConsole: function()
	{
		var console = Framework.Debugging.Console.toString();
		this.wrapper.down('div.clientSideConsole').update(console).show();
	},
	
	toggleQueries: function()
	{
		this.wrapper.down('div.queries').toggle();
	},
	
	toggleCacheGets: function()
	{
		this.wrapper.down('div.cacheGets').toggle();
	},
	
	toggleTemplateAssignments: function()
	{
		this.wrapper.down('div.templateAssignments').toggle();
	},
	
	//
	// Event handlers
	//
	
	_onClick: function(event)
	{
		if (event.findElement('a.toggleDebugConsole'))
		{
			this._onToggleDebug(event);
		}
		else if (event.findElement('a.toggleTimers'))
		{
			this._onToggleTimers(event);
		}
		else if (event.findElement('a.toggleDebugServerSideConsole'))
		{
			this._onToggleServerSideConsole(event);
		}
		else if (event.findElement('a.toggleDebugErrors'))
		{
			this._onToggleDebugErrors(event);
		}
		else if (event.findElement('a.toggleClientSideConsole'))
		{
			this._onToggleClientSideConsole(event);
		}
		else if (event.findElement('a.printClientSideConsole'))
		{
			this._onPrintClientSideConsole(event);
		}
		else if (event.findElement('a.toggleQueries'))
		{
			this._onToggleQueries(event);
		}
		else if (event.findElement('a.toggleCacheGets'))
		{
			this._onToggleCacheGets(event);
		}
		else if (event.findElement('a.toggleTemplateAssignments'))
		{
			this._onToggleTemplateAssignments(event);
		}
	},
	
	_onToggleDebug: function(event)
	{
		this.toggleDebug();
		event.stop();
	},
	
	_onToggleTimers: function(event)
	{
		this.toggleTimers();
		event.stop();
	},
	
	_onToggleServerSideConsole: function(event)
	{
		this.toggleServerSideConsole();
		event.stop();
	},
	
	_onToggleDebugErrors: function(event)
	{
		this.toggleDebugErrors();
		event.stop();
	},
	
	_onToggleClientSideConsole: function(event)
	{
		this.toggleClientSideConsole();
		event.stop();
	},
	
	_onPrintClientSideConsole: function(event)
	{
		this.printClientSideConsole();
		event.stop();
	},
	
	_onToggleQueries: function(event)
	{
		this.toggleQueries();
		event.stop();
	},
	
	_onToggleCacheGets: function(event)
	{
		this.toggleCacheGets();
		event.stop();
	},
	
	_onToggleTemplateAssignments: function(event)
	{
		this.toggleTemplateAssignments();
		event.stop();
	},
	
	_onServerSideConsoleMouseOver: function(event)
	{
		event.findElement('li').addClassName('toggleHovered');
	},
	
	_onServerSideConsoleMouseOut: function(event)
	{
		event.findElement('li').removeClassName('toggleHovered');
	},
	
	_onServerSideConsoleClick: function(event)
	{
		var el = event.findElement('li');
		$('child' + el.id).toggle();
		el.toggleClassName('toggleExpanded');
		event.stop();
	},
	
	//
	// Error Count
	//
	
	_errorCount: function() 
	{
		var count = 0;
		if (this.errorCounterSpan)
		{
			count = parseInt(this.errorCounterSpan.innerHTML, 10) || 0;
		}
		
		return count;
	}(),
	
	getErrorCount: function()
	{
		return this._errorCount;
	},
	
	incrementErrorCount: function(value)
	{
		if (!value)
		{
			value = 1;
		}
		this._errorCount += value;
	},
	
	_eoo: true
	
});
