(function($){
	
	var defaults = {
		positions:["first", "second", "third", "fourth"],
		sections:[],
		numLoaded:0,
		curSection:0,
		interval:0,
		duration:3000,
		collapseHeight:20,
		autoplay:true,
		pauseOnOver:true,
		circular:true,
		disabled:false,
		linkTarget:'_self',
		openEvent:'mouseover',
		onOpen:null,
		onClose:null
	};
	
	var methods = {
		init:function(options){		
			return $(this).each(function(){
				var settings = { target:$(this) };
				$.extend(settings, defaults, options);
				
				settings.target = $(this);
				
				if(!$(this).data('iwsAccordion')){
					$(this).data('iwsAccordion', {
						settings:settings
					});
					
					var sections = settings.sections;
					for(var i = 0; i < sections.length; i++){
						var position = settings.positions[i],
							section = $('<div>', { className:'iws-accordion-section ' + position, height:settings.collapseHeight }),
							container = $('<div>', { className:'iws-accordion-content' }),
							title = $('<h3>', { html:sections[i].title }),
							img = $('<img>', { src:sections[i].image.replace('\\', '') })
						
						//when image loads, update height of container
						img.bind('load.iwsAccordion complete.iwsAccordion', function(e){
							$(this).parent().height($(this).height());
							settings.numLoaded++;
							if(settings.autoplay && settings.numLoaded == sections.length){
								settings.target.iwsAccordion('open', 0);
								settings.target.iwsAccordion('pause', false);
							}
						}).bind('click.iwsAccordion', function(e){
							if(settings.sections[settings.curSection].link != ""){
								if(settings.sections[settings.curSection].target){
									window.open(settings.sections[settings.curSection].link, settings.sections[settings.curSection].target);
								} else {
									window.open(settings.sections[settings.curSection].link, settings.linkTarget);
								}
							}
						});
						
						//add title and image to container, add container to section, and add section to accordion
						container.append(title).append(img).appendTo(section).parent().appendTo($(this));
					}
					
					//bind open events to each section
					$(this).children('.iws-accordion-section').each(function(i){
						$(this).bind(settings.openEvent + '.iwsAccordion', function(){
							settings.target.iwsAccordion('open', i);
						})
					});
					
					//if autoplay is set to true and pause on over is true, pause the slideshow on over
					if(settings.autoplay && settings.pauseOnOver){
						$(this).bind('mouseover.iwsAccordion', function(){
							$(this).iwsAccordion('pause', true);
						}).bind('mouseout.IwsAccordion', function(){
							$(this).iwsAccordion('pause', false);
						});
					}
					
					if(sections && sections.length > 0){
						$(this).show();
					}
				}
			});
		},
		
		reinit:function(options){
			return $(this).each(function(){
				$(this).iwsAccordion('destroy');
				$(this).iwsAccordion('init', options);
			});
		},
		
		option:function(option, value){
			if(option != null){
				if(value != null){
					return $(this).each(function(){
						$(this).data('iwsAccordion').settings[option] = value;
					});
				} else {
					return $(this).data('iwsAccordion').settings[option];
				}
			} else {
				return $(this).data('iwsAccordion').settings;
			}
		},
		
		prev:function(){
			return $(this).each(function(){
				var settings = $(this).data('iwsAccordion').settings
			});
		},
		
		next:function(){
			return $(this).each(function(){
				var target = $(this),
					settings = $(this).data('iwsAccordion').settings,
					sections = settings.sections,
					curSection = settings.curSection
				
				if(++curSection >= sections.length) curSection = 0;
				settings.curSection = curSection;

				target.iwsAccordion('open', settings.curSection);
			});
		},
		
		open:function(index){
			return $(this).each(function(){
				var settings = $(this).data('iwsAccordion').settings;
				
				settings.curSection = index
				$(this).children('.iws-accordion-section').each(function(i){
					$(this).stop().animate({ height: i == index ? $(this).children(':first').height() : settings.collapseHeight });
					$(this).find('img').stop().fadeTo('', i == index ? 1 : 0);
				});
			});
		},
		
		close:function(index){
			return $(this).each(function(){
				var settings = $(this).data('iwsAccordion').settings;
				
				if(index){
					$(this).children('.iws-accordion-section').eq(index).animate({ height:settings.collapseHeight }).find('img').fadeTo('', 0);
				} else {
					$(this).children('.iws-accordion-section').each(function(i){
						$(this).stop().animate({ height:settings.collapseHeight });
						$(this).find('img').stop().fadeTo('', 0);
					});
				}				
			});
		},
		
		change:function(){
			return $(this).each(function(){
				var settings = $(this).data('iwsAccordion').settings
			});
		},
		
		pause:function(p){
			return $(this).each(function(){
				var target = $(this),
					settings = $(this).data('iwsAccordion').settings,
					sections = settings.sections,
					curSection = settings.curSection,
					dur = sections[curSection].duration
				
				//if paused, clear the current interval, else start it up again	
				if(p){
					clearInterval(settings.interval);
				} else {
					if(settings.sections.length > 1){
						settings.interval = setInterval(function() { target.iwsAccordion('next') }, dur ? dur : settings.duration);
					}
				}
			});
		},
		
		enable:function(){
			return $(this).each(function(){
				$(this).data('iwsAccordion').settings.disabled = false;
			});
		},
		
		disable:function(){
			return $(this).each(function(){
				$(this).data('iwsAccordion').settings.disabled = true;
			});
		},
		
		destroy:function(){
			return $(this).each(function(){
				$(this).data('iwsAccordion', null);
				$(this).empty();
			});
		}
	};
	
	$.fn.iwsAccordion = function(method){
		if (methods[method]){
			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method === 'object' || !method) {
			return methods.init.apply(this, arguments);
		} else {
			$.error('Method ' +  method + ' does not exist on jQuery.iwsAccordion');
		}    
	};
})(jQuery);
