/*
 * 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()
  }
})();
