/**
 * jQuery.LocalScroll
 * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com
 * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
 * Date: 2/6/2008
 *
 * @projectDescription Animated scrolling navigation, using anchors.
 * @author Ariel Flesler
 * @version 1.2
 *
 * @id jQuery.fn.localScroll
 * @param {Object} settings Hash of settings, it is passed in to jQuery.ScrollTo, none is required.
 * @return {jQuery} Returns the same jQuery object, for chaining.
 *
 * @example $('ul.links').localScroll();
 *
 * @example $('ul.links').localScroll({ filter:'.animated', duration:400, axis:'x' });
 *
 * @example $.localScroll({ target:'#pane', axis:'xy', queue:true, event:'mouseover' });
 *
 * Notes:
 *	- The plugin requires jQuery.ScrollTo.
 *	- The hash of settings, is passed to jQuery.ScrollTo, so the settings are valid for that plugin as well.
 *	- jQuery.localScroll can be used if the desired links, are all over the document, it accepts the same settings.
 *  - If the setting 'persistent' is set to true, then the binding will still work for later added anchors.
 *  - The setting 'speed' is deprecated, use 'duration' instead.
 **/
;(function( $ ){
	
	var URI = location.href.replace(/#.*/,'');//local url without hash
	 
	var $localScroll = $.localScroll = function( settings ){
		$('body').localScroll( settings );
	};
	
	//Many of these defaults, belong to jQuery.ScrollTo, check it's demo for an example of each option.
	//@see http://www.freewebs.com/flesler/jQuery.ScrollTo/
	$localScroll.defaults = {//the defaults are public and can be overriden.
		target:null, //what to scroll (selector or element). Keep it null if want to scroll the whole window.
		filter:null, //filter some anchors out of the matched elements.
		duration:1000, //how long to animate.
		axis:'y',//which of top and left should be modified.
		event:'click',//on which event to react.
		persistent:false,//if true, links can be added later, and will still work.
		stop:true,//avoid queuing animations 
		hash: false//if true, the hash of the selected link, will appear on the address bar.
	};
	
	//if the URL contains a hash, it will scroll to the pointed element
	$localScroll.hash = function( settings ){
		settings = $.extend( {}, $localScroll.defaults, settings );
		settings.hash = false;//can't be true
		if( location.hash )
			setTimeout(function(){ scroll( 0, location, settings ); }, 0 );//better wrapped in a setTimeout
	};
	
	$.fn.localScroll = function( settings ){
		settings = $.extend( {}, $localScroll.defaults, settings );
		settings._a = settings.onAfter;//save it
		
		return (settings.persistent) 
				? this.bind( settings.event, function( e ){//use event delegation, more links can be added later.
					var a = $([e.target, e.target.parentNode]).filter(filter)[0];//if a valid link was clicked.
					a && scroll( e, a, settings );//do scroll.
				})
				: this.find('a')//bind concretely, to each matching link
						.filter( filter ).bind( settings.event, function(e){
							scroll( e, this, settings );
						}).end()
					.end();
		
		function filter(){//is this a link that points to an anchor and passes a possible filter ?
			return !!this.hash && this.href.replace(this.hash,'') == URI && (!settings.filter || $(this).is( settings.filter ));
		};
	};
	
	function scroll( e, link, settings ){
		var id = link.hash.slice(1),
			elem = document.getElementById(id) || document.getElementsByName(id)[0];
		if ( elem ){
			e && e.preventDefault();
			var $target = $( settings.target || $.scrollTo.window() );//if none specified, then the window.
			if( settings.onBefore )
				settings.onBefore.call( link, e, elem, $target );
			if( settings.stop )
				$target.queue('fx',[]).stop();//remove all its animations
			if( settings.hash ){
				settings.onAfter = function(){
					location = link.hash;
					if( settings._a ) 
						settings._a.apply(this,arguments);
				};
			}
			$target.scrollTo( elem, settings );//scroll the element or the window
		}
	};
	
})( jQuery );