function isVersionSupported(vRange, bVersion) {
    if(typeof vRange != "string") {
        return false;
    }
    
    if(vRange == "") {
        return true;
    }

    var version_compare = function (v1, v2) {

        var i = 0,
            x = 0,
            compare = 0,
            vm = {
                'dev': -6,
                'alpha': -5,
                'a': -5,
                'beta': -4,
                'b': -4,
                'RC': -3,
                'rc': -3,
                '#': -2,
                'p': -1,
                'pl': -1
            },
            prepVersion = function (v) {
                v = String(v).replace(/[_\-+]/g, '.').replace(/([^.\d]+)/g, '.$1.').replace(/\.{2,}/g, '.');
                return (!v.length ? [-8] : v.split('.'));
            },
            numVersion = function (v) {
                return !v ? 0 : (isNaN(v) ? vm[v] || -7 : parseInt(v, 10));
            };
            
        v1 = prepVersion(v1);
        v2 = prepVersion(v2);
        
        x = Math.max(v1.length, v2.length);
        
        for (i = 0; i < x; i++) {
            if (v1[i] == v2[i]) {
                continue;
            }
            
            v1[i] = numVersion(v1[i]);
            v2[i] = numVersion(v2[i]);
            
            if (v1[i] < v2[i]) {
                compare = -1;
                break;
            } else if (v1[i] > v2[i]) {
                compare = 1;
                break;
            }
        }

        return compare;
    };
    
    vRange = vRange.split(",");
    for(var i = 0; i < vRange.length; i++) {
        var versions = vRange[i].split("-", 2);
        
        if(versions[1] == null) {
            versions[1] = versions[0];
        }
        
        if(((versions[0] == "") || (version_compare(versions[0], bVersion) <= 0)) && ((versions[1] == "") || (version_compare(bVersion, versions[1]) <= 0))) {
            return true;
        }
    }
    
    return false;
}

(function($){
    $.only = function (browsers, callback) {
        var list = {};
    
        if(browsers instanceof $) {
            return browsers.only(callback);
        }
        
        if(browsers instanceof Array)
            $.each(browsers, function(index, element) { list[element] = '' });
        else if(browsers instanceof HTMLElement)
            $.each(browsers.attributes, function(index, attr) { if(typeof attr.value == "string") list[attr.name] = attr.value });
        else
            list = browsers;
        
        for(var name in list) {
            callback.call(browsers, ($.browser[name] && isVersionSupported(list[name], $.browser.version)) ? name : false, $.browser.version);
        }
        
        return browsers;
    }
    
    $.fn.only = function(callback) {
        return this.each(function() { $.only(this, callback) });
    }
})(jQuery);
