var Rating = Class.create (
{
	moving:false,
	rateLayerId:'makeReviewForm',
	visible:false,
	voteValue:0,

	init: function()
	{
		if($('makeReviewForm'))
		{
			rating.visible = $('makeReviewForm').visible();
		}
	},
	
	overStar:function(starId)
	 { 
		
		//this.voteValue = 0;
		if (this.voteValue > 0) return; 
		$('voteValue').value = this.voteValue;
		for (var i= 1; i<= 5; i++)
		{
			if ( i <= starId)
			{
				if(!$('star-'+i).hasClassName('over')) $('star-'+i).addClassName('over');
			}
			else
			{
				if($('star-'+i).hasClassName('over')) $('star-'+i).removeClassName('over');
			}
		}
		
	 },
	  outStar:function(starId)
	 { 
		if (this.voteValue > 0) return;
		for (var i=starId; i>= 1; i--)
		 {
			$('star-'+i).removeClassName('over');	
		 }
	 },
	 vote:function(value)
	 {
		if (this.voteValue > 0) 
		{
			this.voteValue = 0;
			for (var i=1; i<= 5; i++)
		 	{
				$('star-'+i).removeClassName('over');	
			}	
			this.overStar(value);
			return;
		}
		this.voteValue = value;
		$('voteValue').value = this.voteValue;
		
	 },
	 show : function ()
	{
	
			if (this.visible) return;	
	
			this.visible = true;
			this.moving = true;
			
			if($('noReview'))
			{
				Effect.SlideUp('noReview', {duration: 0.3});
			}
			
			$('makeReview').hide();
			$('closeReview').show();
	
			Effect.SlideDown(this.rateLayerId,{ duration: 0.3, afterFinish: function() {
					  this.moving = false;		
					  
					  }.bind(this)});
		
		
	 },
 	hide : function ()
	{
		if (!this.visible) return;
		this.moving = true;
		
		if($('noReview'))
		{
			Effect.SlideDown('noReview', {duration: 0.3});
		}
		
		Effect.SlideUp(this.rateLayerId,{ duration: 0.3, afterFinish: function() {
					  this.visible = false;	
					  this.moving = false;	
						$('makeReview').show();
					   $('closeReview').hide();
					  }.bind(this)});
	
	
	},
	toogle :function ()
	{
		if (!this.moving && !this.visible)
		{
			this.show();
		}
		if (!this.moving && this.visible)
		{
			this.hide();
		}
	}

});

var Review = Class.create (
{
	requestSent: false,
	
	save:function()
	{ 
		if(!review.requestSent)
		{
			$('reviewErrorMessage').update();
			$('reviewErrorMessage').show();
			
			var data = $('reviewForm').serialize(true);
			review.requestSent = true;
			ajax("/save-review", data, "post", review.onSaveSuccess);
		}
	},
	
	onSaveSuccess: function(transport)
	{
		var data = transport.responseJSON;
		
		//ak vyprsala session treba reloadnut stranku
		if(data.reload)
		{
			document.location = document.location; 
			return;
		}
		
		if(data.result == 'ok')
		{
			$('reviewForm').reset();
			rating.vote(0);
			
			$('titleReviewCount').update(data.votes);
			$('reviewCount').update(data.votes);
			$('reviewPlural').update(data.reviewPlural);
			$('productAverageRating').style.width = Math.round(97 * ((data.totalRating / data.votes) / 5)) + "px";
			
			var newReview = $(document.createElement('div'));
			newReview.addClassName('userReview');
			newReview.addClassName('hidden');
			newReview.innerHTML = data.HTML;
			$('userReviewHolder').insertBefore(newReview, $('userReviewHolder').firstChild);
			
			if($('noReview'))
			{
				$('noReview').remove();
			}
			
			rating.hide();
			Effect.Appear(newReview.identify(), {duration: 0.3});
		}
		else if(data.result == 'error')
		{
			$('reviewErrorMessage').update(data.message);
			review.hideErrorMessage.delay(4);
		}
		review.requestSent = false;
	},
	
	hideErrorMessage: function()
	{
		Effect.Fade('reviewErrorMessage');
	}
});

var review;
var rating;
Event.observe(window, 'load', function() 
	{
		rating = new Rating();
		rating.init();
		
		review = new Review();
	}
);
