(function($) {
  
  $.fn.bdualslider = function(options) {

    var
      primarySlider = $(this),
      defaults = {
        'secondSliderId': '#bigslide',
        'secondSliderSlides': '',
        'autoScroll': true, //not implemented yet
        'effectTime': 2000,
        'effectTimeSecondary': 3000,
        'slidePause': 4500,
        'effect': 'fade',
        'debug': false,
        'prevButton': '#prev',
        'nextButton': '#next',
        'primaryImageClass': 'bdsPrimary'
      },
      currentImage = 0,
      previousImage = 0,
			settings = $.extend({}, defaults, options);

    if(settings.debug)
      console.log('plugin loaded successfully.');
    
    // check images in secondary slider
    var secondarySlidesCount = $(settings.secondSliderId.length);
    for(i=0; i<secondarySlidesCount; i++) {
      if(settings.debug)
        console.log('item loaded '+settings.secondSliderSlides[i]);
    }
    var secondarySliderSlides = settings.secondSliderSlides;
    
    // check images in primary slider
    var primarySliderSlides = primarySlider.children();
    if(primarySliderSlides == 0 && settings.debug) 
      console.log('no images found!');
    
    // filter by images that have our required class
    var primarySlidesFiltered = new Array();
    primarySliderSlides.each(function() {
      if($(this).hasClass(settings.primaryImageClass)) {
        primarySlidesFiltered.push($(this)) ;
      }
    });

    
    if(settings.debug) {
      console.log(primarySlidesFiltered);
      console.log(secondarySlidesCount);
    }
      

    // compare sizes and throw error and kill script
    if(primarySlidesFiltered.length > secondarySlidesCount) {
      alert('Sorry, You have more images in your primary slider than in your secondary slider. You might wanna fix this');
      return;
    }
    if(primarySlidesFiltered.length < secondarySlidesCount) {
      alert('Sorry, You have more images in your secondary slider than in your primary slider. You might wanna fix this');
      return;
    }

    // if not done yet, hide all images except the first one. 
    for(i=0;i<primarySlidesFiltered.length;i++) {
      if(i != 0) {
        primarySlidesFiltered[i].hide();
        if(settings.debug)
          console.log('all images hidden');
      }
    }

    // combine slides

    var slides = new Array();
    for(i=0;i<primarySlidesFiltered.length;i++) {
      slides.push(
          new Array(
              primarySlidesFiltered[i], 
              secondarySliderSlides[i]
            )
          );
    }
    // init slider
    getSlides(true);
    setSlides(true);
    if(settings.debug) {
      console.log('initiated slides');
      console.log(slides);
    }

    
    
    // function to get active slide
    function getSlides(init) {
      activeSlides = new Array();
      // initial start, thus get first images.
      if(init) {
        activeSlides = slides[0];
        currentImage = 0;
      }else {
        //somehow get next image.
        activeSlides = slides[currentImage];
      }
    }

    // function for getting the next image or reset to first one
    function getNextImage() {
       previousImage = currentImage;
      if(currentImage +1 > (primarySlidesFiltered.length -1) ) {
        currentImage = 0; // reset index
      }else {
        currentImage = currentImage + 1;
      }
    }
    // function for getting the previous or last image
    function getPrevImage() {
      previousImage = currentImage;
      // current image is first image
      if(currentImage - 1 < 0) {
        currentImage = primarySlidesFiltered.length-1;
      }else {
        currentImage = currentImage - 1;
      }
    }

    // perform the actual changes
    function setSlides(init) {

      effectTimeSecondary = init ? 0 : settings.effectTimeSecondary;

      // primary slider
      $(primarySlidesFiltered[previousImage]).stop(true, true).fadeOut(settings.effectTime);
      $(settings.secondSliderId+'-'+previousImage).stop(true, true).fadeOut(effectTimeSecondary);

      $(primarySlidesFiltered[currentImage]).stop(true, true).fadeIn(settings.effectTime);
      $(settings.secondSliderId+'-'+currentImage).stop(true, true).fadeIn(effectTimeSecondary);
    }
    
    // move backwards
    $(settings.prevButton).click(function() { 
      getPrevImage();
      getSlides();
      setSlides();
      stop_rotating = true;
    });
    
    // move forwards
    $(settings.nextButton).click(function() { 
      getNextImage();
      getSlides();
      setSlides();
      stop_rotating = true;
    });

    //handle autosliding
    if(settings.autoSlide) {
      var stop_rotating = false;
      startTab = 0;
      var scrolled = startTab+1;
      moveToNext = $.doTimeout(settings.slidePause, function() {
        if(!stop_rotating) {
          getNextImage();
          getSlides();
          setSlides();        
          return true;
        }
      });
      return false;

    }

  }
})(jQuery);

