jQuery.fn.vote = function(url, options)
{

/* 
Для изменения надписей результатов голосований необходимо вносить изменения в строки
стр. 102 - дефолтное отображение надписей около голосования
стр. 129 - Спасибо за оценку!
стр. 133 - при нажатии на звезду, т.е. проголосовали - "Ваша оценка Х"
стр. 163 - "Ваша оценка Х" - при наведении мышкой на какую-либо звезду
стр. 179 - надпись при потере фокуса, когда убрали мышь из области голосования
*/

/* изображения звезд могут быть лююбого размера, но необходимо скорректировать размеры в коде*/
var big_item = 18; // ширина изображения большой звезды
var small_item = 18; // ширина изображения маленькой звезды
/* так же для корректного отображения новых звезд надо елать правки в vote.css */

var clicked = 0;

	if(url == null) return;
	var settings = {
		url       : url, 
		maxvalue  : 10,   
		curvalue  : 0,   
		page_id  : '',    
		vote_id : '',
		vote: 0,
		vote_count: 0,
		allow_vote: 1,
		fade_in: 1000,
		fade_out: 1000
	};
	
	if(options) { jQuery.extend(settings, options); };
	jQuery.extend(settings, {cancel: (settings.maxvalue > 1) ? true : false});
	
	var container = jQuery(this);
	jQuery.extend(container, { averageRating: settings.curvalue, url: settings.url });

	if(!settings.style || settings.style == null || settings.style == 'basic') {
		var raterwidth = settings.maxvalue * big_item;
		var ratingparent = '<ul class="vote-list" style="width:'+raterwidth+'px">';
	}
	if(settings.style == 'small') {
		var raterwidth = settings.maxvalue * small_item;
		var ratingparent = '<ul class="vote-list small-star" style="width:'+raterwidth+'px">';
	}
	if(settings.style == 'inline') {
		var raterwidth = settings.maxvalue * small_item;
		var ratingparent = '<div class="inline-rating"><ul class="vote-list small-star" style="width:'+raterwidth+'px">';
	}
	if(settings.style == 'basic-inline') {
		var raterwidth = settings.maxvalue * big_item;
		var ratingparent = '<span class="inline-rating"><ul class="vote-list" style="width:'+raterwidth+'px">';
	}	
	if(settings.style == 'small-inline') {
		var raterwidth = settings.maxvalue * small_item;
		var ratingparent = '<div class="inline-rating"><ul class="vote-list small-star" style="width:'+raterwidth+'px">';
	}	
	container.append(ratingparent);
	
	// create rater
	function create_rater( settings ) {
		container.find('.vote-list').children('li').remove();
		var starWidth, starIndex, listitems = '';
		var curvalueWidth = Math.floor(100 / settings.maxvalue * settings.curvalue);
		for(var i = 0; i <= settings.maxvalue ; i++) {
			if (i == 0) {
				listitems+='<li class="current-rating" style="width:'+curvalueWidth+'%;">'+settings.curvalue+'/'+settings.maxvalue+'</li>';
			} else {
				starWidth = Math.floor(100 / settings.maxvalue * i);
				starIndex = (settings.maxvalue - i) + 2;
			
				if ( settings.allow_vote == 1 ) {
					link = '<a href="#'+i+'" style="width:'+starWidth+'%;z-index:'+starIndex+'">'+i+'</a>';
				} else {
					link = '<span style="width:'+starWidth+'%;z-index:'+starIndex+'">'+i+'</span>';
				}
				listitems+='<li class="star">' + link + '</li>';
			}
		}
		container.find('.vote-list').append(listitems); // i am using find here, because the span wrapped in the small style would break children()
	}
	
	create_rater( settings );
	
	

	if(settings.maxvalue > 1) // add a container for the ajax result
	{
		if ( settings.allow_vote == 1 ) {
			rate_class = 'cur_rate';
		} else {
			rate_class = 'cur_rate_fix';
		}
		var list_style_class = '';	
		if (settings.style == 'basic-inline') list_style_class = ' basic-inline ';	
		if (settings.style == 'small-inline') list_style_class = ' small-inline ';	
		if (settings.style == 'small') list_style_class = ' vote-list-result-small ';	
		
		var vote_res = '<div class="vote-list-result' + list_style_class + '">' + 
					   '<span class="hidcat">Рейтинг: <span class="' + rate_class + '">' + Math.round(settings.curvalue*100)/100 + ' <span class="noncolor">из</span> ' + settings.maxvalue + '</span> (' + settings.vote_count + ' голосов)' + 
					   '</span></div>';
		container.append( vote_res ); 
	}
	var stars = jQuery(container).find('.vote-list').children('.star');
	stars.click(function()
	{
		if ( settings.allow_vote == 0 ) return false;
		if(settings.maxvalue == 1) // on / off
		{
			settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
			jQuery(container).find('.vote-list').children('.current-rating').css({width:(settings.curvalue*100)+'%'});
			jQuery.post(container.url, { "rating": settings.curvalue, "page_id": settings.page_id, "vote_id": settings.vote_id, "vote_count": settings.vote_count, "vote": settings.vote });
			return false;
		}
		else
		{
			clicked = 1;
			settings.allow_vote = 0;
			settings.curvalue = stars.index(this) + 1;
			raterValue = jQuery(this).children('a')[0].href.split('#')[1];
			jQuery.post(container.url, { "rating": raterValue, "page_id": settings.page_id, "vote_id": settings.vote_id, "vote_count": settings.vote_count, "vote": settings.vote }, function(response){
				if ( response != 0 ) {
					var res = eval( "(" + response + ")"  );
					//container.children('.vote-list-result').html(response)	
					var vote_res_div = container.children('.vote-list-result');
					vote_res_div.fadeOut( settings.fade_out, function() {
						vote_res_div.html('Ваш голос учтен').fadeIn(settings.fade_in).delay(500).fadeOut(settings.fade_out, function() {
							var rate = res.rate / res.rate_count;
							settings.curvalue = Math.round(rate*100)/100; //rate
							settings.vote_count = res.rate_count;
							var vote_res = '<span class="hidcat">Рейтинг: <span class="cur_rate_fix">' + settings.curvalue + ' <span class="noncolor">из</span> ' + settings.maxvalue + '</span> (' + res.rate_count + ' голосов)</span>';				
							vote_res_div.html( vote_res ).fadeIn(settings.fade_in, function(){
								if ( $.browser.msie )
								{
										this.style.removeAttribute('filter');
								}
							});		
							
							// обновить шкалу
							create_rater( settings );
							stars.children('a').remove();							
							clicked = 0;
						}); 	
					});

				} else clicked = 0;
			});
			return false;
		}
		return true;
	});
	
	stars.hover(
		function()
		{
				if ( clicked == 0 ) {
					if ( settings.allow_vote == 1 ) {
						container.find('.vote-list li.current-rating').hide();
						var vote_res_div = jQuery(container).find('.vote-list-result');
						var val = jQuery(this).children('a')[0].href.split('#')[1];
						val = 'Ваша оценка <span class="select_rate">' + val + ' <span class="noncolor">из</span> ' + settings.maxvalue + '</span>';
						vote_res_div.html( val );	
					}	
				}
		},
		function(e)
		{
			//if(e.target == this)
			{
				if ( clicked == 0 ) {
					var vote_res_div = jQuery(container).find('.vote-list-result');
					if ( settings.allow_vote == 1 ) {
						rate_class = 'cur_rate';
					}	else {
						rate_class = 'cur_rate_fix';
					}
					var vote_res = '<span class="hidcat">Рейтинг: <span class="' + rate_class + '">' + Math.round(settings.curvalue*100)/100 + ' <span class="noncolor">из</span> ' + settings.maxvalue + '</span> (' + settings.vote_count + ' голосов)</span>';
					
					vote_res_div.html( vote_res );
					container.find('.vote-list li.current-rating').show();
				}
			}
		}
	);
	
	
	return this; // strict warning: anonymous function does not always return a value. fix?
}


