{"version":3,"sources":["sub_quiz.js"],"names":["window","SUB","quizEngine","start","el","html","$","body","quizWrapper","header","$question_markup","qOrder","qCurrent","userAnswers","qSets","length","qSetCurrent","qSetComplete","question_template","_","template","quiz","init","$el","shuffle","shuffleQuestions","buildTemplate","destroy","str","location","map","o","answers","data","answer","i","a","newAnswers","oldAnswers","pattern","split","each","n","push","join","renderQuestion","appendTo","find","on","processAnswer","question","getCurrentQuestion","alert","questionText","replace","dataLayer","event","url","e","preventDefault","this","attr","textAnswer","category","action","label","next","qIndex","questions","isRemainingQSet","nextQSet","matches","findMatches","lookAhead","advanceSlides","exit","nextSet","without","reA","reB","matchesA","matchesB","RegExp","re","filter","test","winner","result","b","match","Math","floor","random","name","addEventListener","imgLoaded","click","$sections","$collapseSection","first","sectionMove","outerHeight","TweenMax","to","marginTop","ease","Circ","easeInOut","onComplete","remove","img","$img","$parent","parent","css"],"mappings":"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","file":"sub_quiz.js","sourcesContent":["window.SUB = window.SUB || {};\r\n\r\nSUB.quizEngine = {\r\n\tstart : function(){\r\n\r\n\t\tSUB.el = {\r\n\t\t\twindow : window,\r\n\t\t\thtml : $('html'),\r\n\t\t\tbody : $('body'),\r\n\t\t\tquizWrapper: $('#quiz_wrapper'),\r\n\t\t\theader : $('header')\r\n\t\t};\r\n\r\n\t // Quiz logic, from Tom Deater\r\n\t\tvar qOrder = [ [0, 1, 2, 3, 4], [0, 1, 2, 3] ];\r\n\r\n\t\tvar qCurrent = [0, 0];\r\n\r\n\t\tvar userAnswers = [ [], [] ];\r\n\r\n\t\tvar qSets = qOrder.length;\r\n\r\n\t\tvar qSetCurrent = 0;\r\n\r\n\t\tvar qSetComplete = [false, false];\r\n\r\n\t\tvar question_template = _.template( $( \".question_template\" ).html());\r\n\r\n\t\tvar $question_markup;\r\n\r\n\t\tvar quiz = SUB.quiz = {\r\n\t\t\tinit: function ($el, shuffle) {\r\n\t\t\t\tif (shuffle) {\r\n\t\t\t\t\tquiz.shuffleQuestions();\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// init and render quiz in $el\r\n\t\t\t\tquiz.buildTemplate($el);\r\n\r\n\t\t\t\tquiz.destroy = function (str) {\r\n\t\t\t\t\t// redirect to new recipe page\r\n\t\t\t\t\tSUB.el.window.location = str;\r\n\t\t\t\t};\r\n\t\t\t},\r\n\r\n\t\t\tshuffleQuestions: function () {\r\n\t\t\t\tqOrder = _.map(qOrder, function (o) {\r\n\t\t\t\t\treturn _.shuffle(o);\r\n\t\t\t\t});\r\n\t\t\t\t//console.log('shuffled qOrder', qOrder);\r\n\r\n\t\t\t\t// adjust the answer pattern strings to align with the new question order\r\n\t\t\t\tanswers = _.map(SUB.data.answers, function (answer, i) {\r\n\t\t\t\t\treturn _.map(answer, function (a) {\r\n\t\t\t\t\t\tvar newAnswers = [];\r\n\t\t\t\t\t\tvar oldAnswers = a.pattern.split('');\r\n\t\t\t\t\t\t_.each(qOrder[i], function (n) {\r\n\t\t\t\t\t\t\tnewAnswers.push(oldAnswers[n]);\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\ta.pattern = newAnswers.join('');\r\n\t\t\t\t\t\treturn a;\r\n\t\t\t\t\t});\r\n\t\t\t\t});\r\n\t\t\t\t//console.log('adjusted answer pattern strings', answers);\r\n\t\t\t},\r\n\r\n\t\t\tbuildTemplate: function ($el) {\r\n\t\t\t\tquiz.renderQuestion();\r\n\t\t\t\t$question_markup.appendTo($el).find('button').on('click', quiz.processAnswer);\r\n\t\t\t},\r\n\r\n\t\t\trenderQuestion: function () {\r\n\t\t\t\tvar question = quiz.getCurrentQuestion();\r\n\r\n\t\t\t\tif (!question) {\r\n\t\t\t\t\t// we've reached the end of this qSet\r\n\t\t\t\t\talert('no more questions');\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tvar questionText = question.question.replace(/ /g, '-').replace(' …', '').replace(',', '').replace(/’/g, '');\r\n\t\t\t\tdataLayer.push({event: 'pageview', url: 'action/question/' + questionText});\r\n\r\n\t\t\t\t$question_markup = $(question_template(question));\r\n\t\t\t},\r\n\r\n\t\t\tprocessAnswer: function (e) {\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tuserAnswers[qSetCurrent].push($(this).attr('data-answer'));\r\n\t\t\t\tvar textAnswer = $(this).attr('data-answer-text').replace(/ /g, '_').replace(/’/g, '').replace(/,/g, '').replace(' …', '').replace('?', '').replace('.', '').replace(/!/g, '');\r\n\t\t\t\tdataLayer.push({event: 'event', category: 'quiz_detail', action: 'thats_me', label: textAnswer});\r\n\r\n\t\t\t\tquiz.next();\r\n\t\t\t},\r\n\r\n\t\t\tgetCurrentQuestion: function () {\r\n\t\t\t\tvar qIndex = qOrder[qSetCurrent][qCurrent[qSetCurrent]];\r\n\t\t\t\tvar question = SUB.data.questions[qSetCurrent][qIndex];\r\n\r\n\t\t\t\tif (!question) {\r\n\t\t\t\t\t// we've reached the end of this qSet\r\n\t\t\t\t\tqSetComplete[qSetCurrent] = true;\r\n\t\t\t\t\t//console.log('end of qset', qSetCurrent);\r\n\t\t\t\t\t// any more incomplete qSets?\r\n\t\t\t\t\tif (quiz.isRemainingQSet()) {\r\n\t\t\t\t\t\t// try the other qSet\r\n\t\t\t\t\t\tqSetCurrent = quiz.nextQSet();\r\n\t\t\t\t\t\treturn quiz.getCurrentQuestion();\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn question;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tnext: function () {\r\n\t\t\t\t// get all matches for current qSet\r\n\t\t\t\tvar matches = quiz.findMatches();\r\n\t\t\t\t//console.log('%s matches for \"%s\" in qSet %s:', matches.length, userAnswers[qSetCurrent].join(''), qSetCurrent);\r\n\t\t\t\t//console.table(matches);\r\n\r\n\t\t\t\t// exactly 1 match, or 0 remaining questions?\r\n\t\t\t\tif (matches.length === 1 || qCurrent[qSetCurrent] === qOrder[qSetCurrent].length - 1) {\r\n\t\t\t\t\t// this qSet is finished, mark it complete\r\n\t\t\t\t\tqSetComplete[qSetCurrent] = true;\r\n\t\t\t\t\t//console.log('marking qSet %s complete', qSetCurrent);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// \"look ahead\" to prune invalid paths from this qSet before proceeding\r\n\t\t\t\t\tqCurrent[qSetCurrent] = quiz.lookAhead();\r\n\r\n\t\t\t\t\tif (!qCurrent[qSetCurrent]) {\r\n\t\t\t\t\t\t// no more valid paths in this qSet\r\n\t\t\t\t\t\tqSetComplete[qSetCurrent] = true;\r\n\t\t\t\t\t\t//console.log('no more valid paths for qSet %s', qSetCurrent);\r\n\t\t\t\t\t\t//console.log('marking qSet %s complete', qSetCurrent);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// switch qSets?\r\n\t\t\t\tif (quiz.isRemainingQSet()) {\r\n\t\t\t\t\tqSetCurrent = quiz.nextQSet();\r\n\t\t\t\t\tquiz.buildTemplate(SUB.el.quizWrapper);\r\n\t\t\t\t\tSUB.advanceSlides();\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// all qSets are complete\r\n\t\t\t\t\tquiz.exit();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tnextQSet: function (n) {\r\n\t\t\t\tvar nextSet;\r\n\t\t\t\tn = (typeof n !== 'undefined') ? n : qSetCurrent;\r\n\t\t\t\tnextSet = (n < qSets - 1) ? n + 1 : 0;\r\n\t\t\t\tif (qSetComplete[nextSet]) {\r\n\t\t\t\t\treturn quiz.nextQSet(nextSet);\r\n\t\t\t\t} else {\r\n\t\t\t\t\treturn nextSet;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tisRemainingQSet: function () {\r\n\t\t\t\treturn !!_.without(qSetComplete, true).length;\r\n\t\t\t},\r\n\r\n\t\t\tlookAhead: function () {\r\n\t\t\t\tvar reA, reB, matchesA, matchesB;\r\n\r\n\t\t\t\treA = new RegExp('^' + userAnswers[qSetCurrent].join('') + 'a');\r\n\t\t\t\treB = new RegExp('^' + userAnswers[qSetCurrent].join('') + 'b');\r\n\r\n\t\t\t\tmatchesA = quiz.findMatches(reA);\r\n\t\t\t\tmatchesB = quiz.findMatches(reB);\r\n\r\n\t\t\t\t//console.log('%s lookahead matches for \"' + userAnswers[qSetCurrent].join('') + ' + a\" in qSet %s', matchesA.length, qSetCurrent);\r\n\t\t\t\t//if (matchesA.length) console.table(matchesA);\r\n\t\t\t\t//console.log('%s lookahead matches for \"' + userAnswers[qSetCurrent].join('') + ' + b\" in qSet %s', matchesB.length, qSetCurrent);\r\n\t\t\t\t//if (matchesB.length) console.table(matchesB);\r\n\r\n\r\n\t\t\t\tif (matchesA.length && matchesB.length) {\r\n\t\t\t\t\t// both paths are valid, proceed to next question\r\n\t\t\t\t\treturn qCurrent[qSetCurrent] + 1;\r\n\t\t\t\t} else if (matchesA.length) {\r\n\t\t\t\t\t// only answer A provides a valid path\r\n\t\t\t\t\t// choose 'a' and recurse\r\n\t\t\t\t\tuserAnswers[qSetCurrent].push('a');\r\n\t\t\t\t\tqCurrent[qSetCurrent]++;\r\n\t\t\t\t\t//console.log('+a (skipping question \"%s\")', quiz.getCurrentQuestion().question);\r\n\t\t\t\t\treturn quiz.lookAhead();\r\n\t\t\t\t} else if (matchesB.length) {\r\n\t\t\t\t\t// only answer B provides a valid path\r\n\t\t\t\t\t// choose 'b' and recurse\r\n\t\t\t\t\tuserAnswers[qSetCurrent].push('b');\r\n\t\t\t\t\tqCurrent[qSetCurrent]++;\r\n\t\t\t\t\t//console.log('+b (skipping question \"%s\")', quiz.getCurrentQuestion().question);\r\n\t\t\t\t\treturn quiz.lookAhead();\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// no more valid paths, stop asking questions\r\n\t\t\t\t\treturn 0;\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tfindMatches: function (re) {\r\n\t\t\t\tvar re = re || new RegExp('^' + userAnswers[qSetCurrent].join(''));\r\n\t\t\t\tvar matches = _.filter(SUB.data.answers[qSetCurrent], function (answer) {\r\n\t\t\t\t\tif (re.test(answer.pattern)) {\r\n\t\t\t\t\t\treturn answer;\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t\treturn matches;\r\n\t\t\t},\r\n\r\n\t\t\texit: function () {\r\n\t\t\t\tvar matches = [], winner, result = [];\r\n\t\t\t\t// get all matches for all qSets and display/exit\r\n\t\t\t\t_.each(qSetComplete, function (b, i) {\r\n\t\t\t\t\tqSetCurrent = i;\r\n\t\t\t\t\tmatches.push(quiz.findMatches());\r\n\t\t\t\t});\r\n\r\n\t\t\t\t//console.log('valid answers');\r\n\r\n\t\t\t\t_.each(matches, function(match) {\r\n\t\t\t\t\twinner = Math.floor(Math.random() * match.length);\r\n\t\t\t\t\tresult.push(match[winner].name);\r\n\t\t\t\t\t//console.table(match);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tquiz.destroy('recipes/'+ result.join('?td=0&profile='));\r\n\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// start Quiz\r\n\t\tquiz.init(SUB.el.quizWrapper, true);\r\n\r\n\t\t// if mobile, also fire on orientation change\r\n\t\twindow.addEventListener('orientationchange', function(){\r\n\t\t\t$('.question_img').each(\r\n\t\t\t\tfunction(){SUB.imgLoaded(this)}\r\n\t\t\t)\r\n\t\t});\r\n\r\n\t\t// set \"Let's do this\" button behavior\r\n\t\t$('#letsdothis').click(function(e){\r\n\t\t\te.preventDefault();\r\n\t\t\tdataLayer.push({event: 'event', category: 'quiz', action: 'quiz_start', label: 'quiz_lets_do_this_click'});\r\n\t\t\tSUB.advanceSlides();\r\n\t\t});\r\n\t}\r\n};\r\n\r\n// scrolling between slides\r\nSUB.advanceSlides = function(){\r\n\tvar $sections = SUB.el.quizWrapper.find('section'),\r\n\t\tsectionCount = $sections.length,\r\n\t\t$collapseSection = ($sections.first()),\r\n\t\tsectionMove = $collapseSection.outerHeight() * -1;\r\n\r\n\tTweenMax.to($collapseSection, 1, {marginTop:sectionMove, ease: Circ.easeInOut, onComplete:function(){\r\n\t\t// collapse and delete sections above, creating scroll effect\r\n\t\t$collapseSection.remove();\r\n\t}});\r\n};\r\n\r\nSUB.imgLoaded = function(img){\r\n\tvar $img = $(img),\r\n\t\t$parent = $img.parent();\r\n\r\n\t// when image loads in, replace parent's bg image source with newly-loaded image.\r\n\t// keep opaque image in place to set height of container\r\n\r\n\t$parent.css('background-image', 'url(' + $img.attr('src') + ')');\r\n\r\n};\r\n\r\n"],"sourceRoot":"/source/"}