/**
 * ajaxpoll
 *
 * @author Mike Bosworth
 * @classDescription A common poll implemented to be backwards compatible with existing site specifc polls.
 **/

/* ---[ SETUP NAMESPACE ]--- */
if(typeof(mdp) != 'object'){
	var mdp = new Object();
}

var ajaxPoll = function(_pollId, _maxWidth, options){

    /* ---[ CLASS VARIABLES ]--- */

	/* public */
    this.ID = _pollId;
    this.MAX_WIDTH = (_maxWidth != "") ? _maxWidth : 250;
    this.TOTAL_ANSWERS = 0;
    this.ANIMATE = true;

    /* private */
    var self = this;

    /* ---[ CONSTRUCTOR ]--- */
    this.init = function(){
        debug("init");

        /* initialization code */
        if(options == null){
            options = new Object();
        }
        options.restrict = options.restrict != null ? options.restrict : true;
        options.autoSubmit = options.autoSubmit != null  ? options.autoSubmit  : false;
        options.pageRefresh = options.pageRefresh != null  ? options.pageRefresh  : false;
        options.bypass = options.bypass != null  ? options.bypass : false;
        options.parentElement = options.parentElement != null  ? options.parentElement : "pollwrap";
        options.debug = options.debug != null  ? options.debug : false;
        if (self.ID != "" || self.ID != undefined) {
            RemotePollService.getPoll(self.ID, self.createPoll);
        }
    };

    /* ---[ PUBLIC METHODS ]--- */
    this.createPoll = function(remoteResult) {
        debug("createPoll");
        if (remoteResult.statusCode == 0) {

            options.parentElement = $(options.parentElement);
            var pj = eval('(' + remoteResult.result + ')');
            options.parentElement.setHTML('');

            /* remove the no JS nag */
            var voted = Cookie.get(pj.cookieId);
            var pollName = (typeof(pj.name) == 'undefined') ? "No Title" : pj.name ;
            var pollContentHead = new Element("h2").setHTML(pollName);
            var pollQuestion = (typeof(pj.question) == 'undefined') ? "No Question" : pj.question ;
            var pollContentQuestion = new Element('p', {"class":"bold"}).setHTML(pollQuestion);
            var pollContentWrap = new Element('div', {'id':'pollContent'});

            pollContentQuestion.injectInside(options.parentElement);
            pollContentWrap.injectInside(options.parentElement);

            if (voted == "true") {
                self.ANIMATE = false;
                renderResults(pj);
            } else {
                self.renderForm(pj);
            }
        }
        else{
            alert("Failed To Retreive Poll Results : " + remoteResult.statusMessage);
        }
    };

    this.renderForm = function(pj){
        debug("renderForm");
        var pollContent = $('pollContent');
        pollContent.setHTML("");
        
        /* iterate through the questions */
        for (var i = 0; i < pj.answers.length; i++) {
            var qwrap = new Element('div', {'class':'qwrap','id':'qwrap' + i});
            var queswrap = new Element('div', {'class':'ques'});
            var radwrap = new Element('div', {'class':'radio'});
            var rad = new Element('input', {'type':'radio','name':'poll','class':'radio', 'id':'pq' + i});
            rad.injectInside(radwrap);
            radwrap.injectInside(queswrap);

            var ques = new Element('div', {'class':'questext'}).setHTML(pj.answers[i].answer);
            var clear = new Element('div', {'class':'clearall'});

            clear.injectInside(pollContent);
            qwrap.injectInside(pollContent);
            queswrap.injectInside($('qwrap' + i));
            ques.injectInside($('qwrap' + i));
        }
        new Element('div',{'class':'clearall'}).injectInside(options.parentElement);

        var submitvote = $("submitvote");
        var submit = new Element('a', {
            'href': 'javascript:void(0)',
            'id': 'submitvote',
            'class': 'ML10 MT10'
        }).addEvent("click",function(){
            if(self.submitVote()){
                $("submitvote").remove();
                $("viewresults").remove();
            }
        }).injectInside(options.parentElement);
        new Element('span').setHTML("Vote").injectInside(submit);

        if(options.bypass){
            new Element('a', {
                'href': 'javascript:void(0)',
                'id': 'viewresults',
                'class': 'ML10 MT10'
            }).setHTML("Results").addEvent("click",function(){
                self.handleResults();
                $("submitvote").remove();
                $("viewresults").remove();
            }).injectInside(options.parentElement);
        }
        new Element('div',{'class':'clearall'}).injectInside(options.parentElement);
    };

    this.submitVote = function() {
        debug("submitVote");
        var s = this;
        this._answerId = null;
        this.bhgpollradios = new Array();
        this.inputelements = document.getElementsByTagName("input");

        $ES("input.radio","pollContent").each(function(input,index){
            if(input.checked){
                s._answerId = index;
            }
        });

        if (s._answerId == null) {
            alert("Failed To Submit Poll: Missing Option!");
        } else {
            if(self.ID != ''){
                RemotePollService.castVote(self.ID, s._answerId, self.submitVoteCallback);
                return true;
            }
            else{
                alert("Failed To Submit Poll: Missing Poll Id!");
            }
        }
        return false;
    };

    this.submitVoteCallback = function(remoteResult) {
        debug("submitVoteCallback");
        if (remoteResult.statusCode == 0) {
            self.handleResults();
        }
        else{
            alert("Failed To Submit Vote : " + remoteResult.statusMessage);
        }
    };

    this.handleResults = function(){
        debug("handleResults");
        if (self.ID != "" || self.ID != undefined) {
            var handler;
            if(options.pageRefresh){
                handler = self.pageRefresh;
            }
            else{
                handler = self.displayPollResults;
            }
            RemotePollService.getPoll(self.ID, handler);
        }

    };

    this.pageRefresh = function(remoteResult){
        debug("pageRefresh");
        if (remoteResult.statusCode == 0) {
            var pj = eval('(' + remoteResult.result + ')');
            Cookie.set(pj.cookieId, 'true', '', '/', '', '');
            history.go(0);
        }
        else{
            alert("Failed To Retreive Poll Results : " + remoteResult.statusMessage);
        }
    };

    this.getPollObjectForResults = function() {
        debug("getPollObjectsForResults");
        if (self.ID != "" || self.ID != undefined) {
            console.log(RemotePollService);
            console.log(self.ID);
            console.log(self.displayPollResults);
            RemotePollService.getPoll(self.ID, self.displayPollResults);
        }
        else{
            alert("Failed To Retrieve Poll Results: Poll Id Is Not Specified.");
        }
    };

    this.displayPollResults = function(remoteResult) {
        debug("dispalyPollResults");
        if (remoteResult.statusCode == 0) {
            var pj = eval('(' + remoteResult.result + ')');

            /*set poll cookie*/
            Cookie.set(pj.cookieId, 'true', '', '/', '', '');

            if(pj.answers != null){
                renderResults(pj);
            }
            else{
                alert("Bad Data Returned!");
            }
        }
        else{
            alert("Failed To Retreive Poll Results : " + remoteResult.statusMessage);
        }
    };

    /* ---[ PUBLIC METHODS ]--- */

    function renderResults(pj){
        debug("renderResults");
        $('pollContent').setHTML("");

        for (var i = 0; i < pj.answers.length; i++) {
            self.TOTAL_ANSWERS += parseInt(pj.answers[i].answerCount);
        }

        /* loop through he answers and their questions */
        for (var i = 0; i < pj.answers.length; i++) {
            var ques = new Element('div', {'class':'que','id':'que' + i}).setHTML(pj.answers[i].answer);
            var clear = new Element('div', {'class':'clearall','style':'height:10px;'});
            var barWidth = (Math.round((pj.answers[i].answerCount / self.TOTAL_ANSWERS) * self.MAX_WIDTH));
            var percVote = Math.round((pj.answers[i].answerCount / self.TOTAL_ANSWERS) * 100);

            var bar = new Element('div', {'class':'quebar','id':'quebar' + i,'style':'width:0'}).setHTML(percVote + "%");
            var barwrap = new Element('div', {'class':'barwrap'});
            bar.injectInside(barwrap);

            ques.injectInside($('pollContent'));
            barwrap.injectInside($('que' + i));

            if (self.ANIMATE) {
                var e = $('quebar' + i).effect('width', {duration: 1000});
                e.custom(0, barWidth);
            } else {
                $('quebar' + i).style.width = barWidth + "px";
            }
        }

        if(!options.restrict){
            new Element('br',{'class':'clearall'}).injectInside(options.parentElement);
            var submit = new Element('a', {
                'href': 'javascript:void(0)',
                'id': 'submitvote',
                'class': 'ML10 MT10'
            }).addEvent("click",function(){
                $('submitvote').remove();
                self.renderForm(pj);
            }).injectInside(options.parentElement);
            new Element('span').setHTML("Vote").injectInside(submit);
            new Element('div',{'class':'clearall'}).injectInside(options.parentElement);
        }
    }

    function debug(msg){
        if(options.debug){
            if(typeof(console) == 'object'){
                console.log(msg);
            }
            else{
                alert(msg);
            }
        }
    }

    /* ---[ RUN ]--- */
    this.init();
};