(function ($) {
  $.fn.kwicks = function (n) {
    var p = {
      isVertical: false,
      sticky: false,
      defaultKwick: 1,
      event: 'mouseover',
      spacing: 0,
      duration: 500
    };
    var o = $.extend(p, n);
    var q = (o.isVertical ? 'height' : 'width');
    var r = (o.isVertical ? 'top' : 'left');
    return this.each(function () {
      container = $(this);
      var k = container.children('li');
      var l = k.eq(0).css(q).replace(/px/, '');
      if (!o.max) {
        o.max = (l * k.size()) - (o.min * (k.size() - 1))
      }
      else {
        o.min = ((l * k.size()) - o.max) / (k.size() - 1)
      }
      if (o.isVertical) {
        container.css({
          width: k.eq(0).css('width'),
          height: (l * k.size()) + (o.spacing * (k.size() - 1)) + 'px'
        })
      }
      else {
        container.css({
          width: (l * k.size()) + (o.spacing * (k.size() - 1)) + 'px',
          height: k.eq(0).css('height')
        })
      }
      var m = [];
      for (i = 0; i < k.size(); i++) {
        m[i] = [];
        for (j = 1; j < k.size() - 1; j++) {
          if (i == j) {
            m[i][j] = o.isVertical ? j * o.min + (j * o.spacing) : j * o.min + (j * o.spacing)
          }
          else {
            m[i][j] = (j <= i ? (j * o.min) : (j - 1) * o.min + o.max) + (j * o.spacing)
          }
        }
      }
      k.each(function (i) {
        var h = $(this);
        if (i === 0) {
          h.css(r, '0px')
        }
        else if (i == k.size() - 1) {
          h.css(o.isVertical ? 'bottom' : 'right', '0px')
        }
        else {
          if (o.sticky) {
            h.css(r, m[o.defaultKwick][i])
          }
          else {
            h.css(r, (i * l) + (i * o.spacing))
          }
        }
        if (o.sticky) {
          if (o.defaultKwick == i) {
            h.css(q, o.max + 'px');
            h.addClass('active')
          }
          else {
            h.css(q, o.min + 'px')
          }
        }
        h.css({
          margin: 0,
          position: 'absolute'
        });
        h.bind(o.event, function () {
          var c = [];
          var d = [];
          k.stop().removeClass('active');
          for (j = 0; j < k.size(); j++) {
            c[j] = k.eq(j).css(q).replace(/px/, '');
            d[j] = k.eq(j).css(r).replace(/px/, '')
          }
          var e = {};
          e[q] = o.max;
          var f = o.max - c[i];
          var g = c[i] / f;
          h.addClass('active').animate(e, {
            step: function (a) {
              var b = f != 0 ? a / f - g : 1;
              k.each(function (j) {
                if (j != i) {
                  k.eq(j).css(q, c[j] - ((c[j] - o.min) * b) + 'px')
                }
                if (j > 0 && j < k.size() - 1) {
                  k.eq(j).css(r, d[j] - ((d[j] - m[i][j]) * b) + 'px')
                }
              })
            },
            duration: o.duration,
            easing: o.easing
          })
        })
      });
      if (!o.sticky) {
        container.bind("mouseleave", function () {
          var c = [];
          var d = [];
          k.removeClass('active').stop();
          for (i = 0; i < k.size(); i++) {
            c[i] = k.eq(i).css(q).replace(/px/, '');
            d[i] = k.eq(i).css(r).replace(/px/, '')
          }
          var e = {};
          e[q] = l;
          var f = l - c[0];
          k.eq(0).animate(e, {
            step: function (a) {
              var b = f != 0 ? (a - c[0]) / f : 1;
              for (i = 1; i < k.size(); i++) {
                k.eq(i).css(q, c[i] - ((c[i] - l) * b) + 'px');
                if (i < k.size() - 1) {
                  k.eq(i).css(r, d[i] - ((d[i] - ((i * l) + (i * o.spacing))) * b) + 'px')
                }
              }
            },
            duration: o.duration,
            easing: o.easing
          })
        })
      }
    })
  }
})(jQuery);
