PluginProbe
Page Builder: Pagelayer – Drag and Drop website builder / 2.1.9
Page Builder: Pagelayer – Drag and Drop website builder v2.1.9
2.2.1 2.2.0 2.1.9 2.1.8 2.1.7 2.1.6 2.1.5 2.1.4 2.1.3 trunk 0.9.0 0.9.1 0.9.2 0.9.3 0.9.4 0.9.5 0.9.6 0.9.7 0.9.8 0.9.9 1.0.0 1.0.2 1.0.3 1.0.4 1.0.5 All 129 releases
pagelayer / js / pagelayer-frontend.js

pagelayer-frontend.js in Page Builder: Pagelayer – Drag and Drop website builder 2.1.9, at js/pagelayer-frontend.js

1,810 lines 50.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 /*
2 PAGELAYER
3 http://pagelayer.com/
4 (c) Pagelayer Team
5 */
6
7 var pagelayer_doc_width;
8
9 // Things to do on document load
10 jQuery(document).ready(function(){
11
12 // Current width
13 pagelayer_doc_width = jQuery(document).width();
14
15 // Rows
16 jQuery('.pagelayer-row-stretch-full').each(function(){
17 pagelayer_pl_row_full(jQuery(this));
18 });
19
20 jQuery('.pagelayer-anim_heading').each(function(){
21 pagelayer_anim_heading(jQuery(this));
22 });
23
24 // Setup any sliders
25 jQuery('.pagelayer-image_slider').each(function(){
26 pagelayer_pl_image_slider(jQuery(this));
27 });
28
29 jQuery('.pagelayer-accordion').each(function(){
30 pagelayer_pl_accordion(jQuery(this));
31 });
32
33 jQuery('.pagelayer-collapse').each(function(){
34 pagelayer_pl_collapse(jQuery(this));
35 });
36
37 jQuery('.pagelayer-tabs').each(function(){
38 pagelayer_pl_tabs(jQuery(this));
39 });
40
41 jQuery('.pagelayer-video').each(function(){
42 pagelayer_pl_video(jQuery(this));
43 });
44
45 jQuery('.pagelayer-image').each(function(){
46 pagelayer_pl_image(jQuery(this));
47 });
48
49 jQuery('.pagelayer-grid_gallery').each(function(){
50 pagelayer_pl_grid_lightbox(jQuery(this));
51 });
52
53 jQuery('.pagelayer-row, .pagelayer-inner_row, .pagelayer-col').each(function(){
54 pagelayer_pl_row_video(jQuery(this));
55 });
56
57 jQuery('.pagelayer-parallax-window img').each(function(){
58 pagelayer_pl_row_parallax(jQuery(this));
59 });
60
61 jQuery('.pagelayer-recaptcha, .pagelayer-g-recaptcha-v3-token').each(function(){
62 pagelayer_recaptcha_loader(jQuery(this));
63 });
64
65 jQuery('.pagelayer-wp_menu').each(function(){
66 pagelayer_primary_menu(jQuery(this));
67 });
68
69 jQuery('.pagelayer-contact').each(function(){
70 pagelayer_contact_form(jQuery(this));
71 });
72
73 jQuery('.pagelayer-countdown').each(function(){
74 pagelayer_countdown(jQuery(this));
75 });
76
77 jQuery('.pagelayer-testimonial_slider').each(function(){
78 pagelayer_pl_testimonial_slider(jQuery(this));
79 });
80
81 jQuery('.pagelayer-social_grp').each(function(){
82 pagelayer_pl_social_profile(jQuery(this));
83 });
84
85 jQuery('.pagelayer-scroll-to-element').each(function () {
86 pagelayer_button_element_scroll(jQuery(this));
87 });
88
89 jQuery('.pagelayer-bgimg-slider').each(function () {
90 pagelayer_pl_row_slider(jQuery(this));
91 });
92
93 jQuery('.pagelayer-stars-container').each(function(){
94 pagelayer_stars(jQuery(this));
95 });
96
97 jQuery('.pagelayer-infinite-posts').each(function(){
98 pagelayer_infinite_posts(jQuery(this));
99 });
100
101 jQuery('.pagelayer-youtube-video').each(function(){
102 pagelayer_create_yt_player(jQuery(this));
103 });
104
105 // We need to call the is visible thing to show the widgets loading effect
106 if(jQuery('.pagelayer-counter-content,.pagelayer-progress-container').length > 0){
107
108 // First Call
109 pagelayer_counter();
110 pagelayer_progress();
111
112 jQuery(window).scroll(function() {
113 pagelayer_progress();
114 pagelayer_counter();
115 });
116 }
117
118 new WOW({boxClass:'pagelayer-wow'}).init();
119
120 // Remove pagelayer-wow temporary style after wow init added from wp_head
121 jQuery('#pagelayer-wow-animation-style').remove();
122
123 });
124
125 // For automatic row change
126 jQuery(window).resize(function() {
127
128 // Primary Menu
129 jQuery('.pagelayer-wp_menu').each(function(){
130 pagelayer_primary_menu(jQuery(this));
131 });
132
133 var new_vw = jQuery(document).width();
134
135 if(new_vw == pagelayer_doc_width){
136 return false;
137 }
138
139 pagelayer_doc_width = new_vw;
140
141 // Remove style
142 jQuery('.pagelayer-row-stretch-full').removeAttr('style');
143
144 // Set a timeout to prevent bubbling
145 setTimeout(function(){
146
147 jQuery('.pagelayer-row-stretch-full').each(function(){
148 pagelayer_pl_row_full(jQuery(this));
149 });
150
151 }, 200);
152
153 });
154
155 // Get document for gutenberg
156 function pagelayerGetDocumentElement(){
157
158 // Find the iframe element with the name "editor-canvas".
159 const editorIframe = document.querySelectorAll( 'iframe[name="editor-canvas"]' );
160
161 if(! editorIframe?.[ 0 ]){
162 return document;
163 }
164
165 // Get the document of the iframe.
166 const iframeDocument = editorIframe[ 0 ]?.contentWindow?.document || editorIframe[ 0 ]?.contentDocument;
167
168 if ( ! iframeDocument ) {
169 return document;
170 }
171
172 // Set the root element to the iframe document.
173 return iframeDocument;
174 };
175
176 // Get Window for gutenberg
177 function pagelayerGetCurrentWindow(){
178 var doc = pagelayerGetDocumentElement();
179 return doc.defaultView || window;
180 }
181
182 // Modify jQuery for gutenberg tablet and mobile
183 function pagelayer_query(sel, doc) {
184 doc = doc || pagelayerGetDocumentElement();
185 return jQuery(sel, doc);
186 }
187
188 // Check if element is visible
189 function pagelayer_isVisible(ele) {
190
191 var win = pagelayerGetCurrentWindow();
192
193 var offset = win.innerHeight;
194 var viewTop = win.pageYOffset;
195 var viewBottom = viewTop + offset - Math.min(ele.height(), ele.innerHeight());
196 var top = ele.offset().top;
197 var bottom = top + ele.innerHeight();
198
199 if(top <= viewBottom && bottom >= viewTop){
200 return true;
201 }
202
203 return false;
204 }
205
206 // Get media mode
207 function pagelayer_get_media_mode(){
208
209 var win = pagelayerGetCurrentWindow();
210
211 if(win.matchMedia("(min-width: "+ (pagelayer_settings['tablet_breakpoint'] + 1) +"px)").matches){
212 return 'desktop';
213 }
214
215 if(win.matchMedia("(max-width: "+ pagelayer_settings['tablet_breakpoint'] +"px) and (min-width: "+ (pagelayer_settings['mobile_breakpoint'] + 1) +"px)").matches){
216 return 'tablet';
217 }
218
219 if(win.matchMedia("(max-width: "+ pagelayer_settings['mobile_breakpoint'] +"px)").matches){
220 return 'mobile';
221 }
222
223 return 'desktop';
224 }
225
226 // Row background video and parallax
227 function pagelayer_pl_row_video(jEle){
228
229 var vEle = jEle.children('.pagelayer-background-video');
230
231 // Not a video in the element
232 if(vEle.length < 1){
233 return true;
234 }
235
236 var setup = vEle.attr('pagelayer-setup');
237 if(setup && setup.length > 0){
238 return true;
239 }
240
241 var frame_width = vEle.width();
242 var frame_height = (frame_width/100)*56.25;
243 var height = vEle.height();
244
245 if(frame_height < height){
246 frame_height = height;
247 }
248
249 vEle.children().css({'width':frame_width+'px','height':frame_height+'px'});
250
251 if(vEle.find('.pagelayer-youtube-video').length > 0){
252 pagelayer_create_yt_player(vEle.find('.pagelayer-youtube-video'));
253 }
254
255 vEle.attr('pagelayer-setup', 1);
256
257 }
258
259 function pagelayer_create_yt_player(jEle){
260
261 var pEle = jEle.parent(),
262 aspectRatioSetting = '16:9',
263 containerWidth = pEle.outerWidth(),
264 containerHeight = pEle.outerHeight(),
265 aspectRatioArray = aspectRatioSetting.split(':'),
266 aspectRatio = aspectRatioArray[0] / aspectRatioArray[1],
267 isWidthFixed = containerWidth / containerHeight > aspectRatio,
268 width= isWidthFixed ? containerWidth : containerHeight * aspectRatio,
269 height= isWidthFixed ? containerWidth / aspectRatio : containerHeight;
270
271 var yt_api_interval = setInterval(function(){
272
273 if(!(window.YT && YT.loaded)){
274 return
275 }
276
277 clearInterval(yt_api_interval);
278
279 var settings ={};
280 settings.loop = jEle.attr('data-loop');
281 settings.videoid = jEle.attr('data-videoid');
282 settings.mute = jEle.attr('data-mute');
283
284 var player;
285
286 var onPlayerReady = function(event) {
287 event.target.playVideo();
288 }
289
290 player = new YT.Player(jEle[0], {
291 width: width,
292 height: height,
293 videoId: settings.videoid,
294 playerVars: {
295 controls: 0,
296 rel: 0,
297 loop: settings.loop,
298 mute:settings.mute,
299 playsinline: 1,
300 playlist: settings.videoid,
301 },
302 events: {
303 'onReady': onPlayerReady,
304 }
305 });
306
307 }, 500);
308
309 }
310
311 // Row background parallax
312 function pagelayer_pl_row_parallax(jEle){
313
314 //Parallax background
315 var setup = jEle.attr('pagelayer-setup');
316 if(setup && setup.length > 0){
317 return true;
318 }
319
320 new pagelayerParallax(jEle);
321 jEle.attr('pagelayer-setup', 1);
322 }
323
324 // Adjust rows
325 function pagelayer_pl_row_full(jEle, html){
326
327 html = html || pagelayer_query('html');
328
329 // Get current width
330 var vw = html[0].clientWidth;
331
332 // Now give the row the width
333 jEle.css({'width': vw, 'max-width': '100vw'});
334
335 // Set the offset
336 jEle.offset({left: 0});
337
338 // Set a timeout as well as some themes can interfere with us
339 setTimeout(function(){
340 jEle.offset({left: 0});
341 }, 500);
342
343 };
344
345 // Modal open
346 function pagelayer_render_pl_modal(e){
347 jQuery(e.target).closest('.pagelayer-modal-container').find('.pagelayer-modal-content').show();
348 };
349
350 // Modal close
351 function pagelayer_pl_modal_close(e){
352 jQuery(e.target).closest('.pagelayer-modal-content').hide();
353 }
354
355 // Setup the image slider
356 function pagelayer_pl_image_slider(jEle){
357
358 var ul = jEle.find('.pagelayer-image-slider-ul');
359
360 // Build the options
361 var options = pagelayer_fetch_dataAttrs(ul, 'data-slides-');
362
363 pagelayer_owl_init(jEle, ul, options);
364
365 }
366
367 function pagelayer_get_tab_ele(temp_tabCont){
368
369 if(!pagelayer_empty(temp_tabCont.children('.pagelayer-ele-wrap').length)){
370 return temp_tabCont.children('.pagelayer-ele-wrap').children('.pagelayer-tab');
371 }else{
372 return temp_tabCont.children('.pagelayer-tab');
373 }
374 }
375
376 function pagelayer_tab_show(el, pl_id) {
377
378 var parent_id = jQuery(el).closest('.pagelayer-tabs').attr('pagelayer-id');
379
380 var temp_tabCont = pagelayer_query('[pagelayer-id='+pl_id+']').closest('.pagelayer-tabcontainer');
381 pagelayer_get_tab_ele(temp_tabCont).hide();
382
383 pagelayer_query('[pagelayer-id='+pl_id+']').show();
384
385 jQuery(el).parent().find('.pagelayer-tablinks').each(function(){
386 jQuery(this).removeClass('active');
387 });
388
389 jQuery(el).addClass("active");
390 }
391
392 var pagelayer_tab_timers = {};
393
394 function pagelayer_pl_tabs(jEle) {
395
396 var default_active = '';
397 var jEle_id = jEle.attr('pagelayer-id');
398 var hashTabId = '';
399
400 var tabCont = jEle.children('.pagelayer-tabcontainer');
401 var children = pagelayer_get_tab_ele(tabCont);
402
403 // Loop thru
404 children.each(function(){
405 var tEle = jQuery(this);
406 var pl_id = tEle.attr('pagelayer-id');
407
408 var title = tEle.attr('pagelayer-tab-title') || 'Tab';
409 var id = tEle.attr('id');
410 var func = "pagelayer_tab_show(this, '"+pl_id+"')";
411
412 var icon = '';
413 if(tEle.attr('pagelayer-tab-icon')){
414 icon = tEle.attr('pagelayer-tab-icon');
415 }
416
417 // Set the default tab
418 if(tEle.attr('pagelayer-default_active') && !pagelayer_empty(pl_id)){
419 default_active = pl_id;
420 }
421
422 var editable = '';
423 if(!pagelayer_empty(pagelayer_is_live)){
424 editable += ' pagelayer-ref-id="'+pl_id+'"';
425 editable += ' pagelayer-editable="title"';
426 editable += ' contenteditable="true"';
427 }
428
429 jEle.children('.pagelayer-tabs-holder').append('<span tab-id="' + pl_id + '" id="' + id + '" class="pagelayer-tablinks" onclick="' + func + '"> <i class="' + icon + '"></i> <span class="pl-tab-title" ' + editable + '>'+title+'</span></span>');
430
431 });
432
433 // Default Active by Hash
434 var hash = location.hash.slice(1);
435 if (!pagelayer_empty(hash)) {
436 var hashTab = jEle.find('#' + hash);
437
438 if (!pagelayer_empty(hashTab) && hashTab.length > 0) {
439 var currentTab = hashTab.closest('.pagelayer-tablinks');
440 if (currentTab.length > 0) {
441 var currentTabId = currentTab.attr('tab-id');
442 hashTabId = currentTabId;
443 }
444 }
445 }
446
447 if(hashTabId.length > 0){
448 pagelayer_tab_show(jEle.find('[tab-id=' + hashTabId + ']'), hashTabId);
449 // Set the default tab
450 }else if(default_active.length > 0){
451 pagelayer_tab_show(jEle.find('[tab-id='+default_active+']'), default_active);
452 // Set the first tab as active
453 }else{
454 var first_tab = jEle.find('[tab-id]').first();
455 pagelayer_tab_show(first_tab, first_tab.attr('tab-id'));
456 }
457
458 try{
459 clearInterval(pagelayer_tab_timers[jEle_id]);
460 }catch(e){};
461
462 var rotate = parseInt(jEle.attr('pagelayer-tabs-rotate'));
463
464 // Are we to rotate
465 if(rotate > 0){
466
467 var i= 0;
468 pagelayer_tab_timers[jEle_id] = setInterval(function () {
469
470 if(i >= children.length){
471 i = 0;
472 }
473
474 var tabCont = jEle.children('.pagelayer-tabcontainer');
475 var tmp_pl_ele = pagelayer_get_tab_ele(tabCont)[i];
476
477 var tmp_btn_ele = jEle.find('.pagelayer-tablinks')[i]
478 var tmp_pl_id = jQuery(tmp_pl_ele).attr('pagelayer-id');
479
480 jEle.find('.pagelayer-tablinks').each(function(){
481 jQuery(this).removeClass('active');
482 });
483
484 jQuery(tmp_btn_ele).addClass("active");
485 pagelayer_tab_show(tmp_btn_ele, tmp_pl_id);
486
487 i++;
488
489 }, rotate);
490 }
491
492 }
493
494 // Setup the Accordion
495 function pagelayer_pl_accordion(jEle){
496
497 var holder = jEle.find('.pagelayer-accordion-holder');
498 var accHolder = jEle.find('.pagelayer-accordion_item');
499 var scrolltop = false;
500
501 if(accHolder.length < 1){
502 return false;
503 }
504
505 var icon = holder.attr('data-icon');
506 var active_icon = holder.attr('data-active_icon');
507
508 accHolder.find('.pagelayer-accordion-tabs span i').attr('class', icon);
509 var currentActiveTab = jEle.find('.pagelayer-accordion_item.active').first();
510
511 // Any URL HASH ?
512 var hash = location.hash.slice(1);
513 if(!pagelayer_empty(hash)){
514 var scrollTab = jEle.find('#'+hash);
515
516 if(!pagelayer_empty(scrollTab) && scrollTab.length > 0){
517 currentActiveTab = scrollTab.closest('.pagelayer-accordion_item');
518 }
519 }
520
521 var not_tabs = accHolder.find('.pagelayer-accordion_item .pagelayer-accordion-tabs');
522 var tabs = accHolder.find('.pagelayer-accordion-tabs').not(not_tabs);
523
524 tabs.off('click');
525 tabs.on('click', function(e) {
526
527 e.stopPropagation(); // Prevent bubbling up to parent accordions
528
529 var currentTab = jQuery(this).closest('.pagelayer-accordion_item');
530 var accHolder = currentTab.closest('.pagelayer-accordion-holder'); // Only the current group
531
532 if (currentTab.hasClass('active') && currentTab.children('.pagelayer-accordion-panel').is(':visible')) {
533 currentTab.removeClass('active').children('.pagelayer-accordion-panel').slideUp('slow');
534 currentTab.find('.pagelayer-accordion-tabs').not(not_tabs).find('span i').attr('class', icon);
535 return;
536 }
537
538 // Close only siblings inside the same accordion group
539 accHolder.find('.pagelayer-accordion_item').not(accHolder.find('.pagelayer-accordion_item .pagelayer-accordion_item')).not(currentTab).not(currentTab.find('.pagelayer-accordion_item')).removeClass('active')
540 .children('.pagelayer-accordion-panel').slideUp('slow')
541 .end().find('.pagelayer-accordion-tabs').not(not_tabs).find('span i').attr('class', icon);
542
543 // Open the clicked one
544 currentTab.addClass('active').children('.pagelayer-accordion-panel').slideDown('slow');
545 currentTab.find('.pagelayer-accordion-tabs').not(not_tabs).find('span i').attr('class', active_icon);
546
547 });
548
549 // To prevent default active click in gutenberg
550 var setup = jEle.attr('pagelayer-setup');
551
552 // Already setup ?
553 if(setup && setup.length > 0){
554 return;
555 }
556
557 jEle.attr('pagelayer-setup', 1);
558
559 // If active first tab from all active tabs
560 currentActiveTab.removeClass('active');
561 currentActiveTab.find('.pagelayer-accordion-tabs').click();
562 }
563
564 // Setup the Collapse
565 function pagelayer_pl_collapse(jEle){
566
567 var holder = jEle.find('.pagelayer-collapse-holder');
568 var tabs = jEle.find('.pagelayer-accordion_item');
569
570 if(tabs.length < 1){
571 return false;
572 }
573
574 var setup = tabs.attr('pagelayer-setup');
575 var icon = holder.attr('data-icon');
576 var active_icon = holder.attr('data-active_icon');
577
578 // Any URL HASH ?
579 var hash = location.hash.slice(1);
580 if(!pagelayer_empty(hash)){
581 var scrollTab = jEle.find('#'+hash);
582
583 if(!pagelayer_empty(scrollTab) && scrollTab.length > 0){
584 scrollTab.closest('.pagelayer-accordion_item').addClass('active');
585 }
586 }
587
588 var activeTabs = jEle.find('.pagelayer-accordion_item.active');
589
590 tabs.find('.pagelayer-accordion-tabs span i').attr('class', icon);
591 jQuery(activeTabs).addClass('active').children('.pagelayer-accordion-panel').slideDown('slow');
592 jQuery(activeTabs).find('.pagelayer-accordion-tabs span i').attr('class', active_icon);
593
594 var not_tabs = tabs.find('.pagelayer-accordion_item .pagelayer-accordion-tabs');
595 var _tabs = tabs.find('.pagelayer-accordion-tabs').not(not_tabs);
596
597 // Already setup ?
598 if(setup && setup.length > 0){
599 _tabs.off('click');
600 }
601
602 _tabs.on('click', function(e){
603 e.preventDefault();
604
605 var currentTab = jQuery(this).closest('.pagelayer-accordion_item');
606
607 if(currentTab.hasClass('active')){
608 currentTab.removeClass('active').children('.pagelayer-accordion-panel').slideUp('slow');
609 currentTab.find('.pagelayer-accordion-tabs').not(not_tabs).find('span i').attr('class', icon);
610 return true;
611 }
612
613 currentTab.addClass('active').children('.pagelayer-accordion-panel').slideDown('slow');
614 currentTab.find('.pagelayer-accordion-tabs').not(not_tabs).find('span i').attr('class', active_icon);
615
616 });
617
618 // Set that we have setup everything
619 tabs.attr('pagelayer-setup', 1);
620
621 }
622
623 // Counter
624 function pagelayer_counter(){
625
626 pagelayer_query('.pagelayer-counter-content').each(function(){
627
628 var jEle = jQuery(this);
629
630 if(pagelayer_isVisible(jEle)){
631
632 var setup = jEle.attr('pagelayer-setup');
633
634 // Already setup ?
635 if(setup && setup.length > 0){
636 return true;
637 }
638
639 var options = {};
640 options['duration'] = jEle.children('.pagelayer-counter-display').attr('pagelayer-counter-animation-duration');
641 options['delimiter'] = jEle.children('.pagelayer-counter-display').attr('pagelayer-counter-seperator-type');
642 options['toValue'] = jEle.children('.pagelayer-counter-display').attr('pagelayer-counter-last-value');
643 jEle.children('.pagelayer-counter-display').numerator( options );
644
645 // Set that we have setup everything
646 jEle.attr('pagelayer-setup', 1);
647
648 }
649 });
650 }
651
652 function pagelayer_progress(){
653 pagelayer_query('.pagelayer-progress-container').each(function(){
654 var jEle = jQuery(this);
655
656 if(pagelayer_isVisible(jEle)){
657
658 var setup = jEle.attr('pagelayer-setup');
659 if(setup && setup.length > 0){
660 return true;
661 }
662
663 var progress_width = jEle.children('.pagelayer-progress-bar').attr('pagelayer-progress-width');
664 if(progress_width == undefined){
665 progress_width = "1";
666 }
667
668 var width = 0;
669 var interval;
670
671 var progress = function(){
672 if (width >= progress_width) {
673 clearInterval(interval);
674 } else {
675 width++;
676 jEle.children('.pagelayer-progress-bar').css('width', width + '%');
677 jEle.find('.pagelayer-progress-percent').text(width * 1 + '%');
678 }
679 }
680 interval = setInterval(progress, 30);
681 jEle.attr('pagelayer-setup', 1);
682
683 }
684 });
685 }
686
687 // Dismiss Alert Function
688 function pagelayer_dismiss_alert(x){
689
690 if(!pagelayer_empty(pagelayer_is_live)){
691 return;
692 }
693
694 jQuery(x).parent().parent().fadeOut();
695 }
696
697 // Video light box handler
698 function pagelayer_pl_video(jEle){
699 var videoIframe = jEle.find('.pagelayer-video-iframe');
700 // Adding loop, autoplay and mute properties on video before loading
701 videoIframe.on('load', function() {
702
703 // Checking of video source if it is youtube or vimeo because
704 // TODO: Need to check, if this is not local file then return
705 if(jQuery(this)[0].src.indexOf('youtube.com') != -1 || jQuery(this)[0].src.indexOf('vimeo.com') != -1){
706 return;
707 }
708
709 var vidElm = jQuery(this).contents().find('video');
710 var vidSrc = (pagelayer_empty(vidElm[0].src)) ? vidElm.children()[0].src : vidElm[0].src;
711
712 if(vidSrc[vidSrc.indexOf('&loop=')+6] == 1){
713 vidElm.attr('loop','loop');
714 }
715 if(vidSrc[vidSrc.indexOf('&autoplay=')+10] == 0){
716 vidElm.removeAttr('autoplay');
717 vidElm[0].pause();
718 }else if(vidSrc[vidSrc.indexOf('&autoplay=')+10] == 1){
719 vidElm.attr('autoplay','');
720 vidElm.attr('playsinline','');
721 }
722 if(vidSrc[vidSrc.indexOf('&mute=')+6] == 1){
723 vidElm[0].muted = "muted";
724 vidElm.attr('muted','');
725 }
726 });
727
728 // A tag will be there ONLY if the lightbox is on
729 var overlayval = jEle.find('.pagelayer-video-overlay');
730 var a = jEle.find(".pagelayer-video-holder a");
731
732 // No lightbox
733 if(a.length < 1 && pagelayer_empty(overlayval)){
734 return;
735 }
736
737 a.nivoLightbox({
738 effect: "fadeScale",
739 });
740
741 jEle.find(".pagelayer-video-holder .pagelayer-video-overlay").on("click", function(ev) {
742
743 var target = jQuery(ev.target);
744
745 if (!target.parent("a").length) {
746 videoIframe[0].src = videoIframe[0].src.replace("&autoplay=0", "rel=0&autoplay=1");
747 jQuery(this).hide();
748 }
749 });
750
751 }
752
753 // Image light box handler
754 function pagelayer_pl_image(jEle){
755
756 // Drag and Drop function for image
757 if (typeof pagelayer_preDAndD_image !== "undefined") {
758 pagelayer_preDAndD_image(jEle);
759 }
760
761 // A tag will be there ONLY if the lightbox is on
762 var a = jEle.find("[pagelayer-image-link-type=lightbox]");
763
764 // No lightbox
765 if(a.length < 1){
766 return;
767 }
768
769 a.nivoLightbox({
770 effect: "fadeScale",
771 });
772 }
773
774 function pagelayer_stars(jEle){
775
776 var setup = jEle.attr('pagelayer-setup');
777 if(setup && setup.length > 0){
778 return true;
779 }
780 var count = jEle.attr('pagelayer-stars-count');
781
782 if (isNaN(count)) {
783 count = '0';
784 }
785
786 i = 0;
787 var stars = "";
788 while(i < count){
789 stars +='<div class="pagelayer-stars-icon pagelayer-stars-empty"><i class="fas fa-star" aria-hidden="true"></i></div>';
790 i++;
791 }
792
793 jEle.empty();
794 jEle.append(stars);
795 var starsval = jEle.attr('pagelayer-stars-value');
796
797 if (isNaN(starsval)) {
798 starsval = count;
799 }
800
801 starsval = starsval.split('.');
802 var fullstars = starsval[0];
803 var value = starsval[1];
804 var halfstar = parseInt(fullstars) + 1;
805 var emptystars = parseInt(fullstars) + 2;
806 jEle.children('.pagelayer-stars-icon').attr("class","pagelayer-stars-icon");
807 jEle.children('.pagelayer-stars-icon:nth-child(-n+'+ fullstars +')').addClass('pagelayer-stars-full');
808 if(value != undefined){
809 jEle.children('.pagelayer-stars-icon:nth-child('+ halfstar +')').addClass('pagelayer-stars-'+value);
810 }else{
811 jEle.children('.pagelayer-stars-icon:nth-child('+ halfstar +')').addClass('pagelayer-stars-empty');
812 }
813 jEle.children('.pagelayer-stars-icon:nth-child(n+'+ emptystars +')').addClass('pagelayer-stars-empty');
814 jEle.attr('pagelayer-setup', 1);
815 }
816
817 // Grid Gallery pagination Off On function
818 function pagelayer_pl_grid_paginate(gridCont, pagination, pageValue, gridValue){
819 gridCont.hide();
820 pagination.removeClass('active');
821 pagination.eq(pageValue).addClass('active');
822 gridCont.eq(gridValue).show();
823 }
824
825 //Grid Gallery Lightbox
826 function pagelayer_pl_grid_lightbox(jEle){
827
828 // Grid Gallery pagination settings
829 var gridCont = jEle.find('.pagelayer-grid-gallery-container').children();
830 var pagination = jEle.find('.pagelayer-grid-gallery-pagination ul').children();
831 gridCont.hide();
832 gridCont.eq(0).show();
833 // Adding event listners to pagination
834 jEle.find('.pagelayer-grid-page-item').each(function(){
835 jQuery(this).on('click', function(event){
836 var text = jQuery(this).text();
837 switch(text){
838 case '«':
839 pagelayer_pl_grid_paginate(gridCont, pagination, 1, 0);
840 break;
841 case '»':
842 pagelayer_pl_grid_paginate(gridCont, pagination, (pagination.length-2), (gridCont.length-1));
843 break;
844 default:
845 pagelayer_pl_grid_paginate(gridCont, pagination, text, text-1);
846 break;
847 }
848 });
849 });
850
851 // A tag will be there ONLY if the lightbox is on
852 var a = jEle.find("[pagelayer-grid-gallery-type=lightbox]");
853
854 // No lightbox
855 if(a.length < 1){
856 return;
857 }
858
859 a.nivoLightbox({
860 effect: "fadeScale",
861 keyboardNav: true,
862 clickImgToClose: false,
863 clickOverlayToClose: true,
864 });
865 }
866
867 // Is string?
868 function pagelayer_is_string(str){
869
870 if(typeof str == 'string'){
871 return true;
872 }
873
874 return false;
875 }
876
877 // PHP equivalent empty()
878 function pagelayer_empty(mixed_var) {
879
880 var undef, key, i, len;
881 var emptyValues = [undef, null, false, 0, '', '0'];
882
883 for (i = 0, len = emptyValues.length; i < len; i++) {
884 if (mixed_var === emptyValues[i]) {
885 return true;
886 }
887 }
888
889 if (typeof mixed_var === 'object') {
890 for (key in mixed_var) {
891 // TODO: should we check for own properties only?
892 //if (mixed_var.hasOwnProperty(key)) {
893 return false;
894 //}
895 }
896 return true;
897 }
898
899 return false;
900 };
901
902 function pagelayer_fetch_dataAttrs(ele, prefix){
903
904 var options = {};
905
906 jQuery.each(ele.get(0).attributes, function(i, attrib){
907
908 //console.log(attrib);
909 if(attrib.name.includes(prefix)){
910
911 var opt_name = attrib.name.substring(prefix.length);
912
913 // Check for any Uppercase attribute
914 if(opt_name.includes('-')){
915
916 opt_name = opt_name.split('-');
917 //console.log(opt_name);
918 var opt_arr = [];
919 jQuery.each(opt_name, function(key, value) {
920 if(key != 0){
921 opt_arr.push(value.charAt(0).toUpperCase() + value.slice(1));
922 }else{
923 opt_arr.push(value);
924 }
925 });
926 //console.log(opt_arr);
927 opt_name = opt_arr.join('');
928 }
929
930 // Make the values correct
931 var val = attrib.value;
932 if(val == 'true') val = true;
933 if(val == 'false') val = false;
934 if(jQuery.isNumeric(val)) val = parseInt(val);
935
936 options[opt_name] = val;
937 }
938 });
939
940 //console.log(options);
941
942 if(options['controls']){
943 switch(options['controls']){
944 case 'arrows':
945 options['nav'] = true;
946 options['dots'] = false;
947 break;
948 case 'pager':
949 options['dots'] = true;
950 options['nav'] = false;
951 break;
952 case 'none':
953 options['nav'] = false;
954 options['dots'] = false;
955 break;
956 }
957 }else{
958 options['nav'] = true;
959 options['dots'] = true;
960 }
961
962 if(options['animateIn']){
963 switch(options['controls']){
964 case 'horizontal':
965 options['animateIn'] = 'slideInLeft';
966 break;
967 case 'vertical':
968 options['animateIn'] = 'slideInDown';
969 break;
970 case 'kenburns':
971 options['animateIn'] = 'zoomIn';
972 break;
973 default:
974 options['animateIn'] = options['animateIn'];
975 }
976 }
977
978 if(!options['items']){
979 options['items'] = 1;
980 }
981
982 options['responsive'] = {
983 0:{items: 1},
984 500:{items: options['items']}
985 }
986
987 options['responsiveRefreshRate'] = 1000;
988
989 // If we are in editor don't loop the Owl items
990 if (window.location.href.indexOf('pagelayer-live=1') > -1) {
991 //console.log('here');
992 options['loop'] = false;
993 }
994
995 return options;
996 }
997
998 function pagelayer_owl_init(jEle, ul, options){
999
1000 //console.log(options);
1001 var setup = jEle.attr('pagelayer-setup');
1002 var id = jEle.closest('[pagelayer-id]').attr('[pagelayer-id]');
1003
1004 if( options.navtext ) {
1005 var right = options.navtext.replace('left','right');
1006 options.navText = [`<i class="${options.navtext}"></i>`, `<i class="${right}"></i>`];
1007 }
1008
1009 // Already setup ?
1010 if(setup && setup.length > 0){
1011 return true;
1012 }
1013
1014 const wind = pagelayerGetCurrentWindow();
1015 options['responsiveBaseElement'] = wind;
1016
1017 var owlCar = ul.pagelayerOwlCarousel(options);
1018
1019 // Refreshing Image slider after first load of page.
1020 var referrerOwl = function(){
1021 setTimeout(function(){
1022 owlCar.trigger('refresh.owl.carousel');
1023 },700);
1024 }
1025
1026 referrerOwl();
1027
1028 // To prevent slider drag inside the editable area
1029 jEle.on('mousedown', function(e){
1030 var target = e.target;
1031
1032 var isEditable = jQuery(target).closest('[contenteditable="true"]');
1033
1034 if(isEditable.length < 1){
1035 return;
1036 }
1037
1038 isEditable.on('mousedown.owl.core dragstart.owl.core selectstart.owl.core touchstart.owl.core touchcancel.owl.core', function(e){
1039 e.stopPropagation();
1040 });
1041
1042 });
1043
1044 // Gutenberg responsive Handler
1045 if(wind != window){
1046 jQuery(wind).unbind('resize.pl_'+id, referrerOwl);
1047 jQuery(wind).on('resize.pl_'+id, referrerOwl);
1048 }
1049
1050 // Set that we have setup everything
1051 jEle.attr('pagelayer-setup', 1);
1052
1053 }
1054
1055 // recaptcha handler
1056 function pagelayer_recaptcha_loader(jEle, loadScript){
1057
1058 loadScript = loadScript || false;
1059
1060 // Render recaptcha
1061 var reParam = '';
1062 var sitekey = jEle.data("sitekey");
1063
1064 if(!pagelayer_empty(pagelayer_recaptch_lang)){
1065 reParam = '&hl='+pagelayer_recaptch_lang;
1066 }
1067
1068 // Add recaptcha script
1069 if(pagelayer_empty(window.grecaptcha) && !pagelayer_empty(loadScript)){
1070 var render = (pagelayer_recaptch_version == 'v3') ? sitekey : 'explicit';
1071 pagelayer_query('body').append('<script src="https://www.google.com/recaptcha/api.js?render='+render+reParam+'" async defer></script>');
1072 }
1073
1074 // Render recaptcha
1075 var recaptcha_interval = setInterval(function(){
1076
1077 if(!pagelayer_empty(window.grecaptcha)){
1078 grecaptcha.ready(function() {
1079 try{
1080 // Call grecaptcha.execute() to trigger reCAPTCHA v3 and get a token
1081 if(pagelayer_recaptch_version == 'v3'){
1082 var form = jEle.closest('form');
1083 form.find('[type="submit"]').off('click').on('click', function(e){
1084 e.preventDefault();
1085 grecaptcha.execute(sitekey, { action: 'submit' }).then(function (token) {
1086 // Append the token to the form or element to be submitted
1087 form.find('input.pagelayer-g-recaptcha-v3-token').val(token);
1088 if(form[0].requestSubmit){
1089 form[0].requestSubmit();
1090 }else{
1091 form.submit();
1092 }
1093 });
1094 });
1095 }else{
1096 var widgetID = grecaptcha.render(jEle.get(0), {'sitekey' : sitekey});
1097 jEle.attr('recaptcha-widget-id', widgetID);
1098 }
1099 }catch(e){
1100 console.log("There is some issue in rendering reCaptcha. Please check your recaptcha site-key !");
1101 }
1102
1103 });
1104 clearInterval(recaptcha_interval);
1105 }
1106
1107 }, 500);
1108
1109 }
1110
1111 // Scroll to element button effect
1112 function pagelayer_button_element_scroll(jEle) {
1113
1114 var speed = parseInt(jEle.attr('pagelayer_scrollto_speed') * 1000);
1115 var idspacing = 0;
1116 var scrollId = jEle.attr('pagelayer_scrollto_id');
1117
1118 if(jEle.attr('pagelayer_scrollto_type') == 'toid'){
1119
1120 var scrolltoEle = pagelayer_query('#' + scrollId);
1121
1122 if(pagelayer_empty(scrollId) || scrolltoEle.length < 1){
1123 return;
1124 }
1125
1126 var idpos = parseInt(scrolltoEle.offset().top);
1127 var spacing = parseInt(jEle.attr('pagelayer_scrollto_id_viewport'));
1128
1129 if (isNaN(spacing)) {
1130 spacing = 0;
1131 }
1132
1133 idspacing = idpos + spacing;
1134
1135 }
1136
1137 jEle.on('click', function (e) {
1138 e.preventDefault();
1139 pagelayer_query('html, body').animate({ scrollTop: idspacing }, speed);
1140 });
1141
1142 }
1143
1144 ////////////
1145 // Freemium
1146 ////////////
1147
1148 // Contact Form handler - Premium
1149 function pagelayer_contact_form(jEle){
1150
1151 jEle = jQuery(jEle);
1152 var id = jEle.attr('pagelayer-id');
1153
1154 // Set pagelayer id to input field
1155 jEle.find('form input[name="cfa-pagelayer-id"]').val(id);
1156
1157 }
1158
1159 // Contact Form Submit handler - Premium
1160 function pagelayer_contact_submit(jEle, e){
1161 e.preventDefault();
1162
1163 // Checking for required checkboxes.
1164 for(var checkbox_div of jQuery(jEle).find('.pagelayer-contact-checkbox')){
1165 checkbox_div = jQuery(checkbox_div);
1166 if(checkbox_div.attr('required') == 'required'){
1167 if(pagelayer_empty(checkbox_div.find('input:checked').length)){
1168 alert('Kindly select the required checkbox');
1169 return;
1170 }
1171 }
1172 }
1173
1174 // Trigger an action
1175 jQuery(document).trigger('pagelayer_contact_submit', e, jEle);
1176
1177 // Disabling submit button with loading animation.
1178 jQuery(jEle).find('.pagelayer-contact-submit-btn').prop('disabled', true);
1179 jQuery(jEle).find('.pagelayer-contact-submit-btn .fa-spin').show('0.6');
1180
1181 //var fdata = jQuery(jEle).closest('form').serialize();
1182 var redirect = jQuery(jEle).find('input[name="cfa-redirect"]');
1183 var formData = new FormData( jQuery(jEle)[0] );
1184 var par = jQuery(jEle).parent();
1185
1186 // Append the nonce
1187 formData.append('pagelayer_nonce', pagelayer_global_nonce);
1188
1189 // Hide any message
1190 par.find(".pagelayer-message-box").hide();
1191
1192 // Message pos to use ?
1193 var msg_pos = 'top';
1194 if(par.parent().hasClass('pagelayer-message-box-bottom')){
1195 msg_pos = 'bottom';
1196 }
1197
1198 par.find(".pagelayer-message-box").removeClass('pagelayer-cf-msg-err pagelayer-cf-msg-suc');
1199
1200 jQuery.ajax({
1201 url: pagelayer_ajaxurl+'action=pagelayer_contact_submit',
1202 type: "POST",
1203 data: formData,
1204 processData: false,
1205 contentType: false,
1206 cache:false,
1207 success:function(result){
1208 var json = jQuery.parseJSON(result);
1209
1210 jQuery(jEle).find('.pagelayer-contact-submit-btn').prop('disabled', false);
1211 jQuery(jEle).find('.pagelayer-contact-submit-btn .fa-spin').hide('0.6');
1212
1213 if('success' in json){
1214 par.find(".pagelayer-message-"+msg_pos).addClass('pagelayer-cf-msg-suc').html(json['success']).fadeIn();
1215
1216 if(redirect.length > 0 && !pagelayer_empty(redirect.val())){
1217 window.location.href = redirect.val();
1218 }
1219 }else{
1220 par.find(".pagelayer-message-"+msg_pos).addClass('pagelayer-cf-msg-err').html(json['failed']).fadeIn();
1221 }
1222 },
1223 error:function(result){
1224 par.find(".pagelayer-message-"+msg_pos).addClass('pagelayer-cf-msg-err').html(json['failed']).fadeIn();
1225 }
1226 });
1227 jEle.reset();
1228
1229 jQuery(jEle).find('.pagelayer-recaptcha').each(function(){
1230 var widgetID = jQuery(this).attr('recaptcha-widget-id');
1231
1232 if(!pagelayer_empty(window.grecaptcha)){
1233 grecaptcha.reset(widgetID);
1234 }
1235 });
1236
1237 return false;
1238 }
1239
1240 // Primary Menu Handler - Premium
1241 function pagelayer_primary_menu(jEle){
1242
1243 var container = jEle.find('.pagelayer-wp-menu-container');
1244 var menu_bar = jEle.find('.pagelayer-primary-menu-bar i');
1245 var menu_holder = jEle.find('.pagelayer-wp-menu-holder');
1246 var layout = menu_holder.attr('data-layout');
1247 var submenu_ind = menu_holder.attr('data-submenu_ind');
1248 var responsive = menu_holder.attr('data-responsive');
1249 var drop_breakpoint = menu_holder.attr('data-drop_breakpoint');
1250 var close = jEle.find('.pagelayer-wp_menu-close');
1251
1252 var media_mode = pagelayer_get_media_mode();
1253
1254 if( (drop_breakpoint == 'tablet' && (media_mode == 'tablet' || media_mode == 'mobile')) || (drop_breakpoint == 'mobile' && media_mode == 'mobile') ){
1255
1256 menu_holder.addClass('pagelayer-wp-menu-dropdown');
1257 container.addClass('pagelayer-menu-type-dropdown');
1258 container.removeClass('pagelayer-menu-type-'+layout);
1259 layout = 'dropdown';
1260
1261 }else{
1262 menu_holder.removeClass('pagelayer-wp-menu-dropdown');
1263 container.removeClass('pagelayer-menu-type-dropdown');
1264 container.addClass('pagelayer-menu-type-'+layout);
1265 }
1266
1267 // Set mega menu width
1268 // Wait for all other animations to finish
1269 setTimeout(function(){
1270
1271 container.find('.pagelayer-mega-menu-item, .pagelayer-mega-column-item').each(function(){
1272
1273 var liEle = jQuery(this),
1274 lEle = liEle.find('.pagelayer-nav_menu_item').first(),
1275 megaHolder = lEle.closest('.pagelayer-mega-menu'),
1276 setClass = 'pagelayer-set-position';
1277
1278 if(liEle.hasClass('pagelayer-mega-column-item')){
1279 megaHolder = liEle.children('.sub-menu');
1280 }
1281
1282 if(megaHolder.length < 1){
1283 return;
1284 }
1285
1286 var Css = {};
1287
1288 // Remove all css settings
1289 jQuery(document).unbind('scroll.megaMenu');
1290 megaHolder.css({'width' : '', 'left' : '', 'max-width' : '', 'max-height' : ''});
1291
1292 if(layout == 'dropdown'){
1293 return;
1294 }
1295
1296 // Set active to get position
1297 megaHolder.addClass(setClass);
1298
1299 var megaLeft = megaHolder.offset().left,
1300 megaWidth = lEle.attr('pagelayer-mega-width'),
1301 wContainer = lEle.closest('.pagelayer-wp-menu-container'),
1302 megaCustomWidth = lEle.attr('pagelayer-mega-custom-width') || '',
1303 widthEle;
1304
1305 // Is vertical menu?
1306 if(layout == 'vertical'){
1307 var docWidth = jQuery('body').width();
1308 var vWidth = docWidth - megaLeft;
1309
1310 Css['max-width'] = vWidth;
1311 Css['width'] = vWidth;
1312
1313 if(megaWidth == 'custom'){
1314 Css['width'] = megaCustomWidth;
1315 }
1316
1317 megaHolder.css(Css);
1318 megaHolder.removeClass(setClass);
1319 return;
1320 }
1321
1322 var megaMenuHeight = function(e){
1323
1324 if(!pagelayer_empty(e) && megaHolder.is(':visible')){
1325 return;
1326 }
1327
1328 var windowHeight = jQuery(window).height();
1329 var ulBottom = megaHolder.closest('.pagelayer-wp_menu-ul')[0].getBoundingClientRect().bottom;
1330 megaHolder.css('max-height', windowHeight - ulBottom);
1331 };
1332
1333 megaMenuHeight();
1334 jQuery(document).on('scroll.megaMenu', megaMenuHeight);
1335
1336 switch(megaWidth){
1337 case 'row_container':
1338 widthEle = lEle.closest('.pagelayer-row[pagelayer-id]');
1339 Css['width'] = widthEle.width();
1340 break;
1341 case 'custom':
1342 widthEle = lEle.closest('li');
1343 Css['width'] = megaCustomWidth;
1344 break;
1345 default :
1346 widthEle = wContainer;
1347 Css['width'] = widthEle.width();
1348 }
1349
1350 if(widthEle.length > 0){
1351 var wLeft = widthEle.offset().left;
1352
1353 if( wLeft < megaLeft ){
1354 Css['left'] = (wLeft) - (megaLeft);
1355 }
1356
1357 }
1358
1359 megaHolder.css(Css);
1360 var mRect = megaHolder[0].getBoundingClientRect();
1361 var wRect = wContainer[0].getBoundingClientRect();
1362
1363 // Set mega menu position
1364 if(megaWidth != 'custom' || mRect.right < wRect.right){
1365 megaHolder.removeClass(setClass);
1366 return;
1367 }
1368
1369 var left = parseInt(megaHolder.css('left'));
1370 var moveLeft = mRect.right - wRect.right;
1371
1372 if(mRect.left < moveLeft){
1373 moveLeft = moveLeft - (moveLeft - mRect.left);
1374 }
1375
1376 left = left - moveLeft;
1377 megaHolder.css({'left': left});
1378 megaHolder.removeClass(setClass);
1379 });
1380
1381 }, 500);
1382
1383 // Menu toggle
1384 var toggle_class;
1385 jQuery(menu_bar).unbind('click');
1386 jQuery(menu_bar).click(function(){
1387 jQuery(container).toggleClass('pagelayer-togglt-on');
1388
1389 toggle_class = jQuery(this).data('icon');
1390 toggle_class = ( pagelayer_empty(toggle_class) ? 'fas fa-bars' : toggle_class );
1391
1392 if(jQuery(container).hasClass('pagelayer-togglt-on')){
1393 jQuery(this).removeClass(toggle_class);
1394 jQuery(this).addClass('fas fa-times');
1395 }else{
1396 jQuery(this).removeClass('fas fa-times');
1397 jQuery(this).addClass(toggle_class);
1398 }
1399 });
1400
1401 // If has sub-menu the as icon
1402 var sub_menuEle = jQuery(container).find('.pagelayer-wp_menu-ul li.menu-item-has-children:not(.pagelayer-mega-menu-item), .pagelayer-wp_menu-ul li.pagelayer-mega-menu-item');
1403
1404 var aEle_sub_menu = sub_menuEle.children('a');
1405 var afterIconSpan = aEle_sub_menu.children('.after-icon')
1406 if (aEle_sub_menu.children('.after-icon').length < 1) {
1407 aEle_sub_menu.append('<span class="after-icon fa fa-' + submenu_ind + '"></span>');
1408 }else{
1409 // For gutenberg
1410 afterIconSpan.attr('class', 'after-icon fa fa-' + submenu_ind);
1411 }
1412
1413 // Toggle Sub nav
1414 var after_icon = jQuery(container).find('.pagelayer-wp_menu-ul li.menu-item-has-children .after-icon, .pagelayer-wp_menu-ul li.pagelayer-mega-menu-item .after-icon');
1415
1416 after_icon.unbind('click');
1417 after_icon.click(function(e){
1418 e.preventDefault();
1419 if(window.matchMedia("(max-width: "+pagelayer_settings['tablet_breakpoint']+"px)").matches || layout != 'horizontal'){
1420 jQuery(this).closest('li').toggleClass('pagelayer-active-sub-menu');
1421
1422 }else{
1423 jQuery(this).closest('li').removeClass('pagelayer-active-sub-menu');
1424 }
1425 });
1426
1427 close.unbind('click');
1428 close.click(function(){
1429 jQuery(container).toggleClass('pagelayer-togglt-on');
1430 jQuery(menu_bar).removeClass('fas fa-times');
1431 jQuery(menu_bar).addClass(toggle_class);
1432 });
1433
1434 // To edit the mega menu in live editor
1435 jQuery(document).trigger('pagelayer_primary_menu_setup_end', [jEle]);
1436 }
1437
1438 var count_int ={};
1439 // Show countdown render
1440 function pagelayer_countdown(jEle){
1441
1442 var expiry_date = jEle.find('.pagelayer-countdown-container').attr('pagelayer-expiry-date');
1443 var timetype = jEle.find('.pagelayer-countdown-container').attr('pagelayer-time-type');
1444 var jEle_id = jEle.attr('pagelayer-id');
1445
1446 if(pagelayer_empty(expiry_date) || expiry_date == "{{date}}"){
1447 var expiry_date = new Date(new Date().getTime() + 24 * 60 * 60 * 1000);
1448 }
1449
1450 var now;
1451 if(timetype == "server"){
1452 now = new Date(pagelayer_server_time*1000).getTime();
1453 }else{
1454 now = new Date().getTime();
1455 }
1456
1457 var countDownDate = new Date(expiry_date).getTime();
1458 var distance = countDownDate - now;
1459
1460 clearInterval(count_int[jEle_id]);
1461 count_int[jEle_id] = setInterval(function() {
1462
1463 // Time calculations for days, hours, minutes and seconds
1464 var days = Math.floor(distance / (1000 * 60 * 60 * 24));
1465 var hours = Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
1466 var minutes = Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60));
1467 var seconds = Math.floor((distance % (1000 * 60)) / 1000);
1468
1469 jEle.find('.pagelayer-days-count').html(days);
1470 jEle.find('.pagelayer-hours-count').html(hours);
1471 jEle.find('.pagelayer-minutes-count').html(minutes);
1472 jEle.find('.pagelayer-seconds-count').html(seconds);
1473
1474 // If the count down is over, write some text
1475 if(distance < 0) {
1476 clearInterval(count_int[jEle_id]);
1477 jEle.find('.pagelayer-countdown-expired').show();
1478 jEle.find('.pagelayer-countdown-counter').hide();
1479 }
1480
1481 distance = distance - 1000;
1482
1483 }, 1000);
1484 }
1485
1486 function pagelayer_pl_testimonial_slider(jEle){
1487 var ul = jEle.find('.pagelayer-testimonials-holder');
1488
1489 // Build the options
1490 var options = pagelayer_fetch_dataAttrs(ul, 'data-slides-');
1491
1492 pagelayer_owl_init(jEle, ul, options);
1493 }
1494
1495 var pagelayerAnimTimer = {};
1496 function pagelayer_anim_heading(jEle){
1497 var animationDelay = 2500,
1498 //loading bar effect
1499 barAnimationDelay = 3800,
1500 barWaiting = barAnimationDelay - 3000, //3000 is the duration of the transition on the loading bar - set in the scss/css file
1501 //letters effect
1502 lettersDelay = 50,
1503 //type effect
1504 typeLettersDelay = 150,
1505 selectionDuration = 500,
1506 typeAnimationDelay = selectionDuration + 800,
1507 //clip effect
1508 revealDuration = 600,
1509 revealAnimationDelay = 1500;
1510
1511 var id = jEle.attr('pagelayer-id');
1512
1513 if(pagelayer_empty(pagelayerAnimTimer[id])){
1514 pagelayerAnimTimer[id] = {};
1515 }
1516
1517 // Clear the previous animations
1518 for( var time in pagelayerAnimTimer[id] ){
1519 clearTimeout(pagelayerAnimTimer[id][time]);
1520 }
1521
1522 initHeadline();
1523
1524 function initHeadline(){
1525
1526 // Re-set styles
1527 jEle.find('.pagelayer-aheading-holder').find('span').css('opacity', '');
1528
1529 //insert <i> element for each letter of a changing word
1530 singleLetters(jEle.find('.pagelayer-aheading-holder.letters').find('span'));
1531 //initialise headline animation
1532 animateHeadline(jEle.find('.pagelayer-aheading-holder'));
1533 }
1534
1535 function singleLetters($words){
1536 $words.each(function(){
1537 var word = jQuery(this),
1538 letters = word.text().split(''),
1539 selected = word.hasClass('pagelayer-is-visible');
1540 for (i in letters) {
1541 if(word.parents('.pagelayer-aheading-rotate2').length > 0) letters[i] = '<b>' + letters[i] + '</b>';
1542 letters[i] = (selected) ? '<strong class="pagelayer-aheading-in">' + letters[i] + '</strong>': '<strong>' + letters[i] + '</strong>';
1543 }
1544 var newLetters = letters.join('');
1545 word.html(newLetters).css('opacity', 1);
1546 });
1547 }
1548
1549 function animateHeadline($headlines){
1550 var duration = animationDelay;
1551 $headlines.each(function(){
1552 var headline = jQuery(this);
1553
1554 if(headline.hasClass('pagelayer-aheading-loading-bar')){
1555 duration = barAnimationDelay;
1556 setTimeout(function(){ headline.find('.pagelayer-words-wrapper').addClass('pagelayer-is-loading') }, barWaiting);
1557 }else if(headline.hasClass('pagelayer-aheading-clip')){
1558 var spanWrapper = headline.find('.pagelayer-words-wrapper'),
1559 newWidth = spanWrapper.width() + 10;
1560 spanWrapper.css('width', newWidth);
1561 } else if (!headline.hasClass('type') ){
1562 var words = headline.find('.pagelayer-words-wrapper span'),
1563 width = 0;
1564 words.each(function(){
1565 var wordWidth = jQuery(this).width();
1566 if (wordWidth > width) width = wordWidth;
1567 });
1568 headline.find('.pagelayer-words-wrapper').css('width', width);
1569 };
1570
1571 //trigger animation
1572 setTimeout(function(){
1573 hideWord( headline.find('.pagelayer-is-visible').eq(0) );
1574 }, duration);
1575 });
1576 }
1577
1578 function hideWord($word){
1579 var nextWord = takeNext($word);
1580
1581 if($word.parents('.pagelayer-aheading-holder').hasClass('letters')){
1582 var bool = ($word.children('strong').length >= nextWord.children('strong').length) ? true : false;
1583 hideLetter($word.find('strong').eq(0), $word, bool, lettersDelay);
1584 showLetter(nextWord.find('strong').eq(0), nextWord, bool, lettersDelay);
1585
1586 }else if($word.parents('.pagelayer-aheading-holder').hasClass('pagelayer-aheading-clip')){
1587 $word.parents('.pagelayer-words-wrapper').animate({ width : '2px' }, revealDuration, function(){
1588 switchWord($word, nextWord);
1589 showWord(nextWord);
1590 });
1591
1592 }else if($word.parents('.pagelayer-aheading-holder').hasClass('pagelayer-aheading-loading-bar')){
1593 $word.parents('.pagelayer-words-wrapper').removeClass('pagelayer-is-loading');
1594 switchWord($word, nextWord);
1595
1596 clearTimeout(pagelayerAnimTimer[id][0]);
1597 pagelayerAnimTimer[id][0] = setTimeout(function(){
1598 hideWord(nextWord);
1599 }, barAnimationDelay);
1600 clearTimeout(pagelayerAnimTimer[id][1]);
1601 pagelayerAnimTimer[id][1] = setTimeout(function(){
1602 $word.parents('.pagelayer-words-wrapper').addClass('pagelayer-is-loading');
1603 }, barWaiting);
1604
1605 }else{
1606 switchWord($word, nextWord);
1607 clearTimeout(pagelayerAnimTimer[id][2]);
1608 pagelayerAnimTimer[id][2] = setTimeout(function(){
1609 hideWord(nextWord) ;
1610 }, animationDelay);
1611 }
1612 }
1613
1614 function showWord($word, $duration){
1615 if($word.parents('.pagelayer-aheading-holder').hasClass('pagelayer-aheading-clip')){
1616 $word.parents('.pagelayer-words-wrapper').animate({ 'width' : $word.width() + 10 }, revealDuration, function(){
1617 clearTimeout(pagelayerAnimTimer[id][3]);
1618 pagelayerAnimTimer[id][3] = setTimeout(function(){
1619 hideWord($word);
1620 }, revealAnimationDelay);
1621 });
1622 }
1623 }
1624
1625 function hideLetter($letter, $word, $bool, $duration){
1626 $letter.removeClass('pagelayer-aheading-in').addClass('pagelayer-aheading-out');
1627
1628 if(!$letter.is(':last-child')){
1629 clearTimeout(pagelayerAnimTimer[id][4]);
1630 pagelayerAnimTimer[id][4] = setTimeout(function(){
1631 hideLetter($letter.next(), $word, $bool, $duration);
1632 }, $duration);
1633 }else if($bool){
1634 clearTimeout(pagelayerAnimTimer[id][5]);
1635 pagelayerAnimTimer[id][5] = setTimeout(function(){
1636 hideWord(takeNext($word));
1637 }, animationDelay);
1638 }
1639
1640 if($letter.is(':last-child') && pagelayer_query('html').hasClass('pagelayer-no-csstransitions')){
1641 var nextWord = takeNext($word);
1642 switchWord($word, nextWord);
1643 }
1644 }
1645
1646 function showLetter($letter, $word, $bool, $duration){
1647 $letter.addClass('pagelayer-aheading-in').removeClass('pagelayer-aheading-out');
1648
1649 if(!$word.hasClass('pagelayer-is-visible')){
1650 $word.parent().children().removeClass('pagelayer-is-visible');
1651 $word.addClass('pagelayer-is-visible');
1652 }
1653
1654 if(!$letter.is(':last-child')){
1655 clearTimeout(pagelayerAnimTimer[id][6]);
1656 pagelayerAnimTimer[id][6] = setTimeout(function(){
1657 showLetter($letter.next(), $word, $bool, $duration);
1658 }, $duration);
1659 }else{
1660 if(!$bool) {
1661 clearTimeout(pagelayerAnimTimer[id][7]);
1662 pagelayerAnimTimer[id][7] = setTimeout(function(){
1663 hideWord($word);
1664 }, animationDelay)
1665 }
1666 }
1667 }
1668
1669 function takeNext($word){
1670 return (!$word.is(':last-child')) ? $word.next() : $word.parent().children().eq(0);
1671 }
1672
1673 function switchWord($oldWord, $newWord){
1674 $oldWord.removeClass('pagelayer-is-visible').addClass('pagelayer-is-hidden');
1675 if(!$newWord.hasClass('pagelayer-is-visible')){
1676 $newWord.removeClass('pagelayer-is-hidden').addClass('pagelayer-is-visible');
1677 }
1678 }
1679 }
1680
1681 var pagelayerSetInterval = {};
1682 function pagelayer_pl_row_slider(jEle){
1683 var index = 0;
1684
1685 var id = jEle.closest('[pagelayer-id]').attr('pagelayer-id');
1686 var imageEls = jEle.find('.pagelayer-bgimg-slide'); // Get the images to be cycled.
1687 var speed = parseFloat(jEle.attr('data-speed')); // Get the speed of loop.
1688 imageEls.first().addClass('pagelayer-slide-show');
1689
1690 clearInterval(pagelayerSetInterval[id]);
1691 pagelayerSetInterval[id] = setInterval(function (){
1692 // Get the next index. If at end, restart to the beginning.
1693 index = index + 1 < imageEls.length ? index + 1 : 0;
1694
1695 // Show the next
1696 imageEls.eq(index).addClass('pagelayer-slide-show');
1697
1698 // Hide the previous
1699 imageEls.eq(index - 1).removeClass('pagelayer-slide-show');
1700 }, speed);
1701 }
1702
1703 function pagelayer_pl_social_profile(jEle){
1704 var icon_holder = jEle.find('.pagelayer-icon-holder');
1705
1706 // Assigning animation classes to icon holder
1707 if(!pagelayer_empty(jEle.attr('pagelayer-animation'))){
1708 icon_holder.addClass('pagelayer-animation-'+jEle.attr('pagelayer-animation'));
1709 }
1710 }
1711
1712 // Post infinite scroll handler
1713 function pagelayer_infinite_posts(jEle) {
1714
1715 var loader = jEle.find('.pagelayer-btn-load');
1716 var autoScroll = jEle.find('.pagelayer-infinite-scroll-auto').length < 1;
1717
1718 loader.on('click', function(){
1719
1720 var bEle = jQuery(this);
1721 var loaded = jEle.attr('pagelayer-post-data-loading');
1722
1723 // Is loading?
1724 if(!pagelayer_empty(loaded)){
1725 return;
1726 }
1727
1728 jEle.attr('pagelayer-post-data-loading', 1);
1729
1730 var current = bEle.attr('data-current') || 1;
1731 var nextPage = parseInt(current) + 1;
1732 var load_btn = jEle.find('.pagelayer_load_button');
1733
1734 bEle.hide();
1735 load_btn.find('.pagelayer-loader-holder').show();
1736
1737 if(jEle.find('.pagelayer-post-max').attr('data-max') <= 1) {
1738 load_btn.text(load_btn.data('text'));
1739 return;
1740 }
1741
1742 // Get Data from local variable
1743 var data = window['pagelayer_local_scripts']['pagelayer_post_' + jEle.attr("pagelayer-id")];
1744
1745 // Add next page number to load
1746 if(!pagelayer_empty(data.atts)){
1747 data.atts['paged'] = nextPage;
1748 }
1749
1750 // Get the Posts
1751 jQuery.ajax({
1752 url: pagelayer_ajaxurl + 'action=pagelayer_infinite_posts',
1753 type: 'POST',
1754 data: {
1755 pagelayer_nonce: pagelayer_global_nonce,
1756 data: data,
1757 },
1758 success: function(result){
1759
1760 var json = jQuery.parseJSON(result);
1761 var content = jQuery(json['posts']).find('.pagelayer-posts-container').html();
1762
1763 jEle.find('.pagelayer-posts-container').append(content);
1764
1765 load_btn.find('.pagelayer-loader-holder').hide();
1766
1767 if (jEle.find('.pagelayer-post-max').attr('data-max') == nextPage) {
1768 load_btn.text(load_btn.data('text'));
1769 }else if(autoScroll){
1770 bEle.show();
1771 }
1772
1773 bEle.attr('data-current', nextPage);
1774 },
1775 complete: function(){
1776 jEle.removeAttr('pagelayer-post-data-loading');
1777 }
1778 });
1779
1780 });
1781
1782 // If already scrolled
1783 if(pagelayer_isVisible(loader)){
1784 loader.click();
1785 }
1786
1787 // Auto scroll?
1788 if(autoScroll){
1789 return;
1790 }
1791
1792 var win = jQuery(pagelayerGetCurrentWindow());
1793
1794 win.on('scroll.archive_posts', function(){
1795 var current = parseInt(loader.attr('data-current')) || 1;
1796 var total = loader.attr('data-max');
1797
1798 if(win.scrollTop() + win.height() < jEle.height() || current >= total) {
1799 return;
1800 }
1801
1802 loader.click();
1803 });
1804
1805 }
1806
1807 ////////////////
1808 // Freemium End
1809 ////////////////
1810