var Vote =
{   
    init: function()
    {
        this.observe();
    },

    observe: function(parent_el)
    {
        var elements;
        var selector = 'a.vote_arrow';
        if (typeof(parent_el) == 'undefined')
            elements = $$(selector);
        else
            elements = parent_el.select(selector);
            
        elements.invoke('observe', 'click', this.submit.bind(this));
    },
        
    submit: function(e)
    {
        var a = Event.element(e);

        if (a.href.match(/#nogo$/))
        {
            alert('You must be logged in to vote on this post.');
        }
        else
        {
            new Ajax.Request(a.href, 
            {
                method: 'get',
                onSuccess: function(t) 
                {
                    var response = t.responseJSON;
    
                    if ('success' === response.status)
                    {   
                        var vote_wrap = a.up('div.vote_wrap');
    
                        var vote_sum_div = vote_wrap.down('div.vote_sum');
                        var old_span = vote_sum_div.down('span');
                        Effect.Fade(old_span, { duration: 0.3 });
                        setTimeout(function()
                        {
                            old_span.remove();
                            var new_span = new Element('span').hide().update(response.vote_sum);
                            vote_sum_div.update(new_span);
                            Effect.Appear(new_span, { duration: 0.3 });
                        }, 300);
                        
                        
                        var vote_arrow_up = vote_wrap.down('a.vote_arrow.up');
                        var vote_arrow_down = vote_wrap.down('a.vote_arrow.down');
        
                        switch (response.vote)
                        {
                            case -1:
                                vote_arrow_up.removeClassName('on').removeClassName('up_on');
                                vote_arrow_down.addClassName('on').addClassName('down_on');
                                break;
                                
                            case null:
                                vote_arrow_up.removeClassName('on').removeClassName('up_on');
                                vote_arrow_down.removeClassName('on').removeClassName('down_on');
                                break;
    
                            case 1:
                                vote_arrow_up.addClassName('on').addClassName('up_on');
                                vote_arrow_down.removeClassName('on').removeClassName('down_on');
                                break;
                        }                       
                    }
                    else
                    {
                        alert(response.message);
                    }
                }
            });
        }

        Event.stop(e);
    }    
};