tuiCarousels = function () {
    var instances = [];    

    var init = function () {
    	var n = instances.length;
		if(!n) return;
		for(i=0; i<n; i++){
			
			var args = instances[i]; // id, type, visible, btnNext, btnPrev, btnGo, start, visible, speed, auto
			var c = {};
			c.id = '#' + args.id;
			if(args.btnNext && args.btnPrev){
				c.btnNext = '#' + args.btnNext;
				c.btnPrev = '#' + args.btnPrev; 
			}
			if(args.btnGo){
				c.btnGo = args.btnGo;
			}
			if(args.auto){
				c.auto = args.auto;
			}
			
			// hard coded params
			c.start = 0;
			c.speed = 600;
			
			// type-specific values
			switch(args.type){
				
				case "twocol_wide":
					c.visible = 1;
					c.afterEnd = function(a){					
						
						// find index of 1st visible item
						var id = a[0].getElementsByTagName('DIV')[0].id;			
						var n = parseInt(id.substring(id.length-1));
						
						// find carousel outer div wrapper
						var d = a[0].parentNode;
						while(d.className.indexOf('carousel_wrap') < 0 && d.nodeName != 'BODY'){
							d = d.parentNode;
						}						
	
						var el = "div#" + d.id;
						// update buttons						
						jQuery(el + " .nav li.active").removeClass("active");
						jQuery(el + " .nav li.btn" + n).addClass("active");

					}
					break;
				
				case "single_col":
					c.visible = 1;
					c.afterEnd = function(a){
						
						// find index of 1st visible item
						var id = a[0].getElementsByTagName('DIV')[0].id;		
						var n = parseInt(id.substring(id.length-1));					
						
						// find carousel outer div wrapper
						var d = a[0].parentNode;
						while(d.className.indexOf('carousel_wrap') < 0 && d.nodeName != 'BODY'){
							d = d.parentNode;						
						}
	
						var el = "div#" + d.id;
						
						// update buttons						
						jQuery(el + " .nav li.active").removeClass("active");
						jQuery(el + " .nav li.btn" + n).addClass("active");

					}
					break;				
				
				case "twocol_short":
					
					c.visible = 3;
									
					c.beforeStart = function(a){						
						// find carousel outer div wrapper
						var d = a[0].parentNode;
						while(d.className.indexOf('carousel_wrap') < 0 && d.nodeName != 'BODY'){
							d = d.parentNode;													
						}						
						var el = "div#" + d.id;							
						jQuery(el + " div.active").removeClass("active");						
					}
					
					c.afterEnd = function(a){
						
						// find index of 1st visible item
						var id = a[0].getElementsByTagName('DIV')[0].id;			
						var n = parseInt(id.substring(id.length-1));											
						
						// find carousel outer div wrapper
						var d = a[0].parentNode;
						while(d.className.indexOf('carousel_wrap') < 0 && d.nodeName != 'BODY'){
							d = d.parentNode;													
						}		
						
						var el = "div#" + d.id;				
						var max = jQuery(el + " .nav li.button_short1").length;
						
						// update buttons
						jQuery(el + " .nav li.active").removeClass("active");
						jQuery(el + " .nav li.btn" + n).addClass("active");
						
						// update description
						var index = n+1;
						if(index > max) index = 1;
						jQuery(".descriptor.active").removeClass("active");
						jQuery(".descriptor" + index).addClass("active");
						
						// update item highlight						
						jQuery(el + " div.item" + index).addClass("active");				
						
					}				
					break;
				
				default:
					c.visible = 1;
					break;
			}
			
			// init carousel
			jQuery(c.id).jCarouselLite(c);
		}
		
    };

	var addCarousel = function(args){
		instances.push(args);
	};

    return {
        // set up which functions should be public
        init: init, addCarousel: addCarousel
    };
}();