/**
 * Poll widget code.
 */

(function($) {
  
  function fmtNum(n) {
    var s = Number(n).toFixed(1);
    return s.replace(/\.0$/, "");
  }
  
  function fixPoll(poll) {
    poll.CurrentUserHasRecommended = poll.CurrentUserHasRecommended === "True";
    poll.CurrentUserHasReportedAbuse = poll.CurrentUserHasReportedAbuse === "True";
    poll.CurrentUserHasVoted = poll.CurrentUserHasVoted === "True";
    poll.IsClosed = poll.IsClosed === "True";
    
    poll.TotalVotes = 0;
    jQuery.each(poll.Answers, function() {
      this.NumberOfVotes = parseInt(this.NumberOfVotes);
      poll.TotalVotes += this.NumberOfVotes;
    });

    jQuery.each(poll.Answers, function() {
      this.Percentage = 100 * (poll.TotalVotes == 0 ? 0 : this.NumberOfVotes / poll.TotalVotes);
      this.PercentageStr = fmtNum(this.Percentage);
      //console.log("%s: %f (%s%)", this.Answer, this.Percentage, this.PercentageStr);
    });
  }
  
  function sendRequest(action, callback) {
    var requestBatch = new RequestBatch();
    requestBatch.AddToRequest(action);
    requestBatch.BeginRequest(serverUrl, function(responseBatch) {
      //console.dir(responseBatch);
      callback(responseBatch);
    });
  }

  jQuery.fn.pollWidget = function(options) {
    var $self = this;
  
    function renderPoll(poll) {
      $self.children(".slPoll")
        .removeClass("loading")
        .empty();
  
      fixPoll(poll);
      
      jQuery.extend(options, {
        poll: poll,
        noVote: poll.IsClosed || poll.CurrentUserHasVoted 
      });
  
      var $poll = jQuery.bmj.runTemplate("poll-widget", options);
      //console.info($poll.html());
      
      $poll.find(".slVoteButton").bind("click.poll", function(ev) {
        var $sel = $self.find(":radio:checked");
        
        if ($sel.length == 0) {
          $self.find(".slErrorText").show();
        }
        else {
          jQuery(this)
            .unbind("click.poll")
            .parent()
              .after("<div class='loading-inline'></div>");
          
          var pollKey = poll.PollKey.Key;
  
          sendRequest(new PostPollAnswerAction(new PollKey(pollKey), $sel.val()), function(responseBatch) {          
            sendRequest(new PollKey(pollKey), function(responseBatch) {
              var poll = responseBatch.Responses[0].Poll;
              renderPoll(poll);
            });
          });
          
          return false;
        }
      });
      
      $poll.find(".slVoteLink, .slResultsLink").click(function(ev) {
        $self.find(".slResults, .slVote").toggle();
        return false;
      });
      
      $self.children(".slPoll").append($poll);
    }
    
    var key = options.keyType == "article" ? new ArticleKey(options.key) : new DiscussionKey(options.key);
  
    sendRequest(new PollPage(key, 10, 1), function(responseBatch) {
      var poll = responseBatch.Responses[0].PollPage.Polls[0];
      renderPoll(poll);
    });
  
    return this;
  };

})(jQuery);

