(function($){
	$.fn.simpleCarousel = function(options) {
		var settings = {
			'next_link' : null,
			'prev_link' : null,
			'view' : null,
			'start' : 0,
			'current' : 0,
			'complete' : null,
			'transition' : 'fade', // fade
			'autoplay' : false,
			'interval' : 2000,
			'repeat' : 1000
		}
		var constants = {};
		constants['container'] = this;
		constants['items'] = this.children();
		constants['disabled'] = false;
		constants['tstyle'] = settings.transition;
		constants['zdex'] = (300+(constants.items.length));
		constants['intervalid'] = null;
		constants['item_width'] = $(this.children()[0]).outerWidth();
		
		var animation_styles = [];
		animation_styles['fade'] = { 'ani' : 'opacity', 'duration' : 800, 'easing' : 'swing' };
		animation_styles['carrousel'] = { 'ani' : 'left', 'duration' : 800, 'easing' : 'swing' };
		
		aniopts = {};
		aniopts['duration'] = options.duration;
		aniopts['easing'] = options.easing;
		$.extend(animation_styles[options.transition],aniopts);
		
		var methods = {
			init : function(options) { 
				this.each(function() { if (options) $.extend(settings,options); });
				this.each(function() { if (constants) $.extend(settings,constants); });
				settings['tstyle'] = settings['transition'];
				
				settings['transition'] = animation_styles[settings['transition']];
				
				if (typeof $(settings.prev_link) === 'object' && $(settings.prev_link).length==1) {
					$(settings.prev_link).bind('click',methods['prev']);
				} //else $.error('no prev link.');
				if (typeof $(settings.prev_link) === 'object' && $(settings.prev_link).length==1) {
					$(settings.next_link).bind('click',methods['next']);
				} //else $.error('no next link.');
				settings.current = settings.start;
				methods['buildcontrol'].call(this);
				return this;
			},
			buildcontrol : function() {
				if (typeof $(settings['view']) !== 'object' && $(settings['view']).length!=1) {
					$.error('no view.');
					return this;
				}
				var view = $(settings['view']);
				var len = settings['items'].length;
				var ul = $('<ul class="scv" />');
				for (var i = 0; i<len; i++)  {
					var sel = (settings.start == i) ? ' selected' : '';
					ul.append($('<li class="scv-item'+sel+'">'+(i+1)+'</li>'));
					if(settings.tstyle=='fade') $(settings.items[i]).css('zIndex',(300+i));
				}
				view.append(ul);
				if(settings.tstyle==='fade') $(settings.items[settings.current]).css('zIndex',settings.zdex);
				
				methods[settings.tstyle+'_setup'].call(this);
				methods['autoplay'].call(this);
				
				if (typeof settings.complete === 'function') settings.complete.call(this,{ container: this },{ gotoNumber:methods['gotoNumber'] });
			},
			highlight : function(p,c) {
				var pli = $(settings.view+ ' ul li:eq('+p+')');
				var cli = $(settings.view+ ' ul li:eq('+c+')');
				pli.removeClass('selected');
				cli.addClass('selected');
			},
			gotoNumber : function(num) {
				if (settings.disabled==true) return false;
				if (settings.current==num) return false;
				if (settings.autoplay==true) clearTimeout(settings.intervalid);
				//console.log(settings.intervalid)
				settings.disabled = true;
				var p = settings.current;
				settings.current = num;
				var c = settings.current;
				methods['kill_autoplay'].call(this);
				methods[settings.tstyle].call(this,$(settings.items[p]),$(settings.items[c]),'gotoNumber',p,c);
				methods['highlight'].call(this,p,c);
			},
			
			transition_complete : function(action) {
				settings.disabled = false;
				methods['autoplay'].call(this);
			},
			next : function(e) {
				
				if (settings.disabled==true) return false;
				if (settings.autoplay==true) clearTimeout(settings.intervalid);
				//console.log(settings.intervalid)
				settings.disabled = true;
				var p = settings.current;
				settings.current = (settings.current+1 > settings.items.length-1) ? 0 : settings.current+1;
				var c = settings.current;
				if (typeof(e)!=='undefined') methods['kill_autoplay'].call(this);
				methods[settings.tstyle].call(this,$(settings.items[p]),$(settings.items[c]),'next',p,c);
				methods['highlight'].call(this,p,c);
				return false;
			},
			prev : function(e) { 
				if (settings.disabled==true) return false;
				if (settings.autoplay==true) clearTimeout(settings.intervalid);
				settings.disabled = true;
				var p = settings.current;
				settings.current = (settings.current-1 < 0) ? settings.items.length-1 : settings.current-1;
				var c = settings.current;
				methods['kill_autoplay'].call(this);
				methods[settings.tstyle].call(this,$(settings.items[p]),$(settings.items[c]),'prev',p,c);
				methods['highlight'].call(this,p,c);
				return false;
			},
			carrousel_setup : function() {
				settings.container.css('width',(settings.item_width*2));
				
				var p = (settings.current-1 < 0) ? settings.items.length-1 : settings.current-1;
				var n = (settings.current+1 > settings.items.length-1) ? 0 : settings.current+1;
			},
			carrousel : function(p,c,dir,previndex,nextindex) {
				methods['carrousel_'+dir].call(this,previndex,nextindex);
			},
			carrousel_next : function(previndex,nextindex) {	
				
				var m = $(settings.items[previndex]);
				var c = m.clone();
				
				var propsp = {};
				propsp[settings.transition.ani] = -(settings.item_width);
				
				// move -width, shift, attach to end, move to zero
				settings.container.animate(propsp, settings.transition.duration, settings.transition.easing, function() {	
					c.appendTo(settings.container);
					m.remove();
					settings.items[previndex] = c.get(0);
					settings.container.css('left',0);
					methods['transition_complete'].call(this,'carrousel_next');
					return this;
				});
				
			},
			carrousel_prev : function(previndex,nextindex) {

				var m = $(settings.items[nextindex]);
				var c = m.clone();
				
				c.prependTo(settings.container);
				m.remove();
				settings.items[nextindex] = c.get(0);
				settings.container.css('left',-(settings.item_width));
				
				var propsp = {};
				propsp[settings.transition.ani] = 0;
				
				settings.container.animate(propsp, settings.transition.duration, settings.transition.easing, function() {	
					methods['transition_complete'].call(this,'carrousel_prev');
					return this;
				});
			},
			kill_autoplay : function() {
				settings.autoplay = false;
				settings.repeat = 0;
			},
			autoplay : function() {
				if (settings.autoplay==false) return this;
				clearTimeout(settings.intervalid);	
				settings.intervalid = setTimeout(function(){
					methods['next'].call(this);
				},settings.interval);
				settings.repeat-=1;
				if (settings.repeat<=0) settings.autoplay = false;
			},
			fade_setup : function() {
				var al = $(settings.items);
				var c = $(settings.items[settings.current]);
				al.css(settings.transition.ani,0);
				al.css('display','none');
				c.css(settings.transition.ani,1);
				c.css('display','block');
				
				if (!$.support.opacity && c.get(0).style.filter) {
					c.css("background-color",'white');
					c.css('filter', "progid:DXImageTransform.Microsoft.Chroma(color='white')");
					
				}
			},
			fade : function(p,c,dir) {
				var propsp = {};
				var propsc = {};
				var pz = p.css('zIndex');
				var cz = c.css('zIndex');
				propsp[settings.transition.ani] = 0;
				propsc[settings.transition.ani] = 1;
			
				p.css('zIndex',cz);
				c.css({'display':'block', 'zIndex': pz});
				
				c.animate(propsc, settings.transition.duration, settings.transition.easing,function(){
					if (!$.support.opacity && c.get(0).style.filter) {
						c.css("background-color",'white');
						c.css('filter', "progid:DXImageTransform.Microsoft.Chroma(color='white')");
					}
				});

				p.animate(propsp, settings.transition.duration, settings.transition.easing, function() {
					$(this).css('display','none');
					methods['transition_complete'].call(this,'fade');
					return this;
				});
				
			}
		}
		methods['init'].call(this,options);
	};
})(jQuery);
