var homepageRotator = function () {
  var // Hold reference to function context
      _me = this,
      // List of Images
      _imgList = null,
      // jQuerified Dom Elements
      _selectionContainer = null,
      _parentContainer = null,
      _userContent = null,
      _userInnerContent = null,
      // Largest Image Dimensions
      _largestWidth = 302,
      _largestHeight = 302;
      
  this.initRotator = function (imgList) {
    _imgList = imgList;
    _selectionContainer = $('#selectionImageContainer');
    _parentContainer = _selectionContainer.parent();
    _userContent = $('#userContent');
    _userInnerContent = $('#userInnerContents');
  };
  
  this.setupRotatorDimensions = function() {
    var i = null,
        imgContainer = $('#selectionImageBox'),
        titleContainer = $('#rotatorContainer .titleContainer');

    for (i = 0; i < _imgList.length; i++) {
      if (_imgList[i].width > _largestWidth) {
        _largestWidth = _imgList[i].width;
      }
      if (_imgList[i].height > _largestHeight) {
        _largestHeight = _imgList[i].height;
      }
    }
    
    if (_largestWidth > 302) {
      _selectionContainer.css('width', _selectionContainer.width() - 302 + _largestWidth);
    }
    _selectionContainer.css('min-width', _selectionContainer.width());
    imgContainer.css('height', _largestHeight + titleContainer.height());
    titleContainer.css('width', _largestWidth);

    if (_userContent.length > 0) {
      _userContent.css('height', _selectionContainer.outerHeight() - (_userContent.outerHeight() - _userContent.height()));
    } else {
      _selectionContainer.css('float','none').css('width','auto').css('margin-right', 0);
    }
    
    _selectionContainer.css('display','block');
  };
  
  this.bindRotatorEvents = function() {
    var rotator = $('#imageRotator');

    rotator.imageRotator('init', {
      images: rfs2.rotatorImages.data,
      delay: 5000,
      fadeInDelay: 250,
      fadeOutDelay: 250
    })
    .bind('imageRotator.transitioning', function (e, image) {
      if (image.imageTitle.length > 0) {
        $('#imageTitle').text(image.imageTitle).css('display','block').css('display', 'table-cell');
      } else {
        $('#imageTitle').css('display', 'none');
      }
      if (image.productURL !== null) {
        $('#rotatorContainer a').attr('href', image.productURL);
      } else {
        $('#rotatorContainer a').removeAttr('href');
      }
      $('#rotatorIndexList > span').removeClass('active');
      $('#rotatorIndexList > span.index' + image.rowNumber).addClass('active');
      $(this).css('margin', ((_largestHeight - image.preloadedImage.height) / 2).toString() + 'px auto');
    })
    .imageRotator('play');
    
    _selectionContainer.mouseover(function () {
      rotator.imageRotator('pause');
    })
    .mouseout(function () {
      rotator.imageRotator('unpause');
    });
  };
  
  this.borderAndPadding = function($domObj, dimension) {
    if (dimension === 'w') {
      return $domObj.outerWidth() - $domObj.width();
    } else {
      return $domObj.outerHeight() - $domObj.height();
    }
  };
  
  this.monitorSizing = function () {
    var floatedHeight = _selectionContainer.outerHeight() - (_userContent.outerHeight() - _userContent.height()),
        separationWidth = parseInt(_selectionContainer.css('margin-right')),
        snapWidth = parseInt(_selectionContainer.css('min-width')) + separationWidth + _me.borderAndPadding(_userContent, 'w') + _me.borderAndPadding(_selectionContainer, 'w'),
        check = function() {
          if (_userInnerContent.width() > _userContent.width()) {
            _userContent.css('min-width', _userInnerContent.width());
          }
          
          if (_userContent.offset().top > _selectionContainer.offset().top) {
            if (snapWidth + parseInt(_userContent.css('min-width')) < _parentContainer.width()) {
              _selectionContainer.css('float', 'left').css('width', _selectionContainer.css('min-width')).css('margin-right', separationWidth);
              _userContent.css('height', floatedHeight);
            } else {
              _selectionContainer.css('float', 'none').css('width', 'auto').css('margin-right', 0);
              _userContent.css('height', 'auto');
            }
          }
        };
    
    check();
    $(window).bind('resize', check);
    setInterval(check, 10000);
  };
};

$(function () {
  var i = null,
      imgCollection = rfs2.rotatorImages.data,
      deferreds = [],
      imgList = [],
      resolveImageLoaded = function(newDef) {
        return function() { newDef.resolve(this); };
      };

  for (i = 0; i < imgCollection.length; i++) {
    if (imgCollection[i].imageType === 1) {
      imgCollection[i].URL = 'resources/' + imgCollection[i].URL;
    } else {
      imgCollection[i].URL = 'uploads/' + imgCollection[i].URL + '.jpg';
    }
    
    imgList[i] = new Image();
    deferreds[i] = new jQuery.Deferred();
    $(imgList[i]).load(resolveImageLoaded(deferreds[i]));
    imgList[i].src = rfs2.rotatorImages.data[i].URL;
    rfs2.rotatorImages.data[i].preloadedImage = imgList[i];
  }
  
  $.when.apply(this,deferreds).then(function() {
    var rotator = new homepageRotator();
    rotator.initRotator(imgList);
    rotator.setupRotatorDimensions();
    rotator.bindRotatorEvents();
    rotator.monitorSizing();
  });
});
