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