	var currentSheet;
    var doc = window.document;
    var activators = {onhover: {on: "onmouseover", off: "onmouseout"}};

    function parsehover() {
        for (i = 0; i < document.styleSheets.length; i++) {
            sheet = document.styleSheets[i];
            parseStylesheet(sheet);
        }
    }


    function parseStylesheet(sheet) {
        var l, rules, imports;
        rules = (currentSheet = sheet).rules;
		if (typeof(rules) != "undefined")
		{
			l = rules.length;
			for (var j = 0; j < l; j++) {
				rule = rules[j];
				var select = rule.selectorText;
				var style = rule.style.cssText;
				if (style != "") {
					var pseudo = "onhover";
					var newSelect = select.replace(/(\.([A-Z0-9_-]+):[A-Z]+)|(:[A-Z]+)/gi, ".$2onHover");
					var tmp = /\.([A-Z0-9_-]*onHover)/i.exec(newSelect);
					if (tmp != null) {
						var className = tmp[1];
						var affected = select.replace(/:hover.*$/, "");
						var elements = getElementsBySelect(affected);
						currentSheet.addRule(newSelect, style);
						for (var i = 0; i < elements.length; i++) {
							new HoverElement(elements[i], className, activators[pseudo]);
						}
					}
				}
			}
		}
    }


    function HoverElement(node, className, events) {
        node.hovers = {};
        node.hovers[className] = true;
        var classtmp = node.className;
		node.attachEvent(events.on, function () {node.className = classtmp + " " + className;});
        node.attachEvent(events.off, function () {node.className = node.className.replace(new RegExp("\\s+" + className, "g"), "");});
    }


    function getElementsBySelect(rule) {
        nodes = [doc];
        nodes = getSelectedNodes(rule, nodes);
        return nodes;
    }


    function getSelectedNodes(select, elements) {
        var result, node, nodes = [];
        var classname = /\.([A-Z0-9_-]+)/i.exec(select);
        var identify = /\#([A-Z0-9_-]+)/i.exec(select);
        var tagName = "INPUT";
        result = elements[0].getElementsByTagName(tagName);
        for (var j = 0; j < result.length; j++) {
            node = result[j];
			if (identify && node.id != identify[1] ||
                classname &&
                !(new RegExp("\\b" + classname[1] + "\\b")).exec(node.className)) {
                continue;
            }
            nodes[nodes.length] = node;
        }
        return nodes;
    }
