$.fn.infiniteCarousel = function () {

    function repeat(str, num) {
        return new Array( num + 1 ).join( str );
    }
  
    return this.each(function () {
		var slidersection = $(this);
							   
        var $wrapper = slidersection.children('.wrapper'),
            $slider = $wrapper.children('.slider'),
            $items = $slider.children('.slide'),
            $single = $items.filter(':first'),
			
            
            singleWidth = $single.outerWidth(), 
            visible = Math.ceil($wrapper.innerWidth() / singleWidth), 
			//note: doesn't include padding or border
            currentPage = 1,
            pages = Math.ceil($items.length / visible);   
			
			
			//YASHIN
			var pagecount;
			pagecount = 0;
			
			var wrapperP = $wrapper.parent();
			
			while(pagecount < pages){
				var pgnavi = wrapperP.find('nav .pgNavi');
				var currPnum = pagecount + 1;
				pgnavi.append('<li><a onclick="javascript:$(\'#'+slidersection.attr('id')+'\').trigger(\'goto\' , [' +currPnum+ '] )" class="pgdot pgdot' + currPnum + '">' + currPnum + '</a></li>');
				pagecount++;
			}
			
			$('.pgdot'+currentPage , slidersection).addClass('pgdotactive');
			
			$('.pgNavi' , slidersection).css('width' , 16 * pages);
			
			$('.pgdot'+currentPage , slidersection).addClass('pgdotactive');
			//END

        // 1. Pad so that 'visible' number will always be seen, otherwise create empty items
        if (($items.length % visible) != 0) {
          $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));
            $items = $slider.find('.slide');
        }

        // 2. Top and tail the list with 'visible' number of items, top has the last section, and tail has the first
        //$items.filter(':first').before($items.slice(- visible).clone().addClass('cloned').removeClass('slide'));
        //$items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned').removeClass('slide'));
        //$items = $slider.find('> li'); // reselect
        
        // 3. Set the left position to the first 'real' item
        //$wrapper.scrollLeft(singleWidth * visible);
        
        // 4. paging function
        function gotoPage(page) {
            var dir = page < currentPage ? -1 : 1,
                n = Math.abs(currentPage - page),
                left = singleWidth * dir * visible * n;
            
            $wrapper.filter(':not(:animated)').animate({
                scrollLeft : '+=' + left
            }, 500, function () {
                if (page == 0) {
                    $wrapper.scrollLeft(singleWidth * visible * pages);
                    page = pages;
                } else if (page > pages) {
                    $wrapper.scrollLeft(singleWidth * visible);
                    // reset back to start position
                    page = 1;
                } 
				
				$('.pgdot' , slidersection).removeClass('pgdotactive'); //YASHIN
				
                currentPage = page;
				
				$('.pgdot'+currentPage , slidersection).addClass('pgdotactive'); //YASHIN
            });                
            
            return false;
        }
		
		//edit Yasin
		function gotoLast() {
			$wrapper.animate({
                scrollLeft : '+=' + (singleWidth * visible * (pages-1))
            }, 500); 
			$('.pgdot' , slidersection).removeClass('pgdotactive'); 
				
                currentPage = pages;
				
				$('.pgdot'+currentPage , slidersection).addClass('pgdotactive'); 
		}
        
		function gotoFirst() {
			$wrapper.animate({
                scrollLeft : '-=' + (singleWidth * visible * (pages-1))
            }, 500); 
			$('.pgdot' , slidersection).removeClass('pgdotactive'); 
				
                currentPage = 1;
				
				$('.pgdot'+currentPage , slidersection).addClass('pgdotactive'); 
		}
		//end Yasin
        
        // 5. Bind to the forward and back buttons
        $('.leftarrow', slidersection).click(function () {
			if(currentPage == 1){
				gotoLast();
			}else
            return gotoPage(currentPage - 1);                
        });
        
        $('.rightarrow', slidersection).click(function () {
			if(currentPage == pages){
				gotoFirst();
			}else
            return gotoPage(currentPage + 1);
        });
		
		
		//$('.pgdot', slidersection).click(function () {
			//return gotoPage($(this).text());
        //});
		
        
        // create a public interface to move to a specific page
        $(this).bind('goto', function (event, page) {
            gotoPage(page);
        });
		
		//edit Yasin
		$(this).bind('updatePG', function (event, page) {
			$('.pgdot' , this).removeClass('pgdotactive');
            currentPage = Number(page);
			$('.pgdot'+page , this).addClass('pgdotactive');
        });
		//end Yasin
    });  
};

$(document).ready(function () {
  $('#jsslider1').infiniteCarousel();
});
