(function($){
	$.fn.megaslider = function( option ) {
		option = $.extend( {}, $.fn.megaslider.option, option );
		return this.each(function(){
			$('.' + option.container, $(this)).children().wrapAll('<div class="megaslider_control"/>');
			var elem = $(this),
				control = $(".megaslider_control", elem),
				total = control.children().size(),
				width = control.children().outerWidth(),
				height = control.children().outerHeight(),
				start = 0,
				next = 0, prev = 0, number = 0, current = 0, loaded, active, clicked, position, direction, imageParent, pauseTimeout, playInterval;

			if (total < 2) {
				$('.' + option.container, $(this)).fadeIn(option.fadeSpeed, '', function(){
					loaded = true;
					option.slidesLoaded();
				});
				$('.' + option.next + ', .' + option.prev).fadeOut(0);
				return false;
			}
			
			function animate(direction, clicked) {
				if (!active && loaded) {
					active = true;
					option.animationStart(current + 1);
					switch(direction) {
						case 'next':
							prev = current;
							next = current + 1;
							next = total === next ? 0 : next;
							position = width*2;
							direction = -width*2;
							current = next;
						break;
						case 'prev':
							prev = current;
							next = current - 1;
							next = next === -1 ? total-1 : next;								
							position = 0;								
							direction = 0;		
							current = next;
						break;
						case 'pagination':
							next = parseInt(clicked,10);
							prev = $('.' + option.paginationClass + ' li.'+ option.currentClass +' a', elem).attr('href').match('[^#/]+$');
							if (next > prev) {
								position = width*2;
								direction = -width*2;
							} else {
								position = 0;
								direction = 0;
							}
							current = next;
						break;
					}

					control.children(':eq('+ next +')', elem).css({
						zIndex: 10
					}).fadeIn(option.fadeSpeed, '', function(){
						control.children(':eq('+ prev +')', elem).css({
							display: 'none',
							zIndex: 0
						});									
						control.children(':eq('+ next +')', elem).css({
							zIndex: 0
						});									
						option.animationComplete(next + 1);
						active = false;
					});
					
					if (option.pagination) {
						$('.'+ option.paginationClass +' li.' + option.currentClass, elem).removeClass(option.currentClass);
						$('.' + option.paginationClass + ' li:eq('+ next +')', elem).addClass(option.currentClass);
					}
				}
			}
			
			function stop() {
				clearInterval(elem.data('interval'));
			}

			function pause() {
				if (option.pause) {
					clearTimeout(elem.data('pause'));
					clearInterval(elem.data('interval'));
					pauseTimeout = setTimeout(function() {
						clearTimeout(elem.data('pause'));
						playInterval = setInterval(	function(){
							animate("next");
						},option.play);
						elem.data('interval',playInterval);
					},option.pause);
					elem.data('pause',pauseTimeout);
				} else {
					stop();
				}
			}

			if (total < 2) {
				return;
			}
			
			$('.' + option.container, elem).css({
				overflow: 'hidden',
				position: 'relative'
			});
			
			control.children().css({
				position: 'absolute',
				top: 0, 
				left: control.children().outerWidth(),
				width: control.children().outerWidth(),
				display: "block",
				zIndex: 0,
				display: 'none'
			});
			
			$(window).bind("resize", function() {
				control.children().css({width: control.parent().parent().width()});
			});
			
			control.css({
				position: "relative",
				width: (width * 3),
				height: height,
				left: -width
			});
			
			$('.' + option.container, elem).css({
				display: 'block'
			});
			
			if (option.preload && control.find('img:eq(' + start + ')').length) {
				$('.' + option.container, elem).css({
					background: 'url(' + option.preloadImage + ') no-repeat 50% 50%'
				});
				
				var img = control.find('img:eq(' + start + ')').attr('src');
				
				if ($('img', elem).parent().attr('class') != 'megaslider_control') {
					imageParent = control.children(':eq(0)')[0].tagName.toLowerCase();
				} else {
					imageParent = control.find('img:eq(' + start + ')');
				}

				control.find('img:eq(' + start + ')').attr('src', img).load(function() {
					control.find(imageParent + ':eq(' + start + ')').fadeIn(option.fadeSpeed, '', function(){
						$(this).css({
							zIndex: 5
						});
						$('.' + option.container, elem).css({
							background: ''
						});
						loaded = true;
						option.slidesLoaded();
					});
				});
			} else {
				control.children(':eq(' + start + ')').fadeIn(option.fadeSpeed, '', function(){
					loaded = true;
					option.slidesLoaded();
				});
			}
						
			if (option.hoverPause && option.play) {
				control.bind('mouseover',function(){
					stop();
				});
				control.bind('mouseleave',function(){
					pause();
				});
			}
			
			$('.' + option.next ,elem).click(function(e){
				e.preventDefault();
				if (option.play) {
					pause();
				}
				animate('next');
			});
			
			$('.' + option.prev, elem).click(function(e){
				e.preventDefault();
				if (option.play) {
					 pause();
				}
				animate('prev');
			});
			
			if (option.generatePagination) {
				elem.append('<ul class='+ option.paginationClass +'></ul>');
				control.children().each(function(){
					$('.' + option.paginationClass, elem).append('<li><a href="#'+ number +'">'+ (number+1) +'</a></li>');
					number++;
				});
			} else {
				$('.' + option.paginationClass + ' li a', elem).each(function(){
					$(this).attr('href', '#' + number);
					number++;
				});
			}
			
			$('.' + option.paginationClass + ' li:eq('+ start +')', elem).addClass(option.currentClass);
			
			$('.' + option.paginationClass + ' li a', elem ).click(function(){
				if (option.play) {
					 pause();
				}
				clicked = $(this).attr('href').match('[^#/]+$');
				if (current != clicked) {
					animate('pagination', clicked);
				}
				return false;
			});
			
			$('a.link', elem).click(function(){
				if (option.play) {
					 pause();
				}					
				clicked = $(this).attr('href').match('[^#/]+$') - 1;
				if (current != clicked) {
					animate('pagination', clicked);
				}
				return false;
			});
		
			if (option.play) {
				playInterval = setInterval(function() {animate('next');}, option.play);
				elem.data('interval',playInterval);
			}
		});
	};
	
	$.fn.megaslider.option = {
		preload: false,
		preloadImage: '_img/wait.gif',
		container: 'slides',
		next: 'next',
		prev: 'prev',
		pagination: true,
		generatePagination: true,
		paginationClass: 'pagination',
		currentClass: 'current',
		fadeSpeed: 350,
		play: 0,
		pause: 0,
		hoverPause: false,
		animationStart: function(){},
		animationComplete: function(){},
		slidesLoaded: function() {}
	};	
})(jQuery);
