docs: function(link, fake) {
  		var hash;
  
  		//When complexLinks is enabled, we also accept links which do not just contain a simple hash.
  		if(_complexLinks) {
  			//The link points to something completely different.
  			if(link.hostname !== window.location.hostname) {
  				return false;
  			}
  
  			//The link does not link to the same page/path.
  			if(link.pathname !== document.location.pathname) {
  				return false;
  			}
  
  			hash = link.hash;
  		} else {
  			//Don't use the href property (link.href) because it contains the absolute url.
  			hash = link.getAttribute('href');
  		}
  
  		//Not a hash link.
  		if(!/^#/.test(hash)) {
  			return false;
  		}
  
  		//The link has the ignore attribute.
  		if(!fake && link.getAttribute(MENU_IGNORE_ATTR) !== null) {
  			return false;
  		}
  
  		//Now get the targetTop to scroll to.
  		var targetTop;
  
  		var menuTop;
  
  		//If there's a handleLink function, it overrides the actual anchor offset.
  		if(_handleLink) {
  			menuTop = _handleLink(link);
  		}
  		//If there's a data-menu-top attribute and no handleLink function, it overrides the actual anchor offset.
  		else {
  			menuTop = link.getAttribute(MENU_TOP_ATTR);
  		}
  
  		if(menuTop !== null) {
  			//Is it a percentage offset?
  			if(/p$/.test(menuTop)) {
  				targetTop = (menuTop.slice(0, -1) / 100) * document.documentElement.clientHeight;
  			} else {
  				targetTop = +menuTop * _scale;
  			}
  		} else {
  			var scrollTarget = document.getElementById(hash.substr(1));
  
  			//Ignore the click if no target is found.
  			if(!scrollTarget) {
  				return false;
  			}
  
  			targetTop = _skrollrInstance.relativeToAbsolute(scrollTarget, 'top', 'top');
  
  			var menuOffset = scrollTarget.getAttribute(MENU_OFFSET_ATTR);
  
  			if(menuOffset !== null) {
  				targetTop += +menuOffset;
  			}
  		}
  
  		if(supportsHistory && _updateUrl && !fake) {
  			history.pushState({top: targetTop}, '', hash);
  		}
  
  		var menuDuration = parseInt(link.getAttribute(MENU_DURATION_ATTR), 10);
  		var animationDuration = _duration(_skrollrInstance.getScrollTop(), targetTop);
  
  		if(!isNaN(menuDuration)) {
  			animationDuration = menuDuration;
  		}
  
  		//Trigger the change if event if there's a listener.
  		if(_change) {
  			_change(hash, targetTop);
  		}
  
  		//Now finally scroll there.
  		if(_animate && !fake) {
  			_skrollrInstance.animateTo(targetTop, {
  				duration: animationDuration,
  				easing: _easing
  			});
  		} else {
  			defer(function() {
  				_skrollrInstance.setScrollTop(targetTop);
  			});
  		}
  
  		return true;
  	}