(function($) {
	
	$.fn.extend({
		carousel: function(params){
			switch(params){
				default:
					init_carousel(this, params)
					break;
			}
		}
	});
	
	function init_carousel(el, params){
		var defaults = {
			ajax: true,
			direction: 'horizontal',
			prev_button_class: 'prev',
			move_by: 940,
			next_button_class: 'next',
			total_pages: 0,
			visible_items: 3,
			visible_area_width: 940,
			selected_class: 'selected',
			callback: function(){},
			item_clicked: function(){}
    }

    var options = $.extend(defaults, params);
		el.data('options', options);
		el.data('animating', false);
		attach_events(el);
		check_arrows_status(el);
	
		
	}	
	
	function attach_events(el){
		options = el.data('options');
		
		add_remove_selected(el);
		$(el).find('.'+options.prev_button_class+' a').bind('click', function(){
			el.data('direction', 'left')
			if(!el.data('animating')){
				var link = $(el).find('.'+options.prev_button_class+' a').attr('href');
				var page = link.substr(link.indexOf('/page/')+6);
		    do_request(el, page, link, 'left')
			}
			return false;
	  });

		
		$(el).find('.'+options.next_button_class+' a').bind('click', function(){
			el.data('direction', 'right')
			if(!el.data('animating') && !$(this).parent().hasClass('next_button_disabled')){
				var link = $(el).find('.'+options.next_button_class+' a').attr('href');
				var page = link.substr(link.indexOf('/page/')+6);
		    do_request(el, page, link, 'right')
			}
			// else{
			// 	if(!el.data('animating'))
			// 		rewind(el);
			// }
			return false;
	  	});
	
		options.item_clicked();

	}
	
	function rewind(el){
		options = el.data('options');
		el.data('animating', true);
		$(el).find('ul:first').animate({left: '0px'}, {duration:750, queue:true, easing:'easeInOutExpo', complete: function(){
			el.data('animating', false);
			check_arrows_status(el);
		}
		});
	}
	
	function move_carousel(el, direction){
		options = el.data('options');
		var value = move_by(el)
		if(direction=='right' || (direction=='left' && get_current_position(el)<0)){
			value *= -1
		}
		el.data('animating', true)
		if(options.direction=='horizontal'){
			$(el).find('ul:first').animate({left: (get_current_position(el) + value) + 'px'}, {duration:750, queue:true, easing:'easeInOutExpo', complete: function(){
				el.data('animating', false);
				check_arrows_status(el);
			}
			});
		}
		else{
			$(el).find('ul:first').animate({top: (get_current_position(el) + value) + 'px'}, {duration:750, queue:true, easing:'easeInOutExpo', complete: function(){
				el.data('animating', false)
				check_arrows_status(el);
			}
			});			
		}
	}
	
	function check_arrows_status(el){
		options = el.data('options');
		if(!can_move(el,'left')){
				$(el).find('.'+options.prev_button_class).addClass('previous_button_disabled');	
				$(el).find('.'+options.prev_button_class).fadeTo(200, 0.3);
			}else{      
				$(el).find('.'+options.prev_button_class).removeClass('previous_button_disabled');	
				$(el).find('.'+options.prev_button_class).fadeTo(200, 1);
			}
			if(!can_move(el,'right')){
				$(el).find('.'+options.next_button_class).addClass('next_button_disabled');	
				$(el).find('.'+options.next_button_class).fadeTo(200, 0.3);
			}else{      
				$(el).find('.'+options.next_button_class).removeClass('next_button_disabled');		
				$(el).find('.'+options.next_button_class).fadeTo(200, 1);
			}
	}
	
	function can_move(el, direction){
		options = el.data('options');
		var currentPosition = get_current_position(el);
		if(options.direction=='horizontal'){
			var invisible_area = el.data('direction')=='left' ? left_invisible_area_width(el) : right_invisible_area_width(el);
		}
		else{
			var invisible_area = el.data('direction')=='left' ? left_invisible_area_width(el) : right_invisible_area_width(el);;
		}
		return((direction=='right' && (current_page(el) < options.total_pages || ((options.direction=='horizontal' ? right_invisible_area_width(el) : right_invisible_area_height(el)) > 0 ))) || (direction=='left' && (options.direction == 'horizontal' ?  left_invisible_area_width(el) : left_invisible_area_height(el)) < 0))
	}
	
	function current_page(el){
		options = el.data('options');
		return Math.ceil($(el).find('ul:first').children().length / options.visible_items);
	}
	
	function left_invisible_area_width(el){
		options = el.data('options');
		return get_current_position(el)
	}
	
	function right_invisible_area_width(el){
		options = el.data('options');
 		return get_current_position(el) + get_list_width(el) - options.visible_area_width
	}
	
	function left_invisible_area_height(el){
		options = el.data('options');
		return get_current_position(el)
	}
	
	function right_invisible_area_height(el){
		options = el.data('options');
		return get_current_position(el) + get_list_height(el) - options.visible_area_width
	}

	
	function move_by(el){
		options = el.data('options');
		if(options.direction=='horizontal'){
			var invisible_area = el.data('direction')=='left' ? left_invisible_area_width(el) : right_invisible_area_width(el);
		}
		else{
			var invisible_area = el.data('direction')=='left' ? left_invisible_area_height(el) : right_invisible_area_height(el);;
		}
		if (((options.move_by < invisible_area) && invisible_area > 0) || (options.move_by <(-1*invisible_area) && invisible_area < 0))
			return invisible_area > 0 ? options.move_by : -1 * options.move_by;
		else
			return invisible_area;
	}

	function get_current_position(el){
		options = el.data('options');
		return options.direction=='horizontal' ? $(el).find('ul:first').position().left : $(el).find('ul:first').position().top ;
	}

	function get_list_width(el){ 
		options = el.data('options');
		var width = 0;
		$(el).find('ul:first').children().each(function(){
			width += $(this).width();
			width += parseInt($(this).css('margin-left'));
			width += parseInt($(this).css('margin-right'));
			width += parseInt($(this).css('padding-left'));
			width += parseInt($(this).css('padding-right'));
		});
	  return width;
	}
	
	function get_list_height(el){ 
		options = el.data('options');
		var height = 0;
		$(el).find('ul:first').children().each(function(){
			height += $(this).height();
			height += parseInt($(this).css('margin-top'));
			height += parseInt($(this).css('margin-bottom'));
			height += parseInt($(this).css('padding-top'));
			height += parseInt($(this).css('padding-bottom'));
		});
	  return height;
	}
	
	function do_request(el, page, link, direction){
		options = el.data('options');
		if(($(el).find('.page_'+page).length==0) && (options.ajax) ){
    	$.get(link, null, function(data){
      	var collection = eval(data.collection);
				$(el).find('.'+options.next_button_class+' a').attr('href', data.next_page);
				$(el).find('.'+options.prev_button_class+' a').attr('href', data.prev_page);
      	for(var i=0;i<collection.length;i++){
      	  $(el).find('ul:first').append(options.callback(collection[i], page));
      	}
				add_remove_selected(el)
				options.item_clicked();
				if(can_move(el,direction)){
					move_carousel(el,direction);	
				}
    	}, 'json');
		}
		else{
				if(can_move(el,direction)){
					move_carousel(el,direction);	
				}
		}
	}
	

	
	function add_remove_selected(el){
		var options = el.data('options');		
		if(options.selected_class!=''){
	
			$(el).find('li').unbind();
	
			$(el).find('li').mouseenter(function(){
				$(this).addClass('selected');
			});
	
			$(el).find('li').mouseleave(function(){
				$(this).removeClass('selected');
			});
		}
	}
	
		
})(jQuery);