/**
 * jQuery.LocalScroll
 * Copyright (c) 2007 Ariel Flesler - aflesler(at)gmail(dot)com
 * Licensed under GPL license (http://www.opensource.org/licenses/gpl-license.php).
 * Date: 11/12/2007
 *
 * @projectDescription Same page links auto scrolling.
 *
 * @author Ariel Flesler
 * @version 1.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', speed: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 setted to true, then the binding will still work for later added anchors.
 **/
(function( $ ){
		  
	$.localScroll = function( settings ){
		$('body').localScroll( settings );
	};
	
	$.localScroll.defaults = {//the defaults are public and can be overriden.
		target:'html,body', //what to scroll.
		filter:null, //filter some anchors out of the matched elements.
		speed: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.
		cancel: true//if false, the #some_id will appear on the status bar.
	};
	
	$.fn.localScroll = function( settings ){
		settings = $.extend( {}, $.localScroll.defaults, settings );
		return (settings.persistent) 
					? this.bind( settings.event, function( e ){
						var a = $([e.target, e.target.parentNode]).filter(filter)[0];
						return a && scroll.call( a, e );
					})
					: this.find('a')
							.filter( filter ).bind( settings.event, scroll ).end()
						  .end();
		
		function scroll( e ){
			var id = this.hash.slice(1),
				elem = document.getElementById(id) || $('[name=' + id +']')[0];
			if ( elem ){
				var $target = $(settings.target);
				if( settings.onBefore )
					settings.onBefore.call( this, e, elem, $target );
				$target.scrollTo( elem, settings );
				return !settings.cancel;
			}
		};
		function filter(){
			return local( this ) && (!settings.filter || $(this).is( settings.filter ));
		};
	};
	
	function local( link ){//is this a valid anchor ?
		return !!link.hash && location.href.replace(/#.*/,'') == link.href.replace(link.hash,'');
	};
	
})( jQuery );
