source: products/qPloneDropDownMenu/branches/0.2/skins/qPloneDropDownMenu/csshover.htc.dtml

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

Building directory structure

File size: 4.4 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 DEBUG = false, styles = "", parseCSSRulecounter=0;
21
22function parseStylesheets() {
23    var sheets = doc.styleSheets, l = sheets.length;
24    for(var i=0; i<l; i++)
25        parseStylesheet(sheets[i]);
26    if(DEBUG) alert(styles)
27}
28
29function parseStylesheet(sheet) {
30    if(DEBUG) window.status += '|';
31//    if(sheet.href && sheet.href.indexOf('/ploneCustom.css') == -1) return;
32    var l, rules, imports;
33    if(sheet.imports) {
34        imports = sheet.imports, l = imports.length;
35        for(var i=0; i<l; i++)
36            parseStylesheet(sheet.imports[i]);
37    }
38    rules = (currentSheet = sheet).rules, l = rules.length;
39    for(var j=0; j<l; j++){ parseCSSRule(rules[j]);};
40}
41
42function parseCSSRule(rule) {
43    if(DEBUG) if((parseCSSRulecounter++)%10 == 0) window.status += '.';
44    var select = rule.selectorText, style = rule.style.cssText;
45    if(style.replace(/ /, "") == "") return;
46    if(!(/\.csshover/i).test(select)) return;
47    if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return;
48
49    var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover');
50    currentSheet.addRule(newSelect, style);
51
52    var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select);
53    var className = (hasClass? hasClass[2]:'') + 'onHover';
54    var affected = select.replace(/:hover.*$/g, '');
55    affected = affected.replace(/^.*([ ]|^)(([^ ]*)\.csshover)/i, '$2');
56
57    if(!csshover_rules[className + ',' + affected]) {
58        var elements = getElementsBySelect(affected);
59        if(DEBUG) window.status += " "+elements.length;
60        styles += "" + elements.length + ": " + affected + '\n'
61        for(var i=0; i<elements.length; i++)
62            HoverElement(elements[i], className);
63        csshover_rules[className + ',' + affected] = true;
64    }
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 arrayHasElement(a, el) {
89    var l = a.length;
90    for(var i=0; i<l; i++) if(a[i] == el) return true;
91    return false;
92}
93
94function getSelectedNodes(select, elements, includeRoot) {
95    var element, result, node, nodes = [];
96    var classname = (/\.([a-z0-9_-]+)/i).exec(select);
97    if(classname) classname_re = new RegExp('\\b' + classname[1] + '\\b');
98    var identify = (/\#([a-z0-9_-]+)/i).exec(select);
99    var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*',
100        ell = elements.length;
101    for(var i=0; i<ell; i++) {
102        element = elements[i]
103        if(includeRoot)
104          if((tagName=='*') || (element.nodeName == tagName)) result = [element]
105          else result = []
106        else result = element.getElementsByTagName(tagName);
107        rel = result.length;
108        for(var j=0; j<rel; j++) {
109            node = result[j];
110            if((identify && node.id != identify[1]) || (classname && !(classname_re.exec(node.className))) || arrayHasElement(nodes, node)) continue;
111            nodes[nodes.length] = node;
112        }
113    }
114    return nodes;
115}
116
117function getElementsByClassName(className, parentElement) {
118    var result = new Array(),
119        list = (parentElement || doc.body).getElementsByTagName('*');
120    for(var i = 0; i < list.length; i++) {
121        if(list[i].className.match(new RegExp('(^|\\s)' + className + '(\\s|$)'))) result[result.length] = list[i];
122    }
123    return result
124};
125
126</script>
Note: See TracBrowser for help on using the repository browser.