(function( $ ){
      $.fn.rating = function( options  ) {
        return this.each( function(){
            if( $(this).hasClass('ratingAllreadyVoted') ){
                return ;
            }

            var container = $(this);
            var elements = $('LI' , this);
            var docID = $(this).attr('docID');

            var mouseover = function(event){
                var currentElement = this;
                elements.addClass('disabled');
                $(currentElement).prevAll().removeClass('disabled').addClass('overed');
                $(currentElement).removeClass('disabled').addClass('overed');
            };
            
            var mouseout = function(event){
                elements.removeClass('disabled');
                elements.removeClass('overed'); 
            };
            
            var click = function(event){
                var currentElement = this;
                var url = '';
                
                if( document.getElementsByTagName("base")[0].href )
                    url = document.getElementsByTagName("base")[0].href ;
                else 
                    url = location.host + '/';
                    
                url = url + 'rating';
                
                // rating => a mark which puted user
                var rating = $( currentElement ).prevAll().length + 1;
                jQuery.getJSON( url + '/?rating='+rating+'&__DocID=' + docID 
                    , {}
                    , function(data){
                        if( data.result == 1 ){
                            var totalVotesEl = $('#cafeRatingTotalVotes-'+docID);
                            totalVotesEl.text( totalVotesEl.text() * 1 + 1);
                            
                            elements.removeClass('selected');
                            elements.removeClass('halfselected');
                            elements.slice( 0, data.rating ).addClass('selected');
                            if ( Math.floor( data.rating ) < data.rating ) 
                                elements.eq( Math.ceil( data.rating ) - 1 ).addClass('halfselected');
                        }
                        container.children('LI').unbind('click');
                        container.children('LI').unbind('mouseover');
                        container.mouseout();
                        container.unbind('mouseout');
                        container.addClass('ratingAllreadyVoted');
                    } 
                );
            };
            
            var settings = {
                'starWidth'  : 20 ,
                'starHeight' : 19
            };

            // If options exist, lets merge them
            // with our default settings
            if ( options ) { 
                $.extend( settings, options );
            }
            
            container.children('LI').bind('click' , click);
            container.children('LI').bind('mouseover' , mouseover);
            container.bind('mouseout' , mouseout);
            
        });
      };
    })( jQuery );
    
    jQuery(document).ready( function(){ jQuery('UL.ratingStars').rating(); } );
