var __tools = 
{
	'_index': function(linkPrefix, params)
	{
		this._linkPrefix = linkPrefix;
		this._params = params;
		this._page = 0;
	},
	
	'_view': function(linkPrefix, params)
	{
		this._linkPrefix = linkPrefix;
		this._params = params;
	},
	
	'nextBack': function($back, $next)
	{
		var that = this;
		$next.removeClass('hidden'); $back.removeClass('hidden');
		if (that._page == 0) $back.addClass('hidden');
		if (that._page == Math.ceil(that._assignments.length / that._perPage) - 1) $next.addClass('hidden');
	},
	
	'makeAssignment': function(assignment)
	{
		var that = this;
		var prevId = parseInt(assignment['Assignment']['lesson_id']) - 1;
		var nextId = parseInt(assignment['Assignment']['lesson_id']) + 1;
		var $next = $('<a></a>', {'className': 'next', 'href': that._linkPrefix + 'assignments/view/' + nextId}).append('Next &raquo;');
		var $prev = $('<a></a>', {'className': 'back', 'href': that._linkPrefix + 'assignments/view/' + prevId}).append('&laquo; Prev');
		if (prevId <= 0) $prev = '';
		if (nextId > parseInt(assignment['Meta']['maxId'])) $next = '';
		var $title = $('<h1></h1>', {'css': {'clear': 'both'}}).append(assignment['Assignment']['title']);
		var $body = $('<p></p>').append(assignment['Assignment']['body']);
		var $toggleSoln = $('<a></a>', {'id': 'toggleSoln', 'href': '#'}).append('Show Solution').click(function()
		{
			var show = $('#solnCont').is(':hidden');
			if (show)
			{
				$('#solnCont').show();
				$('#solution').slideDown(1000);	
				this.innerHTML = 'Hide Solution'
			}
			else
			{
				$('#solution').slideUp(1000, function()
				{
					$('#solnCont').hide();	
				});
				this.innerHTML = 'Show Solution'
			}
			return false;	
		});
		var $downloadLink = $('<p></p>').append($('<a></a>', {'href': that._linkPrefix + 'files/' + assignment['Assignment']['solution_path']}).append('Download .java solution'));
		$body.append($downloadLink);
		var $solutionHead = $('<h3></h3>').append($toggleSoln);
		var $toggleText = $('<a></a>', {'id': 'toggleText', 'href': '#'}).append('Plain Text').click(function()
		{
			if (this.innerHTML == 'Plain Text')
			{
				this.innerHTML = 'Highlighted Text';
				$('#solution').html($('#solutionText').html());
			}
			else
			{
				this.innerHTML = 'Plain Text';
				$('#solution').html($('#highlighted').html());
			}
		});
		var $solution = $('<div></div>', {'id': 'solution', 'className': 'code'});
		var $solnCont = $('<div></div>', {'id': 'solnCont', 'className': 'hide'}).append($toggleText, $solution);
		
		$(function()
		{
			$('#assignment').append($prev, $next, $title, $body, $solutionHead, $solnCont);
			$('#solution').html($('#highlighted').html());
		});
	},
	
	'makeAssignments': function(assignments)
	{
		var that = this;
		that._assignments = assignments;
		that._perPage = 5;
		var $pages = $('<div></div>', {'className': 'pagination'});
		
		var $back = $('<a></a>', {'href': '#', 'className': 'pagination back'}).append('&laquo; Back').click(function(e)
		{
			that.changePage(that._page - 1, this);
			return false;
		});
		var $next = $('<a></a>', {'href': '#', 'className': 'pagination next'}).append('Next &raquo;').click(function(e)
		{
			that.changePage(that._page + 1, this);
			return false;
		});
		that.nextBack($back, $next);
		
		$pages.append($back, $next);
		for (var i = 0; i<that._assignments.length / that._perPage; ++i)
		{
			var first = i * that._perPage + 1;
			var last = i * that._perPage + that._perPage;
			last = last > that._assignments.length ? that._assignments.length : last;
			var pipe = i == Math.ceil(that._assignments.length / that._perPage) - 1 ? '' : ' | ';
			var $link = $('<a></a>', {'href': '#', 'className': 'pagination number'}).append(first + '-' + last).bind('click', {'i':i}, function(e)
			{
				that.changePage(e.data.i, this);
				return false;
			});
			if (i == that._page)
				$link = $('<span></span>', {'className': 'number'}).append(first + '-' + last);
			$pages.append($link, pipe);
		}
		
		that._assignmentsList = [];
		for (var i = 0; i<that._assignments.length; ++i)
		{
			var $assignment = $('<div></div>', {'className': 'assignment'});
			var $title = $('<h3></h3>').append(
				$('<a></a>', {'href': that._linkPrefix + 'assignments/view/'+(that._assignments[i]['Assignment']['lesson_id'])}).append(that._assignments[i]['Assignment']['title'])
			);
			var $description = $('<p></p>').append(that._assignments[i]['Assignment']['body']);
			$assignment.append($title, $description);
			that._assignmentsList.push($assignment);
		}		
		var $firstFive = $('<div></div>', {'id': 'assignmentList'});
		for (var i = 0; i<Math.min(5, that._assignments.length); ++i)
			$firstFive.append(that._assignmentsList[i]);
		
		$(function()
		{
			$('#assignments').append($pages, $firstFive);
		});
	},
	
	'changePage': function(pageNum, element)
	{
		var that = this;
		var prevPage = that._page;
		var first = pageNum * that._perPage + 1;
		var last = pageNum * that._perPage + that._perPage;
		last = last > that._assignments.length ? that._assignments.length : last;
		var prevPageStr = first + '-' + last;
		that._page = pageNum;
		$back = $('.back'); $next = $('.next');
		$('.number').each(function(index)
		{
			$(this).replaceWith($('<a></a>', {'href': '#', 'className': 'pagination number'}).append(this.innerHTML).click(function()
			{
				that.changePage(index, this);
				return false;
			}));
		});
		$('.number').each(function(index)
		{
			if (this.innerHTML == prevPageStr)
				$(this).replaceWith($('<span></span>', {'className': 'number'}).append(prevPageStr));
		});
		that.nextBack($back, $next);
		
		$('#assignmentList').html('');
		for (var i = first; i<=last; ++i)
		{
			$('#assignmentList').append(that._assignmentsList[i-1]);
		}
	}
};