(function($) {

	var jqueryNewGallery = function(element, options) {

		var settings = $.extend({}, $.fn.jqueryGallery.defaults, options);

		element = $(element);

		var currContent, comingContent, moveContent, interVal = '';
		var totalContent = element.find('.' + settings.sliceClass).size();
		var showContentSet;
		
		if(settings.showContent && settings.showContent>0 && settings.showContent<=totalContent){
			showContentSet = settings.showContent-1;
		}else{
			showContentSet = 0;
		}

		
		element.addClass(settings.rootClass);
		element.wrapInner('<div class="jqueryGallery_Slicer" />');

		var str = '<input type="hidden" class="currImg" value="'+showContentSet+'" name="currImg" />';
		str += '<input type="hidden" class="comingImg" value="'+showContentSet+'" name="comingImg" />';
		if (settings.nextPrev) { //if nextPrev is false
			str += '<a class="next" rel="'+showContentSet+'"></a><a class="prev" rel="'+showContentSet+'"></a>';
		}
		if (settings.imgPreload) { //if preload is true
			str += '<div class="loader" style="background:url('+settings.loaderPath+') no-repeat center center;"></div>';
		}
		

		element.children('.jqueryGallery_Slicer').append(str);
		element.append('<div class="slider_paging_space"><div class="slider_paging"><div class="clear"></div></div></div>');

		var currImg = element.find('.currImg');
		var comingImg = element.find('.comingImg');
		var next = element.find('.next');
		var prev = element.find('.prev');
		var paging = element.find('.slider_paging_space');

		//define all function here
		var startInterval, stopInterval, autoSlide, startPos, moveGallery, movePos, setButton, init, createPagination, setPagingBtn, preload;
		
		preload = function() {
			
			var imgList = [];
			var imgArr = [];
			var imageSize = element.find('img').size();
			var loadImgList = element.find('img');
			for(i=0; i<imageSize;i++){
				imgArr.push($(loadImgList[i]).attr('src'));
			}
			
			var total = imgArr.length;
			var loaded = 0;
			
			if(total>0){
				for(var i in imgArr) {
					imgList.push($("<img />")
						.load(function() {
							loaded++;
							if(loaded == total) {
								
								element.find('.loader').fadeOut('slow').remove();
								init();
							}
						})
						.attr("src", imgArr[i])
					);
				}
			}else{
				element.find('.loader').fadeOut('slow').remove();
				init();
			}
		}



		autoSlide = function() {
			if (settings.autoStart) {
				currContent = currImg.val();
				comingContent = parseInt(comingImg.val());
				var totalContentNew = totalContent - 1;
				if (totalContentNew > comingContent) {
					comingContent += 1;
					comingImg.val(comingContent);
					movePos();
				}
				else {
					comingImg.val(0);
					comingContent = 0;
					moveContent = 'left';
					moveGallery(currContent, comingContent, moveContent);
				}
			}
		};


		startPos = function() { //Set Starting Slider
			currContent = currImg.val();
			element.find('.' + settings.sliceClass).stop(true, true).animate({
				left: settings.sliderWidth
			}, 0);
			element.find('.' + settings.sliceClass + ':eq(' + currContent + ')').stop(true, true).animate({
				left: '0px'
			}, 0);

		};



		startInterval = function() { //Set Start Interval Slider
			if (interVal == "") {
				if (settings.autoStart == true) {
					interVal = window.setInterval(function() {
						autoSlide();
					}, settings.delay);
				}
			}
			else {
				stopInterval();
			}
		};


		stopInterval = function() { //Set Stop Interval Slider
			if (interVal != "") {
				window.clearInterval(interVal);
				interVal = "";
			}
		};

		setButton = function(comingContent) { //set Show/Hide next prev Button
			currImg.val(comingContent);
			if (settings.nextPrev) {
				next.attr('rel', comingContent);
				prev.attr('rel', comingContent);

				if (comingContent > 0) {
					next.addClass('next_active');
					prev.addClass('prev_active');
				}
				if (comingContent == totalContent - 1) {
					next.removeClass('next_active');
				}
				if (comingContent == 0) {
					prev.removeClass('prev_active');
					next.addClass('next_active');
				}
			}

		};

		setPagingBtn = function(comingContent) { //set Show/Hide next prev Button
			currImg.val(comingContent);
			if (settings.pagination) {
				paging.children('.slider_paging').children('a').removeClass('slider_button_active');
				paging.children('.slider_paging').children('a:eq(' + comingContent + ')').addClass('slider_button_active');
			}

		};

		init = function() {
			
			if (!settings.imgPreload) {
				element.find('.loader').fadeOut('slow').remove();
			}
			
			if (settings.pagination) { //if pagination is true
				createPagination();
				setPagingBtn(showContentSet);
			} else { //if pagination is false
				paging.remove()
			}

			currImg.val(showContentSet);
			comingImg.val(showContentSet)
			if (settings.nextPrev) {
				next.attr('rel', showContentSet).addClass('next_active');
				prev.attr('rel', showContentSet);
			}

			if (totalContent > 1) {
				setButton(showContentSet);
				startInterval();
				if (settings.nextPrev) {
					next.unbind('click').bind('click', function(e) {
						var rel = $(this).attr('rel');
						if (rel < totalContent - 1) {

							rel++;
							next.attr('rel', rel);
							prev.attr('rel', rel);
							comingImg.val(rel);
							movePos();
							
						}e.preventDefault();
					});
					prev.unbind('click').bind('click', function(e) {
						var rel = $(this).attr('rel');
						if (rel > 0) {

							rel--;
							next.attr('rel', rel);
							prev.attr('rel', rel);
							comingImg.val(rel);
							movePos();
							
						}e.preventDefault();
					});
					next.unbind('mouseenter, mouseleave').bind({
						mouseenter: function() {
							stopInterval();
						},
						mouseleave: function() {
							startInterval();
						}
					});
					prev.unbind('mouseenter, mouseleave').bind({
						mouseenter: function() {
							stopInterval();
						},
						mouseleave: function() {
							startInterval();
						}
					});
					next.css('display', 'block');
					prev.css('display', 'block');
				}
				else {
					prev.removeClass('prev_active');
					next.removeClass('next_active');
					next.css('display', 'none');
					prev.css('display', 'none');
				}
			}
			startPos();
		};

		

		movePos = function() { //Set Move Slider
			currContent = currImg.val();
			comingContent = comingImg.val();
			if (currContent > comingContent) {
				moveContent = 'right';
			}
			else if (currContent < comingContent) {
				moveContent = 'left';
			}
			else if (currContent == comingContent) {
				moveContent = 'none';
			}
			moveGallery(currContent, comingContent, moveContent);

		};

		moveGallery = function(currContent, comingContent, moveContent) { //Move Slider

			var currContentPos = '';
			var comingContentPos = '';
			if (moveContent == 'left') {
				currContentPos = '-' + settings.sliderWidth;
				comingContentPos = settings.sliderWidth;
			}
			else if (moveContent == 'right') {
				currContentPos = settings.sliderWidth;
				comingContentPos = '-' + settings.sliderWidth;
			} else {

			}
			
			if(settings.extraEffect){
				animateEffect = 
				
				element.find('.' + settings.sliceClass + ':eq(' + currContent + ')').stop(true, true).animate({
					left: currContentPos
				},settings.contentAnimTime, settings.contentEasing);
	
				element.find('.' + settings.sliceClass + ':eq(' + comingContent + ')').stop(true, true).animate({
					left: comingContentPos
				}, 0);
				element.find('.' + settings.sliceClass + ':eq(' + comingContent + ')').stop(true, true).animate({
					left: '0px'
				},settings.contentAnimTime, settings.contentEasing);
				
			}else{
				element.find('.' + settings.sliceClass + ':eq(' + currContent + ')').stop(true, true).animate({
					left: currContentPos
				},settings.contentAnimTime);
	
				element.find('.' + settings.sliceClass + ':eq(' + comingContent + ')').stop(true, true).animate({
					left: comingContentPos
				}, 0);
				element.find('.' + settings.sliceClass + ':eq(' + comingContent + ')').stop(true, true).animate({
					left: '0px'
				},settings.contentAnimTime);
			}
			
			

			setButton(comingContent);
			setPagingBtn(comingContent);

		};

		createPagination = function() { //create paging button
			var linkString = '';
			for (i = 0; i < totalContent; i++) {
				linkString += '<a class="slider_button"></a>';
			}

			var buttonWidth = parseInt(totalContent * settings.paginationBtnWidth);
			paging.children('.slider_paging').prepend(linkString).width(buttonWidth);

			paging.children('.slider_paging').children('a').unbind('click').bind('click', function() {
				var rel = $(this).index();
				comingImg.val(rel);
				movePos();

			});
			paging.children('.slider_paging').children('a').unbind('mouseenter').bind('mouseenter', function() {
				stopInterval();
			});

			paging.children('.slider_paging').unbind('mouseleave').bind('mouseleave', function() {
				startInterval();
			});

			if (settings.paginationAlign) {

				switch (settings.paginationAlign) {
				case 'left':
					paging.children('.slider_paging').css('left', '0px');
					break;
				case 'right':
					paging.children('.slider_paging').css('right', '0px');
					break;
				case 'center':
					var paging_btn_width = paging.children('.slider_paging').width();
					var paging_btnPos = (element.children('.jqueryGallery_Slicer').width() - paging_btn_width) / 2;

					paging.children('.slider_paging').css('left', paging_btnPos + 'px');
					break;
				default:

				}
			}

		};
		
		if (settings.onHoverPause) {
			element.find('.' + settings.sliceClass).unbind('mouseenter').bind('mouseenter', function() {
				stopInterval();
			});

			element.find('.' + settings.sliceClass).unbind('mouseleave').bind('mouseleave', function() {
				startInterval();
			});
		}
		
		if(settings.imgPreload){
			preload();
		}else{
			init();
		}
	};

	$.fn.jqueryGallery = function(options) {

		return this.each(function(key, value) {
			var element = $(this);

			if (element.data('jqueryGallery')) {
				return element.data('jqueryGallery');
			}

			var jqueryGallery = new jqueryNewGallery(this, options);

			element.data('jqueryGallery', jqueryGallery);
		});

	};

	$.fn.jqueryGallery.defaults = {
		showContent:0,// set current content
		nextPrev: true,// true,  false
		autoStart: true,// true,  false
		pagination: true,// true,  false
		paginationBtnWidth: 23,// set width
		paginationAlign: 'center',//left,  right,  center
		delay: 5000,//setinterval
		sliceClass: 'slice',// set animate class
		sliderWidth: '972px',  // set slidet width
		sliderHeight: '377px', // set slidet height
		pagingBottom: '0px',
		loaderPath: 'images/loader.gif',
		rootClass: 'jqueryGallery',//set root class
		imgPreload: true,// set true , false
		contentEasing:'easeInOutExpo',// set effect
		extraEffect:false,// set true , false
		contentAnimTime:500,// set value
		onHoverPause:false// set true , false

	};
})(jQuery);
