var carousel = {
	count: function() {
		return carousel.select.items().length;
	},
	currentImage: 0,
	lastImage: 0,
	defaults: {
		changeSpeed: 5000,
		fadeInSpeed: 750,
		carouselSelector: '.homeCarousel'
	},
	hasGallery: function() {
		return 1 < carousel.count()
	},
	init: function(args) {
		this.config = jQuery.extend(this.defaults, args);
		this.select.list().append(args.content);
		this.initDisplay();
	},
	initDisplay: function() {
		this.select.list()
		.css('width', (this.config.width * this.count()).toString() + 'px')
		this.select.itemsAdded().css('left', '-9999px');
		this.select.container().mouseenter(function(e) {
			if ( !jQuery(this).hasClass('carouselShow')) {
				jQuery(this).addClass('carouselShow');
			}
			jQuery(this).mouseleave(function(e) {
				if ( jQuery(this).hasClass('carouselShow')) {
					jQuery(this).removeClass('carouselShow');
				}
			});
		})
		.append(
			jQuery(document.createElement('div'))
			.addClass('previousPanel')
		)
		.append(
			jQuery(document.createElement('a'))
			.addClass('previousPanelArrow')
			.click(function() {carousel.slideImage(-1)})
		)
		.append(
			jQuery(document.createElement('div'))
			.addClass('nextPanel')
		)
		.append(
			jQuery(document.createElement('a'))
			.addClass('nextPanelArrow')
			.click(function() {carousel.slideImage(1)})
		);
	},
	initNavigation: function(args) {
		return 
	},
	select: {
		container: function() {
			return jQuery(carousel.config.carouselSelector);
		},
		items: function() {
			return jQuery(carousel.config.carouselSelector + ' .slides>li');
		},
		itemsAdded: function() {
			return jQuery(carousel.config.carouselSelector + ' .slides>li:gt(0)');
		},
		list: function() {
			return jQuery(carousel.config.carouselSelector + ' .slides');
		},
		navigation: function(button) {
			return jQuery(carousel.config.carouselSelector + ' .' + button + ' a');		
		}
	},
	slideImage: function(direction) {
		carousel.lastImage = carousel.currentImage;
		carousel.currentImage += direction;		
		if ( carousel.currentImage == carousel.count() )
			carousel.currentImage = 0;			
		if ( carousel.currentImage == -1)
			carousel.currentImage = carousel.count() - 1;
		if (direction == 1) {
			carousel.select.items().eq(carousel.currentImage).css('left', carousel.config.width + 'px');
			carousel.select.items().eq(carousel.lastImage).animate({left: '-' + carousel.config.width + 'px'}, carousel.config.fadeInSpeed);
			carousel.select.items().eq(carousel.currentImage).animate({left: '0px'}, carousel.config.fadeInSpeed);
		} else {
			carousel.select.items().eq(carousel.currentImage).css('left', '-' + carousel.config.width + 'px');
			carousel.select.items().eq(carousel.lastImage).animate({left: carousel.config.width + 'px'}, carousel.config.fadeInSpeed);
			carousel.select.items().eq(carousel.currentImage).animate({left: '0px'}, carousel.config.fadeInSpeed);
		}
	}
}

var slider = {
	count: function() {
		return slider.select.items().length;
	},
	currentImage: 0,
	defaults: {
		changeSpeed: 400
	},
	hasGallery: function() {
		return 1 < slider.count()
	},
	init: function(args) {
		this.config = jQuery.extend(this.defaults, args);
		this.select.list().append(args.content);
		this.initDisplay();
		this.initNavigation();
	},
	initDisplay: function() {
		this.select.container().css({
			overflow: 'hidden',
			width: (220 * this.config.columns + 5 * (this.config.columns - 1)).toString() + 'px',
			height: this.select.list().find('.excerpt').height()
		});
		this.select.list().css({
			width: ((220 + 5) * this.config.number).toString() + 'px'
		});
		this.select.list().find('.break').removeClass('break');
	},
	initNavigation: function(args) {
		this.select.container().append(
			jQuery(document.createElement('img'))
			.attr('src', this.config.backSrc)
			.attr('alt', 'Previous')
			.addClass('previous')
			.css('visibility', 'hidden')
			.click(function() {slider.slideImage(-1)})
			.mouseenter(function(e) {
				jQuery(e.currentTarget).attr('src', slider.config.backOverSrc);
			})
			.mouseleave(function(e) {
				jQuery(e.currentTarget).attr('src', slider.config.backSrc);
			})
		)
		.append(
			jQuery(document.createElement('img'))
			.attr('src', this.config.forwardSrc)
			.attr('alt', 'Next')
			.addClass('next')
			.click(function() {slider.slideImage(1)})
			.mouseenter(function(e) {
				jQuery(e.currentTarget).attr('src', slider.config.forwardOverSrc);
			})
			.mouseleave(function(e) {
				jQuery(e.currentTarget).attr('src', slider.config.forwardSrc);
			})
		);
	},
	select: {
		container: function() {
			return jQuery(slider.config.sliderSelector);
		},
		list: function() {
			return jQuery(slider.config.sliderSelector + ' .slides');
		},
		navigation: function(button) {
			return jQuery(slider.config.sliderSelector + ' .' + button);		
		}
	},
	slideImage: function(direction) {
		this.currentImage += (this.config.columns * direction);
		this.select.list().animate({'margin-left': (-this.currentImage * (220 + 5)).toString() + 'px'}, this.config.changeSpeed)

		if ( this.currentImage < (this.config.number - this.config.columns) ) {
			this.select.navigation('next').css('visibility', 'visible');
		} else {
			this.select.navigation('next').css('visibility', 'hidden');
		}
		if ( this.currentImage > 0 ) {
			this.select.navigation('previous').css('visibility', 'visible');
		} else {
			this.select.navigation('previous').css('visibility', 'hidden');
		}
	}
}

