(function($){
	var undefined; 
	
	$.Pagination = function(options){
		this.defaults = { itemsPerPage: 10, map: null };
		var
			self = this,
			settings = $.extend(true, {}, this.defaults, options),
			_currentPage = 1,
			_totalPages = null;
			
		this.isLastPage = false;
		this.isFirstPage = true;
		
		// start:private
		function _init(){
			self.setTotalPages(Math.ceil(settings.$items.size() / settings.itemsPerPage));
			_createPages(self.getTotalPages());
			_buildControls();
			
			settings.$controls.find('a').click(function(e){
				e.preventDefault();
				self[$(e.target).attr('rel')]();
			});
			
			settings.$controls.find('input.paginationInput')
				.keyup(function(e){
					if (e.keyCode == 13){
						self.showPage($(e.target).val());
						$(this).blur();
					}
				})
				.focus(function(){
					$(this).select();
				});
				
			self.showPage(1, false);
		};
		
		function _disableArrows(){
			if (self.isFirstPage) settings.$controls.find('a.prev').parents('li').addClass('disabled');
			else settings.$controls.find('a.prev').parents('li').removeClass('disabled');
			
			if (self.isLastPage) settings.$controls.find('a.next').parents('li').addClass('disabled');
			else settings.$controls.find('a.next').parents('li').removeClass('disabled');
		};
		
		function _buildControls(){
			var $ul = $('<ul class="paginateControls" />');
			var $prev = $('<a href="javascript:void(0);" class="paginate prev imgReplace" rel="prev"><span>Prev</span></a></li>');
			var $next = $('<a href="javascript:void(0);" class="paginate next imgReplace" rel="next"><span>Next</span></a></li>');
			var $input = $('<input type="text" value="1" class="paginationInput" />');
			var $total = $('<span>of ' + self.getTotalPages() + '</span>');
			_liWrap($prev);
			_liWrap($input);
			_liWrap($total);
			_liWrap($next);
			$input.before('<span>page</span>').wrap('<div class="txt" />');
			
			settings.$controls.find('ul.paginateControls').remove().end().append($ul);
			
			function _liWrap($el){
				var $li = $('<li />');
				$li.append($el).appendTo($ul);
			};
		};
		
		function _updateInput(pageNum){
			settings.$controls.find('input.paginationInput').val(pageNum);
		};
		
		function _getStatus(){
			var startPageNum = ((_currentPage - 1) * settings.itemsPerPage) + 1;
			var endPageNum = (self.isLastPage) ? self.getTotalItems() : settings.itemsPerPage * self.getCurrentPage();
			var status = startPageNum + ' - ' + endPageNum;
			return status;
		};
		
		function _setStatus(){
			settings.$status.html('Showing ' + _getStatus() + ' of ' + self.getTotalItems() + ' results found.');
		};
		
		function _createPages(totalPages){
			var selector = settings.$items.selector
			var $items = settings.$element.children(selector).filter(':lt(' + settings.itemsPerPage + ')');
			
			var $page = $('<div class="page" />');
			$page.append($items);
			settings.$element.append($page);
			
			totalPages--;
			if (totalPages > 0) _createPages(totalPages);
		};
		
		function _updateMap(){
			if (settings.map != null){
				var partners = [];
				self.getVisiblePage().find(settings.$items.selector).each(function(){
					partners.push($(this).data('info'));
				});
				
				settings.map.addMarkers(partners, false, true);
			}
		};
		
		// start:public
		this.getStatus = function(){
			return _getStatus();
		};
		
		this.getCurrentPage = function(){
			return parseInt(_currentPage);
		};
		
		this.getVisiblePage = function(){
			return settings.$element.find('div.page:visible');
		};
		
		this.getPages = function(){
			return settings.$element.find('div.page');
		};
		
		this.getTotalPages = function(){
			return _totalPages;
		};
		
		this.getTotalItems = function(){
			return settings.$items.size();
		};
		
		this.getItemsPerPage = function(){
			return settings.itemsPerPage;
		};
		
		this.setItemsPerPage = function(num){
			settings.itemsPerPage = num;
		};
		
		this.setTotalPages = function(totalPages){
			_totalPages = totalPages;
		};
		
		this.setCurrentPage = function(pageNum){
			pageNum = (pageNum < 1) ? 1 : pageNum;
			pageNum = (pageNum > this.getTotalPages()) ? this.getTotalPages() : pageNum;
			_currentPage = pageNum;
			this.isLastPage = (_currentPage >= this.getTotalPages());
			this.isFirstPage = (_currentPage == 1);
		};
		
		this.showPage = function(pageNum, track){
			track = typeof track == 'undefined' ? true : track;
			if (pageNum > this.getTotalPages() || pageNum <= 0) return false;
			this.getPages().hide().eq(pageNum - 1).show();
			this.setCurrentPage(pageNum);
			_updateInput(pageNum);
			_setStatus();
			_updateMap();
			
			$j('html, body').animate({
					scrollTop : $('#mapSection').offset().top
				},{
					duration : 1000,
					easing : 'easeinout'
				});
			
			_disableArrows();
			
			// tracking
			if (track){
				var data = getPartnerLocatorData();
				data.resultSet = _getStatus();
				$j.Avaya.global.Tracking.partnerLocator(data);
			}
		};
		
		this.next = function(){
			this.showPage(this.getCurrentPage() + 1);
		};
		
		this.prev = function(){
			this.showPage(this.getCurrentPage() - 1);
		};
		
		_init();
	};
})($j);

