(function($) {
	/**
	 * Set cookie
	 * @return void
	 */
	function setCookie(name, value, ttl) {
	    var exdate = new Date();
	    exdate.setDate(exdate.getDate() + ttl);
	    document.cookie = name + '=' + escape(value) + ((ttl == null) ? '' : ';expires=' + exdate.toGMTString());
	}

	/**
	 * Fetch cookies for this site
	 * @return object
	 */
	function getCookies() {
	    var cookies = document.cookie.split(/\s?;\s?/g);
	    for (var x = 0; x < cookies.length; x++) {
		var temp = cookies[x].split(/=/);
		cookies[temp[0]] = temp[1];
		delete cookies[x];
	    }
	    return cookies;
	}

	/**
	 * Mark radioboxes when clicking on label. Hack for IE6.
	 * @return void
	 */
	function checkRadiobox(evt) {
	    var checkboxes = document.pollVote.getElementsByTagName('input');
	    for (var i = 0; i < checkboxes.length; i++) {
		checkboxes[i].checked = false;
	    }
	    if (evt.target.tagName == 'INPUT' || evt.target.tagName == 'input')
		evt.target.checked = true;
	    else
		evt.target.previousSibling.checked = true;
	}

	/**
	 * Render poll results
	 * @return void
	 */
	function renderResults(response, ioArgs) {
	    var pollId = response.getElementsByTagName('pollId')[0].firstChild.nodeValue;
	    var totalVotes = response.getElementsByTagName('votes')[0].firstChild.nodeValue;
	    var alternatives = response.getElementsByTagName('alt')[0].getElementsByTagName('item');
	    if (response.getElementsByTagName('votedId')[0].firstChild) {
		var votedId = response.getElementsByTagName('votedId')[0].firstChild.nodeValue;
		setCookie('poll_' + pollId, votedId, 30);
	    }
	    for (var i = 0; i < alternatives.length; i++) {
		// Define variables for each list element
		var altId = alternatives[i].getElementsByTagName('id')[0].firstChild.nodeValue;
		if (alternatives[i].getElementsByTagName('percent')[0] != undefined)
		    var percent = alternatives[i].getElementsByTagName('percent')[0].firstChild.nodeValue;
		var caption = alternatives[i].getElementsByTagName('caption')[0].firstChild.nodeValue;
		var votes = alternatives[i].getElementsByTagName('votes')[0].firstChild.nodeValue;
		var obj = document.getElementById('pollAltCont_'+altId);
		var captionDiv = document.createElement('div');
		var captionDivText = document.createTextNode(caption);
		var votesDiv = document.createElement('div');
		var clearDiv = document.createElement('div');
		var votesDivText = document.createTextNode(votes);
		var resultsDiv = document.createElement('div');
		var resultDiv = document.createElement('div');

		clearDiv.className = 'clear';

		captionDiv.className = 'caption';
		captionDiv.appendChild(captionDivText);
		
		votesDiv.className = 'votes';
		votesDiv.appendChild(votesDivText);

		if (votedId && votedId == altId)
		    resultsDiv.className = 'results myVote';
		else
		    resultsDiv.className = 'results';

		if (percent)
		    resultDiv.style.width = percent+'%';
		resultDiv.className = 'result';

		resultsDiv.appendChild(resultDiv);
		// Removes input element in the list
		// Removes label element in the list
		$(obj).find("input,label").remove();
		// Build DOM
		obj.appendChild(captionDiv);
		obj.appendChild(resultsDiv);
		obj.appendChild(votesDiv);
		obj.appendChild(clearDiv);
	    }
	    // Remove form buttons
	    document.pollVote.getElementsByTagName('button')[0].parentNode.removeChild(document.pollVote.getElementsByTagName('button')[0]);
	    document.pollVote.getElementsByTagName('button')[0].parentNode.removeChild(document.pollVote.getElementsByTagName('button')[0]);
	    var totVotesDiv = document.createElement('div');
	    // Add div with total votes
	    totVotesDiv.className = 'totals';
	    totVotesDiv.appendChild(document.createTextNode('Totalt antall stemmer: '+totalVotes));
	    document.pollVote.appendChild(totVotesDiv);
	    // If user clicked on "show results" and cookie isn't set,
	    // add "vote"-button that regenerates HTML for voting
	    var cookies = getCookies();
	    var cookiename = 'poll_' + pollId;
	    if (!votedId && !cookies[cookiename]) {
		var showPollButton = document.createElement('button');
		showPollButton.id = cookiename;
		showPollButton.innerHTML = 'Vis alternativer';
		var parentWrapper = document.pollVote.getElementsByTagName('p')[0];
		parentWrapper.appendChild(showPollButton);
		$(showPollButton).click(renderPoll);
	    }
	}

	/**
	 * Render poll form
	 * @return void
	 */
	function renderPoll(evt) {
	    var obj = document.pollVote;
	    var cookies = getCookies();
	    var ie6det = new RegExp("MSIE 6");
	    var ie7det = new RegExp("MSIE 7");
	    if (evt == undefined)
		var pollId = 'poll_' + obj.getElementsByTagName('input')[0].name.match(/^poll_([0-9]+)$/i)[1];
	    else
		var pollId = evt.target.id;
	    if (cookies[pollId] == undefined) {
		var list = document.createElement('ol');
		var alts = obj.getElementsByTagName('li');
		for (var i = 0; i < alts.length; i++) {
		    var altId = alts[i].id.match(/pollAltCont_([0-9]+)/)[1];
		    var listElem = document.createElement('li');
		    listElem.id = 'pollAltCont_' + altId;
		    var listElemLabel = document.createElement('label');
		    var listElemLabelInput = document.createElement('input');
		    listElemLabelInput.type = 'radio';
		    listElemLabelInput.name = pollId;
		    listElemLabelInput.id = 'pollAlt_' + altId;
		    listElemLabelInput.value = altId;
		    var listElemLabelSpan = document.createElement('span');
		    if (evt == undefined)
			var listElemLabelSpanText = alts[i].getElementsByTagName('span')[0].firstChild.nodeValue;
		    else
			var listElemLabelSpanText = alts[i].getElementsByTagName('div')[0].firstChild.nodeValue;
		    // Append DOM nodes
		    listElemLabelSpan.appendChild(document.createTextNode(listElemLabelSpanText));
		    listElemLabel.appendChild(listElemLabelInput);
		    listElemLabel.appendChild(listElemLabelSpan);
		    listElem.appendChild(listElemLabel);
		    list.appendChild(listElem);
		    if (ie6det.test(navigator.userAgent) || ie7det.test(navigator.userAgent))
			$(listElemLabel).bind('click', checkRadiobox);
		}
		var paragraph = document.createElement('p');
		paragraph.className = 'submit';
		var paragraphVoteButton = document.createElement('button');
		paragraphVoteButton.id = 'pollVoteButton';
		paragraphVoteButton.appendChild(document.createTextNode('Stem'));
		var paragraphResultButton = document.createElement('button');
		paragraphResultButton.id = 'pollResultButton';
		paragraphResultButton.appendChild(document.createTextNode('Vis resultat'));
		paragraph.appendChild(paragraphVoteButton);
		paragraph.appendChild(paragraphResultButton);
		obj.removeChild(obj.getElementsByTagName('ol')[0]);
		obj.removeChild(obj.getElementsByTagName('p')[0]);
		obj.innerHTML = '';
		obj.appendChild(list);
		obj.appendChild(paragraph);
	    }
	}

	/**
	 * Vote
	 * @return void
	 */
	function pollVote(evt) {
	    evt.preventDefault();
	    var pollId = document.getElementById('pollAlt_1').name;
	    if (evt.target.id == 'pollVoteButton') {
		var alts = document.getElementById('poll').getElementsByTagName('input');
		for (var i = 0; i < alts.length; i++) {
		    if (alts[i].checked)
			var altId = alts[i].value;
		}
	    }
	    else if (evt.target.id == 'pollResultButton')
		var altId = 0;
	    jQuery.ajax({
		type: 'post',
		url: "?module=TekPoll&service=results",
		data: {
		    'pollId': pollId,
		    'altId': altId
		},
		timeout: 7000,
		success: renderResults,
		dataType: "xml"
	    });
	}

	/**
	 * Initiate the poll. Check if cookie for poll exists, and if so, render results instead of vote form.
	 * @return void
	 */
	function initPoll() {
	    if (document.pollVote != undefined) {
		var poll = document.pollVote;
		var inputs = poll.getElementsByTagName('input');
		if (inputs.length > 0)
		    var pollId = poll.getElementsByTagName('input')[0].name.match(/^poll_([0-9]+)$/i)[1];
		var cookies = getCookies();
		if (pollId && cookies['poll_' + pollId]) {
		    jQuery.ajax({
			type: 'post',
			url: "?module=TekPoll&service=results",
			data: {
			    'pollId': pollId,
			    'altId': 0
			},
			timeout: 7000,
			success: renderResults,
			dataType: "xml"
		    });
		}
		else {
		    renderPoll();
		    var submitButton = document.pollVote.getElementsByTagName('button')[0];
		    var resultButton = document.pollVote.getElementsByTagName('button')[1];

		    $(submitButton).bind('click', pollVote);
		    $(resultButton).bind('click', pollVote);
		}
	    }
	}

	jQuery(document).ready(initPoll);
})(jQuery);

