(function( $ ) {
	$.fn.slidingTabs = function(_tabContentHolder, settings) {
		
		settings = $.extend({}, $.fn.slidingTabs.defaults, settings);
		
		storedSelectedIndex = -1;
		
		var $sliding_tabs = $(this);
		
		$(this).children().click(function() {
			
			//find associated content panel
			var tabIndex = $(this).parent().children().index(this);
			var tabContent = $(_tabContentHolder+" :nth-child("+(tabIndex+1)+")");
			
			//store vars for use in refresh functionality
			storedSelectedIndex = tabIndex;
			
			//this doesn't work properly for some reason, using manual approach (below)
			//var tabContentX = tabContent.offset().left - tabContent.parent().offset().left;
			//var tabContentXFormatted = 0-tabContentX;
			
			//determine actual relative x position of specified content panel
			//var newX = 0;
			var tabContentXFormatted = 0;
			for(var i=0;i<tabIndex;i++) {
				//newX += $(_tabContentHolder).children().eq(i).outerWidth();
				tabContentXFormatted -= $(_tabContentHolder).children().eq(i).outerWidth();
			}
			//var tabContentXFormatted = 0-newX;
			
			//move to the correct location
			$(_tabContentHolder).animate({
				left: tabContentXFormatted
			}, null, function() {
				var event = jQuery.Event("slide_complete");
				$sliding_tabs.trigger(event);
			});
			
			//optional background animation
			if(settings.useBackgroundEffect) {
				$(settings.backgroundEffectWrapper).animate({
					backgroundPosition: tabContentXFormatted * settings.backgroundEffectAnimationPercent + "px 0px"
				});
			}
			
			//update styles
			$(this).setAllSelectedTabs(_tabContentHolder, tabContentXFormatted, tabIndex, settings);
		});
		
	};
	
	$.fn.setSelectedTab = function(settings) {
		settings = $.extend({}, $.fn.slidingTabs.defaults, settings);
		$(this).parent().children().removeClass(settings.selectedItemStyleName);
		$(this).addClass(settings.selectedItemStyleName);
	};
	
	$.fn.refreshAllSelectedTabs = function(_tabContentHolder) {
		var tabIndex = storedSelectedIndex;
		
		//determine actual relative x position of specified content panel
		var newX = 0;
		for(var i=0;i<tabIndex;i++) {
			newX += $(_tabContentHolder).children().eq(i).outerWidth();
		}
		var tabContentXFormatted = 0-newX;
		
		$(this).children().eq(0).setAllSelectedTabs(_tabContentHolder, tabContentXFormatted, tabIndex);
	};
	
	$.fn.updateContentPositioning = function(_tabContentHolder) {
		var tabIndex = storedSelectedIndex;
		
		//determine actual relative x position of specified content panel
		var newX = 0;
		for(var i=0;i<tabIndex;i++) {
			newX += $(_tabContentHolder).children().eq(i).outerWidth();
		}
		var tabContentXFormatted = 0-newX;
		
		//move to the correct location
		$(_tabContentHolder).css({
			left: tabContentXFormatted
		});
	};
	
	$.fn.setAllSelectedTabs = function(_tabContentHolder, _newXPos, _index, settings) {
		settings = $.extend({}, $.fn.slidingTabs.defaults, settings);
		
		$(this).parent().children().removeClass(settings.selectedItemStyleName);
		
		var docWidth = $(document).width();
		var tabSelected = false;
		var firstIndex = -1;
		var lastIndex = -1;
		
		for(var i=0;i<$(_tabContentHolder).children().size();i++) {
			//check to see if x position of element + width of element + scroll position is > document width or < 0
			var leftXPos = 0;
			var rightXPos = 0; //for this we're including the current element, because we only want to select it if it's 100% visible
			
			for(var j=0;j<=i;j++) {
				if(j<i) {
					leftXPos += $(_tabContentHolder).children().eq(j).outerWidth();
				}
				rightXPos += $(_tabContentHolder).children().eq(j).outerWidth();
			}
			
			var leftXModPos = leftXPos + _newXPos;
			var rightXModPos = rightXPos + _newXPos;
			
			if(leftXModPos >= 0 && rightXModPos < $(document).width()) {
				
				//these are visible
				tabSelected = true;
				if(firstIndex == -1) {
					firstIndex = i;
				}
				
				lastIndex = i;
				$(this).parent().children().eq(i).addClass(settings.selectedItemStyleName);
				
				$(_tabContentHolder).children().eq(i).find(".module_content_mask").css({
					"z-index": "-1",
					"display": "none"
				});
				
			} else {
				$(_tabContentHolder).children().eq(i).find(".module_content_mask").css({
					"z-index": "2000",
					"display": "block"
				});
			}
		}
		//handle case where none fit fully - select index item only
		if(!tabSelected) {
			$(this).parent().children().eq(_index).addClass(settings.selectedItemStyleName);
		}
		
		//new "+" functionality
		var selectedDiv;
		if (firstIndex != -1)
		{
			if($(this).parent().parent().find(settings.overlayId).get(0) == undefined) {
				selectedDiv = document.createElement("div");
				$(selectedDiv).attr("id", settings.overlayStyleName);
				$(selectedDiv).addClass(settings.itemStyleName).addClass(settings.selectedItemStyleName);
				$(selectedDiv).css("position", "absolute");
				$(this).parent().parent().append(selectedDiv);
			} else {
				selectedDiv = $(this).parent().parent().find(settings.overlayId).get(0);
				$(selectedDiv).html("");
			}
			
			for(var i = firstIndex; i <= lastIndex; i++) {
				var subDiv = document.createElement("div");
				$(subDiv).css("float", "left");
				if($($(this).parent().children().eq(i).html()).size() > 0) {
					//non-text type elements
					$(subDiv).append($($(this).parent().children().eq(i).html()));
				} else {
					//text-type elements
					subDiv.appendChild(document.createTextNode($(this).parent().children().eq(i).html()));
				}
				
				//subDiv.appendChild(document.createTextNode($(this).parent().children().eq(i).html()));
				subDiv.associatedButton = $(this).parent().children().eq(i);
				selectedDiv.appendChild(subDiv);
				$(subDiv).click(function() {
					$(this.associatedButton).click();
				});
				if(i <= (lastIndex-1)) {
					var interDiv = document.createElement("div");
					$(interDiv).css("float", "left");
					$(interDiv).css("padding", "0 10px 0 10px");
					interDiv.appendChild(document.createTextNode("+"));
					selectedDiv.appendChild(interDiv);
				}
			}
			$(selectedDiv).css("top", $(this).parent().children().eq(firstIndex).position().top);
			$(selectedDiv).css("left", $(this).parent().children().eq(firstIndex).position().left);
		}
		else
		{
			var $selectedDiv = $($(this).parent().parent().find('#' + settings.overlayStyleName).get(0));
			if ($selectedDiv != undefined)
			{
				$selectedDiv.css("top", $(this).parent().children().eq(_index).position().top);
				$selectedDiv.css("left", $(this).parent().children().eq(_index).position().left);
			}
		}
	};
	
	$.fn.enableSlidingTabs = function(_enable) {
		if(_enable && $(this).children(".sliding_tab_cover").length > 0) {
			//enable tabs
			$(this).children(".sliding_tab_cover").remove();
			
		} else if(!_enable && $(this).children(".sliding_tab_cover").length == 0) {
			//disable tabs
			$cover = $("<div></div>");
			$cover.addClass("sliding_tab_cover");
			$cover.css({
				position: "absolute",
				width: $(this).width()+"px",
				height: $(this).height()+"px",
				top: $(this).position().top,
				left: $(this).position().left,
				"z-index": 10
			});
			$(this).append($cover);
			
		}
	};
	
	$.fn.slidingTabs.defaults = {
			useBackgroundEffect : false,
			backgroundEffectWrapper : "",
			backgroundEffectAnimationPercent : .15,
			itemStyleName : "sliding_toolbar_item",
			selectedItemStyleName : "sliding_toolbar_item_selected",
			overlayStyleName : "sliding_toolbar_item_overlay",
			overlayId : "#sliding_toolbar_item_overlay"
	};
	
})( jQuery );
