/*
 * CrossSlide jQuery plugin v0.6.2
 *
 * Copyright 2007-2010 by Tobia Conforto <tobia.conforto@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the Free
 * Software Foundation; either version 2 of the License, or (at your option)
 * any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 * You should have received a copy of the GNU General Public License along with
 * this program; if not, write to the Free Software Foundation, Inc., 51
 * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 */
(function () {
    var d = jQuery,
        a = (d.fn.startAnimation ? "startAnimation" : "animate"),
        c = "pause plugin missing.";

    function e(h) {
        for (var g = 1; g < arguments.length; g++) {
            h = h.replace(new RegExp("\\{" + (g - 1) + "}", "g"), arguments[g])
        }
        return h
    }
    function f() {
        arguments[0] = "CrossSlide: " + arguments[0];
        throw new Error(e.apply(null, arguments))
    }
    function b(i) {
        var g = 1;
        var h = i.replace(/^\s*|\s*$/g, "").split(/\s+/);
        if (h.length > 3) {
            throw new Error()
        }
        if (h[0] == "center") {
            if (h.length == 1) {
                h = ["center", "center"]
            } else {
                if (h.length == 2 && h[1].match(/^[\d.]+x$/i)) {
                    h = ["center", "center", h[1]]
                }
            }
        }
        if (h.length == 3) {
            g = parseFloat(h[2].match(/^([\d.]+)x$/i)[1])
        }
        var j = h[0] + " " + h[1];
        if (j == "left top" || j == "top left") {
            return {
                xrel: 0,
                yrel: 0,
                zoom: g
            }
        }
        if (j == "left center" || j == "center left") {
            return {
                xrel: 0,
                yrel: 0.5,
                zoom: g
            }
        }
        if (j == "left bottom" || j == "bottom left") {
            return {
                xrel: 0,
                yrel: 1,
                zoom: g
            }
        }
        if (j == "center top" || j == "top center") {
            return {
                xrel: 0.5,
                yrel: 0,
                zoom: g
            }
        }
        if (j == "center center") {
            return {
                xrel: 0.5,
                yrel: 0.5,
                zoom: g
            }
        }
        if (j == "center bottom" || j == "bottom center") {
            return {
                xrel: 0.5,
                yrel: 1,
                zoom: g
            }
        }
        if (j == "right top" || j == "top right") {
            return {
                xrel: 1,
                yrel: 0,
                zoom: g
            }
        }
        if (j == "right center" || j == "center right") {
            return {
                xrel: 1,
                yrel: 0.5,
                zoom: g
            }
        }
        if (j == "right bottom" || j == "bottom right") {
            return {
                xrel: 1,
                yrel: 1,
                zoom: g
            }
        }
        return {
            xrel: parseInt(h[0].match(/^(\d+)%$/)[1]) / 100,
            yrel: parseInt(h[1].match(/^(\d+)%$/)[1]) / 100,
            zoom: g
        }
    }
    d.fn.crossSlide = function (i, k, l) {
        var g = this,
            j = this.width(),
            h = this.height();
        if (g.length != 1) {
            f("crossSlide() must be called on exactly 1 element")
        }
        g.get(0).crossSlideArgs = [i, k, l];
        k = d.map(k, function (m) {
            return d.extend({}, m)
        });
        if (!i.easing) {
            i.easing = i.variant ? "swing" : "linear"
        }
        if (!l) {
            l = function () {}
        }(function (o) {
            var m = 0;

            function n(q, p) {
                p.onload = function (r) {
                    m++;
                    k[q].width = p.width;
                    k[q].height = p.height;
                    if (m == k.length) {
                        o()
                    }
                };
                p.src = k[q].src;
                if (q + 1 < k.length) {
                    n(q + 1, new Image())
                }
            }
            n(0, new Image())
        })(function () {
            if (!i.fade) {
                f("missing fade parameter.")
            }
            if (i.speed && i.sleep) {
                f("you cannot set both speed and sleep at the same time.")
            }
            var A = Math.round(i.fade * 1000);
            if (i.sleep) {
                var z = Math.round(i.sleep * 1000)
            }
            if (i.speed) {
                var o = i.speed / 1000,
                    v = Math.round(A * o)
            }
            g.empty().css({
                overflow: "hidden",
                padding: 0
            });
            if (!/^(absolute|relative|fixed)$/.test(g.css("position"))) {
                g.css({
                    position: "relative"
                })
            }
            if (!g.width() || !g.height()) {
                f("container element does not have its own width and height")
            }
            if (i.shuffle) {
                k.sort(function () {
                    return Math.random() - 0.5
                })
            }
            for (var t = 0; t < k.length; ++t) {
                var m = k[t];
                if (!m.src) {
                    f("missing src parameter in picture {0}.", t + 1)
                }
                if (o) {
                    switch (m.dir) {
                    case "up":
                        m.from = {
                            xrel: 0.5,
                            yrel: 0,
                            zoom: 1
                        };
                        m.to = {
                            xrel: 0.5,
                            yrel: 1,
                            zoom: 1
                        };
                        var x = m.height - h - 2 * v;
                        break;
                    case "down":
                        m.from = {
                            xrel: 0.5,
                            yrel: 1,
                            zoom: 1
                        };
                        m.to = {
                            xrel: 0.5,
                            yrel: 0,
                            zoom: 1
                        };
                        var x = m.height - h - 2 * v;
                        break;
                    case "left":
                        m.from = {
                            xrel: 0,
                            yrel: 0.5,
                            zoom: 1
                        };
                        m.to = {
                            xrel: 1,
                            yrel: 0.5,
                            zoom: 1
                        };
                        var x = m.width - j - 2 * v;
                        break;
                    case "right":
                        m.from = {
                            xrel: 1,
                            yrel: 0.5,
                            zoom: 1
                        };
                        m.to = {
                            xrel: 0,
                            yrel: 0.5,
                            zoom: 1
                        };
                        var x = m.width - j - 2 * v;
                        break;
                    default:
                        f("missing or malformed dir parameter in picture {0}.", t + 1)
                    }
                    if (x <= 0) {
                        f("impossible animation: either picture {0} is too small or div is too large or fade duration too long.", t + 1)
                    }
                    m.time_ms = Math.round(x / o)
                } else {
                    if (!z) {
                        if (!m.from || !m.to || !m.time) {
                            f("missing either speed/sleep option, or from/to/time params in picture {0}.", t + 1)
                        }
                        try {
                            m.from = b(m.from)
                        } catch (w) {
                            f('malformed "from" parameter in picture {0}.', t + 1)
                        }
                        try {
                            m.to = b(m.to)
                        } catch (w) {
                            f('malformed "to" parameter in picture {0}.', t + 1)
                        }
                        if (!m.time) {
                            f('missing "time" parameter in picture {0}.', t + 1)
                        }
                        m.time_ms = Math.round(m.time * 1000)
                    }
                }
                if (m.from) {
                    d.each([m.from, m.to], function (p, C) {
                        C.width = Math.round(m.width * C.zoom);
                        C.height = Math.round(m.height * C.zoom);
                        C.left = Math.round((j - C.width) * C.xrel);
                        C.top = Math.round((h - C.height) * C.yrel)
                    })
                }
                var s, y;
                y = s = d(e('<img src="{0}"/>', m.src));
                if (m.href) {
                    y = d(e('<a href="{0}"></a>', m.href)).append(s)
                }
                if (m.onclick) {
                    y.click(m.onclick)
                }
                if (m.alt) {
                    s.attr("alt", m.alt)
                }
                if (m.rel) {
                    y.attr("rel", m.rel)
                }
                if (m.href && m.target) {
                    y.attr("target", m.target)
                }
                y.appendTo(g)
            }
            delete o;

            function n(D, C) {
                var E = [0, A / (D.time_ms + 2 * A), 1 - A / (D.time_ms + 2 * A), 1][C];
                return {
                    left: Math.round(D.from.left + E * (D.to.left - D.from.left)),
                    top: Math.round(D.from.top + E * (D.to.top - D.from.top)),
                    width: Math.round(D.from.width + E * (D.to.width - D.from.width)),
                    height: Math.round(D.from.height + E * (D.to.height - D.from.height))
                }
            }
            var u = g.find("img").css({
                position: "absolute",
                visibility: "hidden",
                top: 0,
                left: 0,
                border: 0
            });
            u.eq(0).css({
                visibility: "visible"
            });
            if (!z) {
                u.eq(0).css(n(k[0], i.variant ? 0 : 1))
            }
            var B = i.loop;

            function q(O, p) {
                if (O % 2 == 0) {
                    if (z) {
                        var E = O / 2,
                            S = (E - 1 + k.length) % k.length,
                            P = u.eq(E),
                            M = u.eq(S);
                        var L = function () {
                            l(E, P.get(0));
                            M.css("visibility", "hidden");
                            setTimeout(p, z)
                        }
                    } else {
                        var H = O / 2,
                            S = (H - 1 + k.length) % k.length,
                            R = u.eq(H),
                            M = u.eq(S),
                            F = k[H].time_ms,
                            N = n(k[H], i.variant ? 3 : 2);
                        var L = function () {
                            l(H, R.get(0));
                            M.css("visibility", "hidden");
                            R[a](N, F, i.easing, p)
                        }
                    }
                } else {
                    var D = Math.floor(O / 2),
                        G = Math.ceil(O / 2) % k.length,
                        Q = u.eq(D),
                        C = u.eq(G),
                        T = {},
                        K = {
                            visibility: "visible"
                        },
                        J = {};
                    if (G > D) {
                        K.opacity = 0;
                        J.opacity = 1;
                        if (i.doubleFade) {
                            T.opacity = 0
                        }
                    } else {
                        T.opacity = 0;
                        if (i.doubleFade) {
                            K.opacity = 0;
                            J.opacity = 1
                        }
                    }
                    if (!z) {
                        d.extend(K, n(k[G], 0));
                        if (!i.variant) {
                            d.extend(T, n(k[D], 3));
                            d.extend(J, n(k[G], 1))
                        }
                    }
                    if (d.isEmptyObject(J)) {
                        var L = function () {
                            l(G, C.get(0), D, Q.get(0));
                            C.css(K);
                            Q[a](T, A, "linear", p)
                        }
                    } else {
                        if (d.isEmptyObject(T)) {
                            var L = function () {
                                l(G, C.get(0), D, Q.get(0));
                                C.css(K);
                                C[a](J, A, "linear", p)
                            }
                        } else {
                            var L = function () {
                                l(G, C.get(0), D, Q.get(0));
                                C.css(K);
                                C[a](J, A, "linear");
                                Q[a](T, A, "linear", p)
                            }
                        }
                    }
                }
                if (i.loop && O == k.length * 2 - 2) {
                    var I = L;
                    L = function () {
                        if (--B) {
                            I()
                        }
                    }
                }
                if (O > 0) {
                    return q(O - 1, L)
                } else {
                    return L
                }
            }
            var r = q(k.length * 2 - 1, function () {
                return r()
            });
            r()
        });
        return g
    };
    d.fn.crossSlideFreeze = function () {
        this.find("img").stop()
    };
    d.fn.crossSlideStop = function () {
        this.find("img").stop().remove()
    };
    d.fn.crossSlideRestart = function () {
        this.find("img").stop().remove();
        d.fn.crossSlide.apply(this, this.get(0).crossSlideArgs)
    };
    d.fn.crossSlidePause = function () {
        if (!d.fn.pause) {
            f(c)
        }
        this.find("img").pause()
    };
    d.fn.crossSlideResume = function () {
        if (!d.fn.pause) {
            f(c)
        }
        this.find("img").resume()
    }
})();
