var SimpleRating = new Class.create({
    initialize: function (element) {
        this.oldRating      = '';
        this.countRatings   = '';
        this.changed        = false;
        this.stars          = $(element);
        this.addObserver();
    },
  
    addObserver: function () {
        if (this.stars.hasClassName('disabled')) {
            return;
        }

        this.oldRating = $w(this.stars.className).join(' ');
        this.stars.observe('mouseout', this.elementMouseOut.bind(this));
        
        var _starElements = this.stars.select('li');
        _starElements.invoke('observe', 'mouseover', this.starElementHovered.bind(this));
        _starElements.invoke('observe', 'click', this.starElementClicked.bind(this));
    },

    starElementHovered: function (event) {
        if (Event.element(event).hasClassName('rating_info')) {
            return;
        }
    
        var stars = Event.element(event).className.split('_').last();
    
        this.stars.writeAttribute({'class' : 'rating rated_' + stars });
        this.countRatings = this.stars.down('li.rating_info').innerHTML;
    
        var infoText = this.getInfoTextByRating(stars);


        this.stars.down('li.rating_info').update(infoText);
    },
    
    getInfoTextByRating: function (rating) {
        rating = rating * 1;
        
        switch (rating) {
            case 0 : return 'Noch keine Bewertung';
            case 1 : return 'Flop';
            case 2 : return 'Geht so';
            case 3 : return 'Ganz nett';
            case 4 : return 'Cool';
            case 5 : return 'Genial';
            default: return '';
        }
    },
    
    elementMouseOut: function (event) {
        var stars = Event.element(event).className.split('_').last();
        
        if (this.changed === false) {
            this.stars.writeAttribute({'class' : this.oldRating });
        } else {
            this.changed = false;
        }
        
        var _ratingInfoElement = this.stars.down('li.rating_info');
        if (_ratingInfoElement) {
            _ratingInfoElement.update(this.countRatings);
        }
    },

    starElementClicked: function (event) {
        var _element = Event.element(event);
        var _elementClass = _element.className;
        
        var parent          = _element.up('.rating');
        var _identifiedParent = parent.identify().split('_');
        
        var rateable_type   = _identifiedParent[0];
        var rateable_token  = _identifiedParent[1];
        var css_class_index = _elementClass.indexOf('rate_');
        var rating_point    = _elementClass.substr(css_class_index + 5);
    
        this.oldRating = $w(this.stars.className).join(' ');
        this.postRating(parent, rating_point, rateable_type, rateable_token);
    },

    postRating: function (parent, rating_point, rateable_type, rateable_token) {
        new Ajax.Request('/ratings', {
            method: 'post',
			parameters: '&points=' + rating_point + '&rateable_type=' + rateable_type + '&rateable_token=' + rateable_token,
			onCreate: function (request, xhr) {
				parent.update('<li class="loading">&nbsp;</li>');
			},
            onComplete: function (result) {
				parent.replace(result.responseText);
            }
        });
    }
});