scala-news-reader

rss/atom news reader in scala

git clone https://9o.is/git/scala-news-reader.git

jquery.keynav.js

(2055B)


      1 $.fn.keynav = (function () {
      2 	//a couple of global things for the plugin
      3 	var nodes = $(), positions = [], recalculate_positions, params;
      4 	params = {
      5 		keynext:  40,
      6 		keyprev:  38,
      7 		keynextJ: 74,
      8 		keyprevK: 75
      9 	};
     10 	//we're watching keypresses globally as well.
     11 	$(document).keydown(function(e) {
     12 		var st, prev, next, desired, i;
     13 		if (!nodes.length) {return true;}
     14 		if (e.target && e.target.tagName == 'TEXTAREA' || e.target.tagName == 'INPUT') {
     15 			return true;
     16 		}
     17 		if(e.keyCode == params.keynext || e.keyCode == params.keynextJ || e.keyCode == params.keyprevK || e.keyCode == params.keyprev) {
     18 			st = $(window).scrollTop();
     19 			//we're checking if our positions are still correct. it may not be necessary all the time, but just to be safe
     20 			if(positions[positions.length-1].top !== $(positions[positions.length-1].obj).offset().top) {
     21 				recalculate_positions();
     22 			}
     23 
     24 			if(e.keyCode === params.keynext || e.keyCode === params.keynextJ) {
     25 				for(i = positions.length-1; i > -1; i--) {
     26 					if(positions[i].top > st + 1) {desired = i;}
     27 				}
     28 			} else if(e.keyCode === params.keyprev || e.keyCode === params.keyprevK) {
     29 				for(i = 0; i < positions.length; i++) {
     30 					if(positions[i].top < st - 1) {desired = i;}
     31 				}
     32 			}
     33 
     34 			if(positions[desired]) {
     35 				$('html,body').animate({scrollTop: positions[desired].top}, 1);
     36 			} else {
     37 				$('html,body').animate({scrollTop: (e.keyCode === params.keynext || e.keyCode === params.keynextJ) ?
     38 				($('body').height() - $(window).height()) : 0}, 1);
     39 			}
     40 		}
     41 	});
     42 
     43 	recalculate_positions = function () {
     44 		//this recalculates the positions of nodes
     45 		var deduct = 0;
     46 		if($(window).width() > 979) { deduct = 50; }
     47 
     48 		positions = [];
     49 		nodes.each(function() {
     50 			positions.push({top: Math.floor($(this).offset().top - deduct),obj: this});
     51 		});
     52 	};
     53 
     54 	return function(newparams) {
     55 		//all we do in the actual plugin is we take the parameters and add the new nodes where we want to navigate.
     56 		params = $.extend(params,newparams || {});
     57 		nodes = nodes.add(this);
     58 		recalculate_positions();
     59 	};
     60 
     61 })();