/**************************************************************

	Script		: ajaxPoll
	Version		: 1.0
	Author		: Marc Anthony M. Danting
	E-mail		: surfingtonio@hotmail.com
	Website		: http://surfingtonio.com
	Description	: Renders an online poll in an HTML element.

	Sample Usage:
	
		// unique poll identifier
		id = 1;
	
		// poll question
		question = 'Did you like Sex and the City?';
		
		// poll answers
		answers = ['It was the best movie ever!', 'I liked it', 'It was all right', 'I wasted my time'];
	
		// html element id to hold poll
		el = 'poll';
	
		var poll = {'id':id, 'question':question, 'answers':answers};
		var myAjaxPoll = new ajaxPoll(el, poll);


**************************************************************/

var ajaxPoll = {

	initialize: function(element, poll) {

		if (this.element = $(element)) {
			this.id = poll.id;
			this.question = poll.question;
			this.answers = poll.answers;

			var myAjax = new Ajax('isPollTaken.php', {
				method:'post',
				data:{'id':this.id},
				onComplete: (function(response) {
					server = Json.evaluate(response);
					this.showForm(server.response);
				}).bind(this)
			})
			myAjax.request();
		}

	},

	showForm: function(disabled) {

		this.element.empty();

		var form = new Element('form', {'method':'post', 'action':'castVote.php', 'id':'pollForm'});
		this.form = form;

		var pollQuestion = new Element('h4', {'id':'pollQuestion'});
		pollQuestion.setHTML(this.question);
		pollQuestion.injectInside(this.form);
		
		var pollSubmit = new Element('input', {'type':'submit', 'value':'Vote', 'id':'pollSubmit', 'disabled':'disabled'});
		pollSubmit.addEvent('click', (function(e) {
			this.form.send();
			this.showResults();
		}).bind(this));

		var ul = new Element('ul', {'id':'listAnswers'})
		$each(this.answers, function(label, index) {
			var li = new Element('li', {'class':'rowAnswer'});
			li.injectInside(ul);

			var option = new Element('input', {'type':'radio', 'name':'vote', 'id':'option-'+index, 'value':index});
			if (disabled) option.setProperty('disabled', 'disabled');
			option.injectInside(li);
			option.addEvent('click', function() {
				pollSubmit.removeProperty('disabled');
			});

			var vote = new Element('label', {'for':'option-'+index});
			vote.setHTML(label);
			vote.injectInside(li);
		});
		ul.injectInside(this.form);

		var rowHidden = new Element('div');
		rowHidden.injectInside(this.form);

		var pollId = new Element('input', {'type':'hidden', 'name':'id', 'value':this.id});
		pollId.injectInside(rowHidden);

		var rowSubmit = new Element('div', {'id':'rowSubmit'});
		rowSubmit.injectInside(this.form);
		pollSubmit.injectInside(rowSubmit);

		form.injectInside(this.element);

		var viewResult = new Element('a', {'href':'javascript:void(0)', 'id':'viewResult'});
		viewResult.setHTML('View Results &raquo;');
		viewResult.injectInside(this.element);
		viewResult.addEvent('click', (function() {
			this.showResults();
		}).bind(this));

	},

	submitForm: function() {

		this.form.send({
			method:'post',
			data:{'id':this.id},
			onComplete: (function(response) {
				server = Json.evaluate(response);
				this.showResults();
			}).bind(this)
		});

	},

	showResults: function() {

		this.element.empty();

		var pollQuestion = new Element('h4', {'id':'pollQuestion'});
		pollQuestion.setHTML(this.question);
		pollQuestion.injectInside(this.element);

		var ul = new Element('ul', {'id':'listResults'});
		$each(this.answers, (function(label, index) {

			var li = new Element('li', {'class':'rowResult'});

			var vote = new Element('span', {'class':'result'});
			vote.setHTML(label);
			vote.injectInside(li);

			var myVotes = new Ajax('getVotes.php', {
				method:'post',
				data:{'id':this.id, 'vote':index},
				onComplete: (function(response) {
					server = Json.evaluate(response);

					var votePercentage = new Element('span', {'class':'votePercentage'});
					votePercentage.setHTML(server.percentage.round()+'%');
					votePercentage.injectInside(li);

					var voteCount = new Element('span', {'class':'voteCount'});
					voteCount.setHTML('Votes: '+server.votes);
					voteCount.injectInside(li);
				}).bind(this)
			});
			myVotes.request();
			li.injectInside(ul);
			
		}).bind(this));
		ul.injectInside(this.element);

		var myTotalVotes = new Ajax('getTotalVotes.php', {
			method:'post',
			data:{'id':this.id},
			onComplete: (function(response) {
				server = Json.evaluate(response);

				var rowTotal = new Element('div', {'id':'rowTotal'});
				rowTotal.injectInside(this.element);

				var span = new Element('span');
				span.setHTML('Total: ');
				span.injectInside(rowTotal);

				var votesTotal = new Element('span', {'id':'votesTotal'});
				votesTotal.setHTML(server.total);
				votesTotal.injectInside(rowTotal);

				var pollDisclaimer = new Element('p', {'id':'pollDisclaimer'});
				disclaimer = 'Poll results are not scientific and reflect the opinion of only those users who chose to participate.';
				pollDisclaimer.setHTML(disclaimer);
				pollDisclaimer.injectInside(this.element);

				var myPollTaken = new Ajax('isPollTaken.php', {
					method:'post',
					data:{'id':this.id},
					onComplete: (function(response) {
						server = Json.evaluate(response);
						var takepoll = new Element('a', {'href':'javascript:void(0)', 'id':'takepoll'});
						takepoll.setHTML('&laquo; Back to Poll');
						takepoll.injectInside(this.element);
						takepoll.addEvent('click', (function() {
							this.showForm(server.response);
						}).bind(this));
					}).bind(this)
				})
				myPollTaken.request();

			}).bind(this)
		});
		myTotalVotes.request();

	}

}

ajaxPoll = new Class(ajaxPoll);
ajaxPoll.implement(new Options);


