diff -r 000000000000 -r d970ebf37754 wp/wp-content/plugins/codecanyon-3027163-content-timeline-responsive-wordpress-plugin/js/frontend/jquery.timeline.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wp/wp-content/plugins/codecanyon-3027163-content-timeline-responsive-wordpress-plugin/js/frontend/jquery.timeline.js Wed Nov 06 03:21:17 2013 +0000 @@ -0,0 +1,841 @@ +/* + +Content Timeline 3.1 + +Date organised content slider. + +Copyright (c) 2012 Br0 (shindiristudio.com) + +Project site: http://codecanyon.net/ +Project demo: http://shindiristudio.com/timeline + +*/ + +(function($){ + + // EVENTS.timeline + + // init.timeline : triggered when timeline is initialised + // scrollStart.timeline : triggered when item move animation starts + // scrollEnd.timeline : triggered when item move animation ends + // itemOpen.timeline : triggered on click to open item + // itemClose.timeline : triggered on click to close item + + // --------------------------------------------------------- + + // On KeyPress (left) : trigger $.timeline('left') + // On KeyPress (right) : trigger $.timeline('right') + + // --------------------------------------------------------- + + // $.timeline(METHODS) + + // $.timeline('init') : initialises timeline + // $.timeline('destroy') : clears timeline data + // $.timeline('left') : moves one left by one element + // $.timeline('right') : moves right by one element + // $.timeline('open', id) : opens element with 'data-id' = id + // $.timeline('close', id): closes element with 'data-id' = id + // $.timeline('goTo', id) : goes to element width 'data-id' = id + + + var t_methods = { + init : function( options ) { + + // Default settings + var settings = $.extend( { + 'itemClass' : '.item', // class used for timeline items + 'itemOpenClass' : '.item_open', // class used for item details + 'openTriggerClass' : '.item', // class of read more element (default uses whole item to trigger open event) + 'closeText' : 'Close', // text of close button in open item + 'itemMargin' : 10, // spacing between items + 'scrollSpeed' : 500, // animation speed + 'startItem' : 'last', // timeline start item id, 'last' or 'first' can be used insted + 'easing' : 'easeOutSine', // jquery.easing function for animations, + 'categories' : ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], // categories shown above timeline (months are default) + 'nuberOfSegments' : [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], // number of elements per category (number of days) + 'yearsOn' : true, // show years (can be any number you use in data-id (elementNumber/category/yearOrSomeOtherNumber)) + 'swipeOn' : true, // turn on swipe moving function + 'hideTimeline' : false, + 'hideControles' : false + }, options); // Setings + + + // main queries + var $this = this, + $body = $('body'), + $items = $this.find(settings.itemClass), + $itemsOpen = $this.find(settings.itemOpenClass), + itemWidth = $items.first().width(), + itemOpenWidth = $itemsOpen.first().width(); + + // Trigger init event + $this.trigger('init.Timeline'); + + + // If no index found + var startIndex = $items.length-1; + + // Find index of start element + if(settings.startItem == 'first') + { + startIndex = 0; + } + else if (settings.startItem == 'last') + { + startIndex = $items.length-1; + } + else { + $items.each(function(index){ + if(settings.startItem == $(this).attr('data-id')) + { + startIndex = index; + return true; + } + }); + } + $items.each(function(index){ + $(this).attr('data-count', index); + $(this).next(settings.itemOpenClass).attr('data-count', index); + if(!$(this).hasClass(settings.openTriggerClass)) { + $(this).find(settings.openTriggerClass).attr('data-count', index); + } + }); + + // Create wrapper elements, and needed properties + $this.append('
'); + $this.css({width: '100%', 'overflow' : 'hidden', marginLeft : 'auto', marginRight : 'auto','text-align': 'center', height:0}); + $this.wrapInner('
'); + $this.find('.timeline_items').css('text-align','left'); + if(!settings.hideControles) { + $this.append('
'); + } + + // ZoomOut placement fix + $this.wrapInner('
'); + $this.find('.timeline_items_holder').css({width: '300px', marginLeft : 'auto', marginRight : 'auto'}); + + + $items.css({paddingLeft:0 , paddingRight:0, marginLeft: settings.itemMargin/2, marginRight: settings.itemMargin/2, float: 'left', position:'relative'}); + + $itemsOpen.each(function(){ + $(this).prepend('
'+settings.closeText+'
'); + $(this).wrapInner('
').find('div:first').css({position: 'relative'}); + $(this).css({width: 0, padding:0 , margin: 0, float: 'left', display : 'none', position : 'relative', overflow : 'hidden'}); + }); + + + // Get new queries + var $iholder = $this.find('.timeline_items:first'), + $line = $this.find('.t_line_wrapper:first'), + margin = 300/2 - (itemWidth + settings.itemMargin)*(1/2 + startIndex) , + width = (itemWidth + settings.itemMargin)*$items.length + (itemOpenWidth + settings.itemMargin) + 660 , + data = $this.data('timeline'); + + // Set margin so start element would place in midle of the screen + $iholder.css({width: width, marginLeft: margin}); + + + + + // If the plugin hasn't been initialized yet + if (!data){ + $this.data('timeline', { + currentIndex : startIndex, + itemCount : $items.length, + margin : margin, + itemWidth : itemWidth, + itemOpenWidth : itemOpenWidth, + lineMargin : 0, + lineViewCount : 0, + options : settings, + items : $items, + iholder : $iholder, + open : false, + noAnimation : false, + marginResponse: false, + mousedown : false, + mousestartpos : 0 + }); + } + if(!settings.hideTimeline) { + $this.timeline('createElements'); + } + + + + // Bind keyLeft and KeyRight functions + $(document).keydown(function(e){ + if (e.keyCode == 37) { + $this.timeline('left'); + return false; + } + if (e.keyCode == 39) { + $this.timeline('right'); + return false; + } + }); + + // Respond to window resizing + $(window).resize(function() { + //var id = $this.find('.active:first').attr('href').substr(1); + var data = $this.data('timeline'), + id = $items.eq(data.currentIndex).attr('data-id'); + item_data_count = $items.eq(data.currentIndex).attr('data-count'); + + itemWidth = $items.first().width(), + itemOpenWidth = $itemsOpen.first().find('div:first').width(); + + data.margin += data.itemCount*(data.itemWidth-itemWidth); + data.itemWidth = itemWidth; + + if(data.open) data.margin += (data.itemOpenWidth-itemOpenWidth)/2; + data.itemOpenWidth = itemOpenWidth; + + + if($('body').width() < 767 && data.open && !data.marginResponse) { + data.margin -= (itemWidth+settings.itemMargin)/2; + data.marginResponse = true; + } + else if($('body').width() >= 767 && data.marginResponse && data.open) { + data.margin += (itemWidth+settings.itemMargin)/2; + data.marginResponse = false; + } + + data.noAnimation = true; + $this.timeline('goTo', id, item_data_count); + }); + + // Bind left on click + $this.find('.t_left').click(function(){ + $this.timeline('left'); + }); + + // Bind right on click + $this.find('.t_right').click(function(){ + $this.timeline('right'); + }); + + // SWIPE bind + + if(settings.swipeOn) { + $items.find('*').each(function(){ + $(this).css({'-webkit-touch-callout': 'none', + '-webkit-user-select': 'none', + '-khtml-user-select': 'none', + '-moz-user-select': 'none', + '-ms-user-select': 'none', + 'user-select': 'none'}); + }); + $this.bind('touchstart',function(e){ + $this.timeline('touchStart', e.originalEvent.touches[0].pageX); + }); + + + $this.find(settings.itemClass).mousedown(function(e){ + $this.timeline('mouseDown', e.pageX); + }); + + + $(document).bind('touchend',function(e){ + data = $this.data('timeline'); + $this.timeline('touchEnd', data.touchpos); + }); + + $(document).mouseup(function(e){ + var data = $this.data('timeline'); + if(data.mousedown) { + $this.timeline('mouseUp', e.pageX); + } + }); + } + + + + // Bind open on click + $this.find(settings.openTriggerClass).click(function(){ + $this.timeline('goTo',$(this).attr('data-id'), $(this).attr('data-count'), true); + }); + + // Bind close on click + $this.find('.t_close').click(function(){ + $this.timeline('close',$(this).attr('data-id'),$(this).attr('data-count')); + }); + + // Show when loaded + $this.css({height: 'auto'}).show(); + $this.prev('.timelineLoader').hide(); + + // Reposition nodes due to their width + $this.find('.t_line_node').each(function(){ + if($(this).width() < 10) $(this).width(12); + $(this).css({marginLeft: -$(this).width()/2}); + }); + return $this; + }, + + // Clear data + destroy : function( ) { + $(document).unbind('mouseup'); + $(window).unbind('resize'); + var $this = this, + data = $this.data('timeline'); + $this.removeData('timeline'); + + }, + + touchStart : function(xpos) { + var $this = this, + data = $this.data('timeline'), + xmargin = 0; + data.mousedown = true; + data.mousestartpos = xpos; + + $this.bind('touchmove', function(e){ + data.touchpos = e.originalEvent.touches[0].pageX; + xmargin = data.margin - xpos + e.originalEvent.touches[0].pageX; + data.iholder.css('marginLeft', xmargin + 'px'); + }); + }, + + mouseDown : function(xpos) { + var $this = this, + data = $this.data('timeline'), + xmargin = 0; + data.mousedown = true; + data.mousestartpos = xpos; + + $('body').css('cursor','move'); + $(document).mousemove(function(e){ + xmargin = data.margin - xpos + e.pageX; + data.iholder.css('marginLeft', xmargin + 'px'); + }); + }, + + touchEnd : function(xpos) { + var $this = this, + data = $this.data('timeline'), + itemWidth = data.itemWidth + data.options.itemMargin, + itemC = data.currentIndex, + mod = 0, + xmargin = xpos - data.mousestartpos; + data.mousedown = false; + + itemC -= parseInt(xmargin/itemWidth); + mod = xmargin%itemWidth; + if (xmargin < 0 && mod < -itemWidth/2) { + itemC++; + } + if (xmargin > 0 && mod > itemWidth/2) { + itemC--; + } + + if(itemC < 0) { + itemC = 0; + } + if(itemC >= data.itemCount) { + itemC = data.itemCount-1; + } + + $this.timeline('goTo', data.items.eq(itemC).attr('data-id'), data.items.eq(itemC).attr('data-count')); + }, + + mouseUp : function(xpos) { + + var $this = this, + data = $this.data('timeline'), + itemWidth = data.itemWidth + data.options.itemMargin, + itemC = data.currentIndex, + mod = 0, + xmargin = xpos - data.mousestartpos; + data.mousedown = false; + + $(document).unbind('mousemove'); + $('body').css('cursor','auto'); + + itemC -= parseInt(xmargin/itemWidth); + mod = xmargin%itemWidth; + if (xmargin < 0 && mod < -itemWidth/2) { + itemC++; + } + if (xmargin > 0 && mod > itemWidth/2) { + itemC--; + } + + if(itemC < 0) { + itemC = 0; + } + if(itemC >= data.itemCount) { + itemC = data.itemCount-1; + } + + $this.timeline('goTo', data.items.eq(itemC).attr('data-id'), data.items.eq(itemC).attr('data-count')); + + + }, + + open : function (id, data_count) { + var $this = this, + data = $this.data('timeline'), + $items = $this.find(data.options.itemOpenClass), + speed = data.options.scrollSpeed, + width = data.itemOpenWidth, + easing = data.options.easin, + itemMargin = data.options.itemMargin; + + + $items.each(function(){ + if ($(this).attr('data-id') == id) { + if (!data_count || data_count == $(this).attr('data-count')) { + var $newThis = $(this); + // Trigger itemOpen event + $this.trigger('itemOpen.Timeline'); + data.open_count = data_count; + // Open content and move margin + $(this).stop(true).show().animate({width: width, marginLeft: itemMargin/2, marginRight: itemMargin/2,}, speed, easing); + + if (typeof $(this).attr('data-access') != 'undefined' && $(this).attr('data-access') != '') { + var action = $(this).attr('data-access'); + $.post(action, function(data){ + + $('body').append(''); + $('.ajax_preloading_holder').html(data); + if ($('.ajax_preloading_holder img').length > 0 ) { + $('.ajax_preloading_holder img').load(function() { + $newThis.find('.item_open_content').html(data); + $('.ajax_preloading_holder').remove(); + $(this).attr('data-access', ''); + $newThis.find('.scrollable-content').mCustomScrollbar(); + $newThis.find("a[rel^='prettyPhoto']").prettyPhoto(); + $newThis.find('.timeline_rollover_bottom').timelineRollover('bottom'); + }); + } + else { + $newThis.find('.item_open_content').html(data); + $('.ajax_preloading_holder').remove(); + $(this).attr('data-access', ''); + } + }); + } + + if($('body').width() < 767) { + data.margin -= (data.itemWidth+data.options.itemMargin)/2; + data.marginResponse = true; + } + else { + data.marginResponse = false; + } + data.margin -= (width + data.options.itemMargin + data.itemWidth)/2 - data.itemWidth/2; + data.iholder.stop(true).animate({marginLeft : data.margin}, speed, easing); + data.open = id; + } + } + + }); + return $this; + }, + + close : function (id, idOpen, dataCountOpen) { + var $this = this, + data = $this.data('timeline'), + $items = $this.find(data.options.itemOpenClass), + speed = data.options.scrollSpeed, + width = data.itemOpenWidth, + easing = data.options.easing; + + + $items.each(function(){ + if ($(this).attr('data-id') == id && $(this).attr('data-count') == data.open_count && $(this).is(":visible") ) { + // Trigger itemOpen event + $this.trigger('itemClose.Timeline'); + + // Close content and move margin + $(this).stop(true).animate({width: 0, margin:0}, speed, easing, function(){$(this).hide()}); + if (data.marginResponse) { + data.margin += (data.itemWidth+data.options.itemMargin)/2; + } + data.margin += (width + data.options.itemMargin)/2; + data.iholder.stop(true).animate({marginLeft : data.margin}, speed, easing); + data.open = false; + } + }); + if(idOpen) { + $this.timeline('open', idOpen, dataCountOpen); + } + return $this; + }, + + + // Move one step left + right : function() { + var $this = this, + data = $this.data('timeline'), + speed = data.options.scrollSpeed, + easing = data.options.easing; + if (data.currentIndex < data.itemCount-1) + { + var dataId = data.items.eq(data.currentIndex+1).attr('data-id'); + var dataCount = data.items.eq(data.currentIndex+1).attr('data-count'); + $this.timeline('goTo', dataId, dataCount); + } + else + { + data.iholder.stop(true).animate({marginLeft : data.margin-50}, speed/2, easing).animate({marginLeft : data.margin}, speed/2, easing); + } + return $this + }, + + // Move one step right + left : function( ) { + var $this = this, + data = $this.data('timeline'), + speed = data.options.scrollSpeed, + easing = data.options.easing; + if (data.currentIndex > 0) + { + var dataId = data.items.eq(data.currentIndex-1).attr('data-id'); + var dataCount = data.items.eq(data.currentIndex-1).attr('data-count'); + $this.timeline('goTo', dataId, dataCount); + } + else + { + data.iholder.stop(true).animate({marginLeft : data.margin+50}, speed/2, easing).animate({marginLeft : data.margin}, speed/2, easing); + } + return $this; + }, + + // Go to item + goTo : function (id, data_count, openElement) { + var $this = this, + data = $this.data('timeline'), + speed = data.options.scrollSpeed, + easing = data.options.easing, + $items = data.items, + timelineWidth = $this.find('.timeline_line').width(), + count = -1, + found = false; + + // Find item index + $items.each(function(index){ + if(id == $(this).attr('data-id')) + { + if (!data_count || data_count == $(this).attr('data-count')) + { + found = true; + count = index; + return false; + } + } + }); + + // Move if fount + if(found) + { + // Move lineView to current element + var $nodes = $this.find('.t_line_node'); + $nodes.removeClass('active'); + var $goToNode = $nodes.parent().parent().find('[href="#'+id+'"]').addClass('active'); + data.lineMargin = -parseInt($goToNode.parent().parent().attr('data-id'),10)*100; + + // check if responsive width + if($this.find('.t_line_view:first').width() > $this.find('.timeline_line').width()) { + data.lineMargin *=2; + if ($goToNode.parent().hasClass('right')) data.lineMargin -= 100; + } + + if(data.noAnimation){ + data.noAnimation = false; + $this.find('.t_line_wrapper').stop(true).css({marginLeft : data.lineMargin+'%'}); + } + else { + $this.find('.t_line_wrapper').stop(true).animate({marginLeft : data.lineMargin+'%'}, speed, easing ); + } + + + if(data.open) { + $this.timeline('close', data.open, id, data_count); + } + else if (openElement) { + $this.timeline('open', id, data_count); + } + + // Trigger ScrollStart event + $this.trigger('scrollStart.Timeline'); + + // Scroll + + data.margin += (data.itemWidth + data.options.itemMargin)*(data.currentIndex - count); + data.currentIndex = count; + + var multiply = (parseInt(data.iholder.css('margin-left')) - data.margin)/data.itemWidth; + data.iholder.stop(true).animate({marginLeft : data.margin}, speed+(speed/5)*(Math.abs(multiply)-1), easing, function(){ + // Trigger ScrollStop event + $this.trigger('scrollStop.Timeline'); + }); + } + return $this; + }, + + // move line to the left + lineLeft : function() { + var $this = this, + data = $this.data('timeline'), + speed = data.options.scrollSpeed, + easing = data.options.easing; + if (data.lineMargin != 0 && data.options.categories) { + data.lineMargin += 100; + $this.find('.t_line_wrapper').stop(true).animate({marginLeft : data.lineMargin+'%'}, speed, easing); + } + + }, + + // move line to the right + lineRight : function() { + var $this = this, + data = $this.data('timeline'), + speed = data.options.scrollSpeed, + easing = data.options.easing; + if ($this.find('.t_line_view:first').width() > $this.find('.timeline_line').width()) + var viewCount = data.lineViewCount*2; + else + var viewCount = data.lineViewCount; + + if (data.lineMargin != -(viewCount-1)*100 && data.options.categories) { + data.lineMargin -= 100; + $this.find('.t_line_wrapper').stop(true).animate({marginLeft : data.lineMargin+'%'}, speed, easing); + } + + }, + + // Create timeline elements and css dependent properties + createElements : function() { + var $this = this, + data = $this.data('timeline'), + $items = data.items; + + var html = '\n' + +'
\n' + +'
\n'; + $this.prepend(html); + var timelineWidth = $this.find('.timeline_line').width(), + cnt = 0, + nodes = new Array(), + months = [''].concat(data.options.categories); + monthsDays = [0].concat(data.options.nuberOfSegments), + minM = months.length, + minY = 99999, + maxM = 0, + maxY = 0; + if(!data.options.yearsOn) maxY = 99999; + + // find timeline date range and make node elements + $items.each(function(){ + var dataId = $(this).attr('data-id'), + nodeName = $(this).attr('data-name'), + dataDesc = $(this).attr('data-description'), + dataArray = dataId.split('/'), + d = parseInt(dataArray[0],10), + m = ($.inArray(dataArray[1],months) != -1) ? $.inArray(dataArray[1],months) : parseInt(dataArray[1],10), + y = parseInt(dataArray[2],10); + + + maxY = Math.max(maxY, y); + maxM = Math.max(maxM, m); + minY = Math.min(minY, y); + minM = Math.min(minM, m); + + + // Store node element + nodes[dataId] = ''+((typeof nodeName != 'undefined') ? nodeName : d); + + if(typeof dataDesc != 'undefined') nodes[dataId]+= ''+dataDesc+''; + + nodes[dataId]+='\n'; + cnt++; + }); + + // Make wrapper elements + html = '\n' + +'
\n' + +'
\n' + +'
\n'; + + cnt=0; + // Prepare for loop, every view has 2 months, we show both if first has nodes in it + if(maxM > 0) { + if (minM%2 == 0) minM--; + + // Set max to be on first next view (the one that is going to stop the loop) + if (maxM%2 == 0) { + if (maxM == 12) { + maxM = 1; maxY++; + } + else maxM++; + } + else { + maxM +=2; + if (maxM == 13) { + maxM = 1; maxY++; + } + } + + + if (!data.options.categories) { + html += + '
\n'+ + '
\n'; + for (var x in nodes) { + html += nodes[x]; + } + html += '
\n'+ + '
'; + } + else { + var firstMonth = true; + // Generate months and place nodes + while ((minY != maxY && !isNaN(minY) && !isNaN(maxY)) || minM != maxM) { + var nodes1 = new Array(); + var nodes1length = 0; + + for (x in nodes) { + var dataArray = x.split('/'); + m = ($.inArray(dataArray[1],months) != -1) ? $.inArray(dataArray[1],months) : parseInt(dataArray[1],10); + if(!data.options.yearsOn) y = minY; + else y = parseInt(dataArray[2],10); + if (m == minM && (y == minY || !data.options.yearsOn)){ + nodes1[x]= nodes[x]; + nodes1length++; + nodes.splice(x,1); + } + + } + if (nodes1length != 0) { + if (firstMonth) { + firstMonth = !firstMonth; + html += + '
\n'+ + '
\n'+ + '

'+months[minM]+(data.options.yearsOn ? ' '+(minY < 0 ? (-minY)+' B.C.' : minY)+'' : '' )+'

\n'; + + // Fill with nodes + for (x in nodes1) { + if(typeof nodes1[x] == 'string') { + html+= nodes1[x]; + } + } + html += + '
\n'; + } + else { + firstMonth = !firstMonth; + html += + '
\n'+ + '

'+(typeof months[minM] !== 'undefined' ? months[minM] : '')+(data.options.yearsOn ? ' '+minY+'' : '' )+'

\n'; + + // Fill with nodes + for (x in nodes1) { + if(typeof nodes1[x] == 'string') { + html+= nodes1[x]; + } + } + html += + '
\n'+ + '
\n'+ + '
'; + cnt++; + + } + + + } + + if (minM == months.length-1) { minM = 1; minY++;} + else { minM++; } + + + if(minM == maxM && !data.options.yearsOn) break; + + + + } + if (!firstMonth) { + html += + '
\n'+ + '

'+(typeof months[minM] !== 'undefined' ? months[minM] : '')+(data.options.yearsOn ? ' '+minY+'' : '' )+'

\n'+ + '
\n'+ + '
\n'+ + '
'; + cnt++; + } + + } + } + + + html += '\n' + +'
\n'+ +'
\n'+ +'
\n'; + + // Set number of View elements + data.lineViewCount = cnt; + // Add generated html and set width & margin for dinamic timeline + $this.find('.timeline_line').html(html); + $this.find('.t_line_node').each(function(){ + var $thisNode = $(this); + $(this).find('span').hide(); + $(this).hover(function(){ + $items.each(function(){ + if($(this).attr('data-id') == $thisNode.attr('href').substr(1)) { + $(this).addClass('item_node_hover'); + } + }); + $(this).find('span').show(); + }, function(){ + $(this).find('span').hide(); + $('.item_node_hover').removeClass('item_node_hover'); + }); + + //Position lineView to selected item + if($(this).hasClass('active')) { + data.lineMargin = -parseInt($(this).parent().parent('.t_line_view').attr('data-id'),10)*100; + $this.find('.t_line_wrapper').css('margin-left', data.lineMargin+'%'); + } + // Bind goTo function to click event + $(this).click(function(e){ + e.preventDefault(); + $this.find('.t_line_node').removeClass('active'); + $(this).addClass('active'); + $this.timeline('goTo', $(this).attr('href').substr(1)); + }); + }); + + $this.find('#t_line_left').click(function(){ + $this.timeline('lineLeft'); + }); + + $this.find('#t_line_right').click(function(){ + $this.timeline('lineRight'); + }); + + } + }; + + // Initiate methods + $.fn.timeline = function( method ) { + + if ( t_methods[method] ) { + return t_methods[method].apply( this, Array.prototype.slice.call( arguments, 1 )); + } else if ( typeof method === 'object' || ! method ) { + return t_methods.init.apply( this, arguments ); + } else { + $.error( 'Method ' + method + ' does not exist on jQuery.timeline' ); + } + + }; + + + + + +})(jQuery); \ No newline at end of file