(function(a) {
  a.fn.quicksand = function(y, r, t) {
    var b = {
      duration:750,
      easing:"swing",
      attribute:"data-id",
      adjustHeight:"auto",
      useScaling:true,
      enhancement:function(){},
      selector:"> *"
    };
    a.extend(b,r);
    if (a.browser.msie || typeof a.fn.scale=="undefined")
      b.useScaling = false;
    var o;
    if (typeof r == "function")
      o = r;
    else if (typeof(t == "function"))
      o = t;
    return this.each(function(k) {
      var m, i=[], l = a(y).clone(), g = a(this);
      k = a(this).css("height");
      var p, u = false, 
      v = a(g).offset(), 
      s = [], 
      n = a(this).find(b.selector);
      if (a.browser.msie && a.browser.version.substr(0, 1) < 7)
        g.html("").append(l);
      else {
        var w = 0, 
        z = function() {
          if (!w) {
            g.html(j.html());
            typeof o == "function" && o.call(this);
            u && g.css("height", p);
            b.enhancement(g);
            w = 1
          }
        }, 
        c = g.offsetParent(), 
        e = c.offset();
        if (c.css("position") == "relative") {
          if (c.get(0).nodeName.toLowerCase() != "body") {
            e.top += parseFloat(c.css("border-top-width"));
            e.left += parseFloat(c.css("border-left-width"))
          }
        } else {
          e.top -= parseFloat(c.css("border-top-width"));
          e.left -= parseFloat(c.css("border-left-width"));
          e.top -= parseFloat(c.css("margin-top"));
          e.left -= parseFloat(c.css("margin-left"))
        }
        g.css("height", a(this).height());
        n.each(function(f) {
          s[f] = a(this).offset()
        });
        a(this).stop();
        n.each(function(f) {
          a(this).stop();
          var h = a(this).get(0);
          h.style.position = "absolute";
          h.style.margin = "0";
          h.style.top = s[f].top - parseFloat(h.style.marginTop) - e.top + "px";
          h.style.left = s[f].left - parseFloat(h.style.marginLeft) - e.left + "px"
        });
        var j = a(g).clone();
        c = j.get(0);
        c.innerHTML = "";
        c.setAttribute("id", "");
        c.style.height = "auto";
        c.style.width = g.width()+"px";
        j.append(l);
        j.insertBefore(g);
        j.css("opacity", 0);
        c.style.zIndex = -1;
        c.style.margin = "0";
        c.style.position = "absolute";
        c.style.top = v.top - e.top + "px";
        c.style.left = v.left - e.left + "px";
        if (b.adjustHeight === "dynamic")
          g.animate({height:j.height()},
                    b.duration,
                    b.easing);
        else if (b.adjustHeight === "auto") {
          p = j.height();
          if (parseFloat(k) < parseFloat(p))
            g.css("height", p);
          else 
            u = true
        }
        n.each(function() {
          var f = [];
          if (typeof b.attribute == "function") {
            m = b.attribute(a(this));
            l.each(function() {
              if (b.attribute(this) == m) {
                f = a(this);
                return false
              }
            })
          } else {
            f = l.filter("[" + b.attribute + "=" + a(this).attr(b.attribute) + "]");
          }
          if (f.length)
            b.useScaling ? i.push({element:a(this),
                                   animation:{
                                     top:f.offset().top-e.top,
                                     left:f.offset().left-e.left,
                                     opacity:1,
                                     scale:"1.0"}}) : i.push({element:a(this),
                                                              animation:{
                                                                top:f.offset().top - e.top,
                                                                left:f.offset().left - e.left,
                                                                opacity:1}});
          else 
            b.useScaling ? i.push({element:a(this),
                                   animation:{
                                     opacity:"0.0",
                                     scale:"0.0"}}) : i.push({element:a(this),
                                                              animation:{opacity:"0.0"}})
        });
        l.each(function() {
          var f = [], h = [];
          if (typeof b.attribute == "function") {
            m = b.attribute(a(this));
            n.each(function() {
              if (b.attribute(this) == m) {
                f = a(this);
                return false
              }
            });
            l.each(function() {
              if (b.attribute(this) == m) {
                h = a(this);
                return false
              }
            })
          } else {
            f = n.filter("[" + b.attribute + "=" + a(this).attr(b.attribute) + "]");
            h = l.filter("[" + b.attribute + "=" + a(this).attr(b.attribute) + "]")
          }
          var x;
          if (f.length === 0) {
            x = b.useScaling ? {opacity:"1.0", scale:"1.0"} : {opacity:"1.0"};
            d = h.clone();
            var q = d.get(0);
            if (q) {
              q.style.position = "absolute";
              q.style.margin = "0";
              q.style.top = h.offset().top-e.top + "px";
              q.style.left = h.offset().left-e.left + "px";
            }
            d.css("opacity", 0);
            b.useScaling && d.css("transform", "scale(0.0)");
            d.appendTo(g);
            i.push({element:a(d), animation:x})
          }
        });
        j.remove();
        b.enhancement(g);
        for (k = 0; k < i.length; k++)
          i[k].element.animate(i[k].animation, b.duration, b.easing, z)
      }
    })
  }
})(jQuery);

