File: menu.js

package info (click to toggle)
virtuoso-opensource 6.1.4%2Bdfsg1-7
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 245,116 kB
  • sloc: ansic: 639,631; sql: 439,225; xml: 287,085; java: 61,048; sh: 38,723; cpp: 36,889; cs: 25,240; php: 12,562; yacc: 9,036; lex: 7,149; makefile: 6,093; jsp: 4,447; awk: 1,643; perl: 1,017; ruby: 1,003; python: 329
file content (127 lines) | stat: -rw-r--r-- 3,308 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/*
 *  $Id: menu.js,v 1.11.2.4 2010/04/06 16:46:12 source Exp $
 *
 *  This file is part of the OpenLink Software Ajax Toolkit (OAT) project.
 *
 *  Copyright (C) 2005-2010 OpenLink Software
 *
 *  See LICENSE file for details.
 */
/*
	m = new OAT.Menu()
	m.closeFilter = className
	m.noCloseFilter = className
	m.createFromUL(ul)

*/

OAT.MenuItem = function(menu,parent,li,ul) {
	var self = this;
	this.items = [];
	this.li = li;
	this.ul = ul;
	this.parent = parent;
	this.state = 1;

	this.open = function() {
		/* close all siblings */
		for (var i=0;i<self.parent.items.length;i++) {
			if (self.parent.items[i]!=self)
				self.parent.items[i].close();
		}
		/* do something */
		if (self.ul) { OAT.Dom.show(ul); }
		self.state = 1;
	}

	this.close = function() {
		if (!self.ul) { return; } /* don't close leaves */
		/* close all children prior to closing parent */
		for (var i=0;i<self.items.length;i++) { self.items[i].close(); }
		/* do something */
		if (self.li) { OAT.Dom.hide(self.ul); } /* hide if not zero level */
		self.state = 0;
	}

	this.addLis = function() {
		if (!this.ul) { return; }
		var lis = menu.namedDirectChildren(this.ul,"li");
		for (var i=0;i<lis.length;i++) {
			var li = lis[i];
			var uls = menu.namedDirectChildren(li,"ul"); /* we expect max. 1 ul */
			var ul = (uls.length ? uls[0] : false);
			var me = new OAT.MenuItem(menu,self,li,ul);
			self.items.push(me);
			me.addLis();
		}
	}


	if (!self.parent.li) { /* 1st level */
		var overRef = function(event) {
			var hope = 0;
			for (var i=0;i<self.parent.items.length;i++) {
				var it = self.parent.items[i];
				if (it != self && it.state) { hope = 1; }
			}
			if (hope) { self.open(); }
		}
		var clickRef = function(event) {
			/*
			 * var src = OAT.Event.source(event);
			 * if (src != self.li) { return; }
			 */
			if (self.state) { self.close(); } else { self.open(); }
		}
		OAT.Event.attach(self.li,"mouseover",overRef);
		OAT.Event.attach(self.li,"click",clickRef);

	} else {
		var overRef = function(event) {
			self.open();
		}
		var clickRef = function(event) {
			OAT.Event.cancel(event);
			/*
			var src = OAT.Event.source(event);
			if (src != self.li) { return; }
			*/
			if (OAT.Dom.isClass(self.li,menu.closeFilter) && !OAT.Dom.isClass(self.li,menu.noCloseFilter)) {
				menu.root.close();
			}
		}
		OAT.Event.attach(self.li,"mouseover",overRef);
		OAT.Event.attach(self.li,"click",clickRef);
	}
}

OAT.Menu = function() {

	var self = this;
	this.closeFilter = "*"; /* by default, clicking any element closes menu */
	this.noCloseFilter = ""; /* by default, there are no 'deaf' elements (separators) */

	var downRef = function(event) {
		var src = OAT.Event.source(event);
		/* close if clicked element is not child of any top level li's */
		if (!OAT.Dom.isChild(src,self.root.ul)) { self.root.close(); }
	}
	OAT.Event.attach(document,"mousedown",downRef);

	this.createFromUL = function(elm) { /* manage whole ul tree */
		var ul = $(elm);
		self.root = new OAT.MenuItem(self,false,false,ul);
		self.root.addLis();
		self.root.close();
	}

	this.namedDirectChildren = function(node,tagName) {
		var arr = [];
		var ch = node.childNodes;
		for (var i=0;i<ch.length;i++) {
			if (ch[i].tagName && ch[i].tagName.toLowerCase() == tagName) { arr.push(ch[i]); }
		}
		return arr;
	}

}