(function($){

	$.fn.slide = function(options) {
		var defaults = {
			contentNode: 		'ol.slideContent',
			slideNode: 			'div.slideNode',
			slideTrigger:		'a.slideTrigger',
			open:				'open',
			update:				[]
		};
		
		var opts = $.extend(defaults, options);
		
		return $(this).each(function(){
			var $node = $(opts.contentNode, this),
				$slideNode = $(opts.slideNode, this),
				$trigger = $(opts.slideTrigger, this),
				$open = $(opts.open, this),
				slideSpeed = 500;
				
			var currHeight = $node.height(),
				newHeight = $node.css({height:'auto'}).height(),
				heightDiff = currHeight - newHeight;
				heightDiff02 = newHeight - currHeight;
				$node.css({height:currHeight+'px'});
			
			if($.browser.msie && $.browser.version < 7) {
				var $iframe = $slideNode.parent()
									.css({position:'relative'})
									.prepend('<iframe frameborder="0"></iframe>')
									.find('iframe')
										.css({
											position:'absolute',
											top:'0',
											left:'0',
											width:$slideNode.width()+'px',
											height:$slideNode.height()+'px',
											zIndex:'1'
										});
			}

			$trigger.click(function(e){
				e.preventDefault();
				if($trigger.hasClass('open')){
					slideClose();
					update($slideNode,false);
				}
				else{
					slideOpen();
					update($slideNode,true);
				}
			});	
			
			function slideOpen(){
				$trigger.addClass('open');
					
				if($iframe) {
					$iframe.animate({
						top:heightDiff,
						height:$iframe.height()-heightDiff
					}, slideSpeed);
				}
				
				$slideNode.animate({
					top:heightDiff, 
					marginBottom:heightDiff
				}, slideSpeed);
				
				$node.animate({
					height:newHeight
				}, slideSpeed);
			}
			
			function slideClose(){
				$trigger.removeClass('open');
					
				if($iframe) {
					$iframe.animate({
						top:0,
						height:0
					}, slideSpeed);
				}
				
				$slideNode.animate({
					top:0, 
					marginBottom:0
				}, slideSpeed);
				
				$node.animate({
					height:currHeight
				}, slideSpeed);
			}
			
			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]);
				}
			}
		});			
	}

})(jQuery)