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); 

