jQuery.fn.rater = function(name,url, options)
{
	if(url == null) return;
	var settings = {
	    name      : name, // post changes to 
		url       : url, // post changes to 
		maxvalue  : 5,   // max number of stars
		curvalue  : 0,    // number of selected stars
		group:null,
		usepostback:false,
		israted:false
	};
	reters_settings[reters_settings.length]=settings;
	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 * 15;
		var ratingparent = '<ul class="star-rating" style="width:'+raterwidth+'px">';
	}
	if(settings.style == 'small') {
		var raterwidth = settings.maxvalue * 15;
		var ratingparent = '<ul class="star-rating small-star" style="width:'+raterwidth+'px">';
	}
	if(settings.style == 'inline') {
		var raterwidth = settings.maxvalue * 15;
		var ratingparent = '<span class="inline-rating"><ul class="star-rating small-star" style="width:'+raterwidth+'px">';
	}
	container.append(ratingparent);
	// create rater
	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(i == 1)
             {
             tj='Очень плохо';
             }
             if(i == 2)
             {
             tj='Плохо';
             }
             if(i == 3)
             {
             tj='Средне';
             }
             if(i == 4)
             {
             tj='Хорошо';
             }
             if(i == 5)
             {
             tj='Отлично';
             }
			listitems+='<li class="star"><a href="#'+i+'" title="'+tj+'" style="width:'+starWidth+'%;z-index:'+starIndex+'">'+i+'</a></li>';

		}
	}
	container.find('.star-rating').append(listitems); // i am using find here, because the span wrapped in the small style would break children()
	if(settings.maxvalue > 1) // add a container for the ajax result
	{
		container.append('<span class="star-rating-result"></span>'); 
	}
	if(settings.usepostback){
		if(settings.group){
			container.append('<input type=hidden value="" name="'+settings.group+'['+settings.name+']" id="raterval_'+settings.name+'">');		
		}else{
			container.append('<input type=hidden value="" name="'+settings.name+'" id="raterval_'+settings.name+'">');		
		}
	}
	var stars = jQuery(container).find('.star-rating').children('.star');
	stars.click(function()
	{
		if(settings.maxvalue == 1) // on / off
		{
			settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
			raterName=settings.name;
			jQuery(container).find('.star-rating').children('.current-rating').css({width:(settings.curvalue*100)+'%'});
			settings.israted=true;
			if(!settings.usepostback){
				jQuery.post(container.url, { raterName: settings.curvalue });
			}else{
				if($('#raterval_'+settings.name).get(0)){
					$('#raterval_'+settings.name).get(0).value=settings.curvalue;
				}
			}
			return false;
		}
		else
		{
			
			settings.curvalue = stars.index(this) + 1;
			raterValue = jQuery(this).children('a')[0].href.split('#')[1];
			raterName=settings.name;
			var params = {};
            params[raterName] = raterValue;
			if(!settings.usepostback){
				jQuery.post(container.url, params , function(response){
					jQuery(container).find('.star-rating').children('.current-rating').css({width:(settings.curvalue*100/settings.maxvalue)+'%'});			
					settings.israted=true;
					if(settings.callback){
						settings.callback(response,settings)
					}else{
						container.children('.star-rating-result').html(response)	
					}
				});
			}else{
				jQuery(container).find('.star-rating').children('.current-rating').css({width:(settings.curvalue*100/settings.maxvalue)+'%'});						
				settings.israted=true;
				$('#raterval_'+settings.name).get(0).value=settings.curvalue;
				var response='';
				if(settings.callback){
					settings.callback(response,settings)
				}else{
					container.children('.star-rating-result').html(response)	
				}
			}
			return false;
		}
		return true;
	});

	return this; // strict warning: anonymous function does not always return a value. fix?
}
var reters_settings=[];
var regestred_forms=[];
function regRetersForm(formId){
	regestred_forms[regestred_forms.length]=formId;
}
$(document).ready(function() 
{ 
	for(var i=0;i<regestred_forms.length;i++){
		var frm=document.getElementById(regestred_forms[i]);
		if(frm){
			frm.onsubmit=function(){
				var usr_rat=0;
				for(var i=0;i<reters_settings.length;i++){
					if(reters_settings[i].israted){
						usr_rat++
					}
				}
				if(usr_rat<7){
					alert('Необходимо ответить минимум на 7 вопросов')
						return false;
				}

			}
		}
	}
}
)
 

