(function ($) {
	$.fn.DispletTablePager = function (options) {

		var defaults = {
			'items_selector': 'table.displetlistings tr',
			'items_per_page': 4
		}

		var settings = $.extend(defaults, options);

		function Pages(config) {
			this.current_page = 1;
			this.items = config.items;
			this.pages_count = Math.ceil(config.items.length / config.items_per_page);
			this.controls = config.controls;
			this.items_per_page = config.items_per_page;
			this.last_index = config.items.length - 1;
			// alert(this.last_index);
			this.items.hide();
			this.draw();
		}

		Pages.prototype.next_page = function () {
			this.hide_previous();
			// alert(this.items_per_page);
			if (this.current_page < this.pages_count) {
				this.current_page++;
				// alert(this.current_page);
			}
			this.draw();
		};

		Pages.prototype.previous_page = function () {
			this.hide_previous();
			if (this.current_page != 1) {
				this.current_page--;
				// alert(this.current_page);
			}
			this.draw();
		};

		Pages.prototype.draw = function () {
			var first;
			var last;

			// alert(this.items_per_page);

			if (this.current_page === 1) {
				first = 0;
				last = this.items_per_page - 1;
			}
			else {
				first = ((this.current_page - 1) * this.items_per_page);
				last = first + Number(this.items_per_page) - 1;
				if (last > this.last_index) {
					last = this.last_index;
				}
			}

			// alert('Show ' + first + ' -> ' + last);

			var i = first;
			for (; i <= last; i++) {
				$(this.items[i]).show();
			}

			if (this.current_page === 1) {
				this.controls.previous_button.hide();
				this.controls.previous_button.hidden = true; // saves a dom call
			}
			else if (this.controls.previous_button.hidden === true) {
				this.controls.previous_button.show();
			}

			if (this.current_page === this.pages_count) {
				this.controls.next_button.hide();
				this.controls.next_button.hidden = true;
			}
			else if (this.controls.next_button.hidden === true) {
				this.controls.next_button.show();
			}

			this.controls.page_info.html('Page ' + this.current_page + ' of ' + this.pages_count);
		};

		Pages.prototype.hide_previous = function () {
			var first;
			var last;

			if (this.current_page === 1) {
				first = 0;
				last = this.items_per_page - 1;
			}
			else {
				first = ((this.current_page - 1) * this.items_per_page);
				last = first + this.items_per_page - 1;
				if (last > this.last_index) {
					last = this.last_index;
				}
			}

			// alert('Hide ' + first + ' -> ' + last);

			var i = first;
			for (; i <= last; i++) {
				$(this.items[i]).hide();
			}
		}

		return this.each(function () {

			var $this = $(this);

			var controls = $('<div class="DispletReader_controls"></div>').appendTo($this);
			var previous_button = $('<button title="Previous" id="previous_button">&laquo;</button>').appendTo(controls);
			var page_info = $('<span></span>').appendTo(controls);
			var next_button = $('<button title="Next" id="next_button">&raquo;</button>').appendTo(controls);

			// alert(settings.items_per_page);

			var pages = new Pages({
				'items': $this.find(settings.items_selector),
				'items_per_page': settings.items_per_page,
				'controls': {
					'previous_button': previous_button,
					'next_button': next_button,
					'page_info': page_info
				}
			});

			previous_button.click(function () {
				pages.previous_page();
			});

			next_button.click(function () {
				pages.next_page();
			});
		});
	};
})(jQuery)
