﻿var VoteValues = { NoVote: 'D', Withhold: 'W', For: 'F', Against: 'N', Abstain: 'A', One: '1', Two: '2', Three: '3' };
var VoteValueClass = { NoVote: 'D', VotedWithhold: 'W', VotedFor: 'F', VotedAgainst: 'N', VotedAbstain: 'A', VotedOne: '1', VotedTwo: '2', VotedThree: '3' };
var VoteForAgainstAbstainEl = $('.ForAgainstAbstain');
var VoteForWithholdEl = $('.ForWithhold');
var VoteForAgainstEl = $('.ForAgainst');
var VoteForAbstainEl = $('.ForAbstain');
var VoteForAgainstWithholdEl = $('.ForAgainstWithhold');
var VoteOneTwoThreeEl = $('.OneTwoThree');
var VoteOneTwoThreeAbstainEl = $('.OneTwoThreeAbstain');

function BallotManager(ballotListingJObj, ballotId, advId, isConfirm) {
    function _ballotError(str) {
        throw "Error when creating a ballot: " + str;
        return null;
    }
    this.OnBallotChange = function () { return 0; };
    var _ballotListing = ballotListingJObj || _ballotError("ballotListing not set");
    var _voteBtns;
    var _VoteBtnsRef = new Array();
    this.VoteBtns = _VoteBtnsRef;
    var _advSelectorsContainers = ballotListingJObj.find('.Advocate');
    var _advSelectors = new Array();
    this.AdvSelectors = _advSelectors;
    this.Model = new BallotDataModel();
    var _t = this;
    if (_ballotListing) {
        _voteBtns = _ballotListing.find('.Editable .VoteBtn');
        _voteBtns.each(function () {
            _VoteBtnsRef.push(new BallotButton($(this), ballotId, $(this).attr("MeasureId")));
        });
        _advSelectorsContainers.each(function () {
            _advSelectors.push(new AdvocateSelector($(this).find('> .AdvBtn'), $(this).find('.AdvocatesDropDown'), $(this).parents('li').find('.AdvocateVote'), 11, _t));
        });
        for (var i = 0; i < _VoteBtnsRef.length; i++) {
            this.Model.Measures.push(new Measure(_VoteBtnsRef[i], _advSelectors[i]));
        }
    }
    this.AlignWithAdvocateById = function (id) {
        var _advVote;
        for (var i = 0; i < _advSelectors.length; i++) {
            _advSelectors[i].SetAdvocateById(id);
            _advVote = _advSelectors[i].GetVoteValue();
            if (_advVote != VoteValues.Withhold) {
                _VoteBtnsRef[i].SetVoteValue(_advVote);
            }
            else {
                _advSelectors[i].SetAdvocateById(0);
            }
        }
        _t.OnBallotChange();
    };
    //highlight current adv rows...
    if (!isConfirm && advId) {
        for (var i = 0; i < _advSelectors.length; i++) {
            currAdv = _advSelectors[i];
            if (currAdv.GetAdvocateId() === advId) {
                currAdv.SetRowAsHighlighted();
            }
        }
    }

    this.AdvId = advId;
    //this returns a count of how many measures arent set by the advocate
    this.GetAdvocatedMeasureCountByAdvocateId = function (advocateId) {
        var count = 0;
        for (var i = 0; i < _advSelectors.length; i++) {
            if (_advSelectors[i].GetAdvocateId() != advocateId) {
                count++;
            }
        }
        return count;
    }


    ///<summary>hide all other measures but the provided advocates</summary>
    this.HideUnAdvocatedMeasuresByAdvocateId = function (advocateId) {
        var hiddenCount = 0;
        for (var i = 0; i < _advSelectors.length; i++) {
            if (_advSelectors[i].GetAdvocateId() != advocateId) {
                _advSelectors[i].BtnEl.parents('li').hide();
                if (++hiddenCount == _advSelectors.length) {
                    _ballotListing.hide();
                    _ballotListing.prevAll('.Hdr').eq(0).hide();
                }
            }
        }
        _t.OnBallotChange();
    };
    this.SetMeasuresToAdvocateById = function (advocateId) {
        for (var i = 0; i < _advSelectors.length; i++) {
            _advSelectors[i].SetAdvocateById(advocateId);
        }
        _t.OnBallotChange();
    }
}
function BallotButton(jqEl, ballotId, measureId) {
    this.BtnEl = jqEl;
    var _voteValue;
    var _voteBtnParent = jqEl.parent();
    this.MeasureId = measureId;
    function _getVoteValue() {
        if (_voteBtnParent.length == 0) alert('doesnt exist');
        for (var v in VoteValueClass) {
            if (_voteBtnParent.eq(0).hasClass(v)) {
                _voteValue = VoteValueClass[v];
                return _voteValue;
            }
        }
    }
    this.GetVoteValue = function () {
        return _voteValue || _getVoteValue();
    };
    var _onVoteChanged = null;
    var __self = this;
    this.OnVoteChanged = function (handler) {
        _onVoteChanged = handler;
    }
    function _setVoteValue(val) {
        _voteValue = val;
        _updateView();
        if (_onVoteChanged != null) {
            _onVoteChanged(__self);
        }
        CompareAndCheckAdvAlignment();
        $(jqEl).text('');
    }
    this.OnVoteChange = function () { };
    this.SetVoteValue = function (val) {
        for (var v in VoteValues) {
            if (val === VoteValues[v]) {
                _setVoteValue(val);
                return;
            }
        }
    };
    function _updateView() {
        for (var v in VoteValueClass) {
            _voteBtnParent.removeClass(v);
            if (_voteValue === VoteValueClass[v]) {
                _voteBtnParent.addClass(v);
            }
        }
    }
    jqEl.click(function () {
        //show vote options with paramsVoteOptionsEl
        HideAllVoteOptions();
        var _voteOpts = VoteForAgainstAbstainEl;
        //var ballotType = jqEl.parents('li').hasClass('proposal') ? "proposal" : (jqEl.parents('li').hasClass('board') ? "board" : null);

        if (jqEl.parents('li').hasClass('ForWithholdType')) {
            _voteOpts = VoteForWithholdEl;
        }
        else if (jqEl.parents('li').hasClass('ForAgainstType')) {
            _voteOpts = VoteForAgainstEl;
        }
        else if (jqEl.parents('li').hasClass('ForAbstainType')) {
            _voteOpts = VoteForAbstainEl;
        }
        else if (jqEl.parents('li').hasClass('ForAgainstWithholdType')) {
            _voteOpts = VoteForAgainstWithholdEl;
        }
        else if (jqEl.parents('li').hasClass('OneTwoThreeType')) {
            _voteOpts = VoteOneTwoThreeEl;
        }
        else if (jqEl.parents('li').hasClass('OneTwoThreeAbstainType')) {
            _voteOpts = VoteOneTwoThreeAbstainEl;
        }

        var _currentPos = jqEl.offset();
        var _btns = _voteOpts.find('a');
        _btns.unbind('click');
        _btns.bind('click', function () {
            var _voteVal = $(this).attr('rel');
            _setVoteValue(_voteVal);
            _voteOpts.hide();
            _btns.unbind('click');
        });
        _voteOpts.css({ top: _currentPos.top, left: _currentPos.left });

        _voteOpts.show();

    });
}

function HideAllVoteOptions() {
    VoteForAbstainEl.hide();
    VoteForAgainstAbstainEl.hide();
    VoteForAgainstEl.hide();
    VoteForAgainstWithholdEl.hide();
    VoteForWithholdEl.hide();
    VoteOneTwoThreeEl.hide();
    VoteOneTwoThreeAbstainEl.hide();
}

function CompareAndCheckAdvAlignment() {
    var userVotes = $('#BallotContainer').find('.Editable .Inner');
    var show = false;
    userVotes.each(function () {
        var advVote = $(this).parents('li').find('.AdvocateVote .Inner');
        for (var v in VoteValueClass) {
            if (VoteValueClass[v] != VoteValueClass.NoVote && advVote.hasClass(v) && !$(this).hasClass(v)) {
                show = true;
            }
        }
    });

    if (show) {
        $('.AlignLower').show();
        $('.LegRight').show();
    }
    else {
        $('.AlignLower').hide();
        $('.LegRight').hide();
    }
}

function AdvocateSelector(btnEl, boxEl, voteEl, measureId, ballot) {
    this.BtnEl = btnEl;
    btnEl.click(function () {
        //opens boxEl
        boxEl.css({ top: btnEl.offset().top, left: btnEl.offset().left });
        $('.AdvocatesDropDown').hide();
        boxEl.show();
        ballot.OnBallotChange();
    });
    var _voteValue = null;
    function _setVote(voteVal) {
        _voteValue = voteVal;
        var voteIcn = voteEl.find('.Inner');
        for (var v in VoteValueClass) {
            voteIcn.removeClass(v);
            if (voteVal === VoteValueClass[v]) {
                voteIcn.addClass(v);
            }
        }
        CompareAndCheckAdvAlignment();
        ballot.OnBallotChange();
    }
    this.SetVote = function (voteVal) {
        _setVote(voteVal);
    };
    this.GetName = function () {
        return btnEl.text();
    };
    this.SetName = function (name) {
        btnEl.text(name);
    };
    boxEl.find('a').bind('click', function () {

        btnEl.html($(this).text());
        _voteValue = $(this).attr('vote');
        _setVote(_voteValue);

        btnEl.attr('vote', _voteValue);
        btnEl.attr('rel', $(this).attr('rel'));
        _setOn();
        boxEl.hide();

        //populate view more...
        var takeText = $(this).attr("Take").length > 0 ? $(this).attr("Take") : null;
        if (takeText) {
            $(this).parents('li').find('.ReadMore').show();
        } else {
            $(this).parents('li').find('.ReadMore').hide();
        }
        var takeTitle = takeText ? $(this).text() + "'s Take" : "";
        var take = $(this).parents('li').find('.Take');
        take.find('h4').text(takeTitle);
        take.find('.TDesc').text(takeText || "");
        ballot.OnBallotChange();
    });
    function _setOn() {
        boxEl.find('a').each(function () {
            if ($(this).text() === btnEl.text()) {
                $(this).addClass("On");
            }
            else $(this).removeClass("On");
        });
        if (ballot.AdvId == btnEl.attr('rel')) {
            btnEl.parents('li').addClass('AdvHL');
        }
        else {
            btnEl.parents('li').removeClass('AdvHL');
        }
        ballot.OnBallotChange();
    }
    _setOn();
    function _getVoteValue() {
        _voteValue = btnEl.attr('Vote');
        return _voteValue;
    }
    this.GetVoteValue = function () {
        if (_voteValue != null) {
            return _voteValue;
        }
        else return _getVoteValue();
    };
    this.SetAdvocateById = function (id) {
        boxEl.find('a').each(function () {
            if ($(this).attr('rel') == id) {
                $(this).click();
            }
        });
    };
    this.GetAdvocateId = function () {
        return btnEl.attr('rel');
    };
    this.SetRowAsHighlighted = function () {
        btnEl.parents('li').addClass('AdvHL');
        ballot.OnBallotChange();
    };
}

function BallotService(ballotId) {

    var proposals = propBallot.Model.MeasuresAsJson();

    var ballotMeasures = new Array();

    var length = proposals.length;
    for (var i = 0; i < length; i++) {
        ballotMeasures.push(proposals[i]);
    }

    var ballot =
    {
        BallotID: ballotId,
        BallotMeasures: ballotMeasures,
        ControlNumber: $('.confirmModal .controlNumber').val()
    };

    $.ajax({
        url: "/Ballot/SaveBallotMeasures",
        data: $.toJSON(ballot),
        dataType: 'json',
        type: 'POST',
        contentType: "application/json; charset=utf-8",
        success: function (result) {
            ValidateResult(result, function () {
                ShowBallotConfirm();
            });
        }
    });
}

function BallotDataModel() {
    this.Measures = new Array();
    this.MeasuresAsJson = function () {
        var arr = [];
        for (var i = 0; i < this.Measures.length; i++) {
            arr.push(this.Measures[i].ToJson());
        }
        return arr;
    };
}

function Measure(voteButton, advocateSelector) {
    this.Id = voteButton.MeasureId;
    this.BallotButton = voteButton;
    this.AdvocateSelector = advocateSelector;
    this.GetAlignedAdvocate = function () {
        if (advocateSelector && advocateSelector.GetVoteValue() === voteButton.GetVoteValue()) {
            return advocateSelector.GetAdvocateId();
        }
        return null;
    };
    this.GetAdvName = function () {
        if (advocateSelector) {
            return advocateSelector.GetName();
        }
        else return null;
    };
    this.GetAdvocateId = function () {
        if (advocateSelector) {
            return advocateSelector.GetAdvocateId();
        }
        else return null;
    };
    this.ToJson = function () {
        return { "BallotMeasureID": this.Id, "Position": this.BallotButton.GetVoteValue(), "AdvocacyID": this.GetAlignedAdvocate() };
    };
}

function BallotLearnMore(el) {
    var take = $(el).parents('li').find('.Take');
    var speed = $('html').hasClass('IE8') ? 0 : 400;
    take.show(speed, typeof redraw === "function" ? redraw : null); //400
    $(el).addClass('On');
}

function BallotHideTake(el) {

    var speed = $('html').hasClass('IE8') ? 0 : 400;
    $(el).parents('.Take').hide(speed, function () {
        if (typeof redraw === "function") {
            redraw();
        }
    });
    $(el).parents('li').find('.ReadMore').removeClass('On');
}
function MapBallotModelToConfirmationBallot(ballotMap) {
    var ballot;
    var confirmBallot;
    var conBallotEl;
    for (var id in ballotMap) {
        ballot = ballotMap[id];

        conBallotEl = $('#' + id);

        confirmBallot = new BallotManager(conBallotEl, 0, null, true);
        for (var i = 0; i < ballot.Model.Measures.length; i++) {

            var measure = ballot.Model.Measures[i];
            var adv = measure.GetAdvName();
            var vote = measure.BallotButton.GetVoteValue();
            var btn;
            var hasPosition = false;
            for (var v in VoteValueClass) {
                btn = $(conBallotEl.find('.VoteBtn')[i]).parent();
                btn.removeClass(v);
                if (vote == VoteValueClass[v]) {
                    btn.addClass(v);
                    hasPosition = true;
                }
            }
            if (!hasPosition) {
                $(conBallotEl.find('.VoteBtn')[i]).text('No Vote');
            }
            var _aa = measure.GetAlignedAdvocate();
            //if the aligned advocate exists... (meaning we changed the measuers user vote against the measures current advocate vote
            if (_aa) {
                $(conBallotEl.find('.Advocate')[i]).text(adv);
            }
            //otherwise they didnt align with anyone...
            else {
                $(conBallotEl.find('.Advocate')[i]).text("None");
            }
        }
    }
}
function GiveSupportToAdvocateForBallots(advId, arrayOfBallots) {
    var i = 0;
    for (i; i < arrayOfBallots.length; i++) {
        arrayOfBallots[i].AlignWithAdvocateById(advId);
        OpenModal(ConfirmBallotModalOptions);
    }
}

function AlignAdvocacy(advocacyId) {

    propBallot.AlignWithAdvocateById(advocacyId);

    OpenModal(ControlNumberModalOptions);
}

