]> err.no Git - scalable-opengroupware.org/blob - UI/WebServerResources/HTMLElement.js
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1186 d1b88da0-ebda-0310...
[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.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   selectRange: function(element, startIndex, endIndex) {
160     element = $(element);
161     var s;
162     var e;
163     var rows;
164
165     if (startIndex > endIndex) {
166       s = endIndex;
167       e = startIndex;
168     }
169     else {
170       s = startIndex;
171       e = endIndex;
172     }
173     if (element.tagName == 'UL')
174       rows = element.getElementsByTagName('LI');
175     else
176       rows = element.getElementsByTagName('TR');
177     while (s <= e) {
178       if (rows[s].nodeType == 1)
179         $(rows[s]).select();
180       s++;
181     }
182   },
183
184   deselect: function(element) {
185     element = $(element);
186     element.removeClassName('_selected');
187   },
188
189   deselectAll: function(element) {
190     element = $(element);
191     for (var i = 0; i < element.childNodes.length; i++) {
192       var node = element.childNodes.item(i);
193       if (node.nodeType == 1)
194         $(node).deselect();
195     }
196   },
197
198   setCaretTo: function(element, pos) { 
199     element = $(element);
200     if (element.selectionStart) { // For Mozilla and Safari
201       element.focus(); 
202       element.setSelectionRange(pos, pos); 
203     }
204     else if (element.createTextRange) {       // For IE
205       var range = element.createTextRange(); 
206       range.move("character", pos); 
207       range.select();
208     } 
209   },
210
211   selectText: function(element, start, end) {
212     element = $(element);
213     if (element.setSelectionRange) {     // For Mozilla and Safari
214       element.setSelectionRange(start, end);
215     }
216     else if (element.createTextRange) {  // For IE
217       var textRange = element.createTextRange();
218       textRange.moveStart("character", start);
219       textRange.moveEnd("character", end-element.value.length);
220       textRange.select();
221     }
222     else {
223       element.select();
224     }
225  }
226
227 });