var StarRating = new Class({
	Implements: [Options],				
	options: {
		'numberOfStars': 5,
		'sprite': '../images/alt_star.png',
		'selectorClass':'.stars',
		'starWidth':25,
		'starHeight':25,
		'onSubmit':function(id,score,total){
		}
	},
	initialize: function(options) {
		this.setOptions(options);
		var op = this.options;
		var c = this;
		op.ulContainer = new Array();
		$$(op.selectorClass).each(function(elm,i){
			elm.setStyle('overflow','hidden');
			if(elm.getProperty('id')!=null){
				c.setup(elm,i);
			}
		});
	},
	setScoreFromJSON: function(json){
		var op = this.options;
		var c = this;
		for(i=0;i<json.scores.length;i++){
			c.setScore(json.scores[i].id,json.scores[i].score);
		}
	},
	setScore:function(ulID,score){
		var op = this.options;
		var c = this;
		if($chk($(ulID))){
			var decimal = score.toString().indexOf(".");
			if(decimal>-1){
				var parts = score.toString().split(".");
				var dec = parts[1].toInt();
				if(dec!=5){
					if(dec<5){
						score += ((5-dec)/10);
					}else{
						score += ((10-dec)/10);
					}
				}
			}
			if(score>op.numberOfStars)score = op.numberOfStars;
			if(score<0)score = 0;
			var newWidth = op.starWidth *score;
			var ulChildren = $(ulID).getChildren('ul');
			var liChildren = ulChildren.getChildren('li.currentScore');
			liChildren[0].setStyle('width',newWidth);
		}
		return score;
	},
	
	getIEVersionNumber: function() {
		var ua = navigator.userAgent;
		var MSIEOffset = ua.indexOf("MSIE ");
		
		if (MSIEOffset == -1) {
			return 0;
		} else {
			return parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";", MSIEOffset)));
		}
	},
	setup:function(elm,id){
		var op = this.options;
		var c = this;
		op.ulContainer[id] = new Element('ul',{'styles':{'padding':0,'margin':0},'events':{
			'mouseout':function(){
				c.chooseStar(0,this);
			}
		}
		}).inject(elm);
		var defaultstars = new Element('li',{'class':'currentScore','styles':{
			'position':'absolute',
			'list-style':'none',
			'background':'url('+op.sprite+') 0px -25px',
			'z-index':2,
			'height':op.starHeight
		}}).inject(op.ulContainer[id]);
		if(c.getIEVersionNumber()>0 && c.getIEVersionNumber()<8){
			defaultstars.setStyle('margin-left',-(op.numberOfStars*op.starWidth).toInt());
		}
		
		for(i=0;i<op.numberOfStars;i++){
			var currentStar = new Element('li',{'styles':{
				'width':op.starWidth,
				'height':op.starHeight,
				'padding':0,
				'margin':0,
				'background-image':'url('+op.sprite+')',
				'float':'left',
				'list-style':'none'
			}}).inject(op.ulContainer[id]);
			new Element('a',{'styles':{'position':'absolute','z-index':4,'display':'block','width':op.starWidth,'height':op.starHeight,'cursor':'pointer'},'events':{
				'mouseenter':function(){
					var ID = 0;
					var ulContainer = this.getParent('ul');
					var liparent = this.getParent('li');
					var liChildren = ulContainer.getChildren('li');
					for(ii=0;ii<liChildren.length;ii++){
						if(liChildren[ii] == liparent){
							ID = ii
						}
					}
					c.chooseStar(ID,ulContainer);
				},
				'click':function(){
					var ID = 0;
					
					var ulContainer = this.getParent('ul');
					var containerParent = ulContainer.getParent();
					var liparent = this.getParent('li');
					var liChildren = ulContainer.getChildren('li');
					for(ii=0;ii<liChildren.length;ii++){
						if(liChildren[ii] == liparent){
							ID = ii
						}
					}
					c.setScore(containerParent.getProperty('id'),ID);
					for(ii=0;ii<liChildren.length;ii++){
						var aLink = liChildren[ii].getChildren('a');
						if(aLink.length>0){
							aLink[0].dispose();
						}
					}
					op.onSubmit(containerParent.getProperty('id'),ID,op.numberOfStars);
				}
			}
			}).inject(currentStar);
		}
	},
	chooseStar: function(score,ulContainer){
		var op = this.options;
		var c = this;
		var liChildren = ulContainer.getChildren('li');
		for(ii=1;ii<liChildren.length;ii++){
			var aLink = liChildren[ii].getChildren('a');
			if(aLink.length>0){
				if(ii<=score){
					aLink[0].setStyles({'background':'url('+op.sprite+') left bottom'});
				}else{
					aLink[0].setStyles({'background':'none'});
				}
			}
		}
	}
});
