(function( $ ){
		  
	var nextLgImage = "";
	var nextSmImage = "";
	var nativElement = "";

	var imgArray = [];
	var urlArray = [];
	var smHolder = [];
	
	var tempLgImg = new Image();
	
	var arrayLength, smStarter, marginTop, iVar, hrpLineTotal, pLineBannerIndex;
	var smImg = 4;
	
	
	var methods = {

	//init { parse the data 1.image array, 2.url array }
    init : function( options ) { 

		nativElement = j$(this);
		arrayLength = headerImg.length;
		
		for (iVar=0; iVar<arrayLength; iVar++){
			//imgArray.push(headerImg[iVar][0]); //slower when it is running on huge collection
			imgArray[iVar] = headerImg[iVar][0];
			urlArray[iVar] = headerImg[iVar][1];
		}
		
		//send second large image and 4th small image to preload
		nextLgImage = 0;
		nextSmImage = 3;

		smHolder = { 1: "#smImg1", 2: "#smImg2", 3: "#smImg3", 4: "#smImg4" };
		smStarter = 5;

		//methods.preLoadImg(nextLgImage, nextSmImage, smStarter);
		methods.rotateImg();
	},
    
	// Preload image before start to rotate the banner, preload large and small image
	preLoadImg : function(nextLgImage, nextSmImage, smStarter) {
		
		////////// Large Size Banner preload ////////////////////////////////
		if (nextLgImage<1){ preLgImage = arrayLength; } else { preLgImage = nextLgImage; }
		$(tempLgImg).fadeTo(1,0);
		$('#BlgsmRotateID').css("background", "url(/_images/taxonomy/categories/headers/"+ imgArray[preLgImage-1] + "_lg.jpg) no-repeat");
		$('.lgImgHolderClass').empty();
		
		$(tempLgImg).load(function(){
			$('.lgImgHolderClass').removeClass('loading').append(this).delay(500);
		}).error(function(){ 
		  // if error then load next image or stop rotation
		}).attr({'src': '/_images/taxonomy/categories/headers/'+ imgArray[nextLgImage] + '_lg.jpg'}).click(function(){ 
			window.open(urlArray[nextLgImage], "_self"); });
		
		
		
		/////// Small size banner preload //////////////////////////////////
		$(smHolder[smStarter]).load(function () {
		}).error(function(){ 
		  // if error then load next image or stop rotation 
		}).attr({'src':'/_images/taxonomy/categories/headers/'+ imgArray[nextSmImage] + '_sm.jpg'}).click(function(){
				window.open(urlArray[nextSmImage], "_self"); });
		
		/////// Once image loaded start to tween and scroll to bottom  //////////////////////////////////
		$(tempLgImg).fadeTo(1000, 1);
		$(smHolder[smStarter]).css("margin-top", "-120px");
		
		for (smImg; smImg >= 1; smImg--) {
				marginTop = parseInt($(smHolder[smImg]).css("margin-top"),10);
               $(smHolder[smImg]).animate({"margin-top": marginTop +120}, 1000);
        }

		methods.rotateImg();
	},
    
	//Start  to roate image one by one
	rotateImg : function(){ 
	  if (nextLgImage < arrayLength-1){ nextLgImage++; } else { nextLgImage = 0; }
	  if (nextSmImage < arrayLength-1){ nextSmImage++; } else { nextSmImage = 0; }
		
	  smStarter -= 1;
	  if (smStarter <= 0){ smStarter = 4; }
	  smImg = 4;
	  
	  //console.log(nextLgImage + ":" +  nextSmImage + ":" + smStarter);
	  setTimeout(function() { methods.preLoadImg(nextLgImage, nextSmImage, smStarter); }, 7000);
	},
    
	
	/////  Large Horizontal Product line banner rotator //////////////////////////////
	hrProductLine : function(){ 
	  hrpLineTotal = $('.hrImgHolderClass li').size();
	  pLineBannerIndex = hrpLineTotal;
	  if (hrpLineTotal >1) {
	    setTimeout(function() { methods.rotatehrpLine(hrpLineTotal, pLineBannerIndex);}, 7000);
	  } else {
		  $('#prodLineHeader1').fadeTo(500,1);
	  }
	},
	
	
	///// Rotate Product line header banners ///////////////////////////
	rotatehrpLine : function (hrpLineTotal, pLineBannerIndex){
	  var preBannerIndex = pLineBannerIndex-1;
	  if (preBannerIndex <1){ preBannerIndex = hrpLineTotal; }
	  
	  $('#prodLineHeader'+preBannerIndex).fadeTo(1000,1);
	  $('#prodLineHeader'+pLineBannerIndex).fadeTo(1000,0);
	  pLineBannerIndex -= 1;
	  if (pLineBannerIndex <= 0){ pLineBannerIndex = hrpLineTotal; }
	  setTimeout(function() { methods.rotatehrpLine(hrpLineTotal, pLineBannerIndex);}, 7000);
	}
	
  };

  $.fn.rotator = function( method ) {
    
    // Method calling logic
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.rotator' );
    }    
  
  };

})( jQuery );



