Enfold Easy Full Width Slider with Small Preview Images below
In shortcodes.js the change is made to line 4441, the only change is to add a trigger for when a slide changes
<?php
/**
* Slider
* Shortcode that allows to display a simple slideshow
*/
if ( !class_exists( 'avia_sc_slider_full' ) )
{
class avia_sc_slider_full extends aviaShortcodeTemplate
{
static $slide_count = 0;
/**
* Create the config array for the shortcode button
*/
function shortcode_insert_button()
{
$this->config['name'] = __('Fullwidth Easy Slider', 'avia_framework' );
$this->config['tab'] = __('Media Elements', 'avia_framework' );
$this->config['icon'] = AviaBuilder::$path['imagesURL']."sc-slideshow-full.png";
$this->config['order'] = 80;
$this->config['target'] = 'avia-target-insert';
$this->config['shortcode'] = 'av_slideshow_full';
$this->config['shortcode_nested'] = array('av_slide_full');
$this->config['tooltip'] = __('Display a simple fullwidth slideshow element', 'avia_framework' );
$this->config['tinyMCE'] = array('disable' => "true");
$this->config['drag-level'] = 1;
}
/**
* Popup Elements
*
* If this function is defined in a child class the element automatically gets an edit button, that, when pressed
* opens a modal window that allows to edit the element properties
*
* @return void
*/
function popup_elements()
{
$this->elements = array(
array(
"type" => "modal_group",
"id" => "content",
'container_class' =>"avia-element-fullwidth avia-multi-img",
"modal_title" => __("Edit Form Element", 'avia_framework' ),
"add_label" => __("Add single image or video", 'avia_framework' ),
"std" => array(),
'creator' =>array(
"name" => __("Add Images", 'avia_framework' ),
"desc" => __("Here you can add new Images to the slideshow.", 'avia_framework' ),
"id" => "id",
"type" => "multi_image",
"title" => __("Add multiple Images",'avia_framework' ),
"button" => __("Insert Images",'avia_framework' ),
"std" => ""
),
'subelements' => array(
array(
"type" => "tab_container", 'nodescription' => true
),
array(
"type" => "tab",
"name" => __("Slide" , 'avia_framework'),
'nodescription' => true
),
array(
"name" => __("Which type of slide is this?",'avia_framework' ),
"id" => "slide_type",
"type" => "select",
"std" => "",
"subtype" => array( __('Image Slide','avia_framework' ) =>'image',
__('Video Slide','avia_framework' ) =>'video',
)
),
array(
"name" => __("Choose another Image",'avia_framework' ),
"desc" => __("Either upload a new, or choose an existing image from your media library",'avia_framework' ),
"id" => "id",
"fetch" => "id",
"type" => "image",
"required"=> array('slide_type','is_empty_or','image'),
"title" => __("Change Image",'avia_framework' ),
"button" => __("Change Image",'avia_framework' ),
"std" => ""),
array(
"name" => __("Video URL", 'avia_framework' ),
"desc" => __('Enter the URL to the Video. Currently supported are Youtube, Vimeo and direct linking of web-video files (mp4, webm, ogv)', 'avia_framework' ) .'<br/><br/>'.
__('Working examples Youtube & Vimeo:', 'avia_framework' ).'<br/>
<strong>http://vimeo.com/1084537</strong><br/>
<strong>http://www.youtube.com/watch?v=5guMumPFBag</strong><br/><br/>',
"required"=> array('slide_type','equals','video'),
"id" => "video",
"std" => "http://",
"type" => "video",
"title" => __("Upload Video",'avia_framework' ),
"button" => __("Use Video",'avia_framework' ),
),
array(
"name" => __("Choose fallback image for mobile devices",'avia_framework' ),
"desc" => __("Either upload a new, or choose an existing image from your media library",'avia_framework' )."<br/><small>".__("Video on most mobile devices can't be controlled properly with JavaScript, which is mandatory here, therefore you are required to select a fallback image which can be displayed instead", 'avia_framework' ) ."</small>" ,
"id" => "mobile_image",
"fetch" => "id",
"type" => "image",
"required"=> array('slide_type','equals','video'),
"title" => __("Choose Image",'avia_framework' ),
"button" => __("Choose Image",'avia_framework' ),
"std" => ""),
array(
"name" => __("Video Size", 'avia_framework' ),
"desc" => __("By default the video will try to match the default slideshow size that was selected in the slider settings at 'Slideshow Image and Video Size'", 'avia_framework' ),
"id" => "video_format",
"type" => "select",
"std" => "",
"required"=> array('slide_type','equals','video'),
"subtype" => array(
__('Try to match the default slideshow size (Video will not be cropped, but black borders will be visible at each side)', 'avia_framework' ) =>'',
__('Try to match the default slideshow size but stretch the video to fill the whole slider (video will be cropped at top and bottom)', 'avia_framework' ) =>'stretch',
__('Show the full Video without cropping', 'avia_framework' ) =>'full',
)
),
array(
"name" => __("Video Aspect Ratio", 'avia_framework' ),
"desc" => __("In order to calculate the correct height and width for the video slide you need to enter a aspect ratio (width:height). usually: 16:9 or 4:3.", 'avia_framework' )."<br/>".__("If left empty 16:9 will be used", 'avia_framework' ) ,
"id" => "video_ratio",
"required"=> array('video_format','not',''),
"std" => "16:9",
"type" => "input"),
array(
"name" => __("Hide Video Controls", 'avia_framework' ),
"desc" => __("Check if you want to hide the controls (works for youtube and self hosted videos)", 'avia_framework' ) ,
"id" => "video_controls",
"required"=> array('slide_type','equals','video'),
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Mute Video Player", 'avia_framework' ),
"desc" => __("Check if you want to mute the video", 'avia_framework' ) ,
"id" => "video_mute",
"required"=> array('slide_type','equals','video'),
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Loop Video Player", 'avia_framework' ),
"desc" => __("Check if you want to loop the video (instead of showing the next slide the video will play from the beginning again)", 'avia_framework' ) ,
"id" => "video_loop",
"required"=> array('slide_type','equals','video'),
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Disable Autoplay", 'avia_framework' ),
"desc" => __("Check if you want to disable video autoplay when this slide shows", 'avia_framework' ) ,
"id" => "video_autoplay",
"required"=> array('slide_type','equals','video'),
"std" => "",
"type" => "checkbox"),
array(
"type" => "close_div",
'nodescription' => true
),
array(
"type" => "tab",
"name" => __("Caption",'avia_framework' ),
'nodescription' => true
),
array(
"name" => __("Caption Title", 'avia_framework' ),
"desc" => __("Enter a caption title for the slide here", 'avia_framework' ) ,
"id" => "title",
"std" => "",
"container_class" => 'av_half av_half_first',
"type" => "input"),
array(
"name" => __("Caption Title Font Size", 'avia_framework' ),
"desc" => __("Select a custom font size. Leave empty to use the default", 'avia_framework' ),
"id" => "custom_title_size",
"type" => "select",
"std" => "",
"container_class" => 'av_half',
"subtype" => AviaHtmlHelper::number_array(10,120,1, array( __("Default Size", 'avia_framework' )=>''), 'px'),
),
array(
"name" => __("Caption Text", 'avia_framework' ),
"desc" => __("Enter some additional caption text", 'avia_framework' ) ,
"id" => "content",
"type" => "textarea",
"container_class" => 'av_half av_half_first',
"std" => "",
),
array(
"name" => __("Caption Text Font Size", 'avia_framework' ),
"desc" => __("Select a custom font size. Leave empty to use the default", 'avia_framework' ),
"id" => "custom_content_size",
"type" => "select",
"std" => "",
"container_class" => 'av_half av_no_bottom',
"subtype" => AviaHtmlHelper::number_array(10,90,1, array( __("Default Size", 'avia_framework' )=>''), 'px'),
),
array(
"name" => __("Caption Positioning",'avia_framework' ),
"id" => "caption_pos",
"type" => "select",
"std" => "caption_bottom",
"subtype" => array(
__('Right Framed', 'avia_framework' )=>'caption_right caption_right_framed caption_framed',
__('Left Framed', 'avia_framework' )=>'caption_left caption_left_framed caption_framed',
__('Bottom Framed', 'avia_framework' )=>'caption_bottom caption_bottom_framed caption_framed',
__('Center Framed', 'avia_framework' )=>'caption_center caption_center_framed caption_framed',
__('Right without Frame', 'avia_framework' )=>'caption_right',
__('Left without Frame', 'avia_framework' )=>'caption_left',
__('Bottom without Frame', 'avia_framework' )=>'caption_bottom',
__('Center without Frame', 'avia_framework' )=>'caption_center'
),
),
array(
"name" => __("Apply a link or buttons to the slide?", 'avia_framework' ),
"desc" => __("You can choose to apply the link to the whole image or to add 'Call to Action Buttons' that get appended to the caption", 'avia_framework' ),
"id" => "link_apply",
"type" => "select",
"std" => "",
"subtype" => array(
__('No Link for this slide', 'avia_framework' ) =>'',
__('Apply Link to Image', 'avia_framework' ) =>'image',
__('Attach one button', 'avia_framework' ) =>'button',
__('Attach two buttons', 'avia_framework' ) =>'button button-two')),
array(
"name" => __("Image Link?", 'avia_framework' ),
"desc" => __("Where should the Image link to?", 'avia_framework' ),
"id" => "link",
"required"=> array('link_apply','equals','image'),
"type" => "linkpicker",
"fetchTMPL" => true,
"subtype" => array(
__('Open Image in Lightbox', 'avia_framework' ) =>'lightbox',
__('Set Manually', 'avia_framework' ) =>'manually',
__('Single Entry', 'avia_framework' ) => 'single',
__('Taxonomy Overview Page', 'avia_framework' ) => 'taxonomy',
),
"std" => ""),
array(
"name" => __("Open Link in new Window?", 'avia_framework' ),
"desc" => __("Select here if you want to open the linked page in a new window", 'avia_framework' ),
"id" => "link_target",
"type" => "select",
"std" => "",
"required"=> array('link','not_empty_and','lightbox'),
"subtype" => AviaHtmlHelper::linking_options()),
array( "name" => __("Button 1 Label", 'avia_framework' ),
"desc" => __("This is the text that appears on your button.", 'avia_framework' ),
"id" => "button_label",
"type" => "input",
"container_class" => 'av_half av_half_first',
"required"=> array('link_apply','contains','button'),
"std" => "Click me"),
array(
"name" => __("Button 1 Color", 'avia_framework' ),
"desc" => __("Choose a color for your button here", 'avia_framework' ),
"id" => "button_color",
"type" => "select",
"std" => "light",
"container_class" => 'av_half',
"required"=> array('link_apply','contains','button'),
"subtype" => array(
__('Translucent Buttons', 'avia_framework' ) => array(
__('Light Transparent', 'avia_framework' )=>'light',
__('Dark Transparent', 'avia_framework' )=>'dark',
),
__('Colored Buttons', 'avia_framework' ) => array(
__('Theme Color', 'avia_framework' )=>'theme-color',
__('Theme Color Subtle', 'avia_framework' )=>'theme-color-subtle',
__('Blue', 'avia_framework' )=>'blue',
__('Red', 'avia_framework' )=>'red',
__('Green', 'avia_framework' )=>'green',
__('Orange', 'avia_framework' )=>'orange',
__('Aqua', 'avia_framework' )=>'aqua',
__('Teal', 'avia_framework' )=>'teal',
__('Purple', 'avia_framework' )=>'purple',
__('Pink', 'avia_framework' )=>'pink',
__('Silver', 'avia_framework' )=>'silver',
__('Grey', 'avia_framework' )=>'grey',
__('Black', 'avia_framework' )=>'black',
)
)),
array(
"name" => __("Button 1 Link?", 'avia_framework' ),
"desc" => __("Where should the Button link to?", 'avia_framework' ),
"id" => "link1",
"container_class" => 'av_half av_half_first',
"required"=> array('link_apply','contains','button'),
"type" => "linkpicker",
"fetchTMPL" => true,
"subtype" => array(
__('Set Manually', 'avia_framework' ) =>'manually',
__('Single Entry', 'avia_framework' ) => 'single',
__('Taxonomy Overview Page', 'avia_framework' ) => 'taxonomy',
),
"std" => ""),
array(
"name" => __("Button 1 Link Target?", 'avia_framework' ),
"desc" => __("Select here if you want to open the linked page in a new window", 'avia_framework' ),
"id" => "link_target1",
"type" => "select",
"std" => "",
"container_class" => 'av_half',
"required"=> array('link_apply','contains','button'),
"subtype" => AviaHtmlHelper::linking_options()),
array( "name" => __("Button 2 Label", 'avia_framework' ),
"desc" => __("This is the text that appears on your second button.", 'avia_framework' ),
"id" => "button_label2",
"type" => "input",
"container_class" => 'av_half av_half_first',
"required"=> array('link_apply','contains','button-two'),
"std" => "Click me"),
array(
"name" => __("Button 2 Color", 'avia_framework' ),
"desc" => __("Choose a color for your second button here", 'avia_framework' ),
"id" => "button_color2",
"type" => "select",
"std" => "light",
"container_class" => 'av_half',
"required"=> array('link_apply','contains','button-two'),
"subtype" => array(
__('Translucent Buttons', 'avia_framework' ) => array(
__('Light Transparent', 'avia_framework' )=>'light',
__('Dark Transparent', 'avia_framework' )=>'dark',
),
__('Colored Buttons', 'avia_framework' ) => array(
__('Theme Color', 'avia_framework' )=>'theme-color',
__('Theme Color Subtle', 'avia_framework' )=>'theme-color-subtle',
__('Blue', 'avia_framework' )=>'blue',
__('Red', 'avia_framework' )=>'red',
__('Green', 'avia_framework' )=>'green',
__('Orange', 'avia_framework' )=>'orange',
__('Aqua', 'avia_framework' )=>'aqua',
__('Teal', 'avia_framework' )=>'teal',
__('Purple', 'avia_framework' )=>'purple',
__('Pink', 'avia_framework' )=>'pink',
__('Silver', 'avia_framework' )=>'silver',
__('Grey', 'avia_framework' )=>'grey',
__('Black', 'avia_framework' )=>'black',
)
)),
array(
"name" => __("Button 2 Link?", 'avia_framework' ),
"desc" => __("Where should the Button link to?", 'avia_framework' ),
"id" => "link2",
"container_class" => 'av_half av_half_first',
"required"=> array('link_apply','contains','button-two'),
"type" => "linkpicker",
"fetchTMPL" => true,
"subtype" => array(
__('Set Manually', 'avia_framework' ) =>'manually',
__('Single Entry', 'avia_framework' ) => 'single',
__('Taxonomy Overview Page', 'avia_framework' ) => 'taxonomy',
),
"std" => ""),
array(
"name" => __("Button 2 Link Target?", 'avia_framework' ),
"desc" => __("Select here if you want to open the linked page in a new window", 'avia_framework' ),
"id" => "link_target2",
"type" => "select",
"std" => "",
"container_class" => 'av_half',
"required"=> array('link_apply','contains','button-two'),
"subtype" => AviaHtmlHelper::linking_options()),
array(
"type" => "close_div",
'nodescription' => true
),
array(
"type" => "tab",
"name" => __("Colors",'avia_framework' ),
'nodescription' => true
),
array(
"name" => __("Font Colors", 'avia_framework' ),
"desc" => __("Either use the themes default colors or apply some custom ones", 'avia_framework' ),
"id" => "font_color",
"type" => "select",
"std" => "",
"subtype" => array( __('Default', 'avia_framework' )=>'',
__('Define Custom Colors', 'avia_framework' )=>'custom'),
),
array(
"name" => __("Custom Caption Title Font Color", 'avia_framework' ),
"desc" => __("Select a custom font color. Leave empty to use the default", 'avia_framework' ),
"id" => "custom_title",
"type" => "colorpicker",
"std" => "",
"container_class" => 'av_half av_half_first',
"required" => array('font_color','equals','custom')
),
array(
"name" => __("Custom Caption Content Font Color", 'avia_framework' ),
"desc" => __("Select a custom font color. Leave empty to use the default", 'avia_framework' ),
"id" => "custom_content",
"type" => "colorpicker",
"std" => "",
"container_class" => 'av_half',
"required" => array('font_color','equals','custom')
),
array(
"type" => "close_div",
'nodescription' => true
),
array(
"type" => "tab",
"name" => __("Slide Overlay" , 'avia_framework'),
'nodescription' => true
),
array(
"name" => __("Enable Overlay?", 'avia_framework' ),
"desc" => __("Check if you want to display a transparent color and/or pattern overlay above your slideshow image/video", 'avia_framework' ),
"id" => "overlay_enable",
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Overlay Opacity",'avia_framework' ),
"desc" => __("Set the opacity of your overlay: 0.1 is barely visible, 1.0 is opaque ", 'avia_framework' ),
"id" => "overlay_opacity",
"type" => "select",
"std" => "0.5",
"required" => array('overlay_enable','not',''),
"subtype" => array( __('0.1','avia_framework' )=>'0.1',
__('0.2','avia_framework' )=>'0.2',
__('0.3','avia_framework' )=>'0.3',
__('0.4','avia_framework' )=>'0.4',
__('0.5','avia_framework' )=>'0.5',
__('0.6','avia_framework' )=>'0.6',
__('0.7','avia_framework' )=>'0.7',
__('0.8','avia_framework' )=>'0.8',
__('0.9','avia_framework' )=>'0.9',
__('1.0','avia_framework' )=>'1',
)
),
array(
"name" => __("Overlay Color", 'avia_framework' ),
"desc" => __("Select a custom color for your overlay here. Leave empty if you want no color overlay", 'avia_framework' ),
"id" => "overlay_color",
"type" => "colorpicker",
"required" => array('overlay_enable','not',''),
"std" => "",
),
array(
"required" => array('overlay_enable','not',''),
"id" => "overlay_pattern",
"name" => __("Background Image", 'avia_framework'),
"desc" => __("Select an existing or upload a new background image", 'avia_framework'),
"type" => "select",
"subtype" => array(__('No Background Image', 'avia_framework')=>'',__('Upload custom image', 'avia_framework')=>'custom'),
"std" => "",
"folder" => "images/background-images/",
"folderlabel" => "",
"group" => "Select predefined pattern",
"exclude" => array('fullsize-', 'gradient')
),
array(
"name" => __("Custom Pattern",'avia_framework' ),
"desc" => __("Upload your own seamless pattern",'avia_framework' ),
"id" => "overlay_custom_pattern",
"type" => "image",
"fetch" => "url",
"secondary_img"=>true,
"required" => array('overlay_pattern','equals','custom'),
"title" => __("Insert Pattern",'avia_framework' ),
"button" => __("Insert",'avia_framework' ),
"std" => ""),
array(
"type" => "close_div",
'nodescription' => true
),
array(
"type" => "close_div",
'nodescription' => true
),
)
),
array(
"name" => __("Slideshow Image and Video Size", 'avia_framework' ),
"desc" => __("Choose image and Video size for your slideshow.", 'avia_framework' ),
"id" => "size",
"type" => "select",
"std" => "featured",
"subtype" => AviaHelper::get_registered_image_sizes(1000)
),
array(
"name" => __("Stretch image to fit the slideshow size?",'avia_framework' ),
"desc" => __("By default the image stretches across the full width of the screen. You can deactivate this behavior and simply align it in the center of the slider",'avia_framework' ),
"id" => "stretch",
"type" => "select",
"std" => "",
"subtype" => array(__('Yes, stretch the image','avia_framework' ) =>'',__('No, dont stretch the image. If the browser window is bigger than the image simply align it centered','avia_framework' ) =>'image_no_stretch')),
array(
"name" => __("Slideshow Transition", 'avia_framework' ),
"desc" => __("Choose the transition for your Slideshow.", 'avia_framework' ),
"id" => "animation",
"type" => "select",
"std" => "slide",
"subtype" => array(__('Slide sidewards','avia_framework' ) =>'slide', __('Slide up/down','avia_framework' ) =>'slide_up', __('Fade','avia_framework' ) =>'fade'),
),
array(
"name" => __("Autorotation active?",'avia_framework' ),
"desc" => __("Check if the slideshow should rotate by default",'avia_framework' ),
"id" => "autoplay",
"type" => "select",
"std" => "false",
"subtype" => array(__('Yes','avia_framework' ) =>'true',__('No','avia_framework' ) =>'false')),
array(
"name" => __("Stop Autorotation with the last slide", 'avia_framework' ),
"desc" => __("Check if you want to disable autorotation when this last slide is displayed", 'avia_framework' ) ,
"id" => "autoplay_stopper",
"required"=> array('autoplay','equals','true'),
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Slideshow autorotation duration",'avia_framework' ),
"desc" => __("Images will be shown the selected amount of seconds.",'avia_framework' ),
"id" => "interval",
"type" => "select",
"std" => "5",
"subtype" =>
array('1'=>'1','2'=>'2','3'=>'3','4'=>'4','5'=>'5','6'=>'6','7'=>'7','8'=>'8','9'=>'9','10'=>'10','15'=>'15','20'=>'20','30'=>'30','40'=>'40','60'=>'60','100'=>'100')),
array(
"name" => __("Slideshow control styling?",'avia_framework' ),
"desc" => __("Here you can select if and how to display the slideshow controls",'avia_framework' ),
"id" => "control_layout",
"type" => "select",
"std" => "av-control-default",
"subtype" => array(__('Default','avia_framework' ) =>'av-control-default',__('Minimal White','avia_framework' ) =>'av-control-minimal', __('Minimal Black','avia_framework' ) =>'av-control-minimal av-control-minimal-dark',__('Hidden','avia_framework' ) =>'av-control-hidden')),
array(
"name" => __("Show preview images below slider?", 'avia_framework' ),
"desc" => __("If checked the there will be shown small preview images below the slider.", 'avia_framework' ) ,
"id" => "slider_preview_images",
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Use first slides caption as permanent caption", 'avia_framework' ),
"desc" => __("If checked the caption will be placed on top of the slider. Please be aware that all slideshow link settings and other captions will be ignored then", 'avia_framework' ) ,
"id" => "perma_caption",
"std" => "",
"type" => "checkbox"),
array(
"name" => __("Slideshow Background Image",'avia_framework' ),
"desc" => __("If you are displaying transparent images like pngs you can set a static background image or pattern that will appear behind those pngs.",'avia_framework' ),
"id" => "src",
"type" => "image",
"title" => __("Insert Image",'avia_framework' ),
"button" => __("Insert",'avia_framework' ),
"std" => ""),
array(
"name" => __("Background Image Position",'avia_framework' ),
"id" => "position",
"type" => "select",
"std" => "top left",
"required" => array('src','not',''),
"subtype" => array( __('Top Left','avia_framework' ) =>'top left',
__('Top Center','avia_framework' ) =>'top center',
__('Top Right','avia_framework' ) =>'top right',
__('Bottom Left','avia_framework' ) =>'bottom left',
__('Bottom Center','avia_framework' ) =>'bottom center',
__('Bottom Right','avia_framework' ) =>'bottom right',
__('Center Left','avia_framework' ) =>'center left',
__('Center Center','avia_framework' ) =>'center center',
__('Center Right','avia_framework' ) =>'center right'
)
),
array(
"name" => __("Background Repeat",'avia_framework' ),
"id" => "repeat",
"type" => "select",
"std" => "no-repeat",
"required" => array('src','not',''),
"subtype" => array( __('No Repeat','avia_framework' ) =>'no-repeat',
__('Repeat','avia_framework' ) =>'repeat',
__('Tile Horizontally','avia_framework' ) =>'repeat-x',
__('Tile Vertically','avia_framework' ) =>'repeat-y',
__('Stretch to fit','avia_framework' ) =>'stretch'
)
),
array(
"name" => __("Background Attachment",'avia_framework' ),
"id" => "attach",
"type" => "select",
"std" => "scroll",
"required" => array('src','not',''),
"subtype" => array(__('Scroll','avia_framework' )=>'scroll',__('Fixed','avia_framework' ) =>'fixed')
),
);
}
/**
* Editor Element - this function defines the visual appearance of an element on the AviaBuilder Canvas
* Most common usage is to define some markup in the $params['innerHtml'] which is then inserted into the drag and drop container
* Less often used: $params['data'] to add data attributes, $params['class'] to modify the className
*
*
* @param array $params this array holds the default values for $content and $args.
* @return $params the return array usually holds an innerHtml key that holds item specific markup.
*/
function editor_element($params)
{
$params['innerHtml'] = "<img src='".$this->config['icon']."' title='".$this->config['name']."' />";
$params['innerHtml'].= "<div class='avia-element-label'>".$this->config['name']."</div>";
return $params;
}
/**
* Editor Sub Element - this function defines the visual appearance of an element that is displayed within a modal window and on click opens its own modal window
* Works in the same way as Editor Element
* @param array $params this array holds the default values for $content and $args.
* @return $params the return array usually holds an innerHtml key that holds item specific markup.
*/
function editor_sub_element($params)
{
$img_template = $this->update_template("img_fakeArg", "{{img_fakeArg}}");
$template = $this->update_template("title", "{{title}}");
$content = $this->update_template("content", "{{content}}");
$video = $this->update_template("video", "{{video}}");
$thumbnail = isset($params['args']['id']) ? wp_get_attachment_image($params['args']['id']) : "";
$params['innerHtml'] = "";
$params['innerHtml'] .= "<div class='avia_title_container'>";
$params['innerHtml'] .= " <div ".$this->class_by_arguments('slide_type' ,$params['args']).">";
$params['innerHtml'] .= " <span class='avia_slideshow_image' {$img_template} >{$thumbnail}</span>";
$params['innerHtml'] .= " <div class='avia_slideshow_content'>";
$params['innerHtml'] .= " <h4 class='avia_title_container_inner' {$template} >".$params['args']['title']."</h4>";
$params['innerHtml'] .= " <p class='avia_content_container' {$content}>".stripslashes($params['content'])."</p>";
$params['innerHtml'] .= " <small class='avia_video_url' {$video}>".stripslashes($params['args']['video'])."</small>";
$params['innerHtml'] .= " </div>";
$params['innerHtml'] .= " </div>";
$params['innerHtml'] .= "</div>";
return $params;
}
/**
* Frontend Shortcode Handler
*
* @param array $atts array of attributes
* @param string $content text within enclosing form of shortcode element
* @param string $shortcodename the shortcode found, when == callback name
* @return string $output returns the modified html string
*/
function shortcode_handler($atts, $content = "", $shortcodename = "", $meta = "")
{
$atts = shortcode_atts(array(
'size' => 'featured',
'animation' => 'slide',
'ids' => '',
'autoplay' => 'false',
'interval' => 5,
'handle' => $shortcodename,
'src' => '',
'position' => 'top left',
'repeat' => 'no-repeat',
'attach' => 'scroll',
//'easing' => 'easeInOutQuint',
'stretch' => '',
'control_layout'=> 'av-control-default',
'perma_caption' => '',
'slider_preview_images' => '',
'autoplay_stopper'=>'',
'content' => ShortcodeHelper::shortcode2array($content, 1)
), $atts, $this->config['shortcode']);
extract($atts);
$output = "";
$background = "";
$class = "";
if($src != "")
{
if($repeat == 'stretch')
{
$background .= "background-repeat: no-repeat; ";
$class .= " avia-full-stretch";
}
else
{
$background .= "background-repeat: {$repeat}; ";
}
$background .= "background-image: url({$src}); ";
$background .= "background-attachment: {$attach}; ";
$background .= "background-position: {$position}; ";
}
if($background) $params['bg'] = "style = '{$background}'";
$skipSecond = false;
avia_sc_slider_full::$slide_count++;
if( !empty( $atts['slider_preview_images'] ) ) {
$class .= " yanco-preview-images";
}
$params['class'] = "avia-fullwidth-slider main_color avia-shadow ".$meta['el_class'].$class;
$params['open_structure'] = false;
//we dont need a closing structure if the element is the first one or if a previous fullwidth element was displayed before
if(isset($meta['index']) && $meta['index'] == 0) $params['close'] = false;
if(!empty($meta['siblings']['prev']['tag']) && in_array($meta['siblings']['prev']['tag'], AviaBuilder::$full_el_no_section )) $params['close'] = false;
if(isset($meta['index']) && $meta['index'] != 0) $params['class'] .= " slider-not-first";
$params['id'] = "full_slider_".avia_sc_slider_full::$slide_count;
$output .= avia_new_section($params);
$slider = new avia_slideshow($atts);
$slider->set_extra_class($stretch);
$output .= $slider->html();
$output .= "</div>"; //close section
//if the next tag is a section dont create a new section from this shortcode
if(!empty($meta['siblings']['next']['tag']) && in_array($meta['siblings']['next']['tag'], AviaBuilder::$full_el ))
{
$skipSecond = true;
}
//if there is no next element dont create a new section.
if(empty($meta['siblings']['next']['tag']))
{
$skipSecond = true;
}
if(empty($skipSecond)) {
$output .= avia_new_section(array('close'=>false, 'id' => "after_full_slider_".avia_sc_slider_full::$slide_count));
}
return $output;
}
}
}
(function($)
{
"use strict";
$(document).ready(function()
{
//global variables that are used on several ocassions
$.avia_utilities = $.avia_utilities || {};
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) && 'ontouchstart' in document.documentElement)
{
$.avia_utilities.isMobile = true;
}
else
{
$.avia_utilities.isMobile = false;
}
//activate fixed bg fallback for mobile
if($.fn.avia_mobile_fixed)
$('.avia-bg-style-fixed').avia_mobile_fixed();
//activate parallax scrolling for backgrounds.
if($.fn.avia_parallax)
$('.av-parallax').avia_parallax();
//calculate the browser height and append a css rule to the head
if($.fn.avia_browser_height)
$('.av-minimum-height, .avia-fullscreen-slider').avia_browser_height();
//calculate the height of each video section
if($.fn.avia_video_section)
$('.av-section-with-video-bg').avia_video_section();
//creates team social icon tooltip
new $.AviaTooltip({'class': "avia-tooltip", data: "avia-tooltip", delay:0, scope: "body"});
//creates icon element tooltip
new $.AviaTooltip({'class': "avia-tooltip avia-icon-tooltip", data: "avia-icon-tooltip", delay:0, scope: "body"});
activate_shortcode_scripts();
//layer slider height helper
$('.avia-layerslider').layer_slider_height_helper();
//"ajax" portfolio
$('.grid-links-ajax').avia_portfolio_preview();
// actiavte the masonry script: sorting/loading/etc
if($.fn.avia_masonry)
$('.av-masonry').avia_masonry();
//activate the accordion
if($.fn.aviaccordion)
$('.aviaccordion').aviaccordion();
//activate the accordion
if($.fn.avia_textrotator)
$('.av-rotator-container').avia_textrotator();
});
// -------------------------------------------------------------------------------------------
// ACTIVATE ALL SHORTCODES
// -------------------------------------------------------------------------------------------
function activate_waypoints(container)
{
//activates simple css animations of the content once the user scrolls to an elements
if($.fn.avia_waypoints)
{
if(typeof container == 'undefined'){ container = 'body';};
$('.avia_animate_when_visible', container).avia_waypoints();
$('.avia_animate_when_almost_visible', container).avia_waypoints({ offset: '80%'});
if(container == 'body') container = '.avia_desktop body';
$('.av-animated-generic', container).avia_waypoints({ offset: '95%'});
}
}
function activate_shortcode_scripts(container)
{
if(typeof container == 'undefined'){ container = 'body';}
//activates the form shortcode
if($.fn.avia_ajax_form)
{
$('.avia_ajax_form:not( .avia-disable-default-ajax )', container).avia_ajax_form();
}
activate_waypoints(container);
//activate the video api
if($.fn.aviaVideoApi)
{
$('.avia-slideshow iframe[src*="youtube.com"], .av_youtube_frame, .avia-slideshow iframe[src*="vimeo.com"], .avia-slideshow video').aviaVideoApi({}, 'li');
}
//activates the toggle shortcode
if($.fn.avia_sc_toggle)
{
$('.togglecontainer', container).avia_sc_toggle();
}
//activates the tabs shortcode
if($.fn.avia_sc_tabs)
{
$('.top_tab', container).avia_sc_tabs();
$('.sidebar_tab', container).avia_sc_tabs({sidebar:true});
}
//activates behavior and animation for gallery
if($.fn.avia_sc_gallery)
{
$('.avia-gallery', container).avia_sc_gallery();
}
//activates animated number shortcode
if($.fn.avia_sc_animated_number)
{
$('.avia-animated-number', container).avia_sc_animated_number();
}
//animation for elements that are not connected like icon shortcode
if($.fn.avia_sc_animation_delayed)
{
$('.av_font_icon', container).avia_sc_animation_delayed({delay:100});
$('.avia-image-container', container).avia_sc_animation_delayed({delay:100});
$('.av-hotspot-image-container', container).avia_sc_animation_delayed({delay:100});
$('.av-animated-generic', container).avia_sc_animation_delayed({delay:100});
}
//activates animation for iconlist
if($.fn.avia_sc_iconlist)
{
$('.avia-icon-list.av-iconlist-big', container).avia_sc_iconlist();
}
//activates animation for progress bar
if($.fn.avia_sc_progressbar)
{
$('.avia-progress-bar-container', container).avia_sc_progressbar();
}
//activates animation for testimonial
if($.fn.avia_sc_testimonial)
{
$('.avia-testimonial-wrapper', container).avia_sc_testimonial();
}
//activate the fullscreen slider
$('.avia-slideshow.av_fullscreen', container).aviaFullscreenSlider();
//activate the aviaslider
$('.avia-slideshow:not(.av_fullscreen)', container).aviaSlider();
//content slider
$('.avia-content-slider-active', container).aviaSlider({wrapElement: '.avia-content-slider-inner', slideElement:'.slide-entry-wrap', fullfade:true});
//testimonial slider
$('.avia-slider-testimonials', container).aviaSlider({wrapElement: '.avia-testimonial-row', slideElement:'.avia-testimonial', fullfade:true});
//load and activate maps
if($.fn.aviaMaps)
{
$('.avia-google-map-container', container).aviaMaps();
}
//load magazine sorting
if($.fn.aviaMagazine)
{
$('.av-magazine-tabs-active', container).aviaMagazine();
}
//load image hotspot
if($.fn.aviaHotspots)
{
$('.av-hotspot-image-container', container).aviaHotspots();
}
//load countdown
if($.fn.aviaCountdown)
{
$('.av-countdown-timer', container).aviaCountdown();
}
//load countdown
if($.fn.aviaCountdown)
{
$('.av-countdown-timer', container).aviaCountdown();
}
}
// -------------------------------------------------------------------------------------------
//
// AVIA Countdown
//
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
var _units = ['weeks','days','hours','minutes','seconds'],
_second = 1000,
_minute = _second * 60,
_hour = _minute * 60,
_day = _hour * 24,
_week = _day * 7,
ticker = function(_self)
{
var _time = {},
_now = new Date(),
_timestamp = _self.end - _now;
if(_timestamp <= 0)
{
clearInterval(_self.countdown);
return;
}
_self.time.weeks = Math.floor( _timestamp / _week);
_self.time.days = Math.floor((_timestamp % _week) / _day);
_self.time.hours = Math.floor((_timestamp % _day) / _hour);
_self.time.minutes = Math.floor((_timestamp % _hour) / _minute);
_self.time.seconds = Math.floor((_timestamp % _minute) / _second);
switch(_self.data.maximum)
{
case 1: _self.time.seconds = Math.floor(_timestamp / _second); break;
case 2: _self.time.minutes = Math.floor(_timestamp / _minute); break;
case 3: _self.time.hours = Math.floor(_timestamp / _hour); break;
case 4: _self.time.days = Math.floor(_timestamp / _day); break;
}
for (var i in _self.time)
{
if(typeof _self.update[i] == "object")
{
if(_self.firstrun || _self.oldtime[i] != _self.time[i])
{
var labelkey = ( _self.time[i] === 1 ) ? "single" : "multi";
_self.update[i].time_container.text(_self.time[i]);
_self.update[i].label_container.text(_self.update[i][labelkey]);
}
}
}
//show ticker
if(_self.firstrun) _self.container.addClass('av-countdown-active')
_self.oldtime = $.extend( {}, _self.time );
_self.firstrun = false;
};
$.fn.aviaCountdown = function( options )
{
if(!this.length) return;
return this.each(function()
{
var _self = {};
_self.update = {};
_self.time = {};
_self.oldtime = {};
_self.firstrun = true;
_self.container = $(this);
_self.data = _self.container.data();
_self.end = new Date(_self.data.year, _self.data.month, _self.data.day, _self.data.hour, _self.data.minute );
for (var i in _units)
{
_self.update[_units[i]] = {
time_container: _self.container.find('.av-countdown-' + _units[i] + ' .av-countdown-time'),
label_container: _self.container.find('.av-countdown-' + _units[i] + ' .av-countdown-time-label'),
};
if(_self.update[_units[i]].label_container.length)
{
_self.update[_units[i]].single = _self.update[_units[i]].label_container.data('label');
_self.update[_units[i]].multi = _self.update[_units[i]].label_container.data('label-multi');
}
}
ticker(_self);
_self.countdown = setInterval(function(){ ticker(_self); }, _self.data.interval);
});
}
}(jQuery));
// -------------------------------------------------------------------------------------------
//
// AVIA Image Hotspots
//
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
$.fn.aviaHotspots = function( options )
{
if(!this.length) return;
return this.each(function()
{
var _self = {};
_self.container = $(this);
_self.hotspots = _self.container.find('.av-image-hotspot');
_self.container.on('avia_start_animation', function()
{
setTimeout(function()
{
_self.hotspots.each(function(i)
{
var current = $(this);
setTimeout(function(){ current.addClass('av-display-hotspot'); },300 * i);
});
},400);
});
});
}
}(jQuery));
// -------------------------------------------------------------------------------------------
//
// AVIA Magazine function for magazine sorting
//
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
var animating = false,
methods = {
switchMag: function(clicked, _self)
{
var current = $(clicked)
if(current.is('.active_sort') || animating) return;
var filter = current.data('filter'),
oldContainer = _self.container.filter(':visible'),
newContainer = _self.container.filter('.' + filter);
//switch Class
animating = true;
_self.sort_buttons.removeClass('active_sort');
current.addClass('active_sort');
//apply fixed heiht for transition
_self.magazine.height(_self.magazine.outerHeight());
//switch items
oldContainer.avia_animate({opacity:0}, 200, function()
{
oldContainer.css({display:'none'});
newContainer.css({opacity:0, display:'block'}).avia_animate({opacity:1}, 150, function()
{
_self.magazine.avia_animate({height: (newContainer.outerHeight() + _self.sort_bar.outerHeight())}, 150, function()
{
_self.magazine.height('auto');
animating = false;
});
});
});
}
};
$.fn.aviaMagazine = function( options )
{
if(!this.length) return;
return this.each(function()
{
var _self = {};
_self.magazine = $(this),
_self.sort_buttons = _self.magazine.find('.av-magazine-sort a');
_self.container = _self.magazine.find('.av-magazine-group');
_self.sort_bar = _self.magazine.find('.av-magazine-top-bar');
_self.sort_buttons.on('click', function(e){ e.preventDefault(); methods.switchMag(this, _self); } );
});
}
}(jQuery));
// -------------------------------------------------------------------------------------------
//
// AVIA MAPS API - loads the google maps api asynchronously
//
// afterwards applies the map to the container
//
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
$.AviaMapsAPI = function(options, container)
{
if(typeof window.av_google_map == 'undefined')
{
$.avia_utilities.log('Map creation stopped, var av_google_map not found'); return
}
// gatehr container and map data
this.container = container;
this.$container = $( container );
this.$body = $('body');
this.$mapid = this.$container.data('mapid') - 1;
this.$data = window.av_google_map[this.$mapid];
this.retina = window.devicePixelRatio > 1;
// set up the whole api object
this._init( options );
}
$.AviaMapsAPI.apiFiles =
{
loading: false,
finished: false,
src: 'https://maps.googleapis.com/maps/api/js?v=3.24&callback=aviaOnGoogleMapsLoaded'
}
$.AviaMapsAPI.prototype =
{
_init: function()
{
this._bind_execution();
this._getAPI();
},
_getAPI: function( )
{
//make sure the api file is loaded only once
if((typeof window.google == 'undefined' || typeof window.google.maps == 'undefined') && $.AviaMapsAPI.apiFiles.loading == false)
{
$.AviaMapsAPI.apiFiles.loading = true;
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = $.AviaMapsAPI.apiFiles.src;
if(avia_framework_globals.gmap_api != 'undefined' && avia_framework_globals.gmap_api != "")
{
script.src += "&key=" + avia_framework_globals.gmap_api;
}
document.body.appendChild(script);
}
else if((typeof window.google != 'undefined' && typeof window.google.maps != 'undefined') || $.AviaMapsAPI.apiFiles.loading == false)
//else if($.AviaMapsAPI.apiFiles.finished === true)
{
this._applyMap();
}
},
_bind_execution: function()
{
this.$body.on('av-google-maps-api-loaded', $.proxy( this._applyMap, this) );
},
_applyMap: function()
{
if(typeof this.map != 'undefined') return;
if(!this.$data.marker || !this.$data.marker[0] || !this.$data.marker[0].long || !this.$data.marker[0].long)
{
$.avia_utilities.log('Latitude or Longitude missing', 'map-error');
return;
}
var _self = this,
mobile_drag = $.avia_utilities.isMobile ? this.$data.mobile_drag_control : true,
zoomValue = this.$data.zoom == "auto" ? 10 : this.$data.zoom;
this.mapVars = {
mapMaker: false, //mapmaker tiles are user generated content maps. might hold more info but also be inaccurate
mapTypeControl: false,
backgroundColor:'transparent',
streetViewControl: false,
panControl: this.$data.pan_control,
zoomControl: this.$data.zoom_control,
draggable: mobile_drag,
scrollwheel: false,
zoom: zoomValue,
mapTypeId:google.maps.MapTypeId.ROADMAP,
center: new google.maps.LatLng(this.$data.marker[0].lat, this.$data.marker[0].long),
styles:[{featureType: "poi", elementType: "labels", stylers: [ { visibility: "off" }] }]
};
this.map = new google.maps.Map(this.container, this.mapVars);
this._applyMapStyle();
if(this.$data.zoom == "auto")
{
this._setAutoZoom();
}
google.maps.event.addListenerOnce(this.map, 'tilesloaded', function() {
_self._addMarkers();
});
},
_setAutoZoom: function()
{
var bounds = new google.maps.LatLngBounds();
for (var key in this.$data.marker)
{
bounds.extend( new google.maps.LatLng (this.$data.marker[key].lat , this.$data.marker[key].long) );
}
this.map.fitBounds(bounds);
},
_applyMapStyle: function()
{
var stylers = [], style = [], mapType, style_color = "";
if(this.$data.hue != "") stylers.push({hue: this.$data.hue});
if(this.$data.saturation != "") stylers.push({saturation: this.$data.saturation});
if(stylers.length)
{
style = [{
featureType: "all",
elementType: "all",
stylers: stylers
}, {
featureType: "poi",
stylers: [
{ visibility: "off" }
]
}];
if(this.$data.saturation == "fill")
{
style_color = this.$data.hue || "#242424";
var c = style_color.substring(1); // strip #
var rgb = parseInt(c, 16); // convert rrggbb to decimal
var r = (rgb >> 16) & 0xff; // extract red
var g = (rgb >> 8) & 0xff; // extract green
var b = (rgb >> 0) & 0xff; // extract blue
var luma = 0.2126 * r + 0.7152 * g + 0.0722 * b; // per ITU-R BT.709
var lightness = 1;
var street_light = 2;
if (luma > 60) {
lightness = -1;
street_light = 3;
}
if (luma > 220) {
lightness = -2;
street_light = -2;
}
style = [
{"featureType":"all","elementType":"all","stylers":[{"color":style_color},{"lightness":0}]},
{"featureType":"all","elementType":"labels.text.fill","stylers":[{"color":style_color},{"lightness":(25 * street_light)}]},
{"featureType":"all","elementType":"labels.text.stroke","stylers":[{"visibility":"on"},{"color":style_color},{"lightness":3}]},
{"featureType":"all","elementType":"labels.icon","stylers":[{"visibility":"off"}]},
{"featureType":"administrative","elementType":"geometry.fill","stylers":[{"color":style_color},{"lightness":30}]},
{"featureType":"administrative","elementType":"geometry.stroke","stylers":[{"color":style_color},{"lightness":30},{"weight":1.2}]},
{"featureType":"landscape","elementType":"geometry","stylers":[{visibility: 'simplified'},{"color":style_color},{"lightness":3}]},
{"featureType":"poi","elementType":"geometry","stylers":[{ "visibility": "off" }]},
{"featureType":"road.highway","elementType":"geometry.fill","stylers":[{"color":style_color},{"lightness":-3}]},
{"featureType":"road.highway","elementType":"geometry.stroke","stylers":[{"color":style_color},{"lightness":2},{"weight":0.2}]},
{"featureType":"road.arterial","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-3}]},
{"featureType":"road.local","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-3}]},
{"featureType":"transit","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-3}]},
{"featureType":"water","elementType":"geometry","stylers":[{"color":style_color},{"lightness":-20}]}
];
}
mapType = new google.maps.StyledMapType(style, { name:"av_map_style" });
this.map.mapTypes.set('av_styled_map', mapType);
this.map.setMapTypeId('av_styled_map');
}
},
_addMarkers: function()
{
for (var key in this.$data.marker)
{
var _self = this;
(function(key, _self)
{
setTimeout(function()
{
var marker = "";
if(!_self.$data.marker[key] || !_self.$data.marker[key].long || !_self.$data.marker[key].long)
{
$.avia_utilities.log('Latitude or Longitude for single marker missing', 'map-error');
return;
}
_self.$data.LatLng = new google.maps.LatLng(_self.$data.marker[key].lat, _self.$data.marker[key].long);
var markerArgs = {
flat: false,
position: _self.$data.LatLng,
animation: google.maps.Animation.BOUNCE,
map: _self.map,
title: _self.$data.marker[key].address,
optimized: false
};
//set a custom marker image if available. also set the size and reduce the marker on retina size so its sharp
if(_self.$data.marker[key].icon && _self.$data.marker[key].imagesize)
{
var size = _self.$data.marker[key].imagesize, half = "", full = "";
if(_self.retina && size > 40) size = 40; //retina downsize to at least half the px size
half = new google.maps.Point(size / 2, size ) ; //used to position the marker
full = new google.maps.Size(size , size ) ; //marker size
markerArgs.icon = new google.maps.MarkerImage(_self.$data.marker[key].icon, null, null, half, full);
}
marker = new google.maps.Marker(markerArgs);
setTimeout(function(){ marker.setAnimation(null); _self._infoWindow(_self.map, marker, _self.$data.marker[key]); },500);
},200 * (parseInt(key,10) + 1));
}(key, _self));
}
},
_infoWindow: function(map, marker, data)
{
var info = $.trim(data.content);
if(info != "")
{
var infowindow = new google.maps.InfoWindow({
content: info
});
google.maps.event.addListener(marker, 'click', function() {
infowindow.open(map,marker);
});
if(data.tooltip_display) infowindow.open(map,marker);
}
}
}
//simple wrapper to call the api. makes sure that the api data is not applied twice
$.fn.aviaMaps = function( options )
{
return this.each(function()
{
var self = $.data( this, 'aviaMapsApi' );
if(!self)
{
self = $.data( this, 'aviaMapsApi', new $.AviaMapsAPI( options, this ) );
}
});
}
})( jQuery );
//this function is executed once the api file is loaded
window.aviaOnGoogleMapsLoaded = function(){ $('body').trigger('av-google-maps-api-loaded'); $.AviaMapsAPI.apiFiles.finished = true; };
// -------------------------------------------------------------------------------------------
//
// AVIA VIDEO API - make sure that youtube, vimeo and html 5 use the same interface
//
// requires froogaloop vimeo library and youtube iframe api (yt can be loaded async)
//
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
$.AviaVideoAPI = function(options, video, option_container)
{
// actual video element. either iframe or video
this.$video = $( video );
// container where the AviaVideoAPI object will be stored as data, and that can receive events like play, pause etc
// also the container that allows to overwrite javacript options by adding html data- attributes
this.$option_container = option_container ? $( option_container ) : this.$video;
//mobile device?
this.isMobile = $.avia_utilities.isMobile;
//iamge fallback use
this.fallback = this.isMobile ? this.$option_container.is('.av-mobile-fallback-image') : false;
if(this.fallback) return;
// set up the whole api object
this._init( options );
}
$.AviaVideoAPI.defaults = {
loop: false,
mute: false,
controls: false,
events: 'play pause mute unmute loop toggle reset unload'
};
$.AviaVideoAPI.apiFiles =
{
youtube : {loaded: false, src: 'https://www.youtube.com/iframe_api' }
}
$.AviaVideoAPI.prototype =
{
_init: function( options )
{
// set slider options
this.options = this._setOptions(options);
// info which video service we are using: html5, vimeo or youtube
this.type = this._getPlayerType();
// store the player object to the this.player variable created by one of the APIs (mediaelement, youtube, vimeo)
this._setPlayer();
// set to true once the events are bound so it doesnt happen a second time by accident or racing condition
this.eventsBound = false;
// info if the video is playing
this.playing = false;
//set css class that video is currently not playing
this.$option_container.addClass('av-video-paused');
//play pause indicator
this.pp = $.avia_utilities.playpause(this.$option_container);
},
//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
_setOptions: function(options)
{
var newOptions = $.extend( true, {}, $.AviaVideoAPI.defaults, options ),
htmlData = this.$option_container.data(),
i = "";
//overwritte passed option set with any data properties on the html element
for (i in htmlData)
{
if (htmlData.hasOwnProperty(i) && (typeof htmlData[i] === "string" || typeof htmlData[i] === "number" || typeof htmlData[i] === "boolean"))
{
newOptions[i] = htmlData[i];
}
}
return newOptions;
},
//get the player type
_getPlayerType: function()
{
var vid_src = this.$video.get(0).src || this.$video.data('src');
if(this.$video.is('video')) return 'html5';
if(this.$video.is('.av_youtube_frame')) return 'youtube';
if(vid_src.indexOf('vimeo.com') != -1 ) return 'vimeo';
if(vid_src.indexOf('youtube.com') != -1) return 'youtube';
},
//get the player object
_setPlayer: function()
{
var _self = this;
switch(this.type)
{
case "html5":
this.player = this.$video.data('mediaelementplayer');
this._playerReady();
break;
case "vimeo":
this.player = Froogaloop(this.$video.get(0));
this._playerReady();
break;
case "youtube":
this._getAPI(this.type);
$('body').on('av-youtube-iframe-api-loaded', function(){ _self._playerReady(); });
break;
}
},
_getAPI: function( api )
{
//make sure the api file is loaded only once
if($.AviaVideoAPI.apiFiles[api].loaded === false)
{
$.AviaVideoAPI.apiFiles[api].loaded = true;
//load the file async
var tag = document.createElement('script'),
first = document.getElementsByTagName('script')[0];
tag.src = $.AviaVideoAPI.apiFiles[api].src;
first.parentNode.insertBefore(tag, first);
}
},
//wait for player to be ready, then bind events
_playerReady: function()
{
var _self = this;
this.$option_container.on('av-video-loaded', function(){ _self._bindEvents(); });
switch(this.type)
{
case "html5":
this.$video.on('av-mediajs-loaded', function(){ _self.$option_container.trigger('av-video-loaded'); });
this.$video.on('av-mediajs-ended' , function(){ _self.$option_container.trigger('av-video-ended'); });
break;
case "vimeo":
//finish event must be applied after ready event for firefox
_self.player.addEvent('ready', function(){ _self.$option_container.trigger('av-video-loaded');
_self.player.addEvent('finish', function(){ _self.$option_container.trigger('av-video-ended'); });
});
// vimeo sometimes does not fire. fallback jquery load event should fix this
// currently not used because it causes firefox problems
/*
this.$video.load(function()
{
if(_self.eventsBound == true || typeof _self.eventsBound == 'undefined') return;
_self.$option_container.trigger('av-video-loaded');
$.avia_utilities.log('VIMEO Fallback Trigger');
});
*/
break;
case "youtube":
var params = _self.$video.data();
if(_self._supports_video()) params.html5 = 1;
_self.player = new YT.Player(_self.$video.attr('id'), {
videoId: params.videoid,
height: _self.$video.attr('height'),
width: _self.$video.attr('width'),
playerVars: params,
events: {
'onReady': function(){ _self.$option_container.trigger('av-video-loaded'); },
'onError': function(player){ $.avia_utilities.log('YOUTUBE ERROR:', 'error', player); },
'onStateChange': function(event){
if (event.data === YT.PlayerState.ENDED)
{
var command = _self.options.loop != false ? 'loop' : 'av-video-ended';
_self.$option_container.trigger(command);
}
}
}
});
break;
}
//fallback always trigger after 2 seconds
setTimeout(function()
{
if(_self.eventsBound == true || typeof _self.eventsBound == 'undefined' || _self.type == 'youtube' ) { return; }
$.avia_utilities.log('Fallback Video Trigger "'+_self.type+'":', 'log', _self);
_self.$option_container.trigger('av-video-loaded');
},2000);
},
//bind events we should listen to, to the player
_bindEvents: function()
{
if(this.eventsBound == true || typeof this.eventsBound == 'undefined')
{
return;
}
var _self = this, volume = 'unmute';
this.eventsBound = true;
this.$option_container.on(this.options.events, function(e)
{
_self.api(e.type);
});
if(!_self.isMobile)
{
//set up initial options
if(this.options.mute != false) { volume = "mute"; }
if(this.options.loop != false) { _self.api('loop'); }
_self.api(volume);
}
//set timeout to prevent racing conditions with other scripts
setTimeout(function()
{
_self.$option_container.trigger('av-video-events-bound').addClass('av-video-events-bound');
},50);
},
_supports_video: function() {
return !!document.createElement('video').canPlayType;
},
/************************************************************************
PUBLIC Methods
*************************************************************************/
api: function( action )
{
//commands on mobile can not be executed if the player was not started manually
if(this.isMobile && !this.was_started()) return;
// prevent calling of unbound function
if(this.options.events.indexOf(action) === -1) return;
// broadcast that the command was executed
this.$option_container.trigger('av-video-'+action+'-executed');
// calls the function based on action. eg: _html5_play()
if(typeof this[ '_' + this.type + '_' + action] == 'function')
{
this[ '_' + this.type + '_' + action].call(this);
}
//call generic function eg: _toggle() or _play()
if(typeof this[ '_' + action] == 'function')
{
this[ '_' + action].call(this);
}
},
was_started: function()
{
if(!this.player) return false;
switch(this.type)
{
case "html5":
if(this.player.getCurrentTime() > 0) return true;
break;
case "vimeo":
if(this.player.api('getCurrentTime') > 0) return true;
break;
case "youtube":
if(this.player.getPlayerState() !== -1) return true;
break;
}
return false;
},
/************************************************************************
Generic Methods, are always executed and usually set variables
*************************************************************************/
_play: function()
{
this.playing = true;
this.$option_container.addClass('av-video-playing').removeClass('av-video-paused');
},
_pause: function()
{
this.playing = false;
this.$option_container.removeClass('av-video-playing').addClass('av-video-paused');
},
_loop: function()
{
this.options.loop = true;
},
_toggle: function( )
{
var command = this.playing == true ? 'pause' : 'play';
this.api(command);
this.pp.set(command);
},
/************************************************************************
VIMEO Methods
*************************************************************************/
_vimeo_play: function( )
{
this.player.api('play');
},
_vimeo_pause: function( )
{
this.player.api('pause');
},
_vimeo_mute: function( )
{
this.player.api('setVolume', 0);
},
_vimeo_unmute: function( )
{
this.player.api('setVolume', 0.7);
},
_vimeo_loop: function( )
{
// currently throws error, must be set in iframe
// this.player.api('setLoop', true);
},
_vimeo_reset: function( )
{
this.player.api('seekTo',0);
},
_vimeo_unload: function()
{
this.player.api('unload');
},
/************************************************************************
YOUTUBE Methods
*************************************************************************/
_youtube_play: function( )
{
this.player.playVideo();
},
_youtube_pause: function( )
{
this.player.pauseVideo()
},
_youtube_mute: function( )
{
this.player.mute();
},
_youtube_unmute: function( )
{
this.player.unMute();
},
_youtube_loop: function( )
{
// does not work properly with iframe api. needs to manual loop on "end" event
// this.player.setLoop(true);
if(this.playing == true) this.player.seekTo(0);
},
_youtube_reset: function( )
{
this.player.stopVideo();
},
_youtube_unload: function()
{
this.player.clearVideo();
},
/************************************************************************
HTML5 Methods
*************************************************************************/
_html5_play: function( )
{
//disable stoping of other videos in case the user wants to run section bgs
this.player.options.pauseOtherPlayers = false;
this.player.play();
},
_html5_pause: function( )
{
this.player.pause();
},
_html5_mute: function( )
{
this.player.setMuted(true);
},
_html5_unmute: function( )
{
this.player.setVolume(0.7);
},
_html5_loop: function( )
{
this.player.options.loop = true;
},
_html5_reset: function( )
{
this.player.setCurrentTime(0);
},
_html5_unload: function()
{
this._html5_pause();
this._html5_reset();
}
}
//simple wrapper to call the api. makes sure that the api data is not applied twice
$.fn.aviaVideoApi = function( options , apply_to_parent)
{
return this.each(function()
{
// by default save the object as data to the initial video.
// in the case of slideshows its more benefitial to save it to a parent element (eg: the slide)
var applyTo = this;
if(apply_to_parent)
{
applyTo = $(this).parents(apply_to_parent).get(0);
}
var self = $.data( applyTo, 'aviaVideoApi' );
if(!self)
{
self = $.data( applyTo, 'aviaVideoApi', new $.AviaVideoAPI( options, this, applyTo ) );
}
});
}
})( jQuery );
window.onYouTubeIframeAPIReady = function(){ $('body').trigger('av-youtube-iframe-api-loaded'); };
// -------------------------------------------------------------------------------------------
// Masonry
// -------------------------------------------------------------------------------------------
$.fn.avia_masonry = function(options)
{
//return if we didnt find anything
if(!this.length) return this;
var the_body = $('body'),
the_win = $(window),
isMobile = $.avia_utilities.isMobile,
loading = false,
methods = {
masonry_filter: function()
{
var current = $(this),
linktext = current.html(),
selector = current.data('filter'),
masonry = current.parents('.av-masonry:eq(0)'),
container = masonry.find('.av-masonry-container:eq(0)'),
links = masonry.find('.av-masonry-sort a'),
activeCat = masonry.find('.av-current-sort-title');
links.removeClass('active_sort');
current.addClass('active_sort');
container.attr('id', 'masonry_id_'+selector);
if(activeCat.length) activeCat.html(linktext);
methods.applyMasonry(container, selector, function()
{
container.css({overflow:'visible'});
});
return false;
},
applyMasonry: function(container, selector, callback)
{
var filters = selector ? {filter: '.'+selector} : {};
container.isotope(filters, function()
{
the_win.trigger('av-height-change');
});
if(typeof callback == 'function')
{
setTimeout(callback, 0);
}
},
show_bricks: function(bricks, callback)
{
bricks.each(function(i)
{
var currentLink = $(this),
browserPrefix = $.avia_utilities.supports('transition'),
multiplier = isMobile ? 0 : 100;
setTimeout(function()
{
if(browserPrefix === false)
{
currentLink.css({visibility:"visible", opacity:0}).animate({opacity:1},1500);
}
else
{
currentLink.addClass('av-masonry-item-loaded');
}
if(i == bricks.length - 1 && typeof callback == 'function')
{
callback.call();
the_win.trigger('av-height-change');
}
}, (multiplier * i));
});
},
loadMore: function(e)
{
e.preventDefault();
if(loading) return false;
loading = true;
var current = $(this),
data = current.data(),
masonry = current.parents('.av-masonry:eq(0)'),
container = masonry.find('.av-masonry-container'),
items = masonry.find('.av-masonry-entry'),
loader = $.avia_utilities.loading(),
finished = function(){ loading = false; loader.hide(); the_body.trigger('av_resize_finished'); };
//calculate a new offset
if(!data.offset){ data.offset = 0; }
data.offset += data.items;
data.action = 'avia_ajax_masonry_more';
data.loaded = []; //prevents duplicate entries from beeing loaded when randomized is active
items.each(function(){
var item_id = $(this).data('av-masonry-item');
if(item_id) data.loaded.push( item_id );
});
$.ajax({
url: avia_framework_globals.ajaxurl,
type: "POST",
data:data,
beforeSend: function()
{
loader.show();
},
success: function(response)
{
if(response.indexOf("{av-masonry-loaded}") !== -1)
{
//fetch the response. if any php warnings were displayed before rendering of the items the are removed by the string split
var response = response.split('{av-masonry-loaded}'),
new_items = $(response.pop()).filter('.isotope-item');
//check if we got more items than we need. if not we have reached the end of items
if(new_items.length > data.items)
{
new_items = new_items.not(':last');
}
else
{
current.addClass('av-masonry-no-more-items');
}
var load_container = $('<div class="loadcontainer"></div>').append(new_items);
$.avia_utilities.preload({container: load_container, single_callback: function()
{
var links = masonry.find('.av-masonry-sort a'),
filter_container = masonry.find('.av-sort-by-term'),
allowed_filters = filter_container.data("av-allowed-sort");
console.log(allowed_filters);
filter_container.hide();
loader.hide();
container.isotope( 'insert', new_items);
$.avia_utilities.avia_ajax_call(masonry);
setTimeout( function(){ methods.show_bricks( new_items , finished); },150);
setTimeout(function(){ the_win.trigger('av-height-change'); }, 550);
if(links)
{
$(links).each(function(filterlinkindex)
{
var filterlink = $(this),
sort = filterlink.data('filter');
if(new_items)
{
$(new_items).each(function(itemindex){
var item = $(this);
if(item.hasClass(sort) && allowed_filters.indexOf(sort) !== -1)
{
var term_count = filterlink.find('.avia-term-count').text();
filterlink.find('.avia-term-count').text(' ' + (parseInt(term_count) + 1) + ' ');
if(filterlink.hasClass('avia_hide_sort'))
{
filterlink.removeClass('avia_hide_sort').addClass('avia_show_sort');
masonry.find('.av-masonry-sort .'+sort+'_sep').removeClass('avia_hide_sort').addClass('avia_show_sort');
masonry.find('.av-masonry-sort .av-sort-by-term').removeClass('hidden');
}
}
});
}
});
}
filter_container.fadeIn();
}
});
}
else
{
finished();
}
},
error: finished,
complete: function()
{
}
});
}
};
return this.each(function()
{
var masonry = $(this),
container = masonry.find('.av-masonry-container'),
bricks = masonry.find('.isotope-item'),
filter = masonry.find('.av-masonry-sort').css({visibility:"visible", opacity:0}).on('click', 'a', methods.masonry_filter),
load_more = masonry.find('.av-masonry-load-more').css({visibility:"visible", opacity:0});
$.avia_utilities.preload({container: container, single_callback: function()
{
var start_animation = function()
{
filter.animate({opacity:1}, 400);
//fix for non aligned elements because of scrollbar
if(container.outerHeight() + container.offset().top + $('#footer').outerHeight() > $(window).height())
{
$('html').css({'overflow-y':'scroll'});
}
methods.applyMasonry(container, false, function()
{
masonry.addClass('avia_sortable_active');
container.removeClass('av-js-disabled ');
});
methods.show_bricks(bricks, function()
{
load_more.css({opacity:1}).on('click', methods.loadMore);
});
//container.isotope( 'reLayout' );
};
if(isMobile)
{
start_animation();
}
else
{
masonry.waypoint(start_animation , { offset: '80%'} );
}
// update columnWidth on window resize
$(window).on( 'debouncedresize', function()
{
methods.applyMasonry(container, false, function()
{
masonry.addClass('avia_sortable_active');
});
});
}
});
});
};
// -------------------------------------------------------------------------------------------
// Avia AJAX Portfolio
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
$.avia_utilities = $.avia_utilities || {};
$.fn.avia_portfolio_preview = function(passed_options)
{
var win = $(window),
the_body = $('body'),
isMobile = $.avia_utilities.isMobile,
defaults =
{
open_in: '.portfolio-details-inner',
easing: 'easeOutQuint',
timing: 800,
transition: 'slide' // 'fade' or 'slide'
},
options = $.extend({}, defaults, passed_options);
return this.each(function()
{
var container = $(this),
portfolio_id = container.data('portfolio-id'),
target_wrap = $('.portfolio_preview_container[data-portfolio-id="' + portfolio_id + '"]'),
target_container = target_wrap.find(options.open_in),
items = container.find('.grid-entry'),
content_retrieved = {},
is_open = false,
animating = false,
index_open = false,
ajax_call = false,
methods,
controls,
loader = $.avia_utilities.loading();
methods =
{
load_item: function(e)
{
e.preventDefault();
var link = $(this),
post_container = link.parents('.post-entry:eq(0)'),
post_id = "ID_" + post_container.data('ajax-id'),
clickedIndex = items.index(post_container);
//check if current item is the clicked item or if we are currently animating
if(post_id === is_open || animating == true)
{
return false;
}
animating = true;
container.find('.active_portfolio_item').removeClass('active_portfolio_item');
post_container.addClass('active_portfolio_item');
loader.show();
methods.ajax_get_contents(post_id, clickedIndex);
},
scroll_top: function()
{
setTimeout(function()
{
var target_offset = target_wrap.offset().top - 175,
window_offset = win.scrollTop();
if(window_offset > target_offset || target_offset - window_offset > 100 )
{
$('html:not(:animated),body:not(:animated)').animate({ scrollTop: target_offset }, options.timing, options.easing);
}
},10);
},
attach_item: function(post_id)
{
content_retrieved[post_id] = $(content_retrieved[post_id]).appendTo(target_container);
ajax_call = true;
},
remove_video: function()
{
var del = target_wrap.find('iframe, .avia-video').parents('.ajax_slide:not(.open_slide)');
if(del.length > 0)
{
del.remove();
content_retrieved["ID_" + del.data('slideId')] = undefined;
}
},
show_item: function(post_id, clickedIndex)
{
//check if current item is the clicked item or if we are currently animating
if(post_id === is_open)
{
return false;
}
animating = true;
loader.hide();
if(false === is_open)
{
target_wrap.addClass('open_container');
content_retrieved[post_id].addClass('open_slide');
methods.scroll_top();
target_wrap.css({display:'none'}).slideDown(options.timing, options.easing, function()
{
if(ajax_call)
{
activate_shortcode_scripts(content_retrieved[post_id]);
$.avia_utilities.avia_ajax_call(content_retrieved[post_id]);
the_body.trigger('av_resize_finished');
ajax_call = false;
}
methods.remove_video();
the_body.trigger('av_resize_finished');
});
index_open = clickedIndex;
is_open = post_id;
animating = false;
}
else
{
methods.scroll_top();
var initCSS = { zIndex:3 },
easing = options.easing;
if(index_open > clickedIndex) { initCSS.left = '-110%'; }
if(options.transition === 'fade'){ initCSS.left = '0%'; initCSS.opacity = 0; easing = 'easeOutQuad'; }
//fixate height for container during animation
target_container.height(target_container.height()); //outerHeight = border problems?
content_retrieved[post_id].css(initCSS).avia_animate({'left':"0%", opacity:1}, options.timing, easing);
content_retrieved[is_open].avia_animate({opacity:0}, options.timing, easing, function()
{
content_retrieved[is_open].attr({'style':""}).removeClass('open_slide');
content_retrieved[post_id].addClass('open_slide');
//+ 2 fixes border problem (slides move up and down 2 px on transition)
target_container.avia_animate({height: content_retrieved[post_id].outerHeight() + 2}, options.timing/2, options.easing, function()
{
target_container.attr({'style':""});
is_open = post_id;
index_open = clickedIndex;
animating = false;
methods.remove_video();
if(ajax_call)
{
the_body.trigger('av_resize_finished');
activate_shortcode_scripts(content_retrieved[post_id]);
$.avia_utilities.avia_ajax_call(content_retrieved[post_id]);
ajax_call = false;
}
});
});
}
},
ajax_get_contents: function(post_id, clickedIndex)
{
if(content_retrieved[post_id] !== undefined)
{
methods.show_item(post_id, clickedIndex);
return;
}
content_retrieved[post_id] = $('#avia-tmpl-portfolio-preview-' + post_id.replace(/ID_/,"")).html();
//this line is necessary to prevent w3 total cache from messing up the portfolio if inline js is compressed
content_retrieved[post_id] = content_retrieved[post_id].replace('/*<![CDATA[*/','').replace('*]]>','');
methods.attach_item(post_id);
$.avia_utilities.preload({container: content_retrieved[post_id] , single_callback: function(){ methods.show_item(post_id, clickedIndex); }});
},
add_controls: function()
{
controls = target_wrap.find('.ajax_controlls');
target_wrap.avia_keyboard_controls({27:'.avia_close', 37:'.ajax_previous', 39:'.ajax_next'});
//target_wrap.avia_swipe_trigger({prev:'.ajax_previous', next:'.ajax_next'});
items.each(function(){
var current = $(this), overlay;
current.addClass('no_combo').bind('click', function(event)
{
overlay = current.find('.slideshow_overlay');
if(overlay.length)
{
event.stopPropagation();
methods.load_item.apply(current.find('a:eq(0)'));
return false;
}
});
});
},
control_click: function()
{
var showItem,
activeID = container.find('.active_portfolio_item').data('ajax-id'),
active = container.find('.post-entry-'+activeID);
switch(this.hash)
{
case '#next':
showItem = active.nextAll('.post-entry:visible:eq(0)').find('a:eq(0)');
if(!showItem.length) { showItem = $('.post-entry:visible:eq(0)', container).find('a:eq(0)'); }
showItem.trigger('click');
break;
case '#prev':
showItem = active.prevAll('.post-entry:visible:eq(0)').find('a:eq(0)');
if(!showItem.length) { showItem = $('.post-entry:visible:last', container).find('a:eq(0)'); }
showItem.trigger('click');
break;
case '#close':
animating = true;
target_wrap.slideUp( options.timing, options.easing, function()
{
container.find('.active_portfolio_item').removeClass('active_portfolio_item');
content_retrieved[is_open].attr({'style':""}).removeClass('open_slide');
target_wrap.removeClass('open_container');
animating = is_open = index_open = false;
methods.remove_video();
the_body.trigger('av_resize_finished');
});
break;
}
return false;
},
resize_reset: function()
{
if(is_open === false)
{
target_container.html('');
content_retrieved = [];
}
}
};
methods.add_controls();
container.on("click", "a", methods.load_item);
controls.on("click", "a", methods.control_click);
if(jQuery.support.leadingWhitespace) { win.bind('debouncedresize', methods.resize_reset); }
});
};
}(jQuery));
// -------------------------------------------------------------------------------------------
// Fullscreen Slideshow
//
// extends avia slideshow script with a more sophisticated preloader and fixed size for slider
// -------------------------------------------------------------------------------------------
$.AviaFullscreenSlider = function(options, slider)
{
this.$slider = $( slider );
this.$inner = this.$slider.find('.avia-slideshow-inner');
this.$innerLi = this.$inner.find('>li');
this.$caption = this.$inner.find('.avia-slide-wrap .caption_container');
this.$win = $( window );
this.isMobile = $.avia_utilities.isMobile;
this.property = {};
this.scrollPos = "0";
this.transform3d= document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
this.ticking = false;
if($.avia_utilities.supported.transition === undefined)
{
$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
}
this._init( options );
}
$.AviaFullscreenSlider.defaults = {
//height of the slider in percent
height: 100,
//subtract elements from the height
subtract: '#wpadminbar, #header, #main>.title_container'
};
$.AviaFullscreenSlider.prototype =
{
_init: function( options )
{
var _self = this;
//set the default options
this.options = $.extend( true, {}, $.AviaFullscreenSlider.defaults, options );
if(this.$slider.data('slide_height')) this.options.height = this.$slider.data('slide_height');
//if background attachment is set to fixed or scroll disable the parallax effect
this.options.parallax_enabled = this.$slider.data('image_attachment') == "" ? true : false;
//elements that get subtracted from the image height
this.$subtract = $(this.options.subtract);
// set the slideshow size
this._setSize();
// set resizing script on window resize
this.$win.on( 'debouncedresize', $.proxy( this._setSize, this) );
//parallax scroll if element if leaving viewport
setTimeout(function()
{
if(!_self.isMobile && _self.options.parallax_enabled) //disable parallax scrolling on mobile
{
_self.$win.on( 'scroll', $.proxy( _self._on_scroll, _self) );
}
},100);
/**/
//activate the defaule slider
this.$slider.aviaSlider({bg_slider:true});
},
_on_scroll: function(e)
{
var _self = this;
if(!_self.ticking) {
_self.ticking = true;
window.requestAnimationFrame( $.proxy( _self._parallax_scroll, _self) );
}
},
_fetch_properties: function(slide_height)
{
this.property.offset = this.$slider.offset().top;
this.property.wh = this.$win.height();
this.property.height = slide_height || this.$slider.outerHeight();
//re-position the slider
this._parallax_scroll();
},
_setSize: function( )
{
if(!$.fn.avia_browser_height)
{
var viewport = this.$win.height(),
slide_height = Math.ceil( (viewport / 100) * this.options.height );
if(this.$subtract.length && this.options.height == 100)
{
this.$subtract.each(function()
{
slide_height -= this.offsetHeight - 0.5;
});
}
else
{
slide_height -= 1;
}
this.$slider.height(slide_height).removeClass('av-default-height-applied');
this.$inner.css('padding',0);
}
this._fetch_properties(slide_height);
},
_parallax_scroll: function(e)
{
if(this.isMobile) return; //disable parallax scrolling on mobile
var winTop = this.$win.scrollTop(),
winBottom = winTop + this.property.wh,
scrollPos = "0",
prop = {}, prop2 = {};
if(this.property.offset < winTop && winTop <= this.property.offset + this.property.height)
{
scrollPos = Math.round( (winTop - this.property.offset) * 0.3 );
}
if(this.scrollPos != scrollPos)
{
//slide background parallax
this.scrollPos = scrollPos;
//currently no 3d transform, because of browser quirks
//this.transform3d = false;
if(this.transform3d)
{
prop[$.avia_utilities.supported.transition+"transform"] = "translate3d(0px,"+ scrollPos +"px,0px)";
}
else
{
prop[$.avia_utilities.supported.transition+"transform"] = "translate(0px,"+ scrollPos +"px)";
}
this.$inner.css(prop);
//slider caption parallax
// prop2[$.avia_utilities.supported.transition+"transform"] = "translate(0px,-"+ ( scrollPos * 1) +"px)";
/*
prop2['opacity'] = Math.ceil((this.$slider.height() - (scrollPos * 2)) / 100)/ 10;
prop2['opacity'] = prop2['opacity'] < 0 ? 0 : prop2['opacity'];
this.$caption.css(prop2);
*/
}
this.ticking = false;
}
};
$.fn.aviaFullscreenSlider = function( options )
{
return this.each(function()
{
var active = $.data( this, 'aviaFullscreenSlider' );
if(!active)
{
//make sure that the function doesnt get aplied a second time
$.data( this, 'aviaFullscreenSlider', 1 );
//create the preparations for fullscreen slider
new $.AviaFullscreenSlider( options, this );
}
});
}
// -------------------------------------------------------------------------------------------
// makes sure that the fixed container height is removed once the layerslider is loaded, so it adapts to the screen resolution
// -------------------------------------------------------------------------------------------
$.AviaParallaxElement = function(options, element)
{
this.$el = $( element ).addClass('active-parallax');
this.$win = $( window );
this.$body = $( 'body' );
this.$parent = this.$el.parent();
this.property = {};
this.isMobile = $.avia_utilities.isMobile;
this.ratio = this.$el.data('avia-parallax-ratio') || 0.5;
this.transform = document.documentElement.className.indexOf('avia_transform') !== -1 ? true : false;
this.transform3d= document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
this.ticking = false;
if($.avia_utilities.supported.transition === undefined)
{
$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
}
this._init( options );
}
$.AviaParallaxElement.prototype = {
_init: function( options )
{
var _self = this;
if(_self.isMobile)
{
return; //disable parallax scrolling on mobile
}
//fetch window constants
setTimeout(function()
{
_self._fetch_properties();
},30);
this.$win.on("debouncedresize av-height-change", $.proxy( _self._fetch_properties, _self));
this.$body.on("av_resize_finished", $.proxy( _self._fetch_properties, _self));
//activate the scrolling
setTimeout(function()
{
_self.$win.on( 'scroll', $.proxy( _self._on_scroll, _self) );
},100);
},
_fetch_properties: function()
{
this.property.offset = this.$parent.offset().top;
this.property.wh = this.$win.height();
this.property.height = this.$parent.outerHeight();
//set the height of the element based on the windows height, offset ratio and parent height
this.$el.height(Math.ceil((this.property.wh * this.ratio) + this.property.height));
//re-position the element
this._parallax_scroll();
},
_on_scroll: function(e)
{
var _self = this;
if(!_self.ticking) {
_self.ticking = true;
window.requestAnimationFrame( $.proxy( _self._parallax_scroll, _self) );
}
},
_parallax_scroll: function(e)
{
var winTop = this.$win.scrollTop(),
winBottom = winTop + this.property.wh,
scrollPos = "0",
prop = {};
//shift element when it moves into viewport
if(this.property.offset < winBottom && winTop <= this.property.offset + this.property.height)
{
scrollPos = Math.ceil( (winBottom - this.property.offset) * this.ratio );
//parallax movement via backround position change, although
if(this.transform3d)
{
prop[$.avia_utilities.supported.transition+"transform"] = "translate3d(0px,"+ scrollPos +"px, 0px)";
}
else if(this.transform)
{
prop[$.avia_utilities.supported.transition+"transform"] = "translate(0px,"+ scrollPos +"px)";
}
else
{
prop["background-position"] = "0px "+ scrollPos +"px";
}
this.$el.css(prop);
}
this.ticking = false;
}
};
$.fn.avia_parallax = function(options)
{
return this.each(function()
{
var self = $.data( this, 'aviaParallax' );
if(!self)
{
self = $.data( this, 'aviaParallax', new $.AviaParallaxElement( options, this ) );
}
});
}
// -------------------------------------------------------------------------------------------
// Helper to allow fixed bgs on mobile
// -------------------------------------------------------------------------------------------
$.fn.avia_mobile_fixed = function(options)
{
var isMobile = $.avia_utilities.isMobile;
if(!isMobile) return;
return this.each(function()
{
var current = $(this).addClass('av-parallax-section'),
$background = current.attr('style'),
$attachment_class = current.data('section-bg-repeat'),
template = "";
if($attachment_class == 'stretch' || $attachment_class == 'no-repeat' )
{
$attachment_class = " avia-full-stretch";
}
else
{
$attachment_class = "";
}
template = "<div class='av-parallax " + $attachment_class + "' data-avia-parallax-ratio='0.0' style = '" + $background + "' ></div>";
current.prepend(template);
current.attr('style','');
});
}
// -------------------------------------------------------------------------------------------
// makes sure that the fixed container height is removed once the layerslider is loaded, so it adapts to the screen resolution
// -------------------------------------------------------------------------------------------
$.fn.layer_slider_height_helper = function(options)
{
return this.each(function()
{
var container = $(this),
first_div = container.find('>div:first'),
timeout = false,
counter = 0,
reset_size = function()
{
if(first_div.height() > 0 || counter > 5)
{
container.height('auto');
}
else
{
timeout = setTimeout(reset_size, 500);
counter++;
}
};
if(!first_div.length) return;
timeout = setTimeout(reset_size, 0);
});
}
// -------------------------------------------------------------------------------------------
// testimonial shortcode javascript
// -------------------------------------------------------------------------------------------
$.fn.avia_sc_testimonial = function(options)
{
return this.each(function()
{
var container = $(this), elements = container.find('.avia-testimonial');
//trigger displaying of thumbnails
container.on('avia_start_animation', function()
{
elements.each(function(i)
{
var element = $(this);
setTimeout(function(){ element.addClass('avia_start_animation') }, (i * 150));
});
});
});
}
// -------------------------------------------------------------------------------------------
// Progress bar shortcode javascript
// -------------------------------------------------------------------------------------------
$.fn.avia_sc_progressbar = function(options)
{
return this.each(function()
{
var container = $(this), elements = container.find('.progress');
//trigger displaying of thumbnails
container.on('avia_start_animation', function()
{
elements.each(function(i)
{
var element = $(this);
setTimeout(function(){ element.addClass('avia_start_animation') }, (i * 250));
});
});
});
}
// -------------------------------------------------------------------------------------------
// Iconlist shortcode javascript
// -------------------------------------------------------------------------------------------
$.fn.avia_sc_iconlist = function(options)
{
return this.each(function()
{
var iconlist = $(this), elements = iconlist.find('>li');
//trigger displaying of thumbnails
iconlist.on('avia_start_animation', function()
{
elements.each(function(i)
{
var element = $(this);
setTimeout(function(){ element.addClass('avia_start_animation') }, (i * 350));
});
});
});
}
// -------------------------------------------------------------------------------------------
// shortcode javascript for delayed animation even when non connected elements are used
// -------------------------------------------------------------------------------------------
$.fn.avia_sc_animation_delayed = function(options)
{
var global_timer = 0,
delay = options.delay || 50;
return this.each(function()
{
var elements = $(this);
//trigger displaying of thumbnails
elements.on('avia_start_animation', function()
{
var element = $(this);
global_timer ++;
setTimeout(function(){ element.addClass('avia_start_delayed_animation'); global_timer --; }, (global_timer * delay));
});
});
}
// -------------------------------------------------------------------------------------------
// Section Height Helper
// -------------------------------------------------------------------------------------------
$.fn.avia_browser_height = function()
{
if(!this.length) return;
var win = $(window),
html_el = $('html'),
subtract = $('#wpadminbar, #header.av_header_top:not(.html_header_transparency #header), #main>.title_container'),
css_block = $("<style type='text/css' id='av-browser-height'></style>").appendTo('head:first'),
sidebar_menu= $('.html_header_sidebar #top #header_main'),
full_slider = $('.html_header_sidebar .avia-fullscreen-slider.avia-builder-el-0.avia-builder-el-no-sibling').addClass('av-solo-full'),
calc_height = function()
{
var css = "",
wh100 = win.height(),
ww100 = win.width(),
wh100_mod = wh100,
whCover = (wh100 / 9) * 16,
wwCover = (ww100 / 16) * 9,
wh75 = Math.round( wh100 * 0.75 ),
wh50 = Math.round( wh100 * 0.5 ),
wh25 = Math.round( wh100 * 0.25 ),
solo = 0;
if(sidebar_menu.length) solo = sidebar_menu.height();
subtract.each(function(){ wh100_mod -= this.offsetHeight - 1; });
var whCoverMod = (wh100_mod / 9) * 16;
//fade in of section content with minimum height once the height has been calculated
css += ".avia-section.av-minimum-height .container{opacity: 1; }\n";
//various section heights (100-25% as well as 100% - header/adminbar in case its the first builder element)
css += ".av-minimum-height-100 .container, .avia-fullscreen-slider .avia-slideshow, #top.avia-blank .av-minimum-height-100 .container{height:"+wh100+"px;}\n";
css += ".av-minimum-height-75 .container {height:"+wh75+"px;}\n";
css += ".av-minimum-height-50 .container {height:"+wh50+"px;}\n";
css += ".av-minimum-height-25 .container {height:"+wh25+"px;}\n";
css += ".avia-builder-el-0.av-minimum-height-100 .container, .avia-builder-el-0.avia-fullscreen-slider .avia-slideshow{height:"+wh100_mod+"px;}\n";
css += "#top .av-solo-full .avia-slideshow {min-height:"+solo+"px;}\n";
//fullscreen video calculations
if(ww100/wh100 < 16/9)
{
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";
}
else
{
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";
}
if(ww100/wh100_mod < 16/9)
{
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";
}
else
{
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";
}
//ie8 needs different insert method
try{
css_block.text(css);
}
catch(err){
css_block.remove();
css_block = $("<style type='text/css' id='av-browser-height'>"+css+"</style>").appendTo('head:first');
}
setTimeout(function(){ win.trigger('av-height-change'); /*broadcast the height change*/ },100);
};
win.on( 'debouncedresize', calc_height);
calc_height();
}
// -------------------------------------------------------------------------------------------
// Video Section helper
// -------------------------------------------------------------------------------------------
$.fn.avia_video_section = function()
{
if(!this.length) return;
var elements = this.length, content = "",
win = $(window),
css_block = $("<style type='text/css' id='av-section-height'></style>").appendTo('head:first'),
calc_height = function(section, counter)
{
if(counter === 0) { content = "";}
var css = "",
the_id = '#' +section.attr('id'),
wh100 = section.height(),
ww100 = section.width(),
aspect = section.data('sectionVideoRatio').split(':'),
video_w = aspect[0],
video_h = aspect[1],
whCover = (wh100 / video_h ) * video_w,
wwCover = (ww100 / video_w ) * video_h;
//fullscreen video calculations
if(ww100/wh100 < video_w/video_h)
{
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";
}
else
{
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";
}
content = content + css;
if(elements == counter + 1)
{
//ie8 needs different insert method
try{
css_block.text(content);
}
catch(err){
css_block.remove();
css_block = $("<style type='text/css' id='av-section-height'>"+content+"</style>").appendTo('head:first');
}
}
};
return this.each(function(i)
{
var self = $(this);
win.on( 'debouncedresize', function(){ calc_height(self, i); });
calc_height(self, i);
});
}
// -------------------------------------------------------------------------------------------
// Gallery shortcode javascript
// -------------------------------------------------------------------------------------------
$.fn.avia_sc_gallery = function(options)
{
return this.each(function()
{
var gallery = $(this), images = gallery.find('img'), big_prev = gallery.find('.avia-gallery-big');
//trigger displaying of thumbnails
gallery.on('avia_start_animation', function()
{
images.each(function(i)
{
var image = $(this);
setTimeout(function(){ image.addClass('avia_start_animation') }, (i * 110));
});
});
if(gallery.hasClass('deactivate_avia_lazyload')) gallery.trigger('avia_start_animation');
//trigger thumbnail hover and big prev image change
if(big_prev.length)
{
gallery.on('mouseenter','.avia-gallery-thumb a', function()
{
var _self = this;
big_prev.attr('data-onclick', _self.getAttribute("data-onclick"));
big_prev.height(big_prev.height());
big_prev.attr('href', _self.href)
var newImg = _self.getAttribute("data-prev-img"),
oldImg = big_prev.find('img'),
oldImgSrc = oldImg.attr('src');
if(newImg != oldImgSrc)
{
var next_img = new Image();
next_img.src = newImg;
var $next = $(next_img);
if(big_prev.hasClass('avia-gallery-big-no-crop-thumb'))
{
$next.css({'height':big_prev.height(),'width':'auto'});
}
big_prev.stop().animate({opacity:0}, function()
{
$next.insertAfter(oldImg);
oldImg.remove();
big_prev.animate({opacity:1});
big_prev.attr('title',$(_self).attr('title'));
});
}
});
big_prev.on('click', function()
{
var imagelink = gallery.find('.avia-gallery-thumb a').eq(this.getAttribute("data-onclick") - 1);
if(imagelink && !imagelink.hasClass('aviaopeninbrowser'))
{
imagelink.trigger('click');
}
else if(imagelink)
{
var imgurl = imagelink.attr("href");
if(imagelink.hasClass('aviablank') && imgurl != '' )
{
window.open(imgurl, '_blank');
}
else if( imgurl != '' )
{
window.open(imgurl, '_self');
}
}
return false;
});
$(window).on("debouncedresize", function()
{
big_prev.height('auto');
});
}
});
}
// -------------------------------------------------------------------------------------------
// Toggle shortcode javascript
// -------------------------------------------------------------------------------------------
$.fn.avia_sc_toggle = function(options)
{
var defaults =
{
single: '.single_toggle',
heading: '.toggler',
content: '.toggle_wrap',
sortContainer:'.taglist'
};
var win = $(window),
options = $.extend(defaults, options);
return this.each(function()
{
var container = $(this).addClass('enable_toggles'),
toggles = $(options.single, container),
heading = $(options.heading, container),
allContent = $(options.content, container),
sortLinks = $(options.sortContainer + " a", container);
heading.each(function(i)
{
var thisheading = $(this), content = thisheading.next(options.content, container);
function scroll_to_viewport()
{
//check if toggle title is in viewport. if not scroll up
var el_offset = content.offset().top,
scoll_target = el_offset - 50 - parseInt($('html').css('margin-top'),10);
if(win.scrollTop() > el_offset)
{
$('html:not(:animated),body:not(:animated)').animate({scrollTop: scoll_target},200);
}
}
if(content.css('visibility') != "hidden")
{
thisheading.addClass('activeTitle');
}
thisheading.on('click', function()
{
if(content.css('visibility') != "hidden")
{
content.slideUp(200, function()
{
content.removeClass('active_tc').attr({style:''});
win.trigger('av-height-change');
});
thisheading.removeClass('activeTitle');
}
else
{
if(container.is('.toggle_close_all'))
{
allContent.not(content).slideUp(200, function()
{
$(this).removeClass('active_tc').attr({style:''});
scroll_to_viewport();
});
heading.removeClass('activeTitle');
}
content.addClass('active_tc').slideDown(200,
function()
{
if(!container.is('.toggle_close_all'))
{
scroll_to_viewport();
}
win.trigger('av-height-change');
}
);
thisheading.addClass('activeTitle');
location.replace(thisheading.data('fake-id'));
}
});
});
sortLinks.click(function(e){
e.preventDefault();
var show = toggles.filter('[data-tags~="'+$(this).data('tag')+'"]'),
hide = toggles.not('[data-tags~="'+$(this).data('tag')+'"]');
sortLinks.removeClass('activeFilter');
$(this).addClass('activeFilter');
heading.filter('.activeTitle').trigger('click');
show.slideDown();
hide.slideUp();
});
function trigger_default_open(hash)
{
if(!hash && window.location.hash) hash = window.location.hash;
if(!hash) return;
var open = heading.filter('[data-fake-id="'+hash+'"]');
if(open.length)
{
if(!open.is('.activeTitle')) open.trigger('click');
window.scrollTo(0, container.offset().top - 70);
}
}
trigger_default_open(false);
$('a').on('click',function(){
var hash = $(this).attr('href');
if(typeof hash != "undefined" && hash)
{
hash = hash.replace(/^.*?#/,'');
trigger_default_open('#'+hash);
}
});
});
};
// -------------------------------------------------------------------------------------------
// Tab Shortcode
// -------------------------------------------------------------------------------------------
$.fn.avia_sc_tabs= function(options)
{
var defaults =
{
heading: '.tab',
content:'.tab_content',
active:'active_tab',
sidebar: false
};
var win = $(window)
options = $.extend(defaults, options);
return this.each(function()
{
var container = $(this),
tab_titles = $('<div class="tab_titles"></div>').prependTo(container),
tabs = $(options.heading, container),
content = $(options.content, container),
newtabs = false,
oldtabs = false;
newtabs = tabs.clone();
oldtabs = tabs.addClass('fullsize-tab');
tabs = newtabs;
tabs.prependTo(tab_titles).each(function(i)
{
var tab = $(this), the_oldtab = false;
if(newtabs) the_oldtab = oldtabs.filter(':eq('+i+')');
tab.addClass('tab_counter_'+i).bind('click', function()
{
open_content(tab, i, the_oldtab);
return false;
});
if(newtabs)
{
the_oldtab.bind('click', function()
{
open_content(the_oldtab, i, tab);
return false;
});
}
});
set_size();
trigger_default_open(false);
win.on("debouncedresize", set_size);
$('a').on('click',function(){
var hash = $(this).attr('href');
if(typeof hash != "undefined" && hash)
{
hash = hash.replace(/^.*?#/,'');
trigger_default_open('#'+hash);
}
});
function set_size()
{
if(!options.sidebar) return;
content.css({'min-height': tab_titles.outerHeight() + 1});
}
function open_content(tab, i, alternate_tab)
{
if(!tab.is('.'+options.active))
{
$('.'+options.active, container).removeClass(options.active);
$('.'+options.active+'_content', container).removeClass(options.active+'_content');
tab.addClass(options.active);
var new_loc = tab.data('fake-id');
if(typeof new_loc == 'string') location.replace(new_loc);
if(alternate_tab) alternate_tab.addClass(options.active);
var active_c = content.filter(':eq('+i+')').addClass(options.active+'_content');
if(typeof click_container != 'undefined' && click_container.length)
{
sidebar_shadow.height(active_c.outerHeight());
}
//check if tab title is in viewport. if not scroll up
var el_offset = active_c.offset().top,
scoll_target = el_offset - 50 - parseInt($('html').css('margin-top'),10);
if(win.scrollTop() > el_offset)
{
$('html:not(:animated),body:not(:animated)').scrollTop(scoll_target);
}
}
}
function trigger_default_open(hash)
{
if(!hash && window.location.hash) hash = window.location.hash;
if(!hash) return;
var open = tabs.filter('[data-fake-id="'+hash+'"]');
if(open.length)
{
if(!open.is('.active_tab')) open.trigger('click');
window.scrollTo(0, container.offset().top - 70);
}
}
});
};
// -------------------------------------------------------------------------------------------
// Big Number animation shortcode javascript
// -------------------------------------------------------------------------------------------
(function($)
{
$.fn.avia_sc_animated_number = function(options)
{
var skipStep = false,
start_count = function(element, countTo, increment, current, fakeCountTo)
{
//calculate the new number
var newCount = current + increment;
//if the number is bigger than our final number set the number and finish
if(newCount >= fakeCountTo)
{
element.text(countTo); //exit
}
else
{
var prepend = "", addZeros = countTo.toString().length - newCount.toString().length
//if the number has less digits than the final number some zeros where omitted. add them to the front
for(var i = addZeros; i > 0; i--){ prepend += "0"; }
element.text(prepend + newCount);
window.requestAnimationFrame(function(){ start_count(element, countTo, increment, newCount, fakeCountTo) });
}
};
return this.each(function()
{
var number_container = $(this), elements = number_container.find('.avia-single-number'), countTimer = number_container.data('timer') || 3000;
//prepare elements
elements.each(function(i)
{
var element = $(this), text = element.text();
if(window.addEventListener) element.text( text.replace(/./g, "0")); /*https://github.com/AviaThemes/wp-themes/issues/812*/
});
//trigger number animation
number_container.addClass('number_prepared').on('avia_start_animation', function()
{
if(number_container.is('.avia_animation_done')) return;
number_container.addClass('avia_animation_done');
elements.each(function(i)
{
var element = $(this), countTo = element.data('number'), fakeCountTo = countTo, current = parseInt(element.text(),10), zeroOnly = /^0+$/.test(countTo), increment = 0;
//fallback for decimals like 00 or 000
if(zeroOnly && countTo !== 0) fakeCountTo = countTo.replace(/0/g, '9');
increment = Math.round( fakeCountTo * 32 / countTimer);
if(increment == 0 || increment % 10 == 0) increment += 1;
setTimeout(function(){ start_count(element, countTo, increment, current, fakeCountTo);}, 300);
});
});
});
}
})(jQuery);
// -------------------------------------------------------------------------------------------
// contact form ajax
// -------------------------------------------------------------------------------------------
(function($)
{
$.fn.avia_ajax_form = function(variables)
{
var defaults =
{
sendPath: 'send.php',
responseContainer: '.ajaxresponse'
};
var options = $.extend(defaults, variables);
return this.each(function()
{
var form = $(this),
form_sent = false,
send =
{
formElements: form.find('textarea, select, input[type=text], input[type=checkbox], input[type=hidden]'),
validationError:false,
button : form.find('input:submit'),
dataObj : {}
},
responseContainer = form.next(options.responseContainer+":eq(0)");
send.button.bind('click', checkElements);
//change type of email forms on mobile so the e-mail keyboard with @ sign is used
if($.avia_utilities.isMobile)
{
send.formElements.each(function(i)
{
var currentElement = $(this), is_email = currentElement.hasClass('is_email');
if(is_email) currentElement.attr('type','email');
});
}
function checkElements( e )
{
// reset validation var and send data
send.validationError = false;
send.datastring = 'ajax=true';
send.formElements.each(function(i)
{
var currentElement = $(this),
surroundingElement = currentElement.parent(),
value = currentElement.val(),
name = currentElement.attr('name'),
classes = currentElement.attr('class'),
nomatch = true;
if(currentElement.is(':checkbox'))
{
if(currentElement.is(':checked')) { value = true } else {value = ''}
}
send.dataObj[name] = encodeURIComponent(value);
if(classes && classes.match(/is_empty/))
{
if(value == '' || value == null)
{
surroundingElement.removeClass("valid error ajax_alert").addClass("error");
send.validationError = true;
}
else
{
surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
}
nomatch = false;
}
if(classes && classes.match(/is_email/))
{
if(!value.match(/^[\w|\.|\-]+@\w[\w|\.|\-]*\.[a-zA-Z]{2,20}$/))
{
surroundingElement.removeClass("valid error ajax_alert").addClass("error");
send.validationError = true;
}
else
{
surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
}
nomatch = false;
}
if(classes && classes.match(/is_phone/))
{
if(!value.match(/^(\d|\s|\-|\/|\(|\)|\[|\]|e|x|t|ension|\.|\+|\_|\,|\:|\;){3,}$/))
{
surroundingElement.removeClass("valid error ajax_alert").addClass("error");
send.validationError = true;
}
else
{
surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
}
nomatch = false;
}
if(classes && classes.match(/is_number/))
{
if(!($.isNumeric(value)) || value == "")
{
surroundingElement.removeClass("valid error ajax_alert").addClass("error");
send.validationError = true;
}
else
{
surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
}
nomatch = false;
}
if(classes && classes.match(/captcha/))
{
var verifier = form.find("#" + name + "_verifier").val(),
lastVer = verifier.charAt(verifier.length-1),
finalVer = verifier.charAt(lastVer);
if(value != finalVer)
{
surroundingElement.removeClass("valid error ajax_alert").addClass("error");
send.validationError = true;
}
else
{
surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
}
nomatch = false;
}
if(nomatch && value != '')
{
surroundingElement.removeClass("valid error ajax_alert").addClass("valid");
}
});
if(send.validationError == false)
{
if(form.data('av-custom-send'))
{
mailchimp_send();
}
else
{
send_ajax_form();
}
}
return false;
}
function send_ajax_form()
{
if(form_sent){ return false; }
form_sent = true;
send.button.addClass('av-sending-button');
send.button.val(send.button.data('sending-label'));
var redirect_to = form.data('avia-redirect') || false,
action = form.attr('action');
responseContainer.load(action+' '+options.responseContainer, send.dataObj, function()
{
if(redirect_to && action != redirect_to)
{
form.attr('action', redirect_to);
location.href = redirect_to;
// form.submit();
}
else
{
responseContainer.removeClass('hidden').css({display:"block"});
form.slideUp(400, function(){responseContainer.slideDown(400, function(){ $('body').trigger('av_resize_finished'); }); send.formElements.val('');});
}
});
}
function mailchimp_send()
{
if(form_sent){ return false; }
form_sent = true;
var original_label = send.button.val();
send.button.addClass('av-sending-button');
send.button.val(send.button.data('sending-label'));
send.dataObj.ajax_mailchimp = true;
var redirect_to = form.data('avia-redirect') || false,
action = form.attr('action'),
error_msg_container = form.find('.av-form-error-container'),
form_id = form.data('avia-form-id');
$.ajax({
url: action,
type: "POST",
data:send.dataObj,
beforeSend: function()
{
if(error_msg_container.length)
{
error_msg_container.slideUp(400, function()
{
error_msg_container.remove();
$('body').trigger('av_resize_finished');
});
}
},
success: function(responseText)
{
var response = jQuery("<div>").append(jQuery.parseHTML(responseText)),
error = response.find('.av-form-error-container');
if(error.length)
{
form_sent = false;
form.prepend(error);
error.css({display:"none"}).slideDown(400, function()
{
$('body').trigger('av_resize_finished');
});
send.button.removeClass('av-sending-button');
send.button.val(original_label);
}
else
{
if(redirect_to && action != redirect_to)
{
form.attr('action', redirect_to);
location.href = redirect_to;
// form.submit();
}
else
{
var success_text = response.find(options.responseContainer + "_" + form_id);
responseContainer.html(success_text).removeClass('hidden').css({display:"block"});
form.slideUp(400, function()
{
responseContainer.slideDown(400, function()
{
$('body').trigger('av_resize_finished');
});
send.formElements.val('');
});
}
}
},
error: function()
{
},
complete: function()
{
}
});
}
});
};
})(jQuery);
// -------------------------------------------------------------------------------------------
// Aviaccordion Slideshow
//
// accordion slider script
// -------------------------------------------------------------------------------------------
$.AviaccordionSlider = function(options, slider)
{
this.$slider = $( slider );
this.$inner = this.$slider.find('.aviaccordion-inner');
this.$slides = this.$inner.find('.aviaccordion-slide');
this.$images = this.$inner.find('.aviaccordion-image');
this.$last = this.$slides.filter(':last');
this.$titles = this.$slider.find('.aviaccordion-preview');
this.$titlePos = this.$slider.find('.aviaccordion-preview-title-pos');
this.$titleWrap = this.$slider.find('.aviaccordion-preview-title-wrap');
this.$win = $( window );
if($.avia_utilities.supported.transition === undefined)
{
$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
}
this.browserPrefix = $.avia_utilities.supported.transition;
this.cssActive = this.browserPrefix !== false ? true : false;
this.transform3d = document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
this.isMobile = $.avia_utilities.isMobile;
this.property = this.browserPrefix + 'transform',
this.count = this.$slides.length;
this.open = false;
this.autoplay = false;
this.increaseTitle = this.$slider.is(".aviaccordion-title-on-hover");
// this.cssActive = false; //testing no css3 browser
this._init( options );
}
$.AviaccordionSlider.prototype =
{
_init: function( options )
{
var _self = this;
_self.options = $.extend({}, options, this.$slider.data());
$.avia_utilities.preload({container: this.$slider , single_callback: function(){ _self._kickOff(); }});
},
_kickOff: function()
{
var _self = this;
_self._calcMovement();
_self._bindEvents();
_self._showImages();
_self._autoplay();
},
_autoplay: function()
{
var _self = this;
if(_self.options.autoplay)
{
_self.autoplay = setInterval(function()
{
_self.open = _self.open === false ? 0 : _self.open + 1;
if(_self.open >= _self.count) _self.open = 0;
_self._move({}, _self.open);
}, _self.options.interval * 1000)
}
},
_showImages: function()
{
var _self = this, counter = 0, delay = 300, title_delay = this.count * delay;
if(this.cssActive)
{
setTimeout(function(){ _self.$slider.addClass('av-animation-active'); } , 10);
}
this.$images.each(function(i)
{
var current = $(this), timer = delay * (i + 1);
setTimeout(function()
{
current.avia_animate({opacity:1}, 400, function()
{
current.css($.avia_utilities.supported.transition + "transform", "none");
});
},timer);
});
if(_self.increaseTitle) title_delay = 0;
this.$titlePos.each(function(i)
{
var current = $(this), new_timer = title_delay + 100 * (i + 1);
setTimeout(function()
{
current.avia_animate({opacity:1}, 200, function()
{
current.css($.avia_utilities.supported.transition + "transform", "none");
});
},new_timer);
});
},
_bindEvents: function()
{
var trigger = this.isMobile ? "click" : "mouseenter";
this.$slider.on(trigger,'.aviaccordion-slide', $.proxy( this._move, this));
this.$slider.on('mouseleave','.aviaccordion-inner', $.proxy( this._move, this));
this.$win.on('debouncedresize', $.proxy( this._calcMovement, this));
this.$slider.on('av-prev av-next', $.proxy( this._moveTo, this));
if(this.isMobile)
{
this.$slider.avia_swipe_trigger({next: this.$slider, prev: this.$slider, event:{prev: 'av-prev', next: 'av-next'}});
}
},
_titleHeight: function()
{
var th = 0;
this.$titleWrap.css({'height':'auto'}).each(function()
{
var new_h = $(this).outerHeight();
if( new_h > th) th = new_h;
}).css({'height':th + 2});
},
_calcMovement: function(event, allow_repeat)
{
var _self = this,
containerWidth = this.$slider.width(),
defaultPos = this.$last.data('av-left'),
imgWidth = this.$images.filter(':last').width() || containerWidth,
imgWidthPercent = Math.floor((100 / containerWidth) * imgWidth),
allImageWidth = imgWidthPercent * _self.count,
modifier = 3, // 10 - _self.count,
tempMinLeft = 100 - imgWidthPercent,
minLeft = tempMinLeft > defaultPos / modifier ? tempMinLeft : 0,
oneLeft = minLeft / (_self.count -1 ),
titleWidth = imgWidth;
if(allImageWidth < 110 && allow_repeat !== false)
{
//set height if necessary
var slideHeight = this.$slider.height(),
maxHeight = (slideHeight / allImageWidth) * 110 ;
this.$slider.css({'max-height': maxHeight});
_self._calcMovement(event, false);
return;
}
//backup so the minimized slides dont get too small
if(oneLeft < 2) minLeft = 0;
this.$slides.each(function(i)
{
var current = $(this), newLeft = 0, newRight = 0, defaultLeft = current.data('av-left');
if( minLeft !== 0)
{
newLeft = oneLeft * i;
newRight = imgWidthPercent + newLeft - oneLeft;
}
else
{
newLeft = defaultLeft / Math.abs(modifier);
newRight = 100 - ((newLeft / i) * (_self.count - i));
}
if(i == 1 && _self.increaseTitle) { titleWidth = newRight + 1; }
if(_self.cssActive)
{
//if we are not animating based on the css left value but on css transform we need to subtract the left value
newLeft = newLeft - defaultLeft;
newRight = newRight - defaultLeft;
defaultLeft = 0;
}
current.data('av-calc-default', defaultLeft);
current.data('av-calc-left', newLeft);
current.data('av-calc-right', newRight);
});
if(_self.increaseTitle) { _self.$titles.css({width: titleWidth + "%"});}
},
_moveTo: function(event)
{
var direction = event.type == "av-next" ? 1 : -1,
nextSlide = this.open === false ? 0 : this.open + direction;
if(nextSlide >= 0 && nextSlide < this.$slides.length) this._move(event, nextSlide);
},
_move: function(event, direct_open)
{
var _self = this,
slide = event.currentTarget,
itemNo = typeof direct_open != "undefined" ? direct_open : this.$slides.index(slide);
this.open = itemNo;
if(_self.autoplay && typeof slide != "undefined") { clearInterval(_self.autoplay); _self.autoplay = false; }
this.$slides.removeClass('aviaccordion-active-slide').each(function(i)
{
var current = $(this),
dataSet = current.data(),
trans_val = i <= itemNo ? dataSet.avCalcLeft : dataSet.avCalcRight,
transition = {},
reset = event.type == 'mouseleave' ? 1 : 0,
active = itemNo === i ? _self.$titleWrap.eq(i) : false;
if(active) current.addClass('aviaccordion-active-slide');
if(reset)
{
trans_val = dataSet.avCalcDefault;
this.open = false;
}
if(_self.cssActive) //do a css3 animation
{
//move the slides
transition[_self.property] = _self.transform3d ? "translate3d(" + trans_val + "%, 0, 0)" : "translate(" + trans_val + "%,0)"; //3d or 2d transform?
current.css(transition);
}
else
{
transition.left = trans_val + "%";
current.stop().animate(transition, 700, 'easeOutQuint');
}
});
}
};
$.fn.aviaccordion = function( options )
{
return this.each(function()
{
var active = $.data( this, 'AviaccordionSlider' );
if(!active)
{
//make sure that the function doesnt get aplied a second time
$.data( this, 'AviaccordionSlider', 1 );
//create the preparations for fullscreen slider
new $.AviaccordionSlider( options, this );
}
});
}
// -------------------------------------------------------------------------------------------
// Aviaccordion Slideshow
//
// accordion slider script
// -------------------------------------------------------------------------------------------
$.AviaTextRotator = function(options, slider)
{
this.$win = $( window );
this.$slider = $( slider );
this.$inner = this.$slider.find('.av-rotator-text');
this.$slides = this.$inner.find('.av-rotator-text-single');
this.$current = this.$slides.eq(0);
this.open = 0;
this.count = this.$slides.length;
if($.avia_utilities.supported.transition === undefined)
{
$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
}
this.browserPrefix = $.avia_utilities.supported.transition;
this.cssActive = this.browserPrefix !== false ? true : false;
this.property = this.browserPrefix + 'transform',
//this.cssActive = false; //testing no css3 browser
this._init( options );
}
$.AviaTextRotator.prototype =
{
_init: function( options )
{
var _self = this;
if(this.count <= 1) return;
_self.options = $.extend({}, options, this.$slider.data());
_self.$inner.addClass('av-rotation-active');
if(_self.options.fixwidth == 1) this.$inner.width(this.$current.width());
_self._autoplay();
},
_autoplay: function()
{
var _self = this;
_self.autoplay = setInterval(function()
{
_self.open = _self.open === false ? 0 : _self.open + 1;
if(_self.open >= _self.count) _self.open = 0;
_self._move({}, _self.open);
}, _self.options.interval * 1000)
},
_move: function(event)
{
var _self = this,
modifier = 30 * _self.options.animation,
fade_out = {opacity:0},
fade_start = {display:'inline-block', opacity:0},
fade_in = {opacity:1};
this.$next = _self.$slides.eq(this.open);
if(this.cssActive)
{
fade_out[_self.property] = "translate(0px," + modifier +"px)";
fade_start[_self.property] = "translate(0px," + (modifier * -1) +"px)";
fade_in[_self.property] = "translate(0px,0px)";
}
else
{
fade_out['top'] = modifier;
fade_start['top'] = (modifier * -1);
fade_in['top'] = 0;
}
_self.$current.avia_animate(fade_out, function()
{
_self.$current.css({display:'none'});
_self.$next.css(fade_start).avia_animate(fade_in, function()
{
_self.$current = _self.$slides.eq(_self.open);
});
});
}
};
$.fn.avia_textrotator = function( options )
{
return this.each(function()
{
var active = $.data( this, 'AviaTextRotator' );
if(!active)
{
//make sure that the function doesnt get aplied a second time
$.data( this, 'AviaTextRotator', 1 );
//create the preparations for fullscreen slider
new $.AviaTextRotator( options, this );
}
});
}
// -------------------------------------------------------------------------------------------
// HELPER FUNCTIONS
// -------------------------------------------------------------------------------------------
//waipoint script when something comes into viewport
$.fn.avia_waypoints = function(options_passed)
{
if(! $('html').is('.avia_transform')) return;
var defaults = { offset: 'bottom-in-view' , triggerOnce: true},
options = $.extend({}, defaults, options_passed),
isMobile = $.avia_utilities.isMobile;
return this.each(function()
{
var element = $(this);
setTimeout(function()
{
if(isMobile)
{
element.addClass('avia_start_animation').trigger('avia_start_animation');
}
else
{
element.waypoint(function(direction)
{
$(this.element).addClass('avia_start_animation').trigger('avia_start_animation');
}, options );
}
},100)
});
};
// window resize script
var $event = $.event, $special, resizeTimeout;
$special = $event.special.debouncedresize = {
setup: function() {
$( this ).on( "resize", $special.handler );
},
teardown: function() {
$( this ).off( "resize", $special.handler );
},
handler: function( event, execAsap ) {
// Save the context
var context = this,
args = arguments,
dispatch = function() {
// set correct event type
event.type = "debouncedresize";
$event.dispatch.apply( context, args );
};
if ( resizeTimeout ) {
clearTimeout( resizeTimeout );
}
execAsap ?
dispatch() :
resizeTimeout = setTimeout( dispatch, $special.threshold );
},
threshold: 150
};
$.easing['jswing'] = $.easing['swing'];
$.extend( $.easing,
{
def: 'easeOutQuad',
swing: function (x, t, b, c, d) { return $.easing[$.easing.def](x, t, b, c, d); },
easeInQuad: function (x, t, b, c, d) { return c*(t/=d)*t + b; },
easeOutQuad: function (x, t, b, c, d) { return -c *(t/=d)*(t-2) + b; },
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; },
easeInCubic: function (x, t, b, c, d) { return c*(t/=d)*t*t + b; },
easeOutCubic: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t + 1) + b; },
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; },
easeInQuart: function (x, t, b, c, d) { return c*(t/=d)*t*t*t + b; },
easeOutQuart: function (x, t, b, c, d) { return -c * ((t=t/d-1)*t*t*t - 1) + b; },
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; },
easeInQuint: function (x, t, b, c, d) { return c*(t/=d)*t*t*t*t + b; },
easeOutQuint: function (x, t, b, c, d) { return c*((t=t/d-1)*t*t*t*t + 1) + b; },
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; },
easeInSine: function (x, t, b, c, d) { return -c * Math.cos(t/d * (Math.PI/2)) + c + b; },
easeOutSine: function (x, t, b, c, d) { return c * Math.sin(t/d * (Math.PI/2)) + b; },
easeInOutSine: function (x, t, b, c, d) { return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; },
easeInExpo: function (x, t, b, c, d) { return (t==0) ? b : c * Math.pow(2, 10 * (t/d - 1)) + b; },
easeOutExpo: function (x, t, b, c, d) { return (t==d) ? b+c : c * (-Math.pow(2, -10 * t/d) + 1) + b; },
easeInOutExpo: function (x, t, b, c, d) {
if (t==0) return b;
if (t==d) return b+c;
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
},
easeInCirc: function (x, t, b, c, d) { return -c * (Math.sqrt(1 - (t/=d)*t) - 1) + b; },
easeOutCirc: function (x, t, b, c, d) {return c * Math.sqrt(1 - (t=t/d-1)*t) + b; },
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; },
easeInElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return -(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
},
easeOutElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d)==1) return b+c; if (!p) p=d*.3;
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
return a*Math.pow(2,-10*t) * Math.sin( (t*d-s)*(2*Math.PI)/p ) + c + b;
},
easeInOutElastic: function (x, t, b, c, d) {
var s=1.70158;var p=0;var a=c;
if (t==0) return b; if ((t/=d/2)==2) return b+c; if (!p) p=d*(.3*1.5);
if (a < Math.abs(c)) { a=c; var s=p/4; }
else var s = p/(2*Math.PI) * Math.asin (c/a);
if (t < 1) return -.5*(a*Math.pow(2,10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )) + b;
return a*Math.pow(2,-10*(t-=1)) * Math.sin( (t*d-s)*(2*Math.PI)/p )*.5 + c + b;
},
easeInBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*(t/=d)*t*((s+1)*t - s) + b;
},
easeOutBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
return c*((t=t/d-1)*t*((s+1)*t + s) + 1) + b;
},
easeInOutBack: function (x, t, b, c, d, s) {
if (s == undefined) s = 1.70158;
if ((t/=d/2) < 1) return c/2*(t*t*(((s*=(1.525))+1)*t - s)) + b;
return c/2*((t-=2)*t*(((s*=(1.525))+1)*t + s) + 2) + b;
},
easeInBounce: function (x, t, b, c, d) {
return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d) + b;
},
easeOutBounce: function (x, t, b, c, d) {
if ((t/=d) < (1/2.75)) {
return c*(7.5625*t*t) + b;
} else if (t < (2/2.75)) {
return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
} else if (t < (2.5/2.75)) {
return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
} else {
return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
}
},
easeInOutBounce: function (x, t, b, c, d) {
if (t < d/2) return jQuery.easing.easeInBounce (x, t*2, 0, c, d) * .5 + b;
return jQuery.easing.easeOutBounce (x, t*2-d, 0, c, d) * .5 + c*.5 + b;
}
});
})( jQuery );
/*utility functions*/
(function($)
{
"use strict";
$.avia_utilities = $.avia_utilities || {};
/************************************************************************
gloabl loading function
*************************************************************************/
$.avia_utilities.loading = function(attach_to, delay){
var loader = {
active: false,
show: function()
{
if(loader.active === false)
{
loader.active = true;
loader.loading_item.css({display:'block', opacity:0});
}
loader.loading_item.stop().animate({opacity:0.7});
},
hide: function()
{
if(typeof delay === 'undefined'){ delay = 600; }
loader.loading_item.stop().delay( delay ).animate({opacity:0}, function()
{
loader.loading_item.css({display:'none'});
loader.active = false;
});
},
attach: function()
{
if(typeof attach_to === 'undefined'){ attach_to = 'body';}
loader.loading_item = $('<div class="avia_loading_icon"></div>').css({display:"none"}).appendTo(attach_to);
}
}
loader.attach();
return loader;
};
/************************************************************************
gloabl play/pause visualizer function
*************************************************************************/
$.avia_utilities.playpause = function(attach_to, delay){
var pp = {
active: false,
to1: "",
to2: "",
set: function(status)
{
pp.loading_item.removeClass('av-play av-pause');
pp.to1 = setTimeout(function(){ pp.loading_item.addClass('av-' + status); },10);
pp.to2 = setTimeout(function(){ pp.loading_item.removeClass('av-' + status); },1500);
},
attach: function()
{
if(typeof attach_to === 'undefined'){ attach_to = 'body';}
pp.loading_item = $('<div class="avia_playpause_icon"></div>').css({display:"none"}).appendTo(attach_to);
}
}
pp.attach();
return pp;
};
/************************************************************************
preload images, as soon as all are loaded trigger a special load ready event
*************************************************************************/
$.avia_utilities.preload = function(options_passed)
{
new $.AviaPreloader(options_passed);
}
$.AviaPreloader = function(options)
{
this.win = $(window);
this.defaults =
{
container: 'body',
maxLoops: 10,
trigger_single: true,
single_callback: function(){},
global_callback: function(){}
};
this.options = $.extend({}, this.defaults, options);
this.preload_images = 0;
this.load_images();
}
$.AviaPreloader.prototype =
{
load_images: function()
{
var _self = this;
if(typeof _self.options.container === 'string'){ _self.options.container = $(_self.options.container); }
_self.options.container.each(function()
{
var container = $(this);
container.images = container.find('img');
container.allImages = container.images;
_self.preload_images += container.images.length;
setTimeout(function(){ _self.checkImage(container); }, 10);
});
},
checkImage: function(container)
{
var _self = this;
container.images.each(function()
{
if(this.complete === true)
{
container.images = container.images.not(this);
_self.preload_images -= 1;
}
});
if(container.images.length && _self.options.maxLoops >= 0)
{
_self.options.maxLoops-=1;
setTimeout(function(){ _self.checkImage(container); }, 500);
}
else
{
_self.preload_images = _self.preload_images - container.images.length;
_self.trigger_loaded(container);
}
},
trigger_loaded: function(container)
{
var _self = this;
if(_self.options.trigger_single !== false)
{
_self.win.trigger('avia_images_loaded_single', [container]);
_self.options.single_callback.call(container);
}
if(_self.preload_images === 0)
{
_self.win.trigger('avia_images_loaded');
_self.options.global_callback.call();
}
}
}
/************************************************************************
CSS Easing transformation table
*************************************************************************/
/*
Easing transform table from jquery.animate-enhanced plugin
http://github.com/benbarnett/jQuery-Animate-Enhanced
*/
$.avia_utilities.css_easings = {
linear: 'linear',
swing: 'ease-in-out',
bounce: 'cubic-bezier(0.0, 0.35, .5, 1.3)',
easeInQuad: 'cubic-bezier(0.550, 0.085, 0.680, 0.530)' ,
easeInCubic: 'cubic-bezier(0.550, 0.055, 0.675, 0.190)' ,
easeInQuart: 'cubic-bezier(0.895, 0.030, 0.685, 0.220)' ,
easeInQuint: 'cubic-bezier(0.755, 0.050, 0.855, 0.060)' ,
easeInSine: 'cubic-bezier(0.470, 0.000, 0.745, 0.715)' ,
easeInExpo: 'cubic-bezier(0.950, 0.050, 0.795, 0.035)' ,
easeInCirc: 'cubic-bezier(0.600, 0.040, 0.980, 0.335)' ,
easeInBack: 'cubic-bezier(0.600, -0.280, 0.735, 0.04)' ,
easeOutQuad: 'cubic-bezier(0.250, 0.460, 0.450, 0.940)' ,
easeOutCubic: 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' ,
easeOutQuart: 'cubic-bezier(0.165, 0.840, 0.440, 1.000)' ,
easeOutQuint: 'cubic-bezier(0.230, 1.000, 0.320, 1.000)' ,
easeOutSine: 'cubic-bezier(0.390, 0.575, 0.565, 1.000)' ,
easeOutExpo: 'cubic-bezier(0.190, 1.000, 0.220, 1.000)' ,
easeOutCirc: 'cubic-bezier(0.075, 0.820, 0.165, 1.000)' ,
easeOutBack: 'cubic-bezier(0.175, 0.885, 0.320, 1.275)' ,
easeInOutQuad: 'cubic-bezier(0.455, 0.030, 0.515, 0.955)' ,
easeInOutCubic: 'cubic-bezier(0.645, 0.045, 0.355, 1.000)' ,
easeInOutQuart: 'cubic-bezier(0.770, 0.000, 0.175, 1.000)' ,
easeInOutQuint: 'cubic-bezier(0.860, 0.000, 0.070, 1.000)' ,
easeInOutSine: 'cubic-bezier(0.445, 0.050, 0.550, 0.950)' ,
easeInOutExpo: 'cubic-bezier(1.000, 0.000, 0.000, 1.000)' ,
easeInOutCirc: 'cubic-bezier(0.785, 0.135, 0.150, 0.860)' ,
easeInOutBack: 'cubic-bezier(0.680, -0.550, 0.265, 1.55)' ,
easeInOutBounce:'cubic-bezier(0.580, -0.365, 0.490, 1.365)',
easeOutBounce: 'cubic-bezier(0.760, 0.085, 0.490, 1.365)'
};
/************************************************************************
check if a css feature is supported and save it to the supported array
*************************************************************************/
$.avia_utilities.supported = {};
$.avia_utilities.supports = (function()
{
var div = document.createElement('div'),
vendors = ['Khtml', 'Ms','Moz','Webkit']; // vendors = ['Khtml', 'Ms','Moz','Webkit','O'];
return function(prop, vendor_overwrite)
{
if ( div.style[prop] !== undefined ) { return ""; }
if (vendor_overwrite !== undefined) { vendors = vendor_overwrite; }
prop = prop.replace(/^[a-z]/, function(val)
{
return val.toUpperCase();
});
var len = vendors.length;
while(len--)
{
if ( div.style[vendors[len] + prop] !== undefined )
{
return "-" + vendors[len].toLowerCase() + "-";
}
}
return false;
};
}());
/************************************************************************
animation function
*************************************************************************/
$.fn.avia_animate = function(prop, speed, easing, callback)
{
if(typeof speed === 'function') {callback = speed; speed = false; }
if(typeof easing === 'function'){callback = easing; easing = false;}
if(typeof speed === 'string'){easing = speed; speed = false;}
if(callback === undefined || callback === false){ callback = function(){}; }
if(easing === undefined || easing === false) { easing = 'easeInQuad'; }
if(speed === undefined || speed === false) { speed = 400; }
if($.avia_utilities.supported.transition === undefined)
{
$.avia_utilities.supported.transition = $.avia_utilities.supports('transition');
}
if($.avia_utilities.supported.transition !== false )
{
var prefix = $.avia_utilities.supported.transition + 'transition',
cssRule = {},
cssProp = {},
thisStyle = document.body.style,
end = (thisStyle.WebkitTransition !== undefined) ? 'webkitTransitionEnd' : (thisStyle.OTransition !== undefined) ? 'oTransitionEnd' : 'transitionend';
//translate easing into css easing
easing = $.avia_utilities.css_easings[easing];
//create css transformation rule
cssRule[prefix] = 'all '+(speed/1000)+'s '+easing;
//add namespace to the transition end trigger
end = end + ".avia_animate";
//since jquery 1.10 the items passed need to be {} and not [] so make sure they are converted properly
for (var rule in prop)
{
if (prop.hasOwnProperty(rule)) { cssProp[rule] = prop[rule]; }
}
prop = cssProp;
this.each(function()
{
var element = $(this), css_difference = false, rule, current_css;
for (rule in prop)
{
if (prop.hasOwnProperty(rule))
{
current_css = element.css(rule);
if(prop[rule] != current_css && prop[rule] != current_css.replace(/px|%/g,""))
{
css_difference = true;
break;
}
}
}
if(css_difference)
{
//if no transform property is set set a 3d translate to enable hardware acceleration
if(!($.avia_utilities.supported.transition+"transform" in prop))
{
prop[$.avia_utilities.supported.transition+"transform"] = "translateZ(0)";
}
var endTriggered = false;
element.on(end, function(event)
{
if(event.target != event.currentTarget) return false;
if(endTriggered == true) return false;
endTriggered = true;
cssRule[prefix] = "none";
element.off(end);
element.css(cssRule);
setTimeout(function(){ callback.call(element); });
});
//desktop safari fallback if we are in another tab to trigger the end event
setTimeout(function(){
if(!endTriggered && !avia_is_mobile && $('html').is('.avia-safari') ) {
element.trigger(end);
$.avia_utilities.log('Safari Fallback '+end+' trigger');
}
}, speed + 100);
setTimeout(function(){ element.css(cssRule);},10);
setTimeout(function(){ element.css(prop); },20);
}
else
{
setTimeout(function(){ callback.call(element); });
}
});
}
else // if css animation is not available use default JS animation
{
this.animate(prop, speed, easing, callback);
}
return this;
};
})( jQuery );
/* ======================================================================================================================================================
Avia Slideshow
====================================================================================================================================================== */
(function($)
{
"use strict";
$.AviaSlider = function(options, slider)
{
var self = this;
this.$win = $( window );
this.$slider = $( slider );
this.isMobile = $.avia_utilities.isMobile;
this._prepareSlides(options);
//default preload images then init slideshow
$.avia_utilities.preload({container: this.$slider , single_callback: function(){ self._init( options ); }});
}
$.AviaSlider.defaults = {
//interval between autorotation switches
interval:5,
//autorotation active or not
autoplay:false,
//set if the loop will stop at the last/first slide or if the slides will loop infinite
//set to false for infinite loop, "last" to stop at the last slide or "first" to stop at the first slide
stopinfiniteloop: false,
//fade or slide animation
animation:'slide',
//transition speed when switching slide
transitionSpeed:900,
//easing method for the transition
easing:'easeInOutQuart',
//slide wrapper
wrapElement: '>ul',
//slide element
slideElement: '>li',
//pause if mouse cursor is above item
hoverpause: false,
//attach images as background
bg_slider: false,
//delay of miliseconds to wait before showing the next slide
show_slide_delay: 0,
//if slider animation is set to "fade" the fullfade property sets the crossfade behaviour
fullfade: false
};
$.AviaSlider.prototype =
{
_init: function( options )
{
// set slider options
this.options = this._setOptions(options);
//slidewrap
this.$sliderUl = this.$slider.find(this.options.wrapElement);
// slide elements
this.$slides = this.$sliderUl.find(this.options.slideElement);
// goto dots
this.gotoButtons = this.$slider.find('.avia-slideshow-dots a');
//perma caption
this.permaCaption = this.$slider.find('>.av-slideshow-caption');
// slide count
this.itemsCount = this.$slides.length;
// current image index
this.current = 0;
//loop count
this.loopCount = 0;
// control if the slicebox is animating
this.isAnimating = false;
// css browser prefix like -webkit-, -moz-
this.browserPrefix = $.avia_utilities.supports('transition');
// css3 animation?
this.cssActive = this.browserPrefix !== false ? true : false;
// css3D animation?
this.css3DActive = document.documentElement.className.indexOf('avia_transform3d') !== -1 ? true : false;
//store the aviaVideoApi object for the current slide if available
this.video = false;
//if we have a bg slider no images were preloaded yet. in that case start preloading and attaching images
if(this.options.bg_slider == true)
{
//create array that holds all image urls to preload
this.imageUrls = [];
//create a preloader icon to indicate loading
this.loader = $.avia_utilities.loading(this.$slider);
//preload the images ony by one
this._bgPreloadImages();
}
else //if it was a default slider all images are already loaded and we can start showing the slider
{
//kickoff the slider: bind functions, show first slide, if active start the autorotation timer
this._kickOff();
}
},
//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
_setOptions: function(options)
{
var newOptions = $.extend( true, {}, $.AviaSlider.defaults, options ),
htmlData = this.$slider.data(),
i = "";
//overwritte passed option set with any data properties on the html element
for (i in htmlData)
{
if (htmlData.hasOwnProperty(i))
{
if(typeof htmlData[i] === "string" || typeof htmlData[i] === "number" || typeof htmlData[i] === "boolean")
{
newOptions[i] = htmlData[i];
}
}
}
return newOptions;
},
_prepareSlides: function(options)
{
//if its a mobile device find all video slides that need to be altered
if(this.isMobile)
{
var alter = this.$slider.find('.av-mobile-fallback-image');
alter.each(function()
{
var current = $(this).removeClass('av-video-slide').data({'avia_video_events': true, 'video-ratio':0}),
fallback = current.data('mobile-img');
current.find('.av-click-overlay, .mejs-mediaelement, .mejs-container').remove();
if(!fallback)
{
var appendTo = current.find('.avia-slide-wrap');
$('<p class="av-fallback-message"><span>Please set a mobile device fallback image for this video in your wordpress backend</span></p>').appendTo(appendTo);
}
if(options && options.bg_slider)
{
current.data('img-url', fallback);
}
else
{
var image = $('<img src="'+fallback+'" alt="" title="" />');
current.find('.avia-slide-wrap').append(image);
}
});
}
},
//start preloading the background images
_bgPreloadImages : function(callback)
{
this._getImageURLS();
this._preloadSingle(0, function()
{
this._kickOff();
this._preloadNext(1);
});
},
//if we are using a background image slider, fetch the images from a data attribute and preload them one by one
_getImageURLS: function()
{
var _self = this;
//collect url strings of the images to preload
this.$slides.each(function(i)
{
_self.imageUrls[i] = [];
_self.imageUrls[i]['url'] = $(this).data("img-url");
//if no image is passed we can set the slide to loaded
if(typeof _self.imageUrls[i]['url'] == 'string')
{
_self.imageUrls[i]['status'] = false;
}
else
{
_self.imageUrls[i]['status'] = true;
}
});
},
_preloadSingle: function(key, callback)
{
var _self = this,
objImage = new Image();
if(typeof _self.imageUrls[key]['url'] == 'string')
{
$(objImage).bind('load error', function()
{
_self.imageUrls[key]['status'] = true;
_self.$slides.eq(key).css('background-image','url(' + _self.imageUrls[key]['url'] + ')');
if(typeof callback == 'function') callback.apply( _self, [objImage, key] );
});
if(_self.imageUrls[key]['url'] != "")
{
objImage.src = _self.imageUrls[key]['url'];
}
else
{
$(objImage).trigger('error');
}
}
else
{
if(typeof callback == 'function') callback.apply( _self, [objImage, key] );
}
},
_preloadNext: function(key)
{
if(typeof this.imageUrls[key] != "undefined")
{
this._preloadSingle(key, function()
{
this._preloadNext(key + 1);
});
}
},
//bind click events of slide controlls to the public functions
_bindEvents: function()
{
var self = this,
win = $( window );
this.$slider.on('click','.next-slide', $.proxy( this.next, this) );
this.$slider.on('click','.prev-slide', $.proxy( this.previous, this) );
this.$slider.on('click','.goto-slide', $.proxy( this.go2, this) );
if(this.options.hoverpause)
{
this.$slider.on('mouseenter', $.proxy( this.pause, this) );
this.$slider.on('mouseleave', $.proxy( this.resume, this) );
}
if(this.options.stopinfiniteloop && this.options.autoplay)
{
if(this.options.stopinfiniteloop == 'last')
{
this.$slider.on('avia_slider_last_slide', $.proxy(this._stopSlideshow, this) );
}
else if(this.options.stopinfiniteloop == 'first')
{
this.$slider.on('avia_slider_first_slide', $.proxy(this._stopSlideshow, this) );
}
}
win.on( 'debouncedresize.aviaSlider', $.proxy( this._setSize, this) );
//if its a desktop browser add arrow navigation, otherwise add touch nav
if(!this.isMobile)
{
this.$slider.avia_keyboard_controls();
}
else
{
this.$slider.avia_swipe_trigger();
}
self._attach_video_events();
},
//kickoff the slider by binding all functions to slides and buttons, show the first slide and start autoplay
_kickOff: function()
{
var self = this,
first_slide = self.$slides.eq(0),
video = first_slide.data('video-ratio');
// bind events to to the controll buttons
self._bindEvents();
this.$slider.removeClass('av-default-height-applied');
//show the first slide. if its a video set the correct size, otherwise make sure to remove the % padding
if(video)
{
self._setSize(true);
}
else
{
if(this.options.keep_pading != true)
{
self.$sliderUl.css('padding',0);
self.$win.trigger('av-height-change');
}
}
first_slide.css({visibility:'visible', opacity:0}).avia_animate({opacity:1}, function()
{
var current = $(this).addClass('active-slide');
if(self.permaCaption.length)
{
self.permaCaption.addClass('active-slide');
}
});
// start autoplay if active
if( self.options.autoplay )
{
self._startSlideshow();
}
},
//calculate which slide should be displayed next and call the executing transition function
_navigate : function( dir, pos ) {
if( this.isAnimating || this.itemsCount < 2 || !this.$slider.is(":visible") )
{
return false;
}
this.isAnimating = true;
// current item's index
this.prev = this.current;
// if position is passed
if( pos !== undefined )
{
this.current = pos;
dir = this.current > this.prev ? 'next' : 'prev';
}
// if not check the boundaries
else if( dir === 'next' )
{
this.current = this.current < this.itemsCount - 1 ? this.current + 1 : 0;
if( this.current === 0 && this.options.autoplay_stopper == 1 && this.options.autoplay )
{
this.isAnimating = false;
this.current = this.prev;
this._stopSlideshow();
return false;
}
}
else if( dir === 'prev' )
{
this.current = this.current > 0 ? this.current - 1 : this.itemsCount - 1;
}
//set goto button
this.gotoButtons.removeClass('active').eq(this.current).addClass('active');
$(document).trigger('previewSlideChanged');
//set slideshow size
this._setSize();
//if we are using a background slider make sure that the image is loaded. if not preload it, then show the slide
if(this.options.bg_slider == true)
{
if(this.imageUrls[this.current]['status'] == true )
{
this['_' + this.options.animation].call(this, dir);
}
else
{
this.loader.show();
this._preloadSingle(this.current, function()
{
this['_' + this.options.animation].call(this, dir);
this.loader.hide();
});
}
}
else //no background loader -> images are already loaded
{
//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
this['_' + this.options.animation].call(this, dir);
}
if(this.current == 0)
{
this.loopCount++;
this.$slider.trigger('avia_slider_first_slide');
}
else if(this.current == this.itemsCount - 1)
{
this.$slider.trigger('avia_slider_last_slide');
}
else
{
this.$slider.trigger('avia_slider_navigate_slide');
}
},
//if the next slide has a different height than the current change the slideshow height
_setSize: function(instant)
{
//if images are attached as bg images the slider has a fixed height
if(this.options.bg_slider == true) return;
var self = this,
slide = this.$slides.eq(this.current),
current = Math.floor(this.$sliderUl.height()),
ratio = slide.data('video-ratio'),
setTo = ratio ? this.$sliderUl.width() / ratio : Math.floor(slide.height()),
video_height = slide.data('video-height'), //forced video height %. needs to be set only once
video_toppos = slide.data('video-toppos'); //forced video top position
this.$sliderUl.height(current).css('padding',0); //make sure to set the slideheight to an actual value
if(setTo != current)
{
if(instant == true)
{
this.$sliderUl.css({height:setTo});
this.$win.trigger('av-height-change');
}
else
{
this.$sliderUl.avia_animate({height:setTo}, function()
{
self.$win.trigger('av-height-change');
});
}
}
if(video_height && video_height!= "set")
{
slide.find('iframe, embed, video, object, .av_youtube_frame').css({height: video_height + '%', top: video_toppos + '%'});
slide.data('video-height','set');
}
},
_slide: function(dir)
{
var dynamic = false, //todo: pass by option if a slider is dynamic
modifier = dynamic == true ? 2 : 1,
sliderWidth = this.$slider.width(),
direction = dir === 'next' ? -1 : 1,
property = this.browserPrefix + 'transform',
reset = {}, transition = {}, transition2 = {},
trans_val = ( sliderWidth * direction * -1),
trans_val2 = ( sliderWidth * direction) / modifier;
//do a css3 animation
if(this.cssActive)
{
property = this.browserPrefix + 'transform';
//do a translate 3d transformation if available, since it uses hardware acceleration
if(this.css3DActive)
{
reset[property] = "translate3d(" + trans_val + "px, 0, 0)";
transition[property] = "translate3d(" + trans_val2 + "px, 0, 0)";
transition2[property] = "translate3d(0,0,0)";
}
else //do a 2d transform. still faster than a position "left" change
{
reset[property] = "translate(" + trans_val + "px,0)";
transition[property] = "translate(" + trans_val2 + "px,0)";
transition2[property] = "translate(0,0)"; }
}
else
{
reset.left = trans_val;
transition.left = trans_val2;
transition2.left = 0;
}
if(dynamic)
{
transition['z-index'] = "1";
transition2['z-index'] = "2";
}
this._slide_animate(reset, transition, transition2);
},
_slide_up: function(dir)
{
var dynamic = true, //todo: pass by option if a slider is dynamic
modifier = dynamic == true ? 2 : 1,
sliderHeight = this.$slider.height(),
direction = dir === 'next' ? -1 : 1,
property = this.browserPrefix + 'transform',
reset = {}, transition = {}, transition2 = {},
trans_val = ( sliderHeight * direction * -1),
trans_val2 = ( sliderHeight * direction) / modifier;
//do a css3 animation
if(this.cssActive)
{
property = this.browserPrefix + 'transform';
//do a translate 3d transformation if available, since it uses hardware acceleration
if(this.css3DActive)
{
reset[property] = "translate3d( 0," + trans_val + "px, 0)";
transition[property] = "translate3d( 0," + trans_val2 + "px, 0)";
transition2[property] = "translate3d(0,0,0)";
}
else //do a 2d transform. still faster than a position "left" change
{
reset[property] = "translate( 0," + trans_val + "px)";
transition[property] = "translate( 0," + trans_val2 + "px)";
transition2[property] = "translate(0,0)"; }
}
else
{
reset.top = trans_val;
transition.top = trans_val2;
transition2.top = 0;
}
if(dynamic)
{
transition['z-index'] = "1";
transition2['z-index'] = "2";
}
this._slide_animate(reset, transition, transition2);
},
//slide animation: do a slide transition by css3 transform if possible. if not simply do a position left transition
_slide_animate: function( reset , transition , transition2 )
{
var self = this,
displaySlide = this.$slides.eq(this.current),
hideSlide = this.$slides.eq(this.prev);
hideSlide.trigger('pause');
if( !displaySlide.data('disableAutoplay') ) displaySlide.trigger('play');
displaySlide.css({visibility:'visible', zIndex:4, opacity:1, left:0, top:0});
displaySlide.css(reset);
hideSlide.avia_animate(transition, this.options.transitionSpeed, this.options.easing);
var after_slide = function()
{
self.isAnimating = false;
displaySlide.addClass('active-slide');
hideSlide.css({visibility:'hidden'}).removeClass('active-slide');
self.$slider.trigger('avia-transition-done');
}
if(self.options.show_slide_delay > 0)
{
setTimeout(function() { displaySlide.avia_animate(transition2, self.options.transitionSpeed, self.options.easing, after_slide); },self.options.show_slide_delay);
}
else
{
displaySlide.avia_animate(transition2, self.options.transitionSpeed, self.options.easing, after_slide);
}
},
//simple fade transition of the slideshow
_fade: function()
{
var self = this,
displaySlide = this.$slides.eq(this.current),
hideSlide = this.$slides.eq(this.prev),
properties = {visibility:'visible', zIndex:3, opacity:0},
fadeCallback = function()
{
self.isAnimating = false;
displaySlide.addClass('active-slide');
hideSlide.css({visibility:'hidden', zIndex:2}).removeClass('active-slide');
self.$slider.trigger('avia-transition-done');
};
hideSlide.trigger('pause');
if( !displaySlide.data('disableAutoplay') ) displaySlide.trigger('play');
if(self.options.fullfade == true)
{
hideSlide.avia_animate({opacity:0}, 200, 'linear', function()
{
displaySlide.css(properties).avia_animate({opacity:1}, self.options.transitionSpeed, 'linear',fadeCallback);
});
}
else
{
displaySlide.css(properties).avia_animate({opacity:1}, self.options.transitionSpeed/2, 'linear', function()
{
hideSlide.avia_animate({opacity:0}, 200, 'linear', fadeCallback);
});
}
},
/************************************************************************
Video functions
*************************************************************************/
//bind events to the video that tell the slider to autorotate once a video has been played
_attach_video_events: function()
{
var self = this, $html = $('html');
self.$slides.each(function(i)
{
var currentSlide = $(this),
caption = currentSlide.find('.caption_fullwidth, .av-click-overlay'),
mejs = currentSlide.find('.mejs-mediaelement');
if(currentSlide.data('avia_video_events') != true)
{
currentSlide.data('avia_video_events', true);
currentSlide.on('av-video-events-bound', { slide: currentSlide, wrap: mejs , iteration: i , self: self }, onReady);
currentSlide.on('av-video-ended', { slide: currentSlide , self: self}, onFinish);
currentSlide.on('av-video-play-executed', function(){ setTimeout(function(){ self.pause() }, 100); });
caption.on('click', { slide: currentSlide }, toggle);
// also if the player was loaded before the _bindEvents function was bound trigger it manually
if(currentSlide.is('.av-video-events-bound')) currentSlide.trigger('av-video-events-bound');
}
});
//helper functions
function onReady( event )
{
//autostart for first slide
if(event.data.iteration === 0)
{
event.data.wrap.css('opacity',0);
if(!event.data.self.isMobile && !event.data.slide.data('disableAutoplay')) { event.data.slide.trigger('play'); }
setTimeout(function(){ event.data.wrap.avia_animate({opacity:1}, 400); }, 50);
}
else if ($html.is('.avia-msie') && !event.data.slide.is('.av-video-service-html5'))
{
/*
* Internet Explorer fires the ready event for external videos once they become visible
* as oposed to other browsers which always fire immediately.
*/
if( !event.data.slide.data('disableAutoplay') ) event.data.slide.trigger('play');
}
}
function onFinish( event )
{
//if the video is not looped resume the slideshow
if(!event.data.slide.is('.av-single-slide') && !event.data.slide.is('.av-loop-video'))
{
event.data.slide.trigger('reset');
self._navigate( 'next' );
self.resume();
}
//safari 8 workaround for self hosted videos which wont loop by default
if(event.data.slide.is('.av-loop-video') && event.data.slide.is('.av-video-service-html5'))
{
if($html.is('.avia-safari-8'))
{
setTimeout(function(){ event.data.slide.trigger('play'); },1);
}
}
}
function toggle( event )
{
if(event.target.tagName != "A")
{
event.data.slide.trigger('toggle');
}
}
},
/************************************************************************
Slideshow control functions
*************************************************************************/
_timer: function(callback, delay, first)
{
var self = this, start, remaining = delay;
self.timerId = 0;
this.pause = function() {
window.clearTimeout(self.timerId);
remaining -= new Date() - start;
};
this.resume = function() {
start = new Date();
self.timerId = window.setTimeout(callback, remaining);
};
this.destroy = function()
{
window.clearTimeout(self.timerId);
};
this.resume(true);
},
//start autorotation
_startSlideshow: function()
{
var self = this;
this.isPlaying = true;
this.slideshow = new this._timer( function()
{
/*
var videoApi = self.$slides.eq(self.current).data('aviaVideoApi')
if(!videoApi){}
*/
self._navigate( 'next' );
if ( self.options.autoplay )
{
self._startSlideshow();
}
}, (this.options.interval * 1000));
},
//stop autorotation
_stopSlideshow: function()
{
if ( this.options.autoplay ) {
this.slideshow.destroy();
this.isPlaying = false;
this.options.autoplay = false;
}
},
// public method: shows next image
next : function(e)
{
e.preventDefault();
this._stopSlideshow();
this._navigate( 'next' );
},
// public method: shows previous image
previous : function(e)
{
e.preventDefault();
this._stopSlideshow();
this._navigate( 'prev' );
},
// public method: goes to a specific image
go2 : function( pos )
{
//if we didnt pass a number directly lets asume someone clicked on a link that triggered the goto transition
if(isNaN(pos))
{
//in that case prevent the default link behavior and set the slide number to the links hash
pos.preventDefault();
pos = pos.currentTarget.hash.replace('#','');
}
pos -= 1;
if( pos === this.current || pos >= this.itemsCount || pos < 0 )
{
return false;
}
this._stopSlideshow();
this._navigate( false, pos );
},
// public method: starts the slideshow
// any call to next(), previous() or goto() will stop the slideshow autoplay
play : function()
{
if( !this.isPlaying )
{
this.isPlaying = true;
this._navigate( 'next' );
this.options.autoplay = true;
this._startSlideshow();
}
},
// public methos: pauses the slideshow
pause : function()
{
if( this.isPlaying )
{
this.slideshow.pause();
}
},
// publiccmethos: resumes the slideshow
resume : function()
{
if( this.isPlaying )
{
this.slideshow.resume();
}
},
// public methos: destroys the instance
destroy : function( callback )
{
this.slideshow.destroy( callback );
}
}
//simple wrapper to call the slideshow. makes sure that the slide data is not applied twice
$.fn.aviaSlider = function( options )
{
return this.each(function()
{
var self = $.data( this, 'aviaSlider' );
if(!self)
{
self = $.data( this, 'aviaSlider', new $.AviaSlider( options, this ) );
}
});
}
})( jQuery );
// -------------------------------------------------------------------------------------------
// keyboard controls
// -------------------------------------------------------------------------------------------
(function($)
{
"use strict";
/************************************************************************
keyboard arrow nav
*************************************************************************/
$.fn.avia_keyboard_controls = function(options_passed)
{
var defaults =
{
37: '.prev-slide', // prev
39: '.next-slide' // next
},
methods = {
mousebind: function(slider)
{
slider.hover(
function(){ slider.mouseover = true; },
function(){ slider.mouseover = false; }
);
},
keybind: function(slider)
{
$(document).keydown(function(e)
{
if(slider.mouseover && typeof slider.options[e.keyCode] !== 'undefined')
{
var item;
if(typeof slider.options[e.keyCode] === 'string')
{
item = slider.find(slider.options[e.keyCode]);
}
else
{
item = slider.options[e.keyCode];
}
if(item.length)
{
item.trigger('click', ['keypress']);
return false;
}
}
});
}
};
return this.each(function()
{
var slider = $(this);
slider.options = $.extend({}, defaults, options_passed);
slider.mouseover = false;
methods.mousebind(slider);
methods.keybind(slider);
});
};
/************************************************************************
swipe nav
*************************************************************************/
$.fn.avia_swipe_trigger = function(passed_options)
{
var win = $(window),
isMobile = $.avia_utilities.isMobile,
defaults =
{
prev: '.prev-slide',
next: '.next-slide',
event: {
prev: 'click',
next: 'click'
}
},
methods = {
activate_touch_control: function(slider)
{
var i, differenceX, differenceY;
slider.touchPos = {};
slider.hasMoved = false;
slider.on('touchstart', function(event)
{
slider.touchPos.X = event.originalEvent.touches[0].clientX;
slider.touchPos.Y = event.originalEvent.touches[0].clientY;
});
slider.on('touchend', function(event)
{
slider.touchPos = {};
if(slider.hasMoved) { event.preventDefault(); }
slider.hasMoved = false;
});
slider.on('touchmove', function(event)
{
if(!slider.touchPos.X)
{
slider.touchPos.X = event.originalEvent.touches[0].clientX;
slider.touchPos.Y = event.originalEvent.touches[0].clientY;
}
else
{
differenceX = event.originalEvent.touches[0].clientX - slider.touchPos.X;
differenceY = event.originalEvent.touches[0].clientY - slider.touchPos.Y;
//check if user is scrolling the window or moving the slider
if(Math.abs(differenceX) > Math.abs(differenceY))
{
event.preventDefault();
if(slider.touchPos !== event.originalEvent.touches[0].clientX)
{
if(Math.abs(differenceX) > 50)
{
i = differenceX > 0 ? 'prev' : 'next';
if(typeof slider.options[i] === 'string')
{
slider.find(slider.options[i]).trigger(slider.options.event[i], ['swipe']);
}
else
{
slider.options[i].trigger(slider.options.event[i], ['swipe']);
}
slider.hasMoved = true;
slider.touchPos = {};
return false;
}
}
}
}
});
}
};
return this.each(function()
{
if(isMobile)
{
var slider = $(this);
slider.options = $.extend({}, defaults, passed_options);
methods.activate_touch_control(slider);
}
});
};
}(jQuery));
jQuery(document).on('previewSlideChanged', function() {
console.log('Slide Changed Hoorayyyy!');
if( jQuery('.yanco-preview-images').length > 0 ) {
var active_slide_number = jQuery('.goto-slide.active').attr('href');
active_slide_number = active_slide_number.replace('#', '');
jQuery('.goto-preview').removeClass('active');
jQuery('.goto-preview[href="#'+active_slide_number+'"]').addClass('active');
}
});
<?php
if ( !class_exists( 'avia_slideshow' ) )
{
class avia_slideshow
{
static $slider = 0; //slider count for the current page
protected $config; //base config set on initialization
protected $slides; //attachment posts for the current slider
protected $slide_count = 0; //number of slides
protected $id_array = array();
function __construct($config)
{
$this->config = array_merge(array(
'size' => 'featured',
'lightbox_size' => 'large',
'animation' => 'slide',
'ids' => '',
'video_counter' => 0,
'autoplay' => 'false',
'bg_slider' => 'false',
'slide_height' => '',
'handle' => '',
'interval' => 5,
'class' => "",
'css_id' => "",
'scroll_down' => "",
'control_layout'=> '',
'content' => array(),
'custom_markup' => '',
'perma_caption' => '',
'slider_preview_images' => '',
'autoplay_stopper'=>'',
'image_attachment'=>''
), $config);
$this->config = apply_filters('avf_slideshow_config', $this->config);
//check how large the slider is and change the classname accordingly
global $_wp_additional_image_sizes;
$width = 1500;
if(isset($_wp_additional_image_sizes[$this->config['size']]['width']))
{
$width = $_wp_additional_image_sizes[$this->config['size']]['width'];
$height = $_wp_additional_image_sizes[$this->config['size']]['height'];
$this->config['default-height'] = (100/$width) * $height;
}
else if($size = get_option( $this->config['size'].'_size_w' ))
{
$width = $size;
}
if($width < 600)
{
$this->config['class'] .= " avia-small-width-slider";
}
if($width < 305)
{
$this->config['class'] .= " avia-super-small-width-slider";
}
//if we got subslides overwrite the id array
if(!empty($config['content']))
{
$this->extract_subslides($config['content']);
}
if("aviaTBautoplay_stopper" == $this->config['autoplay_stopper'])
{
$this->config['autoplay_stopper'] = true;
}
else
{
$this->config['autoplay_stopper'] = false;
}
$this->set_slides($this->config['ids']);
}
public function set_slides($ids)
{
if(empty($ids) && empty($this->config['video_counter'])) return;
$this->slides = get_posts(array(
'include' => $ids,
'post_status' => 'inherit',
'post_type' => 'attachment',
'post_mime_type' => 'image',
'order' => 'ASC',
'orderby' => 'post__in')
);
//resort slides so the id of each slide matches the post id
$new_slides = array();
foreach($this->slides as $slide)
{
$new_slides[$slide->ID] = $slide;
}
$slideshow_data = array();
$slideshow_data['slides'] = $new_slides;
$slideshow_data['id_array'] = explode(',',$this->config['ids']);
$slideshow_data['slide_count'] = count(array_filter($slideshow_data['id_array'])) + $this->config['video_counter'];
$slideshow_data = apply_filters('avf_avia_builder_slideshow_filter', $slideshow_data);
$this->slides = $slideshow_data['slides'];
$this->id_array = $slideshow_data['id_array'];
$this->slide_count = $slideshow_data['slide_count'];
}
public function set_size($size)
{
$this->config['size'] = $size;
}
public function set_extra_class($class)
{
$this->config['class'] .= " ".$class;
}
public function html()
{
$html = "";
$counter = 0;
$style = "";
$extraClass = "";
avia_slideshow::$slider++;
if($this->slide_count == 0) return $html;
if(!empty($this->config['scroll_down']))
{
$html .= "<a href='#next-section' title='' class='scroll-down-link ".$this->config['control_layout']."' ". av_icon_string( 'scrolldown' ). "></a>";
$extraClass .= "av-slider-scroll-down-active";
}
if(!empty($this->config['control_layout'])) $extraClass .= " ".$this->config['control_layout'];
$style = "";
$data = AviaHelper::create_data_string($this->config);
$slide_html = empty($this->subslides) ? $this->default_slide() : $this->advanced_slide();
if(!empty($this->config['default-height']))
{
$style = "style='padding-bottom: ".$this->config['default-height']."%;'";
$extraClass .= " av-default-height-applied";
}
$markup = avia_markup_helper(array('context' => 'image','echo'=>false, 'custom_markup'=>$this->config['custom_markup']));
$html .= "<div {$data} class='avia-slideshow avia-slideshow-".avia_slideshow::$slider." {$extraClass} avia-slideshow-".$this->config['size']." ".$this->config['handle']." ".$this->config['class']." avia-".$this->config['animation']."-slider ' $markup>";
$html .= "<ul class='avia-slideshow-inner' {$style}>";
$html .= $slide_html;
$html .= "</ul>";
if($this->slide_count > 1)
{
$html .= $this->slide_navigation_arrows();
$html .= $this->slide_navigation_dots();
if( !empty($this->config['slider_preview_images']) ) {
$html .= $this->slide_navigation_preview_images();
}
}
if(!empty($this->config['caption_override'])) $html .= $this->config['caption_override'];
$html .= "</div>";
return $html;
}
//function that renders the usual slides. use when we didnt use sub-shorcodes to define the images but ids
protected function default_slide()
{
$html = "";
$counter = 0;
$markup_url = avia_markup_helper(array('context' => 'image_url','echo'=>false, 'custom_markup'=>$this->config['custom_markup']));
foreach($this->id_array as $id)
{
if(isset($this->slides[$id]))
{
$slide = $this->slides[$id];
$counter ++;
$img = wp_get_attachment_image_src($slide->ID, $this->config['size']);
$link = wp_get_attachment_image_src($slide->ID, $this->config['lightbox_size']);
$caption = trim($slide->post_excerpt) ? '<div class="avia-caption capt-bottom capt-left"><div class="avia-inner-caption">'.wptexturize($slide->post_excerpt)."</div></div>": "";
$imgalt = get_post_meta($slide->ID, '_wp_attachment_image_alt', true);
$imgalt = !empty($imgalt) ? esc_attr($imgalt) : '';
$imgtitle = trim($slide->post_title) ? esc_attr($slide->post_title) : "";
if($imgtitle == "-") $imgtitle = "";
$imgdescription = trim($slide->post_content) ? esc_attr($slide->post_content) : "";
$tags = apply_filters('avf_slideshow_link_tags', array("a href='".$link[0]."' title='".$imgdescription."'",'a')); // can be filtered and for example be replaced by array('div','div')
$html .= "<li class='slide-{$counter} slide-id-".$slide->ID."'>";
$html .= "<".$tags[0]." >{$caption}<img src='".$img[0]."' width='".$img[1]."' height='".$img[2]."' title='".$imgtitle."' alt='".$imgalt."' $markup_url /></ ".$tags[1]." >";
$html .= "</li>";
}
else
{
$this->slide_count --;
}
}
return $html;
}
//function that renders the slides. use when we did use sub-shorcodes to define the images
protected function advanced_slide()
{
$html = "";
$counter = 0;
$this->ie8_fallback = "";
foreach($this->id_array as $key => $id)
{
$meta = array_merge( array( 'content' => $this->subslides[$key]['content'],
'title' =>'',
'link_apply' =>'',
//direct link from image
'link' =>'',
'link_target' =>'',
//button link 1
'button_label' =>'',
'button_color' =>'light',
'link1' =>'',
'link_target1' =>'',
//button link 2
'button_label2' =>'',
'button_color2' =>'light',
'link2' =>'',
'link_target2' =>'',
'position' =>'center center',
'caption_pos' =>'capt-bottom capt-left',
'video_cover' =>'',
'video_controls'=>'',
'video_mute' =>'',
'video_loop' =>'',
'video_format' =>'',
'video_autoplay'=>'',
'video_ratio' =>'16:9',
'video_mobile_disabled'=>'',
'video_mobile' =>'mobile-fallback-image',
'mobile_image' => '',
'slide_type' =>'',
'custom_markup' => '',
'custom_title_size' => '',
'custom_content_size' => '',
'font_color' =>'',
'custom_title' => '',
'custom_content' => '',
'overlay_enable' => '',
'overlay_opacity' => '',
'overlay_color' => '',
'overlay_pattern' => '',
'overlay_custom_pattern' => '',
), $this->subslides[$key]['attr']);
extract($meta);
if(isset($this->slides[$id]) || $slide_type == 'video')
{
$img = array('');
$slide = "";
$attachment_id = isset($this->slides[$id]) ? $id : false;
$link = AviaHelper::get_url($link, $attachment_id);
$extra_class = "";
$linkdescription= "";
$linkalt = "";
$this->service = false;
$slider_data = "";
$stretch_height = false;
$final_ratio = "";
$viewport = 16/9;
$markup_url = avia_markup_helper(array('context' => 'image_url','echo'=>false, 'id'=>$attachment_id, 'custom_markup'=>$custom_markup));
if($slide_type == 'video')
{
$this->service = avia_slideshow_video_helper::which_video_service($video);
$video = avia_slideshow_video_helper::set_video_slide($video, $this->service, $meta);
$video_class = !empty( $video_controls ) ? " av-hide-video-controls" : "";
$video_class .= !empty( $video_mute ) ? " av-mute-video" : "";
$video_class .= !empty( $video_loop ) ? " av-loop-video" : "";
$video_class .= !empty( $video_mobile ) ? " av-".$video_mobile : "";
$extra_class .= " av-video-slide ".$video_cover." av-video-service-".$this->service." ".$video_class;
$slider_data .= " data-controls='{$video_controls}' data-mute='{$video_mute}' data-loop='{$video_loop}' data-disable-autoplay='{$video_autoplay}' ";
if($mobile_image){
$fallback_img = wp_get_attachment_image_src($mobile_image, $this->config['size']);
$slider_data .= " data-mobile-img='".$fallback_img[0]."'";
}
//if we dont use a fullscreen slider pass the video ratio to the slider
if($this->config['bg_slider'] != "true")
{
global $avia_config;
//if we use the small slideshow only allow the "full" $video_format
if($this->config['handle'] == 'av_slideshow') $video_format = "full";
//calculate the viewport ratio
if(!empty($avia_config['imgSize'][$this->config['size']]))
{
$viewport = $avia_config['imgSize'][$this->config['size']]['width'] / $avia_config['imgSize'][$this->config['size']]['height'];
}
//calculate the ratio when passed as a string (eg: 16:9, 4:3). fallback is 16:9
$video_ratio = explode(':',trim($video_ratio));
if(empty($video_ratio[0])) $video_ratio[0] = 16;
if(empty($video_ratio[1])) $video_ratio[1] = 9;
$final_ratio = ((int) $video_ratio[0] / (int) $video_ratio[1]);
switch($video_format)
{
case "":
$final_ratio = $viewport;
break;
case "stretch":
$final_ratio = $viewport;
$stretch_height = ceil( $viewport / ($video_ratio[0]/$video_ratio[1]) * 100 );
$stretch_pos = (($stretch_height - 100) / 2) * -1;
$slider_data .= " data-video-height='{$stretch_height}'";
$slider_data .= " data-video-toppos='{$stretch_pos}'";
$extra_class .= " av-video-stretch";
break;
case "full":
// do nothing and apply the entered ratio
break;
}
$slider_data .= " data-video-ratio='{$final_ratio}'";
}
}
else //img slide
{
$slide = $this->slides[$id];
$linktitle = trim($slide->post_title) ? esc_attr($slide->post_title) : "";
if($linktitle == "-") $linktitle = "";
$linkdescription = (trim($slide->post_content) && empty($link)) ? "title='".esc_attr($slide->post_content)."'" : "";
$linkalt = get_post_meta($slide->ID, '_wp_attachment_image_alt', true);
$linkalt = !empty($linkalt) ? esc_attr($linkalt) : '';
$img = wp_get_attachment_image_src($slide->ID, $this->config['size']);
$video = "";
}
if($this->slide_count === 1) $extra_class .= " av-single-slide";
$blank = (strpos($link_target, '_blank') !== false || $link_target == 'yes') ? ' target="_blank" ' : "";
$blank .= strpos($link_target, 'nofollow') !== false ? ' rel="nofollow" ' : "";
$tags = (!empty($link) && $link_apply == 'image') ? array("a href='{$link}'{$blank}",'a') : array('div','div');
$caption = "";
$button_html = "";
$counter ++;
$button_count = "";
if(strpos($link_apply, 'button-two') !== false){$button_count = "avia-multi-slideshow-button";}
//if we got a CTA button apply the link to the button istead of the slide
if(strpos($link_apply, 'button') !== false)
{
$button_html .= $this->slideshow_cta_button($link1, $link_target1, $button_color, $button_label, $button_count);
$tags = array('div','div');
}
if(strpos($link_apply, 'button-two') !== false)
{
$button_count .= " avia-slideshow-button-2";
$button_html .= $this->slideshow_cta_button($link2, $link_target2, $button_color2, $button_label2, $button_count);
}
//custom caption styles
$title_styling = !empty($custom_title_size) ? "font-size:{$custom_title_size}px; " : "";
$content_styling = !empty($custom_content_size) ? "font-size:{$custom_content_size}px; " : "";
$content_class = "";
if($font_color == "custom")
{
$title_styling .= !empty($custom_title) ? "color:{$custom_title}; " : "";
$content_styling .= !empty($custom_content) ? "color:{$custom_content}; " : "";
}
if($title_styling) $title_styling = " style='{$title_styling}'" ;
if($content_styling)
{
$content_styling = " style='{$content_styling}'" ;
$content_class = "av_inherit_color";
}
//check if we got a caption
$markup_description = avia_markup_helper(array('context' => 'description','echo'=>false, 'id'=>$attachment_id, 'custom_markup'=>$custom_markup));
$markup_name = avia_markup_helper(array('context' => 'name','echo'=>false, 'id'=>$attachment_id, 'custom_markup'=>$custom_markup));
if(trim($title) != "") $title = "<h2 {$title_styling} class='avia-caption-title' $markup_name>".trim(apply_filters('avf_slideshow_title', $title))."</h2>";
if(is_array($content)) $content = implode(' ',$content); //temp fix for trim() expects string warning until I can actually reproduce the problem
if(trim($content) != "") $content = "<div class='avia-caption-content {$content_class}' {$markup_description} {$content_styling}>".ShortcodeHelper::avia_apply_autop(ShortcodeHelper::avia_remove_autop(trim($content)))."</div>";
if(trim($title.$content.$button_html) != "")
{
if(trim($title) != "" && trim($button_html) != "" && trim($content) == "") $content = "<br/>";
if($this->config['handle'] == 'av_slideshow_full' || $this->config['handle'] == 'av_fullscreen')
{
$caption .= '<div class = "caption_fullwidth av-slideshow-caption '.$caption_pos.'">';
$caption .= '<div class = "container caption_container">';
$caption .= '<div class = "slideshow_caption">';
$caption .= '<div class = "slideshow_inner_caption">';
$caption .= '<div class = "slideshow_align_caption">';
$caption .= $title;
$caption .= $content;
$caption .= $button_html;
$caption .= '</div>';
$caption .= '</div>';
$caption .= '</div>';
$caption .= '</div>';
$caption .= '</div>';
}
else
{
$caption = '<div class="avia-caption av-slideshow-caption"><div class="avia-inner-caption">'.$title.$content."</div></div>";
}
}
if(!empty($this->config['perma_caption']) && empty($this->config['caption_override']))
{
$this->config['caption_override'] = $caption;
}
if(!empty($this->config['caption_override'])) $caption = "";
if(!empty($img[0]))
{
$slider_data .= $this->config['bg_slider'] == "true" ? "style='background-position:{$position};' data-img-url='".$img[0]."'" : "";
if($slider_data )
{
if(empty($this->ie8_fallback))
{
$this->ie8_fallback .= "<!--[if lte IE 8]>";
$this->ie8_fallback .= "<style type='text/css'>";
}
$this->ie8_fallback .= "\n #{$this->config['css_id']} .slide-{$counter}{";
$this->ie8_fallback .= "\n -ms-filter: \"progid:DXImageTransform.Microsoft.AlphaImageLoader(src='{$img[0]}', sizingMethod='scale')\"; ";
$this->ie8_fallback .= "\n filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='{$img[0]}', sizingMethod='scale'); ";
$this->ie8_fallback .= "\n } \n";
}
}
// $img[0] = 'http://www.kriesi.at/themes/enfold-photography/files/2014/08/darkened_girl.jpg';
$html .= "<li {$slider_data} class='{$extra_class} slide-{$counter} ' >";
$html .= "<".$tags[0]." data-rel='slideshow-".avia_slideshow::$slider."' class='avia-slide-wrap' {$linkdescription} >{$caption}";
if($this->config['bg_slider'] != "true" && empty($video))
{
$html .= "<img src='".$img[0]."' width='".$img[1]."' height='".$img[2]."' title='".$linktitle."' alt='".$linkalt."' $markup_url />";
}
$html .= $video;
$html .= $this->create_overlay($meta);
$html .= "</".$tags[1].">";
$html .= "</li>";
if( $counter === 1 )
{
if(!empty($img[1]) && !empty($img[2]))
{
$this->config['default-height'] = (100/$img[1]) * $img[2];
}
}
}
else
{
$this->slide_count --;
}
}
if(!empty($this->ie8_fallback))
{
$this->ie8_fallback .= "</style> <![endif]-->";
add_action('wp_footer', array($this, 'add_ie8_fallback_to_footer'));
}
return $html;
}
public function add_ie8_fallback_to_footer()
{
// echo $this->ie8_fallback;
}
protected function slideshow_cta_button($link, $link_target, $button_color, $button_label, $button_count)
{
$button_html = "";
$blank = (strpos($link_target, '_blank') !== false || $link_target == 'yes') ? ' target="_blank" ' : "";
$blank .= strpos($link_target, 'nofollow') !== false ? ' rel="nofollow" ' : "";
$link = AviaHelper::get_url($link);
$button_html .= "<a href='{$link}' {$blank} class='avia-slideshow-button avia-button avia-color-{$button_color} {$button_count}' data-duration='800' data-easing='easeInOutQuad'>";
$button_html .= $button_label;
$button_html .= "</a>";
return $button_html;
}
protected function slide_navigation_arrows()
{
global $avia_config;
$html = "";
$html .= "<div class='avia-slideshow-arrows avia-slideshow-controls'>";
$html .= "<a href='#prev' class='prev-slide' ".av_icon_string('prev_big').">".__('Previous','avia_framework' )."</a>";
$html .= "<a href='#next' class='next-slide' ".av_icon_string('next_big').">".__('Next','avia_framework' )."</a>";
$html .= "</div>";
return $html;
}
protected function slide_navigation_dots()
{
$html = "";
$html .= "<div class='avia-slideshow-dots avia-slideshow-controls'>";
$active = "active";
for($i = 1; $i <= $this->slide_count; $i++)
{
$html .= "<a href='#{$i}' class='goto-slide {$active}' >{$i}</a>";
$active = "";
}
$html .= "</div>";
return $html;
}
protected function slide_navigation_preview_images()
{
$html = "";
$html .= "<div class='avia-slideshow-dots avia-slideshow-preview avia-slideshow-controls'>";
$active = "active";
$markup_url = avia_markup_helper(array('context' => 'image_url','echo'=>false, 'custom_markup'=>$this->config['custom_markup']));
foreach( $this->id_array as $id ) {
if( isset( $this->slides[$id] ) ) {
$slide = $this->slides[$id];
$counter ++;
$img = wp_get_attachment_image_src($slide->ID, 'portfolio_small');
$imgalt = get_post_meta($slide->ID, '_wp_attachment_image_alt', true);
$imgalt = !empty($imgalt) ? esc_attr($imgalt) : '';
$imgtitle = trim($slide->post_title) ? esc_attr($slide->post_title) : "";
if($imgtitle == "-") $imgtitle = "";
$html .= "<a href='#{$counter}' class='goto-slide goto-preview {$active} ' >";
$html .= "<img src='".$img[0]."' width='".$img[1]."' height='".$img[2]."' title='".$imgtitle."' alt='".$imgalt."' $markup_url />";
$html .= "</a>";
$active = "";
}
}
$html .= "</div>";
return $html;
}
protected function extract_subslides($slide_array)
{
$this->config['ids']= array();
$this->subslides = array();
foreach($slide_array as $key => $slide)
{
$this->subslides[$key] = $slide;
$this->config['ids'][] = $slide['attr']['id'];
if( empty($slide['attr']['id']) && !empty($slide['attr']['video']) && $slide['attr']['slide_type'] === 'video')
{
$this->config['video_counter'] ++ ;
}
}
$this->config['ids'] = implode(',',$this->config['ids'] );
unset($this->config['content']);
}
protected function create_overlay($meta)
{
extract($meta);
/*check/create overlay*/
$overlay = "";
if(!empty($overlay_enable))
{
$overlay_src = "";
$overlay = "opacity: {$overlay_opacity}; ";
if(!empty($overlay_color)) $overlay .= "background-color: {$overlay_color}; ";
if(!empty($overlay_pattern))
{
if($overlay_pattern == "custom")
{
$overlay_src = $overlay_custom_pattern;
}
else
{
$overlay_src = str_replace('{{AVIA_BASE_URL}}', AVIA_BASE_URL, $overlay_pattern);
}
}
if(!empty($overlay_src)) $overlay .= "background-image: url({$overlay_src}); background-repeat: repeat;";
$overlay = "<div class='av-section-color-overlay' style='{$overlay}'></div>";
}
return $overlay;
}
}
}
if ( !class_exists( 'avia_slideshow_video_helper' ) )
{
class avia_slideshow_video_helper
{
static function set_video_slide($video_url, $service = false, $meta = false)
{
$video = "";
if(empty($service)) $service = self::which_video_service($video_url);
$uid = 'player_'.get_the_ID().'_'.mt_rand().'_'.mt_rand();
$controls = empty($meta['video_controls']) ? 1 : 0;
$loop = empty($meta['video_loop']) ? 0 : 1;
switch( $service )
{
case "html5": $video = "<div class='av-click-overlay'></div>".avia_html5_video_embed($video_url); break;
case "iframe":$video = $video_url; break;
case "youtube":
$explode_at = strpos($video_url, 'youtu.be/') !== false ? "/" : "v=";
$video_url = explode($explode_at, trim($video_url));
$video_url = end($video_url);
$video_id = $video_url;
//if parameters are appended make sure to create the correct video id
if (strpos($video_url,'?') !== false || strpos($video_url,'?') !== false)
{
preg_match('!(.+)[&?]!',$video_url, $video_id);
$video_id = isset($video_id[1]) ? $video_id[1] : $video_id[0];
}
$video_data = apply_filters( 'avf_youtube_video_data', array(
'autoplay' => 0,
'videoid' => $video_id,
'hd' => 1,
'rel' => 0,
'wmode' => 'opaque',
'playlist' => $uid,
'loop' => 0,
'version' => 3,
'autohide' => 1,
'color' => 'white',
'controls' => $controls,
'showinfo' => 0,
'iv_load_policy'=> 3
));
$data = AviaHelper::create_data_string($video_data);
$video = "<div class='av-click-overlay'></div><div class='mejs-mediaelement'><div height='1600' width='900' class='av_youtube_frame' id='{$uid}' {$data}></div></div>";
break;
case "vimeo":
$color = ltrim( avia_get_option('colorset-main_color-primary'), '#');
$autopause = empty($meta['video_section_bg']) ? 1 : 0; //pause if another vimeo video plays?
$video_url = explode('/', trim($video_url));
$video_url = end($video_url);
$video_url = esc_url(add_query_arg(
array(
'portrait' => 0,
'byline' => 0,
'title' => 0,
'badge' => 0,
'loop' => $loop,
'autopause' => $autopause,
'api' => 1,
'rel' => 0,
'player_id' => $uid,
'color' => $color
),
'//player.vimeo.com/video/'.$video_url
));
$video_url = apply_filters( 'avf_vimeo_video_url' , $video_url);
$video = "<div class='av-click-overlay'></div><div class='mejs-mediaelement'><iframe src='{$video_url}' height='1600' width='900' frameborder='' class='av_vimeo_frame' id='{$uid}'></iframe></div>";
break;
}
return $video;
}
//get the video service based on the url string fo the video
static function which_video_service($video_url)
{
$service = "";
if(avia_backend_is_file($video_url, 'html5video'))
{
$service = "html5";
}
else if(strpos($video_url,'<iframe') !== false)
{
$service = "iframe";
}
else
{
if(strpos($video_url, 'youtube.com/watch') !== false || strpos($video_url, 'youtu.be/') !== false)
{
$service = "youtube";
}
else if(strpos($video_url, 'vimeo.com') !== false)
{
$service = "vimeo";
}
}
return $service;
}
}
}
#top .yanco-preview-images {
padding-bottom: 50px;
.av_slideshow_full.avia-slideshow {
overflow: visible;
}
.avia-slideshow-preview.avia-slideshow-dots.avia-slideshow-controls {
text-align: center;
padding-right: 0px;
background-color: $color-white-f7;
bottom: -51px;
a {
overflow: visible;
width: 80px;
@include border-radius(0px);
height: inherit;
opacity: 1;
filter: alpha(opacity=100);
bottom: 0px;
}
}
.goto-preview.active {
opacity: 0.3 !important;
}
}