PageSourceSearch

https://www.denisonforum.org/wp-content/plugins/voice-widgets-pro/…/assets/js/green-audio-player.js?ver=7.0.5

js denisonforum.org collected 2026-09-24 17:34:18 UTC 18,040 bytes, 361 lines download raw bytes

vendor: 18,040 bytes, lines 1-361
1(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.GreenAudioPlayer = f()}})(function(){var define,module,exports;return (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
2"use strict";
3
4module.exports = require('./src/js/main').default;
5
6},{"./src/js/main":2}],2:[function(require,module,exports){
7"use strict";
8
9Object.defineProperty(exports, "__esModule", {
10  value: true
11});
12exports.default = void 0;
13
14function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest(); }
15
16function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance"); }
17
18function _iterableToArrayLimit(arr, i) { if (!(Symbol.iterator in Object(arr) || Object.prototype.toString.call(arr) === "[object Arguments]")) { return; } var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
19
20function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
21
22function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
23
24function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
25
26function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
27
28var GreenAudioPlayer =
29/*#__PURE__*/
30function () {
31  function GreenAudioPlayer(player, options) {
32    _classCallCheck(this, GreenAudioPlayer);
33
34    this.audioPlayer = typeof player === 'string' ? document.querySelector(player) : player;
35    var opts = options || {};
36    var audioElement = this.audioPlayer.innerHTML;
37    this.audioPlayer.classList.add('green-audio-player');
38    this.audioPlayer.innerHTML = GreenAudioPlayer.getTemplate() + audioElement;
39    this.playPauseBtn = this.audioPlayer.querySelector('.play-pause-btn');
40    this.loading = this.audioPlayer.querySelector('.loading');
41    this.sliders = this.audioPlayer.querySelectorAll('.slider');
42    this.progress = this.audioPlayer.querySelector('.controls__progress');
43    this.volumeBtn = this.audioPlayer.querySelector('.volume__button');
44    this.volumeControls = this.audioPlayer.querySelector('.volume__controls');
45    this.volumeProgress = this.volumeControls.querySelector('.volume__progress');
46    this.player = this.audioPlayer.querySelector('audio');
47    this.currentTime = this.audioPlayer.querySelector('.controls__current-time');
48    this.totalTime = this.audioPlayer.querySelector('.controls__total-time');
49    this.speaker = this.audioPlayer.querySelector('.volume__speaker');
50    this.download = this.audioPlayer.querySelector('.download');
51    this.downloadLink = this.audioPlayer.querySelector('.download__link');
52    this.draggableClasses = ['pin'];
53    this.currentlyDragged = null;
54    this.stopOthersOnPlay = opts.stopOthersOnPlay || false;
55
56    if (opts.showDownloadButton || false) {
57      this.showDownload();
58    }
59
60    this.initEvents();
61    this.directionAware();
62    this.overcomeIosLimitations();
63  }
64
65  _createClass(GreenAudioPlayer, [{
66    key: "initEvents",
67    value: function initEvents() {
68      var _this = this;
69
70      var self = this;
71      self.audioPlayer.addEventListener('mousedown', function (event) {
72        if (self.isDraggable(event.target)) {
73          self.currentlyDragged = event.target;
74          var handleMethod = self.currentlyDragged.dataset.method;
75          var listener = self[handleMethod].bind(self);
76          window.addEventListener('mousemove', listener, false);
77          window.addEventListener('mouseup', function () {
78            self.currentlyDragged = false;
79            window.removeEventListener('mousemove', listener, false);
80          }, false);
81        }
82      }); // for mobile touches
83
84      self.audioPlayer.addEventListener('touchstart', function (event) {
85        if (self.isDraggable(event.target)) {
86          var _event$targetTouches = _slicedToArray(event.targetTouches, 1);
87
88          self.currentlyDragged = _event$targetTouches[0];
89          var handleMethod = self.currentlyDragged.target.dataset.method;
90          var listener = self[handleMethod].bind(self);
91          window.addEventListener('touchmove', listener, false);
92          window.addEventListener('touchend', function () {
93            self.currentlyDragged = false;
94            window.removeEventListener('touchmove', listener, false);
95          }, false);
96          event.preventDefault();
97        }
98      });
99      this.playPauseBtn.addEventListener('click', this.togglePlay.bind(self));
100      this.player.addEventListener('timeupdate', this.updateProgress.bind(self));
101      this.player.addEventListener('volumechange', this.updateVolume.bind(self));
102      this.player.addEventListener('loadedmetadata', function () {
103        _this.totalTime.textContent = GreenAudioPlayer.formatTime(self.player.duration);
104      });
105      this.player.addEventListener('seeking', this.showLoadingIndicator.bind(self));
106      this.player.addEventListener('seeked', this.hideLoadingIndicator.bind(self));
107      this.player.addEventListener('canplay', this.hideLoadingIndicator.bind(self));
108      this.player.addEventListener('ended', function () {
109        GreenAudioPlayer.pausePlayer(self.player);
110        self.player.currentTime = 0;
111      });
112      this.volumeBtn.addEventListener('click', function () {
113        self.volumeBtn.classList.toggle('open');
114        self.volumeControls.classList.toggle('hidden');
115      });
116      window.addEventListener('resize', self.directionAware.bind(self));
117      window.addEventListener('scroll', self.directionAware.bind(self));
118
119      for (var i = 0; i < this.sliders.length; i++) {
120        var pin = this.sliders[i].querySelector('.pin');
121        this.sliders[i].addEventListener('click', self[pin.dataset.method].bind(self));
122      }
123
124      this.downloadLink.addEventListener('click', this.downloadAudio.bind(self));
125    }
126  }, {
127    key: "overcomeIosLimitations",
128    value: function overcomeIosLimitations() {
129      var self = this;
130
131      if (window.navigator.userAgent.match(/iPad/i) || window.navigator.userAgent.match(/iPhone/i)) {
132        // iOS does not support "canplay" event
133        this.player.addEventListener('loadedmetadata', this.hideLoadingIndicator.bind(self)); // iOS does not let "volume" property be set programmatically
134
135        this.audioPlayer.querySelector('.volume').style.display = 'none';
136        this.audioPlayer.querySelector('.controls').style.marginRight = '0';
137      }
138    }
139  }, {
140    key: "isDraggable",
141    value: function isDraggable(el) {
142      var canDrag = false;
143      if (typeof el.classList === 'undefined') return false; // fix for IE 11 not supporting classList on SVG elements
144
145      for (var i = 0; i < this.draggableClasses.length; i++) {
146        if (el.classList.contains(this.draggableClasses[i])) {
147          canDrag = true;
148        }
149      }
150
151      return canDrag;
152    }
153  }, {
154    key: "inRange",
155    value: function inRange(event) {
156      var touch = 'touches' in event; // instanceof TouchEvent may also be used
157
158      var rangeBox = this.getRangeBox(event);
159      var sliderPositionAndDimensions = rangeBox.getBoundingClientRect();
160      var direction = rangeBox.dataset.direction;
161      var min = null;
162      var max = null;
163
164      if (direction === 'horizontal') {
165        min = sliderPositionAndDimensions.x;
166        max = min + sliderPositionAndDimensions.width;
167        var clientX = touch ? event.touches[0].clientX : event.clientX;
168        if (clientX < min || clientX > max) return false;
169      } else {
170        min = sliderPositionAndDimensions.top;
171        max = min + sliderPositionAndDimensions.height;
172        var clientY = touch ? event.touches[0].clientY : event.clientY;
173        if (clientY < min || clientY > max) return false;
174      }
175
176      return true;
177    }
178  }, {
179    key: "updateProgress",
180    value: function updateProgress() {
181      var current = this.player.currentTime;
182      var percent = current / this.player.duration * 100;
183      this.progress.style.width = "".concat(percent, "%");
184      this.currentTime.textContent = GreenAudioPlayer.formatTime(current);
185    }
186  }, {
187    key: "updateVolume",
188    value: function updateVolume() {
189      this.volumeProgress.style.height = "".concat(this.player.volume * 100, "%");
190
191      if (this.player.volume >= 0.5) {
192        this.speaker.attributes.d.value = 'M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z';
193      } else if (this.player.volume < 0.5 && this.player.volume > 0.05) {
194        this.speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667M17.333 11.373C17.333 9.013 16 6.987 14 6v10.707c2-.947 3.333-2.987 3.333-5.334z';
195      } else if (this.player.volume <= 0.05) {
196        this.speaker.attributes.d.value = 'M0 7.667v8h5.333L12 22.333V1L5.333 7.667';
197      }
198    }
199  }, {
200    key: "getRangeBox",
201    value: function getRangeBox(event) {
202      var rangeBox = event.target;
203      var el = this.currentlyDragged;
204
205      if (event.type === 'click' && this.isDraggable(event.target)) {
206        rangeBox = event.target.parentElement.parentElement;
207      }
208
209      if (event.type === 'mousemove') {
210        rangeBox = el.parentElement.parentElement;
211      }
212
213      if (event.type === 'touchmove') {
214        rangeBox = el.target.parentElement.parentElement;
215      }
216
217      return rangeBox;
218    }
219  }, {
220    key: "getCoefficient",
221    value: function getCoefficient(event) {
222      var touch = 'touches' in event; // instanceof TouchEvent may also be used
223
224      var slider = this.getRangeBox(event);
225      var sliderPositionAndDimensions = slider.getBoundingClientRect();
226      var K = 0;
227
228      if (slider.dataset.direction === 'horizontal') {
229        // if event is touch
230        var clientX = touch ? event.touches[0].clientX : event.clientX;
231        var offsetX = clientX - sliderPositionAndDimensions.left;
232        var width = sliderPositionAndDimensions.width;
233        K = offsetX / width;
234      } else if (slider.dataset.direction === 'vertical') {
235        var height = sliderPositionAndDimensions.height;
236        var clientY = touch ? event.touches[0].clientY : event.clientY;
237        var offsetY = clientY - sliderPositionAndDimensions.top;
238        K = 1 - offsetY / height;
239      }
240
241      return K;
242    }
243  }, {
244    key: "rewind",
245    value: function rewind(event) {
246      if (this.inRange(event)) {
247        this.player.currentTime = this.player.duration * this.getCoefficient(event);
248      }
249    }
250  }, {
251    key: "changeVolume",
252    value: function changeVolume(event) {
253      if (this.inRange(event)) {
254        this.player.volume = Math.round(this.getCoefficient(event) * 10) / 10;
255      }
256    }
257  }, {
258    key: "togglePlay",
259    value: function togglePlay() {
260      if (this.player.paused) {
261        if (this.stopOthersOnPlay) {
262          GreenAudioPlayer.stopOtherPlayers();
263        }
264
265        GreenAudioPlayer.playPlayer(this.player);
266      } else {
267        GreenAudioPlayer.pausePlayer(this.player);
268      }
269    }
270  }, {
271    key: "showLoadingIndicator",
272    value: function showLoadingIndicator() {
273      this.playPauseBtn.style.display = 'none';
274      this.loading.style.display = 'block';
275    }
276  }, {
277    key: "hideLoadingIndicator",
278    value: function hideLoadingIndicator() {
279      this.playPauseBtn.style.display = 'block';
280      this.loading.style.display = 'none';
281    }
282  }, {
283    key: "showDownload",
284    value: function showDownload() {
285      this.download.style.display = 'block';
286    }
287  }, {
288    key: "downloadAudio",
289    value: function downloadAudio() {
290      var src = this.player.currentSrc;
291      var name = src.split('/').reverse()[0];
292      this.downloadLink.setAttribute('href', src);
293      this.downloadLink.setAttribute('download', name);
294    }
295  }, {
296    key: "directionAware",
297    value: function directionAware() {
298      this.volumeControls.classList.remove('top', 'middle', 'bottom');
299
300      if (window.innerHeight < 250) {
301        this.volumeControls.classList.add('middle');
302      } else if (this.audioPlayer.getBoundingClientRect().top < 180) {
303        this.volumeControls.classList.add('bottom');
304      } else {
305        this.volumeControls.classList.add('top');
306      }
307    }
308  }], [{
309    key: "init",
310    value: function init(options) {
311      var players = document.querySelectorAll(options.selector);
312      players.forEach(function (player) {
313        /* eslint-disable no-new */
314        new GreenAudioPlayer(player, options);
315      });
316    }
317  }, {
318    key: "getTemplate",
319    value: function getTemplate() {
320      return "\n            <div class=\"loading\">\n                <div class=\"loading__spinner\"></div>\n            </div>\n            \n            <div class=\"play-pause-btn\">\n                <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"24\" viewBox=\"0 0 18 24\">\n                    <path fill=\"#566574\" fill-rule=\"evenodd\" d=\"M18 12L0 24V0\" class=\"play-pause-btn__icon\"/>\n                </svg>\n            </div>\n    \n            <div class=\"controls\">\n                <span class=\"controls__current-time\">0:00</span>\n                <div class=\"controls__slider slider\" data-direction=\"horizontal\">\n                    <div class=\"controls__progress gap-progress\">\n                        <div class=\"pin progress__pin\" data-method=\"rewind\"></div>\n                    </div>\n                </div>\n                <span class=\"controls__total-time\">0:00</span>\n            </div>\n    \n            <div class=\"volume\">\n                <div class=\"volume__button\">\n                    <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\">\n                        <path class=\"volume__speaker\" fill=\"#566574\" fill-rule=\"evenodd\" d=\"M14.667 0v2.747c3.853 1.146 6.666 4.72 6.666 8.946 0 4.227-2.813 7.787-6.666 8.934v2.76C20 22.173 24 17.4 24 11.693 24 5.987 20 1.213 14.667 0zM18 11.693c0-2.36-1.333-4.386-3.333-5.373v10.707c2-.947 3.333-2.987 3.333-5.334zm-18-4v8h5.333L12 22.36V1.027L5.333 7.693H0z\"/>\n                    </svg>\n                </div>\n                <div class=\"volume__controls hidden\">\n                    <div class=\"volume__slider slider\" data-direction=\"vertical\">\n                        <div class=\"volume__progress gap-progress\">\n                            <div class=\"pin volume__pin\" data-method=\"changeVolume\"></div>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            \n            <div class=\"download\" >\n                <a class=\"download__link\" href=\"\" download=\"\">\n                    <svg width=\"24\" height=\"24\" fill=\"#566574\" enable-background=\"new 0 0 29.978 29.978\" version=\"1.1\" viewBox=\"0 0 29.978 29.978\" xml:space=\"preserve\" xmlns=\"http://www.w3.org/2000/svg\">\n                        <path d=\"m25.462 19.105v6.848h-20.947v-6.848h-4.026v8.861c0 1.111 0.9 2.012 2.016 2.012h24.967c1.115 0 2.016-0.9 2.016-2.012v-8.861h-4.026z\"/>\n                        <path d=\"m14.62 18.426l-5.764-6.965s-0.877-0.828 0.074-0.828 3.248 0 3.248 0 0-0.557 0-1.416v-8.723s-0.129-0.494 0.615-0.494h4.572c0.536 0 0.524 0.416 0.524 0.416v8.742 1.266s1.842 0 2.998 0c1.154 0 0.285 0.867 0.285 0.867s-4.904 6.51-5.588 7.193c-0.492 0.495-0.964-0.058-0.964-0.058z\"/>\n                    </svg>\n                </a>\n            </div>\n        ";
321    }
322  }, {
323    key: "formatTime",
324    value: function formatTime(time) {
325      var min = Math.floor(time / 60);
326      var sec = Math.floor(time % 60);
327      return "".concat(min, ":").concat(sec < 10 ? "0".concat(sec) : sec);
328    }
329  }, {
330    key: "pausePlayer",
331    value: function pausePlayer(player) {
332      var playPauseButton = player.parentElement.querySelector('.play-pause-btn__icon');
333      playPauseButton.attributes.d.value = 'M18 12L0 24V0';
334      player.pause();
335    }
336  }, {
337    key: "playPlayer",
338    value: function playPlayer(player) {
339      var playPauseButton = player.parentElement.querySelector('.play-pause-btn__icon');
340      playPauseButton.attributes.d.value = 'M0 0h6v24H0zM12 0h6v24h-6z';
341      player.play();
342    }
343  }, {
344    key: "stopOtherPlayers",
345    value: function stopOtherPlayers() {
346      var players = document.querySelectorAll('.green-audio-player audio');
347
348      for (var i = 0; i < players.length; i++) {
349        GreenAudioPlayer.pausePlayer(players[i]);
350      }
351    }
352  }]);
353
354  return GreenAudioPlayer;
355}();
356
357var _default = GreenAudioPlayer;
358exports.default = _default;
359
360},{}]},{},[1])(1)
361});

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.