/*
// Carolator - A jQuery Carousel
// VERSION: 1.1.1
//
// DEVELOPED BY:
// Alex Vaos
// simplex0@gmail.com
// 2010-08-11
// 
// REQUIRES:
// jquery
*/

jQuery.debug = function(text,type) {
	if(type == 'info' && window.console.info) {
		window.console.info(text);
	}
	else if(type == 'warn' && window.console.warn) {
		window.console.warn(text);
	}
	else {
		window.console.log(text);
	}
};


(function($) {

    // CLASS DEFINITION
    $.fn.carolator = function (options) {
		
		// DEFAULTS
		var _d = {
			transition: true,			// FALSE, FADE, OR SLIDE
			transitionSpeed: 500,
			contentClass: "carolator-content",
			contentScrollerClass: "carolator-contentScroller",
			sectionStart: 1,
			autoplay: true,				// IF IT PLAYS AT THE BEGINNING
			continueTime: 30,			// SECONDS BEFORE STARTING TO PLAY AGAIN, 0 FOR OFF
			animateLinks: true,			// IF A TAGS SHOULD SLIDE UP
			showTimer: false,			// DOESNT EXIST YET
			width: null,
			buttonsOnBottom: true,
			repeat: true,
			timeout: 6,					// SECONDS OF SLIDESHOW
			pagerTransition: "fade",	// TRANSITION USED IN THE DOTS: fade, wipe, none
			debugging: false
		};

        var _o = $.extend({}, _d, options);
		
		var debug = function(t1, t2) {
			if (_o.debugging) jQuery.debug(t1, t2);
		};
		
		return this.each(function() {
			
			// CONTROLS
			var _c = {
				self: null,
				buttons: null,
				navCtn: null,
				navPrev: null,
				navNext: null,
				sections: null,
				selectBg: null,
				content: null,
				contentScroller: null,
				pagerCtn: null,
				pagers: null
			};
			
			// PRIVATE
			var _p = {
				unitSize: 0,
				width: 0,
				height: 0,
				intrans: false, // IF IN TRANSITION
				sectionSelected: 0, // SECTION BY ID
				sectionTotal: 0,
				ctnOffset: 0, // CONTAINER OFFSET
				playing: false,
				playInterval: null,
				name: "carolator",
				navPrev: "carolator-prev",
				navNext: "carolator-next",
				continueTimer: null
			};
			
			_c.self = jQuery(this);
			
			var _display = function(n) {
				if (typeof(n) == "undefined") n = _p.sectionSelected;
				else _p.sectionSelected = n;
				debug("CAROLATOR - DISPLAY: " + n + " - OFFSET: " + jQuery(_c.sections[n]).offset().left + " - CONTENT OFFSET: " + _c.content.offset().left);
				// ANIMATE BUTTONS
				var links = jQuery(_c.sections[n]).find("a");
				links.css({
					"position": "relative",
					top: 50,
					opacity: 0
				});
				
				// CLEAR PAGER
				for (i = 0; i < _p.sectionTotal; i++) {
					if (_o.pagerTransition == "fade") {
						jQuery(_c.pagers[i]).find("b").fadeOut();
					}
					_c.pagers[i].removeClass("pager-selected");
				}
				
				// ANIMATOR CAROUSEL
				_c.contentScroller.animate(
					{
						left: _c.contentScroller.offset().left - jQuery(_c.sections[n]).offset().left // - _c.content.offset().left
					},
					{
						duration: _o.transitionSpeed,
						queue: false,
						complete: function() {
							
							links.animate({
								top: 0,
								opacity: 1	
							}, {
								queue: false,
								duration: 500
							});
							
							// CLEAR PAGER
							for (i = 0; i < _p.sectionTotal; i++) {
								if (_o.pagerTransition == "fade") {
									$(_c.pagers[i]).find("b").fadeOut();
								}
								_c.pagers[i].removeClass("pager-selected");
							}
							
							// SET PAGER
							$(_c.pagers[n]).addClass("pager-selected");
							if (_o.pagerTransition == "fade") {
								$(_c.pagers[n]).find("b").fadeIn();
							}
						}
					}
				);
			};
			
			var _next = function() {
				if (_p.sectionSelected < (_p.sectionTotal - 1)) {
					_p.sectionSelected++;
				} else if (_o.repeat) {
					_p.sectionSelected = 0;
				}
				_display();
				if (_o.continueTime) _continueTimer.set();
			};
			var _previous = function() {
				if (_p.sectionSelected > 0) {
					_p.sectionSelected--; 
				} else if (_o.repeat) {
					_p.sectionSelected = (_p.sectionTotal - 1);
				}
				_display();
				if (_o.continueTime) _continueTimer.set();
			};
			
			var _play = function() {
				_stop();
				_p.playInterval = setInterval(_next, _o.timeout * 1000);
				_p.playing = true;
			};
			
			var _stop = function() {
				clearInterval(_p.playInterval);
				_p.playing = false;
			};
			
			var _continueTimer = {
				set: function() {
					this.clear();
					_p.continueTimer = setTimeout(function() { _play(); }, _o.continueTime * 1000);
				},
				clear: function() {
					clearTimeout(_p.continueTimer);
				}
			};

			var _init = function() {
				
				// CREATE DOM
				_c.self.addClass("ui-" + _p.name);
				
				_p.width = _c.self.width();
				_p.height = _c.self.height();
				
				//debug(_p);
				
				_p.intrans = false;
				_p.sectionSelected = 0;
				
				// CHECK CONTENT
				_c.content = _c.self.find("." + _o.contentClass);
				if (!(_c.content.length > 0)) {
					debug("CAROLATOR - NOT FOUND: " + _o.contentClass);	
					_c.content = jQuery("<div>").addClass(_o.contentClass);
					_c.self.append(_c.content);
				}
				
				// CHECK CONTENT SCROLLER	
				_c.contentScroller = _c.self.find("div." + _o.contentScrollerClass);
				if (!(_c.contentScroller.length > 0)) {
					debug("CAROLATOR - NOT FOUND: " + _o.contentScrollerClass);	
					_c.contentScroller = jQuery("<div>").addClass(_o.contentScrollerClass);
					_c.content.append(_c.contentScroller);
				}
				
				/*
				// CHECK NAV CONTAINER
				_c.navCtn = _c.self.find(".carolator-nav");
				if (!(_c.navCtn.length > 0)) {
					_c.navCtn = jQuery("<div>").addClass("carolator-nav");
					_c.self.prepend(_c.navCtn);
				}
				*/
				
				// NAV BUTTONS
				_c.navPrev = _c.self.find("." + _p.navPrev);
				if (!(_c.navPrev.length > 0))
					_c.content.append(_c.navPrev = jQuery("<a>").addClass(_p.navPrev));
				_c.navPrev.click(function() { _stop(); _previous();});
				
				_c.navNext = _c.self.find("." + _p.navNext);
				if (!(_c.navNext.length > 0))
					_c.content.append(_c.navNext = jQuery("<a>").addClass(_p.navNext));
				_c.navNext.click(function() { _stop(); _next();});
				
				// CHECK PAGER CONTAINER
				_c.pagerCtn = _c.self.find("." + _p.name + "-pager");
				if (!(_c.pagerCtn.length > 0)) {
					_c.pagerCtn = jQuery("<div>").addClass(_p.name + "-pager");
					_o.buttonsOnBottom ? _c.self.append(_c.pagerCtn) : _c.self.prepend(_c.pagerCtn);
				}
				
				// SECTIONS
				_c.sections = _c.self.find("." + _p.name + "-section");
				_p.unitSize = _c.content.width() * 1.2;
				
				_c.contentScroller.css({
					width: _c.sections.length * _p.unitSize,
					height: _c.content.height()
				});
				_c.contentScroller.append(_c.sections);
				
				// SECTION STLYES
				_c.sections.css({
					float: "left",
					width: _c.content.width(),
					height: _c.content.height()
				});
				
				// CREATE BUTTONS IN PAGER
				_c.pagers = [];
				_c.sections.each(function(num) {
					_p.sectionTotal++;
					_c.pagerCtn.append(_c.pagers[num] = jQuery("<a href='javascript: void(0);' title='" + (num + 1) + "'><b>" + (num + 1) + "</b></a>"));
					//_c.pagerCtn.append(_c.pagers[num] = jQuery("<a href='javascript: void(0);' title='" + (num + 1) + "'>" + (num + 1) + "</a>"));
					debug("SECTION OFFSET:" + num + " - " + jQuery(this).offset().left);
					
					// PAGER BUTTONS EVENTS
					_c.pagers[num].click(function() {
						//debug("CAROLATOR - DISPLAY: " + num);
						//var num = parseInt(jQuery(this).attr("title")) - 1;
						_stop();
						_display(num);
					});
				});
				
				//_c.pagers = _c.pagerCtn.find("a");
				
				debug("CAROLATOR: CONTENT SCROLLER OFFSET:" + _c.content.offset().left);
				

	
				// _c.buttons = _c.navCtn.find("a"); // UPDATE AFTER ADDING ANCHORS
				
				//*/
				
				// EVENTS
				/*
				
				_c.buttons.click(function() {
					if (_p.intrans) return;
					//var previous = _c.buttons.find("carolator-active");
					//if (!(previous.length > 0)) previous = _c.buttons.first();
					
					var t = jQuery(this);
					_c.buttons.removeClass("carolator-active");
					
					// START ANIMATION
					var top =  t.offset().top - _p.ctnOffset;
					//alert(top);
					_c.selectBg.animate({ "top": top}, {"duration" : _o.transitionSpeed, "queue": false});
					
					t.addClass("carolator-active");
					
					var txt = t.attr("title");
					var nextSection = _c.content.find(".carolator-section[title=" + txt + "]");
					
					if (!(nextSection.length > 0)) return;
					
					top = _c.contentScroller.offset().top - nextSection.offset().top; // _p.ctnOffset -
					
					debug("CAROLATOR - TOP: " + top + " - OFFSET: " + _c.contentScroller.offset().top);
					//alert(nextSection.offset().top - _p.ctnOffset);
					
					if (_o.transition) {
						
						_c.contentScroller.animate({ "top": top}, {"duration" : _o.transitionSpeed, "queue": false});
						
					} else {

						_c.contentScroller.css("top", top);
					
					}

					//_c.contentScroller.animate({ "top": top}, {"duration" : _o.transitionSpeed, "queue": false});
					//alert(nextSection.offset().top - _p.ctnOffset);
					
					/*
					
					if (!_p.sectionSelected) _p.sectionSelected = nextSection;
					else if (_p.sectionSelected.attr("title") == nextSection.attr("title")) return;
					
					
					
					if (_o.transition) {
						_p.intrans = true;
						_p.sectionSelected.fadeOut(_o.transitionSpeed/2, function() {
							_p.sectionSelected = nextSection;
							_p.intrans = false;
							nextSection.fadeIn(_o.transitionSpeed);
						});
					} else {
						_p.sectionSelected = nextSection;
						_p.sectionSelected.hide();
						nextSection.show();
					}
					//*
				});
				*/
				
				// PRIVATE DATA
				
				//_p.ctnOffset = _c.navCtn.offset().top;
				
				//_c.sections.hide();		
				
				// INITIATE FIRST IF EXISTS
				//_p.sectionSelected = _c.sections.first();	
				/*
				var _firstTab = _c.buttons.find(".carolator-active");
				if (!(_firstTab.length > 0)) {
					_firstTab = _c.buttons.first();
				}
				_firstTab.trigger('click');
				*/
				
				_display();
				if (_o.autoplay) _play();
				
				
			}; // INIT
			
			_init();
			
		});
	};
	
})(jQuery); // end of closure, bind to jQuery Object

	
/*
Colunator Example

$(document).ready(function() {
						   
	jQuery("div.propertiesPanel").carolator();
	
	jQuery("div.featurePanel").carolator();
	
});
*/
