var SHOW_WARNINGS = false;
var SHOW_ERRORS = false;
var SHOW_TRACE = false;

var debugWindow;

function trace(value/*:String*/, valueName/*:String*/)/*:Void*/ {
	if (!SHOW_TRACE) return;
	var s  = "";
	valueName = valueName || "";

	switch (typeof value) {
		case
			"string": s = '"' +  value + '"';
		break;

		default:
			if (valueName)
			valueName += " ";
			else
			valueName = "";

			valueName += "[" + typeof value + "]";

			s += valueName + "\n";

			for (var key in value)
				if (typeof value[key] != "function")
					s += key + " = " + value[key] + "\n";

	}

	if (window.opera)
		opera.postError("Trace" + (valueName ? "" : (" " + valueName)) + ":" + s);
	else
		postError("<strong style='color: Green'>Trace " +
			valueName +
			":</strong><br /><span style='color: Green'>" +
			s.replace(/>/g, "&gt;").replace(/</g, "&lt;") +
			"</span>");
}

function postError(message/*:String*/) {
	if (!SHOW_TRACE) return;
	if (debugWindow == undefined) {
		debugWindow = window.open("", "DebugWindow", "height=400, width=500, status=yes, scrollbars=yes");
		debugWindow.document.title = "Debug Conslole";

		//debugWindow.document.appendChild(debugWindow.document.createElement(html)

		with (debugWindow.document) {
			open();
			write("<html>");
			write("<head>");
			write("<title>Debug Window</title>");
			write("</head>");
			write("<body style='font-size: 9pt; font-family: \"Courier new\"' bgcolor='white'>");
			write("</body>");
			write("</html>");
			close();
		}
		//debugWindow.document.body.style.fontSize = "12px";
		//debugWindow.document.body.style.fontFamily = "Courier New";
	}

	//debugWindow.document.body.innerHTML = "";
	var p = debugWindow.document.createElement("p");
	p.innerHTML = "" + message.replace(/\r\n|\n|\r/g, "<br />" + "");
	debugWindow.document.body.appendChild(p);
}

function warning(expression, message/*:String*/) {
	if (!SHOW_WARNINGS) return;
	if (!expression)
		if (window.opera)
			opera.postError("<strong>Warning:</strong>\n" + message);
		else
			postError("<strong style='color: Navy'>Warning: </strong><br />  " + message);
}

function assert(expression, message/*:String*/) {
	if (!SHOW_ERRORS) return;
	if (!expression)
		if (window.opera)
			opera.postError("Error:\n" + message);
		else
			postError("<strong style='color: Red'>Error: </strong><br />  " + message);
}



//function trace(value, valueName) {
//	var valueName = valueName || "";

//	}
//
//	//debugWindow.document.clear();
//
//	switch (typeof value) {
//		case "object":
//			for (var prop in value) {
//				if (typeof value[prop] != "function") {
//					p = debugWindow.document.createElement("p");
//					t = debugWindow.document.createTextNode(valueName + "." + prop + " = " + value[prop]);
//					p.appendChild(t)
//					bod.appendChild(p);
//				}
//			}
//			break;
//		default :
//			p = debugWindow.document.createElement("p");
//			t = debugWindow.document.createTextNode(valueName + " = " + value);
//			p.appendChild(t);
//			bod.appendChild(p);
//	}
//}

//var padding = "";
//
//function incPadding() {
//	padding += "    ";
//}
//
//function decPadding() {
//	padding = padding.substr(0, padding.length - 4);
//}
//
//Array.prototype.trace = function () {
//	var result = padding + "[\n";
//
//	incPadding();
//
//	for (var i = 0; i < this.length; i++) {
//		if (!this[i].trace) {
//			this[i].trace = Object.prototype.trace;
//		}
//		result += this[i].trace() + ",\n";
//	}
//	result = result.substr(0, result.length - 2) + "\n";
//	decPadding();
//
//	return result + padding + "]";
//}
//
//Boolean.prototype.trace = function () {
//	return padding + this;
//}
//
//Date.prototype.trace  = function () {
//	return padding + "Date";
//}
//
//Function.prototype.trace = function () {
//	return padding + "function";
//}
//
//Number.prototype.trace = function () {
//	return padding + this;
//}
//
//Object.prototype.trace = function () {
//	var result = padding + "{\n";
//
//	incPadding();
//	for (var property in this) {
//		if (!this[property].trace) {
//			this[property].trace = Object.prototype.trace;
//		}
//		result += property + ": " + this[property].trace() + ",\n";
//	}
//	result = result.substr(0, result.length - 2) + "\n";
//	decPadding();
//
//	return result + padding + "}";
//}
//
//String.prototype.trace = function (/*int*/ offset) {
//	return padding + '"' + this + '"';
//}

var __benchmarkStartTime;

function sb() {
	__benchmarkStartTime = new Date;
}

function eb() {
	var benchMarkEndTime = new Date;
	alert("Benchmark time: " + (benchMarkEndTime.getTime() - __benchmarkStartTime.getTime()) / 1000);
}

var DEBUG = true;
var DEBUG_JS = true;