{"version":3,"file":"rpmblocks.min.js","sources":["../blocks/accordion/accordion.js","../blocks/billing/billing.js","../blocks/accolades/accolades.js","../blocks/banner/banner.js","../blocks/blockquote/blockquote.js","../blocks/blurb/blurb.js","../blocks/boxed-callout/boxed-callout.js","../blocks/calendar/calendar.js","../node_modules/@glidejs/glide/dist/glide.esm.js","../blocks/carousel/carousel.js","../blocks/post-grid/post-grid.js","../blocks/callout/callout.js","../blocks/columns/columns.js","../blocks/collage/collage.js","../blocks/image/image.js","../blocks/cta-box/cta-box.js","../blocks/markup/markup.js","../blocks/newsletter/newsletter.js","../blocks/divider/divider.js","../blocks/page-links/page-links.js","../blocks/timeline/timeline.js","../blocks/text/text.js","../blocks/title/title.js","../blocks/tony-announce/tony-announce.js"],"sourcesContent":["export const RPMAccordion = (function() {\n\t'use strict';\n\n\tlet $accordionList;\n\n\tfunction init() {\n\t\t$accordionList = $('.rpmblock--accordion__list');\n\t\tif (!$accordionList.length) return;\n\n\t\t$accordionList.each(function () {\n\t\t\trenderList(this);\n\t\t});\n\t}\n\n\tfunction renderList(list) {\n\t\tlet $question, $answer;\n\t\t$question = $(list).find('[data-accordion-target]');\n\t\t$answer = $(list).find('.rpmblock--accordion__answer');\n\n\t\t$question.on('click', function () {\n\t\t\tlet target = $(this).attr('data-accordion-target');\n\t\t\tlet expanded = $(this).attr('aria-expanded');\n\n\t\t\t$answer.slideUp();\n\t\t\t$answer.attr('aria-hidden', true);\n\t\t\t$question.attr('aria-expanded', false);\n\n\t\t\tif (expanded == 'false') {\n\t\t\t\t$(this).attr('aria-expanded', true);\n\t\t\t\t$(list)\n\t\t\t\t\t.find('#' + target)\n\t\t\t\t\t.slideDown();\n\t\t\t\t$(list)\n\t\t\t\t\t.find('#' + target)\n\t\t\t\t\t.attr('aria-hidden', false);\n\t\t\t}\n\t\t});\n\t}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMBilling = (function() {\n\t'use strict';\n\n\tlet $group;\n\n\tfunction init() {\n\t\t$group = $('.modal--billings');\n\t\tif($group.length > 0) {\n\t\t\tevents();\n\t\t}\n\t}\n\n\tfunction events() {\n\n\t\t$group.each(function(idx){\n\t\t\tlet $this = $(this);\n\t\t\tlet $prev = $group[idx-1] ? '#' + $($group[idx-1]).attr('id') : '';\n\t\t\tlet $next = $group[idx+1] ? '#' + $($group[idx+1]).attr('id') : '';\n\n\t\t\t$.ajax({\n\t\t\t\tmethod: 'GET',\n\t\t\t\turl: RPMConstants.themeDir + '/assets/svg/arrow.svg',\n\t\t\t\tdataType: 'html',\n\t\t\t}).done(function (result) {\n\t\t\t\t$('.arrow').html(result);\n\t\t\t}).fail(function (error) {\n\t\t\t\tconsole.log(error);\n\t\t\t});\n\n\t\t\t$this.append(`\n\t\t\t\t<div class=\"modal__nav\">\n\t\t\t\t\t<a href=\"`+ $prev + `\" class=\"modal__nav-prev ` + ( idx < 1 ? 'inactive' : '') + `\"><span class=\"arrow\"></span></a>\n\t\t\t\t\t<a href=\"`+ $next + `\" class=\"modal__nav-next ` + ( $next ? '' : 'inactive') + `\"><span class=\"arrow\"></span></a>\n\t\t\t\t</div>\n\t\t\t`);\n\t\t});\n\t}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMAccolades = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMBanner = (function () {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init,\n\t};\n})();\n","export const RPMBlockquote = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMBlurb = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMBoxedCallout = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMCalendar = (function () {\n\t'use strict';\n\n\tlet weeklyCalendar, calendar, performanceName, $windowWidth, breakpoint, daysOfTheWeek;\n\n\tfunction init() {\n\t\tweeklyCalendar = document.querySelector('#weekly-calendar');\n\t\tcalendar = document.querySelector('#cal');\n\t\tperformanceName = 'A-Strange-Loop';\n\t\t$windowWidth = $(window).width();\n\t\tbreakpoint = 768;\n\n\t\tdaysOfTheWeek = [\n\t\t\t'Sunday',\n\t\t\t'Monday',\n\t\t\t'Tuesday',\n\t\t\t'Wednesday',\n\t\t\t'Thursday',\n\t\t\t'Friday',\n\t\t\t'Saturday',\n\t\t];\n\n\t\tif (weeklyCalendar && weeklyCalendar.dataset.events) {\n\t\t\tweekly();\n\t\t}\n\t\tif (calendar && calendar.dataset.events) {\n\t\t\tmonthly();\n\t\t}\n\n\t\t// If mobile on init\n\t\t// if($windowWidth < breakpoint) {\n\t\t// \trenderToggle();\n\t\t// }\n\t\t// on window resize, rerender action\n\t\t// $(window).resize(function(){\n\t\t// \t$windowWidth = $(window).width();\n\t\t// \trenderToggle();\n\t\t// });\n\t}\n\n\tfunction renderToggle() {\n\t\tif($windowWidth > breakpoint) {\n\t\t\treturn;\n\t\t}\n\t\t// console.log('in it');\n\t\tlet $container = $('.rpmblock--calendar__container');\n\t\tlet $buttons = $container.find('.rpmblock--calendar__monthly-button');\n\n\t\t$buttons.each(function() {\n\n\t\t\t$(this).on('click', function(){\n\t\t\t\t// Apply active class and remove active class from siblings\n\t\t\t\t$(this).addClass('active').siblings().removeClass('active');\n\t\t\t\t\n\t\t\t\t// Finds the ID to what needs to show.\n\t\t\t\tlet button_id = $(this).attr('aria-controls');\n\n\t\t\t\t// Finds ID based off the button and updates active classes\n\t\t\t\t$container.find('.toggle-cal').removeClass('active').fadeOut();\n\t\t\t\t$container.find('.toggle-cal--' + button_id).addClass('active').fadeIn();\n\t\t\t\t$container.find('.rpmblock--calendar__monthly-info span').text(button_id);\n\n\t\t\t});\n\n\t\t});\n\t\t\n\t}\n\n\tfunction weekly() {\n\t\tvar COMMONUTILS = {\n\t\t\tpageWidth: function () {\n\t\t\t\t'use strict';\n\t\t\t\treturn document.documentElement.clientWidth;\n\t\t\t},\n\t\t\tuserLocation: function () {\n\t\t\t\t'use strict';\n\t\t\t\tSCHEDULE.initWeekly('#weekly-calendar');\n\t\t\t\tSCHEDULE.Fetch(weeklyCalendar.dataset.events, function () {\n\t\t\t\t\tSCHEDULE.Weekly('#weekly-calendar');\n\t\t\t\t});\n\t\t\t},\n\t\t};\n\n\t\tvar SCHEDULE = {\n\t\t\tTimes: null,\n\t\t\tAvail: null,\n\t\t\tSchedule: null,\n\n\t\t\tgetData: function (schedule, targetdiv, href) {\n\t\t\t\t$.getJSON(\n\t\t\t\t\tschedule,\n\t\t\t\t\t{\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t},\n\t\t\t\t\tfunction (data) {\n\t\t\t\t\t\tvar dd = new Date();\n\t\t\t\t\t\tvar dn = dd.getMonth();\n\t\t\t\t\t\tdn++; // because months are 0 indexed\n\n\t\t\t\t\t\tfor (di = 0; di <= data.schedule_info.length; di++) {\n\t\t\t\t\t\t\t// changed < to <= to compare fill length\n\t\t\t\t\t\t\tcurrentMonth = Number(data.schedule_info[0].dateID);\n\t\t\t\t\t\t\tif (currentMonth < dn) {\n\t\t\t\t\t\t\t\tdata.schedule_info.shift();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$('.cal-right').click(function (e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvar months = $('.month').length - 1;\n\t\t\t\t\t\t\tvar next = $('.month:visible').index();\n\n\t\t\t\t\t\t\tif ($('.cal-left').hasClass('inactive')) {\n\t\t\t\t\t\t\t\t$('.cal-left').removeClass('inactive');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ($('.month:visible').index() < months) {\n\t\t\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t\t\t$('.month').eq(next).fadeIn('slow');\n\t\t\t\t\t\t\t} else if ($('.month:visible').index() == months) {\n\t\t\t\t\t\t\t\t$(this).addClass('inactive');\n\t\t\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t\t\t$('.month').eq(next).fadeIn('slow');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\t$('.cal-left').click(function (e) {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvar months = 1;\n\t\t\t\t\t\t\tvar next = $('.month:visible').index() - 2;\n\t\t\t\t\t\t\tif ($('.cal-right').hasClass('inactive')) {\n\t\t\t\t\t\t\t\t$('.cal-right').removeClass('inactive');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif ($('.month:visible').index() > months) {\n\t\t\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t\t\t$('.month').eq(next).fadeIn('slow');\n\t\t\t\t\t\t\t} else if ($('.month:visible').index() == months) {\n\t\t\t\t\t\t\t\t$(this).addClass('inactive');\n\t\t\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t\t\t$('.month').eq(next).fadeIn('slow');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t},\n\n\t\t\t// Get JSON file, call appropriate parsing function after\n\t\t\tFetch: function (source, callback) {\n\t\t\t\tif (typeof source === 'string') {\n\t\t\t\t\tlet data = JSON.parse(source);\n\t\t\t\t\tSCHEDULE.Times = data.schedule_info;\n\t\t\t\t\tcallback();\n\t\t\t\t} else {\n\t\t\t\t\t$.getJSON(source, function (data) {\n\t\t\t\t\t\t// console.log('here', data);\n\t\t\t\t\t\t// Format dates if Ticketmaster calendar\n\t\t\t\t\t\tSCHEDULE.Times = data.schedule_info;\n\t\t\t\t\t\t// console.log('schedule times set');\n\t\t\t\t\t\tcallback();\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// Populates Schedule Menu\n\t\t\tPopulateWeekly: function (container, eventslist) {\n\t\t\t\t// console.log('here', eventslist);\n\n\t\t\t\t//Append ticket links to corresponding date div\n\t\t\t\tfor (var i = 0; i < eventslist.length; i++) {\n\t\t\t\t\t//var eventDate = \".\" + eventslist[i].start.slice(-5);\n\t\t\t\t\tlet eventDate = '.' + eventslist[i].start;\n\t\t\t\t\tlet eventTime = eventslist[i].title;\n\t\t\t\t\tlet isBest = eventslist[i].best ? 'event-time--best' : '';\n\t\t\t\t\tlet isBBQ = eventslist[i].bbq ? 'event-time--bbq' : '';\n\t\t\t\t\tlet eventInfo;\n\n\t\t\t\t\teventTime = eventTime.replace(':00', \"<span class='mins'>:00</span>\");\n\n\t\t\t\t\t// console.log(eventslist[i]);\n\t\t\t\t\t// var eventInfo = \"<a class='matweekly \" + isBest + \" '\" + eventTime + \" target='_blank' href='\" + eventslist[i].url + \"'>\" + eventTime + \"</a>\";\n\t\t\t\t\tif (eventslist[i].featured) {\n\t\t\t\t\t\teventInfo =\n\t\t\t\t\t\t\t\"<div class='featured-artist' href='\" +\n\t\t\t\t\t\t\teventslist[i].url +\n\t\t\t\t\t\t\t\"'><span>\" +\n\t\t\t\t\t\t\teventslist[i].featured +\n\t\t\t\t\t\t\t'</span></div>';\n\t\t\t\t\t} else {\n\t\t\t\t\t\teventInfo =\n\t\t\t\t\t\t\t\"<a class='matweekly event-time \" +\n\t\t\t\t\t\t\tisBest + ' ' + isBBQ +\n\t\t\t\t\t\t\t\" ' target='_blank' href='\" +\n\t\t\t\t\t\t\teventslist[i].url +\n\t\t\t\t\t\t\t\"'>\" +\n\t\t\t\t\t\t\teventTime +\n\t\t\t\t\t\t\t'</a>';\n\t\t\t\t\t}\n\t\t\t\t\t// Best availability (weekly on homepage)\n\t\t\t\t\t$('#weekly-calendar').find(eventDate).find('.tc').append(eventInfo);\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// WEEKLY LINK FORMATTING\n\t\t\t// Call this for Ticketmaster calendars with direct performance ticket links\n\t\t\tWeekly: function (container) {\n\t\t\t\tvar eventslist = [];\n\n\t\t\t\t//Date fix\n\t\t\t\tvar calDate = new Date();\n\t\t\t\tcalDate.setDate(calDate.getDate() - 1);\n\n\t\t\t\t//var wDays = 0;\n\n\t\t\t\t// Format events for calendar\n\t\t\t\tfor (var i = 0; i < Object.keys(SCHEDULE.Times).length; i++) {\n\t\t\t\t\tvar showYear = SCHEDULE.Times[i].year;\n\t\t\t\t\tvar showMonth = SCHEDULE.Times[i].dateID;\n\t\t\t\t\tif (showMonth.length < 2 && showMonth < 10) {\n\t\t\t\t\t\t// +0 to front of time if needed\n\t\t\t\t\t\tvar zeroString = '0';\n\t\t\t\t\t\tshowMonth = zeroString.concat(showMonth);\n\t\t\t\t\t}\n\t\t\t\t\tvar linkMonth = showMonth;\n\t\t\t\t\tvar hoursKey = Object.keys(SCHEDULE.Times[i].hours);\n\n\t\t\t\t\tfor (var j = 0; j < hoursKey.length; j++) {\n\t\t\t\t\t\tvar showDay = hoursKey[j];\n\t\t\t\t\t\tvar timesKey = Object.keys(SCHEDULE.Times[i].hours[showDay]);\n\t\t\t\t\t\tfor (var k = 0; k < timesKey.length; k++) {\n\t\t\t\t\t\t\tvar eveMat = timesKey[k];\n\t\t\t\t\t\t\tvar theTime = SCHEDULE.Times[i].hours[showDay][eveMat];\n\t\t\t\t\t\t\tvar linkTime = theTime;\n\t\t\t\t\t\t\tvar featured = theTime.artist ?? '';\n\n\t\t\t\t\t\t\tif (linkTime && linkTime.length < 7) {\n\t\t\t\t\t\t\t\t// +0 to front of time if needed\n\t\t\t\t\t\t\t\tvar zeroString = '0';\n\t\t\t\t\t\t\t\tlinkTime = zeroString.concat(linkTime);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (eveMat != 'dark') {\n\t\t\t\t\t\t\t\tvar linkDay = (Number(showDay) + 1).toString();\n\t\t\t\t\t\t\t\tif (linkDay.length < 2 && linkDay < 10) {\n\t\t\t\t\t\t\t\t\t// +0 to front of time if needed\n\t\t\t\t\t\t\t\t\tvar zs = '0';\n\t\t\t\t\t\t\t\t\tlinkDay = zs.concat(linkDay);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tlet showDate = linkMonth + '/' + linkDay + '/' + showYear;\n\t\t\t\t\t\t\t\tvar startDate = showYear + '-' + showMonth + '-' + linkDay;\n\n\t\t\t\t\t\t\t\t//  If Time OR Featured Exists\n\t\t\t\t\t\t\t\t// AND date is before today\n\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\ttheTime.time ||\n\t\t\t\t\t\t\t\t\t(featured && calDate <= new Date(startDate))\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// console.log('in here',  calDate,new Date(startDate))\n\t\t\t\t\t\t\t\t\teventslist.push({\n\t\t\t\t\t\t\t\t\t\tstart: startDate, // previously: SCHEDULE.Times[i].date,\n\t\t\t\t\t\t\t\t\t\turl:\n\t\t\t\t\t\t\t\t\t\t\t'http://www.telecharge.com/Broadway/' +\n\t\t\t\t\t\t\t\t\t\t\tperformanceName +\n\t\t\t\t\t\t\t\t\t\t\t'/Ticket?PerformanceDateTime=' +\n\t\t\t\t\t\t\t\t\t\t\tshowDate +\n\t\t\t\t\t\t\t\t\t\t\t'%20' +\n\t\t\t\t\t\t\t\t\t\t\tlinkTime.time +\n\t\t\t\t\t\t\t\t\t\t\t'PM',\n\t\t\t\t\t\t\t\t\t\ttitle: theTime.time + '<span class=\"ampm\">PM</span>',\n\t\t\t\t\t\t\t\t\t\tbest: theTime.best,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// console.log('out here')\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t/*\n\t\t\t\t\twDays++;\n\t\t\t\t\tif (wDays == 7) { break; }\n\t\t\t\t\t*/\n\t\t\t\t}\n\t\t\t\tSCHEDULE.PopulateWeekly(container, eventslist);\n\t\t\t},\n\n\t\t\t//calendar creation function\n\t\t\tinitWeekly: function (container) {\n\t\t\t\tvar months = [\n\t\t\t\t\t'January',\n\t\t\t\t\t'February',\n\t\t\t\t\t'March',\n\t\t\t\t\t'April',\n\t\t\t\t\t'May',\n\t\t\t\t\t'June',\n\t\t\t\t\t'July',\n\t\t\t\t\t'August',\n\t\t\t\t\t'September',\n\t\t\t\t\t'October',\n\t\t\t\t\t'November',\n\t\t\t\t\t'December',\n\t\t\t\t];\n\n\t\t\t\tvar calText = '';\n\t\t\t\tdocument.getElementById('weekly-calendar').innerHTML = calText;\n\n\t\t\t\tvar block = document.querySelector(container);\n\t\t\t\tvar blockToday = new Date();\n\t\t\t\tvar startCustom = new Date(block.dataset.start);\n\t\t\t\t// If user selects start date && before today\n\t\t\t\tvar commence = blockToday <= startCustom ? startCustom : blockToday;\n\n\t\t\t\tvar thisDay = new Date(commence);\n\t\t\t\tvar weekday = new Array(7);\n\t\t\t\tweekday[0] = 'SUN';\n\t\t\t\tweekday[1] = 'MON';\n\t\t\t\tweekday[2] = 'TUE';\n\t\t\t\tweekday[3] = 'WED';\n\t\t\t\tweekday[4] = 'THU';\n\t\t\t\tweekday[5] = 'FRI';\n\t\t\t\tweekday[6] = 'SAT';\n\n\t\t\t\t// get today's date\n\t\t\t\tvar d = thisDay.getDate();\n\t\t\t\tvar m = thisDay.getMonth();\n\t\t\t\tvar y = thisDay.getFullYear();\n\t\t\t\tvar n = weekday[thisDay.getDay()];\n\n\t\t\t\t// generate weekday names\n\t\t\t\tcalText += '<div class=\"week-row week-names\">';\n\t\t\t\tfor (let i = thisDay.getDay(); i < thisDay.getDay() + 7; i++) {\n\t\t\t\t\tlet the_day = i;\n\t\t\t\t\tif (the_day > 6) {\n\t\t\t\t\t\tthe_day = the_day - 7;\n\t\t\t\t\t}\n\t\t\t\t\tcalText += '<div>' + weekday[the_day] + '</div>';\n\t\t\t\t}\n\t\t\t\tcalText += '</div>';\n\n\t\t\t\t//calText = '<div class=\"month row-fluid\"><h3 class=\"col-sm-5 text-center\">' + months[m] + \" \" + y + '</h3><h5 class=\"col-sm-7 text-center\">CLICK ON A DATE TO BUY ONLINE.</h5><div><div class=\"date\">Sun</div><div class=\"date\">Mon</div><div class=\"date\">Tue</div><div class=\"date\">Wed</div><div class=\"date\">Thu</div><div class=\"date\">Fri</div><div class=\"date\">Sat</div>';\n\n\t\t\t\tcalText += '<div class=\"week-row\">'; // open a week row\n\t\t\t\tfor (let j = 0; j < 7; j++) {\n\t\t\t\t\tvar d = thisDay.getDate();\n\t\t\t\t\tvar m = thisDay.getMonth();\n\t\t\t\t\tvar month = months[m];\n\t\t\t\t\tvar y = thisDay.getFullYear();\n\t\t\t\t\tvar n = weekday[thisDay.getDay()];\n\n\t\t\t\t\tif (m < 9) {\n\t\t\t\t\t\tif (d <= 9) {\n\t\t\t\t\t\t\tvar thisDate = y + '-0' + (m + 1) + '-0' + d;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar thisDate = y + '-0' + (m + 1) + '-' + d;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (d <= 9) {\n\t\t\t\t\t\t\tvar thisDate = y + '-' + (m + 1) + '-0' + d;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar thisDate = y + '-' + (m + 1) + '-' + d;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcalText +=\n\t\t\t\t\t\t`<div class=\"date-box ${thisDate}\">\n\t\t\t\t\t\t\t<div class=\"date-box-content\">\n\t\t\t\t\t\t\t\t<p class=\"day-weekly\">\n\t\t\t\t\t\t\t\t\t${n}\n\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t<div class=\"weekday-box\">\n\t\t\t\t\t\t\t\t\t<div class=\"date\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"date__date\">\n\t\t\t\t\t\t\t\t\t\t\t<p>${m + 1}/${d > 9 ? d : '0' + d}</p>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"weekly-perf-holder\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"t\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"tc\">\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>`;\n\t\t\t\t\t//calText += \"<div class=\\\"day active \"+thisDate+\" ind\"+ind+\"\\\" data-date=\\\"\"+thisDate+\"\\\" data-ind=\\\"\"+ind+\"\\\"><span class=\\\"num\\\">\" + j + \"</span></div>\";\n\t\t\t\t\t// calText += '</div></div></div></div></div></div>';\n\t\t\t\t\t//ind++;\n\n\t\t\t\t\tthisDay.setDate(thisDay.getDate() + 1);\n\n\t\t\t\t\t// // wrap after 7 days; change to a new week row\n\t\t\t\t\t// if (j == 6) {\n\t\t\t\t\t// \tcalText +=\n\t\t\t\t\t// \t\t'</div><!-- end interim week row --><div class=\"week-row\">';\n\t\t\t\t\t// }\n\t\t\t\t}\n\t\t\t\tcalText += '</div><!-- end week row -->'; // close a week row\n\n\t\t\t\tdocument.getElementById('weekly-calendar').innerHTML += calText;\n\n\t\t\t\tcalText = '';\n\n\t\t\t\t//}\n\t\t\t},\n\t\t};\n\t\tCOMMONUTILS.userLocation(COMMONUTILS.currentPage);\n\t}\n\n\tfunction monthly() {\n\t\t\n\t\t$.ajax({\n\t\t\tmethod: 'GET',\n\t\t\turl: RPMConstants.themeDir + '/assets/svg/arrow.svg',\n\t\t\tdataType: 'html',\n\t\t}).done(function (result) {\n\t\t\t$('.arrow').html(result);\n\t\t}).fail(function (error) {\n\t\t\tconsole.log(error);\n\t\t});\n\n\t\tvar COMMONUTILS = {\n\t\t\t//\n\t\t\tpageWidth: function () {\n\t\t\t\t'use strict';\n\t\t\t\treturn document.documentElement.clientWidth;\n\t\t\t},\n\n\t\t\t// OBJ TO HOLD USERS CURRENT WEBPAGE LOCATION\n\t\t\t// currentPage: window.location.pathname.substring(window.location.pathname.lastIndexOf('/') + 1),\n\t\t\tcurrentPage: window.location.pathname.replace(/\\//g, ''),\n\n\t\t\t// FUNCTION TO EXECUTE CODE BASED ON LOCATION\n\t\t\tuserLocation: function (pagename) {\n\t\t\t\t'use strict';\n\t\t\t\tlet parsedEvents = JSON.parse(calendar.dataset.events);\n\t\t\t\t// console.log(SCHEDULE.sched);\n\t\t\t\tSCHEDULE.getData(SCHEDULE.sched, '#cal', performanceName);\n\t\t\t},\n\t\t};\n\n\t\t// NAMESPACE FOR SCHEDULE FUNCTIONS\n\t\tvar SCHEDULE = {\n\t\t\t// JSON results for show dates and times will be stored here\n\t\t\tTimes: null,\n\t\t\tAvail: null,\n\t\t\tsched: JSON.parse(calendar.dataset.events),\n\t\t\tSchedule: null,\n\n\t\t\tgetData: function (schedule, targetdiv, href) {\n\t\t\t\tSCHEDULE.Schedule = schedule;\n\t\t\t\tvar results = SCHEDULE.schedulePop(SCHEDULE.Schedule, href); //********\n\t\t\t\t$(targetdiv).append(results);\n\n\t\t\t\tfunction resetArrowsIfNoMonths() {\n\t\t\t\t\tvar months = $('.month').length;\n\t\t\t\t\tvar next = $('.month:visible').index();\n\n\t\t\t\t\t// console.log(\"right months: \", months);\n\t\t\t\t\t// console.log(\"right next: \", next);\n\t\t\t\t\tif (months == next) {\n\t\t\t\t\t\t$('.cal-left, .cal-right').addClass('inactive');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresetArrowsIfNoMonths();\n\n\t\t\t\t$('.cal-left').click(function (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvar months = $('.month').length;\n\t\t\t\t\tvar prev = $('.month:visible').index() - 1;\n\n\t\t\t\t\tif ($('.cal-right').hasClass('inactive')) {\n\t\t\t\t\t\t$('.cal-right').removeClass('inactive');\n\t\t\t\t\t}\n\n\t\t\t\t\t// console.log(\"left months: \", months);\n\t\t\t\t\t// console.log(\"left prev: \", prev);\n\n\t\t\t\t\tif (prev > 0) {\n\t\t\t\t\t\t// console.log('continue');\n\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t$('.month').eq(prev).fadeIn('slow');\n\t\t\t\t\t} else if (prev == 0) {\n\t\t\t\t\t\t// console.log('stop');\n\t\t\t\t\t\t$('.cal-left').addClass('inactive');\n\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t$('.month').eq(prev).fadeIn('slow');\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\t$('.cal-right').click(function (e) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tvar months = $('.month').length - 1;\n\t\t\t\t\tvar next = $('.month:visible').index() + 1;\n\n\t\t\t\t\t// console.log(\"right months: \", months);\n\t\t\t\t\t// console.log(\"right next: \", next);\n\n\t\t\t\t\tif ($('.cal-left').hasClass('inactive')) {\n\t\t\t\t\t\t$('.cal-left').removeClass('inactive');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (next < months) {\n\t\t\t\t\t\t// console.log('continue');\n\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t$('.month').eq(next).fadeIn('slow');\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// console.log('stop');\n\t\t\t\t\t\t$('.month:visible').hide();\n\t\t\t\t\t\t$('.month').eq(next).fadeIn('slow');\n\t\t\t\t\t\t$('.cal-right').addClass('inactive');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t// Get JSON file, call appropriate parsing function after\n\t\t\tFetch: function (source, callback) {\n\t\t\t\t$.getJSON(source, function (data) {\n\t\t\t\t\t// Format dates if Ticketmaster calendar\n\t\t\t\t\tSCHEDULE.Times = data;\n\t\t\t\t\tcallback();\n\t\t\t\t});\n\t\t\t},\n\n\t\t\t// Populates Schedule Menu\n\t\t\tschedulePop: function (schedule, href) {\n\t\t\t\tvar today = new Date();\n\t\t\t\tvar schedule_info = schedule.schedule_info;\n\n\t\t\t\tconsole.log(schedule_info);\n\n\t\t\t\t// remove previous months, respecting month AND year\n\t\t\t\tvar today = new Date();\n\t\t\t\tvar dmo = today.getMonth();\n\t\t\t\tdmo++; // because months are 0 indexed\n\t\t\t\tvar dy = today.getFullYear();\n\t\t\t\tvar monthYear = new Date(dy, dmo);\n\n\t\t\t\tfor (let di = 0; di < schedule_info.length; di++) {\n\t\t\t\t\tvar currentMonthYear = new Date(\n\t\t\t\t\t\tschedule_info[0].year,\n\t\t\t\t\t\tschedule_info[0].dateID\n\t\t\t\t\t);\n\t\t\t\t\tif (currentMonthYear.getTime() < monthYear.getTime()) {\n\t\t\t\t\t\t// console.log(\"shifted\");\n\t\t\t\t\t\tschedule_info.shift();\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvar months = schedule_info.length;\n\t\t\t\tvar days = [\n\t\t\t\t\t'Sunday',\n\t\t\t\t\t'Monday',\n\t\t\t\t\t'Tuesday',\n\t\t\t\t\t'Wednesday',\n\t\t\t\t\t'Thursday',\n\t\t\t\t\t'Friday',\n\t\t\t\t\t'Saturday',\n\t\t\t\t];\n\t\t\t\tvar schedule_html = '';\n\n\t\t\t\t// Add 0 to single digit months\n\t\t\t\t// Index starts at 0 so 9 === October\n\t\t\t\tvar todayMonth = today.getMonth() < 9 ? '0' + (today.getMonth() + 1).toString() : (today.getMonth() + 1).toString();\n\n\t\t\t\tfor (var i = 0; i < months; i++) {\n\t\t\t\t\tvar calendar = '';\n\t\t\t\t\tlet scheduleMonthNumber = schedule_info[i].dateID;\n\t\t\t\t\tlet scheduleMonthDays = schedule_info[i].days;\n\t\t\t\t\tlet scheduleMonthYear = schedule_info[i].year;\n\t\t\t\t\tlet scheduleMonthHours = schedule_info[i].hours;\n\t\t\t\t\tlet todayMonthNumber = (today.getMonth() + 1); // +1 is needed to start iteration at 1\n\t\t\t\t\tlet todayDateNumber = today.getDate();\n\t\t\t\t\tlet todayYearNumber = today.getFullYear();\n\n\t\t\t\t\t// IF IT'S THIS MONTH ( DISPLAYS PAST DATES DARK )\n\t\t\t\t\t// This dictates the appropriate month number in the calendar dates when rendered on the frontend.\n\t\t\t\t\tif ( scheduleMonthNumber == todayMonthNumber.toString() && scheduleMonthYear == todayYearNumber.toString() ) {\n\n\t\t\t\t\t\tfor ( let dayNumber = 1; dayNumber <= Number(scheduleMonthDays); dayNumber++ ) {\n\n\t\t\t\t\t\t\tlet scheduleHours = schedule_info[i].hours;\n\t\t\t\t\t\t\t// console.log(schedule_info[0]);\n\t\t\t\t\t\t\t// dayNumber = iterates every day in the month\n\t\t\t\t\t\t\tif (todayDateNumber > dayNumber) { // days before today\n\t\t\t\t\t\t\t\tlet currentDayBeforeToday = new Date(todayMonth + ' ' + dayNumber  + ' ' + scheduleMonthYear);\n\t\t\t\t\t\t\t\t// if(currentDayBeforeToday.getDate())\n\t\t\t\t\t\t\t\t// if( ((today.getDate()-7 ) < currentDayBeforeToday.getDate()) &&  currentDayBeforeToday.getDay() < today.getDay()) {\n\t\t\t\t\t\t\t\t\t// console.log(today.getDate()-7, currentDayBeforeToday.getDate(), currentDayBeforeToday.getDay(), today.getDay());\n\t\t\t\t\t\t\t\t\tcalendar +=\n\t\t\t\t\t\t\t\t\t\t`<div class=\"day-box ${today.getDate() === dayNumber ? 'day-box--today' : ''} dark\">\n\t\t\t\t\t\t\t\t\t\t\t<p class=\"date-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t${renderDateNumber(scheduleMonthNumber, dayNumber, scheduleMonthYear)}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t\t\t// }\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( scheduleHours[dayNumber - 1] && Object.keys(scheduleHours[dayNumber - 1])[0] != 'dark') {\n\t\t\t\t\t\t\t\t\t// Render Date/Times Here\n\t\t\t\t\t\t\t\t\tvar datedeets = scheduleHours[dayNumber - 1];\n\t\t\t\t\t\t\t\t\t// console.log(scheduleHours);\n\t\t\t\t\t\t\t\t\tconst newLocal = calendar +=\n\t\t\t\t\t\t\t\t\t\t`<div class=\"day-box day-box--perf ${todayDateNumber === dayNumber ? 'day-box--today' : ''} ${schedule_info[i].dateID}-${(todayMonth < 10 ? '0' + todayMonth : todayMonth)}/${(dayNumber < 10 ? '0' + dayNumber : dayNumber)}\">\n\t\t\t\t\t\t\t\t\t\t\t<p class=\"date-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t${renderDateNumber(scheduleMonthNumber, dayNumber, scheduleMonthYear)}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"perf-links-holder\">`;\n\n\t\t\t\t\t\t\t\t\t\t\tfor (var key in datedeets) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar date = new Date(schedule_info[i].dateID + '/' + dayNumber + '/' + schedule_info[i].year );\n\t\t\t\t\t\t\t\t\t\t\t\tvar showtime = datedeets[key];\n\t\t\t\t\t\t\t\t\t\t\t\tvar linkDate = schedule_info[i].dateID;\n\n\t\t\t\t\t\t\t\t\t\t\t\t// console.log(showtime);\n\t\t\t\t\t\t\t\t\t\t\t\tshowtime = showtime.length < 5 ? '0'.concat(showtime) : showtime; // +0 to front of showtime if needed\n\t\t\t\t\t\t\t\t\t\t\t\tcalendar += renderPerformanceLink(key, scheduleMonthNumber, dayNumber, schedule_info[i].year, showtime.time, datedeets[key].best, datedeets[key].bbq);\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tcalendar += `</div></div>`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t// If Day has no performance, show empty\n\t\t\t\t\t\t\t\t\t// Fixes issue of some empty dates displaying previous month number\n\t\t\t\t\t\t\t\t\t// ((today.getMonth() + 1) < 10 ? '0' + (today.getMonth() + 1) : (today.getMonth() + 1))\n\t\t\t\t\t\t\t\t\tcalendar +=\n\t\t\t\t\t\t\t\t\t\t`<div class=\"day-box dark ${todayDateNumber === dayNumber ? 'day-box--today' : ''}\">\n\t\t\t\t\t\t\t\t\t\t\t<p class=\"date-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t${renderDateNumber(scheduleMonthNumber, dayNumber, scheduleMonthYear)}\n\t\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// IF IT'S NOT THIS MONTH ( DISPLAYS FULL MONTH )\n\t\t\t\t\t\tfor (let dayNumber = 1; dayNumber <= Number(schedule_info[i].days); dayNumber++) {\n\n\t\t\t\t\t\t\tif ( scheduleMonthHours[dayNumber - 1] && Object.keys(scheduleMonthHours[dayNumber - 1])[0] != 'dark' ) {\n\t\t\t\t\t\t\t\tvar datedeets = scheduleMonthHours[dayNumber - 1];\n\n\t\t\t\t\t\t\t\tcalendar += \n\t\t\t\t\t\t\t\t\t`<div class=\"day-box ${schedule_info[i].dateID}-${dayNumber}\">\n\t\t\t\t\t\t\t\t\t\t<p class=\"date-2\">\n\t\t\t\t\t\t\t\t\t\t\t${renderDateNumber(scheduleMonthNumber, dayNumber, scheduleMonthYear)}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t\t<div class=\"perf-links-holder perf-links-holder--future\">`;\n\t\t\t\t\t\t\t\t\t\tfor (var key in datedeets) {\n\t\t\t\t\t\t\t\t\t\t\tvar showtime = datedeets[key];\n\t\t\t\t\t\t\t\t\t\t\tshowtime = showtime.length < 5 ? '0'.concat(showtime) : showtime; // +0 to front of showtime if needed\n\t\t\t\t\t\t\t\t\t\t\tcalendar += renderPerformanceLink(key, scheduleMonthNumber, dayNumber, schedule_info[i].year, showtime.time, datedeets[key].best);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tcalendar += '</div></div>';\n\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t// console.log('in', m);\n\t\t\t\t\t\t\t\tcalendar +=\n\t\t\t\t\t\t\t\t\t`<div class=\"day-box dark\">\n\t\t\t\t\t\t\t\t\t\t<p class=\"date-2\">\n\t\t\t\t\t\t\t\t\t\t\t${renderDateNumber(scheduleMonthNumber, dayNumber, scheduleMonthYear)}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t</div>`;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tlet exemption_text = schedule_info[i].full_month === 'July' ? '<div class=\"month__exempt\"><p style=\"text-align: center;\"></p></div>' : '';\n\t\t\t\t\tlet isCurrentMonth = parseInt(schedule_info[i].dateID) === (today.getMonth()+1) ? 'month--current' : '';\n\t\t\t\t\tschedule_html =\n\t\t\t\t\t\tschedule_html +\n\t\t\t\t\t\t`<div class=\"month ${isCurrentMonth}\">\n\t\t\t\t\t\t\t` +\n\t\t\t\t\t\texemption_text +\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t<div class=\"month-hed\">\n\t\t\t\t\t\t\t\t<div class=\"cal-header no-best-dates\">\n\t\t\t\t\t\t\t\t\t<div class=\"cal-nav\">\n\t\t\t\t\t\t\t\t\t\t<button class=\"cal-left inactive\" >\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"arrow\"></span>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t<button class=\"cal-right\" >\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"arrow\"></span>\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t\t${renderMonthTitle(schedule_info[i].full_month, schedule_info[i].year)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div class=\"best-box\">\n\t\t\t\t\t\t\t\t\t\t<div class=\"best-box__each\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"best-box__color best-box__color--red\"></div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"best-box__text\"><p>Black Theater Night</p></div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t<div class=\"best-box__each\">\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"best-box__color\"></div>\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"best-box__text\"><p>Best Availability</p></div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<div class=\"grid-container\">\n\t\t\t\t\t\t\t\t<div class=\"days\">\n\t\t\t\t\t\t\t\t\t<div class=\"day\">Sun</div>\n\t\t\t\t\t\t\t\t\t<div class=\"day\">Mon</div>\n\t\t\t\t\t\t\t\t\t<div class=\"day\">Tue</div>\n\t\t\t\t\t\t\t\t\t<div class=\"day\">Wed</div>\n\t\t\t\t\t\t\t\t\t<div class=\"day\">Thu</div>\n\t\t\t\t\t\t\t\t\t<div class=\"day\">Fri</div>\n\t\t\t\t\t\t\t\t\t<div class=\"day\">Sat</div>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t<div class=\"grid\">\n\t\t\t\t\t\t\t\t\t\t\t\t` +\n\t\t\t\t\t\t\t\t\trenderBeforeOffsetDays(schedule_info[i].offset) +\n\t\t\t\t\t\t\t\t\tcalendar +\n\t\t\t\t\t\t\t\t\trenderAfterOffsetDays(schedule_info[i].after) +\n\t\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t}\n\n\t\t\t\treturn schedule_html;\n\t\t\t},\n\t\t};\n\n\t\tCOMMONUTILS.userLocation(COMMONUTILS.currentPage); \n\t}\n\n\tfunction renderPerformanceLink(key, date, dayNumber, year, showtime, isBest, isBBQ) {\n\t\tlet performanceLink = '';\n\t\tperformanceLink += `\n\t\t\t<a class=\"cal-link event-time ${isBest ? 'event-time--best' : ''} ${isBBQ ? 'event-time--bbq' : ''} ${key}\" href=\"http://www.telecharge.com/Broadway/${performanceName}/Ticket?PerformanceDateTime=${date}/${dayNumber}/${year}%20${showtime}PM\" target=\"_blank\">\n\t\t\t\t${showtime} <span class=\"no-pm-mobile\">pm</span>\n\t\t\t</a>\n\t\t`;\n\t\treturn performanceLink;\n\t}\n\n\tfunction renderDateNumber(mon, day, year) {\n\t\t// console.log(monthNumber);\n\t\tlet d = day < 10 ? '0' + day : day;\n\t\treturn mon + '/' + d;\n\t}\n\n\tfunction renderMonthTitle(month, year) {\n\t\tlet title = '';\n\t\ttitle += `<h3 class=\"mobilemonth\">${month} ${year}</h3>`;\n\t\treturn title;\n\t}\n\n\tfunction renderBeforeOffsetDays(offsetDays) {\n\t\tlet before = ''; // setup blank days before first day of month\n\t\tfor (var f = 0; f < offsetDays; f++) {\n\t\t\tbefore +=\n\t\t\t\t`<div class=\"day-box off_set off_set--before\">\n\t\t\t\t\t<p class=\"date-2\"></p>\n\t\t\t\t\t&nbsp;\n\t\t\t\t</div>`;\n\t\t}\n\t\treturn before;\n\t}\n\n\tfunction renderAfterOffsetDays(offsetDays) {\n\t\tlet after = ''; // setup blank days after last day of month\n\t\tfor (var t = 0; t < offsetDays; t++) {\n\t\t\tafter +=\n\t\t\t`<div class=\"day-box off_set off_set--after\">\n\t\t\t\t<p class=\"date-2\"></p>\n\t\t\t\t&nbsp;\n\t\t\t</div>`;\n\t\t}\n\t\treturn after;\n\t}\n\n\n\n\treturn {\n\t\tinit: init,\n\t};\n})();","/*!\n * Glide.js v3.4.1\n * (c) 2013-2019 Jędrzej Chałubek <jedrzej.chalubek@gmail.com> (http://jedrzejchalubek.com/)\n * Released under the MIT License.\n */\n\nvar defaults = {\n  /**\n   * Type of the movement.\n   *\n   * Available types:\n   * `slider` - Rewinds slider to the start/end when it reaches the first or last slide.\n   * `carousel` - Changes slides without starting over when it reaches the first or last slide.\n   *\n   * @type {String}\n   */\n  type: 'slider',\n\n  /**\n   * Start at specific slide number defined with zero-based index.\n   *\n   * @type {Number}\n   */\n  startAt: 0,\n\n  /**\n   * A number of slides visible on the single viewport.\n   *\n   * @type {Number}\n   */\n  perView: 1,\n\n  /**\n   * Focus currently active slide at a specified position in the track.\n   *\n   * Available inputs:\n   * `center` - Current slide will be always focused at the center of a track.\n   * `0,1,2,3...` - Current slide will be focused on the specified zero-based index.\n   *\n   * @type {String|Number}\n   */\n  focusAt: 0,\n\n  /**\n   * A size of the gap added between slides.\n   *\n   * @type {Number}\n   */\n  gap: 10,\n\n  /**\n   * Change slides after a specified interval. Use `false` for turning off autoplay.\n   *\n   * @type {Number|Boolean}\n   */\n  autoplay: false,\n\n  /**\n   * Stop autoplay on mouseover event.\n   *\n   * @type {Boolean}\n   */\n  hoverpause: true,\n\n  /**\n   * Allow for changing slides with left and right keyboard arrows.\n   *\n   * @type {Boolean}\n   */\n  keyboard: true,\n\n  /**\n   * Stop running `perView` number of slides from the end. Use this\n   * option if you don't want to have an empty space after\n   * a slider. Works only with `slider` type and a\n   * non-centered `focusAt` setting.\n   *\n   * @type {Boolean}\n   */\n  bound: false,\n\n  /**\n   * Minimal swipe distance needed to change the slide. Use `false` for turning off a swiping.\n   *\n   * @type {Number|Boolean}\n   */\n  swipeThreshold: 80,\n\n  /**\n   * Minimal mouse drag distance needed to change the slide. Use `false` for turning off a dragging.\n   *\n   * @type {Number|Boolean}\n   */\n  dragThreshold: 120,\n\n  /**\n   * A maximum number of slides to which movement will be made on swiping or dragging. Use `false` for unlimited.\n   *\n   * @type {Number|Boolean}\n   */\n  perTouch: false,\n\n  /**\n   * Moving distance ratio of the slides on a swiping and dragging.\n   *\n   * @type {Number}\n   */\n  touchRatio: 0.5,\n\n  /**\n   * Angle required to activate slides moving on swiping or dragging.\n   *\n   * @type {Number}\n   */\n  touchAngle: 45,\n\n  /**\n   * Duration of the animation in milliseconds.\n   *\n   * @type {Number}\n   */\n  animationDuration: 400,\n\n  /**\n   * Allows looping the `slider` type. Slider will rewind to the first/last slide when it's at the start/end.\n   *\n   * @type {Boolean}\n   */\n  rewind: true,\n\n  /**\n   * Duration of the rewinding animation of the `slider` type in milliseconds.\n   *\n   * @type {Number}\n   */\n  rewindDuration: 800,\n\n  /**\n   * Easing function for the animation.\n   *\n   * @type {String}\n   */\n  animationTimingFunc: 'cubic-bezier(.165, .840, .440, 1)',\n\n  /**\n   * Throttle costly events at most once per every wait milliseconds.\n   *\n   * @type {Number}\n   */\n  throttle: 10,\n\n  /**\n   * Moving direction mode.\n   *\n   * Available inputs:\n   * - 'ltr' - left to right movement,\n   * - 'rtl' - right to left movement.\n   *\n   * @type {String}\n   */\n  direction: 'ltr',\n\n  /**\n   * The distance value of the next and previous viewports which\n   * have to peek in the current view. Accepts number and\n   * pixels as a string. Left and right peeking can be\n   * set up separately with a directions object.\n   *\n   * For example:\n   * `100` - Peek 100px on the both sides.\n   * { before: 100, after: 50 }` - Peek 100px on the left side and 50px on the right side.\n   *\n   * @type {Number|String|Object}\n   */\n  peek: 0,\n\n  /**\n   * Collection of options applied at specified media breakpoints.\n   * For example: display two slides per view under 800px.\n   * `{\n   *   '800px': {\n   *     perView: 2\n   *   }\n   * }`\n   */\n  breakpoints: {},\n\n  /**\n   * Collection of internally used HTML classes.\n   *\n   * @todo Refactor `slider` and `carousel` properties to single `type: { slider: '', carousel: '' }` object\n   * @type {Object}\n   */\n  classes: {\n    direction: {\n      ltr: 'glide--ltr',\n      rtl: 'glide--rtl'\n    },\n    slider: 'glide--slider',\n    carousel: 'glide--carousel',\n    swipeable: 'glide--swipeable',\n    dragging: 'glide--dragging',\n    cloneSlide: 'glide__slide--clone',\n    activeNav: 'glide__bullet--active',\n    activeSlide: 'glide__slide--active',\n    disabledArrow: 'glide__arrow--disabled'\n  }\n};\n\n/**\n * Outputs warning message to the bowser console.\n *\n * @param  {String} msg\n * @return {Void}\n */\nfunction warn(msg) {\n  console.error(\"[Glide warn]: \" + msg);\n}\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n  return typeof obj;\n} : function (obj) {\n  return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];\n\n    for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n\n  return target;\n};\n\nvar get = function get(object, property, receiver) {\n  if (object === null) object = Function.prototype;\n  var desc = Object.getOwnPropertyDescriptor(object, property);\n\n  if (desc === undefined) {\n    var parent = Object.getPrototypeOf(object);\n\n    if (parent === null) {\n      return undefined;\n    } else {\n      return get(parent, property, receiver);\n    }\n  } else if (\"value\" in desc) {\n    return desc.value;\n  } else {\n    var getter = desc.get;\n\n    if (getter === undefined) {\n      return undefined;\n    }\n\n    return getter.call(receiver);\n  }\n};\n\nvar inherits = function (subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n  }\n\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      enumerable: false,\n      writable: true,\n      configurable: true\n    }\n  });\n  if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n};\n\nvar possibleConstructorReturn = function (self, call) {\n  if (!self) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n\n  return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n};\n\n/**\n * Converts value entered as number\n * or string to integer value.\n *\n * @param {String} value\n * @returns {Number}\n */\nfunction toInt(value) {\n  return parseInt(value);\n}\n\n/**\n * Converts value entered as number\n * or string to flat value.\n *\n * @param {String} value\n * @returns {Number}\n */\nfunction toFloat(value) {\n  return parseFloat(value);\n}\n\n/**\n * Indicates whether the specified value is a string.\n *\n * @param  {*}   value\n * @return {Boolean}\n */\nfunction isString(value) {\n  return typeof value === 'string';\n}\n\n/**\n * Indicates whether the specified value is an object.\n *\n * @param  {*} value\n * @return {Boolean}\n *\n * @see https://github.com/jashkenas/underscore\n */\nfunction isObject(value) {\n  var type = typeof value === 'undefined' ? 'undefined' : _typeof(value);\n\n  return type === 'function' || type === 'object' && !!value; // eslint-disable-line no-mixed-operators\n}\n\n/**\n * Indicates whether the specified value is a number.\n *\n * @param  {*} value\n * @return {Boolean}\n */\nfunction isNumber(value) {\n  return typeof value === 'number';\n}\n\n/**\n * Indicates whether the specified value is a function.\n *\n * @param  {*} value\n * @return {Boolean}\n */\nfunction isFunction(value) {\n  return typeof value === 'function';\n}\n\n/**\n * Indicates whether the specified value is undefined.\n *\n * @param  {*} value\n * @return {Boolean}\n */\nfunction isUndefined(value) {\n  return typeof value === 'undefined';\n}\n\n/**\n * Indicates whether the specified value is an array.\n *\n * @param  {*} value\n * @return {Boolean}\n */\nfunction isArray(value) {\n  return value.constructor === Array;\n}\n\n/**\n * Creates and initializes specified collection of extensions.\n * Each extension receives access to instance of glide and rest of components.\n *\n * @param {Object} glide\n * @param {Object} extensions\n *\n * @returns {Object}\n */\nfunction mount(glide, extensions, events) {\n  var components = {};\n\n  for (var name in extensions) {\n    if (isFunction(extensions[name])) {\n      components[name] = extensions[name](glide, components, events);\n    } else {\n      warn('Extension must be a function');\n    }\n  }\n\n  for (var _name in components) {\n    if (isFunction(components[_name].mount)) {\n      components[_name].mount();\n    }\n  }\n\n  return components;\n}\n\n/**\n * Defines getter and setter property on the specified object.\n *\n * @param  {Object} obj         Object where property has to be defined.\n * @param  {String} prop        Name of the defined property.\n * @param  {Object} definition  Get and set definitions for the property.\n * @return {Void}\n */\nfunction define(obj, prop, definition) {\n  Object.defineProperty(obj, prop, definition);\n}\n\n/**\n * Sorts aphabetically object keys.\n *\n * @param  {Object} obj\n * @return {Object}\n */\nfunction sortKeys(obj) {\n  return Object.keys(obj).sort().reduce(function (r, k) {\n    r[k] = obj[k];\n\n    return r[k], r;\n  }, {});\n}\n\n/**\n * Merges passed settings object with default options.\n *\n * @param  {Object} defaults\n * @param  {Object} settings\n * @return {Object}\n */\nfunction mergeOptions(defaults, settings) {\n  var options = _extends({}, defaults, settings);\n\n  // `Object.assign` do not deeply merge objects, so we\n  // have to do it manually for every nested object\n  // in options. Although it does not look smart,\n  // it's smaller and faster than some fancy\n  // merging deep-merge algorithm script.\n  if (settings.hasOwnProperty('classes')) {\n    options.classes = _extends({}, defaults.classes, settings.classes);\n\n    if (settings.classes.hasOwnProperty('direction')) {\n      options.classes.direction = _extends({}, defaults.classes.direction, settings.classes.direction);\n    }\n  }\n\n  if (settings.hasOwnProperty('breakpoints')) {\n    options.breakpoints = _extends({}, defaults.breakpoints, settings.breakpoints);\n  }\n\n  return options;\n}\n\nvar EventsBus = function () {\n  /**\n   * Construct a EventBus instance.\n   *\n   * @param {Object} events\n   */\n  function EventsBus() {\n    var events = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, EventsBus);\n\n    this.events = events;\n    this.hop = events.hasOwnProperty;\n  }\n\n  /**\n   * Adds listener to the specifed event.\n   *\n   * @param {String|Array} event\n   * @param {Function} handler\n   */\n\n\n  createClass(EventsBus, [{\n    key: 'on',\n    value: function on(event, handler) {\n      if (isArray(event)) {\n        for (var i = 0; i < event.length; i++) {\n          this.on(event[i], handler);\n        }\n      }\n\n      // Create the event's object if not yet created\n      if (!this.hop.call(this.events, event)) {\n        this.events[event] = [];\n      }\n\n      // Add the handler to queue\n      var index = this.events[event].push(handler) - 1;\n\n      // Provide handle back for removal of event\n      return {\n        remove: function remove() {\n          delete this.events[event][index];\n        }\n      };\n    }\n\n    /**\n     * Runs registered handlers for specified event.\n     *\n     * @param {String|Array} event\n     * @param {Object=} context\n     */\n\n  }, {\n    key: 'emit',\n    value: function emit(event, context) {\n      if (isArray(event)) {\n        for (var i = 0; i < event.length; i++) {\n          this.emit(event[i], context);\n        }\n      }\n\n      // If the event doesn't exist, or there's no handlers in queue, just leave\n      if (!this.hop.call(this.events, event)) {\n        return;\n      }\n\n      // Cycle through events queue, fire!\n      this.events[event].forEach(function (item) {\n        item(context || {});\n      });\n    }\n  }]);\n  return EventsBus;\n}();\n\nvar Glide = function () {\n  /**\r\n   * Construct glide.\r\n   *\r\n   * @param  {String} selector\r\n   * @param  {Object} options\r\n   */\n  function Glide(selector) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, Glide);\n\n    this._c = {};\n    this._t = [];\n    this._e = new EventsBus();\n\n    this.disabled = false;\n    this.selector = selector;\n    this.settings = mergeOptions(defaults, options);\n    this.index = this.settings.startAt;\n  }\n\n  /**\r\n   * Initializes glide.\r\n   *\r\n   * @param {Object} extensions Collection of extensions to initialize.\r\n   * @return {Glide}\r\n   */\n\n\n  createClass(Glide, [{\n    key: 'mount',\n    value: function mount$$1() {\n      var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      this._e.emit('mount.before');\n\n      if (isObject(extensions)) {\n        this._c = mount(this, extensions, this._e);\n      } else {\n        warn('You need to provide a object on `mount()`');\n      }\n\n      this._e.emit('mount.after');\n\n      return this;\n    }\n\n    /**\r\n     * Collects an instance `translate` transformers.\r\n     *\r\n     * @param  {Array} transformers Collection of transformers.\r\n     * @return {Void}\r\n     */\n\n  }, {\n    key: 'mutate',\n    value: function mutate() {\n      var transformers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n      if (isArray(transformers)) {\n        this._t = transformers;\n      } else {\n        warn('You need to provide a array on `mutate()`');\n      }\n\n      return this;\n    }\n\n    /**\r\n     * Updates glide with specified settings.\r\n     *\r\n     * @param {Object} settings\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'update',\n    value: function update() {\n      var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      this.settings = mergeOptions(this.settings, settings);\n\n      if (settings.hasOwnProperty('startAt')) {\n        this.index = settings.startAt;\n      }\n\n      this._e.emit('update');\n\n      return this;\n    }\n\n    /**\r\n     * Change slide with specified pattern. A pattern must be in the special format:\r\n     * `>` - Move one forward\r\n     * `<` - Move one backward\r\n     * `={i}` - Go to {i} zero-based slide (eq. '=1', will go to second slide)\r\n     * `>>` - Rewinds to end (last slide)\r\n     * `<<` - Rewinds to start (first slide)\r\n     *\r\n     * @param {String} pattern\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'go',\n    value: function go(pattern) {\n      this._c.Run.make(pattern);\n\n      return this;\n    }\n\n    /**\r\n     * Move track by specified distance.\r\n     *\r\n     * @param {String} distance\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'move',\n    value: function move(distance) {\n      this._c.Transition.disable();\n      this._c.Move.make(distance);\n\n      return this;\n    }\n\n    /**\r\n     * Destroy instance and revert all changes done by this._c.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      this._e.emit('destroy');\n\n      return this;\n    }\n\n    /**\r\n     * Start instance autoplaying.\r\n     *\r\n     * @param {Boolean|Number} interval Run autoplaying with passed interval regardless of `autoplay` settings\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'play',\n    value: function play() {\n      var interval = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n      if (interval) {\n        this.settings.autoplay = interval;\n      }\n\n      this._e.emit('play');\n\n      return this;\n    }\n\n    /**\r\n     * Stop instance autoplaying.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'pause',\n    value: function pause() {\n      this._e.emit('pause');\n\n      return this;\n    }\n\n    /**\r\n     * Sets glide into a idle status.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'disable',\n    value: function disable() {\n      this.disabled = true;\n\n      return this;\n    }\n\n    /**\r\n     * Sets glide into a active status.\r\n     *\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'enable',\n    value: function enable() {\n      this.disabled = false;\n\n      return this;\n    }\n\n    /**\r\n     * Adds cuutom event listener with handler.\r\n     *\r\n     * @param  {String|Array} event\r\n     * @param  {Function} handler\r\n     * @return {Glide}\r\n     */\n\n  }, {\n    key: 'on',\n    value: function on(event, handler) {\n      this._e.on(event, handler);\n\n      return this;\n    }\n\n    /**\r\n     * Checks if glide is a precised type.\r\n     *\r\n     * @param  {String} name\r\n     * @return {Boolean}\r\n     */\n\n  }, {\n    key: 'isType',\n    value: function isType(name) {\n      return this.settings.type === name;\n    }\n\n    /**\r\n     * Gets value of the core options.\r\n     *\r\n     * @return {Object}\r\n     */\n\n  }, {\n    key: 'settings',\n    get: function get$$1() {\n      return this._o;\n    }\n\n    /**\r\n     * Sets value of the core options.\r\n     *\r\n     * @param  {Object} o\r\n     * @return {Void}\r\n     */\n    ,\n    set: function set$$1(o) {\n      if (isObject(o)) {\n        this._o = o;\n      } else {\n        warn('Options must be an `object` instance.');\n      }\n    }\n\n    /**\r\n     * Gets current index of the slider.\r\n     *\r\n     * @return {Object}\r\n     */\n\n  }, {\n    key: 'index',\n    get: function get$$1() {\n      return this._i;\n    }\n\n    /**\r\n     * Sets current index a slider.\r\n     *\r\n     * @return {Object}\r\n     */\n    ,\n    set: function set$$1(i) {\n      this._i = toInt(i);\n    }\n\n    /**\r\n     * Gets type name of the slider.\r\n     *\r\n     * @return {String}\r\n     */\n\n  }, {\n    key: 'type',\n    get: function get$$1() {\n      return this.settings.type;\n    }\n\n    /**\r\n     * Gets value of the idle status.\r\n     *\r\n     * @return {Boolean}\r\n     */\n\n  }, {\n    key: 'disabled',\n    get: function get$$1() {\n      return this._d;\n    }\n\n    /**\r\n     * Sets value of the idle status.\r\n     *\r\n     * @return {Boolean}\r\n     */\n    ,\n    set: function set$$1(status) {\n      this._d = !!status;\n    }\n  }]);\n  return Glide;\n}();\n\nfunction Run (Glide, Components, Events) {\n  var Run = {\n    /**\n     * Initializes autorunning of the glide.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this._o = false;\n    },\n\n\n    /**\n     * Makes glides running based on the passed moving schema.\n     *\n     * @param {String} move\n     */\n    make: function make(move) {\n      var _this = this;\n\n      if (!Glide.disabled) {\n        Glide.disable();\n\n        this.move = move;\n\n        Events.emit('run.before', this.move);\n\n        this.calculate();\n\n        Events.emit('run', this.move);\n\n        Components.Transition.after(function () {\n          if (_this.isStart()) {\n            Events.emit('run.start', _this.move);\n          }\n\n          if (_this.isEnd()) {\n            Events.emit('run.end', _this.move);\n          }\n\n          if (_this.isOffset('<') || _this.isOffset('>')) {\n            _this._o = false;\n\n            Events.emit('run.offset', _this.move);\n          }\n\n          Events.emit('run.after', _this.move);\n\n          Glide.enable();\n        });\n      }\n    },\n\n\n    /**\n     * Calculates current index based on defined move.\n     *\n     * @return {Void}\n     */\n    calculate: function calculate() {\n      var move = this.move,\n          length = this.length;\n      var steps = move.steps,\n          direction = move.direction;\n\n\n      var countableSteps = isNumber(toInt(steps)) && toInt(steps) !== 0;\n\n      switch (direction) {\n        case '>':\n          if (steps === '>') {\n            Glide.index = length;\n          } else if (this.isEnd()) {\n            if (!(Glide.isType('slider') && !Glide.settings.rewind)) {\n              this._o = true;\n\n              Glide.index = 0;\n            }\n          } else if (countableSteps) {\n            Glide.index += Math.min(length - Glide.index, -toInt(steps));\n          } else {\n            Glide.index++;\n          }\n          break;\n\n        case '<':\n          if (steps === '<') {\n            Glide.index = 0;\n          } else if (this.isStart()) {\n            if (!(Glide.isType('slider') && !Glide.settings.rewind)) {\n              this._o = true;\n\n              Glide.index = length;\n            }\n          } else if (countableSteps) {\n            Glide.index -= Math.min(Glide.index, toInt(steps));\n          } else {\n            Glide.index--;\n          }\n          break;\n\n        case '=':\n          Glide.index = steps;\n          break;\n\n        default:\n          warn('Invalid direction pattern [' + direction + steps + '] has been used');\n          break;\n      }\n    },\n\n\n    /**\n     * Checks if we are on the first slide.\n     *\n     * @return {Boolean}\n     */\n    isStart: function isStart() {\n      return Glide.index === 0;\n    },\n\n\n    /**\n     * Checks if we are on the last slide.\n     *\n     * @return {Boolean}\n     */\n    isEnd: function isEnd() {\n      return Glide.index === this.length;\n    },\n\n\n    /**\n     * Checks if we are making a offset run.\n     *\n     * @param {String} direction\n     * @return {Boolean}\n     */\n    isOffset: function isOffset(direction) {\n      return this._o && this.move.direction === direction;\n    }\n  };\n\n  define(Run, 'move', {\n    /**\n     * Gets value of the move schema.\n     *\n     * @returns {Object}\n     */\n    get: function get() {\n      return this._m;\n    },\n\n\n    /**\n     * Sets value of the move schema.\n     *\n     * @returns {Object}\n     */\n    set: function set(value) {\n      var step = value.substr(1);\n\n      this._m = {\n        direction: value.substr(0, 1),\n        steps: step ? toInt(step) ? toInt(step) : step : 0\n      };\n    }\n  });\n\n  define(Run, 'length', {\n    /**\n     * Gets value of the running distance based\n     * on zero-indexing number of slides.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var settings = Glide.settings;\n      var length = Components.Html.slides.length;\n\n      // If the `bound` option is acitve, a maximum running distance should be\n      // reduced by `perView` and `focusAt` settings. Running distance\n      // should end before creating an empty space after instance.\n\n      if (Glide.isType('slider') && settings.focusAt !== 'center' && settings.bound) {\n        return length - 1 - (toInt(settings.perView) - 1) + toInt(settings.focusAt);\n      }\n\n      return length - 1;\n    }\n  });\n\n  define(Run, 'offset', {\n    /**\n     * Gets status of the offsetting flag.\n     *\n     * @return {Boolean}\n     */\n    get: function get() {\n      return this._o;\n    }\n  });\n\n  return Run;\n}\n\n/**\n * Returns a current time.\n *\n * @return {Number}\n */\nfunction now() {\n  return new Date().getTime();\n}\n\n/**\n * Returns a function, that, when invoked, will only be triggered\n * at most once during a given window of time.\n *\n * @param {Function} func\n * @param {Number} wait\n * @param {Object=} options\n * @return {Function}\n *\n * @see https://github.com/jashkenas/underscore\n */\nfunction throttle(func, wait, options) {\n  var timeout = void 0,\n      context = void 0,\n      args = void 0,\n      result = void 0;\n  var previous = 0;\n  if (!options) options = {};\n\n  var later = function later() {\n    previous = options.leading === false ? 0 : now();\n    timeout = null;\n    result = func.apply(context, args);\n    if (!timeout) context = args = null;\n  };\n\n  var throttled = function throttled() {\n    var at = now();\n    if (!previous && options.leading === false) previous = at;\n    var remaining = wait - (at - previous);\n    context = this;\n    args = arguments;\n    if (remaining <= 0 || remaining > wait) {\n      if (timeout) {\n        clearTimeout(timeout);\n        timeout = null;\n      }\n      previous = at;\n      result = func.apply(context, args);\n      if (!timeout) context = args = null;\n    } else if (!timeout && options.trailing !== false) {\n      timeout = setTimeout(later, remaining);\n    }\n    return result;\n  };\n\n  throttled.cancel = function () {\n    clearTimeout(timeout);\n    previous = 0;\n    timeout = context = args = null;\n  };\n\n  return throttled;\n}\n\nvar MARGIN_TYPE = {\n  ltr: ['marginLeft', 'marginRight'],\n  rtl: ['marginRight', 'marginLeft']\n};\n\nfunction Gaps (Glide, Components, Events) {\n  var Gaps = {\n    /**\n     * Applies gaps between slides. First and last\n     * slides do not receive it's edge margins.\n     *\n     * @param {HTMLCollection} slides\n     * @return {Void}\n     */\n    apply: function apply(slides) {\n      for (var i = 0, len = slides.length; i < len; i++) {\n        var style = slides[i].style;\n        var direction = Components.Direction.value;\n\n        if (i !== 0) {\n          style[MARGIN_TYPE[direction][0]] = this.value / 2 + 'px';\n        } else {\n          style[MARGIN_TYPE[direction][0]] = '';\n        }\n\n        if (i !== slides.length - 1) {\n          style[MARGIN_TYPE[direction][1]] = this.value / 2 + 'px';\n        } else {\n          style[MARGIN_TYPE[direction][1]] = '';\n        }\n      }\n    },\n\n\n    /**\n     * Removes gaps from the slides.\n     *\n     * @param {HTMLCollection} slides\n     * @returns {Void}\n    */\n    remove: function remove(slides) {\n      for (var i = 0, len = slides.length; i < len; i++) {\n        var style = slides[i].style;\n\n        style.marginLeft = '';\n        style.marginRight = '';\n      }\n    }\n  };\n\n  define(Gaps, 'value', {\n    /**\n     * Gets value of the gap.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      return toInt(Glide.settings.gap);\n    }\n  });\n\n  define(Gaps, 'grow', {\n    /**\n     * Gets additional dimentions value caused by gaps.\n     * Used to increase width of the slides wrapper.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      return Gaps.value * (Components.Sizes.length - 1);\n    }\n  });\n\n  define(Gaps, 'reductor', {\n    /**\n     * Gets reduction value caused by gaps.\n     * Used to subtract width of the slides.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      var perView = Glide.settings.perView;\n\n      return Gaps.value * (perView - 1) / perView;\n    }\n  });\n\n  /**\n   * Apply calculated gaps:\n   * - after building, so slides (including clones) will receive proper margins\n   * - on updating via API, to recalculate gaps with new options\n   */\n  Events.on(['build.after', 'update'], throttle(function () {\n    Gaps.apply(Components.Html.wrapper.children);\n  }, 30));\n\n  /**\n   * Remove gaps:\n   * - on destroying to bring markup to its inital state\n   */\n  Events.on('destroy', function () {\n    Gaps.remove(Components.Html.wrapper.children);\n  });\n\n  return Gaps;\n}\n\n/**\n * Finds siblings nodes of the passed node.\n *\n * @param  {Element} node\n * @return {Array}\n */\nfunction siblings(node) {\n  if (node && node.parentNode) {\n    var n = node.parentNode.firstChild;\n    var matched = [];\n\n    for (; n; n = n.nextSibling) {\n      if (n.nodeType === 1 && n !== node) {\n        matched.push(n);\n      }\n    }\n\n    return matched;\n  }\n\n  return [];\n}\n\n/**\n * Checks if passed node exist and is a valid element.\n *\n * @param  {Element} node\n * @return {Boolean}\n */\nfunction exist(node) {\n  if (node && node instanceof window.HTMLElement) {\n    return true;\n  }\n\n  return false;\n}\n\nvar TRACK_SELECTOR = '[data-glide-el=\"track\"]';\n\nfunction Html (Glide, Components) {\n  var Html = {\n    /**\n     * Setup slider HTML nodes.\n     *\n     * @param {Glide} glide\n     */\n    mount: function mount() {\n      this.root = Glide.selector;\n      this.track = this.root.querySelector(TRACK_SELECTOR);\n      this.slides = Array.prototype.slice.call(this.wrapper.children).filter(function (slide) {\n        return !slide.classList.contains(Glide.settings.classes.cloneSlide);\n      });\n    }\n  };\n\n  define(Html, 'root', {\n    /**\n     * Gets node of the glide main element.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Html._r;\n    },\n\n\n    /**\n     * Sets node of the glide main element.\n     *\n     * @return {Object}\n     */\n    set: function set(r) {\n      if (isString(r)) {\n        r = document.querySelector(r);\n      }\n\n      if (exist(r)) {\n        Html._r = r;\n      } else {\n        warn('Root element must be a existing Html node');\n      }\n    }\n  });\n\n  define(Html, 'track', {\n    /**\n     * Gets node of the glide track with slides.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Html._t;\n    },\n\n\n    /**\n     * Sets node of the glide track with slides.\n     *\n     * @return {Object}\n     */\n    set: function set(t) {\n      if (exist(t)) {\n        Html._t = t;\n      } else {\n        warn('Could not find track element. Please use ' + TRACK_SELECTOR + ' attribute.');\n      }\n    }\n  });\n\n  define(Html, 'wrapper', {\n    /**\n     * Gets node of the slides wrapper.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Html.track.children[0];\n    }\n  });\n\n  return Html;\n}\n\nfunction Peek (Glide, Components, Events) {\n  var Peek = {\n    /**\n     * Setups how much to peek based on settings.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.value = Glide.settings.peek;\n    }\n  };\n\n  define(Peek, 'value', {\n    /**\n     * Gets value of the peek.\n     *\n     * @returns {Number|Object}\n     */\n    get: function get() {\n      return Peek._v;\n    },\n\n\n    /**\n     * Sets value of the peek.\n     *\n     * @param {Number|Object} value\n     * @return {Void}\n     */\n    set: function set(value) {\n      if (isObject(value)) {\n        value.before = toInt(value.before);\n        value.after = toInt(value.after);\n      } else {\n        value = toInt(value);\n      }\n\n      Peek._v = value;\n    }\n  });\n\n  define(Peek, 'reductor', {\n    /**\n     * Gets reduction value caused by peek.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      var value = Peek.value;\n      var perView = Glide.settings.perView;\n\n      if (isObject(value)) {\n        return value.before / perView + value.after / perView;\n      }\n\n      return value * 2 / perView;\n    }\n  });\n\n  /**\n   * Recalculate peeking sizes on:\n   * - when resizing window to update to proper percents\n   */\n  Events.on(['resize', 'update'], function () {\n    Peek.mount();\n  });\n\n  return Peek;\n}\n\nfunction Move (Glide, Components, Events) {\n  var Move = {\n    /**\n     * Constructs move component.\n     *\n     * @returns {Void}\n     */\n    mount: function mount() {\n      this._o = 0;\n    },\n\n\n    /**\n     * Calculates a movement value based on passed offset and currently active index.\n     *\n     * @param  {Number} offset\n     * @return {Void}\n     */\n    make: function make() {\n      var _this = this;\n\n      var offset = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\n      this.offset = offset;\n\n      Events.emit('move', {\n        movement: this.value\n      });\n\n      Components.Transition.after(function () {\n        Events.emit('move.after', {\n          movement: _this.value\n        });\n      });\n    }\n  };\n\n  define(Move, 'offset', {\n    /**\n     * Gets an offset value used to modify current translate.\n     *\n     * @return {Object}\n     */\n    get: function get() {\n      return Move._o;\n    },\n\n\n    /**\n     * Sets an offset value used to modify current translate.\n     *\n     * @return {Object}\n     */\n    set: function set(value) {\n      Move._o = !isUndefined(value) ? toInt(value) : 0;\n    }\n  });\n\n  define(Move, 'translate', {\n    /**\n     * Gets a raw movement value.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Components.Sizes.slideWidth * Glide.index;\n    }\n  });\n\n  define(Move, 'value', {\n    /**\n     * Gets an actual movement value corrected by offset.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var offset = this.offset;\n      var translate = this.translate;\n\n      if (Components.Direction.is('rtl')) {\n        return translate + offset;\n      }\n\n      return translate - offset;\n    }\n  });\n\n  /**\n   * Make movement to proper slide on:\n   * - before build, so glide will start at `startAt` index\n   * - on each standard run to move to newly calculated index\n   */\n  Events.on(['build.before', 'run'], function () {\n    Move.make();\n  });\n\n  return Move;\n}\n\nfunction Sizes (Glide, Components, Events) {\n  var Sizes = {\n    /**\n     * Setups dimentions of slides.\n     *\n     * @return {Void}\n     */\n    setupSlides: function setupSlides() {\n      var width = this.slideWidth + 'px';\n      var slides = Components.Html.slides;\n\n      for (var i = 0; i < slides.length; i++) {\n        slides[i].style.width = width;\n      }\n    },\n\n\n    /**\n     * Setups dimentions of slides wrapper.\n     *\n     * @return {Void}\n     */\n    setupWrapper: function setupWrapper(dimention) {\n      Components.Html.wrapper.style.width = this.wrapperSize + 'px';\n    },\n\n\n    /**\n     * Removes applied styles from HTML elements.\n     *\n     * @returns {Void}\n     */\n    remove: function remove() {\n      var slides = Components.Html.slides;\n\n      for (var i = 0; i < slides.length; i++) {\n        slides[i].style.width = '';\n      }\n\n      Components.Html.wrapper.style.width = '';\n    }\n  };\n\n  define(Sizes, 'length', {\n    /**\n     * Gets count number of the slides.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Components.Html.slides.length;\n    }\n  });\n\n  define(Sizes, 'width', {\n    /**\n     * Gets width value of the glide.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Components.Html.root.offsetWidth;\n    }\n  });\n\n  define(Sizes, 'wrapperSize', {\n    /**\n     * Gets size of the slides wrapper.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Sizes.slideWidth * Sizes.length + Components.Gaps.grow + Components.Clones.grow;\n    }\n  });\n\n  define(Sizes, 'slideWidth', {\n    /**\n     * Gets width value of the single slide.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return Sizes.width / Glide.settings.perView - Components.Peek.reductor - Components.Gaps.reductor;\n    }\n  });\n\n  /**\n   * Apply calculated glide's dimensions:\n   * - before building, so other dimentions (e.g. translate) will be calculated propertly\n   * - when resizing window to recalculate sildes dimensions\n   * - on updating via API, to calculate dimensions based on new options\n   */\n  Events.on(['build.before', 'resize', 'update'], function () {\n    Sizes.setupSlides();\n    Sizes.setupWrapper();\n  });\n\n  /**\n   * Remove calculated glide's dimensions:\n   * - on destoting to bring markup to its inital state\n   */\n  Events.on('destroy', function () {\n    Sizes.remove();\n  });\n\n  return Sizes;\n}\n\nfunction Build (Glide, Components, Events) {\n  var Build = {\n    /**\n     * Init glide building. Adds classes, sets\n     * dimensions and setups initial state.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      Events.emit('build.before');\n\n      this.typeClass();\n      this.activeClass();\n\n      Events.emit('build.after');\n    },\n\n\n    /**\n     * Adds `type` class to the glide element.\n     *\n     * @return {Void}\n     */\n    typeClass: function typeClass() {\n      Components.Html.root.classList.add(Glide.settings.classes[Glide.settings.type]);\n    },\n\n\n    /**\n     * Sets active class to current slide.\n     *\n     * @return {Void}\n     */\n    activeClass: function activeClass() {\n      var classes = Glide.settings.classes;\n      var slide = Components.Html.slides[Glide.index];\n\n      if (slide) {\n        slide.classList.add(classes.activeSlide);\n\n        siblings(slide).forEach(function (sibling) {\n          sibling.classList.remove(classes.activeSlide);\n        });\n      }\n    },\n\n\n    /**\n     * Removes HTML classes applied at building.\n     *\n     * @return {Void}\n     */\n    removeClasses: function removeClasses() {\n      var classes = Glide.settings.classes;\n\n      Components.Html.root.classList.remove(classes[Glide.settings.type]);\n\n      Components.Html.slides.forEach(function (sibling) {\n        sibling.classList.remove(classes.activeSlide);\n      });\n    }\n  };\n\n  /**\n   * Clear building classes:\n   * - on destroying to bring HTML to its initial state\n   * - on updating to remove classes before remounting component\n   */\n  Events.on(['destroy', 'update'], function () {\n    Build.removeClasses();\n  });\n\n  /**\n   * Remount component:\n   * - on resizing of the window to calculate new dimentions\n   * - on updating settings via API\n   */\n  Events.on(['resize', 'update'], function () {\n    Build.mount();\n  });\n\n  /**\n   * Swap active class of current slide:\n   * - after each move to the new index\n   */\n  Events.on('move.after', function () {\n    Build.activeClass();\n  });\n\n  return Build;\n}\n\nfunction Clones (Glide, Components, Events) {\n  var Clones = {\n    /**\n     * Create pattern map and collect slides to be cloned.\n     */\n    mount: function mount() {\n      this.items = [];\n\n      if (Glide.isType('carousel')) {\n        this.items = this.collect();\n      }\n    },\n\n\n    /**\n     * Collect clones with pattern.\n     *\n     * @return {Void}\n     */\n    collect: function collect() {\n      var items = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n      var slides = Components.Html.slides;\n      var _Glide$settings = Glide.settings,\n          perView = _Glide$settings.perView,\n          classes = _Glide$settings.classes;\n\n\n      var peekIncrementer = +!!Glide.settings.peek;\n      var part = perView + peekIncrementer;\n      var start = slides.slice(0, part);\n      var end = slides.slice(-part);\n\n      for (var r = 0; r < Math.max(1, Math.floor(perView / slides.length)); r++) {\n        for (var i = 0; i < start.length; i++) {\n          var clone = start[i].cloneNode(true);\n\n          clone.classList.add(classes.cloneSlide);\n\n          items.push(clone);\n        }\n\n        for (var _i = 0; _i < end.length; _i++) {\n          var _clone = end[_i].cloneNode(true);\n\n          _clone.classList.add(classes.cloneSlide);\n\n          items.unshift(_clone);\n        }\n      }\n\n      return items;\n    },\n\n\n    /**\n     * Append cloned slides with generated pattern.\n     *\n     * @return {Void}\n     */\n    append: function append() {\n      var items = this.items;\n      var _Components$Html = Components.Html,\n          wrapper = _Components$Html.wrapper,\n          slides = _Components$Html.slides;\n\n\n      var half = Math.floor(items.length / 2);\n      var prepend = items.slice(0, half).reverse();\n      var append = items.slice(half, items.length);\n      var width = Components.Sizes.slideWidth + 'px';\n\n      for (var i = 0; i < append.length; i++) {\n        wrapper.appendChild(append[i]);\n      }\n\n      for (var _i2 = 0; _i2 < prepend.length; _i2++) {\n        wrapper.insertBefore(prepend[_i2], slides[0]);\n      }\n\n      for (var _i3 = 0; _i3 < items.length; _i3++) {\n        items[_i3].style.width = width;\n      }\n    },\n\n\n    /**\n     * Remove all cloned slides.\n     *\n     * @return {Void}\n     */\n    remove: function remove() {\n      var items = this.items;\n\n\n      for (var i = 0; i < items.length; i++) {\n        Components.Html.wrapper.removeChild(items[i]);\n      }\n    }\n  };\n\n  define(Clones, 'grow', {\n    /**\n     * Gets additional dimentions value caused by clones.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      return (Components.Sizes.slideWidth + Components.Gaps.value) * Clones.items.length;\n    }\n  });\n\n  /**\n   * Append additional slide's clones:\n   * - while glide's type is `carousel`\n   */\n  Events.on('update', function () {\n    Clones.remove();\n    Clones.mount();\n    Clones.append();\n  });\n\n  /**\n   * Append additional slide's clones:\n   * - while glide's type is `carousel`\n   */\n  Events.on('build.before', function () {\n    if (Glide.isType('carousel')) {\n      Clones.append();\n    }\n  });\n\n  /**\n   * Remove clones HTMLElements:\n   * - on destroying, to bring HTML to its initial state\n   */\n  Events.on('destroy', function () {\n    Clones.remove();\n  });\n\n  return Clones;\n}\n\nvar EventsBinder = function () {\n  /**\n   * Construct a EventsBinder instance.\n   */\n  function EventsBinder() {\n    var listeners = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n    classCallCheck(this, EventsBinder);\n\n    this.listeners = listeners;\n  }\n\n  /**\n   * Adds events listeners to arrows HTML elements.\n   *\n   * @param  {String|Array} events\n   * @param  {Element|Window|Document} el\n   * @param  {Function} closure\n   * @param  {Boolean|Object} capture\n   * @return {Void}\n   */\n\n\n  createClass(EventsBinder, [{\n    key: 'on',\n    value: function on(events, el, closure) {\n      var capture = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\n      if (isString(events)) {\n        events = [events];\n      }\n\n      for (var i = 0; i < events.length; i++) {\n        this.listeners[events[i]] = closure;\n\n        el.addEventListener(events[i], this.listeners[events[i]], capture);\n      }\n    }\n\n    /**\n     * Removes event listeners from arrows HTML elements.\n     *\n     * @param  {String|Array} events\n     * @param  {Element|Window|Document} el\n     * @param  {Boolean|Object} capture\n     * @return {Void}\n     */\n\n  }, {\n    key: 'off',\n    value: function off(events, el) {\n      var capture = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n      if (isString(events)) {\n        events = [events];\n      }\n\n      for (var i = 0; i < events.length; i++) {\n        el.removeEventListener(events[i], this.listeners[events[i]], capture);\n      }\n    }\n\n    /**\n     * Destroy collected listeners.\n     *\n     * @returns {Void}\n     */\n\n  }, {\n    key: 'destroy',\n    value: function destroy() {\n      delete this.listeners;\n    }\n  }]);\n  return EventsBinder;\n}();\n\nfunction Resize (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  var Resize = {\n    /**\n     * Initializes window bindings.\n     */\n    mount: function mount() {\n      this.bind();\n    },\n\n\n    /**\n     * Binds `rezsize` listener to the window.\n     * It's a costly event, so we are debouncing it.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('resize', window, throttle(function () {\n        Events.emit('resize');\n      }, Glide.settings.throttle));\n    },\n\n\n    /**\n     * Unbinds listeners from the window.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('resize', window);\n    }\n  };\n\n  /**\n   * Remove bindings from window:\n   * - on destroying, to remove added EventListener\n   */\n  Events.on('destroy', function () {\n    Resize.unbind();\n    Binder.destroy();\n  });\n\n  return Resize;\n}\n\nvar VALID_DIRECTIONS = ['ltr', 'rtl'];\nvar FLIPED_MOVEMENTS = {\n  '>': '<',\n  '<': '>',\n  '=': '='\n};\n\nfunction Direction (Glide, Components, Events) {\n  var Direction = {\n    /**\n     * Setups gap value based on settings.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.value = Glide.settings.direction;\n    },\n\n\n    /**\n     * Resolves pattern based on direction value\n     *\n     * @param {String} pattern\n     * @returns {String}\n     */\n    resolve: function resolve(pattern) {\n      var token = pattern.slice(0, 1);\n\n      if (this.is('rtl')) {\n        return pattern.split(token).join(FLIPED_MOVEMENTS[token]);\n      }\n\n      return pattern;\n    },\n\n\n    /**\n     * Checks value of direction mode.\n     *\n     * @param {String} direction\n     * @returns {Boolean}\n     */\n    is: function is(direction) {\n      return this.value === direction;\n    },\n\n\n    /**\n     * Applies direction class to the root HTML element.\n     *\n     * @return {Void}\n     */\n    addClass: function addClass() {\n      Components.Html.root.classList.add(Glide.settings.classes.direction[this.value]);\n    },\n\n\n    /**\n     * Removes direction class from the root HTML element.\n     *\n     * @return {Void}\n     */\n    removeClass: function removeClass() {\n      Components.Html.root.classList.remove(Glide.settings.classes.direction[this.value]);\n    }\n  };\n\n  define(Direction, 'value', {\n    /**\n     * Gets value of the direction.\n     *\n     * @returns {Number}\n     */\n    get: function get() {\n      return Direction._v;\n    },\n\n\n    /**\n     * Sets value of the direction.\n     *\n     * @param {String} value\n     * @return {Void}\n     */\n    set: function set(value) {\n      if (VALID_DIRECTIONS.indexOf(value) > -1) {\n        Direction._v = value;\n      } else {\n        warn('Direction value must be `ltr` or `rtl`');\n      }\n    }\n  });\n\n  /**\n   * Clear direction class:\n   * - on destroy to bring HTML to its initial state\n   * - on update to remove class before reappling bellow\n   */\n  Events.on(['destroy', 'update'], function () {\n    Direction.removeClass();\n  });\n\n  /**\n   * Remount component:\n   * - on update to reflect changes in direction value\n   */\n  Events.on('update', function () {\n    Direction.mount();\n  });\n\n  /**\n   * Apply direction class:\n   * - before building to apply class for the first time\n   * - on updating to reapply direction class that may changed\n   */\n  Events.on(['build.before', 'update'], function () {\n    Direction.addClass();\n  });\n\n  return Direction;\n}\n\n/**\n * Reflects value of glide movement.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Rtl (Glide, Components) {\n  return {\n    /**\n     * Negates the passed translate if glide is in RTL option.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      if (Components.Direction.is('rtl')) {\n        return -translate;\n      }\n\n      return translate;\n    }\n  };\n}\n\n/**\n * Updates glide movement with a `gap` settings.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Gap (Glide, Components) {\n  return {\n    /**\n     * Modifies passed translate value with number in the `gap` settings.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      return translate + Components.Gaps.value * Glide.index;\n    }\n  };\n}\n\n/**\n * Updates glide movement with width of additional clones width.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Grow (Glide, Components) {\n  return {\n    /**\n     * Adds to the passed translate width of the half of clones.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      return translate + Components.Clones.grow / 2;\n    }\n  };\n}\n\n/**\n * Updates glide movement with a `peek` settings.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Peeking (Glide, Components) {\n  return {\n    /**\n     * Modifies passed translate value with a `peek` setting.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      if (Glide.settings.focusAt >= 0) {\n        var peek = Components.Peek.value;\n\n        if (isObject(peek)) {\n          return translate - peek.before;\n        }\n\n        return translate - peek;\n      }\n\n      return translate;\n    }\n  };\n}\n\n/**\n * Updates glide movement with a `focusAt` settings.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction Focusing (Glide, Components) {\n  return {\n    /**\n     * Modifies passed translate value with index in the `focusAt` setting.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    modify: function modify(translate) {\n      var gap = Components.Gaps.value;\n      var width = Components.Sizes.width;\n      var focusAt = Glide.settings.focusAt;\n      var slideWidth = Components.Sizes.slideWidth;\n\n      if (focusAt === 'center') {\n        return translate - (width / 2 - slideWidth / 2);\n      }\n\n      return translate - slideWidth * focusAt - gap * focusAt;\n    }\n  };\n}\n\n/**\n * Applies diffrent transformers on translate value.\n *\n * @param  {Object} Glide\n * @param  {Object} Components\n * @return {Object}\n */\nfunction mutator (Glide, Components, Events) {\n  /**\n   * Merge instance transformers with collection of default transformers.\n   * It's important that the Rtl component be last on the list,\n   * so it reflects all previous transformations.\n   *\n   * @type {Array}\n   */\n  var TRANSFORMERS = [Gap, Grow, Peeking, Focusing].concat(Glide._t, [Rtl]);\n\n  return {\n    /**\n     * Piplines translate value with registered transformers.\n     *\n     * @param  {Number} translate\n     * @return {Number}\n     */\n    mutate: function mutate(translate) {\n      for (var i = 0; i < TRANSFORMERS.length; i++) {\n        var transformer = TRANSFORMERS[i];\n\n        if (isFunction(transformer) && isFunction(transformer().modify)) {\n          translate = transformer(Glide, Components, Events).modify(translate);\n        } else {\n          warn('Transformer should be a function that returns an object with `modify()` method');\n        }\n      }\n\n      return translate;\n    }\n  };\n}\n\nfunction Translate (Glide, Components, Events) {\n  var Translate = {\n    /**\n     * Sets value of translate on HTML element.\n     *\n     * @param {Number} value\n     * @return {Void}\n     */\n    set: function set(value) {\n      var transform = mutator(Glide, Components).mutate(value);\n\n      Components.Html.wrapper.style.transform = 'translate3d(' + -1 * transform + 'px, 0px, 0px)';\n    },\n\n\n    /**\n     * Removes value of translate from HTML element.\n     *\n     * @return {Void}\n     */\n    remove: function remove() {\n      Components.Html.wrapper.style.transform = '';\n    }\n  };\n\n  /**\n   * Set new translate value:\n   * - on move to reflect index change\n   * - on updating via API to reflect possible changes in options\n   */\n  Events.on('move', function (context) {\n    var gap = Components.Gaps.value;\n    var length = Components.Sizes.length;\n    var width = Components.Sizes.slideWidth;\n\n    if (Glide.isType('carousel') && Components.Run.isOffset('<')) {\n      Components.Transition.after(function () {\n        Events.emit('translate.jump');\n\n        Translate.set(width * (length - 1));\n      });\n\n      return Translate.set(-width - gap * length);\n    }\n\n    if (Glide.isType('carousel') && Components.Run.isOffset('>')) {\n      Components.Transition.after(function () {\n        Events.emit('translate.jump');\n\n        Translate.set(0);\n      });\n\n      return Translate.set(width * length + gap * length);\n    }\n\n    return Translate.set(context.movement);\n  });\n\n  /**\n   * Remove translate:\n   * - on destroying to bring markup to its inital state\n   */\n  Events.on('destroy', function () {\n    Translate.remove();\n  });\n\n  return Translate;\n}\n\nfunction Transition (Glide, Components, Events) {\n  /**\n   * Holds inactivity status of transition.\n   * When true transition is not applied.\n   *\n   * @type {Boolean}\n   */\n  var disabled = false;\n\n  var Transition = {\n    /**\n     * Composes string of the CSS transition.\n     *\n     * @param {String} property\n     * @return {String}\n     */\n    compose: function compose(property) {\n      var settings = Glide.settings;\n\n      if (!disabled) {\n        return property + ' ' + this.duration + 'ms ' + settings.animationTimingFunc;\n      }\n\n      return property + ' 0ms ' + settings.animationTimingFunc;\n    },\n\n\n    /**\n     * Sets value of transition on HTML element.\n     *\n     * @param {String=} property\n     * @return {Void}\n     */\n    set: function set() {\n      var property = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'transform';\n\n      Components.Html.wrapper.style.transition = this.compose(property);\n    },\n\n\n    /**\n     * Removes value of transition from HTML element.\n     *\n     * @return {Void}\n     */\n    remove: function remove() {\n      Components.Html.wrapper.style.transition = '';\n    },\n\n\n    /**\n     * Runs callback after animation.\n     *\n     * @param  {Function} callback\n     * @return {Void}\n     */\n    after: function after(callback) {\n      setTimeout(function () {\n        callback();\n      }, this.duration);\n    },\n\n\n    /**\n     * Enable transition.\n     *\n     * @return {Void}\n     */\n    enable: function enable() {\n      disabled = false;\n\n      this.set();\n    },\n\n\n    /**\n     * Disable transition.\n     *\n     * @return {Void}\n     */\n    disable: function disable() {\n      disabled = true;\n\n      this.set();\n    }\n  };\n\n  define(Transition, 'duration', {\n    /**\n     * Gets duration of the transition based\n     * on currently running animation type.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var settings = Glide.settings;\n\n      if (Glide.isType('slider') && Components.Run.offset) {\n        return settings.rewindDuration;\n      }\n\n      return settings.animationDuration;\n    }\n  });\n\n  /**\n   * Set transition `style` value:\n   * - on each moving, because it may be cleared by offset move\n   */\n  Events.on('move', function () {\n    Transition.set();\n  });\n\n  /**\n   * Disable transition:\n   * - before initial build to avoid transitioning from `0` to `startAt` index\n   * - while resizing window and recalculating dimentions\n   * - on jumping from offset transition at start and end edges in `carousel` type\n   */\n  Events.on(['build.before', 'resize', 'translate.jump'], function () {\n    Transition.disable();\n  });\n\n  /**\n   * Enable transition:\n   * - on each running, because it may be disabled by offset move\n   */\n  Events.on('run', function () {\n    Transition.enable();\n  });\n\n  /**\n   * Remove transition:\n   * - on destroying to bring markup to its inital state\n   */\n  Events.on('destroy', function () {\n    Transition.remove();\n  });\n\n  return Transition;\n}\n\n/**\n * Test via a getter in the options object to see\n * if the passive property is accessed.\n *\n * @see https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md#feature-detection\n */\n\nvar supportsPassive = false;\n\ntry {\n  var opts = Object.defineProperty({}, 'passive', {\n    get: function get() {\n      supportsPassive = true;\n    }\n  });\n\n  window.addEventListener('testPassive', null, opts);\n  window.removeEventListener('testPassive', null, opts);\n} catch (e) {}\n\nvar supportsPassive$1 = supportsPassive;\n\nvar START_EVENTS = ['touchstart', 'mousedown'];\nvar MOVE_EVENTS = ['touchmove', 'mousemove'];\nvar END_EVENTS = ['touchend', 'touchcancel', 'mouseup', 'mouseleave'];\nvar MOUSE_EVENTS = ['mousedown', 'mousemove', 'mouseup', 'mouseleave'];\n\nfunction Swipe (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  var swipeSin = 0;\n  var swipeStartX = 0;\n  var swipeStartY = 0;\n  var disabled = false;\n  var capture = supportsPassive$1 ? { passive: true } : false;\n\n  var Swipe = {\n    /**\n     * Initializes swipe bindings.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.bindSwipeStart();\n    },\n\n\n    /**\n     * Handler for `swipestart` event. Calculates entry points of the user's tap.\n     *\n     * @param {Object} event\n     * @return {Void}\n     */\n    start: function start(event) {\n      if (!disabled && !Glide.disabled) {\n        this.disable();\n\n        var swipe = this.touches(event);\n\n        swipeSin = null;\n        swipeStartX = toInt(swipe.pageX);\n        swipeStartY = toInt(swipe.pageY);\n\n        this.bindSwipeMove();\n        this.bindSwipeEnd();\n\n        Events.emit('swipe.start');\n      }\n    },\n\n\n    /**\n     * Handler for `swipemove` event. Calculates user's tap angle and distance.\n     *\n     * @param {Object} event\n     */\n    move: function move(event) {\n      if (!Glide.disabled) {\n        var _Glide$settings = Glide.settings,\n            touchAngle = _Glide$settings.touchAngle,\n            touchRatio = _Glide$settings.touchRatio,\n            classes = _Glide$settings.classes;\n\n\n        var swipe = this.touches(event);\n\n        var subExSx = toInt(swipe.pageX) - swipeStartX;\n        var subEySy = toInt(swipe.pageY) - swipeStartY;\n        var powEX = Math.abs(subExSx << 2);\n        var powEY = Math.abs(subEySy << 2);\n        var swipeHypotenuse = Math.sqrt(powEX + powEY);\n        var swipeCathetus = Math.sqrt(powEY);\n\n        swipeSin = Math.asin(swipeCathetus / swipeHypotenuse);\n\n        if (swipeSin * 180 / Math.PI < touchAngle) {\n          event.stopPropagation();\n\n          Components.Move.make(subExSx * toFloat(touchRatio));\n\n          Components.Html.root.classList.add(classes.dragging);\n\n          Events.emit('swipe.move');\n        } else {\n          return false;\n        }\n      }\n    },\n\n\n    /**\n     * Handler for `swipeend` event. Finitializes user's tap and decides about glide move.\n     *\n     * @param {Object} event\n     * @return {Void}\n     */\n    end: function end(event) {\n      if (!Glide.disabled) {\n        var settings = Glide.settings;\n\n        var swipe = this.touches(event);\n        var threshold = this.threshold(event);\n\n        var swipeDistance = swipe.pageX - swipeStartX;\n        var swipeDeg = swipeSin * 180 / Math.PI;\n        var steps = Math.round(swipeDistance / Components.Sizes.slideWidth);\n\n        this.enable();\n\n        if (swipeDistance > threshold && swipeDeg < settings.touchAngle) {\n          // While swipe is positive and greater than threshold move backward.\n          if (settings.perTouch) {\n            steps = Math.min(steps, toInt(settings.perTouch));\n          }\n\n          if (Components.Direction.is('rtl')) {\n            steps = -steps;\n          }\n\n          Components.Run.make(Components.Direction.resolve('<' + steps));\n        } else if (swipeDistance < -threshold && swipeDeg < settings.touchAngle) {\n          // While swipe is negative and lower than negative threshold move forward.\n          if (settings.perTouch) {\n            steps = Math.max(steps, -toInt(settings.perTouch));\n          }\n\n          if (Components.Direction.is('rtl')) {\n            steps = -steps;\n          }\n\n          Components.Run.make(Components.Direction.resolve('>' + steps));\n        } else {\n          // While swipe don't reach distance apply previous transform.\n          Components.Move.make();\n        }\n\n        Components.Html.root.classList.remove(settings.classes.dragging);\n\n        this.unbindSwipeMove();\n        this.unbindSwipeEnd();\n\n        Events.emit('swipe.end');\n      }\n    },\n\n\n    /**\n     * Binds swipe's starting event.\n     *\n     * @return {Void}\n     */\n    bindSwipeStart: function bindSwipeStart() {\n      var _this = this;\n\n      var settings = Glide.settings;\n\n      if (settings.swipeThreshold) {\n        Binder.on(START_EVENTS[0], Components.Html.wrapper, function (event) {\n          _this.start(event);\n        }, capture);\n      }\n\n      if (settings.dragThreshold) {\n        Binder.on(START_EVENTS[1], Components.Html.wrapper, function (event) {\n          _this.start(event);\n        }, capture);\n      }\n    },\n\n\n    /**\n     * Unbinds swipe's starting event.\n     *\n     * @return {Void}\n     */\n    unbindSwipeStart: function unbindSwipeStart() {\n      Binder.off(START_EVENTS[0], Components.Html.wrapper, capture);\n      Binder.off(START_EVENTS[1], Components.Html.wrapper, capture);\n    },\n\n\n    /**\n     * Binds swipe's moving event.\n     *\n     * @return {Void}\n     */\n    bindSwipeMove: function bindSwipeMove() {\n      var _this2 = this;\n\n      Binder.on(MOVE_EVENTS, Components.Html.wrapper, throttle(function (event) {\n        _this2.move(event);\n      }, Glide.settings.throttle), capture);\n    },\n\n\n    /**\n     * Unbinds swipe's moving event.\n     *\n     * @return {Void}\n     */\n    unbindSwipeMove: function unbindSwipeMove() {\n      Binder.off(MOVE_EVENTS, Components.Html.wrapper, capture);\n    },\n\n\n    /**\n     * Binds swipe's ending event.\n     *\n     * @return {Void}\n     */\n    bindSwipeEnd: function bindSwipeEnd() {\n      var _this3 = this;\n\n      Binder.on(END_EVENTS, Components.Html.wrapper, function (event) {\n        _this3.end(event);\n      });\n    },\n\n\n    /**\n     * Unbinds swipe's ending event.\n     *\n     * @return {Void}\n     */\n    unbindSwipeEnd: function unbindSwipeEnd() {\n      Binder.off(END_EVENTS, Components.Html.wrapper);\n    },\n\n\n    /**\n     * Normalizes event touches points accorting to different types.\n     *\n     * @param {Object} event\n     */\n    touches: function touches(event) {\n      if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n        return event;\n      }\n\n      return event.touches[0] || event.changedTouches[0];\n    },\n\n\n    /**\n     * Gets value of minimum swipe distance settings based on event type.\n     *\n     * @return {Number}\n     */\n    threshold: function threshold(event) {\n      var settings = Glide.settings;\n\n      if (MOUSE_EVENTS.indexOf(event.type) > -1) {\n        return settings.dragThreshold;\n      }\n\n      return settings.swipeThreshold;\n    },\n\n\n    /**\n     * Enables swipe event.\n     *\n     * @return {self}\n     */\n    enable: function enable() {\n      disabled = false;\n\n      Components.Transition.enable();\n\n      return this;\n    },\n\n\n    /**\n     * Disables swipe event.\n     *\n     * @return {self}\n     */\n    disable: function disable() {\n      disabled = true;\n\n      Components.Transition.disable();\n\n      return this;\n    }\n  };\n\n  /**\n   * Add component class:\n   * - after initial building\n   */\n  Events.on('build.after', function () {\n    Components.Html.root.classList.add(Glide.settings.classes.swipeable);\n  });\n\n  /**\n   * Remove swiping bindings:\n   * - on destroying, to remove added EventListeners\n   */\n  Events.on('destroy', function () {\n    Swipe.unbindSwipeStart();\n    Swipe.unbindSwipeMove();\n    Swipe.unbindSwipeEnd();\n    Binder.destroy();\n  });\n\n  return Swipe;\n}\n\nfunction Images (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  var Images = {\n    /**\n     * Binds listener to glide wrapper.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.bind();\n    },\n\n\n    /**\n     * Binds `dragstart` event on wrapper to prevent dragging images.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('dragstart', Components.Html.wrapper, this.dragstart);\n    },\n\n\n    /**\n     * Unbinds `dragstart` event on wrapper.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('dragstart', Components.Html.wrapper);\n    },\n\n\n    /**\n     * Event handler. Prevents dragging.\n     *\n     * @return {Void}\n     */\n    dragstart: function dragstart(event) {\n      event.preventDefault();\n    }\n  };\n\n  /**\n   * Remove bindings from images:\n   * - on destroying, to remove added EventListeners\n   */\n  Events.on('destroy', function () {\n    Images.unbind();\n    Binder.destroy();\n  });\n\n  return Images;\n}\n\nfunction Anchors (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  /**\n   * Holds detaching status of anchors.\n   * Prevents detaching of already detached anchors.\n   *\n   * @private\n   * @type {Boolean}\n   */\n  var detached = false;\n\n  /**\n   * Holds preventing status of anchors.\n   * If `true` redirection after click will be disabled.\n   *\n   * @private\n   * @type {Boolean}\n   */\n  var prevented = false;\n\n  var Anchors = {\n    /**\n     * Setups a initial state of anchors component.\n     *\n     * @returns {Void}\n     */\n    mount: function mount() {\n      /**\n       * Holds collection of anchors elements.\n       *\n       * @private\n       * @type {HTMLCollection}\n       */\n      this._a = Components.Html.wrapper.querySelectorAll('a');\n\n      this.bind();\n    },\n\n\n    /**\n     * Binds events to anchors inside a track.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('click', Components.Html.wrapper, this.click);\n    },\n\n\n    /**\n     * Unbinds events attached to anchors inside a track.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('click', Components.Html.wrapper);\n    },\n\n\n    /**\n     * Handler for click event. Prevents clicks when glide is in `prevent` status.\n     *\n     * @param  {Object} event\n     * @return {Void}\n     */\n    click: function click(event) {\n      if (prevented) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    },\n\n\n    /**\n     * Detaches anchors click event inside glide.\n     *\n     * @return {self}\n     */\n    detach: function detach() {\n      prevented = true;\n\n      if (!detached) {\n        for (var i = 0; i < this.items.length; i++) {\n          this.items[i].draggable = false;\n\n          this.items[i].setAttribute('data-href', this.items[i].getAttribute('href'));\n\n          this.items[i].removeAttribute('href');\n        }\n\n        detached = true;\n      }\n\n      return this;\n    },\n\n\n    /**\n     * Attaches anchors click events inside glide.\n     *\n     * @return {self}\n     */\n    attach: function attach() {\n      prevented = false;\n\n      if (detached) {\n        for (var i = 0; i < this.items.length; i++) {\n          this.items[i].draggable = true;\n\n          this.items[i].setAttribute('href', this.items[i].getAttribute('data-href'));\n        }\n\n        detached = false;\n      }\n\n      return this;\n    }\n  };\n\n  define(Anchors, 'items', {\n    /**\n     * Gets collection of the arrows HTML elements.\n     *\n     * @return {HTMLElement[]}\n     */\n    get: function get() {\n      return Anchors._a;\n    }\n  });\n\n  /**\n   * Detach anchors inside slides:\n   * - on swiping, so they won't redirect to its `href` attributes\n   */\n  Events.on('swipe.move', function () {\n    Anchors.detach();\n  });\n\n  /**\n   * Attach anchors inside slides:\n   * - after swiping and transitions ends, so they can redirect after click again\n   */\n  Events.on('swipe.end', function () {\n    Components.Transition.after(function () {\n      Anchors.attach();\n    });\n  });\n\n  /**\n   * Unbind anchors inside slides:\n   * - on destroying, to bring anchors to its initial state\n   */\n  Events.on('destroy', function () {\n    Anchors.attach();\n    Anchors.unbind();\n    Binder.destroy();\n  });\n\n  return Anchors;\n}\n\nvar NAV_SELECTOR = '[data-glide-el=\"controls[nav]\"]';\nvar CONTROLS_SELECTOR = '[data-glide-el^=\"controls\"]';\n\nfunction Controls (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  var capture = supportsPassive$1 ? { passive: true } : false;\n\n  var Controls = {\n    /**\n     * Inits arrows. Binds events listeners\n     * to the arrows HTML elements.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      /**\n       * Collection of navigation HTML elements.\n       *\n       * @private\n       * @type {HTMLCollection}\n       */\n      this._n = Components.Html.root.querySelectorAll(NAV_SELECTOR);\n\n      /**\n       * Collection of controls HTML elements.\n       *\n       * @private\n       * @type {HTMLCollection}\n       */\n      this._c = Components.Html.root.querySelectorAll(CONTROLS_SELECTOR);\n\n      this.addBindings();\n    },\n\n\n    /**\n     * Sets active class to current slide.\n     *\n     * @return {Void}\n     */\n    setActive: function setActive() {\n      for (var i = 0; i < this._n.length; i++) {\n        this.addClass(this._n[i].children);\n      }\n    },\n\n\n    /**\n     * Removes active class to current slide.\n     *\n     * @return {Void}\n     */\n    removeActive: function removeActive() {\n      for (var i = 0; i < this._n.length; i++) {\n        this.removeClass(this._n[i].children);\n      }\n    },\n\n\n    /**\n     * Toggles active class on items inside navigation.\n     *\n     * @param  {HTMLElement} controls\n     * @return {Void}\n     */\n    addClass: function addClass(controls) {\n      var settings = Glide.settings;\n      var item = controls[Glide.index];\n\n      if (item) {\n        item.classList.add(settings.classes.activeNav);\n\n        siblings(item).forEach(function (sibling) {\n          sibling.classList.remove(settings.classes.activeNav);\n        });\n      }\n    },\n\n\n    /**\n     * Removes active class from active control.\n     *\n     * @param  {HTMLElement} controls\n     * @return {Void}\n     */\n    removeClass: function removeClass(controls) {\n      var item = controls[Glide.index];\n\n      if (item) {\n        item.classList.remove(Glide.settings.classes.activeNav);\n      }\n    },\n\n\n    /**\n     * Adds handles to the each group of controls.\n     *\n     * @return {Void}\n     */\n    addBindings: function addBindings() {\n      for (var i = 0; i < this._c.length; i++) {\n        this.bind(this._c[i].children);\n      }\n    },\n\n\n    /**\n     * Removes handles from the each group of controls.\n     *\n     * @return {Void}\n     */\n    removeBindings: function removeBindings() {\n      for (var i = 0; i < this._c.length; i++) {\n        this.unbind(this._c[i].children);\n      }\n    },\n\n\n    /**\n     * Binds events to arrows HTML elements.\n     *\n     * @param {HTMLCollection} elements\n     * @return {Void}\n     */\n    bind: function bind(elements) {\n      for (var i = 0; i < elements.length; i++) {\n        Binder.on('click', elements[i], this.click);\n        Binder.on('touchstart', elements[i], this.click, capture);\n      }\n    },\n\n\n    /**\n     * Unbinds events binded to the arrows HTML elements.\n     *\n     * @param {HTMLCollection} elements\n     * @return {Void}\n     */\n    unbind: function unbind(elements) {\n      for (var i = 0; i < elements.length; i++) {\n        Binder.off(['click', 'touchstart'], elements[i]);\n      }\n    },\n\n\n    /**\n     * Handles `click` event on the arrows HTML elements.\n     * Moves slider in driection precised in\n     * `data-glide-dir` attribute.\n     *\n     * @param {Object} event\n     * @return {Void}\n     */\n    click: function click(event) {\n      event.preventDefault();\n\n      Components.Run.make(Components.Direction.resolve(event.currentTarget.getAttribute('data-glide-dir')));\n    }\n  };\n\n  define(Controls, 'items', {\n    /**\n     * Gets collection of the controls HTML elements.\n     *\n     * @return {HTMLElement[]}\n     */\n    get: function get() {\n      return Controls._c;\n    }\n  });\n\n  /**\n   * Swap active class of current navigation item:\n   * - after mounting to set it to initial index\n   * - after each move to the new index\n   */\n  Events.on(['mount.after', 'move.after'], function () {\n    Controls.setActive();\n  });\n\n  /**\n   * Remove bindings and HTML Classes:\n   * - on destroying, to bring markup to its initial state\n   */\n  Events.on('destroy', function () {\n    Controls.removeBindings();\n    Controls.removeActive();\n    Binder.destroy();\n  });\n\n  return Controls;\n}\n\nfunction Keyboard (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  var Keyboard = {\n    /**\n     * Binds keyboard events on component mount.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      if (Glide.settings.keyboard) {\n        this.bind();\n      }\n    },\n\n\n    /**\n     * Adds keyboard press events.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      Binder.on('keyup', document, this.press);\n    },\n\n\n    /**\n     * Removes keyboard press events.\n     *\n     * @return {Void}\n     */\n    unbind: function unbind() {\n      Binder.off('keyup', document);\n    },\n\n\n    /**\n     * Handles keyboard's arrows press and moving glide foward and backward.\n     *\n     * @param  {Object} event\n     * @return {Void}\n     */\n    press: function press(event) {\n      if (event.keyCode === 39) {\n        Components.Run.make(Components.Direction.resolve('>'));\n      }\n\n      if (event.keyCode === 37) {\n        Components.Run.make(Components.Direction.resolve('<'));\n      }\n    }\n  };\n\n  /**\n   * Remove bindings from keyboard:\n   * - on destroying to remove added events\n   * - on updating to remove events before remounting\n   */\n  Events.on(['destroy', 'update'], function () {\n    Keyboard.unbind();\n  });\n\n  /**\n   * Remount component\n   * - on updating to reflect potential changes in settings\n   */\n  Events.on('update', function () {\n    Keyboard.mount();\n  });\n\n  /**\n   * Destroy binder:\n   * - on destroying to remove listeners\n   */\n  Events.on('destroy', function () {\n    Binder.destroy();\n  });\n\n  return Keyboard;\n}\n\nfunction Autoplay (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  var Autoplay = {\n    /**\n     * Initializes autoplaying and events.\n     *\n     * @return {Void}\n     */\n    mount: function mount() {\n      this.start();\n\n      if (Glide.settings.hoverpause) {\n        this.bind();\n      }\n    },\n\n\n    /**\n     * Starts autoplaying in configured interval.\n     *\n     * @param {Boolean|Number} force Run autoplaying with passed interval regardless of `autoplay` settings\n     * @return {Void}\n     */\n    start: function start() {\n      var _this = this;\n\n      if (Glide.settings.autoplay) {\n        if (isUndefined(this._i)) {\n          this._i = setInterval(function () {\n            _this.stop();\n\n            Components.Run.make('>');\n\n            _this.start();\n          }, this.time);\n        }\n      }\n    },\n\n\n    /**\n     * Stops autorunning of the glide.\n     *\n     * @return {Void}\n     */\n    stop: function stop() {\n      this._i = clearInterval(this._i);\n    },\n\n\n    /**\n     * Stops autoplaying while mouse is over glide's area.\n     *\n     * @return {Void}\n     */\n    bind: function bind() {\n      var _this2 = this;\n\n      Binder.on('mouseover', Components.Html.root, function () {\n        _this2.stop();\n      });\n\n      Binder.on('mouseout', Components.Html.root, function () {\n        _this2.start();\n      });\n    },\n\n\n    /**\n     * Unbind mouseover events.\n     *\n     * @returns {Void}\n     */\n    unbind: function unbind() {\n      Binder.off(['mouseover', 'mouseout'], Components.Html.root);\n    }\n  };\n\n  define(Autoplay, 'time', {\n    /**\n     * Gets time period value for the autoplay interval. Prioritizes\n     * times in `data-glide-autoplay` attrubutes over options.\n     *\n     * @return {Number}\n     */\n    get: function get() {\n      var autoplay = Components.Html.slides[Glide.index].getAttribute('data-glide-autoplay');\n\n      if (autoplay) {\n        return toInt(autoplay);\n      }\n\n      return toInt(Glide.settings.autoplay);\n    }\n  });\n\n  /**\n   * Stop autoplaying and unbind events:\n   * - on destroying, to clear defined interval\n   * - on updating via API to reset interval that may changed\n   */\n  Events.on(['destroy', 'update'], function () {\n    Autoplay.unbind();\n  });\n\n  /**\n   * Stop autoplaying:\n   * - before each run, to restart autoplaying\n   * - on pausing via API\n   * - on destroying, to clear defined interval\n   * - while starting a swipe\n   * - on updating via API to reset interval that may changed\n   */\n  Events.on(['run.before', 'pause', 'destroy', 'swipe.start', 'update'], function () {\n    Autoplay.stop();\n  });\n\n  /**\n   * Start autoplaying:\n   * - after each run, to restart autoplaying\n   * - on playing via API\n   * - while ending a swipe\n   */\n  Events.on(['run.after', 'play', 'swipe.end'], function () {\n    Autoplay.start();\n  });\n\n  /**\n   * Remount autoplaying:\n   * - on updating via API to reset interval that may changed\n   */\n  Events.on('update', function () {\n    Autoplay.mount();\n  });\n\n  /**\n   * Destroy a binder:\n   * - on destroying glide instance to clearup listeners\n   */\n  Events.on('destroy', function () {\n    Binder.destroy();\n  });\n\n  return Autoplay;\n}\n\n/**\n * Sorts keys of breakpoint object so they will be ordered from lower to bigger.\n *\n * @param {Object} points\n * @returns {Object}\n */\nfunction sortBreakpoints(points) {\n  if (isObject(points)) {\n    return sortKeys(points);\n  } else {\n    warn('Breakpoints option must be an object');\n  }\n\n  return {};\n}\n\nfunction Breakpoints (Glide, Components, Events) {\n  /**\n   * Instance of the binder for DOM Events.\n   *\n   * @type {EventsBinder}\n   */\n  var Binder = new EventsBinder();\n\n  /**\n   * Holds reference to settings.\n   *\n   * @type {Object}\n   */\n  var settings = Glide.settings;\n\n  /**\n   * Holds reference to breakpoints object in settings. Sorts breakpoints\n   * from smaller to larger. It is required in order to proper\n   * matching currently active breakpoint settings.\n   *\n   * @type {Object}\n   */\n  var points = sortBreakpoints(settings.breakpoints);\n\n  /**\n   * Cache initial settings before overwritting.\n   *\n   * @type {Object}\n   */\n  var defaults = _extends({}, settings);\n\n  var Breakpoints = {\n    /**\n     * Matches settings for currectly matching media breakpoint.\n     *\n     * @param {Object} points\n     * @returns {Object}\n     */\n    match: function match(points) {\n      if (typeof window.matchMedia !== 'undefined') {\n        for (var point in points) {\n          if (points.hasOwnProperty(point)) {\n            if (window.matchMedia('(max-width: ' + point + 'px)').matches) {\n              return points[point];\n            }\n          }\n        }\n      }\n\n      return defaults;\n    }\n  };\n\n  /**\n   * Overwrite instance settings with currently matching breakpoint settings.\n   * This happens right after component initialization.\n   */\n  _extends(settings, Breakpoints.match(points));\n\n  /**\n   * Update glide with settings of matched brekpoint:\n   * - window resize to update slider\n   */\n  Binder.on('resize', window, throttle(function () {\n    Glide.settings = mergeOptions(settings, Breakpoints.match(points));\n  }, Glide.settings.throttle));\n\n  /**\n   * Resort and update default settings:\n   * - on reinit via API, so breakpoint matching will be performed with options\n   */\n  Events.on('update', function () {\n    points = sortBreakpoints(points);\n\n    defaults = _extends({}, settings);\n  });\n\n  /**\n   * Unbind resize listener:\n   * - on destroying, to bring markup to its initial state\n   */\n  Events.on('destroy', function () {\n    Binder.off('resize', window);\n  });\n\n  return Breakpoints;\n}\n\nvar COMPONENTS = {\n  // Required\n  Html: Html,\n  Translate: Translate,\n  Transition: Transition,\n  Direction: Direction,\n  Peek: Peek,\n  Sizes: Sizes,\n  Gaps: Gaps,\n  Move: Move,\n  Clones: Clones,\n  Resize: Resize,\n  Build: Build,\n  Run: Run,\n\n  // Optional\n  Swipe: Swipe,\n  Images: Images,\n  Anchors: Anchors,\n  Controls: Controls,\n  Keyboard: Keyboard,\n  Autoplay: Autoplay,\n  Breakpoints: Breakpoints\n};\n\nvar Glide$1 = function (_Core) {\n  inherits(Glide$$1, _Core);\n\n  function Glide$$1() {\n    classCallCheck(this, Glide$$1);\n    return possibleConstructorReturn(this, (Glide$$1.__proto__ || Object.getPrototypeOf(Glide$$1)).apply(this, arguments));\n  }\n\n  createClass(Glide$$1, [{\n    key: 'mount',\n    value: function mount() {\n      var extensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n      return get(Glide$$1.prototype.__proto__ || Object.getPrototypeOf(Glide$$1.prototype), 'mount', this).call(this, _extends({}, COMPONENTS, extensions));\n    }\n  }]);\n  return Glide$$1;\n}(Glide);\n\nexport default Glide$1;\n","import Glide from '@glidejs/glide';\n\nexport const RPMCarousel = (function() {\n    'use strict';\n\n    let carousel;\n\n    function init() {\n        carousel = document.querySelectorAll('.glide');\n        if (!carousel.length > 1) return;\n\n        carousel.forEach(el => {\n            renderCarousel(el);\n        });\n    }\n\n    function renderCarousel(carousel) {\n        let autoplay, loop;\n        autoplay = carousel.dataset.autoplay;\n\n        let carouselSettings = new Glide(carousel, {\n            autoplay: autoplay,\n            type: 'carousel',\n        })\n\n        carouselSettings.mount();\n    }\n\n    return {\n        init: init\n    };\n})();","export const RPMPostGrid = (function() {\n\t'use strict';\n\n\tlet $vids;\n\n\tfunction init() {\n\t\t$vids = $('.rpmblock--post-grid .modal');\n\t\tif($vids.length > 0) {\n\t\t\t$vids.each(function(){\n\t\t\t\tevents(this);\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction events(vid) {\n\t\tlet $vid = $(vid);\n\t\tlet $iframe = $vid.find('iframe');\n\t\tlet $play = $vid.find('.rpmblock--videos__vid-play a');\n\t\tlet $modal = $vid.find('[data-micromodal-close]');\n\n\t\t// console.log($iframe);\n\t\t\n\t\t// $iframe.hide();\n\n\t\t// $play.on('click touchstart', function() {\n\t\t// \t$iframe[0].src += \"&autoplay=1\";\n\t\t// \t$iframe.fadeIn();\n\t\t// });\n\n\t\t$modal.on('click touchstart', function(){\n\t\t\t$iframe[0].contentWindow.postMessage('{\"event\":\"command\",\"func\":\"' + 'stopVideo' + '\",\"args\":\"\"}', '*');\n\t\t});\n\t}\n\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMCallout = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMColumns = (function () {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init,\n\t};\n})();\n","export const RPMCollage = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMImage = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMNCTABox = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMMarkup = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMNewsletter = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMDivider = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMPageLinks = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMTimeline = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMText = (function () {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init,\n\t};\n})();\n","export const RPMTitle = (function() {\n\t'use strict';\n\n\tfunction init() {\n\t\tevents();\n\t}\n\n\tfunction events() {}\n\n\treturn {\n\t\tinit: init\n\t};\n})();\n","export const RPMTonyAnnounce = (function() {\n    'use strict';\n\n    function init() {\n        events();\n    }\n\n    function events() {\n\n    }\n\n\n    return {\n        init: init,\n    };\n})();"],"names":["$accordionList","$group","RPMAccolades","init","RPMAccordion","$","length","each","list","$question","$answer","this","find","on","target","attr","expanded","slideUp","slideDown","RPMBanner","RPMBlockquote","RPMBlurb","RPMBilling","idx","$this","$prev","$next","ajax","method","url","RPMConstants","themeDir","dataType","done","result","html","fail","error","console","log","append","RPMBoxedCallout","RPMCalendar","weeklyCalendar","calendar","performanceName","renderPerformanceLink","key","date","dayNumber","year","showtime","isBest","isBBQ","performanceLink","renderDateNumber","mon","day","renderMonthTitle","month","title","renderBeforeOffsetDays","offsetDays","before","f","renderAfterOffsetDays","after","t","COMMONUTILS","SCHEDULE","document","querySelector","window","width","dataset","events","pageWidth","documentElement","clientWidth","userLocation","initWeekly","Fetch","Weekly","Times","Avail","Schedule","getData","schedule","targetdiv","href","getJSON","format","data","dn","Date","getMonth","di","schedule_info","currentMonth","Number","dateID","shift","click","e","preventDefault","months","next","index","hasClass","removeClass","hide","eq","fadeIn","addClass","source","callback","JSON","parse","PopulateWeekly","container","eventslist","i","eventDate","start","eventTime","best","bbq","eventInfo","replace","featured","calDate","setDate","getDate","Object","keys","showYear","showMonth","concat","linkMonth","hoursKey","hours","j","showDay","timesKey","k","eveMat","theTime","linkTime","artist","linkDay","toString","showDate","startDate","time","push","calText","getElementById","innerHTML","block","blockToday","startCustom","thisDay","weekday","Array","d","m","y","getFullYear","n","getDay","the_day","thisDate","currentPage","location","pathname","pagename","sched","results","schedulePop","resetArrowsIfNoMonths","prev","today","dmo","dy","monthYear","getTime","schedule_html","todayMonth","scheduleMonthNumber","scheduleMonthDays","days","scheduleMonthYear","scheduleMonthHours","todayMonthNumber","todayDateNumber","todayYearNumber","scheduleHours","datedeets","exemption_text","full_month","isCurrentMonth","parseInt","offset","monthly","defaults","type","startAt","perView","focusAt","gap","autoplay","hoverpause","keyboard","bound","swipeThreshold","dragThreshold","perTouch","touchRatio","touchAngle","animationDuration","rewind","rewindDuration","animationTimingFunc","throttle","direction","peek","breakpoints","classes","ltr","rtl","slider","carousel","swipeable","dragging","cloneSlide","activeNav","activeSlide","disabledArrow","warn","msg","_typeof","Symbol","iterator","obj","constructor","prototype","classCallCheck","instance","Constructor","TypeError","createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","protoProps","staticProps","_extends","assign","arguments","hasOwnProperty","call","get","object","property","receiver","Function","desc","getOwnPropertyDescriptor","undefined","parent","getPrototypeOf","value","getter","possibleConstructorReturn","self","ReferenceError","toInt","isString","isObject","isFunction","isUndefined","isArray","mount","glide","extensions","components","name","_name","define","prop","definition","mergeOptions","settings","options","EventsBus","hop","event","handler","remove","context","emit","forEach","item","Glide","selector","_c","_t","_e","disabled","transformers","pattern","Run","make","distance","Transition","disable","Move","interval","_o","set","o","_i","_d","status","now","func","wait","timeout","args","previous","later","leading","apply","throttled","at","remaining","clearTimeout","trailing","setTimeout","cancel","MARGIN_TYPE","siblings","node","parentNode","firstChild","matched","nextSibling","nodeType","exist","HTMLElement","TRACK_SELECTOR","EventsBinder","listeners","el","closure","capture","addEventListener","removeEventListener","VALID_DIRECTIONS","FLIPED_MOVEMENTS","Rtl","Components","modify","translate","Direction","is","Gap","Gaps","Grow","Clones","grow","Peeking","Peek","Focusing","Sizes","slideWidth","supportsPassive","opts","supportsPassive$1","START_EVENTS","MOVE_EVENTS","END_EVENTS","MOUSE_EVENTS","sortBreakpoints","points","sort","reduce","r","$vids","COMPONENTS","Html","root","track","slides","slice","wrapper","children","filter","slide","classList","contains","_r","Translate","Events","transform","TRANSFORMERS","mutate","transformer","mutator","style","isType","isOffset","movement","compose","duration","transition","enable","resolve","token","split","join","add","_v","indexOf","setupSlides","setupWrapper","dimention","wrapperSize","offsetWidth","reductor","len","marginLeft","marginRight","_this","items","collect","_Glide$settings","peekIncrementer","part","end","Math","max","floor","clone","cloneNode","_clone","unshift","_Components$Html","half","prepend","reverse","appendChild","_i2","insertBefore","_i3","removeChild","Resize","Binder","bind","unbind","off","destroy","Build","typeClass","activeClass","sibling","removeClasses","move","calculate","isStart","isEnd","steps","countableSteps","min","_m","step","substr","Swipe","swipeSin","swipeStartX","swipeStartY","passive","bindSwipeStart","swipe","touches","pageX","pageY","bindSwipeMove","bindSwipeEnd","subExSx","subEySy","powEX","abs","powEY","swipeHypotenuse","sqrt","swipeCathetus","asin","PI","stopPropagation","parseFloat","threshold","swipeDistance","swipeDeg","round","unbindSwipeMove","unbindSwipeEnd","unbindSwipeStart","_this2","_this3","changedTouches","Images","dragstart","Anchors","detached","prevented","_a","querySelectorAll","detach","draggable","setAttribute","getAttribute","removeAttribute","attach","Controls","_n","addBindings","setActive","removeActive","controls","removeBindings","elements","currentTarget","Keyboard","press","keyCode","Autoplay","setInterval","stop","clearInterval","Breakpoints","match","matchMedia","point","matches","Glide$1","_Core","Glide$$1","__proto__","subClass","superClass","create","setPrototypeOf","inherits","RPMCarousel","renderCarousel","RPMCallout","RPMColumns","RPMCollage","RPMImage","RPMNCTABox","RPMMarkup","RPMNewsletter","RPMDivider","RPMPostGrid","$vid","$iframe","contentWindow","postMessage","RPMPageLinks","RPMTimeline","RPMText","RPMTitle","RPMTonyAnnounce"],"mappings":"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"}