{"version":3,"file":"horseltest.js","mappings":"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","sources":["webpack:///./horseltest.js"],"sourcesContent":["/* global jQuery, horseltestAssetsUrl, horseltestAjaxUrl, horseltestRegisterUrl, horseltestFormId */\r\n\r\n(function ($) {\r\n\r\n 'use strict';\r\n\r\n var Word = {\r\n\r\n loader: $('#loader'),\r\n body: $('body'),\r\n starter: $('#starter'),\r\n startTest: $('#start-test'),\r\n restartTest: $('#restart-test'),\r\n sectionTest: $('#test'),\r\n sectionResult: $('#result'),\r\n sectionForm: $('#form'),\r\n sectionEnd: $('#end'),\r\n noWord: $('#no-word'),\r\n progressBar: $('#progress').find('.bar'),\r\n progressText: $('#progress').find('.text'),\r\n meter: $('#meter').find('span'),\r\n form: $(`#gform_${horseltestFormId}:not(.start)`),\r\n formWrapper: $(`#gform_wrapper_${horseltestFormId}`),\r\n\r\n words: ['dukar', 'bollar', 'korgar', 'ringar', 'vantar', 'lador', 'mossor', 'pennor', 'skalar', 'knappar'],\r\n randomSequence: [],\r\n snrSequence: [],\r\n userResponse: [],\r\n postResult: {},\r\n\r\n resultLow: {\r\n 'result': 'sämre än normalt.',\r\n 'message': 'Det innebär att du bör kontakta hörselvården och boka tid för hörselundersökning hos audionom. Har du frågor, kontakta gärna HRFs rådgivningstjänst Hörsellinjen. Hörsellinjen',\r\n },\r\n\r\n resultNormal: {\r\n 'result': 'normalt.',\r\n 'message': 'Förvånad över resultatet? Om du själv tycker att du hör sämre ska du lyssna på det. Kontakta hörselvården och boka tid för hörselundersökning. Har du frågor, kontakta gärna HRFs rådgivningstjänst Hörsellinjen.'\r\n },\r\n\r\n currentMethod: null,\r\n\r\n currentWord: 0, // index of randomSequence\r\n clickCache: null,\r\n initialSNR: 4,\r\n currentSNR: 0,\r\n myStepSize: 2,\r\n\r\n lowResult: -4,\r\n // Peter säger: \"Mitt förslag är att tröskeln sätt till -4 dB istället för nuvarande -6 dB.\r\n // I övrigt samma som förut. lowRes:Number=-4;\r\n\r\n totalSteps: horseltestSteps, // Possibility to change for testing, should be 20\r\n\r\n maxSNR: 2,\r\n minSNR: -16,\r\n meanSNR: null,\r\n\r\n assetsUrl: horseltestAssetsUrl,\r\n\r\n init: function () {\r\n\r\n var loaded = 0;\r\n\r\n for (var key in this.words) {\r\n\r\n var word = this.words[key],\r\n method = 'say' + Util.ucFirst(word);\r\n\r\n this[method] = new Howl({\r\n src: [this.assetsUrl + '/sounds/' + word + '.wav', this.assetsUrl + '/sounds/' + word + '.mp3'],\r\n onload: function(){\r\n loaded++;\r\n if (this.words.length == loaded) {\r\n\r\n this.background = new Howl({\r\n src: [this.assetsUrl + '/sounds/white-noise.wav', this.assetsUrl + '/sounds/white-noise.mp3'],\r\n loop: true,\r\n onload: function(){\r\n\r\n // Preload ready\r\n this.randomSequence = this.generateSequence(this.words);\r\n\r\n this.loader.hide();\r\n this.starter.show();\r\n\r\n this.currentSNR = this.initialSNR;\r\n //console.log('settings currentSNR to: ' + this.initialSNR);\r\n\r\n this.bindTestEvents();\r\n\r\n // debug only!\r\n // this.placeResult(0, 5.862723967249723);\r\n\r\n }.bind(this)\r\n });\r\n }\r\n\r\n }.bind(this),\r\n onend: function(){\r\n this.noise('fadeout');\r\n }.bind(this)\r\n });\r\n\r\n }\r\n\r\n },\r\n\r\n generateSequence: function(words)\r\n {\r\n\r\n var usedWords = [],\r\n randomSequence = [],\r\n currentSelect = null,\r\n lastSelect = null,\r\n randomIndex = null,\r\n count = 0,\r\n slot = 0;\r\n\r\n for (var i = 0; i < this.totalSteps; i++) {\r\n\r\n do {\r\n\r\n randomIndex = Util.random(0, 9, true);\r\n\r\n } while (randomIndex == lastSelect || usedWords[randomIndex] >= 3);\r\n\r\n count = usedWords[randomIndex] || 0;\r\n usedWords[randomIndex] = parseInt(count + 1);\r\n\r\n randomSequence[i] = words[randomIndex];\r\n lastSelect = randomIndex;\r\n\r\n }\r\n\r\n // // debug to check if a word occurs more then 3 times.\r\n // for (var key in usedWords) {\r\n // console.log(key + ' : ' + usedWords[key]);\r\n // }\r\n\r\n // debug the sequence.\r\n //console.log('randomSequence generated:');\r\n for (var key in randomSequence) {\r\n //console.log(key + ' : ' + randomSequence[key]);\r\n }\r\n\r\n return randomSequence;\r\n\r\n },\r\n\r\n bindTestEvents: function()\r\n {\r\n\r\n // console.log(this.randomSequence);\r\n // console.log(this);\r\n\r\n this.startTest.on('click', function(e){\r\n\r\n e.preventDefault();\r\n\r\n /*if ($(\"input[name='gender']\").val() == \"\") {\r\n window.location = \"/\";\r\n }*/\r\n\r\n this.starter.fadeOut(500);\r\n\r\n //console.log('start the test...');\r\n\r\n if (this.body.hasClass('testing')) return;\r\n if (this.startTest.hasClass('disable')) return;\r\n\r\n this.body.addClass('testing');\r\n // this.startTest.addClass('hidden');\r\n // this.noWord.css({ 'display' : 'block' });\r\n\r\n this.progressBar.closest('div').show();\r\n\r\n setTimeout( function() { this.playNextWord(); }.bind(this), 1600);\r\n\r\n\r\n //check if progessbar in window\r\n var winScrollTop = $(window).scrollTop();\r\n var winHeight = $(window).height();\r\n //var progressY = $(\"#progress .text\").offset().top + $(\"#progress .text\").height();\r\n var progressY = $(\"#progress\").offset().top + $(\"#progress\").height();\r\n var iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;\r\n var chrome = /CriOS/.test(navigator.userAgent);\r\n \r\n if( winHeight + winScrollTop < progressY) {\r\n var body = $(\"html, body\");\r\n var destY = progressY - winHeight;\r\n \r\n if (iOS && $(window).width() >= 480 && !chrome) {\r\n destY += 50;\r\n }\r\n body.delay(1500).animate({scrollTop:destY}, '100');\r\n }\r\n \r\n\r\n }.bind(this));\r\n\r\n this.restartTest.on('click', function(e){\r\n\r\n e.preventDefault();\r\n\r\n this.sectionResult.fadeOut(200, function(){\r\n\r\n //console.log('restarting test');\r\n\r\n this.randomSequence = this.generateSequence(this.words);\r\n this.snrSequence = [];\r\n this.userResponse = [];\r\n\r\n //console.log('blanking snrSequence');\r\n //console.log('blanking userResponse');\r\n\r\n this.currentWord = 0;\r\n this.currentSNR = this.initialSNR;\r\n this.clickCache = null;\r\n\r\n //console.log('currentWord: ' + this.currentWord);\r\n //console.log('currentSNR: ' + this.currentSNR);\r\n\r\n Howler.unmute();\r\n\r\n this.body.removeClass('testing');\r\n this.body.removeClass('is-playing');\r\n this.starter.show();\r\n // this.noWord.hide();\r\n\r\n // reset progressbar\r\n // this.progressBar.closest('div').hide();\r\n this.progressText.text(0 + '/' + this.randomSequence.length);\r\n this.progressBar.attr('style', '');\r\n\r\n this.sectionTest.fadeIn(200);\r\n\r\n\r\n }.bind(this));\r\n\r\n this.sectionEnd.fadeOut(200, function(){\r\n\r\n }.bind(this));\r\n\r\n }.bind(this));\r\n\r\n this.body.on('click', '.select-word', function(e){\r\n e.preventDefault();\r\n\r\n if (!this.body.hasClass('testing')) return;\r\n\r\n var selectedElement,\r\n selectedWord;\r\n\r\n if (this.clickCache !== null) {\r\n //console.log('we have a triggered click ... selecting word');\r\n selectedElement = $('li.select-word[data-word=' + this.clickCache + ']');\r\n selectedWord = this.clickCache;\r\n //console.log('clearing cache...');\r\n this.clickCache = null;\r\n } else {\r\n selectedElement = $(e.currentTarget);\r\n selectedWord = selectedElement.data('word');\r\n }\r\n\r\n selectedElement.addClass('tap');\r\n setTimeout(this.removeTap, 200);\r\n\r\n // handle early click\r\n if (this.body.hasClass('is-playing')) {\r\n //console.log('early click, caching work...');\r\n this.clickCache = selectedWord;\r\n return;\r\n }\r\n\r\n this.body.addClass('is-playing');\r\n\r\n this.progressText.text((this.currentWord + 1) + '/' + this.randomSequence.length);\r\n\r\n var position = (this.currentWord + 1) / this.randomSequence.length * 100 + '%',\r\n orientation = (this.body.hasClass('is-mobile')) ? 'height' : 'width';\r\n\r\n // console.log(orientation + ' : ' + position);\r\n\r\n this.progressBar.css(orientation, position);\r\n\r\n //console.log('User selected \"' + selectedWord + '\"');\r\n\r\n // Test.as userResponse\r\n this.collectInfo(selectedWord);\r\n\r\n // console.log(this.currentWord);\r\n // console.log(this.randomSequence.length);\r\n\r\n if (this.currentWord === (this.randomSequence.length - 1)) {\r\n\r\n // That's all folks!\r\n //console.log('Last word!');\r\n\r\n // Stop all sounds.\r\n Howler.mute();\r\n this.body.removeClass('is-playing');\r\n\r\n var result = this.calculateResult();\r\n /*var result = -4.5;*/\r\n this.showResults(result);\r\n\r\n if(typeof(ga) !== 'undefined') {\r\n ga('send', 'pageview', 'https://horseltestaren.se/result/');\r\n }\r\n\r\n const lowResult = (result > this.lowResult) ? \"Ja\" : \"Nej\";\r\n const step = this.sectionForm.data('step');\r\n this.sectionForm.attr('data-step', parseInt(step)+1);\r\n\r\n const $formWrapper = $(`#gform_wrapper_${horseltestFormId}`);\r\n $formWrapper.find('[data-input=\"result\"]').val(result);\r\n $formWrapper.find('[data-input=\"isLow\"]').val(lowResult);\r\n $formWrapper.find('.gform_next_button').last().click();\r\n // this.formWrapper.show();\r\n // this.form.find('.gform_page').hide().last().show();\r\n\r\n\r\n // $.post(horseltestRegisterUrl, {\r\n // 'action': 'register_answer',\r\n // 'result' : result,\r\n // 'gender' : $('input[name=\"gender\"]').val(),\r\n // 'age' : $('input[name=\"age\"]').val(),\r\n // 'assessment' : $('input[name=\"assessment\"]').val(),\r\n // 'source': 'Webb'\r\n\r\n // }, function(data){\r\n\r\n // }.bind(this),'json');\r\n \r\n } else {\r\n\r\n this.checkWord(this.randomSequence[this.currentWord], selectedWord);\r\n this.currentWord++;\r\n this.playNextWord();\r\n\r\n // MyGlobal.checkWord(word);\r\n // MyGlobal.playSound(1, MyGlobal.sequence[MyGlobal.iteration]);\r\n // MyGlobal.adjustVolume();\r\n\r\n\r\n }\r\n\r\n\r\n }.bind(this));\r\n\r\n },\r\n\r\n removeTap: function()\r\n {\r\n\r\n $('.select-word').removeClass('tap');\r\n\r\n },\r\n\r\n playNextWord: function()\r\n {\r\n\r\n if (this.currentWord > 0 && typeof this.stop === 'function') {\r\n this.stop();\r\n }\r\n\r\n this.play(this.randomSequence[this.currentWord]);\r\n\r\n },\r\n\r\n checkWord: function(question, answer)\r\n {\r\n\r\n if (question === answer) {\r\n //console.log('User answered correctly! Make it harder...');\r\n\r\n this.currentSNR -= this.myStepSize;\r\n\r\n if (this.currentSNR < this.minSNR) {\r\n this.currentSNR = this.minSNR;\r\n }\r\n\r\n } else {\r\n\r\n //console.log('User failed! Make it easier...');\r\n\r\n this.currentSNR += this.myStepSize;\r\n\r\n if (this.currentSNR > this.maxSNR) {\r\n this.currentSNR = this.maxSNR;\r\n }\r\n\r\n }\r\n\r\n //console.log('currentSNR: ' + this.currentSNR);\r\n\r\n },\r\n\r\n calculateResult: function()\r\n {\r\n\r\n var result = 0;\r\n\r\n // Measure last 10 answers; calculate and return avarage SNR\r\n for (var i = (this.randomSequence.length - this.words.length); i < this.randomSequence.length; i++) {\r\n\r\n result += this.snrSequence[i];\r\n\r\n }\r\n\r\n return (result / this.words.length);\r\n\r\n },\r\n\r\n play: function(word)\r\n {\r\n\r\n var volume,\r\n method = 'say' + Util.ucFirst(word);\r\n\r\n this.body.addClass('is-playing');\r\n\r\n this.noise('fadein', 1.0, function(){\r\n\r\n volume = this.signalVolume();\r\n\r\n //console.log('Playing \"' + word + '\" @ volume ' + volume);\r\n\r\n this.currentMethod = this[method];\r\n this.currentMethod.volume(1.0);\r\n\r\n //console.log('initial volume:' + this.currentMethod.volume());\r\n\r\n this.currentMethod.play();\r\n this.currentMethod.volume(volume);\r\n\r\n //console.log('adjusted volume:' + this.currentMethod.volume());\r\n\r\n }.bind(this));\r\n\r\n },\r\n\r\n stop: function(word)\r\n {\r\n if (this.currentMethod == null) {\r\n return;\r\n }\r\n\r\n if (0 < this.currentWord) {\r\n this.currentMethod.stop();\r\n }\r\n this.background.stop();\r\n\r\n },\r\n\r\n noise: function(action, maxvolume, callback)\r\n {\r\n\r\n var maxvolume = maxvolume || 1.0,\r\n callback = callback || false;\r\n\r\n if ('fadein' === action) {\r\n\r\n this.body.addClass('playing');\r\n\r\n this.background.play();\r\n this.background.volume(0);\r\n this.fadeIn(this.background, 0, maxvolume, callback);\r\n return true;\r\n\r\n }\r\n\r\n if ('fadeout' === action) {\r\n\r\n this.fadeOut(this.background, null);\r\n return true;\r\n\r\n }\r\n\r\n return false;\r\n\r\n\r\n },\r\n\r\n signalVolume: function()\r\n {\r\n\r\n // action script\r\n // myTransformSignal=new SoundTransform(soundVolume*Math.pow(10,currentSNR/20));\r\n // currentSNR = 20 * Math.log(soundChannelSignal.soundTransform.volume/soundVolume) / Math.LN10;\r\n\r\n var volume = 1.0 * Math.pow(10, this.currentSNR / 20).toFixed(2);\r\n\r\n this.currentSNR = 20 * Math.log(volume / 1.0) / Math.LN10;\r\n\r\n // if (1.0 < volume) {\r\n // console.log('Sorry mister, ' + volume + ' is too high.');\r\n // volume = 1.0;\r\n // }\r\n\r\n //console.log('volume: ' + volume);\r\n //console.log('currentSNR: ' + this.currentSNR);\r\n\r\n return volume;\r\n\r\n },\r\n\r\n fadeIn: function(sound, volume, maxvolume, callback)\r\n {\r\n\r\n var volume = parseFloat((volume + 0.01).toFixed(2));\r\n\r\n if (volume >= maxvolume) {\r\n // console.log('Current volume: ' + volume);\r\n callback();\r\n return false;\r\n } else {\r\n sound.volume(volume);\r\n }\r\n\r\n setTimeout(function(){\r\n\r\n this.fadeIn(sound, volume, maxvolume, callback);\r\n\r\n }.bind(this), 5);\r\n\r\n },\r\n\r\n fadeOut: function(sound, volume)\r\n {\r\n\r\n var volume = (volume === null) ? sound.volume() : parseFloat((volume - 0.01).toFixed(2));\r\n\r\n sound.volume(volume);\r\n\r\n if (volume < 0) {\r\n this.body.removeClass('is-playing');\r\n if (this.clickCache !== null) {\r\n //console.log('we have a cached click ... triggering...');\r\n //console.log(this.clickCache);\r\n var button = $('.select-word[data-word=' + this.clickCache + ']');\r\n if (0 < button.length) {\r\n button.trigger('click');\r\n }\r\n }\r\n return false;\r\n }\r\n\r\n\r\n setTimeout(function(){\r\n\r\n this.fadeOut(sound, volume);\r\n\r\n }.bind(this), 5);\r\n\r\n },\r\n\r\n collectInfo: function(word)\r\n {\r\n\r\n this.userResponse[this.currentWord] = word;\r\n this.snrSequence[this.currentWord] = this.currentSNR;\r\n\r\n // Debug collected info\r\n for (var key in this.userResponse) {\r\n //console.log(key + ' => ' + this.userResponse[key]);\r\n }\r\n\r\n // for (var key in this.snrSequence) {\r\n // console.log(key + ' => ' + this.snrSequence[key]);\r\n // }\r\n\r\n },\r\n\r\n showResults: function(result)\r\n {\r\n\r\n this.sectionTest.fadeOut(200, function(){\r\n\r\n this.sectionResult.fadeIn(200, function(){\r\n\r\n //console.log('Result: ' + result);\r\n //console.log('LowRes: ' + this.lowResult);\r\n\r\n var info = this.resultNormal;\r\n\r\n if (result > this.lowResult) {\r\n\r\n info = this.resultLow;\r\n\r\n }\r\n\r\n this.postResult = {};\r\n this.placeResult(result);\r\n this.sectionForm.find('.result').text(info.result);\r\n this.sectionForm.find('.result-text').html(info.message);\r\n\r\n }.bind(this));\r\n\r\n this.sectionEnd.fadeIn(200, function(){\r\n\r\n }.bind(this));\r\n\r\n }.bind(this));\r\n\r\n },\r\n\r\n placeResult: function(result)\r\n {\r\n\r\n // calcResult is also added to gravity-forms.php\r\n var calcResult = (result - this.lowResult) * -1,\r\n scaleWidth = 100,\r\n position = 0;\r\n //console.log('Calculated result: ' + calcResult);\r\n\r\n // Also added to PDF generetor in gravity-forms.php\r\n var max = 9.917600346881503,\r\n min = -8.007410902351257;\r\n \r\n var dMax = (max + Math.abs(min)) + 1;\r\n /* HACK FOR FIXING POSTION*/\r\n // orig:var dRes = (calcResult + Math.abs(min));\r\n if( calcResult > 0) {\r\n var dRes = (calcResult*0.7 + Math.abs(min));\r\n } else {\r\n var dRes = (calcResult + Math.abs(min));\r\n }\r\n\r\n /* HACK FOR FIXING POSTION*/\r\n // orig: var position = (dRes / dMax * 100),\r\n var position = (dRes / (dMax-3) * 100),\r\n marginLeft = (calcResult == max) ? '-' + this.meter.outerWidth() + 'px' : '-7px',\r\n marginLeft = (calcResult == min) ? '0px' : '-7px';\r\n\r\n //console.log( \"dmax\" + dMax + \" --dres\" + dRes);\r\n //console.log('Place marker at : ' + position + '%');\r\n\r\n // console.log('saving result for post');\r\n if (100 < position) {\r\n position = 100;\r\n }\r\n\r\n this.keepResult(max, min, this.lowResult, calcResult, (result > this.lowResult) ? true : false);\r\n\r\n if (position < 2) {\r\n position = 0;\r\n marginLeft = 0;\r\n }\r\n\r\n this.meter.css({ 'left': position + '%', 'margin-left': marginLeft});\r\n\r\n },\r\n\r\n keepResult: function(max, min, lowResult, calcResult, isLow)\r\n {\r\n\r\n this.postResult = {\r\n 'max' : max,\r\n 'min' : min,\r\n 'lowResult' : lowResult,\r\n 'calcResult' : calcResult,\r\n 'isLow' : isLow\r\n }\r\n\r\n }\r\n\r\n };\r\n\r\n var UI = {\r\n\r\n init: function()\r\n {\r\n\r\n this.menuArea = $('#header');\r\n this.menuButton = $('#toggle-menu');\r\n this.menuWrapper = $('#main-menu');\r\n this.loader = $('#loader');\r\n this.starter = $('#starter');\r\n this.progress = $('#progress');\r\n this.testWrapper = $('#button-wrapper');\r\n\r\n this.bindToggleMenu();\r\n\r\n $(window).load(function(){\r\n\r\n this.handleResize();\r\n\r\n }.bind(this));\r\n\r\n $(window).on('resize', function(){\r\n\r\n this.handleResize();\r\n\r\n }.bind(this));\r\n\r\n $(window).on('scroll', function(){\r\n\r\n this.handleScroll();\r\n\r\n }.bind(this));\r\n\r\n },\r\n\r\n handleResize: function()\r\n {\r\n\r\n var menuHeight = this.menuArea.outerHeight(),\r\n buttonHeight = this.menuButton.outerHeight(),\r\n loaderHeight = this.loader.outerHeight(),\r\n testHeight = this.testWrapper.outerHeight(),\r\n starterHeight = this.starter.outerHeight(),\r\n\r\n progressBar = this.progress.find('.bar');\r\n\r\n this.menuButton.css({ 'top' : (menuHeight - buttonHeight) / 2, 'visibility' : 'visible' });\r\n this.menuWrapper.css({ 'top' : menuHeight });\r\n\r\n this.loader.css({ 'top' : menuHeight });\r\n this.loader.find('img').css({ 'margin-top' : '-=' + menuHeight });\r\n\r\n if( $(document).height() > $(window).height()) {\r\n var tmpTop = menuHeight - $(window).scrollTop();\r\n this.starter.css({ 'top' : tmpTop });\r\n } else {\r\n this.starter.css({ 'top' : menuHeight });\r\n }\r\n\r\n \r\n\r\n // weird cloning to get height inside fixed element\r\n var holderElem = $('
').css({'height': 0, 'width': '100%', 'overflow': 'hidden'}).appendTo('body'),\r\n starterContent = $('.start-wrapper', this.starter),\r\n starterContentHeight = starterContent.clone().appendTo(holderElem).outerHeight();\r\n\r\n starterContent.css({'top' : (starterHeight / 2) - (starterContentHeight / 2) - menuHeight });\r\n\r\n holderElem.remove();\r\n\r\n if (this.menuButton.css('display') == 'none') {\r\n this.menuWrapper.show();\r\n }\r\n\r\n var position = (0 < Word.currentWord) ? (Word.currentWord + 1) / Word.randomSequence.length * 100 + '%' : false;\r\n\r\n if (this.progress.css('width') == '40px') {\r\n\r\n $('body').addClass('is-mobile');\r\n this.progress.css('height', testHeight);\r\n\r\n if (position) {\r\n progressBar.attr('style', '');\r\n progressBar.css({ 'height' : position });\r\n }\r\n\r\n } else {\r\n\r\n $('body').removeClass('is-mobile');\r\n\r\n this.progress.attr('style', '');\r\n\r\n if (position) {\r\n progressBar.attr('style', '');\r\n progressBar.css({ 'width' : position });\r\n }\r\n\r\n }\r\n\r\n },\r\n\r\n handleScroll: function()\r\n {\r\n\r\n var menuHeight = this.menuArea.outerHeight();\r\n\r\n\r\n if( $(document).height() > $(window).height()) {\r\n var tmpTop = menuHeight - $(window).scrollTop();\r\n this.starter.css({ 'top' : tmpTop });\r\n } else {\r\n this.starter.css({ 'top' : menuHeight });\r\n }\r\n\r\n },\r\n\r\n bindToggleMenu: function()\r\n {\r\n\r\n this.menuButton.on('click', function(){\r\n\r\n this.menuWrapper.slideToggle(100);\r\n\r\n }.bind(this));\r\n\r\n },\r\n\r\n centerStart: function()\r\n {\r\n\r\n\r\n\r\n }\r\n\r\n };\r\n\r\n var Recommend = {\r\n\r\n init: function()\r\n {\r\n\r\n this.formElem = $('#recommend');\r\n this.inputEmail = $('#email');\r\n this.inputMessage = $('#message');\r\n this.response = $('#response');\r\n this.submitButton = this.formElem.find('button');\r\n\r\n this.bindSubmit();\r\n\r\n },\r\n\r\n bindSubmit: function()\r\n {\r\n\r\n this.inputEmail.on('change', function(){\r\n this.response.fadeOut(200);\r\n }.bind(this));\r\n\r\n this.submitButton.on('click', function(e){\r\n\r\n e.preventDefault();\r\n\r\n var email = this.inputEmail.val(),\r\n message = this.inputMessage.val(),\r\n nonce = this.formElem.find('input[name=nonce]').val();\r\n\r\n if (email === '') return false;\r\n\r\n if (this.submitButton.hasClass('disable')) return false;\r\n\r\n this.submitButton.addClass('disable');\r\n\r\n this.response.text('').removeClass('error');\r\n\r\n if(typeof(ga) !== 'undefined') {\r\n ga('send', 'event', 'share', 'click', 'Epost');\r\n }\r\n\r\n $.post(horseltestAjaxUrl, {\r\n action: 'recommend',\r\n email: email,\r\n message: message,\r\n token: nonce\r\n\r\n }, function(data){\r\n\r\n this.submitButton.removeClass('disable');\r\n\r\n if (data.status === 'ok') {\r\n this.inputEmail.val('');\r\n this.inputMessage.val('');\r\n\r\n this.response.text(data.message).fadeIn(200).delay(2000).fadeOut(200);\r\n\r\n }\r\n\r\n if (data.status === 'error') {\r\n\r\n this.response.text(data.message).addClass('error').fadeIn(200);\r\n\r\n }\r\n\r\n\r\n }.bind(this),'json');\r\n\r\n }.bind(this));\r\n\r\n\r\n }\r\n\r\n };\r\n\r\n var sendResult = {\r\n\r\n init: function()\r\n {\r\n\r\n this.formElem = $('#send-result');\r\n this.inputEmail = $('#email');\r\n this.response = $('#response');\r\n this.submitButton = this.formElem.find('button');\r\n\r\n this.bindSubmit();\r\n\r\n },\r\n\r\n bindSubmit: function()\r\n {\r\n\r\n this.inputEmail.on('change', function(){\r\n this.response.fadeOut(200);\r\n }.bind(this));\r\n\r\n this.submitButton.on('click', function(e){\r\n\r\n e.preventDefault();\r\n\r\n var email = this.inputEmail.val(),\r\n nonce = this.formElem.find('input[name=nonce]').val();\r\n\r\n if (email === '') return false;\r\n\r\n if (this.submitButton.hasClass('disable')) return false;\r\n\r\n this.submitButton.addClass('disable');\r\n\r\n this.response.text('').removeClass('error');\r\n\r\n if(typeof(ga) !== 'undefined') {\r\n ga('send', 'event', 'result', 'send');\r\n }\r\n\r\n $.post(horseltestAjaxUrl, {\r\n\r\n action: 'send_result',\r\n email: email,\r\n result: Word.postResult,\r\n token: nonce\r\n\r\n }, function(data){\r\n\r\n this.submitButton.removeClass('disable');\r\n\r\n if (data.status === 'ok') {\r\n this.inputEmail.val('');\r\n this.response.text(data.message).fadeIn(200).delay(2000).fadeOut(200);\r\n }\r\n\r\n if (data.status === 'error') {\r\n this.response.text(data.message).addClass('error').fadeIn(200);\r\n }\r\n\r\n\r\n }.bind(this),'json');\r\n\r\n }.bind(this));\r\n\r\n }\r\n\r\n };\r\n\r\n\r\n var Start = {\r\n\r\n init: function()\r\n { \r\n const $start = $('#start');\r\n if($start.length) {\r\n $('body').addClass('js-state-start');\r\n }\r\n\r\n const $testWrapper = $('#test-wrapper:not(.force-result)');\r\n const $form = $('#form');\r\n const $resultWrapper = $('#result-form');\r\n const $formWrapper = $(`#gform_wrapper_${horseltestFormId}`);\r\n const $testAgain = $('#test-again');\r\n\r\n // Start by hiding test\r\n $testWrapper.hide();\r\n\r\n $(document).bind('gform_page_loaded', function(event, form_id, current_page){\r\n $('body').removeClass('js-state-start');\r\n\r\n $form.data('step', current_page);\r\n if(current_page == 2) {\r\n $start.hide();\r\n $testWrapper.show();\r\n\r\n $formWrapper.addClass('moved').appendTo($resultWrapper);\r\n\r\n const $firstPageForm = $(`#gform_page_${horseltestFormId}_1`);\r\n const $lastPageForm = $(`#gform_page_${horseltestFormId}_3`);\r\n const $fields = $firstPageForm.find('[data-input]');\r\n const $dataFields = $fields.filter(function(i, elem) {\r\n const $this = $(elem);\r\n return $this.val() !== '';\r\n }).map((i, elem) => {\r\n const $this = $(elem);\r\n const name = $this.data('input');\r\n const value = $this.val();\r\n $lastPageForm.find(`[data-input=\"${name}\"]`).val(value);\r\n $testAgain.find(`[name=\"${name}\"]`).val(value);\r\n });\r\n }\r\n });\r\n\r\n $('select').each( function (i, elem) {\r\n if ($(elem).val() == '' || $(elem).val() == null) {\r\n $(elem).addClass(\"default\");\r\n }\r\n \r\n });\r\n\r\n $('select').on(\"focus\", function (e) {\r\n \r\n if( $(e.currentTarget).val() == null ) {\r\n $(e.currentTarget).val(\"1960\");\r\n $(e.currentTarget).removeClass(\"default\");\r\n }\r\n })\r\n\r\n $('select').on(\"change\", this.onSelectChange);\r\n\r\n // Skip submit on start submit\r\n // $('form.start').submit(this.onStartFormSubmit);\r\n\r\n },\r\n\r\n onSelectChange: function(e)\r\n {\r\n //console.log(\"onSelectChange\");\r\n\r\n if ( $(e.currentTarget).hasClass(\"error\")) {\r\n $(e.currentTarget).removeClass(\"error\");\r\n }\r\n if ( $(e.currentTarget).hasClass(\"default\")) {\r\n $(e.currentTarget).removeClass(\"default\");\r\n }\r\n\r\n },\r\n\r\n onStartFormSubmit: function(e)\r\n {\r\n //console.log(\"onStartFormSubmit\");\r\n\r\n var error = false;\r\n\r\n $('select').each( function (i, elem) {\r\n if ($(elem).val() == '' || $(elem).val() == null) {\r\n $(elem).addClass(\"error\");\r\n error = true;\r\n }\r\n \r\n });\r\n\r\n if (error) {\r\n e.preventDefault();\r\n $(\"#error-message\").show();\r\n } \r\n\r\n }\r\n };\r\n\r\n var Util = {\r\n\r\n random: function(min, max, round)\r\n {\r\n\r\n var round = round || false,\r\n number = Math.random() * (max - min) + min;\r\n\r\n if (round) {\r\n return Math.round(number);\r\n }\r\n\r\n return number;\r\n\r\n },\r\n\r\n ucFirst: function(string)\r\n {\r\n\r\n return string.charAt(0).toUpperCase() + string.slice(1);\r\n\r\n }\r\n\r\n };\r\n\r\n UI.init();\r\n\r\n if (0 < $('#recommend').length) {\r\n Recommend.init();\r\n }\r\n\r\n if (0 < $('#test').length) {\r\n Word.init();\r\n sendResult.init();\r\n }\r\n\r\n if (0 < $('#start').length) {\r\n Start.init();\r\n }\r\n\r\n $(document).ready(function () {\r\n $('a.track').on('click', function (evt) {\r\n\r\n if (!ga.q) {\r\n if(typeof(ga) !== 'undefined') {\r\n ga('send', 'event', $(evt.currentTarget).data('category'), 'click', $(evt.currentTarget).attr('title'), {\r\n hitCallback: function() {\r\n document.location.href = evt.currentTarget.href;\r\n }\r\n });\r\n }\r\n \r\n evt.preventDefault();\r\n evt.stopImmediatePropagation();\r\n }\r\n\r\n });\r\n\r\n $(\"body\").on('click', 'a.track-extern', function (evt) {\r\n if(typeof(ga) !== 'undefined') {\r\n ga('send', 'event', $(evt.currentTarget).data('category'), 'click', $(evt.currentTarget).attr('title'));\r\n }\r\n });\r\n });\r\n\r\n}(jQuery));\r\n"],"names":["$","Word","loader","body","starter","startTest","restartTest","sectionTest","sectionResult","sectionForm","sectionEnd","noWord","progressBar","find","progressText","meter","form","concat","horseltestFormId","formWrapper","words","randomSequence","snrSequence","userResponse","postResult","resultLow","resultNormal","currentMethod","currentWord","clickCache","initialSNR","currentSNR","myStepSize","lowResult","totalSteps","horseltestSteps","maxSNR","minSNR","meanSNR","assetsUrl","horseltestAssetsUrl","init","loaded","key","this","word","Util","ucFirst","Howl","src","onload","length","background","loop","generateSequence","hide","show","bindTestEvents","bind","onend","noise","usedWords","lastSelect","randomIndex","count","i","random","parseInt","on","e","preventDefault","fadeOut","hasClass","addClass","closest","setTimeout","playNextWord","winScrollTop","window","scrollTop","winHeight","height","progressY","offset","top","iOS","test","navigator","userAgent","MSStream","chrome","destY","width","delay","animate","Howler","unmute","removeClass","text","attr","fadeIn","selectedElement","selectedWord","currentTarget","data","removeTap","position","orientation","css","collectInfo","mute","result","calculateResult","showResults","ga","step","$formWrapper","val","last","click","checkWord","stop","play","question","answer","volume","method","signalVolume","action","maxvolume","callback","Math","pow","toFixed","log","LN10","sound","parseFloat","button","trigger","info","placeResult","html","message","calcResult","max","min","dMax","abs","dRes","marginLeft","outerWidth","keepResult","isLow","Recommend","formElem","inputEmail","inputMessage","response","submitButton","bindSubmit","email","nonce","post","horseltestAjaxUrl","token","status","sendResult","Start","$start","$testWrapper","$form","$resultWrapper","$testAgain","document","event","form_id","current_page","appendTo","$firstPageForm","$lastPageForm","filter","elem","map","$this","name","value","each","onSelectChange","onStartFormSubmit","error","round","number","string","charAt","toUpperCase","slice","menuArea","menuButton","menuWrapper","progress","testWrapper","bindToggleMenu","load","handleResize","handleScroll","menuHeight","outerHeight","buttonHeight","testHeight","starterHeight","tmpTop","holderElem","starterContent","starterContentHeight","clone","remove","slideToggle","centerStart","ready","evt","q","hitCallback","location","href","stopImmediatePropagation","jQuery"],"sourceRoot":""}