Element.extend({
	originalImage: null,
	rateImageElement: null,
	rateValue: null
});

var CVoting = new Class({
	ListId: null,
	RateGroup: null,
	HandlerName: null,
	
	ListElement: null,
	
	options: {
		onVote: Class.empty
	},	
	
	initialize: function( ListId, RateGroup, HandlerName, options )
	{
		this.ListId = ListId;
		this.RateGroup = RateGroup,
		this.HandlerName = HandlerName;

		this.setOptions(options);
		this.ListElement = $(ListId);

		var Counter = 1;
		this.ListElement.getChildren().each(function(element){
			element.addEvent('mouseenter', this.OnStarOver.bind(this, element));
			element.addEvent('mouseleave', this.OnStarOut.bind(this, element));
			element.addEvent('click', this.OnStarClick.bind(this, element));
			element.rateImageElement = element.getFirst();
			element.originalImage = element.rateImageElement.getProperty('src');
			element.rateValue = Counter;
			Counter++;
		}, this);
	},
	
	OnStarOver: function(StarElement)
	{
		var CurrentElement = this.ListElement.getFirst();
		while (true)
		{
			CurrentElement.rateImageElement.setProperty('src', AppRootUrl + '/resources/images/app_star_hover.gif');
			if ( CurrentElement == StarElement )
				break;
				
			CurrentElement = CurrentElement.getNext();
		}
	},
	
	OnStarOut: function(StarElement)
	{
		this.ListElement.getChildren().each(function(element){
			element.rateImageElement.setProperty('src', element.originalImage);
		});
	},
	
	OnStarClick: function(StarElement)
	{
		$(document.body).ProgressOn();
		
		var PostBody = "RateGroup=" + encodeURIComponent(this.RateGroup);
		PostBody += "&Value=" + StarElement.rateValue;
		
		new Phpr_Request({
			handler:'ev{'+this.HandlerName+'}',
			remote: 1,
			update: 'multi',
			postBody: PostBody,
			postBodyOnly: true,
			onFailure: this.requestFailure,
			onSuccess: function() {
				this.fireEvent('onVote');
				$(document.body).ProgressOff();
			}.bind(this),
			onComplete: function()
			{
				$(document.body).ProgressOff();
			}
		});

		return false;
	},
	
	requestFailure: function()
	{
		alert(this.response.text.removeScripts());
	}	
});

CVoting.implement(new Events, new Options);