1/* Elementor hooks - editor - frontend */ 2 3'use strict'; 4 5( function ( $, w ) { 6 7 var $window = $( w ); 8 9 $window.on( 'elementor/frontend/init', function() { 10 11 var SectionExtends = elementorModules.frontend.handlers.Base.extend( { 12 13 onInit: function onInit() { 14 15 elementorModules.frontend.handlers.Base.prototype.onInit.apply( this, arguments ); 16 this.initSectionExtends(); 17 18 }, 19 isBreakingBad: function() { 20 21 return this.$element.hasClass( 'ob-is-breaking-bad' ); 22 23 }, 24 /* needed for Inner Section stickyness */ 25 isInnerSection: function() { 26 return this.$element.hasClass( 'elementor-inner-section' ); 27 }, 28 onElementChange: function( changedProp ) { 29 30 // Breaking Bad 31 if( changedProp === '_ob_bbad_use_it' ) { 32 if( 'yes' === this.getElementSettings( '_ob_bbad_use_it' ) ) { 33 this.$element.addClass( 'ob-is-breaking-bad' ); 34 if( this.isInnerSection() ) this.$element.addClass( 'ob-bb-inner' ); 35 } 36 else { 37 this.$element.removeClass( 'ob-is-breaking-bad' ); 38 if( this.isInnerSection() ) this.$element.removeClass( 'ob-bb-inner' ); 39 } 40 } 41 // Inner Section 42 if( changedProp === '_ob_bbad_sssic_use' && this.isInnerSection() ) { 43 if( 'yes' === this.getElementSettings( '_ob_bbad_sssic_use' ) ) this.$element.addClass( 'ob-is-sticky-inner-section' ); 44 else this.$element.removeClass( 'ob-is-sticky-inner-section' ); 45 } 46 47 }, 48 49 initSectionExtends: function() { 50 51 if( this.isEdit ) { 52 // Breaking Bad 53 if( 'yes' === this.getElementSettings( '_ob_bbad_use_it' ) && ! this.isBreakingBad() ) { 54 this.$element.addClass( 'ob-is-breaking-bad' ); 55 if( this.isInnerSection() ) this.$element.addClass( 'ob-bb-inner' ); 56 } 57 } 58 // Sticky Inner Section - identical for both front-and-back-end 59 if( 'yes' === this.getElementSettings( '_ob_bbad_sssic_use' ) && this.isInnerSection() ) { 60 if( this.isEdit ) this.$element.addClass( 'ob-is-sticky-inner-section' ); 61 // find first wrapping element; must match some class name(s) 62 var parent_wrapper = this.$element.closest( '.elementor-widget-wrap' ); 63 if( parent_wrapper.length ) parent_wrapper.addClass( 'ob-sssic-wrapper' ); 64 } 65 }, 66 67 } ); 68 69 var ColumnExtends = elementorModules.frontend.handlers.Base.extend( { 70 71 onInit: function onInit() { 72 73 elementorModules.frontend.handlers.Base.prototype.onInit.apply( this, arguments ); 74 // is E3.0 column? 75 76 // Teleporter issue with Chrome 77 var ua = navigator.userAgent.toLowerCase(); 78 if( ua.indexOf( 'chrome' ) > -1 ) this.teleporterChromeResize(); 79 // columns... 80 this.initColumnExtends(); 81 82 }, 83 teleporterChromeResize: function() { 84 85 if( ! this.isTeleporter() ) return; 86 87 var dis = this; 88 var myID = this.$element.attr( 'data-id' ); 89 $window.on( 'resize', function() { 90 dis.$element.closest( '.ob-is-teleporter' ).addClass( 'ob-chrome-resize' ); 91 clearTimeout( myID ); 92 myID = setTimeout( function() { 93 var column_height = parseInt( dis.$element.closest( '.ob-is-teleporter' ).css( 'height' ) ); 94 var col_wrap = ""; 95 if( col_wrap.length ) col_wrap.css( { 'height': column_height } ); 96 else { 97 dis.$element.find( '.elementor-widget-wrap' ).first().css( { 'height': column_height } ); 98 } 99 dis.$element.closest( '.ob-is-teleporter' ).removeClass( 'ob-chrome-resize' ); 100 }, 500 ); 101 } ); 102 $window.trigger( 'resize' ); 103 104 }, 105 /* Teleporter */ 106 isTeleporter: function() { 107 return this.$element.hasClass( 'ob-is-teleporter' ); 108 }, 109 /* Widget Stalker */ 110 isWidgetStalkerCol: function() { 111 return this.$element.hasClass( 'ob-is-stalker' ); 112 }, 113 initColumnExtends: function() { 114 /* breaking bad */ 115 116 function getSafeUrl(url) { 117 try { 118 var parsed = new URL(url, window.location.origin); 119 var allowedProtocols = ['http:', 'https:', 'mailto:', 'tel:']; 120 121 if (!allowedProtocols.includes(parsed.protocol)) { 122 return false; 123 } 124 125 return parsed.href; 126 } catch (e) { 127 return false; 128 } 129 } 130 if( ! this.isEdit ) { 131 var bb_settings = {}; 132 try { 133 bb_settings = JSON.parse( this.$element.attr( 'data-settings' ) ); 134 } catch ( error ) { 135 return; 136 } 137 // handle links 138 if( undefined !== bb_settings._ob_bbad_link ) { 139 140 var bb_link = bb_settings._ob_bbad_link; 141 142 if( ! bb_link.url || bb_link.url === '' ) { 143 this.$element.removeClass( 'bb-column-link' ); 144 return; 145 } 146 147 // Validate URL before using 148 var safeUrl = getSafeUrl( bb_link.url ); 149 150 if ( ! safeUrl ) { 151 this.$element.removeClass( 'bb-column-link' ); 152 return; 153 } 154 155 this.$element.addClass( 'bb-column-link' ); 156 this.$element.off( 'click.bb' ); 157 158 this.$element.on( 'click.bb', function() { 159 if( bb_link.is_external ) { 160 window.open( safeUrl, '_blank', 'noopener,noreferrer' ); 161 } else { 162 window.location.href = safeUrl; 163 } 164 } ); 165 } 166 } 167 /* Teleporter */ 168 if( this.isEdit && 'use-teleporter' === this.getElementSettings( '_ob_teleporter_use' ) ) { 169 this.$element.addClass( 'ob-is-teleporter' ); 170 this.$element.find( '.elementor-widget-wrap' ).first().addClass( 'ob-tele-midget' ); 171 this.doTeleporterEditor(); 172 } 173 if( ! this.isEdit && this.isTeleporter() ) { 174 this.$element.find( '.elementor-widget-wrap' ).first().addClass( 'ob-tele-midget' ); 175 this.doTeleporter(); 176 } 177 /* Widget Stalker */ 178 if( this.isEdit && 'yes' === this.getElementSettings( '_ob_bbad_is_stalker' ) ) { 179 this.$element.addClass( 'ob-is-stalker' ); 180 } 181 }, 182 onElementChange: function( changedProp ) { 183 184 if( changedProp === '_ob_teleporter_overlay_color' ) { 185 this.$element.find( 'div[class*="ob-teleporter-"] > .ob-tele-overlay' ).css( 'background-color', this.getElementSettings( '_ob_teleporter_overlay_color' ) ); 186 } else if( changedProp === '_ob_teleporter_no_pass_tablet' ) { 187 if( 'no-tablet' === this.getElementSettings( '_ob_teleporter_no_pass_tablet' ) ) 188 this.$element.addClass( 'ob-tele-no-tablet' ); 189 else 190 this.$element.removeClass( 'ob-tele-no-tablet' ); 191 } else if( changedProp === '_ob_teleporter_no_pass_mobile' ) { 192 if( 'no-mobile' === this.getElementSettings( '_ob_teleporter_no_pass_mobile' ) ) 193 this.$element.addClass( 'ob-tele-no-mobile' ); 194 else 195 this.$element.removeClass( 'ob-tele-no-mobile' ); 196 } 197 /* Widget Stalker */ 198 if( changedProp === '_ob_bbad_is_stalker' ) { 199 this.routeWidgetStalkerCol(); 200 } 201 }, 202 /* Widget Stalker */ 203 routeWidgetStalkerCol: function() { 204 if( ! this.isWidgetStalkerCol() && 'yes' === this.getElementSettings( '_ob_bbad_is_stalker' ) ) this.$element.addClass( 'ob-is-stalker' ); 205 else this.$element.removeClass( 'ob-is-stalker' ); 206 }, 207 /* Teleporter */ 208 doTeleporterEditor: function() { 209 210 if( 'use-teleporter' !== this.getElementSettings( '_ob_teleporter_use' ) ) return; // bail 211 212 // E3.0+ wrap the children of .elementor-widget-wrap for the animation purpose 213 var widgets_wrapper = this.$element.find( '.elementor-widget-wrap' ).first(); 214 if( widgets_wrapper.length ) { 215 widgets_wrapper.wrapInner( '<div class="widget-wrap-children" />' ); 216 if( widgets_wrapper.find( '.elementor-background-overlay' ).first().length ) { 217 widgets_wrapper.find( '.elementor-background-overlay' ).first().insertBefore( widgets_wrapper.find( '.elementor-background-overlay' ).first().parent() ); 218 } 219 } 220 221 if( 'do-pass' !== this.getElementSettings( '_ob_teleporter_pass' ) ) return; // bail too 222 223 var this_ob = this; 224 var myself = this.$element; 225 var my_id = this.$element.attr( 'data-id' ); 226 227 // default classes 228 if( 'no-tablet' === this.getElementSettings( '_ob_teleporter_no_pass_tablet' ) ) 229 this.$element.addClass( 'ob-tele-no-tablet' ); 230 if( 'no-mobile' === this.getElementSettings( '_ob_teleporter_no_pass_mobile' ) ) 231 this.$element.addClass( 'ob-tele-no-mobile' ); 232 233 // this column's parent section 234 var parent_section = ( 'section' === this.getElementSettings( '_ob_teleporter_pass_element' ) ) ? this.$element.closest( '.elementor-section' ) : this.$element.closest( '.elementor-container' ); 235 if( ! parent_section.length ) return; // bail 236 237 // parent overflow 238 parent_section.css( 'overflow', 'hidden' ); 239 240 // new element & effect 241 var hover_effect = this.getElementSettings( '_ob_teleporter_pass_effect' ); 242 var hover_element = '<div class="ob-teleporter-' + my_id + ' ob-tele-eff-' + hover_effect + '" data-id-teleporter="' + my_id + '"><div class="ob-tele-overlay" style="background-color: ' + this.getElementSettings( '_ob_teleporter_overlay_color' ) + ';"></div></div>'; 243 244 if( ! $( '.ob-teleporter-' + my_id ).length ) this.$element.prepe
244nd( hover_element ); 245 246 this.$element.off( 'mouseenter mouseleave' ); 247 this.$element.on( 'mouseenter mouseleave', function( ev ) { 248 249 if( 'mouseenter' === ev.type ) { 250 251 if( 'no-tablet' === this_ob.getElementSettings( '_ob_teleporter_no_pass_tablet' ) && 252 'tablet' === elementorFrontend.getCurrentDeviceMode() ) return; // bail 253 if( 'no-mobile' === this_ob.getElementSettings( '_ob_teleporter_no_pass_mobile' ) && 254 'mobile' === elementorFrontend.getCurrentDeviceMode() ) return; // bail 255 if( 'do-pass' !== this_ob.getElementSettings( '_ob_teleporter_pass' ) ) return; 256 257 var tele_css = { 258 'background-color': $( '.ob-teleporter-' + my_id ).css( 'background-color' ), 259 'background-image': $( '.ob-teleporter-' + my_id ).css( 'background-image' ), 260 'background-position': $( '.ob-teleporter-' + my_id ).css( 'background-position' ), 261 'background-size': $( '.ob-teleporter-' + my_id ).css( 'background-size' ), 262 'background-repeat': $( '.ob-teleporter-' + my_id ).css( 'background-repeat' ) 263 }; 264 265 if( 'section' === this_ob.getElementSettings( '_ob_teleporter_pass_element' ) ) { 266 var all_children = parent_section.children().not( '.elementor-container' ).detach(); 267 parent_section.addClass( 'ob-tele-mom-hover' ).prepend( $( '.ob-teleporter-' + my_id ) ); 268 parent_section.prepend( all_children ); 269 } else { 270 parent_section.addClass( 'ob-tele-mom-hover' ).prepend( $( '.ob-teleporter-' + my_id ) ); 271 } 272 273 $( '.ob-teleporter-' + my_id ).css( tele_css ).hide(); 274 $( '.ob-teleporter-' + my_id ).addClass( 'ob-teleporter-hover' ).show(); 275 276 } else { 277 278 parent_section.removeClass( 'ob-tele-mom-hover' ); 279 setTimeout( function() { 280 $( '.ob-teleporter-' + my_id ).removeAttr( 'style' ).removeClass( 'ob-teleporter-hover' ); 281 myself.prepend( $( '.ob-teleporter-' + my_id ) ); 282 }, 100 ); 283 284 } 285 286 } ); 287 288 }, 289 doTeleporter: function() { 290 291 var teleporter_settings = {}; 292 try { 293 teleporter_settings = JSON.parse( this.$element.attr( 'data-settings' ) ); 294 } catch ( error ) { 295 return; 296 } 297 298 if( 'use-teleporter' !== teleporter_settings._ob_teleporter_use ) return; // bail 299 300 // E3.0+ wrap the children of .elementor-widget-wrap for the animation purpose 301 var widgets_wrapper = this.$element.find( '.elementor-widget-wrap' ).first(); 302 if( widgets_wrapper.length ) { 303 widgets_wrapper.wrapInner( '<div class="widget-wrap-children" />' ); 304 if( widgets_wrapper.find( '.elementor-background-overlay' ).first().length ) { 305 widgets_wrapper.find( '.elementor-background-overlay' ).first().insertBefore( widgets_wrapper.find( '.elementor-background-overlay' ).first().parent() ); 306 } 307 } 308 309 var myself = this.$element; 310 var my_id = this.$element.attr( 'data-id' ); 311 312 // default classes 313 if( 'no-tablet' === teleporter_settings._ob_teleporter_no_pass_tablet ) 314 this.$element.addClass( 'ob-tele-no-tablet' ); 315 if( 'no-mobile' === teleporter_settings._ob_teleporter_no_pass_mobile ) 316 this.$element.addClass( 'ob-tele-no-mobile' ); 317 318 function getSafeUrl(url) { 319 try { 320 var parsed = new URL(url, window.location.origin); 321 var allowedProtocols = ['http:', 'https:', 'mailto:', 'tel:']; 322 323 if (!allowedProtocols.includes(parsed.protocol)) { 324 return false; 325 } 326 327 return parsed.href; 328 } catch (e) { 329 return false; 330 } 331 } 332 // handle links 333 if( undefined !== teleporter_settings._ob_teleporter_link ) { 334 335 var tele_link = teleporter_settings._ob_teleporter_link; 336 if( ! tele_link.url || tele_link.url === '' ) { 337 return; 338 } 339 340 var safeUrl = getSafeUrl( tele_link.url ); 341 342 if ( ! safeUrl ) { 343 return; 344 } 345 346 this.$element.off( 'click.obTeleporter' ); 347 this.$element.on( 'click.obTeleporter', function() { 348 if( tele_link.is_external ) { 349 window.open( safeUrl, '_blank', 'noopener,noreferrer' ); 350 } else { 351 window.location.href = safeUrl; 352 } 353 }); 354 355 } 356 357 if( 'do-pass' !== teleporter_settings._ob_teleporter_pass ) return; // bail too 358 359 // this column's parent section 360 var parent_section = ( 'section' === teleporter_settings._ob_teleporter_pass_element ) ? this.$element.closest( '.elementor-section' ) : this.$element.closest( '.elementor-container' ); 361 if( ! parent_section.length ) return; // bail 362 363 // parent overflow 364 parent_section.css( 'overflow', 'hidden' ); 365 366 // new element 367 var hover_effect = teleporter_settings._ob_teleporter_pass_effect; 368 var hover_element = '<div class="ob-teleporter-' + my_id + ' ob-tele-eff-' + hover_effect + '" data-id-teleporter="' + my_id + '"><div class="ob-tele-overlay" style="background-color: ' + teleporter_settings._ob_teleporter_overlay_color + ';"></div>'; 369 370 if( ! $( '.ob-teleporter-' + my_id ).length ) this.$element.prepe
370nd( hover_element ); 371 372 this.$element.off( 'mouseenter mouseleave' ); 373 this.$element.on( 'mouseenter', function() { 374 375 if( 'no-tablet' === teleporter_settings._ob_teleporter_no_pass_tablet && 376 'tablet' === elementorFrontend.getCurrentDeviceMode() ) return; // bail 377 if( 'no-mobile' === teleporter_settings._ob_teleporter_no_pass_mobile && 378 'mobile' === elementorFrontend.getCurrentDeviceMode() ) return; // bail 379 380 var tele_css = { 381 'background-color': $( '.ob-teleporter-' + my_id ).css( 'background-color' ), 382 'background-image': $( '.ob-teleporter-' + my_id ).css( 'background-image' ), 383 'background-position': $( '.ob-teleporter-' + my_id ).css( 'background-position' ), 384 'background-size': $( '.ob-teleporter-' + my_id ).css( 'background-size' ), 385 'background-repeat': $( '.ob-teleporter-' + my_id ).css( 'background-repeat' ) 386 }; 387 388 if( 'section' === teleporter_settings._ob_teleporter_pass_element ) { 389 var all_children = parent_section.children().not( '.elementor-container' ).detach(); 390 parent_section.addClass( 'ob-tele-mom-hover' ).prepend( $( '.ob-teleporter-' + my_id ) ); 391 parent_section.prepend( all_children ); 392 } else parent_section.addClass( 'ob-tele-mom-hover' ).prepend( $( '.ob-teleporter-' + my_id ) ); 393 394 $( '.ob-teleporter-' + my_id ).css( tele_css ).hide(); 395 $( '.ob-teleporter-' + my_id ).show().addClass( 'ob-teleporter-hover' ); 396 397 } ); 398 399 this.$element.on( 'mouseleave', function() { 400 401 parent_section.removeClass( 'ob-tele-mom-hover' ); 402 setTimeout( function() { 403 $( '.ob-teleporter-' + my_id ).removeAttr( 'style' ).removeClass( 'ob-teleporter-hover' ); 404 myself.prepend( $( '.ob-teleporter-' + my_id ) ); 405 }, 100 ); 406 407 } ); 408 409 }, 410 411 } ); 412 413 var handlersList = { 414 415 'section': SectionExtends, 416 'column': ColumnExtends, 417 418 }; 419 420 $.each( handlersList, function( widgetName, handlerClass ) { 421 422 elementorFrontend.hooks.addAction( 'frontend/element_ready/' + widgetName, function( $scope ) { 423 424 elementorFrontend.elementsHandler.addHandler( handlerClass, { $element: $scope } ); 425 426 } ); 427 428 } ); 429 430 } ); 431 432} ( jQuery, window ) );
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.