$(function() {    
    var rateContainer = $("#ratings");
    var isAdmin = rateContainer.hasClass('adminable');
    
    var bindReviewsAdminUi = function(container) {
        var html = $('<span> | <a href="#">Delete this review</a></span>');
        $(".author", container).append(html);
        $(".author a", container).click(function(e) {
            e.preventDefault();
            var that = $(this);
            
            that.unbind();
            that.addClass('loading');
            
            var review = that.parents('.review');
            var id = $('span.id', review).text();
            
            $.ajax({
                url: '/wp-content/plugins/GAOTD_rate/admin-box.php', 
                type: "POST",
                data: "comment_id=" + id,
                success: function(html) {                
                    review.fadeOut();
                }
            });            
        });
    }
    
    var showReviews = function(parent) {
        
        var that = $("a.o", parent);
        that.addClass('loading');
        var option_id = parseInt($('input[name="option_id"]', parent).val());        
               
        var data = {
            post_name: gaRatePostName,
            option_id: option_id
        };

        $.ajax({
            url: '/wp-content/plugins/GAOTD_rate/get-comments.php', 
            type: "POST",
            data: data,
            success: function(html) {                
                if (option_id) {
                    parent.addClass('active');
                }
                var el = $("div.expanded", parent);
                el.html(html);
                el.slideDown();
                if (isAdmin) {
                    bindReviewsAdminUi(parent);
                }
            },
            complete: function() {
                that.removeClass('loading');
            }
        });
    }     
    
    var increment_counters = function(parent, scores, comment) { 
        var vo_c = $("span.vo", parent);
        var co_c = $("span.co", parent);
     
        var votes = parseInt(vo_c.text());
        vo_c.text(votes+1);
        
        if (comment) {
            var comments = parseInt(co_c.text());
            co_c.text(comments+1);
            if (!comments) {
                // we need to create the <a> el;
                var wrapper = $('<a class="o" href="#"></a>');
                var details = $("div.details", parent);
                details.wrapInner(wrapper);
                $("a.o", details).bind('click', {callback: showReviews}, expandManager);           
            }
        }
        
        var avg = 0;
        var c = $("div.stars div", parent);
        if (c.is(".s1")) avg = 1;
        else if (c.is(".s2")) avg = 2; 
        else if (c.is(".s3")) avg = 3;
        else if (c.is(".s4")) avg = 4;
        else if (c.is(".s5")) avg = 5;
        
        var sum = avg * votes;
        
        newRating = parseInt((sum + scores) / (votes+1));
        //alert('s' + avg + '---' + 's' + newRating);
        c.removeClass('s' + avg).addClass('s' + newRating);
    }
    
    var increment_recomend_counter = function(parent) {        
        var co_c = $("span.co", parent);
        var comments = parseInt(co_c.text());
        co_c.text(comments+1);
        
        if (!comments) {
            // we need to create the <a> el;
            $("span.ns", parent).hide();
            $("a.o", parent).fadeIn();
            $("a.o", parent).bind('click', {callback: showReviews}, expandManager);
        }
    }

    var post_rate = function(e) {
        e.preventDefault();
                
        var parent = $(this).parents('div.opt');                        
        var form = $('form', parent);
        var option_id = parseInt($('input[name="option_id"]', form).val());
        
        var textarea = $('textarea', form);
        var comment = $.trim(textarea.val());
        
        if ((comment || !option_id) && comment.length < 5) {
            textarea.focus();
            return false;
        }
        
        var rating = parseInt($("input[name='rating']:checked", form).val());
        if (!rating && option_id) {
            return false;
        }
        
        textarea.addClass('loading');
        //textarea.attr("readonly", "readonly");
        $("input", form).attr("readonly", "readonly");
        
        var data = {
            post_name: gaRatePostName,
            option_id: option_id,
            comment: comment,
            scores: rating
        };
        
        $(".commentform-opener", parent).fadeOut(function(){
            $(this).remove();
        });
        $.ajax({
            url: '/wp-content/plugins/GAOTD_rate/box.php', 
            type: "POST",
            data: data,
            success: function() {                
                if (option_id) {
                    hideExpanded(parent);
                    $("div.act", parent).fadeOut();
                    increment_counters(parent, rating, comment);
                } else {
                    $("div#recommendation-promt",parent).slideUp();    
                    increment_recomend_counter(parent);
                }                
            }, complete: function() {
                textarea.removeClass('loading');
            }
        });
    }
    
    var openPostRateUi = function(parent) {
       
        var expanded = $("div.expanded", parent);        
        var form = $("#form-container form", rateContainer).clone(true);
        form.show().appendTo(expanded);
            
        var option_id = parseInt($('input[name="option_id"]', parent).val());
        $('input[name="option_id"]', form).val(option_id);
        
        parent.addClass("active");
        expanded.slideDown();        
    }
    
    var hideExpanded = function (parent) {
        if (parent) {
            $("div.expanded", parent).slideUp(function(){
                $(this).children().remove();
                parent.removeClass('active');          
            });
            var opened = $(".__opened__", parent);
            opened.removeClass('__opened__');  
        } else { //close all expanded fast
            var opened = $(".__opened__", rateContainer);          
            if (opened.length) {
                opened.removeClass('__opened__');
                var parents = opened.parents('div.opt');
                var expanded =  $("div.expanded", parents)
                expanded.hide();
                parents.removeClass('active');
                expanded.children().remove();
            }
        }
    }        
    
    var expandManager = function(e) {
        e.preventDefault();        
        var parent = $(this).parents('div.opt');
        
        if ($(this).hasClass('__opened__')) {
            hideExpanded(parent);
        } else {            
            hideExpanded();
            var callback = e.data.callback;
            $(this).addClass('__opened__');
            callback(parent);
        }
    }
    
    $("a.o", rateContainer).bind('click', {callback: showReviews}, expandManager);    
    $("div.label a", rateContainer).bind('click', {callback: openPostRateUi}, expandManager);
    
    $("form.rf", rateContainer).submit(post_rate);
    
    $("#go_login").click(function(){
       
       window.setTimeout(function(){$("#rate_login_form input[name='user_login']").trigger("focus");}, 500);
       return true; 
    });
});
