{"version":3,"sources":["SemanticStatementDropdown.js"],"names":["$","window","THF","Interface","SemanticStatementDropdown","container","options","$buttonQuote","current","data","extend","selectors","parentElem","panelWrapper","btnOption","panel","matrix","location","age","membership-type","cover-type","$parent","$panel","$container","start","statement-summary","$dropdown","$panelElem","selector","bindEvents","off","on","eventButtonQuote","eventDropdownUpdate","e","doAction","name","this","attr","value","val","parseInt","toString","populateStatementSummary","setLinkHref","Utility","DatalayerTracking","track","type","moduleMode","action","actionCategory","actionValue","select","text","state","membershipType","coverType","hospitalCover","ancillaryCover","matches","match","length","Location","navigateToLiveQuoteTool","selectedValues","each","push","join","filteredCoverTypeData","_","filter","item","result","indexOf","coverTypeValueLength","coverTypeValue","coverTypes","defaultOption","html","append","option","i","label","prop","selectpicker","trackIfElementInViewport","jQuery","document"],"mappings":"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","file":"semantic-statement-dropdown.min.js","sourcesContent":["/**\r\n * Twiddly dee twiddly dumb,\r\n * This is a file that had little use of my thumb.\r\n * - Blanksy\r\n */\r\n(function ($, window, document, undefined) {\r\n 'use strict';\r\n \r\n \r\n \r\n\r\n window.THF = window.THF || {};\r\n window.THF.Interface = window.THF.Interface || {};\r\n window.THF.Interface.SemanticStatementDropdown = function (container, options) {\r\n var current = {\r\n panel: 'statement-summary',\r\n }\r\n /**\r\n * CONSTANTS\r\n */\r\n var GOTO_DIRECTION_FORWARD = 1;\r\n var GOTO_DIRECTION_BACK = 1;\r\n\r\n /**\r\n * Default values for the code below to function.\r\n *\r\n * @type {{selectors: {parentElem: string, btnOption: string, panel: string}, data: {}}}\r\n */\r\n var defaults = {\r\n selectors: {\r\n //Module Parent\r\n parentElem: '.semantic-statement',\r\n panelWrapper: '.panel-wrapper',\r\n btnOption: 'a.option',\r\n panel: '.panel'\r\n },\r\n matrix: []\r\n };\r\n\r\n /**\r\n *\r\n */\r\n options = $.extend(true, {}, defaults, options);\r\n\r\n /**\r\n * Breadcrumb for the back button, this is pushed and popped\r\n * as the panels are navigated.\r\n *\r\n * @type {Array}\r\n */\r\n var panelPosition = [];\r\n\r\n /**\r\n *\r\n * @type {{location: string, age: string, membership-type: string, cover-type: string}}\r\n */\r\n var data = {\r\n 'location': '',\r\n 'age': '',\r\n 'membership-type': '',\r\n 'cover-type': ''\r\n };\r\n\r\n /**\r\n * Declare DOM elements\r\n */\r\n var $parent = $(container);\r\n var $panelWrapper = $container(options.selectors.panelWrapper);\r\n var $allPanels = $container('.panel');\r\n var $panel = {\r\n 'start': $container('.panel.start'),\r\n 'location': $container('.panel.location'),\r\n 'age': $container('.panel.age'),\r\n 'membership-type': $container('.panel.membership-type'),\r\n 'cover-type': $container('.panel.cover-type'),\r\n 'statement-summary': $container('.panel.statement-summary')\r\n };\r\n var $dropdown = {\r\n 'location': $panelElem('statement-summary', 'select[name=\"location\"]'),\r\n 'age': $panelElem('statement-summary', 'select[name=\"age\"]'),\r\n 'membership-type': $panelElem('statement-summary', 'select[name=\"membership-type\"]'),\r\n 'cover-type': $panelElem('statement-summary', 'select[name=\"cover-type\"]')\r\n };\r\n\r\n\r\n /**\r\n * Helper function to return a jquery object, which is a child of 'parentElem'\r\n *\r\n * @param {string} selector\r\n * @returns {*|HTMLElement}\r\n */\r\n function $container(selector) {\r\n return $(selector, $parent);\r\n }\r\n\r\n /**\r\n *\r\n * @param {string} panel\r\n * @param {string} selector\r\n * @returns {*|HTMLElement}\r\n */\r\n function $panelElem(panel, selector) {\r\n return $(selector, $container('.panel.' + panel));\r\n }\r\n\r\n\r\n /**********************************\r\n // Event Binding\r\n **********************************/\r\n /**\r\n * Binds the events to the relevant DOM elements.\r\n *\r\n * Note: The .off() is necessary as it allows for the\r\n * rebinding of the events when new options are added.\r\n */\r\n var $buttonQuote;\r\n var bindEvents = function () {\r\n $buttonQuote = $container('.btn-quote');\r\n $buttonQuote.off('click').on('click', eventButtonQuote);\r\n \r\n $dropdown.age.off('change', eventDropdownUpdate).on('change', eventDropdownUpdate);\r\n $dropdown.location.off('change', eventDropdownUpdate).on('change', eventDropdownUpdate);\r\n $dropdown['membership-type'].off('change', eventDropdownUpdate).on('change', eventDropdownUpdate);\r\n $dropdown['cover-type'].off('change', eventDropdownUpdate).on('change', eventDropdownUpdate);\r\n\r\n\r\n };\r\n\r\n var eventDropdownUpdate = function (e) {\r\n var doAction = false;\r\n var name = $(this).attr('name');\r\n var value = $(this).val();\r\n\r\n if( name == 'location' ) {\r\n doAction = true;\r\n data.location = value;\r\n }\r\n else if( name == 'age' ) {\r\n doAction = true;\r\n data.age = parseInt(value,10);\r\n //Reset the default dropdown value\r\n data['cover-type'] = '';\r\n }\r\n else if( name == 'membership-type' ) {\r\n doAction = true;\r\n data['membership-type'] = value;\r\n //Reset the default dropdown value\r\n data['cover-type'] = '';\r\n }\r\n else if( name == 'cover-type' ) {\r\n doAction = true;\r\n data['cover-type'] = value.toString();\r\n }\r\n if( doAction ) {\r\n populateStatementSummary();\r\n setLinkHref();\r\n }\r\n\r\n THF.Utility.DatalayerTracking.track('SemanticStatement', {\r\n type: options.moduleMode,\r\n action: 'dropdown-select',\r\n panel: current.panel,\r\n actionCategory: name,\r\n actionValue: getAnalyticsSelectLabelValue($(this))\r\n });\r\n };\r\n\r\n // Chrome was cancelling the redirect request so instead of redirecting via JS update the href attribute.\r\n var setLinkHref = function() {\r\n var state = data.location;\r\n var membershipType = data['membership-type'];\r\n var coverType = data['cover-type'];\r\n var hospitalCover = '';\r\n var ancillaryCover = '';\r\n\r\n //If the cover-type and state dropdowns are empty/default copy, then reset default href.\r\n if(coverType === '' || state === ''){\r\n $buttonQuote.attr(\"href\", \"#\");\r\n }\r\n \r\n if(\r\n state !== '' &&\r\n membershipType !== '' &&\r\n coverType !== ''\r\n ) {\r\n \r\n var matches = coverType.match(/^[0-9]+\\-([a-zA-Z0-9]*)\\|([a-zA-Z0-9]*)?$/);\r\n if (matches.length === 3) {\r\n hospitalCover = matches[1];\r\n ancillaryCover = matches[2];\r\n }\r\n\r\n $buttonQuote.attr(\"href\", THF.Utility.Location.navigateToLiveQuoteTool(state, membershipType, hospitalCover, ancillaryCover, data.age)); \r\n }\r\n\r\n \r\n };\r\n\r\n var eventButtonQuote = function(e) {\r\n THF.Utility.DatalayerTracking.track('SemanticStatement', {\r\n type: options.moduleMode,\r\n action: 'button-click',\r\n panel: current.panel,\r\n actionCategory: 'Get a quote now',\r\n actionValue: getAnalyticsQuoteLabelValue()\r\n });\r\n };\r\n\r\n function getAnalyticsQuoteLabelValue() {\r\n var selectedValues = [];\r\n $('select', $panel['statement-summary']).each(function () {\r\n selectedValues.push($(':selected', this).text());\r\n });\r\n\r\n return selectedValues.join(' | ');\r\n }\r\n \r\n function getAnalyticsSelectLabelValue(select) {\r\n return $(':selected', select).text();\r\n }\r\n\r\n /**\r\n * When clicking the get stared link this happens.\r\n *\r\n * @param e An event object that is returned from jQuery Events.\r\n */\r\n var eventGetStarted = function (e) {\r\n e.preventDefault();\r\n panelPosition.push('start');\r\n gotoPanel('location');\r\n };\r\n\r\n /**\r\n * When clicking on any of the back buttons this event is triggered.\r\n *\r\n * @param e An event object that is returned from jQuery Events.\r\n */\r\n var eventButtonBack = function (e) {\r\n e.preventDefault();\r\n var panel = panelPosition.pop();\r\n gotoPanel(panel, GOTO_DIRECTION_BACK);\r\n };\r\n\r\n /**\r\n * When clicking on any of the options in the panels before the Semantic\r\n * statement this is the event that pushes you forwards.\r\n *\r\n * @param e An event object that is returned from jQuery Events.\r\n */\r\n var eventButtonOption = function (e) {\r\n e.preventDefault();\r\n\r\n var element = $(this);\r\n\r\n var type = element.data('type');\r\n var value = element.data('value');\r\n var text = $('span', element).text();\r\n\r\n // Ensure we have the panel that we are saying we are selecting.\r\n var validOption = (typeof data[type] !== 'undefined');\r\n if (validOption) {\r\n data[type] = value;\r\n var eventAction = null;\r\n var panel = '';\r\n switch (type) {\r\n case 'location':\r\n eventAction = 'Step 2';\r\n panel = 'age';\r\n break;\r\n case 'age':\r\n eventAction = 'Step 3';\r\n panel = 'membership-type';\r\n break;\r\n case 'membership-type':\r\n eventAction = 'Step 4';\r\n panel = 'cover-type';\r\n break;\r\n case 'cover-type':\r\n eventAction = 'Step 5';\r\n panel = 'statement-summary';\r\n break;\r\n }\r\n\r\n if (eventAction !== null) {\r\n THF.Utility.DatalayerTracking.track('SemanticStatement', {\r\n type: options.moduleMode,\r\n action: 'button-click',\r\n panel: panel,\r\n actionCategory: null,\r\n actionValue: text\r\n });\r\n }\r\n\r\n if (_.indexOf(panelPosition, type) == -1) {\r\n panelPosition.push(type);\r\n }\r\n gotoPanel(panel);\r\n }\r\n else {\r\n // console.log('ERROR: Invalid data type: ' + type);\r\n }\r\n };\r\n\r\n /**\r\n * Selects the relevant cover types to display based\r\n * on the selections of age and membership-type.\r\n */\r\n var filteredCoverTypeData = function () {\r\n /**\r\n * We only want to get cover types that are of the\r\n * age range and that are of the correct membership type.\r\n */\r\n var results = _.filter(options.matrix, function (item) {\r\n\r\n var result = true;\r\n // Only get the cover types which are related to the selected membership type.\r\n if (data['membership-type'] != item['membership-type']) {\r\n result = false;\r\n }\r\n\r\n // Filter the cover types by the ages that are in the array.\r\n if (result === true && _.indexOf(item.age, parseInt(data.age, 10)) == -1) {\r\n result = false;\r\n }\r\n\r\n // Alrighty then, lets return the result here.\r\n return result;\r\n });\r\n return results;\r\n };\r\n\r\n var coverTypeValueLength = 0;\r\n /**\r\n * Build the cover type value from the cover type object passed in.\r\n *\r\n * @param {object} coverType\r\n * @return {string}\r\n */\r\n var coverTypeValue = function (coverType) {\r\n return (coverTypeValueLength++) + '-' + coverType.hospitalCover + '|' + coverType.ancillaryCover;\r\n\r\n };\r\n\r\n /**\r\n * Iterate over the cover types and render the markup\r\n * that needs to be injected.\r\n *\r\n * There is likely a better way of doing this, but this works\r\n * for now.\r\n */\r\n var populateCoverTypePanel = function () {\r\n coverTypeValueLength = 0;\r\n var coverTypes = filteredCoverTypeData();\r\n if (coverTypes.length > 0) {\r\n var coverType;\r\n var htmlCoverTypes = $('