var meForum = function(folders_cont,topic_cont,reqUrl){
	
	var _inst = this;
	

	this.init = function(){
		initFolderScripts();
		initTopicScripts();
	}
	
	var hasClass = function(element,className){
	   var pattern = new RegExp('(^|\\s)' + className + '(\\s|$)'); //use this regexp
	   return pattern.test(element.className); //to check for the class
	}
		
	var getParams = function(str){
		return str.substr(str.indexOf('?'));
	}
	
	var folderOrsc = function(resp){
		folders_cont.innerHTML = resp.responseText;
		initFolderScripts();		
	}
		
	var topicOrsc = function(resp){
		topic_cont.innerHTML = resp.responseText;
		initTopicScripts();		
	}
	
	var postOrsc = function(req){
		var resp = req.responseText;
		if(resp.indexOf('<form')!= -1){
			_replycont.innerHTML = resp;
			initReplyForm(_replycont);
		}else{
			topic_cont.innerHTML = resp;
			initTopicScripts();
		}
	}
	
	var deleteOrsc = function(req){
		var resp = req.responseText;
		if(resp.indexOf('<form')!= -1){
			_deletecont.innerHTML = resp;
			initDeleteForm(_deletecont);
		}else{
			topic_cont.innerHTML = resp;
			initTopicScripts();
		}
	}
	
	
	var editOrsc = function(req){
		var resp = req.responseText;
		if(resp.indexOf('<form')!= -1){
			_editcont.innerHTML = resp;
			initEditForm(_editcont);
		}else{
			topic_cont.innerHTML = resp;
			initTopicScripts();
		}
	}
	
	var initTopicScripts = function(){
		var links = topic_cont.getElementsByTagName('a');
		var l = links.length;
		for(var i = 0;i<l;i++){
			if(hasClass(links.item(i),'updateContents')){
				links.item(i).onclick = updateContentsLink;
			}else if(hasClass(links.item(i),'replyLink')){	
				links.item(i).onclick = replyLink;
			}else if(hasClass(links.item(i),'editLink')){
				links.item(i).onclick = editLink;
			}else if(hasClass(links.item(i),'deleteLink')){
				links.item(i).onclick = deleteLink;
			}
		}
	}
	
	var initFolderScripts = function(){
		var links = folders_cont.getElementsByTagName('a');
		var l = links.length;
		for(var i = 0;i<l;i++){
			if(hasClass(links.item(i),'updateFolders')){
				links.item(i).onclick = updateFoldersLink;
			}else if(hasClass(links.item(i),'updateContents')){
				links.item(i).onclick = updateContentsLink;
			}
		}
	}
	
	var updateFoldersLink = function(){
		var reqParams = getParams(this.href);
		asyncRequest('GET',reqUrl+reqParams+"&action=folders",folderOrsc,null);
		return false;
	}
	
	var updateContentsLink = function(){
		var reqParams = getParams(this.href);
		asyncRequest('GET',reqUrl+reqParams,topicOrsc,null);
		return false;
	}
	
	var parseParams = function(str){
		var ret = {};
		var params = str.split('&');
		for(var i = 0;i<params.length;i++){
			var param = params[i].split('=');
			ret[param[0]] = param[1];
		}
		return ret;
	}
	
	var _replycont = null;
	
	var replyLink = function(){
		var ul = this.parentNode.parentNode;
		var reqParams = getParams(this.href);
		var pp = parseParams(reqParams.substr(1));
		var reply_cont = document.getElementById('reply_cont'+pp.pid);
		if(reply_cont){
			ul.removeChild(reply_cont);
			return false;
		}else{
			reply_cont = document.createElement('div');
			reply_cont.className = 'replyCont';
			reply_cont.setAttribute('id','reply_cont'+pp.pid);
			ul.appendChild(reply_cont);
			_replycont = reply_cont;
			asyncRequest('GET',reqUrl+reqParams,replyInitOrsc,null);
			return false;
		}
		return false;
	}
	
	var _deletecont = null;
	
	var deleteLink = function(){
		var ul = this.parentNode.parentNode;
		var reqParams = getParams(this.href);
		var pp = parseParams(reqParams.substr(1));
		var delete_cont = document.getElementById('delete_cont'+pp.pid);
		if(delete_cont){
			ul.removeChild(delete_cont);
			return false;
		}else{
			delete_cont = document.createElement('div');
			delete_cont.className = 'deleteCont';
			delete_cont.setAttribute('id','delete_cont'+pp.pid);
			ul.appendChild(delete_cont);
			_deletecont = delete_cont;
			asyncRequest('GET',reqUrl+reqParams,deleteInitOrsc,null);
			return false;
		}
		return false;
	}
	
	var _editcont = null;
	
	var editLink = function(){
		var ul = this.parentNode.parentNode;
		var reqParams = getParams(this.href);
		var pp = parseParams(reqParams.substr(1));
		var edit_cont = document.getElementById('edit_cont'+pp.pid);
		var lis = ul.getElementsByTagName('div');
		var spans = ul.getElementsByTagName('span');
		var tc = null;
		var insbef = null;
		for(var i = 0;i<lis.length;i++){
			if(hasClass(lis.item(i),'postText')){
				tc = lis.item(i);
			}
			if(hasClass(lis.item(i),'actions')){
				insbef = lis.item(i);
			}
		}
		for(var i = 0;i<spans.length;i++){
			if(hasClass(spans.item(i),'postText')){
				tc = spans.item(i);
			}
			if(hasClass(spans.item(i),'actions')){
				insbef = spans.item(i);
			}
		}		
		if(edit_cont){
			ul.removeChild(edit_cont);
			tc.style.display = tc.name;
			return false;
		}else{
			tc.name = tc.style.display;
			tc.style.display = 'none';
			edit_cont = document.createElement('div');
			edit_cont.className = 'editCont';
			edit_cont.setAttribute('id','edit_cont'+pp.pid);
			ul.insertBefore(edit_cont,insbef);
			_editcont = edit_cont;
			asyncRequest('GET',reqUrl+reqParams,editInitOrsc,null);
			return false;
		}
	}
	
	var replyInitOrsc = function(resp){
		_replycont.innerHTML = resp.responseText;
		initReplyForm(_replycont);
	}
	
	var deleteInitOrsc = function(resp){
		_deletecont.innerHTML = resp.responseText;
		initDeleteForm(_deletecont);
	}
	
	
	var editInitOrsc = function(resp){
		_editcont.innerHTML = resp.responseText;
		initEditForm(_editcont);
	}
	
	var initReplyForm = function(rc){
		var form = rc.getElementsByTagName('form')[0];
		form.onsubmit = function(){
			reqParams = getParams(form.action);
			var preqstr = '';
			var and = '';
			for(var i = 0; i<form.elements.length;i++){
				preqstr+= and+form.elements[i].name+'='+encodeURIComponent(form.elements[i].value);				
				and = '&';
			}
			_replycont = rc;
			asyncRequest('POST',reqUrl+reqParams,postOrsc,preqstr);
			return false;
		}
	}
	
	var initDeleteForm = function(rc){
		var form = rc.getElementsByTagName('form')[0];
		form.onsubmit = function(){
			reqParams = getParams(form.action);
			var preqstr = '';
			var and = '';
			for(var i = 0; i<form.elements.length;i++){
				if(form.elements[i].name == 'confirm'){
					if(form.elements[i].checked == false)
						return false;
				}
				preqstr+= and+form.elements[i].name+'='+encodeURIComponent(form.elements[i].value);				
				and = '&';
			}
			_deletecont = rc;
			asyncRequest('POST',reqUrl+reqParams,deleteOrsc,preqstr);
			return false;
		}
	}
	
	var initEditForm = function(ec){
		var form = ec.getElementsByTagName('form')[0];
		form.onsubmit = function(){
			reqParams = getParams(form.action);
			var preqstr = '';
			var and = '';
			for(var i = 0; i<form.elements.length;i++){
				preqstr+= and+form.elements[i].name+'='+encodeURIComponent(form.elements[i].value);				
				and = '&';
			}
			_editcont = ec;
			asyncRequest('POST',reqUrl+reqParams,editOrsc,preqstr);
			return false;
		}
	}
	
}
