﻿/* Copyright (c) Hoseasons Holidays Limited
* Author: Chris O'Brien
* Date: 15 February 2010
*/

jQuery.fn.carousel = function(options) {
  return this.each(function() {
    var settings = jQuery.extend({
      items: 'a',
      itemsText: 'span',
      container: '.carouselInner',
      itemWidth: 115,
      maxWidth: 165,
      itemGap: 6,
      carouselOuterWidth: 800,
      leftLinkSelector: '#left',
      rightLinkSelector: '#right',
      proximity: 150,
      centerOffset: -45,
      centerPosition: -288,
      maxMarginTop: 20, //Used for vertical center algin.
      marginLeftRight: 3, // Original margin left and right as set in the css.
      decreaseMarginLeftRightBy: 6 // Amount to decrease the margin by when animating to larger image size.
    }, options);
    var innerContainer = $(settings.container);

    var outerContainer = $(this);
    enlargeCenterImages(settings.centerPosition);
    var initialMarginLeft = parseInt(innerContainer.css("margin-left"));

    $(settings.leftLinkSelector).click(function(e) {
      //Move last item to the begining of the queue of items.
      var scrollPosition = parseInt(innerContainer.css("margin-left")) - 130;
      innerContainer.prepend($(settings.items, innerContainer).last().detach());
      innerContainer.css("margin-left", scrollPosition + "px");

      var scrollPosition = parseInt(innerContainer.css("margin-left"));
      innerContainer.stop();

      innerContainer.animate({ marginLeft: initialMarginLeft }, 400);
      enlargeCenterImages(settings.centerPosition);

      return false;
    });

    $(settings.rightLinkSelector).click(function(e) {
      var scrollPosition = parseInt(innerContainer.css("margin-left")) + 130;
      //Move first item to the end of the queue of items.
      innerContainer.append($(settings.items, innerContainer).first().detach());
      innerContainer.css("margin-left", scrollPosition + "px");

      innerContainer.stop();
      innerContainer.animate({ marginLeft: initialMarginLeft }, 400);
      enlargeCenterImages(settings.centerPosition);

      return false;
    });

    function enlargeCenterImages(scrollPosition) {
      var index = 0;
      var centerOfViewPort = outerContainer.innerWidth() / 2;
      function getEnlargingFactor(distanceFromCenter) { // Ranges from 0 to 1 with 1 been max enlagement and 0 been no enlargement;
        if (distanceFromCenter > settings.proximity) return 0;
        return 1 - (distanceFromCenter / settings.proximity);
      }
      var enlargingFactor = 0;
      var distanceFromCenter = 0;
      var viewPort
      $("img", innerContainer).each(function() {
        distanceFromCenter = Math.abs(
          (-scrollPosition + centerOfViewPort) -
          (settings.centerOffset + settings.maxWidth + (index * (settings.itemWidth + settings.itemGap)))
        );
        enlargingFactor = getEnlargingFactor(distanceFromCenter);
        sizeImage(this, enlargingFactor);
        index++;
      });
    }

    function sizeImage(imgEl, enlargingFactor) {
      var newWidth = settings.itemWidth + (enlargingFactor * (settings.maxWidth - settings.itemWidth));
      var newMarginTop = settings.maxMarginTop - (enlargingFactor * settings.maxMarginTop);
      var newMarginLeftRight = settings.marginLeftRight - (enlargingFactor * settings.decreaseMarginLeftRightBy);

      var $imgEl = $(imgEl);
      $imgEl.stop(true);
      $imgEl.parent().stop(true);
      $imgEl.animate({ width: newWidth }, 400);
      $imgEl.parent().animate({ marginTop: newMarginTop, marginLeft: newMarginLeftRight, marginRight: newMarginLeftRight }, 400);
    }

  });
};