/**
 * @author pisanec
 */
(function($){
	
    $.circSlider = function(el, options)
	{
		// To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;
        
        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el; 
		
		base.init = function()
		{
			base.options = $.extend({}, $.circSlider.defaults, options);

			base.el_size = {};
			base.el_size.x = base.$el.width();
			base.el_size.y = base.$el.height();
			
			base.$items = $(base.options.items);
			base.items = base.$items.children();
			base.items_cnt = base.items.length;
			
			if(base.options.item_size === false) base.options.item_size = $(base.items[0]).outerWidth(true);
			
			base.items_in_view = Math.floor(base.el_size.x / base.options.item_size);
			
			if(base.options.page_size === false) base.options.page_size = base.items_in_view * base.options.item_size;
			
			//base.clone_cnt = Math.ceil(base.items_in_view / base.items_cnt) + base.items_cnt;
			base.clone_cnt = base.items_cnt;

			// add clones
			for(var c = 1; c <= base.clone_cnt; c++)
			{
				base.$items.prepend(base.items.clone(true));
				base.$items.append(base.items.clone(true));
			}
			
			// position in the middle
			base.item_start_pos = -base.items_cnt * base.options.item_size * base.clone_cnt + base.options.start_pos_offset;
			base.$items.css('left', base.item_start_pos);
			
			base.fwd_pos_cnt = 0;
			base.bwd_pos_cnt = 0;
			base.pos_cnt = 0;
			
			// add forward event
			$(base.options.button_forward).click(function(e) {
				e.preventDefault();
				base.pos_cnt++;
				
				var new_pos = parseInt(base.$items.css('left')) - base.options.page_size;

				base.$items.animate({left: new_pos}, base.options.anim_duration, function() {
					// if end is NOT YET reached, calculate new position
					if (base.pos_cnt < base.items_cnt-1) {
						base.$items.css('left', parseInt(base.$items.css('left')) + (base.options.item_size * base.items_cnt * (base.clone_cnt - base.items_cnt)));
					}
					// if end IS reached, calculate new position from center
					else {
						base.$items.css('left', base.item_start_pos);
						base.pos_cnt = 0;
					}
					
				});
			});
			
			// add backward event
			$(base.options.button_backward).click(function(e) {
				e.preventDefault();
				base.pos_cnt--;
				
				var new_pos = parseInt(base.$items.css('left')) + base.options.page_size;

				base.$items.animate({left: new_pos}, base.options.anim_duration, function() {
					// if end is NOT YET reached, calculate new position
					if (base.pos_cnt > -base.items_cnt) {
						base.$items.css('left', parseInt(base.$items.css('left')) - (base.options.item_size * base.items_cnt * (base.clone_cnt - base.items_cnt)));
					}
					// if end IS reached, calculate new position from center
					else {
						base.$items.css('left', base.item_start_pos);
						base.pos_cnt = 0;
					}
					
				});
			});
			
			if(base.options.autoslide) {
				window.prototype.autoSlide = function()
				{
					$(base.options.button_forward).trigger('click');
				}
				base.autoslider = setInterval('autoSlide()', base.options.autoslide_duration);
				
				$(base.options.autopause_selector).hover(
					//in
					function() {
						clearInterval(base.autoslider);
					},
					//out
					function() {
						base.autoslider = setInterval('autoSlide()', base.options.autoslide_duration);
					}
				);
			}
		};
		
		base.init();
	}
	
	$.circSlider.defaults = {
		items: '#items',				/* items wrapper selector */
		button_forward: '#forward',		/* forward button selector */
		button_backward: '#backward',	/* backward button selector */
		items_per_page: 4,
		item_size: false,				/* false or size in pixel */
		page_size: false,				/* false or size in pixel */
		anim_duration: 500,				/* duration for animation in ms */
		start_pos_offset: 0,
		autoslide: false,
		autoslide_duration: 3000,
		autopause_selector: ''
	};
	
	$.fn.circSlider = function(options)
	{
		if (typeof(options) == "object") {
			return this.each(function(i)
			{
				(new $.circSlider(this, options));
				
				// This plugin supports multiple instances, but only one can support hash-tag support
				// This disables hash-tags on all items but the first one
				options.hashTags = false;
			});
		}
		else {
			return this.each(function(i)
			{
				(new $.circSlider(this, {}));
			});
		}
	}
	
})(jQuery);