1/* ---------------------------------- 2jQuery Timelinr 0.9.52 3tested with jQuery v1.6+ 4 5Copyright 2011, CSSLab.cl + Broobe 6Free under the MIT license. 7http://www.opensource.org/licenses/mit-license.php 8 9instructions: http://www.csslab.cl/2011/08/18/jquery-timelinr/ 10---------------------------------- */ 11 12(function( $ ){ 13 $.fn.timelinr = function(options){ 14 var settings = getSettings(options); 15 16 var howManyDates = $(settings.containerDiv+' .dates li').length; 17 var howManyIssues = $(settings.containerDiv+' .issues li').length; 18 var currentDate = $(settings.containerDiv+' .dates').find('a.selected'); 19 var currentIssue = $(settings.containerDiv+' .issues').find('li.selected'); 20 var widthContainer = $(settings.containerDiv+' .timeline').width(); 21 var heightContainer = $(settings.containerDiv+' .timeline').height(); 22 var widthIssues = $(settings.containerDiv+' .issues').width(); 23 var heightIssues = $(settings.containerDiv+' .issues').height(); 24 var widthIssue = $(settings.containerDiv+' .issues li').width(); 25 var heightIssue = $(settings.containerDiv+' .issues li').height(); 26 var widthDates = $(settings.containerDiv+' .dates').width(); 27 var heightDates = $(settings.containerDiv+' .dates').height(); 28 var widthDate = $(settings.containerDiv+' .dates li').width(); 29 var heightDate = $(settings.containerDiv+' .dates li').height(); 30 31 // set positions! 32 if(settings.orientation == 'horizontal') { 33 $(settings.containerDiv+' .issues').width(widthIssue*howManyIssues + 400); 34 $(settings.containerDiv+' .dates').width(widthDate*howManyDates*2).css('marginLeft',(widthContainer/2-widthDate/2)); 35 var defaultPositionDates = -20; 36 } else if(settings.orientation == 'vertical') { 37 $(settings.containerDiv+' .issues').height(heightIssue*howManyIssues); 38 $(settings.containerDiv+' .dates').height(heightDate*howManyDates).css('marginTop',heightContainer/2-heightDate/2); 39 var defaultPositionDates = parseInt($(settings.containerDiv+' .dates').css('marginTop').substring(0,$(settings.containerDiv+' .dates').css('marginTop').indexOf('px'))); 40 } 41 42 $(settings.containerDiv+' .dates a').click(function(event){ 43 event.preventDefault(); 44 // first vars 45 var whichIssue = $(this).text(); 46 var currentIndex = $(this).parent().prevAll().length; 47 var settings = getSettings(options); 48 49 // moving the elements 50 if(settings.orientation == 'horizontal') { 51 $(settings.containerDiv+' .issues').animate({'marginLeft':-widthIssue*currentIndex},{queue:false, duration:settings.issuesSpeed}); 52 } else if(settings.orientation == 'vertical') { 53 $(settings.containerDiv+' .issues').animate({'marginTop':-heightIssue*currentIndex},{queue:false, duration:settings.issuesSpeed}); 54 } 55 $(settings.containerDiv+' .issues li').animate({'opacity':settings.issuesTransparency},{queue:false, duration:settings.issuesSpeed}).removeClass('selected').eq(currentIndex).addClass('selected').fadeTo(settings.issuesTransparencySpeed,1); 56 // prev/next buttons now disappears on first/last issue | bugfix from 0.9.51: lower than 1 issue hide the arrows 57 if(howManyDates == 1) { 58 $(settings.containerDiv+" .prev,"+settings.containerDiv+" .next").fadeOut('fast'); 59 } else if(howManyDates == 2) { 60 if($(settings.containerDiv+' .issues li:first-child').hasClass('selected')) { 61 $(settings.containerDiv+" .prev").fadeOut('fast'); 62 $(settings.containerDiv+" .next").fadeIn('fast'); 63 } 64 else if($('.issues li:last-child').hasClass('selected')) { 65 $(settings.containerDiv+" .next").fadeOut('fast'); 66 $(settings.containerDiv+" .prev").fadeIn('fast'); 67 } 68 } else { 69 if( $(settings.containerDiv+' .issues li:first-child').hasClass('selected') ) { 70 $(settings.containerDiv+" .prev").fadeOut('fast'); 71 } 72 else if( $(settings.containerDiv+' .issues li:last-child').hasClass('selected') ) { 73 $(settings.containerDiv+" .next").fadeOut('fast'); 74 } 75 else { 76 $(settings.containerDiv+" .next"+','+settings.containerDiv+" .prev").fadeIn('slow'); 77 } 78 } 79 // now moving the dates 80 $(settings.containerDiv+' .dates a').removeClass('selected'); 81 $(this).addClass('selected'); 82 if(settings.orientation == 'horizontal') { 83 $(settings.containerDiv+' .dates').animate({'marginLeft':defaultPositionDates-(widthDate*currentIndex)},{queue:false, duration:settings.datesSpeed}); 84 } else if(settings.orientation == 'vertical') { 85 $(settings.containerDiv+' .dates').animate({'marginTop':defaultPositionDates-(heightDate*currentIndex)},{queue:false, duration:settings.datesSpeed}); 86 } 87 }); 88 89 $(settings.containerDiv+" .next").click(function(event){ 90 event.preventDefault(); 91 var settings = getSettings(options); 92 93 if(settings.orientation == 'horizontal') { 94 var currentPositionIssues = parseInt($(settings.containerDiv+' .issues').css('marginLeft').substring(0,$(settings.containerDiv+' .issues').css('marginLeft').indexOf('px'))); 95 var currentIssueIndex = currentPositionIssues/widthIssue; 96 var currentPositionDates = parseInt($(settings.containerDiv+' .dates').css('marginLeft').substring(0,$(settings.containerDiv+' .dates').css('marginLeft').indexOf('px'))); 97 var currentIssueDate = currentPositionDates-widthDate;
98 if(currentPositionIssues <= -(widthIssue*howManyIssues-(widthIssue))) { 99 $(settings.containerDiv+' .issues').stop(); 100 $(settings.containerDiv+' .dates li:last-child a').click(); 101 } else { 102 if (!$(settings.containerDiv+' .issues').is(':animated')) { 103 $(settings.containerDiv+' .issues').animate({'marginLeft':currentPositionIssues-widthIssue},{queue:false, duration:settings.issuesSpeed}); 104 $(settings.containerDiv+' .issues li').animate({'opacity':settings.issuesTransparency},{queue:false, duration:settings.issuesSpeed}); 105 $(settings.containerDiv+' .issues li.selected').removeClass('selected').next().fadeTo(settings.issuesTransparencySpeed, 1).addClass('selected'); 106 $(settings.containerDiv+' .dates').animate({'marginLeft':currentIssueDate},{queue:false, duration:settings.datesSpeed}); 107 $(settings.containerDiv+' .dates a.selected').removeClass('selected').parent().next().children().addClass('selected'); 108 } 109 } 110 } else if(settings.orientation == 'vertical') { 111 var currentPositionIssues = parseInt($(settings.containerDiv+' .issues').css('marginTop').substring(0,$(settings.containerDiv+' .issues').css('marginTop').indexOf('px'))); 112 var currentIssueIndex = currentPositionIssues/heightIssue; 113 var currentPositionDates = parseInt($(settings.containerDiv+' .dates').css('marginTop').substring(0,$(settings.containerDiv+' .dates').css('marginTop').indexOf('px'))); 114 var currentIssueDate = currentPositionDates-heightDate; 115 if(currentPositionIssues <= -(heightIssue*howManyIssues-(heightIssue))) { 116 $(settings.containerDiv+' .issues').stop(); 117 $(settings.containerDiv+' .dates li:last-child a').click(); 118 } else { 119 if (!$(settings.containerDiv+' .issues').is(':animated')) { 120 $(settings.containerDiv+' .issues').animate({'marginTop':currentPositionIssues-heightIssue},{queue:false, duration:settings.issuesSpeed}); 121 $(settings.containerDiv+' .issues li').animate({'opacity':settings.issuesTransparency},{queue:false, duration:settings.issuesSpeed}); 122 $(settings.containerDiv+' .issues li.selected').removeClass('selected').next().fadeTo(settings.issuesTransparencySpeed, 1).addClass('selected'); 123 $(settings.containerDiv+' .dates').animate({'marginTop':currentIssueDate},{queue:false, duration:settings.datesSpeed}); 124 $(settings.containerDiv+' .dates a.selected').removeClass('selected').parent().next().children().addClass('selected'); 125 } 126 } 127 } 128 // prev/next buttons now disappears on first/last issue | bugfix from 0.9.51: lower than 1 issue hide the arrows 129 if(howManyDates == 1) { 130 $(settings.containerDiv+" .prev,"+settings.containerDiv+" .next").fadeOut('fast'); 131 } else if(howManyDates == 2) { 132 if($(settings.containerDiv+' .issues li:first-child').hasClass('selected')) { 133 $(settings.containerDiv+" .prev").fadeOut('fast'); 134 $(settings.containerDiv+" .next").fadeIn('fast'); 135 } 136 else if($(settings.containerDiv+' .issues li:last-child').hasClass('selected')) { 137 $(settings.containerDiv+" .next").fadeOut('fast'); 138 $(settings.containerDiv+" .prev").fadeIn('fast'); 139 } 140 } else { 141 if( $(settings.containerDiv+' .issues li:first-child').hasClass('selected') ) { 142 $(settings.containerDiv+" .prev").fadeOut('fast'); 143 } 144 else if( $(settings.containerDiv+' .issues li:last-child').hasClass('selected') ) { 145 $(settings.containerDiv+" .next").fadeOut('fast'); 146 } 147 else { 148 $(settings.containerDiv+" .next"+','+settings.containerDiv+" .prev").fadeIn('slow'); 149 } 150 } 151 }); 152 153 $(settings.containerDiv+" .prev").click(function(event){ 154 event.preventDefault(); 155 var settings = getSettings(options); 156 157 if(settings.orientation == 'horizontal') { 158 var currentPositionIssues = parseInt($(settings.containerDiv+' .issues').css('marginLeft').substring(0,$(settings.containerDiv+' .issues').css('marginLeft').indexOf('px'))); 159 var currentIssueIndex = currentPositionIssues/widthIssue; 160 var currentPositionDates = parseInt($(settings.containerDiv+' .dates').css('marginLeft').substring(0,$(settings.containerDiv+' .dates').css('marginLeft').indexOf('px'))); 161 var currentIssueDate = currentPositionDates+widthDate; 162 if(currentPositionIssues >= 0) { 163 $(settings.containerDiv+' .issues').stop(); 164 $(settings.containerDiv+' .dates li:first-child a').click(); 165 } else { 166 if (!$(settings.containerDiv+' .issues').is(':animated')) { 167 $(settings.containerDiv+' .issues').animate({'marginLeft':currentPositionIssues+widthIssue},{queue:false, duration:settings.issuesSpeed}); 168 $(settings.containerDiv+' .issues li').animate({'opacity':settings.issuesTransparency},{queue:false, duration:settings.issuesSpeed}); 169 $(settings.containerDiv+' .issues li.selected').removeClass('selected').prev().fadeTo(settings.issuesTransparencySpeed, 1).addClass('selected'); 170 $(settings.containerDiv+' .dates').animate({'marginLeft':currentIssueDate},{queue:false, duration:settings.datesSpeed}); 171 $(settings.containerDiv+' .dates a.selected').removeClass('selected').parent().prev().children().addClass('selected'); 172 } 173 } 174 } else if(settings.orientation == 'vertical') { 175 var currentPositionIssues = parseInt($(settings.containerDiv+' .issues').css('marginTop').substring(0,$(settings.containerDiv+' .issues').css('marginTop').indexOf('px'))); 176 var currentIssueIndex = currentPositionIssues/heightIssue; 177 var currentPositionDates = parseInt($(settings.containerDiv+' .dates').css('marginTop').substring(0,$(settings.containerDiv+' .dates').css('marginTop').indexOf('px'))); 178 var currentIssueDate = currentPositionDates+heightDate; 179 if(currentPositionIssues >= 0) { 180 $(settings.containerDiv+' .issues').stop(); 181 $(settings.containerDiv+' .dates li:first-child a').click(); 182 } else { 183 if (!$(settings.containerDiv+' .issues').is(':animated')) { 184 $(settings.containerDiv+' .issues').animate({'marginTop':currentPositionIssues+heightIssue},{queue:false, duration:settings.issuesSpeed}); 185 $(settings.containerDiv+' .issues li').animate({'opacity':settings.issuesTransparency},{queue:false, duration:settings.issuesSpeed}); 186 $(settings.containerDiv+' .issues li.selected').removeClass('selected').prev().fadeTo(options["issuesTransparencySpeed"], 1).addClass('selected'); 187 $(settings.containerDiv+' .dates').animate({'marginTop':currentIssueDate},{queue:false, duration:settings.datesSpeed},{queue:false, duration:settings.issuesSpeed}); 188 $(settings.containerDiv+' .dates a.selected').removeClass('selected').parent().prev().children().addClass('selected'); 189 } 190 } 191 } 192 // prev/next buttons now disappears on first/last issue | bugfix from 0.9.51: lower than 1 issue hide the arrows 193 if(howManyDates == 1) { 194 $(settings.containerDiv+" .prev,"+settings.containerDiv+" .next").fadeOut('fast'); 195 } else if(howManyDates == 2) { 196 if($(settings.containerDiv+' .issues li:first-child').hasClass('selected')) { 197 $(settings.containerDiv+" .prev").fadeOut('fast'); 198 $(settings.containerDiv+" .next").fadeIn('fast'); 199 } 200 else if($(settings.containerDiv+' .issues li:last-child').hasClass('selected')) { 201 $(settings.containerDiv+" .next").fadeOut('fast'); 202 $(settings.containerDiv+" .prev").fadeIn('fast'); 203 } 204 } else { 205 if( $(settings.containerDiv+' .issues li:first-child').hasClass('selected') ) { 206 $(settings.containerDiv+" .prev").fadeOut('fast'); 207 } 208 else if( $(settings.containerDiv+' .issues li:last-child').hasClass('selected') ) { 209 $(settings.containerDiv+" .next").fadeOut('fast'); 210 } 211 else { 212 $(settings.containerDiv+" .next,"+settings.containerDiv+" .prev").fadeIn('slow'); 213 } 214 } 215 }); 216 // keyboard navigation, added since 0.9.1 217 if(options["arrowKeys"]=='true') { 218 if(settings.orientation=='horizontal') { 219 $(document).keydown(function(event){ 220 if (event.keyCode == 39) { 221 $(settings.containerDiv+" .next").click(); 222 } 223 if (event.keyCode == 37) { 224 $(settings.containerDiv+" .prev").click(); 225 } 226 }); 227 } else if(settings.orientation=='vertical') { 228 $(document).keydown(function(event){ 229 if (event.keyCode == 40) { 230 $(settings.containerDiv+" .next").click(); 231 } 232 if (event.keyCode == 38) { 233 $(settings.containerDiv+" .prev").click(); 234 } 235 }); 236 } 237 } 238 // default position startAt, added since 0.9.3 239 $(settings.containerDiv+' .dates li').eq(settings.startAt-1).find('a').trigger('click'); 240 // autoPlay, added since 0.9.4 241 if(settings.autoPlay == 'true') { 242 setInterval('autoPlay("'+settings.containerDiv+'","'+settings.autoPlayDirection+'")', settings.autoPlayPause); 243 } 244 }; 245 246 // getSettings, added since 1.0 247 function getSettings(options){ 248 settings = jQuery.extend({ 249 containerDiv: '', // value: any HTML tag or #id, default empty 250 orientation: 'horizontal', // value: horizontal | vertical, default to horizontal 251 datesSpeed: 'normal', // value: integer between 100 and 1000 (recommended) or 'slow', 'normal' or 'fast'; default to normal 252 issuesSpeed: 'fast', // value: integer between 100 and 1000 (recommended) or 'slow', 'normal' or 'fast'; default to fast 253 issuesTransparency: 0.2, // value: integer between 0 and 1 (recommended), default to 0.2 254 issuesTransparencySpeed: 500, // value: integer between 100 and 1000 (recommended), default to 500 (normal) 255 arrowKeys: 'true', // value: true | false, default to true 256 startAt: 1, // value: integer, default to 1 (first) 257 autoPlay: 'false', // value: true | false, default to false 258 autoPlayDirection: 'forward', // value: forward | backward, default to forward 259 autoPlayPause: 2000 // value: integer (1000 = 1 seg), default to 2000 (2segs) 260 }, options); 261 262 (settings.containerDiv != "") ? settings.containerDiv = "."+options["containerDiv"] : settings.containerDiv = ""; 263 264 return settings; 265 } 266})( jQuery ); 267 268// autoPlay, added since 0.9.4 269function autoPlay(containerDiv, autoPlayDirection){ 270 var currentDate = jQuery(containerDiv+' .dates').find('a.selected'); 271 if(autoPlayDirection == 'forward') { 272 if(currentDate.parent().is('li:last-child')) { 273 jQuery('.dates li:first-child').find('a').trigger('click'); 274 } else { 275 currentDate.parent().next().find('a').trigger('click'); 276 } 277 } else if(autoPlayDirection == 'backward') { 278 if(currentDate.parent().is('li:first-child')) { 279 jQuery('.dates li:last-child').find('a').trigger('click'); 280 } else { 281 currentDate.parent().prev().find('a').trigger('click'); 282 } 283 } 284}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.