classified = (function () {
    var browser = navigator.appName;
    var version = navigator.appVersion;
    var ua = navigator.userAgent;
    var html = document.getElementsByTagName("html")[0];
    var theClass = "";

    html.setAttribute("class", "");

    if ((/Windows/i).test(ua)) {
        theClass += " windows";
		
		var wpParsedName = (/Windows Phone OS ([0-9]{1,}[\.0-9]{0,})/).exec(ua);
		
		if (wpParsedName) {
            var wpVersion = parseFloat(wpParsedName[1]);

            if (wpVersion == 7.0) {
                theClass += " wp wp7";
            }
			else if (wpVersion >= 7.1) {
				theClass += " wp gt-wp7";
            }
            if ((/IEMobile/i).test(ua)) {
                theClass += " ie-mobile";
            }
        }
    } else if ((/Macintosh/i).test(ua)) {
        theClass += " mac";
    } else if ((/Linux/i).test(ua)) {
        theClass += " linux";
    }

    if (/MSIE/.test(ua)) {
        var parsedName = (/MSIE ([0-9]{1,}[\.0-9]{0,})/).exec(version);
        var ieVersion = parseFloat(parsedName[1]);
        
		theClass += " js ie";

        

        switch (ieVersion) {
            case 9:
                theClass += " ie9 lt-ie10";
                break;
            case 8:
                theClass += " ie8 lt-ie9 lt-ie10";
                break;
            case 7:
                theClass += " ie7 lt-ie8 lt-ie9 lt-ie10";
                break;
            case 6:
                theClass += " ie6 lt-ie7 lt-ie8 lt-ie9 lt-ie10";
                break;
            case 5.5:
                theClass += " ie5_5 lt-ie6 lt-ie7 lt-ie8 lt-ie9 lt-ie10";
                break;
            case 5:
                theClass += " ie5 lt-ie5_5 lt-ie6 lt-ie7 lt-ie8 lt-ie9 lt-ie10";
                break;
            default:
                theClass += " lt-ie5 lt-ie5_5 lt-ie6 lt-ie7 lt-ie8 lt-ie9 lt-ie10";
                break;
        }
    } else if ((/Firefox/i).test(ua)) {
        theClass += " js ff";
        var ffVersion = parseInt((/[0-9]+/).exec((/Firefox\/[0-9]+\./i).exec(ua)));
        switch (ffVersion) {
            case 3:
                theClass += " ff3 lt-ff4 lt-ff5";
                break;
            case 4:
                theClass += " ff4 lt-ff5";
                break;
            case 2:
                theClass += " ff2 lt-ff3 lt-ff4 lt-ff5";
                break;
            case 1:
                theClass += " ff1 lt-ff2 lt-ff3 lt-ff4 lt-ff5";
                break;
            default:
                break;
        }
    } else if ((/AppleWebKit/i).test(ua)) {
        if ((/Mobile/i).test(ua)) {
            if ((/iPhone/i).test(ua)) {
                if ((/iPod/i).test(ua)) {
                    theClass += " ios ipod";
                } else {
                    theClass += " ios iphone";
                }
            } else if ((/Android/i).test(ua)) {
                theClass += " android";
            } else if ((/iPad/i).test(ua)) {
                theClass += " ios ipad";
            }
        } else if ((/Android/i).test(ua)) {
            theClass += " android-tablet";
        }

        if ((/Chrome/i).test(ua)) {
            theClass += " js webkit chrome";
        } else if ((/Safari/i).test(ua)) {
            theClass += " js webkit safari";
        }
    } else if ((/Opera/i).test(ua)) {
        theClass += " js opera";
    }

    html.className += theClass;

    var obj = {};

    obj.is = function (classes) {
        var arr = classes.split(" ");

        for (var i = 0; i < arr.length; i++) {
            var creg = new RegExp(arr[i], "i");
            if (!creg.test(theClass)) {
                return false;
            }
        }
        return true;
    }

    obj.has = function (classes) {
        var arr = classes.split(" ");

        for (var i = 0; i < arr.length; i++) {
            var creg = new RegExp(arr[i], "i");
            if (creg.test(theClass)) {
                return true;
            }
        }
        return false;
    }

    return obj;
} ());
