(function($) {
        
        $.fn.shadowEnable  = function() { return $(this).find("+ .notepad-shadow").show().end();   };
        $.fn.shadowDisable = function() { return $(this).find("+ .notepad-shadow").hide().end();   };
        $.fn.shadowDestroy = function() { return $(this).find("+ .notepad-shadow").remove().end(); };
        
        $.fn.shadow = function(options) {
                options = $.extend({
                        xoffset:	1,
                        yoffset:	1,
                        opacity:	0.07,
                        color:		"#000",
                        xoverdim:	1,
                        yoverdim:	1,
                        monitor:	false
                }, options || {});
                // options.offset -= 1;
                
                return this.each(function() {
                        
                        // Remove an existing shadow if it exists
                        var $element = $(this).shadowDestroy(),
                        
                        // Create a shadow element
                        $shadow = $("<div class='notepad-shadow' style='position: relative;'></div>").insertAfter($element);
                        
                        // Figure the base height and width
                        baseWidth  = ( $element.outerWidth() + options.xoverdim ),
                        baseHeight = ( $element.outerHeight() + options.yoverdim ),
                        
                        // Get the offset
                        position = $element.position(),
                        
                        // Get z-index
                        zIndex = parseInt($element.css("zIndex")) || 0;
                        
                        // Append smooth corners
                        $('<div class="notepad-shadow-color notepad-shadow-layer-1"></div>').css({ 
                        	position: 'absolute',
                        	opacity: options.opacity,  
                        	left: options.xoffset + 1,     
                        	top: options.yoffset + 1,     
                        	width: baseWidth - 2, 
                        	height: baseHeight - 2 
                    	}).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-2"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.04,  
	                        left: options.xoffset, 
	                        top: options.yoffset, 
	                        width: baseWidth ,     
	                        height: baseHeight 
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-3"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.06,  
	                        left: options.xoffset - 1, 
	                        top: options.yoffset, 
	                        width: baseWidth + 2, 
	                        height: baseHeight   
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-4"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.06,  
	                        left: options.xoffset, 
	                        top: options.yoffset - 1, 
	                        width: baseWidth, 
	                        height: baseHeight + 2   
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-5"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.08,  
	                        left: options.xoffset - 2, 
	                        top: options.yoffset, 
	                        width: baseWidth + 4, 
	                        height: baseHeight   
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-6"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.08,  
	                        left: options.xoffset, 
	                        top: options.yoffset - 2, 
	                        width: baseWidth, 
	                        height: baseHeight + 4   
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-7"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.1,         
	                        left: options.xoffset - 3, 
	                        top: options.yoffset - 3, 
	                        width: baseWidth + 6, 
	                        height: baseHeight + 6
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-8"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.12,         
	                        left: options.xoffset - 4, 
	                        top: options.yoffset, 
	                        width: baseWidth + 8, 
	                        height: baseHeight 
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-9"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.12,         
	                        left: options.xoffset, 
	                        top: options.yoffset - 4, 
	                        width: baseWidth, 
	                        height: baseHeight + 8 
                        }).appendTo($shadow);
                        
                        $('<div class="notepad-shadow-color notepad-shadow-layer-10"></div>').css({ 
	                        position: 'absolute', 
	                        opacity: options.opacity - 0.14,         
	                        left: options.xoffset - 5, 
	                        top: options.yoffset - 5, 
	                        width: baseWidth + 10, 
	                        height: baseHeight + 10
                        }).appendTo($shadow);
                        
                        // Add color
                        $("div.notepad-shadow-color", $shadow).css("background-color", options.color);
                        
                        // Set zIndex +1 and make sure position is at least relative
                        // Attention: the zIndex will get one higher!
                        $element
                                .css({
                                        zIndex: zIndex + 1,
                                        position: ($element.css("position") == "static" ? "relative" : "")
                                });
                        
                        // Copy the original z-index and position to the clone
                        // alert(shadow); If you insert this alert, opera will time correctly!!
                        $shadow.css({
                                position:     "absolute",
                                zIndex:       zIndex,
                                top:          position.top+"px",
                                left:         position.left+"px",
                                width:        baseWidth,
                                height:       baseHeight,
                                marginLeft:   $element.css("marginLeft"),
                                marginRight:  $element.css("marginRight"),
                                marginBottom: $element.css("marginBottom"),
                                marginTop:    $element.css("marginTop")
                        });
                        
                        
                        if ( options.monitor ) {
                                function rearrangeShadow() {
                                        var $element = $(this), $shadow = $element.next("div.ui-shadow");
                                        // $shadow.css( $element.position() );
                                        $shadow.css({
                                                top:  parseInt($element.css("top"))  +"px",
                                                left: parseInt($element.css("left")) +"px"
                                        })
                                        $(">*", $shadow).css({ height: this.offsetHeight+"px", width: this.offsetWidth+"px" });
                                }
                        
                                // Attempt to use DOMAttrModified event
                                $element.bind("DOMAttrModified", rearrangeShadow);
                        
                                // Use expressions if they exist (IE)
                                if( $shadow[0].style.setExpression ) {
                                        $shadow[0].style.setExpression("top" , "parseInt(this.previousSibling.currentStyle.top ) + 'px'");
                                        $shadow[0].style.setExpression("left", "parseInt(this.previousSibling.currentStyle.left) + 'px'");
                                }
                        }

                });
        };
        
})(jQuery);
