{"version":3,"sources":["independent-scripts/transfer-credit-finder.js"],"names":["$","containerEl","document","querySelector","targetSelector","getValueFromSelector","selector","replace","getSelectorFromValue","value","hash","obj","uiState","animate","level","institution","window","location","split","forEach","group","pair","groupName","mixer","mixitup","multifilter","enable","animation","duration","effects","callbacks","onMixStart","state","futureState","console","log","activeFilter","onMixEnd","newHash","key","output","values","length","join","serializeUiState","getFilterGroupSelectors","map","text","val","href","indexOf","history","replaceState","title","pathname","controls","toggleDefault","load","filter","sort","course","setFilterGroupSelectors","parseFilterGroups","on","chained","change","click","this","toggleClass","attr","index","next","slideToggle","parent","hide","find","e","keyCode","which","html","siblings","slideDown","addClass","slideUp","removeClass"],"mappings":"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","file":"transfer-credit-finder.min.js","sourcesContent":["/* ========= DEGREE FINDER =========*/\r\n // INSTANTIATE MIXITUP\r\n $(function(){\r\n\r\n var containerEl = document.querySelector('#Grid');\r\n var targetSelector = '.mix';\r\n var activeHash = '';\r\n \r\n /**\r\n * Deserializes a hash segment (if present) into in an object.\r\n *\r\n * @return {object|null}\r\n */\r\n \r\n function deserializeHash() {\r\n var hash = window.location.hash.replace(/^#/g, '');\r\n var obj = null;\r\n var groups = [];\r\n \r\n if (!hash) return obj;\r\n \r\n obj = {};\r\n groups = hash.split('&');\r\n \r\n groups.forEach(function(group) {\r\n var pair = group.split('=');\r\n var groupName = pair[0];\r\n \r\n obj[groupName] = pair[1].split(',');\r\n });\r\n \r\n return obj;\r\n }\r\n \r\n /**\r\n * Serializes a uiState object into a string.\r\n *\r\n * @param {object} uiState\r\n * @return {string}\r\n */\r\n \r\n function serializeUiState(uiState) {\r\n var output = '';\r\n \r\n for (var key in uiState) {\r\n var values = uiState[key];\r\n \r\n if (!values.length) continue;\r\n \r\n output += key + '=';\r\n output += values.join(',');\r\n output += '&';\r\n };\r\n \r\n output = output.replace(/&$/g, '');\r\n \r\n return output;\r\n }\r\n \r\n /**\r\n * Constructs a `uiState` object using the\r\n * `getFilterGroupSelectors()` API method.\r\n *\r\n * @return {object}\r\n */\r\n \r\n function getUiState() {\r\n // NB: You will need to rename the object keys to match the names of\r\n // your project's filter groups – these should match those defined\r\n // in your HTML.\r\n \r\n var uiState = {\r\n level: mixer.getFilterGroupSelectors('level').map(getValueFromSelector),\r\n institution: mixer.getFilterGroupSelectors('institution').map(getValueFromSelector),\r\n //course: mixer.getFilterGroupSelectors('course').map(getValueFromSelector)\r\n // Search Not Compatible search: mixer.getFilterGroupSelectors('search').map(getValueFromSelector)\r\n };\r\n // Show current queries\r\n $(\"#queryLevel\").text(mixer.getFilterGroupSelectors('level').map(getValueFromSelector));\r\n $(\"#queryInst\").text(mixer.getFilterGroupSelectors('institution').map(getValueFromSelector));\r\n //$(\"#queryCourse\").text(mixer.getFilterGroupSelectors('course').map(getValueFromSelector));\r\n $(\"#querySearch\").text($('#finderSearch').val());\r\n return uiState;\r\n }\r\n \r\n /**\r\n * Updates the URL hash whenever the current filter changes.\r\n *\r\n * @param {mixitup.State} state\r\n * @return {void}\r\n */\r\n \r\n function setHash(state) {\r\n var selector = state.activeFilter.selector;\r\n \r\n // Construct an object representing the current state of each\r\n // filter group\r\n \r\n var uiState = getUiState();\r\n \r\n // Create a URL hash string by serializing the uiState object\r\n \r\n var newHash = '#' + serializeUiState(uiState);\r\n \r\n if (selector === targetSelector && window.location.href.indexOf('#') > -1) {\r\n // Equivalent to filter \"all\", and a hash exists, remove the hash\r\n \r\n activeHash = '';\r\n \r\n history.replaceState(null, document.title, window.location.pathname);\r\n } else if (newHash !== window.location.hash && selector !== targetSelector) {\r\n // Change the hash\r\n \r\n activeHash = newHash;\r\n \r\n history.replaceState(null, document.title, window.location.pathname + newHash);\r\n }\r\n }\r\n \r\n /**\r\n * Updates the mixer to a previous UI state.\r\n *\r\n * @param {object|null} uiState\r\n * @param {boolean} [animate]\r\n * @return {Promise}\r\n */\r\n \r\n function syncMixerWithPreviousUiState(uiState, animate) {\r\n var level = (uiState && uiState.level) ? uiState.level : [];\r\n var institution = (uiState && uiState.institution) ? uiState.institution : [];\r\n var course = (uiState && uiState.course) ? uiState.course : [];\r\n \r\n mixer.setFilterGroupSelectors('level', level.map(getSelectorFromValue));\r\n mixer.setFilterGroupSelectors('institution', institution.map(getSelectorFromValue));\r\n //mixer.setFilterGroupSelectors('course', course.map(getSelectorFromValue));\r\n \r\n // Parse the filter groups (passing `false` will perform no animation)\r\n return mixer.parseFilterGroups(animate ? true : false);\r\n }\r\n \r\n /**\r\n * Converts a selector (e.g. '.green') into a simple value (e.g. 'green').\r\n *\r\n * @param {string} selector\r\n * @return {string}\r\n */\r\n \r\n function getValueFromSelector(selector) {\r\n return selector.replace(/^./, '');\r\n }\r\n \r\n /**\r\n * Converts a simple value (e.g. 'green') into a selector (e.g. '.green').\r\n *\r\n * @param {string} selector\r\n * @return {string}\r\n */\r\n \r\n function getSelectorFromValue(value) {\r\n return '.' + value;\r\n }\r\n \r\n var uiState = deserializeHash();\r\n \r\n // Instantiate MixItUp\r\n \r\n var mixer = mixitup(containerEl, {\r\n multifilter: {\r\n enable: true,\r\n },\r\n \"animation\": {\r\n \"duration\": 500,\r\n \"effects\": \"fade scale(0.01) translateZ(100px)\"\r\n },\r\n callbacks: {\r\n onMixStart: function(state, futureState) {\r\n console.log(futureState.activeFilter.selector);\r\n },\r\n onMixEnd: setHash // Call the setHash() method at the end of each operation\r\n },\r\n controls: {\r\n toggleDefault: 'none'\r\n },\r\n load: {\r\n filter: 'none',\r\n sort: 'id:asc'\r\n }\r\n });\r\n \r\n if (uiState) {\r\n // If a valid uiState object is present on page load, filter the mixer\r\n syncMixerWithPreviousUiState(uiState);\r\n }\r\n \r\n //reset filters on refresh\r\n $(window).on('beforeunload', function(){\r\n $('#finderSearch').val('');\r\n });\r\n \r\n //Chain Selects together based on class and value\r\n $(\"#finderInstitution\").chained(\"#finderLevel\");\r\n //$(\"#finderCourse\").chained(\"#finderLevel, #finderInstitution\");\r\n \r\n //buggy On Level Change force inst. selection to reset to null and bubble up to mixer\r\n $(\"#finderLevel\").change(function(){\r\n //$(\"#finderInstitution > [value='.none']\").attr(\"selected\", \"selected\");\r\n //mixer.setFilterGroupSelectors('institution', '.none'); //reset chained list\r\n \r\n });\r\n \r\n //On Inst. Change force course selection to reset to null and bubble up to mixer\r\n // $(\"#finderInstitution\").change(function(){\r\n // $(\"#finderCourse > [value='.all']\").attr(\"selected\", \"selected\");\r\n // mixer.setFilterGroupSelectors('course', '.all'); //reset chained course list\r\n //});\r\n \r\n //$('body').addClass('loaded');\r\n \r\n // Show Query\r\n $('#queryHelp').click(function () {\r\n $(this).toggleClass(\"showLess\").attr('aria-expanded', function(index, attr){\r\n return attr === 'true' ? 'false' : 'true';\r\n });\r\n $(this).next('#queryHelper').slideToggle('fast');\r\n $(this).text($(this).text() == 'Hide Query' ? 'Show Current Query' : 'Hide Query');\r\n return false;\r\n });\r\n \r\n // Show More\r\n $('.showMore').click(function () {\r\n $(this).toggleClass(\"showLess\").attr('aria-expanded', function(index, attr){\r\n return attr === 'true' ? 'false' : 'true';\r\n });\r\n $(this).next('.more').slideToggle('fast');\r\n $(this).text($(this).text() == 'Show Less' ? 'Reveal Transfer Credit' : 'Show Less');\r\n return false;\r\n });\r\n \r\n // Expand item\r\n $('.expand').click(function () {\r\n $(this).attr('aria-expanded', function(index, attr){\r\n return attr === 'true' ? 'false' : 'true';\r\n });\r\n $(this).parent().toggleClass(\"fullSize\");\r\n $(this).parent().toggleClass(\"expanded\");\r\n return false;\r\n });\r\n \r\n //hide accordion content only if JS works\r\n $(\".acc-toggle-content\").hide();\r\n \r\n //expand first accordion for each group\r\n $(\".acc-toggle\").find(\"div:nth-of-type(2)\").toggleClass(\"active\").attr('aria-expanded', 'true').next(\"div\").slideToggle();\r\n \r\n //on accordion title click ...\r\n $(\".acc-toggle-title\").click(function(){\r\n //toggle the accordion content display mode (on/off)\r\n $(this).attr('aria-expanded', function(index, attr){\r\n return attr === 'true' ? 'false' : 'true';\r\n });\r\n $(this).toggleClass(\"active\").next(\"div\").slideToggle();\r\n });\r\n\r\n $(\".acc-toggle-title\").attr('tabindex', '0').attr('role','button').on('keyup', function(e){\r\n var keyCode = e.which;\r\n if ((keyCode === 13) || (keyCode === 32)){\r\n $(this).click();\r\n }\r\n });\r\n \r\n $(\".acc-toggle-swap\").click(function(){\r\n if ($(this).html() == \"Expand All\") {\r\n $(this).parent(\"div\").siblings(\".acc-toggle-content\").slideDown().siblings(\".acc-toggle-title\").addClass(\"active\");\r\n $(this).html(\"Collapse All\");\r\n }\r\n else {\r\n $(this).parent(\"div\").siblings(\".acc-toggle-content\").slideUp().siblings(\".acc-toggle-title\").removeClass(\"active\");\r\n $(this).html(\"Expand All\");\r\n }\r\n });\r\n \r\n });"]}