﻿
(function($) {
    var dropShadowZindex = 1; $.fn.dropShadow = function(options) {
        var opt = $.extend({ left: 4, top: 4, blur: 2, opacity: .5, color: "black", swap: false }, options); var jShadows = $([]); this.not(".dropShadow").each(function() {
            var jthis = $(this); var shadows = []; var blur = (opt.blur <= 0) ? 0 : opt.blur; var opacity = (blur == 0) ? opt.opacity : opt.opacity / (blur * 8); var zOriginal = (opt.swap) ? dropShadowZindex : dropShadowZindex + 1; var zShadow = (opt.swap) ? dropShadowZindex + 1 : dropShadowZindex; var shadowId; if (this.id) { shadowId = this.id + "_dropShadow"; }
            else { shadowId = "ds" + (1 + Math.floor(9999 * Math.random())); }
            $.data(this, "shadowId", shadowId); $.data(this, "shadowOptions", options); jthis.attr("shadowId", shadowId).css("zIndex", zOriginal); if (jthis.css("position") != "absolute") { jthis.css({ position: "relative", zoom: 1 }); }
            bgColor = jthis.css("backgroundColor"); if (bgColor == "rgba(0, 0, 0, 0)") bgColor = "transparent"; if (bgColor != "transparent" || jthis.css("backgroundImage") != "none" || this.nodeName == "SELECT" || this.nodeName == "INPUT" || this.nodeName == "TEXTAREA") { shadows[0] = $("<div></div>").css("background", opt.color); }
            else { shadows[0] = jthis.clone().removeAttr("id").removeAttr("name").removeAttr("shadowId").css("color", opt.color); }
            shadows[0].addClass("dropShadow").css({ height: jthis.outerHeight(), left: blur, opacity: opacity, position: "absolute", top: blur, width: jthis.outerWidth(), zIndex: zShadow }); var layers = (8 * blur) + 1; for (i = 1; i < layers; i++) { shadows[i] = shadows[0].clone(); }
            var i = 1; var j = blur; while (j > 0) { shadows[i].css({ left: j * 2, top: 0 }); shadows[i + 1].css({ left: j * 4, top: j * 2 }); shadows[i + 2].css({ left: j * 2, top: j * 4 }); shadows[i + 3].css({ left: 0, top: j * 2 }); shadows[i + 4].css({ left: j * 3, top: j }); shadows[i + 5].css({ left: j * 3, top: j * 3 }); shadows[i + 6].css({ left: j, top: j * 3 }); shadows[i + 7].css({ left: j, top: j }); i += 8; j--; }
            var divShadow = $("<div></div>").attr("id", shadowId).addClass("dropShadow").css({ left: jthis.position().left + opt.left - blur, marginTop: jthis.css("marginTop"), marginRight: jthis.css("marginRight"), marginBottom: jthis.css("marginBottom"), marginLeft: jthis.css("marginLeft"), position: "absolute", top: jthis.position().top + opt.top - blur, zIndex: zShadow }); for (i = 0; i < layers; i++) { divShadow.append(shadows[i]); }
            jthis.after(divShadow); jShadows = jShadows.add(divShadow); $(window).resize(function() {
                try { divShadow.css({ left: jthis.position().left + opt.left - blur, top: jthis.position().top + opt.top - blur }); }
                catch (e) { } 
            }); dropShadowZindex += 2;
        }); return this.pushStack(jShadows);
    }; $.fn.redrawShadow = function() {
        this.removeShadow(); return this.each(function()
        { var shadowOptions = $.data(this, "shadowOptions"); $(this).dropShadow(shadowOptions); });
    }; $.fn.removeShadow = function() {
        return this.each(function()
        { var shadowId = $(this).shadowId(); $("div#" + shadowId).remove(); });
    }; $.fn.shadowId = function()
    { return $.data(this[0], "shadowId"); }; $(function()
    { var noPrint = "<style type='text/css' media='print'>"; noPrint += ".dropShadow{visibility:hidden;}</style>"; $("head").append(noPrint); });
})(jQuery);
