(function($){
	/* Notes:

	*/
	// JavaScript Document
	$.extend($.fn, {
		imageSlider: function(options) {

			if(!options)
			{
				options = {};
			}

			if($(this).length > 1)
			{
				throw "More than one element matches your imageSlider selector. Maybe you have multiple imageSliders on this page with the same id?"
			}

			if(options == 'changeCtrlOption')
			{
				sliderObj = $(this).data('imageSlider');

				if(arguments.length > 1)
				{
					sliderObj.options.controller[arguments[1]] = arguments[2];
				}
			}

			if(options == 'api')
			{
				return $(this).data('imageSlider');
			}

			var sliderObj = new imageSlider($(this),options);
			sliderObj.init();
			$(this).data('imageSlider',sliderObj);

			return $(this);
		}
	});

	function imageSlider(elm, options)
	{
		var defaults = {};

		defaults.images = [];
		defaults.auto_play = true;
		defaults.auto_restart_delay = 8;
		defaults.slide_speed = 'slow';
		defaults.pause_length = 6;
		defaults.slide_width = 500;
		defaults.slide_height = 650;
		
		this.slider = $(elm);
		this.options = $.extend(true, defaults, options);
		this.slide_container;
		this.slide_container_width;
		this.current_slide = 0;
		this.total_slides;
		this.btn_next;
		this.btn_prev;
		this.slideshow_status = "stopped";
		this.freeze_buttons = false;
		this.restart_timer;
		this.useChangeClass = true;
	}

	imageSlider.prototype.init = function()
	{
		var self = this;
		this.slider.css({ overflow:'hidden', position:'relative' });
		this.preload();
		
		// prevent text hilighting in ie
		if ($.browser.msie) {
			$('html').get(0).ondrag = function () { return false; };
			$('html').get(0).onselectstart = function () { return false; }; 
		}
		
		// update on window resize
		$(window).resize(function() {
			self.useChangeClass = false;
			self.showSlide(self.current_slide, true);
			self.updateSlides();
		});
	};
	
	imageSlider.prototype.preload = function()
	{
		var cache = [];
		var args_len = this.options.images;
		
		for (var i = args_len; i--;) {
			var cacheImage = document.createElement('img');
			cacheImage.src = arguments[i];
			cache.push(cacheImage);
		}
		
		this.drawSlides();
	}
	
	imageSlider.prototype.drawSlides = function()
	{
		var w;
		var markup = '<div class="slide-container">';
		var self = this;
		
		for (i=0; i<this.options.images.length; i++) {
			markup += '<div class="slide" style="width:' + this.options.slide_width + 'px; height:' + this.options.slide_height + 'px;"><img src="' + this.options.images[i] + '" /></div>';
		}
		markup += '</div>';
		markup += '<div class="btn-prev"></div><div class="btn-next"></div>';
		
		this.slider.html(markup);
		this.total_slides = i;
		this.current_slide = Math.round(i/2);
		this.slide_container_width = this.slider.find('.slide-container .slide').outerWidth() * i;
		this.slide_container = this.slider.find('.slide-container');
		this.slide_container.css({ overflow:'hidden', position:'absolute', width:this.slide_container_width+'px' });
		this.slide_container.find('.slide').css({ float:'left', display:'block' });
		this.slide_width = this.slide_container.find('.slide').outerWidth();
		this.showSlide(this.current_slide, true);
		
		this.btn_next = this.slider.find('.btn-next');
		this.btn_prev = this.slider.find('.btn-prev');
		
		this.btn_next.click(function()
		{
			if (self.freeze_buttons == false) {
				self.stopSlideShow();
				self.nextSlide();
			}
		});
		this.btn_prev.click(function()
		{
			if (self.freeze_buttons == false) {
				self.stopSlideShow();
				self.prevSlide();
			}
		});
		
		if (this.options.auto_play == true) {
			this.startSlideShow();
		}
	};
	
	imageSlider.prototype.nextSlide = function()
	{
		if (this.current_slide < this.total_slides-1) {
			 this.current_slide++;
		} else {
			this.current_slide = 0;
		}
		
		this.showSlide(this.current_slide);
	}
	
	imageSlider.prototype.prevSlide = function()
	{
		if (this.current_slide > 0) {
			this.current_slide--;
		} else {
			this.current_slide = this.total_slides-1;
		}
		
		this.showSlide(this.current_slide);
	}
	
	imageSlider.prototype.showSlide = function(n, skip_animation)
	{
		var self = this;
		var x = -(this.slide_container.find('.slide:eq('+ n +')').position().left);
		var offset = (this.slider.width() - this.slide_width) / 2;
		var dir;
		
		this.freeze_buttons = true;
		
		if (this.useChangeClass == true) {
			this.slide_container.find('.slide').removeClass('current');
			this.slide_container.find('.slide:eq(' + n + ')').addClass('current');
			this.slide_container.find('.slide').trigger('change_slide');
		}
		this.useChangeClass = true;
		
		
		if ((x + offset) > 0) {
			dir = 'rwd';
		} else {
			dir = 'fwd';
		}
		
		if (skip_animation == true) {
			
			this.slide_container.css({ left:(x + offset) + 'px' });
			this.updateSlides(dir);
			this.freeze_buttons = false;
			
		} else {
			
			if (dir == 'rwd') {
				this.updateSlides(dir);
				x = -(this.slide_container.find('.slide:eq('+ this.current_slide +')').position().left);
				this.slide_container.animate({ left:(x + offset) + 'px' }, this.options.slide_speed, "swing", function()
				{
					self.freeze_buttons = false;
				});
			} else {
				this.slide_container.animate({ left:(x + offset) + 'px' }, this.options.slide_speed, "swing", function()
				{
					self.updateSlides(dir);
					self.freeze_buttons = false;
				});
			}
		}
	}
	
	imageSlider.prototype.updateSlides = function(dir)
	{
		var self = this;
		var slide;
		var l;
		
		if (dir == 'rwd') {
			slide = self.slide_container.find('.slide:eq(' + (this.total_slides-1) + ')');
			
			if ((slide.offset().left) > self.slider.offset().left - self.slider.outerWidth()) {
				l = self.slide_container.position().left - slide.outerWidth();
				slide.prependTo(self.slide_container);
				self.slide_container.css({ left:l + 'px' });
				self.current_slide++;
			}
			
		} else {
			slide = self.slide_container.find('.slide:eq(0)');
		
			if ((slide.offset().left + slide.outerWidth()) < self.slider.offset().left) {
				l = self.slide_container.position().left + slide.outerWidth();
				slide.appendTo(self.slide_container);
				self.slide_container.css({ left:l + 'px' });
				self.current_slide--;
			}
		}
	}
	
	imageSlider.prototype.startSlideShow = function()
	{
		var self = this;
		clearInterval(this.restart_timer);
		this.slideshow_timer = setInterval(function() { self.nextSlide(); self.slideshow_status = "playing"; }, this.options.pause_length*1000);
	}
	
	imageSlider.prototype.stopSlideShow = function()
	{
		var self = this;
		
		clearInterval(this.restart_timer);
		clearInterval(this.slideshow_timer);
		this.slideshow_status = "stopped";
		
		if (this.options.auto_play == true) {
			this.restart_timer = setInterval(function() { self.startSlideShow(); }, this.options.auto_restart_delay*1000);
		}
	}


})(jQuery);
