var debugDataArray;
var debugFilter;
var debugSort;
var debugOrder;
var debugReport;
var debugTable;
var debugTableBody;

function debug(msg) {
	$('<div title="Debug"></div>').html('<pre>'+msg+'</pre>')
		.dialog({
			modal: true,
			height:500,
			width:600,
			close: function () { $(this).dialog("destroy").remove(); },
			buttons: {
				Ok: function() {
					$(this).dialog('close');
				}
			}
			
	});
}

function debugConsole() {
	
	$('#debugConsole').remove();
	
	debugFilter = $('<select id="debugFilter">'
	 +'<option value="">ALL</option>'
	 +'<option value="sql">SQL</option>'
	 +'<option value="bb">BB</option>'
	 +'<option value="info">Info</option>'
	 +'</select>').change(function() {
		 debugFilterSort();
	});
	
	debugSort = $('<select id="debugSort">'
			 +'<option value="start">Start</option>'
			 +'<option value="length">Length</option>'
			 +'<option value="type">Type</option>'
			 +'</select>').change(function() {
				 debugFilterSort();
			});
	
	debugOrder = $('<select id="debugOrder">'
			 +'<option value="ASC">Ascending</option>'
			 +'<option value="DESC">Descending</option>'
			 +'</select>').change(function() {
				 debugFilterSort();
			});
	
	debugReport = $('<div id="debugReport"></div>');
	debugTable = $('<table id="debugTable" width="100%" border="1" >');
	debugTable
		.append('<thead><tr>'+
				'<th width="5%">#</th>' +
				'<th width="10%">Start</th>' +
				'<th width="10%">Length</th>' +
				'<th width="10%">Type</th>' +
				'<th width="65%">Data</th>' +
				'</tr></thead>');

	if (debugTime < 1)
		var lengthTd = '<td align="center" bgcolor="#0F0">&lt;1ms</td>';
	else if (debugTime < 100)
		var lengthTd = '<td align="center" bgcolor="#0F0">'+Math.round(debugTime)+'ms</td>';
	else if (debugTime < 1000)
		var lengthTd = '<td align="center" bgcolor="#FFC000">'+Math.round(debugTime)+'ms</td>';
	else
		var lengthTd = '<td align="center" bgcolor="#F00">'+Math.round(debugTime)+'ms</td>';

	debugTable
		.append('<tfoot><tr>'+
				'<th align="center">'+debugData.length+'</th>' +
				'<th align="center">'+Math.round(debugTime)+'ms</th>' +
				lengthTd +
				'<th align="center">End</th>' +
				'<th>&nbsp;</th>' +
				'</tr></tfoot>');

	debugTableBody = $('<tbody></tbody>').appendTo(debugTable);
	
	$('<div title="Debug Console" id="debugConsole"></div>')
		.append("Filter: ").append(debugFilter).append("&nbsp;&nbsp;")
		.append("Sort: ").append(debugSort).append("&nbsp;&nbsp;")
		.append("Order: ").append(debugOrder).append("<br /><br />")
		.append(debugReport)
		.append(debugTable)
		.dialog({
			modal: true,
			width: 800,
			height: 600,
			close: function () { $(this).dialog("destroy").remove(); },
			buttons: {
				Ok: function() {
					$(this).dialog('close');
				}
			}
		});
	
	debugFilterSort();	
}

function debugFilterSort() {
	
	debugDataArray = {
			start: [],
			length: [],
			type: [],
			data: [],
			trace: []
		};
		
	var bbCount = 0;
	var bbTime = 0;
	var sqlCount = 0;
	var sqlTime = 0;
	
	for (var i in debugData) {
		if (!debugFilter.val() || debugFilter.val() == debugData[i].type){
			debugDataArray.start.push(debugData[i].start);
			debugDataArray.length.push(debugData[i].length);
			debugDataArray.type.push(debugData[i].type);
			debugDataArray.data.push(debugData[i].data);
			debugDataArray.trace.push(debugData[i].trace);
		}
		
		if (!debugData[i].type == "info") {
			
		} else if (debugData[i].type == "bb"){
			bbCount++;
			bbTime += debugData[i].length;		
		} else if (debugData[i].type == "sql"){
			sqlCount++;
			sqlTime += debugData[i].length;
		} 
	}
	
	if (debugOrder.val() == "DESC") var order = "SORT_DESC";
	else var order = "SORT_ASC";
	
	if (debugSort.val() == "type") {
		array_multisort(
				debugDataArray.type, order, 'SORT_STRING', 
				debugDataArray.start, 'SORT_ASC', 'SORT_NUMERIC',
				debugDataArray.length, 'SORT_ASC', 'SORT_NUMERIC',
				debugDataArray.data,
				debugDataArray.trace
				);
	} else if (debugSort.val() == "length") {
		array_multisort(
				debugDataArray.length, order, 'SORT_NUMERIC',
				debugDataArray.start, 'SORT_ASC', 'SORT_NUMERIC',
				debugDataArray.type, 'SORT_ASC', 'SORT_STRING', 
				debugDataArray.data,
				debugDataArray.trace
				);
	} else {
		array_multisort(
				debugDataArray.start, order, 'SORT_NUMERIC',
				debugDataArray.length, 'SORT_ASC', 'SORT_NUMERIC',
				debugDataArray.type, 'SORT_ASC', 'SORT_STRING', 
				debugDataArray.data,
				debugDataArray.trace
				);
	}
	
	debugReport.html("<b>SQL:</b> "+Math.round(sqlTime)+"ms ("+sqlCount+")<br />"+
			"<b>BB:</b> "+Math.round(bbTime)+"ms ("+bbCount+")<br />"+
			"<b>PHP:</b> "+Math.round(debugTime - bbTime - sqlTime)+"ms<br />"+
			"<b>Total: "+Math.round(debugTime)+"ms</b><br />"+
			"<br />");
	
	debugFillTable();
}
function debugFillTable() {
	
	debugTableBody.empty();
	
	for (var i in debugDataArray.start) {
		
		if (debugDataArray.type[i] == "info") {
			
			if (!debugDataArray.length[i]) 
				var lengthTd = '<td align="center" bgcolor="#00B0F0">&nbsp;</td>';
			else if (debugDataArray.length[i] < 1)
				var lengthTd = '<td align="center" bgcolor="#00B0F0">&lt;1ms</td>';
			else 
				var lengthTd = '<td align="center" bgcolor="#00B0F0">'+Math.round(debugDataArray.length[i])+'ms</td>';
		} else if (debugDataArray.type[i] == "bb"){
					
			if (debugDataArray.length[i] < 1)
				var lengthTd = '<td align="center" bgcolor="#0F0">&lt;1ms</td>';
			else if (debugDataArray.length[i] < 10)
				var lengthTd = '<td align="center" bgcolor="#FFC000">'+Math.round(debugDataArray.length[i])+'ms</td>';
			else
				var lengthTd = '<td align="center" bgcolor="#F00">'+Math.round(debugDataArray.length[i])+'ms</td>';
			
		} else if (debugDataArray.type[i] == "sql"){
			
			if (debugDataArray.length[i] < 1)
				var lengthTd = '<td align="center" bgcolor="#0F0">&lt;1ms</td>';
			else if (debugDataArray.length[i] < 10)
				var lengthTd = '<td align="center" bgcolor="#0F0">'+Math.round(debugDataArray.length[i])+'ms</td>';
			else if (debugDataArray.length[i] < 100)
				var lengthTd = '<td align="center" bgcolor="#FFC000">'+Math.round(debugDataArray.length[i])+'ms</td>';
			else
				var lengthTd = '<td align="center" bgcolor="#F00">'+Math.round(debugDataArray.length[i])+'ms</td>';
		
		} 
		
		debugTableBody
			.append($('<tr></tr>')
				.append('<th align="center">'+(parseInt(i)+1)+'</th>')
				.append('<td align="center">'+Math.round(debugDataArray.start[i])+'ms</td>')
				.append(lengthTd)
				.append('<td align="center">'+debugDataArray.type[i]+'</td>')
				.append($('<td style="cursor:pointer" >'+debugDataArray.data[i]+'</td>').data("trace", debugDataArray.trace[i]).click(function() {
					
					if ($(this).data("trace")) {
						$('<div title="Call Trace"></div>')
						.html('<pre style="white-space: pre-wrap;">'+$(this).data("trace")+'</pre>')
						.dialog({
							width: 800,
							height: 600,
							close: function () { $(this).dialog("destroy").remove(); },
							buttons: {
								Ok: function() {
									$(this).dialog('close');
								}
							}
						});
					}
					
				}))
			);
		
		
	}
	
}

var isCtrl = false;

$(document)
	.keyup(function (e) { if(e.which == 17) isCtrl=false; })
	.keydown(function (e) { 
		if(e.which == 17) isCtrl=true; 
		if(e.which == 13 && isCtrl == true) { 
			debugConsole();
			return false;
		} 
}); 

