source: products/qPloneDropDownMenu/trunk/skins/qPloneDropDownMenu/csshover.htc.dtml @ 1140

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

Building directory structure

File size: 5.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 */
16var currentSheet, doc = window.document;
17var csshover_nodes = getElementsByClassName("csshover", doc);
18var csshover_rules = [], hoverStyleSheets = "", addRules = true;
19var IE5 = (doc.getElementsByTagName('*').length == 0) ? true : false, configlet = doc.getElementById('csshovering');
20var DEBUG = false, styles = "", parseCSSRulecounter = 0, timer, timerTable = "", d=true;
21
22function parseStylesheets() {
23    var sheets = doc.styleSheets, l = sheets.length;
24    for(var i=0; i<l; i++){
25        parseStylesheet(sheets[i]);
26    };
27    if (configlet) {configlet.innerText = hoverStyleSheets;};
28    if(DEBUG) {
29      alert(styles);
30      alert(timerTable);
31    };
32};
33
34function parseStylesheet(sheet) {
35    if(DEBUG) window.status += '|';
36//    if(sheet.href && sheet.href.indexOf('/ploneCustom.css') == -1) return;
37    var l, rules, imports;
38    if(sheet.imports) {
39        imports = sheet.imports, l = imports.length;
40        for(var i=0; i<l; i++)
41            parseStylesheet(sheet.imports[i]);
42    };
43    rules = (currentSheet = sheet).rules, l = rules.length;
44    for(var j=0; j<l; j++){parseCSSRule(rules[j]);};
45};
46
47function parseCSSRule(rule) {
48    if(DEBUG) {
49        if((parseCSSRulecounter++)%15 == 0) window.status += '.';
50        startTimer();
51    };
52    var select = rule.selectorText, style = rule.style.cssText;
53    if (addRules && (/\.cssHoverCSSExists/i).test(select)) {addRules = false;};
54    if(!(/\.csshover/i).test(select)) return;
55    if(style.replace(/ /, "") == "") return;
56    if(!(/(^|\s)(([^a]([^ ]+)?)|(a([^#.][^ ]+)+)):hover/i).test(select)) return;
57
58    var newSelect = select.replace(/(\.([a-z0-9_-]+):hover)|(:hover)/g, '.$2onHover');
59    if (addRules) {currentSheet.addRule(newSelect, style);};
60    if (configlet) {hoverStyleSheets += newSelect + ' \{\n  ' + style.replace('; ', '\;\n  ') + ';\n\}\n';};
61
62    var hasClass = (/(\.([a-z0-9_-]+):hover)/g).exec(select);
63    var className = (hasClass? hasClass[2]:'') + 'onHover';
64    var affected = select.replace(/:hover.*$/g, '');
65    affected = affected.replace(/^.*([ ]|^)(([^ ]*)\.csshover)/i, '$2');
66    if (DEBUG) {timerTable += stopTimer() + '\n';};
67    if(!csshover_rules[className + ',' + affected]) {
68        if (DEBUG) {startTimer();};
69        var elements = getElementsBySelect(affected);
70        if(DEBUG) {
71            window.status += " "+elements.length;
72            styles += "" + elements.length + ": " + affected + '\n';
73        };
74        for(var i=0; i<elements.length; i++)
75            new HoverElement(elements[i], className);
76        csshover_rules[className + ',' + affected] = true;
77    };
78};
79
80function HoverElement(node, className) {
81    if(!node.hovers) node.hovers = {};
82    if(node.hovers[className]) return;
83    node.hovers[className] = true;
84    node.attachEvent('onmouseover',
85        function() { node.className += ' ' + className; });
86    node.attachEvent('onmouseout',
87        function() { node.className =
88            node.className.replace((new RegExp('\\s+'+className)),''); });
89};
90
91function getElementsBySelect(rule) {
92    var parts, nodes = csshover_nodes;
93    parts = rule.split(' ');
94    for(var i=0; i<parts.length; i++) {
95        nodes = getSelectedNodes(parts[i], nodes, i==0);
96    };
97    return nodes;
98};
99
100function getSelectedNodes(select, elements, includeRoot) {
101    var element, result, node, nodes = [];
102    var classname = (/\.([a-z0-9_-]+)/i).exec(select);
103    if(classname) {classname_re = new RegExp('\\b' + classname[1] + '\\b');};
104    var identify = (/\#([a-z0-9_-]+)/i).exec(select);
105    var tagName = (/^[a-z0-9]+/i).exec(select.toUpperCase()) || '*',
106        ell = elements.length;
107    for(var i=0; i<ell; i++) {
108        element = elements[i]
109        if(includeRoot)
110          if((tagName == '*') || (element.nodeName == tagName)) result = [element]
111          else result = []
112        else
113            if (tagName == '*' && IE5) result = elements[i].all
114            else result = elements[i].getElementsByTagName(tagName)
115        rel = result.length;
116        for(var j=0; j<rel; j++) {
117            node = result[j];
118            if((identify && node.id != identify[1]) || (classname && !(classname_re.exec(node.className))) || arrayHasElement(nodes, node)) continue;
119            nodes[nodes.length] = node;
120        };
121    };
122    return nodes;
123};
124
125function arrayHasElement(a, el) {
126    var l = a.length;
127    for(var i=0; i<l; i++) if(a[i] == el) return true;
128    return false;
129};
130
131function getElementsByClassName(className, parentElement) {
132    var result = new Array(),
133        list = (parentElement || doc.body).getElementsByTagName('*');
134    if(list.length == 0) list = (parentElement || doc.body).all;
135    var class_re = new RegExp('(^|\\s)' + className + '(\\s|$)');
136    for(var i = 0; i < list.length; i++) if(list[i].className.match(class_re)) result[result.length] = list[i];
137    return result;
138};
139
140function startTimer() {timer = new Date().getTime();};
141function stopTimer(message) {return (new Date().getTime()) - timer;};
142
143</script>
Note: See TracBrowser for help on using the repository browser.