/**
 * Usage: $('#rating').rater('your_servlet', {style:'basic', maxvalue:5, curvalue:0});
 *  
 * @param url The address you want to post the result to. 
 * @param options The style and value attributes
 *
 * Valid options:
 * ---------------------------------------
 *       style:       'basic', 'inline' OR 'small'
 *       maxvalue:    the maximum value / number of stars
 *       curvalue:    the initial value / selected stars
 */ 
jQuery.fn.rater = function(url, options)
{
	if(url == null) return;
	var settings = {
	    enabled   : true,
		url       : url, // post changes to 
		maxvalue  : 5,   // max number of stars
		curvalue  : 0,    // number of selected stars
		rated     : false,
		objIdKey  :'objId',
		objId     :'',
		objTypeKey:'objType',
		objType   :'',
		rateKey   :'rate',
		exp       :30,
		cookie    :'',
		tooltip   :'',
        showCommentAtStart:false
	};
	
	if(options) { jQuery.extend(settings, options); };
	var mainControl = jQuery(this);
	var spans = mainControl.children('span');
	var container = jQuery(spans[1]);
	var result = jQuery(spans[2]);
	jQuery.extend(container, { averageRating: settings.curvalue, url: settings.url });

    var ratingparent = '<span class="inline-rating">';
	if(!settings.style || settings.style == null || settings.style == 'basic') {
		var raterwidth = settings.maxvalue * 25;
		ratingparent += '<ul class="star-rating" style="width:'+raterwidth+'px"></ul>';
	}
	if(settings.style == 'small') {
		var raterwidth = settings.maxvalue * 10;
		ratingparent += '<ul class="star-rating small-star" style="width:'+raterwidth+'px"></ul>';
	}
	ratingparent+='</span>';
	container.append(ratingparent);
	
	// create rater
	var starWidth, starIndex, listitems = '';
	var curvalueWidth = Math.floor(100 / settings.maxvalue * settings.curvalue);
	listitems+='<li class="current-rating '+(settings.rated?'dark-star':'light-star')+'" style="width:'+curvalueWidth+'%;">'+settings.curvalue+'/'+settings.maxvalue+'</li>';
	if(settings.enabled && !settings.rated){
	    for(var i = 1; i <= settings.maxvalue ; i++) {
		    starWidth = Math.floor(100 / settings.maxvalue * i);
		    starIndex = (settings.maxvalue - i) + 2;
		    listitems+='<li class="star"><a href="#'+i+'" style="width:'+starWidth+'%;z-index:'+starIndex+'">'+i+'</a></li>';//title="'+i+'/'+settings.maxvalue +'" 
	    }
	}
		
	container.find('.star-rating').append(listitems); // i am using find here, because the span wrapped in the small style would break children()
	container.attr('title', rating_curvaluetext+settings.curvalue+settings.tooltip);
	if(settings.enabled && !settings.rated && rating_explanations.length > 0){
	    mainControl.append('<div class="star-rating-explain"></div>'); 
	    function explain(){
	        result.hide();
	        mainControl.find('.star-rating-explain').show();
	    }
	    function stats(){
	        mainControl.find('.star-rating-explain').hide();
	        result.show();
	    }
	    if(jQuery.browser.msie){
	        container.find('.star-rating').bind('mouseenter',explain).bind('mouseleave',stats);  
	    }
	    else{
	        container.find('.star-rating').mouseover(explain).mouseout(stats);
	    }
	    container.find('.star a').mouseover(function(){
	        var index=container.find('.star a').index(this);
	        mainControl.find('.star-rating-explain').html(rating_explanations[index]);
	    });
	}    
	
	var closeButton = $(document.createElement('a'));
	closeButton.html(rating_closetext);
	closeButton.attr('href', '#');
	closeButton.click(function(){mainControl.find('.star-rating-comment').hide();return false;});
	closeButton.addClass('star-rating-comment-close');
	var closeButtonContainer = $(document.createElement('div'));
	closeButtonContainer.addClass('star-rating-comment-close-container');
	closeButtonContainer.append(closeButton);
	mainControl.find('.star-rating-comment').prepend(closeButtonContainer);
	
    function displayComment(animation){
        var commentHolder=mainControl.find('.star-rating-comment');
        var cwidth = mainControl.width();
        if(!$.browser.msie){
            cwidth -= parseInt(commentHolder.css('paddingLeft')) + parseInt(commentHolder.css('paddingRight'));
        }
        var cheight = commentHolder.width(cwidth).height();
        var offset = mainControl.offset();
	    mainControl.find('.star-rating-comment').css({top:(offset.top+mainControl.height()),left:offset.left});
		if(!animation){
		    commentHolder.show();
		}else{
		    if($.browser.msie){
                commentHolder.show().height(5).width(5);
            }else{
                commentHolder.height(1).width(1);
            }
		    commentHolder.animate({width:cwidth},500).animate({height:cheight},1000).show();
		}
    }

	if(settings.showCommentAtStart){
	    $(document).ready(function(){ displayComment(false);});
	}
	
	function createCookie(name,value,days){if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));var expires="; expires="+date.toGMTString();}else var expires="";document.cookie=name+"="+value+expires+"; path=/";}
    function readCookie(name){var nameEQ = name + "=";var ca = document.cookie.split(';');for(var i=0;i < ca.length;i++) {var c = ca[i];while (c.charAt(0)==' ') c = c.substring(1,c.length);if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);}return null;}
    function eraseCookie(name){createCookie(name,"",-1);}
	if(settings.enabled && !settings.rated){
	    var stars = jQuery(container).find('.star-rating').children('.star');
	    stars.click(function()
	    {	   
	        if(!settings.rated){
	            settings.rated=true;
	        }else{
	            return;
	        }
		    stars.unbind('click');
		    settings.curvalue = stars.index(this) + 1;
		    raterValue = jQuery(this).children('a')[0].href.split('#')[1];
		    container.find('.star-rating').children('.current-rating').removeClass('light-star').addClass('dark-star').css({width:(Math.floor(100 / settings.maxvalue * settings.curvalue))+'%'});//,backgroundPosition: 'left bottom'
		    var postParams={};postParams[settings.rateKey]=raterValue;postParams[settings.objIdKey]=settings.objId;postParams[settings.objTypeKey]=settings.objType;
		    if(container.url!=''){
		        jQuery.post(container.url, postParams, function(response){
		            mainControl.find('.star-rating-explain').hide();
	                result.hide();
			        stars.empty();
			        if(rating_explanations.length > 0){
			            if(jQuery.browser.msie){
	                        container.find('.star-rating').unbind('mouseenter',explain).unbind('mouseleave',stats);  
	                    }
	                    else{
	                        container.find('.star-rating').unbind('mouseover',explain).unbind('mouseout',stats);
	                    }
	                    container.find('.star a').unbind('mouseover');
	                }
			        result.children('.arate').html(response['arate']);
			        result.children('.total').html(response['total']);
		            container.attr('title', rating_curvaluetext+response['arate'] + ' ' + result.text());
			        if(settings.cookie){
			            createCookie(settings.cookie, raterValue, settings.exp);
			        }
			        $(spans[0]).html(rating_thankstext);
			        if(!settings.showCommentAtStart){
			            displayComment(false);
			        }
		        },'json');
		    }
		    return false;
	    });
	}	
	return this;
}
