var arr_target_elements	= [];
var current_grouping	= 0;
var total_targets		= 0;
var timeout				= 4000;
var group				= '';

jQuery.fn.cycler	= function(obj_config) {
	
	total_targets	= jQuery(this).length;
	timeout			= ( typeof obj_config.timeout != 'undefined' )? obj_config.timeout:500;
	
	this.each(function() {

		cycle_group(jQuery('.'+jQuery(this).attr('id')));
		jQuery('.'+jQuery(this).attr('id')).cycle('stop');
		var tmpx	= arr_target_elements.length;
		var tmp	= function() { goto(tmpx); }
		jQuery(this).click(tmp);
		
		if( arr_target_elements.length < 1 ) {
			jQuery(this).addClass('active');
		}
		
		arr_target_elements.push(jQuery('.'+jQuery(this).attr('id')));
		
	});
	
	zindex_groups(0);
	cycle_group(arr_target_elements[0]);
	
	return this;
	
};

function zindex_groups( show ) {
	
	//Hide Groups that are not being used (not current and next)
	for( var x = 0; x < total_targets; x++ ) {
		
		if( show == x ) {
			jQuery(arr_target_elements[x]).css({zIndex: 1000, display: 'block', opacity: 1});
		}
		else if( show == (total_targets-1) && x == 0 ) {
			jQuery(arr_target_elements[x]).css({zIndex: 998, display: 'block', opacity: 1});
		}
		else if( x == (show+1) ) {
			jQuery(arr_target_elements[x]).css({zIndex: 998, display: 'block', opacity: 1});
		}
		else {
			jQuery(arr_target_elements[x]).css({zIndex: x, display: 'none', opacity: 1});
		}
		
	}
	
};

function goto( g ) {
	
	if( g == current_grouping ) {
		return false;
	}
	
	if( typeof g != 'undefined' && !isNaN(g) ) {

		group	 = g;
		
		//Set the next grouping's z-index to be one less then the current grouping
		jQuery(arr_target_elements[group]).css({zIndex: 999, display: 'block', opacity: 1});
		
	}
	
	jQuery(arr_target_elements[current_grouping]).cycle('stop').stop('true').animate({opacity: 0}, 1000, function() {
		
		//Remove active class to ul
		jQuery('#'+jQuery(arr_target_elements[current_grouping]).attr('class')).removeClass('active');
		
		cycle_group(jQuery(this));
		jQuery(this).cycle('stop');
		
		if(typeof group != 'undefined' && !isNaN(group) && typeof group != 'string') {

			current_grouping	= group;
			group 				= '';
			
		}
		else {
			update_current_grouping();
		}
		
		
		zindex_groups(current_grouping);
		cycle_group(arr_target_elements[current_grouping]);
		
		//Add active class to ul
		jQuery('#'+jQuery(arr_target_elements[current_grouping]).attr('class')).addClass('active');
		
	});
	
};

function cycle_group( element ) {
	jQuery(element).cycle({fx: 'fade', speed:  500, autostop: 1, end: goto, timeout: timeout, startingSlide: 0});
};

function update_current_grouping() {
	
	if( current_grouping == (total_targets-1) ) {
		current_grouping	= 0;
	}
	else {
		current_grouping++;
	}

}
