PageSourceSearch

https://www.easymobilecasino.com/wp-content/themes/enfold/js/shortcodes.js?ver=4.2

js easymobilecasino.com collected 2026-10-04 16:19:04 UTC 161,667 bytes, 5,752 lines download raw bytes

1(function($)
2{	
3    "use strict";
4
5    $(document).ready(function()
6    {	
7    	//global variables that are used on several ocassions
8    	$.avia_utilities = $.avia_utilities || {};
9    	
10    	if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) && 'ontouchstart' in document.documentElement)
11    	{
12    		$.avia_utilities.isMobile =  true;
13    	}
14    	else
15    	{
16    		$.avia_utilities.isMobile =  false;
17    	}
18    
19    	//activate fixed bg fallback for mobile
20    	if($.fn.avia_mobile_fixed)
21		$('.avia-bg-style-fixed').avia_mobile_fixed();
22    	
23    	//activate parallax scrolling for backgrounds.
24    	if($.fn.avia_parallax)
25		$('.av-parallax').avia_parallax();
26    	
27    	//calculate the browser height and append a css rule to the head
28		if($.fn.avia_browser_height)
29		$('.av-minimum-height, .avia-fullscreen-slider, .av-cell-min-height').avia_browser_height();
30		
31		//calculate the height of each video section
32		if($.fn.avia_video_section)
33		 $('.av-section-with-video-bg').avia_video_section();
34		
35		//creates team social icon tooltip
36        new $.AviaTooltip({'class': "avia-tooltip", data: "avia-tooltip", delay:0, scope: "body"});
37		
38		//creates icon element tooltip
39		new $.AviaTooltip({'class': "avia-tooltip avia-icon-tooltip", data: "avia-icon-tooltip", delay:0, scope: "body"});
40
41        activate_shortcode_scripts();
42        
43        //layer slider height helper
44        $('.avia-layerslider').layer_slider_height_helper();
45        
46        //"ajax" portfolio
47        $('.grid-links-ajax').avia_portfolio_preview();
48        
49        // actiavte the masonry script: sorting/loading/etc
50		if($.fn.avia_masonry)
51		$('.av-masonry').avia_masonry();
52		
53		//activate the accordion
54		if($.fn.aviaccordion)
55		$('.aviaccordion').aviaccordion();
56		
57		
58		//activate the accordion
59		if($.fn.avia_textrotator)
60		$('.av-rotator-container').avia_textrotator();
61		
62		//activates the tab section shortcode
63		if($.fn.avia_sc_tab_section)
64		{
65			$('.av-tab-section-container').avia_sc_tab_section();
66		}
67		
68		//activates the hor gallery  shortcode
69		if($.fn.avia_hor_gallery)
70		{
71			$('.av-horizontal-gallery').avia_hor_gallery();
72		}
73		
74		
75		if($.fn.avia_delayed_animation_in_container)
76		{
77			$('.av-animation-delay-container').avia_delayed_animation_in_container();
78		}
79		
80		
81    });
82
83
84
85
86
87// -------------------------------------------------------------------------------------------
88// ACTIVATE ALL SHORTCODES
89// -------------------------------------------------------------------------------------------
90
91	function activate_waypoints(container)
92	{
93		//activates simple css animations of the content once the user scrolls to an elements
94		if($.fn.avia_waypoints)
95		{
96			if(typeof container == 'undefined'){ container = 'body';};
97
98			$('.avia_animate_when_visible', container).avia_waypoints();
99			$('.avia_animate_when_almost_visible', container).avia_waypoints({ offset: '80%'});
100			
101			if(container == 'body') container = '.avia_desktop body';
102			$('.av-animated-generic', container).avia_waypoints({ offset: '95%'});
103		}
104	}
105
106
107    function activate_shortcode_scripts(container)
108	{
109		if(typeof container == 'undefined'){ container = 'body';}
110		
111		//activates the form shortcode
112		if($.fn.avia_ajax_form)
113		{
114			$('.avia_ajax_form:not( .avia-disable-default-ajax )', container).avia_ajax_form();
115		}
116		
117		activate_waypoints(container);
118		
119		//activate the video api
120		if($.fn.aviaVideoApi)
121		{
122			$('.avia-slideshow iframe[src*="youtube.com"], .av_youtube_frame, .avia-slideshow iframe[src*="vimeo.com"], .avia-slideshow video').aviaVideoApi({}, 'li');
123		}
124		
125	    //activates the toggle shortcode
126		if($.fn.avia_sc_toggle)
127		{
128			$('.togglecontainer', container).avia_sc_toggle();
129		}
130		
131		//activates the tabs shortcode
132		if($.fn.avia_sc_tabs)
133		{
134			$('.top_tab', container).avia_sc_tabs();
135			$('.sidebar_tab', container).avia_sc_tabs({sidebar:true});
136		}
137		
138		//activates behavior and animation for gallery
139		if($.fn.avia_sc_gallery)
140		{
141			$('.avia-gallery', container).avia_sc_gallery();
142		}
143		
144		//activates animated number shortcode
145		if($.fn.avia_sc_animated_number)
146		{
147			$('.avia-animated-number', container).avia_sc_animated_number();
148		}
149		
150		//animation for elements that are not connected like icon shortcode
151		if($.fn.avia_sc_animation_delayed)
152		{
153			$('.av_font_icon', container).avia_sc_animation_delayed({delay:100});
154			$('.avia-image-container', container).avia_sc_animation_delayed({delay:100});
155			$('.av-hotspot-image-container', container).avia_sc_animation_delayed({delay:100});
156			$('.av-animated-generic', container).avia_sc_animation_delayed({delay:100});
157		}
158
159		//activates animation for iconlist
160		if($.fn.avia_sc_iconlist)
161		{
162			$('.avia-icon-list.av-iconlist-big', container).avia_sc_iconlist();
163		}
164
165		//activates animation for progress bar
166		if($.fn.avia_sc_progressbar)
167		{
168			$('.avia-progress-bar-container', container).avia_sc_progressbar();
169		}
170
171		//activates animation for testimonial
172		if($.fn.avia_sc_testimonial)
173		{
174			$('.avia-testimonial-wrapper', container).avia_sc_testimonial();
175		}
176		
177		//activate the fullscreen slider
178		$('.avia-slideshow.av_fullscreen', container).aviaFullscreenSlider();
179		
180		//activate the aviaslider
181		$('.avia-slideshow:not(.av_fullscreen)', container).aviaSlider();
182		
183        //content slider
184        $('.avia-content-slider-active', container).aviaSlider({wrapElement: '.avia-content-slider-inner', slideElement:'.slide-entry-wrap', fullfade:true});
185
186        //testimonial slider
187        $('.avia-slider-testimonials', container).aviaSlider({wrapElement: '.avia-testimonial-row', slideElement:'.avia-testimonial', fullfade:true});
188        
189        //load and activate maps
190        if($.fn.aviaMaps)
191        {
192        	$('.avia-google-map-container', container).aviaMaps();
193    	}
194    	
195    	 //load magazine sorting
196        if($.fn.aviaMagazine)
197        {
198        	$('.av-magazine-tabs-active', container).aviaMagazine();
199    	}
200    	
201    	 //load image hotspot
202        if($.fn.aviaHotspots)
203        {
204        	$('.av-hotspot-image-container', container).aviaHotspots();
205    	}
206    	
207    	 //load countdown
208        if($.fn.aviaCountdown)
209        {
210        	$('.av-countdown-timer', container).aviaCountdown();
211    	}
212    	
213		 //load audio player
214		if($.fn.aviaPlayer)
215        {
216        	$('.av-player', container).aviaPlayer();
217    	}
218    	
219    	
220    }
221
222
223
224// -------------------------------------------------------------------------------------------
225// 
226// AVIA Countdown
227// 
228// -------------------------------------------------------------------------------------------
229(function($)
230{ 
231	"use strict";
232	
233	var _units	= ['weeks','days','hours','minutes','seconds'],
234		_second = 1000,
235		_minute = _second * 60,
236		_hour 	= _minute * 60,
237		_day 	= _hour * 24,
238		_week	= _day * 7,	
239		ticker	= function(_self)
240		{
241			var _time		= {},
242				_now 		= new Date(),
243				_timestamp  = _self.end - _now;
244			
245			if(_timestamp <= 0)
246			{
247				clearInterval(_self.countdown);
248				return;
249			}	
250			
251			_self.time.weeks   	= Math.floor( _timestamp / _week);
252			_self.time.days 	= Math.floor((_timestamp % _week) / _day);
253			_self.time.hours	= Math.floor((_timestamp % _day) / _hour); 
254			_self.time.minutes 	= Math.floor((_timestamp % _hour) / _minute); 
255			_self.time.seconds 	= Math.floor((_timestamp % _minute) / _second); 
256			
257			switch(_self.data.maximum)
258			{
259				case 1: _self.time.seconds 	= Math.floor(_timestamp / _second); break;
260				case 2: _self.time.minutes 	= Math.floor(_timestamp / _minute); break;
261				case 3: _self.time.hours	= Math.floor(_timestamp / _hour); 	break;
262				case 4: _self.time.days 	= Math.floor(_timestamp / _day); 	break;
263			}
264			
265			for (var i in _self.time)
266			{	
267				if(typeof _self.update[i] == "object")
268				{
269					if(_self.firstrun || _self.oldtime[i] != _self.time[i])
270					{
271						var labelkey = ( _self.time[i] === 1 ) ? "single" : "multi"; 
272					
273						_self.update[i].time_container.text(_self.time[i]);
274						_self.update[i].label_container.text(_self.update[i][labelkey]);
275					}
276				}
277			}
278			
279			//show ticker
280			if(_self.firstrun) _self.container.addClass('av-countdown-active');
281			
282			_self.oldtime 	= $.extend( {}, _self.time );
283			_self.firstrun	= false;
284		};
285		
286	
287	$.fn.aviaCountdown = function( options )
288	{	
289		if(!this.length) return; 
290
291		return this.each(function()
292		{
293			var _self 			= {};
294			_self.update		= {};
295			_self.time			= {};			
296			_self.oldtime		= {};			
297			_self.firstrun		= true;			
298			
299			_self.container		= $(this);
300			_self.data			= _self.container.data();
301			_self.end			= new Date(_self.data.year, _self.data.month, _self.data.day, _self.data.hour, _self.data.minute );
302			
303			for (var i in _units)
304			{
305				_self.update[_units[i]] = {
306					time_container:  _self.container.find('.av-countdown-' + _units[i] + ' .av-countdown-time'),
307					label_container: _self.container.find('.av-countdown-' + _units[i] + ' .av-countdown-time-label')
308				};
309				
310				if(_self.update[_units[i]].label_container.length)
311				{
312					_self.update[_units[i]].single = _self.update[_units[i]].label_container.data('label');
313					_self.update[_units[i]].multi  = _self.update[_units[i]].label_container.data('label-multi');
314				}
315			}
316			
317			ticker(_self);
318			_self.countdown 	= setInterval(function(){ ticker(_self); }, 1000);
319
320			
321		});
322	};
323	
324	
325	
326}(jQuery));
327
328
329// -------------------------------------------------------------------------------------------
330// 
331// AVIA Player
332// 
333// -------------------------------------------------------------------------------------------
334(function($)
335{ 
336	"use strict";
337	
338	var autostarted = false,
339		container = null,
340	
341		monitorStart = function( container )
342			{
343				var play_pause	= container.find('.av-player-player-container .mejs-playpause-button');
344				
345				if( play_pause.length == 0 )
346				{
347					setTimeout( function(){
348							monitorStart( container );
349						}, 200 );
350				}
351				
352				if( ! play_pause.hasClass('mejs-pause') )
353				{
354					play_pause.trigger( 'click' );
355				}
356				
357			};
358	
359	$.fn.aviaPlayer = function( options )
360	{	
361		if( ! this.length ) return; 
362
363		return this.each(function()
364		{
365			var _self 			= {};
366			
367			_self.container		= $( this );
368			
369			/**
370			 * Limit autostart to the first player with this option set only
371			 * 
372			 * DOM is not loaded completely and we have no event when player is loaded
373			 */
374			if( _self.container.hasClass( 'avia-playlist-autoplay' ) && ! autostarted )
375			{
376				if( ( _self.container.css('display') == 'none') || ( _self.container.css("visibility") == "hidden" ) )
377				{
378					return;
379				}
380				
381				autostarted = true;
382				setTimeout( function(){
383							monitorStart( _self.container );
384						}, 200 );
385			}
386			
387		});
388	};
389}(jQuery));
390
391
392// -------------------------------------------------------------------------------------------
393// 
394// AVIA Image Hotspots
395// 
396// -------------------------------------------------------------------------------------------
397(function($)
398{ 
399	"use strict";
400
401	$.fn.aviaHotspots = function( options )
402	{
403		if(!this.length) return; 
404
405		return this.each(function()
406		{
407			var _self = {};
408			
409			_self.container	= $(this);
410			_self.hotspots	= _self.container.find('.av-image-hotspot');
411			
412				_self.container.on('avia_start_animation', function()
413				{
414					setTimeout(function()
415					{
416						_self.hotspots.each(function(i)
417						{
418							var current = $(this);
419							setTimeout(function(){ current.addClass('av-display-hotspot'); },300 * i);
420						});
421					},400);
422				});
423
424		});
425	};
426	
427}(jQuery));
428
429
430
431
432// -------------------------------------------------------------------------------------------
433// 
434// AVIA Magazine function for magazine sorting
435// 
436// -------------------------------------------------------------------------------------------
437(function($)
438{ 
439	"use strict";
440	
441	var animating = false,
442		methods = {
443		
444		switchMag: function(clicked, _self)
445		{
446			var current 		= $(clicked)
447			
448			if(current.is('.active_sort') || animating) return;
449			
450			var filter			= current.data('filter'),
451				oldContainer	= _self.container.filter(':visible'),
452				newContainer	= _self.container.filter('.' + filter);
453			
454			//switch Class
455			animating = true;
456			_self.sort_buttons.removeClass('active_sort');
457			current.addClass('active_sort');
458			
459			//apply fixed heiht for transition
460			_self.magazine.height(_self.magazine.outerHeight());
461			
462			//switch items
463			oldContainer.avia_animate({opacity:0}
463, 200, function()
464			{
465				oldContainer.css({display:'none'});
466				newContainer.css({opacity:0, display:'block'}).avia_animate({opacity:1}, 150, function()
467				{
468					_self.magazine.avia_animate({height: (newContainer.outerHeight() + _self.sort_bar.outerHeight())}, 150, function()
469					{
470						_self.magazine.height('auto');
471						animating = false;
472					});
473					
474				});
475			});
476		}
477	};
478	
479	
480	$.fn.aviaMagazine = function( options )
481	{
482		if(!this.length) return; 
483
484		return this.each(function()
485		{
486			var _self = {};
487			 
488			_self.magazine		= $(this),
489			_self.sort_buttons 	= _self.magazine.find('.av-magazine-sort a');
490			_self.container		= _self.magazine.find('.av-magazine-group');
491			_self.sort_bar		= _self.magazine.find('.av-magazine-top-bar');
492			
493			_self.sort_buttons.on('click', function(e){ e.preventDefault(); methods.switchMag(this, _self);  } );
494		});
495	}
496	
497}(jQuery));
498
499// -------------------------------------------------------------------------------------------
500// 
501// AVIA MAPS API - loads the google maps api asynchronously 
502// 
503// afterwards applies the map to the container
504// 
505// -------------------------------------------------------------------------------------------
506
507
508(function($)
509{
510    "use strict";
511
512	$.AviaMapsAPI  =  function(options, container)
513	{
514		if(typeof window.av_google_map == 'undefined')
515		{
516			$.avia_utilities.log('Map creation stopped, var av_google_map not found'); 
517			return;
518		}
519	
520		// gatehr container and map data
521		this.container	= container;
522		this.$container	= $( container );
523		this.$body  	= $('body');
524		this.$mapid		= this.$container.data('mapid') - 1; 
525		this.$data		= window.av_google_map[this.$mapid];
526		this.retina 	= window.devicePixelRatio > 1;
527		
528		// set up the whole api object
529		this._init( options );
530	};
531	
532	$.AviaMapsAPI.apiFiles = 
533	{
534		loading: false, 
535		finished: false, 
536		src: ''
537	};
538	
539  	$.AviaMapsAPI.prototype =
540    {
541    	_init: function()
542    	{
543			if( 'undefined' == typeof avia_framework_globals.gmap_maps_loaded || avia_framework_globals.gmap_maps_loaded == '' )
544			{
545						//	this is only a fallback setting 
546				$.AviaMapsAPI.apiFiles.src = 'https://maps.googleapis.com/maps/api/js?v=3.30&callback=aviaOnGoogleMapsLoaded';
547				if( typeof avia_framework_globals.gmap_api != 'undefined' && avia_framework_globals.gmap_api != "" )
548				{
549					$.AviaMapsAPI.apiFiles.src += "&key=" + avia_framework_globals.gmap_api;
550				}
551			}
552			else
553			{
554				$.AviaMapsAPI.apiFiles.src = avia_framework_globals.gmap_maps_loaded;
555			}
556			
557    		this._bind_execution();
558    		this._getAPI();
559    	},
560    	
561    	_getAPI: function( )
562		{	
563			//make sure the api file is loaded only once
564			if((typeof window.google == 'undefined' || typeof window.google.maps == 'undefined') && $.AviaMapsAPI.apiFiles.loading == false)
565			{	
566				$.AviaMapsAPI.apiFiles.loading = true;
567				var script 	= document.createElement('script');
568					script.type = 'text/javascript';	
569					script.src 	= $.AviaMapsAPI.apiFiles.src;
570
571      			document.body.appendChild(script);
572			}
573			else if((typeof window.google != 'undefined' && typeof window.google.maps != 'undefined') || $.AviaMapsAPI.apiFiles.loading == false)
574			//else if($.AviaMapsAPI.apiFiles.finished === true)
575			{
576				this._applyMap();
577			}
578		},
579		
580		_bind_execution: function()
581		{
582			this.$body.on('av-google-maps-api-loaded', $.proxy( this._applyMap, this) );
583		},
584		
585		_applyMap: function()
586		{
587			if(typeof this.map != 'undefined') return;
588			if(!this.$data.marker || !this.$data.marker[0] || !this.$data.marker[0].long || !this.$data.marker[0].long)
589			{
590				$.avia_utilities.log('Latitude or Longitude missing', 'map-error'); 
591				return;
592			}
593			
594			var _self = this,
595				mobile_drag = $.avia_utilities.isMobile ? this.$data.mobile_drag_control : true,
596				zoomValue 	= this.$data.zoom == "auto" ? 10 : this.$data.zoom;
597		
598			var mapTypeControl = false;
599			var mapTypeId = google.maps.MapTypeId.ROADMAP;
600			var mapTypeControlOptions = google.maps.MapTypeControlStyle.DROPDOWN_MENU;
601			
602			switch( this.$data.maptype_control )
603			{
604				case 'dropdown':
605					mapTypeControl = true;
606					mapTypeControlOptions = google.maps.MapTypeControlStyle.DROPDOWN_MENU;
607					break;
608				case 'horizontal':
609					mapTypeControl = true;
610					mapTypeControlOptions = google.maps.MapTypeControlStyle.HORIZONTAL_BAR;
611					break;
612				case 'default':
613					mapTypeControl = true;
614					mapTypeControlOptions = google.maps.MapTypeControlStyle.DEFAULT;
615					break;
616				default:
617					mapTypeControl = false;
618					mapTypeControlOptions = google.maps.MapTypeControlStyle.DROPDOWN_MENU;
619					break;
620			}
621			
622			switch( this.$data.maptype_id )
623			{
624				case 'SATELLITE':
625					mapTypeId = google.maps.MapTypeId.SATELLITE;
626					break;
627				case 'HYBRID':
628					mapTypeId = google.maps.MapTypeId.HYBRID;
629					break;
630				case 'TERRAIN':
631					mapTypeId = google.maps.MapTypeId.TERRAIN;
632					break;
633				default:
634					mapTypeId = google.maps.MapTypeId.ROADMAP;
635			}
636			
637			this.mapVars = {
638				mapMaker: false, //mapmaker tiles are user generated content maps. might hold more info but also be inaccurate
639				backgroundColor:'transparent',
640				streetViewControl: false,
641				zoomControl: this.$data.zoom_control,
642				//draggable: mobile_drag,
643				gestureHandling: 'cooperative',
644				scrollwheel: false,
645				zoom: zoomValue,
646				mapTypeControl: mapTypeControl,
647				mapTypeControlOptions: {style:mapTypeControlOptions},
648				mapTypeId: mapTypeId,
649				center: new google.maps.LatLng(this.$data.marker[0].lat, this.$data.marker[0].long),
650				styles:[{featureType: "poi", elementType: "labels", stylers: [ { visibility: "off" }] }]
651			};
652
653			this.map = new google.maps.Map(this.container, this.mapVars);
654		
655			this._applyMapStyle();
656			
657			if(this.$data.zoom == "auto")
658			{
659				this._setAutoZoom();
660			}
661			
662			google.maps.event.addListenerOnce(this.map, 'tilesloaded', function() {	
663				_self._addMarkers();
664			});
665		},
666		
667		_setAutoZoom: function()
668		{
669			var bounds = new google.maps.LatLngBounds();
670			
671			for (var key in this.$data.marker) 
672			{
673				bounds.extend( new google.maps.LatLng (this.$data.marker[key].lat , this.$data.marker[key].long) );
674			}
675			
676			this.map.fitBounds(bounds);
677		},
678		
679		_applyMapStyle: function()
680		{
681			var stylers = [], style = [], mapType, style_color = "";
682			
683			if(this.$data.hue != "") stylers.push({hue: this.$data.hue});
684			if(this.$data.saturation != "") stylers.push({saturation: this.$data.saturation});
685			
686			if(stylers.length)
687			{
688				style = [{
689					      featureType: "all",
690					      elementType: "all",
691					      stylers: stylers
692					    }, {
693					      featureType: "poi",
694					      stylers: [
695						  	{ visibility: "off" }
696					      ]
697					    }];
698					    
699				
700				if(this.$data.saturation == "fill")
701				{
702					   
703					style_color = this.$data.hue || "#242424";
704					
705					var c = style_color.substring(1);      // strip #
706					var rgb = parseInt(c, 16);   // convert rrggbb to decimal
707					var r = (rgb >> 16) & 0xff;  // extract red
708					var g = (rgb >>  8) & 0xff;  // extract green
709					var b = (rgb >>  0) & 0xff;  // extract blue
710					
711					var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709
712					var lightness = 1;
713					var street_light = 2;
714					
715					if (luma > 60) {
716					    lightness = -1;
717					    street_light = 3;
718					}
719					if (luma > 220) {
720					    lightness = -2;
721					    street_light = -2;
722					}
723					
724				style = [
725{"featureType":"all","elementType":"all","stylers":[{"color":style_color},{"lightness":0}]},
726{"featureType":"all","elementType":"labels.text.fill","stylers":[{"color":style_color},{"lightness":(25 * street_light)}]},
727{"featureType":"all","elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":style_color},{"lightness":3}]},
728{"featureType":"all","elementType":"labels.icon","stylers":[{"visibility":"off"}]},
729{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":style_color},{"lightness":30}]},
730{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":style_color},{"lightness":30},{"weight":1.2}]},
731{"featureType":"landscape","elementType":"geometry","stylers":[{visibility: 'simplified'},{"color":style_color},{"lightness":3}]},
732{"featureType":"poi","elementType":"geometry","stylers":[{ "visibility": "off" }]},
733{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":style_color},{"lightness":-3}]},
734{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":style_color},{"lightness":2},{"weight":0.2}]},
735{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-3}]},
736{"featureType":"road.local","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-3}]},
737{"featureType":"transit","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-3}]},
738{"featureType":"water","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-20}]}
739						];
740				}	
741				
742				mapType = new google.maps.StyledMapType(style, { name:"av_map_style" });
743				this.map.mapTypes.set('av_styled_map', mapType);
744				this.map.setMapTypeId('av_styled_map');
745			}
746		},
747		
748		_addMarkers: function()
749		{
750			for (var key in this.$data.marker) 
751			{	
752				var _self = this;
753				
754				(function(key, _self) 
755				{
756					setTimeout(function()
757					{
758							var marker = "";
759							
760							if(!_self.$data.marker[key] || !_self.$data.marker[key].long || !_self.$data.marker[key].long)
761							{
762								$.avia_utilities.log('Latitude or Longitude for single marker missing', 'map-error'); 
763								return;
764							}
765							
766							_self.$data.LatLng = new google.maps.LatLng(_self.$data.marker[key].lat, _self.$data.marker[key].long);
767							
768							var markerArgs = {
769			        		  flat: false,
770						      position: _self.$data.LatLng,
771						      animation: google.maps.Animation.BOUNCE,
772						      map: _self.map,
773						      title: _self.$data.marker[key].address,
774						      optimized: false
775						    };
776						    
777						    //set a custom marker image if available. also set the size and reduce the marker on retina size so its sharp
778						    if(_self.$data.marker[key].icon && _self.$data.marker[key].imagesize)
779						    { 
780						    	var size = _self.$data.marker[key].imagesize, half = "", full = "";
781						    	
782						    	if(_self.retina && size > 40) size = 40;			//retina downsize to at least half the px size
783						    	half = new google.maps.Point(size / 2, size ) ; 	//used to position the marker
784						    	full = new google.maps.Size(size , size ) ; 		//marker size
785						    	markerArgs.icon = new google.maps.MarkerImage(_self.$data.marker[key].icon, null, null, half, full);
786						    }
787							
788			        		marker = new google.maps.Marker(markerArgs);
789			        		
790			        		setTimeout(function(){ marker.setAnimation(null); _self._infoWindow(_self.map, marker, _self.$data.marker[key]); },500);
791			        		
792		        	},200 * (parseInt(key,10) + 1));
793		        		
794		        }(key, _self));
795    		}
796		},
797		
798		_infoWindow: function(map, marker, data)
799		{
800			var info = $.trim(data.content);
801			
802			if(info != "")
803			{
804				var infowindow = new google.maps.InfoWindow({
805					content: info
806				});
807				
808				google.maps.event.addListener(marker, 'click', function() {
809				    infowindow.open(map,marker);
810				});
811				
812				if(data.tooltip_display) infowindow.open(map,marker);
813			}
814		}
815		
816    	
817    };
818
819    //simple wrapper to call the api. makes sure that the api data is not applied twice
820    $.fn.aviaMaps = function( options )
821    {
822    	return this.each(function()
823    	{	
824    		var self = $.data( this, 'aviaMapsApi' );
825    		
826    		if(!self)
827    		{
828    			self = $.data( this, 'aviaMapsApi', new $.AviaMapsAPI( options, this ) );
829    		}
830    	});
831    };
832    
833})( jQuery );
834
835//this function is executed once the api file is loaded
836window.aviaOnGoogleMapsLoaded = function(){ $('body').trigger('av-google-maps-api-loaded'); $.AviaMapsAPI.apiFiles.finished = true; };
837
838
839// -------------------------------------------------------------------------------------------
840// 
841// AVIA VIDEO API - make sure that youtube, vimeo and html 5 use the same interface
842// 
843// requires froogaloop vimeo library and youtube iframe api (yt can be loaded async)
844// 
845// -------------------------------------------------------------------------------------------
846
847
848(function($)
849{
850    "use strict";
851
852	$.AviaVideoAPI  =  function(options, video, option_container)
853	{	
854		// actual video element. either iframe or video
855		this.$video	= $( video );
856		
857		// container where the AviaVideoAPI object will be stored as data, and that can receive events like play, pause etc 
858		// also the container that allows to overwrite javacript options by adding html data- attributes
859		this.$option_container = option_container ? $( option_container ) : this.$video; 
860		
861		//mobile device?
862		this.isMobile 	= $.avia_utilities.isMobile;
863		
864		//iamge fallback use
865		this.fallback = this.isMobile ? this.$option_container.is('.av-mobile-fallback-image') : false;
866		
867		if(this.fallback) return;
868		
869		// set up the whole api object
870		this._init( options );
871		
872	}
873
874	$.AviaVideoAPI.defaults  = {
875	
876		loop: false,
877		mute: false,
878		controls: false,
879		events: 'play pause mute unmute loop toggle reset unload'
880
881	};
882	
883	$.AviaVideoAPI.apiFiles =
884    {
885    	youtube : {loaded: false, src: 'https://www.youtube.com/iframe_api' }
886    }
887	
888  	$.AviaVideoAPI.prototype =
889    {
890    	_init: function( options )
891    	{	
892			// set slider options
893			this.options = this._setOptions(options);
894			
895			// info which video service we are using: html5, vimeo or youtube
896			this.type = this._getPlayerType();
897			
898			// store the player object to the this.player variable created by one of the APIs (mediaelement, youtube, vimeo)
899			this._setPlayer();			
900			
901			// set to true once the events are bound so it doesnt happen a second time by accident or racing condition
902			this.eventsBound = false;
903			
904			// info if the video is playing
905			this.playing = false;
906			
907			//set css class that video is currently not playing
908			this.$option_container.addClass('av-video-paused');
909			
910			//play pause indicator
911			this.pp = $.avia_utilities.playpause(this.$option_container);
912    	},
913		
914		
915    	//set the video options by first merging the default options and the passed options, then checking the video element if any data attributes overwrite the option set
916    	_setOptions: function(options)
917		{	
918			var newOptions 	= $.extend( true, {}, $.AviaVideoAPI.defaults, options ),
919				htmlData 	= this.$option_container.data(),
920				i 			= "";
921
922			//overwritte passed option set with any data properties on the html element
923			for (i in htmlData)
924			{
925				if (htmlData.hasOwnProperty(i) && (typeof htmlData[i] === "string" || typeof htmlData[i] === "number" || typeof htmlData[i] === "boolean"))
926				{
927					newOptions[i] = htmlData[i]; 
928				}
929			}
930		
931			return newOptions;
932		},
933		
934		
935		//get the player type
936		_getPlayerType: function()
937		{
938			var vid_src = this.$video.get(0).src || this.$video.data('src');
939			
940			
941			if(this.$video.is('video')) 				return 'html5';
942			if(this.$video.is('.av_youtube_frame')) 	return 'youtube';
943			if(vid_src.indexOf('vimeo.com') != -1 ) 	return 'vimeo';
944			if(vid_src.indexOf('youtube.com') != -1) 	return 'youtube';
945		},
946		
947		//get the player object
948		_setPlayer: function()
949		{
950			var _self = this;
951			
952			switch(this.type)
953			{
954				case "html5": 	
955				
956					this.player = this.$video.data('mediaelementplayer');  
957					this._playerReady(); 
958					
959				break; 
960					
961				case "vimeo": 	
962					
963					this.player = Froogaloop(this.$video.get(0)); 
964					this._playerReady(); 
965					
966				break;
967					
968				case "youtube": 
969				
970					this._getAPI(this.type);
971					$('body').on('av-youtube-iframe-api-loaded', function(){ _self._playerReady(); });
972					
973				break;
974			}
975		},
976		
977		_getAPI: function( api )
978		{	
979			//make sure the api file is loaded only once
980			if($.AviaVideoAPI.apiFiles[api].loaded === false)
981			{	
982				$.AviaVideoAPI.apiFiles[api].loaded = true;
983				//load the file async
984				var tag		= document.createElement('script'),
985					first	= document.getElementsByTagName('script')[0];
986					
987				tag.src = $.AviaVideoAPI.apiFiles[api].src;
988      			first.parentNode.insertBefore(tag, first);
989			}
990		},
991		
992		
993		
994		//wait for player to be ready, then bind events
995		_playerReady: function()
996		{	
997			var _self = this;
998			
999			this.$option_container.on('av-video-loaded', function(){ _self._bindEvents(); });
1000			
1001			switch(this.type)
1002			{
1003				case "html5": 
1004						
1005					this.$video.on('av-mediajs-loaded', function(){ _self.$option_container.trigger('av-video-loaded'); });
1006					this.$video.on('av-mediajs-ended' , function(){ _self.$option_container.trigger('av-video-ended');  });
1007					
1008				break;
1009				case "vimeo": 	
1010					
1011					//finish event must be applied after ready event for firefox
1012					_self.player.addEvent('ready',  function(){ _self.$option_container.trigger('av-video-loaded'); 
1013					_self.player.addEvent('finish', function(){ _self.$option_container.trigger('av-video-ended');  });
1014					}); 
1015					
1016					// vimeo sometimes does not fire. fallback jquery load event should fix this
1017					// currently not used because it causes firefox problems
1018					/*
1019					this.$video.load(function()
1020					{ 	
1021						if(_self.eventsBound == true || typeof _self.eventsBound == 'undefined') return;
1022				        _self.$option_container.trigger('av-video-loaded');
1023						$.avia_utilities.log('VIMEO Fallback Trigger');
1024				    });
1025					*/
1026					
1027				
1028				break;
1029				
1030				case "youtube": 
1031					
1032					var params = _self.$video.data();
1033					
1034					if(_self._supports_video()) params.html5 = 1;
1035					
1036					_self.player = new YT.Player(_self.$video.attr('id'), {
1037						videoId: params.videoid,
1038						height: _self.$video.attr('height'),
1039						width: _self.$video.attr('width'),
1040						playerVars: params,
1041						events: {
1042						'onReady': function(){ _self.$option_container.trigger('av-video-loaded'); },
1043						'onError': function(player){ $.avia_utilities.log('YOUTUBE ERROR:', 'error', player); },
1044						'onStateChange': function(event){ 
1045							if (event.data === YT.PlayerState.ENDED)
1046							{	
1047								var command = _self.options.loop != false ? 'loop' : 'av-video-ended';
1048								_self.$option_container.trigger(command); 
1049							} 
1050						  }
1051						}
1052					});
1053					
1054					
1055				break;
1056			}
1057			
1058			//fallback always trigger after 2 seconds
1059			setTimeout(function()
1060			{ 	
1061				if(_self.eventsBound == true || typeof _self.eventsBound == 'undefined' || _self.type == 'youtube' ) { return; }
1062				$.avia_utilities.log('Fallback Video Trigger "'+_self.type+'":', 'log', _self);
1063				
1064				_self.$option_container.trigger('av-video-loaded'); 
1065				
1066			},2000);
1067			
1068		},
1069		
1070		//bind events we should listen to, to the player
1071		_bindEvents: function()
1072		{	
1073			if(this.eventsBound == true || typeof this.eventsBound == 'undefined')
1074			{
1075				return;
1076			}
1077			
1078			var _self = this, volume = 'unmute';
1079			
1080			this.eventsBound = true;
1081			
1082			this.$option_container.on(this.options.events, function(e)
1083			{
1084				_self.api(e.type);
1085			});
1086			
1087			if(!_self.isMobile)
1088			{
1089				//set up initial options
1090				if(this.options.mute != false) { volume = "mute"; 	 }
1091				if(this.options.loop != false) { _self.api('loop'); }
1092				
1093				_self.api(volume);
1094			}
1095			
1096			//set timeout to prevent racing conditions with other scripts
1097			setTimeout(function()
1098			{
1099				_self.$option_container.trigger('av-video-events-bound').addClass('av-video-events-bound');
1100			},50);
1101		},
1102		
1103		
1104		_supports_video: function() {
1105		  return !!document.createElement('video').canPlayType;
1106		},
1107		
1108		
1109		/************************************************************************
1110		PUBLIC Methods
1111		*************************************************************************/
1112		
1113		api: function( action )
1114		{	
1115			//commands on mobile can not be executed if the player was not started manually 
1116			if(this.isMobile && !this.was_started()) return;
1117			
1118			// prevent calling of unbound function
1119			if(this.options.events.indexOf(action) === -1) return;
1120			
1121			// broadcast that the command was executed
1122			this.$option_container.trigger('av-video-'+action+'-executed');
1123			
1124			// calls the function based on action. eg: _html5_play()
1125			if(typeof this[ '_' + this.type + '_' + action] == 'function')
1126			{
1127				this[ '_' + this.type + '_' + action].call(this);
1128			}
1129			
1130			//call generic function eg: _toggle() or _play()
1131			if(typeof this[ '_' + action] == 'function')
1132			{
1133				this[ '_' + action].call(this);
1134			}
1135			
1136		},
1137		
1138		was_started: function()
1139		{
1140			if(!this.player) return false;
1141		
1142			switch(this.type)
1143			{
1144				case "html5": 
1145					if(this.player.getCurrentTime() > 0) return true; 
1146				break; 
1147					
1148				case "vimeo": 	
1149					if(this.player.api('getCurrentTime') > 0) return true; 
1150				break;
1151					
1152				case "youtube": 
1153					if(this.player.getPlayerState() !== -1) return true; 
1154				break;
1155			}
1156			
1157			return false;
1158		},
1159		
1160		/************************************************************************
1161		Generic Methods, are always executed and usually set variables
1162		*************************************************************************/
1163		_play: function()
1164		{
1165			this.playing = true;
1166			this.$option_container.addClass('av-video-playing').removeClass('av-video-paused');
1167		},
1168		
1169		_pause: function()
1170		{
1171			this.playing = false;
1172			this.$option_container.removeClass('av-video-playing').addClass('av-video-paused');
1173		},
1174		
1175		_loop: function()
1176		{
1177			this.options.loop = true;
1178		},
1179		
1180		_toggle: function( )
1181		{
1182			var command = this.playing == true ? 'pause' : 'play';
1183			
1184			this.api(command);
1185			this.pp.set(command);
1186		},
1187		
1188		
1189		/************************************************************************
1190		VIMEO Methods
1191		*************************************************************************/
1192		
1193		_vimeo_play: function( )
1194		{	
1195			this.player.api('play');
1196		},
1197		
1198		_vimeo_pause: function( )
1199		{
1200			this.player.api('pause');	
1201		},
1202		
1203		_vimeo_mute: function( )
1204		{
1205			this.player.api('setVolume', 0);
1206		},
1207		
1208		_vimeo_unmute: function( )
1209		{
1210			this.player.api('setVolume', 0.7);
1211		},
1212		
1213		_vimeo_loop: function( )
1214		{
1215			// currently throws error, must be set in iframe
1216			// this.player.api('setLoop', true);
1217		},
1218		
1219		_vimeo_reset: function( )
1220		{
1221			this.player.api('seekTo',0);
1222		},
1223		
1224		_vimeo_unload: function()
1225		{
1226			this.player.api('unload');
1227		},
1228		
1229		/************************************************************************
1230		YOUTUBE Methods
1231		*************************************************************************/		
1232		
1233		_youtube_play: function( )
1234		{
1235			this.player.playVideo();
1236		},
1237		
1238		_youtube_pause: function( )
1239		{
1240			this.player.pauseVideo()
1241		},
1242		
1243		_youtube_mute: function( )
1244		{
1245			this.player.mute();
1246		},
1247		
1248		_youtube_unmute: function( )
1249		{
1250			this.player.unMute();
1251		},
1252		
1253		_youtube_loop: function( )
1254		{	
1255			// does not work properly with iframe api. needs to manual loop on "end" event
1256			// this.player.setLoop(true); 
1257			if(this.playing == true) this.player.seekTo(0);
1258		},
1259		
1260		_youtube_reset: function( )
1261		{
1262			this.player.stopVideo();
1263		},
1264		
1265		_youtube_unload: function()
1266		{
1267			this.player.clearVideo();
1268		},
1269		
1270		/************************************************************************
1271		HTML5 Methods
1272		*************************************************************************/
1273		
1274		_html5_play: function( )
1275		{
1276			//disable stoping of other videos in case the user wants to run section bgs
1277			this.player.options.pauseOtherPlayers = false;
1278			this.player.play();
1279		},
1280		
1281		_html5_pause: function( )
1282		{
1283			this.player.pause();
1284		},
1285		
1286		_html5_mute: function( )
1287		{
1288			this.player.setMuted(true);
1289		},
1290		
1291		_html5_unmute: function( )
1292		{
1293			this.player.setVolume(0.7);
1294		},
1295		
1296		_html5_loop: function( )
1297		{
1298			this.player.options.loop = true;
1299		},
1300		
1301		_html5_reset: function( )
1302		{	
1303			this.player.setCurrentTime(0);	
1304		},
1305		
1306		_html5_unload: function()
1307		{
1308			this._html5_pause();
1309			this._html5_reset();
1310		}
1311    }
1312
1313    //simple wrapper to call the api. makes sure that the api data is not applied twice
1314    $.fn.aviaVideoApi = function( options , apply_to_parent)
1315    {
1316    	return this.each(function()
1317    	{	
1318    		// by default save the object as data to the initial video. 
1319    		// in the case of slideshows its more benefitial to save it to a parent element (eg: the slide)
1320    		var applyTo = this;
1321    		
1322    		if(apply_to_parent)
1323    		{
1324    			applyTo = $(this).parents(apply_to_parent).get(0);
1325    		}
1326    		
1327    		var self = $.data( applyTo, 'aviaVideoApi' );
1328    		
1329    		if(!self)
1330    		{
1331    			self = $.data( applyTo, 'aviaVideoApi', new $.AviaVideoAPI( options, this, applyTo ) );
1332    		}
1333    	});
1334    }
1335    
1336})( jQuery );
1337
1338window.onYouTubeIframeAPIReady = function(){ $('body').trigger('av-youtube-iframe-api-loaded'); };
1339
1340
1341
1342// -------------------------------------------------------------------------------------------
1343// Masonry
1344// -------------------------------------------------------------------------------------------
1345
1346$.fn.avia_masonry = function(options)
1347{
1348	//return if we didnt find anything
1349	if(!this.length) return this;
1350	
1351	var the_body = $('body'),
1352		the_win	 = $(window),
1353		isMobile = $.avia_utilities.isMobile,
1354		loading = false,
1355		methods = {
1356	
1357		
1358		masonry_filter: function()
1359		{
1360			var current		= $(this),
1361				linktext	= current.html(),
1362		  		selector	= current.data('filter'),
1363		  		masonry 	= current.parents('.av-masonry:eq(0)'),
1364		  		container 	= masonry.find('.av-masonry-container:eq(0)'),
1365		  		links		= masonry.find('.av-masonry-sort a'),
1366		  		activeCat	= masonry.find('.av-current-sort-title');
1367				
1368				links.removeClass('active_sort');
1369				current.addClass('active_sort');
1370				container.attr('id', 'masonry_id_'+selector);
1371				
1372				if(activeCat.length) activeCat.html(linktext);
1373				
1374				methods.applyMasonry(container, selector, function()
1375				{
1376					container.css({overflow:'visible'});
1377				});
1378			
1379				setTimeout(function() { the_win.trigger('debouncedresize'); }, 500);
1380				
1381				return false;
1382		},
1383		
1384		applyMasonry: function(container, selector, callback)
1385		{
1386			var filters = selector ? {filter: '.'+selector} : {};
1387			
1388			filters['layoutMode'] = 'packery';
1389			filters['packery'] = {gutter:0};
1390			filters['percentPosition'] = true;
1391			filters['itemSelector'] = "a.isotope-item, div.isotope-item";
1392			
1393			container.isotope(filters, function()
1394			{
1395				the_win.trigger('av-height-change');
1396			});
1397			
1398			if(typeof callback === 'function')
1399			{
1400				setTimeout(callback, 0);
1401			}
1402		},
1403		
1404		show_bricks: function(bricks, callback)
1405		{
1406			bricks.each(function(i)
1407			{
1408				var currentLink 	= $(this),
1409					browserPrefix 	= $.avia_utilities.supports('transition'),
1410					multiplier		= isMobile ? 0 : 100;
1411				
1412				setTimeout(function()
1413				{
1414					if(browserPrefix === false)
1415					{
1416						currentLink.css({visibility:"visible", opacity:0}).animate({opacity:1},1500);
1417					}
1418					else
1419					{
1420						currentLink.addClass('av-masonry-item-loaded');
1421					}
1422					
1423					if(i == bricks.length - 1 && typeof callback == 'function')
1424					{
1425						callback.call();
1426						the_win.trigger('av-height-change');
1427					}
1428					
1429				}, (multiplier * i));
1430			});
1431		},
1432		
1433		loadMore: function(e)
1434		{
1435			e.preventDefault();
1436			
1437			if(loading) return false;
1438			
1439			loading = true;
1440		
1441			var current		= $(this),
1442		  		data		= current.data(),
1443		  		masonry 	= current.parents('.av-masonry:eq(0)'),
1444		  		container	= masonry.find('.av-masonry-container'),
1445		  		items		= masonry.find('.av-masonry-entry'),
1446		  		loader		= $.avia_utilities.loading(),
1447		  		finished	= function(){ loading = false; loader.hide(); the_body.trigger('av_resize_finished'); };
1448		  			  	
1449		  	//calculate a new offset	
1450		  	if(!data.offset){ data.offset = 0; }	
1451		  	data.offset += data.items;
1452		  	data.action = 'avia_ajax_masonry_more';
1453		  	data.loaded = []; //prevents duplicate entries from beeing loaded when randomized is active
1454		  	
1455		  	items.each(function(){
1456			  	var item_id = $(this).data('av-masonry-item');
1457			  	if(item_id) data.loaded.push( item_id );
1458		  	});
1459		  	
1460		  	 $.ajax({
1461				url: avia_framework_globals.ajaxurl,
1462				type: "POST",
1463				data:data,
1464				beforeSend: function()
1465				{
1466					loader.show();
1467				},
1468				success: function(response)
1469				{
1470					if(response.indexOf("{av-masonry-loaded}") !== -1)
1471					{
1472						//fetch the response. if any php warnings were displayed before rendering of the items the are removed by the string split
1473						var response  = response.split('{av-masonry-loaded}'),
1474							new_items = $(response.pop()).filter('.isotope-item');
1475							
1476							//check if we got more items than we need. if not we have reached the end of items
1477							if(new_items.length > data.items)
1478							{
1479								new_items = new_items.not(':last');
1480							}
1481							else
1482							{
1483								current.addClass('av-masonry-no-more-items');
1484							}
1485							
1486							var load_container = $('<div class="loadcontainer"></div>').append(new_items);
1487							
1488							
1489							
1490							$.avia_utilities.preload({container: load_container, single_callback:  function()
1491							{
1492								var links = masonry.find('.av-masonry-sort a'),
1493									filter_container = masonry.find('.av-sort-by-term'),
1494									allowed_filters = filter_container.data("av-allowed-sort");
1495								
1496								filter_container.hide();
1497								
1498								loader.hide();
1499								container.isotope( 'insert', new_items); 
1500								$.avia_utilities.avia_ajax_call(masonry);
1501								setTimeout( function(){ methods.show_bricks( new_items , finished); },150);
1502								setTimeout(function(){ the_win.trigger('av-height-change'); }, 550);
1503								if(links)
1504								{
1505									$(links).each(function(filterlinkindex)
1506									{
1507										var filterlink = $(this),
1508										sort = filterlink.data('filter');
1509
1510										if(new_items)
1511										{
1512										    $(new_items).each(function(itemindex){
1513										        var item = $(this);
1514												
1515										        if(item.hasClass(sort) && allowed_filters.indexOf(sort) !== -1)
1516										        {
1517										            var term_count = filterlink.find('.avia-term-count').text();
1518										            filterlink.find('.avia-term-count').text(' ' + (parseInt(term_count) + 1) + ' ');
1519										
1520										            if(filterlink.hasClass('avia_hide_sort'))
1521										            {
1522										                filterlink.removeClass('avia_hide_sort').addClass('avia_show_sort');
1523										                masonry.find('.av-masonry-sort .'+sort+'_sep').removeClass('avia_hide_sort').addClass('avia_show_sort');
1524										                masonry.find('.av-masonry-sort .av-sort-by-term').removeClass('hidden');
1525										            }
1526										        }
1527										    });
1528										}
1529									});
1530
1531								}
1532
1533                                				filter_container.fadeIn();
1534							}
1535						});
1536					}
1537					else
1538					{
1539						finished();
1540					}
1541				},
1542				error: finished,
1543				complete: function()
1544				{
1545				    setTimeout(function() { the_win.trigger('debouncedresize'); }, 500);
1546				}
1547			});
1548		}
1549
1550	};
1551
1552	return this.each(function()
1553	{	
1554		var masonry			= $(this),
1555			container 		= masonry.find('.av-masonry-container'),
1556			bricks			= masonry.find('.isotope-item'), 
1557			filter			= masonry.find('.av-masonry-sort').css({visibility:"visible", opacity:0}).on('click', 'a',  methods.masonry_filter),
1558			load_more		= masonry.find('.av-masonry-load-more').css({visibility:"visible", opacity:0});
1559			
1560		$.avia_utilities.preload({container: container, single_callback:  function()
1561		{
1562			var start_animation = function()
1563			{ 
1564				filter.animate({opacity:1}, 400);
1565				
1566				//fix for non aligned elements because of scrollbar
1567				if(container.outerHeight() + container.offset().top + $('#footer').outerHeight() > $(window).height())
1568				{
1569					$('html').css({'overflow-y':'scroll'});
1570				}
1571				
1572				methods.applyMasonry(container, false, function()
1573				{
1574					masonry.addClass('avia_sortable_active');
1575					container.removeClass('av-js-disabled '); 
1576				});
1577				
1578				methods.show_bricks(bricks, function()
1579				{
1580					load_more.css({opacity:1}).on('click',  methods.loadMore);
1581				});
1582				
1583				//container.isotope( 'reLayout' );
1584
1585			};
1586			
1587			if(isMobile)
1588			{
1589				start_animation();
1590			}
1591			else
1592			{
1593				masonry.waypoint(start_animation , { offset: '80%'} );
1594			}
1595					
1596			// update columnWidth on window resize
1597			$(window).on( 'debouncedresize', function()
1598			{
1599			  	methods.applyMasonry(container, false, function()
1600				{
1601					masonry.addClass('avia_sortable_active');
1602				});
1603			});
1604		}
1605	});
1606		
1607		
1608	});
1609};
1610
1611
1612
1613
1614	
1615// -------------------------------------------------------------------------------------------
1616// Avia AJAX Portfolio
1617// -------------------------------------------------------------------------------------------
1618
1619(function($)
1620{ 
1621	"use strict";
1622	$.avia_utilities = $.avia_utilities || {};
1623	
1624	$.fn.avia_portfolio_preview = function(passed_options) 
1625	{	
1626		var win  = $(window),
1627		the_body = $('body'),
1628		isMobile = $.avia_utilities.isMobile,
1629		defaults = 
1630		{
1631			open_in:	'.portfolio-details-inner',
1632			easing:		'easeOutQuint',
1633			timing:		800,
1634			transition:	'slide' // 'fade' or 'slide'
1635		},
1636		
1637		options = $.extend({}, defaults, passed_options);
1638	
1639		return this.each(function()
1640		{	
1641			var container			= $(this),
1642				portfolio_id		= container.data('portfolio-id'),
1643				target_wrap			= $('.portfolio_preview_container[data-portfolio-id="' + portfolio_id + '"]'),
1644				target_container	= target_wrap.find(options.open_in),
1645				items				= container.find('.grid-entry'),
1646				content_retrieved	= {},
1647				is_open				= false,
1648				animating			= false,
1649				index_open			= false,
1650				ajax_call			= false,
1651				methods,
1652				controls,
1653				loader				= $.avia_utilities.loading();
1654				
1655			methods = 
1656			{
1657				load_item: function(e)
1658				{
1659					e.preventDefault();
1660
1661					var link			= $(this),
1662						post_container	= link.parents('.post-entry:eq(0)'),
1663						post_id			= "ID_" + post_container.data('ajax-id'),
1664						clickedIndex	= items.index(post_container);
1665					
1666					//check if current item is the clicked item or if we are currently animating
1667					if(post_id === is_open || animating == true) 
1668					{
1669						return false;
1670					}
1671					
1672					animating = true;
1673					
1674					container.find('.active_portfolio_item').removeClass('active_portfolio_item');
1675					post_container.addClass('active_portfolio_item');
1676					loader.show();
1677					
1678					methods.ajax_get_contents(post_id, clickedIndex);
1679				},
1680				
1681				scroll_top: function()
1682				{
1683					setTimeout(function()
1684					{
1685						var target_offset = target_wrap.offset().top - 175,
1686							window_offset = win.scrollTop();
1687											
1688						if(window_offset > target_offset || target_offset - window_offset > 100  )
1689						{
1690							$('html:not(:animated),body:not(:animated)').animate({ scrollTop: target_offset }, options.timing, options.easing);
1691						}
1692					},10);
1693				},
1694				
1695				attach_item: function(post_id)
1696				{
1697					content_retrieved[post_id] = $(content_retrieved[post_id]).appendTo(target_container);
1698					ajax_call = true;
1699				},
1700				
1701				remove_video: function()
1702				{
1703					var del = target_wrap.find('iframe, .avia-video').parents('.ajax_slide:not(.open_slide)');	
1704					
1705						if(del.length > 0)
1706						{
1707							del.remove();
1708							content_retrieved["ID_" + del.data('slideId')] = undefined;
1709						}
1710				},
1711				
1712				show_item: function(post_id, clickedIndex)
1713				{
1714				
1715					//check if current item is the clicked item or if we are currently animating
1716					if(post_id === is_open) 
1717					{
1718						return false;
1719					}
1720					animating = true;
1721					
1722					
1723					loader.hide();
1724					
1725					if(false === is_open)
1726					{
1727						target_wrap.addClass('open_container');
1728						content_retrieved[post_id].addClass('open_slide');
1729						
1730						methods.scroll_top();
1731						
1732						target_wrap.css({display:'none'}).slideDown(options.timing, options.easing, function()
1733						{
1734							if(ajax_call)
1735							{ 
1736								activate_shortcode_scripts(content_retrieved[post_id]); 
1737								$.avia_utilities.avia_ajax_call(content_retrieved[post_id]);
1738								the_body.trigger('av_resize_finished');
1739								ajax_call = false; 
1740							}
1741							
1742							methods.remove_video();
1743							the_body.trigger('av_resize_finished');
1744						});
1745						
1746							index_open	= clickedIndex;
1747							is_open		= post_id;
1748							animating	= false;
1749						
1750						
1751						
1752					}
1753					else
1754					{
1755						methods.scroll_top();
1756					
1757						var initCSS = { zIndex:3 },
1758							easing	= options.easing;
1759							
1760						if(index_open > clickedIndex) { initCSS.left = '-110%'; }
1761						if(options.transition === 'fade'){ initCSS.left = '0%'; initCSS.opacity = 0; easing = 'easeOutQuad'; }
1762						
1763						//fixate height for container during animation
1764						target_container.height(target_container.height()); //outerHeight = border problems?
1765						
1766						content_retrieved[post_id].css(initCSS).avia_animate({'left':"0%", opacity:1}, options.timing, easing);
1767						content_retrieved[is_open].avia_animate({opacity:0}
1767, options.timing, easing, function()
1768						{
1769							content_retrieved[is_open].attr({'style':""}).removeClass('open_slide');
1770							content_retrieved[post_id].addClass('open_slide');
1771																										  //+ 2 fixes border problem (slides move up and down 2 px on transition)
1772							target_container.avia_animate({height: content_retrieved[post_id].outerHeight() + 2}, options.timing/2, options.easing, function()
1773							{
1774								target_container.attr({'style':""});
1775								is_open		= post_id;
1776								index_open	= clickedIndex;
1777								animating	= false;
1778								
1779								methods.remove_video();
1780								if(ajax_call)
1781								{ 
1782									the_body.trigger('av_resize_finished');
1783									activate_shortcode_scripts(content_retrieved[post_id]); 
1784									$.avia_utilities.avia_ajax_call(content_retrieved[post_id]);
1785									ajax_call = false; 
1786								}
1787	
1788							});
1789							
1790						});		
1791					}
1792				},
1793				
1794				ajax_get_contents: function(post_id, clickedIndex)
1795				{
1796					if(content_retrieved[post_id] !== undefined)
1797					{
1798						methods.show_item(post_id, clickedIndex);
1799						return;
1800					}
1801					
1802					content_retrieved[post_id] = $('#avia-tmpl-portfolio-preview-' + post_id.replace(/ID_/,"")).html();
1803					
1804					//this line is necessary to prevent w3 total cache from messing up the portfolio if inline js is compressed
1805					content_retrieved[post_id] = content_retrieved[post_id].replace('/*<![CDATA[*/','').replace('*]]>','');
1806					
1807					methods.attach_item(post_id);
1808					
1809					$.avia_utilities.preload({container: content_retrieved[post_id] , single_callback:  function(){ methods.show_item(post_id, clickedIndex); }});
1810				},
1811				
1812				add_controls: function()
1813				{
1814					controls = target_wrap.find('.ajax_controlls');
1815
1816					target_wrap.avia_keyboard_controls({27:'.avia_close', 37:'.ajax_previous', 39:'.ajax_next'});
1817					//target_wrap.avia_swipe_trigger({prev:'.ajax_previous', next:'.ajax_next'});
1818					
1819					items.each(function(){
1820					
1821						var current = $(this), overlay;
1822						
1823						current.addClass('no_combo').bind('click', function(event)
1824						{
1825							overlay = current.find('.slideshow_overlay');
1826							
1827							if(overlay.length)
1828							{
1829								event.stopPropagation();
1830								methods.load_item.apply(current.find('a:eq(0)'));
1831								return false;
1832							}
1833						});
1834						
1835						
1836					});
1837				},
1838				
1839				control_click: function()
1840				{
1841					var showItem,
1842						activeID = container.find('.active_portfolio_item').data('ajax-id'),
1843						active   = container.find('.post-entry-'+activeID);
1844				
1845					switch(this.hash)
1846					{
1847						case '#next': 
1848						
1849							showItem = active.nextAll('.post-entry:visible:eq(0)').find('a:eq(0)');
1850							if(!showItem.length) { showItem = $('.post-entry:visible:eq(0)', container).find('a:eq(0)'); }
1851							showItem.trigger('click');
1852					
1853						break;
1854						case '#prev': 
1855							
1856							showItem = active.prevAll('.post-entry:visible:eq(0)').find('a:eq(0)');
1857							if(!showItem.length) { showItem = $('.post-entry:visible:last', container).find('a:eq(0)'); }
1858							showItem.trigger('click');
1859						
1860						break;
1861						case '#close':
1862						
1863							animating = true;
1864							
1865							target_wrap.slideUp( options.timing, options.easing, function()
1866							{ 
1867								container.find('.active_portfolio_item').removeClass('active_portfolio_item');
1868								content_retrieved[is_open].attr({'style':""}).removeClass('open_slide');
1869								target_wrap.removeClass('open_container');
1870								animating = is_open = index_open = false;
1871								methods.remove_video();
1872								the_body.trigger('av_resize_finished');
1873							});
1874							
1875						break;
1876					}
1877					return false;
1878				},
1879				
1880				
1881				resize_reset: function()
1882				{
1883					if(is_open === false)
1884					{
1885						target_container.html('');
1886						content_retrieved	= [];
1887					}
1888				}
1889			};
1890			
1891			methods.add_controls();
1892			
1893			container.on("click", "a", methods.load_item);
1894			controls.on("click", "a", methods.control_click);
1895			if(jQuery.support.leadingWhitespace) { win.bind('debouncedresize', methods.resize_reset); }
1896			
1897		});
1898	};
1899}(jQuery));	
1900
1901
1902
1903// -------------------------------------------------------------------------------------------
1904// Fullscreen Slideshow 
1905// 
1906// extends avia slideshow script with a more sophisticated preloader and fixed size for slider
1907// -------------------------------------------------------------------------------------------
1908
1909
1910	$.AviaFullscreenSlider  =  function(options, slider)
1911	{
1912	    this.$slider  	= $( slider ); 
1913	    this.$inner	  	= this.$slider.find('.avia-slideshow-inner');
1914	    this.$innerLi	= this.$inner.find('>li');
1915	    this.$caption 	= this.$inner.find('.avia-slide-wrap .caption_container');
1916	    this.$win	  	= $( window );
1917	    this.isMobile 	= $.avia_utilities.isMobile;
1918	    this.property 	= {};
1919	    this.scrollPos	= "0";
1920	    this.transform3d= document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
1921	    this.ticking 	= false; 
1922	    
1923	    
1924	    if($.avia_utilities.supported.transition === undefined)
1925		{
1926			$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
1927		}
1928		
1929	    this._init( options );
1930	}
1931
1932	$.AviaFullscreenSlider.defaults  = {
1933
1934		//height of the slider in percent
1935		height: 100,
1936		
1937		//subtract elements from the height
1938		subtract: '#wpadminbar, #header, #main>.title_container'
1939		
1940		
1941	};
1942
1943  	$.AviaFullscreenSlider.prototype =
1944    {
1945    	_init: function( options )
1946    	{
1947    		var _self = this;
1948    		//set the default options
1949    		this.options = $.extend( true, {}, $.AviaFullscreenSlider.defaults, options );
1950    		
1951    		if(this.$slider.data('slide_height')) this.options.height = this.$slider.data('slide_height');
1952    		
1953    		//if background attachment is set to fixed or scroll disable the parallax effect
1954    		this.options.parallax_enabled = this.$slider.data('image_attachment') == "" ? true : false;
1955    		
1956    		//elements that get subtracted from the image height
1957    		this.$subtract = $(this.options.subtract);
1958    		
1959    		
1960			// set the slideshow size
1961			this._setSize(); 
1962    		
1963			// set resizing script on window resize
1964			this.$win.on( 'debouncedresize',  $.proxy( this._setSize, this) );
1965    		
1966    		//parallax scroll if element if leaving viewport
1967			setTimeout(function()
1968			{
1969				if(!_self.isMobile && _self.options.parallax_enabled) //disable parallax scrolling on mobile
1970    			{
1971	    			_self.$win.on( 'scroll', $.proxy( _self._on_scroll, _self) );
1972    			}
1973    			
1974    		},100);
1975			/**/
1976    		
1977			//activate the defaule slider
1978			this.$slider.aviaSlider({bg_slider:true});
1979			
1980			
1981    	},
1982    	
1983    	_on_scroll: function(e)
1984    	{
1985	    	var _self = this;
1986	    	
1987	    	if(!_self.ticking) {
1988		     _self.ticking = true;
1989		      window.requestAnimationFrame( $.proxy( _self._parallax_scroll, _self) );
1990		    }
1991    	},
1992    	
1993    	
1994    	_fetch_properties: function(slide_height)
1995		{
1996			this.property.offset 	= this.$slider.offset().top;
1997			this.property.wh 		= this.$win.height();
1998			this.property.height 	= slide_height || this.$slider.outerHeight();
1999			
2000			//re-position the slider
2001			this._parallax_scroll();
2002		},
2003    	
2004    	_setSize: function( )
2005    	{	
2006    		if(!$.fn.avia_browser_height)
2007    		{
2008    	
2009    		var viewport		= this.$win.height(),
2010    			slide_height	= Math.ceil( (viewport / 100) * this.options.height );
2011			
2012			if(this.$subtract.length && this.options.height == 100)
2013			{
2014	    		this.$subtract.each(function()
2015	    		{
2016	    			slide_height -= this.offsetHeight - 0.5;
2017	    		});
2018    		}
2019    		else
2020    		{
2021    			slide_height -= 1;
2022    		}
2023    		this.$slider.height(slide_height).removeClass('av-default-height-applied');
2024    		this.$inner.css('padding',0);
2025    		}
2026    		
2027    		
2028    		this._fetch_properties(slide_height);
2029    	},
2030    	
2031    	_parallax_scroll: function(e)
2032    	{
2033    		if(this.isMobile || ! this.options.parallax_enabled) return; //disable parallax scrolling on mobile
2034    	
2035    		var winTop 		= this.$win.scrollTop(),
2036    			winBottom	=  winTop + this.property.wh,
2037    			scrollPos 	= "0", 
2038    			prop 		= {}, prop2 = {};
2039    		
2040    		if(this.property.offset < winTop && winTop <= this.property.offset + this.property.height)
2041    		{	
2042    			scrollPos = Math.round( (winTop - this.property.offset) * 0.3 );
2043    		}
2044    		
2045    		if(this.scrollPos != scrollPos)
2046    		{	
2047    			//slide background parallax
2048    			this.scrollPos = scrollPos;
2049    			
2050    			//currently no 3d transform, because of browser quirks
2051    			//this.transform3d = false;
2052    			
2053    			if(this.transform3d)
2054    			{
2055    				prop[$.avia_utilities.supported.transition+"transform"] = "translate3d(0px,"+ scrollPos +"px,0px)";
2056    			}
2057    			else
2058    			{
2059    				prop[$.avia_utilities.supported.transition+"transform"] = "translate(0px,"+ scrollPos +"px)";
2060    			}
2061    			
2062    			
2063    			this.$inner.css(prop);
2064    			
2065    			
2066    			
2067    			//slider caption parallax
2068    			
2069				// prop2[$.avia_utilities.supported.transition+"transform"] = "translate(0px,-"+ ( scrollPos * 1) +"px)";
2070				/*
2071	    		prop2['opacity'] = Math.ceil((this.$slider.height() - (scrollPos * 2)) / 100)/ 10;
2072	    		prop2['opacity'] = prop2['opacity'] < 0 ? 0 : prop2['opacity'];
2073	    		this.$caption.css(prop2);
2074				*/
2075    		}
2076    		
2077    		this.ticking = false;
2078    	}
2079    };
2080
2081
2082
2083$.fn.aviaFullscreenSlider = function( options )
2084{
2085	return this.each(function()
2086	{
2087		var active = $.data( this, 'aviaFullscreenSlider' );
2088
2089		if(!active)
2090		{
2091			//make sure that the function doesnt get aplied a second time
2092			$.data( this, 'aviaFullscreenSlider', 1 );
2093			
2094			//create the preparations for fullscreen slider
2095			new $.AviaFullscreenSlider( options, this );
2096		}
2097	});
2098}
2099	
2100// -------------------------------------------------------------------------------------------
2101// makes sure that the fixed container height is removed once the layerslider is loaded, so it adapts to the screen resolution
2102// -------------------------------------------------------------------------------------------
2103
2104	$.AviaParallaxElement  =  function(options, element)
2105	{
2106	    this.$el  	  	= $( element ).addClass('active-parallax');
2107	    this.$win	  	= $( window );
2108	    this.$body	  	= $( 'body' );
2109	    this.$parent  	= this.$el.parent();
2110	    this.property	= {};
2111	    this.isMobile 	= $.avia_utilities.isMobile;
2112	    this.ratio		= this.$el.data('avia-parallax-ratio') || 0.5;
2113	    this.transform  = document.documentElement.className.indexOf('avia_transform') !== -1 ? true : false;
2114	    this.transform3d= document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
2115	    this.ticking	= false;
2116	    
2117	    if($.avia_utilities.supported.transition === undefined)
2118		{
2119			$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
2120		}
2121	    
2122	    this._init( options );
2123	}
2124	
2125	$.AviaParallaxElement.prototype = {
2126	
2127		_init: function( options )
2128    	{
2129    		var _self = this;
2130			if(_self.isMobile)
2131			{
2132				return; //disable parallax scrolling on mobile
2133			}
2134			
2135			//fetch window constants
2136			setTimeout(function()
2137			{
2138    			_self._fetch_properties();
2139    		},30);
2140			
2141			this.$win.on("debouncedresize av-height-change",  $.proxy( _self._fetch_properties, _self));
2142			this.$body.on("av_resize_finished",  $.proxy( _self._fetch_properties, _self));
2143			
2144			
2145			
2146			//activate the scrolling
2147			setTimeout(function()
2148			{
2149				_self.$win.on( 'scroll', $.proxy( _self._on_scroll, _self) );
2150    			
2151    		},100);
2152		},
2153		
2154		_fetch_properties: function()
2155		{
2156			this.property.offset 	= this.$parent.offset().top;
2157			this.property.wh 		= this.$win.height();
2158			this.property.height 	= this.$parent.outerHeight();
2159			
2160			//set the height of the element based on the windows height, offset ratio and parent height
2161			this.$el.height(Math.ceil((this.property.wh * this.ratio) + this.property.height));
2162			
2163			//re-position the element
2164			this._parallax_scroll();
2165		},
2166		
2167		_on_scroll: function(e)
2168    	{
2169	    	var _self = this;
2170	    	
2171	    	if(!_self.ticking) {
2172		     _self.ticking = true;
2173		      window.requestAnimationFrame( $.proxy( _self._parallax_scroll, _self) );
2174		    }
2175    	},
2176		
2177		_parallax_scroll: function(e)
2178    	{
2179    		var winTop		=  this.$win.scrollTop(),
2180    			winBottom	=  winTop + this.property.wh,
2181    			scrollPos 	= "0", 
2182    			prop = {};
2183    		
2184    		//shift element when it moves into viewport
2185    		if(this.property.offset < winBottom && winTop <= this.property.offset + this.property.height)
2186    		{	
2187    			scrollPos = Math.ceil( (winBottom - this.property.offset) * this.ratio );
2188    			
2189    			//parallax movement via backround position change, although
2190    			if(this.transform3d)
2191    			{
2192    				prop[$.avia_utilities.supported.transition+"transform"] = "translate3d(0px,"+ scrollPos +"px, 0px)";
2193    			}
2194    			else if(this.transform)
2195    			{
2196    				prop[$.avia_utilities.supported.transition+"transform"] = "translate(0px,"+ scrollPos +"px)";
2197    			}
2198    			else
2199    			{
2200    				prop["background-position"] = "0px "+ scrollPos +"px";
2201    			}
2202	    		
2203	    		this.$el.css(prop);
2204    		}
2205    		
2206    		this.ticking = false;
2207    	}
2208	};
2209
2210
2211$.fn.avia_parallax = function(options)
2212{
2213	return this.each(function()
2214    	{
2215    		var self = $.data( this, 'aviaParallax' );
2216
2217    		if(!self)
2218    		{
2219    			self = $.data( this, 'aviaParallax', new $.AviaParallaxElement( options, this ) );
2220    		}
2221    	});
2222}
2223
2224
2225// -------------------------------------------------------------------------------------------
2226// Helper to allow fixed bgs on mobile
2227// -------------------------------------------------------------------------------------------
2228
2229$.fn.avia_mobile_fixed = function(options)
2230{
2231	var isMobile = $.avia_utilities.isMobile;
2232	if(!isMobile) return;
2233	
2234	return this.each(function()
2235	{
2236		var current				= $(this).addClass('av-parallax-section'),
2237			$background 		= current.attr('style'),
2238			$attachment_class 	= current.data('section-bg-repeat'),
2239			template			= "";
2240			
2241			if($attachment_class == 'stretch' || $attachment_class == 'no-repeat' )
2242			{
2243				$attachment_class = " avia-full-stretch"; 
2244			}
2245			else
2246			{
2247				$attachment_class = ""; 
2248			}
2249			
2250			template = "<div class='av-parallax " + $attachment_class + "' data-avia-parallax-ratio='0.0' style = '" + $background + "' ></div>";
2251			
2252			current.prepend(template);
2253			current.attr('style','');
2254	});
2255}
2256
2257
2258
2259
2260	
2261// -------------------------------------------------------------------------------------------
2262// makes sure that the fixed container height is removed once the layerslider is loaded, so it adapts to the screen resolution
2263// -------------------------------------------------------------------------------------------
2264
2265$.fn.layer_slider_height_helper = function(options)
2266{
2267	return this.each(function()
2268	{
2269		var container 	= $(this),
2270			first_div 	= container.find('>div:first'),
2271			timeout 	= false,
2272			counter 	= 0,
2273			reset_size 	= function()
2274			{
2275				if(first_div.height() > 0 || counter > 5)
2276				{
2277					container.height('auto');
2278				}
2279				else
2280				{
2281					timeout = setTimeout(reset_size, 500);
2282					counter++;
2283				}
2284			};
2285
2286		if(!first_div.length) return;
2287
2288		timeout = setTimeout(reset_size, 0);
2289	});
2290}
2291
2292// -------------------------------------------------------------------------------------------
2293// testimonial shortcode javascript
2294// -------------------------------------------------------------------------------------------
2295
2296$.fn.avia_sc_testimonial = function(options)
2297{
2298	return this.each(function()
2299	{
2300		var container = $(this), elements = container.find('.avia-testimonial');
2301
2302
2303		//trigger displaying of thumbnails
2304		container.on('avia_start_animation', function()
2305		{
2306			elements.each(function(i)
2307			{
2308				var element = $(this);
2309				setTimeout(function(){ element.addClass('avia_start_animation') }, (i * 150));
2310			});
2311		});
2312	});
2313}
2314
2315
2316// -------------------------------------------------------------------------------------------
2317// Progress bar shortcode javascript
2318// -------------------------------------------------------------------------------------------
2319
2320$.fn.avia_sc_progressbar = function(options)
2321{
2322	return this.each(function()
2323	{
2324		var container = $(this), elements = container.find('.avia-progress-bar');
2325		
2326		
2327		//trigger displaying of progress bar
2328		container.on('avia_start_animation', function()
2329		{
2330			elements.each(function(i)
2331			{
2332				var element = $(this)
2333				
2334				setTimeout(function()
2335				{ 
2336					element.find('.progress').addClass('avia_start_animation') 
2337					element.find('.progressbar-percent').avia_sc_animated_number(
2338					{
2339						instant_start:true, simple_up:true, start_timer: 10
2340					});
2341					
2342				}, (i * 250));
2343			});
2344		});
2345	});
2346}
2347
2348// -------------------------------------------------------------------------------------------
2349// Iconlist shortcode javascript
2350// -------------------------------------------------------------------------------------------
2351
2352$.fn.avia_sc_iconlist = function(options)
2353{
2354	return this.each(function()
2355	{
2356		var iconlist = $(this), elements = iconlist.find('>li');
2357
2358
2359		//trigger displaying of thumbnails
2360		iconlist.on('avia_start_animation', function()
2361		{
2362			elements.each(function(i)
2363			{
2364				var element = $(this);
2365				setTimeout(function(){ element.addClass('avia_start_animation') }, (i * 350));
2366			});
2367		});
2368	});
2369}
2370
2371
2372// -------------------------------------------------------------------------------------------
2373//  shortcode javascript for delayed animation even when non connected elements are used
2374// -------------------------------------------------------------------------------------------
2375
2376$.fn.avia_sc_animation_delayed = function(options)
2377{
2378	var global_timer = 0,
2379		delay = options.delay || 50,
2380		max_timer = 10,
2381		new_max = setTimeout(function(){ max_timer = 20; }, 500);
2382	
2383	return this.each(function()
2384	{
2385		var elements = $(this);
2386
2387		//trigger displaying of thumbnails
2388		elements.on('avia_start_animation', function()
2389		{
2390			var element = $(this);
2391			 
2392			if(global_timer < max_timer) global_timer ++;
2393			
2394			setTimeout(function()
2395			{ 
2396				element.addClass('avia_start_delayed_animation'); 
2397				if(global_timer > 0) global_timer --; 
2398			
2399			}, (global_timer * delay));
2400			
2401		});
2402	});
2403}
2404
2405/*delayd animations when used within tab sections or similar elements. this way they get animated each new time a tab is shown*/
2406$.fn.avia_delayed_animation_in_container = function(options)
2407{
2408	return this.each(function()
2409	{
2410		var elements = $(this);
2411		
2412		elements.on('avia_start_animation_if_current_slide_is_active', function()
2413		{
2414			var current = $(this),
2415				animate = current.find('.avia_start_animation_when_active');
2416				
2417				animate.addClass('avia_start_animation').trigger('avia_start_animation');
2418		});
2419		
2420		elements.on('avia_remove_animation', function()
2421		{
2422			var current = $(this),
2423				animate = current.find('.avia_start_animation_when_active, .avia_start_animation');
2424				animate.removeClass('avia_start_animation avia_start_delayed_animation');
2425		});
2426	});
2427}
2428
2429
2430
2431
2432
2433// -------------------------------------------------------------------------------------------
2434// Section Height Helper
2435// -------------------------------------------------------------------------------------------
2436
2437$.fn.avia_browser_height = function()
2438{
2439	if(!this.length) return;
2440	
2441	var win			= $(window),
2442		html_el		= $('html'),
2443		subtract	= $('#wpadminbar, #header.av_header_top:not(.html_header_transparency #header), #main>.title_container'),
2444		css_block	= $("<style type='text/css' id='av-browser-height'></style>").appendTo('head:first'), 
2445		sidebar_menu= $('.html_header_sidebar #top #header_main'),
2446		full_slider	= $('.html_header_sidebar .avia-fullscreen-slider.avia-builder-el-0.avia-builder-el-no-sibling').addClass('av-solo-full'),
2447		calc_height = function()
2448		{
2449			var css			= "",
2450				wh100 		= win.height(),
2451				ww100 		= win.width(),
2452				wh100_mod 	= wh100,
2453				whCover		= (wh100 / 9) * 16,
2454				wwCover		= (ww100 / 16) * 9,
2455				wh75		= Math.round( wh100 * 0.75 ),
2456				wh50		= Math.round( wh100 * 0.5  ),
2457				wh25		= Math.round( wh100 * 0.25 ),
2458				solo		= 0;
2459			
2460			if(sidebar_menu.length) solo = sidebar_menu.height();
2461			
2462			subtract.each(function(){ wh100_mod -= this.offsetHeight - 1; });	
2463			
2464			var whCoverMod	= (wh100_mod / 9) * 16;
2465			
2466			//fade in of section content with minimum height once the height has been calculated
2467			css += ".avia-section.av-minimum-height .container{opacity: 1; }\n";
2468			
2469			//various section heights (100-25% as well as 100% - header/adminbar in case its the first builder element)
2470			css += ".av-minimum-height-100 .container, .avia-fullscreen-slider .avia-slideshow, #top.avia-blank .av-minimum-height-100 .container, .av-cell-min-height-100 > .flex_cell{height:"+wh100+"px;}\n";
2471			css += ".av-minimum-height-75 .container, .av-cell-min-height-75 > .flex_cell	{height:"+wh75+"px;}\n";
2472			css += ".av-minimum-height-50 .container, .av-cell-min-height-50 > .flex_cell	{height:"+wh50+"px;}\n";
2473			css += ".av-minimum-height-25 .container, .av-cell-min-height-25 > .flex_cell	{height:"+wh25+"px;}\n";
2474			css += ".avia-builder-el-0.av-minimum-height-100 .container, .avia-builder-el-0.avia-fullscreen-slider .avia-slideshow, .avia-builder-el-0.av-cell-min-height-100 > .flex_cell{height:"+wh100_mod+"px;}\n";
2475			
2476			css += "#top .av-solo-full .avia-slideshow {min-height:"+solo+"px;}\n";
2477			
2478			//fullscreen video calculations
2479			if(ww100/wh100 < 16/9)
2480			{
2481				css += "#top .av-element-cover iframe, #top .av-element-cover embed, #top .av-element-cover object, #top .av-element-cover video{width:"+whCover+"px; left: -"+(whCover - ww100)/2+"px;}\n";
2482			}
2483			else
2484			{
2485				css += "#top .av-element-cover iframe, #top .av-element-cover embed, #top .av-element-cover object, #top .av-element-cover video{height:"+wwCover+"px; top: -"+(wwCover - wh100)/2+"px;}\n";
2486			}
2487			
2488			if(ww100/wh100_mod < 16/9)
2489			{
2490				css += "#top .avia-builder-el-0 .av-element-cover iframe, #top .avia-builder-el-0 .av-element-cover embed, #top .avia-builder-el-0 .av-element-cover object, #top .avia-builder-el-0 .av-element-cover video{width:"+whCoverMod+"px; left: -"+(whCoverMod - ww100)/2+"px;}\n";
2491			}
2492			else
2493			{
2494				css += "#top .avia-builder-el-0 .av-element-cover iframe, #top .avia-builder-el-0 .av-element-cover embed, #top .avia-builder-el-0 .av-element-cover object, #top .avia-builder-el-0 .av-element-cover video{height:"+wwCover+"px; top: -"+(wwCover - wh100_mod)/2+"px;}\n";
2495			}
2496			
2497			//ie8 needs different insert method
2498			try{
2499				css_block.text(css); 
2500			}
2501			catch(err){
2502				css_block.remove();
2503				css_block = $("<style type='text/css' id='av-browser-height'>"+css+"</style>").appendTo('head:first');
2504			}
2505			
2506			
2507			setTimeout(function(){ win.trigger('av-height-change'); /*broadcast the height change*/ },100);
2508		};
2509	
2510	win.on( 'debouncedresize', calc_height);
2511	calc_height();
2512}
2513
2514// -------------------------------------------------------------------------------------------
2515// Video Section helper
2516// -------------------------------------------------------------------------------------------
2517
2518$.fn.avia_video_section = function()
2519{
2520	if(!this.length) return;
2521	
2522	var elements	= this.length, content = "",
2523		win			= $(window),
2524		css_block	= $("<style type='text/css' id='av-section-height'></style>").appendTo('head:first'), 
2525		calc_height = function(section, counter)
2526		{
2527			if(counter === 0) { content = "";}
2528		
2529			var css			= "",
2530				the_id		= '#' +section.attr('id'),
2531				wh100 		= section.height(),
2532				ww100 		= section.width(),
2533				aspect		= section.data('sectionVideoRatio').split(':'),
2534				video_w		= aspect[0],
2535				video_h		= aspect[1],
2536				whCover		= (wh100 / video_h ) * video_w,
2537				wwCover		= (ww100 / video_w ) * video_h;
2538			
2539			//fullscreen video calculations
2540			if(ww100/wh100 < video_w/video_h)
2541			{
2542				css += "#top "+the_id+" .av-section-video-bg iframe, #top "+the_id+" .av-section-video-bg embed, #top "+the_id+" .av-section-video-bg object, #top "+the_id+" .av-section-video-bg video{width:"+whCover+"px; left: -"+(whCover - ww100)/2+"px;}\n";
2543			}
2544			else
2545			{
2546				css += "#top "+the_id+" .av-section-video-bg iframe, #top "+the_id+" .av-section-video-bg embed, #top "+the_id+" .av-section-video-bg object, #top "+the_id+" .av-section-video-bg video{height:"+wwCover+"px; top: -"+(wwCover - wh100)/2+"px;}\n";
2547			}
2548			
2549			content = content + css;
2550			
2551			if(elements == counter + 1)
2552			{
2553				//ie8 needs different insert method
2554				try{
2555					css_block.text(content);
2556				}
2557				catch(err){
2558					css_block.remove();
2559					css_block = $("<style type='text/css' id='av-section-height'>"+content+"</style>").appendTo('head:first');
2560				}
2561			}
2562		};
2563		
2564		
2565	return this.each(function(i)
2566	{
2567		var self = $(this);
2568		
2569		win.on( 'debouncedresize', function(){ calc_height(self, i); });
2570		calc_height(self, i);
2571	});
2572	
2573}
2574
2575
2576
2577
2578
2579
2580
2581
2582// -------------------------------------------------------------------------------------------
2583// Gallery shortcode javascript
2584// -------------------------------------------------------------------------------------------
2585
2586$.fn.avia_sc_gallery = function(options)
2587{
2588	return this.each(function()
2589	{
2590		var gallery = $(this), images = gallery.find('img'), big_prev = gallery.find('.avia-gallery-big');
2591
2592
2593		//trigger displaying of thumbnails
2594		gallery.on('avia_start_animation', function()
2595		{
2596			images.each(function(i)
2597			{
2598				var image = $(this);
2599				setTimeout(function(){ image.addClass('avia_start_animation') }, (i * 110));
2600			});
2601		});
2602		
2603		if(gallery.hasClass('deactivate_avia_lazyload')) gallery.trigger('avia_start_animation');
2604
2605		//trigger thumbnail hover and big prev image change
2606		if(big_prev.length)
2607		{
2608			gallery.on('mouseenter','.avia-gallery-thumb a', function()
2609			{
2610				var _self = this;
2611
2612				big_prev.attr('data-onclick', _self.getAttribute("data-onclick"));
2613				big_prev.height(big_prev.height());
2614				big_prev.attr('href', _self.href)
2615
2616				var newImg 		= _self.getAttribute("data-prev-img"),
2617					oldImg 		= big_prev.find('img'),
2618					oldImgSrc 	= oldImg.attr('src');
2619
2620				if(newImg != oldImgSrc)
2621				{
2622					var next_img = new Image();
2623					next_img.src = newImg;
2624					
2625					var $next = $(next_img);
2626					
2627					if(big_prev.hasClass('avia-gallery-big-no-crop-thumb'))
2628					{
2629						$next.css({'height':big_prev.height(),'width':'auto'});
2630					}
2631					
2632					big_prev.stop().animate({opacity:0}
2632, function()
2633					{
2634						$next.insertAfter(oldImg);
2635						oldImg.remove();
2636						big_prev.animate({opacity:1});
2637						
2638						big_prev.attr('title',$(_self).attr('title'));
2639						
2640					});
2641				}
2642			});
2643
2644			big_prev.on('click', function()
2645			{
2646				var imagelink = gallery.find('.avia-gallery-thumb a').eq(this.getAttribute("data-onclick") - 1);
2647
2648				if(imagelink && !imagelink.hasClass('aviaopeninbrowser'))
2649				{
2650					imagelink.trigger('click');
2651				}
2652				else if(imagelink)
2653				{
2654					var imgurl = imagelink.attr("href");
2655
2656					if(imagelink.hasClass('aviablank') && imgurl != '' )
2657					{
2658						window.open(imgurl, '_blank');
2659					}
2660					else if( imgurl != '' )
2661					{
2662						window.open(imgurl, '_self');
2663					}
2664				}
2665				return false;
2666			});
2667
2668
2669			$(window).on("debouncedresize", function()
2670			{
2671			  	big_prev.height('auto');
2672			});
2673
2674		}
2675	});
2676}
2677
2678// -------------------------------------------------------------------------------------------
2679// Toggle shortcode javascript
2680// -------------------------------------------------------------------------------------------
2681
2682$.fn.avia_sc_toggle = function(options)
2683{
2684	var defaults =
2685	{
2686		single: '.single_toggle',
2687		heading: '.toggler',
2688		content: '.toggle_wrap',
2689		sortContainer:'.taglist'
2690	};
2691
2692	var win = $(window),
2693		options = $.extend(defaults, options);
2694
2695	return this.each(function()
2696	{
2697		var container 	= $(this).addClass('enable_toggles'),
2698			toggles		= $(options.single, container),
2699			heading 	= $(options.heading, container),
2700			allContent 	= $(options.content, container),
2701			sortLinks	= $(options.sortContainer + " a", container);
2702
2703		heading.each(function(i)
2704		{
2705			var thisheading =  $(this), content = thisheading.next(options.content, container);
2706
2707			function scroll_to_viewport()
2708			{
2709			    //check if toggle title is in viewport. if not scroll up
2710			    var el_offset = content.offset().top,
2711			        scoll_target = el_offset - 50 - parseInt($('html').css('margin-top'),10);
2712
2713			    if(win.scrollTop() > el_offset)
2714			    {
2715			        $('html:not(:animated),body:not(:animated)').animate({scrollTop: scoll_target},200);
2716			    }
2717			}
2718
2719			if(content.css('visibility') != "hidden")
2720			{
2721				thisheading.addClass('activeTitle');
2722			}
2723
2724			thisheading.on('click', function()
2725			{
2726				if(content.css('visibility') != "hidden")
2727				{
2728					content.slideUp(200, function()
2729					{
2730						content.removeClass('active_tc').attr({style:''});
2731						win.trigger('av-height-change');
2732						location.replace(thisheading.data('fake-id') + "-closed");
2733					});
2734					thisheading.removeClass('activeTitle');
2735
2736				}
2737				else
2738				{
2739					if(container.is('.toggle_close_all'))
2740					{
2741						allContent.not(content).slideUp(200, function()
2742						{
2743							$(this).removeClass('active_tc').attr({style:''});
2744							scroll_to_viewport();
2745						});
2746						heading.removeClass('activeTitle');
2747					}
2748					
2749					content.addClass('active_tc');
2750					
2751					setTimeout(function(){
2752						
2753						content.slideDown(200,
2754						
2755							function()
2756							{
2757		                        if(!container.is('.toggle_close_all'))
2758		                        {
2759		                            scroll_to_viewport();
2760		                        }
2761		                        
2762		                        win.trigger('av-height-change');
2763							}
2764						
2765						);
2766					
2767					}, 1);
2768					
2769					thisheading.addClass('activeTitle');
2770					location.replace(thisheading.data('fake-id'));
2771				}
2772				
2773				
2774				
2775			});
2776		});
2777
2778
2779		sortLinks.click(function(e){
2780
2781			e.preventDefault();
2782			var show = toggles.filter('[data-tags~="'+$(this).data('tag')+'"]'),
2783				hide = toggles.not('[data-tags~="'+$(this).data('tag')+'"]');
2784
2785				sortLinks.removeClass('activeFilter');
2786				$(this).addClass('activeFilter');
2787				heading.filter('.activeTitle').trigger('click');
2788				show.slideDown();
2789				hide.slideUp();
2790		});
2791
2792
2793		function trigger_default_open(hash)
2794		{
2795			if(!hash && window.location.hash) hash = window.location.hash;
2796			if(!hash) return;
2797			
2798			var open = heading.filter('[data-fake-id="'+hash+'"]');
2799
2800			if(open.length)
2801			{
2802				if(!open.is('.activeTitle')) open.trigger('click');
2803				window.scrollTo(0, container.offset().top - 70);
2804			}
2805		}
2806		trigger_default_open(false);
2807		
2808		$('a').on('click',function(){
2809            var hash = $(this).attr('href');
2810            if(typeof hash != "undefined" && hash)
2811            {
2812                hash = hash.replace(/^.*?#/,'');
2813                trigger_default_open('#'+hash);
2814            }
2815        });
2816
2817	});
2818};
2819
2820
2821
2822
2823// -------------------------------------------------------------------------------------------
2824// Tab Shortcode
2825// -------------------------------------------------------------------------------------------
2826
2827$.fn.avia_sc_tabs= function(options)
2828{
2829	var defaults =
2830	{
2831		heading: '.tab',
2832		content:'.tab_content',
2833		active:'active_tab',
2834		sidebar: false
2835	};
2836
2837	var win = $(window),
2838		options = $.extend(defaults, options);
2839
2840	return this.each(function()
2841	{
2842		var container 	= $(this),
2843			tab_titles 	= $('<div class="tab_titles"></div>').prependTo(container),
2844			tabs 		= $(options.heading, container),
2845			content 	= $(options.content, container),
2846			newtabs 	= false,
2847			oldtabs 	= false;
2848
2849		newtabs = tabs.clone();
2850		oldtabs = tabs.addClass('fullsize-tab');
2851		tabs = newtabs;
2852
2853		tabs.prependTo(tab_titles).each(function(i)
2854		{
2855			var tab = $(this), the_oldtab = false;
2856
2857			if(newtabs) the_oldtab = oldtabs.filter(':eq('+i+')');
2858
2859			tab.addClass('tab_counter_'+i).bind('click', function()
2860			{
2861				open_content(tab, i, the_oldtab);
2862				return false;
2863			});
2864
2865			if(newtabs)
2866			{
2867				the_oldtab.bind('click', function()
2868				{
2869					open_content(the_oldtab, i, tab);
2870					return false;
2871				});
2872			}
2873		});
2874
2875		set_size();
2876		trigger_default_open(false);
2877		win.on("debouncedresize", set_size);
2878		
2879        $('a').on('click',function(){
2880            var hash = $(this).attr('href');
2881            if(typeof hash != "undefined" && hash)
2882            {
2883                hash = hash.replace(/^.*?#/,'');
2884                trigger_default_open('#'+hash);
2885            }
2886        });
2887
2888		function set_size()
2889		{
2890			if(!options.sidebar) return;
2891			content.css({'min-height': tab_titles.outerHeight() + 1});
2892		}
2893
2894		function open_content(tab, i, alternate_tab)
2895		{
2896			if(!tab.is('.'+options.active))
2897			{
2898				$('.'+options.active, container).removeClass(options.active);
2899				$('.'+options.active+'_content', container).removeClass(options.active+'_content');
2900
2901				tab.addClass(options.active);
2902
2903				var new_loc = tab.data('fake-id');
2904				if(typeof new_loc == 'string') location.replace(new_loc);
2905
2906				if(alternate_tab) alternate_tab.addClass(options.active);
2907				var active_c = content.filter(':eq('+i+')').addClass(options.active+'_content');
2908
2909				if(typeof click_container != 'undefined' && click_container.length)
2910				{
2911					sidebar_shadow.height(active_c.outerHeight());
2912				}
2913				
2914				//check if tab title is in viewport. if not scroll up
2915				var el_offset = active_c.offset().top,
2916					scoll_target = el_offset - 50 - parseInt($('html').css('margin-top'),10);
2917				
2918				if(win.scrollTop() > el_offset)
2919				{
2920					$('html:not(:animated),body:not(:animated)').scrollTop(scoll_target);
2921				}
2922			}
2923		}
2924
2925		function trigger_default_open(hash)
2926		{
2927			if(!hash && window.location.hash) hash = window.location.hash;
2928            		if(!hash) return;
2929            		
2930			var open = tabs.filter('[data-fake-id="'+hash+'"]');
2931
2932			if(open.length)
2933			{
2934				if(!open.is('.active_tab')) open.trigger('click');
2935				window.scrollTo(0, container.offset().top - 70);
2936			}
2937		}
2938
2939	});
2940};
2941
2942
2943
2944
2945// -------------------------------------------------------------------------------------------
2946// Tab Section
2947// -------------------------------------------------------------------------------------------
2948
2949$.fn.avia_sc_tab_section= function()
2950{
2951	var win 			= $(window),
2952		browserPrefix 	= $.avia_utilities.supports('transition'),
2953		cssActive 		= this.browserPrefix !== false ? true : false,
2954		isMobile 		= $.avia_utilities.isMobile,
2955		transform3d		= document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false,
2956		transition		= {};
2957		
2958	return this.each(function()
2959	{
2960		var container 		= $(this),
2961			tabs			= container.find('.av-section-tab-title'),
2962		    	tab_outer = container.find('.av-tab-section-outer-container'),
2963			tab_wrap		= container.find('.av-tab-section-tab-title-container'),
2964			tab_nav			= container.find('.av_tab_navigation'), 
2965			content_wrap	= container.find('.av-tab-section-inner-container'),
2966			single_tabs		= container.find('.av-animation-delay-container'), //for elements inside the tab that receive waypoint animation
2967			inner_content	= container.find('.av-layout-tab-inner'),
2968			sliding_active  = container.is('.av-tab-slide-transition'),
2969			flexible    	= container.is('.av-tab-content-auto'),
2970			current_content = container.find('.__av_init_open'),
2971			min_width		= 0,
2972			change_tab 		= function(e, prevent_hash)
2973			{
2974				e.preventDefault();
2975				
2976				var current_tab 	= $(e.currentTarget),
2977					current_arrow	= current_tab.find('.av-tab-arrow-container span'),
2978					tab_nr			= current_tab.data('av-tab-section-title');
2979					
2980					current_content = container.find('[data-av-tab-section-content="'+tab_nr+'"]');
2981				
2982				var new_bg			= current_content.data('av-tab-bg-color'),
2983					new_font		= current_content.data('av-tab-color'),
2984					prev_container 	= container.find('.av-active-tab-content').not('[data-av-tab-section-content="'+tab_nr+'"]');
2985
2986				tabs.attr('style','').removeClass('av-active-tab-title');
2987				current_tab.addClass('av-active-tab-title');
2988				current_content.addClass("av-active-tab-content");
2989				
2990				if(new_bg !== "") current_arrow.css('background-color', new_bg);
2991				if(new_font !== "") current_tab.css('color', new_font);
2992					
2993				var new_pos = ((parseInt(tab_nr,10) - 1) * -100 );
2994				    if ($('body').hasClass('rtl')) {
2995        				new_pos = ((parseInt(tab_nr,10) - 1) * 100 );
2996    					}
2997				
2998				if(cssActive)
2999				{
3000					//move the slides
3001					new_pos = new_pos / tabs.length;
3002					transition['transform']  = transform3d ? "translate3d(" + new_pos  + "%, 0, 0)" : "translate(" + new_pos + "%,0)"; //3d or 2d transform?
3003					transition['left'] = "0%";
3004					content_wrap.css(transition);
3005				}
3006				else
3007				{
3008					content_wrap.css('left',  new_pos + "%");
3009				}
3010				
3011				set_tab_titlte_pos();
3012				set_slide_height();
3013				
3014				if(!prevent_hash) location.hash = current_tab.attr('href');
3015				
3016				setTimeout(function()
3017				{
3018					current_content.trigger('avia_start_animation_if_current_slide_is_active');
3019					single_tabs.not(current_content).trigger('avia_remove_animation');
3020					
3021				}, 600);	
3022				
3023			},
3024			set_min_width = function()
3025			{
3026				min_width = 0;
3027				tabs.each(function()
3028				{ 
3029					min_width += $(this).outerWidth(); 
3030				});
3031				
3032				tab_wrap.css('min-width',min_width);
3033			},
3034			
3035			set_slide_height = function()
3036			{				
3037				if(current_content.length && flexible)
3038				{
3039					var old_height = inner_content.height();
3040					inner_content.height('auto');
3041					
3042					var height = current_content.find('.av-layout-tab-inner').height(),
3043					    add_height = tab_wrap.height();
3044					
3045					tab_outer.css('max-height', height + add_height + 100);
3046					inner_content.height(old_height);
3047					inner_content.height(height);
3048					
3049					inner_content.css( 'overflow', 'hidden' );
3050					
3051					setTimeout(function() { win.trigger('av-height-change'); }, 600);
3052				}
3053			},
3054			
3055			set_tab_titlte_pos = function()
3056			{
3057				//	scroll the tabs if there is not enough room to display them all - rtl allign right to left !!
3058				var current_tab = container.find('.av-active-tab-title'),
3059					viewport	= container.width(),
3060					left_pos	= ( current_tab.position().left * - 1) - (current_tab.outerWidth() / 2) + (viewport / 2);
3061			
3062				if( ! $('body').hasClass("rtl") )
3063				{
3064					if( viewport >= min_width )
3065					{
3066						left_pos = 0;
3067					}
3068					
3069					if(left_pos + min_width < viewport) left_pos = (min_width - viewport) * -1;
3070					if(left_pos > 0) left_pos = 0;
3071				
3072					tab_wrap.css('left',left_pos );
3073				}
3074				else
3075				{
3076					var right_pos = 0;
3077					
3078					if( viewport < min_width )
3079					{
3080						if( left_pos + min_width > viewport )
3081						{
3082							if( left_pos > 0 ) left_pos = 0;
3083							
3084							var right_pos = (left_pos + min_width - viewport) * -1;
3085							tab_wrap.css('left', 'auto' );
3086							tab_wrap.css('right', right_pos );
3087						}
3088					}
3089					tab_wrap.css('left', 'auto' );
3090					tab_wrap.css('right', right_pos );
3091				}
3092			},
3093			switch_to_next_prev = function(e)
3094			{
3095				if(!isMobile) return;
3096				
3097				var clicked 		= $(e.currentTarget),
3098					current_tab 	= container.find('.av-active-tab-title');
3099					
3100					if(clicked.is('.av_prev_tab_section'))
3101					{
3102						current_tab.prev('.av-section-tab-title').trigger('click');
3103					}
3104					else
3105					{
3106						current_tab.next('.av-section-tab-title').trigger('click');
3107					}
3108			},
3109			
3110			get_init_open = function()
3111			{
3112				if(!hash && window.location.hash) var hash = window.location.hash;
3113	            		
3114				var open = tabs.filter('[href="'+hash+'"]');
3115				
3116				if(open.length)
3117				{
3118					if(!open.is('.active_tab')) open.trigger('click');
3119				}
3120				else
3121				{
3122					//set correct color
3123					container.find('.av-active-tab-title').trigger('click', true);
3124				}
3125			};
3126				
3127		$.avia_utilities.preload({
3128			
3129			container: current_content , 
3130			single_callback:  function(){ 
3131			
3132				tabs.on('click', change_tab);
3133				tab_nav.on('click', switch_to_next_prev);
3134				win.on('debouncedresize', set_tab_titlte_pos);	
3135				win.on('debouncedresize av-height-change', set_slide_height);	
3136				
3137				set_min_width();
3138				set_slide_height(); 
3139				get_init_open();
3140			}
3141			
3142		});	
3143		
3144		content_wrap.avia_swipe_trigger({prev:'.av_prev_tab_section', next:'.av_next_tab_section'});
3145			
3146	});
3147};
3148
3149
3150
3151
3152// -------------------------------------------------------------------------------------------
3153// Horizontal Gallery
3154// -------------------------------------------------------------------------------------------
3155
3156$.fn.avia_hor_gallery= function(options)
3157{
3158	var defaults =
3159		{
3160			slide_container	: '.av-horizontal-gallery-inner', //element with max width
3161			slide_element	: '.av-horizontal-gallery-slider', //element that gets moved
3162			slide_content	: '.av-horizontal-gallery-wrap',
3163			active			: 'av-active-gal-item',				// must be a class string without the . in front
3164			prev			: '.av-horizontal-gallery-prev',
3165			next			: '.av-horizontal-gallery-next'
3166		};
3167
3168	var options = $.extend(defaults, options);
3169	
3170	var win 			= $(window),
3171		browserPrefix 	= $.avia_utilities.supports('transition'),
3172		cssActive 		= this.browserPrefix !== false ? true : false,
3173		isMobile 		= $.avia_utilities.isMobile,
3174		transform3d		= document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false,
3175		transition		= {};
3176		
3177	return this.each(function()
3178	{
3179		var container 			= $(this),
3180			slide_container 	= container.find(options.slide_container),
3181			slide_element		= container.find(options.slide_element),
3182			slide_content		= container.find(options.slide_content),
3183			prev				= container.find(options.prev),
3184			next				= container.find(options.next),
3185			imgs				= container.find('img'),
3186			
3187			all_elements_width 	= 0,
3188			currentIndex		= false,
3189			initial				= container.data('av-initial'),
3190			
3191			set_up = function( init )
3192			{
3193				var sl_height = (slide_container.width() / 100 ) * slide_container.data('av-height');
3194				
3195				slide_container.css({'padding':0}).height(sl_height);
3196				
3197				//fixes img distortion when resizing browser:
3198				imgs.css('display','inline-block');
3199				setTimeout(function(){ imgs.css('display','block'); }, 10);
3200				
3201				//calculate the slidelement width based on the elements inside
3202				all_elements_width = 0;
3203				
3204				slide_content.each(function()
3205				{ 
3206					all_elements_width += $(this).outerWidth( true ); 
3207				});
3208				
3209				slide_element.css( 'min-width' , all_elements_width );
3210				
3211				if(currentIndex !== false )
3212				{
3213					change_active(currentIndex);
3214				}
3215			},
3216			change_active = function(index)
3217			{
3218				//scroll the tabs if there is not enough room to display them all
3219				var current 	= slide_element.find(options.slide_content).eq(index),
3220					viewport	= slide_container.width(),
3221					modifier	= container.data('av-enlarge') > 1  && currentIndex == index ? container.data('av-enlarge') : 1,
3222					outerWidth	= current.outerWidth( true ) * modifier,
3223					margin_right= parseInt( current.css('margin-right') , 10 ) / 2,
3224					left_pos	= viewport < all_elements_width ? (current.position().left * - 1) - (outerWidth / 2) + (viewport / 2): 0;
3225				
3226				//center properly
3227				left_pos = left_pos + margin_right;
3228				
3229				//out of bounce right side
3230				if(left_pos + all_elements_width < viewport) left_pos = (all_elements_width - viewport - parseInt(current.css('margin-right'),10) ) * -1;
3231				
3232				//out of bounce left side
3233				if(left_pos > 0) left_pos = 0;
3234				
3235				//set pos
3236				slide_element.css('left',left_pos );
3237				
3238				slide_container.find("." +options.active).removeClass(options.active);
3239				current.addClass(options.active);
3240				currentIndex = index;
3241				
3242			};
3243
3244			
3245		 $.avia_utilities.preload({container: container , global_callback:  function()
3246		 {
3247			 // activate behavior
3248			set_up( 'init' );
3249			win.on('debouncedresize', set_up);
3250			if(initial) change_active(initial - 1);
3251			
3252			setTimeout(function(){
3253				container.addClass('av-horizontal-gallery-animated');
3254			},10); 
3255		
3256		  }});
3257			
3258		
3259		
3260		
3261		
3262		
3263		
3264		//swipe on mobile
3265		slide_element.avia_swipe_trigger({prev:options.prev, next:options.next});
3266		
3267		//element click
3268		slide_content.on('click', function(e)
3269		{
3270			var current = $(this);
3271			var index = slide_content.index(current);
3272			
3273			if(currentIndex === index)
3274			{
3275				if(container.data('av-enlarge') > 1 && !$(e.target).is('a') )
3276				{
3277					//slide_container.find("." +options.active).removeClass(options.active);
3278					//currentIndex = false;	
3279				}
3280				return;
3281			}
3282			
3283			change_active(index);
3284		});
3285		
3286		prev.on('click', function(e)
3287		{
3288			if(currentIndex === false) currentIndex = 1;
3289			var index = currentIndex - 1;
3290			if(index < 0) index = 0;
3291			
3292			change_active(index);
3293		});
3294		
3295		next.on('click', function(e)
3296		{
3297			if(currentIndex === false) currentIndex = -1;
3298			var index = currentIndex + 1;
3299			if(index > slide_content.length - 1) index = slide_content.length - 1;
3300			
3301			change_active(index);
3302		});
3303		
3304		//if its a desktop browser add arrow navigation, otherwise add touch nav
3305		if(!isMobile)
3306		{
3307			container.avia_keyboard_controls({ 37: options.prev, 39: options.next });
3308		}
3309		else
3310		{
3311			container.avia_swipe_trigger({next: options.next, prev: options.prev});
3312		}
3313		
3314		
3315	
3316	});
3317};
3318
3319// -------------------------------------------------------------------------------------------
3320// Big Number animation shortcode javascript
3321// -------------------------------------------------------------------------------------------
3322
3323(function($)
3324{
3325	// options.simple_up = dont prepend leading zeros, options.instant_start = trigger counting instantly, options.start_timer = delay when to start counting
3326	$.fn.avia_sc_animated_number = function(options) 
3327	{
3328		if(!this.length) return;
3329		if(this.is('.avia_sc_animated_number_active')) return;
3330		
3331		this.addClass('avia_sc_animated_number_active');
3332	
3333		var skipStep = false,
3334			simple_upcount 	= (options && options.simple_up) ? true : false,
3335			start_timer 	= (options && options.start_timer) ? options.start_timer : 300,
3336		start_count = function(element, countTo, increment, current, fakeCountTo)
3337		{
3338			
3339			
3340			//calculate the new number
3341			var newCount = current + increment;
3342			
3343			//if the number is bigger than our final number set the number and finish
3344			if(newCount >= fakeCountTo) 
3345			{
3346				element.text(countTo); //exit
3347				
3348			}
3349			else
3350			{
3351				var prepend = "", addZeros = countTo.toString().length - newCount.toString().length
3352				
3353				//if the number has less digits than the final number some zeros where omitted. add them to the front
3354				for(var i = addZeros; i > 0; i--){ prepend += "0"; }
3355				
3356				if(simple_upcount) prepend = 0;
3357				element.text(prepend + newCount);
3358				
3359				window.requestAnimationFrame(function(){ start_count(element, countTo, increment, newCount, fakeCountTo) });
3360			}
3361		};
3362	
3363		return this.each(function()
3364		{
3365			var number_container = $(this), elements = number_container.find('.__av-single-number'), countTimer = number_container.data('timer') || 3000;
3366			
3367			//prepare elements
3368			elements.each(function(i)
3369			{
3370				var element = $(this), text = element.text();
3371				if(window.addEventListener) element.text( text.replace(/./g, "0")); /*https://github.com/AviaThemes/wp-themes/issues/812*/
3372			});
3373			
3374			//trigger number animation
3375			number_container.addClass('number_prepared').on('avia_start_animation', function()
3376			{
3377				if(number_container.is('.avia_animation_done')) return;
3378				number_container.addClass('avia_animation_done');
3379				
3380				elements.each(function(i)
3381				{
3382					var element = $(this), countTo = element.data('number'), fakeCountTo = countTo, current = parseInt(element.text(),10), zeroOnly = /^0+$/.test(countTo), increment = 0;
3383					
3384					//fallback for decimals like 00 or 000
3385					if(zeroOnly && countTo !== 0) fakeCountTo = countTo.replace(/0/g, '9');
3386					
3387					increment = Math.round( fakeCountTo * 32 / countTimer);
3388					if(increment == 0 || increment % 10 == 0) increment += 1;
3389					
3390					setTimeout(function(){ start_count(element, countTo, increment, current, fakeCountTo);}, start_timer);
3391				});
3392			});
3393			
3394			if(options && options.instant_start == true)
3395			{
3396				number_container.trigger('avia_start_animation');
3397			}
3398			
3399			
3400		});
3401	}
3402})(jQuery);
3403
3404
3405
3406
3407// -------------------------------------------------------------------------------------------
3408// contact form ajax
3409// -------------------------------------------------------------------------------------------
3410
3411(function($)
3412{
3413	$.fn.avia_ajax_form = function(variables)
3414	{	
3415		var defaults =
3416		{
3417			sendPath: 'send.php',
3418			responseContainer: '.ajaxresponse'
3419		};
3420
3421		var options = $.extend(defaults, variables);
3422
3423		return this.each(function()
3424		{
3425			var form = $(this),
3426				form_sent = false,
3427				send =
3428				{
3429					formElements: form.find('textarea, select, input[type=text], input[type=checkbox], input[type=hidden]'),
3430					validationError:false,
3431					button : form.find('input:submit'),
3432					dataObj : {}
3433				},
3434
3435				responseContainer = form.next(options.responseContainer+":eq(0)");
3436
3437				send.button.bind('click', checkElements);
3438				
3439				
3440				//change type of email forms on mobile so the e-mail keyboard with @ sign is used
3441				if($.avia_utilities.isMobile)
3442				{
3443					send.formElements.each(function(i)
3444					{
3445						var currentElement = $(this), is_email = currentElement.hasClass('is_email');
3446						if(is_email) currentElement.attr('type','email');
3447					});
3448				}
3449			
3450
3451			function checkElements( e )
3452			{
3453				// reset validation var and send data
3454				send.validationError = false;
3455				send.datastring = 'ajax=true';
3456
3457				send.formElements.each(function(i)
3458				{
3459					var currentElement = $(this),
3460						surroundingElement = currentElement.parent(),
3461						value = currentElement.val(),
3462						name = currentElement.attr('name'),
3463					 	classes = currentElement.attr('class'),
3464					 	nomatch = true;
3465
3466					 	if(currentElement.is(':checkbox'))
3467					 	{
3468					 		if(currentElement.is(':checked')) { value = true } else {value = ''}
3469					 	}
3470					 	
3471					 	send.dataObj[name] = encodeURIComponent(value);
3472
3473					 	if(classes && classes.match(/is_empty/))
3474						{
3475							if(value == '' || value == null)
3476							{
3477								surroundingElement.removeClass("valid error ajax_alert").addClass("error");
3478								send.validationError = true;
3479							}
3480							else
3481							{
3482								surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
3483							}
3484							nomatch = false;
3485						}
3486
3487						if(classes && classes.match(/is_email/))
3488						{
3489							if(!value.match(/^[\w|\.|\-]+@\w[\w|\.|\-]*\.[a-zA-Z]{2,20}$/))
3490							{
3491								surroundingElement.removeClass("valid error ajax_alert").addClass("error");
3492								send.validationError = true;
3493							}
3494							else
3495							{
3496								surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
3497							}
3498							nomatch = false;
3499						}
3500
3501						if(classes && classes.match(/is_phone/))
3502						{
3503							if(!value.match(/^(\d|\s|\-|\/|\(|\)|\[|\]|e|x|t|ension|\.|\+|\_|\,|\:|\;){3,}$/))
3504							{
3505								surroundingElement.removeClass("valid error ajax_alert").addClass("error");
3506								send.validationError = true;
3507							}
3508							else
3509							{
3510								surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
3511							}
3512							nomatch = false;
3513						}
3514
3515						if(classes && classes.match(/is_number/))
3516						{
3517							if(!($.isNumeric(value)) || value == "")
3518							{
3519								surroundingElement.removeClass("valid error ajax_alert").addClass("error");
3520								send.validationError = true;
3521							}
3522							else
3523							{
3524								surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
3525							}
3526							nomatch = false;
3527						}
3528
3529						if(classes && classes.match(/captcha/))
3530						{
3531							var verifier 	= form.find("#" + name + "_verifier").val(),
3532								lastVer		= verifier.charAt(verifier.length-1),
3533								finalVer	= verifier.charAt(lastVer);
3534
3535							if(value != finalVer)
3536							{
3537								surroundingElement.removeClass("valid error ajax_alert").addClass("error");
3538								send.validationError = true;
3539							}
3540							else
3541							{
3542								surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
3543							}
3544							nomatch = false;
3545						}
3546
3547						if(nomatch && value != '')
3548						{
3549							surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
3550						}
3551				});
3552
3553				if(send.validationError == false)
3554				{
3555					if(form.data('av-custom-send'))
3556					{
3557						mailchimp_send();	
3558					}
3559					else
3560					{
3561						send_ajax_form();
3562					}
3563				}
3564				
3565				return false;
3566			}
3567			
3568			
3569			function send_ajax_form()
3570			{
3571				if(form_sent){ return false; }
3572
3573				form_sent = true;
3574				send.button.addClass('av-sending-button');
3575				send.button.val(send.button.data('sending-label'));
3576				
3577				var redirect_to = form.data('avia-redirect') || false,
3578					action		= form.attr('action');
3579				
3580				responseContainer.load(action+' '+options.responseContainer, send.dataObj, function()
3581				{
3582					if(redirect_to && action != redirect_to)
3583					{
3584						form.attr('action', redirect_to);
3585						location.href = redirect_to;
3586						// form.submit();
3587					}
3588					else
3589					{
3590						responseContainer.removeClass('hidden').css({display:"block"});
3591						form.slideUp(400, function(){responseContainer.slideDown(400, function(){ $('body').trigger('av_resize_finished'); }); send.formElements.val('');});
3592					}
3593				});
3594			}
3595			
3596			
3597			function mailchimp_send()
3598			{
3599				if(form_sent){ return false; }
3600
3601				form_sent = true;
3602				
3603				var original_label = send.button.val();
3604
3605				send.button.addClass('av-sending-button');
3606				send.button.val(send.button.data('sending-label'));
3607				send.dataObj.ajax_mailchimp = true;
3608				
3609				var redirect_to 		= form.data('avia-redirect') || false,
3610					action				= form.attr('action'),
3611					error_msg_container = form.find('.av-form-error-container'),
3612					form_id 			= form.data('avia-form-id'); 
3613				
3614				$.ajax({
3615					url: action,
3616					type: "POST",
3617					data:send.dataObj,
3618					beforeSend: function()
3619					{
3620						if(error_msg_container.length)
3621						{
3622							error_msg_container.slideUp(400, function()
3623							{
3624								error_msg_container.remove();
3625								$('body').trigger('av_resize_finished');
3626							});
3627						}
3628					},
3629					success: function(responseText)
3630					{
3631						var response	= jQuery("<div>").append(jQuery.parseHTML(responseText)),
3632							error		= response.find('.av-form-error-container');	
3633						
3634						if(error.length)
3635						{
3636							form_sent = false;
3637							form.prepend(error);
3638							error.css({display:"none"}).slideDown(400, function()
3639							{
3640								$('body').trigger('av_resize_finished');
3641							});
3642
3643							send.button.removeClass('av-sending-button');
3644							send.button.val(original_label);
3645						}
3646						else
3647						{
3648							if(redirect_to && action != redirect_to)
3649							{
3650								form.attr('action', redirect_to);
3651								location.href = redirect_to;
3652								// form.submit();
3653							}
3654							else
3655							{
3656								var success_text = response.find(options.responseContainer + "_" + form_id);
3657								
3658								responseContainer.html(success_text).removeClass('hidden').css({display:"block"});
3659								
3660								form.slideUp(400, function()
3661								{
3662									responseContainer.slideDown(400, function()
3663									{ 
3664										$('body').trigger('av_resize_finished'); 
3665									});
3666									
3667								send.formElements.val('');
3668							});
3669							}
3670						}
3671						
3672					},
3673					error: function()
3674					{
3675						
3676					},
3677					complete: function()
3678					{
3679					    
3680					}
3681				});
3682
3683			}
3684			
3685			
3686		});
3687	};
3688})(jQuery);
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701// -------------------------------------------------------------------------------------------
3702// Aviaccordion Slideshow 
3703// 
3704// accordion slider script
3705// -------------------------------------------------------------------------------------------
3706
3707	$.AviaccordionSlider  =  function(options, slider)
3708	{
3709	    this.$slider  	= $( slider );
3710	    this.$inner	  	= this.$slider.find('.aviaccordion-inner');
3711	    this.$slides	= this.$inner.find('.aviaccordion-slide');
3712	    this.$images	= this.$inner.find('.aviaccordion-image');
3713	    this.$last		= this.$slides.filter(':last');
3714	    this.$titles  	= this.$slider.find('.aviaccordion-preview');
3715	    this.$titlePos  = this.$slider.find('.aviaccordion-preview-title-pos');
3716	    this.$titleWrap = this.$slider.find('.aviaccordion-preview-title-wrap');
3717	    this.$win	  	= $( window );
3718	    
3719	    if($.avia_utilities.supported.transition === undefined)
3720		{
3721			$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
3722		}
3723		
3724		this.browserPrefix 	= $.avia_utilities.supported.transition;
3725	    this.cssActive 		= this.browserPrefix !== false ? true : false;
3726	    this.transform3d	= document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
3727		this.isMobile 		= $.avia_utilities.isMobile;
3728		this.property		= this.browserPrefix + 'transform',
3729		this.count			= this.$slides.length;
3730		this.open			= false;
3731		this.autoplay		= false;
3732		this.increaseTitle  = this.$slider.is(".aviaccordion-title-on-hover");
3733		// this.cssActive    = false; //testing no css3 browser
3734		
3735	    this._init( options );
3736	}
3737
3738  	$.AviaccordionSlider.prototype =
3739    {
3740    	_init: function( options )
3741    	{
3742    		var _self = this;
3743    		_self.options = $.extend({}, options, this.$slider.data());
3744			 $.avia_utilities.preload({container: this.$slider , single_c
3744allback:  function(){ _self._kickOff(); }});
3745    	},
3746    	
3747    	_kickOff: function()
3748    	{
3749    		var _self = this;
3750    		
3751    		_self._calcMovement();
3752    		_self._bindEvents();
3753    		_self._showImages();
3754    		_self._autoplay();
3755    	},
3756    	
3757    	_autoplay: function()
3758    	{
3759    		var _self = this;
3760    		
3761    		if(_self.options.autoplay)
3762    		{
3763    			_self.autoplay = setInterval(function()
3764    			{
3765    				_self.open = _self.open === false ? 0 : _self.open + 1;
3766    				if(_self.open >= _self.count) _self.open = 0;
3767    				_self._move({}, _self.open);
3768    				
3769    			}, _self.options.interval * 1000)
3770    		}
3771    	},
3772    	
3773    	_showImages: function()
3774    	{
3775    		var _self = this, counter = 0, delay = 300, title_delay = this.count * delay;
3776    		
3777    		if(this.cssActive)
3778    		{
3779    			setTimeout(function(){ _self.$slider.addClass('av-animation-active'); } , 10);
3780    		}
3781    		
3782    		this.$images.each(function(i)
3783    		{
3784    			var current = $(this), timer = delay * (i + 1);
3785    				
3786    			setTimeout(function()
3787    			{ 
3788    				current.avia_animate({opacity:1}, 400, function()
3789    				{
3790    					current.css($.avia_utilities.supported.transition + "transform", "none");
3791    				}); 
3792    			},timer);
3793    		});
3794    		
3795    		if(_self.increaseTitle) title_delay = 0;
3796    		
3797    		this.$titlePos.each(function(i)
3798    		{
3799    			var current = $(this), new_timer = title_delay + 100 * (i + 1);
3800    					
3801    			setTimeout(function()
3802    			{ 
3803    				current.avia_animate({opacity:1}, 200, function()
3804    				{
3805    					current.css($.avia_utilities.supported.transition + "transform", "none");
3806    				}); 
3807    			},new_timer);
3808    		});
3809    	},
3810    	
3811    	_bindEvents: function()
3812    	{
3813    		var trigger = this.isMobile ? "click" : "mouseenter";
3814    	
3815    		this.$slider.on(trigger,'.aviaccordion-slide', $.proxy( this._move, this));
3816    		this.$slider.on('mouseleave','.aviaccordion-inner', $.proxy( this._move, this));
3817    		this.$win.on('debouncedresize', $.proxy( this._calcMovement, this));
3818    		this.$slider.on('av-prev av-next', $.proxy( this._moveTo, this));
3819    		
3820    		if(this.isMobile)
3821    		{
3822    			this.$slider.avia_swipe_trigger({next: this.$slider, prev: this.$slider, event:{prev: 'av-prev', next: 'av-next'}});
3823    		}
3824    		
3825    	},
3826    	
3827    	_titleHeight: function()
3828    	{
3829    		var th = 0;
3830    		
3831    		this.$titleWrap.css({'height':'auto'}).each(function()
3832    		{
3833    			var new_h = $(this).outerHeight();
3834    			if( new_h > th) th = new_h;
3835    		
3836    		}).css({'height':th + 2});
3837    		
3838    	},
3839    	
3840    	_calcMovement: function(event, allow_repeat)
3841    	{ 
3842    		var _self			= this,
3843    			containerWidth	= this.$slider.width(),
3844    			defaultPos		= this.$last.data('av-left'),
3845    			imgWidth		= this.$images.filter(':last').width() || containerWidth,
3846    			imgWidthPercent = Math.floor((100 / containerWidth) * imgWidth),
3847    			allImageWidth	= imgWidthPercent * _self.count,
3848    			modifier		= 3, // 10 - _self.count,
3849    			tempMinLeft		= 100 - imgWidthPercent,
3850    			minLeft 		= tempMinLeft > defaultPos / modifier ? tempMinLeft : 0,
3851    			oneLeft			= minLeft / (_self.count -1 ),
3852    			titleWidth		= imgWidth;
3853    		
3854    		
3855    		
3856    		if(allImageWidth < 110 && allow_repeat !== false)
3857    		{
3858    			//set height if necessary	
3859    			var slideHeight = this.$slider.height(), 
3860    				maxHeight 	= (slideHeight / allImageWidth) * 110 ;
3861    			
3862    			this.$slider.css({'max-height': maxHeight});
3863    			_self._calcMovement(event, false);
3864    			return;
3865    		}
3866    		
3867    		//backup so the minimized slides dont get too small
3868    		if(oneLeft < 2) minLeft = 0;
3869    		
3870			this.$slides.each(function(i)
3871			{
3872				var current = $(this), newLeft = 0, newRight = 0, defaultLeft = current.data('av-left');
3873					
3874				if( minLeft !== 0)
3875				{
3876					newLeft  = oneLeft * i;
3877					newRight = imgWidthPercent + newLeft - oneLeft;
3878				}
3879				else
3880				{
3881					newLeft  = defaultLeft / Math.abs(modifier);
3882					newRight = 100 - ((newLeft / i) * (_self.count - i));
3883				}
3884				
3885				if(i == 1 && _self.increaseTitle) { titleWidth = newRight + 1; } 
3886				
3887				if(_self.cssActive)
3888				{	
3889					//if we are not animating based on the css left value but on css transform we need to subtract the left value
3890					newLeft = newLeft - defaultLeft;
3891					newRight = newRight - defaultLeft;
3892					defaultLeft = 0;
3893				}
3894				
3895				current.data('av-calc-default', defaultLeft);
3896				current.data('av-calc-left', newLeft);
3897				current.data('av-calc-right', newRight);
3898				
3899			});
3900			
3901			if(_self.increaseTitle) { _self.$titles.css({width: titleWidth + "%"});} 
3902    	},
3903    	
3904    	_moveTo: function(event)
3905    	{
3906    		var direction 	= event.type == "av-next" ? 1 : -1,
3907    			nextSlide 	= this.open === false ? 0 : this.open + direction;
3908    			
3909    		if(nextSlide >= 0 && nextSlide < this.$slides.length) this._move(event, nextSlide);
3910    	},
3911    	
3912    	_move: function(event, direct_open)
3913    	{
3914    		var _self  = this,
3915    			slide  = event.currentTarget,
3916    			itemNo = typeof direct_open != "undefined" ? direct_open : this.$slides.index(slide);
3917    			
3918    		this.open = itemNo;
3919    		
3920    		if(_self.autoplay && typeof slide != "undefined") { clearInterval(_self.autoplay); _self.autoplay = false; }
3921    		
3922    		this.$slides.removeClass('aviaccordion-active-slide').each(function(i)
3923    		{
3924    			var current 	= $(this),
3925    				dataSet 	= current.data(),
3926    				trans_val	= i <= itemNo ? dataSet.avCalcLeft : dataSet.avCalcRight,
3927					transition 	= {},
3928					reset		= event.type == 'mouseleave' ? 1 : 0,
3929					active 		= itemNo === i ? _self.$titleWrap.eq(i) : false;
3930    			
3931    			if(active) current.addClass('aviaccordion-active-slide');
3932    				
3933    			if(reset)
3934    			{
3935    				trans_val = dataSet.avCalcDefault; 
3936    				this.open = false;
3937    			}
3938    				
3939				if(_self.cssActive) //do a css3 animation
3940				{
3941					//move the slides
3942					transition[_self.property]  = _self.transform3d ? "translate3d(" + trans_val  + "%, 0, 0)" : "translate(" + trans_val + "%,0)"; //3d or 2d transform?
3943					current.css(transition);
3944				}
3945				else
3946				{
3947					transition.left =  trans_val + "%";
3948					current.stop().animate(transition, 700, 'easeOutQuint');
3949				}	
3950    		});
3951    	}
3952    };
3953
3954
3955$.fn.aviaccordion = function( options )
3956{
3957	return this.each(function()
3958	{
3959		var active = $.data( this, 'AviaccordionSlider' );
3960
3961		if(!active)
3962		{
3963			//make sure that the function doesnt get aplied a second time
3964			$.data( this, 'AviaccordionSlider', 1 );
3965			
3966			//create the preparations for fullscreen slider
3967			new $.AviaccordionSlider( options, this );
3968		}
3969	});
3970}
3971
3972
3973
3974
3975
3976
3977
3978
3979
3980
3981
3982// -------------------------------------------------------------------------------------------
3983// Aviaccordion Slideshow 
3984// 
3985// accordion slider script
3986// -------------------------------------------------------------------------------------------
3987
3988	$.AviaTextRotator  =  function(options, slider)
3989	{
3990	    this.$win	  	= $( window );
3991	    this.$slider  	= $( slider );
3992	    this.$inner	  	= this.$slider.find('.av-rotator-text');
3993	    this.$slides	= this.$inner.find('.av-rotator-text-single');
3994	    this.$current   = this.$slides.eq(0);
3995	    this.open		= 0;
3996	    this.count		= this.$slides.length;
3997	    
3998	    if($.avia_utilities.supported.transition === undefined)
3999		{
4000			$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
4001		}
4002		
4003		this.browserPrefix 	= $.avia_utilities.supported.transition;
4004	    this.cssActive 		= this.browserPrefix !== false ? true : false;
4005		this.property		= this.browserPrefix + 'transform',
4006		
4007		//this.cssActive    = false; //testing no css3 browser
4008		
4009	    this._init( options );
4010	}
4011
4012  	$.AviaTextRotator.prototype =
4013    {
4014    	_init: function( options )
4015    	{
4016    		var _self = this;
4017    		
4018    		if(this.count <= 1) return;
4019    		
4020    		_self.options = $.extend({}, options, this.$slider.data());
4021			_self.$inner.addClass('av-rotation-active');
4022			//if(_self.options.fixwidth == 1) this.$inner.width(this.$current.width());
4023			_self._autoplay();
4024    	},
4025    	
4026    	_autoplay: function()
4027    	{
4028    		var _self = this;
4029    		
4030			_self.autoplay = setInterval(function()
4031			{
4032				_self.open = _self.open === false ? 0 : _self.open + 1;
4033				if(_self.open >= _self.count) _self.open = 0;
4034				_self._move({}, _self.open);
4035				
4036			}, _self.options.interval * 1000)
4037    	},
4038    	    	
4039    	_move: function(event)
4040    	{
4041	    	var _self 		= this, 
4042	    		modifier 	= 30 * _self.options.animation, 
4043	    		fade_out 	= {opacity:0}, 
4044	    		fade_start  = {display:'inline-block', opacity:0},
4045	    		fade_in		= {opacity:1};
4046	    		
4047    		this.$next = _self.$slides.eq(this.open);
4048    		
4049    		if(this.cssActive)
4050    		{
4051	    		fade_out[_self.property] 	= "translate(0px," + modifier +"px)";
4052	    		fade_start[_self.property] 	= "translate(0px," + (modifier * -1) +"px)";
4053	    		fade_in[_self.property] 	= "translate(0px,0px)";
4054    		}
4055    		else
4056    		{
4057	    		fade_out['top'] 	= modifier;
4058	    		fade_start['top'] 	= (modifier * -1);
4059	    		fade_in['top'] 		= 0;
4060    		}
4061    		
4062    		
4063    		_self.$current.avia_animate(fade_out, function()
4064    		{
4065	    		_self.$current.css({display:'none'});
4066	    		_self.$next.css(fade_start).avia_animate(fade_in, function()
4067	    		{
4068		    		_self.$current = _self.$slides.eq(_self.open);
4069	    		});
4070    		});
4071    	}
4072    };
4073
4074
4075$.fn.avia_textrotator = function( options )
4076{
4077	return this.each(function()
4078	{
4079		var active = $.data( this, 'AviaTextRotator' );
4080
4081		if(!active)
4082		{
4083			//make sure that the function doesnt get aplied a second time
4084			$.data( this, 'AviaTextRotator', 1 );
4085			
4086			//create the preparations for fullscreen slider
4087			new $.AviaTextRotator( options, this );
4088		}
4089	});
4090}
4091
4092
4093
4094
4095
4096
4097
4098
4099
4100
4101
4102
4103
4104
4105
4106// -------------------------------------------------------------------------------------------
4107// HELPER FUNCTIONS
4108// -------------------------------------------------------------------------------------------
4109
4110
4111//waipoint script when something comes into viewport
4112 $.fn.avia_waypoints = function(options_passed)
4113	{
4114		if(! $('html').is('.avia_transform')) return;
4115
4116		var defaults = { offset: 'bottom-in-view' , triggerOnce: true},
4117			options  = $.extend({}, defaults, options_passed),
4118			isMobile = $.avia_utilities.isMobile;
4119
4120		return this.each(function()
4121		{
4122			var element = $(this);
4123			
4124			setTimeout(function()
4125			{
4126				if(isMobile)
4127				{
4128					element.addClass('avia_start_animation').trigger('avia_start_animation');
4129				}
4130				else
4131				{
4132					element.waypoint(function(direction)
4133					{
4134					 	var current 	= $(this.element),
4135					 		parent  	= current.parents('.av-animation-delay-container:eq(0)');
4136					 	
4137					 	if(parent.length)
4138					 	{
4139						 	current.addClass('avia_start_animation_when_active').trigger('avia_start_animation_when_active');
4140					 	}
4141					 	
4142					 	if(!parent.length || (parent.length && parent.is('.__av_init_open')))
4143					 	{
4144						 	current.addClass('avia_start_animation').trigger('avia_start_animation');
4145					 	}
4146					 	
4147					 	
4148					 	
4149					}, options );
4150				}
4151			},100)
4152			
4153		});
4154	};
4155
4156
4157
4158
4159
4160
4161
4162// window resize script
4163var $event = $.event, $special, resizeTimeout;
4164
4165$special = $event.special.debouncedresize = {
4166	setup: function() {
4167		$( this ).on( "resize", $special.handler );
4168	},
4169	teardown: function() {
4170		$( this ).off( "resize", $special.handler );
4171	},
4172	handler: function( event, execAsap ) {
4173		// Save the context
4174		var context = this,
4175			args = arguments,
4176			dispatch = function() {
4177				// set correct event type
4178				event.type = "debouncedresize";
4179				$event.dispatch.apply( context, args );
4180			};
4181
4182		if ( resizeTimeout ) {
4183			clearTimeout( resizeTimeout );
4184		}
4185
4186		execAsap ?
4187			dispatch() :
4188			resizeTimeout = setTimeout( dispatch, $special.threshold );
4189	},
4190	threshold: 150
4191};
4192
4193
4194
4195
4196
4197$.easing['jswing'] = $.easing['swing'];
4198
4199$.extend( $.easing,
4200{
4201	def: 'easeOutQuad',
4202	swing: function (x, t, b, c, d) { return $.easing[$.easing.def](x, t, b, c, d); },
4203	easeInQuad: function (x, t, b, c, d) { return c*(t/=d)*t + b; },
4204	easeOutQuad: function (x, t, b, c, d) { return -c *(t/=d)*(t-2) + b; },
4205	easeInOutQuad: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t + b; return -c/2 * ((--t)*(t-2) - 1) + b; },
vendor: 4,549 bytes, lines 4206-4311
4206	easeInCubic: function (x, t, b, c, d) { return c*(t/=d)*t*t + b; },
4207	easeOutCubic: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t + 1) + b; },
4208	easeInOutCubic: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t + b; return c/2*((t-=2)*t*t + 2) + b;	},
4209	easeInQuart: function (x, t, b, c, d) { return c*(t/=d)*t*t*t + b;	},
4210	easeOutQuart: function (x, t, b, c, d) { return -c * ((t=t/d-1)*t*t*t - 1) + b; },
4211	easeInOutQuart: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t + b; return -c/2 * ((t-=2)*t*t*t - 2) + b;	},
4212	easeInQuint: function (x, t, b, c, d) { return c*(t/=d)*t*t*t*t + b;	},
4213	easeOutQuint: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t*t*t + 1) + b;	},
4214	easeInOutQuint: function (x, t, b, c, d) { if ((t/=d/2) < 1) return c/2*t*t*t*t*t + b; return c/2*((t-=2)*t*t*t*t + 2) + b;	},
4215	easeInSine: function (x, t, b, c, d) {	return -c * Math.cos(t/d * (Math.PI/2)) + c + b;	},
4216	easeOutSine: function (x, t, b, c, d) { return c * Math.sin(t/d * (Math.PI/2)) + b;	},
4217	easeInOutSine: function (x, t, b, c, d) { return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b;	},
4218	easeInExpo: function (x, t, b, c, d) { return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b;	},
4219	easeOutExpo: function (x, t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b;	},
4220	easeInOutExpo: function (x, t, b, c, d) {
4221		if (t==0) return b;
4222		if (t==d) return b+c;
4223		if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
4224		return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
4225	},
4226	easeInCirc: function (x, t, b, c, d) { return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b;	},
4227	easeOutCirc: function (x, t, b, c, d) {return c * Math.sqrt(1 - (t=t/d-1)*t) + b;	},
4228	easeInOutCirc: function (x, t, b, c, d) { if ((t/=d/2) < 1) return -c/2 * (Math.sqrt(1 - t*t) - 1) + b;	return c/2 * (Math.sqrt(1 - (t-=2)*t) + 1) + b;	},
4229	easeInElastic: function (x, t, b, c, d) {
4230		var s=1.70158;var p=0;var a=c;
4231		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
4232		if (a < Math.abs(c)) { a=c; var s=p/4; }
4233		else var s = p/(2*Math.PI) * Math.asin (c/a);
4234		return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
4235	},
4236	easeOutElastic: function (x, t, b, c, d) {
4237		var s=1.70158;var p=0;var a=c;
4238		if (t==0) return b;  if ((t/=d)==1) return b+c;  if (!p) p=d*.3;
4239		if (a < Math.abs(c)) { a=c; var s=p/4; }
4240		else var s = p/(2*Math.PI) * Math.asin (c/a);
4241		return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
4242	},
4243	easeInOutElastic: function (x, t, b, c, d) {
4244		var s=1.70158;var p=0;var a=c;
4245		if (t==0) return b;  if ((t/=d/2)==2) return b+c;  if (!p) p=d*(.3*1.5);
4246		if (a < Math.abs(c)) { a=c; var s=p/4; }
4247		else var s = p/(2*Math.PI) * Math.asin (c/a);
4248		if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
4249		return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
4250	},
4251	easeInBack: function (x, t, b, c, d, s) {
4252		if (s == undefined) s = 1.70158;
4253		return c*(t/=d)*t*((s+1)*t - s) + b;
4254	},
4255	easeOutBack: function (x, t, b, c, d, s) {
4256		if (s == undefined) s = 1.70158;
4257		return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
4258	},
4259	easeInOutBack: function (x, t, b, c, d, s) {
4260		if (s == undefined) s = 1.70158;
4261		if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
4262		return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
4263	},
4264	easeInBounce: function (x, t, b, c, d) {
4265		return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
4266	},
4267	easeOutBounce: function (x, t, b, c, d) {
4268		if ((t/=d) < (1/2.75)) {
4269			return c*(7.5625*t*t) + b;
4270		} else if (t < (2/2.75)) {
4271			return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
4272		} else if (t < (2.5/2.75)) {
4273			return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
4274		} else {
4275			return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
4276		}
4277	},
4278	easeInOutBounce: function (x, t, b, c, d) {
4279		if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
4280		return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
4281	}
4282});
4283
4284})( jQuery );
4285
4286
4287
4288/*utility functions*/
4289
4290
4291(function($)
4292{
4293	"use strict";
4294
4295	$.avia_utilities = $.avia_utilities || {};
4296
4297	/************************************************************************
4298	gloabl loading function
4299	*************************************************************************/
4300	$.avia_utilities.loading = function(attach_to, delay){
4301
4302		var loader = {
4303
4304			active: false,
4305
4306			show: function()
4307			{
4308				if(loader.active === false)
4309				{
4310					loader.active = true;
4311					loader.loading_item.css({display:'block', opacity:0}
4311);
4312				}
4313
4314				loader.loading_item.stop().animate({opacity:1});
4315			},
4316
4317			hide: function()
4318			{	
4319				if(typeof delay === 'undefined'){ delay = 600; }
4320
4321				loader.loading_item.stop().delay( delay ).animate({opacity:0}, function()
4322				{
4323					loader.loading_item.css({display:'none'});
4324					loader.active = false;
4325				});
4326			},
4327
4328			attach: function()
4329			{
4330				if(typeof attach_to === 'undefined'){ attach_to = 'body';}
4331
4332				loader.loading_item = $('<div class="avia_loading_icon"><div class="av-siteloader"></div></div>').css({display:"none"}).appendTo(attach_to);
4333			}
4334		}
4335
4336		loader.attach();
4337		return loader;
4338	};
4339	
4340	/************************************************************************
4341	gloabl play/pause visualizer function
4342	*************************************************************************/
4343	$.avia_utilities.playpause = function(attach_to, delay){
4344
4345		var pp = {
4346
4347			active: false,
4348			to1: "", 
4349			to2: "", 
4350			set: function(status)
4351			{	
4352				pp.loading_item.removeClass('av-play av-pause');
4353				pp.to1 = setTimeout(function(){ pp.loading_item.addClass('av-' + status); },10);
4354				pp.to2 = setTimeout(function(){ pp.loading_item.removeClass('av-' + status); },1500);
4355			},
4356
4357			attach: function()
4358			{
4359				if(typeof attach_to === 'undefined'){ attach_to = 'body';}
4360
4361				pp.loading_item = $('<div class="avia_playpause_icon"></div>').css({display:"none"}).appendTo(attach_to);
4362			}
4363		}
4364
4365		pp.attach();
4366		return pp;
4367	};
4368	
4369	
4370
4371	/************************************************************************
4372	preload images, as soon as all are loaded trigger a special load ready event
4373	*************************************************************************/
4374	$.avia_utilities.preload = function(options_passed)
4375	{
4376		new $.AviaPreloader(options_passed);
4377	}
4378	
4379	$.AviaPreloader  =  function(options)
4380	{
4381	    this.win 		= $(window);
4382	    this.defaults	=
4383		{
4384			container:			'body',
4385			maxLoops:			10,
4386			trigger_single:		true,
4387			single_callback:	function(){},
4388			global_callback:	function(){}
4389
4390		};
4391		this.options 	= $.extend({}, this.defaults, options);
4392		this.preload_images = 0;
4393		
4394		this.load_images();
4395	}
4396	
4397	$.AviaPreloader.prototype  = 
4398	{
4399		load_images: function()
4400		{	
4401			var _self = this;
4402			
4403			if(typeof _self.options.container === 'string'){ _self.options.container = $(_self.options.container); }
4404
4405			_self.options.container.each(function()
4406			{
4407				var container		= $(this);
4408	
4409				container.images	= container.find('img');
4410				container.allImages	= container.images;
4411	
4412				_self.preload_images += container.images.length;
4413				setTimeout(function(){ _self.checkImage(container); }, 10);
4414			});	
4415		},
4416		
4417		checkImage: function(container)
4418		{	
4419			var _self = this;
4420			
4421			container.images.each(function()
4422			{
4423				if(this.complete === true)
4424				{
4425					container.images = container.images.not(this);
4426					_self.preload_images -= 1;
4427				}
4428			});
4429
4430			if(container.images.length && _self.options.maxLoops >= 0)
4431			{
4432				_self.options.maxLoops-=1;
4433				setTimeout(function(){ _self.checkImage(container); }, 500);
4434			}
4435			else
4436			{
4437				_self.preload_images = _self.preload_images - container.images.length;
4438				_self.trigger_loaded(container);
4439			}
4440		},
4441
4442		trigger_loaded: function(container)
4443		{
4444			var _self = this;
4445			
4446			if(_self.options.trigger_single !== false)
4447			{
4448				_self.win.trigger('avia_images_loaded_single', [container]);
4449				_self.options.single_callback.call(container);
4450			}
4451
4452			if(_self.preload_images === 0)
4453			{
4454				_self.win.trigger('avia_images_loaded');
4455				_self.options.global_callback.call();
4456			}
4457
4458		}
4459	}
4460
4461
4462	/************************************************************************
4463	CSS Easing transformation table
4464	*************************************************************************/
4465	/*
4466	Easing transform table from jquery.animate-enhanced plugin
4467	http://github.com/benbarnett/jQuery-Animate-Enhanced
4468	*/
4469	$.avia_utilities.css_easings = {
4470			linear:			'linear',
4471			swing:			'ease-in-out',
4472			bounce:			'cubic-bezier(0.0, 0.35, .5, 1.3)',
4473			easeInQuad:     'cubic-bezier(0.550, 0.085, 0.680, 0.530)' ,
4474			easeInCubic:    'cubic-bezier(0.550, 0.055, 0.675, 0.190)' ,
4475			easeInQuart:    'cubic-bezier(0.895, 0.030, 0.685, 0.220)' ,
4476			easeInQuint:    'cubic-bezier(0.755, 0.050, 0.855, 0.060)' ,
4477			easeInSine:     'cubic-bezier(0.470, 0.000, 0.745, 0.715)' ,
4478			easeInExpo:     'cubic-bezier(0.950, 0.050, 0.795, 0.035)' ,
4479			easeInCirc:     'cubic-bezier(0.600, 0.040, 0.980, 0.335)' ,
4480			easeInBack:     'cubic-bezier(0.600, -0.280, 0.735, 0.04)' ,
4481			easeOutQuad:    'cubic-bezier(0.250, 0.460, 0.450, 0.940)' ,
4482			easeOutCubic:   'cubic-bezier(0.215, 0.610, 0.355, 1.000)' ,
4483			easeOutQuart:   'cubic-bezier(0.165, 0.840, 0.440, 1.000)' ,
4484			easeOutQuint:   'cubic-bezier(0.230, 1.000, 0.320, 1.000)' ,
4485			easeOutSine:    'cubic-bezier(0.390, 0.575, 0.565, 1.000)' ,
4486			easeOutExpo:    'cubic-bezier(0.190, 1.000, 0.220, 1.000)' ,
4487			easeOutCirc:    'cubic-bezier(0.075, 0.820, 0.165, 1.000)' ,
4488			easeOutBack:    'cubic-bezier(0.175, 0.885, 0.320, 1.275)' ,
4489			easeInOutQuad:  'cubic-bezier(0.455, 0.030, 0.515, 0.955)' ,
4490			easeInOutCubic: 'cubic-bezier(0.645, 0.045, 0.355, 1.000)' ,
4491			easeInOutQuart: 'cubic-bezier(0.770, 0.000, 0.175, 1.000)' ,
4492			easeInOutQuint: 'cubic-bezier(0.860, 0.000, 0.070, 1.000)' ,
4493			easeInOutSine:  'cubic-bezier(0.445, 0.050, 0.550, 0.950)' ,
4494			easeInOutExpo:  'cubic-bezier(1.000, 0.000, 0.000, 1.000)' ,
4495			easeInOutCirc:  'cubic-bezier(0.785, 0.135, 0.150, 0.860)' ,
4496			easeInOutBack:  'cubic-bezier(0.680, -0.550, 0.265, 1.55)' ,
4497			easeInOutBounce:'cubic-bezier(0.580, -0.365, 0.490, 1.365)',
4498			easeOutBounce:	'cubic-bezier(0.760, 0.085, 0.490, 1.365)' 
4499		};
4500
4501	/************************************************************************
4502	check if a css feature is supported and save it to the supported array
4503	*************************************************************************/
4504	$.avia_utilities.supported	= {};
4505	$.avia_utilities.supports	= (function()
4506	{
4507		var div		= document.createElement('div'),
4508			vendors	= ['Khtml', 'Ms','Moz','Webkit'];  // vendors	= ['Khtml', 'Ms','Moz','Webkit','O']; 
4509
4510		return function(prop, vendor_overwrite)
4511		{
4512			if ( div.style[prop] !== undefined  ) { return ""; }
4513			if (vendor_overwrite !== undefined) { vendors = vendor_overwrite; }
4514
4515			prop = prop.replace(/^[a-z]/, function(val)
4516			{
4517				return val.toUpperCase();
4518			});
4519
4520			var len	= vendors.length;
4521			while(len--)
4522			{
4523				if ( div.style[vendors[len] + prop] !== undefined )
4524				{
4525					return "-" + vendors[len].toLowerCase() + "-";
4526				}
4527			}
4528
4529			return false;
4530		};
4531
4532	}());
4533
4534	/************************************************************************
4535	animation function
4536	*************************************************************************/
4537	$.fn.avia_animate = function(prop, speed, easing, callback)
4538	{
4539		if(typeof speed === 'function') {callback = speed; speed = false; }
4540		if(typeof easing === 'function'){callback = easing; easing = false;}
4541		if(typeof speed === 'string'){easing = speed; speed = false;}
4542
4543		if(callback === undefined || callback === false){ callback = function(){}; }
4544		if(easing === undefined || easing === false)	{ easing = 'easeInQuad'; }
4545		if(speed === undefined || speed === false)		{ speed = 400; }
4546
4547		if($.avia_utilities.supported.transition === undefined)
4548		{
4549			$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
4550		}
4551		
4552		
4553
4554		if($.avia_utilities.supported.transition !== false )
4555		{
4556			var prefix		= $.avia_utilities.supported.transition + 'transition',
4557				cssRule		= {},
4558				cssProp		= {},
4559				thisStyle	= document.body.style,
4560				end			= (thisStyle.WebkitTransition !== undefined) ? 'webkitTransitionEnd' : (thisStyle.OTransition !== undefined) ? 'oTransitionEnd' : 'transitionend';
4561
4562			//translate easing into css easing
4563			easing = $.avia_utilities.css_easings[easing];
4564
4565			//create css transformation rule
4566			cssRule[prefix]	=  'all '+(speed/1000)+'s '+easing;
4567			//add namespace to the transition end trigger
4568			end = end + ".avia_animate";
4569			
4570			//since jquery 1.10 the items passed need to be {} and not [] so make sure they are converted properly
4571			for (var rule in prop)
4572			{
4573				if (prop.hasOwnProperty(rule)) { cssProp[rule] = prop[rule]; }
4574			}
4575			prop = cssProp;
4576			
4577			
4578			
4579			this.each(function()
4580			{
4581				var element	= $(this), css_difference = false, rule, current_css;
4582
4583				for (rule in prop)
4584				{
4585					if (prop.hasOwnProperty(rule))
4586					{
4587						current_css = element.css(rule);
4588
4589						if(prop[rule] != current_css && prop[rule] != current_css.replace(/px|%/g,""))
4590						{
4591							css_difference = true;
4592							break;
4593						}
4594					}
4595				}
4596
4597				if(css_difference)
4598				{
4599					//if no transform property is set set a 3d translate to enable hardware acceleration
4600					if(!($.avia_utilities.supported.transition+"transform" in prop))
4601					{
4602						prop[$.avia_utilities.supported.transition+"transform"] = "translateZ(0)";
4603					}
4604					
4605					var endTriggered = false;
4606					
4607					element.on(end,  function(event)
4608					{
4609						if(event.target != event.currentTarget) return false;
4610						
4611						if(endTriggered == true) return false;
4612						endTriggered = true;
4613
4614						cssRule[prefix] = "none";
4615
4616						element.off(end);
4617						element.css(cssRule);
4618						setTimeout(function(){ callback.call(element); });
4619					});
4620					
4621					
4622					//desktop safari fallback if we are in another tab to trigger the end event
4623					setTimeout(function(){ 
4624						if(!endTriggered && !avia_is_mobile && $('html').is('.avia-safari') ) { 
4625							element.trigger(end); 
4626							$.avia_utilities.log('Safari Fallback '+end+' trigger'); 
4627						}
4628					}, speed + 100);
4629					
4630					setTimeout(function(){ element.css(cssRule);},10);
4631					setTimeout(function(){ element.css(prop);	},20);
4632				}
4633				else
4634				{
4635					setTimeout(function(){ callback.call(element); });
4636				}
4637
4638			});
4639		}
4640		else // if css animation is not available use default JS animation
4641		{
4642			this.animate(prop, speed, easing, callback);
4643		}
4644
4645		return this;
4646	};
4647
4648})( jQuery );
4649
4650
4651/* ======================================================================================================================================================
4652Avia Slideshow
4653====================================================================================================================================================== */
4654
4655(function($)
4656{
4657    "use strict";
4658
4659	$.AviaSlider  =  function(options, slider)
4660	{
4661		var self = this;
4662		
4663		this.$win	 = $( window );
4664		
4665	    this.$slider = $( slider );
4666	    
4667		this.isMobile = $.avia_utilities.isMobile;
4668	    
4669	    this._prepareSlides(options);
4670	    
4671		//default preload images then init slideshow
4672	    $.avia_utilities.preload({container: this.$slider , single_callback:  function(){ self._init( options ); }});
4673	}
4674
4675	$.AviaSlider.defaults  = {
4676
4677		//interval between autorotation switches
4678		interval:5,
4679
4680		//autorotation active or not
4681		autoplay:false,
4682		
4683		//set if the loop will stop at the last/first slide or if the slides will loop infinite
4684		//set to false for infinite loop, "last" to stop at the last slide or "first" to stop at the first slide
4685		stopinfiniteloop: false,
4686
4687		//fade or slide animation
4688		animation:'slide',
4689
4690		//transition speed when switching slide
4691		transitionSpeed:900,
4692
4693		//easing method for the transition
4694		easing:'easeInOutQuart',
4695
4696		//slide wrapper
4697		wrapElement: '>ul',
4698
4699		//slide element
4700		slideElement: '>li',
4701
4702		//pause if mouse cursor is above item
4703		hoverpause: false,
4704		
4705		//attach images as background
4706		bg_slider: false,
4707		
4708		//delay of miliseconds to wait before showing the next slide
4709		show_slide_delay: 0,
4710		
4711		//if slider animation is set to "fade" the fullfade property sets the crossfade behaviour
4712		fullfade: false
4713
4714	};
4715
4716  	$.AviaSlider.prototype =
4717    {
4718    	_init: function( options )
4719    	{
4720			// set slider options
4721			this.options = this._setOptions(options);
4722
4723			//slidewrap
4724			this.$sliderUl  = this.$slider.find(this.options.wrapElement);
4725
4726			// slide elements
4727			this.$slides = this.$sliderUl.find(this.options.slideElement);
4728
4729			// goto dots
4730			this.gotoButtons = this.$slider.find('.avia-slideshow-dots a');
4731			
4732			//perma caption
4733			this.permaCaption =  this.$slider.find('>.av-slideshow-caption');
4734
4735			// slide count
4736			this.itemsCount = this.$slides.length;
4737
4738			// current image index
4739			this.current = 0;
4740
4741			//loop count
4742			this.loopCount = 0;
4743
4744			// control if the slicebox is animating
4745			this.isAnimating = false;
4746
4747			// css browser prefix like -webkit-, -moz-
4748			this.browserPrefix = $.avia_utilities.supports('transition');
4749			
4750			// css3 animation?
4751			this.cssActive = this.browserPrefix !== false ? true : false;
4752			
4753			// css3D animation?
4754			this.css3DActive = document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
4755			
4756			//store the aviaVideoApi object for the current slide if available
4757			this.video	= false;
4758			
4759			//if we have a bg slider no images were preloaded yet. in that case start preloading and attaching images
4760			if(this.options.bg_slider == true)
4761			{
4762				//create array that holds all image urls to preload
4763				this.imageUrls = [];
4764				
4765				//create a preloader icon to indicate loading
4766				this.loader = $.avia_utilities.loading(this.$slider);
4767				
4768				//preload the images ony by one
4769				this._bgPreloadImages();
4770				
4771			}
4772			else //if it was a default slider all images are already loaded and we can start showing the slider
4773			{			
4774				//kickoff the slider: bind functions, show first slide, if active start the autorotation timer
4775				this._kickOff();
4776			}
4777    	},
4778
4779    	//set the slider options by first merging the efault options and the passed options, then checking the slider element if any data attributes overwrite the option set
4780    	_setOptions: function(options)
4781		{
4782			var newOptions 	= $.extend( true, {}, $.AviaSlider.defaults, options ),
4783				htmlData 	= this.$slider.data(),
4784				i 			= "";
4785
4786			//overwritte passed option set with any data properties on the html element
4787			for (i in htmlData)
4788			{
4789				if (htmlData.hasOwnProperty(i))
4790				{
4791					if(typeof htmlData[i] === "string" || typeof htmlData[i] === "number" || typeof htmlData[i] === "boolean")
4792					{
4793						newOptions[i] = htmlData[i];
4794					}
4795				}
4796			}
4797
4798			return newOptions;
4799		},
4800		
4801		_prepareSlides: function(options)
4802		{	
4803			//if its a mobile device find all video slides that need to be altered
4804			if(this.isMobile)
4805			{
4806				var alter = this.$slider.find('.av-mobile-fallback-image');
4807				alter.each(function()
4808				{	
4809					var current  = $(this).removeClass('av-video-slide').data({'avia_video_events': true, 'video-ratio':0}),
4810						fallback = current.data('mobile-img');
4811						
4812					current.find('.av-click-overlay, .mejs-mediaelement, .mejs-container').remove();
4813					
4814					if(!fallback)
4815					{
4816						var appendTo = current.find('.avia-slide-wrap');
4817						$('<p class="av-fallback-message"><span>Please set a mobile device fallback image for this video in your wordpress backend</span></p>').appendTo(appendTo);
4818					}
4819					
4820					if(options && options.bg_slider)
4821					{
4822						current.data('img-url', fallback);
4823					}
4824					else
4825					{
4826						var image = $('<img src="'+fallback+'" alt="" title="" />');
4827						current.find('.avia-slide-wrap').append(image);
4828					}
4829					
4830				});
4831			}
4832			
4833		},
4834		
4835		//start preloading the background images
4836		_bgPreloadImages : function(callback)
4837    	{
4838    		this._getImageURLS();
4839    		
4840    		this._preloadSingle(0, function()
4841    		{
4842    			this._kickOff();
4843				this._preloadNext(1);
4844    		});
4845    	},
4846		
4847    	//if we are using a background image slider, fetch the images from a data attribute and preload them one by one
4848    	_getImageURLS: function()
4849    	{
4850    		var _self = this;
4851    		
4852    		//collect url strings of the images to preload
4853			this.$slides.each(function(i)
4854			{
4855				_self.imageUrls[i] = [];
4856				_self.imageUrls[i]['url'] = $(this).data("img-url");
4857				
4858				//if no image is passed we can set the slide to loaded
4859				if(typeof _self.imageUrls[i]['url'] == 'string')
4860				{
4861					_self.imageUrls[i]['status'] = false;
4862				}
4863				else
4864				{
4865					_self.imageUrls[i]['status'] = true;
4866				}
4867			});
4868    	},
4869    	
4870    	
4871    	_preloadSingle: function(key, callback)
4872		{
4873			var _self 		= this,
4874				objImage	= new Image();
4875			
4876			if(typeof _self.imageUrls[key]['url'] == 'string')
4877			{
4878				$(objImage).bind('load error', function()
4879				{ 
4880					_self.imageUrls[key]['status'] = true; 
4881					_self.$slides.eq(key).css('background-image','url(' + _self.imageUrls[key]['url'] + ')');
4882					if(typeof callback == 'function') callback.apply( _self, [objImage, key] );
4883				});
4884				
4885				if(_self.imageUrls[key]['url'] != "")
4886				{
4887					objImage.src = _self.imageUrls[key]['url'];
4888				}
4889				else
4890				{
4891					$(objImage).trigger('error');
4892				}
4893			}
4894			else
4895			{
4896				if(typeof callback == 'function') callback.apply( _self, [objImage, key] );
4897			}
4898		},
4899		
4900		_preloadNext: function(key)
4901		{
4902			if(typeof this.imageUrls[key] != "undefined")
4903    		{
4904				this._preloadSingle(key, function()
4905	    		{
4906					this._preloadNext(key + 1);
4907	    		});
4908    		}
4909		},
4910    	
4911
4912    	//bind click events of slide controlls to the public functions
4913    	_bindEvents: function()
4914    	{
4915    		var self = this,
4916    			win  = $( window );
4917
4918    		this.$slider.on('click','.next-slide', $.proxy( this.next, this) );
4919    		this.$slider.on('click','.prev-slide', $.proxy( this.previous, this) );
4920    		this.$slider.on('click','.goto-slide', $.proxy( this.go2, this) );
4921
4922    		if(this.options.hoverpause)
4923    		{
4924    			this.$slider.on('mouseenter', $.proxy( this.pause, this) );
4925    			this.$slider.on('mouseleave', $.proxy( this.resume, this) );
4926    		}
4927
4928			if(this.options.stopinfiniteloop && this.options.autoplay)
4929			{
4930				if(this.options.stopinfiniteloop == 'last')
4931				{
4932					this.$slider.on('avia_slider_last_slide', $.proxy(this._stopSlideshow, this) );
4933				}
4934				else if(this.options.stopinfiniteloop == 'first')
4935				{
4936					this.$slider.on('avia_slider_first_slide', $.proxy(this._stopSlideshow, this) );
4937				}
4938			}
4939
4940    		win.on( 'debouncedresize.aviaSlider',  $.proxy( this._setSize, this) );
4941
4942    		//if its a desktop browser add arrow navigation, otherwise add touch nav
4943    		if(!this.isMobile)
4944    		{
4945    			this.$slider.avia_keyboard_controls();
4946    		}
4947    		else
4948    		{
4949    			this.$slider.avia_swipe_trigger();
4950    		}
4951			
4952			self._attach_video_events();
4953    	},
4954
4955    	//kickoff the slider by binding all functions to slides and buttons, show the first slide and start autoplay
4956    	_kickOff: function()
4957    	{
4958    		var self 			= this,
4959    			first_slide 	= self.$slides.eq(0),
4960    			video			= first_slide.data('video-ratio');
4961    		  		
4962    		// bind events to to the controll buttons
4963			self._bindEvents();
4964    		
4965    		this.$slider.removeClass('av-default-height-applied');
4966    		
4967    		//show the first slide. if its a video set the correct size, otherwise make sure to remove the % padding
4968    		if(video)
4969    		{ 
4970    			self._setSize(true); 
4971    		}
4972    		else
4973    		{
4974	    		if(this.options.keep_pading != true)
4975	    		{
4976    				self.$sliderUl.css('padding',0);
4977					self.$win.trigger('av-height-change');
4978				}
4979    		}
4980    		
4981    		self._setCenter();
4982    		first_slide.css({visibility:'visible', opacity:0}).avia_animate({opacity:1}, function()
4983    		{
4984    			var current = $(this).addClass('active-slide');
4985    			
4986    			if(self.permaCaption.length)
4987	    		{
4988	    			self.permaCaption.addClass('active-slide');
4989	    		}
4990    		});
4991    		
4992    		
4993    		
4994    		// start autoplay if active
4995			if( self.options.autoplay )
4996			{
4997				self._startSlideshow();
4998			}
4999    		
5000    	},
5001
5002    	//calculate which slide should be displayed next and call the executing transition function
5003    	_navigate : function( dir, pos ) {
5004			
5005			if( this.isAnimating || this.itemsCount < 2 || !this.$slider.is(":visible") )
5006			{
5007				return false;
5008			}
5009			
5010			this.isAnimating = true;
5011
5012			// current item's index
5013			this.prev = this.current;
5014
5015			// if position is passed
5016			if( pos !== undefined )
5017			{
5018				this.current = pos;
5019				dir = this.current > this.prev ? 'next' : 'prev';
5020			}
5021			// if not check the boundaries
5022			else if( dir === 'next' )
5023			{
5024				this.current = this.current < this.itemsCount - 1 ? this.current + 1 : 0;
5025				
5026				if( this.current === 0 && this.options.autoplay_stopper == 1 && this.options.autoplay )
5027				{
5028					this.isAnimating = false;
5029					this.current = this.prev;
5030					this._stopSlideshow();
5031					return false;
5032				}
5033			}
5034			else if( dir === 'prev' )
5035			{
5036				this.current = this.current > 0 ? this.current - 1 : this.itemsCount - 1;
5037			}
5038
5039			//set goto button
5040			this.gotoButtons.removeClass('active').eq(this.current).addClass('active');
5041
5042			//set slideshow size
5043			this._setSize();
5044			
5045			//if we are using a background slider make sure that the image is loaded. if not preload it, then show the slide
5046			if(this.options.bg_slider == true)
5047			{
5048				if(this.imageUrls[this.current]['status'] == true )
5049				{
5050					this['_' + this.options.animation].call(this, dir);
5051				}
5052				else
5053				{
5054					this.loader.show();
5055					this._preloadSingle(this.current, function()
5056    				{
5057    					this['_' + this.options.animation].call(this, dir);
5058    					this.loader.hide();
5059    				});
5060				}
5061			}
5062			else //no background loader -> images are already loaded
5063			{
5064				//call the executing function. for example _slide, or _fade. since the function call is absed on a var we can easily extend the slider with new animations
5065				this['_' + this.options.animation].call(this, dir);
5066			}
5067
5068			if(this.current == 0)
5069			{
5070				this.loopCount++;
5071				this.$slider.trigger('avia_slider_first_slide');
5072			}
5073			else if(this.current == this.itemsCount - 1)
5074			{
5075				this.$slider.trigger('avia_slider_last_slide');
5076			}
5077			else
5078			{
5079				this.$slider.trigger('avia_slider_navigate_slide');
5080			}
5081		},
5082
5083		//if the next slide has a different height than the current change the slideshow height
5084		_setSize: function(instant)
5085		{
5086			//if images are attached as bg images the slider has a fixed height
5087			if(this.options.bg_slider == true) return;
5088			
5089			var self    		= this,
5090				slide 			= this.$slides.eq(this.current),
5091				img 			= slide.find('img'),
5092				current			= Math.floor(this.$sliderUl.height()),
5093				ratio			= slide.data('video-ratio'),
5094				setTo   		= ratio ? this.$sliderUl.width() / ratio : Math.floor(slide.height()),
5095				video_height 	= slide.data('video-height'), //forced video height %. needs to be set only once
5096				video_toppos 	= slide.data('video-toppos'); //forced video top position
5097				
5098				this.$sliderUl.height(current).css('padding',0); //make sure to set the slideheight to an actual value
5099				
5100				if(setTo != current)
5101				{
5102					if(instant == true)
5103					{
5104						this.$sliderUl.css({height:setTo});
5105						this.$win.trigger('av-height-change');
5106					}
5107					else
5108					{
5109						this.$sliderUl.avia_animate({height:setTo}, function()
5110						{
5111							self.$win.trigger('av-height-change');
5112						});
5113					}
5114				}
5115				
5116				this._setCenter();
5117				
5118				if(video_height && video_height!= "set")
5119				{
5120					slide.find('iframe, embed, video, object, .av_youtube_frame').css({height: video_height + '%', top: video_toppos + '%'});
5121					slide.data('video-height','set');
5122				}
5123		},
5124		
5125		_setCenter: function()
5126		{
5127			//if the image has a min width and is larger than the slider center it
5128			//positon img based on caption. right caption->left pos, left caption -> right pos
5129			var slide 		= this.$slides.eq(this.current),
5130				img 		= slide.find('img'),
5131				min_width 	= parseInt(img.css('min-width'),10),
5132				slide_width	= slide.width(),
5133				caption		= slide.find('.av-slideshow-caption'),
5134				css_left 	= ((slide_width - min_width) / 2);
5135			
5136			if(caption.length)
5137			{
5138				if(caption.is('.caption_left'))
5139				{
5140					css_left = ((slide_width - min_width) / 1.5);
5141				}
5142				else if(caption.is('.caption_right'))
5143				{
5144					css_left = ((slide_width - min_width) / 2.5);
5145				}
5146			}
5147			
5148			if(slide_width >= min_width)
5149			{
5150				css_left = 0;
5151			}
5152			
5153			img.css({left:css_left});
5154		},
5155		
5156		_slide: function(dir)
5157		{
5158			var dynamic			= false, //todo: pass by option if a slider is dynamic
5159				modifier		= dynamic == true ? 2 : 1,
5160				sliderWidth		= this.$slider.width(),
5161				direction		= dir === 'next' ? -1 : 1,
5162				property  		= this.browserPrefix + 'transform',
5163				reset			= {}, transition = {},  transition2 = {},
5164				trans_val 		= ( sliderWidth * direction * -1),
5165				trans_val2 		= ( sliderWidth * direction) / modifier;
5166			
5167			//do a css3 animation
5168			if(this.cssActive)
5169			{
5170				property  = this.browserPrefix + 'transform';
5171
5172				//do a translate 3d transformation if available, since it uses hardware acceleration
5173				if(this.css3DActive)
5174				{
5175					reset[property]  = "translate3d(" + trans_val + "px, 0, 0)";
5176					transition[property]  = "translate3d(" + trans_val2 + "px, 0, 0)";
5177					transition2[property] = "translate3d(0,0,0)";
5178				}
5179				else //do a 2d transform. still faster than a position "left" change
5180				{
5181					reset[property]  = "translate(" + trans_val + "px,0)";
5182					transition[property]  = "translate(" + trans_val2 + "px,0)";
5183					transition2[property] = "translate(0,0)";					}
5184			}
5185			else
5186			{
5187				reset.left = trans_val;
5188				transition.left = trans_val2;
5189				transition2.left = 0;
5190			}
5191			
5192			if(dynamic)
5193			{
5194				transition['z-index']  = "1";
5195				transition2['z-index']  = "2";
5196			}
5197			
5198			this._slide_animate(reset, transition, transition2);
5199		},
5200		
5201		_slide_up: function(dir)
5202		{
5203			var dynamic			= true, //todo: pass by option if a slider is dynamic
5204				modifier		= dynamic == true ? 2 : 1,
5205				sliderHeight	= this.$slider.height(),
5206				direction		= dir === 'next' ? -1 : 1,
5207				property  		= this.browserPrefix + 'transform',
5208				reset			= {}, transition = {},  transition2 = {},
5209				trans_val 		= ( sliderHeight * direction * -1),
5210				trans_val2 		= ( sliderHeight * direction) / modifier;
5211			
5212			//do a css3 animation
5213			if(this.cssActive)
5214			{
5215				property  = this.browserPrefix + 'transform';
5216
5217				//do a translate 3d transformation if available, since it uses hardware acceleration
5218				if(this.css3DActive)
5219				{
5220					reset[property]  = "translate3d( 0," + trans_val + "px, 0)";
5221					transition[property]  = "translate3d( 0," + trans_val2 + "px, 0)";
5222					transition2[property] = "translate3d(0,0,0)";
5223				}
5224				else //do a 2d transform. still faster than a position "left" change
5225				{
5226					reset[property]  = "translate( 0," + trans_val + "px)";
5227					transition[property]  = "translate( 0," + trans_val2 + "px)";
5228					transition2[property] = "translate(0,0)";					}
5229			}
5230			else
5231			{
5232				reset.top = trans_val;
5233				transition.top = trans_val2;
5234				transition2.top = 0;
5235			}
5236			
5237			if(dynamic)
5238			{
5239				transition['z-index']  = "1";
5240				transition2['z-index']  = "2";
5241			}
5242			this._slide_animate(reset, transition, transition2);
5243		},
5244		
5245		
5246		//slide animation: do a slide transition by css3 transform if possible. if not simply do a position left transition
5247		_slide_animate: function( reset , transition , transition2 )
5248		{
5249			
5250			var self			= this,
5251				displaySlide 	= this.$slides.eq(this.current),
5252				hideSlide		= this.$slides.eq(this.prev);
5253				
5254				hideSlide.trigger('pause');	
5255				if( !displaySlide.data('disableAutoplay') ) displaySlide.trigger('play');
5256
5257				displaySlide.css({visibility:'visible', zIndex:4, opacity:1, left
5257:0, top:0});
5258				displaySlide.css(reset);
5259				
5260				hideSlide.avia_animate(transition, this.options.transitionSpeed, this.options.easing);
5261				
5262				var after_slide = function()
5263				{
5264					self.isAnimating = false;
5265					displaySlide.addClass('active-slide');
5266					hideSlide.css({visibility:'hidden'}).removeClass('active-slide');
5267					self.$slider.trigger('avia-transition-done');
5268				}
5269				
5270				if(self.options.show_slide_delay > 0)
5271				{
5272					setTimeout(function() { displaySlide.avia_animate(transition2, self.options.transitionSpeed, self.options.easing, after_slide); },self.options.show_slide_delay);
5273				}
5274				else
5275				{
5276					displaySlide.avia_animate(transition2, self.options.transitionSpeed, self.options.easing, after_slide);
5277				}
5278
5279		},
5280		
5281		//simple fade transition of the slideshow
5282		_fade: function()
5283		{
5284			var self			= this,
5285				displaySlide 	= this.$slides.eq(this.current),
5286				hideSlide		= this.$slides.eq(this.prev),
5287				properties		= {visibility:'visible', zIndex:3, opacity:0},
5288				fadeCallback 	= function()
5289				{
5290					self.isAnimating = false;
5291					displaySlide.addClass('active-slide');
5292					hideSlide.css({visibility:'hidden', zIndex:2}).removeClass('active-slide');
5293					self.$slider.trigger('avia-transition-done');
5294					
5295				};
5296			
5297			hideSlide.trigger('pause');	
5298			if( !displaySlide.data('disableAutoplay') ) displaySlide.trigger('play');
5299			
5300			if(self.options.fullfade == true)
5301			{
5302				hideSlide.avia_animate({opacity:0}
5302, 200, 'linear', function()
5303				{	
5304					displaySlide.css(properties).avia_animate({opacity:1}, self.options.transitionSpeed, 'linear',fadeCallback);				
5305				});
5306			}
5307			else
5308			{
5309				displaySlide.css(properties).avia_animate({opacity:1}, self.options.transitionSpeed/2, 'linear', function()
5310				{
5311					hideSlide.avia_animate({opacity:0}, 200, 'linear', fadeCallback);
5312				});
5313			}
5314			
5315		},
5316		
5317		
5318		/************************************************************************
5319		Video functions
5320		*************************************************************************/
5321		
5322		//bind events to the video that tell the slider to autorotate once a video has been played
5323		_attach_video_events: function()
5324		{
5325			var self = this, $html = $('html');
5326						
5327			self.$slides.each(function(i)
5328			{
5329				var currentSlide 	= $(this),
5330					caption			= currentSlide.find('.caption_fullwidth, .av-click-overlay'),
5331					mejs			= currentSlide.find('.mejs-mediaelement');
5332								
5333				if(currentSlide.data('avia_video_events') != true)
5334				{
5335					currentSlide.data('avia_video_events', true);
5336					
5337					currentSlide.on('av-video-events-bound', { slide: currentSlide, wrap: mejs , iteration: i , self: self }, onReady);
5338					
5339					currentSlide.on('av-video-ended', { slide: currentSlide , self: self}, onFinish);
5340					
5341					currentSlide.on('av-video-play-executed', function(){ setTimeout(function(){  self.pause() }, 100); });
5342						
5343					caption.on('click', { slide: currentSlide }, toggle);
5344					
5345					// also if the player was loaded before the _bindEvents function was bound trigger it manually
5346					if(currentSlide.is('.av-video-events-bound')) currentSlide.trigger('av-video-events-bound');
5347				}
5348			});
5349			
5350			
5351			//helper functions
5352			function onReady( event ) 
5353			{ 	
5354				//autostart for first slide
5355				if(event.data.iteration === 0) 
5356				{	
5357					event.data.wrap.css('opacity',0);
5358					if(!event.data.self.isMobile && !event.data.slide.data('disableAutoplay')) { event.data.slide.trigger('play'); } 
5359					setTimeout(function(){ event.data.wrap.avia_animate({opacity:1}, 400); }, 50);
5360				}
5361				else if ($html.is('.avia-msie') && !event.data.slide.is('.av-video-service-html5'))
5362				{	
5363					/*
5364					* Internet Explorer fires the ready event for external videos once they become visible 
5365					* as oposed to other browsers which always fire immediately. 
5366					*/
5367					if( !event.data.slide.data('disableAutoplay') ) event.data.slide.trigger('play');
5368				}
5369				
5370			}
5371			
5372			
5373			
5374			
5375			function onFinish( event )
5376			{ 	
5377				//if the video is not looped resume the slideshow
5378				if(!event.data.slide.is('.av-single-slide') && !event.data.slide.is('.av-loop-video'))
5379				{
5380					event.data.slide.trigger('reset');
5381					self._navigate( 'next' );  
5382					self.resume(); 
5383				}
5384				
5385				//safari 8 workaround for self hosted videos which wont loop by default
5386				if(event.data.slide.is('.av-loop-video') && event.data.slide.is('.av-video-service-html5'))
5387				{
5388					if($html.is('.avia-safari-8'))
5389					{
5390						setTimeout(function(){ event.data.slide.trigger('play'); },1);
5391					}
5392				}
5393			}
5394			
5395			function toggle( event )
5396			{
5397				if(event.target.tagName != "A") 
5398				{
5399					event.data.slide.trigger('toggle');
5400				}
5401			}
5402			
5403		},
5404		
5405		
5406		
5407		/************************************************************************
5408		Slideshow control functions
5409		*************************************************************************/
5410		
5411		_timer: function(callback, delay, first)
5412		{	
5413		    var self = this, start, remaining = delay;
5414			
5415			self.timerId = 0;
5416			
5417		    this.pause = function() {
5418		        window.clearTimeout(self.timerId);
5419		        remaining -= new Date() - start;
5420		    };
5421
5422		    this.resume = function() {
5423		        start = new Date();
5424		        self.timerId = window.setTimeout(callback, remaining);
5425		    };
5426
5427		    this.destroy = function()
5428		    {
5429		    	window.clearTimeout(self.timerId);
5430		    };
5431
5432		    this.resume(true);
5433		},
5434
5435		//start autorotation
5436		_startSlideshow: function()
5437		{
5438			var self = this;
5439			
5440			this.isPlaying = true;
5441			
5442			this.slideshow = new this._timer( function()
5443			{
5444				/*
5445				var videoApi = self.$slides.eq(self.current).data('aviaVideoApi')
5446				if(!videoApi){}
5447				*/
5448				
5449				self._navigate( 'next' );
5450		
5451				if ( self.options.autoplay )
5452				{
5453					self._startSlideshow();
5454				}
5455
5456			}, (this.options.interval * 1000));
5457		},
5458
5459		//stop autorotation
5460		_stopSlideshow: function()
5461		{
5462			if ( this.options.autoplay ) {
5463
5464				this.slideshow.destroy();
5465				this.isPlaying = false;
5466				this.options.autoplay = false;
5467			}
5468		},
5469
5470		// public method: shows next image
5471		next : function(e)
5472		{	
5473			e.preventDefault();
5474			this._stopSlideshow();
5475			this._navigate( 'next' );
5476		},
5477
5478		// public method: shows previous image
5479		previous : function(e)
5480		{
5481			e.preventDefault();
5482			this._stopSlideshow();
5483			this._navigate( 'prev' );
5484		},
5485
5486		// public method: goes to a specific image
5487		go2 : function( pos )
5488		{
5489			//if we didnt pass a number directly lets asume someone clicked on a link that triggered the goto transition
5490			if(isNaN(pos))
5491			{
5492				//in that case prevent the default link behavior and set the slide number to the links hash
5493				pos.preventDefault();
5494				pos = pos.currentTarget.hash.replace('#','');
5495			}
5496
5497			pos -= 1;
5498
5499			if( pos === this.current || pos >= this.itemsCount || pos < 0 )
5500			{
5501				return false;
5502			}
5503
5504			this._stopSlideshow();
5505			this._navigate( false, pos );
5506
5507		},
5508
5509		// public method: starts the slideshow
5510		// any call to next(), previous() or goto() will stop the slideshow autoplay
5511		play : function()
5512		{
5513			if( !this.isPlaying )
5514			{
5515				this.isPlaying = true;
5516
5517				this._navigate( 'next' );
5518				this.options.autoplay = true;
5519				this._startSlideshow();
5520			}
5521
5522		},
5523
5524		// public methos: pauses the slideshow
5525		pause : function()
5526		{
5527			if( this.isPlaying )
5528			{
5529				this.slideshow.pause();
5530			}
5531		},
5532
5533		// publiccmethos: resumes the slideshow
5534		resume : function()
5535		{
5536			if( this.isPlaying )
5537			{
5538				this.slideshow.resume();
5539			}
5540		},
5541
5542		// public methos: destroys the instance
5543		destroy : function( callback )
5544		{
5545			this.slideshow.destroy( callback );
5546		}
5547
5548    }
5549
5550    //simple wrapper to call the slideshow. makes sure that the slide data is not applied twice
5551    $.fn.aviaSlider = function( options )
5552    {
5553    	return this.each(function()
5554    	{
5555    		var self = $.data( this, 'aviaSlider' );
5556
5557    		if(!self)
5558    		{
5559    			self = $.data( this, 'aviaSlider', new $.AviaSlider( options, this ) );
5560    		}
5561    	});
5562    }
5563
5564
5565
5566})( jQuery );
5567
5568
5569
5570
5571// -------------------------------------------------------------------------------------------
5572// keyboard controls
5573// -------------------------------------------------------------------------------------------
5574
5575(function($)
5576{
5577	"use strict";
5578
5579	/************************************************************************
5580	keyboard arrow nav
5581	*************************************************************************/
5582	$.fn.avia_keyboard_controls = function(options_passed)
5583	{
5584		var defaults	=
5585		{
5586			37: '.prev-slide',	// prev
5587			39: '.next-slide'	// next
5588		},
5589
5590		methods		= {
5591
5592			mousebind: function(slider)
5593			{
5594				slider.hover(
5595					function(){  slider.mouseover	= true;  },
5596					function(){  slider.mouseover	= false; }
5597				);
5598			},
5599
5600			keybind: function(slider)
5601			{
5602				$(document).keydown(function(e)
5603				{
5604					if(slider.mouseover && typeof slider.options[e.keyCode] !== 'undefined')
5605					{
5606						var item;
5607
5608						if(typeof slider.options[e.keyCode] === 'string')
5609						{
5610							item = slider.find(slider.options[e.keyCode]);
5611						}
5612						else
5613						{
5614							item = slider.options[e.keyCode];
5615						}
5616
5617						if(item.length)
5618						{
5619							item.trigger('click', ['keypress']);
5620							return false;
5621						}
5622					}
5623				});
5624			}
5625		};
5626
5627
5628		return this.each(function()
5629		{
5630			var slider			= $(this);
5631			slider.options		= $.extend({}, defaults, options_passed);
5632			slider.mouseover	= false;
5633
5634			methods.mousebind(slider);
5635			methods.keybind(slider);
5636
5637		});
5638	};
5639
5640
5641	/************************************************************************
5642	swipe nav
5643	*************************************************************************/
5644	$.fn.avia_swipe_trigger = function(passed_options)
5645	{
5646		var win		= $(window),
5647		isMobile	= $.avia_utilities.isMobile,
5648		defaults	=
5649		{
5650			prev: '.prev-slide',
5651			next: '.next-slide',
5652			event: {
5653				prev: 'click',
5654				next: 'click'
5655			}
5656		},
5657
5658		methods = {
5659
5660			activate_touch_control: function(slider)
5661			{
5662				var i, differenceX, differenceY;
5663
5664				slider.touchPos = {};
5665				slider.hasMoved = false;
5666
5667				slider.on('touchstart', function(event)
5668				{
5669					slider.touchPos.X = event.originalEvent.touches[0].clientX;
5670					slider.touchPos.Y = event.originalEvent.touches[0].clientY;
5671				});
5672
5673				slider.on('touchend', function(event)
5674				{
5675					slider.touchPos = {};
5676	                if(slider.hasMoved) { event.preventDefault(); }
5677	                slider.hasMoved = false;
5678				});
5679
5680				slider.on('touchmove', function(event)
5681				{
5682					if(!slider.touchPos.X)
5683					{
5684						slider.touchPos.X = event.originalEvent.touches[0].clientX;
5685						slider.touchPos.Y = event.originalEvent.touches[0].clientY;
5686					}
5687					else
5688					{
5689						differenceX = event.originalEvent.touches[0].clientX - slider.touchPos.X;
5690						differenceY = event.originalEvent.touches[0].clientY - slider.touchPos.Y;
5691
5692						//check if user is scrolling the window or moving the slider
5693						if(Math.abs(differenceX) > Math.abs(differenceY))
5694						{
5695							event.preventDefault();
5696
5697							if(slider.touchPos !== event.originalEvent.touches[0].clientX)
5698							{
5699								if(Math.abs(differenceX) > 50)
5700								{
5701									i = differenceX > 0 ? 'prev' : 'next';
5702
5703									if(typeof slider.options[i] === 'string')
5704									{
5705										slider.find(slider.options[i]).trigger(slider.options.event[i], ['swipe']);
5706									}
5707									else
5708									{
5709										slider.options[i].trigger(slider.options.event[i], ['swipe']);
5710									}
5711
5712									slider.hasMoved = true;
5713									slider.touchPos = {};
5714									return false;
5715								}
5716							}
5717						}
5718	                }
5719				});
5720			}
5721		};
5722
5723		return this.each(function()
5724		{
5725			if(isMobile)
5726			{
5727				var slider	= $(this);
5728
5729				slider.options	= $.extend({}, defaults, passed_options);
5730
5731				methods.activate_touch_control(slider);
5732			}
5733		});
5734	};
5735
5736
5737
5738
5739
5740
5741
5742
5743
5744
5745
5746
5747
5748}(jQuery));
5749
5750
5751
5752

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.