/* ---------------------------------- jquery timelinr 0.9.5 tested with jquery v1.6+ copyright 2011, csslab.cl free under the mit license. http://www.opensource.org/licenses/mit-license.php instructions: http://www.csslab.cl/2011/08/18/jquery-timelinr/ ---------------------------------- */ jquery.fn.timelinr = function(options){ // default plugin settings settings = jquery.extend({ orientation: 'horizontal', // value: horizontal | vertical, default to horizontal containerdiv: '#timeline', // value: any html tag or #id, default to #timeline datesdiv: '#dates', // value: any html tag or #id, default to #dates datesselectedclass: 'selected', // value: any class, default to selected datesspeed: 'normal', // value: integer between 100 and 1000 (recommended) or 'slow', 'normal' or 'fast'; default to normal issuesdiv: '#issues', // value: any html tag or #id, default to #issues issuesselectedclass: 'selected', // value: any class, default to selected issuesspeed: 'fast', // value: integer between 100 and 1000 (recommended) or 'slow', 'normal' or 'fast'; default to fast issuestransparency: 0.2, // value: integer between 0 and 1 (recommended), default to 0.2 issuestransparencyspeed: 500, // value: integer between 100 and 1000 (recommended), default to 500 (normal) prevbutton: '#prev', // value: any html tag or #id, default to #prev nextbutton: '#next', // value: any html tag or #id, default to #next arrowkeys: 'false', // value: true | false, default to false startat: 1, // value: integer, default to 1 (first) autoplay: 'false', // value: true | false, default to false autoplaydirection: 'forward', // value: forward | backward, default to forward autoplaypause: 2000 // value: integer (1000 = 1 seg), default to 2000 (2segs) }, options); $(function(){ // setting variables... many of them var howmanydates = $(settings.datesdiv+' li').length; var howmanyissues = $(settings.issuesdiv+' li').length; var currentdate = $(settings.datesdiv).find('a.'+settings.datesselectedclass); var currentissue = $(settings.issuesdiv).find('li.'+settings.issuesselectedclass); var widthcontainer = $(settings.containerdiv).width(); var heightcontainer = $(settings.containerdiv).height(); var widthissues = $(settings.issuesdiv).width(); var heightissues = $(settings.issuesdiv).height(); var widthissue = $(settings.issuesdiv+' li').width(); var heightissue = $(settings.issuesdiv+' li').height(); var widthdates = $(settings.datesdiv).width(); var heightdates = $(settings.datesdiv).height(); var widthdate = $(settings.datesdiv+' li').width(); var heightdate = $(settings.datesdiv+' li').height(); // set positions! if(settings.orientation == 'horizontal') { $(settings.issuesdiv).width(widthissue*howmanyissues); $(settings.datesdiv).width(widthdate*howmanydates).css('marginleft',widthcontainer/2-widthdate/2); var defaultpositiondates = parseint($(settings.datesdiv).css('marginleft').substring(0,$(settings.datesdiv).css('marginleft').indexof('px'))); } else if(settings.orientation == 'vertical') { $(settings.issuesdiv).height(heightissue*howmanyissues); $(settings.datesdiv).height(heightdate*howmanydates).css('margintop',heightcontainer/2-heightdate/2); var defaultpositiondates = parseint($(settings.datesdiv).css('margintop').substring(0,$(settings.datesdiv).css('margintop').indexof('px'))); } $(settings.datesdiv+' a').click(function(event){ event.preventdefault(); // first vars var whichissue = $(this).text(); var currentindex = $(this).parent().prevall().length; // moving the elements if(settings.orientation == 'horizontal') { $(settings.issuesdiv).animate({'marginleft':-widthissue*currentindex},{queue:false, duration:settings.issuesspeed}); } else if(settings.orientation == 'vertical') { $(settings.issuesdiv).animate({'margintop':-heightissue*currentindex},{queue:false, duration:settings.issuesspeed}); } $(settings.issuesdiv+' li').animate({'opacity':settings.issuestransparency},{queue:false, duration:settings.issuesspeed}).removeclass(settings.issuesselectedclass).eq(currentindex).addclass(settings.issuesselectedclass).fadeto(settings.issuestransparencyspeed,1); // prev/next buttons now disappears on first/last issue if( $(settings.issuesdiv+' li:first-child').hasclass(settings.issuesselectedclass) ) { $(settings.prevbutton).fadeout('fast'); } else if( $(settings.issuesdiv+' li:last-child').hasclass(settings.issuesselectedclass) ) { $(settings.nextbutton).fadeout('fast'); } else { $(settings.nextbutton+','+settings.prevbutton).fadein('slow'); } // now moving the dates $(settings.datesdiv+' a').removeclass(settings.datesselectedclass); $(this).addclass(settings.datesselectedclass); if(settings.orientation == 'horizontal') { $(settings.datesdiv).animate({'marginleft':defaultpositiondates-(widthdate*currentindex)},{queue:false, duration:'settings.datesspeed'}); } else if(settings.orientation == 'vertical') { $(settings.datesdiv).animate({'margintop':defaultpositiondates-(heightdate*currentindex)},{queue:false, duration:'settings.datesspeed'}); } }); $(settings.nextbutton).bind('click', function(event){ event.preventdefault(); if(settings.orientation == 'horizontal') { var currentpositionissues = parseint($(settings.issuesdiv).css('marginleft').substring(0,$(settings.issuesdiv).css('marginleft').indexof('px'))); var currentissueindex = currentpositionissues/widthissue; var currentpositiondates = parseint($(settings.datesdiv).css('marginleft').substring(0,$(settings.datesdiv).css('marginleft').indexof('px'))); var currentissuedate = currentpositiondates-widthdate; if(currentpositionissues <= -(widthissue*howmanyissues-(widthissue))) { $(settings.issuesdiv).stop(); $(settings.datesdiv+' li:last-child a').click(); } else { if (!$(settings.issuesdiv).is(':animated')) { $(settings.issuesdiv).animate({'marginleft':currentpositionissues-widthissue},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li').animate({'opacity':settings.issuestransparency},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li.'+settings.issuesselectedclass).removeclass(settings.issuesselectedclass).next().fadeto(settings.issuestransparencyspeed, 1).addclass(settings.issuesselectedclass); $(settings.datesdiv).animate({'marginleft':currentissuedate},{queue:false, duration:'settings.datesspeed'}); $(settings.datesdiv+' a.'+settings.datesselectedclass).removeclass(settings.datesselectedclass).parent().next().children().addclass(settings.datesselectedclass); } } } else if(settings.orientation == 'vertical') { var currentpositionissues = parseint($(settings.issuesdiv).css('margintop').substring(0,$(settings.issuesdiv).css('margintop').indexof('px'))); var currentissueindex = currentpositionissues/heightissue; var currentpositiondates = parseint($(settings.datesdiv).css('margintop').substring(0,$(settings.datesdiv).css('margintop').indexof('px'))); var currentissuedate = currentpositiondates-heightdate; if(currentpositionissues <= -(heightissue*howmanyissues-(heightissue))) { $(settings.issuesdiv).stop(); $(settings.datesdiv+' li:last-child a').click(); } else { if (!$(settings.issuesdiv).is(':animated')) { $(settings.issuesdiv).animate({'margintop':currentpositionissues-heightissue},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li').animate({'opacity':settings.issuestransparency},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li.'+settings.issuesselectedclass).removeclass(settings.issuesselectedclass).next().fadeto(settings.issuestransparencyspeed, 1).addclass(settings.issuesselectedclass); $(settings.datesdiv).animate({'margintop':currentissuedate},{queue:false, duration:'settings.datesspeed'}); $(settings.datesdiv+' a.'+settings.datesselectedclass).removeclass(settings.datesselectedclass).parent().next().children().addclass(settings.datesselectedclass); } } } // prev/next buttons now disappears on first/last issue if( $(settings.issuesdiv+' li:first-child').hasclass(settings.issuesselectedclass) ) { $(settings.prevbutton).fadeout('fast'); } else if( $(settings.issuesdiv+' li:last-child').hasclass(settings.issuesselectedclass) ) { $(settings.nextbutton).fadeout('fast'); } else { $(settings.nextbutton+','+settings.prevbutton).fadein('slow'); } }); $(settings.prevbutton).click(function(event){ event.preventdefault(); if(settings.orientation == 'horizontal') { var currentpositionissues = parseint($(settings.issuesdiv).css('marginleft').substring(0,$(settings.issuesdiv).css('marginleft').indexof('px'))); var currentissueindex = currentpositionissues/widthissue; var currentpositiondates = parseint($(settings.datesdiv).css('marginleft').substring(0,$(settings.datesdiv).css('marginleft').indexof('px'))); var currentissuedate = currentpositiondates+widthdate; if(currentpositionissues >= 0) { $(settings.issuesdiv).stop(); $(settings.datesdiv+' li:first-child a').click(); } else { if (!$(settings.issuesdiv).is(':animated')) { $(settings.issuesdiv).animate({'marginleft':currentpositionissues+widthissue},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li').animate({'opacity':settings.issuestransparency},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li.'+settings.issuesselectedclass).removeclass(settings.issuesselectedclass).prev().fadeto(settings.issuestransparencyspeed, 1).addclass(settings.issuesselectedclass); $(settings.datesdiv).animate({'marginleft':currentissuedate},{queue:false, duration:'settings.datesspeed'}); $(settings.datesdiv+' a.'+settings.datesselectedclass).removeclass(settings.datesselectedclass).parent().prev().children().addclass(settings.datesselectedclass); } } } else if(settings.orientation == 'vertical') { var currentpositionissues = parseint($(settings.issuesdiv).css('margintop').substring(0,$(settings.issuesdiv).css('margintop').indexof('px'))); var currentissueindex = currentpositionissues/heightissue; var currentpositiondates = parseint($(settings.datesdiv).css('margintop').substring(0,$(settings.datesdiv).css('margintop').indexof('px'))); var currentissuedate = currentpositiondates+heightdate; if(currentpositionissues >= 0) { $(settings.issuesdiv).stop(); $(settings.datesdiv+' li:first-child a').click(); } else { if (!$(settings.issuesdiv).is(':animated')) { $(settings.issuesdiv).animate({'margintop':currentpositionissues+heightissue},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li').animate({'opacity':settings.issuestransparency},{queue:false, duration:settings.issuesspeed}); $(settings.issuesdiv+' li.'+settings.issuesselectedclass).removeclass(settings.issuesselectedclass).prev().fadeto(settings.issuestransparencyspeed, 1).addclass(settings.issuesselectedclass); $(settings.datesdiv).animate({'margintop':currentissuedate},{queue:false, duration:'settings.datesspeed'},{queue:false, duration:settings.issuesspeed}); $(settings.datesdiv+' a.'+settings.datesselectedclass).removeclass(settings.datesselectedclass).parent().prev().children().addclass(settings.datesselectedclass); } } } // prev/next buttons now disappears on first/last issue if( $(settings.issuesdiv+' li:first-child').hasclass(settings.issuesselectedclass) ) { $(settings.prevbutton).fadeout('fast'); } else if( $(settings.issuesdiv+' li:last-child').hasclass(settings.issuesselectedclass) ) { $(settings.nextbutton).fadeout('fast'); } else { $(settings.nextbutton+','+settings.prevbutton).fadein('slow'); } }); // keyboard navigation, added since 0.9.1 if(settings.arrowkeys=='true') { if(settings.orientation=='horizontal') { $(document).keydown(function(event){ if (event.keycode == 39) { $(settings.nextbutton).click(); } if (event.keycode == 37) { $(settings.prevbutton).click(); } }); } else if(settings.orientation=='vertical') { $(document).keydown(function(event){ if (event.keycode == 40) { $(settings.nextbutton).click(); } if (event.keycode == 38) { $(settings.prevbutton).click(); } }); } } // default position startat, added since 0.9.3 $(settings.datesdiv+' li').eq(settings.startat-1).find('a').trigger('click'); // autoplay, added since 0.9.4 if(settings.autoplay == 'true') { setinterval("autoplay()", settings.autoplaypause); } }); }; // autoplay, added since 0.9.4 function autoplay(){ var currentdate = $(settings.datesdiv).find('a.'+settings.datesselectedclass); if(settings.autoplaydirection == 'forward') { if(currentdate.parent().is('li:last-child')) { $(settings.datesdiv+' li:first-child').find('a').trigger('click'); } else { currentdate.parent().next().find('a').trigger('click'); } } else if(settings.autoplaydirection == 'backward') { if(currentdate.parent().is('li:first-child')) { $(settings.datesdiv+' li:last-child').find('a').trigger('click'); } else { currentdate.parent().prev().find('a').trigger('click'); } } }