var SearchNavigator = (function() {
	var PAGE_START_FROM = 1;
	
 	function _init() {
		_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: PAGE_START_FROM,						//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: PAGE_START_FROM
		},
		FirstSet: {
			active: false,
			start: PAGE_START_FROM
		},
		Previous: {
			active: false,
			start: PAGE_START_FROM			
		},
		PreviousSet: {
			active: false,
			start: PAGE_START_FROM			
		},
		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"?PAGE_START_FROM:_self.Start >= PAGE_START_FROM?_self.Start:PAGE_START_FROM;
			_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, tempNumOfPages = _self.PageCount;
			var remainder = (_self.Start)%(_pageSize);
				
				startAnchorNumber = Math.floor((_self.Start/_self.PageSize) + PAGE_START_FROM);
				_self.CurrentSet = Math.floor((startAnchorNumber-1)/_self.SetSize)+1;
				
			if(remainder !== PAGE_START_FROM) {
				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) + PAGE_START_FROM;
				}
			 }
			
			var _cPage, _start;
			for(var i = 0; i < _self.SetSize; i++){
				_start = ((startAnchorNumber-1)*_self.PageSize)+PAGE_START_FROM;	
				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)+PAGE_START_FROM };
					}
				}
				
				if(_self.Start >= PAGE_START_FROM && (_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)+PAGE_START_FROM};
				}
				
				if(_self.Start >= _self.PageSize && _self.Start <= _self.TotalCount) {
					_self.Previous = { active: true, start: _self.Start-_self.PageSize };
					_self.First.active = true;
				}
				
			}
			return _self;
		}
	};
	
	return _self;							
})();
