$.fn.extend({'Poller': Poller});

function Poller(pollerId, displayMode, callback)
{
		var AJAX_POLLER = '/ajax/poll/';
		var self = this;
		
		displayMode = (displayMode && displayMode == 'percent') ? 'percent' : 'count';
	
		$(getPoll());
		
		function getPoll()
		{
		  $.ajax({
			        type:     "POST",
			        url:      AJAX_POLLER,
			        cache:    false,
			        data:     {'poller_id': pollerId},
			        dataType: 'json',
			        success:  HandleGetPoll
		  });
		}
	
		function HandleGetPoll(json)
		{
			var data = eval(json);
			var options = data['options'];
			var action  = data['action'];
			var text    = data['text'];
			var total   = data['total'];
			pollerId	  = data['poller_id'];
			
			var form = $('<form class="poller poller-'+pollerId+'"/>').hide();
			form.attr({action: AJAX_POLLER, method: 'post'});
			form.append('<input type="hidden" name="poller_id" value="'+pollerId+'"/>');
			form.append('<input type="hidden" name="action" value="vote"/>');
			
			var head = $('<h3 class="poller-head"/>').html(text);
			
			var table = $('<table class="poller-content"/>');
			for(i in options)
			{
					if(!options.hasOwnProperty(i)) continue;
					var tr    = $('<tr class="poll-r-'+i+'"/>');
					var input = $('<td class="poll-c-1"><input type="radio" name="option_id" value="'+options[i]['id']+'"/></td>').hide();
					$("input", input).data('count', options[i]['count']);
					var label = $('<td class="poll-c-2">'+options[i]['value']+'</td>').hide();
					var rate  = $('<td class="poll-c-3""><span>&nbsp;</span></td>').hide();
					var result = $('<td class="poll-c-4">'+options[i]['count']+'</td>').hide();
					tr.append(input).append(label).append(rate).append(result);
					table.append(tr);
			}

		  var tds = $("td", table);
			var inputCollection = $("input", tds);			
			var submit = $('<input type="image" src="/images/poll-button.gif" class="poller-submit" title="Голосовать" class="vote"/>').hide();
			submit.click(function(){
				var checked = inputCollection.filter(":checked");
				if(checked.size() > 0)
				{
					optionId = checked.attr('value');					
					$.ajax({
					        type:     "POST",
					        url:      AJAX_POLLER,
					        cache:    false,
					        data:     {'action': 'vote', 'poller_id': pollerId, 'option_id': optionId},
					        success: function(){
					        		var checkedCount = parseInt(checked.data('count'));
					        		checked.removeData('count');
					        		checked.data('count', checkedCount + 1);
					        		total = parseInt(total) + 1;
											submit.fadeOut();
					        		UpdateRate(inputCollection, displayMode, total);
											tds.filter(".poll-c-1").fadeOut('def', function(){
												tds.filter(".poll-c-3").fadeIn();
												tds.filter(".poll-c-4").fadeIn();
											});
					        }
				  });
				}
				return false;
			});
			
			submitCont = $('<p class="poller-submit-cont"></p>');
			submitCont.append(submit);
			self.append(form.append(head).append(table).append(submitCont));
			
			switch(action)
			{
			case('ask'):
				tds.filter(".poll-c-1").show();
				tds.filter(".poll-c-2").show();
				submit.show();
				break;
			case('view'):
				tds.filter(".poll-c-2").show();
				tds.filter(".poll-c-3").show();
				tds.filter(".poll-c-4").show();
				UpdateRate(inputCollection, displayMode, total);
				break;
			}
			form.fadeIn();
			if(callback)
			{
				callback.call(callback, action);
			}
		}
		
		function UpdateRate(collectionInput, displayMode, total)
		{
			if(total > 0)
			{
				var maxRate = new Array();
				var maxCount = 0;
				$(collectionInput).each(function(){
					var count = parseInt($(this).data('count'));
					var rate = $('span', $(this).parent().next().next('.poll-c-3'));
					if(count > maxCount)
					{
						$(maxRate).each(function(){$(this).removeClass('max-rate')});
						maxCount = count;
						maxRate = new Array();
						maxRate.push(rate.addClass('max-rate'));
					}
					else if(maxCount == count)
					{
						rate.addClass('max-rate');
						maxRate.push(rate);
					}

					if(count != 0)
					{
						rate.css('width', Math.round(100 * count/total) + '%');
					}
					else
					{
						rate.css('width', '1px');
					}
					
					var votes = rate.parent().next('.poll-c-4');
					switch(displayMode)
					{
						case('percent'):
							votes.html(Math.round(100 * count/total) + '%');
							break;
						case('count'):
							votes.html(count);
							break;
					}
				});
			}
		}
}

