/**
 * Sexy Vote Revolution -  Plugin for jQuery
 * @author Alessandro Coscia
 * @author Vladimir K.
 * Originally written by Vladimir, modified by Alessandro Coscia to correct some bugs and adapt it to everyday use
 */

( function($) {

	jQuery.fn.sexyVote = function(config) {
		config = config || {};
		var defaults = {
			activeImageSrc: "active_star.gif",
			passiveImageSrc: "passive_star.gif",
			maxScore: 5,
			//fn: new Function(),
			ajaxURL: 'vote.php',
			ajaxParams: {},
			ajaxCallBack: new Function(),
			messages: [ "Your vote have been saved.", "Very bad", "Bad",
					"Good, but could be better", "Good enough", "Very good" ],
			initialScore: 0
		};

		config = jQuery.extend(defaults, config);

		return this.each( function() {
			var $container = jQuery(this);
			
			// Add stars
			for ( var i = 0, num = config.maxScore * 2; i < num; ++i) {
				jQuery("<img />").appendTo($container);
			}
			jQuery("<br /><span />").appendTo($container);

			
			// Small hack that solve a small bug 
			$container.mouseenter(function () {
				// Hide active / show passive
				$container.find("img:odd").css( { display: "none" });
				$container.find("img:even").css( { display: "inline" });
			});
			
			
			// Initial score
			setInitialScoreFN = function () {
				$container.find("img:even:lt(" + config.initialScore + ")").css( { display: "none" } );
				$container.find("img:even:gt(" + (config.initialScore - 1) + ")").css( { display: "inline" } );
				
				$container.find("img:odd:lt(" + config.initialScore + ")").css( { display: "inline" } );
				$container.find("img:odd:gt(" + (config.initialScore - 1) + ")").css( { display: "none" } );
			}
			$container.mouseleave(setInitialScoreFN);
			
			
			// passive images' properties and events
			$container.find("img:even")
					.attr("src", config.passiveImageSrc)
					.css( { display: "inline" } )
					.bind(
							"mouseover",
							function(e) {
								var len = $container.find("img:even").index(e.target) + 1;

								// Hide passive / show active
								$container.find("img:even").slice(0, len).css( { display: "none" });
								$container.find("img:odd").slice(0, len).css( { display: "inline" });

								// Show stars' message
								$container.find("span").text( config.messages[len]);
							});
					
			// active images' properties and events
			$container.find("img:odd")
					.attr("src", config.activeImageSrc)
					.css( { display: "none" } )
					.bind(
							"mouseout",
							function(e) {
								var len = $container.find("img:odd").index(e.target) + 1;

								// Hide active / show passive
								$container.find("img:odd")
								//.slice(0, len)
								.css( { display: "none" });
								$container.find("img:even")
								//.slice(0, len)
								.css( { display: "inline" });

								$container.find("span").text("");

							})
					
					// Vote event! 
					.bind(
							"click",
							function(e) {
								$container.find("img").unbind("mouseover").unbind("mouseout").unbind("click");
								$container.find('img').css( { cursor: 'default'} );
								$container.unbind('mouseenter');
								$container.find("span").text(config.messages[0]);
								
								// Ajax / JSON
								// config.fn.call(this, e, $container.find("img:odd").index(e.target) + 1);
								score = $container.find("img:odd").index(e.target) + 1;
								callBack = function (json) {
									if (!json.error) config.initialScore = json.result;
									setInitialScoreFN.call();
									config.ajaxCallBack(json);
								}
								config.ajaxParams.score = score;
						    	$.getJSON(config.ajaxURL, config.ajaxParams, callBack);
							});
			
			// Initial score
			setInitialScoreFN.call();
			
			// Pointer cursor
			$container.find('img').css( { cursor: 'pointer'} );
		});

	};

})(jQuery);