var SearchNavigator = (function() {
	var _init = function() {		
		_self.Pages = [];
		_self.FirstSet = {active: false, start: 0};
		_self.Previous = {active: false, start: 0};
		_self.Next = {active: false, start: 0};
		_self.LastSet = {active: false, start: 0};
	};
	var _self = {
		PageSize: 10,					//Page size or number of results to be displayed per page
		SetSize: 10,					//Max number of pages that will be displayed in navigation at a time (browseable)
		Start: 0,						//Current Record Start
		SetCount: 0,					//Number of Sets
		PageCount: 0,					//Number of Pages
		TotalCount: 0,					//Set Size
		CurrentPage: 0,					//Current Active Page
		Pages: [],						//Window of pages you can access at a time
		First: {
			active: false,
			start: 0
		},
		FirstSet: {
			active: false,
			start: 0
		},
		Previous: {
			active: false,
			start: 0			
		},
		PreviousSet: {
			active: false,
			start: 0			
		},
		Next: {
			active: false,
			start: 0
		},
		NextSet: {
			active: false,
			start: 0			
		},
		LastSet: {
			active: false,
			start: 0
		},
		Last: {
			active: false,
			start: 0
		},
		Paginate: function(_options) {
			_init();
			if(!!_options) {
				$.extend(_self, _options);
			}
			_self.Start = typeof(_self.Start) !== "number"?0:_self.Start >= 0?_self.Start:0;
			_self.PageCount = Math.ceil(_self.TotalCount / _self.PageSize);
			_self.SetCount = Math.ceil(_self.PageCount / _self.SetSize);
			var _setSize = _self.PageCount * _self.SetSize;
			var _pageSize = _self.PageSize * _self.SetSize;
			
			var clickedAnchorNumber = Math.floor(_self.Start/_self.PageSize)+1;  //clicked anchor number
			_self.CurrentPage = clickedAnchorNumber;
				
			var startAnchorNumber = 1, lastStartAnchorNumber = 0, tempNumOfPages = _self.PageCount;
			var remainder = (_self.Start)%(_pageSize);
				
				startAnchorNumber = Math.floor((_self.Start/_self.PageSize)+1);
				_self.CurrentSet = Math.floor((startAnchorNumber-1)/_self.SetSize)+1;
				
			if(remainder !== 0) {
				startAnchorNumber = (_self.CurrentSet * _self.SetSize) - (_self.SetSize-1)
			}			
			//Current Page in a Set
						
			//FirstSet/Prev Links
			if(startAnchorNumber > _self.SetSize){
				 //'FirstSet' link code
				 _self.FirstSet.active = true;
				 _self.FirstSet.start = (0*_self.PageSize);
				 //'PreviousSet' link code
				 if((startAnchorNumber-_self.SetSize) > 0){
					_self.PreviousSet.active = true;
					_self.PreviousSet.start = ((startAnchorNumber - _self.SetSize) * _self.PageSize) - _self.PageSize;
				}
			 }
			
			var _cPage, _start;
			for(var i = 0; i < _self.SetSize; i++){
				_start = (startAnchorNumber-1)*_self.PageSize;	
				if(_start > _self.TotalCount) {
					break;
				}
				 //Set Pages
				if(i < (startAnchorNumber + _self.SetSize)){	//numbered anchors code
					_cPage = {
						start: _start,
						page: startAnchorNumber
					};				 
					if(startAnchorNumber === clickedAnchorNumber){
						_cPage.selected = true;						
					}
					_self.Pages.push(_cPage);
				}				
				startAnchorNumber++;
			}//End Loop
			if(!!_self.PageCount) {
				
				if(_self.SetCount > 1) {
					_self.LastSet = { active:true, start: (((_self.SetCount-1) * _self.SetSize)) * _self.PageSize };
					if(_self.CurrentSet < _self.SetCount) {
						_self.NextSet = {active:true, start: _self.CurrentSet * _pageSize };
					}
				}
				
				if(_self.Start >= 0 && (_self.Start + _self.PageSize) < _self.TotalCount) {
					_self.Next = { active: true, start: _self.Start + _self.PageSize };
					_self.Last = { active: true, start: (_self.PageCount * _self.PageSize)-_self.PageSize};
				}
				
				if(_self.Start > 0 && _self.Start <= _self.TotalCount) {
					_self.Previous = { active: true, start: _self.Start-_self.PageSize };
					_self.First.active = true;
				}
				
			}
			return _self;
		}
	};
	
	return _self;							
})();