Ignore:
Timestamp:
Jul 27, 2010 2:18:34 PM (10 years ago)
Author:
serg
Message:

Updated csshover.htc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • quintagroup.dropdownmenu/trunk/quintagroup/dropdownmenu/browser/resources/csshover.htc

    r1182 r2712  
    11<attach event="ondocumentready" handler="parseStylesheets" /> 
    2 <script language="JScript"> 
     2<script> 
    33/** 
    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/ 
    89 * 
    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. 
    1114 * 
    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 *      ------------------------------------------------------------ 
    1425 */ 
    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 
     27var csshoverReg = /(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):(hover|active)/i, 
     28currentSheet, doc = window.document, hoverEvents = [], activators = { 
     29        onhover:{on:'onmouseover', off:'onmouseout'}, 
     30        onactive:{on:'onmousedown', off:'onmouseup'} 
     31} 
    2032 
    2133function 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                } 
    3247 
    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        } 
    4553 
    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; 
    5657 
    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; 
    6064 
    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        } 
    7869 
    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 }; 
     70function 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        } 
    8990 
    9091function 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        } 
    142120</script> 
Note: See TracChangeset for help on using the changeset viewer.