( function( $ ) {
  $.fn.rater = function( rate_this_path, get_current_rating_path ) {
    var wrapper = $(this);
    var current = null;
    var options = $.extend( $.fn.rater.defaults, { path: rate_this_path } );
    var rater = $('<div class="' + options.containerClass + '"><ul></ul></div>');
    var list = rater.find( 'ul' );

    function highlightCurrent() {
      list.find( 'li[title=' + current + ']' )
        .addClass( 'on' ).prevAll().addClass( 'on' );
    }

    function init() {
      for( var i = options.min; i <= options.max; i++ ) {
        list.append( '<li title="' + i +
                     '" class="' + options.itemClass +
                     '"></li>' );
      }

      rater.insertAfter( wrapper );

      list.find( 'li' )
        .click( function() {
          current = $(this).attr( 'title' );
          highlightCurrent();
          $.ajax( {
            type: "POST",
            url:  options.path + '/' + current,
            success: function( response ){
              list.find( 'li' )
                .unbind( 'click' )
                .unbind( 'mouseover' )
                .unbind( 'mouseout' )
                .css( { cursor: 'default' } );
            }
          } );
        } )
        .hover(
          function() {
            $(this).siblings().removeClass( 'on' );
            $(this).addClass( 'on' ).prevAll().addClass( 'on' );
          },
          function() {
            $(this).removeClass( 'on' ).prevAll().removeClass( 'on' );
            highlightCurrent();
          }
        );
    }

    init();
    $.ajax( {
      type: "GET",
      url:  get_current_rating_path,
      success: function( result ) {
        current = Math.round( parseFloat( result ) );
        highlightCurrent();
      }
    } );

    return rater;
  };

  $.fn.rater.defaults = {
    containerClass: 'rater',
    itemClass:      'rating',
    min: 1, max: 5
  };
} )( jQuery );
