/*
 * 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 class="main_image" id="main_image'+t+'" 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()
    }
})();
