jQuery.fn.extend({
	nextUntil:function(expr) {	    
		var match = [];	      
		this.each(function(){	                
			for( var i = this.nextSibling; i; i = i.nextSibling ) {	                        
				if ( i.nodeType != 1 ) continue;	        
				if ( jQuery.filter( expr, [i] ).r.length ) break;                         
				match.push( i );	        
			}	    
		});
		return this.pushStack(match);
	},	
	Accordion: function(settings) {			
		settings = jQuery.extend({}, jQuery.Accordion.defaults, {header: jQuery(':first-child', this)[0].tagName}, settings);
		if (settings.navigation) {
			var current = this.find("a").filter(function() {return (location.href == this.href);});
			if (current.length) {			  
				var nodes = current.parents().filter(function() {return $("li", this);}).children("a.head");
				settings.active = current.add(nodes);  				
				current.addClass(settings.selectedClass);	
			}		
		}		
		var container = this;
		var active=jQuery(settings.active, this);
		var running = 0;
		var headers = container.find(settings.header);
		active.addClass(settings.selectedClass);	
		var toShow = active.nextUntil(settings.header);
		toShow.slideDown(settings.showSpeed);
		
		function toggle(toShow, toHide, data, clickedActive) {			
			var finished = function(cancel) {				
				running = cancel ? 0 : --running;				
				if (running) return;				
				container.trigger("change", data);		
			};					
			running = toHide.size() + toShow.size();	
			if (clickedActive) {		
				toShow.slideToggle(settings.showSpeed);					
				finished(true);				
			} else {					
				toHide.filter(":hidden").each(finished).end().filter(":visible").slideUp(settings.hideSpeed, finished);					
				toShow.slideDown(settings.showSpeed, finished);				
			}			
		}		
	
		function clickHandler(event) {		
			var clicked = jQuery(event.target);
			if (clicked.length > 0 && !clicked[0].href.match("accordion")) {        
				location.href = clicked[0].href;
				return;      
			}	
			var clickedActive = clicked[0] == active[0];
			if(running || !clicked.is(settings.header)) return;	
			active.not(clicked.parents().filter(function() {return $("li", this);}).children("a.head")).toggleClass(settings.selectedClass);
			//*Rememeber add in here to close parent elements upon starting new page unless no menu highlighted!!
			if (!clickedActive ) {
				clicked.addClass(settings.selectedClass);
			} else { 
				clicked.toggleClass(settings.selectedClass);
			}		
			$("a.on").nextUntil(settings.header)		
			var toShow = clicked.nextUntil(settings.header);			  		
			var toHide = active.nextUntil(settings.header).add(active.parents().filter(function() {return $("li.level1", this) == 0;}).children("a.head")).not(clicked.parents()), data = [clicked, active, toShow, toHide]; 
			active = clickedActive?jQuery([]):clicked;
			toggle( toShow, toHide, data, clickedActive );
			return !toShow.length;		
		};		
		function activateHandler(event, index) {		
			if ( index == null ) return;					
			clickHandler({target:index >= 0? jQuery(settings.header, this)[index]:typeof index == "string" ? jQuery(index, this)[0]:null});		
		};		
		container.bind("activate", activateHandler);		
		return container.bind(settings.event, clickHandler)	
	},	
	activate:function(index){
		return this.trigger('activate', [index]);
	}
});
jQuery.Accordion = {};
jQuery.extend(jQuery.Accordion,{	
	defaults:{		
		selectedClass: "on",		
		showSpeed: 'normal',		
		hideSpeed: 'normal',		
		alwaysOpen: false,		
		animated: true,		
		event: "click"	
	}
});