PageSourceSearch

https://icl-group-sustainability.com/wp-content/themes/ICL/assets/…/countup.min.js?ver=0.27121900%201790288687

js icl-group-sustainability.com collected 2026-09-24 22:25:22 UTC 7,336 bytes, 196 lines download raw bytes

vendor: 7,336 bytes, lines 1-196
1/*
2
3    countUp.js
4    by @inorganik
5
6*/
7
8// target = id of html element or var of previously selected html element where counting occurs
9// startVal = the value you want to begin at
10// endVal = the value you want to arrive at
11// decimals = number of decimal places, default 0
12// duration = duration of animation in seconds, default 2
13// options = optional object of options (see below)
14
15var CountUp = function(target, startVal, endVal, decimals, duration, options) {
16
17    // make sure requestAnimationFrame and cancelAnimationFrame are defined
18    // polyfill for browsers without native support
19    // by Opera engineer Erik Möller
20    var lastTime = 0;
21    var vendors = ['webkit', 'moz', 'ms', 'o'];
22    for(var x = 0; x < vendors.length && !window.requestAnimationFrame; ++x) {
23        window.requestAnimationFrame = window[vendors[x]+'RequestAnimationFrame'];
24        window.cancelAnimationFrame =
25            window[vendors[x]+'CancelAnimationFrame'] || window[vendors[x]+'CancelRequestAnimationFrame'];
26    }
27    if (!window.requestAnimationFrame) {
28        window.requestAnimationFrame = function(callback, element) {
29            var currTime = new Date().getTime();
30            var timeToCall = Math.max(0, 16 - (currTime - lastTime));
31            var id = window.setTimeout(function() { callback(currTime + timeToCall); },
32                timeToCall);
33            lastTime = currTime + timeToCall;
34            return id;
35        };
36    }
37    if (!window.cancelAnimationFrame) {
38        window.cancelAnimationFrame = function(id) {
39            clearTimeout(id);
40        };
41    }
42
43    var self = this;
44
45    // default options
46    self.options = {
47        useEasing : true, // toggle easing
48        useGrouping : true, // 1,000,000 vs 1000000
49        separator : ',', // character to use as a separator
50        decimal : '.', // character to use as a decimal
51        easingFn: null, // optional custom easing closure function, default is Robert Penner's easeOutExpo
52        formattingFn: null // optional custom formatting function, default is self.formatNumber below
53    };
54    // extend default options with passed options object
55    for (var key in options) {
56        if (options.hasOwnProperty(key)) {
57            self.options[key] = options[key];
58        }
59    }
60    if (self.options.separator === '') { self.options.useGrouping = false; }
61    if (!self.options.prefix) self.options.prefix = '';
62    if (!self.options.suffix) self.options.suffix = '';
63
64    self.d = (typeof target === 'string') ? document.getElementById(target) : target;
65    self.startVal = Number(startVal);
66    self.endVal = Number(endVal);
67    self.countDown = (self.startVal > self.endVal);
68    self.frameVal = self.startVal;
69    self.decimals = Math.max(0, decimals || 0);
70    self.dec = Math.pow(10, self.decimals);
71    self.duration = Number(duration) * 1000 || 2000;
72
73    self.formatNumber = function(nStr) {
74        nStr = nStr.toFixed(self.decimals);
75        nStr += '';
76        var x, x1, x2, rgx;
77        x = nStr.split('.');
78        x1 = x[0];
79        x2 = x.length > 1 ? self.options.decimal + x[1] : '';
80        rgx = /(\d+)(\d{3})/;
81        if (self.options.useGrouping) {
82            while (rgx.test(x1)) {
83                x1 = x1.replace(rgx, '$1' + self.options.separator + '$2');
84            }
85        }
86        return self.options.prefix + x1 + x2 + self.options.suffix;
87    };
88    // Robert Penner's easeOutExpo
89    self.easeOutExpo = function(t, b, c, d) {
90        return c * (-Math.pow(2, -10 * t / d) + 1) * 1024 / 1023 + b;
91    };
92
93    self.easingFn = self.options.easingFn ? self.options.easingFn : self.easeOutExpo;
94    self.formattingFn = self.options.formattingFn ? self.options.formattingFn : self.formatNumber;
95
96    self.version = function () { return '1.7.1'; };
97
98    // Print value to target
99    self.printValue = function(value) {
100        var result = self.formattingFn(value);
101
102        if (self.d.tagName === 'INPUT') {
103            this.d.value = result;
104        }
105        else if (self.d.tagName === 'text' || self.d.tagName === 'tspan') {
106            this.d.textContent = result;
107        }
108        else {
109            this.d.innerHTML = result;
110        }
111    };
112
113    self.count = function(timestamp) {
114
115        if (!self.startTime) { self.startTime = timestamp; }
116
117        self.timestamp = timestamp;
118        var progress = timestamp - self.startTime;
119        self.remaining = self.duration - progress;
120
121        // to ease or not to ease
122        if (self.options.useEasing) {
123            if (self.countDown) {
124                self.frameVal = self.startVal - self.easingFn(progress, 0, self.startVal - self.endVal, self.duration);
125            } else {
126                self.frameVal = self.easingFn(progress, self.startVal, self.endVal - self.startVal, self.duration);
127            }
128        } else {
129            if (self.countDown) {
130                self.frameVal = self.startVal - ((self.startVal - self.endVal) * (progress / self.duration));
131            } else {
132                self.frameVal = self.startVal + (self.endVal - self.startVal) * (progress / self.duration);
133            }
134        }
135
136        // don't go past endVal since progress can exceed duration in the last frame
137        if (self.countDown) {
138            self.frameVal = (self.frameVal < self.endVal) ? self.endVal : self.frameVal;
139        } else {
140            self.frameVal = (self.frameVal > self.endVal) ? self.endVal : self.frameVal;
141        }
142
143        // decimal
144        self.frameVal = Math.round(self.frameVal*self.dec)/self.dec;
145
146        // format and print value
147        self.printValue(self.frameVal);
148
149        // whether to continue
150        if (progress < self.duration) {
151            self.rAF = requestAnimationFrame(self.count);
152        } else {
153            if (self.callback) { self.callback(); }
154        }
155    };
156    // start your animation
157    self.start = function(callback) {
158        self.callback = callback;
159        self.rAF = requestAnimationFrame(self.count);
160        return false;
161    };
162    // toggles pause/resume animation
163    self.pauseResume = function() {
164        if (!self.paused) {
165            self.paused = true;
166            cancelAnimationFrame(self.rAF);
167        } else {
168            self.paused = false;
169            delete self.startTime;
170            self.duration = self.remaining;
171            self.startVal = self.frameVal;
172            requestAnimationFrame(self.count);
173        }
174    };
175    // reset to startVal so animation can be run again
176    self.reset = function() {
177        self.paused = false;
178        delete self.startTime;
179        self.startVal = startVal;
180        cancelAnimationFrame(self.rAF);
181        self.printValue(self.startVal);
182    };
183    // pass a new endVal and start animation
184    self.update = function (newEndVal) {
185        cancelAnimationFrame(self.rAF);
186        self.paused = false;
187        delete self.startTime;
188        self.startVal = self.frameVal;
189        self.endVal = Number(newEndVal);
190        self.countDown = (self.startVal > self.endVal);
191        self.rAF = requestAnimationFrame(self.count);
192    };
193
194    // format startVal on initialization
195    self.printValue(self.startVal);
196};

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.