﻿$(function(){
	jQuery.fn.ratingComponent=function(settings){
		settings = $.extend({
			api:'vote',
			voteField:'vote',
			voteForField:'voteFor',
			count:5,
			score:0,
			selectable:true,
			id:null,
			onSuccess:null,
			voteTitle:'Vote',
			onImg:getImagePath('onVote.png'),
			offImg:getImagePath('offVote.png'),
			addedParams:null
		}, settings);
		var count=0;
		
		return this.each(function(){
			var id=settings.id;
			if (typeof id == 'array')id=id[count];
			var html='<div class="vote-container" voteId="'+id+'">';
			html+='<ul class="vote-list">';
			var count=settings.count;
			for(var i=0;i<count;i++){
				html+='<li><img/></li>';
			}
			html+='</ul></div>';
			var jObj=$(this);
			jObj.html(html);
			var voteContainer=$('.vote-container', jObj);
			var onImg=settings.onImg;
			var offImg=settings.offImg;
			
			var scoreChildren=$('.vote-list li', jObj);
			var score=typeof settings.score == 'array' ? settings.score[count] : settings.score;
			
			function updateScore(score){
				score=Math.round(score);
				for(var i=0;i<scoreChildren.length;i++)
				{
					var child=$(scoreChildren[i]);
					var img=$('img', child);
					var has=i<score;
					img.attr('src', has ? onImg : offImg);
					img.attr('selectable',has);
				}
			}
			function clearSelection(){
				for(var i=0;i<scoreChildren.length;i++)
				{
					var child=$(scoreChildren[i]);
					var img=$('img', child);
					img.attr('disableSelection',true);
					img.css('cursor',null);
				}
			}
			for(var i=0;i<scoreChildren.length;i++)
			{
				var child=$(scoreChildren[i]);
				var a=$('img', child);
				a.attr('rating', i+1);
				if (settings.selectable)
				{
					a.attr('title', settings.voteTitle+' +'+(i+1));
					a.css('cursor','pointer');
					a.click(function(){
						if (a.attr('disableSelection'))
							return false;
						var rating=$(this).attr('rating');
						var data={};
						data[settings.voteField]=rating;
						data[settings.voteForField]=id;
						var ap=settings.addedParams;
						if (ap)
						{
							for(var key in ap)
								data[key]=ap[key];
						}
						requestApi(settings.api, data, function(response){
							switch(response.err)
							{
								case 'success':
									updateScore(response.rating);
									if (settings.onSuccess)
										settings.onSuccess(id, response.rating);
									break;
							}
							clearSelection();
						});
						return false;
					});
				}
			}
			updateScore(score);
			
			count++;
		});
	}
});
