/********************************************

 * REVOLUTION 5.4.2 EXTENSION - KEN BURN

 * @version: 1.3.1 (15.05.2017)

 * @requires jquery.themepunch.revolution.js

 * @author ThemePunch

*********************************************/

(function($) {

"use strict";

var _R = jQuery.fn.revolution,

	extension = {	alias:"KenBurns Min JS",

					name:"revolution.extensions.kenburn.min.js",

					min_core: "5.4",

					version:"1.3.1"

			  };



///////////////////////////////////////////

// 	EXTENDED FUNCTIONS AVAILABLE GLOBAL  //

///////////////////////////////////////////

jQuery.extend(true,_R, {



	stopKenBurn : function(l) {		

		if (_R.compare_version(extension).check==="stop") return false;



		if (l.data('kbtl')!=undefined)			

		l.data('kbtl').pause();				

	},



	startKenBurn :  function(l,opt,prgs) {		



		if (_R.compare_version(extension).check==="stop") return false;



		var d = l.data(),

			i = l.find('.defaultimg'),

			s = i.data('lazyload') || i.data('src'),

			i_a = d.owidth / d.oheight,

			cw = opt.sliderType==="carousel" ?  opt.carousel.slide_width : opt.ul.width(),

			ch = opt.ul.height(),

			c_a = cw / ch;



		

		if (l.data('kbtl'))

			l.data('kbtl').kill();

		



		prgs = prgs || 0;



	

		// NO KEN BURN IMAGE EXIST YET

		if (l.find('.tp-kbimg').length==0) {

			var mediafilter = i.data('mediafilter');

			mediafilter = mediafilter === undefined ? "" : mediafilter;

			l.append('<div class="tp-kbimg-wrap '+mediafilter+'" style="z-index:2;width:100%;height:100%;top:0px;left:0px;position:absolute;"><img class="tp-kbimg" src="'+s+'" style="position:absolute;" width="'+d.owidth+'" height="'+d.oheight+'"></div>');

			l.data('kenburn',l.find('.tp-kbimg'));

		}



		var getKBSides = function(w,h,f,cw,ch,ho,vo) {			

					var tw = w * f,

						th = h * f,

						hd = Math.abs(cw-tw),

						vd = Math.abs(ch-th),

						s = new Object();

					s.l = (0-ho)*hd;

					s.r = s.l + tw;			

					s.t = (0-vo)*vd;

					s.b = s.t + th;	

					s.h = ho;

					s.v = vo;

					return s;

				},



			getKBCorners = function(d,cw,ch,ofs,o) {



				var p = d.bgposition.split(" ") || "center center",

					ho = p[0] == "center"  ? "50%" : p[0] == "left" || p [1] == "left" ? "0%" : p[0]=="right" || p[1] =="right" ? "100%" : p[0],

					vo = p[1] == "center" ? "50%" : p[0] == "top" || p [1] == "top" ? "0%" : p[0]=="bottom" || p[1] =="bottom" ? "100%" : p[1];

				

				ho = parseInt(ho,0)/100 || 0;

				vo = parseInt(vo,0)/100 || 0;





				var sides = new Object();





				sides.start = getKBSides(o.start.width,o.start.height,o.start.scale,cw,ch,ho,vo);

				sides.end = getKBSides(o.start.width,o.start.height,o.end.scale,cw,ch,ho,vo);

							

				return sides;	

			},



			kcalcL = function(cw,ch,d) {				

				var f=d.scalestart/100,

					fe=d.scaleend/100,

					ofs = d.offsetstart != undefined ? d.offsetstart.split(" ") || [0,0] : [0,0],

					ofe = d.offsetend != undefined ? d.offsetend.split(" ") || [0,0] : [0,0];

				d.bgposition = d.bgposition == "center center" ? "50% 50%" : d.bgposition;

				

				

				var o = new Object(),

					sw = cw*f,

					sh = sw/d.owidth * d.oheight,

					ew = cw*fe,

					eh = ew/d.owidth * d.oheight;		





				

				o.start = new Object();		

				o.starto = new Object();

				o.end = new Object();

				o.endo = new Object();

				

				o.start.width = cw;

				o.start.height = o.start.width / d.owidth * d.oheight;		



				if (o.start.height<ch) {

					var newf = ch / o.start.height;

					o.start.height = ch;

					o.start.width = o.start.width*newf;

				}

				o.start.transformOrigin = d.bgposition;					

				o.start.scale = f;	

				o.end.scale = fe;



				d.rotatestart = d.rotatestart===0 ? 0.01 : d.rotatestart;

				o.start.rotation = d.rotatestart+"deg";

				o.end.rotation = d.rotateend+"deg";		

				

				// MAKE SURE THAT OFFSETS ARE NOT TOO HIGH

				var c = getKBCorners(d,cw,ch,ofs,o);





				ofs[0] = parseFloat(ofs[0]) + c.start.l;

				ofe[0] = parseFloat(ofe[0]) + c.end.l;

				

				ofs[1] = parseFloat(ofs[1]) + c.start.t;			

				ofe[1] = parseFloat(ofe[1]) + c.end.t;

					

				var iws = c.start.r - c.start.l,

					ihs	= c.start.b - c.start.t,

					iwe = c.end.r - c.end.l,

					ihe	= c.end.b - c.end.t;

						

				ofs[0] = ofs[0]>0 ? 0 : iws + ofs[0] < cw ? cw-iws : ofs[0];

				ofe[0] = ofe[0]>0 ? 0 : iwe + ofe[0] < cw ? cw-iwe : ofe[0];

				

				ofs[1] = ofs[1]>0 ? 0 : ihs + ofs[1] < ch ? ch-ihs : ofs[1];

				ofe[1] = ofe[1]>0 ? 0 : ihe + ofe[1] < ch ? ch-ihe : ofe[1];



				



				o.starto.x = ofs[0]+"px";

				o.starto.y = ofs[1]+"px";

				o.endo.x = ofe[0]+"px";

				o.endo.y = ofe[1]+"px";				

				o.end.ease = o.endo.ease = d.ease;

				o.end.force3D = o.endo.force3D = true;

				return o;

			};

		

		if (l.data('kbtl')!=undefined) {

			l.data('kbtl').kill();

			l.removeData('kbtl');

		}



		var k = l.data('kenburn'),

			kw = k.parent(),

			anim = kcalcL(cw,ch,d),

			kbtl =  new punchgs.TimelineLite();

		

		

		kbtl.pause();





		

		anim.start.transformOrigin = "0% 0%";

		anim.starto.transformOrigin = "0% 0%";	



		kbtl.add(punchgs.TweenLite.fromTo(k,d.duration/1000,anim.start,anim.end),0);

		kbtl.add(punchgs.TweenLite.fromTo(kw,d.duration/1000,anim.starto,anim.endo),0);



		// ADD BLUR EFFECT ON THE ELEMENTS

		if (d.blurstart!==undefined && d.blurend!==undefined &&  (d.blurstart!==0 || d.blurend!==0)) {

			var blurElement = {a:d.blurstart},				

				blurElementEnd = {a:d.blurend, ease:anim.endo.ease},

				blurAnimation = new punchgs.TweenLite(blurElement, d.duration/1000, blurElementEnd);



			blurAnimation.eventCallback("onUpdate", function(kw) {				

				punchgs.TweenLite.set(kw,{filter:'blur('+blurElement.a+'px)',webkitFilter:'blur('+blurElement.a+'px)'});

			},[kw]);

			kbtl.add(blurAnimation,0);			

		}

			

		kbtl.progress(prgs);

		kbtl.play();	

		

		l.data('kbtl',kbtl);														

	}		

});



})(jQuery);