$.preload ('/cms/ui/1star.gif', '/cms/ui/2star.gif', '/cms/ui/3star.gif', '/cms/ui/4star.gif', '/cms/ui/5star.gif');

function AjaxRater ()
{
	var self			= this;
	var starElem		= $('#rating');
	var scoreForm		= $('#ratingform');
	var scoreElem		= $('#score');
	var msgElem			= $('<span class="ratingMessage">Rate this article</span>');
	var starWidth		= starElem.width () / 5;
	var imagePathElems	= starElem.attr ('src').split ('/');
	var startImage		= imagePathElems.pop ();
	var imagePath		= imagePathElems.join ('/');
	var imageSuffix		= 'star.gif';
	var elemOffset		= starElem.offset ();
	
	self.mouseMoveHandler	= function (evt)
	{
		var	score	= Math.floor (((evt.pageX - elemOffset.left) / starWidth) + 1);
		if (score < 1)
		{
			score	= 1;
		}
		if (score > 5)
		{
			score	= 5;
		}
		this.src	= imagePath + '/' + score + imageSuffix;
		msgElem.text ($('[value=' + score + ']', scoreElem).text ());
		scoreElem.val (score);
	};
	self.mouseOutHandler	= function ()
	{
		this.src	= imagePath + '/' + startImage;
		msgElem.text ('Rate this article');
	};
	self.clickHandler		= function ()
	{
		scoreForm.submit ();
	};
	self.ajaxStartHandler	= function ()
	{
		starElem.unbind ('mousemove', self.mouseMoveHandler);
		starElem.unbind ('mouseout', self.mouseOutHandler);
		starElem.unbind ('click', self.clickHandler);
		msgElem.text ('Please wait...');
		starElem.fadeTo (1, 0.3);
	};
	self.ajaxDoneHandler	= function ()
	{
		starElem.fadeTo (100, 1);
	};
	self.ajaxSuccessHandler	= function (response)
	{
		response *= 1;
		if (response)
		{
			startImage	= '' + response + imageSuffix;
			msgElem.text ('Thank you for your vote!');
		}
		else
		{
			msgElem.text ('You have already voted for this article');
		}
		scoreElem.attr ('src', imagePath + '/' + startImage);
	};
	self.ajaxErrorHandler	= function ()
	{
		starElem.mousemove (self.mouseMoveHandler);
		starElem.mouseout (self.mouseOutHandler);
		starElem.click (self.clickHandler);
		msgElem.text ('Your vote could not be recorded, please try again!');
	};
	self.construct			= function ()
	{
		starElem.after (msgElem);
		starElem.mousemove (self.mouseMoveHandler);
		starElem.mouseout (self.mouseOutHandler);
		starElem.click (self.clickHandler);
		scoreForm.hide ().ajaxForm ({
			data		: {
				ajax	: 1
			},
			beforeSend	: self.ajaxStartHandler,
			complete	: self.ajaxDoneHandler,
			success		: self.ajaxSuccessHandler,
			error		: self.ajaxErrorHandler
		});
	}
	
	self.construct ();
}

$(function ()
{
	new AjaxRater;
});

