File: jses.js

package info (click to toggle)
python-jtoolkit 0.7.8-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 1,436 kB
  • ctags: 2,536
  • sloc: python: 15,143; makefile: 20
file content (83 lines) | stat: -rwxr-xr-x 2,361 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
JavaScript Event Sheets
This comes from http://www.kryogenix.org/code/browser/jses/
It is a css-like (and also XBL like) approach to adding events to javascript
- Stephen Emslie, St. James Software
*/

jses_addEvent(window,"load",jses_init);

function jses_init() {
  // Find any jses tags and grab their content
  tgs = document.getElementsByTagName('link');
  if (!tgs) return;
  jsesData = '';
  for (var i=0;i<tgs.length;i++) {
    if (tgs[i].getAttribute('rel') != 'jses') continue;
    var async = true;
    uri = tgs[i].getAttribute("href");
    var xmlHttp = XmlHttpGet();
    xmlHttp.responsehandler = jses_parse;
    xmlHttp.get(uri, {});
  }
}

function jses_parse(data) {
  // Split text into rulesets
  re_ruleset = /([a-zA-Z0-9.#\s>]+)({[\s\S]+})/g;
  re_declaration = /\s*([a-z]+)\s*:\s*([a-zA-Z0-9_-]+)\s*;/g
  while ((ruleset = re_ruleset.exec(data)) != null) {
    // Parse a ruleset into a selector and a series of declarations
    selector = ruleset[1];
    declarations = ruleset[2];
    while ((declaration = re_declaration.exec(declarations)) != null) {
      j_property = declaration[1];
      j_value = declaration[2];
      applicableEls = cssQuery(selector);
      for (var i=0;i<applicableEls.length;i++) {
        jses_addEvent(applicableEls[i],j_property,eval(j_value));
      }
    }
  }
}

function jses_getInnerText(el) {
	if (typeof el == "string") return el;
	if (typeof el == "undefined") { return el };
	if (el.innerText) return el.innerText;	//Not needed but it is faster
	var str = "";
	
	var cs = el.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		switch (cs[i].nodeType) {
			case 1: //ELEMENT_NODE
				str += jses_getInnerText(cs[i]);
				break;
			case 3:	//TEXT_NODE
				str += cs[i].nodeValue;
				break;
		}
	}
	return str;
}

/* Add an eventListener to browsers that can do it somehow.
   Originally by the fantabulous Scott Andrew. */
function jses_addEvent(obj, evType, fn){
  // a hack! this seems to make jses work for clicks (otherwise the normal link gets followed...)...
  if (evType == "click" && obj.nodeName == 'A')
  {
    obj.onclick = function() { return false; };
  }
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, false);
    return true;
  } else if (obj.attachEvent){
	var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
	return false;
  }
}