]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/HTMLElement.js
187c70df5d46ba19082f5c9394d1d6385f932ab0
[scalable-opengroupware.org] / UI / WebServerResources / HTMLElement.js
1 /* custom extensions to the DOM api */
2 Element.addMethods({
3
4   addInterface: function(element, objectInterface) {
5     element = $(element);
6     Object.extend(element, objectInterface);
7     if (element.bind)
8       element.bind();
9   },
10
11   childNodesWithTag: function(element, tagName) {
12     element = $(element);
13     var matchingNodes = new Array();
14     var tagName = tagName.toUpperCase();
15     
16     for (var i = 0; i < element.childNodes.length; i++) {
17       if (typeof(element.childNodes[i]) == "object"
18           && element.childNodes[i].tagName
19           && element.childNodes[i].tagName.toUpperCase() == tagName)
20         matchingNodes.push(element.childNodes[i]);
21     }
22
23     return matchingNodes;
24   },
25
26   getParentWithTagName: function(element, tagName) {
27     element = $(element);
28     var currentElement = element;
29     tagName = tagName.toUpperCase();
30     
31     currentElement = currentElement.parentNode;
32     while (currentElement
33            && currentElement.tagName != tagName) {
34       currentElement = currentElement.parentNode;
35     }
36     
37     return currentElement;
38   },
39
40   cascadeLeftOffset: function(element) {
41     element = $(element);
42     var currentElement = element;
43     
44     var offset = 0;
45     while (currentElement) {
46       offset += currentElement.offsetLeft;
47       currentElement = currentElement.getParentWithTagName("div");
48     }
49     
50     return offset;
51   },
52
53   cascadeTopOffset: function(element) {
54     element = $(element);
55     var currentElement = element;
56     var offset = 0;
57     
58     var i = 0;
59     
60     while (currentElement && currentElement.tagName) {
61       offset += currentElement.offsetTop;
62       currentElement = currentElement.parentNode;
63       i++;
64     }
65     
66     return offset;
67   },
68  
69   dump: function(element, additionalInfo, additionalKeys) {
70     element = $(element);
71     var id = element.getAttribute("id");
72     var nclass = element.getAttribute("class");
73     
74     var str = element.tagName;
75     if (id)
76       str += "; id = " + id;
77     if (nclass)
78       str += "; class = " + nclass;
79     
80     if (additionalInfo)
81       str += "; " + additionalInfo;
82     
83     if (additionalKeys)
84       for (var i = 0; i < additionalKeys.length; i++) {
85         var value = element.getAttribute(additionalKeys[i]);
86         if (value)
87           str += "; " + additionalKeys[i] + " = " + value;
88       }
89     
90     log (str);
91   },
92
93   getSelectedNodes: function(element) {
94     element = $(element);
95     var selArray = new Array();
96     
97     for (var i = 0; i < element.childNodes.length; i++) {
98       node = element.childNodes.item(i);
99       if (node.nodeType == 1
100           && isNodeSelected(node))
101         selArray.push(node);
102     }
103     
104     return selArray;
105   },
106
107   getSelectedNodesId: function(element) {
108     element = $(element);
109     var selArray = new Array();
110     
111     for (var i = 0; i < element.childNodes.length; i++) {
112       node = element.childNodes.item(i);
113       if (node.nodeType == 1
114           && isNodeSelected(node)) {
115         selArray.push(node.getAttribute("id")); }
116     }
117
118     return selArray;
119   },
120
121   onContextMenu: function(element, event) {
122     element = $(element);
123     var popup = element.sogoContextMenu;
124
125     if (document.currentPopupMenu)
126       hideMenu(document.currentPopupMenu);
127     
128     var menuTop = event.pageY;
129     var menuLeft = event.pageX;
130     var heightDiff = (window.innerHeight
131                       - (menuTop + popup.offsetHeight));
132     if (heightDiff < 0)
133       menuTop += heightDiff;
134     
135     var leftDiff = (window.innerWidth
136                     - (menuLeft + popup.offsetWidth));
137     if (leftDiff < 0)
138       menuLeft -= popup.offsetWidth;
139
140     popup.setStyle( { top: menuTop + "px",
141                       left: menuLeft + "px",
142                       visibility: "visible" } );
143     
144     document.currentPopupMenu = popup;
145     Event.observe(document.body, "click", onBodyClickMenuHandler);
146   },
147
148   attachMenu: function(element, menuName) {
149     element = $(element);
150     element.sogoContextMenu = $(menuName);
151     Event.observe(element, "contextmenu", element.onContextMenu.bindAsEventListener(element));
152   },
153
154   select: function(element) {
155     element = $(element);
156     element.addClassName('_selected');
157   },
158
159   deselect: function(element) {
160     element = $(element);
161     element.removeClassName('_selected');
162   },
163
164   deselectAll: function(element) {
165     element = $(element);
166     for (var i = 0; i < element.childNodes.length; i++) {
167       var node = element.childNodes.item(i);
168       if (node.nodeType == 1)
169         $(node).deselect();
170     }
171   }
172
173 });