/**
 * RabidRatings - Simple and Pretty Ratings for Everyone
 * JavaScript functionality requires MooTools version 1.2 <http://www.mootools.net>.
 * 
 * Full package available at <http://widgets.rabidlabs.net/ratings>.
 *
 * NOTE: The included JavaScript WILL ONLY WORK WITH MOOTOOLS.  It will not work if any other JavaScript
 * framework is present on the page.
 *
 * Current MooTools version: 1.2
 *
 * @author Michelle Steigerwalt <http://www.msteigerwalt.com>
 * @copyright 2007, 2008 Michelle Steigerwalt
 * @license LGPL 2.1 <http://creativecommons.org/licenses/LGPL/2.1/>
 */

var RabidRatings = new Class({

    Implements: Options,
	
    options: {
        url: null,
        leftMargin: 5,  /* The width in pixels of the margin before the stars. */
        starWidth: 17,  /* The width in pixels of each star. */
        starMargin: 1,  /* The width in pixels between each star. */
        scale: 5,       /* It's a five-star scale. */
        snap: 1,       /* Will snap to the nearest star (can be made a decimal, too). */
        target: null   /* hidden laukas i kuri reikia yrasyti balsavimo rezultata */
    },
	
    initialize: function(options) {
        this.setOptions(options);
        var activeColor = this.options.activeColor;
        var votedColor  = this.options.votedColor;
        var fillColor   = this.options.fillColor;

        $$('.rabidRating').each(function(el) {

            //Does this if the browser is NOT IE6. IE6 users don't deserve fancy ratings. >:(
            if (!Browser.Engine.trident4) {
                el.id = el.getAttribute('id');
                el.wrapper = el.getElement('.wrapper');
                el.textEl = el.getElement('.ratingText');
                el.offset = el.getPosition().x;
                el.fill = el.getElement('.ratingFill');
                el.starPercent = this.getStarPercent(el.id);
                el.ratableId   = this.getRatableId(el.id);
                this.fillVote(el.starPercent, el);
                el.currentFill = this.getFillPercent(el.starPercent);
                el.morphFx = new Fx.Morph(el.fill, {
                    'link': 'chain'
                });
                //el.widthFx = new Fx.Tween(el.fill, 'width', {'link': 'chain'});
                el.widthFx = new Fx.Tween(el.fill, {
                    'property': 'width',
                    'link': 'chain'
                });
           
                el.mouseCrap = function(e) {
                    var fill = e.client.x - el.getPosition().x;
                    var fillPercent = this.getVotePercent(fill);
                    var step = (100 / this.options.scale) * this.options.snap;
                    var nextStep = Math.floor(fillPercent / step) + 1;
                    this.fillVote(nextStep * step, el);
								
                    var rate = Math.ceil((nextStep * step) / 20);
                    this.setRate(rate);
                }.bind(this);

                el.wrapper.addEvent('mouseenter', function(e) {
                    el.morphFx.start('.rabidRating .ratingActive');
                    el.wrapper.addEvent('mousemove', el.mouseCrap);
                });

                el.wrapper.addEvent('mouseleave', function(e) {
                    el.removeEvent(el.mouseCrap);
                    el.morphFx.start('.rabidRating .ratingFill');
                    el.widthFx.start(el.currentFill);
				
                    rate = (parseInt($('comments_rating').value) / 20);
		
                    var text = "Neįvertinta";
                    switch(rate) {
                        case 1:
                            text = "Prastai";
                            break;
                        case 2:
                            text = "Patenkinamai";
                            break;
                        case 3:
                            text = "Vidutiniškai";
                            break;
                        case 4:
                            text = "Gerai";
                            break;
                        case 5:
                            text = "Puikiai";
                            break;
                        default:
                            break;
                    }
                    $('rating-text').innerHTML = text;
                });

                el.wrapper.addEvent('click', function(e) {
                    el.currentFill = el.newFill;
                    el.morphFx.start('.rabidRating .ratingVoted');
                    //el.wrapper.removeEvents();   // nereikia panaikinti eventu
                    el.addClass('ratingVoted');
                    var votePercent = this.getVotePercent(el.newFill);
        
                    // iraso reiksme i target lauka (jei toks uzsetintas)
                    if(this.options.target != null) {
                        $(this.options.target).value = votePercent;
                    }
				
                }.bind(this));

                el.updateText = function(text) {
                    error = text.split('ERROR:')[1];
                    el.textEl.removeClass('loading');
                    if (error) {
                        el.showError(error); return false;
                    }
                    el.textEl.set('text', text);
                };

                el.showError = function(error) {
                    el.textEl.addClass('ratingError');
                    oldTxt = el.textEl.get('text');
                    el.textEl.set('text', error);
                    (function() {
                        el.textEl.set('text', oldTxt);
                        el.textEl.removeClass('ratingError');
                    }).delay(1000);
                };
            } else {
                //Replaces all the fancy with a text description of the votes for IE6.
                //If you want IE6 users to have something fancier to look at, add it here.
                var list = $$('.ratingText')[0].getElements('input');

                for(var i = 0; i < list.length; i++) {
                    list[i].addEvent('mouseover', this.onIEOver.bind(this, i));
                    list[i].addEvent('mouseout', this.onIEOut.bind(this, i));
                    list[i].addEvent('click', this.onIEClick.bind(this, i));
                }

                var plain = el.getElement('.ratingText');
                if(plain) {
                    plain.inject(el, 'before');
                }

                if(el.className != "text") {
                    //el.remove();
                    el.setStyle('display', 'none');
                }
            }
        }.bind(this));
    },

    fillVote: function(percent, el) {
        el.newFill = this.getFillPercent(percent);
        if (this.getVotePercent(el.newFill) > 100) {
            el.newFill = this.getFillPercent(100);
        }
        el.fill.setStyle('width', el.newFill);
    },

    getStarPercent: function(id) {
        /* Format = anyStringHere-<id>-<float(currentStars)>_(scale);
		 * Example: rabidRatings-5-3_5 //Primary key id = 5, 3/5 stars. */
        var stars = id.match(/(\d*)-(\d*\.?\d+)_(\d*\.?\d+)$/);
        var ratableId = stars[1].toFloat();
        var score = stars[2].toFloat();
        var scale = stars[3].toFloat();
        var percent =  (score / scale) * 100;
        return percent;
    },

    getFillPercent: function (starPercent) {
        return (starPercent/100)*((this.options.starWidth+this.options.starMargin)*this.options.scale) + this.options.leftMargin;
    },
  
    getVotePercent: function(divPosition) {
        var starsWidth = (this.options.starWidth+this.options.starMargin)*this.options.scale;
        var offset = this.options.leftMargin;
        var starPosition = divPosition - this.options.leftMargin;
        var percent = (starPosition / starsWidth * 100).round(2);
        return percent;
    },

    getRatableId: function(id) {
        var stars = id.match(/(\d*)-(\d*\.?\d+)_(\d*\.?\d+)$/);
        return stars[1];
    },
	
    onIEOver: function(index) {
        var list = $$('.ratingText')[0].getElements('input');
        for(var i = 0; i < list.length; i++) {
            if(i <= index) {
                list[i].src = "images/active_rate.gif";
            } else {
                list[i].src = "images/rate.gif";
            }
        }
        this.setRate(index + 1);
    },
	
    onIEOut: function(index) {
        var list = $$('.ratingText')[0].getElements('input');
        var value = $(this.options.target).value;
        for(var i = 0; i < list.length; i++) {
            if(parseInt(list[i].value) <= parseInt(value)) {
                list[i].src = "images/active_rate.gif";
            } else {
                list[i].src = "images/rate.gif";
            }
        }

        this.setRate(value / 20);
    },
	
    onIEClick: function(index) {
        var list = $$('.ratingText')[0].getElements('input');
        this.onIEOver(index);
        var value = list[index].value;
        $(this.options.target).value = value;
        this.setRate(index + 1);

        return false;
    },
	
    setRate: function(rate) {
        rate = parseInt(rate);
		
        var text = "Neįvertinta";
        switch(rate) {
            case 1:
                text = "Prastai";
                break;
            case 2:
                text = "Patenkinamai";
                break;
            case 3:
                text = "Vidutiniškai";
                break;
            case 4:
                text = "Gerai";
                break;
            case 5:
                text = "Puikiai";
                break;
            default:
                break;
        }
        $('rating-text').innerHTML = text;
		
        return false;
    }
});
