PageSourceSearch

https://innovationhive.eu/wp-content/plugins/trx_addons/addons/bg-canvas/bg-canvas.js

js innovationhive.eu collected 2026-10-01 15:30:21 UTC 10,176 bytes, 287 lines download raw bytes

1/* global jQuery:false */
2
3(function() {
4
5	"use strict";
6
7	var $window             = jQuery( window ),
8		$document           = jQuery( document ),
9		$body               = jQuery( 'body' );
10
11	var $lazy_images;
12
13	// Update links and values after the new post added
14	$document.on( 'action.got_ajax_response', update_jquery_links );
15	$document.on( 'action.init_hidden_elements', update_jquery_links );
16	var first_run = true;
17	function update_jquery_links(e) {
18		if ( first_run && e && e.namespace == 'init_hidden_elements' ) {
19			first_run = false;
20			return; 
21		}
22		$lazy_images = jQuery('img[loading="lazy"]');
23	}
24	update_jquery_links();
25
26
27	// Init bg canvas
28	var _bg_canvas = false;
29
30	$document.on('action.init_trx_addons', function() {
31
32		var cnt = 0;
33
34		jQuery( '[data-bg-canvas-type="start"]' ).each( function() {
35			var $start = jQuery( this ),
36				id = $start.data('bg-canvas-id'),
37				$end = $body.find( '[data-bg-canvas-id="' + id + '"][data-bg-canvas-type="end"]' ),
38				effect_start = $start.data('bg-canvas-effect') ? $start.data('bg-canvas-effect') : 'round',
39				effect_end = $end.data('bg-canvas-effect') ? $end.data('bg-canvas-effect') : 'round',
40				color_start = $start.data('bg-canvas-color'),
41				color_end = $end.data('bg-canvas-color') ? $end.data('bg-canvas-color') : color_start;
42
43			if ( id && color_start && $end.length > 0 ) {
44				if ( _bg_canvas === false ) {
45					_bg_canvas = [];
46				}
47				$body
48					.addClass( 'with_bg_canvas' )
49					.append( '<div id="bg_canvas_' + id + '" class="bg_canvas"></div>' );
50
51				_bg_canvas.push( {
52					canvas: {
53							obj: $body.find( '#bg_canvas_' + id )
54							},
55					start: {
56							obj: $start,
57							color: color_start,
58							effect: effect_start,
59							size: $start.data('bg-canvas-size') ? $start.data('bg-canvas-size') : 0,
60							shift: $start.data('bg-canvas-shift') ? $start.data('bg-canvas-shift') : 0
61							},
62					end: {
63							obj: $end,
64							color: color_end,
65							effect: effect_end,
66							size: $end.data('bg-canvas-size') ? $end.data('bg-canvas-size') : 0,
67							shift: $end.data('bg-canvas-shift') ? $end.data('bg-canvas-shift') : 0
68						}
69				} );
70
71				if ( effect_start == 'round' || effect_end == 'round' ) {
72					_bg_canvas[cnt].canvas.cnv = document.createElement("canvas");
73					_bg_canvas[cnt].canvas.ctx = _bg_canvas[cnt].canvas.cnv.getContext("2d");
74					_bg_canvas[cnt].canvas.obj.append( _bg_canvas[cnt].canvas.cnv );
75				}
76
77				if ( effect_start == 'fade' || effect_end == 'fade' ) {
78					_bg_canvas[cnt].canvas.obj.css( {
79						'background-color': color_start,
80						'opacity': 0
81					} );
82				}
83
84				cnt++;
85			}
86		} );
87
88		if ( _bg_canvas !== false ) {
89
90			if ( _bg_canvas.length > 1 ) {
91				$body.addClass( 'multi_bg_canvas' );
92			}
93
94			// Recalc positions on resize
95			$document.on( 'action.resize_trx_addons', trx_addons_debounce( trx_addons_bg_canvas_set_positions, 500 ) );
96
97			// Recalc positions on new posts are loaded
98			$document.on( 'action.got_ajax_response', function() {
99				trx_addons_bg_canvas_set_positions();
100				setTimeout( function() {
101					trx_addons_bg_canvas_set_positions();
102				}, 1000 );
103			} );
104
105			// Recalcs positions on internal lazy images are loaded
106			$document.on( 'action.init_lazy_load_elements', function() {
107				trx_addons_bg_canvas_set_positions();
108			} );
109
110			// Recalcs positions on external lazy images are loaded
111			var check_lazy_images = trx_addons_debounce( function() {
112				var chg = false;
113				$lazy_images.each( function() {
114					var img = jQuery(this);
115					if ( ! img.data('lazy-complete') && img.get(0).complete ) {
116						chg = true;
117						img.data('lazy-complete', true);
118					}
119				} );
120				if ( chg ) {
121					trx_addons_bg_canvas_set_positions();
122				}
123			}, 100 );
124
125			// Draw background on scroll
126			$window.on( 'action.scroll_trx_addons', function() {
127				// Some browsers hide address bar on scroll (window height is increased, but resize event is not generated)
128				if ( trx_addons_window_height() != $window.height() || Math.abs( _bg_canvas[0].canvas.obj.height() - trx_addons_window_height() ) > 1 ) {
129					trx_addons_window_height( _bg_canvas[0].canvas.obj.height() );	//$window.height();
130					trx_addons_bg_canvas_set_positions();
131				}
132				// Check lazy images on load
133				check_lazy_images();
134				// Draw element
135				trx_addons_bg_canvas_draw( false );
136			} );
137
138			trx_addons_bg_canvas_set_positions();
139
140			$document.trigger( 'action.trx_addons_bg_canvas', [_bg_canvas] );
141		}
142
143		function trx_addons_bg_canvas_draw( force ) {
144			for (var i=0; i < _bg_canvas.length; i++ ) {
145				trx_addons_bg_canvas_draw_item( _bg_canvas[i], force );
146			}
147		}
148
149		function trx_addons_bg_canvas_set_positions() {
150			for (var i=0; i < _bg_canvas.length; i++ ) {
151				trx_addons_bg_canvas_item_set_position( _bg_canvas[i] );
152			}
153			trx_addons_bg_canvas_draw( true );
154		}
155
156		function trx_addons_bg_canvas_item_set_position( item ) {
157			var o,
158				is_mobile = trx_addons_browser_is_mobile() || jQuery('body').hasClass('ua_mobile');
159
160			jQuery( item.canvas.cnv )
161				.css( {
162					width:  is_mobile ? '100vw' : trx_addons_window_width() + 'px',
163					height: is_mobile ? '100vh' : trx_addons_window_height() + 'px'
164				} )
165				.attr( {
166					width: trx_addons_window_width(),
167					height: trx_addons_window_height()
168				} );
169
170			item.w = trx_addons_window_width();
171			item.h = trx_addons_window_height();
172			item.size = ( is_mobile ? 1.5 : 1 ) * Math.sqrt(Math.pow(trx_addons_window_width(), 2) + Math.pow(trx_addons_window_height() + Math.abs( Math.min(0, item.start.shift, item.end.shift) ) * trx_addons_window_height() / 100, 2));
173
174			o = item.start.obj.offset();
175			item.start.w = Math.max(1, item.start.obj.width());
176			item.start.h = Math.max(1, item.start.obj.height());
177			item.start.left = o.left;
178			item.start.top  = o.top;
179
180			o = item.end.obj.offset();
181			item.end.w = Math.max(1, item.end.obj.width());
182			item.end.h = Math.max(1, item.end.obj.height());
183			item.end.left = o.left;
184			item.end.top  = o.top;
185		}
186
187		function trx_addons_bg_canvas_set_coords( item ) {
188			
189			var t  = item.start.top - trx_addons_window_scroll_top(),
190				dt = trx_addons_window_height() * item.start.shift / 100,
191				rt = 1 - Math.max( 0, Math.min( 1, ( t + dt ) / trx_addons_window_height() ) ),
192				b  = item.end.top + item.end.h - trx_addons_window_scroll_top() - trx_addons_window_height(),
193				db = trx_addons_window_height() * item.end.shift / 100,
194				rb = Math.max( 0, Math.min( 1, ( b + db ) / trx_addons_window_height() ) );
195			item.progress = Math.min(rt, rb);
196			item.distance = rt == 1 && rb == 1 ? -t / ( -t - dt + b + db - trx_addons_window_height() ) : 0;
197			item.coords = item.end.top - trx_addons_window_scroll_top() + db < trx_addons_window_height() * 1.5 || rb < 1
198							? {
199								x: item.end.left + item.end.w / 2,
200								y: item.end.top + item.end.h / 2 - trx_addons_window_scroll_top(),
201								r: item.end.size,
202								d: 'end'
203								}
204							: {
205								x: item.start.left + item.start.w / 2,
206								y: Math.max(item.start.top + item.start.h / 2 - trx_addons_window_scroll_top(), trx_addons_window_height() / 2),
207								r: item.start.size,
208								d: 'start'
209								};
210		}
211
212		function trx_addons_bg_canvas_draw_item( item, force ) {
213			trx_addons_bg_canvas_set_coords( item );
214			if ( force || ! item.done || ( item.progress > 0 && item.progress < 1 ) ) {
215				var effect = item.coords.d == 'start' ? item.start.effect : item.end.effect,
216					color = item.coords.d == 'start' ? item.start.color : item.end.color;
217				if ( item.start.color != item.end.color && item.distance > 0 ) {
218					var rgb_start = trx_addons_hex2rgb( item.start.color ),
219						rgb_end = trx_addons_hex2rgb( item.end.color );
220					rgb_start['r'] += Math.round( ( rgb_end['r'] - rgb_start['r'] ) * item.distance );
221					rgb_start['g'] += Math.round( ( rgb_end['g'] - rgb_start['g'] ) * item.distance );
222					rgb_start['b'] += Math.round( ( rgb_end['b'] - rgb_start['b'] ) * item.distance );
223					color = trx_addons_components2hex(rgb_start['r'],rgb_start['g'],rgb_start['b']);
224				}
225				if ( effect == 'round' ) {
226					if ( item.effect != effect ) {
227						item.effect = effect;
228						item.canvas.obj.css( {
229							'background-color': 'transparent',
230							'opacity': 1
231						} );
232						jQuery( item.canvas.cnv ).show();
233					}
234					var t = item.progress * item.size;
235					t = t < item.coords.r + 10 ? item.coords.r : t;
236					item.canvas.ctx.clearRect(0, 0, item.w, item.h);
237					item.canvas.ctx.beginPath();
238					item.canvas.ctx.fillStyle = color;
239					item.canvas.ctx.ellipse(item.coords.x, item.coords.y, t, t, 0, 0, 2 * Math.PI);
240					item.canvas.ctx.closePath();
241					item.canvas.ctx.fill();
242				} else if ( effect == 'fade' ) {
243					if ( item.effect != effect || item.start.color != item.end.color ) {
244						item.canvas.obj.css( {
245							'background-color': color
246						} );
247					}
248					if ( item.effect != effect ) {
249						item.effect = effect;
250						jQuery( item.canvas.cnv ).hide();
251					}
252					item.canvas.obj.css( {
253						'opacity': item.progress
254					} );
255				} else {
256					$document.trigger( 'action.trx_addons_bg_canvas_draw', [item] );
257				}
258			}
259			item.done = ( item.progress === 0 || item.progress == 1 )
260						&& item.start.color == item.end.color
261						&& ( item.end.top + item.end.h / 2 + item.end.size < trx_addons_window_scroll_top() || item.end.top > trx_addons_window_scroll_top() + trx_addons_window_height() )
262						&& item.start.shift === 0;
263		}
264	} );
265
266
267	// Mark Elementor sections between start & end with class 'bg_canvas_covered'
268	$document.on( 'action.trx_addons_bg_canvas', function(e, _bg_canvas) {
269		if ( _bg_canvas !== false ) {
270			for (var i=0; i < _bg_canvas.length; i++ ) {
271				var start = _bg_canvas[i].start.obj.parents( '.elementor-section:not(.elementor-inner-section)' ).eq(0),
272					end   = _bg_canvas[i].end.obj.parents( '.elementor-section:not(.elementor-inner-section)' ).eq(0);
273				if ( start.length > 0 && end.length > 0 ) {
274					do {
275						start.addClass( 'bg_canvas_covered' );
276						if ( start.data('id') != end.data('id') ) {
277							start = start.next( '.elementor-section' ).eq(0);
278						} else {
279							break;
280						}
281					} while ( start.length > 0 );
282				}
283			}
284		}
285	} );
286
287})();

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.