gbl.methods.push('Comments');


var EditComment = new Class({
	Implements: Options,
	
	options : {
		
		els : false
		
	},
		
	initialize : function(options){
		this.setOptions(options)
			
			
		if (!this.options.els) return;
		
		this.add_events();
		
	},
	
	add_events : function(){
		
		var t = this;
		
		this.options.els.each(function(el,i){

			t.add_event(el);
			
		});
		
	},

	add_event : function(el){
		var t = this;
		
		el.addEvent('click',function(e){
			
			t.edit_comment(this)

		});
		
		
	},
	
	edit_comment : function(el){
	
		var t = this
	
		els = {}
		props = {}
		
		els.parent = el.getParent('div.content');
		els.comment = el.getParent('div.comment');
		els.comment_text = els.parent.getElement('pre').addClass('hide');
		
		el.addClass('hide');
		els.reply = els.comment.getElement('.reply').addClass('hide');
		els.updated = els.parent.getElement('.updated') ? els.parent.getElement('.updated').addClass('hide') : false
		els.status = els.parent.getElement('.status');
		
		var status = el.get('rel').split(',')
		
		props.current = status[0];
		props.next = status[1];
		props.id = els.parent.get('id').match(/[A-Z0-9a-z\-]*$/)[0];

		els.textarea = new Element('textarea',{ 'name' : 'set_content', 'class' : 'default', 'styles' : { 'margin' : '8px 0 8px' }}).set('text',els.comment_text.get('text')).inject(els.comment_text,'after')
		els.button = new Element('input', { 'class' : 'button', 'type' : 'submit', 'value' : 'Update your comment' }).inject(els.textarea,'after');
		els.cancel = new Element('a',{ 'name' : 'cancel_edit', 'class' : 'cancel_edit' }).set('text','Cancel').inject(els.button,'after');
	
		els.textarea.select();
	
		el.store('els',els);
		el.store('props',props);
	
		els.cancel.addEvent('click',function(e){
		
			if (e) e.stop();
			
			els.textarea.dispose();
			els.button.dispose();
			this.dispose();
			
			el.removeClass('hide');
			els.reply.removeClass('hide');
			
			if (els.updated) els.updated.removeClass('hide');
			
			els.comment_text.set('text',els.textarea.get('value')).removeClass('hide');
		
		});
	
		els.button.addEvent('click',function(e){
			
			if (e) e.stop();
			
			data = {
				'on_module' : 'blog_comment',
				'on_token' : props.id,
				'on_current' : props.current,
				'on_next' : props.next,
				'set_content' : els.textarea.get('value')
			}
			
			t.save_comment(data,el);
			
		});
	},
	
	save_comment : function(data,el){
		
		var t = this
		var els = el.retrieve('els');
		var props = el.retrieve('props');
		
		if (data.set_content == els.comment_text.get('text')) { els.cancel.fireEvent('click'); return; }
		
		function request(){	
		
			els.textarea.set('disabled','disabled');
			els.button.set('disabled','disabled');
			els.cancel.dispose();
			els.processing = new Element('div',{'class':'processing_with_text'}).set('text','Saving your comment... Please wait.').inject(els.button,'after');
		}
				
		function success(response,xml){
			
			var doc = new Element('div').set('html',response);
						
			els.textarea.dispose();
			els.button.dispose();
			els.processing.dispose();
			
			
			
			el.removeClass('hide');
			els.reply.removeClass('hide');
			
			
			if (els.updated) els.updated.dispose();
			
			new Element('em',{ 'class' : 'updated' }).set('text','Updated '+ doc.getElement('input[name=modified]').get('value')).inject(els.status,'top');
						
			els.comment_text.set('text',data.set_content).removeClass('hide');
			
		}
		function failure(){
			
			
		}

		var update_comment = new Request(
		{	url : '/utility/update_comment',
			data : data,
			method : 'post',			
			onRequest : request,
			onSuccess : success,
			onFailure : failure
		}).send();
		
		
	}
	
	
})

var CommentReply = new Class({
	Implements: Options,
	
	options : {
		
		els : false,
		target_form : false
		
	},
		
	initialize : function(options){
		this.setOptions(options)
					
		if (!this.options.els) return;
		
		this.add_events();
		
	},
	
	add_events : function(){
		
		var t = this;
		
		this.options.els.each(function(el,i){

			t.add_event(el);
			
		});
		
	},

	add_event : function(el){
		var t = this;
		
		el.addEvent('click',function(e){
			
			t.duplicate_comment(this);

		});
	},
	
	duplicate_comment : function(el){
		
		var comment = el.getParent('.comment').getElement('pre').clone();
		var user = el.getParent('.comment').getElement('.author').clone();
		var id = el.getParent('.comment').get('id').match(/[A-Z0-9a-z\-]*$/)[0];
		
		window.fireEvent('reply_to_comment',[user,comment,id]);
		
	}
})

var LoggedInReply = new Class({
	Implements: Options,
	
	options : {
		
		comment : false
		
	},
	
	initialize : function(options){
		this.setOptions(options)
				
		if (!this.options.comment) return;
		
		window.addEvent('reply_to_comment',this.place_reply.bind(this));
		
	},
	

	place_reply : function(user,comment,id){
				
		if ($('reply_comment')) $('reply_comment').dispose();
		
		var row = new Element('div',{ 'class':'inline_row', 'id':'reply_comment' }).set('html','<label>Reply to</label><input type="hidden" name="set_parent" value="'+id+'" /><div class="reply"><a name="cancel_reply" class="cancel_reply">Oops! I didn\'t mean to reply to this comment.</a></div>')
		
		row.getElement('a[name=cancel_reply]').addEvent('click',function(){
		
			this.getParent('div#reply_comment').dispose();
		
		});
		
		user.inject(row.getElement('.reply'),'bottom');
		comment.inject(row.getElement('.reply'),'bottom');
		user.set('text',user.get('text') +" wrote,");
		
		row.inject(this.options.comment.getParent('.inline_row'),'before');
					
	}

});
