/*
  jPoll jQuery plugin version 1.0
	
  Copyright (c) 2009 Dan Wellman
  
  Dual licensed under the MIT and GPL licenses:
  http://www.opensource.org/licenses/mit-license.php
  http://www.gnu.org/licenses/gpl.html
	
*/

(function($) {
	
	//define jPoll object with some default properties
	$.jPoll = {
		defaults: {
			ajaxOpts: {
				url: "/fanclub/poll",
				type: "post"
			},
			groupName: "choices",
			groupIDs: ["choice0", "choice1", "choice2", "choice3", "choice4"],
			pollHeading: "Please choose your favourite:",
			rowClass: "row",
			errors: true,
			canVote: true,
			voted: false,
			sorryMsg: "Please join this fan club to vote ^^"
		}
	};
	
	
	
	//extend jquery with the plugin
	$.fn.extend({
		jPoll:function(config) {
																	
			//use defaults or properties supplied by user
			config = $.extend({}, $.jPoll.defaults, config);
						
			//init widget
			$("<h4>").html(config.pollHeading).appendTo($(this));
			
			if(config.voted == false){
				$("<form>").attr({
					id: "pollForm",
					action: config.ajaxOpts.url,
					method: config.ajaxOpts.type
			  }).appendTo($(this));
			  
				for(var x = 0; x < config.groupIDs.length; x++) {				
					$("<div>").addClass(config.rowClass).appendTo($(this).find("form"));
					$("<input type='radio' name='" + config.groupName + "' id='" + x + "'>").addClass("choice").appendTo($(this).find("form").children(":last")).click(function() {
						($(".error").length != 0) ? $(".error").slideUp("slow") : null ;
					});
					$("<label>").html(config.groupIDs[x].replace("%2C",",")).attr("for", x).appendTo($(this).find("form").children(":last"));
				}
				if(config.canVote == true) {
					$("<div>").attr("id", "buttonRow").addClass(config.rowClass).appendTo($(this).find("form"));
				}
				else $("<br /><p class='alert thanks smallfont'>"+config.sorryMsg+"</p>").appendTo($(this).find("form").children(":last"));
				
				//on submit
				$("<button type='submit'>").text("Vote!").appendTo("#buttonRow").click(function(e) {
					e.preventDefault();
					
					//record which radio was selected
					var selected;
					$(".choice").each(function() {
						($(this).attr("checked") == true) ? selected = $(this).attr("id") : null ;
					});
					
					//print message if no radio selected and errors enabled
					if (config.errors == true) {
						(selected == null && $(".error").length == 0) ? $("<p>").addClass("error").text("Please make a selection!").css({display:"none"}).insertAfter("#pollForm").slideDown("slow") : null ;
					}
					
					//add additional request options
					var addOpts = {
						type: "post",
						data: "&choice=" + selected,
						dataType:"json",
						success: function(data) {
									
							//add all votes to get total
							var total = 0;
								for (var x = 0; x < data.length; x++) {
								total += parseInt(data[x].votes);
							}
							//change h4
							$("div#pollContainer").find("h4").text("Results, out of " + total + " votes:");
											
							//remove form
							$("form#pollForm").slideUp("slow");
							
							//create results container
							$("<div>").attr("id", "results").css({ display:"none" }).insertAfter("#pollForm");
											
							//create results
							for (var x = 0; x < data.length; x++) {
								
								//create row elment
								$("<div>").addClass("row").attr("id", "row" + x).appendTo("#results");
								
								//create label and result
								$("<label>").html(config.groupIDs[x].replace("%2C",",")).appendTo("#row" + x);
								$("<div>").attr("title", Math.round(data[x].votes / total * 100) + "%").addClass("result").css({ display:"none" }).appendTo("#row" + x);
							}
							
							//show results container
							$("#results").slideDown("slow", function() {
							
								//animate each result
								$(".result").each(function(i) {
									$(this).animate({ width: Math.round(data[i].votes / total * 100) }, "slow");
								});	
								
								//create and show thanks message
								$("<p>").attr("id", "thanks").text("Thanks for voting! ^^").css({ display:"none" }).insertAfter("#results").fadeIn("slow");		
							});							
						}
					};
					//merge ajaxOpts widget properties and additional options objects
					ajaxOpts = $.extend({}, addOpts, config.ajaxOpts);
					
					//make request if radio selected
					return (selected == null) ? false : $.ajax(ajaxOpts) ;

				});
			}			
			
			//return the jquery object for chaining
			return this;
		}
  });
})(jQuery);
