var currentSheet, doc = window.document, activators = {
   onhover:{on:'onmouseover', off:'onmouseout'},
   onactive:{on:'onmousedown', off:'onmouseup'}
}

function CSS_parse() {
   var sheets = doc.styleSheets, len = sheets.length;
   for (var i=0; i < len; i++) CSS_parseSheet(sheets[i]);
}

function CSS_parseSheet(sheet) {
   if (sheet.imports) {
      try {
         var imports = sheet.imports, len = imports.length;
         for (var i = 0; i < len; i++) CSS_parseSheet(sheet.imports[i]);
      }
      catch (securityException) {}
   }
   try {
      var rules = (currentSheet = sheet).rules, len = rules.length;
      for (var j = 0; j < len; j++) CSS_parseRule(rules[j]);
   }
   catch (securityException) {}
}

function CSS_parseRule(rule) {
   var oldSelector = rule.selectorText, style = rule.style.cssText;
   if (!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i).test(oldSelector) || !style) return;
   var pseudo = oldSelector.replace(/[^:]+:([a-z-]+).*/i, 'on$1');
   var newSelector = oldSelector.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo);
   var className = (/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelector)[1];
   var affected = oldSelector.replace(/:hover.*$/, '');
   var elements = CSS_getElementsBySelector(affected);
   var len = elements.length;
   currentSheet.addRule(newSelector, style);
   for (var i = 0; i < len; i++) new CSS_attachEvent(elements[i], className, activators[pseudo]);
}

function CSS_attachEvent(node, className, events) {
   if (!node.hovers) node.hovers = {};
   if (node.hovers[className]) return;
   node.hovers[className] = true;
   node.attachEvent(events.on,   function() { node.className += ' ' + className; });
   node.attachEvent(events.off, function() { node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),''); });
}

function CSS_getElementsBySelector(rule) {
   var parts, nodes = [doc];
   parts = rule.split(' ');
   var len = parts.length;
   for (var i = 0; i < len; i++) nodes = CSS_getSelectedNodes(parts[i], nodes);
   return nodes;
}

function CSS_getSelectedNodes(selector, elements) {
   var result, node, nodes = [], len = elements.length;
   var className = (/\.([a-z0-9_-]+)/i).exec(selector);
   var identify = (/\#([a-z0-9_-]+)/i).exec(selector);
   var tagName = selector.replace(/(\.|\#|\:)[a-z0-9_-]+/i, '');
   for (var i = 0; i < len; i++) {
      result = tagName ? elements[i].all.tags(tagName):elements[i].all;
      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;
}

if (window.attachEvent) window.attachEvent("onload", CSS_parse);