function Class(){};
Class.prototype.construct = function() { };
Class.extend = function(def) {
	var classDef = function()
	{
		if(!arguments.callee.__lock)
			this.construct.apply(this, arguments);
	};
	var superClass = this.prototype;
	this.__lock = true;
	var proto = new this();
	this.__lock = false;
	for (var n in def){
		var item = def[n];
		if(!(item instanceof Function))
			classDef[n] = item;
		proto[n] = item;
		proto.parent = superClass;
	}
	classDef.prototype = proto;
	classDef.extend = this.extend;
	return classDef;
};

var listeners = [];
var loginUrl;
var formUrl = "/form/";
var currentUser = null;
var messages = {};	
var votes = {};
var authRedirect = document.location.href;
var xmlParser = new XMLParser();
var currentUserId = 0;
var isAdmin = "false";
var isCommentsModerator = false;
var deleteCommentUrl = "/comments/delete";
var screenCommentUrl = "/comments/screen";
var treeCommentUrl = "/comments/tree";

var jq = $.noConflict();

jq(document).ready(init);


function parseDate(ddd){
	var d = ddd.split("T");
	var date = d[0].split("-");
	var time = d[1].split(":");
	d = [date[0], date[1], date[2], time[0], time[1]];
	for(var i = 0; i < d.length; i++)
		if(d[i].charAt(0) == "0")
			d[i] = d[i].substr(1, d[i].length);
	return new Date(d[0], parseInt(d[1]) -1, d[2], d[3], d[4]);
}

function init(){
	Form.forms = Form.init(formUrl);
	try{
	Comments.comments = Comments.init("comments-block", currentUserId, isCommentsModerator, deleteCommentUrl, screenCommentUrl, treeCommentUrl);
	}catch(e){}
	for(var i = 0; i < listeners.length; i++)
		listeners[i]();
}

function onInit(handler){
	listeners.push(handler);
}

function getMessage(m){
	return messages[m];
}

function getBodyScrollTop(){
	return self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
}

function getClientHeight(){
	return document.compatMode=='CSS1Compat' && !window.opera?document.documentElement.clientHeight:document.body.clientHeight;
}

function getClientCenterY(){
	return parseInt(getClientHeight()/2)+getBodyScrollTop();
}

function openPopUp(url,w,h){
	if(jq.browser.msie)
    	window.open(url,'_blank','width='+(w + 18)+',height='+h+',copyhistory=no,directories=no,menubar=no,location=no,resizable=no,scrollbars=yes');
    else
    	window.open(url,'_blank','width='+(w)+',height='+h+',copyhistory=no,directories=no,menubar=no,location=no,resizable=no,scrollbars=yes');
    return false;
}


function openUrl(url, width, height, scroll){
	if(!scroll)
		window.open(url, 'page', 'width=' + width + ',height=' + height + ',copyhistory=no,directories=no,menubar=no,location=no,resizable=no,scrollbars=no');
	else
		window.open(url, 'page', 'width=' + width + ',height=' + height + ',copyhistory=no,directories=no,menubar=no,location=no,resizable=no,scrollbars=yes');
}


jq.fn.offsetTop = function() {
	var e = this.get(0);
	if(!e.offsetParent) return e.offsetTop;
	return e.offsetTop + jq(e.offsetParent).offsetTop();
};

jq.fn.offsetLeft = function() {
	var e = this.get(0);
	if(!e.offsetParent) return e.offsetLeft;
	return e.offsetLeft + jq(e.offsetParent).offsetLeft();
};

function callMethod(name){
	var a = [];
	for(var i = 1; i < arguments.length; i++)
		a.push(arguments[i]);
	if(name instanceof Function)
	{
		name.apply(name.instance, a);
		return;
	}
	var target = window;
	var method = name;
	if(name.indexOf('.') > -1)
	{
		var arr = name.split('.');
		target = window[arr[0]];
		method = arr[1];
	}
	if(target == undefined)
		return null;
	if (target[method] == undefined)
		return null;
		
	return target[method].apply(this, a);
}

var logObject = [];
var logSize = 100;

onInit(function(){
	var p = jq(".trace-panel");
	if(p.length == 0)
		return;
	p.css({backgroundColor:"#000", width:"100%", opacity:0.9, position:"absolute", display:"none", top:"0px", left:"0px"});
	jq(document).keypress(function(e){
		if(e.which == 27){
			if(p.css("display") == "none"){
				p.show();
				p.css("z-index", 1000000);
				p.css("height", jq(document).height());
				p.html("");
				for(var i = 0; i < logObject.length; i++){
					var s = logObject[i];
					s = s.replace("<", "&lt;");
					s = s.replace(">", "&gt;");
					s = s.replace("&", "&amp;");
					p.append("<div style='color:#fff;padding:2px 10px;font-size:12px;'>" + s  + "</div>");
				}
			}else
				p.hide();
		}
	});
});
function trace(){
	var str = "";
	for(var i = 0; i < arguments.length; i++){
		if(i > 0)
			str += ", ";
		str += arguments[i];
	}
	if(logObject.length >= logSize)
		logObject.shift();
	logObject.push(str);
}