{"version":3,"sources":["../js/services/errorService.js","../js/services/tools/quizService.js","../js/directives/quiz.js"],"names":["SUGApp","service","SUGUtilities","init","errors","hasErrors","getErrors","key","isArray","isStringNullOrEmpty","isEmptyObject","field","arrErrors","hasOwnProperty","concat","setError","value","clearErrors","jQuery","coreService","newInstance","$q","$window","ajaxResultInvalid","result","data","SUCCESS","DATA","getAjaxResponseMessage","resultErrorHandler","errorHandler","errorObj","errMessage","showMagnificAlert","getQuiz","APISyncCall","getQuizByName","getQuizInstance","getQuizStats","startQuiz","answerQuiz","completeQuiz","getProductPricing","findQuiz","quizData","deferred","defer","failLocation","quizname","then","response","r","lowerCaseKeys","success","quiz","length","resolve","location","href","reject","promise","downloadQuizReport","window","open","quizID","startdate","enddate","quizversion","directive","qsrv","util","modal","scope","sugModal","restrict","link","$scope","element","attrs","manageQuiz","quizPath","angular","fromJson","config","quizInstanceID","quizid","id","startResponse","quizinstanceid","quizModalInstance","templateUrl","controller","quizVersion","bind","errorService","modalInstance","$location","w","es","errorStrings","errorsTitle","errorsPleaseCorrect","quizInformation","JSON","parse","quizInstance","templateid","starttemplateid","templateInfo","loadTemplate","savedAnswers","savedOptionClasses","recommendedPlan","recordedAnswers","recommendation","showNextButton","showPreviousButton","strings","noRecommendationFound","useAnnualPricing","showSwitch","selectedPath","cancel","dismiss","direction","endtemplateid","toLowerCase","previoustemplateid","templates","outerLoop","i","j","next","pageload","path","evaluateAnswer","answer","multiSelect","options","answerArray","recArray","option","indexOf","push","getRecommendation","setNextTemplate","matchvalue","matchtype","nexttemplateid","node","match","matches","saveAnswerData","selectedAnswer","selectedOptionClass","allowMultiple","splice","saveRecordedAnswers","currentTemplate","quizList","currentPath","k","answers","getRecordedAnswer","setCheckboxValues","useCheckboxOptions","templateOptions","optionclass","checkboxes","isChecked","selectAnswer","newSelectedPath","allowMultipleSelection","loadNextTemplate","template","toString","message","x","answersArray","recValue","priority","returnValue","recIndex","a","results","fireJsEvent","conversionIndex","jsevents","definitions","conversions","callGA","productcode","substring","eval","console","log","productcodeannual","url","togglePrice"],"mappings":"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","file":"quiz.min.js","sourcesContent":["/* Error service\r\n *\r\n * This service can be used to set and retrieve errors and track the presence of errors.\r\n */\r\nSUGApp.service('errorService', ['SUGUtilities', function (SUGUtilities) {\r\n var service = {\r\n getService: function(){\r\n var service = {\r\n init: function () {\r\n // clear / reinit the errors\r\n service.errors = {};\r\n service.hasErrors = false;\r\n },\r\n errors: {},\r\n hasErrors: false,\r\n getErrors: function (key) {\r\n if (key) {\r\n // get the error(s) for a specific key (can be an array or a string)\r\n if (SUGUtilities.isArray(service.errors[key]) || !SUGUtilities.isStringNullOrEmpty(service.errors[key])) {\r\n return service.errors[key];\r\n } else {\r\n return false;\r\n }\r\n } else {\r\n // get all the errors\r\n if (SUGUtilities.isEmptyObject(service.errors)) {\r\n return false;\r\n } else {\r\n var arrErrors = [];\r\n for (var field in service.errors) {\r\n if (service.errors.hasOwnProperty(field)) {\r\n arrErrors = arrErrors.concat(service.errors[field]);\r\n }\r\n }\r\n return arrErrors;\r\n }\r\n }\r\n },\r\n setError: function (key, value) {\r\n service.errors[key] = value;\r\n service.hasErrors = true;\r\n },\r\n clearErrors: function (key) {\r\n if (typeof key === 'undefined') {\r\n service.errors = {};\r\n service.hasErrors = false;\r\n } else {\r\n if (typeof service.errors[key] !== 'undefined') {\r\n delete service.errors[key];\r\n }\r\n if (jQuery.isEmptyObject(service.errors)) {\r\n service.hasErrors = false;\r\n } else {\r\n service.hasErrors = true;\r\n }\r\n }\r\n }\r\n };\r\n return service;\r\n }\r\n };\r\n\r\n var coreService = service.getService();\r\n coreService.newInstance = service.getService;\r\n \r\n return coreService;\r\n\r\n}]);","/* Quiz Service */\r\n\r\nSUGApp.service('quizService', ['SUGUtilities', '$q', '$window', function (SUGUtilities, $q, $window) {\r\n var service = {\r\n // use this to check if the server response is invalid\r\n ajaxResultInvalid: function (result) {\r\n return (typeof result.data === 'undefined' || !result.data.SUCCESS || !result.data.DATA);\r\n },\r\n\r\n // use this if you just need to get the error message from the server response\r\n getAjaxResponseMessage: function (result) {\r\n if (typeof result.data !== 'undefined') {\r\n return SUGUtilities.resultErrorHandler(result.data);\r\n } else {\r\n return '';\r\n }\r\n },\r\n\r\n // use this for displaying an error modal\r\n errorHandler: function (errorObj) {\r\n var errMessage = SUGUtilities.resultErrorHandler(errorObj);\r\n SUGUtilities.showMagnificAlert(errMessage, 'error', '', 'Sorry!');\r\n },\r\n\r\n getQuiz: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'c.getQuiz', 15000);\r\n },\r\n\r\n getQuizByName: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'c.getQuizByName', 15000);\r\n },\r\n\r\n getQuizInstance: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'c.getQuizInstance', 15000);\r\n },\r\n\r\n getQuizStats: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'a.getQuizStats', 15000);\r\n },\r\n\r\n startQuiz: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'c.startQuiz', 15000);\r\n },\r\n\r\n answerQuiz: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'c.answerQuiz', 15000);\r\n },\r\n\r\n completeQuiz: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'c.completeQuiz', 15000);\r\n },\r\n\r\n getProductPricing: function (data) {\r\n return SUGUtilities.APISyncCall('post', '', data, 'c.getProductPricing', 15000);\r\n },\r\n\r\n findQuiz: function (quizData) {\r\n var deferred = $q.defer();\r\n var failLocation = '/index.cfm?go=a.admin';\r\n if (quizData.quizname) {\r\n service.getQuizByName(quizData).then(function (response) {\r\n if (!service.ajaxResultInvalid(response)) {\r\n var r = SUGUtilities.lowerCaseKeys(response);\r\n if (r.data.success && r.data.data && r.data.data.quiz && r.data.data.quiz.length) {\r\n deferred.resolve(r.data.data.quiz[0]);\r\n } else {\r\n $window.location.href = failLocation;\r\n deferred.reject();\r\n }\r\n } else {\r\n $window.location.href = failLocation;\r\n deferred.reject();\r\n }\r\n });\r\n } else {\r\n $window.location.href = failLocation;\r\n deferred.reject();\r\n }\r\n return deferred.promise;\r\n },\r\n\r\n downloadQuizReport: function (data) {\r\n // get binary download\r\n window.open(\"/view/admin/downloadReport.cfm?type=quizReport&reportId=\" + data.quizID + \"&startdate=\"+ data.startdate + \"&enddate=\" + data.enddate + \"&quizversion=\"+ data.quizversion);\r\n }\r\n };\r\n\r\n return service;\r\n}]);","// Quiz Button Directive\r\nSUGApp.directive('sugModal', ['quizService', 'SUGUtilities', '$modal', function (qsrv, util, modal ) {\r\n return {\r\n scope: {\r\n sugModal: '@'\r\n },\r\n\r\n restrict:'AE',\r\n link:function ($scope, element, attrs) {\r\n $scope.manageQuiz = function() {\r\n\r\n function quizLoad(){\r\n\r\n // Grab Quiz Information, based on the passed Quiz Name\r\n\r\n // If number, find quiz by ID\r\n qsrv.getQuizByName({\r\n quizname: $scope.sugModal\r\n }).then(function (response) {\r\n if (qsrv.ajaxResultInvalid(response)) {\r\n // invalid response, show error\r\n qsrv.errorHandler(response.data);\r\n\r\n } else {\r\n // valid response, get the quiz data\r\n var r = util.lowerCaseKeys(response);\r\n\r\n\r\n if (typeof r.data.data.quiz !== 'undefined' && r.data.data.quiz.length) {\r\n $scope.quizData = r.data.data.quiz[0];\r\n $scope.quizPath = angular.fromJson($scope.quizData.config);\r\n }\r\n\r\n // Start the Quiz instance - send the quizid, location\r\n var data = {};\r\n $scope.quizInstanceID = {};\r\n\r\n data.quizid = $scope.quizData.id;\r\n data.location = location.href;\r\n\r\n qsrv.startQuiz(data)\r\n .then(function (startResponse){\r\n if (qsrv.ajaxResultInvalid(response)) {\r\n // invalid response, show error\r\n qsrv.errorHandler(response.data);\r\n } else {\r\n $scope.quizInstanceID = startResponse.data.DATA.quizinstanceid;\r\n // Load Modal with Retrieved Quiz Information\r\n $scope.quizModalInstance = modal.open({\r\n templateUrl: '/view/templates/quiz/quizTemplate.html',\r\n // Check the version of the quiz and set the controller based on the value\r\n controller: \"quizControllerV2\",\r\n resolve: {\r\n quiz: function () { return $scope.quizData; },\r\n quizInstanceID: function(){ return $scope.quizInstanceID; },\r\n quizVersion: function() { return $scope.quizData.quizversion; }\r\n }\r\n }).result.then(\r\n function (result) {\r\n //works!\r\n }, function (){\r\n //broken!!\r\n });\r\n }\r\n });\r\n }\r\n });\r\n\r\n }\r\n\r\n quizLoad();\r\n\r\n };\r\n element.bind('click', $scope.manageQuiz);\r\n }\r\n };\r\n}]).controller('quizControllerV2', ['quizService','SUGUtilities','errorService','$scope', 'quiz', 'quizInstanceID', 'quizVersion', '$modalInstance', '$modal', '$location', '$window', function (qsrv, util, errorService, $scope, quiz, quizInstanceID, quizVersion, modalInstance, modal, $location, w) {\r\n \r\n // instantiate error handler\r\n $scope.es = errorService.newInstance();\r\n $scope.errorStrings = {\r\n errorsTitle: '',\r\n errorsPleaseCorrect: 'Please correct the issues indicated below.'\r\n };\r\n\r\n var init = function () {\r\n // This contains all the current quiz data\r\n $scope.quizInformation = JSON.parse(quiz.config);\r\n $scope.quizInstance = quizInstanceID;\r\n $scope.quizVersion = quizVersion;\r\n\r\n // Set intial template\r\n $scope.templateid = $scope.quizInformation.starttemplateid;\r\n $scope.templateInfo = {};\r\n $scope.loadTemplate($scope.templateid, 1);\r\n\r\n $scope.savedAnswers = [];\r\n $scope.savedOptionClasses = [];\r\n $scope.recommendedPlan = [];\r\n $scope.recordedAnswers = [];\r\n $scope.recommendation = \"\";\r\n $scope.showNextButton = false;\r\n $scope.showPreviousButton = false;\r\n\r\n $scope.strings = {};\r\n $scope.strings.errors= {\r\n noRecommendationFound: 'No recommendation could be found for the selected answer(s).'\r\n };\r\n $scope.useAnnualPricing = true;\r\n $scope.showSwitch = true;\r\n $scope.selectedPath = \"\";\r\n };\r\n\r\n //dismisses the modal\r\n $scope.cancel = function () {\r\n modalInstance.dismiss();\r\n };\r\n\r\n // sets $scope.pageload to the template path associated with the templateid\r\n $scope.loadTemplate = function ( templateid, direction ) {\r\n // If we are loading the results page, complete the quiz\r\n if (templateid === $scope.quizInformation.endtemplateid) {\r\n // If the recommendation is enterprise or basic, do not show the monthly/annual selector switch\r\n if ($scope.recommendation.toLowerCase() == \"enterprise\" || $scope.recommendation.toLowerCase() == \"basic\") {\r\n $scope.showSwitch = false;\r\n } else {\r\n $scope.showSwitch = true;\r\n }\r\n $scope.completeQuiz();\r\n }\r\n\r\n // Set the previous templateid to the current one before updating templateid value. This only works when moving forward\r\n var previoustemplateid = \"\";\r\n\r\n if (templateid === $scope.quizInformation.starttemplateid) {\r\n previoustemplateid = \"\";\r\n } else if (direction === 0) {\r\n // If the function call was triggered by the Previous button being clicked, we need to determine the correct templateid for the previous template (after the template loads) by looping over the options and finding the correct template\r\n var templates = $scope.quizInformation.templates;\r\n\r\n outerLoop: for (var i in templates) {\r\n // Have to use nested loops to find the element\r\n innerLoop: for (var j=0; j < templates[i].next.length; j++){\r\n if (templates[i].next[j].templateid == templateid) {\r\n previoustemplateid = i;\r\n // If value is found we are done. break out of the outer loop\r\n break outerLoop;\r\n }\r\n }\r\n }\r\n\r\n } else {\r\n previoustemplateid = $scope.templateid;\r\n }\r\n $scope.previoustemplateid = previoustemplateid;\r\n $scope.showPreviousButton = $scope.previoustemplateid.length ? true : false;\r\n \r\n $scope.templateid = templateid;\r\n $scope.templateInfo = $scope.quizInformation.templates[$scope.templateid];\r\n $scope.pageload = '/view/templates/quiz/' + $scope.templateInfo.path;\r\n };\r\n \r\n // evaluates the answer and determines the recommended plan basd on the answer\r\n $scope.evaluateAnswer = function (answer, multiSelect) {\r\n var recommendedPlan = 'basic';\r\n var options = $scope.templateInfo.options;\r\n\r\n if (multiSelect) {\r\n // If dealing with a multiselect template, we have to reevaluate the entire array of answers to find the highest plan recommendation for the selected answers\r\n var answerArray = $scope.savedAnswers;\r\n // Set attay to \r\n var recArray = [];\r\n // Loop over answer array\r\n for (var i=0; i 1) {\r\n // Handle multiple next options\r\n // loop over next array and evaluate the options\r\n for ( var node = 0; node < $scope.templateInfo.next.length; node++ ) {\r\n \r\n if ($scope.templateInfo.next[node].matchtype==='exact') {\r\n // If matchtype if exact, loop over possible matches \r\n for (var match=0; match < $scope.templateInfo.next[node].matches.length; match++) {\r\n // If the value passed in matches the match value, set the next templateid to the value of the element\r\n if ($scope.templateInfo.next[node].matches[match]===matchvalue) {\r\n $scope.nexttemplateid = $scope.templateInfo.next[node].templateid;\r\n break;\r\n }\r\n }\r\n \r\n }\r\n }\r\n } else {\r\n // Handle no next options\r\n $scope.nexttemplateid = \"\";\r\n }\r\n\r\n // Added check that savedAnswers has values to prevent the Next button from showing when unselecting all options on multi select templates\r\n $scope.showNextButton = $scope.templateid !== $scope.quizInformation.endtemplateid && $scope.nexttemplateid.length && $scope.savedAnswers.length ? true : false;\r\n $scope.showPreviousButton = $scope.templateid !== $scope.quizInformation.starttemplateid && $scope.previoustemplateid.length ? true : false;\r\n\r\n };\r\n\r\n // Saving whatever selections that users made\r\n $scope.saveAnswerData = function (selectedAnswer, selectedOptionClass, allowMultiple) {\r\n // if multiple selections are allowed\r\n if (allowMultiple){\r\n if ( $scope.savedAnswers.length <= 0 ){\r\n $scope.savedAnswers.push(selectedAnswer);\r\n } else {\r\n if ( $scope.savedAnswers.indexOf(selectedAnswer) === -1 ) {\r\n $scope.savedAnswers.push(selectedAnswer);\r\n } else {\r\n $scope.savedAnswers.splice($scope.savedAnswers.indexOf(selectedAnswer), 1);\r\n }\r\n }\r\n // Store option classes for selected answers\r\n if ( $scope.savedOptionClasses.length <= 0 ){\r\n $scope.savedOptionClasses.push(selectedOptionClass);\r\n } else {\r\n if ( $scope.savedOptionClasses.indexOf(selectedOptionClass) == -1 ) {\r\n $scope.savedOptionClasses.push(selectedOptionClass);\r\n } else {\r\n $scope.savedOptionClasses.splice($scope.savedOptionClasses.indexOf(selectedOptionClass), 1);\r\n }\r\n }\r\n } else {\r\n $scope.savedAnswers = [];\r\n $scope.savedAnswers.push(selectedAnswer);\r\n // Store option class for selected answer\r\n $scope.savedOptionClasses = [];\r\n $scope.savedOptionClasses.push(selectedOptionClass);\r\n }\r\n\r\n // if all answers are unselected, remove the next button to prevent the user from proceeding\r\n if (typeof $scope.savedAnswers == 'undefined' || !$scope.savedAnswers.length) {\r\n $scope.showNextButton = false;\r\n }\r\n };\r\n\r\n\r\n // Save recorded answers so they can be retrieved when navigating to previous templates\r\n $scope.saveRecordedAnswers = function(templateid, answer, multiSelect) {\r\n // Get the recommendation corresponding to the answer\r\n var recommendedPlan = $scope.evaluateAnswer(answer, multiSelect);\r\n\r\n // Finding which spot in the array we are using\r\n function getIndexOf(quizList,currentPath) {\r\n for (var k=0; k < quizList.length; k++) {\r\n if (quizList[k].templateid==currentPath) {\r\n return k;\r\n }\r\n }\r\n return -1;\r\n }\r\n // Get index of template in recorded answers array\r\n var currentTemplate = getIndexOf($scope.recordedAnswers,templateid);\r\n //if template allows multiple, need to remove old one, and replace with new one\r\n //if template exists, update instead of adding.\r\n if ( $scope.recordedAnswers.length > 0 && currentTemplate > -1 ){\r\n if ( !multiSelect ){\r\n $scope.recordedAnswers[currentTemplate].answers = answer;\r\n $scope.recordedAnswers[currentTemplate].recommendation = recommendedPlan;\r\n } else {\r\n $scope.recordedAnswers[currentTemplate].answers = $scope.savedAnswers;\r\n $scope.recordedAnswers[currentTemplate].recommendation = recommendedPlan;\r\n }\r\n // if recordedAnswers is an empty string or an entry for the templateid does not exist, add the entry\r\n } else {\r\n $scope.recordedAnswers.push({\"templateid\": templateid, \"answers\": answer, \"recommendation\": recommendedPlan});\r\n }\r\n };\r\n\r\n // Retrieve previously saved answers when navigating using the Previous button\r\n $scope.getRecordedAnswer = function (templateid) {\r\n // Finding which spot in the array we are using\r\n function getIndexOf(quizList,currentPath) {\r\n for (var k=0; k < quizList.length; k++) {\r\n if (quizList[k].templateid==currentPath) {\r\n return k;\r\n }\r\n }\r\n // If not found, return -1\r\n return -1;\r\n }\r\n // Get index of template in recorded answers array\r\n var currentTemplate = getIndexOf($scope.recordedAnswers,templateid);\r\n\r\n if (currentTemplate > -1) {\r\n // Determine if the template uses checkboxes to display options, so we can set the checkboxes for the selected options\r\n var setCheckboxValues = $scope.quizInformation.templates[templateid].useCheckboxOptions;\r\n\r\n //$scope.savedAnswers needs to be an array or else it will cause errors so we need to make sure that we set that value as an array. It might be coming in as a string or an array (which typeof evaluates as object) here based on the V2 JSON schema. \r\n $scope.savedAnswers = typeof $scope.recordedAnswers[currentTemplate].answers === 'object' ? $scope.recordedAnswers[currentTemplate].answers : [$scope.recordedAnswers[currentTemplate].answers];\r\n \r\n // Call $scope.setNextTemplate so the nexttemplateid will be set correctly. This is necessary when the user is navigating back and forth with the Previous/Next buttons to maintain the correct next template\r\n $scope.setNextTemplate($scope.recordedAnswers[currentTemplate].answers);\r\n\r\n // loop over the options for the template. If any are found in the saved answers, append them to the savedOptionClasses array so the corresponding builbs will properly light up\r\n var templateOptions = $scope.quizInformation.templates[templateid].options;\r\n for (var i=0; i < templateOptions.length; i++) {\r\n if ($scope.savedAnswers.indexOf(templateOptions[i].value) > -1) {\r\n $scope.savedOptionClasses.push(templateOptions[i].optionclass);\r\n // If the template used checkboxes, set the value\r\n if (setCheckboxValues) {\r\n $scope.checkboxes[templateOptions[i].value].isChecked = true;\r\n }\r\n }\r\n \r\n }\r\n } else {\r\n $scope.savedAnswers = [];\r\n }\r\n };\r\n\r\n\r\n \r\n // Handles all of the actions when a user selects an answer.\r\n $scope.selectAnswer = function (answer, option) {\r\n \r\n // When viewing the start template check if the branch path has changed and clear saved data when it does\r\n if ($scope.templateid === $scope.quizInformation.starttemplateid) {\r\n var newSelectedPath = answer;\r\n // If changing paths, clear recorded answers so they don't interfere with results\r\n if (newSelectedPath != $scope.selectedPath) {\r\n $scope.recordedAnswers = [];\r\n }\r\n // Set the new path\r\n $scope.selectedPath = newSelectedPath;\r\n }\r\n\r\n // Otherwise processes the selection\r\n $scope.saveAnswerData(answer, option, $scope.templateInfo.allowMultipleSelection);\r\n $scope.saveRecordedAnswers($scope.templateid, answer, $scope.templateInfo.allowMultipleSelection);\r\n $scope.setNextTemplate(answer);\r\n };\r\n\r\n\r\n $scope.loadNextTemplate = function (direction) {\r\n // Submitting the answers; quizinstanceid, template, answer {quizinstanceid: 1, template: 'quiz-step-1.html', answer: 'my answer'}\r\n var data = {}; \r\n\r\n data = {\r\n quizinstanceid : $scope.quizInstance,\r\n template : $scope.templateInfo.path,\r\n answer : $scope.savedAnswers.toString()\r\n };\r\n\r\n qsrv.answerQuiz(data)\r\n .then(function (response){\r\n var r = util.lowerCaseKeys( response );\r\n if (!r.data.success) {\r\n $scope.es.setError('error-top-level',r.data.message);\r\n }\r\n });\r\n\r\n // Rebuild the recommendedPlan array on every template load, so we can get a clean recommendation from the recorded answers for all templates that have been views so far\r\n $scope.recommendedPlan = [];\r\n for (var x=0; x<$scope.recordedAnswers.length; x++) {\r\n $scope.recommendedPlan.push($scope.recordedAnswers[x].recommendation);\r\n }\r\n $scope.recommendation = $scope.getRecommendation($scope.recommendedPlan);\r\n\r\n // Hide buttons and clear saved buttons on template change\r\n $scope.showPreviousButton = false;\r\n $scope.showNextButton = false;\r\n $scope.savedAnswers = [];\r\n $scope.savedOptionClasses = [];\r\n \r\n var template = direction === 0 ? $scope.previoustemplateid : $scope.nexttemplateid;\r\n // Set pageload template based on whether previous or next button is selected\r\n $scope.pageload = '/view/templates/quiz/' + $scope.quizInformation.templates[template].path;\r\n // If the template uses checkboxes to display the options, we need to build on object to use as the model for the checkboxes\r\n if ($scope.quizInformation.templates[template].useCheckboxOptions) {\r\n $scope.checkboxes = {};\r\n for (var x=0; x<$scope.quizInformation.templates[template].options.length; x++) {\r\n $scope.checkboxes[$scope.quizInformation.templates[template].options[x].value] = { 'isChecked': false};\r\n }\r\n } else {\r\n $scope.checkboxes = {};\r\n }\r\n // Retrieve the selected answers for template before loading it and determining the new templateid\r\n $scope.loadTemplate(template, direction);\r\n $scope.getRecordedAnswer(template);\r\n\r\n };\r\n \r\n \r\n // calls quizService.completeQuiz() \r\n $scope.completeQuiz = function () {\r\n var data = {};\r\n data = {\r\n quizinstanceid: $scope.quizInstance,\r\n result: $scope.recommendation\r\n };\r\n qsrv.completeQuiz(data)\r\n .then(function (response) {\r\n var r = util.lowerCaseKeys( response );\r\n if (!r.data.success) {\r\n $scope.es.setError('error-top-level',r.data.message);\r\n }\r\n });\r\n };\r\n \r\n // Uses the recommendationsArray and finds the highest priority result ( see results > priority in )\r\n // returns the highest priority result\r\n $scope.getRecommendation = function ( answersArray ) {\r\n var returnValue = '';\r\n // Stores the index value of the priority of the recommendation. The lower the value the higher the priority. Set to a high number to start so it will always correctly lower the first iteration of the loop, below\r\n var recIndex = 100000;\r\n var recValue= '';\r\n var priority = 0;\r\n for (var a = 0; a < answersArray.length; a++) {\r\n recValue = answersArray[a];\r\n priority = $scope.quizInformation.results.priority.indexOf(recValue);\r\n // If the recommendation has not been set or the priority of the recommendation is lower than the currently selected recommendation, set the recommendation to the new value, because it has highter priority\r\n if (priority < recIndex) {\r\n recIndex = priority;\r\n returnValue = recValue;\r\n }\r\n }\r\n return returnValue;\r\n\r\n };\r\n \r\n // executes the jsvent specified, should validate that it only allows “ga()” jsevents, any other event should be console logged and not executed (silent error)\r\n $scope.fireJsEvent = function (conversionIndex) {\r\n var jsevents = $scope.quizInformation.results.definitions[$scope.recommendation].conversions[conversionIndex].jsevents;\r\n\r\n // Verify that only ga calls are run\r\n if (jsevents.substring(0,2)=='ga') {\r\n // Dynamic function call for google analytics call retrieved from \r\n var callGA = function () {\r\n eval(jsevents);\r\n }; \r\n callGA();\r\n } else {\r\n console.log(jsevents);\r\n }\r\n\r\n var productcode = $scope.quizInformation.results.definitions[$scope.recommendation].productcodeannual;\r\n var url = $scope.quizInformation.results.definitions[$scope.recommendation].conversions[conversionIndex].link;\r\n // Apped the product code to the url if the recommendation is not basic or enterprise\r\n if ($scope.recommendation != 'enterprise' && $scope.recommendation != 'basic') {\r\n if (url.indexOf('?') > -1) {\r\n url = url + \"&productcode=\"+productcode;\r\n } else {\r\n url = url + \"?productcode=\"+productcode;\r\n }\r\n }\r\n //open the buy now link in a new window\r\n w.open(url, 'newpricingwindow');\r\n };\r\n\r\n $scope.togglePrice = function(){\r\n // Change this to show and hide divs now\r\n $scope.useAnnualPricing = !$scope.useAnnualPricing;\r\n \r\n };\r\n\r\n init();\r\n}]);\r\n"]}