//
// Add a class of "ds" to any div you want to have a drop shadow
// Written by James Player 2009
//

(function($) {
    $.fn.drop_shadow = function(options) {
        
        var ds_opts = $.extend({}, $.fn.drop_shadow.defaults, options);
        var ds_i = 0;
        
        $(this).each(function() {
        
            var ds_path_to_images = ds_opts.ds_path_to_images;
            var ds_shadow_size = new Array();
            ds_shadow_size["top"] = ds_opts.ds_shadow_size_top;
            ds_shadow_size["right"] = ds_opts.ds_shadow_size_right;
            ds_shadow_size["bottom"] = ds_opts.ds_shadow_size_bottom;
            ds_shadow_size["left"] = ds_opts.ds_shadow_size_left;
            var ds_corner_ds_side_length = ds_opts.corner_size;
            var ds_border_width = new Array();
            var ds_offset = new Array();
            var ds_start_point = new Array();
            
            // Are we dealing with a self closing tag?
            var ds_self_closer = false;
            if(/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i.test(this.tagName)) {
                ds_self_closer = true;
            }
            
            for(var ds_key in ds_shadow_size){
                // Get border widths
                ds_border_width[ds_key] = $(this).css("border-"+ds_key+"-width").replace("px", "");
                if(!ds_isInteger(ds_border_width[ds_key])){
                    ds_border_width[ds_key] = 0;
                }
                
                // Get offset (absolute positions of shadows)
                ds_offset[ds_key] = parseInt(ds_shadow_size[ds_key]) + parseInt(ds_border_width[ds_key]);
                
                // Get start point for side images
                ds_start_point[ds_key] = ds_corner_ds_side_length - ds_offset[ds_key];
                
                ds_offset[ds_key] = parseInt("-" + ds_offset[ds_key]);
            }
            
            // Get side height and width
            var ds_box_width = $(this).outerWidth();
            var ds_box_height = $(this).outerHeight();
            
            var ds_side_length = new Array();
            ds_side_length["width"] = ds_box_width - ds_start_point["right"] - ds_start_point["left"] - ds_border_width["left"] - ds_border_width["right"];
            ds_side_length["height"] = ds_box_height - ds_start_point["top"] - ds_start_point["bottom"] - ds_border_width["top"] - ds_border_width["bottom"];
            
            if(ds_self_closer){
            
                // adjust positions of drop shadow images to cater for ds_margins on the self closing tag
                var ds_margin = new Array;
                ds_margin['top'] = $(this).css("ds_margin-top").replace("px", "");
                ds_margin['right'] = $(this).css("ds_margin-right").replace("px", "");
                ds_margin['bottom'] = $(this).css("ds_margin-bottom").replace("px", "");
                ds_margin['left'] = $(this).css("ds_margin-left").replace("px", "");
                
                ds_offset['top'] = parseInt(ds_offset['top']) + parseInt(ds_margin['top']);
                ds_offset['right'] = parseInt(ds_offset['right']) + parseInt(ds_margin['right']);
                ds_offset['bottom'] = parseInt(ds_offset['bottom']) + parseInt(ds_margin['bottom']);
                ds_offset['left'] = parseInt(ds_offset['left']) + parseInt(ds_margin['left']);
                
                ds_start_point['top'] = parseInt(ds_start_point['top']) + parseInt(ds_margin['top']);
                ds_start_point['right'] = parseInt(ds_start_point['right']) + parseInt(ds_margin['right']);
                ds_start_point['bottom'] = parseInt(ds_start_point['bottom']) + parseInt(ds_margin['bottom']);
                ds_start_point['left'] = parseInt(ds_start_point['left']) + parseInt(ds_margin['left']);
                
                $(this)
                    .wrap("<div style='position: relative; display: inline-block; zoom: 1; *display: inline;'></div>")
                    .siblings("img.shadow")
                    .remove()
                    .end()
                    .after("<img src='" + ds_path_to_images + "/ds-top-left.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; top: "+ds_offset["top"]+"px; left: "+ds_offset["left"]+"px; ds_margin: 0; padding: 0;' />")
                    .after("<img src='" + ds_path_to_images + "/ds-top.png' class='shadow' style='height: "+ds_shadow_size["top"]+"px; width: "+ds_side_length["width"]+"px; position: absolute; top: "+ds_offset["top"]+"px; left: "+ds_start_point["left"]+"px; ds_margin: 0; padding: 0;' />")
                    .after("<img src='" + ds_path_to_images + "/ds-top-right.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; top: "+ds_offset["top"]+"px; right: "+ds_offset["right"]+"px; ds_margin: 0; padding: 0;' />")
                    .after("<img src='" + ds_path_to_images + "/ds-right.png' class='shadow' style='width: "+ds_shadow_size["right"]+"px; height: "+ds_side_length["height"]+"px; position: absolute; top: "+ds_start_point["top"]+"px; right: "+ds_offset["right"]+"px; ds_margin: 0; padding: 0;' />")
                    .after("<img src='" + ds_path_to_images + "/ds-bottom-right.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; bottom: "+ds_offset["bottom"]+"px; right: "+ds_offset["right"]+"px; ds_margin: 0; padding: 0;' />")
                    .after("<img src='" + ds_path_to_images + "/ds-bottom.png' class='shadow' style='height: "+ds_shadow_size["bottom"]+"px; width: "+ds_side_length["width"]+"px; position: absolute; left: "+ds_start_point["left"]+"px; bottom: "+ds_offset["bottom"]+"px; ds_margin: 0; padding: 0;' />")
                    .after("<img src='" + ds_path_to_images + "/ds-bottom-left.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; bottom: "+ds_offset["bottom"]+"px; left: "+ds_offset["left"]+"px; ds_margin: 0; padding: 0;' />")
                    .after("<img src='" + ds_path_to_images + "/ds-left.png' class='shadow' style='width: "+ds_shadow_size["left"]+"px; height: "+ds_side_length["height"]+"px; position: absolute; top: "+ds_start_point["top"]+"px; left: "+ds_offset["left"]+"px; ds_margin: 0; padding: 0;' />");
                    
            } else {
        
                $(this)
                    .css("position", "relative")
                    .children("img.shadow")
                    .remove()
                    .end()
                    .append("<img src='" + ds_path_to_images + "/ds-top-left.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; top: "+ds_offset["top"]+"px; left: "+ds_offset["left"]+"px; ds_margin: 0; padding: 0;' />")
                    .append("<img src='" + ds_path_to_images + "/ds-top.png' class='shadow' style='height: "+ds_shadow_size["top"]+"px; width: "+ds_side_length["width"]+"px; position: absolute; top: "+ds_offset["top"]+"px; left: "+ds_start_point["left"]+"px; ds_margin: 0; padding: 0;' />")
                    .append("<img src='" + ds_path_to_images + "/ds-top-right.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; top: "+ds_offset["top"]+"px; right: "+ds_offset["right"]+"px; ds_margin: 0; padding: 0;' />")
                    .append("<img src='" + ds_path_to_images + "/ds-right.png' class='shadow' style='width: "+ds_shadow_size["right"]+"px; height: "+ds_side_length["height"]+"px; position: absolute; top: "+ds_start_point["top"]+"px; right: "+ds_offset["right"]+"px; ds_margin: 0; padding: 0;' />")
                    .append("<img src='" + ds_path_to_images + "/ds-bottom-right.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; bottom: "+ds_offset["bottom"]+"px; right: "+ds_offset["right"]+"px; ds_margin: 0; padding: 0;' />")
                    .append("<img src='" + ds_path_to_images + "/ds-bottom.png' class='shadow' style='height: "+ds_shadow_size["bottom"]+"px; width: "+ds_side_length["width"]+"px; position: absolute; left: "+ds_start_point["left"]+"px; bottom: "+ds_offset["bottom"]+"px; ds_margin: 0; padding: 0;' />")
                    .append("<img src='" + ds_path_to_images + "/ds-bottom-left.png' class='shadow' style='width: "+ds_corner_ds_side_length+"px; height: "+ds_corner_ds_side_length+"px; position: absolute; bottom: "+ds_offset["bottom"]+"px; left: "+ds_offset["left"]+"px; ds_margin: 0; padding: 0;' />")
                    .append("<img src='" + ds_path_to_images + "/ds-left.png' class='shadow' style='width: "+ds_shadow_size["left"]+"px; height: "+ds_side_length["height"]+"px; position: absolute; top: "+ds_start_point["top"]+"px; left: "+ds_offset["left"]+"px; ds_margin: 0; padding: 0;' />");
                    
            }
            ds_i++;
        });
        
    }
    
    $.fn.drop_shadow.defaults = {
        ds_path_to_images: "/elementi/img",   // String. Path to images folder where your drop shadow images will be kept
        ds_shadow_size_top: 1,         // Integer: Height of the top shadow image
        ds_shadow_size_right: 3,       // Integer: Width of the right shadow image
        ds_shadow_size_bottom: 5,      // Integer: Height of the bottom shadow image
        ds_shadow_size_left: 3,        // Integer: Width of the left shadow image
        corner_size: 7              // Integer: Height or width of the corner squares (since they're squares height and width should be the same!)
    };
    
    function ds_isInteger(s) { // THANKS http://surf11.com/entry/157/javascript-ds_isInteger-function
        return (s.toString().search(/^-?[0-9]+$/) == 0);
    }

    
})(jQuery);
