﻿(function ($) {
    SexualMileage = {
        Settings: {
            NoOfPartnersSelect: '#noOfPartners'
            , YourAgeSelect: '#yourAge'
            , WhichSex: '#whichSex'
            , ChooseSexSelector: '.chooseSex'
            , GenderSelect: '#gm, #gf'
            , SelectCell: '.selectCell'
            , PartnersTable: '.partnersTable'
            , MaleSelect: '#gm'
            , FemaleSelect: '#fm'
            , Summary: '#summary'
            , GenderLabel: '.gender'
            , GenderThirdLabel: '.genderThird'
            , GenderSingLabel: '.genderSing'
            , Number: '.num'
            , Age: '.age'
            , Label: '.label'
            , CalculateButton: '.bntIndirectPartners'
            , GenderSelector: 'input[name="yesno"]'
            , Hidden: {
                Gender: '#ctl00_ContentPlaceHolder_hidden_gender'
                , Age: '#ctl00_ContentPlaceHolder_hidden_age'
                , Direct: '#ctl00_ContentPlaceHolder_hidden_direct'
                , Indirect: '#ctl00_ContentPlaceHolder_hidden_indirect'
                , Sum: '#ctl00_ContentPlaceHolder_hidden_sum'
                , SumThree: '#ctl00_ContentPlaceHolder_hidden_sumThreeDegrees'
            }
        }
        , Templates: { 
            ChooseSexId: '#chooseSexTmpl'
            , TableMarkupId: '#tableTmpl'
            , GenderRowCopyId: '#GenderTempl'
            , HowOldSingleSexId: '#howOldSingleSex'
            , HowOldBothSexId: '#howOldBothSex'
            , ChooseSex: null
            , HowOldBothSex: null
            , GenderRowCopy: null
            , HowOldSingleSex: null
            , TableMarkup: null
        }
        , Data: {
            ListOfAge: new Array()
            , AvgPartnersMale: new Array()
            , AvgPartnersFemale: new Array()
            , CurrentGender: 'male'
            , SingleSex: true
        }
        , CreateData: function () {
            var data = this.Data;
            data.ListOfAge[0] = "16 - 17"; data.ListOfAge[1] = "18 - 19"; data.ListOfAge[2] = "20 - 22"; data.ListOfAge[3] = "23 - 25";
            data.ListOfAge[4] = "26 - 28"; data.ListOfAge[5] = "29 - 31"; data.ListOfAge[6] = "32 - 35"; data.ListOfAge[7] = "36 - 39";
            data.ListOfAge[8] = "40 - 44"; data.ListOfAge[9] = "45 - 49"; data.ListOfAge[10] = "50 - 54"; data.ListOfAge[11] = "55 - 59";
            data.ListOfAge[12] = "60 - 64"; data.ListOfAge[13] = "65 - 69"; data.ListOfAge[14] = "70 - 74"; data.ListOfAge[15] = "75+";

            data.AvgPartnersMale[0] = 4.0; data.AvgPartnersMale[1] = 4.4; data.AvgPartnersMale[2] = 5.6; data.AvgPartnersMale[3] = 6.9;
            data.AvgPartnersMale[4] = 9.7; data.AvgPartnersMale[5] = 10.1; data.AvgPartnersMale[6] = 10.3; data.AvgPartnersMale[7] = 11.5;
            data.AvgPartnersMale[8] = 10.5; data.AvgPartnersMale[9] = 11.6; data.AvgPartnersMale[10] = 9.8; data.AvgPartnersMale[11] = 9.9;
            data.AvgPartnersMale[12] = 8.9; data.AvgPartnersMale[13] = 7.1; data.AvgPartnersMale[14] = 6.6; data.AvgPartnersMale[15] = 6.8;

            data.AvgPartnersFemale[0] = 1.8; data.AvgPartnersFemale[1] = 2.7; data.AvgPartnersFemale[2] = 4.6; data.AvgPartnersFemale[3] = 7.5;
            data.AvgPartnersFemale[4] = 7.5; data.AvgPartnersFemale[5] = 8.5; data.AvgPartnersFemale[6] = 9.7; data.AvgPartnersFemale[7] = 7.6;
            data.AvgPartnersFemale[8] = 7.2; data.AvgPartnersFemale[9] = 6.6; data.AvgPartnersFemale[10] = 6.6; data.AvgPartnersFemale[11] = 6.3;
            data.AvgPartnersFemale[12] = 5.0; data.AvgPartnersFemale[13] = 4.5; data.AvgPartnersFemale[14] = 3.7; data.AvgPartnersFemale[15] = 4.9;
        }
        , Toggle: function (id, state, speed) {
            if (state == 'hide') {
                $(id).hide(speed);
            } else {
                $(id).show(speed);
            }
        }
        , ClearTable: function (table, other) {
            var me = this;

            var $oldTable = $(table);
            var $newTable = $(me.Templates.TableMarkup);

            var c = $oldTable.attr('class');
            var id = $oldTable.attr('id');
            $oldTable.before($newTable);
            $oldTable.remove();
            $newTable.attr('class', c);
            $newTable.attr('id', id);

            $(me.Settings.MaleSelect).attr('checked', me.Data.CurrentGender == 'male' ? 'checked' : '');
            $(me.Settings.FemaleSelect).attr('checked', me.Data.CurrentGender == 'female' ? 'checked' : '');
            $(me.Settings.NoOfPartnersSelect).val('0');
            for (var i = 2; i < 50; i++) {
                $(me.Settings.NoOfPartnersSelect).append('<option value="' + i + '">' + i + '</option>');
            }
            $(me.Settings.NoOfPartnersSelect).append('<option value="Over 50">Over 50</option>');
            me.BindEvents();
        }
        , SelectGender: function ($s, e) {
            var me = this;
            if ($s.val() == 'm') {
                me.Data.CurrentGender = 'male';
            } else {
                me.Data.CurrentGender = 'female';
            }
            me.UpdateGender();
            me.BindEvents();
        }
        , UpdateGender: function () {
            var me = this;

            var $gender = $(me.Settings.GenderLabel);
            if ($gender.length > 0) {
                $gender.html(me.Data.CurrentGender == 'male' ? "women" : "men");
            };

            if (me.Data.SingleSex == true) {
                var i = 0;
                $(me.Settings.Age).each(function () {
                    var $row = $(this);
                    var $label = $(me.Settings.Label, $(this));

                    $label.html($(me.Settings.Label, $(me.Templates.HowOldSingleSex)).html());
                    $label.html($(me.Settings.Label, $(me.Templates.HowOldSingleSex)).html());
                    $(me.Settings.Number, $label).html(i + 1);
                    $(me.Settings.ChooseSexSelector, $row).remove();
                    i++;
                });
            } else {
                var count = $(me.Settings.Age, $(me.Settings.PartnersTable)).length;
                var i = 0;
                $(me.Settings.Age).each(function () {

                    var $label = $(me.Settings.Label, $(this));
                    $label.html($(me.Settings.Label, $(me.Templates.HowOldBothSex)).html());
                    $(me.Settings.Number, $label).html(i + 1);
                    var $row = $(me.Settings.SelectCell, $(this));

                    if ($(me.Settings.ChooseSexSelector, $row).length == 0) {
                        // if no radio button exist then add one.
                        var $chooseSex = $(me.Templates.ChooseSex);
                        $row.append($chooseSex);
                    }

                    // Update the names and Ids for the radio lists
                    $('.malePartner', $(this)).attr('id', 'maleRadio' + (i + 1));
                    $('.malePartner', $(this)).attr('name', 'malefemale' + (i + 1));
                    $('.femalePartner', $(this)).attr('id', 'femaleRadio' + (i + 1));
                    $('.femalePartner', $(this)).attr('name', 'malefemale' + (i + 1));
                    $('.malePartnerLabel', $(this)).attr('for', 'maleRadio' + (i + 1));
                    $('.femalePartnerLabel', $(this)).attr('for', 'femaleRadio' + (i + 1));
                    i++;
                });
            }

            var $genderThird = $(me.Settings.GenderThirdLabel);
            if ($genderThird.length > 0) {
                $genderThird.html(me.Data.CurrentGender == 'male' ? "her" : "him");
            };

            var $genderSingle = $(me.Settings.GenderSingLabel);
            if ($genderSingle.length > 0) {
                $genderSingle.html(me.Data.CurrentGender == 'male' ? "Woman" : "Man");
            };

            me.BindEvents();
        }
        , SelectPartners: function ($s, e) {
            var me = this;

            if ($s.val() == '0') {
                me.ClearTable(me.Settings.PartnersTable);
                return;
            } else if ($s.val() == 'Over 50') {
                me.ClearTable(me.Settings.PartnersTable);
                $("#summary").html("<h3>We are unable to perform this calculation.</h3>");
                $.scrollTo("#summaryBottom", 250);
                me.Toggle("#summary", "show", "slow");
            } else {

                if ($(me.Settings.WhichSex).length == 0) {
                    $(me.Settings.PartnersTable + ' tr:last').after($(me.Templates.GenderRowCopy));
                    me.UpdateGender();
                    return;
                }

                if ($('input[name="yesno"]:checked').length == 0) {
                    // Do not add rows if single sex has not been selected
                    return;
                }

                var count = parseInt($s.val());
                var currentCount = $(me.Settings.Age, $(me.Settings.PartnersTable)).length;

                if (currentCount > count) {
                    while (currentCount > count) {
                        $(me.Settings.Age + ':last', $(me.Settings.PartnersTable)).remove();
                        currentCount = $(me.Settings.Age, $(me.Settings.PartnersTable)).length;
                    }
                } else if (currentCount == count) {

                }
                else {
                    for (var i = currentCount; i < count; i++) {

                        var $newRow = null;

                        if (me.Data.SingleSex === true) {
                            $newRow = $(me.Templates.HowOldSingleSex);
                        } else {
                            $newRow = $(me.Templates.HowOldBothSex);
                        }
                        $('.personSelect', $newRow).attr('id', 'person' + (i + 1));
                        $('.personSelect', $newRow).attr('name', 'person' + (i + 1));
                        $(me.Settings.Number, $newRow).html(i + 1);
                        $(me.Settings.PartnersTable + ' tr:last').after($newRow);
                    }
                }
            }
            me.UpdateGender();
        }
        , SelectPartnerGender: function ($s, e) {
            //e.preventDefault();
            var me = this;

            me.Data.SingleSex = $s.val() === 'yes' ? true : false;
            me.SelectPartners($(me.Settings.NoOfPartnersSelect), null);
            me.UpdateGender();
        }
        , CalculateDirectSexualPartners: function (range, sex) {
            var me = this;
            if (me.Data.SingleSex === true) {
                if (me.Data.CurrentGender === 'male') {
                    return me.Data.AvgPartnersFemale[range] * 1;
                } else {
                    return me.Data.AvgPartnersMale[range] * 1;
                }
            } else {
                if (sex === 'male') {
                    return me.Data.AvgPartnersMale[range] * 1;
                } else {
                    return me.Data.AvgPartnersFemale[range] * 1;
                }
            }
        }
        , CalculateIndirectSexualPartners: function (range, sex) {
            // Six degrees of separation
            var me = this;
            var personsSleptWithDirectly = me.CalculateDirectSexualPartners(range, sex);
            var personsSleptWithIndirectly = ((((((((personsSleptWithDirectly - 1) * personsSleptWithDirectly) * personsSleptWithDirectly) * personsSleptWithDirectly) * personsSleptWithDirectly) * personsSleptWithDirectly) + (1 * 1)));
            return personsSleptWithIndirectly;
        }
        , CalculateIndirectSexualPartnersThreeDegrees: function (range, sex) {
            // Three degrees of separation
            var me = this;
            var personsSleptWithDirectly = me.CalculateDirectSexualPartners(range, sex);
            var personsSleptWithIndirectly = (((personsSleptWithDirectly - 1) * personsSleptWithDirectly) * personsSleptWithDirectly) + (1 * 1);
            return personsSleptWithIndirectly;
        }
        , DisplayError: function (error) {
            alert(error);
        }
        , Validate: function () {
            var me = this;
            var result = true;

            if ($('input[name="gender"]:checked').length === 0) {
                me.DisplayError('Please select your gender');
                return false;
            }

            if ($(me.Settings.GenderSelector + ':checked').length === 0) {
                me.DisplayError('Please choose whether all your partners were of a single sex');
                return false;
            }

            if (me.Data.SingleSex !== true) {
                var $ages = $(me.Settings.Age, me.Settings.PartnersTable);
                // Check that all of the sex have been checked.
                var index = 1;
                var msg = '';
                $ages.each(function () {
                    var name = $('.chooseSex input', $(this)).attr('name');
                    var checked = $('.chooseSex input[name="' + name + '"]:checked').length;
                    if (checked !== 1) {
                        msg += '#' + index + ', ';
                    }
                    index++;
                });

                // Alert if there are some missing.
                if (msg.length > 0) {
                    msg = 'Please choose gender for all your sexual partners. \n Gender hasn\'t been selected for the following Persons: ' + msg.substr(0, msg.length - 2);
                    me.DisplayError(msg);
                    return false;
                }
            }
            return result;
        }
        , Calcuate: function ($s, e) {
            // Uncomment to test JS
            //e.preventDefault();
            var me = this;
            var sum = 0; var sumThreeDegrees = 0; var success = true;

            $(me.Settings.Hidden.Gender).val(me.Data.CurrentGender);
            $(me.Settings.Hidden.Age).val($(me.Settings.YourAgeSelect).val());
            if ($(me.Settings.NoOfPartnersSelect).val() == 0) {
                $(me.Settings.Hidden.Sum).val(0);
                $(me.Settings.Hidden.Direct).val(0);
                $(me.Settings.Hidden.Indirect).val(0);
            }

            if ($(me.Settings.NoOfPartnersSelect).val() == "Over 50") {
                return false;
            }
            else {
                if (me.Validate() !== true) {
                    return false;
                }

                var $ages = $(me.Settings.Age, me.Settings.PartnersTable);
                $ages.each(function () {
                    if (me.Data.SingleSex === true) {
                        sum += me.CalculateIndirectSexualPartners($('.personSelect', $(this)).attr('selectedIndex'));
                        sumThreeDegrees += me.CalculateIndirectSexualPartnersThreeDegrees($('.personSelect', $(this)).attr('selectedIndex'));
                    } else {
                        var name = $('.chooseSex input', $(this)).attr('name');
                        var checked = $('.chooseSex input[name="' + name + '"]:checked').val();
                        sum += me.CalculateIndirectSexualPartners($('.personSelect', $(this)).attr('selectedIndex'), checked);
                        sumThreeDegrees += me.CalculateIndirectSexualPartnersThreeDegrees($('.personSelect', $(this)).attr('selectedIndex'), checked);
                    }
                });
            }

            if (sum > 0) {
                sum = Math.round(parseFloat(sum));
                sumThreeDegrees = Math.round(parseFloat(sumThreeDegrees));
                $(me.Settings.Hidden.Direct).val($(me.Settings.NoOfPartnersSelect).val());
                $(me.Settings.Hidden.Indirect).val(sum);
                sum = sum * 1 + $(me.Settings.NoOfPartnersSelect).val() * 1;
                $(me.Settings.Hidden.Sum).val(sum);
                $(me.Settings.Hidden.SumThree).val(sumThreeDegrees);
            }
            return success;
        }
        , BindEvents: function () {
            var me = this;
            $(me.Settings.GenderSelect).unbind().click(function (e) { me.SelectGender($(this), e); });
            $(me.Settings.NoOfPartnersSelect).unbind().change(function (e) { me.SelectPartners($(this), e); });
            $(me.Settings.GenderSelector).unbind().change(function (e) { me.SelectPartnerGender($(this), e); });
            if ($.browser.msie) {
                $(me.Settings.GenderSelector).click(function (e) { me.SelectPartnerGender($(this), e); });
            }
            $(me.Settings.CalculateButton).unbind().click(function (e) { return me.Calcuate($(this), e); });
        }
        , Init: function () {
            var me = this;

            // Load Templates, rather than store HTML here
            me.Templates.ChooseSex = $(me.Templates.ChooseSexId).html();
            me.Templates.TableMarkup = $(me.Templates.TableMarkupId).html();
            me.Templates.GenderRowCopy = $(me.Templates.GenderRowCopyId).html();
            me.Templates.HowOldSingleSex = $(me.Templates.HowOldSingleSexId).html();
            me.Templates.HowOldBothSex = $(me.Templates.HowOldSingleSexId).html();

            me.CreateData();
            me.BindEvents();
        }
    };

})(jQuery);


$(function() {
    SexualMileage.Init();
 });
