Warnings
[mono.git] / mcs / class / System.Web / System.Web.UI / HtmlTextWriter.cs
1 /*      System.Web.UI\r
2 *       Authors\r
3 *               Leen Toelen (toelen@hotmail.com)\r
4 */\r
5 \r
6 using System;\r
7 using System.IO;\r
8 using System.Collections;\r
9 using System.Web;\r
10 using System.Web.UI;\r
11 \r
12 namespace System.Web.UI{\r
13 \r
14 public class HtmlTextWriter : System.IO.TextWriter {\r
15 \r
16 static HtmlTextWriter(){\r
17         HtmlTextWriter._tagKeyLookupTable = new Hashtable(97);\r
18         HtmlTextWriter._tagNameLookupArray = new TagInformation[97];\r
19         HtmlTextWriter.RegisterTag("", HtmlTextWriterTag.Unknown, TagType.Other);\r
20         HtmlTextWriter.RegisterTag("a", HtmlTextWriterTag.A, TagType.Inline);\r
21         HtmlTextWriter.RegisterTag("acronym", HtmlTextWriterTag.Acronym, TagType.Inline);\r
22         HtmlTextWriter.RegisterTag("address", HtmlTextWriterTag.Address, TagType.Other);\r
23         HtmlTextWriter.RegisterTag("area", HtmlTextWriterTag.Area, TagType.Other);\r
24         HtmlTextWriter.RegisterTag("b", HtmlTextWriterTag.B, TagType.Inline);\r
25         HtmlTextWriter.RegisterTag("base", HtmlTextWriterTag.Base, TagType.NonClosing);\r
26         HtmlTextWriter.RegisterTag("basefont", HtmlTextWriterTag.Basefont, TagType.NonClosing);\r
27         HtmlTextWriter.RegisterTag("bdo", HtmlTextWriterTag.Bdo, TagType.Inline);\r
28         HtmlTextWriter.RegisterTag("bgsound", HtmlTextWriterTag.Bgsound, TagType.NonClosing);\r
29         HtmlTextWriter.RegisterTag("big", HtmlTextWriterTag.Big, TagType.Inline);\r
30         HtmlTextWriter.RegisterTag("blockquote", HtmlTextWriterTag.Blockquote, TagType.Other);\r
31         HtmlTextWriter.RegisterTag("body", HtmlTextWriterTag.Body, TagType.Other);\r
32         HtmlTextWriter.RegisterTag("br", HtmlTextWriterTag.Br, TagType.Other);\r
33         HtmlTextWriter.RegisterTag("button", HtmlTextWriterTag.Button, TagType.Inline);\r
34         HtmlTextWriter.RegisterTag("caption", HtmlTextWriterTag.Caption, TagType.Other);\r
35         HtmlTextWriter.RegisterTag("center", HtmlTextWriterTag.Center, TagType.Other);\r
36         HtmlTextWriter.RegisterTag("cite", HtmlTextWriterTag.Cite, TagType.Inline);\r
37         HtmlTextWriter.RegisterTag("code", HtmlTextWriterTag.Code, TagType.Inline);\r
38         HtmlTextWriter.RegisterTag("col", HtmlTextWriterTag.Col, TagType.NonClosing);\r
39         HtmlTextWriter.RegisterTag("colgroup", HtmlTextWriterTag.Colgroup, TagType.Other);\r
40         HtmlTextWriter.RegisterTag("del", HtmlTextWriterTag.Del, TagType.Inline);\r
41         HtmlTextWriter.RegisterTag("dd", HtmlTextWriterTag.Dd, TagType.Inline);\r
42         HtmlTextWriter.RegisterTag("dfn", HtmlTextWriterTag.Dfn, TagType.Inline);\r
43         HtmlTextWriter.RegisterTag("dir", HtmlTextWriterTag.Dir, TagType.Other);\r
44         HtmlTextWriter.RegisterTag("div", HtmlTextWriterTag.Div, TagType.Other);\r
45         HtmlTextWriter.RegisterTag("dl", HtmlTextWriterTag.Dl, TagType.Other);\r
46         HtmlTextWriter.RegisterTag("dt", HtmlTextWriterTag.Dt, TagType.Inline);\r
47         HtmlTextWriter.RegisterTag("em", HtmlTextWriterTag.Em, TagType.Inline);\r
48         HtmlTextWriter.RegisterTag("embed", HtmlTextWriterTag.Embed, TagType.NonClosing);\r
49         HtmlTextWriter.RegisterTag("fieldset", HtmlTextWriterTag.Fieldset, TagType.Other);\r
50         HtmlTextWriter.RegisterTag("font", HtmlTextWriterTag.Font, TagType.Inline);\r
51         HtmlTextWriter.RegisterTag("form", HtmlTextWriterTag.Form, TagType.Other);\r
52         HtmlTextWriter.RegisterTag("frame", HtmlTextWriterTag.Frame, TagType.NonClosing);\r
53         HtmlTextWriter.RegisterTag("frameset", HtmlTextWriterTag.Frameset, TagType.Other);\r
54         HtmlTextWriter.RegisterTag("h1", HtmlTextWriterTag.H1, TagType.Other);\r
55         HtmlTextWriter.RegisterTag("h2", HtmlTextWriterTag.H2, TagType.Other);\r
56         HtmlTextWriter.RegisterTag("h3", HtmlTextWriterTag.H3, TagType.Other);\r
57         HtmlTextWriter.RegisterTag("h4", HtmlTextWriterTag.H4, TagType.Other);\r
58         HtmlTextWriter.RegisterTag("h5", HtmlTextWriterTag.H5, TagType.Other);\r
59         HtmlTextWriter.RegisterTag("h6", HtmlTextWriterTag.H6, TagType.Other);\r
60         HtmlTextWriter.RegisterTag("head", HtmlTextWriterTag.Head, TagType.Other);\r
61         HtmlTextWriter.RegisterTag("hr", HtmlTextWriterTag.Hr, TagType.NonClosing);\r
62         HtmlTextWriter.RegisterTag("html", HtmlTextWriterTag.Html, TagType.Other);\r
63         HtmlTextWriter.RegisterTag("i", HtmlTextWriterTag.I, TagType.Inline);\r
64         HtmlTextWriter.RegisterTag("iframe", HtmlTextWriterTag.Iframe, TagType.Other);\r
65         HtmlTextWriter.RegisterTag("img", HtmlTextWriterTag.Img, TagType.NonClosing);\r
66         HtmlTextWriter.RegisterTag("input", HtmlTextWriterTag.Input, TagType.NonClosing);\r
67         HtmlTextWriter.RegisterTag("ins", HtmlTextWriterTag.Ins, TagType.Inline);\r
68         HtmlTextWriter.RegisterTag("isindex", HtmlTextWriterTag.Isindex, TagType.NonClosing);\r
69         HtmlTextWriter.RegisterTag("kbd", HtmlTextWriterTag.Kbd, TagType.Inline);\r
70         HtmlTextWriter.RegisterTag("label", HtmlTextWriterTag.Label, TagType.Inline);\r
71         HtmlTextWriter.RegisterTag("legend", HtmlTextWriterTag.Legend, TagType.Other);\r
72         HtmlTextWriter.RegisterTag("li", HtmlTextWriterTag.Li, TagType.Inline);\r
73         HtmlTextWriter.RegisterTag("link", HtmlTextWriterTag.Link, TagType.NonClosing);\r
74         HtmlTextWriter.RegisterTag("map", HtmlTextWriterTag.Map, TagType.Other);\r
75         HtmlTextWriter.RegisterTag("marquee", HtmlTextWriterTag.Marquee, TagType.Other);\r
76         HtmlTextWriter.RegisterTag("menu", HtmlTextWriterTag.Menu, TagType.Other);\r
77         HtmlTextWriter.RegisterTag("meta", HtmlTextWriterTag.Meta, TagType.NonClosing);\r
78         HtmlTextWriter.RegisterTag("nobr", HtmlTextWriterTag.Nobr, TagType.Inline);\r
79         HtmlTextWriter.RegisterTag("noframes", HtmlTextWriterTag.Noframes, TagType.Other);\r
80         HtmlTextWriter.RegisterTag("noscript", HtmlTextWriterTag.Noscript, TagType.Other);\r
81         HtmlTextWriter.RegisterTag("object", HtmlTextWriterTag.Object, TagType.Other);\r
82         HtmlTextWriter.RegisterTag("ol", HtmlTextWriterTag.Ol, TagType.Other);\r
83         HtmlTextWriter.RegisterTag("option", HtmlTextWriterTag.Option, TagType.Other);\r
84         HtmlTextWriter.RegisterTag("p", HtmlTextWriterTag.P, TagType.Inline);\r
85         HtmlTextWriter.RegisterTag("param", HtmlTextWriterTag.Param, TagType.Other);\r
86         HtmlTextWriter.RegisterTag("pre", HtmlTextWriterTag.Pre, TagType.Other);\r
87         HtmlTextWriter.RegisterTag("q", HtmlTextWriterTag.Q, TagType.Inline);\r
88         HtmlTextWriter.RegisterTag("rt", HtmlTextWriterTag.Rt, TagType.Other);\r
89         HtmlTextWriter.RegisterTag("ruby", HtmlTextWriterTag.Ruby, TagType.Other);\r
90         HtmlTextWriter.RegisterTag("s", HtmlTextWriterTag.S, TagType.Inline);\r
91         HtmlTextWriter.RegisterTag("samp", HtmlTextWriterTag.Samp, TagType.Inline);\r
92         HtmlTextWriter.RegisterTag("script", HtmlTextWriterTag.Script, TagType.Other);\r
93         HtmlTextWriter.RegisterTag("select", HtmlTextWriterTag.Select, TagType.Other);\r
94         HtmlTextWriter.RegisterTag("small", HtmlTextWriterTag.Small, TagType.Other);\r
95         HtmlTextWriter.RegisterTag("span", HtmlTextWriterTag.Span, TagType.Inline);\r
96         HtmlTextWriter.RegisterTag("strike", HtmlTextWriterTag.Strike, TagType.Inline);\r
97         HtmlTextWriter.RegisterTag("strong", HtmlTextWriterTag.Strong, TagType.Inline);\r
98         HtmlTextWriter.RegisterTag("style", HtmlTextWriterTag.Style, TagType.Other);\r
99         HtmlTextWriter.RegisterTag("sub", HtmlTextWriterTag.Sub, TagType.Inline);\r
100         HtmlTextWriter.RegisterTag("sup", HtmlTextWriterTag.Sup, TagType.Inline);\r
101         HtmlTextWriter.RegisterTag("table", HtmlTextWriterTag.Table, TagType.Other);\r
102         HtmlTextWriter.RegisterTag("tbody", HtmlTextWriterTag.Tbody, TagType.Other);\r
103         HtmlTextWriter.RegisterTag("td", HtmlTextWriterTag.Td, TagType.Inline);\r
104         HtmlTextWriter.RegisterTag("textarea", HtmlTextWriterTag.Textarea, TagType.Inline);\r
105         HtmlTextWriter.RegisterTag("tfoot", HtmlTextWriterTag.Tfoot, TagType.Other);\r
106         HtmlTextWriter.RegisterTag("th", HtmlTextWriterTag.Th, TagType.Inline);\r
107         HtmlTextWriter.RegisterTag("thead", HtmlTextWriterTag.Thead, TagType.Other);\r
108         HtmlTextWriter.RegisterTag("title", HtmlTextWriterTag.Title, TagType.Other);\r
109         HtmlTextWriter.RegisterTag("tr", HtmlTextWriterTag.Tr, TagType.Other);\r
110         HtmlTextWriter.RegisterTag("tt", HtmlTextWriterTag.Tt, TagType.Inline);\r
111         HtmlTextWriter.RegisterTag("u", HtmlTextWriterTag.U, TagType.Inline);\r
112         HtmlTextWriter.RegisterTag("ul", HtmlTextWriterTag.Ul, TagType.Other);\r
113         HtmlTextWriter.RegisterTag("var", HtmlTextWriterTag.Var, TagType.Inline);\r
114         HtmlTextWriter.RegisterTag("wbr", HtmlTextWriterTag.Wbr, TagType.NonClosing);\r
115         HtmlTextWriter.RegisterTag("xml", HtmlTextWriterTag.Xml, TagType.Other);\r
116 \r
117         HtmlTextWriter._attrKeyLookupTable = new Hashtable(40);\r
118         HtmlTextWriter._attrNameLookupArray = new AttributeInformation[40];\r
119         HtmlTextWriter.RegisterAttribute("accesskey", HtmlTextWriterAttribute.Accesskey, true);\r
120         HtmlTextWriter.RegisterAttribute("align", HtmlTextWriterAttribute.Align, false);\r
121         HtmlTextWriter.RegisterAttribute("alt", HtmlTextWriterAttribute.Alt, true);\r
122         HtmlTextWriter.RegisterAttribute("background", HtmlTextWriterAttribute.Background, true);\r
123         HtmlTextWriter.RegisterAttribute("bgcolor", HtmlTextWriterAttribute.Bgcolor, false);\r
124         HtmlTextWriter.RegisterAttribute("border", HtmlTextWriterAttribute.Border, false);\r
125         HtmlTextWriter.RegisterAttribute("bordercolor", HtmlTextWriterAttribute.Bordercolor, false);\r
126         HtmlTextWriter.RegisterAttribute("cellpadding", HtmlTextWriterAttribute.Cellpadding, false);\r
127         HtmlTextWriter.RegisterAttribute("cellspacing", HtmlTextWriterAttribute.Cellspacing, false);\r
128         HtmlTextWriter.RegisterAttribute("checked", HtmlTextWriterAttribute.Checked, false);\r
129         HtmlTextWriter.RegisterAttribute("class", HtmlTextWriterAttribute.Class, true);\r
130         HtmlTextWriter.RegisterAttribute("cols", HtmlTextWriterAttribute.Cols, false);\r
131         HtmlTextWriter.RegisterAttribute("colspan", HtmlTextWriterAttribute.Colspan, false);\r
132         HtmlTextWriter.RegisterAttribute("disabled", HtmlTextWriterAttribute.Disabled, false);\r
133         HtmlTextWriter.RegisterAttribute("for", HtmlTextWriterAttribute.For, false);\r
134         HtmlTextWriter.RegisterAttribute("height", HtmlTextWriterAttribute.Height, false);\r
135         HtmlTextWriter.RegisterAttribute("href", HtmlTextWriterAttribute.Href, true);\r
136         HtmlTextWriter.RegisterAttribute("id", HtmlTextWriterAttribute.Id, false);\r
137         HtmlTextWriter.RegisterAttribute("maxlength", HtmlTextWriterAttribute.Maxlength, false);\r
138         HtmlTextWriter.RegisterAttribute("multiple", HtmlTextWriterAttribute.Multiple, false);\r
139         HtmlTextWriter.RegisterAttribute("name", HtmlTextWriterAttribute.Name, false);\r
140         HtmlTextWriter.RegisterAttribute("nowrap", HtmlTextWriterAttribute.Nowrap, false);\r
141         HtmlTextWriter.RegisterAttribute("onchange", HtmlTextWriterAttribute.Onchange, true);\r
142         HtmlTextWriter.RegisterAttribute("onclick", HtmlTextWriterAttribute.Onclick, true);\r
143         HtmlTextWriter.RegisterAttribute("readonly", HtmlTextWriterAttribute.ReadOnly, false);\r
144         HtmlTextWriter.RegisterAttribute("rows", HtmlTextWriterAttribute.Rows, false);\r
145         HtmlTextWriter.RegisterAttribute("rowspan", HtmlTextWriterAttribute.Rowspan, false);\r
146         HtmlTextWriter.RegisterAttribute("rules", HtmlTextWriterAttribute.Rules, false);\r
147         HtmlTextWriter.RegisterAttribute("selected", HtmlTextWriterAttribute.Selected, false);\r
148         HtmlTextWriter.RegisterAttribute("size", HtmlTextWriterAttribute.Size, false);\r
149         HtmlTextWriter.RegisterAttribute("src", HtmlTextWriterAttribute.Src, true);\r
150         HtmlTextWriter.RegisterAttribute("style", HtmlTextWriterAttribute.Style, false);\r
151         HtmlTextWriter.RegisterAttribute("tabindex", HtmlTextWriterAttribute.Tabindex, false);\r
152         HtmlTextWriter.RegisterAttribute("target", HtmlTextWriterAttribute.Target, false);\r
153         HtmlTextWriter.RegisterAttribute("title", HtmlTextWriterAttribute.Title, true);\r
154         HtmlTextWriter.RegisterAttribute("type", HtmlTextWriterAttribute.Type, false);\r
155         HtmlTextWriter.RegisterAttribute("valign", HtmlTextWriterAttribute.Valign, false);\r
156         HtmlTextWriter.RegisterAttribute("value", HtmlTextWriterAttribute.Value, true);\r
157         HtmlTextWriter.RegisterAttribute("width", HtmlTextWriterAttribute.Width, false);\r
158         HtmlTextWriter.RegisterAttribute("wrap", HtmlTextWriterAttribute.Wrap, false);\r
159 \r
160         HtmlTextWriter._styleKeyLookupTable = new Hashtable(14);\r
161         HtmlTextWriter._styleNameLookupArray = new String[14];\r
162         HtmlTextWriter.RegisterStyle("background-color", HtmlTextWriterStyle.BackgroundColor);\r
163         HtmlTextWriter.RegisterStyle("background-image", HtmlTextWriterStyle.BackgroundImage);\r
164         HtmlTextWriter.RegisterStyle("border-collapse", HtmlTextWriterStyle.BorderCollapse);\r
165         HtmlTextWriter.RegisterStyle("border-color", HtmlTextWriterStyle.BorderColor);\r
166         HtmlTextWriter.RegisterStyle("border-style", HtmlTextWriterStyle.BorderStyle);\r
167         HtmlTextWriter.RegisterStyle("border-width", HtmlTextWriterStyle.BorderWidth);\r
168         HtmlTextWriter.RegisterStyle("color", HtmlTextWriterStyle.Color);\r
169         HtmlTextWriter.RegisterStyle("font-family", HtmlTextWriterStyle.FontFamily);\r
170         HtmlTextWriter.RegisterStyle("font-size", HtmlTextWriterStyle.FontSize);\r
171         HtmlTextWriter.RegisterStyle("font-style", HtmlTextWriterStyle.FontStyle);\r
172         HtmlTextWriter.RegisterStyle("font-weight", HtmlTextWriterStyle.FontWeight);\r
173         HtmlTextWriter.RegisterStyle("height", HtmlTextWriterStyle.Height);\r
174         HtmlTextWriter.RegisterStyle("text-decoration", HtmlTextWriterStyle.TextDecoration);\r
175         HtmlTextWriter.RegisterStyle("width", HtmlTextWriterStyle.Width);\r
176 }\r
177 \r
178 public HtmlTextWriter(TextWriter writer):this(writer, " "){}\r
179 \r
180 public HtmlTextWriter(TextWriter writer, string tabString) : base() {\r
181         this.writer = writer;\r
182         this.tabString = tabString;\r
183         indentLevel = 0;\r
184         tabsPending = false;\r
185         _httpWriter = writer as HttpWriter;\r
186         _isDescendant = GetType() == typeof(HtmlTextWriter) == false;\r
187         _attrList = new RenderAttribute[20];\r
188         _attrCount = 0;\r
189         _styleList = new RenderStyle[20];\r
190         _styleCount = 0;\r
191         _endTags = new TagStackEntry[16];\r
192         _endTagCount = 0;\r
193         _inlineCount = 0;\r
194 }\r
195 \r
196 public virtual void AddAttribute(HtmlTextWriterAttribute key, string value){\r
197         if ((int) key >= 0 && (int) key < HtmlTextWriter._attrNameLookupArray.Length) {\r
198                 AttributeInformation attrInfo = HtmlTextWriter._attrNameLookupArray[(int) key];\r
199                 AddAttribute(attrInfo.name, value, key, attrInfo.encode);\r
200         }\r
201 }\r
202 \r
203 public virtual void AddAttribute(HtmlTextWriterAttribute key, string value, bool fEncode){\r
204         if ((int) key >= 0 && (int) key < HtmlTextWriter._attrNameLookupArray.Length) {\r
205                 AddAttribute(HtmlTextWriter._attrNameLookupArray[(int) key].name, value, key, fEncode);\r
206         }\r
207 }\r
208 \r
209 public virtual void AddAttribute(string name, string value){\r
210         HtmlTextWriterAttribute attr = GetAttributeKey(name);\r
211         value = EncodeAttributeValue(GetAttributeKey(name), value);\r
212         AddAttribute(name, value, attr);\r
213 }\r
214 \r
215 public virtual void AddAttribute(string name, string value, bool fEndode){\r
216         value = EncodeAttributeValue(value, fEndode);\r
217         AddAttribute(name, value, GetAttributeKey(name));\r
218 }\r
219 \r
220 protected virtual void AddAttribute(string name, string value, HtmlTextWriterAttribute key){\r
221         AddAttribute(name, value, key, false);\r
222 }\r
223 \r
224 private void AddAttribute(string name, string value, HtmlTextWriterAttribute key, bool encode){\r
225         if (_attrCount >= (int) _attrList.Length) {\r
226                 RenderAttribute[] rAttrArr = new RenderAttribute[_attrList.Length * 2];\r
227                 System.Array.Copy(_attrList, rAttrArr, (int) _attrList.Length);\r
228                 _attrList = rAttrArr;\r
229         }\r
230         RenderAttribute rAttr;\r
231         rAttr.name = name;\r
232         rAttr.value = value;\r
233         rAttr.key = key;\r
234         rAttr.encode = encode;\r
235         _attrList [_attrCount++] = rAttr;\r
236 }\r
237 \r
238 public virtual void AddStyleAttribute(HtmlTextWriterStyle key, string value){\r
239         AddStyleAttribute(GetStyleName(key), value, key);\r
240 }\r
241 \r
242 public virtual void AddStyleAttribute(string name, string value){\r
243         AddStyleAttribute(name, value, GetStyleKey(name));\r
244 }\r
245 \r
246 protected virtual void AddStyleAttribute(string name, string value, HtmlTextWriterStyle key){\r
247         if (_styleCount >= (int) _styleList.Length) {\r
248                 RenderStyle[] rAttrArr = new RenderStyle[_styleList.Length * 2];\r
249                 System.Array.Copy(_styleList, rAttrArr, (int) _styleList.Length);\r
250                 _styleList = rAttrArr;\r
251         }\r
252         RenderStyle rAttr;\r
253         rAttr.name = name;\r
254         rAttr.value = value;\r
255         rAttr.key = key;\r
256         _styleList [_styleCount++] = rAttr;\r
257 }\r
258 \r
259 public override void Close(){\r
260         writer.Close();\r
261 }\r
262 \r
263 protected virtual string EncodeAttributeValue(HtmlTextWriterAttribute attrKey, string value){\r
264         bool valid = true;\r
265         if (0 <= (int) attrKey && (int) attrKey < HtmlTextWriter._attrNameLookupArray.Length)\r
266                 valid = HtmlTextWriter._attrNameLookupArray[(int) attrKey].encode;\r
267         return EncodeAttributeValue(value, valid);\r
268 }\r
269 \r
270 protected string EncodeAttributeValue(string value, bool fEncode){\r
271         if (value == null)\r
272                 return null;\r
273         if (!(fEncode))\r
274                 return value;\r
275         return System.Web.HttpUtility.HtmlAttributeEncode(value);\r
276 }\r
277 \r
278 protected string EncodeUrl(string url){\r
279         if (url.IndexOf(SpaceChar) < 0)\r
280                 return url;\r
281         System.Text.StringBuilder sb = new System.Text.StringBuilder();\r
282         for(int i=0; i <= url.Length; i++){\r
283                 char temp = url[i];\r
284                 if (temp != 32)\r
285                         sb.Append(temp);\r
286                 else\r
287                         sb.Append("%20");\r
288         }\r
289         return sb.ToString();\r
290 }\r
291 \r
292 protected virtual void FilterAttributes(){\r
293         int count = 0;\r
294         for(int i=0; i < _styleCount; i++){\r
295                 RenderStyle rStyle = _styleList[i];\r
296                 if (OnStyleAttributeRender(rStyle.name, rStyle.value, rStyle.key)) {\r
297                         count++;\r
298                 }\r
299         }\r
300         _styleCount = count;\r
301         count = 0;\r
302         for(int i=0; i <= _attrCount; i++){\r
303                 RenderAttribute rAttr = _attrList[i];\r
304                 if (OnAttributeRender(rAttr.name, rAttr.value, rAttr.key)) {\r
305                         count++;\r
306                 }\r
307         }\r
308         _attrCount = count;\r
309 }\r
310 \r
311 public override void Flush(){\r
312         writer.Flush();\r
313 }\r
314 \r
315 protected HtmlTextWriterAttribute GetAttributeKey(string attrName){\r
316         if (attrName != null && attrName.Length > 0) {\r
317                 object attr = HtmlTextWriter._attrKeyLookupTable[attrName.ToLower()];\r
318                 if (attr != null)\r
319                         return (HtmlTextWriterAttribute) attr;\r
320         }\r
321         return (HtmlTextWriterAttribute) (-1);\r
322 }\r
323 \r
324 protected string GetAttributeName(HtmlTextWriterAttribute attrKey){\r
325         if ((int) attrKey >= 0 && (int) attrKey < HtmlTextWriter._attrNameLookupArray.Length)\r
326                 return HtmlTextWriter._attrNameLookupArray[(int) attrKey].name;\r
327         return System.String.Empty;\r
328 }\r
329 \r
330 protected HtmlTextWriterStyle GetStyleKey(string styleName){\r
331         if (styleName != null && styleName.Length > 0) {\r
332                 object style = HtmlTextWriter._styleKeyLookupTable[styleName.ToLower()];\r
333                 if (style != null)\r
334                         return (HtmlTextWriterStyle) style;\r
335         }\r
336         return (HtmlTextWriterStyle) (-1);\r
337 }\r
338 \r
339 protected string GetStyleName(HtmlTextWriterStyle styleKey){\r
340         if ((int) styleKey >= 0 && (int) styleKey < HtmlTextWriter._styleNameLookupArray.Length)\r
341                 return HtmlTextWriter._styleNameLookupArray[(int) styleKey];\r
342         return System.String.Empty;\r
343 }\r
344 \r
345 protected virtual HtmlTextWriterTag GetTagKey(string tagName){\r
346         if (tagName != null && tagName.Length > 0) {\r
347                 object tag = HtmlTextWriter._tagKeyLookupTable[tagName.ToLower()];\r
348                 if (tag != null)\r
349                         return (HtmlTextWriterTag) tag;\r
350         }\r
351         return 0;\r
352 }\r
353 \r
354 protected virtual string GetTagName(HtmlTextWriterTag tagKey){\r
355         if ((int) tagKey >= 0 && (int) tagKey < HtmlTextWriter._tagNameLookupArray.Length)\r
356                 return HtmlTextWriter._tagNameLookupArray[(int) tagKey].name;\r
357         return System.String.Empty;\r
358 }\r
359 \r
360 protected bool IsAttributeDefined(HtmlTextWriterAttribute key){\r
361         for (int i=0; i < _attrCount; i++) {\r
362                 if (_attrList[i].key == key)\r
363                         return true;\r
364         }\r
365         return false;\r
366 }\r
367 \r
368 protected bool IsAttributeDefined(HtmlTextWriterAttribute key, ref string value){\r
369         value = null;\r
370         for (int i=0; i < _attrCount; i++) {\r
371                 if (_attrList[i].key == key) {\r
372                         value = _attrList[i].value;\r
373                         return true;\r
374                 }\r
375         }\r
376         return false;\r
377 }\r
378 \r
379 protected bool IsStyleAttributeDefined(HtmlTextWriterStyle key){\r
380         for (int i= 0; i < _styleCount; i++) {\r
381                 if (_styleList[i].key == key)\r
382                         return true;\r
383         }\r
384         return false;\r
385 }\r
386 \r
387 protected bool IsStyleAttributeDefined(HtmlTextWriterStyle key, ref string value){\r
388         value = null;\r
389         for( int i=0; i < _styleCount; i++) {\r
390                 if (_styleList[i].key == key) {\r
391                         value = _styleList[i].value;\r
392                         return true;\r
393                 }\r
394         }\r
395         return false;\r
396 }\r
397 \r
398 protected virtual bool OnAttributeRender(string name, string value, HtmlTextWriterAttribute key){\r
399         return true;\r
400 }\r
401 \r
402 protected virtual bool OnStyleAttributeRender(string name, string value, HtmlTextWriterStyle key){\r
403         return true;\r
404 }\r
405 \r
406 protected virtual bool OnTagRender(string name, HtmlTextWriterTag key){\r
407         return true;\r
408 }\r
409 \r
410 protected virtual void OutputTabs(){\r
411         if (tabsPending) {\r
412                 for(int i=0; i < indentLevel; i++) {\r
413                         writer.Write(tabString);\r
414                 }\r
415                 tabsPending = false;\r
416         }\r
417 }\r
418 \r
419 protected string PopEndTag(){\r
420         if (_endTagCount <= 0)\r
421                 throw new InvalidOperationException("A PopEndTag was called without a corresponding PushEndTag");\r
422         _endTagCount--;\r
423         TagKey = _endTags[_endTagCount].tagKey;\r
424         return _endTags[_endTagCount].endTagText;\r
425 }\r
426 \r
427 protected void PushEndTag(string endTag){\r
428         if (_endTagCount >= (int) _endTags.Length) {\r
429                 TagStackEntry[] temp = new TagStackEntry[(int) _endTags.Length * 2];\r
430                 System.Array.Copy(_endTags, temp, (int) _endTags.Length);\r
431                 _endTags = temp;\r
432         }\r
433         _endTags[_endTagCount].tagKey = _tagKey;\r
434         _endTags[_endTagCount].endTagText = endTag;\r
435         _endTagCount++;\r
436 }\r
437 \r
438 protected static void RegisterAttribute(string name, HtmlTextWriterAttribute key){\r
439         HtmlTextWriter.RegisterAttribute(name, key, false);\r
440 }\r
441 \r
442 private static void RegisterAttribute(string name, HtmlTextWriterAttribute key, bool fEncode){\r
443         name = name.ToLower();\r
444         HtmlTextWriter._attrKeyLookupTable.Add(name, key);\r
445         if ((int) key < (int) HtmlTextWriter._attrNameLookupArray.Length)\r
446                 HtmlTextWriter._attrNameLookupArray[(int) key] = new AttributeInformation(name, fEncode);\r
447 }\r
448 \r
449 protected static void RegisterStyle(string name, HtmlTextWriterStyle key){\r
450         name = name.ToLower();\r
451         HtmlTextWriter._styleKeyLookupTable.Add(name, key);\r
452         if ((int) key < (int) HtmlTextWriter._styleNameLookupArray.Length)\r
453                 HtmlTextWriter._styleNameLookupArray[(int) key] = name;\r
454 }\r
455 \r
456 protected static void RegisterTag(string name, HtmlTextWriterTag key){\r
457         HtmlTextWriter.RegisterTag(name, key, TagType.Other);\r
458 }\r
459 \r
460 private static void RegisterTag(string name, HtmlTextWriterTag key, TagType type){\r
461         name = name.ToLower();\r
462         HtmlTextWriter._tagKeyLookupTable.Add(name, key);\r
463         string fullTag = null;\r
464         if ((int) type != 1 && (int) key != 0) {\r
465                 fullTag = EndTagLeftChars + name + TagRightChar;\r
466         }\r
467         if ((int) key < HtmlTextWriter._tagNameLookupArray.Length)\r
468                 HtmlTextWriter._tagNameLookupArray[(int) key] = new TagInformation(name, type, fullTag);\r
469 }\r
470 \r
471 protected virtual string RenderAfterContent(){\r
472         return null;\r
473 }\r
474 \r
475 protected virtual string RenderAfterTag(){\r
476         return null;\r
477 }\r
478 \r
479 protected virtual string RenderBeforeContent(){\r
480         return null;\r
481 }\r
482 \r
483 protected virtual string RenderBeforeTag(){\r
484         return null;\r
485 }\r
486 \r
487 public virtual void RenderBeginTag(HtmlTextWriterTag tagKey){\r
488         TagKey = tagKey;\r
489         bool tagRendered = true;\r
490         bool tagRender = true;\r
491         if (_isDescendant) {\r
492                 tagRender = OnTagRender(_tagName, _tagKey);\r
493                 FilterAttributes();\r
494                 string beforeTag = RenderBeforeTag();\r
495                 if (beforeTag != null) {\r
496                         if (tabsPending)\r
497                                 OutputTabs();\r
498                         writer.Write(beforeTag);\r
499                 }\r
500         }\r
501         TagInformation currentTag = HtmlTextWriter._tagNameLookupArray[_tagIndex];\r
502         if (tagRender) {\r
503                 tagRendered = false;\r
504                 if (tabsPending)\r
505                         OutputTabs();\r
506                 writer.Write(TagLeftChar);\r
507                 writer.Write(_tagName);\r
508                 RenderAttribute rAttr;\r
509                 string rAttrValue = null;\r
510                 for (int i=0; i < _attrCount; i++) {\r
511                         rAttr = _attrList[i];\r
512                         if (rAttr.key == HtmlTextWriterAttribute.Style)\r
513                                 rAttrValue = rAttr.value;\r
514                         else {\r
515                                 writer.Write(SpaceChar);\r
516                                 writer.Write(rAttr.name);\r
517                                 if (rAttr.value != null) {\r
518                                         writer.Write(EqualsChar);\r
519                                         writer.Write(DoubleQuoteChar);\r
520                                         if (rAttr.encode) {\r
521                                                 if (_httpWriter == null) {\r
522                                                         System.Web.HttpUtility.HtmlAttributeEncode(rAttr.value, writer);\r
523                                                 }\r
524                                                 else {\r
525                                                         System.Web.HttpUtility.HtmlAttributeEncode(rAttr.value, (TextWriter) _httpWriter);\r
526                                                 }\r
527                                         }\r
528                                         else {\r
529                                                 writer.Write(rAttr.value);\r
530                                         }\r
531                                         writer.Write(DoubleQuoteChar);\r
532                                 }\r
533                         }\r
534                 }\r
535                 if (_styleCount > 0 || rAttrValue != null) {\r
536                         writer.Write(SpaceChar);\r
537                         writer.Write("style");\r
538                         writer.Write(EqualsChar);\r
539                         writer.Write(DoubleQuoteChar);\r
540                         RenderStyle rStyle;\r
541                         for (int i=0; i < _styleCount; i++) {\r
542                                 rStyle = _styleList[i];\r
543                                 writer.Write(rStyle.name);\r
544                                 writer.Write(StyleEqualsChar);\r
545                                 writer.Write(rStyle.value);\r
546                                 writer.Write(SemicolonChar);\r
547                         }\r
548                         if (rAttrValue != null)\r
549                                 writer.Write(rAttrValue);\r
550                         writer.Write(DoubleQuoteChar);\r
551                 }\r
552                 if (currentTag.tagType == TagType.NonClosing) {\r
553                         writer.Write(SpaceChar);\r
554                         writer.Write(SlashChar);\r
555                         writer.Write(TagRightChar);\r
556                 }\r
557                 else\r
558                         writer.Write(TagRightChar);\r
559         }\r
560         string beforeContent = RenderBeforeContent();\r
561         if (beforeContent != null) {\r
562                 if (tabsPending)\r
563                         OutputTabs();\r
564                 writer.Write(beforeContent);\r
565         }\r
566         if (tagRendered) {\r
567                 if (currentTag.tagType == TagType.Inline)\r
568                         _inlineCount++;\r
569                 else {\r
570                         WriteLine();\r
571                         Indent++;\r
572                 }\r
573                 if (currentTag.closingTag == null) {\r
574                         currentTag.closingTag = EndTagLeftChars + _tagName + TagRightChar;\r
575                 }\r
576         }\r
577         if (_isDescendant) {\r
578                 string afterContent = RenderAfterContent();\r
579                 if (afterContent != null) {\r
580                         if (currentTag.closingTag != null)\r
581                                 currentTag.closingTag = afterContent;\r
582                 }\r
583                 string afterTag = RenderAfterTag();\r
584                 if (afterTag != null) {\r
585                         if (currentTag.closingTag != null)\r
586                                 currentTag.closingTag = afterTag;\r
587                 }\r
588         }\r
589         PushEndTag(currentTag.closingTag);\r
590         _attrCount = 0;\r
591         _styleCount = 0;\r
592 }\r
593 \r
594 public virtual void RenderBeginTag(string tagName){\r
595         TagName = tagName;\r
596         RenderBeginTag(_tagKey);\r
597 }\r
598 \r
599 public virtual void RenderEndTag(){\r
600         string endTagText = PopEndTag();\r
601         if (endTagText != null) {\r
602                 if (HtmlTextWriter._tagNameLookupArray[_tagIndex].tagType == 0) {\r
603                         _inlineCount--;\r
604                         Write(endTagText);\r
605                 }\r
606                 else{\r
607                         WriteLine();\r
608                         Indent--;\r
609                         Write(endTagText);\r
610                 }\r
611         }\r
612 }\r
613 \r
614 public override void Write(bool value){\r
615         if (tabsPending)\r
616                 OutputTabs();\r
617         writer.Write(value);\r
618 }\r
619 \r
620 public override void Write(char value){\r
621         if (tabsPending)\r
622                 OutputTabs();\r
623         writer.Write(value);\r
624 }\r
625 \r
626 public override void Write(char[] buffer){\r
627         if (tabsPending)\r
628                 OutputTabs();\r
629         writer.Write(buffer);\r
630 }\r
631 \r
632 public override void Write(char[] buffer, int index, int count){\r
633         if (tabsPending)\r
634                 OutputTabs();\r
635         writer.Write(buffer, index, count);\r
636 }\r
637 \r
638 public override void Write(double value){\r
639         if (tabsPending)\r
640                 OutputTabs();\r
641         writer.Write(value);\r
642 }\r
643 \r
644 public override void Write(int value){\r
645         if (tabsPending)\r
646                 OutputTabs();\r
647         writer.Write(value);\r
648 }\r
649 \r
650 public override void Write(long value){\r
651         if (tabsPending)\r
652                 OutputTabs();\r
653         writer.Write(value);\r
654 }\r
655 \r
656 public override void Write(object value){\r
657         if (tabsPending)\r
658                 OutputTabs();\r
659         writer.Write(value);\r
660 }\r
661 \r
662 public override void Write(float value){\r
663         if (tabsPending)\r
664                 OutputTabs();\r
665         writer.Write(value);\r
666 }\r
667 \r
668 public override void Write(string s){\r
669         if (tabsPending)\r
670                 OutputTabs();\r
671         writer.Write(s);\r
672 }\r
673 \r
674 public override void Write(string format, object arg0){\r
675         if (tabsPending)\r
676                 OutputTabs();\r
677         writer.Write(format, arg0);\r
678 }\r
679 \r
680 public override void Write(string format, object arg0, object arg1){\r
681         if (tabsPending)\r
682                 OutputTabs();\r
683         writer.Write(format, arg0, arg1);\r
684 }\r
685 \r
686 public override void Write(string format, params object[] arg){\r
687         if (tabsPending)\r
688                 OutputTabs();\r
689         writer.Write(format, arg);\r
690 }\r
691 \r
692 public virtual void WriteAttribute(string name, string value){\r
693         WriteAttribute(name, value, false);\r
694 }\r
695 \r
696 public virtual void WriteAttribute(string name, string value, bool fEncode){\r
697         writer.Write(SpaceChar);\r
698         writer.Write(name);\r
699         if (value != null) {\r
700                 writer.Write(EqualsChar);\r
701                 writer.Write(DoubleQuoteChar);\r
702                 if (fEncode) {\r
703                         if (_httpWriter == null) {\r
704                                 System.Web.HttpUtility.HtmlAttributeEncode(value, writer);\r
705                         }\r
706                         else{\r
707                                 System.Web.HttpUtility.HtmlAttributeEncode(value, (TextWriter) _httpWriter);\r
708                         }\r
709                 }\r
710                 else{\r
711                         writer.Write(value);\r
712                 }\r
713                 writer.Write(DoubleQuoteChar);\r
714         }\r
715 }\r
716 \r
717 public virtual void WriteBeginTag(string tagName){\r
718         if (tabsPending)\r
719                 OutputTabs();\r
720         writer.Write(TagLeftChar);\r
721         writer.Write(tagName);\r
722 }\r
723 \r
724 public virtual void WriteEndTag(string tagName){\r
725         if (tabsPending)\r
726                 OutputTabs();\r
727         writer.Write(TagLeftChar);\r
728         writer.Write(SlashChar);\r
729         writer.Write(tagName);\r
730         writer.Write(TagRightChar);\r
731 }\r
732 \r
733 public virtual void WriteFullBeginTag(string tagName){\r
734         if (tabsPending)\r
735                 OutputTabs();\r
736         writer.Write(TagLeftChar);\r
737         writer.Write(tagName);\r
738         writer.Write(TagRightChar);\r
739 }\r
740 \r
741 public override void WriteLine(){\r
742         writer.WriteLine();\r
743         tabsPending = true;\r
744 }\r
745 \r
746 public override void WriteLine(bool value){\r
747         if (tabsPending)\r
748                 OutputTabs();\r
749         writer.WriteLine(value);\r
750         tabsPending = true;\r
751 }\r
752 \r
753 public override void WriteLine(char value){\r
754         if (tabsPending)\r
755                 OutputTabs();\r
756         writer.WriteLine(value);\r
757         tabsPending = true;\r
758 }\r
759 \r
760 public override void WriteLine(char[] buffer){\r
761         if (tabsPending)\r
762                 OutputTabs();\r
763         writer.WriteLine(buffer);\r
764         tabsPending = true;\r
765 }\r
766 \r
767 public override void WriteLine(char[] buffer, int index, int count){\r
768         if (tabsPending)\r
769                 OutputTabs();\r
770         writer.WriteLine(buffer, index, count);\r
771         tabsPending = true;\r
772 }\r
773 \r
774 public override void WriteLine(double value){\r
775         if (tabsPending)\r
776                 OutputTabs();\r
777         writer.WriteLine(value);\r
778         tabsPending = true;\r
779 }\r
780 \r
781 public override void WriteLine(int value){\r
782         if (tabsPending)\r
783                 OutputTabs();\r
784         writer.WriteLine(value);\r
785         tabsPending = true;\r
786 }\r
787 \r
788 public override void WriteLine(long value){\r
789         if (tabsPending)\r
790                 OutputTabs();\r
791         writer.WriteLine(value);\r
792         tabsPending = true;\r
793 }\r
794 \r
795 public override void WriteLine(object value){\r
796         if (tabsPending)\r
797                 OutputTabs();\r
798         writer.WriteLine(value);\r
799         tabsPending = true;\r
800 }\r
801 \r
802 public override void WriteLine(float value){\r
803         if (tabsPending)\r
804                 OutputTabs();\r
805         writer.WriteLine(value);\r
806         tabsPending = true;\r
807 }\r
808 \r
809 public override void WriteLine(string s){\r
810         if (tabsPending)\r
811                 OutputTabs();\r
812         writer.WriteLine(s);\r
813         tabsPending = true;\r
814 }\r
815 \r
816 public override void WriteLine(string format, object arg0){\r
817         if (tabsPending)\r
818                 OutputTabs();\r
819         writer.WriteLine(format, arg0);\r
820         tabsPending = true;\r
821 }\r
822 \r
823 public override void WriteLine(string format, object arg0, object arg1){\r
824         if (tabsPending)\r
825                 OutputTabs();\r
826         writer.WriteLine(format, arg0, arg1);\r
827         tabsPending = true;\r
828 }\r
829 \r
830 public override void WriteLine(string format, params object[] arg){\r
831         if (tabsPending)\r
832                 OutputTabs();\r
833         writer.WriteLine(format, arg);\r
834         tabsPending = true;\r
835 }\r
836 \r
837 [CLSCompliant(false)]\r
838 public override void WriteLine(uint value){\r
839         if (tabsPending)\r
840                 OutputTabs();\r
841         writer.WriteLine(value);\r
842         tabsPending = true;\r
843 }\r
844 \r
845 public void WriteLineNoTabs(string s){\r
846         writer.WriteLine(s);\r
847 }\r
848 \r
849 public virtual void WriteStyleAttribute(string name, string value){\r
850         WriteStyleAttribute(name, value, false);\r
851 }\r
852 \r
853 public virtual void WriteStyleAttribute(string name, string value, bool fEncode){\r
854         writer.Write(name);\r
855         writer.Write(StyleEqualsChar);\r
856         if (fEncode) {\r
857                 if (_httpWriter == null) {\r
858                         System.Web.HttpUtility.HtmlAttributeEncode(value, writer);\r
859                 }\r
860                 else{\r
861                         System.Web.HttpUtility.HtmlAttributeEncode(value, (TextWriter) _httpWriter);\r
862                 }\r
863         }\r
864         else {\r
865                 writer.Write(value);\r
866         }\r
867         writer.Write(SemicolonChar);\r
868 }\r
869 \r
870 public override System.Text.Encoding Encoding { \r
871         get{\r
872                 return writer.Encoding;\r
873         }\r
874 }\r
875 \r
876 public int Indent { \r
877         get{\r
878                 return indentLevel;\r
879         }\r
880         set{\r
881                 if (value < 0)\r
882                         value = 0;\r
883                 indentLevel = value;\r
884         }\r
885 }\r
886 \r
887 public TextWriter InnerWriter { \r
888         get{\r
889                 return writer;\r
890         }\r
891         set{\r
892                 writer = value;\r
893                 _httpWriter = value as HttpWriter;\r
894         }\r
895 }\r
896 \r
897 public override string NewLine { \r
898         get{\r
899                 return writer.NewLine;\r
900         }\r
901         set{\r
902                 writer.NewLine = value;\r
903         }\r
904 }\r
905 \r
906 protected HtmlTextWriterTag TagKey { \r
907         get{\r
908                 return _tagKey;\r
909         }\r
910         set{\r
911                 _tagIndex = (int) value;\r
912                 if (_tagIndex < 0 || _tagIndex >= (int) HtmlTextWriter._tagNameLookupArray.Length)\r
913                         throw new ArgumentOutOfRangeException("value");\r
914                 _tagKey = value;\r
915                 if (value != 0)\r
916                         _tagName = HtmlTextWriter._tagNameLookupArray[_tagIndex].name;\r
917         }\r
918 }\r
919 \r
920 protected string TagName { \r
921         get{\r
922                 return _tagName;\r
923         }\r
924         set{\r
925                 _tagName = value;\r
926                 _tagKey = GetTagKey(_tagName);\r
927                 _tagIndex = (int) _tagKey;\r
928         }\r
929 }\r
930 \r
931 public const string DefaultTabString = "\t";\r
932 public const char DoubleQuoteChar = '"';\r
933 public const string EndTagLeftChars = "</";\r
934 public const char EqualsChar = '=';\r
935 public const string EqualsDoubleQuoteString = "=\"";\r
936 public const string SelfClosingChars = " /";\r
937 public const string SelfClosingTagEnd = " />";\r
938 public const char SemicolonChar = ';';\r
939 public const char SingleQuoteChar = '\'';\r
940 public const char SlashChar = '/';\r
941 public const char SpaceChar = ' ';\r
942 public const char StyleEqualsChar = ':';\r
943 public const char TagLeftChar = '<';\r
944 public const char TagRightChar = '>';\r
945 \r
946 private int _attrCount;\r
947 private int _endTagCount;\r
948 private int _styleCount;\r
949 private int indentLevel;\r
950 private int _inlineCount;\r
951 private int _tagIndex;\r
952 \r
953 private bool _isDescendant;\r
954 private bool tabsPending;\r
955 \r
956 private HtmlTextWriterTag _tagKey;\r
957 private TextWriter writer;\r
958 private HttpWriter _httpWriter;\r
959 \r
960 private static Hashtable _attrKeyLookupTable;\r
961 private static Hashtable _styleKeyLookupTable;\r
962 private static Hashtable _tagKeyLookupTable;\r
963 \r
964 private string _tagName;\r
965 private string tabString;\r
966 private static string[] _styleNameLookupArray;\r
967 \r
968 private RenderAttribute[] _attrList;\r
969 private static AttributeInformation[] _attrNameLookupArray;\r
970 private static TagInformation[] _tagNameLookupArray;\r
971 private TagStackEntry[] _endTags;\r
972 private RenderStyle[] _styleList;\r
973 \r
974 } //HtmlTextWriter\r
975 \r
976 struct AttributeInformation {\r
977         public bool encode;\r
978         public string name;\r
979 \r
980         public AttributeInformation(string name, bool encode){\r
981                 this.encode = encode;\r
982                 this.name = name;\r
983         }\r
984\r
985  \r
986 struct RenderAttribute {\r
987         public bool encode;\r
988         public HtmlTextWriterAttribute key;\r
989         public string name;\r
990         public string value;\r
991\r
992  \r
993 struct RenderStyle {\r
994         public HtmlTextWriterStyle key;\r
995         public string name;\r
996         public string value;\r
997\r
998  \r
999 struct TagInformation {\r
1000         public string closingTag;\r
1001         public string name;\r
1002         public TagType tagType;\r
1003 \r
1004         public TagInformation(string name, TagType tagType, string closingTag){\r
1005                 this.name = name;\r
1006                 this.tagType = tagType;\r
1007                 this.closingTag = closingTag;   \r
1008         }\r
1009\r
1010  \r
1011 struct TagStackEntry {\r
1012         public string endTagText;\r
1013         public HtmlTextWriterTag tagKey;\r
1014\r
1015  \r
1016 enum TagType {\r
1017         Inline,\r
1018         NonClosing,\r
1019         Other\r
1020\r
1021 \r
1022 \r
1023 } // namespace System.Web.UI.HtmlControls\r
1024 \r