(function( $ ){

	var CONFIG;
	var CONTAINER;
	
	var defaults = {
		"php_path"		: false,
		"enableLinks"	: true,
		"showBullets"	: true,
		"showPlayPause"	: true,
		"showPrevNext"	: true,
		"centerControls": true,
		"autoPlay"		: true,
		"duration"		: 4000,
		"fadeTime"		: 2000
	}
	
	var _id		= 0;
	var _newId	= 0;
	var _playing	= false;
	var _data;
	var _timer;
	var _buttons = {};
	
	var methods =
	{
		init : function( $config )
		{
			CONFIG		= $.extend(defaults, $config);
			CONTAINER	= $(this);
			
			CONTAINER.empty();
			
			loadData(CONFIG.php_path);
		},
		play : function()
		{
			startAutoPlay();
		},
		pause : function()
		{
			stopAutoPlay();
		},
		showPrev : function()
		{
			var newId = _id == 0 ? _data.length - 1 : _id - 1;
			methods.animateIn(newId);
		},
		showNext : function()
		{
			var newId = _id == _data.length - 1 ? 0 : _id + 1;
			methods.animateIn(newId);
		},
		animateIn : function($newId)
		{
			_newId = parseInt($newId);
			
			_buttons.bullets[_id].removeClass('active');
			_buttons.bullets[_newId].addClass('active');
			
			_data[_id].obj.css({"z-index": 1});
			_data[_newId].obj.css({"z-index": 2, "opacity": 0, "display": "block"});
			_data[_newId].obj.animate( { opacity: 1 }, CONFIG.fadeTime, methods.animationComplete);
		},
		animationComplete: function()
		{
			_data[_id].obj.css({"opacity": 0, "display": "none"});
			_id = _newId;
			if(CONFIG.autoPlay)
				startAutoPlay();
		}
	};
	
	
	
	function startAutoPlay()
	{
		CONFIG.autoPlay = true;
		if(CONFIG.showPlayPause)
		{
			_buttons.play_pause.empty().append(_buttons.pause);
			_buttons.pause.bind("click", methods.pause);
		}
		_timer = window.setTimeout(methods.showNext, CONFIG.duration);
	}
	
	function stopAutoPlay()
	{
		CONFIG.autoPlay = false;
		if(CONFIG.showPlayPause)
		{
			_buttons.play_pause.empty().append(_buttons.play);
			_buttons.play.bind("click", methods.play);
		}
		window.clearTimeout(_timer);
	}
	
	function clickNext()
	{
		stopAutoPlay();
		methods.showNext();
	}
	
	function clickPrev()
	{
		stopAutoPlay();
		methods.showPrev();
	}
	
	function clickBullet()
	{
		stopAutoPlay();
		if(_id != $(this).attr('aabs-id'))
			methods.animateIn($(this).attr('aabs-id'));
	}
	
	function startSlider()
	{
		_data[_id].obj.css({"opacity": 1, "display": "block"});
		_buttons.bullets[_id].addClass('active');
		
		if(CONFIG.autoPlay)
			startAutoPlay();
		else
			stopAutoPlay();
	}
	
	function loadData($php_path)
	{
		$.ajax(
			{
				url: $php_path,
				dataType: "json",
				success: initSlider,
				error: function() { log("ajax error"); }
			}
		);
	}
	
	function initSlider($data)
	{
		_data = $data;
		for(var i = 0; i < _data.length; i++)
		{
			createImage(_data[i], i);
		}
		createControls();
		startSlider();
	}
	
	function createImage($dataset, $id)
	{
		var image = $("<img>");
		image.attr("src", $dataset.image);
		image.attr("aabs-id", $id);
		image.css({"position": "absolute", "opacity": 0, "display": "none" });
		
		_data[$id].obj = image;
		
		CONTAINER.append(image);
	}
	
	function createControls()
	{
		var controls = $('<div id="aaBasicSlideshow-controls">');
		
		if(CONFIG.showBullets)
		{
			_buttons.bulletHolder = $('<div id="aaBasicSlideshow-holder-bullets">');
			_buttons.bullets = new Array();
			for (var i = 0; i < _data.length; i++)
			{
				_buttons.bullets.push($('<div class="aaBasicSlideshow-button aaBasicSlideshow-bullet" aabs-id="' + i + '">'));
				_buttons.bullets[i].bind('click', clickBullet);
				_buttons.bulletHolder.append(_buttons.bullets[i]);
			}
		}
		
		if(CONFIG.showPlayPause)
		{
			_buttons.play_pause = $('<div id="aaBasicSlideshow-holder-play_pause" class="aaBasicSlideshow-button">');
			_buttons.play = $('<div id="aaBasicSlideshow-btn-play">');
			_buttons.pause = $('<div id="aaBasicSlideshow-btn-pause">');
			controls.append(_buttons.play_pause);
		}
		if(CONFIG.showPrevNext)
		{
			_buttons.prev = $('<div id="aaBasicSlideshow-btn-prev" class="aaBasicSlideshow-button">');
			_buttons.prev.bind('click', clickPrev);
			controls.append(_buttons.prev);
			
			if(CONFIG.showBullets)
				controls.append(_buttons.bulletHolder);
			
			_buttons.next = $('<div id="aaBasicSlideshow-btn-next" class="aaBasicSlideshow-button">');
			_buttons.next.bind('click', clickNext);
			controls.append(_buttons.next);
		}
		else if(CONFIG.showBullets)
		{
			controls.append(_buttons.bulletHolder);
		}
		
		if(CONFIG.centerControls)
			controls.css("width", CONTAINER.width() + "px");
		
		CONTAINER.append(controls);
	}
	
	

	$.fn.aaBasicSlideshow = 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.aaBasicSlideshow' );
	    }
	};

})( jQuery );
