]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/HTMLElement.js
40414457281a9f554fb3962418c491d942411a18
[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.pointerY(event);
129     var menuLeft = Event.pointerX(event);
130     var heightDiff = (window.height()
131                       - (menuTop + popup.offsetHeight));
132     if (heightDiff < 0)
133       menuTop += heightDiff;
134     
135     var leftDiff = (window.width()
136                     - (menuLeft + popup.offsetWidth));
137     if (leftDiff < 0)
138       menuLeft -= popup.offsetWidth;
139
140     if (popup.prepareVisibility)
141       popup.prepareVisibility();
142
143     popup.setStyle( { top: menuTop + "px",
144                       left: menuLeft + "px",
145                       visibility: "visible" } );
146     
147     document.currentPopupMenu = popup;
148     Event.observe(document.body, "click", onBodyClickMenuHandler);
149   },
150
151   attachMenu: function(element, menuName) {
152     element = $(element);
153     element.sogoContextMenu = $(menuName);
154     Event.observe(element, "contextmenu",
155                   element.onContextMenu.bindAsEventListener(element));
156   },
157
158   select: function(element) {
159     element = $(element);
160     element.addClassName('_selected');
161   },
162
163   selectRange: function(element, startIndex, endIndex) {
164     element = $(element);
165     var s;
166     var e;
167     var rows;
168
169     if (startIndex > endIndex) {
170       s = endIndex;
171       e = startIndex;
172     }
173     else {
174       s = startIndex;
175       e = endIndex;
176     }
177     if (element.tagName == 'UL')
178       rows = element.getElementsByTagName('LI');
179     else
180       rows = element.getElementsByTagName('TR');
181     while (s <= e) {
182       if (rows[s].nodeType == 1)
183         $(rows[s]).select();
184       s++;
185     }
186   },
187
188   deselect: function(element) {
189     element = $(element);
190     element.removeClassName('_selected');
191   },
192
193   deselectAll: function(element) {
194     element = $(element);
195     for (var i = 0; i < element.childNodes.length; i++) {
196       var node = element.childNodes.item(i);
197       if (node.nodeType == 1)
198         $(node).deselect();
199     }
200   },
201
202   setCaretTo: function(element, pos) { 
203     element = $(element);
204     if (element.selectionStart) { // For Mozilla and Safari
205       element.focus(); 
206       element.setSelectionRange(pos, pos); 
207     }
208     else if (element.createTextRange) {       // For IE
209       var range = element.createTextRange(); 
210       range.move("character", pos); 
211       range.select();
212     } 
213   },
214
215   selectText: function(element, start, end) {
216     element = $(element);
217     if (element.setSelectionRange) {     // For Mozilla and Safari
218       element.setSelectionRange(start, end);
219     }
220     else if (element.createTextRange) {  // For IE
221       var textRange = element.createTextRange();
222       textRange.moveStart("character", start);
223       textRange.moveEnd("character", end-element.value.length);
224       textRange.select();
225     }
226     else {
227       element.select();
228     }
229  }
230
231 });