(function($){
    $.fn.extend({
    	//display a banner at random
        JbannerRandom:function(options) {
        	var dOptions= {transitionSpeed:0};
        	if(options) $.extend(dOptions, options);
        	$(this[Math.floor(Math.random() * (this.length))]).fadeIn(dOptions.transitionSpeed);
        },
        //rotating and repeating
        JrotatingBanner:function(options) {
        	var dOptions= {transitionSpeed:5000, delay:0};
        	if(options) $.extend(dOptions, options);
        	var $oThis=this;
			var counter=$oThis.data('counter');
        	$oThis.eq(counter % $oThis.length).fadeIn('slow').fadeTo(dOptions.transitionSpeed,1).fadeOut('fast',function() {
        		$oThis.data('counter',counter+1); 
        		$oThis.JrotatingBanner(options);
        	});
        },
        Jslideshow:function(options){
        	var dOptions={transitionSpeed:1000,imagePerSlide:3,slideWidth:980};
        	if(options) $.extend(dOptions, options);
        	var $oSlideShow=$(this);
        	var aoSlideContent=$oSlideShow.find('.JslideshowContent');
        	var nContentLength=aoSlideContent.length;
        	//get number of scrolls and the remainder scrolls
        	var nRemainderContent=nContentLength%dOptions.imagePerSlide;
        	var nTotalSlides=parseInt(nContentLength/dOptions.imagePerSlide);        	
			var aoSlideshowData=new Array();
			var imageWidth=aoSlideContent.eq(0).width();
			if(dOptions.slideWidth < dOptions.imagePerSlide * imageWidth){ alert('Slide width cannot be less than the total images width per slide'); return; }
			for(var i = 0; i < nTotalSlides; i ++){	//setup even slides
				var aSlide=new Array(),ndx=0,starts=i*dOptions.imagePerSlide;	
				for(var j = starts; j < dOptions.imagePerSlide + starts; j ++)
					aSlide[ndx++]=aoSlideContent.eq(j);
				aoSlideshowData[i]=aSlide;
			}
			if(nRemainderContent>0){	//setup remainder slides
    			var aSlide=new Array();
    			var nStartsFromIndex=(dOptions.imagePerSlide + nRemainderContent);
    			var ndx=0;		
    			for(var i = nStartsFromIndex; i < nContentLength; i ++)
    				aSlide[ndx++]=aoSlideContent.eq(i);
    			aoSlideshowData[nTotalSlides]=aSlide;
    		}
    		nTotalSlides=aoSlideshowData.length;
    		//seting initial padding
    		var aSlide=aoSlideshowData[0];
    		var nSlideLength=aSlide.length-1;
    		var nTotalPadding=(dOptions.slideWidth-(imageWidth*dOptions.imagePerSlide));
    		var nPadding=nTotalPadding/nSlideLength;
    		for(var i = 0; i < nSlideLength; i ++){
    			if(nPadding.toString().indexOf('.')!=-1 && i + 1==nSlideLength)
    				nPadding=nPadding+1;
    			aSlide[i].css('padding-right',parseInt(nPadding)+'px');
			}
        	$('#JslideshowHolder').width(nTotalSlides*dOptions.slideWidth); //total images width
        	$oSlideShow.width(dOptions.slideWidth);	//scroll width
        	$oSlideShow.data('current',0);
        	$oSlideShow.attr({scrollLeft:0});
        	var oOffset=$oSlideShow.offset();
        	var $oPrev=$('#JslideshowPrevious');
        	var $oNext=$('#JslideshowNext');
        	//position next button
			$oNext
				.css({'left':(oOffset.left + $oSlideShow.width()) + 'px','top':(oOffset.top + ($oSlideShow.height()/2) - ($oNext.height()/2)) + 'px'})
				.show()
				.click(function(){
            		var nCurrent=$oSlideShow.data('current')+1; $oPrev.show();
            		if(nCurrent<nTotalSlides){
            			$oSlideShow.data('current',nCurrent);
            			aoSlideContent.css('padding','0px');	//reset padding				
            			$.each(aoSlideshowData[nCurrent],function(i,oSlide){ oSlide.css('padding-right',nPadding); }); //set padding
            			var nScrollAmount=(dOptions.slideWidth*nCurrent)-nTotalPadding;
            			if(nCurrent+1==nTotalSlides){
            				if(nRemainderContent>0)
            					nScrollAmount=(dOptions.slideWidth*(nCurrent-1)-nTotalPadding)+nRemainderContent*imageWidth;
            				else
            					nScrollAmount=dOptions.slideWidth * nCurrent - (nTotalPadding*2);
            			}             				
                		$oSlideShow.animate({scrollLeft:nScrollAmount}, dOptions.transitionSpeed);
            		}
                	else $(this).hide(); //hide arrow when no more slides to scroll
        		})
        		.live("mouseenter mouseleave",function(e){ $(this).Jhover(e,'right');});
        	
			$oPrev
				.css({'left':(oOffset.left-$oPrev.width()) + 'px','top':(oOffset.top + ($oSlideShow.height()/2) - ($oPrev.height()/2)) + 'px'})
				.show()
				.click(function(){
					var nCurrent=$oSlideShow.data('current')-1; $oNext.show();
            		if(nCurrent>=0){
            			$oSlideShow.data('current',nCurrent);
            			aoSlideContent.css('padding','0px');	//reset padding				
            			$.each(aoSlideshowData[nCurrent],function(i,oSlide){ oSlide.css('padding-right',nPadding); }); //set padding
            			var nScrollAmount=(dOptions.slideWidth*nCurrent)-nTotalPadding;
            			if(nCurrent+1==nTotalSlides && nRemainderContent>0)
            				nScrollAmount=(dOptions.slideWidth*(nCurrent-1)-nTotalPadding)+nRemainderContent*imageWidth;            				
                		$oSlideShow.animate({scrollLeft:nScrollAmount}, dOptions.transitionSpeed);
					}
                	else $(this).hide(); //hide arrow when no more slides to scroll
        		})
        		.live("mouseenter mouseleave",function(e){ $(this).Jhover(e,'left'); });
        	return this;
		},
		Jhover:function(e,arrow){
            var sClass=(arrow=='right' ? 'JnextOn' : 'JprevOn');
            if (e.type == 'mouseover' || e.type == 'mouseenter'){
            	$(this).removeClass().addClass(sClass);
            }else{
            	$(this).removeClass().addClass(sClass.replace('On','Out'));
            }
		}
	});
})(jQuery);
$(window).bind('resize scroll', function() {
	var $oSlideShow=$('#Jslideshow'),oOffset=$oSlideShow.offset(),$oNext=$('#JslideshowNext'),$oPrev=$('#JslideshowPrevious');
	$oNext.css({'left':(oOffset.left + $oSlideShow.width()) + 'px','top':(oOffset.top + ($oSlideShow.height()/2) - ($oNext.height()/2)) + 'px'});
	$oPrev.css({'left':(oOffset.left-$oPrev.width()) + 'px','top':(oOffset.top + ($oSlideShow.height()/2) - ($oPrev.height()/2)) + 'px'});
});

