/*
*	Comments
*	A reusable JS class for providing AJAX comments submission and loading
*	
*	Requires Trapeze jQuery library (http://www.jquery.com) with 
*   jQuery.Class plug-in (http://www.taylanpince.com/blog/posts/jquery-class-plug-in)
*	
*	Taylan Pince (tpince at trapeze dot com) - March 19, 2009
*/

$.namespace("trapeze.Comments")

trapeze.Comments = $.Class.extend({
    
    form_selector : "",
    list_selector : "",
    counter_selector : null,
    top_selector : null,
    total_comments : 0,
    
    error_template : '<p class="%(type)">%(message)</p>',
    
    render_comment : function(data) {
        $(this.list_selector).find("li:first-child").removeClass("first-child");
        $(this.list_selector).prepend(data);
        $(this.list_selector).find("li:first-child").addClass("first-child");
        
        if (this.top_selector) {
            trapeze.scroll_to(this.top_selector);
        } else {
            trapeze.scroll_to(this.list_selector);
        }
        
        if (this.counter_selector && this.total_comments > 0) {
            $(this.counter_selector).text(this.total_comments);
        }
        
        $(this.form_selector).find("li.stand-by").removeClass("stand-by");
    },
    
    parse_comment_form : function(data) {
        if (data.errors) {
            $(this.form_selector).find("li.stand-by").removeClass("stand-by");
            
	        for (error in data.errors) {
	            if (error == "__all__") {
	                for (e in data.errors[error]) {
        	            $(this.form_selector).prepend(core.render_template(this.error_template, {
        	                "message" : data.errors[error][e],
        	                "type" : "error"
        	            }));
	                }
	            } else {
    	            $("[name=" + error + "]").parent().prepend(trapeze.render_template(this.error_template, {
    	                "message" : data.errors[error],
    	                "type" : "error"
    	            }));
	            }
	        }
	    } else {
	        this.total_comments = data.total;
	        
	        if (data.comment) {
                $.ajax({
                    url : data.comment,
                    type : "GET",
                    processData : false,
                    dataType : "html",
                    success : this.render_comment.bind(this)
                });
	        }
	        
	        $(this.form_selector)[0].reset();
	    }
	    
	    $(this.form_selector).find("input[type=submit], input[type=image]").attr("disabled", false);
    },
    
    submit_comment_form : function() {
        $(this.form_selector).find("p.error").fadeOut("slow");
	    $(this.form_selector).find("input[type=submit], input[type=image]").attr("disabled", true);
        $(this.form_selector).find("li.submit").addClass("stand-by");
	    
        $.ajax({
            url : $(this.form_selector).attr("action"),
            type : "POST",
            processData : false,
            data : $(this.form_selector).serialize(),
            dataType : "json",
            contentType : "application/json",
            success : this.parse_comment_form.bind(this)
        });
        
        if (this.top_selector) {
            trapeze.scroll_to(this.top_selector);
        } else {
            trapeze.scroll_to(this.form_selector);
        }
        
        return false;
    },
    
    init : function(form_selector, list_selector, options) {
        this.form_selector = form_selector;
        this.list_selector = list_selector;
        
        if (options) {
            this.counter_selector = options.counter;
            this.top_selector = options.top;
        }
        
        $(this.form_selector).submit(this.submit_comment_form.bind(this));
    }
    
});
