jQuery.fn.pngfix = function(settings) {
    settings = jQuery.extend({
        imgs: true,
        backgrounds: true,
        shim: '/images/clear.gif',
        apply_positioning: true
    }, settings);
    
    return this.each(function(){      
        if (jQuery.browser.msie && parseInt(jQuery.browser.version, 10) < 7 && parseInt(jQuery.browser.version, 10) > 4) {
            jQuery(this).find('*').andSelf().each(function(i,obj) {
                var self = jQuery(obj);                  
                // background pngs
                var bg = '';
                var bg_test = null;  
                try{
                    var bg = self.css("background-image"); 
                    var bg_test = bg.match(/\.png/i);  
                } catch(e) {
                
                }                
                if (settings.backgrounds && bg_test !== null) {                                     
                    var bg = self.css("background-image");
                    var src = bg.substring(5,bg.length-2);                     
                    var mode = (self.css('background-repeat') == 'no-repeat' ? 'crop' : 'scale');                     
                    var styles = {
                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + src + "', sizingMethod='" + mode + "')",
                        'background-image': 'url('+settings.shim+')'
                    };
                    
                    self.css(styles);
                };
                // image elements
                if (settings.imgs && self.is('img[src$=png]')){
                    var styles = {
                        'width': self.width() + 'px',
                        'height': self.height() + 'px',
                        'filter': "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + self.attr('src') + "', sizingMethod='scale')"
                    };
                    self.css(styles).attr('src', settings.shim);
                };
                // apply position to 'active' elements
                if (settings.apply_positioning && self.is('a, input') && (self.css('position') === '' || self.css('position') == 'static')){
                    self.css('position', 'relative');
                };
            });
        };
    });
};
