/**
 * @author Nikola Ivanovic i Emil S. Dizajner Yea :P
 * @copyright 2009
 */

var Rating = Class.create({
    initialize: function(container, message, options){
    	try {
    		Rating.instances.push(this);
	        this.value = false;
	        this.links = [];
	        this.container = $(container);
			this.container_id = container;
			this.message = $(message);
			this.message_id = message;
	        this.container.update('');
	        this.options = {
	            min: 1,
	            max: 5,
	            rated: false,
	            capture: true,
	            multiple: false,
	            classNames: {
	                off: 'rating_off',
	                half: 'rating_half',
	                on: 'rating_on',
	                selected: 'rating_selected',
	                selected_half: 'rating_selected_half'
	            },
				messages: {
	                rating1: 'Uopšte mi se ne sviđa',
	                rating2: 'Ne sviđa mi se',
	                rating3: 'Nije loš',
	                rating4: 'Sviđa mi se',
	                rating5: 'Veoma mi se sviđa'
	            },
	            updateUrl: false,
	            updateParameterName: 'value',
	            updateOptions : {},
	            afterChange: Prototype.emptyFunction
	        };
	        Object.extend(this.options, options || {});

	        this.container.observe('click', function(s) {
	            s.stop();
	            return false;
	        }.bind(this));
	        
	    // SET RATED VALUE
	        if(this.options.value){
	            this.value = this.options.value;
	            delete this.options.value;
	        }
	        
	    // CREATE ARRAY OF RATING  ELEMENTS
	        var range = $R(this.options.min, this.options.max);
	        range.each(function(i){
	        // PUT ALL ELEMENTS IN CONTAINER
	            var link = this.buildLink(i);
	            this.container.appendChild(link);
	            this.links.push(link);
	        }.bind(this));
					
	    // SET CURRENT VALUE
	        this.setValue(this.value || this.options.min - 1, false, true);
    	} catch (e) {alert(e);}
    },

    buildLink: function(rating){
        var link = $(document.createElement('a'));
        link.value = rating;

        if(!this.options.rated){
        // IF NOT RATED ALLOW TO RATE
            link.href = '';
            link.onmouseover = this.mouseOver.bind(this, link);
            link.onmouseout = this.mouseOut.bind(this, link);
            link.onclick = this.click.bindAsEventListener(this, link);
        }else{
        // IF RATED DISABLE TO RATE AND ANIMATE CONTROL
            link.style.cursor = 'default';
            link.observe('click', function(event){
                Event.stop(event);
                return false;
            }.bindAsEventListener(this));
        }
        link.addClassName(this.options.classNames.off);
        
        return link;
    },

    disable: function(){
        //alert("disable");
        this.links.each(function(link){
            link.onmouseover = Prototype.emptyFunction;
            link.onmouseout = Prototype.emptyFunction;
            link.onclick = Prototype.emptyFunction;
            link.observe('click',function(event){
                Event.stop(event);
                return false;
            }.bindAsEventListener(this));
            link.style.cursor = 'default';
        }.bind(this));
    },

    setValue: function(value, force_selected, prevent_callbacks){
        this.value = value;
		
        this.render(value, force_selected, false);
		
        if(!prevent_callbacks) {
            if(this.options.updateUrl){
                var params = {};
                params[this.options.updateParameterName] = this.value;
                new Ajax.Request(
                    this.options.updateUrl,
                    {
                        parameters : Object.extend(this.options.updateOptions, params),
                        onComplete: function(request) {
                            var json;
                            eval('json = ' + request.responseText);
							alert(this.container_id);
                        }
                    }
                );
            }
            //this.notify('afterChange', this.value);
            if (this.options['afterChange'] != Prototype.emptyFunction) {
                this.options['afterChange'](this.value);
            }
        }
        /*
        alert(json.percent);
        if (json.percent && !prevent_callbacks) {
            this.options.rated = true;
            this.setValue(json.percent, true, true);
        }
        */
    },
	
// DISPLAY RATED START
    render: function(rating, force_selected, display_messages){
		/*
		if (display_messages) {
			this.message.innerHTML = this.options.messages['rating' + rating];
		} else this.message.innerHTML = rating;
		*/
        this.links.each(function(link){
        // DISPLAY START TO THE CURRENT RATING
            if(link.value <= Math.ceil(rating)) {
                link.className = this.options.classNames[link.value <= rating ? 'on' : 'half'];
                if(this.options.rated || force_selected) {
                    link.addClassName(this.options.classNames[link.value <= rating ? 'selected' : 'selected_half']);}
            }else {
                link.className = this.options.classNames.off; }
        }.bind(this));
    },

    mouseOver: function(link){
        this.render(link.value, true, true);
    },
    mouseOut: function(link){
        this.render(this.value, false, false);
    },
    click: function(event, link){
        this.options.rated = true;
        this.setValue((link.value ? link.value : link), true);
        this.disable();
        if(!this.options.capture){
            Event.stop(event);
            return false;
        }
        return false;
    }
});
Object.extend(Rating,{
    instances: [],
    findByElementId: function(id){
        return Rating.instances.find(function(instance){
            return (instance.container.id && instance.container.id == id);
        });
    }
});
