source: products/qPloneDropDownMenu/tags/0.1.9/skins/qPloneDropDownMenu/csshover.htc.dtml @ 1

Last change on this file since 1 was 1, checked in by myroslav, 19 years ago

Building directory structure

File size: 4.6 KB
Line 
1<dtml-call "REQUEST.RESPONSE.setHeader('Content-Type', 'text/x-component')">
2<attach event="ondocumentready" handler="parseStylesheets" />
3<script language="JScript">
4/**
5 *    HOVER - V1.11.040203 - whatever:hover in IE
6 *    ---------------------------------------------
7 *    Peterned - http://www.xs4all.nl/~peterned/
8 *    (c) 2004 - Peter Nederlof
9 *
10 *    Credits  - Arnoud Berendsen
11 *        for finding some really -sick- bugs
12 *
13 *    howto: body { behavior:url("csshover.htc"); }
14 *    ---------------------------------------------
15 */
16
17var currentSheet, doc = window.document;
18var csshover_nodes = getElementsByClassName("csshover", doc);
19var csshover_rules = [];
20var IE5 = (document.getElementsByTagName('*').length == 0) ? true : false;
21var DEBUG = false, styles = "", parseCSSRulecounter=0;
22
23function parseStylesheets() {
24    var sheets = doc.styleSheets, l = sheets.length;
25    for(var i=0; i<l; i++)
26        parseStylesheet(sheets[i]);
27    if(DEBUG) alert(styles)
28}
29
30function parseStylesheet(sheet) {
31    if(DEBUG) window.status += '|';
32//    if(sheet.href && sheet.href.indexOf('/ploneCustom.css') == -1) return;
33    var l, rules, imports;
34    if(sheet.imports) {
35        imports = sheet.imports, l = imports.length;
36        for(var i=0; i<l; i++)
37            parseStylesheet(sheet.imports[i]);
38    }
39    rules = (currentSheet = sheet).rules, l = rules.length;
40    for(var j=0; j<l; j++){ parseCSSRule(rules[j]);};
41}
42
43function parseCSSRule(rule) {
44    if(DEBUG) if((parseCSSRulecounter++)%15 == 0) window.status += '.';
45    var select = rule.selectorText, style = rule.style.cssText;
46    if(style.replace(/ /, "") == "") return;
47    if(!(/\.csshover/i).test(select)) return;
48    if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return;
49
50    var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover');
51    currentSheet.addRule(newSelect, style);
52
53    var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select);
54    var className = (hasClass? hasClass[2]:'') + 'onHover';
55    var affected = select.replace(/:hover.*$/g, '');
56    affected = affected.replace(/^.*([ ]|^)(([^ ]*)\.csshover)/i, '$2');
57
58    if(!csshover_rules[className + ',' + affected]) {
59        var elements = getElementsBySelect(affected);
60        if(DEBUG) window.status += " "+elements.length;
61        if(DEBUG) styles += "" + elements.length + ": " + affected + '\n';
62        for(var i=0; i<elements.length; i++)
63            new HoverElement(elements[i], className);
64        csshover_rules[className + ',' + affected] = true;
65    }
66}
67
68function HoverElement(node, className) {
69    if(!node.hovers) node.hovers = {};
70    if(node.hovers[className]) return;
71    node.hovers[className] = true;
72    node.attachEvent('onmouseover',
73        function() { node.className += ' ' + className; });
74    node.attachEvent('onmouseout',
75        function() { node.className =
76            node.className.replace((new RegExp('\\s+'+className)),''); });
77}
78
79function getElementsBySelect(rule) {
80    var parts, nodes = csshover_nodes;
81    parts = rule.split(' ');
82    for(var i=0; i<parts.length; i++) {
83        nodes = getSelectedNodes(parts[i], nodes, i==0);
84    }
85    return nodes;
86}
87
88function getSelectedNodes(select, elements, includeRoot) {
89    var element, result, node, nodes = [];
90    var classname = (/\.([a-z0-9_-]+)/i).exec(select);
91    if(classname) classname_re = new RegExp('\\b' + classname[1] + '\\b');
92    var identify = (/\#([a-z0-9_-]+)/i).exec(select);
93    var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*',
94        ell = elements.length;
95    for(var i=0; i<ell; i++) {
96        element = elements[i]
97        if(includeRoot)
98          if((tagName == '*') || (element.nodeName == tagName)) result = [element]
99          else result = []
100        else
101            if (tagName == '*' && IE5) result = elements[i].all
102            else result = elements[i].getElementsByTagName(tagName)
103        rel = result.length;
104        for(var j=0; j<rel; j++) {
105            node = result[j];
106            if((identify && node.id != identify[1]) || (classname && !(classname_re.exec(node.className))) || arrayHasElement(nodes, node)) continue;
107            nodes[nodes.length] = node;
108        }
109    }
110    return nodes;
111}
112
113function arrayHasElement(a, el) {
114    var l = a.length;
115    for(var i=0; i<l; i++) if(a[i] == el) return true;
116    return false;
117}
118
119function getElementsByClassName(className, parentElement) {
120    var result = new Array(),
121        list = (parentElement || doc.body).all //getElementsByTagName('*');
122    for(var i = 0; i < list.length; i++) {
123        if(list[i].className.match(new RegExp('(^|\\s)' + className + '(\\s|$)'))) result[result.length] = list[i];
124    }
125    return result
126};
127
128</script>
Note: See TracBrowser for help on using the repository browser.