/**
 * 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
        obj.getElementsByTagName('input')[0].parentNode.removeChild(obj.getElementsByTagName('input')[0]);
        // Removes label element in the list
        obj.removeChild(obj.getElementsByTagName('label')[0]);
        // 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);
        dojo.connect(showPollButton, 'onclick', 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))
                dojo.connect(listElemLabel, 'onclick', 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);
        dojo.connect(paragraphVoteButton, 'onclick', pollVote);
        dojo.connect(paragraphResultButton, 'onclick', pollVote);
    }
}

/**
 * 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;
    dojo.xhrPost({
        url: "?module=TekPoll&service=results",
        content: {
            'pollId': pollId,
            'altId': altId
        },
        timeout: 7000,
        handle: renderResults,
        handleAs: "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]) {
            dojo.xhrPost({
                url: "?module=TekPoll&service=results",
                content: {
                    'pollId': pollId,
                    'altId': 0
                },
                timeout: 7000,
                handle: renderResults,
                handleAs: "xml"
            });
        }
        else {
            renderPoll();
            var submitButton = document.pollVote.getElementsByTagName('button')[0];
            var resultButton = document.pollVote.getElementsByTagName('button')[1];

            dojo.connect(submitButton, 'onclick', pollVote);
            dojo.connect(resultButton, 'onclick', pollVote);
        }
    }
}

dojo.addOnLoad(initPoll);
