jscript: Update Russian translation.
[wine] / dlls / mshtml / htmlelem2.c
1 /*
2  * Copyright 2006 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <stdarg.h>
20
21 #define COBJMACROS
22
23 #include "windef.h"
24 #include "winbase.h"
25 #include "winuser.h"
26 #include "ole2.h"
27
28 #include "wine/debug.h"
29 #include "wine/unicode.h"
30
31 #include "mshtml_private.h"
32 #include "htmlevent.h"
33
34 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
35
36 #define HTMLELEM2_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement2, iface)
37
38 static HRESULT WINAPI HTMLElement2_QueryInterface(IHTMLElement2 *iface,
39                                                   REFIID riid, void **ppv)
40 {
41     HTMLElement *This = HTMLELEM2_THIS(iface);
42     return IHTMLElement_QueryInterface(HTMLELEM(This), riid, ppv);
43 }
44
45 static ULONG WINAPI HTMLElement2_AddRef(IHTMLElement2 *iface)
46 {
47     HTMLElement *This = HTMLELEM2_THIS(iface);
48     return IHTMLElement_AddRef(HTMLELEM(This));
49 }
50
51 static ULONG WINAPI HTMLElement2_Release(IHTMLElement2 *iface)
52 {
53     HTMLElement *This = HTMLELEM2_THIS(iface);
54     return IHTMLElement_Release(HTMLELEM(This));
55 }
56
57 static HRESULT WINAPI HTMLElement2_GetTypeInfoCount(IHTMLElement2 *iface, UINT *pctinfo)
58 {
59     HTMLElement *This = HTMLELEM2_THIS(iface);
60     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->node.dispex), pctinfo);
61 }
62
63 static HRESULT WINAPI HTMLElement2_GetTypeInfo(IHTMLElement2 *iface, UINT iTInfo,
64                                                LCID lcid, ITypeInfo **ppTInfo)
65 {
66     HTMLElement *This = HTMLELEM2_THIS(iface);
67     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->node.dispex), iTInfo, lcid, ppTInfo);
68 }
69
70 static HRESULT WINAPI HTMLElement2_GetIDsOfNames(IHTMLElement2 *iface, REFIID riid,
71                                                 LPOLESTR *rgszNames, UINT cNames,
72                                                 LCID lcid, DISPID *rgDispId)
73 {
74     HTMLElement *This = HTMLELEM2_THIS(iface);
75     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
76 }
77
78 static HRESULT WINAPI HTMLElement2_Invoke(IHTMLElement2 *iface, DISPID dispIdMember,
79                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
80                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
81 {
82     HTMLElement *This = HTMLELEM2_THIS(iface);
83     return IDispatchEx_Invoke(DISPATCHEX(&This->node.dispex), dispIdMember, riid, lcid,
84             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
85 }
86
87 static HRESULT WINAPI HTMLElement2_get_scopeName(IHTMLElement2 *iface, BSTR *p)
88 {
89     HTMLElement *This = HTMLELEM2_THIS(iface);
90     FIXME("(%p)->(%p)\n", This, p);
91     return E_NOTIMPL;
92 }
93
94 static HRESULT WINAPI HTMLElement2_setCapture(IHTMLElement2 *iface, VARIANT_BOOL containerCapture)
95 {
96     HTMLElement *This = HTMLELEM2_THIS(iface);
97     FIXME("(%p)->(%x)\n", This, containerCapture);
98     return E_NOTIMPL;
99 }
100
101 static HRESULT WINAPI HTMLElement2_releaseCapture(IHTMLElement2 *iface)
102 {
103     HTMLElement *This = HTMLELEM2_THIS(iface);
104     FIXME("(%p)\n", This);
105     return E_NOTIMPL;
106 }
107
108 static HRESULT WINAPI HTMLElement2_put_onlosecapture(IHTMLElement2 *iface, VARIANT v)
109 {
110     HTMLElement *This = HTMLELEM2_THIS(iface);
111     FIXME("(%p)->()\n", This);
112     return E_NOTIMPL;
113 }
114
115 static HRESULT WINAPI HTMLElement2_get_onlosecapture(IHTMLElement2 *iface, VARIANT *p)
116 {
117     HTMLElement *This = HTMLELEM2_THIS(iface);
118     FIXME("(%p)->(%p)\n", This, p);
119     return E_NOTIMPL;
120 }
121
122 static HRESULT WINAPI HTMLElement2_componentFromPoint(IHTMLElement2 *iface,
123                                                       LONG x, LONG y, BSTR *component)
124 {
125     HTMLElement *This = HTMLELEM2_THIS(iface);
126     FIXME("(%p)->(%d %d %p)\n", This, x, y, component);
127     return E_NOTIMPL;
128 }
129
130 static HRESULT WINAPI HTMLElement2_doScroll(IHTMLElement2 *iface, VARIANT component)
131 {
132     HTMLElement *This = HTMLELEM2_THIS(iface);
133     FIXME("(%p)->()\n", This);
134     return E_NOTIMPL;
135 }
136
137 static HRESULT WINAPI HTMLElement2_put_onscroll(IHTMLElement2 *iface, VARIANT v)
138 {
139     HTMLElement *This = HTMLELEM2_THIS(iface);
140     FIXME("(%p)->()\n", This);
141     return E_NOTIMPL;
142 }
143
144 static HRESULT WINAPI HTMLElement2_get_onscroll(IHTMLElement2 *iface, VARIANT *p)
145 {
146     HTMLElement *This = HTMLELEM2_THIS(iface);
147     FIXME("(%p)->(%p)\n", This, p);
148     return E_NOTIMPL;
149 }
150
151 static HRESULT WINAPI HTMLElement2_put_ondrag(IHTMLElement2 *iface, VARIANT v)
152 {
153     HTMLElement *This = HTMLELEM2_THIS(iface);
154
155     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
156
157     return set_node_event(&This->node, EVENTID_DRAG, &v);
158 }
159
160 static HRESULT WINAPI HTMLElement2_get_ondrag(IHTMLElement2 *iface, VARIANT *p)
161 {
162     HTMLElement *This = HTMLELEM2_THIS(iface);
163
164     TRACE("(%p)->(%p)\n", This, p);
165
166     return get_node_event(&This->node, EVENTID_DRAG, p);
167 }
168
169 static HRESULT WINAPI HTMLElement2_put_ondragend(IHTMLElement2 *iface, VARIANT v)
170 {
171     HTMLElement *This = HTMLELEM2_THIS(iface);
172     FIXME("(%p)->()\n", This);
173     return E_NOTIMPL;
174 }
175
176 static HRESULT WINAPI HTMLElement2_get_ondragend(IHTMLElement2 *iface, VARIANT *p)
177 {
178     HTMLElement *This = HTMLELEM2_THIS(iface);
179     FIXME("(%p)->(%p)\n", This, p);
180     return E_NOTIMPL;
181 }
182
183 static HRESULT WINAPI HTMLElement2_put_ondragenter(IHTMLElement2 *iface, VARIANT v)
184 {
185     HTMLElement *This = HTMLELEM2_THIS(iface);
186     FIXME("(%p)->()\n", This);
187     return E_NOTIMPL;
188 }
189
190 static HRESULT WINAPI HTMLElement2_get_ondragenter(IHTMLElement2 *iface, VARIANT *p)
191 {
192     HTMLElement *This = HTMLELEM2_THIS(iface);
193     FIXME("(%p)->(%p)\n", This, p);
194     return E_NOTIMPL;
195 }
196
197 static HRESULT WINAPI HTMLElement2_put_ondragover(IHTMLElement2 *iface, VARIANT v)
198 {
199     HTMLElement *This = HTMLELEM2_THIS(iface);
200     FIXME("(%p)->()\n", This);
201     return E_NOTIMPL;
202 }
203
204 static HRESULT WINAPI HTMLElement2_get_ondragover(IHTMLElement2 *iface, VARIANT *p)
205 {
206     HTMLElement *This = HTMLELEM2_THIS(iface);
207     FIXME("(%p)->(%p)\n", This, p);
208     return E_NOTIMPL;
209 }
210
211 static HRESULT WINAPI HTMLElement2_put_ondragleave(IHTMLElement2 *iface, VARIANT v)
212 {
213     HTMLElement *This = HTMLELEM2_THIS(iface);
214     FIXME("(%p)->()\n", This);
215     return E_NOTIMPL;
216 }
217
218 static HRESULT WINAPI HTMLElement2_get_ondragleave(IHTMLElement2 *iface, VARIANT *p)
219 {
220     HTMLElement *This = HTMLELEM2_THIS(iface);
221     FIXME("(%p)->(%p)\n", This, p);
222     return E_NOTIMPL;
223 }
224
225 static HRESULT WINAPI HTMLElement2_put_ondrop(IHTMLElement2 *iface, VARIANT v)
226 {
227     HTMLElement *This = HTMLELEM2_THIS(iface);
228     FIXME("(%p)->()\n", This);
229     return E_NOTIMPL;
230 }
231
232 static HRESULT WINAPI HTMLElement2_get_ondrop(IHTMLElement2 *iface, VARIANT *p)
233 {
234     HTMLElement *This = HTMLELEM2_THIS(iface);
235     FIXME("(%p)->(%p)\n", This, p);
236     return E_NOTIMPL;
237 }
238
239 static HRESULT WINAPI HTMLElement2_put_onbeforecut(IHTMLElement2 *iface, VARIANT v)
240 {
241     HTMLElement *This = HTMLELEM2_THIS(iface);
242     FIXME("(%p)->()\n", This);
243     return E_NOTIMPL;
244 }
245
246 static HRESULT WINAPI HTMLElement2_get_onbeforecut(IHTMLElement2 *iface, VARIANT *p)
247 {
248     HTMLElement *This = HTMLELEM2_THIS(iface);
249     FIXME("(%p)->(%p)\n", This, p);
250     return E_NOTIMPL;
251 }
252
253 static HRESULT WINAPI HTMLElement2_put_oncut(IHTMLElement2 *iface, VARIANT v)
254 {
255     HTMLElement *This = HTMLELEM2_THIS(iface);
256     FIXME("(%p)->()\n", This);
257     return E_NOTIMPL;
258 }
259
260 static HRESULT WINAPI HTMLElement2_get_oncut(IHTMLElement2 *iface, VARIANT *p)
261 {
262     HTMLElement *This = HTMLELEM2_THIS(iface);
263     FIXME("(%p)->(%p)\n", This, p);
264     return E_NOTIMPL;
265 }
266
267 static HRESULT WINAPI HTMLElement2_put_onbeforecopy(IHTMLElement2 *iface, VARIANT v)
268 {
269     HTMLElement *This = HTMLELEM2_THIS(iface);
270     FIXME("(%p)->()\n", This);
271     return E_NOTIMPL;
272 }
273
274 static HRESULT WINAPI HTMLElement2_get_onbeforecopy(IHTMLElement2 *iface, VARIANT *p)
275 {
276     HTMLElement *This = HTMLELEM2_THIS(iface);
277     FIXME("(%p)->(%p)\n", This, p);
278     return E_NOTIMPL;
279 }
280
281 static HRESULT WINAPI HTMLElement2_put_oncopy(IHTMLElement2 *iface, VARIANT v)
282 {
283     HTMLElement *This = HTMLELEM2_THIS(iface);
284     FIXME("(%p)->()\n", This);
285     return E_NOTIMPL;
286 }
287
288 static HRESULT WINAPI HTMLElement2_get_oncopy(IHTMLElement2 *iface, VARIANT *p)
289 {
290     HTMLElement *This = HTMLELEM2_THIS(iface);
291     FIXME("(%p)->(%p)\n", This, p);
292     return E_NOTIMPL;
293 }
294
295 static HRESULT WINAPI HTMLElement2_put_onbeforepaste(IHTMLElement2 *iface, VARIANT v)
296 {
297     HTMLElement *This = HTMLELEM2_THIS(iface);
298     FIXME("(%p)->()\n", This);
299     return E_NOTIMPL;
300 }
301
302 static HRESULT WINAPI HTMLElement2_get_onbeforepaste(IHTMLElement2 *iface, VARIANT *p)
303 {
304     HTMLElement *This = HTMLELEM2_THIS(iface);
305     FIXME("(%p)->(%p)\n", This, p);
306     return E_NOTIMPL;
307 }
308
309 static HRESULT WINAPI HTMLElement2_put_onpaste(IHTMLElement2 *iface, VARIANT v)
310 {
311     HTMLElement *This = HTMLELEM2_THIS(iface);
312
313     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
314
315     return set_node_event(&This->node, EVENTID_PASTE, &v);
316 }
317
318 static HRESULT WINAPI HTMLElement2_get_onpaste(IHTMLElement2 *iface, VARIANT *p)
319 {
320     HTMLElement *This = HTMLELEM2_THIS(iface);
321
322     TRACE("(%p)->(%p)\n", This, p);
323
324     return get_node_event(&This->node, EVENTID_PASTE, p);
325 }
326
327 static HRESULT WINAPI HTMLElement2_get_currentStyle(IHTMLElement2 *iface, IHTMLCurrentStyle **p)
328 {
329     HTMLElement *This = HTMLELEM2_THIS(iface);
330
331     TRACE("(%p)->(%p)\n", This, p);
332
333     return HTMLCurrentStyle_Create(This, p);
334 }
335
336 static HRESULT WINAPI HTMLElement2_put_onpropertychange(IHTMLElement2 *iface, VARIANT v)
337 {
338     HTMLElement *This = HTMLELEM2_THIS(iface);
339     FIXME("(%p)->()\n", This);
340     return E_NOTIMPL;
341 }
342
343 static HRESULT WINAPI HTMLElement2_get_onpropertychange(IHTMLElement2 *iface, VARIANT *p)
344 {
345     HTMLElement *This = HTMLELEM2_THIS(iface);
346     FIXME("(%p)->(%p)\n", This, p);
347     return E_NOTIMPL;
348 }
349
350 static HRESULT WINAPI HTMLElement2_getClientRects(IHTMLElement2 *iface, IHTMLRectCollection **pRectCol)
351 {
352     HTMLElement *This = HTMLELEM2_THIS(iface);
353     FIXME("(%p)->(%p)\n", This, pRectCol);
354     return E_NOTIMPL;
355 }
356
357 static HRESULT WINAPI HTMLElement2_getBoundingClientRect(IHTMLElement2 *iface, IHTMLRect **pRect)
358 {
359     HTMLElement *This = HTMLELEM2_THIS(iface);
360     FIXME("(%p)->(%p)\n", This, pRect);
361     return E_NOTIMPL;
362 }
363
364 static HRESULT WINAPI HTMLElement2_setExpression(IHTMLElement2 *iface, BSTR propname,
365                                                  BSTR expression, BSTR language)
366 {
367     HTMLElement *This = HTMLELEM2_THIS(iface);
368     FIXME("(%p)->(%s %s %s)\n", This, debugstr_w(propname), debugstr_w(expression),
369           debugstr_w(language));
370     return E_NOTIMPL;
371 }
372
373 static HRESULT WINAPI HTMLElement2_getExpression(IHTMLElement2 *iface, BSTR propname,
374                                                  VARIANT *expression)
375 {
376     HTMLElement *This = HTMLELEM2_THIS(iface);
377     FIXME("(%p)->(%s %p)\n", This, debugstr_w(propname), expression);
378     return E_NOTIMPL;
379 }
380
381 static HRESULT WINAPI HTMLElement2_removeExpression(IHTMLElement2 *iface, BSTR propname,
382                                                     VARIANT_BOOL *pfSuccess)
383 {
384     HTMLElement *This = HTMLELEM2_THIS(iface);
385     FIXME("(%p)->(%s %p)\n", This, debugstr_w(propname), pfSuccess);
386     return E_NOTIMPL;
387 }
388
389 static HRESULT WINAPI HTMLElement2_put_tabIndex(IHTMLElement2 *iface, short v)
390 {
391     HTMLElement *This = HTMLELEM2_THIS(iface);
392     nsIDOMNSHTMLElement *nselem;
393     nsresult nsres;
394
395     TRACE("(%p)->(%d)\n", This, v);
396
397     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
398     if(NS_FAILED(nsres)) {
399         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
400         return S_OK;
401     }
402
403     nsres = nsIDOMNSHTMLElement_SetTabIndex(nselem, v);
404     nsIDOMNSHTMLElement_Release(nselem);
405     if(NS_FAILED(nsres))
406         ERR("GetTabIndex failed: %08x\n", nsres);
407
408     return S_OK;
409 }
410
411 static HRESULT WINAPI HTMLElement2_get_tabIndex(IHTMLElement2 *iface, short *p)
412 {
413     HTMLElement *This = HTMLELEM2_THIS(iface);
414     nsIDOMNSHTMLElement *nselem;
415     PRInt32 index = 0;
416     nsresult nsres;
417
418     TRACE("(%p)->(%p)\n", This, p);
419
420     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
421     if(NS_FAILED(nsres)) {
422         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
423         return E_FAIL;
424     }
425
426     nsres = nsIDOMNSHTMLElement_GetTabIndex(nselem, &index);
427     nsIDOMNSHTMLElement_Release(nselem);
428     if(NS_FAILED(nsres)) {
429         ERR("GetTabIndex failed: %08x\n", nsres);
430         return E_FAIL;
431     }
432
433     *p = index;
434     return S_OK;
435 }
436
437 static HRESULT WINAPI HTMLElement2_focus(IHTMLElement2 *iface)
438 {
439     HTMLElement *This = HTMLELEM2_THIS(iface);
440     nsIDOMNSHTMLElement *nselem;
441     nsresult nsres;
442
443     TRACE("(%p)\n", This);
444
445     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
446     if(NS_SUCCEEDED(nsres)) {
447         nsIDOMNSHTMLElement_focus(nselem);
448         nsIDOMNSHTMLElement_Release(nselem);
449     }else {
450         ERR("Could not get nsIDOMHTMLNSElement: %08x\n", nsres);
451     }
452
453     return S_OK;
454 }
455
456 static HRESULT WINAPI HTMLElement2_put_accessKey(IHTMLElement2 *iface, BSTR v)
457 {
458     HTMLElement *This = HTMLELEM2_THIS(iface);
459     VARIANT var;
460
461     static WCHAR accessKeyW[] = {'a','c','c','e','s','s','K','e','y',0};
462
463     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
464
465     V_VT(&var) = VT_BSTR;
466     V_BSTR(&var) = v;
467     return IHTMLElement_setAttribute(HTMLELEM(This), accessKeyW, var, 0);
468 }
469
470 static HRESULT WINAPI HTMLElement2_get_accessKey(IHTMLElement2 *iface, BSTR *p)
471 {
472     HTMLElement *This = HTMLELEM2_THIS(iface);
473     FIXME("(%p)->(%p)\n", This, p);
474     return E_NOTIMPL;
475 }
476
477 static HRESULT WINAPI HTMLElement2_put_onblur(IHTMLElement2 *iface, VARIANT v)
478 {
479     HTMLElement *This = HTMLELEM2_THIS(iface);
480
481     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
482
483     return set_node_event(&This->node, EVENTID_BLUR, &v);
484 }
485
486 static HRESULT WINAPI HTMLElement2_get_onblur(IHTMLElement2 *iface, VARIANT *p)
487 {
488     HTMLElement *This = HTMLELEM2_THIS(iface);
489
490     TRACE("(%p)->(%p)\n", This, p);
491
492     return get_node_event(&This->node, EVENTID_BLUR, p);
493 }
494
495 static HRESULT WINAPI HTMLElement2_put_onfocus(IHTMLElement2 *iface, VARIANT v)
496 {
497     HTMLElement *This = HTMLELEM2_THIS(iface);
498
499     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
500
501     return set_node_event(&This->node, EVENTID_FOCUS, &v);
502 }
503
504 static HRESULT WINAPI HTMLElement2_get_onfocus(IHTMLElement2 *iface, VARIANT *p)
505 {
506     HTMLElement *This = HTMLELEM2_THIS(iface);
507
508     TRACE("(%p)->(%p)\n", This, p);
509
510     return get_node_event(&This->node, EVENTID_FOCUS, p);
511 }
512
513 static HRESULT WINAPI HTMLElement2_put_onresize(IHTMLElement2 *iface, VARIANT v)
514 {
515     HTMLElement *This = HTMLELEM2_THIS(iface);
516     FIXME("(%p)->()\n", This);
517     return E_NOTIMPL;
518 }
519
520 static HRESULT WINAPI HTMLElement2_get_onresize(IHTMLElement2 *iface, VARIANT *p)
521 {
522     HTMLElement *This = HTMLELEM2_THIS(iface);
523     FIXME("(%p)->(%p)\n", This, p);
524     return E_NOTIMPL;
525 }
526
527 static HRESULT WINAPI HTMLElement2_blur(IHTMLElement2 *iface)
528 {
529     HTMLElement *This = HTMLELEM2_THIS(iface);
530     FIXME("(%p)\n", This);
531     return E_NOTIMPL;
532 }
533
534 static HRESULT WINAPI HTMLElement2_addFilter(IHTMLElement2 *iface, IUnknown *pUnk)
535 {
536     HTMLElement *This = HTMLELEM2_THIS(iface);
537     FIXME("(%p)->(%p)\n", This, pUnk);
538     return E_NOTIMPL;
539 }
540
541 static HRESULT WINAPI HTMLElement2_removeFilter(IHTMLElement2 *iface, IUnknown *pUnk)
542 {
543     HTMLElement *This = HTMLELEM2_THIS(iface);
544     FIXME("(%p)->(%p)\n", This, pUnk);
545     return E_NOTIMPL;
546 }
547
548 static HRESULT WINAPI HTMLElement2_get_clientHeight(IHTMLElement2 *iface, LONG *p)
549 {
550     HTMLElement *This = HTMLELEM2_THIS(iface);
551     nsIDOMNSElement *nselem;
552     PRInt32 height=0;
553     nsresult nsres;
554
555     TRACE("(%p)->(%p)\n", This, p);
556
557     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
558     if(NS_SUCCEEDED(nsres)) {
559         nsIDOMNSElement_GetClientHeight(nselem, &height);
560         nsIDOMNSElement_Release(nselem);
561     }else {
562         ERR("Could not get nsIDOMNSElement: %08x\n", nsres);
563     }
564
565     *p = height;
566     return S_OK;
567 }
568
569 static HRESULT WINAPI HTMLElement2_get_clientWidth(IHTMLElement2 *iface, LONG *p)
570 {
571     HTMLElement *This = HTMLELEM2_THIS(iface);
572     nsIDOMNSElement *nselem;
573     PRInt32 width=0;
574     nsresult nsres;
575
576     TRACE("(%p)->(%p)\n", This, p);
577
578     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
579     if(NS_SUCCEEDED(nsres)) {
580         nsIDOMNSElement_GetClientWidth(nselem, &width);
581         nsIDOMNSElement_Release(nselem);
582     }else {
583         ERR("Could not get nsIDOMNSElement: %08x\n", nsres);
584     }
585
586     *p = width;
587     return S_OK;
588 }
589
590 static HRESULT WINAPI HTMLElement2_get_clientTop(IHTMLElement2 *iface, LONG *p)
591 {
592     HTMLElement *This = HTMLELEM2_THIS(iface);
593     nsIDOMNSElement *nselem;
594     PRInt32 client_top = 0;
595     nsresult nsres;
596
597     TRACE("(%p)->(%p)\n", This, p);
598
599     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
600     if(NS_SUCCEEDED(nsres)) {
601         nsres = nsIDOMNSElement_GetClientTop(nselem, &client_top);
602         nsIDOMNSElement_Release(nselem);
603         if(NS_FAILED(nsres))
604             ERR("GetScrollHeight failed: %08x\n", nsres);
605     }else {
606         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
607     }
608
609     *p = client_top;
610     TRACE("*p = %d\n", *p);
611     return S_OK;
612 }
613
614 static HRESULT WINAPI HTMLElement2_get_clientLeft(IHTMLElement2 *iface, LONG *p)
615 {
616     HTMLElement *This = HTMLELEM2_THIS(iface);
617     nsIDOMNSElement *nselem;
618     PRInt32 client_left = 0;
619     nsresult nsres;
620
621     TRACE("(%p)->(%p)\n", This, p);
622
623     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
624     if(NS_SUCCEEDED(nsres)) {
625         nsres = nsIDOMNSElement_GetClientLeft(nselem, &client_left);
626         nsIDOMNSElement_Release(nselem);
627         if(NS_FAILED(nsres))
628             ERR("GetScrollHeight failed: %08x\n", nsres);
629     }else {
630         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
631     }
632
633     *p = client_left;
634     TRACE("*p = %d\n", *p);
635     return S_OK;
636 }
637
638 static HRESULT WINAPI HTMLElement2_attachEvent(IHTMLElement2 *iface, BSTR event,
639                                                IDispatch *pDisp, VARIANT_BOOL *pfResult)
640 {
641     HTMLElement *This = HTMLELEM2_THIS(iface);
642
643     TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
644
645     return attach_event(get_node_event_target(&This->node), &This->node.doc->basedoc, event, pDisp, pfResult);
646 }
647
648 static HRESULT WINAPI HTMLElement2_detachEvent(IHTMLElement2 *iface, BSTR event, IDispatch *pDisp)
649 {
650     HTMLElement *This = HTMLELEM2_THIS(iface);
651     FIXME("(%p)->(%s %p)\n", This, debugstr_w(event), pDisp);
652     return E_NOTIMPL;
653 }
654
655 static HRESULT WINAPI HTMLElement2_get_readyState(IHTMLElement2 *iface, VARIANT *p)
656 {
657     HTMLElement *This = HTMLELEM2_THIS(iface);
658     FIXME("(%p)->(%p)\n", This, p);
659     return E_NOTIMPL;
660 }
661
662 static HRESULT WINAPI HTMLElement2_put_onreadystatechange(IHTMLElement2 *iface, VARIANT v)
663 {
664     HTMLElement *This = HTMLELEM2_THIS(iface);
665
666     FIXME("(%p)->(%s): semi-stub\n", This, debugstr_variant(&v));
667
668     return set_node_event(&This->node, EVENTID_READYSTATECHANGE, &v);
669 }
670
671 static HRESULT WINAPI HTMLElement2_get_onreadystatechange(IHTMLElement2 *iface, VARIANT *p)
672 {
673     HTMLElement *This = HTMLELEM2_THIS(iface);
674
675     TRACE("(%p)->(%p)\n", This, p);
676
677     return get_node_event(&This->node, EVENTID_READYSTATECHANGE, p);
678 }
679
680 static HRESULT WINAPI HTMLElement2_put_onrowsdelete(IHTMLElement2 *iface, VARIANT v)
681 {
682     HTMLElement *This = HTMLELEM2_THIS(iface);
683     FIXME("(%p)->()\n", This);
684     return E_NOTIMPL;
685 }
686
687 static HRESULT WINAPI HTMLElement2_get_onrowsdelete(IHTMLElement2 *iface, VARIANT *p)
688 {
689     HTMLElement *This = HTMLELEM2_THIS(iface);
690     FIXME("(%p)->(%p)\n", This, p);
691     return E_NOTIMPL;
692 }
693
694 static HRESULT WINAPI HTMLElement2_put_onrowsinserted(IHTMLElement2 *iface, VARIANT v)
695 {
696     HTMLElement *This = HTMLELEM2_THIS(iface);
697     FIXME("(%p)->()\n", This);
698     return E_NOTIMPL;
699 }
700
701 static HRESULT WINAPI HTMLElement2_get_onrowsinserted(IHTMLElement2 *iface, VARIANT *p)
702 {
703     HTMLElement *This = HTMLELEM2_THIS(iface);
704     FIXME("(%p)->(%p)\n", This, p);
705     return E_NOTIMPL;
706 }
707
708 static HRESULT WINAPI HTMLElement2_put_oncellchange(IHTMLElement2 *iface, VARIANT v)
709 {
710     HTMLElement *This = HTMLELEM2_THIS(iface);
711     FIXME("(%p)->()\n", This);
712     return E_NOTIMPL;
713 }
714
715 static HRESULT WINAPI HTMLElement2_get_oncellchange(IHTMLElement2 *iface, VARIANT *p)
716 {
717     HTMLElement *This = HTMLELEM2_THIS(iface);
718     FIXME("(%p)->(%p)\n", This, p);
719     return E_NOTIMPL;
720 }
721
722 static HRESULT WINAPI HTMLElement2_put_dir(IHTMLElement2 *iface, BSTR v)
723 {
724     HTMLElement *This = HTMLELEM2_THIS(iface);
725     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
726     return E_NOTIMPL;
727 }
728
729 static HRESULT WINAPI HTMLElement2_get_dir(IHTMLElement2 *iface, BSTR *p)
730 {
731     HTMLElement *This = HTMLELEM2_THIS(iface);
732
733     TRACE("(%p)->(%p)\n", This, p);
734
735     *p = NULL;
736
737     if(This->nselem) {
738         nsAString dir_str;
739         nsresult nsres;
740
741         nsAString_Init(&dir_str, NULL);
742
743         nsres = nsIDOMHTMLElement_GetDir(This->nselem, &dir_str);
744         if(NS_SUCCEEDED(nsres)) {
745             const PRUnichar *dir;
746             nsAString_GetData(&dir_str, &dir);
747             if(*dir)
748                 *p = SysAllocString(dir);
749         }else {
750             ERR("GetDir failed: %08x\n", nsres);
751         }
752
753         nsAString_Finish(&dir_str);
754     }
755
756     TRACE("ret %s\n", debugstr_w(*p));
757     return S_OK;
758 }
759
760 static HRESULT WINAPI HTMLElement2_createControlRange(IHTMLElement2 *iface, IDispatch **range)
761 {
762     HTMLElement *This = HTMLELEM2_THIS(iface);
763     FIXME("(%p)->(%p)\n", This, range);
764     return E_NOTIMPL;
765 }
766
767 static HRESULT WINAPI HTMLElement2_get_scrollHeight(IHTMLElement2 *iface, LONG *p)
768 {
769     HTMLElement *This = HTMLELEM2_THIS(iface);
770     nsIDOMNSElement *nselem;
771     PRInt32 height = 0;
772     nsresult nsres;
773
774     TRACE("(%p)->(%p)\n", This, p);
775
776     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
777     if(NS_SUCCEEDED(nsres)) {
778         nsres = nsIDOMNSElement_GetScrollHeight(nselem, &height);
779         nsIDOMNSElement_Release(nselem);
780         if(NS_FAILED(nsres))
781             ERR("GetScrollHeight failed: %08x\n", nsres);
782     }else {
783         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
784     }
785
786     *p = height;
787     TRACE("*p = %d\n", *p);
788
789     return S_OK;
790 }
791
792 static HRESULT WINAPI HTMLElement2_get_scrollWidth(IHTMLElement2 *iface, LONG *p)
793 {
794     HTMLElement *This = HTMLELEM2_THIS(iface);
795     nsIDOMNSElement *nselem;
796     PRInt32 width = 0;
797     nsresult nsres;
798
799     TRACE("(%p)->(%p)\n", This, p);
800
801     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
802     if(NS_SUCCEEDED(nsres)) {
803         nsres = nsIDOMNSElement_GetScrollWidth(nselem, &width);
804         nsIDOMNSElement_Release(nselem);
805         if(NS_FAILED(nsres))
806             ERR("GetScrollWidth failed: %08x\n", nsres);
807     }else {
808         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
809     }
810
811     *p = width;
812     TRACE("*p = %d\n", *p);
813
814     return S_OK;
815 }
816
817 static HRESULT WINAPI HTMLElement2_put_scrollTop(IHTMLElement2 *iface, LONG v)
818 {
819     HTMLElement *This = HTMLELEM2_THIS(iface);
820     nsIDOMNSElement *nselem;
821     nsresult nsres;
822
823     TRACE("(%p)->(%d)\n", This, v);
824
825     if(!This->nselem) {
826         FIXME("NULL nselem\n");
827         return E_NOTIMPL;
828     }
829
830     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
831     if(NS_SUCCEEDED(nsres)) {
832         nsIDOMNSElement_SetScrollTop(nselem, v);
833         nsIDOMNSElement_Release(nselem);
834     }else {
835         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
836     }
837
838     return S_OK;
839 }
840
841 static HRESULT WINAPI HTMLElement2_get_scrollTop(IHTMLElement2 *iface, LONG *p)
842 {
843     HTMLElement *This = HTMLELEM2_THIS(iface);
844     nsIDOMNSElement *nselem;
845     PRInt32 top = 0;
846     nsresult nsres;
847
848     TRACE("(%p)->(%p)\n", This, p);
849
850     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
851     if(NS_SUCCEEDED(nsres)) {
852         nsres = nsIDOMNSElement_GetScrollTop(nselem, &top);
853         nsIDOMNSElement_Release(nselem);
854         if(NS_FAILED(nsres))
855             ERR("GetScrollTop failed: %08x\n", nsres);
856     }else {
857         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
858     }
859
860     *p = top;
861     TRACE("*p = %d\n", *p);
862
863     return S_OK;
864 }
865
866 static HRESULT WINAPI HTMLElement2_put_scrollLeft(IHTMLElement2 *iface, LONG v)
867 {
868     HTMLElement *This = HTMLELEM2_THIS(iface);
869     nsIDOMNSElement *nselem;
870     nsresult nsres;
871
872     TRACE("(%p)->(%d)\n", This, v);
873
874     if(!This->nselem) {
875         FIXME("NULL nselem\n");
876         return E_NOTIMPL;
877     }
878
879     nsres = nsIDOMElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
880     if(NS_SUCCEEDED(nsres)) {
881         nsIDOMNSElement_SetScrollLeft(nselem, v);
882         nsIDOMNSElement_Release(nselem);
883     }else {
884         ERR("Could not get nsIDOMNSElement interface: %08x\n", nsres);
885     }
886
887     return S_OK;
888 }
889
890 static HRESULT WINAPI HTMLElement2_get_scrollLeft(IHTMLElement2 *iface, LONG *p)
891 {
892     HTMLElement *This = HTMLELEM2_THIS(iface);
893     nsIDOMNSElement *nselem;
894     PRInt32 left = 0;
895     nsresult nsres;
896
897     TRACE("(%p)->(%p)\n", This, p);
898
899     if(!p)
900         return E_INVALIDARG;
901
902     if(!This->nselem)
903     {
904         FIXME("NULL nselem\n");
905         return E_NOTIMPL;
906     }
907
908     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSElement, (void**)&nselem);
909     if(NS_SUCCEEDED(nsres))
910     {
911         nsres = nsIDOMNSElement_GetScrollLeft(nselem, &left);
912         nsIDOMNSElement_Release(nselem);
913         if(NS_FAILED(nsres))
914             left = 0;
915     }
916
917     *p = left;
918     TRACE("*p = %d\n", *p);
919
920     return S_OK;
921 }
922
923 static HRESULT WINAPI HTMLElement2_clearAttributes(IHTMLElement2 *iface)
924 {
925     HTMLElement *This = HTMLELEM2_THIS(iface);
926     FIXME("(%p)\n", This);
927     return E_NOTIMPL;
928 }
929
930 static HRESULT WINAPI HTMLElement2_mergeAttributes(IHTMLElement2 *iface, IHTMLElement *mergeThis)
931 {
932     HTMLElement *This = HTMLELEM2_THIS(iface);
933     FIXME("(%p)->(%p)\n", This, mergeThis);
934     return E_NOTIMPL;
935 }
936
937 static HRESULT WINAPI HTMLElement2_put_oncontextmenu(IHTMLElement2 *iface, VARIANT v)
938 {
939     HTMLElement *This = HTMLELEM2_THIS(iface);
940     FIXME("(%p)->()\n", This);
941     return E_NOTIMPL;
942 }
943
944 static HRESULT WINAPI HTMLElement2_get_oncontextmenu(IHTMLElement2 *iface, VARIANT *p)
945 {
946     HTMLElement *This = HTMLELEM2_THIS(iface);
947     FIXME("(%p)->(%p)\n", This, p);
948     return E_NOTIMPL;
949 }
950
951 static HRESULT WINAPI HTMLElement2_insertAdjecentElement(IHTMLElement2 *iface, BSTR where,
952         IHTMLElement *insertedElement, IHTMLElement **inserted)
953 {
954     HTMLElement *This = HTMLELEM2_THIS(iface);
955     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(where), insertedElement, inserted);
956     return E_NOTIMPL;
957 }
958
959 static HRESULT WINAPI HTMLElement2_applyElement(IHTMLElement2 *iface, IHTMLElement *apply,
960                                                 BSTR where, IHTMLElement **applied)
961 {
962     HTMLElement *This = HTMLELEM2_THIS(iface);
963     FIXME("(%p)->(%p %s %p)\n", This, apply, debugstr_w(where), applied);
964     return E_NOTIMPL;
965 }
966
967 static HRESULT WINAPI HTMLElement2_getAdjecentText(IHTMLElement2 *iface, BSTR where, BSTR *text)
968 {
969     HTMLElement *This = HTMLELEM2_THIS(iface);
970     FIXME("(%p)->(%s %p)\n", This, debugstr_w(where), text);
971     return E_NOTIMPL;
972 }
973
974 static HRESULT WINAPI HTMLElement2_replaceAdjecentText(IHTMLElement2 *iface, BSTR where,
975                                                        BSTR newText, BSTR *oldText)
976 {
977     HTMLElement *This = HTMLELEM2_THIS(iface);
978     FIXME("(%p)->(%s %s %p)\n", This, debugstr_w(where), debugstr_w(newText), oldText);
979     return E_NOTIMPL;
980 }
981
982 static HRESULT WINAPI HTMLElement2_get_canHandleChildren(IHTMLElement2 *iface, VARIANT_BOOL *p)
983 {
984     HTMLElement *This = HTMLELEM2_THIS(iface);
985     FIXME("(%p)->(%p)\n", This, p);
986     return E_NOTIMPL;
987 }
988
989 static HRESULT WINAPI HTMLElement2_addBehavior(IHTMLElement2 *iface, BSTR bstrUrl,
990                                                VARIANT *pvarFactory, LONG *pCookie)
991 {
992     HTMLElement *This = HTMLELEM2_THIS(iface);
993     FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(bstrUrl), pvarFactory, pCookie);
994     return E_NOTIMPL;
995 }
996
997 static HRESULT WINAPI HTMLElement2_removeBehavior(IHTMLElement2 *iface, LONG cookie,
998                                                   VARIANT_BOOL *pfResult)
999 {
1000     HTMLElement *This = HTMLELEM2_THIS(iface);
1001     FIXME("(%p)->(%d %p)\n", This, cookie, pfResult);
1002     return E_NOTIMPL;
1003 }
1004
1005 static HRESULT WINAPI HTMLElement2_get_runtimeStyle(IHTMLElement2 *iface, IHTMLStyle **p)
1006 {
1007     HTMLElement *This = HTMLELEM2_THIS(iface);
1008     FIXME("(%p)->(%p)\n", This, p);
1009     return E_NOTIMPL;
1010 }
1011
1012 static HRESULT WINAPI HTMLElement2_get_behaviorUrns(IHTMLElement2 *iface, IDispatch **p)
1013 {
1014     HTMLElement *This = HTMLELEM2_THIS(iface);
1015     FIXME("(%p)->(%p)\n", This, p);
1016     return E_NOTIMPL;
1017 }
1018
1019 static HRESULT WINAPI HTMLElement2_put_tagUrn(IHTMLElement2 *iface, BSTR v)
1020 {
1021     HTMLElement *This = HTMLELEM2_THIS(iface);
1022     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
1023     return E_NOTIMPL;
1024 }
1025
1026 static HRESULT WINAPI HTMLElement2_get_tagUrn(IHTMLElement2 *iface, BSTR *p)
1027 {
1028     HTMLElement *This = HTMLELEM2_THIS(iface);
1029     FIXME("(%p)->(%p)\n", This, p);
1030     return E_NOTIMPL;
1031 }
1032
1033 static HRESULT WINAPI HTMLElement2_put_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT vv)
1034 {
1035     HTMLElement *This = HTMLELEM2_THIS(iface);
1036     FIXME("(%p)->()\n", This);
1037     return E_NOTIMPL;
1038 }
1039
1040 static HRESULT WINAPI HTMLElement2_get_onbeforeeditfocus(IHTMLElement2 *iface, VARIANT *p)
1041 {
1042     HTMLElement *This = HTMLELEM2_THIS(iface);
1043     FIXME("(%p)->(%p)\n", This, p);
1044     return E_NOTIMPL;
1045 }
1046
1047 static HRESULT WINAPI HTMLElement2_get_readyStateValue(IHTMLElement2 *iface, LONG *p)
1048 {
1049     HTMLElement *This = HTMLELEM2_THIS(iface);
1050     FIXME("(%p)->(%p)\n", This, p);
1051     return E_NOTIMPL;
1052 }
1053
1054 static HRESULT WINAPI HTMLElement2_getElementsByTagName(IHTMLElement2 *iface, BSTR v,
1055                                                        IHTMLElementCollection **pelColl)
1056 {
1057     HTMLElement *This = HTMLELEM2_THIS(iface);
1058     nsIDOMNodeList *nslist;
1059     nsAString tag_str;
1060     nsresult nsres;
1061
1062     TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pelColl);
1063
1064     nsAString_Init(&tag_str, v);
1065     nsres = nsIDOMHTMLElement_GetElementsByTagName(This->nselem, &tag_str, &nslist);
1066     nsAString_Finish(&tag_str);
1067     if(NS_FAILED(nsres)) {
1068         ERR("GetElementByTagName failed: %08x\n", nsres);
1069         return E_FAIL;
1070     }
1071
1072     *pelColl = create_collection_from_nodelist(This->node.doc, (IUnknown*)HTMLELEM(This), nslist);
1073     nsIDOMNodeList_Release(nslist);
1074     return S_OK;
1075 }
1076
1077 #undef HTMLELEM2_THIS
1078
1079 static const IHTMLElement2Vtbl HTMLElement2Vtbl = {
1080     HTMLElement2_QueryInterface,
1081     HTMLElement2_AddRef,
1082     HTMLElement2_Release,
1083     HTMLElement2_GetTypeInfoCount,
1084     HTMLElement2_GetTypeInfo,
1085     HTMLElement2_GetIDsOfNames,
1086     HTMLElement2_Invoke,
1087     HTMLElement2_get_scopeName,
1088     HTMLElement2_setCapture,
1089     HTMLElement2_releaseCapture,
1090     HTMLElement2_put_onlosecapture,
1091     HTMLElement2_get_onlosecapture,
1092     HTMLElement2_componentFromPoint,
1093     HTMLElement2_doScroll,
1094     HTMLElement2_put_onscroll,
1095     HTMLElement2_get_onscroll,
1096     HTMLElement2_put_ondrag,
1097     HTMLElement2_get_ondrag,
1098     HTMLElement2_put_ondragend,
1099     HTMLElement2_get_ondragend,
1100     HTMLElement2_put_ondragenter,
1101     HTMLElement2_get_ondragenter,
1102     HTMLElement2_put_ondragover,
1103     HTMLElement2_get_ondragover,
1104     HTMLElement2_put_ondragleave,
1105     HTMLElement2_get_ondragleave,
1106     HTMLElement2_put_ondrop,
1107     HTMLElement2_get_ondrop,
1108     HTMLElement2_put_onbeforecut,
1109     HTMLElement2_get_onbeforecut,
1110     HTMLElement2_put_oncut,
1111     HTMLElement2_get_oncut,
1112     HTMLElement2_put_onbeforecopy,
1113     HTMLElement2_get_onbeforecopy,
1114     HTMLElement2_put_oncopy,
1115     HTMLElement2_get_oncopy,
1116     HTMLElement2_put_onbeforepaste,
1117     HTMLElement2_get_onbeforepaste,
1118     HTMLElement2_put_onpaste,
1119     HTMLElement2_get_onpaste,
1120     HTMLElement2_get_currentStyle,
1121     HTMLElement2_put_onpropertychange,
1122     HTMLElement2_get_onpropertychange,
1123     HTMLElement2_getClientRects,
1124     HTMLElement2_getBoundingClientRect,
1125     HTMLElement2_setExpression,
1126     HTMLElement2_getExpression,
1127     HTMLElement2_removeExpression,
1128     HTMLElement2_put_tabIndex,
1129     HTMLElement2_get_tabIndex,
1130     HTMLElement2_focus,
1131     HTMLElement2_put_accessKey,
1132     HTMLElement2_get_accessKey,
1133     HTMLElement2_put_onblur,
1134     HTMLElement2_get_onblur,
1135     HTMLElement2_put_onfocus,
1136     HTMLElement2_get_onfocus,
1137     HTMLElement2_put_onresize,
1138     HTMLElement2_get_onresize,
1139     HTMLElement2_blur,
1140     HTMLElement2_addFilter,
1141     HTMLElement2_removeFilter,
1142     HTMLElement2_get_clientHeight,
1143     HTMLElement2_get_clientWidth,
1144     HTMLElement2_get_clientTop,
1145     HTMLElement2_get_clientLeft,
1146     HTMLElement2_attachEvent,
1147     HTMLElement2_detachEvent,
1148     HTMLElement2_get_readyState,
1149     HTMLElement2_put_onreadystatechange,
1150     HTMLElement2_get_onreadystatechange,
1151     HTMLElement2_put_onrowsdelete,
1152     HTMLElement2_get_onrowsdelete,
1153     HTMLElement2_put_onrowsinserted,
1154     HTMLElement2_get_onrowsinserted,
1155     HTMLElement2_put_oncellchange,
1156     HTMLElement2_get_oncellchange,
1157     HTMLElement2_put_dir,
1158     HTMLElement2_get_dir,
1159     HTMLElement2_createControlRange,
1160     HTMLElement2_get_scrollHeight,
1161     HTMLElement2_get_scrollWidth,
1162     HTMLElement2_put_scrollTop,
1163     HTMLElement2_get_scrollTop,
1164     HTMLElement2_put_scrollLeft,
1165     HTMLElement2_get_scrollLeft,
1166     HTMLElement2_clearAttributes,
1167     HTMLElement2_mergeAttributes,
1168     HTMLElement2_put_oncontextmenu,
1169     HTMLElement2_get_oncontextmenu,
1170     HTMLElement2_insertAdjecentElement,
1171     HTMLElement2_applyElement,
1172     HTMLElement2_getAdjecentText,
1173     HTMLElement2_replaceAdjecentText,
1174     HTMLElement2_get_canHandleChildren,
1175     HTMLElement2_addBehavior,
1176     HTMLElement2_removeBehavior,
1177     HTMLElement2_get_runtimeStyle,
1178     HTMLElement2_get_behaviorUrns,
1179     HTMLElement2_put_tagUrn,
1180     HTMLElement2_get_tagUrn,
1181     HTMLElement2_put_onbeforeeditfocus,
1182     HTMLElement2_get_onbeforeeditfocus,
1183     HTMLElement2_get_readyStateValue,
1184     HTMLElement2_getElementsByTagName,
1185 };
1186
1187 void HTMLElement2_Init(HTMLElement *This)
1188 {
1189     This->lpHTMLElement2Vtbl = &HTMLElement2Vtbl;
1190 }