// JavaScript Document
/*************************************************
Star Rating System
First Version: 21 November, 2006
Author: Ritesh Agrawal
Inspriation: Will Stuckey's tick rating system (http://sandbox.wilstuckey.com/jquery-ratings/)
Demonstration: http://php.scripts.psu.edu/rja171/widgets/rating.php
Usage: $('#rating').rating('www.url.to.post.com', {maxvalue:5, curvalue:0});

arguments
url : required -- post changes to 
options
	maxvalue: number of stars
	curvalue: number of selected stars
	

************************************************/

jQuery.fn.rating = function(options, callback) {
	var settings = {
		minvalue  :-5,
        maxvalue  : 5,   // max number of stars
        curvalue  : 0,   // number of selected stars
        MasterContainer :null,
        cancelRate:"Cancel Rating",
        GiveIt:"Give it:",
        callback: callback
    };
	
    if(options) {
       jQuery.extend(settings, options);
    };
   jQuery.extend(settings, {cancel: (settings.maxvalue > 1) ? true : false});
   
   var container = jQuery(this);
   
   settings.curvalue =container.children(":input.voteValue").val();
	jQuery.extend(container, {
            averageRating: settings.curvalue
        });
        
   
    function doCallback(value){
    	if (typeof settings.callback =="function"){
    		var removetUrl=container.children(":input.actionUrl").val();
    		settings.callback(settings.masterContainer,removetUrl,value);
    	}
    }   

	for(var i= settings.minvalue; i <= settings.maxvalue ; i++){
		var div="";
        if(i<0 ) {
             div ='<div class="cross"><a href="#'+i+'" title="'+settings.GiveIt+i+'/'+settings.minvalue+'">'+i+'</a></div>';
        }
        else  if (i == 0) {
			if(settings.cancel == true){
	           div ='<div class="cancel"><a href="#0" title="'+settings.cancelRate+'">'+settings.cancelRate+'</a></div>';
			}
        } 
		else{
             div ='<div class="tick"><a href="#'+i+'" title="'+settings.GiveIt+i+'/'+settings.maxvalue+'">'+i+'</a></div>';
        }
        container.append(div);
	}
	
	var stars = jQuery(container).children('.tick');
	var crosses = jQuery(container).children('.cross');
    var cancel = jQuery(container).children('.cancel');
    
    
//    var step=1/settings.maxvalue;
//    step =(1-(step*3))/settings.maxvalue;
//    stars.each(function(index){
//    	var lopacity=1-step*(settings.maxvalue-index-1);
//    	$(this).css('opacity',lopacity);
//    	
//    });
//    
//    step=-(1/settings.minvalue);
//    step =-(1-(step*3))/settings.minvalue;
//    
//    crosses.each(function(index){
//    	var lopacity=1-step*index;
//    	$(this).css('opacity',lopacity);
//    	
//    });
    
	var event = {
		fill: function(el){ // fill to the current mouse position.
			var lIndex=stars.index(el);
			if (lIndex>-1){
				var value = lIndex+1;
				stars.children('a').css('width', '100%').end();
				stars.each(function(index){
								if (index+1<=value){
								   $(this).addClass('on');//.end();
								} 
								else {
								   $(this).addClass('hover');//.end();	
								}
								
							});
				return;
			}
			
			lIndex =crosses.index(el);
			if (lIndex>-1){
				var value = settings.minvalue+lIndex;	
				crosses.children('a').css('width', '100%').end();
				crosses.each(function(index){
								if (index+settings.minvalue>=value){
								   $(this).addClass('on');//.end();
								} 
								else {
								   $(this).addClass('hover');//.end();	
								}											
							});
			}
		},
		
		//ie下有闪烁的问题，有时间改改
		drain: function() { // drain all the stars.
			stars
				.filter('.on').removeClass('on').end()
				.filter('.hover').removeClass('hover').end();
				
			crosses
				.filter('.on').removeClass('on').end()
				.filter('.hover').removeClass('hover').end();				
			
		},
		reset: function(){ // Reset the stars to the default index.
			if (settings.curvalue>0){
				stars.each(function(index){
									if (index+1<=settings.curvalue){
									   $(this).addClass('on');
									}
								});
			}

			if (settings.curvalue<0){			
				crosses.each(function(index){
								if (settings.minvalue+index>=settings.curvalue){
								   $(this).addClass('on');
								}
							});	
			}
		}
	}   
	
	function bindVoteEvent(voteObject){
	    voteObject
		        .mouseover(function(){
	                event.drain();
	                event.fill(this);
	                
	            })
	            .mouseout(function(){
	                event.drain();
	                event.reset();
	            })
	            .focus(function(){
	                event.drain();
	                event.fill(this);
	            })
	            .blur(function(){
	                event.drain();
	                event.reset();
	            });
	
	
	    voteObject.click(function(){
			if(settings.cancel == true){
	            settings.curvalue = jQuery(this).children('a')[0].href.split('#')[1];	
	            doCallback(settings.curvalue);
			}
			else 
			if(settings.maxvalue == 1){
				settings.curvalue = (settings.curvalue == 0) ? 1 : 0;
				$(this).toggleClass('on');				
				doCallback(jQuery(this).children('a')[0].href.split('#')[1]);
			}
			
			return false;
	    });		
	}
	bindVoteEvent(stars);
	bindVoteEvent(crosses);
       

        // cancel button events
	if(cancel){
        cancel
            .mouseover(function(){
                event.drain();
                jQuery(this).addClass('on')
            })
            .mouseout(function(){
                event.reset();
                jQuery(this).removeClass('on')
            })
            .focus(function(){
                event.drain();
                jQuery(this).addClass('on')
            })
            .blur(function(){
                event.reset();
                jQuery(this).removeClass('on')
            });
        
        // click events.
        cancel.click(function(){
            event.drain();
			settings.curvalue = 0;
			doCallback(jQuery(this).children('a')[0].href.split('#')[1]);
            return false;
        });
	}
             
	event.reset();
	 
	if (container.hasClass('ratingDisabled')){
		container.disabled;
	}
		
	return container;	
}
