(function ($) {
	$.fn.argoSlide = function (options) {
		var defaults = {
			animate 		: true,
			duration 		: 1000,
			defaultActive 	: 0,
			action 			: 'click'
		}
		
		var options = $.extend (defaults, options);
		
		return this.each (function () {
			obj = $(this);
			var element 		= "#" + obj.attr ('id');
			var numElements 	= _getNumberOfElements(element);
			var tabWidth 		= _findTabWidth (element);
			var tabHeight 		= _findTabHeight (element);
			var divWidth 		= _findDivWidth (element);
			var tabsWidth 		= tabWidth * (numElements + 1);
			var totalWidth 		= tabsWidth + divWidth;
			var previousElement = 0;
			var currentElement 	= 0;
			
			_init (element, options.defaultActive, tabWidth, tabHeight, divWidth, totalWidth, options.animate, options.duration);

			$("a.tabs").bind (options.action, function () {
				previousElement = _getNumberOfActiveElement (element);
				_makeActiveElements ($(this));
				currentElement = _getNumberOfActiveElement (element);
			
				if (previousElement > currentElement) {
				    $("a.tabs").each (function (e) {
				    	if (e > currentElement) {
				    		_extractElement ($(this), divWidth, tabWidth, e, options.animate, options.duration);
				    	}
				    });
				} else {
				    $("a.tabs").each (function (e) {
				        if (e <= currentElement) {
				        	_contractElement ($(this), divWidth, tabWidth, e, options.animate, options.duration);
				        }
				    });
				}
			
			});
		});
	};
})(jQuery);



/**
 * Initialize slide
 * @params element
 * @params tabsWidth
 * @params width
 * @return void
 */
function _init (element, active, tabWidth, tabHeight, divWidth, width, animate, duration) {
	$(element).css('overflow', 'hidden');
	$(element).css('position', 'relative');
	$(element).css('width', width);
	$(element).css('height', tabHeight);
	$(element + " a.tabs").each (function (e) {
		$(this).css('position', 'absolute');
		$(this).css('left', e*tabWidth);
		$(this).addClass ('tab-' + e);
		$(this).css('z-index', (e + 1) * 100);
	});
	$(element + " div.tabsContent").each (function (e) {
		$(this).addClass ('div-' + e);
		$(this).css('z-index', (e + 1) * 100);
		$(this).css('position', 'absolute');
		$(this).css('left', (e + 1) * tabWidth);
		$(this).css('width', divWidth);
	});
	
	// sett default aktivt
	$("a.tabs").each (function (e) {
	    if (e > active) {
	    	_extractElement ($(this), divWidth, tabWidth, e, false, duration);
	    } else if (e == active) {
	    	_makeActiveElements ($(this));
	    }
	});
}



/**
 * Get width of a single tab
 * @params element
 * @return element width
 */
function _findTabWidth (element) {
	return $(element + " a.tabs").width ();
}



/**
 * Get height of a tab
 * @params element
 * @return element height
 */
function _findTabHeight (element) {
	return $(element + " a.tabs").height ();
}



/**
 * Finn bredden på div
 * @params element
 */
function _findDivWidth (element) {
	var elementWidth 	= 0;
	var tabsWidth 		= 0;
	var divWidth 		= 0;
	
	elementWidth = $(element).width ();
	$(element + " a.tabs").each (function (e) {
		tabsWidth = tabsWidth + $(this).width ();
	});
	divWidth = elementWidth - tabsWidth;
	return divWidth;
}



/**
 * Sett aktivt element
 * @params element
 * @return void
 */
function _makeActiveElements (element) {
	$(element).siblings().removeClass ('active');
	$(element).addClass ('active');
	$(element).next().addClass ('active');
}



/**
 * Hent antall elementer
 * @params element
 * @return totalNum
 */
function _getNumberOfElements (element) {
	$totalNum = 0;
	$(element + " .tabs").each (function (e) {
		$totalNum = e;
	});
	return $totalNum;
}



/**
 * Hent nummeret i rekken til aktivt element
 * @params element
 * @return activeElement
 */
function _getNumberOfActiveElement (element) {
	var activeElement = 0;
	$(element + " .tabs").each (function (e) {
		if ($(this).hasClass ('active')) {
			activeElement = e;
		}
	});
	return activeElement;
}



/**
 * Flytt elementer mot høyre
 * @params element
 * @params divWidth
 * @params tabWidth
 * @params currentElement
 * @params animate
 * @params duration
 * @return void
 */
function _extractElement (element, divWidth, tabWidth, currentElement, animate, duration) {
	var distance = (tabWidth * (currentElement + 1)) + divWidth -tabWidth;
	
	if (animate) {
		$(element).animate({
				left: distance
			}, {
				duration: duration, 
				specialEasing: {
					left: 'easeInBounce'
				}
		});
		$(element).next().animate({
				left: distance + tabWidth
			}, {
				duration: duration, 
				specialEasing: {
					left: 'easeInBounce'
				}
		});
	} else {
		$(element).css('left', distance);
		$(element).next().css('left', distance + tabWidth);
	}
}



/**
 * Flytt elementer mot venstre
 * @params element
 * @params divWidth
 * @params tabWidth
 * @params currentElement
 * @params animate
 * @params duration
 * @return void
 */
function _contractElement (element, divWidth, tabWidth, currentElement, animate, duration) {
	var distance = (tabWidth * (currentElement + 1) - tabWidth);
	
	if (animate) {
		$(element).animate({
				left: distance
			}, {
				duration: duration, 
				specialEasing: {
					left: 'easeInBounce'
				}
		});
		$(element).next().animate({
				left: distance + tabWidth
			}, {
				duration: duration, 
				specialEasing: {
					left: 'easeInBounce'
				}
		});
	} else {
		$(element).css('left', distance);
		$(element).next().css('left', distance + tabWidth);
	}
}
