(function($) {

    $.fn.imageBarSlider = function(options) {
        var defaults = {
            elemWrapper: '.itemList',
            elemItemContainer: '.itemList ul',
            elemItems: '.itemList .item',
            elemButtonPrevious: '.previousLink a',
            elemButtonNext: '.nextLink a',
            slideDuration: 1500
        };

        var options = $.extend(defaults, options);
        
        // init elements
        var elemImageBar = $(this);
        var elemWrapper  = elemImageBar.find(options.elemWrapper);
        var elemItemContainer = elemImageBar.find(options.elemItemContainer);
        var elemItems    = elemImageBar.find(options.elemItems);
        
        var elemBtnPrev  = elemImageBar.find(options.elemButtonPrevious);
        var elemBtnNext  = elemImageBar.find(options.elemButtonNext);
        
        
        // initial calculations and settings
    	var currentElementPtr = 0;
    	var totalWidth = 0;
    	
    	var oldPrevBtnLinkHtml = elemBtnPrev.html();
    	var oldNextBtnLinkHtml = elemBtnNext.html();
    	
    	var isBtnPrevEnabled = null;
    	var isBtnNextEnabled = null;
    	
    	var isAnimating = false;

    	
    	
    	function init()
    	{
        	// calculate the total width for all images next to each other
        	// and set the item container to that calculated width
        	elemItems.each(function(i) {
        		totalWidth += $(this).outerWidth(true);
        	});
        	elemItemContainer.width(totalWidth);
        	
        	// update the previous and next buttons
        	updateButtons();
        	
        	
        	elemBtnNext.click(function() {
        		
        		if (!isAnimating) {
        			disableButtons();
        			next();
        		}
    			$(this).blur();
    			return false;
    		});

    		elemBtnPrev.click(function(){
        		
    			if (!isAnimating) {
        			disableButtons();
    				previous();
    			}
    			$(this).blur();
    			return false;
    		});
    		
    		elemBtnNext.removeClass('nextLinkInactive');
    		elemBtnPrev.removeClass('previousLinkInactive');
    		
    		elemBtnNext.attr('href', '#');
    		elemBtnPrev.attr('href', '#');
    	}
    	
    	
    	
    	function isNextAvailable()
    	{
    		// calculate the right position of the last item 
    		var elem = $(elemItems[elemItems.length - 1]);
    		var positionRight = elem.position().left + elem.outerWidth();
    		var containerWidth = elemWrapper.width();
    		
    		// is the right corner of the last item within the wrapper?
    		return positionRight > containerWidth;
    	}
    	
    	function isPreviousAvailable()
    	{
    		return (currentElementPtr > 0);
    	}
    	
    	function next()
    	{
    		// calculate new values
			var currentScrollPositionX = elemWrapper.scrollLeft();
			var currentElemWidth       = $(elemItems[currentElementPtr]).outerWidth(true);
			var newScrollPositionX     = currentScrollPositionX + currentElemWidth;

			// increase element pointer
			++currentElementPtr;
			
			// set the animating flag
			isAnimating = true;
			
			// animate
			elemWrapper.animate({
				"scrollLeft": newScrollPositionX
			}, options.slideDuration, function(){ isAnimating = false; updateButtons() });
    	}
    	
    	function previous()
    	{
    		// calculate new values
			var currentScrollPositionX = elemWrapper.scrollLeft();
			var previousElemWidth      = $(elemItems[currentElementPtr - 1]).outerWidth(true);
			var newScrollPositionX     = currentScrollPositionX - previousElemWidth;

			// decrease element pointer
			--currentElementPtr;
			
			// set the animating flag
			isAnimating = true;
			
			// animate
			elemWrapper.animate({
					"scrollLeft": newScrollPositionX
			}, options.slideDuration, function(){ isAnimating = false; updateButtons() });
    	}
    	
    	
    	// checks if the buttons are active or not and (de)activates them
    	function updateButtons()
    	{
			// next button
    		var canDoNext = isNextAvailable();
			if (canDoNext && (isBtnNextEnabled === false || isBtnNextEnabled === null)) {
				enableButtonNext(true);
			}
			else if (!canDoNext && (isBtnNextEnabled === true || isBtnNextEnabled === null)) {
				enableButtonNext(false);
			}

			// previous button
    		var canDoPrev = isPreviousAvailable();
			if (canDoPrev && (isBtnPrevEnabled === false || isBtnPrevEnabled === null)) {
				enableButtonPrevious(true);
			}
			else if (!canDoPrev && (isBtnPrevEnabled === true || isBtnPrevEnabled === null)) {
				enableButtonPrevious(false);
			}
    	}
    	
    	
    	
    	function disableButtons()
    	{
    		enableButtonNext(false);
    		enableButtonPrevious(false);
    	}
    	
    	
    	
    	function enableButtonNext(enable)
    	{
    		if (enable) {
    			elemBtnNext.parent().removeClass('nextLinkInactive');
    			isBtnNextEnabled = true;
    		}
    		else {
    			elemBtnNext.parent().addClass('nextLinkInactive');
    			isBtnNextEnabled = false;
    		}
    	}
    	
    	
    	function enableButtonPrevious(enable)
    	{
    		if (enable) {
    			elemBtnPrev.parent().removeClass('previousLinkInactive');
    			isBtnPrevEnabled = true;
    		}
    		else {
    			elemBtnPrev.parent().addClass('previousLinkInactive');
    			isBtnPrevEnabled = false;
    		}
    	}
		
    	init();

    };
})(jQuery);