Changeset 2712 in products
- Timestamp:
- Jul 27, 2010 2:18:34 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
quintagroup.dropdownmenu/trunk/quintagroup/dropdownmenu/browser/resources/csshover.htc
r1182 r2712 1 1 <attach event="ondocumentready" handler="parseStylesheets" /> 2 <script language="JScript">2 <script> 3 3 /** 4 * HOVER - V1.11.040203 - whatever:hover in IE 5 * --------------------------------------------- 6 * Peterned - http://www.xs4all.nl/~peterned/ 7 * (c) 2004 - Peter Nederlof 4 * Whatever:hover - V1.42.060206 - hover & active 5 * ------------------------------------------------------------ 6 * (c) 2005 - Peter Nederlof 7 * Peterned - http://www.xs4all.nl/~peterned/ 8 * License - http://creativecommons.org/licenses/LGPL/2.1/ 8 9 * 9 * Credits - Arnoud Berendsen 10 * for finding some really -sick- bugs 10 * Whatever:hover is free software; you can redistribute it and/or 11 * modify it under the terms of the GNU Lesser General Public 12 * License as published by the Free Software Foundation; either 13 * version 2.1 of the License, or (at your option) any later version. 11 14 * 12 * howto: body { behavior:url("csshover.htc"); } 13 * --------------------------------------------- 15 * Whatever:hover is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * Lesser General Public License for more details. 19 * 20 * Credits and thanks to: 21 * Arnoud Berendsen, Martin Reurings, Robert Hanson 22 * 23 * howto: body { behavior:url("csshover.htc"); } 24 * ------------------------------------------------------------ 14 25 */ 15 var currentSheet, doc = window.document; 16 var csshover_nodes = getElementsByClassName("csshover", doc); 17 var csshover_rules = [], hoverStyleSheets = "", addRules = true; 18 var IE5 = (doc.getElementsByTagName('*').length == 0) ? true : false, configlet = doc.getElementById('csshovering'); 19 var DEBUG = false, styles = "", parseCSSRulecounter = 0, timer, timerTable = "", d=true; 26 27 var csshoverReg = /(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i, 28 currentSheet, doc = window.document, hoverEvents = [], activators = { 29 onhover:{on:'onmouseover', off:'onmouseout'}, 30 onactive:{on:'onmousedown', off:'onmouseup'} 31 } 20 32 21 33 function parseStylesheets() { 22 var sheets = doc.styleSheets, l = sheets.length; 23 for(var i=0; i<l; i++){ 24 parseStylesheet(sheets[i]); 25 }; 26 if (configlet) {configlet.innerText = hoverStyleSheets;}; 27 if(DEBUG) { 28 alert(styles); 29 alert(timerTable); 30 }; 31 }; 34 if(!/MSIE (5|6)/.test(navigator.userAgent)) return; 35 window.attachEvent('onunload', unhookHoverEvents); 36 var sheets = doc.styleSheets, l = sheets.length; 37 for(var i=0; i<l; i++) 38 parseStylesheet(sheets[i]); 39 } 40 function parseStylesheet(sheet) { 41 if(sheet.imports) { 42 try { 43 var imports = sheet.imports, l = imports.length; 44 for(var i=0; i<l; i++) parseStylesheet(sheet.imports[i]); 45 } catch(securityException){} 46 } 32 47 33 function parseStylesheet(sheet) { 34 if(DEBUG) window.status += '|'; 35 // if(sheet.href && sheet.href.indexOf('/ploneCustom.css') == -1) return; 36 var l, rules, imports; 37 if(sheet.imports) { 38 imports = sheet.imports, l = imports.length; 39 for(var i=0; i<l; i++) 40 parseStylesheet(sheet.imports[i]); 41 }; 42 rules = (currentSheet = sheet).rules, l = rules.length; 43 for(var j=0; j<l; j++){parseCSSRule(rules[j]);}; 44 }; 48 try { 49 var rules = (currentSheet = sheet).rules, l = rules.length; 50 for(var j=0; j<l; j++) parseCSSRule(rules[j]); 51 } catch(securityException){} 52 } 45 53 46 function parseCSSRule(rule) { 47 if(DEBUG) { 48 if((parseCSSRulecounter++)%15 == 0) window.status += '.'; 49 startTimer(); 50 }; 51 var select = rule.selectorText, style = rule.style.cssText; 52 if (addRules && (/\.cssHoverCSSExists/i).test(select)) {addRules = false;}; 53 if(!(/\.csshover/i).test(select)) return; 54 if(style.replace(/ /, "") == "") return; 55 if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return; 54 function parseCSSRule(rule) { 55 var select = rule.selectorText, style = rule.style.cssText; 56 if(!csshoverReg.test(select) || !style) return; 56 57 57 var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover'); 58 if (addRules) {currentSheet.addRule(newSelect, style);}; 59 if (configlet) {hoverStyleSheets += newSelect + ' \{\n ' + style.replace('; ', '\;\n ') + ';\n\}\n';}; 58 var pseudo = select.replace(/[^:]+:([a-z-]+).*/i, 'on$1'); 59 var newSelect = select.replace(/(\.([a-z0-9_-]+):[a-z]+)|(:[a-z]+)/gi, '.$2' + pseudo); 60 var className = (/\.([a-z0-9_-]*on(hover|active))/i).exec(newSelect)[1]; 61 var affected = select.replace(/:(hover|active).*$/, ''); 62 var elements = getElementsBySelect(affected); 63 if(elements.length == 0) return; 60 64 61 var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select); 62 var className = (hasClass? hasClass[2]:'') + 'onHover'; 63 var affected = select.replace(/:hover.*$/g, ''); 64 affected = affected.replace(/^.*([ ]|^)(([^ ]*)\.csshover)/i, '$2'); 65 if (DEBUG) {timerTable += stopTimer() + '\n';}; 66 if(!csshover_rules[className + ',' + affected]) { 67 if (DEBUG) {startTimer();}; 68 var elements = getElementsBySelect(affected); 69 if(DEBUG) { 70 window.status += " "+elements.length; 71 styles += "" + elements.length + ": " + affected + '\n'; 72 }; 73 for(var i=0; i<elements.length; i++) 74 new HoverElement(elements[i], className); 75 csshover_rules[className + ',' + affected] = true; 76 }; 77 }; 65 currentSheet.addRule(newSelect, style); 66 for(var i=0; i<elements.length; i++) 67 new HoverElement(elements[i], className, activators[pseudo]); 68 } 78 69 79 function HoverElement(node, className) { 80 if(!node.hovers) node.hovers = {}; 81 if(node.hovers[className]) return; 82 node.hovers[className] = true; 83 node.attachEvent('onmouseover', 84 function() { node.className += ' ' + className; }); 85 node.attachEvent('onmouseout', 86 function() { node.className = 87 node.className.replace((new RegExp('\\s+'+className)),''); }); 88 }; 70 function HoverElement(node, className, events) { 71 if(!node.hovers) node.hovers = {}; 72 if(node.hovers[className]) return; 73 node.hovers[className] = true; 74 hookHoverEvent(node, events.on, function() { node.className += ' ' + className; }); 75 hookHoverEvent(node, events.off, function() { node.className = node.className.replace(new RegExp('\\s+'+className, 'g'),''); }); 76 } 77 function hookHoverEvent(node, type, handler) { 78 node.attachEvent(type, handler); 79 hoverEvents[hoverEvents.length] = { 80 node:node, type:type, handler:handler 81 }; 82 } 83 84 function unhookHoverEvents() { 85 for(var e,i=0; i<hoverEvents.length; i++) { 86 e = hoverEvents[i]; 87 e.node.detachEvent(e.type, e.handler); 88 } 89 } 89 90 90 91 function getElementsBySelect(rule) { 91 var parts, nodes = csshover_nodes; 92 parts = rule.split(' '); 93 for(var i=0; i<parts.length; i++) { 94 nodes = getSelectedNodes(parts[i], nodes, i==0); 95 }; 96 return nodes; 97 }; 98 99 function getSelectedNodes(select, elements, includeRoot) { 100 var element, result, node, nodes = []; 101 var classname = (/\.([a-z0-9_-]+)/i).exec(select); 102 if(classname) {classname_re = new RegExp('\\b' + classname[1] + '\\b');}; 103 var identify = (/\#([a-z0-9_-]+)/i).exec(select); 104 var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*', 105 ell = elements.length; 106 for(var i=0; i<ell; i++) { 107 element = elements[i] 108 if(includeRoot) 109 if((tagName == '*') || (element.nodeName == tagName)) result = [element] 110 else result = [] 111 else 112 if (tagName == '*' && IE5) result = elements[i].all 113 else result = elements[i].getElementsByTagName(tagName) 114 rel = result.length; 115 for(var j=0; j<rel; j++) { 116 node = result[j]; 117 if((identify && node.id != identify[1]) || (classname && !(classname_re.exec(node.className))) || arrayHasElement(nodes, node)) continue; 118 nodes[nodes.length] = node; 119 }; 120 }; 121 return nodes; 122 }; 123 124 function arrayHasElement(a, el) { 125 var l = a.length; 126 for(var i=0; i<l; i++) if(a[i] == el) return true; 127 return false; 128 }; 129 130 function getElementsByClassName(className, parentElement) { 131 var result = new Array(), 132 list = (parentElement || doc.body).getElementsByTagName('*'); 133 if(list.length == 0) list = (parentElement || doc.body).all; 134 var class_re = new RegExp('(^|\\s)' + className + '(\\s|$)'); 135 for(var i = 0; i < list.length; i++) if(list[i].className.match(class_re)) result[result.length] = list[i]; 136 return result; 137 }; 138 139 function startTimer() {timer = new Date().getTime();}; 140 function stopTimer(message) {return (new Date().getTime()) - timer;}; 141 92 var parts, nodes = [doc]; 93 parts = rule.split(' '); 94 for(var i=0; i<parts.length; i++) { 95 nodes = getSelectedNodes(parts[i], nodes); 96 } return nodes; 97 } 98 function getSelectedNodes(select, elements) { 99 var result, node, nodes = []; 100 var identify = (/\#([a-z0-9_-]+)/i).exec(select); 101 if(identify) { 102 var element = doc.getElementById(identify[1]); 103 return element? [element]:nodes; 104 } 105 106 var classname = (/\.([a-z0-9_-]+)/i).exec(select); 107 var tagName = select.replace(/(\.|\#|\:)[a-z0-9_-]+/i, ''); 108 var classReg = classname? new RegExp('\\b' + classname[1] + '\\b'):false; 109 for(var i=0; i<elements.length; i++) { 110 result = tagName? elements[i].all.tags(tagName):elements[i].all; 111 for(var j=0; j<result.length; j++) { 112 node = result[j]; 113 if(classReg && !classReg.test(node.className)) continue; 114 nodes[nodes.length] = node; 115 } 116 } 117 118 return nodes; 119 } 142 120 </script>
Note: See TracChangeset
for help on using the changeset viewer.