PageSourceSearch

https://betterwebtype.com/assets/js/main.js

js betterwebtype.com collected 2026-10-02 06:03:40 UTC 40,918 bytes, 509 lines download raw bytes

1/*eslint-env jquery*/
2// If page is course page
3$(function () {
4  if ($('body').is('.course')) {
5    // Animate tutorial image on scroll + mobile fixed button behavior
6    var el;
7    var bottom;
8    var h = window.innerHeight;
9
10    $(window).on('load', function(){
11      el = $('.bottom-cta-tag');
12      bottom = el.position().top + el.outerHeight(true);
13    });
14
15    animateOnScroll('.lesson-img', 'slide-in-fwd-bottom', 1);
16
17    $(window).on('scroll', function() {
18      var y_scroll_pos = window.pageYOffset;
19      var scrollBottom = y_scroll_pos + h - 60;
20
21      if (scrollBottom >= bottom){
22        $('#mobile-signup').removeClass('mobile-signup').addClass('animated infinite pulse');
23      }
24
25      if (scrollBottom < bottom){
26        $('#mobile-signup').removeClass('animated infinite pulse').addClass('mobile-signup');
27      }
28    });
29
30    $('.scrollToTop').click(function(){
31      $('html, body').animate({scrollTop : 0},800);
32      return false;
33    });
34
35    slider('#slider1', 300);
36  } // End of if statement
37}); // End of homepage stuff
38
39// If page is reviews page
40$(function () {
41  if ($('body').is('.reviews-page')) {
42    var dataUrl = "https://sheets.googleapis.com/v4/spreadsheets/1EMETsRhJM90NVP5z8x-gAgur4aJdphOU1fv5sbsBmmU/values/data?alt=json&key=AIzaSyBxJTCTK-IXZXghUiRtAuVmpe2pgtpLNsk";
43    
44    // $.getJSON(dataUrl, {
45    //   format: "json"
46    // })
47    $.getJSON(dataUrl)
48      .done(function(data) {
49        var data = data.values;
50        var avgRating = 0;
51        $('#reviews-count').html(data.length);
52
53        for (var i = data.length - 1; i >= 1; i--) {
54          var review = '';
55          var twitterHandle = data[i][6];
56          var role = data[i][5];
57          var feedback = data[i][3];
58          var timestamp = data[i][0];
59          var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "
59November", "December"];
60          var date = new Date(timestamp);
61          var newDate = date.getDate() + ' ' + (monthNames[date.getMonth()]) + ' ' + date.getFullYear();
62          var rating = data[i][1];
63
64          review += '<img alt="' + rating + ' stars" src="/assets/img/' + rating + '.jpg" width="120">';
65          review += '<h4><span itemprop="author" itemscope itemtype="http://schema.org/Person"><span itemprop="name">' + data[i][4];
66          if (twitterHandle) {
67            review += ' <span class="twitter">(<a href="https://twitter.com/' + twitterHandle + '">' + twitterHandle + '</a>)</span></span></span></h4>';
68          } else {
69            review += '</span></span></h4>';
70          }
71          if (role !== null && role !== 'Other') {
72            review += '<em>' + role + '</em>';
73          }
74          review += '<p><span itemprop="reviewBody">' + feedback + '</span></p>';
75          review += '<small><span itemprop="reviewRating" itemscope itemtype="http://schema.org/Rating"><span itemprop="ratingValue">' + rating + '</span> / <span itemprop="bestRating">5</span></span>&thinsp;&mdash;&thinsp;<time datetime="' + timestamp + '">' + newDate + '</time></small><meta itemprop="datePublished" content="' + timestamp + '">';
76          avgRating += parseInt(rating);
77
78          $('.reviews').append('<section class="review floatCenter" itemscope itemtype="http://schema.org/Review"><span itemprop="itemReviewed" itemscope itemtype="http://schema.org/Product"><span itemprop="name" class="hide">Better Web Type</span></span>' + review + '</section>');
79          $('#avgRating').html(Number((avgRating / data.length).toFixed(1)));
80          $('#overall-rating').html('<img alt="' + Number((avgRating / data.length).toFixed(0)) + ' stars" src="/assets/img/' + Number((avgRating / data.length).toFixed(0)) + '.jpg" width="240" class="floatCenter">');
81        }
82      })
83      .fail(function (jqxhr, textStatus, error) {
84        var err = textStatus + ", " + error;
85        console.log("Request Failed: " + err);
86      });
87  }
88}); // End of reviews page stuff
89
90// If page is book page
91$(function(){
92  if($('body').is('.book-page')) {
93
94    // Animate example website image
95    animateOnScroll('.lesson-img', 'slide-in-fwd-bottom', 0.5);
96
97    // Animate author support
98    // animateOnScroll('.author-support', 'fadeIn', 0.5);
99
100    // Animate author support
101    animateOnScroll('.small-print', 'fadeIn', 2);
102
103    // Animate book features
104    animateChildrenOnScroll('.animate-features', 'fadeInUp', 0.3, 0.5);
105
106    // Create sliders
107    slider('#slider1', 300);
108    slider('#slider2', 800);
109
110    // Slider zoom functionality
111    // var wh = $(window).height();
112    // var ww = $(window).width();
113
114    // $('.slider-image').on('click', function () {
115    //   if (ww >= 768) {
116    //     $('#close').fadeIn();
117    //     $('#slider1').addClass('fullscreen');
118    //     // $('#slider.fullscreen ul').css('height', wh + 'px');
119    //   }
120    // });
121
122    // $('#close').on('click', function () {
123    //   $('#close').fadeOut();
124    //   $('#slider1').removeClass('fullscreen');
125    //   // $('#slider ul').css('height', 'auto');
126    // });
127
128    // Tawk.to
129
130    var Tawk_API = Tawk_API || {}, Tawk_LoadStart = new Date();
131    (function () {
132      var s1 = document.createElement("script"), s0 = document.getElementsByTagName("script")[0];
133      s1.async = true;
134      s1.src = 'https://embed.tawk.to/5d10dfdc36eab9721118f390/default';
135      s1.charset = 'UTF-8';
136      s1.setAttribute('crossorigin', '*');
137      s0.parentNode.insertBefore(s1, s0);
138    })();
139  }
140}); // End of book page stuff
141
142// If page has a form
143$(function(){
144  if($('body').is('.hasForm')){
145
146    var varEmail;
147// Get data from URL
148  // function getParameterByName(name, url) {
149  //   if (!url) url = window.location.href;
150  //   name = name.replace(/[\[\]]/g, '\\$&');
151  //   var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),
152  //   results = regex.exec(url);
153  //   if (!results) return null;
154  //   if (!results[2]) return '';
155  //   return decodeURIComponent(results[2].replace(/\+/g, ' '));
156  // }
157
158  // var varEmail = getParameterByName('email');
159  // var varName = getParameterByName('name');
160  // var varSurname = getParameterByName('surname');
161  // var varReferral = getParameterByName('r');
162
163  // Prefill form
164  // $('#FNAME').val(varName);
165  // $('#LNAME').val(varSurname);
166  // $('#EMAIL').val(varEmail);
167  // $('#REFERRAL').val(varReferral);
168
169  // If referral URL, change source to 'REFERRAL'
170  // var refInput = $('#REFERRAL').val().length;
171
172  // if (refInput > 0){
173  //   $('#JOINED').val('Referral');
174  //   var refURL = '/sign-up?r=' + varReferral;
175  //   $('#mobile-signup').attr('href', refURL);
176  // }
177
178  // Determine the signup endpoint
179  var signupURL = 'https://endpoint.betterwebtype.com/mc-end-point.php';
180
181  // if (refInput > 0){
182  //   signupURL = 'https://endpoint.betterwebtype.com/mc-end-point-referral.php';
183  // } else {
184  //   signupURL = 'https://endpoint.betterwebtype.com/mc-end-point.php';
185  // }
186
187
188  // Button spinner behavior
189  var myButton = document.getElementById('myButton');
190
191  myButton.addEventListener('click', function() {
192    if ($('#FNAME').val().length === 0 || $('#LNAME').val().length === 0 || $('#EMAIL').val().length === 0) {
193      $('#myButton').addClass('loading');
194      setTimeout( function(){ $('#myButton').removeClass('loading'); }, 500);
195    } else {
196      $('#myButton').addClass('loading');
197    }
198  }, false);
199
200
201
202  // (function(window, document) {
203  //   'use strict';
204
205  //   // On form submit
206  //   $('form.sign-up').on('submit', function(e) {
207
208  //     e.preventDefault();
209
210  //     // Check honeypot
211  //     var check = $('#CHECK').val();
212
213  //     if ( check.length > 0 ) {
214  //       return;
215  //     }
216
217  //     // store all the form data in a variable
218  //     var formData = $(this).serialize();
219  //     console.log(formData);
220
221  //     // var $this = $(this);
222  //     $.ajax({
223  //       url: '//course.uxbuddy.co/endpoints/bwt/',
224  //       data: formData,
225  //       dataType: 'json',
226
227  //       error: function (err) {
228  //         $('#msgContent').html('<h3>Oops!</h3><p>Something went wrong, please try again later. If the problem persists, try <a href="http://eepurl.com/ba-WxL">signing up here</a>.</p>');
229  //         $('#msg').fadeIn(300);
230  //         if ($('body').hasClass('triangle')) {
231  //           setTimeout(function () {
232  //             $('.score').animate({
233  //               scrollTop: $('#msgContent').offset().top
234  //             }, 500);
235  //           }, 400);
236  //         } else {
237  //           setTimeout(function () {
238  //             $('html, body').animate({
239  //               scrollTop: $('#msgContent').offset().top
240  //             }, 500);
241  //           }, 400);
242  //         }
243  //       },
244  //       success: function (data) {
245  //         if (data.status === "subscribed") {
246  //           // SUCCESS
247  //           console.log(data);
248  //           window.location.href = "/thank-you/";
249  //         } else {
250  //           // ERROR
251  //           console.log(data);
252  //           $('#msgContent').html('<h3>Oops!</h3><p>Something went wrong, please try again later. If the problem persists, try <a href="http://eepurl.com/ba-WxL">signing up here</a>.</p>');
253  //           setTimeout(function () { $('#myButton').removeClass('loading'); }, 500);
254  //           $('#msg').fadeIn(300);
255  //           if ($('body').hasClass('triangle')) {
256  //             setTimeout(function () {
257  //               $('.score').animate({
258  //                 scrollTop: $('#msgContent').offset().top
259  //               }, 500);
260  //             }, 400);
261  //           } else {
262  //             setTimeout(function () {
263  //               $('html, body').animate({
264  //                 scrollTop: $('#msgContent').offset().top
265  //               }, 500);
266  //             }, 400);
267  //           }
268  //         }
269  //       }
270  //     });
271  //     return false;
272  //   });
273
274  // }(window, document));
275  } // End of if statement
276}); // End of form stuff
277
278// Scroll to anchor
279$(function() {
280  $('a[href*=#]:not([href=#])').click(function() {
281    if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
282      var target = $(this.hash);
283      target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
284      if (target.length) {
285        $('html,body').animate({
286          scrollTop: target.offset().top
287        }, 800);
288        return false;
289      }
290    }
291  });
292});
293
294// Animate children on scroll
295function animateChildrenOnScroll(parent, animation, delay, triggerDelay, trigger) {
296  if (triggerDelay == null) {
297    triggerDelay = 0
298  }
299  if (trigger == null) {
300    trigger = parent;
301  }
302  if (delay == null) {
vendor: 22,604 bytes, lines 303-379
303    delay = 0;
304  }
305  var triggerPoint;
306  var scrollPosition;
307  var children = $(parent).children();
308
309  $(window).on('load', function () {
310    triggerPoint = $(trigger).offset().top;
311  });
312
313  $(window).on('scroll', function () {
314    scrollPosition = window.pageYOffset + window.innerHeight;
315
316    if (scrollPosition > triggerPoint) {
317      for (i = 0; i < children.length; i++) {
318        var calculateDelay = triggerDelay + (i * delay) + 's';
319
320        $(children[i]).css("animation-delay", calculateDelay).removeClass('o-0').addClass(animation);
321      }
322    }
323  });
324}
325
326function animateChildren(parent, animation, delay) {
327  var children = $(parent).children();
328
329  for (i = 0; i < children.length; i++) {
330    var calculateDelay = (i * delay) + 's';
331
332    $(children[i]).css("animation-delay", calculateDelay).addClass(animation);
333  }
334}
335
336function animateOnScroll(element, animation, triggerDelay, trigger) {
337  if (trigger == null) {
338    trigger = element;
339  }
340
341  // var triggerPoint = 0;
342  var triggerPoint;
343  var scrollPosition;
344
345  $(window).on('load', function () {
346    triggerPoint = $(trigger).offset().top;
347  });
348
349  $(window).on('scroll', function () {
350    scrollPosition = window.pageYOffset + window.innerHeight;
351    // console.log(scrollPosition);
352    var calculateDelay = triggerDelay + 's';
353
354    if (scrollPosition > triggerPoint) {
355      $(element).css("animation-delay", calculateDelay).removeClass('o-0').addClass(animation);
356    }
357  });
358}
359
360// HOTJAR
361// (function(h,o,t,j,a,r){
362//       h.hj=h.hj||function(){(h.hj.q=h.hj.q||[]).push(arguments)};
363//       h._hjSettings={hjid:92378,hjsv:5};
364//       a=o.getElementsByTagName('head')[0];
365//       r=o.createElement('script');r.async=1;
366//       r.src=t+h._hjSettings.hjid+j+h._hjSettings.hjsv;
367//       a.appendChild(r);
368//     })(window,document,'//static.hotjar.com/c/hotjar-','.js?sv=');
369
370
371/*! Hammer.JS - v2.0.8 - 2016-04-23
372 * http://hammerjs.github.io/
373 *
374 * Copyright (c) 2016 Jorik Tangelder;
375 * Licensed under the MIT license */
376if ($('.content-slider').length > 0) {
377  // it exists
378
379  !function (a, b, c, d) { "use strict"; function e(a, b, c) { return setTimeout(j(a, c), b) } function f(a, b, c) { return Array.isArray(a) ? (g(a, c[b], c), !0) : !1 } function g(a, b, c) { var e; if (a) if (a.forEach) a.forEach(b, c); else if (a.length !== d) for (e = 0; e < a.length;)b.call(c, a[e], e, a), e++; else for (e in a) a.hasOwnProperty(e) && b.call(c, a[e], e, a) } function h(b, c, d) { var e = "DEPRECATED METHOD: " + c + "\n" + d + " AT \n"; return function () { var c = new Error("get-stack-trace"), d = c && c.stack ? c.stack.replace(/^[^\(]+?[\n$]/gm, "").replace(/^\s+at\s+/gm, "").replace(/^Object.<anonymous>\s*\(/gm, "{anonymous}()@") : "Unknown Stack Trace", f = a.console && (a.console.warn || a.console.log); return f && f.call(a.console, e, d), b.apply(this, arguments) } } function i(a, b, c) { var d, e = b.prototype; d = a.prototype = Object.create(e), d.constructor = a, d._super = e, c && la(d, c) } function j(a, b) { return function () { return a.apply(b, arguments) } } function k(a, b) { return typeof a == oa ? a.apply(b ? b[0] || d : d, b) : a } function l(a, b) { return a === d ? b : a } function m(a, b, c) { g(q(b), function (b) { a.addEventListener(b, c, !1) }) } function n(a, b, c) { g(q(b), function (b) { a.removeEventListener(b, c, !1) }) } function o(a, b) { for (; a;) { if (a == b) return !0; a = a.parentNode } return !1 } function p(a, b) { return a.indexOf(b) > -1 } function q(a) { return a.trim().split(/\s+/g) } function r(a, b, c) { if (a.indexOf && !c) return a.indexOf(b); for (var d = 0; d < a.length;) { if (c && a[d][c] == b || !c && a[d] === b) return d; d++ } return -1 } function s(a) { return Array.prototype.slice.call(a, 0) } function t(a, b, c) { for (var d = [], e = [], f = 0; f < a.length;) { var g = b ? a[f][b] : a[f]; r(e, g) < 0 && d.push(a[f]), e[f] = g, f++ } return c && (d = b ? d.sort(function (a, c) { return a[b] > c[b] }) : d.sort()), d } function u(a, b) { for (var c, e, f = b[0].toUpperCase() + b.slice(1), g = 0; g < ma.length;) { if (c = ma[g], e = c ? c + f : b, e in a) return e; g++ } return d } function v() { return ua++ } function w(b) { var c = b.ownerDocument || b; return c.defaultView || c.parentWindow || a } function x(a, b) { var c = this; this.manager = a, this.callback = b, this.element = a.element, this.target = a.options.inputTarget, this.domHandler = function (b) { k(a.options.enable, [a]) && c.handler(b) }, this.init() } function y(a) { var b, c = a.options.inputClass; return new (b = c ? c : xa ? M : ya ? P : wa ? R : L)(a, z) } function z(a, b, c) { var d = c.pointers.length, e = c.changedPointers.length, f = b & Ea && d - e === 0, g = b & (Ga | Ha) && d - e === 0; c.isFirst = !!f, c.isFinal = !!g, f && (a.session = {}), c.eventType = b, A(a, c), a.emit("hammer.input", c), a.recognize(c), a.session.prevInput = c } function A(a, b) { var c = a.session, d = b.pointers, e = d.length; c.firstInput || (c.firstInput = D(b)), e > 1 && !c.firstMultiple ? c.firstMultiple = D(b) : 1 === e && (c.firstMultiple = !1); var f = c.firstInput, g = c.firstMultiple, h = g ? g.center : f.center, i = b.center = E(d); b.timeStamp = ra(), b.deltaTime = b.timeStamp - f.timeStamp, b.angle = I(h, i), b.distance = H(h, i), B(c, b), b.offsetDirection = G(b.deltaX, b.deltaY); var j = F(b.deltaTime, b.deltaX, b.deltaY); b.overallVelocityX = j.x, b.overallVelocityY = j.y, b.overallVelocity = qa(j.x) > qa(j.y) ? j.x : j.y, b.scale = g ? K(g.pointers, d) : 1, b.rotation = g ? J(g.pointers, d) : 0, b.maxPointers = c.prevInput ? b.pointers.length > c.prevInput.maxPointers ? b.pointers.length : c.prevInput.maxPointers : b.pointers.length, C(c, b); var k = a.element; o(b.srcEvent.target, k) && (k = b.srcEvent.target), b.target = k } function B(a, b) { var c = b.center, d = a.offsetDelta || {}, e = a.prevDelta || {}, f = a.prevInput || {}; b.eventType !== Ea && f.eventType !== Ga || (e = a.prevDelta = { x: f.deltaX || 0, y: f.deltaY || 0 }, d = a.offsetDelta = { x: c.x, y: c.y }), b.deltaX = e.x + (c.x - d.x), b.deltaY = e.y + (c.y - d.y) } function C(a, b) { var c, e, f, g, h = a.lastInterval || b, i = b.timeStamp - h.timeStamp; if (b.eventType != Ha && (i > Da || h.velocity === d)) { var j = b.deltaX - h.deltaX, k = b.deltaY - h.deltaY, l = F(i, j, k); e = l.x, f = l.y, c = qa(l.x) > qa(l.y) ? l.x : l.y, g = G(j, k), a.lastInterval = b } else c = h.velocity, e = h.velocityX, f = h.velocityY, g = h.direction; b.velocity = c, b.velocityX = e, b.velocityY = f, b.direction = g } function D(a) { for (var b = [], c = 0; c < a.pointers.length;)b[c] = { clientX: pa(a.pointers[c].clientX), clientY: pa(a.pointers[c].clientY) }, c++; return { timeStamp: ra(), pointers: b, center: E(b), deltaX: a.deltaX, deltaY: a.deltaY } } function E(a) { var b = a.length; if (1 === b) return { x: pa(a[0].clientX), y: pa(a[0].clientY) }; for (var c = 0, d = 0, e = 0; b > e;)c += a[e].clientX, d += a[e].clientY, e++; return { x: pa(c / b), y: pa(d / b) } } function F(a, b, c) { return { x: b / a || 0, y: c / a || 0 } } function G(a, b) { return a === b ? Ia : qa(a) >= qa(b) ? 0 > a ? Ja : Ka : 0 > b ? La : Ma } function H(a, b, c) { c || (c = Qa); var d = b[c[0]] - a[c[0]], e = b[c[1]] - a[c[1]]; return Math.sqrt(d * d + e * e) } function I(a, b, c) { c || (c = Qa); var d = b[c[0]] - a[c[0]], e = b[c[1]] - a[c[1]]; return 180 * Math.atan2(e, d) / Math.PI } function J(a, b) { return I(b[1], b[0], Ra) + I(a[1], a[0], Ra) } function K(a, b) { return H(b[0], b[1], Ra) / H(a[0], a[1], Ra) } function L() { this.evEl = Ta, this.evWin = Ua, this.pressed = !1, x.apply(this, arguments) } function M() { this.evEl = Xa, this.evWin = Ya, x.apply(this, arguments), this.store = this.manager.session.pointerEvents = [] } function N() { this.evTarget = $a, this.evWin = _a, this.started = !1, x.apply(this, arguments) } function O(a, b) { var c = s(a.touches), d = s(a.changedTouches); return b & (Ga | Ha) && (c = t(c.concat(d), "identifier", !0)), [c, d] } function P() { this.evTarget = bb, this.targetIds = {}, x.apply(this, arguments) } function Q(a, b) { var c = s(a.touches), d = this.targetIds; if (b & (Ea | Fa) && 1 === c.length) return d[c[0].identifier] = !0, [c, c]; var e, f, g = s(a.changedTouches), h = [], i = this.target; if (f = c.filter(function (a) { return o(a.target, i) }), b === Ea) for (e = 0; e < f.length;)d[f[e].identifier] = !0, e++; for (e = 0; e < g.length;)d[g[e].identifier] && h.push(g[e]), b & (Ga | Ha) && delete d[g[e].identifier], e++; return h.length ? [t(f.concat(h), "identifier", !0), h] : void 0 } function R() { x.apply(this, arguments); var a = j(this.handler, this); this.touch = new P(this.manager, a), this.mouse = new L(this.manager, a), this.primaryTouch = null, this.lastTouches = [] } function S(a, b) { a & Ea ? (this.primaryTouch = b.changedPointers[0].identifier, T.call(this, b)) : a & (Ga | Ha) && T.call(this, b) } function T(a) { var b = a.changedPointers[0]; if (b.identifier === this.primaryTouch) { var c = { x: b.clientX, y: b.clientY }; this.lastTouches.push(c); var d = this.lastTouches, e = function () { var a = d.indexOf(c); a > -1 && d.splice(a, 1) }; setTimeout(e, cb) } } function U(a) { for (var b = a.srcEvent.clientX, c = a.srcEvent.clientY, d = 0; d < this.lastTouches.length; d++) { var e = this.lastTouches[d], f = Math.abs(b - e.x), g = Math.abs(c - e.y); if (db >= f && db >= g) return !0 } return !1 } function V(a, b) { this.manager = a, this.set(b) } function W(a) { if (p(a, jb)) return jb; var b = p(a, kb), c = p(a, lb); return b && c ? jb : b || c ? b ? kb : lb : p(a, ib) ? ib : hb } function X() { if (!fb) return !1; var b = {}, c = a.CSS && a.CSS.supports; return ["auto", "manipulation", "pan-y", "pan-x", "pan-x pan-y", "none"].forEach(function (d) { b[d] = c ? a.CSS.supports("touch-action", d) : !0 }), b } function Y(a) { this.options = la({}, this.defaults, a || {}), this.id = v(), this.manager = null, this.options.enable = l(this.options.enable, !0), this.state = nb, this.simultaneous = {}, this.requireFail = [] } function Z(a) { return a & sb ? "cancel" : a & qb ? "end" : a & pb ? "move" : a & ob ? "start" : "" } function $(a) { return a == Ma ? "down" : a == La ? "up" : a == Ja ? "left" : a == Ka ? "right" : "" } function _(a, b) { var c = b.manager; return c ? c.get(a) : a } function aa() { Y.apply(this, arguments) } function ba() { aa.apply(this, arguments), this.pX = null, this.pY = null } function ca() { aa.apply(this, arguments) } function da() { Y.apply(this, arguments), this._timer = null, this._input = null } function ea() { aa.apply(this, arguments) } function fa() { aa.apply(this, arguments) } function ga() { Y.apply(this, arguments), this.pTime = !1, this.pCenter = !1, this._timer = null, this._input = null, this.count = 0 } function ha(a, b) { return b = b || {}, b.recognizers = l(b.recognizers, ha.defaults.preset), new ia(a, b) } function ia(a, b) { this.options = la({}, ha.defaults, b || {}), this.options.inputTarget = this.options.inputTarget || a, this.handlers = {}, this.session = {}, this.recognizers = [], this.oldCssProps = {}, this.element = a, this.input = y(this), this.touchAction = new V(this, this.options.touchAction), ja(this, !0), g(this.options.recognizers, function (a) { var b = this.add(new a[0](a[1])); a[2] && b.recognizeWith(a[2]), a[3] && b.requireFailure(a[3]) }, this) } function ja(a, b) { var c = a.element; if (c.style) { var d; g(a.options.cssProps, function (e, f) { d = u(c.style, f), b ? (a.oldCssProps[d] = c.style[d], c.style[d] = e) : c.style[d] = a.oldCssProps[d] || "" }), b || (a.oldCssProps = {}) } } function ka(a, c) { var d = b.createEvent("Event"); d.initEvent(a, !0, !0), d.gesture = c, c.target.dispatchEvent(d) } var la, ma = ["", "webkit", "Moz", "MS", "ms", "o"], na = b.createElement("div"), oa = "function", pa = Math.round, qa = Math.abs, ra = Date.now; la = "function" != typeof Object.assign ? function (a) { if (a === d || null === a) throw new TypeError("Cannot convert undefined or null to object"); for (var b = Object(a), c = 1; c < arguments.length; c++) { var e = arguments[c]; if (e !== d && null !== e) for (var f in e) e.hasOwnProperty(f) && (b[f] = e[f]) } return b } : Object.assign; var sa = h(function (a, b, c) { for (var e = Object.keys(b), f = 0; f < e.length;)(!c || c && a[e[f]] === d) && (a[e[f]] = b[e[f]]), f++; return a }, "extend", "Use `assign`."), ta = h(function (a, b) { return sa(a, b, !0) }, "merge", "Use `assign`."), ua = 1, va = /mobile|tablet|ip(ad|hone|od)|android/i, wa = "ontouchstart" in a, xa = u(a, "PointerEvent") !== d, ya = wa && va.test(navigator.userAgent), za = "touch", Aa = "pen", Ba = "mouse", Ca = "kinect", Da = 25, Ea = 1, Fa = 2, Ga = 4, Ha = 8, Ia = 1, Ja = 2, Ka = 4, La = 8, Ma = 16, Na = Ja | Ka, Oa = La | Ma, Pa = Na | Oa, Qa = ["x", "y"], Ra = ["clientX", "clientY"]; x.prototype = { handler: function () { }, init: function () { this.evEl && m(this.element, this.evEl, this.domHandler), this.evTarget && m(this.target, this.evTarget, this.domHandler), this.evWin && m(w(this.element), this.evWin, this.domHandler) }, destroy: function () { this.evEl && n(this.element, this.evEl, this.domHandler), this.evTarget && n(this.target, this.evTarget, this.domHandler), this.evWin && n(w(this.element), this.evWin, this.domHandler) } }; var Sa = { mousedown: Ea, mousemove: Fa, mouseup: Ga }, Ta = "mousedown", Ua = "mousemove mouseup"; i(L, x, { handler: function (a) { var b = Sa[a.type]; b & Ea && 0 === a.button && (this.pressed = !0), b & Fa && 1 !== a.which && (b = Ga), this.pressed && (b & Ga && (this.pressed = !1), this.callback(this.manager, b, { pointers: [a], changedPointers: [a], pointerType: Ba, srcEvent: a })) } }); var Va = { pointerdown: Ea, pointermove: Fa, pointerup: Ga, pointercancel: Ha, pointerout: Ha }, Wa = { 2: za, 3: Aa, 4: Ba, 5: Ca }, Xa = "pointerdown", Ya = "pointermove pointerup pointercancel"; a.MSPointerEvent && !a.PointerEvent && (Xa = "MSPointerDown", Ya = "MSPointerMove MSPointerUp MSPointerCancel"), i(M, x, { handler: function (a) { var b = this.store, c = !1, d = a.type.toLowerCase().replace("ms", ""), e = Va[d], f = Wa[a.pointerType] || a.pointerType, g = f == za, h = r(b, a.pointerId, "pointerId"); e & Ea && (0 === a.button || g) ? 0 > h && (b.push(a), h = b.length - 1) : e & (Ga | Ha) && (c = !0), 0 > h || (b[h] = a, this.callback(this.manager, e, { pointers: b, changedPointers: [a], pointerType: f, srcEvent: a }), c && b.splice(h, 1)) } }); var Za = { touchstart: Ea, touchmove: Fa, touchend: Ga, touchcancel: Ha }, $a = "touchstart", _a = "touchstart touchmove touchend touchcancel"; i(N, x, { handler: function (a) { var b = Za[a.type]; if (b === Ea && (this.started = !0), this.started) { var c = O.call(this, a, b); b & (Ga | Ha) && c[0].length - c[1].length === 0 && (this.started = !1), this.callback(this.manager, b, { pointers: c[0], changedPointers: c[1], pointerType: za, srcEvent: a }) } } }); var ab = { touchstart: Ea, touchmove: Fa, touchend: Ga, touchcancel: Ha }, bb = "touchstart touchmove touchend touchcancel"; i(P, x, { handler: function (a) { var b = ab[a.type], c = Q.call(this, a, b); c && this.callback(this.manager, b, { pointers: c[0], changedPointers: c[1], pointerType: za, srcEvent: a }) } }); var cb = 2500, db = 25; i(R, x, { handler: function (a, b, c) { var d = c.pointerType == za, e = c.pointerType == Ba; if (!(e && c.sourceCapabilities && c.sourceCapabilities.firesTouchEvents)) { if (d) S.call(this, b, c); else if (e && U.call(this, c)) return; this.callback(a, b, c) } }, destroy: function () { this.touch.destroy(), this.mouse.destroy() } }); var eb = u(na.style, "touchAction"), fb = eb !== d, gb = "compute", hb = "auto", ib = "manipulation", jb = "none", kb = "pan-x", lb = "pan-y", mb = X(); V.prototype = { set: function (a) { a == gb && (a = this.compute()), fb && this.manager.element.style && mb[a] && (this.manager.element.style[eb] = a), this.actions = a.toLowerCase().trim() }, update: function () { this.set(this.manager.options.touchAction) }, compute: function () { var a = []; return g(this.manager.recognizers, function (b) { k(b.options.enable, [b]) && (a = a.concat(b.getTouchAction())) }), W(a.join(" ")) }, preventDefaults: function (a) { var b = a.srcEvent, c = a.offsetDirection; if (this.manager.session.prevented) return void b.preventDefault(); var d = this.actions, e = p(d, jb) && !mb[jb], f = p(d, lb) && !mb[lb], g = p(d, kb) && !mb[kb]; if (e) { var h = 1 === a.pointers.length, i = a.distance < 2, j = a.deltaTime < 250; if (h && i && j) return } return g && f ? void 0 : e || f && c & Na || g && c & Oa ? this.preventSrc(b) : void 0 }, preventSrc: function (a) { this.manager.session.prevented = !0, a.preventDefault() } }; var nb = 1, ob = 2, pb = 4, qb = 8, rb = qb, sb = 16, tb = 32; Y.prototype = { defaults: {}, set: function (a) { return la(this.options, a), this.manager && this.manager.touchAction.update(), this }, recognizeWith: function (a) { if (f(a, "recognizeWith", this)) return this; var b = this.simultaneous; return a = _(a, this), b[a.id] || (b[a.id] = a, a.recognizeWith(this)), this }, dropRecognizeWith: function (a) { return f(a, "dropRecognizeWith", this) ? this : (a = _(a, this), delete this.simultaneous[a.id], this) }, requireFailure: function (a) { if (f(a, "requireFailure", this)) return this; var b = this.requireFail; return a = _(a, this), -1 === r(b, a) && (b.push(a), a.requireFailure(this)), this }, dropRequireFailure: function (a) { if (f(a, "dropRequireFailure", this)) return this; a = _(a, this); var b = r(this.requireFail, a); return b > -1 && this.requireFail.splice(b, 1), this }, hasRequireFailures: function () { return this.requireFail.length > 0 }, canRecognizeWith: function (a) { return !!this.simultaneous[a.id] }, emit: function (a) { function b(b) { c.manager.emit(b, a) } var c = this, d = this.state; qb > d && b(c.options.event + Z(d)), b(c.options.event), a.additionalEvent && b(a.additionalEvent), d >= qb && b(c.options.event + Z(d)) }, tryEmit: function (a) { return this.canEmit() ? this.emit(a) : void (this.state = tb) }, canEmit: function () { for (var a = 0; a < this.requireFail.length;) { if (!(this.requireFail[a].state & (tb | nb))) return !1; a++ } return !0 }, recognize: function (a) { var b = la({}, a); return k(this.options.enable, [this, b]) ? (this.state & (rb | sb | tb) && (this.state = nb), this.state = this.process(b), void (this.state & (ob | pb | qb | sb) && this.tryEmit(b))) : (this.reset(), void (this.state = tb)) }, process: function (a) { }, getTouchAction: function () { }, reset: function () { } }, i(aa, Y, { defaults: { pointers: 1 }, attrTest: function (a) { var b = this.options.pointers; return 0 === b || a.pointers.length === b }, process: function (a) { var b = this.state, c = a.eventType, d = b & (ob | pb), e = this.attrTest(a); return d && (c & Ha || !e) ? b | sb : d || e ? c & Ga ? b | qb : b & ob ? b | pb : ob : tb } }), i(ba, aa, { defaults: { event: "pan", threshold: 10, pointers: 1, direction: Pa }, getTouchAction: function () { var a = this.options.direction, b = []; return a & Na && b.push(lb), a & Oa && b.push(kb), b }, directionTest: function (a) { var b = this.options, c = !0, d = a.distance, e = a.direction, f = a.deltaX, g = a.deltaY; return e & b.direction || (b.direction & Na ? (e = 0 === f ? Ia : 0 > f ? Ja : Ka, c = f != this.pX, d = Math.abs(a.deltaX)) : (e = 0 === g ? Ia : 0 > g ? La : Ma, c = g != this.pY, d = Math.abs(a.deltaY))), a.direction = e, c && d > b.threshold && e & b.direction }, attrTest: function (a) { return aa.prototype.attrTest.call(this, a) && (this.state & ob || !(this.state & ob) && this.directionTest(a)) }, emit: function (a) { this.pX = a.deltaX, this.pY = a.deltaY; var b = $(a.direction); b && (a.additionalEvent = this.options.event + b), this._super.emit.call(this, a) } }), i(ca, aa, { defaults: { event: "pinch", threshold: 0, pointers: 2 }, getTouchAction: function () { return [jb] }, attrTest: function (a) { return this._super.attrTest.call(this, a) && (Math.abs(a.scale - 1) > this.options.threshold || this.state & ob) }, emit: function (a) { if (1 !== a.scale) { var b = a.scale < 1 ? "in" : "out"; a.additionalEvent = this.options.event + b } this._super.emit.call(this, a) } }), i(da, Y, { defaults: { event: "press", pointers: 1, time: 251, threshold: 9 }, getTouchAction: function () { return [hb] }, process: function (a) { var b = this.options, c = a.pointers.length === b.pointers, d = a.distance < b.threshold, f = a.deltaTime > b.time; if (this._input = a, !d || !c || a.eventType & (Ga | Ha) && !f) this.reset(); else if (a.eventType & Ea) this.reset(), this._timer = e(function () { this.state = rb, this.tryEmit() }, b.time, this); else if (a.eventType & Ga) return rb; return tb }, reset: function () { clearTimeout(this._timer) }, emit: function (a) { this.state === rb && (a && a.eventType & Ga ? this.manager.emit(this.options.event + "up", a) : (this._input.timeStamp = ra(), this.manager.emit(this.options.event, this._input))) } }), i(ea, aa, { defaults: { event: "rotate", threshold: 0, pointers: 2 }, getTouchAction: function () { return [jb] }, attrTest: function (a) { return this._super.attrTest.call(this, a) && (Math.abs(a.rotation) > this.options.threshold || this.state & ob) } }), i(fa, aa, { defaults: { event: "swipe", threshold: 10, velocity: .3, direction: Na | Oa, pointers: 1 }, getTouchAction: function () { return ba.prototype.getTouchAction.call(this) }, attrTest: function (a) { var b, c = this.options.direction; return c & (Na | Oa) ? b = a.overallVelocity : c & Na ? b = a.overallVelocityX : c & Oa && (b = a.overallVelocityY), this._super.attrTest.call(this, a) && c & a.offsetDirection && a.distance > this.options.threshold && a.maxPointers == this.options.pointers && qa(b) > this.options.velocity && a.eventType & Ga }, emit: function (a) { var b = $(a.offsetDirection); b && this.manager.emit(this.options.event + b, a), this.manager.emit(this.options.event, a) } }), i(ga, Y, { defaults: { event: "tap", pointers: 1, taps: 1, interval: 300, time: 250, threshold: 9, posThreshold: 10 }, getTouchAction: function () { return [ib] }, process: function (a) { var b = this.options, c = a.pointers.length === b.pointers, d = a.distance < b.threshold, f = a.deltaTime < b.time; if (this.reset(), a.eventType & Ea && 0 === this.count) return this.failTimeout(); if (d && f && c) { if (a.eventType != Ga) return this.failTimeout(); var g = this.pTime ? a.timeStamp - this.pTime < b.interval : !0, h = !this.pCenter || H(this.pCenter, a.center) < b.posThreshold;
379 this.pTime = a.timeStamp, this.pCenter = a.center, h && g ? this.count += 1 : this.count = 1, this._input = a; var i = this.count % b.taps; if (0 === i) return this.hasRequireFailures() ? (this._timer = e(function () { this.state = rb, this.tryEmit() }, b.interval, this), ob) : rb } return tb }, failTimeout: function () { return this._timer = e(function () { this.state = tb }, this.options.interval, this), tb }, reset: function () { clearTimeout(this._timer) }, emit: function () { this.state == rb && (this._input.tapCount = this.count, this.manager.emit(this.options.event, this._input)) } }), ha.VERSION = "2.0.8", ha.defaults = { domEvents: !1, touchAction: gb, enable: !0, inputTarget: null, inputClass: null, preset: [[ea, { enable: !1 }], [ca, { enable: !1 }, ["rotate"]], [fa, { direction: Na }], [ba, { direction: Na }, ["swipe"]], [ga], [ga, { event: "doubletap", taps: 2 }, ["tap"]], [da]], cssProps: { userSelect: "none", touchSelect: "none", touchCallout: "none", contentZooming: "none", userDrag: "none", tapHighlightColor: "rgba(0,0,0,0)" } }; var ub = 1, vb = 2; ia.prototype = { set: function (a) { return la(this.options, a), a.touchAction && this.touchAction.update(), a.inputTarget && (this.input.destroy(), this.input.target = a.inputTarget, this.input.init()), this }, stop: function (a) { this.session.stopped = a ? vb : ub }, recognize: function (a) { var b = this.session; if (!b.stopped) { this.touchAction.preventDefaults(a); var c, d = this.recognizers, e = b.curRecognizer; (!e || e && e.state & rb) && (e = b.curRecognizer = null); for (var f = 0; f < d.length;)c = d[f], b.stopped === vb || e && c != e && !c.canRecognizeWith(e) ? c.reset() : c.recognize(a), !e && c.state & (ob | pb | qb) && (e = b.curRecognizer = c), f++ } }, get: function (a) { if (a instanceof Y) return a; for (var b = this.recognizers, c = 0; c < b.length; c++)if (b[c].options.event == a) return b[c]; return null }, add: function (a) { if (f(a, "add", this)) return this; var b = this.get(a.options.event); return b && this.remove(b), this.recognizers.push(a), a.manager = this, this.touchAction.update(), a }, remove: function (a) { if (f(a, "remove", this)) return this; if (a = this.get(a)) { var b = this.recognizers, c = r(b, a); -1 !== c && (b.splice(c, 1), this.touchAction.update()) } return this }, on: function (a, b) { if (a !== d && b !== d) { var c = this.handlers; return g(q(a), function (a) { c[a] = c[a] || [], c[a].push(b) }), this } }, off: function (a, b) { if (a !== d) { var c = this.handlers; return g(q(a), function (a) { b ? c[a] && c[a].splice(r(c[a], b), 1) : delete c[a] }), this } }, emit: function (a, b) { this.options.domEvents && ka(a, b); var c = this.handlers[a] && this.handlers[a].slice(); if (c && c.length) { b.type = a, b.preventDefault = function () { b.srcEvent.preventDefault() }; for (var d = 0; d < c.length;)c[d](b), d++ } }, destroy: function () { this.element && ja(this, !1), this.handlers = {}, this.session = {}, this.input.destroy(), this.element = null } }, la(ha, { INPUT_START: Ea, INPUT_MOVE: Fa, INPUT_END: Ga, INPUT_CANCEL: Ha, STATE_POSSIBLE: nb, STATE_BEGAN: ob, STATE_CHANGED: pb, STATE_ENDED: qb, STATE_RECOGNIZED: rb, STATE_CANCELLED: sb, STATE_FAILED: tb, DIRECTION_NONE: Ia, DIRECTION_LEFT: Ja, DIRECTION_RIGHT: Ka, DIRECTION_UP: La, DIRECTION_DOWN: Ma, DIRECTION_HORIZONTAL: Na, DIRECTION_VERTICAL: Oa, DIRECTION_ALL: Pa, Manager: ia, Input: x, TouchAction: V, TouchInput: P, MouseInput: L, PointerEventInput: M, TouchMouseInput: R, SingleTouchInput: N, Recognizer: Y, AttrRecognizer: aa, Tap: ga, Pan: ba, Swipe: fa, Pinch: ca, Rotate: ea, Press: da, on: m, off: n, each: g, merge: ta, extend: sa, assign: la, inherit: i, bindFn: j, prefixed: u }); var wb = "undefined" != typeof a ? a : "undefined" != typeof self ? self : {}; wb.Hammer = ha, "function" == typeof define && define.amd ? define(function () { return ha }) : "undefined" != typeof module && module.exports ? module.exports = ha : a[c] = ha }(window, document, "Hammer");
380}
381//# sourceMappingURL=hammer.min.js.map
382
383// SLIDER
384
385function nextSlide(element, direction, sliderLength, animationSpeed) {
386  var nextSlide;
387  resetCurrentSlide(element);
388
389  if (direction == 'next') {
390    if (currentSlide + 1 == sliderLength) {
391      nextSlide = 0;
392      goToSlide(element, animationSpeed, nextSlide);
393    } else {
394      nextSlide = currentSlide + 1;
395      goToSlide(element, animationSpeed, nextSlide);
396    }
397  } else if (direction == 'previous') {
398    if (currentSlide == 0) {
399      nextSlide = sliderLength - 1;
400      goToSlide(element, animationSpeed, nextSlide);
401    } else {
402      nextSlide = currentSlide - 1;
403      goToSlide(element, animationSpeed, nextSlide);
404    }
405  }
406};
407
408function goToSlide(element, animationSpeed, id) {
409  if (id == null) {
410    var id = event.srcElement.id;
411  }
412  var targetSlide = $(element + ' .slides').children();
413
414  // Fade out children of current slide first
415  animateChildren(element + ' .slides .active .slide-content', 'fadeOut', 0.3);
416
417  // Update pager immediately
418  $(element + ' .pager .active').removeClass();
419  $(element + ' #' + id).addClass('active');
420
421  // Wait [animation time] to remove the fadeOut classes
422  setTimeout(function () {
423    $(element + ' .slides .active .slide-content div').removeClass('fadeOut');
424  }, animationSpeed)
425
426  // Wait [animation time + 1ms] to add fadeIn classes
427  setTimeout(function () {
428    $(element + ' .slides .active').removeClass();
429    // $(element + ' .slides .active .slide-content div').removeClass('fadeOut');
430
431    $(targetSlide[id]).addClass('active');
432    animateChildren(element + ' .slides .active .slide-content', 'fadeIn', 0.3);
433  }, animationSpeed + 1);
434
435  resetCurrentSlide(element);
436};
437
438function resetCurrentSlide(element) {
439  currentSlide = parseInt($(element + ' .pager li.active').attr("id"));
440};
441
442function constructSliderNav(element, sliderLength) {
443
444  $(element).append('<ul class="pager"></ul>');
445  for (i = 0; i < sliderLength; i++) {
446    if (i == 0) {
447      $(element + ' ul.pager').append('<li id="' + i + '" class="active">' + i + '</li>');
448      resetCurrentSlide(element);
449    } else {
450      $(element + ' ul.pager').append('<li id="' + i + '">' + i + '</li>');
451    }
452  }
453};
454
455function slider(element, animationSpeed) {
456  var sliderLength = $(element + ' ul li').length;
457  var currentSlide;
458
459  constructSliderNav(element, sliderLength);
460
461  $(element + ' ul.pager li').on('click', function (event) {
462    goToSlide(element, animationSpeed);
463  });
464
465  $(element + ' .prev').on('click', function () {
466    nextSlide(element, 'previous', sliderLength, animationSpeed);
467  });
468
469  $(element + ' .next').on('click', function () {
470    nextSlide(element, 'next', sliderLength, animationSpeed);
471  });
472
473  // Swipe interactions for mobile
474  var myElement = $(element)[0];
475
476  var mc = new Hammer(myElement);
477
478  mc.on("swipeleft", function () {
479    nextSlide(element, 'next', sliderLength, animationSpeed);
480  });
481
482  mc.on("swiperight", function () {
483    nextSlide(element, 'previous', sliderLength, animationSpeed);
484  });
485};
486
487// GA events
488$(function () {
489  $('#course-widget-cta').on('click', function () {
490    gtag('event', 'Get free lessons', {
491      'event_category': 'widgets',
492      'event_label': 'Original course widget'
493    });
494  });
495
496  $('#choosing-fonts-widget-cta').on('click', function () {
497    gtag('event', 'Get free lessons', {
498      'event_category': 'widgets',
499      'event_label': 'Choosing fonts widget'
500    });
501  });
502
503  $('#nav-course-cta').on('click', function () {
504    gtag('event', 'Free course', {
505      'event_category': 'navigation',
506      'event_label': 'Original nav cta'
507    });
508  });
509});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.