var csshoverReg=/(^|\s)((([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active))|((a|input|textarea)([#.][^ ]+)?:unknown)/i,
currentSheet,doc=window.document,hoverEvents=[],activators={
onhover:{on:'onmouseover',off:'onmouseout'},
onactive:{on:'onmousedown',off:'onmouseup'},
onunknown:{on:'onfocus',off:'onblur'}}
function parseStylesheets(){
if(!/MSIE (5|6|7)/.test(navigator.userAgent)) return;
window.attachEvent('onunload',unhookHoverEvents)
var sheets=doc.styleSheets,l=sheets.length
for(var i=0;i<l;i++)
parseStylesheet(sheets[i])}
function parseStylesheet(sheet){
if(sheet.imports){
try{
var imports=sheet.imports,l=imports.length
for(var i=0;i<l;i++)parseStylesheet(sheet.imports[i])
}catch(securityException){}}
try{
var rules=(currentSheet=sheet).rules,l=rules.length
for(var j=0;j<l;j++)parseCSSRule(rules[j])
}catch(securityException){}}
function parseCSSRule(rule){
var select=rule.selectorText,style=rule.style.cssText
if(!csshoverReg.test(select)|| !style)return
var pseudo=select.replace(/[^:]+:([a-z-]+).*/i,'on$1')
var newSelect=select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi,'.$2'+pseudo)
var className=(/\.([a-z0-9_-]*on(hover|active|unknown))/i).exec(newSelect)[1]
var affected=select.replace(/:(hover|active|unknown).*$/,'')
var elements=getElementsBySelect(affected)
if(elements.length==0)return
currentSheet.addRule(newSelect,style)
for(var i=0;i<elements.length;i++)
new HoverElement(elements[i],className,activators[pseudo])}
function HoverElement(node,className,events){
if(!node.hovers)node.hovers={}
if(node.hovers[className])return
node.hovers[className]=true
hookHoverEvent(node,events.on,function(){node.className+=' '+className;})
hookHoverEvent(node,events.off,function(){node.className=node.className.replace(new RegExp('\\s+'+className,'g'),'');})}
function hookHoverEvent(node,type,handler){
node.attachEvent(type,handler)
hoverEvents[hoverEvents.length]={
node:node,type:type,handler:handler}}
function unhookHoverEvents(){
for(var e,i=0;i<hoverEvents.length;i++){
e=hoverEvents[i]
e.node.detachEvent(e.type,e.handler)}}
function getElementsBySelect(rule){
var parts,nodes=[doc]
parts=rule.split(' ')
for(var i=0;i<parts.length;i++){
nodes=getSelectedNodes(parts[i],nodes)
}return nodes}
function getSelectedNodes(select,elements){
var result,node,nodes=[]
var identify=(/\#([a-z0-9_-]+)/i).exec(select)
if(identify){
var element=doc.getElementById(identify[1])
return element? [element]:nodes}
var classname=(/\.([a-z0-9_-]+)/i).exec(select)
var tagName=select.replace(/(\.|\#|\:)[a-z0-9_-]+/i,'')
var classReg=classname? new RegExp('\\b'+classname[1]+'\\b'):false
for(var i=0;i<elements.length;i++){
result=tagName? elements[i].all.tags(tagName):elements[i].all
for(var j=0;j<result.length;j++){
node=result[j]
if(classReg&&!classReg.test(node.className))continue
nodes[nodes.length]=node}}
return nodes}
