﻿var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-19239215-1']);

(function () {
    var ga = document.createElement('script');
    ga.type = 'text/javascript';
    ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(ga, s);
})();

var SkillsEval = {
    Infrastructure: {
        ValidateEmail: function (e) {
            var filter = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
            return String(e).search(filter) != -1;
        },
        Validation: {
            Validate: function (AreaSelector) {
                var elements = AreaSelector.find('[skrequired]');
                var enumerable = Enumerable.From(elements.get())
                    .Where(function (item) {
                        return $sk(item).val() == null || $sk(item).val() == ""
                    });
                elements.removeClass('ValidationError');
                enumerable.ForEach(function (item) {
                    $sk(item).addClass('ValidationError');
                });
                if (enumerable.Any()) {
                    SkillsEval.Infrastructure.Popups.OpenPopup($sk('#GenericMissingRequiredFieldsPopup'));
                }
                return !enumerable.Any();
            }
        },
        Popups: {
            Initialise: function () {
                $sk('#Overlay').height($sk(document).height());

                $sk('.Popup').each(function () {
                    var CloseImage =
                            '<div class="PopupCloseButtonArea FloatRight">'
                            + '<a style="vertical-align:middle;" href="#" class="PopupCloseButton"><img style="vertical-align:middle;" src="';
                    if ($sk(this).hasClass('OkPopup')) {
                        CloseImage += 'Content/Master/CloseOkButton.png"></img> <span style="vertical-align:middle;" class="PopupHeader">Fermer</span></a>';
                    }
                    else {
                        CloseImage += 'Content/Master/CloseWarningButton.png"></img></a>';
                    }
                    CloseImage += '<br class="ClearBoth" />'
                            + '</div>'
                            + '<br class="ClearBoth" />';
                    if (!$sk(this).hasClass('Noclose')) {
                        $sk(this).prepend(CloseImage);
                    }
                });

                SkillsEval.Infrastructure.Popups.ResizePopups();

                $sk(window).resize(function () {
                    SkillsEval.Infrastructure.Popups.ResizePopups();
                })
            },
            ResizePopups: function () {
                var height = $sk(window).height();
                var width = $sk(window).width();
                $sk('#Overlay').height($sk(document).height());
                $sk('.Popup').each(function () {
                    $sk(this).css({
                        'left': (width - $sk(this).width()) / 2,
                        'top': (height - $sk(this).height()) / 2
                    });
                });
            },
            OpenPopup: function (Selector) {
                $sk('#Overlay').show();
                Selector
                    .find('.PopupCloseButton')
                    .click(function (event) {
                        event.preventDefault();
                        SkillsEval.Infrastructure.Popups.ClosePopup(Selector);
                    });
                Selector.show();
                SkillsEval.Infrastructure.Popups.ResizePopups();
            },
            ClosePopup: function (Selector) {
                Selector
                    .find('.PopupCloseButton')
                    .unbind('click');
                $sk('#Overlay').hide();
                Selector.hide();
            }
        },
        ServiceUrl: "/SkillsEvalService.svc/",
        ServiceCall: function (methodName, data, onSuccess, onError) {
            var FullMethodPath = SkillsEval.Infrastructure.ServiceUrl + methodName;
            $sk.ajax({
                type: 'POST',
                data: data,
                url: FullMethodPath,
                contentType: "application/json",
                success: function (data, textStatus, jqXHR) {
                    onSuccess(data);
                },
                error: function (jqXHR, textStatus, errorThrown) {
                    if (typeof onError != "undefined") {
                        onError(FullMethodPath, textStatus, errorThrown);
                    }
                },
                dataType: "json"
            });
        },
        // Takes a url parameter name and returns the value if found
        GetUrlParam: function (name) {
            name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regexS = "[\\?&]" + name + "=([^&#]*)";
            var regex = new RegExp(regexS);
            var results = regex.exec(window.location.href);
            if (results == null)
                return null;
            else
                return results[1];
        },
        InsertSingleUrlParam: function (key, value) {
            key = escape(key);
            value = escape(value);
            var kvp = key + "=" + value;
            window.location.search = "?" + kvp;
        }
    },
    CommonData: {
        Culture: "fr-FR",
        HasUserJustLoggedOn: ko.observable(),
        IsUserLoggedOn: ko.observable(),
        userId: ko.observable(),
        IsEvaluationPage: ko.observable(),
        IsAccountPage: ko.observable(),
        ReferentialData: ko.mapping.fromJS(
        {
            Civilities: [],
            ActivitySectors: [],
            CompanySizes: []
        })
    },
    Initialise: function () {

        // Initialise CommonData from injected values
        SkillsEval.CommonData.IsUserLoggedOn(eval(LoginInfo.IsLogedIn));
        if (SkillsEval.CommonData.IsUserLoggedOn()) {
            SkillsEval.CommonData.userId(LoginInfo.UserId);
        }
        else {
            SkillsEval.CommonData.userId(LoginInfo.TmpUserId);
        }
        SkillsEval.CommonData.HasUserJustLoggedOn(eval(LoginInfo.JustLoggedOn));

        $sk('.MainLoginPassword,.MainLoginUserName').keyup(function (e) {
            if ((e.keyCode || e.which) == 13) {
                eval($sk('.MainLoginBtn').attr('href').replace("javascript:", ""));
            }
        });

        // Initialise Popups
        SkillsEval.Infrastructure.Popups.Initialise();

        // warning popup if login failed
        if (typeof (LoginFailedInfo) !== 'undefined') {
            SkillsEval.Infrastructure.Popups.OpenPopup($sk('#LoginFailedPopup'));
        }

        $sk('.ForgotPasswordLink').click(function (event) {
            event.preventDefault();
            SkillsEval.Infrastructure.Popups.OpenPopup($sk('#ForgotPasswordPopup'));
        });

        $sk('#PasswordResetButton').click(function (event) {
            event.preventDefault();
            var userName = $sk('#PasswordResetEmailAdress').val();
            SkillsEval.Infrastructure.ServiceCall(
                "ResetPassword",
                JSON.stringify({ UserName: userName }),
                function () {
                    SkillsEval.Infrastructure.Popups.ClosePopup($sk('#ForgotPasswordPopup'));
                    SkillsEval.Infrastructure.Popups.OpenPopup($sk('#ForgotPasswordEmailSentPopup'));
                });
        });

        var InitialiseFunction = function () {
            SkillsEval.Infrastructure.ServiceCall(
                "GetReferentialData",
                JSON.stringify({ Culture: SkillsEval.CommonData.Culture }),
                function (data) {
                    ko.mapping.updateFromJS(SkillsEval.CommonData.ReferentialData, data);
                    // Evaluate wich parts of the code should be run depending on which controls are on the page
                    if (!(typeof EvaluationControlRunning === 'undefined')) {
                        SkillsEval.Evaluation.Initialise();
                    }
                    if (!(typeof AccountControlRunning === 'undefined')) {
                        SkillsEval.Account.Initialise();
                    }
                    if (!(typeof CreateAccountControlRunning === 'undefined')) {
                        SkillsEval.CreateAccount.Initialise();
                    }
                });
        };

        if (SkillsEval.CommonData.HasUserJustLoggedOn()) {
            SkillsEval.Infrastructure.ServiceCall(
                "MigrateUserId",
                JSON.stringify({ PreviousUserId: LoginInfo.TmpUserId, UserId: SkillsEval.CommonData.userId() }),
                function (newId) {
                    InitialiseFunction();
                });
        }
        else {
            InitialiseFunction();
        }
    },
    Translations: ko.mapping.fromJS(AllTranslations),
    Evaluation: {
        LevelGapToImageUrl: function (gap) {
            if (gap >= 1)
                return "Content/Evaluation/TwoPlus.png";
            if (gap >= 0)
                return "Content/Evaluation/Plus.png";
            if (gap <= -2)
                return "Content/Evaluation/TwoArrowUp.png";
            if (gap <= -1)
                return "Content/Evaluation/ArrowUp.png";
        },
        Initialise: function () {
            _gaq.push(['_trackPageview', '/assesment']);

            var onLogin = function () {
                $sk('.MainLoginPassword').val($sk('#LoginShieldPassword').val());
                $sk('.MainLoginUserName').val($sk('#LoginShieldEmail').val());
                eval($sk('.MainLoginBtn').attr('href').replace("javascript:", ""))
            };

            // Handle login from the Login Shield area (redirect to the main login control)
            $sk('#LoginShieldButton').click(function (event) {
                event.preventDefault();
                onLogin();
            });

            $sk('#LoginShieldEmail,#LoginShieldPassword').keyup(function (e) {
                if ((e.keyCode || e.which) == 13) {
                    onLogin();
                }
            });

            var evaluationId = SkillsEval.Infrastructure.GetUrlParam("EvaluationId");
            if (evaluationId == null) {
                SkillsEval.Infrastructure.ServiceCall(
                                "AlreadyHasOngoingEvaluation",
                                JSON.stringify({ UserId: SkillsEval.CommonData.userId() }),
                                function (HasOngoingEvaluation) {
                                    var Continue = function () {
                                        SkillsEval.Infrastructure.ServiceCall(
                                        "CreateEvaluation",
                                        JSON.stringify({ userId: SkillsEval.CommonData.userId() }),
                                        function (newId) {
                                            SkillsEval.Evaluation.EvaluationData.EvaluationId(newId);
                                            SkillsEval.Evaluation.UpdateEvaluationData();
                                        });
                                    }
                                    if (HasOngoingEvaluation) {
                                        var Popup = $sk('#ContinueEvaluationPopup');
                                        SkillsEval.Infrastructure.Popups.OpenPopup(Popup);
                                        Popup
                                        .find('.PopupCloseButton')
                                        .click(function (event) {
                                            event.preventDefault();
                                            Continue();
                                        });
                                    }
                                    else {
                                        Continue();
                                    }
                                });
            }
            else {
                SkillsEval.Evaluation.EvaluationData.EvaluationId(evaluationId)
                SkillsEval.Evaluation.UpdateEvaluationData();
            }
        },
        UpdateEvaluationData: function (onUpdate) {
            // Add the evaluation id to the create account parameter to get sent back
            var ParameterLessUrl = $sk('#CreateAccountButton').attr('href');
            if (ParameterLessUrl.indexOf('EvaluationId') == -1) {
                $sk('#CreateAccountButton').attr('href', ParameterLessUrl + '?EvaluationId=' + SkillsEval.Evaluation.EvaluationData.EvaluationId());
            }

            // Add the evaluation Id to the server side textbox to reload the correct evaluation on login
            $sk('.EvaluationIdContainer').val(SkillsEval.Evaluation.EvaluationData.EvaluationId());
            SkillsEval.Infrastructure.ServiceCall(
                "LoadEvaluation",
                JSON.stringify({ EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(), Culture: SkillsEval.CommonData.Culture }),
                function (UpdatedData) {
                    SkillsEval.Evaluation.EvaluationData.EvaluationId(UpdatedData.EvaluationId);
                    SkillsEval.Evaluation.EvaluationData.CurrentStep(UpdatedData.CurrentStep);
                    if (UpdatedData.SelectedJobFamily != null) {
                        SkillsEval.Evaluation.EvaluationData.SelectedJobFamily.Id(UpdatedData.SelectedJobFamily.Id);
                        SkillsEval.Evaluation.EvaluationData.SelectedJobFamily.Name(UpdatedData.SelectedJobFamily.Name);
                    }
                    if (UpdatedData.SelectedJob != null) {
                        SkillsEval.Evaluation.EvaluationData.SelectedJob.Id(UpdatedData.SelectedJob.Id);
                        SkillsEval.Evaluation.EvaluationData.SelectedJob.Name(UpdatedData.SelectedJob.Name);
                    }
                    if (!(typeof onUpdate === 'undefined')) {
                        onUpdate();
                    }
                    $sk('#EvaluationContainer').show();
                    switch (SkillsEval.Evaluation.EvaluationData.CurrentStep()) {
                        case "Started":
                            SkillsEval.Evaluation.EvaluationSector.Initialise();
                            $sk('#RightColumnEvaluationContent').show();
                            break;
                        case "JobFamilySelected":
                            SkillsEval.Evaluation.EvaluationJob.Initialise();
                            $sk('#RightColumnEvaluationContent').show();
                            break;
                        case "JobFunctionSelected":
                            SkillsEval.Evaluation.EvaluationSkillDomain.Initialise();
                            $sk('#RightColumnEvaluationContent').show();
                            break;
                        case "SkillCategorySelected":
                            SkillsEval.Evaluation.Assessment.Initialise();
                            $sk('#RightColumnAssessmentContent').show();
                            break;
                        case "SkillsSelected":
                            if (SkillsEval.CommonData.IsUserLoggedOn()) {
                                SkillsEval.Evaluation.Results.Initialise();
                                $sk('#RightColumnResultContent').show();
                            }
                            else {
                                $sk('#EvaluationContainer').hide();
                                $sk('#LoginShield').show();
                                $sk('#LoginShield [placeholder]').addPlaceholder();
                            }
                            break;
                        case "ProductsSaved":
                            if (SkillsEval.CommonData.IsUserLoggedOn()) {
                                SkillsEval.Evaluation.Products.Initialise();
                                $sk('#RightColumnTrainingContent').show();
                            }
                            else {
                                $sk('#EvaluationContainer').hide();
                                $sk('#LoginShield').show();
                                $sk('#LoginShield [placeholder]').addPlaceholder();
                            }
                            break;
                    }
                });
        },
        EvaluationData: {
            EvaluationId: ko.observable(),
            CurrentStep: ko.observable(),
            SelectedJobFamily: {
                Id: ko.observable(),
                Name: ko.observable()
            },
            SelectedJob: {
                Id: ko.observable(),
                Name: ko.observable()
            },
            SkillDomains: ko.observableArray(),
            Skills: ko.observableArray(),
            SuggestedProducts: ko.observableArray()
        },
        EvaluationSector: {
            Initialise: function () {
                $sk('#EvaluationSecteurActivite').show();
                // Load Data
                var Parameters = { Culture: SkillsEval.CommonData.Culture };
                SkillsEval.Infrastructure.ServiceCall(
                    "GetAllSectors",
                    JSON.stringify(Parameters),
                    function (data) {
                        var DefaultItem = { Id: null, Name: SkillsEval.Translations.Evaluation_Sector_DefaultChoice };
                        SkillsEval.Evaluation.EvaluationSector.Sectors.push(DefaultItem);
                        SkillsEval.Evaluation.EvaluationSector.SelectedSector(DefaultItem)
                        $sk.each(data, function (index, item) {
                            SkillsEval.Evaluation.EvaluationSector.Sectors.push(item);
                        });
                    });
                $sk('#EvaluationSecteurActiviteNextButton').click(SkillsEval.Evaluation.EvaluationSector.NextStep);
            },
            NextStep: function (event) {
                event.preventDefault();

                if (SkillsEval.Evaluation.EvaluationSector.SelectedSector().Id == null) {
                    // Do not change area if nothing was selected
                    return;
                }

                SkillsEval.Infrastructure.ServiceCall(
                    "SaveJobFamily",
                    JSON.stringify({
                        EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                        JobFamilyId: SkillsEval.Evaluation.EvaluationSector.SelectedSector().Id
                    }),
                    function () {
                        SkillsEval.Evaluation.UpdateEvaluationData(function () {
                            // Navigate to Job Selection
                            $sk('#EvaluationSecteurActivite').hide();
                        });
                    });
            },
            Sectors: ko.observableArray(),
            SelectedSector: ko.observable()
        },
        EvaluationJob: {
            Initialise: function () {
                $sk('#EvaluationJobSelection').show();
                // Load Data
                var Parameters = {
                    SectorId: SkillsEval.Evaluation.EvaluationData.SelectedJobFamily.Id(),
                    Culture: SkillsEval.CommonData.Culture
                };
                SkillsEval.Infrastructure.ServiceCall(
                    "GetJobsBySector",
                    JSON.stringify(Parameters),
                    function (data) {
                        // Split the collection in half to populate the left and right columns from 2 data sources
                        var q = Enumerable.From(data);
                        var half = Math.ceil(q.Count() / 2);
                        var firstHalf = q.Take(half);
                        var secondHalf = q.Skip(half).Take(q.Count() - half);
                        $sk.each(firstHalf.ToArray(), function (index, item) {
                            SkillsEval.Evaluation.EvaluationJob.Jobs1.push(item);
                        });
                        $sk.each(secondHalf.ToArray(), function (index, item) {
                            SkillsEval.Evaluation.EvaluationJob.Jobs2.push(item);
                        });
                    });
                $sk('#EvaluationJobSelectionNextButton').click(SkillsEval.Evaluation.EvaluationJob.NextStep);
            },
            NextStep: function (event) {
                event.preventDefault();
                var JobSelectionSelector = $sk("input[name='JobSelection']:checked");
                if (JobSelectionSelector.length == 0) {
                    // Do not change area if nothing was selected
                    return;
                }

                SkillsEval.Infrastructure.ServiceCall(
                    "SaveJob",
                    JSON.stringify({
                        EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                        JobId: JobSelectionSelector.attr("itemId")
                    }),
                    function () {
                        SkillsEval.Evaluation.UpdateEvaluationData(function () {
                            // Navigate to Skilldomains Selection
                            $sk('#EvaluationJobSelection').hide();
                        });
                    });
            },
            //Left column jobs
            Jobs1: ko.observableArray(),
            //Right column jobs
            Jobs2: ko.observableArray()
        },
        EvaluationSkillDomain: {
            Initialise: function () {
                $sk('#EvaluationSkillDomainSelection').show();
                // Load Data
                var Parameters = {
                    JobFunctionId: SkillsEval.Evaluation.EvaluationData.SelectedJob.Id(),
                    Culture: SkillsEval.CommonData.Culture
                };
                SkillsEval.Infrastructure.ServiceCall(
                    "GetSkillDomainsByJobFunction",
                    JSON.stringify(Parameters),
                    function (data) {
                        ko.mapping.updateFromJS(SkillsEval.Evaluation.EvaluationSkillDomain.SkillDomains, data);
                    });

                $sk('#StartEvaluationButton').click(SkillsEval.Evaluation.EvaluationSkillDomain.NextStep);
            },
            NextStep: function (event) {
                event.preventDefault();
                var SkillDomainSelectionSelector = $sk("input[name='SkillDomainsSelection']:checked");
                if (SkillDomainSelectionSelector.length == 0) {
                    // Do not change area if nothing was selected
                    return;
                }

                var SelectedSkillDomains = new Array();
                SkillDomainSelectionSelector.each(function () {
                    SelectedSkillDomains.push($sk(this).attr("itemId"));
                });

                SkillsEval.Infrastructure.ServiceCall(
                    "SaveSkillCategories",
                    JSON.stringify({
                        EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                        CategoryIds: SelectedSkillDomains
                    }),
                    function () {
                        SkillsEval.Evaluation.UpdateEvaluationData(function () {
                            // Navigate to Skilldomains Selection
                            $sk('#EvaluationSkillDomainSelection').hide();
                        });
                    });
            },
            SkillDomains: ko.observableArray()
        },
        Assessment: {
            Initialise: function () {
                _gaq.push(['_trackPageview', '/assesment/category_assesment']);

                $sk('#EvaluationSelfAssesment').show();

                $sk('#SelfAssesmentPreviousPageButton').click(function (event) {
                    event.preventDefault();
                    if ($sk('#SelfAssesmentTableArea table:visible').prevAll().length == 1) {
                        // Hide the previous button while we're on navigating to the first category
                        $sk('#SelfAssesmentPreviousPageButton').hide();
                    }
                    $sk('#SelfAssesmentTableArea table:visible')
                        .hide()
                        .prev()
                        .show();
                });

                $sk('#SelfAssesmentNextPageButton').click(function (event) {
                    event.preventDefault();
                    var CurrentTableSelector = $sk('#SelfAssesmentTableArea table:visible');

                    // only switch table if there is another one further
                    if (CurrentTableSelector.nextAll().length != 0) {
                        CurrentTableSelector
                        .hide()
                        .next()
                        .show();

                        // Display the previous button again
                        $sk('#SelfAssesmentPreviousPageButton').show();
                    }
                    // If there are no further table to display, save all skills
                    else {
                        SkillsEval.Evaluation.Assessment.NextStep();
                    }
                });

                var UpdateProgress = function () {
                    var TotalSkills = $sk('input[name^="SelfAsses"]').length / 5;
                    var UnSelectedSkills = $sk('input[name^="SelfAsses"][level=""]:checked').length;
                    var SelectedSkills = TotalSkills - UnSelectedSkills;
                    var PercentComplete = Math.round((SelectedSkills * 100) / TotalSkills);
                    SkillsEval.Evaluation.Assessment.PercentComplete.pop();
                    SkillsEval.Evaluation.Assessment.PercentComplete.push({ value: PercentComplete });
                    SkillsEval.Evaluation.Assessment.SaveSkillLevels(false);
                };

                $sk('input[name^="SelfAsses"]').live('click', function () {
                    UpdateProgress();
                });

                SkillsEval.Infrastructure.ServiceCall(
                    "GetEvaluationSkills",
                    JSON.stringify({
                        EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                        Culture: SkillsEval.CommonData.Culture
                    }),
                    function (data) {
                        ko.mapping.updateFromJS(SkillsEval.Evaluation.Assessment.Categories, data);
                        UpdateProgress();
                        // Hide all tables and then display the first category's table
                        $sk('#SelfAssesmentTableArea table').hide();
                        $sk('#SelfAssesmentTableArea table').first().attr("currentCategoryTable", "true").show();
                        // Hide the previous button while we're on the first category
                        $sk('#SelfAssesmentPreviousPageButton').hide();
                    });
            },
            NextStep: function () {
                SkillsEval.Evaluation.Assessment.SaveSkillLevels(true);
            },
            SaveSkillLevels: function (FinalSave) {
                var SkillLevels = new Array();
                $sk('#SelfAssesmentTableArea tbody tr').each(function () {
                    var currentLevel = $sk(this).find('input:checked').attr('level');
                    if (currentLevel == "") {
                        currentLevel = null;
                    }
                    SkillLevels.push({
                        Id: $sk(this).attr('SkillId'),
                        level: currentLevel
                    });
                });

                SkillsEval.Infrastructure.ServiceCall(
                            "SaveSkillLevels",
                            JSON.stringify({
                                EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                                SkillLevels: SkillLevels,
                                FinalSave: FinalSave
                            }),
                            function () {
                                if (FinalSave) {
                                    SkillsEval.Evaluation.UpdateEvaluationData(function () {
                                        // Navigate to Results Selection
                                        $sk('#EvaluationSelfAssesment').hide();
                                    });
                                }
                            });

            },
            Categories: ko.observableArray(),
            PercentComplete: ko.observableArray([{ value: 0}])
        },
        Results: {
            Initialise: function () {
                _gaq.push(['_trackPageview', '/assesment/results']);

                $sk('#EvaluationResultSynthesis').show();

                // Switch to the result tab and to the correct right column content
                $sk('#EvaluationTabs div')
                            .removeClass('Selected')
                            .removeClass('NextSelected');
                $sk('#EvaluationTab2').addClass('Selected');
                $sk('#EvaluationTab2').prev().addClass('NextSelected');
                $sk('#RightColumn>div').hide();
                $sk('#RightColumnResultContent').show();

                $sk('.DetailedResultsButton').live('click', function (event) {
                    event.preventDefault();
                    _gaq.push(['_trackPageview', '/assesment/results_detail']);
                    $sk('#EvaluationResultSynthesis').hide();
                    $sk('#EvaluationResult').show();
                });

                $sk('.BackToResultSynthesisButton').click(function (event) {
                    event.preventDefault();
                    _gaq.push(['_trackPageview', '/assesment/results']);
                    $sk('#EvaluationResult').hide();
                    $sk('#EvaluationResultSynthesis').show();
                });

                // Results navigation (domains)
                $sk('#EvaluationResultDomainContainer ul li').live('click', function (event) {
                    event.preventDefault();
                    var targetvalue = $sk(this).attr('target');
                    $sk('#EvaluationResultCategoryContainer ul').hide();
                    $sk('#EvaluationResultCategoryContainer ul')
                        .filter('[num="' + targetvalue + '"]')
                        .show();

                    // Apply Selected Style
                    $sk('#EvaluationResultDomainContainer ul li')
                        .removeClass('Selected');

                    $sk(this).addClass('Selected');

                    // Change the skills to match the first category in the newly selected domain
                    $sk('#EvaluationResultCategoryContainer ul li')
                        .removeClass('Selected');

                    var SkillsTarget = $sk('#EvaluationResultCategoryContainer ul')
                        .filter('[num="' + targetvalue + '"]')
                        .children()
                        .first()
                        .addClass('Selected')
                        .attr('target');

                    $sk('#EvaluationResultSkillsContainer>div>ul').hide();
                    $sk('.Pagination').hide();
                    $sk('#EvaluationResultSkillsContainer>div>ul')
                        .filter('[num="' + SkillsTarget + '"]')
                        .show()
                        .parent()
                        .find('.Pagination')
                        .show()
                        .find('.EvaluationResultPaginationLink ')
                        .removeClass('Selected')
                        .first()
                        .addClass('Selected');

                    // Only display first page on navigation
                    $sk('li[page]')
                        .hide()
                        .filter('[page=0]')
                        .show();
                });

                // Results navigation (categories)
                $sk('#EvaluationResultCategoryContainer ul li').live('click', function (event) {
                    event.preventDefault();
                    var targetvalue = $sk(this).attr('target');
                    $sk('#EvaluationResultSkillsContainer>div>ul').hide();
                    $sk('.Pagination').hide();
                    $sk('#EvaluationResultSkillsContainer>div>ul')
                        .filter('[num="' + targetvalue + '"]')
                        .show()
                        .parent()
                        .find('.Pagination')
                        .show()
                        .find('.EvaluationResultPaginationLink ')
                        .removeClass('Selected')
                        .first()
                        .addClass('Selected');

                    $sk('#EvaluationResultCategoryContainer ul li')
                        .removeClass('Selected');

                    $sk(this).addClass('Selected');
                    // Only display first page on navigation
                    $sk('li[page]')
                        .hide()
                        .filter('[page=0]')
                        .show();
                });

                $sk('.EvaluationResultPaginationLink').live('click', function (event) {
                    event.preventDefault();
                    var targetvalue = $sk(this).attr('targetPage');
                    $sk(this).parent().siblings('ul')
                        .find('li[page]')
                        .hide()
                        .filter('[page=' + targetvalue + ']')
                        .show();

                    // Clear Selected on other links and add it to this one
                    $sk(this)
                        .siblings()
                        .removeClass('Selected');
                    $sk(this)
                        .addClass('Selected');
                })

                // Next button
                $sk('#DisplayDetailedResultsButton,#DisplayRecommandationsButton').click(function (event) {
                    event.preventDefault();
                    SkillsEval.Evaluation.Results.NextStep();
                });

                SkillsEval.Infrastructure.ServiceCall(
                    "GetEvaluationResultSynthesis",
                    JSON.stringify({
                        EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                        Culture: SkillsEval.CommonData.Culture
                    }),
                    function (data) {
                        ko.mapping.updateFromJS(SkillsEval.Evaluation.Results.Domains, data);
                        SkillsEval.Evaluation.Results.AfterRender();
                    });
            },
            Domains: ko.observableArray(),
            AfterRender: function () {
                // Mark first item as selected
                $sk('#EvaluationResultDomainContainer ul li')
                    .first()
                    .addClass('Selected');
                $sk('#EvaluationResultCategoryContainer ul li')
                    .first()
                    .addClass('Selected');

                // Hide all navigation result except the first batch of categories and skills
                $sk('#EvaluationResultCategoryContainer ul')
                    .slice(1)
                    .hide();
                $sk('#EvaluationResultSkillsContainer>div>ul')
                    .slice(1)
                    .hide();

                $sk('.Pagination').each(function () {
                    $sk(this)
                        .find('.EvaluationResultPaginationLink')
                        .first()
                        .addClass('Selected');
                });
                $sk('.Pagination')
                    .slice(1)
                    .hide();


                // Only display first page on navigation
                $sk('li[page]')
                        .hide()
                        .filter('[page=0]')
                        .show();
            },
            NextStep: function () {
                $sk('#EvaluationResult').hide();
                SkillsEval.Evaluation.Products.Initialise();
            }
        },
        Products: {
            Initialise: function () {
                $sk('#EvaluationTabs div')
                            .removeClass('Selected')
                            .removeClass('NextSelected');
                $sk('#EvaluationTab3').addClass('Selected');
                $sk('#EvaluationTab3').prev().addClass('NextSelected');

                $sk('#EvaluationResultSynthesis').hide();
                $sk('#RightColumnResultContent').hide();
                $sk('#EvaluationRecommandations').show();
                $sk('#RightColumnTrainingContent').show();

                /*Ensure we display the non detail view when coming back*/
                $sk('#EvaluationRecommandationsTrainingDomainContainer>ul').show();
                $sk('#EvaluationRecommandationsTrainingContainer>ul').hide();
                $sk('#EvaluationRecommandationsDomainContainer ul li')
                            .removeClass('Selected');
                $sk('#EvaluationRecommandationsDomainContainer ul li')
                            .first()
                            .addClass('Selected');

                if (!SkillsEval.Evaluation.Products.AlreadyLoaded) {
                    SkillsEval.Infrastructure.ServiceCall(
                    "GetEvaluationTraining",
                    JSON.stringify({
                        EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                        Culture: SkillsEval.CommonData.Culture
                    }),
                    function (data) {
                        ko.mapping.updateFromJS(SkillsEval.Evaluation.Products.Domains, data);
                        SkillsEval.Evaluation.Products.AfterRender();
                    });

                    $sk('.RecommandationsBackToResultSynthesisButton').click(function (event) {
                        event.preventDefault();
                        $sk('#EvaluationRecommandations').hide();
                        SkillsEval.Evaluation.Results.Initialise();
                    });

                    // Recommendation navigation
                    $sk('#EvaluationRecommandationsDomainContainer ul li').live('click', function (event) {
                        event.preventDefault();
                        var targetDomain = $sk(this).attr('target');
                        $sk('#EvaluationRecommandationsCategoryContainer ul').hide();
                        $sk('#EvaluationRecommandationsCategoryContainer ul')
                        .filter('[num="' + targetDomain + '"]')
                        .show();

                        // Apply Selected Style
                        $sk('#EvaluationRecommandationsDomainContainer ul li')
                        .removeClass('Selected');

                        $sk(this).addClass('Selected');

                        // Change the skills to match the first category in the newly selected domain
                        $sk('#EvaluationRecommandationsCategoryContainer ul li')
                        .removeClass('Selected');

                        $sk('#EvaluationRecommandationsTrainingContainer>ul').hide();
                        $sk('#EvaluationRecommandationsTrainingDomainContainer>ul').hide();
                        $sk('#EvaluationRecommandationsTrainingDomainContainer>ul')
                        .filter('[DomainId="' + targetDomain + '"]')
                        .show();

                        var targetCategory = $sk('#EvaluationRecommandationsCategoryContainer ul')
                        .filter('[num="' + targetDomain + '"]')
                        .find('li')
                        .attr('target');
                        NavigateToCategory(targetCategory);
                    });

                    var NavigateToCategory = function (targetCategory) {
                        $sk('#EvaluationRecommandationsTrainingContainer>ul').hide();
                        $sk('#EvaluationRecommandationsTrainingDomainContainer>ul').hide();
                        $sk('#EvaluationRecommandationsTrainingContainer>ul')
                        .filter('[num="' + targetCategory + '"]')
                        .show();
                        $sk('#EvaluationRecommandationsCategoryContainer ul li')
                        .removeClass('Selected');

                        $sk(this)
                        .addClass('Selected');
                    };

                    $sk('#EvaluationRecommandationsCategoryContainer ul li,.CategoryLink').live('click', function (event) {
                        event.preventDefault();
                        NavigateToCategory($sk(this).attr('target'));
                    });

                    $sk('#SaveRecommandationsButton').click(function (event) {
                        event.preventDefault();
                        var SelectedProductIds = [];
                        var SelectedTrainingSelector = $sk("#EvaluationRecommandations input[ProductId]:checked");
                        SelectedTrainingSelector.each(function (a, b, c) {
                            SelectedProductIds.push($sk(this).attr('ProductId'));
                        });
                        SkillsEval.Infrastructure.ServiceCall(
                            "SaveRecommandations",
                            JSON.stringify({
                                EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId(),
                                ProductIds: Enumerable.From(SelectedProductIds).Distinct().ToArray()
                            }),
                            function () {
                                SkillsEval.Infrastructure.Popups.OpenPopup($sk('#SavedRecommandationsPopup'));
                            });
                    });
                    SkillsEval.Evaluation.Products.AlreadyLoaded = true;
                }
            },
            AlreadyLoaded: false,
            AfterRender: function () {
                SkillsEval.Infrastructure.ServiceCall(
                    "GetSavedRecommandations",
                    JSON.stringify({
                        EvaluationId: SkillsEval.Evaluation.EvaluationData.EvaluationId()
                    }),
                    function (data) {
                        var SavedProductIds = Enumerable.From(data);
                        $sk("#EvaluationRecommandations input[ProductId]").each(function () {
                            var CurrentItem = $sk(this);
                            CurrentItem.attr('checked', SavedProductIds
                                .Any(function (prodId) {
                                    return prodId == CurrentItem.attr("ProductId")
                                }));
                        });
                        // Mark first item as selected
                        $sk('#EvaluationRecommandationsDomainContainer ul li')
                            .first()
                            .addClass('Selected');

                        // Hide all navigation Recommandations except the first batch of categories and skills
                        $sk('#EvaluationRecommandationsCategoryContainer ul')
                            .slice(1)
                            .hide();
                        $sk('#EvaluationRecommandationsTrainingContainer>ul')
                            .hide();
                    });
            },
            Domains: ko.observableArray(),
            NextStep: function () {
            }
        }
    },
    CreateAccount: {
        Initialise: function () {
            var DefaultSector = { Id: null, Name: SkillsEval.Translations.Evaluation_Sector_DefaultChoice };
            SkillsEval.CommonData.ReferentialData.ActivitySectors.push(DefaultSector);
            SkillsEval.CreateAccount.AccountInfo.Company.Sector(DefaultSector);
            var DefaultSize = { Id: null, Name: SkillsEval.Translations.Account_Common_DefaultCompanySize };
            SkillsEval.CommonData.ReferentialData.CompanySizes.push(DefaultSize);
            SkillsEval.CreateAccount.AccountInfo.Company.Size(DefaultSize);

            $sk('#CompanySizes').selectbox();
            $sk('#Civilities').selectbox();

            // Transform dropdown in selectbox plugin
            $sk('#ActivitySector').selectbox({
                onChange: function (val, inst) {
                    var Sector = Enumerable.From(SkillsEval.CommonData.ReferentialData.ActivitySectors()).Single(function (item) { return item.Name() == $sk('#ActivitySector').parent().find('.sbSelector').text() });
                    SkillsEval.CreateAccount.AccountInfo.Company.Sector(Sector);
                }
            });
            $sk('#Civilities').selectbox({
                onChange: function (val, inst) {
                    var Civility = Enumerable.From(SkillsEval.CommonData.ReferentialData.Civilities()).Single(function (item) { return item.Name() == $sk('#Civilities').parent().find('.sbSelector').text() });
                    SkillsEval.CreateAccount.AccountInfo.User.Civility(Civility);
                }
            });
            $sk('#CompanySizes').selectbox({
                onChange: function (val, inst) {
                    var Size = Enumerable.From(SkillsEval.CommonData.ReferentialData.CompanySizes()).Single(function (item) { return item.Name() == $sk('#CompanySizes').parent().find('.sbSelector').text() });
                    SkillsEval.CreateAccount.AccountInfo.Company.Size(Size);
                }
            });

            $sk('#EvaluationSecteurActiviteNextButton').click(function (event) {
                event.preventDefault();

                var accountData = ko.mapping.toJS(SkillsEval.CreateAccount.AccountInfo);
                accountData.Password = SkillsEval.CreateAccount.Password();

                if (SkillsEval.CreateAccount.Password() != SkillsEval.CreateAccount.ConfirmPassword()) {
                    SkillsEval.Infrastructure.Popups.OpenPopup($sk('#CreateAccountPasswordMisMatchPopup'));
                }
                else if (!SkillsEval.Infrastructure.ValidateEmail(SkillsEval.CreateAccount.AccountInfo.User.Email())) {
                    SkillsEval.Infrastructure.Popups.OpenPopup($sk('#CreateAccountWrongEmailPopup'));
                }
                else if (SkillsEval.Infrastructure.Validation.Validate($sk('#CreateAccountContainer'))) {
                    SkillsEval.Infrastructure.ServiceCall(
                        "CreateAccount",
                        JSON.stringify({
                            accountInfo: accountData
                        }),
                        function (newUserId) {
                            SkillsEval.Infrastructure.ServiceCall(
                            "MigrateUserId",
                            JSON.stringify({
                                PreviousUserId: SkillsEval.CommonData.userId(),
                                UserId: newUserId
                            }),
                            function () {
                                $sk('.CreateAccountPassword').val(accountData.Password);
                                $sk('.CreateAccountLogin').val(accountData.User.Email);
                                $sk('.AspNetButtonHome').click();
                            });
                        },
                        function () {
                            SkillsEval.Infrastructure.Popups.OpenPopup($sk('#CreateAccountFailedPopup'));
                        }
                    );
                }
            });
        },
        Password: ko.observable(),
        ConfirmPassword: ko.observable(),
        AccountInfo: ko.mapping.fromJS({
            UserId: "",
            Password: "",
            User: {
                AllowDemosOffering: false,
                Civility: null,
                Email: "",
                FirstName: "",
                JobFunction: "",
                LastName: "",
                Phone: "",
                MobilePhone: ""
            },
            Company: {
                AdressLine: "",
                City: "",
                Country: "",
                Name: "",
                Phone: "",
                PostalCode: "",
                Sector: null,
                Size: null
            }
        })
    },
    Account: {
        Initialise: function () {
            SkillsEval.Infrastructure.ServiceCall(
                "GetAccountInfo",
                JSON.stringify({
                    UserId: SkillsEval.CommonData.userId(),
                    Culture: SkillsEval.CommonData.Culture
                }),
                function (data) {
                    ko.mapping.updateFromJS(SkillsEval.Account.AccountInfo, data);
                    // Retrieve the current sector and civility from the cached list and select it
                    var DefaultSector = { Id: ko.observable(null), Name: SkillsEval.Translations.Evaluation_Sector_DefaultChoice };
                    SkillsEval.CommonData.ReferentialData.ActivitySectors.push(DefaultSector);
                    var Sector = Enumerable.From(SkillsEval.CommonData.ReferentialData.ActivitySectors()).Single(function (item) { return item.Id() == data.Company.Sector.Id });
                    SkillsEval.Account.AccountInfo.Company.Sector(Sector);
                    var Civility = Enumerable.From(SkillsEval.CommonData.ReferentialData.Civilities()).Single(function (item) { return item.Id() == data.User.Civility.Id });
                    SkillsEval.Account.AccountInfo.User.Civility(Civility);
                    var DefaultSize = { Id: ko.observable(null), Name: SkillsEval.Translations.Account_Common_DefaultCompanySize };
                    SkillsEval.CommonData.ReferentialData.CompanySizes.push(DefaultSize);
                    var Size = Enumerable.From(SkillsEval.CommonData.ReferentialData.CompanySizes()).Single(function (item) { return item.Id() == data.Company.Size.Id });
                    SkillsEval.Account.AccountInfo.Company.Size(Size);

                    // Manually populate the missing profile labels
                    $sk('#CivilityLabel').text(Civility.Name());
                    $sk('#CompanySizeLabel').text(Size.Name());
                    $sk('#ActivitySectorLabel').text(Sector.Name());

                    // Transform dropdown in selectbox plugin
                    $sk('#ActivitySector').selectbox({
                        onChange: function (val, inst) {
                            var Sector = Enumerable.From(SkillsEval.CommonData.ReferentialData.ActivitySectors()).Single(function (item) { return item.Name() == $sk('#ActivitySector').parent().find('.sbSelector').text() });
                            SkillsEval.Account.AccountInfo.Company.Sector(Sector);
                        }
                    });
                    $sk('#Civilities').selectbox({
                        onChange: function (val, inst) {
                            var Civility = Enumerable.From(SkillsEval.CommonData.ReferentialData.Civilities()).Single(function (item) { return item.Name() == $sk('#Civilities').parent().find('.sbSelector').text() });
                            SkillsEval.Account.AccountInfo.User.Civility(Civility);
                        }
                    });
                    $sk('#CompanySizes').selectbox({
                        onChange: function (val, inst) {
                            var Size = Enumerable.From(SkillsEval.CommonData.ReferentialData.CompanySizes()).Single(function (item) { return item.Name() == $sk('#CompanySizes').parent().find('.sbSelector').text() });
                            SkillsEval.Account.AccountInfo.Company.Size(Size);
                        }
                    });
                });


            // Hide tabs targets
            $sk('#AccountAreasContainer>div,#AccountProfileUpdateData').hide();
            var Tab = SkillsEval.Infrastructure.GetUrlParam("Tab");

            $sk('#AccountProfileCurrentDataEditButton').click(function (event) {
                event.preventDefault();
                $sk('#AccountProfileCurrentData').hide();
                $sk('#AccountProfileUpdateData').show();
            });
            $sk('#AccountProfileUpdateDataEditButton').click(function (event) {
                event.preventDefault();
                if (SkillsEval.Infrastructure.Validation.Validate($sk('#AccountProfileUpdateDataPersonal,#AccountProfileUpdateDataCompany'))) {
                    SkillsEval.Infrastructure.ServiceCall(
                    "SaveAccountInfo",
                    JSON.stringify({
                        accountInfo: ko.mapping.toJS(SkillsEval.Account.AccountInfo)
                    }),
                    function () {
                        SkillsEval.Infrastructure.Popups.OpenPopup($sk('#AccountProfileUpdatePopup'));
                        $sk('#AccountProfileUpdateData').hide();
                        $sk('#AccountProfileCurrentData').show();
                    });
                }
            });

            $sk('#AccountProfileUpdatePasswordButton').click(function (event) {
                event.preventDefault();
                if (SkillsEval.Account.AccountPasswordInfo.NewPassword() == SkillsEval.Account.AccountPasswordInfo.ConfirmPassword()) {
                    SkillsEval.Infrastructure.ServiceCall(
                    "UpdatePassword",
                    JSON.stringify({
                        passwordInfo: ko.mapping.toJS(SkillsEval.Account.AccountPasswordInfo),
                        UserId: SkillsEval.CommonData.userId()
                    }),
                    function () {
                        SkillsEval.Infrastructure.Popups.OpenPopup($sk('#AccountPasswordUpdatePopup'));
                        $sk('#AccountProfileUpdateData').hide();
                        $sk('#AccountProfileCurrentData').show();
                    });
                }
                else {
                    SkillsEval.Infrastructure.Popups.OpenPopup($sk('#AccountPasswordWrongMatchPopup'));
                }
            });

            var NavigateFunction = function (targetvalue) {
                $sk('#AccountAreasContainer>div').hide();
                $sk('#AccountAreasContainer>div')
                    .filter('[num="' + targetvalue + '"]')
                    .show();

                // Apply Selected Style
                $sk('#AccountNavigation ul li')
                    .removeClass('Selected');

                $sk('#AccountNavigation ul li[target=' + targetvalue + ']').addClass('Selected');

                // Change the skills to match the first category in the newly selected domain
                $sk('#EvaluationResultCategoryContainer ul li')
                    .removeClass('Selected');

                var SkillsTarget = $sk('#EvaluationResultCategoryContainer ul')
                    .filter('[num="' + targetvalue + '"]')
                    .children()
                    .first()
                    .addClass('Selected')
                    .attr('target');

                $sk('#EvaluationResultSkillsContainer ul').hide();
                $sk('#EvaluationResultSkillsContainer ul')
                    .filter('[num="' + SkillsTarget + '"]')
                    .show();
            };

            // Navigation
            $sk('#AccountNavigation ul li').click(function (event) {
                event.preventDefault();
                NavigateFunction($sk(this).attr('target'));
            });

            if (Tab == null) {
                $sk('#AccountProfile').show();
            }
            else {
                // Retrieve num of the div to find the corresponding navigation
                var target = $sk('#' + Tab).attr('num');
                // Get the corresponding li
                NavigateFunction(target);
            }
        },
        AccountInfo: ko.mapping.fromJS({
            UserId: "",
            User: {
                AllowDemosOffering: false,
                Civility: null,
                Email: "",
                FirstName: "",
                JobFunction: "",
                LastName: "",
                Phone: "",
                MobilePhone: ""
            },
            Company: {
                AdressLine: "",
                City: "",
                Country: "",
                Name: "",
                Phone: "",
                PostalCode: "",
                Sector: null,
                Size: null
            },
            RunningEvaluations: ko.observableArray(),
            AssessmentCompleteEvaluations: ko.observableArray(),
            ProductsSelectedEvaluations: ko.observableArray()
        }),
        AccountPasswordInfo: ko.mapping.fromJS({
            OldPassword: "",
            NewPassword: "",
            ConfirmPassword: ""
        })
    }
};

function IsItemNotPriority(IsPriority) {
    return !IsPriority();
}

$sk(function () {
    ko.applyBindings(SkillsEval);
    // Launch SkillsEval code only if we're not in design mode
    if ($sk('meta[name="Generator"]', 'head').length != 0) {
        SkillsEval.Initialise();
    }
    $sk('#Content').show();
    $sk('#Login [placeholder]').addPlaceholder();

    // Temporary, hack to prevent submit from asp.net when hitting enter inside inputs
    $sk("#AccountContainer input").keypress(function (event) {
        var keycode = (event.keyCode ? event.keyCode : event.which);
        if (keycode == '13') {
            event.preventDefault();
            event.stopPropagation();
        }
    }); 
});
