(function($){

	$.fn.accordion = function(options) {

		var defaults = {
			node: 		'div.node',
			heading:	'h2',
			content:	'div.content',
			open:		'open',
			speed:		'normal',
			update:		[],
			forceClose:	true,
			blockLinks:	true,
			onopen:	function(){}
		};
		
		var opts = $.extend(defaults, options);
		
		return $(this).each(function(){
			var nodes = $(opts.node,this);
			var openElm = null;
			
			nodes.each(function(){

				var obj = this;
				
				$(opts.content,this).each(function(){
					var w = this.offsetWidth;
					$(this).css({width:w+'px'});
				});
				
				if($(this).hasClass(opts.open) && !openElm) {
					openElm = obj;
					opts.onopen(obj);
					update(obj,true);
				}
				else {
					$(this).removeClass(opts.open);
					$(opts.content,this).hide();
					update(obj,false);
				}
				
				$(this).find(opts.heading)
					.css({cursor:'pointer'})
					.click(function(){
						if(openElm && openElm != obj && opts.forceClose) {
							closeElem(openElm,function(){
								if(toggleElem(obj)) {
									openElm = obj;
									opts.onopen(obj);
								}
							});
						}
						else {
							if(toggleElem(obj)) {
								openElm = obj;
								update(obj,true);
								opts.onopen(obj);
							}
						}
					})
					.find('a').each(function(){
						if(opts.blockLinks) {
							$(this).click(function(e){e.preventDefault();});	
						}
					});
					
			});
		});
		
		function closeElem(node,callback) {
			$(node).removeClass(opts.open);
			$('*',node).css({position:'static'});
			$('div.infoPoint00',node).hide();
			$(opts.content,node).slideUp(opts.speed,callback);
			update(node,false);
		}
		
		function update(node,isopen) {
			for(var i=0;i<opts.update.length;i++) {
				$(opts.update[i].selector,node).html(opts.update[i].text[isopen?0:1]).click(function(e){e.preventDefault()});
			}
		}
		
		function toggleElem(node) {
			$(node).toggleClass(opts.open);
			$('*',node).css({position:'static'});
			$('div.infoPoint00',node).hide();
			$(opts.content,node).slideToggle(opts.speed,function(){$('*',node).css({position:''});});
			var open = $(node).hasClass(opts.open);
			update(node,open);
			return open;
		}
		
	}

})(jQuery)