Changeset 96

Show
Ignore:
Timestamp:
12/21/05 12:25:05
Author:
piv
Message:

corrected and optimized csshover.htc script

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • qPloneDropDownMenu/trunk/HISTORY.txt

    r95 r96  
     10.1.7 
     2 
     3  * corrected and optimized csshover.htc script 
     4    
    150.1.6 
    26 
  • qPloneDropDownMenu/trunk/TODO.txt

    r95 r96  
     1 
     2 * next optimization of csshover.htc script 
  • qPloneDropDownMenu/trunk/skins/qPloneDropDownMenu/csshover.htc.dtml

    r95 r96  
    33<script language="JScript"> 
    44/** 
    5  *     HOVER - V1.11.040203 - whatever:hover in IE 
    6  *     --------------------------------------------- 
    7  *     Peterned - http://www.xs4all.nl/~peterned/ 
    8  *     (c) 2004 - Peter Nederlof 
     5 *    HOVER - V1.11.040203 - whatever:hover in IE 
     6 *    --------------------------------------------- 
     7 *    Peterned - http://www.xs4all.nl/~peterned/ 
     8 *    (c) 2004 - Peter Nederlof 
    99 * 
    10  *     Credits  - Arnoud Berendsen  
    11  *             for finding some really -sick- bugs 
     10 *    Credits  - Arnoud Berendsen  
     11 *        for finding some really -sick- bugs 
    1212 * 
    13  *     howto: body { behavior:url("csshover.htc"); } 
    14  *     --------------------------------------------- 
     13 *    howto: body { behavior:url("csshover.htc"); } 
     14 *    --------------------------------------------- 
    1515 */ 
    1616 
    1717var currentSheet, doc = window.document; 
    18 //      keeps the dropdown menu IDs 
    19 var ddMenuIDs = new Array(); 
     18var csshover_nodes = getElementsByClassName("csshover", doc); 
    2019 
    21 function findDdMenus() { 
    22         var aTmp = getElementsByClassName("csshover", element.document, "div", function(oM) { 
    23                 ddMenuAdd(oM.id); 
    24         } ); 
     20function parseStylesheets() { 
     21    var sheets = doc.styleSheets, l = sheets.length; 
     22    for(var i=0; i<l; i++) 
     23        parseStylesheet(sheets[i]); 
     24
     25 
     26function parseStylesheet(sheet) { 
     27//    if(sheet.href && sheet.href.indexOf('/ploneCustom.css') == -1) return; 
     28    var l, rules, imports; 
     29    if(sheet.imports) { 
     30        imports = sheet.imports, l = imports.length; 
     31        for(var i=0; i<l; i++) 
     32            parseStylesheet(sheet.imports[i]); 
     33    } 
     34    rules = (currentSheet = sheet).rules, l = rules.length; 
     35    for(var j=0; j<l; j++){ parseCSSRule(rules[j]);}; 
     36
     37 
     38function parseCSSRule(rule) { 
     39    var select = rule.selectorText, style = rule.style.cssText; 
     40    if(style.replace(/ /, "") == "") return; 
     41    if(!(/\.csshover/i).test(select)) return; 
     42    if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return; 
     43 
     44    var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover'); 
     45    currentSheet.addRule(newSelect, style); 
     46 
     47    var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select); 
     48    var className = (hasClass? hasClass[2]:'') + 'onHover'; 
     49    var affected = select.replace(/:hover.*$/g, ''); 
     50    affected = affected.replace(/^.*([ ]|^)(([^ ]*)\.csshover)/i, '$2'); 
     51 
     52    // if class-affected pair processed return; 
     53 
     54    var elements = getElementsBySelect(affected); 
     55    for(var i=0; i<elements.length; i++) 
     56        HoverElement(elements[i], className); 
     57    //add class-affected pair to processed; 
     58
     59 
     60function HoverElement(node, className) { 
     61    if(!node.hovers) node.hovers = {}; 
     62    if(node.hovers[className]) return; 
     63    node.hovers[className] = true; 
     64    node.attachEvent('onmouseover', 
     65        function() { node.className += ' ' + className; }); 
     66    node.attachEvent('onmouseout', 
     67        function() { node.className = 
     68            node.className.replace((new RegExp('\\s+'+className)),''); }); 
     69
     70 
     71function getElementsBySelect(rule) { 
     72    var parts, nodes = csshover_nodes; 
     73    parts = rule.split(' '); 
     74    for(var i=0; i<parts.length; i++) { 
     75        nodes = getSelectedNodes(parts[i], nodes); 
     76    } 
     77    return nodes; 
     78
     79 
     80function arrayHasElement(a, el){ 
     81    var l = a.length; 
     82    for(var i=0; i<l; i++) if(a[i] == el) return true; 
     83    return false; 
     84
     85 
     86function getSelectedNodes(select, elements) { 
     87    var result, node, nodes = []; 
     88    var classname = (/\.([a-z0-9_-]+)/i).exec(select); 
     89    if(classname) classname_re = new RegExp('\\b' + classname[1] + '\\b'); 
     90    var identify = (/\#([a-z0-9_-]+)/i).exec(select); 
     91    var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*', 
     92        ell = elements.length; 
     93    for(var i=0; i<ell; i++) { 
     94        result = elements[i].getElementsByTagName(tagName); 
     95        rel = result.length; 
     96        for(var j=0; j<rel; j++) { 
     97            node = result[j]; 
     98            if((identify && node.id != identify[1]) || (classname && !(classname_re.exec(node.className))) || arrayHasElement(nodes, node)) continue; 
     99            nodes[nodes.length] = node; 
     100        } 
     101        if(classname && (classname_re.exec(elements[i].className)) && !arrayHasElement(nodes, elements[i])) { 
     102            nodes[nodes.length] = elements[i]; 
     103        } 
     104    } 
     105    return nodes; 
     106
     107 
     108function getElementsByClassName(className, parentElement) { 
     109    var result = new Array(), 
     110        list = (parentElement || doc.body).getElementsByTagName('*'); 
     111    for(var i = 0; i < list.length; i++) { 
     112        if(list[i].className.match(new RegExp('(^|\\s)' + className + '(\\s|$)'))) { 
     113            result[result.length] = list[i]; 
     114        } 
     115    } 
     116    return result 
    25117}; 
    26118 
    27 function ddMenuAdd(ddMenuID) { 
    28         if ( typeof(ddMenuID) == "undefined") return; 
    29         ddMenuIDs[ddMenuIDs.length] = ddMenuID.replace(/List/, ""); 
    30 }; 
    31  
    32 function parseStylesheets() { 
    33         findDdMenus(); 
    34         var sheets = doc.styleSheets, l = sheets.length; 
    35         for(var i=0; i<l; i++)  
    36                 parseStylesheet(sheets[i]); 
    37 } 
    38         function parseStylesheet(sheet) { 
    39                 var l, rules, imports; 
    40                 if(sheet.imports) { 
    41                         imports = sheet.imports, l = imports.length; 
    42                         for(var i=0; i<l; i++)  
    43                                 parseStylesheet(sheet.imports[i]); 
    44                 } 
    45  
    46                 rules = (currentSheet = sheet).rules, l = rules.length; 
    47                 for(var j=0; j<l; j++) parseCSSRule(rules[j]); 
    48         } 
    49  
    50         function parseCSSRule(rule) { 
    51                 var select = rule.selectorText, style = rule.style.cssText; 
    52  
    53                 if ( style.replace(/ /, "") == "" ) return; 
    54  
    55                 var ddMenuID, Found = 0; 
    56                 for (var t=0; t<ddMenuIDs.length; t++) { 
    57                         if (select.indexOf(ddMenuIDs[t]) != -1) { 
    58                         Found = 1; 
    59                         ddMenuID = ddMenuIDs[t]; 
    60                         break; 
    61                         } 
    62                 } 
    63                 if (!Found) return; 
    64  
    65                 if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return; 
    66                  
    67                 var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover'); 
    68                 var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select); 
    69                 var className = (hasClass? hasClass[2]:'') + 'onHover'; 
    70  
    71                 var affected = select.replace(/:hover.*$/g, '');            
    72                 eval('affected = affected.replace(/#' + ddMenuID + '([ ]+)/i, "")');                
    73  
    74                 var elements = getElementsBySelect(affected, ddMenuID); 
    75                  
    76                 currentSheet.addRule(newSelect, style); 
    77                 for(var i=0; i<elements.length; i++) 
    78                         new HoverElement(elements[i], className); 
    79         } 
    80  
    81 function HoverElement(node, className) { 
    82         if(!node.hovers) node.hovers = {}; 
    83         if(node.hovers[className]) return; 
    84         node.hovers[className] = true; 
    85         node.attachEvent('onmouseover', 
    86                 function() { node.className += ' ' + className; }); 
    87         node.attachEvent('onmouseout', 
    88                 function() { node.className =  
    89                         node.className.replace((new RegExp('\\s+'+className)),''); }); 
    90 } 
    91  
    92 function getElementsBySelect(rule, ddMenuID) { 
    93         var parts, nodes = [doc.getElementById(ddMenuID)]; 
    94         parts = rule.split(' '); 
    95         for(var i=0; i<parts.length; i++) { 
    96                 nodes = getSelectedNodes(parts[i], nodes); 
    97         }       return nodes; 
    98 } 
    99         function getSelectedNodes(select, elements) { 
    100                 var result, node, nodes = []; 
    101                 var classname = (/\.([a-z0-9_-]+)/i).exec(select); 
    102                 var identify = (/\#([a-z0-9_-]+)/i).exec(select); 
    103                 var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*'; 
    104                 for(var i=0; i<elements.length; i++) { 
    105                         result = elements[i].getElementsByTagName(tagName); 
    106                         for(var j=0; j<result.length; j++) { 
    107                                 node = result[j]; 
    108                                 if((identify && node.id != identify[1]) || (classname && !(new RegExp('\\b' + 
    109                                         classname[1] + '\\b').exec(node.className)))) continue; 
    110                                 nodes[nodes.length] = node; 
    111                         } 
    112                 }       return nodes; 
    113         } 
    114  
    115 function getElementsByClassName(clsName, parentEle, tagName, fn) { 
    116         var found = new Array(); 
    117         var re = new RegExp('\\b'+clsName+'\\b', 'i'); 
    118         var list = parentEle.getElementsByTagName(tagName); 
    119         for (var i = 0; i < list.length; ++i) { 
    120                 if (list[i].className.search(re) != -1) { 
    121                         found[found.length] = list[i]; 
    122                         if (fn) fn(list[i]); 
    123                 } 
    124         } 
    125         return found; 
    126 } 
    127  
    128119</script> 
  • qPloneDropDownMenu/trunk/skins/qPloneDropDownMenu/drop_down.css.dtml

    r95 r96  
    77 
    88 
    9 /*             ------  Basic style     ------          */ 
     9/*             ------  Basic style  ------             */ 
    1010#portal-globalnav ul { 
    11        margin: 0; 
    12        padding: 0; 
    13        border: 0; 
    14        list-style-type: none; 
     11        margin: 0; 
     12        padding: 0; 
     13        border: 0; 
     14        list-style-type: none; 
    1515} 
    1616 
    1717#portal-globalnav li { 
    18        margin: 0;   
    19        padding: 0; 
    20        border: 0;  
    21        display: inline; 
    22        float: left; 
    23        z-index: 10000; 
    24        position: relative; 
     18        margin: 0;   
     19        padding: 0; 
     20        border: 0;  
     21        display: inline; 
     22        float: left; 
     23        z-index: 10000; 
     24        position: relative; 
    2525} 
    2626 
    2727#portal-globalnav a { 
    28        float: left;/* \*/float: none;/*  */ 
    29        display: block; 
     28        float: left;/* \*/float: none;/*  */ 
     29        display: block; 
    3030} 
    3131 
    3232#portal-globalnav li ul { 
    33        visibility: hidden; 
    34        position: absolute; 
    35        width: 20em; 
     33        visibility: hidden; 
     34        position: absolute; 
     35        width: 20em; 
    3636} 
    3737 
     
    4848 
    4949html>body #portal-globalnav li ul li { 
    50        float: none; 
    51        position: relative; 
     50        float: none; 
     51        position: relative; 
    5252} 
    5353 
    54 #portal-globalnav li ul li:hover { 
    55        position: relative; 
     54#portal-globalnav .csshover li ul li:hover { 
     55        position: relative; 
    5656} 
    5757 
     
    5959/* fix the position */ 
    6060#portal-globalnav li ul li ul { 
    61        top: 0; 
    62        left: 100%; 
     61        top: 0; 
     62        left: 100%; 
    6363} 
    6464 
     
    6666 
    6767/* simulate child selector for IE */ 
    68 div#portal-globalnav li:hover ul, #portal-globalnav li:hover li:hover ul, #portal-globalnav li:hover li:hover li:hover ul, #portal-globalnav li:hover li:hover li:hover li:hover ul { 
    69        visibility: visible; 
     68div#portal-globalnav .csshover li:hover ul, #portal-globalnav .csshover li:hover li:hover ul, #portal-globalnav .csshover li:hover li:hover li:hover ul, #portal-globalnav .csshover li:hover li:hover li:hover li:hover ul { 
     69        visibility: visible; 
    7070} 
    71 #portal-globalnav li:hover li ul, #portal-globalnav li:hover li:hover li ul, #portal-globalnav li:hover li:hover li:hover li ul, #portal-globalnav li:hover li:hover li:hover li:hover li ul {  
    72        visibility: hidden; 
     71#portal-globalnav .csshover li:hover li ul, #portal-globalnav .csshover li:hover li:hover li ul, #portal-globalnav .csshover li:hover li:hover li:hover li ul, #portal-globalnav .csshover li:hover li:hover li:hover li:hover li ul {  
     72        visibility: hidden; 
    7373} 
    7474 
    7575/* do the normal show, with increased specificity */ 
    76 #portal-globalnav ul#portal-globalnavList li:hover > ul { 
    77        visibility: visible; 
     76#portal-globalnav ul#portal-globalnavList .csshover li:hover > ul { 
     77       visibility: visible; 
    7878} 
    7979 
    8080/*     ------   Make-up --------            */ 
    81  
    82 /*.outer { 
    83        padding-bottom: 4px; 
    84        padding-top: 1em; 
    85 }*/ 
    8681 
    8782#portal-globalnav li.invisibleHeightKeeper { 
     
    9489}*/ 
    9590 
    96 #portal-globalnav ul li:hover a { 
     91#portal-globalnav .csshover ul li:hover a { 
    9792        background-color: &dtml-globalBackgroundColor;; 
    9893} 
    9994 
    100 #portal-globalnav ul li:hover ul a { 
    101        background-color: &dtml-backgroundColor; 
     95#portal-globalnav .csshover ul li:hover ul a { 
     96        background-color: &dtml-backgroundColor; 
    10297} 
    10398 
    10499 
    105 #portal-globalnav ul li ul li a:hover, 
    106 #portal-globalnav ul li ul li:hover a { 
    107        color: &dtml-globalFontColor;; 
    108        background-color: &dtml-globalBackgroundColor;; 
     100#portal-globalnav .csshover ul li ul li a:hover, 
     101#portal-globalnav .csshover ul li ul li:hover a { 
     102        color: &dtml-globalFontColor;; 
     103        background-color: &dtml-globalBackgroundColor;; 
    109104} 
    110105 
    111106 
    112 #portal-globalnav ul li:hover ul li a:hover, 
    113 #portal-globalnav ul li:hover ul li.selected a, 
    114 #portal-globalnav ul li:hover ul li:hover a { 
     107#portal-globalnav .csshover ul li:hover ul li a:hover, 
     108#portal-globalnav .csshover ul li:hover ul li.selected a, 
     109#portal-globalnav .csshover ul li:hover ul li:hover a { 
    115110        background-color: &dtml-globalBackgroundColor;; 
    116111} 
     
    123118#portal-globalnav ul li ul { 
    124119        border: &dtml-borderWidth; &dtml-borderStyle; &dtml-globalBorderColor;; 
    125        padding-bottom: 1px; 
    126        overflow: hidden; 
     120        padding-bottom: 1px; 
     121        overflow: hidden; 
    127122        background-color: &dtml-globalBackgroundColor;; 
    128123} 
    129124 
    130 #portal-globalnav ul li:hover ul li:hover ul  a { 
     125#portal-globalnav .csshover ul li:hover ul li:hover ul  a { 
    131126        background-color: &dtml-backgroundColor;; 
    132        color: &dtml-globalFontColor;; 
     127        color: &dtml-globalFontColor;; 
    133128} 
    134  
    135  
    136 /* latest changes */ 
    137129 
    138130 
     
    140132 
    141133 
     134/* latest changes */ 
    142135 
    143136#portal-globalnav ul { 
     
    151144        margin:0; 
    152145        line-height:normal; 
    153 }  
     146} 
    154147 
    155148#portal-globalnav ul li.selected a, 
    156 #portal-globalnav ul li a:hover { 
     149#portal-globalnav .csshover ul li a:hover { 
    157150 
    158151        color:&dtml-globalFontColor;; 
     
    160153 
    161154 
    162 #portal-globalnav ul li:hover a { 
     155#portal-globalnav .csshover ul li:hover a { 
    163156        background-color:&dtml-globalBackgroundColor;; 
    164157} 
    165158 
    166159 
    167 #portal-globalnav ul li:hover ul { 
     160#portal-globalnav .csshover ul li:hover ul { 
    168161        margin:0; 
    169         border: &dtml-borderWidth; &dtml-borderStyle; &dtml-globalBorderColor;;; 
     162        border: &dtml-borderWidth; &dtml-borderStyle; &dtml-globalBorderColor;; 
    170163        background-color: &dtml-backgroundColor;; 
    171164        overflow:visible; 
    172165} 
    173166 
    174 #portal-globalnav ul li:hover ul li { 
     167#portal-globalnav .csshover ul li:hover ul li { 
    175168        background-color: &dtml-backgroundColor; !important; 
    176169        padding:0; 
     
    178171} 
    179172 
    180 #portal-globalnav ul li:hover ul li a { 
     173#portal-globalnav .csshover ul li:hover ul li a { 
    181174        color: &dtml-globalFontColor !important; 
    182175        background-color: &dtml-backgroundColor; !important; 
     
    186179} 
    187180 
    188 #portal-globalnav ul li ul li a:hover { 
     181#portal-globalnav .csshover ul li ul li a:hover { 
    189182        background-color: &dtml-globalBackgroundColor; !important; 
    190183        background-image:none; 
  • qPloneDropDownMenu/trunk/skins/qPloneDropDownMenu/global_sections.pt

    r95 r96  
    99        tal:omit-tag=""> 
    1010      <h5 class="hiddenStructure" i18n:translate="heading_sections">Sections</h5>  
    11  
    12     <div id="portal-globalnav" class="csshover"> 
    13      <ul> 
    14        <span tal:replace="structure portal/portal_properties/dropdownmenu_properties/menu | string:qPloneDropDownMenu broken" /> 
    15        <li class="invisibleHeightKeeper">&nbsp;</li> 
    16      </ul> 
    17     </div> 
    18  
     11     <div id="portal-globalnav"> 
     12       <div class="csshover"> 
     13         <ul> 
     14           <span tal:replace="structure portal/portal_properties/dropdownmenu_properties/menu | string:qPloneDropDownMenu broken" /> 
     15           <li class="invisibleHeightKeeper">&nbsp;</li> 
     16         </ul> 
     17       </div> 
     18     </div> 
    1919   </div> 
    2020</body> 
  • qPloneDropDownMenu/trunk/version.txt

    r95 r96  
    1 0.1.6 
     10.1.7