sniff = function(){
    var d = new Object();
    var n = navigator;
    var dua = n.userAgent;
    var dav = n.appVersion;
    var tv = parseFloat(dav);
    if(dua.indexOf("Opera") >= 0){ d.isOpera = tv; }
    // safari detection derived from:
    // http://developer.apple.com/internet/safari/faq.html#anchor2
    // http://developer.apple.com/internet/safari/uamatrix.html
    var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0);
    if(index){
        // try to grab the explicit Safari version first. If we don't get
        // one, look for 419.3+ as the indication that we're on something
        // "Safari 3-ish". Lastly, default to "Safari 2" handling.
        d.isSafari = parseFloat(dav.split("Version/")[1]) ||
            (parseFloat(dav.substr(index + 7)) > 419.3) ? 3 : 2;
    }
    if(dua.indexOf("AdobeAIR") >= 0){ d.isAIR = 1; }
    if(dav.indexOf("Konqueror") >= 0 || d.isSafari){ d.isKhtml =  tv; }
    if(dua.indexOf("Gecko") >= 0 && !d.isKhtml){ d.isMozilla = d.isMoz = tv; }
    if(d.isMoz){
        d.isFF = parseFloat(dua.split("Firefox/")[1]) || undefined;
    }
    if(document.all && !d.isOpera){
        d.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined;
    }
    var cm = document.compatMode;
    d.isQuirks = cm == "BackCompat" || cm == "QuirksMode" || d.isIE < 6;
    var ie = d.isIE;
    var opera = d.isOpera;
    var maj = Math.floor;
    var ff = d.isFF;
    var classes = {
        dj_ie: ie,
        dj_ie6: maj(ie) == 6,
        dj_ie7: maj(ie) == 7,
        dj_iequirks: ie && d.isQuirks,
        dj_opera: opera,
        dj_opera8: maj(opera) == 8,
        dj_opera9: maj(opera) == 9,
        dj_khtml: d.isKhtml,
        dj_safari: d.isSafari,
        dj_gecko: d.isMozilla,
        dj_ff2: maj(ff) == 2,
        dj_ff3: maj(ff) == 3
    };

    var html = window.document.documentElement;

    // apply browser and browser version class names
    for(var p in classes){
        if(classes[p]){
            if(html.className){
                html.className += " " + p;
            }else{
                html.className = p;
            }
        }
    }
};

window.onload=sniff;
