	var slalomRate = new Class({
		Implements: [Options,Events],
		options: {
			value: false,
			min: 1,
			max: 5,
			scale: false,
			clear: false,
			img_on: false,
			img_off: false,
			img_clear: false,
			button_class: 'slalomRateButton',
			highlight: false
		},
		initialize: function(elements,options){
			this.setOptions(options);
			this.elements = elements;
			if($type(this.elements) != 'array') this.elements = new Array(this.elements);

			this.scale = new Array();
                        this.images = $H();
			if(this.options.scale){
                                $A(this.options.scale).each(function(item,i){
                                    this.scale.push(item.value);
			            this.images.include(i,item);
                                },this);
			} else {
				for(i=this.options.min;i<=this.options.max;i++){
					this.scale.push(i);
					this.images.include(i,{
						'on': this.options.img_on,
						'off': this.options.img_off,
						'hover': this.options.img_hover || false,
						'title': false
					});
				}
			}
			
			this.elements.each(this.apply.bind(this));
			
		},
		apply: function(element){
			element.setStyle('display','none');
			element.ratingContainer = new Element('div',{'styles':{'display':'inline-block'}}).inject(element,'before').addEvent('mouseleave',this.blur.pass(element,this));
			element.ratingImages = [];
			
			if(!this.options.scale && this.options.clear){
				new Element('img',{
					'class':this.options.button_class,
					'src':this.options.img_clear,
					'title':this.options.clear_title,
					'styles': {'padding-right':5}
				}).inject(element.ratingContainer).addEvents({
					'mouseenter': this.blur.pass(element,this),
					'click': this.setValue.pass([element,'',true],this)
				});
			}
			
			this.scale.each(function(value,i){
				element.ratingImages[i] = new Element('img',{
					'src':this.images[i].off,
					'title':this.images[i].title || false,
					'class':this.options.button_class
				}).inject(element.ratingContainer).addEvents({
					'mouseenter': this.setValue.pass([element,value],this),
					'mouseleave': this.blur.pass(element,this),
					'click': this.setValue.pass([element,value,true],this)
				});				
			},this);
			
			if(element.value){
				this.setValue(element,element.value);
			} else if(this.options.value){
				this.setValue(element,this.options.value,true);
			}
		},
		setValue: function(element,value,apply,blur){
			this.scale.each(function(v,i){
				var on, img;
				on = this.options.scale ? (v == value) : (v <= value && value !== '');
				if(v == element.value){
					img = 'on';
				} else if(this.images[i].hover && !apply){
					//img = (v == value) ? (blur && value == element.value ? 'on' : 'hover') : 'off';
					img = on ? 'hover' : 'off';
				} else {
					img = on ? 'on' : 'off';
				}
				element.ratingImages[i].setProperty('src',this.images[i][img]);
			},this);
			if(apply){
				element.value = value;
				if(this.options.highlight)
					element.ratingContainer.highlight(this.options.highlight);
				this.blur(element);
			}
		},
		blur: function(element){
			this.setValue(element,element.value,false,true);
		}
	});