/*
 * Wildfire Spark
 * Copyright(c) 2003-2010, Wildfire Technology Limited
 * licensing@wildfire-it.com
 *
 * http://www.wildfire-it.com
 */

var SparkCommentsFactory = function(){
	this.store = {};
};

SparkCommentsFactory.prototype = {
	getInstance:function(id, type){
		return this.store[id] || this.createInstance(id, type);
	}
	,createInstance:function(id, type){
		var inst = new SparkComments(id,type);
		this.store[id] = inst;
		return inst;
	}
};
var sparkCommentsFactory = new SparkCommentsFactory();

var SparkComments = function(id, type){
	var t = this;
	t.id = id;
	t.type = type;
};

SparkComments.prototype = {
	baseUri:'/_/ServletEngine/Comment'

	,createForm:function(trigger){
		var t = this;

		if (t.form)
			return;

		t.form = t.renderForm();

		t.trigger = trigger;

		var ct = t.getContainer(trigger);

		ct.appendChild(t.form);

		t.form.scrollIntoView();
	}

	,renderForm:function(comment) {
		var t = this;

		var email, name;

		var form = document.createElement('form');
		form.setAttribute('method','post');
		form.setAttribute('action',t.baseUri);

		form.addField('comments-key', {type:'hidden', value:t.id});
		form.addField('redir',  {type:'hidden', value:document.location});

		if (comment)
			form.addField('reply-to', {type:'hidden', value:comment});

		if (!_sparkusr_){
			name = form.addField('name', {label:'Name'});
			email = form.addField('email', {label:'Email'});
		}

		var value = comment ? 'Reply':'Comment';

		var ta = form.addTextarea('comment',{label:'Comment',value:value, hideLabel:true});

		form.addField(null, {type:'submit', value:value});

		form.onsubmit = function(){
			var uri = t.baseUri + '?comments-key='+t.id + '&comment='+ta.value;

			if (name)
				uri += '&name='+name.value;

			if (email)
				uri += '&email='+email.value;

			if (comment)
				uri += '&reply-to='+comment;

			if (t.type)
				uri += '&type='+t.type;

			MicroAjax(uri, function(response){
				t.updateList(response);

				form.reset();
			});

			return false;
		};

		return form;
	}

	,reply:function(trigger, comment){
		var t = this;

		if (t.replyForm)
			t.replyForm.parentNode.removeChild(t.replyForm);

		t.replyForm= t.renderForm(comment);
		t.trigger = trigger;

		trigger.parentNode.appendChild(t.replyForm);
	}

	,remove:function(trigger, comment){
		var t = this;

		var uri = t.baseUri + '?comments-key='+t.id+'&delete='+comment;

		if (t.type)
			uri += '&type='+t.type;

		t.trigger = trigger;

		MicroAjax(uri, function(response){
			t.updateList(response);
		});
	}

	,removeReply:function(trigger, comment){
		var t = this;

		var uri = t.baseUri + '?comments-key='+t.id+'&delete-reply='+comment;

		if (t.type)
			uri += '&type='+t.type;

		t.trigger = trigger;

		MicroAjax(uri, function(response){
			t.updateList(response);
		});
	}

	,showAll:function(trigger){
		var t=this;

		t.trigger = trigger;

		var uri = t.baseUri + '?comments-key='+t.id;

		if (t.type)
			uri += '&type='+t.type;

		MicroAjax(uri, function(response){
			t.updateList(response);
			trigger.innerHTML = "Show top 5";
			trigger.onmousedown = function(){t.showTop(this);};
		});

	}

	,showTop:function(trigger){
		var t=this;
		var uri = t.baseUri + '?comments-key='+t.id+'&offset=0&rows=5';

		t.trigger = trigger;

		MicroAjax(uri, function(response){
			t.updateList(response);
			trigger.innerHTML = "Show All Comments";
			trigger.onmousedown = function(){t.showAll(this);};
		});
	}

	,like:function(trigger){
		var t = this;

		t.trigger = trigger;
		var uri = '/_/ServletEngine/Opinion?comments-key='+t.id+'&like=true';
		MicroAjax(uri, function(response){
			t.updateOpinion(response);
		});
	}

	,dislike:function(trigger){
		var t = this;
		t.trigger = trigger;
		var uri = '/_/ServletEngine/Opinion?comments-key='+t.id+'&dislike=true';
		MicroAjax(uri, function(response){
			t.updateOpinion(response);
		});
	}

	,updateOpinion:function(response){
		var t = this;
		var ct = t.getContainer(t.trigger);
		var opinion = ct.getElementByClassName('spark-opinion','div');

		var tmp = document.createElement('div');
		tmp.innerHTML = response;

		opinion.parentNode.insertBefore(firstChild(tmp), opinion);
		opinion.parentNode.removeChild(opinion);
	}

	,getContainer:function(el){
		while (el.className != 'spark-comments')
			el = el.parentNode;

		return el;
	}

	,updateList:function(response){
		var t = this;

		var ct = t.getContainer(t.trigger);

		var ul = ct.getElementsByTagName('ul')[0];

		var cursor = ul.nextSibling;

		var parentCt = ul.parentNode;

		parentCt.removeChild(ul);

		var tmp = document.createElement('div');
		tmp.innerHTML = response;

		parentCt.insertBefore(tmp.firstChild, cursor);

		if (t.form){
			t.form.parentNode.removeChild(t.form);
			t.form = null;
		}
	}
};
