/*
    Kwicks for jQuery Minified
    Copyright (c) 2008 Jeremy Martin
    http://www.jeremymartin.name/projects.php?project=kwicks
    
    Licensed under the MIT license:
        http://www.opensource.org/licenses/mit-license.php

    Any and all use of this script must be accompanied by this copyright/license notice in its present form.

    11/8/2010: version 2.0 - Rob Garrison - Changed plugin format, updated & added a github repository.
*/

(function(h) {
    h.kwicks = function(j, n) {
        var a = this;
        a.$el = h(j).addClass("kwicks");
        a.el = j;
        a.$el.data("kwicks", a);
        a.init = function() {
            a.options = h.extend({}, h.kwicks.defaultOptions, n);
            a.$kwicks = a.$el.children("li");
            a.$el.addClass(a.options.isVertical ? "vertical" : "horizontal").css('opacity', 0).stop().delay(600).animate({'opacity': 1}, 800);
            a.size = a.$kwicks.size();
            a.lastActive = a.options.defaultKwick;
            a.active = a.options.defaultKwick;
            a.$active = a.$kwicks.eq(a.active);
            a.WoH = a.options.isVertical ? "height" : "width";
            a.LoT = a.options.isVertical ? "top" : "left";
            a.normWoH = parseInt(a.$kwicks.eq(0).css(a.WoH), 10);
            a.preCalcLoTs = [];
            a.aniObj = {};
            if (a.options.max) a.options.min = (a.normWoH * a.size - a.options.max) / (a.size - 1);
            else a.options.max = a.normWoH * a.size - a.options.min * (a.size - 1);
            a.options.isVertical ? a.$el.css({
                width: a.$kwicks.eq(0).css("width"),
                height: a.normWoH * a.size + a.options.spacing * (a.size - 1)
            }) : a.$el.css({
                width: a.normWoH * a.size + a.options.spacing * (a.size - 1),
                height: a.$kwicks.eq(0).css("height")
            });
            for (var b = 0; b < a.size; b++) {
                a.preCalcLoTs[b] = [];
                for (var f = 1; f < a.size - 1; f++) a.preCalcLoTs[b][f] = b == f ? a.options.isVertical ? f * a.options.min + f * a.options.spacing : f * a.options.min + f * a.options.spacing : (f <= b ? f * a.options.min : (f - 1) * a.options.min + a.options.max) + f * a.options.spacing
            }
            a.$kwicks.each(function(c) {
									
				$(this).prepend('<span class="kwicksShadow"></span>');
				$(this).find('h3, p').wrapAll('<span class="kwicksCaption"></span>');
									
                var d = h(this);
                d.addClass("kwick-panel kwick" + (c + 1));
                if (c === 0) d.css(a.LoT, 0);
                else if (c == a.size - 1) d.css(a.options.isVertical ? "bottom" : "right", 0);
                else a.options.sticky ? d.css(a.LoT, Math.ceil(a.preCalcLoTs[a.options.defaultKwick][c])) : d.css(a.LoT, Math.ceil(c * a.normWoH + c * a.options.spacing));
                if (a.options.sticky) if (a.options.defaultKwick == c) {
                    d.css(a.WoH, a.options.max);
                    d.addClass(a.options.activeClass)
                } else d.css(a.WoH, a.options.min);
                d.css({
                    margin: 0,
                    position: "absolute"
                });
                d.bind(a.options.event, function(g) {
                    if (!d.is("." + a.options.activeClass)) {
                        a.$kwicks.stop().removeClass(a.options.activeClass);
                        a.lastActive = a.active;
                        a.$active = d;
                        a.active = a.$kwicks.index(d);
                        d.addClass(a.options.activeClass);
                        a.triggerEvent("init");
                        a.lastEvent = g.timeStamp;
                        var e = [],
                            k = [];
                        for (g = 0; g < a.size; g++) {
                            e[g] = parseInt(a.$kwicks.eq(g).css(a.WoH), 10);
                            k[g] = parseInt(a.$kwicks.eq(g).css(a.LoT), 10)
                        }
                        a.aniObj[a.WoH] = a.options.max;
                        var l = a.options.max - e[c],
                            o = e[c] / l;
                        a.triggerEvent("expanding");
                        d.animate(a.aniObj, {
                            step: function(p) {
                                var m = l !== 0 ? p / l - o : 1;
                                a.$kwicks.each(function(i) {
                                    i != c && a.$kwicks.eq(i).css(a.WoH, Math.ceil(e[i] - (e[i] - a.options.min) * m));
                                    i > 0 && i < a.size - 1 && a.$kwicks.eq(i).css(a.LoT, Math.ceil(k[i] - (k[i] - a.preCalcLoTs[c][i]) * m))
                                })
                            },
                            duration: a.options.duration,
                            easing: a.options.easing,
                            complete: function() {
                                a.triggerEvent("completed")
                            }
                        })
                    }
                })
            });
            a.options.sticky || a.$el.bind(a.options.eventClose, function(c) {
                if (!(c.timeStamp - a.lastEvent < 200)) {
                    a.lastEvent = c.timeStamp;
                    a.triggerEvent("init");
                    a.closeKwick()
                }
            })
        };
        a.openKwick = function(b) {
            if (/\d/.test(b) && !isNaN(b)) {
                b = parseInt(h.trim(b), 10);
                b < 0 || b > a.size - 1 || a.$kwicks.eq(b).trigger(a.options.event)
            }
        };
        a.closeKwick = function() {
            if (!a.options.sticky) {
                for (var b = [], f = [], c = 0; c < a.size; c++) {
                    b[c] = parseInt(a.$kwicks.eq(c).css(a.WoH), 10);
                    f[c] = parseInt(a.$kwicks.eq(c).css(a.LoT), 10)
                }
                a.aniObj[a.WoH] = a.normWoH;
                var d = a.normWoH - b[0];
                a.triggerEvent("collapsing");
                a.$kwicks.stop().removeClass(a.options.activeClass).eq(0).animate(a.aniObj, {
                    step: function(g) {
                        g = d !== 0 ? (g - b[0]) / d : 1;
                        for (var e = 1; e < a.size; e++) {
                            a.$kwicks.eq(e).css(a.WoH, Math.ceil(b[e] - (b[e] - a.normWoH) * g));
                            e < a.size - 1 && a.$kwicks.eq(e).css(a.LoT, Math.ceil(f[e] - (f[e] - (e * a.normWoH + e * a.options.spacing)) * g))
                        }
                    },
                    duration: a.options.duration,
                    easing: a.options.easing,
                    complete: function() {
                        a.triggerEvent("completed")
                    }
                })
            }
        };
        a.triggerEvent = function(b) {
            a.$el.trigger("kwicks-" + b, a);
            h.isFunction(a.options[b]) && a.options[b](a)
        };
        a.isActive = function() {
            return a.$kwicks.is(".active")
        };
        a.getActive = function() {
            return a.isActive() ? a.active : -1
        };
        a.init()
    };
    h.kwicks.defaultOptions = {
        isVertical: false,
        sticky: false,
        defaultKwick: 0,
        activeClass: "active",
        event: "mouseenter",
        eventClose: "mouseleave",
        spacing: 0,
        duration: 500,
        easing: "swing",
        max: null,
        min: null,
        init: null,
        expanding: null,
        collapsing: null,
        completed: null
    };
    h.fn.kwicks = function(j) {
        return this.each(function() {
            h(this).data("kwicks") || new h.kwicks(this, j)
        })
    };
    h.fn.getkwicks = function() {
        this.data("kwicks")
    }
})(jQuery);
