jquery.gradebook.js 2.85 KB
Newer Older
1 2 3 4 5



var Gradebook = function($element) {
	var _this = this;
6
	var $element = $element;
7
	var $body = $('body');
8
	var $grades = $element.find('.grades');
9
	var $studentTable = $element.find('.student-table');
10
	var $gradeTable = $element.find('.grade-table');
11
	var $search = $element.find('.student-search-field');
12 13 14
	var $leftShadow = $('<div class="left-shadow"></div>');
	var $rightShadow = $('<div class="right-shadow"></div>');
	var tableHeight = $gradeTable.height();
Tom Giannattasio committed
15
	var maxScroll = $gradeTable.width() - $grades.width();
16
	
17 18
	var mouseOrigin;
	var tableOrigin;
19

20 21 22
	var startDrag = function(e) {
		mouseOrigin = e.pageX;
		tableOrigin = $gradeTable.position().left;
Tom Giannattasio committed
23
		$body.css('-webkit-user-select', 'none');
24 25 26
		$body.bind('mousemove', moveDrag);
		$body.bind('mouseup', stopDrag);
	};
27

28 29 30
	var moveDrag = function(e) {
		var offset = e.pageX - mouseOrigin;
		var targetLeft = clamp(tableOrigin + offset, -maxScroll, 0);
31

Tom Giannattasio committed
32
		updateHorizontalPosition(targetLeft);
33 34

		setShadows(targetLeft);
35 36
	};

37
	var stopDrag = function(e) {
Tom Giannattasio committed
38
		$body.css('-webkit-user-select', 'auto');
39 40
		$body.unbind('mousemove', moveDrag);
		$body.unbind('mouseup', stopDrag);
41 42
	};

43 44 45
	var setShadows = function(left) {
		var padding = 30;

Tom Giannattasio committed
46 47 48 49 50
		var leftPercent = clamp(-left / padding, 0, 1);
		$leftShadow.css('opacity', leftPercent);
	
		var rightPercent = clamp((maxScroll + left) / padding, 0, 1);
		$rightShadow.css('opacity', rightPercent);
51 52 53
	};

	var clamp = function(val, min, max) {
54 55 56
	    if(val > max) return max;
	    if(val < min) return min;
	    return val;
57
	};
58

Tom Giannattasio committed
59 60 61 62 63
	var updateWidths = function(e) {
		maxScroll = $gradeTable.width() - $grades.width();
		var targetLeft = clamp($gradeTable.position().left, -maxScroll, 0);
		updateHorizontalPosition(targetLeft);
		setShadows(targetLeft);
64
	};
Tom Giannattasio committed
65 66 67 68 69

	var updateHorizontalPosition = function(left) {
		$gradeTable.css({
			'left': left + 'px'
		});
70 71 72 73 74 75 76 77 78 79 80 81 82
	};

	var highlightRow = function(e) {
		$element.find('.highlight').removeClass('highlight');

		var index = $(this).index();
		$studentTable.find('tr').eq(index + 1).addClass('highlight');
		$gradeTable.find('tr').eq(index + 1).addClass('highlight');
	};

	var filter = function(e) {
		var term = $(this).val();
		if(term.length > 0) {
83 84 85 86 87 88
			$studentTable.find('tbody tr').hide();
			$gradeTable.find('tbody tr').hide();
			$studentTable.find('tbody tr:contains(' + term + ')').each(function(i) {
				$(this).show();
				$gradeTable.find('tr').eq($(this).index() + 1).show();
			});
89 90
		} else {
			$studentTable.find('tbody tr').show();
91 92
			$gradeTable.find('tbody tr').show();
		}
Tom Giannattasio committed
93 94
	}

95 96 97 98 99 100
	$leftShadow.css('height', tableHeight + 'px');
	$rightShadow.css('height', tableHeight + 'px');
	$grades.append($leftShadow).append($rightShadow);
	setShadows(0);
	$grades.css('height', tableHeight);
	$gradeTable.bind('mousedown', startDrag);
101 102
	$element.find('tr').bind('mouseover', highlightRow);
	$search.bind('keyup', filter);
Tom Giannattasio committed
103
	$(window).bind('resize', updateWidths);
104 105 106 107 108
}