/********************************************
 * REVOLUTION 5.4.6.3 EXTENSION - VIDEO FUNCTIONS
 * @version: 2.1.8 (01.11.2017)
 * @requires jquery.themepunch.revolution.js
 * @author ThemePunch
*********************************************/
(function($) {
	"use strict";
var _R = jQuery.fn.revolution,
	_ISM = _R.is_mobile(),
	_ANDROID = _R.is_android(),
	extension = {	alias:"Video Min JS",
					name:"revolution.extensions.video.min.js",
					min_core: "5.4.6.3",
					version:"2.1.8"
			  };



///////////////////////////////////////////
// 	EXTENDED FUNCTIONS AVAILABLE GLOBAL  //
///////////////////////////////////////////
jQuery.extend(true,_R, {

	
	preLoadAudio : function(li,opt) {
		if (_R.compare_version(extension).check==="stop") return false;
		li.find('.tp-audiolayer').each(function() {

			var element = jQuery(this),
				obj = {};
			if (element.find('audio').length===0) {
				obj.src =  element.data('videomp4') !=undefined ? element.data('videomp4')  : '',
				obj.pre = element.data('videopreload') || '';
				if (element.attr('id')===undefined) element.attr('audio-layer-'+Math.round(Math.random()*199999));
				obj.id = element.attr('id');
				obj.status = "prepared";
				obj.start = jQuery.now();
				obj.waittime = element.data('videopreloadwait')*1000 || 5000;


				if (obj.pre=="auto" || obj.pre=="canplaythrough" || obj.pre=="canplay" || obj.pre=="progress") {				
					if (opt.audioqueue===undefined) opt.audioqueue = [];					
					opt.audioqueue.push(obj);
					_R.manageVideoLayer(element,opt);
				}
			}
		});	
	},

	preLoadAudioDone : function(nc,opt,event) {	
		
		if (opt.audioqueue && opt.audioqueue.length>0)
			jQuery.each(opt.audioqueue,function(i,obj) {
				if (nc.data('videomp4') === obj.src && (obj.pre === event || obj.pre==="auto")) {				
					obj.status = "loaded";
				}
			});
	},

	resetVideo : function(_nc,opt,preset) {	
		var _ = _nc.data();	
		switch (_.videotype) {
			case "youtube":
				
				var player=_.player;
			 	try{
					if (_.forcerewind=="on") {  //Removed Force Rewind Protection for Handy here !!!						
						var s = getStartSec(_nc.data('videostartat')),
							wasdead = s==-1 ? true : false,
							forceseek =  _.bgvideo===1 || _nc.find('.tp-videoposter').length>0 ? true : false;
												
						if (_.player!=undefined) {														
							//if ((s!==0 && !wasdead) || forceseek) {
								s= s==-1 ? 0 : s;
								_.player.seekTo(s);													
								_.player.pauseVideo();
							//}
						}
					}					
				} catch(e) {}
				if (_nc.find('.tp-videoposter').length==0 && _.bgvideo!==1 && preset!==true) 
					punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});	
				
			break;

			case "vimeo":
				var f = _nc.data('vimeoplayer');	
			 	try{
					if (_.forcerewind=="on") 	{	  //Removed Force Rewind Protection for Handy here !!!					
						var s = getStartSec(_.videostartat),
							ct = 0,
							wasdead = s==-1 ? true : false,
							forceseek =  _.bgvideo===1 || _nc.find('.tp-videoposter').length>0 ? true : false;
						s= s==-1 ? 0 : s;							
						//if ((s!==0 && !wasdead) || forceseek) {	
							f.seekTo(s);								
							f.pause();				
						//}					
					}					
				} catch(e) {}
				if (_nc.find('.tp-videoposter').length==0 && _.bgvideo!==1 && preset!==true)
					punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
			break;

			case "html5":
				if (_ISM && _.disablevideoonmobile==1) return false;			
		
				var tag = _.audio=="html5" ? "audio" : "video",
					jvideo = _nc.find(tag),
					video = jvideo[0];

				
				punchgs.TweenLite.to(jvideo,0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
				
				if (_.forcerewind=="on" && !_nc.hasClass("videoisplaying")) {
					try{
						
						var s = getStartSec(_.videostartat);					
						video.currentTime = s == -1 ? 0 : s;	
					} catch(e) {}
				}

				if (_.volume=="mute" || _R.lastToggleState(_nc.videomutetoggledby) || opt.globalmute===true)
					video.muted = true;			
			break;
		}
	},


	isVideoMuted : function(_nc,opt) {
		var muted = false,
			_ = _nc.data();
		switch (_.videotype) {
			case "youtube":
				try{
					var player=_.player;	
					muted = player.isMuted();										
				} catch(e) {}
			break;
			case "vimeo":
				try{
					// var f = _.vimeoplayer;
					if (_.volume=="mute")
						muted = true;	
					
				} catch(e) {}
			break;
			case "html5":
				var tag = _.audio=="html5" ? "audio" : "video",
					jvideo = _nc.find(tag),
					video = jvideo[0];

				if (video.muted)
					muted = true;							
			break;
		}	
		return muted;	
	},

	muteVideo : function(_nc,opt) {		
		var _ = _nc.data();	
		switch (_.videotype) {
			case "youtube":
				try{
					var player=_.player;	
					
					player.mute();										
				} catch(e) {}
			break;
			case "vimeo":
				try{
					var f = _nc.data('vimeoplayer');
					_nc.data('volume',"mute");
					f.setVolume(0);
				} catch(e) {}
			break;
			case "html5":
				var tag = _.audio=="html5" ? "audio" : "video",
					jvideo = _nc.find(tag),
					video = jvideo[0];
				video.muted = true;
			break;
		}		
	},

	unMuteVideo : function(_nc,opt) {	
		if (opt.globalmute===true) return;
		var _ = _nc.data();
		switch (_.videotype) {
			case "youtube":
				try{
					var player=_.player;						
					player.unMute();										
				} catch(e) {}
			break;
			case "vimeo":
				try{
					var f = _nc.data('vimeoplayer');
					_nc.data('volume',"1");
					f.setVolume(1);					
				} catch(e) {}
			break;
			case "html5":
				var tag = _.audio=="html5" ? "audio" : "video",
					jvideo = _nc.find(tag),
					video = jvideo[0];
				video.muted = false;
			break;
		}		
	},

	



	stopVideo : function(_nc,opt) {	
		
		var _ = _nc.data();
		if (!opt.leaveViewPortBasedStop) 
			opt.lastplayedvideos = [];

		opt.leaveViewPortBasedStop = false;
		
		switch (_.videotype) {
			case "youtube":

				//if (_ISM) return;
				try{

					var player=_.player;	
					
					if (player.getPlayerState()===2 || player.getPlayerState()===5) return;
					player.pauseVideo();	
					_.youtubepausecalled = true;
					setTimeout(function() {
						_.youtubepausecalled=false;
					},80);										
				} catch(e) {
					console.log("Issue at YouTube Video Pause:");
					console.log(e);
				}
			break;
			case "vimeo":

				try{
					var f = _nc.data('vimeoplayer');
					f.pause();
					_.vimeopausecalled = true;
					setTimeout(function() {
						_.vimeopausecalled=false;
					},80);					

				} catch(e) { 
					console.log("Issue at Vimeo Video Pause:");
					console.log(e);
				}
			break;
			case "html5":
				var tag = _.audio=="html5" ? "audio" : "video",
					jvideo = _nc.find(tag),
					video = jvideo[0];
				if (jvideo!=undefined && video!=undefined) {
					
					video.pause();						
				}
			break;
		}		
	},

	playVideo : function(_nc,opt) {		
		
		clearTimeout(_nc.data('videoplaywait'));		
		var _ = _nc.data();
		switch (_.videotype) {
			case "youtube":				

				if (_nc.find('iframe').length==0) {
					_nc.append(_nc.data('videomarkup'));						
					addVideoListener(_nc,opt,true);
				} else {										
					if (_.player.playVideo !=undefined) {									
						
						var s = getStartSec(_nc.data('videostartat')),
							ct = _.player.getCurrentTime();
							if (_nc.data('nextslideatend-triggered')==1) {
								ct=-1;
								_nc.data('nextslideatend-triggered',0);
							}
						if (s!=-1 && s>ct) _.player.seekTo(s);			
						if (_.youtubepausecalled!==true)
							_.player.playVideo();
					} else {
						_nc.data('videoplaywait',setTimeout(function() {							
							if (_.youtubepausecalled!==true) _R.playVideo(_nc,opt);
						},50));
					}
				}
			break;
			case "vimeo":		
				
				if (_nc.find('iframe').length==0) {		
					_nc.removeData('vimeoplayer');
					_nc.append(_nc.data('videomarkup'));			
					addVideoListener(_nc,opt,true);
					
				} else {	
						if (_nc.hasClass("rs-apiready")) {
							var id = _nc.find('iframe').attr("id"),
								f;
								
								if(!_nc.data('vimeoplayer')) {
									f = new Vimeo.Player(id);
									_nc.data('vimeoplayer', f);
								}
								else {
									f = _nc.data('vimeoplayer');	
								}
								
								/*
								if (!f.hasOwnProperty('play')) {	
										_nc.data('videoplaywait',setTimeout(function() {	
											if (_.vimeopausecalled!==true)
												_R.playVideo(_nc,opt);
										},50));								
								*/
								//} else {																																											
									setTimeout(function() {			
										
										f.play();
										var s = getStartSec(_nc.data('videostartat')),
											ct = _nc.data('currenttime');										
										if (_nc.data('nextslideatend-triggered')==1) {
											ct=-1;
											_nc.data('nextslideatend-triggered',0);
										}
										if (s!=-1 && s>ct) f.seekTo(s);		
									},510);	
								//}	
								
						} else {
							_nc.data('videoplaywait',setTimeout(function() {	
								if (_.vimeopausecalled!==true)
								_R.playVideo(_nc,opt);
							},50));
						}
				}
			break;
			case "html5":
				//if (_ISM && _nc.data('disablevideoonmobile')==1) return false;			

				
				var tag = _.audio=="html5" ? "audio" : "video",
					jvideo = _nc.find(tag),
					video = jvideo[0],
					html5vid = jvideo.parent();

				if (html5vid.data('metaloaded') != 1) {						
					addEvent(video,'loadedmetadata',function(_nc) {								
						_R.resetVideo(_nc,opt);
						video.play();
						var s = getStartSec(_nc.data('videostartat')),
							ct = video.currentTime;
						if (_nc.data('nextslideatend-triggered')==1) {
								ct=-1;
								_nc.data('nextslideatend-triggered',0);
							}
						if (s!=-1 && s>ct) video.currentTime = s;
					}(_nc));
				} else {		
					video.play();					
					var s = getStartSec(_nc.data('videostartat')),
						ct = video.currentTime;
					if (_nc.data('nextslideatend-triggered')==1) {
							ct=-1;
							_nc.data('nextslideatend-triggered',0);
						}
					if (s!=-1 && s>ct) video.currentTime = s;										
				}
			break;
		}
	},

	isVideoPlaying : function(_nc,opt) {
		
		var ret = false;
		if (opt.playingvideos != undefined) {
			jQuery.each(opt.playingvideos,function(i,nc) {
				if (_nc.attr('id') == nc.attr('id'))					
					ret = true;													
			});
		}		
		return ret;
	},

	removeMediaFromList : function(_nc,opt) {
		remVidfromList(_nc,opt);
	},

	prepareCoveredVideo : function(asprat,opt,nextcaption) {
		var ifr = nextcaption.find('iframe, video'),
			wa = asprat.split(':')[0],
			ha = asprat.split(':')[1],
			li = nextcaption.closest('.tp-revslider-slidesli'),
			od = li.width()/li.height(),
			vd = wa/ha,
			nvh = (od/vd)*100,
			nvw = (vd/od)*100;	

		if (od>vd) 																
			punchgs.TweenLite.to(ifr,0.001,{height:nvh+"%", width:"100%", top:-(nvh-100)/2+"%",left:"0px",position:"absolute"});
		else 
			punchgs.TweenLite.to(ifr,0.001,{width:nvw+"%", height:"100%", left:-(nvw-100)/2+"%",top:"0px",position:"absolute"});
		
		if (!ifr.hasClass("resizelistener")) {			
			ifr.addClass("resizelistener");		
			jQuery(window).resize(function() {
				clearTimeout(ifr.data('resizelistener'));
				ifr.data('resizelistener',setTimeout(function() {
					_R.prepareCoveredVideo(asprat,opt,nextcaption);
				},30));				
			})
		}
	},

	checkVideoApis : function(_nc,opt,addedApis) {		
		var httpprefix = location.protocol === 'https:' ? "https" : "http";
				
		if ((_nc.data('ytid')!=undefined  || _nc.find('iframe').length>0 && _nc.find('iframe').attr('src').toLowerCase().indexOf('youtube')>0)) opt.youtubeapineeded = true;
		if ((_nc.data('ytid')!=undefined  || _nc.find('iframe').length>0 &&  _nc.find('iframe').attr('src').toLowerCase().indexOf('youtube')>0) && addedApis.addedyt==0) {
			opt.youtubestarttime = jQuery.now();
			addedApis.addedyt=1;
			var s = document.createElement("script");								
			s.src = "https://www.youtube.com/iframe_api"; /* Load Player API*/
			var before = document.getElementsByTagName("script")[0],
				loadit = true;
			jQuery('head').find('*').each(function(){
				if (jQuery(this).attr('src') == "https://www.youtube.com/iframe_api")
				   loadit = false;
			});
			if (loadit) before.parentNode.insertBefore(s, before);

		}



		if ((_nc.data('vimeoid')!=undefined || _nc.find('iframe').length>0 && _nc.find('iframe').attr('src').toLowerCase().indexOf('vimeo')>0)) opt.vimeoapineeded = true;	
	  	if ((_nc.data('vimeoid')!=undefined || _nc.find('iframe').length>0 && _nc.find('iframe').attr('src').toLowerCase().indexOf('vimeo')>0) && addedApis.addedvim==0) {
			opt.vimeostarttime = jQuery.now();
			addedApis.addedvim=1;
			var f = document.createElement("script"),
				before = document.getElementsByTagName("script")[0],
				loadit = true;
			f.src = "https://player.vimeo.com/api/player.js"; /* Load Player API*/							

			jQuery('head').find('*').each(function(){
				if (jQuery(this).attr('src') == "https://player.vimeo.com/api/player.js")
				   loadit = false;
			});
			if (loadit)
				before.parentNode.insertBefore(f, before);
		}
		return addedApis;
	},

	manageVideoLayer : function(_nc,opt,recalled,internrecalled) {	
		if (_R.compare_version(extension).check==="stop") return false;			
		// YOUTUBE AND VIMEO LISTENRES INITIALISATION		
		var _ = _nc.data(),
			vida = _.videoattributes,
			vidytid = _.ytid,
			vimeoid = _.vimeoid,
			videopreload = _.videopreload === "auto" || _.videopreload === "canplay" || _.videopreload === "canplaythrough" || _.videopreload === "progress" ? "auto" : _.videopreload,
			videomp = _.videomp4,
			videowebm = _.videowebm,
			videoogv = _.videoogv,
			videoafs = _.allowfullscreenvideo,
			videocontrols = _.videocontrols,
			httpprefix = "http",
			videoloop = _.videoloop=="loop" ? "loop" : _.videoloop=="loopandnoslidestop" ? "loop" : "",
			videotype = (videomp!=undefined || videowebm!=undefined) ? "html5" : 
						(vidytid!=undefined && String(vidytid).length>1) ? "youtube" : 
						(vimeoid!=undefined && String(vimeoid).length>1) ? "vimeo" : "none",
			tag = _.audio=="html5" ? "audio" : "video",
			newvideotype = (videotype=="html5" && _nc.find(tag).length==0) ? "html5" : 
						(videotype=="youtube" && _nc.find('iframe').length==0) ? "youtube" : 
						(videotype=="vimeo" && _nc.find('iframe').length==0) ? "vimeo" : "none";

			// VideLoop reset if Next Slide at End is set ! 
			videoloop = _.nextslideatend === true ? "" : videoloop;


		_.videotype = videotype;
		// ADD HTML5 VIDEO IF NEEDED
		switch (newvideotype) {
			case "html5":

				if (videocontrols!="controls") videocontrols="";
				var tag = "video";

				//_nc.data('audio',"html5");
				if (_.audio=="html5") {
					tag = "audio";
					_nc.addClass("tp-audio-html5");
				}
				
				/*
					JASON:
					HTML5 Video Mod
				*/
				// var _funcs = opt.fallbacks.allowHTML5AutoPlayOnAndroid ? "muted playsinline" : ""; 
				var _funcs = '';
				
				if(tag === 'video') {
					
					if (_R.is_mobile() || _R.isSafari11()) { /* updated to account for Safari 11 */

						if(_.autoplay === 'on' || _.autoplay === 'true' || _.autoplay === true) {
							_funcs = 'muted playsinline autoplay';
						}
						else if(_.videoinline == true || _.videoinline === 'true' || _.videoinline === 1) {
							_funcs += ' playsinline';
						}
					}	
				}
				
				var apptxt = '<'+tag+' '+_funcs+' style="object-fit:cover;background-size:cover;visible:hidden;width:100%; height:100%" class="" '+videoloop+' preload="'+videopreload+'">';
				
				if (videopreload=="auto") opt.mediapreload = true;
				//if (_.videoposter!=undefined) apptxt = apptxt + 'poster="'+_nc.data('videoposter')+'">';
				if (videowebm!=undefined && _R.get_browser().toLowerCase()=="firefox") apptxt = apptxt + '<source src="'+videowebm+'" type="video/webm" />';
				if (videomp!=undefined) apptxt = apptxt + '<source src="'+videomp+'" type="video/mp4" />';
				if (videoogv!=undefined) apptxt = apptxt + '<source src="'+videoogv+'" type="video/ogg" />';
				apptxt = apptxt + '</'+tag+'>';
				var hfm ="";
				if (videoafs==="true" ||  videoafs===true)
					hfm = '<div class="tp-video-button-wrap"><button  type="button" class="tp-video-button tp-vid-full-screen">Full-Screen</button></div>';

				if (videocontrols=="controls")
					apptxt = apptxt + ('<div class="tp-video-controls">'+
										  '<div class="tp-video-button-wrap"><button type="button" class="tp-video-button tp-vid-play-pause">Play</button></div>'+
										  '<div class="tp-video-seek-bar-wrap"><input  type="range" class="tp-seek-bar" value="0"></div>'+
										  '<div class="tp-video-button-wrap"><button  type="button" class="tp-video-button tp-vid-mute">Mute</button></div>'+
										  '<div class="tp-video-vol-bar-wrap"><input  type="range" class="tp-volume-bar" min="0" max="1" step="0.1" value="1"></div>'+
										  hfm+
										  '</div>');
				
				_nc.data('videomarkup',apptxt)
				_nc.append(apptxt);


				// START OF HTML5 VIDEOS
				if ((_ISM && _nc.data('disablevideoonmobile')==1) ||_R.isIE(8)) _nc.find(tag).remove();

				// ADD HTML5 VIDEO CONTAINER				
				_nc.find(tag).each(function(i) {
					var video = this,
						jvideo = jQuery(this);

					if (!jvideo.parent().hasClass("html5vid"))
						jvideo.wrap('<div class="html5vid" style="position:relative;top:0px;left:0px;width:100%;height:100%; overflow:hidden;"></div>');

					var html5vid = jvideo.parent();
					if (html5vid.data('metaloaded') != 1) {
						addEvent(video,'loadedmetadata',function(_nc) {		
							htmlvideoevents(_nc,opt);
							_R.resetVideo(_nc,opt);						
						}(_nc));
					} 								
				});			
			break;
			case "youtube":
				httpprefix = "https";	
			/*	if (location.protocol === 'https:')	
					httpprefix = "https";		*/
				if (videocontrols=="none") {					
			 		vida = vida.replace("controls=1","controls=0");
			 		if (vida.toLowerCase().indexOf('controls')==-1)
			 		  vida = vida+"&controls=0";
			 	}
			 	if (_.videoinline===true || _.videoinline==="true" || _.videoinline===1 || _nc.hasClass('rs-background-video-layer'))
			 		vida = vida + "&playsinline=1";
			 	var	s = getStartSec(_nc.data('videostartat')),
			 		e = getStartSec(_nc.data('videoendat'));
							 	
			 	if (s!=-1) vida=vida+"&start="+s;
			 	if (e!=-1) vida=vida+"&end="+e;

				// CHECK VIDEO ORIGIN, AND EXTEND WITH WWW IN CASE IT IS MISSING !
			 	var orig = vida.split('origin='+httpprefix+'://'),
			 		vida_new = "";
			 				 	
			 	if (orig.length>1) {
			 		vida_new = orig[0]+'origin='+httpprefix+'://';
			 		if (self.location.href.match(/www/gi) && !orig[1].match(/www/gi)) 						 	 						 		
			 				vida_new=vida_new+"www."
			 		vida_new=vida_new+orig[1];
			 	} else {
			 		vida_new = vida;
			 	}	
			 	
			 	var yafv = videoafs==="true" ||  videoafs===true ? "allowfullscreen" : "";		 	
			 	_nc.data('videomarkup','<iframe type="text/html" src="'+httpprefix+'://www.youtube.com/embed/'+vidytid+'?'+vida_new+'" '+yafv+' width="100%" height="100%" style="opacity:0;visibility:hidden;width:100%;height:100%"></iframe>');
			break;

			case "vimeo":
			//	if (location.protocol === 'https:')
				httpprefix = "https";												
				_nc.data('videomarkup','<iframe src="'+httpprefix+'://player.vimeo.com/video/'+vimeoid+'?'+vida+'" webkitallowfullscreen mozallowfullscreen allowfullscreen width="100%" height="100%" style="opacity:0;visibility:hidden;100%;height:100%"></iframe>');
				
			break;
		}
		
		//if (videotype=="vimeo" || videotype=="youtube") {
		
		// IF VIDEOPOSTER EXISTING		
		var noposteronmobile = _ISM && _nc.data('noposteronmobile')=="on";
		
		if (_.videoposter!=undefined && _.videoposter.length>2 && !noposteronmobile) {
			if (_nc.find('.tp-videoposter').length==0)
				_nc.append('<div class="tp-videoposter noSwipe" style="cursor:pointer; position:absolute;top:0px;left:0px;width:100%;height:100%;z-index:3;background-image:url('+_.videoposter+'); background-size:cover;background-position:center center;"></div>');				
			if (_nc.find('iframe').length==0)
			_nc.find('.tp-videoposter').click(function() {					
				_R.playVideo(_nc,opt);															
				if (_ISM) {
					if (_nc.data('disablevideoonmobile')==1) return false;						
					punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
					punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});
				}
			})
		} else {
			if  (_ISM && _nc.data('disablevideoonmobile')==1) return false;			
			if (_nc.find('iframe').length==0 && (videotype=="youtube" || videotype=="vimeo")) {	
				_nc.removeData('vimeoplayer');
				_nc.append(_nc.data('videomarkup'));
				addVideoListener(_nc,opt,false);
			}
		}
		
		// ADD DOTTED OVERLAY IF NEEDED
		if (_nc.data('dottedoverlay')!="none" && _nc.data('dottedoverlay')!=undefined && _nc.find('.tp-dottedoverlay').length!=1)
			_nc.append('<div class="tp-dottedoverlay '+_nc.data('dottedoverlay')+'"></div>');
		
		_nc.addClass("HasListener");	

		if (_nc.data('bgvideo')==1) {
			punchgs.TweenLite.set(_nc.find('video, iframe'),{autoAlpha:0});
		}
	}
	
});





//////////////////////////////////////////////////////
// * Revolution Slider - VIDEO / API FUNCTIONS		//
// * @version: 1.0 (30.10.2014)						//
// * @author ThemePunch								//
//////////////////////////////////////////////////////

function getStartSec(st) {						
	return st == undefined ? -1 :jQuery.isNumeric(st) ? st : st.split(":").length>1 ? parseInt(st.split(":")[0],0)*60 + parseInt(st.split(":")[1],0) : st;
};

// 	-	VIMEO ADD EVENT /////
var addEvent = function(element, eventName, callback) {
	if (element.addEventListener)
		element.addEventListener(eventName, callback, {capture:false,passive:true});
	else
		element.attachEvent(eventName, callback, {capture:false,passive:true});
};

var getVideoDatas = function(p,t,d) {
	var a = {};
	a.video = p;
	a.videotype = t;
	a.settings = d;
	return a;
}


var addVideoListener = function(_nc,opt,startnow) {
	
	var _=_nc.data(),
		ifr = _nc.find('iframe'),
		frameID = "iframe"+Math.round(Math.random()*100000+1),
		loop = _.videoloop,
		pforv = loop != "loopandnoslidestop";

	
	loop = loop =="loop" ||  loop =="loopandnoslidestop";
	

	// CARE ABOUT ASPECT RATIO

	if (_nc.data('forcecover')==1) {
		_nc.removeClass("fullscreenvideo").addClass("coverscreenvideo");			
		var asprat = _nc.data('aspectratio');														
		if (asprat!=undefined && asprat.split(":").length>1) {			
			// console.log("i")
			_R.prepareCoveredVideo(asprat,opt,_nc);
		}
	}
	
	if (_nc.data('bgvideo')==1) {
		var asprat = _nc.data('aspectratio');														
		if (asprat!=undefined && asprat.split(":").length>1)  {		
			// console.log("ak")
			_R.prepareCoveredVideo(asprat,opt,_nc);
		}
	}



	// IF LISTENER DOES NOT EXIST YET			
	ifr.attr('id',frameID);		

	if (startnow) _nc.data('startvideonow',true);

	if (_nc.data('videolistenerexist')!==1) {	
		switch (_.videotype) {
			// YOUTUBE LISTENER
			case "youtube":				
				var player = new YT.Player(frameID, {
					events: {						
						"onStateChange": function(event) {		
							
							var container = _nc.closest('.tp-simpleresponsive'),
								videorate = _.videorate,
								videostart = _nc.data('videostart'),							 								 	
							 	fsmode = checkfullscreenEnabled();
							
							if (event.data == YT.PlayerState.PLAYING) {								
								punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
								punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});							
								if (_nc.data('volume')=="mute" || _R.lastToggleState(_nc.data('videomutetoggledby')) || opt.globalmute===true) {
									  player.mute();									  
								 } else {
									  player.unMute();
									  player.setVolume(parseInt(_nc.data('volume'),0) || 75);
								}

								opt.videoplaying=true;									
								addVidtoList(_nc,opt);	
								if (pforv) 
									opt.c.trigger('stoptimer');
								else
									opt.videoplaying=false;								
																	
								opt.c.trigger('revolution.slide.onvideoplay',getVideoDatas(player,"youtube",_nc.data()));
								_R.toggleState(_.videotoggledby);													
								
							} else {							
								if (event.data==0 && loop) {
									//player.playVideo();
									var s = getStartSec(_nc.data('videostartat'));
									if (s!=-1) player.seekTo(s);
									player.playVideo();		
									_R.toggleState(_.videotoggledby);							
								}
								
								if (!fsmode && (event.data==0 || event.data==2) && ((_nc.data('showcoveronpause')=="on" && _nc.find('.tp-videoposter').length>0) || (_nc.data('bgvideo')===1 && _nc.find('.rs-fullvideo-cover').length>0))) {
									if (_nc.data('bgvideo')===1) 
										punchgs.TweenLite.to(_nc.find('.rs-fullvideo-cover'),0.1,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});
									else
										punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.1,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});
									punchgs.TweenLite.to(_nc.find('iframe'),0.1,{autoAlpha:0,ease:punchgs.Power3.easeInOut});																			
								} 
								if ((event.data!=-1 && event.data!=3)) {
																		
									opt.videoplaying=false;									
									opt.tonpause = false;
									
									remVidfromList(_nc,opt);
									container.trigger('starttimer');
									opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(player,"youtube",_nc.data()));
									
									if (opt.currentLayerVideoIsPlaying==undefined || opt.currentLayerVideoIsPlaying.attr("id") == _nc.attr("id"))									
										_R.unToggleState(_.videotoggledby);
									
								} 
								
								if (event.data==0 && _nc.data('nextslideatend')==true) {
									exitFullscreen();
									_nc.data('nextslideatend-triggered',1);
									opt.c.revnext();
									remVidfromList(_nc,opt);
								} else {									
									remVidfromList(_nc,opt);
									opt.videoplaying=false;
									container.trigger('starttimer');
									opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(player,"youtube",_nc.data()));
									if (opt.currentLayerVideoIsPlaying==undefined || opt.currentLayerVideoIsPlaying.attr("id") == _nc.attr("id"))									
										_R.unToggleState(_.videotoggledby);
								}
							}
						},
						'onReady': function(event) {	
							
							/*
								Jason, YouTube Autoplay
							*/
							
							var playerMuted,
								isVideoMobile = _R.is_mobile(),
								isVideoLayer = _nc.hasClass('tp-videolayer');
								
							if(isVideoMobile || _R.isSafari11()) {
								
								var isLayerAutoPlay = isVideoLayer && _nc.data('autoplay') !== 'off';
								if(_nc.hasClass('rs-background-video-layer') || isLayerAutoPlay) {
									
									var isSpecial = isVideoMobile && isVideoLayer;
									if(!isSpecial) {
									
										playerMuted = true;
										player.setVolume(0);
										_nc.data('volume', 'mute');
										player.mute();
										
										clearTimeout(_nc.data('mobilevideotimr'));
										_nc.data('mobilevideotimr', setTimeout(function() {player.playVideo();}, 500));
										
									}
									
								}
								
							}
							
							if(!playerMuted && _nc.data('volume')=="mute") {
								player.setVolume(0);
								player.mute();
							}
							
							var videorate = _.videorate,
								videostart = _nc.data('videostart');
								
							_nc.addClass("rs-apiready");
							if (videorate!=undefined)
								event.target.setPlaybackRate(parseFloat(videorate));
							
							// PLAY VIDEO IF THUMBNAIL HAS BEEN CLICKED
							_nc.find('.tp-videoposter').unbind("click");
							_nc.find('.tp-videoposter').click(function() {										
								 if (!_ISM) {
									 player.playVideo();
								}
							})

							if (_nc.data('startvideonow')) {
								
								_.player.playVideo();	
								var s = getStartSec(_nc.data('videostartat'));
								if (s!=-1) _.player.seekTo(s);
								//_nc.find('.tp-videoposter').click();
							}
							_nc.data('videolistenerexist',1);					
						}
					}
				});			
				_nc.data('player',player);
			break;

			// VIMEO LISTENER
			case "vimeo":
				var isrc = ifr.attr('src'),
					queryParameters = {}, queryString = isrc,
					re = /([^&=]+)=([^&]*)/g, m;
				// Creates a map with the query string parameters
				while (m = re.exec(queryString)) {
					queryParameters[decodeURIComponent(m[1])] = decodeURIComponent(m[2]);
				}
				if (queryParameters['player_id']!=undefined)
					isrc = isrc.replace(queryParameters['player_id'],frameID);
				else
					isrc=isrc+"&player_id="+frameID;
				try{ isrc = isrc.replace('api=0','api=1'); } catch(e) {}
				// isrc=isrc+"&api=1";
				
				var isVideoMobile = _R.is_mobile(),
					deviceCheck = isVideoMobile || _R.isSafari11(),
					isVideoBg = _nc.hasClass('rs-background-video-layer');
				
				// adds "playsinline" to the video from the Vimeo side
				// will work for both "pro/plus" and regular videos
				// only works on desktop for some reason
				if(deviceCheck && isVideoBg) isrc += '&background=1';
				ifr.attr('src',isrc);
				
				var player = _nc.find('iframe')[0],
					vimcont = jQuery('#'+frameID),
					f;

				if(!_nc.data('vimeoplayer')) {
					f = new Vimeo.Player(frameID);
					_nc.data('vimeoplayer', f);
				}
				else {
					f = _nc.data('vimeoplayer');
				}
				
				if(deviceCheck) {
					
					var toMute;
					if(isVideoBg) {
						toMute = true;
					}
					else {	
						var isAutoplay = _nc.data('autoplay');
						if(isAutoplay === 'on' || isAutoplay === 'true' || isAutoplay === true) {
							if(isVideoMobile) _nc.data('autoplay', false);
							toMute = true;
						}
						
					}
					
					if(toMute) {
						f.setVolume(0);
						_nc.data('volume', 'mute');
					}
					
				}
					
				_nc.addClass("rs-apiready");
				
				f.on('play', function(data) {							
					_nc.data('nextslidecalled',0);
					punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
					punchgs.TweenLite.to(_nc.find('iframe'),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});							
					opt.c.trigger('revolution.slide.onvideoplay',getVideoDatas(f,"vimeo",_nc.data()));
					opt.videoplaying=true;
					
					addVidtoList(_nc,opt);
					if (pforv) 
						opt.c.trigger('stoptimer');
					else
						opt.videoplaying=false;
					if (_nc.data('volume')=="mute" || _R.lastToggleState(_nc.data('videomutetoggledby')) || opt.globalmute===true)
					  f.setVolume(0);
					else
					  f.setVolume(parseInt(_nc.data('volume'),0)/100 || 0.75);
					_R.toggleState(_.videotoggledby);
				});

				f.on('playProgress',function(data) {					
					var et = getStartSec(_nc.data('videoendat'))							
					
					_nc.data('currenttime',data.seconds);
					if (et!=0 && (Math.abs(et-data.seconds) <0.3 && et>data.seconds) && _nc.data('nextslidecalled') != 1) {																
						if (loop) {								
							
							f.play();								
							var s = getStartSec(_nc.data('videostartat'));
							if (s!=-1) f.seekTo(s);				
						} else {									
							if (_nc.data('nextslideatend')==true) {	
								_nc.data('nextslideatend-triggered',1);			
								_nc.data('nextslidecalled',1);			
								opt.c.revnext();							
							}
							f.pause();
						}
					}
				});

				f.on('finish', function(data) {
						remVidfromList(_nc,opt);
						opt.videoplaying=false;
						opt.c.trigger('starttimer');
						opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(f,"vimeo",_nc.data())); 
						if (_nc.data('nextslideatend')==true) {
							_nc.data('nextslideatend-triggered',1);
							opt.c.revnext();
						}
						if (opt.currentLayerVideoIsPlaying==undefined || opt.currentLayerVideoIsPlaying.attr("id") == _nc.attr("id"))
							_R.unToggleState(_.videotoggledby);
						
				});

				f.on('pause', function(data) {
						if (((_nc.data('showcoveronpause')=="on" && _nc.find('.tp-videoposter').length>0) || (_nc.data('bgvideo')===1 && _nc.find('.rs-fullvideo-cover').length>0))) {
							if (_nc.data('bgvideo')===1) 
								punchgs.TweenLite.to(_nc.find('.rs-fullvideo-cover'),0.1,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});
							else
								punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.1,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});							
							punchgs.TweenLite.to(_nc.find('iframe'),0.1,{autoAlpha:0,ease:punchgs.Power3.easeInOut});
						} 
						opt.videoplaying=false;
						opt.tonpause = false;
						
						remVidfromList(_nc,opt);
						opt.c.trigger('starttimer');
						opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(f,"vimeo",_nc.data())); 
						if (opt.currentLayerVideoIsPlaying==undefined || opt.currentLayerVideoIsPlaying.attr("id") == _nc.attr("id"))
							_R.unToggleState(_.videotoggledby);
				});
				
				
				
				_nc.find('.tp-videoposter').unbind("click");
				_nc.find('.tp-videoposter').click(function() {							 
					 if (!_ISM) { 
						
						f.play();
						return false;
					 }
				})
				if (_nc.data('startvideonow')) {	
						
						f.play();
						var s = getStartSec(_nc.data('videostartat'));
						if (s!=-1) f.seekTo(s);					
				}
				_nc.data('videolistenerexist',1);
				if(isVideoBg) f.play();
			
			break;
		}
	} else {
		var s = getStartSec(_nc.data('videostartat'));
		switch (_.videotype) {
			// YOUTUBE LISTENER
			case "youtube":
				if (startnow) {
					_.player.playVideo();	
					if (s!=-1) _.player.seekTo()
				}
			break;
			case "vimeo":
				if (startnow) {
					
					var f = _nc.data('vimeoplayer');
					f.play();			
					if (s!=-1) f.seekTo(s);					
				}
			break;
		}
	}
}


var exitFullscreen = function() {
  if(document.exitFullscreen) {
    document.exitFullscreen();
  } else if(document.mozCancelFullScreen) {
    document.mozCancelFullScreen();
  } else if(document.webkitExitFullscreen) {
    document.webkitExitFullscreen();
  }
}


var checkfullscreenEnabled = function() {
   try{
	    // FF provides nice flag, maybe others will add support for this later on?
	    if(window['fullScreen'] !== undefined) {
	      return window.fullScreen;
	    }
	    // 5px height margin, just in case (needed by e.g. IE)
	    var heightMargin = 5;
	    if(jQuery.browser.webkit && /Apple Computer/.test(navigator.vendor)) {
	      // Safari in full screen mode shows the navigation bar, 
	      // which is 40px  
	      heightMargin = 42;
	    }
	    return screen.width == window.innerWidth &&
	        Math.abs(screen.height - window.innerHeight) < heightMargin;
	  } catch(e) {

	  }
  }
/////////////////////////////////////////	HTML5 VIDEOS 	///////////////////////////////////////////	

var htmlvideoevents = function(_nc,opt,startnow) {



	if (_ISM && _nc.data('disablevideoonmobile')==1) return false;			
	var _ = _nc.data(),
		tag = _.audio=="html5" ? "audio" : "video",
		jvideo = _nc.find(tag),
		video = jvideo[0],
		html5vid = jvideo.parent(),
		loop = _.videoloop,
		pforv = loop != "loopandnoslidestop";

	loop = loop =="loop" ||  loop =="loopandnoslidestop";

	html5vid.data('metaloaded',1);
	// FIRST TIME LOADED THE HTML5 VIDEO

	if (_nc.data('bgvideo')==1 && (_.videoloop==="none" || _.videoloop===false)) 		
		pforv = false;
	
	
								
	
	//PLAY, STOP VIDEO ON CLICK OF PLAY, POSTER ELEMENTS
	if (jvideo.attr('control') == undefined ) {
		if (_nc.find('.tp-video-play-button').length==0 && !_ISM)
			_nc.append('<div class="tp-video-play-button"><i class="revicon-right-dir"></i><span class="tp-revstop">&nbsp;</span></div>');
		_nc.find('video, .tp-poster, .tp-video-play-button').click(function() {
			if (_nc.hasClass("videoisplaying"))
				video.pause();
			else
				video.play();
		})
	}

	// PRESET FULLCOVER VIDEOS ON DEMAND
	if (_nc.data('forcecover')==1 || _nc.hasClass('fullscreenvideo') || _nc.data('bgvideo')==1)  {
		if (_nc.data('forcecover')==1 || _nc.data('bgvideo')==1) {
			html5vid.addClass("fullcoveredvideo");	
			var asprat = _nc.data('aspectratio') || "4:3";		
			_R.setSize(opt);
			_R.prepareCoveredVideo(asprat,opt,_nc);
		}
		else
			html5vid.addClass("fullscreenvideo");				
	}
	

	// FIND CONTROL BUTTONS IN VIDEO, AND ADD EVENT LISTENERS ON THEM
	var playButton = _nc.find('.tp-vid-play-pause')[0],
		muteButton = _nc.find('.tp-vid-mute')[0],
		fullScreenButton = _nc.find('.tp-vid-full-screen')[0],
		seekBar = _nc.find('.tp-seek-bar')[0],
		volumeBar = _nc.find('.tp-volume-bar')[0];

	if (playButton!=undefined) {
		// Event listener for the play/pause button
		addEvent(playButton,"click", function() {
			if (video.paused == true) 
				video.play();
			else
				video.pause();
		});
	}

	if (muteButton!=undefined) {

		// Event listener for the mute button
		addEvent(muteButton,"click", function() {
			if (video.muted == false) {
				video.muted = true;
				muteButton.innerHTML = "Unmute";
			} else {
				video.muted = false;
				muteButton.innerHTML = "Mute";
			}
		});
	}

	if (fullScreenButton!=undefined) {

		// Event listener for the full-screen button
		if (fullScreenButton)
			addEvent(fullScreenButton,"click", function() {
				if (video.requestFullscreen) {
					video.requestFullscreen();
				} else if (video.mozRequestFullScreen) {
					video.mozRequestFullScreen(); // Firefox
				} else if (video.webkitRequestFullscreen) {
					video.webkitRequestFullscreen(); // Chrome and Safari
				}
			});

	}

	if (seekBar !=undefined) {

		// Event listener for the seek bar
		addEvent(seekBar,"change", function() {							
			var time = video.duration * (seekBar.value / 100);							
			video.currentTime = time;											

		});

		// Pause the video when the seek handle is being dragged
		addEvent(seekBar,"mousedown", function() {
			_nc.addClass("seekbardragged");
			video.pause();

		});

		// Play the video when the seek handle is dropped
		addEvent(seekBar,"mouseup", function() {
			_nc.removeClass("seekbardragged");
			video.play();

		});
	}

	addEvent(video,"canplaythrough", function() {
		_R.preLoadAudioDone(_nc,opt,"canplaythrough");
	});

	addEvent(video,"canplay", function() {
		_R.preLoadAudioDone(_nc,opt,"canplay");
	});

	addEvent(video,"progress", function() {
		_R.preLoadAudioDone(_nc,opt,"progress");
	});

	// Update the seek bar as the video plays
	addEvent(video,"timeupdate", function() {						
		

		var value = (100 / video.duration) * video.currentTime,
			et = getStartSec(_nc.data('videoendat')),
			cs  =video.currentTime;	
		if (seekBar != undefined)	
			seekBar.value = value;	
		
		if (et!=0 && et!=-1 && (Math.abs(et-cs) <=0.3 && et>cs) && _nc.data('nextslidecalled') != 1) {			

			if (loop) {
				video.play();
				var s = getStartSec(_nc.data('videostartat'));
				if (s!=-1) video.currentTime = s;				
			} else {

				
				if (_nc.data('nextslideatend')==true) {							
					_nc.data('nextslideatend-triggered',1);		
					_nc.data('nextslidecalled',1);						
					opt.just_called_nextslide_at_htmltimer = true; 
					opt.c.revnext();						
					setTimeout(function() {
						opt.just_called_nextslide_at_htmltimer = false;
					},1000);
				}
				video.pause();
			}
		}
	});

	
	if (volumeBar != undefined) {		

		// Event listener for the volume bar
		addEvent(volumeBar,"change", function() {
			// Update the video volume
			video.volume = volumeBar.value;
		});
	}


	// VIDEO EVENT LISTENER FOR "PLAY"
	addEvent(video,"play",function() {

		_nc.data('nextslidecalled',0);
		
		var vol = _nc.data('volume');
		vol = vol!=undefined && vol!="mute" ?parseFloat(vol)/100 : vol;
		
		// JASON
		// if (!_ANDROID) {
			
		if (!_R.is_mobile() && !_R.isSafari11()) {
			if (opt.globalmute===true) 
				video.muted = true;
			else
				video.muted = false;

			if (vol>1) vol = vol/100;
									
			if (vol=="mute")
				video.muted=true;
			else
			if (vol!=undefined) 
				video.volume = vol;
		}


		_nc.addClass("videoisplaying");

		var tag = _.audio=="html5" ? "audio" : "video";

		addVidtoList(_nc,opt);

		if (!pforv || tag=="audio") {				
			opt.videoplaying=false;
			if (tag!="audio")  opt.c.trigger('starttimer');
			opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(video,"html5",_));
		} else {				
			opt.videoplaying=true;
			opt.c.trigger('stoptimer');
			opt.c.trigger('revolution.slide.onvideoplay',getVideoDatas(video,"html5",_));				
		}

		punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:0,force3D:"auto",ease:punchgs.Power3.easeInOut});
		punchgs.TweenLite.to(_nc.find(tag),0.3,{autoAlpha:1,display:"block",ease:punchgs.Power3.easeInOut});	

		var playButton = _nc.find('.tp-vid-play-pause')[0],
			muteButton = _nc.find('.tp-vid-mute')[0];
		if (playButton!=undefined)
			playButton.innerHTML = "Pause";
		if (muteButton!=undefined && video.muted)
			muteButton.innerHTML = "Unmute";

		_R.toggleState(_.videotoggledby);
	});

	// VIDEO EVENT LISTENER FOR "PAUSE"
	addEvent(video,"pause",function(e) {

		var tag = _.audio=="html5" ? "audio" : "video",
			fsmode = checkfullscreenEnabled();
		
		

		if (!fsmode && _nc.find('.tp-videoposter').length>0 && _nc.data('showcoveronpause')=="on" && !_nc.hasClass("seekbardragged")) {
			punchgs.TweenLite.to(_nc.find('.tp-videoposter'),0.3,{autoAlpha:1,force3D:"auto",ease:punchgs.Power3.easeInOut});
			punchgs.TweenLite.to(_nc.find(tag),0.3,{autoAlpha:0,ease:punchgs.Power3.easeInOut});
		} 
		
		_nc.removeClass("videoisplaying");
		opt.videoplaying=false;
		remVidfromList(_nc,opt);
		if (tag!="audio")  opt.c.trigger('starttimer');
		opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(video,"html5",_nc.data()));
		var playButton = _nc.find('.tp-vid-play-pause')[0];
		if (playButton!=undefined)
			playButton.innerHTML = "Play";		

		if (opt.currentLayerVideoIsPlaying==undefined || opt.currentLayerVideoIsPlaying.attr("id") == _nc.attr("id"))
			_R.unToggleState(_.videotoggledby);
	});

	// VIDEO EVENT LISTENER FOR "END"
	

	addEvent(video,"ended",function() {		
		exitFullscreen();
		
		remVidfromList(_nc,opt);
		opt.videoplaying=false;
		remVidfromList(_nc,opt);
		if (tag!="audio") opt.c.trigger('starttimer');
		opt.c.trigger('revolution.slide.onvideostop',getVideoDatas(video,"html5",_nc.data()));


		if (_nc.data('nextslideatend')===true && video.currentTime>0) {	
			
			if (!opt.just_called_nextslide_at_htmltimer==true) {
				_nc.data('nextslideatend-triggered',1);
				opt.c.revnext();
				opt.just_called_nextslide_at_htmltimer = true;
			}			
			setTimeout(function() {				
				opt.just_called_nextslide_at_htmltimer = false;
			},1500)
		}
		_nc.removeClass("videoisplaying");
		
		
	});		
}



var addVidtoList = function(_nc,opt) {

	if (opt.playingvideos == undefined) opt.playingvideos = new Array();		
	
	// STOP OTHER VIDEOS
	if (_nc.data('stopallvideos')) {		
		if (opt.playingvideos != undefined && opt.playingvideos.length>0) { 
			opt.lastplayedvideos = jQuery.extend(true,[],opt.playingvideos);
			jQuery.each(opt.playingvideos,function(i,_nc) {
				_R.stopVideo(_nc,opt);
			});
		}			
	}	
	opt.playingvideos.push(_nc);	
	opt.currentLayerVideoIsPlaying = _nc;		
	
}


var remVidfromList = function(_nc,opt) {			
	if (opt.playingvideos != undefined && jQuery.inArray(_nc,opt.playingvideos)>=0)
		opt.playingvideos.splice(jQuery.inArray(_nc,opt.playingvideos),1);		
}





	

})(jQuery);