var readerPollComponents = new Array(); 

function ReaderPollComponent(key, submissionUrl) {
  this.key = key;
  this.resultsDivId = this.key + "_resultsDiv";
  this.inputDivId = this.key + "_inputDiv";
  this.voteButtonId = this.key + "_voteButton";
  this.switchToInputDivId = this.key + "_switchToInputDiv";
  this.submissionUrl = submissionUrl;
  readerPollComponents[this.key] = this;

  this.disableVoteButtons = function() {
    this.getVoteButton().disabled = true;
	var inputs = document.forms[this.key + "_form"].elements;
    for (var i = 0; i < inputs.length; i++) {
      inputs[i].disabled = true;
    }
  }

  this.getInputDiv = function() {
    return document.getElementById(this.inputDivId);
  }

  this.getResultsDiv = function() {
    return document.getElementById(this.resultsDivId);
  }
  
  this.getVoteButton = function() {
    return document.getElementById(this.voteButtonId);
  }
  
  this.getSwitchToInputDiv = function() {
    return document.getElementById(this.switchToInputDivId);
  }
  
  this.showResults = function() {
  	this.getInputDiv().style.display = 'none';
  	this.getResultsDiv().style.display = '';
  }
  
  this.showInput = function() {
  	this.getResultsDiv().style.display = 'none';
  	this.getInputDiv().style.display = '';
  }

  this.onRadioClick = function(candidateId, radioInputElement) {
    this.getVoteButton().disabled = false;
  }
  
  this.onSubmissionSuccess = function(candidateId, xmlDoc) {
    // update the results in place
    this.updateFromXml(xmlDoc);

    // hide the 'cast a vote' link for good.
    this.getSwitchToInputDiv().style.visibility = "hidden";

    // unhide the results
    this.showResults();
  }

  this.onSubmit = function() {
	var savingComponent = this;
	var candidateId = null;
	var inputs = document.forms[this.key + "_form"].elements;
	this.disableVoteButtons();
	for (var i = 0; i < inputs.length; i++) {
		var input = inputs[i];
		if (typeof input.checked != "undefined" && input.checked) {
			candidateId = input.value;
		}
	}
	if (candidateId) {
		function handleSubmission(xmlDoc, text) {
			var success = false;
			var message = "error, recieved: " + text;
			if (xmlDoc.documentElement.getElementsByTagName("Success").length > 0) {
			    success = true;
			}
			if (success) {
				savingComponent.onSubmissionSuccess(candidateId, xmlDoc);
			}
			else {
				var errorElements = xmlDoc.documentElement.getElementsByTagName("Error"); 
				if (errorElements.length > 0) {
					message = "Error: " + errorElements[0].getAttribute("message");
				}
				alert(message);
			}
		}

		var req = new AjaxRequest(this.submissionUrl, handleSubmission);
		req.setParameter('submittedCandidateId', candidateId);
		req.submit();
	}
  }
  
  this.updateCandidateResults = function(candidateId, voteCount, votePercentage, votedForByUser) {
  	// Note: this is very specific to the current rendering/layout.
  	liElement = document.getElementById(this.key + "_candidateDiv_" + candidateId);
  	if (liElement != null) {
  	  var elements = ( liElement.children ? liElement.children : liElement.childNodes);
      for (var i = 0; i < elements.length; i++) {
        var element = elements[i];
        if (element.name == "voteCount") {
          element.innerHTML = voteCount;
        }
        else if (element.name == "votePercentage") {
          element.innerHTML = votePercentage;
        }
  	    else if (element.className == "ReaderPollPercentageBar") {
  	      element.title = "";
          element.style.width = votePercentage + "%";
        }
      }
  	  if (votedForByUser) {
        liElement.className = liElement.className + " ReaderPollVotedCandidateResult";
  	  }
  	}
  	else {
  	  alert("Could not find element for " + candidateId + ".");
  	}
  }

  this.updateFromXml = function(xmlDoc) {
    var voteElements = xmlDoc.documentElement.getElementsByTagName("Vote");
    var voteElement = voteElements.length > 0 ? voteElements[0] : null;
    var votedForCandidateId = null;
    if (voteElement != null) {
    	votedForCandidateId = voteElement.getAttribute("candidateId");
    }  
  	var candidateElements = xmlDoc.documentElement.getElementsByTagName("Candidate");
  	for (var i = 0; i < candidateElements.length; i++) {
  	  var candidateElement = candidateElements[i];
  	  var candidateId = candidateElement.getAttribute("id");
  	  var voteCount = candidateElement.getAttribute("voteCount");
  	  var votePercentage = candidateElement.getAttribute("votePercentage");
  	  this.updateCandidateResults(candidateId, voteCount, votePercentage, candidateId == votedForCandidateId);
  	}
  	var totalVoteCount = xmlDoc.documentElement.getElementsByTagName("Candidates")[0].getAttribute("totalVoteCount");
  	this.updateResultsTotal(totalVoteCount);
  }
  
  this.updateResultsTotal = function(totalVoteCount) {
    document.getElementById(this.key + "_totalVoteCount").innerHTML = totalVoteCount;
  } 
}

