function add_star_ratings(event, context) {
    if (typeof(context) == "undefined") context = $(document.body);
    else context = $(context);
    
    context.select('ol.star-rating').each(function(el) {
        if (el.hasClassName('star-ratingd'))
            return;

        $w(el.className).each(function(cl) {
            var m = /^id-(\d+)/.exec(cl);
            if (m != null)
                el.entity_id = m[1]
            var m = /^type-(.+)/.exec(cl);
            if (m != null)
                el.entity_type = m[1]
        });

        el.select('a').invoke('obs', 'click', rate_entity);
        
        el.addClassName('star-ratingd');
    });
}
addDOMLoadEvent(add_star_ratings);
Ajax.Responders.register({onComplete: add_star_ratings});

function rate_entity(event) {
    var a = event.element();
    a.blur();
    var p = a.up('ol');
    if (typeof(p) == 'undefined' || typeof(p.entity_id) == 'undefined' || typeof(p.entity_type) == 'undefined')
        return;
    var rating = null;
    $w(a.up('li').className).each(function(cl) {
        var m = /^rating-(\d+)/.exec(cl);
        if (m != null)
            rating = m[1]
    });
    if (rating == null)
        return;

    event.stop();//we're prepared to send our ajax request, so no need to bubble anymore
    set_entity_star_rating(p.entity_type, p.entity_id, rating);
    new Ajax.Request('ajax/rate.php', {
        method: 'post',
        parameters: {action: 'add', _submit_check: 'rate_entity', type: p.entity_type, id: p.entity_id, rating: rating},
        onSuccess: entity_rated
    });
}

function entity_rated(transport) {
    var json = transport.responseJSON.content;

    set_entity_star_rating(json.type, json.id, json.rating, json.average);
}

function set_entity_star_rating(type, id, rating, average) {
    $$('ol.star-rating.type-'+type+'.id-'+id).each(function(el) {
        if (typeof average == 'undefined' && !el.hasClassName('interactive'))
            return;
        var cur_rating = null;
        $w(el.className).each(function(cl) {
            var m = /^rating-((\d+)(-half)?)/.exec(cl);
            if (m != null)
                cur_rating = m[1]
        });

        el.removeClassName('rating-'+cur_rating);
        if (el.hasClassName('interactive'))
            el.addClassName(get_rating_class(rating));
        else
            el.addClassName(get_rating_class(average));
    });
}

function get_rating_class(rating) {
    rating = parseFloat(rating);
    return 'rating-'+Math.floor(rating)+(Math.floor(rating) != Math.round(rating+.25) ? '-half' : '');
}
