RatingBlock = Class.create(BasicControl, {
	initialize: function($super, config) {
		Object.extend(this, {
			config: {
				rates: null,
				images: null
			},

			instances: [],
			resources: {}
		});

		$super('rating_block', config);
	},

	init: function(instance, resource, module, mode, rate) {
		this.instances[instance] = {
			resource: resource, module: module, mode: mode, rate: rate
		};

		if (resource)
		{
			(this.resources[resource] || (this.resources[resource] = [])).push(instance);
		}
	},

	getSelectedRating: function(image) {
		var matches;

		if (image.id && (matches = image.id.match(/^\w+_\d+_(\d+)$/)))
		{
			return matches[1];
		}
	},

	redraw: function(instance, image) {
		var selected = image ? this.getSelectedRating(image) : false, rate, img;

		for (var i = 0; i < this.config.rates.length; i++)
		{
			rate = this.config.rates[i].rate;

			if (img = $('rtb_' + instance + '_' + rate))
			{
				if (rate <= selected)
				{
					img.src = this.config.images[1];
				}
				else if (this.instances[instance].rate && (rate <= this.instances[instance].rate) && (false == selected))
				{
					img.src = this.config.images[1];
				}
				else
				{
					img.src = this.config.images[0];
				}
			}
		}
	},

	save: function(instance, image) {
		var selected = image ? this.getSelectedRating(image) : false;

		if (selected)
		{
			if ('input' == this.instances[instance].mode)
			{
				$('rtb_inp_' + instance).value = selected;
				this.instances[instance].rate = selected;
				this.redraw(instance);
			}

			if ('current' == this.instances[instance].mode)
			{
				$('rtb_cntr_' + instance).startWaiting('waiting');

				new Ajax.Request(
					this.getUrl({
						id_module: this.instances[instance].module, id: this.instances[instance].resource, rate: selected
					}), {
						method: 'get', onSuccess: function(instance, selected, response) {
							var response = this.evalResponse(response);

							if (response)
							{									
								this.updateRatings(instance, response, selected);
							}

							$('rtb_cntr_' + instance).stopWaiting();
						}.bind(this, instance, selected)
					}
				);
			}
		}
	},
	
	updateRatings: function(instance, response, selected) {
		for (var i = 0; i < this.resources[this.instances[instance].resource].length; i++)
		{
			instance = this.resources[this.instances[instance].resource][i];
																																										
			if ('average' == this.instances[instance].mode)
			{											
				this.instances[instance].rate = response.current_rate;

				$('rated_users_' + instance).innerHTML = '(' + response.users_rated + ')';

				// ugly hack
				if (Prototype.Browser.IE)
				{
					try {
						$('rated_users_' + instance).parentNode.parentNode.parentNode.className = $('rated_users_' + instance).parentNode.parentNode.parentNode.className;
					}
					catch(e) {}
				}
			}
			else if (('current' == this.instances[instance].mode) && !Object.isUndefined(selected))
			{
				this.instances[instance].rate = selected;
			}

			this.redraw(instance);
		}	
	},

	setRating: function(instance, rating) {
		this.instances[instance].rate = rating;
		this.redraw(instance);
	}
});