* roottypes.cs: Rename from tree.cs.
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Login.cs
1 //
2 // System.Web.UI.WebControls.Login class
3 //
4 // Author:
5 //      Sebastien Pouliot  <sebastien@ximian.com>
6 //  Konstantin Triger  <kostat@mainsoft.com>
7 //
8 // Copyright (C) 2005 Novell, Inc (http://www.novell.com)
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
17 // 
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
20 // 
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 //
29
30 #if NET_2_0
31
32 using System.Collections;
33 using System.Globalization;
34 using System.ComponentModel;
35 using System.Security.Permissions;
36 using System.Web.Security;
37
38 namespace System.Web.UI.WebControls {
39
40         // CAS
41         [AspNetHostingPermission (SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
42         [AspNetHostingPermission (SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
43         // attributes
44         [Bindable (false)]
45         [DefaultEvent ("Authenticate")]
46         [Designer ("System.Web.UI.Design.WebControls.LoginDesigner, " + Consts.AssemblySystem_Design, "System.ComponentModel.Design.IDesigner")]
47         public class Login : CompositeControl {
48
49                 #region LoginContainer
50                 
51                 sealed class LoginContainer : WebControl {
52                         public Control UserNameTextBox {
53                                 get {
54                                         return FindControl("UserName");
55                                 }
56                         }
57
58                         public Control PasswordTextBox {
59                                 get {
60                                         return FindControl("Password");
61                                 }
62                         }
63
64                         public Control RememberMeCheckBox {
65                                 get {
66                                         return FindControl("RememberMe");
67                                 }
68                         }
69                 }
70
71                 #endregion
72
73                 #region LoginTemplate
74
75                 sealed class LoginTemplate : WebControl, ITemplate {
76                         readonly Login _login;
77
78                         private TextBox userNameTextBox;
79                         private RequiredFieldValidator userNameRequired;
80                         private TextBox passwordTextBox;
81                         private RequiredFieldValidator passwordRequired;
82                         private CheckBox rememberMeCheckBox;
83                         private WebControl loginButton;
84
85                         public LoginTemplate (Login login)
86                         {
87                                 _login = login;
88                         }
89
90                         void ITemplate.InstantiateIn(Control container) {
91                                 container.Controls.Add (this);
92
93                                 userNameTextBox = new TextBox ();
94                                 userNameTextBox.ID = "UserName";
95
96                                 userNameRequired = new RequiredFieldValidator ();
97                                 userNameRequired.ID = "UserNameRequired";
98                                 userNameRequired.ControlToValidate = userNameTextBox.ID;
99                                 userNameRequired.ErrorMessage = "*";
100                                 userNameRequired.ValidationGroup = this.UniqueID;
101
102                                 passwordTextBox = new TextBox ();
103                                 passwordTextBox.ID = "Password";
104                                 passwordTextBox.TextMode = TextBoxMode.Password;
105
106                                 passwordRequired = new RequiredFieldValidator ();
107                                 passwordRequired.ID = "PasswordRequired";
108                                 passwordRequired.ControlToValidate = passwordTextBox.ID;
109                                 passwordRequired.ErrorMessage = "*";
110                                 passwordRequired.ValidationGroup = this.UniqueID;
111
112                                 rememberMeCheckBox = new CheckBox ();
113                                 rememberMeCheckBox.ID = "RememberMe";
114                                 rememberMeCheckBox.Checked = _login.RememberMeSet;
115
116                                 switch (_login.LoginButtonType) {
117                                         case ButtonType.Button:
118                                                 loginButton = new Button ();
119                                                 loginButton.ID = "LoginButton";
120                                                 break;
121                                         case ButtonType.Link:
122                                                 loginButton = new LinkButton ();
123                                                 loginButton.ID = "LoginLinkButton";
124                                                 break;
125                                         case ButtonType.Image:
126                                                 loginButton = new ImageButton ();
127                                                 loginButton.ID = "LoginImageButton";
128                                                 break;
129                                 }
130                                 IButtonControl control = (loginButton as IButtonControl);
131                                 control.Text = _login.LoginButtonText;
132                                 control.CommandName = Login.LoginButtonCommandName;
133                                 control.Command += new CommandEventHandler (_login.LoginClick);
134                                 control.ValidationGroup = this.UniqueID;
135
136                                 // adds them all at the end (after setting their properties)
137                                 Controls.Add (userNameTextBox);
138                                 Controls.Add (userNameRequired);
139                                 Controls.Add (passwordTextBox);
140                                 Controls.Add (passwordRequired);
141                                 Controls.Add (rememberMeCheckBox);
142                                 Controls.Add (loginButton);
143                         }
144
145                         [MonoTODO ("render error messages")]
146                         [MonoTODO ("set child control properties in ITemplate.InstantiateIn and let them render themself")]
147                         protected internal override void Render(HtmlTextWriter writer) {
148                                 userNameRequired.ToolTip = _login.UserNameRequiredErrorMessage;
149                                 passwordRequired.ToolTip = _login.PasswordRequiredErrorMessage;
150
151                                 bool vertical = (_login.Orientation == Orientation.Vertical);
152                                 bool textontop = (_login.TextLayout == LoginTextLayout.TextOnTop);
153                                 string colspan = vertical ? (textontop ? String.Empty : "2") : (textontop ? "4" : "6");
154                                 string align = (textontop ? "left" : "right");
155
156                                 // inner table
157                                 writer.AddAttribute (HtmlTextWriterAttribute.Cellpadding, "0");
158                                 writer.AddAttribute (HtmlTextWriterAttribute.Border, "0");
159                                 writer.RenderBeginTag (HtmlTextWriterTag.Table);
160
161                                 // First row - Title
162                                 // for both Orientation.Vertical and Orientation.Horizontal
163
164                                 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
165                                 writer.AddAttribute (HtmlTextWriterAttribute.Align, "center");
166                                 if (colspan.Length > 0)
167                                         writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
168                                 if (!_login.IsEmpty (_login.titleTextStyle))
169                                         _login.titleTextStyle.AddAttributesToRender (writer);
170                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);
171                                 writer.Write (_login.TitleText);
172                                 writer.RenderEndTag ();
173                                 writer.RenderEndTag ();
174
175                                 // Second row - Instructions (optional)
176                                 // for both Orientation.Vertical and Orientation.Horizontal
177
178                                 string instructions = _login.InstructionText;
179                                 if (instructions.Length > 0) {
180                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);
181                                         writer.AddAttribute (HtmlTextWriterAttribute.Align, "center");
182                                         if (colspan.Length > 0)
183                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
184                                         if (!_login.IsEmpty (_login.instructionTextStyle))
185                                                 _login.instructionTextStyle.AddAttributesToRender (writer);
186                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);
187                                         writer.Write (instructions);
188                                         writer.RenderEndTag ();
189                                         writer.RenderEndTag ();
190                                 }
191
192                                 // Third Row
193                                 // - Orientation.Vertical == Username
194                                 // - Orientation.Horizontal == Username, Password, RememberMe and LogIn button
195
196                                 if (!vertical && textontop) {
197                                         RenderUserNameTextBox (writer);
198                                         RenderPasswordTextBox (writer);
199                                 }
200
201                                 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
202                                 if (vertical) {
203                                         writer.AddAttribute (HtmlTextWriterAttribute.Align, align);
204                                         RenderUserNameTextBox (writer);
205                                 } else if (!textontop) {
206                                         RenderUserNameTextBox (writer);
207                                 }
208                                 if (vertical && textontop) {
209                                         writer.RenderEndTag ();
210                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);
211                                 }
212                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);
213                                 if (!_login.IsEmpty (_login.textBoxStyle))
214                                         _login.textBoxStyle.AddAttributesToRender (writer);
215                                 userNameTextBox.RenderControl (writer);
216                                 userNameRequired.RenderControl (writer);
217                                 writer.RenderEndTag ();
218                                 if (vertical)
219                                         writer.RenderEndTag ();
220
221                                 if (vertical) {
222                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);
223                                         writer.AddAttribute (HtmlTextWriterAttribute.Align, align);
224                                         RenderPasswordTextBox (writer);
225                                 } else if (!textontop) {
226                                         RenderPasswordTextBox (writer);
227                                 }
228                                 if (vertical && textontop) {
229                                         writer.RenderEndTag ();
230                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);
231                                 }
232                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);
233                                 if (!_login.IsEmpty (_login.textBoxStyle))
234                                         _login.textBoxStyle.AddAttributesToRender (writer);
235                                 passwordTextBox.RenderControl (writer);
236                                 passwordRequired.RenderControl (writer);
237                                 writer.RenderEndTag ();
238                                 if (vertical)
239                                         writer.RenderEndTag ();
240
241                                 if (_login.DisplayRememberMe) {
242                                         if (vertical) {
243                                                 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
244                                                 if (colspan.Length > 0)
245                                                         writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
246                                         }
247                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);
248                                         rememberMeCheckBox.RenderControl (writer);
249                                         writer.AddAttribute (HtmlTextWriterAttribute.For, rememberMeCheckBox.ClientID);
250                                         writer.RenderBeginTag (HtmlTextWriterTag.Label);
251                                         writer.Write (_login.RememberMeText);
252                                         writer.RenderEndTag ();
253                                         writer.RenderEndTag ();
254                                         if (vertical)
255                                                 writer.RenderEndTag ();
256                                 }
257
258                                 // TODO - detect failure
259                                 bool failed = false;
260                                 if (failed) {
261                                         if (vertical)
262                                                 writer.RenderBeginTag (HtmlTextWriterTag.Tr);
263                                         if (colspan.Length > 0)
264                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
265                                         writer.AddAttribute (HtmlTextWriterAttribute.Align, "center");
266                                         writer.AddStyleAttribute (HtmlTextWriterStyle.Color, "red");
267                                         if (!_login.IsEmpty (_login.failureTextStyle)) {
268                                                 _login.failureTextStyle.AddAttributesToRender (writer);
269                                         }
270                                         writer.Write (_login.FailureText);
271                                         writer.RenderEndTag ();
272                                         if (vertical)
273                                                 writer.RenderEndTag ();
274                                 }
275
276                                 // LoginButton
277                                 if (vertical) {
278                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);
279                                         writer.AddAttribute (HtmlTextWriterAttribute.Align, "right");
280                                         if (colspan.Length > 0)
281                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
282                                 }
283                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);
284                                 if (!_login.IsEmpty (_login.logonButtonStyle)) {
285                                         _login.logonButtonStyle.AddAttributesToRender (writer);
286                                 }
287                                 if (loginButton is ImageButton) {
288                                         (loginButton as ImageButton).ImageUrl = _login.LoginButtonImageUrl;
289                                 }
290                                 loginButton.RenderControl (writer);
291                                 writer.RenderEndTag ();
292                                 writer.RenderEndTag ();
293
294                                 bool userText = (_login.CreateUserText.Length > 0);
295                                 bool userImg = (_login.CreateUserIconUrl.Length > 0);
296                                 bool passText = (_login.PasswordRecoveryText.Length > 0);
297                                 bool passImg = (_login.PasswordRecoveryIconUrl.Length > 0);
298                                 bool helpText = (_login.HelpPageText.Length > 0);
299                                 bool helpImg = (_login.HelpPageIconUrl.Length > 0);
300                                 // show row if CreateUserText or CreateUserIconUrl is set
301                                 // but not if only CreateUserUrl is set
302                                 if (userText || userImg || passText || passImg || helpText || helpImg) {
303                                         writer.RenderBeginTag (HtmlTextWriterTag.Tr);
304                                         if (colspan.Length > 0)
305                                                 writer.AddAttribute (HtmlTextWriterAttribute.Colspan, colspan);
306                                         writer.RenderBeginTag (HtmlTextWriterTag.Td);
307
308                                         if (userImg) {
309                                                 writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.CreateUserIconUrl);
310                                                 writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px");
311                                                 if (userText)
312                                                         writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.CreateUserText);
313                                                 writer.RenderBeginTag (HtmlTextWriterTag.Img);
314                                                 writer.RenderEndTag ();
315                                         }
316
317                                         if (userText) {
318                                                 string href = _login.CreateUserUrl;
319                                                 if (href.Length > 0)
320                                                         writer.AddAttribute (HtmlTextWriterAttribute.Href, href);
321                                                 if (_login.hyperLinkStyle != null)
322                                                         _login.hyperLinkStyle.AddAttributesToRender (writer);
323                                                 writer.RenderBeginTag (HtmlTextWriterTag.A);
324                                                 writer.Write (_login.CreateUserText);
325                                                 writer.RenderEndTag ();
326                                         }
327
328                                         if (passText || passImg) {
329                                                 if (userImg || userText) {
330                                                         if (vertical) {
331                                                                 writer.Write ("<br />");
332                                                         } else {
333                                                                 writer.Write (" ");
334                                                         }
335                                                 }
336
337                                                 if (passImg) {
338                                                         writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.PasswordRecoveryIconUrl);
339                                                         writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px");
340                                                         if (passText)
341                                                                 writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.PasswordRecoveryText);
342                                                         writer.RenderBeginTag (HtmlTextWriterTag.Img);
343                                                         writer.RenderEndTag ();
344                                                 }
345
346                                                 if (passText) {
347                                                         string href = _login.PasswordRecoveryUrl;
348                                                         if (href.Length > 0)
349                                                                 writer.AddAttribute (HtmlTextWriterAttribute.Href, href);
350                                                         if (_login.hyperLinkStyle != null)
351                                                                 _login.hyperLinkStyle.AddAttributesToRender (writer);
352                                                         writer.RenderBeginTag (HtmlTextWriterTag.A);
353                                                         writer.Write (_login.PasswordRecoveryText);
354                                                         writer.RenderEndTag ();
355                                                 }
356                                         }
357
358                                         if (helpText || helpImg) {
359                                                 if (userImg || userText || passText || passImg) {
360                                                         if (vertical) {
361                                                                 writer.Write ("<br />");
362                                                         } else {
363                                                                 writer.Write (" ");
364                                                         }
365                                                 }
366
367                                                 if (helpImg) {
368                                                         writer.AddAttribute (HtmlTextWriterAttribute.Src, _login.HelpPageIconUrl);
369                                                         writer.AddStyleAttribute (HtmlTextWriterStyle.BorderWidth, "0px");
370                                                         if (helpText)
371                                                                 writer.AddAttribute (HtmlTextWriterAttribute.Alt, _login.HelpPageText);
372                                                         writer.RenderBeginTag (HtmlTextWriterTag.Img);
373                                                         writer.RenderEndTag ();
374                                                 }
375
376                                                 if (helpText) {
377                                                         string href = _login.HelpPageUrl;
378                                                         if (href.Length > 0)
379                                                                 writer.AddAttribute (HtmlTextWriterAttribute.Href, href);
380                                                         if (_login.hyperLinkStyle != null)
381                                                                 _login.hyperLinkStyle.AddAttributesToRender (writer);
382                                                         writer.RenderBeginTag (HtmlTextWriterTag.A);
383                                                         writer.Write (_login.HelpPageText);
384                                                         writer.RenderEndTag ();
385                                                 }
386                                         }
387
388                                         writer.RenderEndTag ();
389                                         writer.RenderEndTag ();
390                                 }
391
392                                 // inner table (end)
393                                 writer.RenderEndTag (); // Table
394                         }
395
396                         private void RenderUserNameTextBox (HtmlTextWriter writer) {
397                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);
398                                 writer.AddAttribute (HtmlTextWriterAttribute.For, userNameTextBox.ClientID);
399                                 writer.RenderBeginTag (HtmlTextWriterTag.Label);
400                                 writer.Write (_login.UserNameLabelText);
401                                 writer.RenderEndTag ();
402                                 writer.RenderEndTag ();
403                         }
404
405                         private void RenderPasswordTextBox (HtmlTextWriter writer) {
406                                 writer.RenderBeginTag (HtmlTextWriterTag.Td);
407                                 writer.AddAttribute (HtmlTextWriterAttribute.For, passwordTextBox.ClientID);
408                                 writer.RenderBeginTag (HtmlTextWriterTag.Label);
409                                 writer.Write (_login.PasswordLabelText);
410                                 writer.RenderEndTag ();
411                                 writer.RenderEndTag ();
412                         }
413                 }
414
415                 #endregion
416
417                 public static readonly string LoginButtonCommandName = "Login";
418
419                 private static readonly object authenticateEvent = new object ();
420                 private static readonly object loggedInEvent = new object ();
421                 private static readonly object loggingInEvent = new object ();
422                 private static readonly object loginErrorEvent = new object ();
423
424                 private TableItemStyle checkBoxStyle;
425                 private TableItemStyle failureTextStyle;
426                 private TableItemStyle hyperLinkStyle;
427                 private TableItemStyle instructionTextStyle;
428                 private TableItemStyle labelStyle;
429                 private Style logonButtonStyle;
430                 private Style textBoxStyle;
431                 private TableItemStyle titleTextStyle;
432                 private Style validatorTextStyle;
433
434                 private ITemplate layoutTemplate;
435
436                 private string _password;
437
438
439                 public Login ()
440                 {
441                 }
442
443
444                 [DefaultValue (1)]
445                 public virtual int BorderPadding {
446                         get {
447                                 object o = ViewState ["BorderPadding"];
448                                 return (o == null) ? 1 : (int) o;
449                         }
450                         set {
451                                 if (value < -1)
452                                         throw new ArgumentOutOfRangeException ("BorderPadding", "< -1");
453                                 else
454                                         ViewState ["BorderPadding"] = value;
455                         }
456                 }
457
458                 [DefaultValue (null)]
459                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
460                 [NotifyParentProperty (true)]
461                 [PersistenceMode (PersistenceMode.InnerProperty)]
462                 public TableItemStyle CheckBoxStyle {
463                         get {
464                                 if (checkBoxStyle == null) {
465                                         checkBoxStyle = new TableItemStyle ();
466                                         if (IsTrackingViewState) {
467                                                 (checkBoxStyle as IStateManager).TrackViewState ();
468                                         }
469                                 }
470                                 return checkBoxStyle;
471                         }
472                 }
473
474                 [DefaultValue ("")]
475                 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
476                 [UrlProperty]
477                 public virtual string CreateUserIconUrl {
478                         get {
479                                 object o = ViewState ["CreateUserIconUrl"];
480                                 return (o == null) ? String.Empty : (string) o;
481                         }
482                         set {
483                                 if (value == null)
484                                         ViewState.Remove ("CreateUserIconUrl");
485                                 else
486                                         ViewState ["CreateUserIconUrl"] = value;
487                         }
488                 }
489
490                 [DefaultValue ("")]
491                 [Localizable (true)]
492                 public virtual string CreateUserText {
493                         get {
494                                 object o = ViewState ["CreateUserText"];
495                                 return (o == null) ? String.Empty : (string) o;
496                         }
497                         set {
498                                 if (value == null)
499                                         ViewState.Remove ("CreateUserText");
500                                 else
501                                         ViewState ["CreateUserText"] = value;
502                         }
503                 }
504
505                 [DefaultValue ("")]
506                 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
507                 [UrlProperty]
508                 public virtual string CreateUserUrl {
509                         get {
510                                 object o = ViewState ["CreateUserUrl"];
511                                 return (o == null) ? String.Empty : (string) o;
512                         }
513                         set {
514                                 if (value == null)
515                                         ViewState.Remove ("CreateUserUrl");
516                                 else
517                                         ViewState ["CreateUserUrl"] = value;
518                         }
519                 }
520
521                 [DefaultValue ("")]
522                 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
523                 [Themeable (false)]
524                 [UrlProperty]
525                 public virtual string DestinationPageUrl {
526                         get {
527                                 object o = ViewState ["DestinationPageUrl"];
528                                 return (o == null) ? String.Empty : (string) o;
529                         }
530                         set {
531                                 if (value == null)
532                                         ViewState.Remove ("DestinationPageUrl");
533                                 else
534                                         ViewState ["DestinationPageUrl"] = value;
535                         }
536                 }
537
538                 [DefaultValue (true)]
539                 [Themeable (false)]
540                 public virtual bool DisplayRememberMe {
541                         get {
542                                 object o = ViewState ["DisplayRememberMe"];
543                                 return (o == null) ? true : (bool) o;
544                         }
545                         set {
546                                 ViewState ["DisplayRememberMe"] = value;
547                         }
548                 }
549
550                 [DefaultValue (LoginFailureAction.Refresh)]
551                 [Themeable (false)]
552                 [MonoTODO ("RedirectToLoginPage not yet implemented in FormsAuthentication")]
553                 public virtual LoginFailureAction FailureAction {
554                         get {
555                                 object o = ViewState ["FailureAction"];
556                                 return (o == null) ? LoginFailureAction.Refresh : (LoginFailureAction) o;
557                         }
558                         set {
559                                 if ((value < LoginFailureAction.Refresh) || (value > LoginFailureAction.RedirectToLoginPage))
560                                         throw new ArgumentOutOfRangeException ("FailureAction");
561                                 ViewState ["FailureAction"] = (int) value;
562                         }
563                 }
564
565                 [Localizable (true)]
566                 public virtual string FailureText {
567                         get {
568                                 object o = ViewState ["FailureText"];
569                                 return (o == null) ? Locale.GetText ("Your login attempt was not successful. Please try again.") : (string) o;
570                         }
571                         set {
572                                 if (value == null)
573                                         ViewState.Remove ("FailureText");
574                                 else
575                                         ViewState ["FailureText"] = value;
576                         }
577                 }
578
579                 [DefaultValue (null)]
580                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
581                 [NotifyParentProperty (true)]
582                 [PersistenceMode (PersistenceMode.InnerProperty)]
583                 public TableItemStyle FailureTextStyle {
584                         get {
585                                 if (failureTextStyle == null) {
586                                         failureTextStyle = new TableItemStyle ();
587                                         if (IsTrackingViewState) {
588                                                 (failureTextStyle as IStateManager).TrackViewState ();
589                                         }
590                                 }
591                                 return failureTextStyle;
592                         }
593                 }
594
595                 [DefaultValue ("")]
596                 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
597                 [UrlProperty]
598                 public virtual string HelpPageIconUrl {
599                         get {
600                                 object o = ViewState ["HelpPageIconUrl"];
601                                 return (o == null) ? String.Empty : (string) o;
602                         }
603                         set {
604                                 if (value == null)
605                                         ViewState.Remove ("HelpPageIconUrl");
606                                 else
607                                         ViewState ["HelpPageIconUrl"] = value;
608                         }
609                 }
610
611                 [DefaultValue ("")]
612                 [Localizable (true)]
613                 public virtual string HelpPageText {
614                         get {
615                                 object o = ViewState ["HelpPageText"];
616                                 return (o == null) ? String.Empty : (string) o;
617                         }
618                         set {
619                                 if (value == null)
620                                         ViewState.Remove ("HelpPageText");
621                                 else
622                                         ViewState ["HelpPageText"] = value;
623                         }
624                 }
625
626                 [DefaultValue ("")]
627                 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
628                 [UrlProperty]
629                 public virtual string HelpPageUrl {
630                         get {
631                                 object o = ViewState ["HelpPageUrl"];
632                                 return (o == null) ? String.Empty : (string) o;
633                         }
634                         set {
635                                 if (value == null)
636                                         ViewState.Remove ("HelpPageUrl");
637                                 else
638                                         ViewState ["HelpPageUrl"] = value;
639                         }
640                 }
641
642                 [DefaultValue (null)]
643                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
644                 [NotifyParentProperty (true)]
645                 [PersistenceMode (PersistenceMode.InnerProperty)]
646                 public TableItemStyle HyperLinkStyle {
647                         get {
648                                 if (hyperLinkStyle == null) {
649                                         hyperLinkStyle = new TableItemStyle ();
650                                         if (IsTrackingViewState) {
651                                                 (hyperLinkStyle  as IStateManager).TrackViewState ();
652                                         }
653                                 }
654                                 return hyperLinkStyle;
655                         }
656                 }
657
658                 [DefaultValue ("")]
659                 [Localizable (true)]
660                 public virtual string InstructionText {
661                         get {
662                                 object o = ViewState ["InstructionText"];
663                                 return (o == null) ? String.Empty : (string) o;
664                         }
665                         set {
666                                 if (value == null)
667                                         ViewState.Remove ("InstructionText");
668                                 else
669                                         ViewState ["InstructionText"] = value;
670                         }
671                 }
672
673                 [DefaultValue (null)]
674                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
675                 [NotifyParentProperty (true)]
676                 [PersistenceMode (PersistenceMode.InnerProperty)]
677                 public TableItemStyle InstructionTextStyle {
678                         get {
679                                 if (instructionTextStyle == null) {
680                                         instructionTextStyle = new TableItemStyle ();
681                                         if (IsTrackingViewState) {
682                                                 (instructionTextStyle as IStateManager).TrackViewState ();
683                                         }
684                                 }
685                                 return instructionTextStyle;
686                         }
687                 }
688
689                 [DefaultValue (null)]
690                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
691                 [NotifyParentProperty (true)]
692                 [PersistenceMode (PersistenceMode.InnerProperty)]
693                 public TableItemStyle LabelStyle {
694                         get {
695                                 if (labelStyle == null) {
696                                         labelStyle = new TableItemStyle ();
697                                         if (IsTrackingViewState) {
698                                                 (labelStyle as IStateManager).TrackViewState ();
699                                         }
700                                 }
701                                 return labelStyle;
702                         }
703                 }
704
705                 [Browsable (false)]
706                 [TemplateContainer (typeof (Login))]
707                 [PersistenceMode (PersistenceMode.InnerProperty)]
708                 public virtual ITemplate LayoutTemplate {
709                         get { return layoutTemplate; }
710                         set { layoutTemplate = value; }
711                 }
712
713                 [DefaultValue ("")]
714                 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
715                 [UrlProperty]
716                 public virtual string LoginButtonImageUrl {
717                         get {
718                                 object o = ViewState ["LoginButtonImageUrl"];
719                                 return (o == null) ? String.Empty : (string) o;
720                         }
721                         set {
722                                 if (value == null)
723                                         ViewState.Remove ("LoginButtonImageUrl");
724                                 else
725                                         ViewState ["LoginButtonImageUrl"] = value;
726                         }
727                 }
728
729                 [DefaultValue (null)]
730                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
731                 [NotifyParentProperty (true)]
732                 [PersistenceMode (PersistenceMode.InnerProperty)]
733                 public Style LoginButtonStyle {
734                         get {
735                                 if (logonButtonStyle == null) {
736                                         logonButtonStyle = new Style ();
737                                         if (IsTrackingViewState) {
738                                                 (logonButtonStyle as IStateManager).TrackViewState ();
739                                         }
740                                 }
741                                 return logonButtonStyle;
742                         }
743                 }
744
745                 [Localizable (true)]
746                 public virtual string LoginButtonText {
747                         get {
748                                 object o = ViewState ["LoginButtonText"];
749                                 return (o == null) ? Locale.GetText ("Log In") : (string) o;
750                         }
751                         set {
752                                 if (value == null)
753                                         ViewState.Remove ("LoginButtonText");
754                                 else
755                                         ViewState ["LoginButtonText"] = value;
756                         }
757                 }
758
759                 [DefaultValue (ButtonType.Button)]
760                 public virtual ButtonType LoginButtonType {
761                         get {
762                                 object o = ViewState ["LoginButtonType"];
763                                 return (o == null) ? ButtonType.Button : (ButtonType) o;
764                         }
765                         set {
766                                 if ((value < ButtonType.Button) || (value > ButtonType.Link))
767                                         throw new ArgumentOutOfRangeException ("LoginButtonType");
768                                 ViewState ["LoginButtonType"] = (int) value;
769                         }
770                 }
771
772                 [DefaultValue ("")]
773                 [Themeable (false)]
774                 public virtual string MembershipProvider {
775                         get {
776                                 object o = ViewState ["MembershipProvider"];
777                                 return (o == null) ? String.Empty : (string) o;
778                         }
779                         set {
780                                 if (value == null)
781                                         ViewState.Remove ("MembershipProvider");
782                                 else
783                                         ViewState ["MembershipProvider"] = value;
784                         }
785                 }
786
787                 [DefaultValue (Orientation.Vertical)]
788                 public virtual Orientation Orientation {
789                         get {
790                                 object o = ViewState ["Orientation"];
791                                 return (o == null) ? Orientation.Vertical : (Orientation) o;
792                         }
793                         set {
794                                 if ((value < Orientation.Horizontal) || (value > Orientation.Vertical))
795                                         throw new ArgumentOutOfRangeException ("Orientation");
796                                 ViewState ["Orientation"] = (int) value;
797                         }
798                 }
799
800                 [Browsable (false)]
801                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
802                 public virtual string Password {
803                         get {
804                                 return _password != null ? _password : String.Empty;
805                         }
806                 }
807
808                 [Localizable (true)]
809                 public virtual string PasswordLabelText {
810                         get {
811                                 object o = ViewState ["PasswordLabelText"];
812                                 return (o == null) ? "Password:" : (string) o;
813                         }
814                         set {
815                                 if (value == null)
816                                         ViewState.Remove ("PasswordLabelText");
817                                 else
818                                         ViewState ["PasswordLabelText"] = value;
819                         }
820                 }
821
822                 [DefaultValue ("")]
823                 [Editor ("System.Web.UI.Design.ImageUrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
824                 [UrlProperty]
825                 public virtual string PasswordRecoveryIconUrl {
826                         get {
827                                 object o = ViewState ["PasswordRecoveryIconUrl"];
828                                 return (o == null) ? String.Empty : (string) o;
829                         }
830                         set {
831                                 if (value == null)
832                                         ViewState.Remove ("PasswordRecoveryIconUrl");
833                                 else
834                                         ViewState ["PasswordRecoveryIconUrl"] = value;
835                         }
836                 }
837
838                 [DefaultValue ("")]
839                 [Localizable (true)]
840                 public virtual string PasswordRecoveryText {
841                         get {
842                                 object o = ViewState ["PasswordRecoveryText"];
843                                 return (o == null) ? String.Empty : (string) o;
844                         }
845                         set {
846                                 if (value == null)
847                                         ViewState.Remove ("PasswordRecoveryText");
848                                 else
849                                         ViewState ["PasswordRecoveryText"] = value;
850                         }
851                 }
852
853                 [DefaultValue ("")]
854                 [Editor ("System.Web.UI.Design.UrlEditor, " + Consts.AssemblySystem_Design, "System.Drawing.Design.UITypeEditor, " + Consts.AssemblySystem_Drawing)]
855                 [UrlProperty]
856                 public virtual string PasswordRecoveryUrl {
857                         get {
858                                 object o = ViewState ["PasswordRecoveryUrl"];
859                                 return (o == null) ? String.Empty : (string) o;
860                         }
861                         set {
862                                 if (value == null)
863                                         ViewState.Remove ("PasswordRecoveryUrl");
864                                 else
865                                         ViewState ["PasswordRecoveryUrl"] = value;
866                         }
867                 }
868
869                 [Localizable (true)]
870                 public virtual string PasswordRequiredErrorMessage {
871                         get {
872                                 object o = ViewState ["PasswordRequiredErrorMessage"];
873                                 return (o == null) ? Locale.GetText ("Password is required.") : (string) o;
874                         }
875                         set {
876                                 if (value == null)
877                                         ViewState.Remove ("PasswordRequiredErrorMessage");
878                                 else
879                                         ViewState ["PasswordRequiredErrorMessage"] = value;
880                         }
881                 }
882
883                 [DefaultValue (false)]
884                 [Themeable (false)]
885                 public virtual bool RememberMeSet {
886                         get {
887                                 object o = ViewState ["RememberMeSet"];
888                                 return (o == null) ? false : (bool) o;
889                         }
890                         set {
891                                 ViewState ["RememberMeSet"] = value;
892                         }
893                 }
894
895                 [Localizable (true)]
896                 public virtual string RememberMeText {
897                         get {
898                                 object o = ViewState ["RememberMeText"];
899                                 return (o == null) ? Locale.GetText ("Remember me next time.") : (string) o;
900                         }
901                         set {
902                                 if (value == null)
903                                         ViewState.Remove ("RememberMeText");
904                                 else
905                                         ViewState ["RememberMeText"] = value;
906                         }
907                 }
908
909                 protected override HtmlTextWriterTag TagKey {
910                         get { return HtmlTextWriterTag.Table; }
911                 }
912
913                 [DefaultValue (null)]
914                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
915                 [NotifyParentProperty (true)]
916                 [PersistenceMode (PersistenceMode.InnerProperty)]
917                 public Style TextBoxStyle {
918                         get {
919                                 if (textBoxStyle == null) {
920                                         textBoxStyle = new Style ();
921                                         if (IsTrackingViewState) {
922                                                 (textBoxStyle as IStateManager).TrackViewState ();
923                                         }
924                                 }
925                                 return textBoxStyle;
926                         }
927                 }
928
929                 [DefaultValue (LoginTextLayout.TextOnLeft)]
930                 public virtual LoginTextLayout TextLayout {
931                         get {
932                                 object o = ViewState ["TextLayout"];
933                                 return (o == null) ? LoginTextLayout.TextOnLeft : (LoginTextLayout) o;
934                         }
935                         set {
936                                 if ((value < LoginTextLayout.TextOnLeft) || (value > LoginTextLayout.TextOnTop))
937                                         throw new ArgumentOutOfRangeException ("TextLayout");
938                                 ViewState ["TextLayout"] = (int) value;
939                         }
940                 }
941
942                 [Localizable (true)]
943                 public virtual string TitleText {
944                         get {
945                                 object o = ViewState ["TitleText"];
946                                 return (o == null) ? Locale.GetText ("Log In") : (string) o;
947                         }
948                         set {
949                                 if (value == null)
950                                         ViewState.Remove ("TitleText");
951                                 else
952                                         ViewState ["TitleText"] = value;
953                         }
954                 }
955
956                 [DefaultValue (null)]
957                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
958                 [NotifyParentProperty (true)]
959                 [PersistenceMode (PersistenceMode.InnerProperty)]
960                 public TableItemStyle TitleTextStyle {
961                         get {
962                                 if (titleTextStyle == null) {
963                                         titleTextStyle = new TableItemStyle ();
964                                         if (IsTrackingViewState) {
965                                                 (titleTextStyle as IStateManager).TrackViewState ();
966                                         }
967                                 }
968                                 return titleTextStyle;
969                         }
970                 }
971
972                 [DefaultValue ("")]
973                 public virtual string UserName {
974                         get {
975                                 object o = ViewState ["UserName"];
976                                 return (o == null) ? String.Empty : (string) o;
977                         }
978                         set {
979                                 if (value == null)
980                                         ViewState.Remove ("UserName");
981                                 else
982                                         ViewState ["UserName"] = value;
983                         }
984                 }
985
986                 [Localizable (true)]
987                 public virtual string UserNameLabelText {
988                         get {
989                                 object o = ViewState ["UserNameLabelText"];
990                                 return (o == null) ? Locale.GetText ("User Name:") : (string) o;
991                         }
992                         set {
993                                 if (value == null)
994                                         ViewState.Remove ("UserNameLabelText");
995                                 else
996                                         ViewState ["UserNameLabelText"] = value;
997                         }
998                 }
999
1000                 [Localizable (true)]
1001                 public virtual string UserNameRequiredErrorMessage {
1002                         get {
1003                                 object o = ViewState ["UserNameRequiredErrorMessage"];
1004                                 return (o == null) ? Locale.GetText ("User Name is required.") : (string) o;
1005                         }
1006                         set {
1007                                 if (value == null)
1008                                         ViewState.Remove ("UserNameRequiredErrorMessage");
1009                                 else
1010                                         ViewState ["UserNameRequiredErrorMessage"] = value;
1011                         }
1012                 }
1013
1014                 [DefaultValue (null)]
1015                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
1016                 [NotifyParentProperty (true)]
1017                 [PersistenceMode (PersistenceMode.InnerProperty)]
1018                 public Style ValidatorTextStyle {
1019                         get {
1020                                 if (validatorTextStyle == null) {
1021                                         validatorTextStyle = new Style ();
1022                                         if (IsTrackingViewState) {
1023                                                 (validatorTextStyle as IStateManager).TrackViewState ();
1024                                         }
1025                                 }
1026                                 return validatorTextStyle;
1027                         }
1028                 }
1029
1030                 [DefaultValue (true)]
1031                 [Themeable (false)]
1032                 public virtual bool VisibleWhenLoggedIn {
1033                         get {
1034                                 object o = ViewState ["VisibleWhenLoggedIn"];
1035                                 return (o == null) ? true : (bool) o;
1036                         }
1037                         set {
1038                                 ViewState ["VisibleWhenLoggedIn"] = value;
1039                         }
1040                 }
1041
1042
1043                 // methods
1044
1045                 protected internal override void CreateChildControls ()
1046                 {
1047                         Controls.Clear ();
1048
1049                         Table table = new Table ();
1050                         table.ID = ClientID;
1051                         table.CellSpacing = 0;
1052                         table.CellPadding = BorderPadding;
1053
1054                         TableRow row = new TableRow ();
1055                         table.Rows.Add (row);
1056                         TableCell cell = new TableCell ();
1057                         row.Cells.Add (cell);
1058
1059                         Controls.Add (table);
1060
1061                         LoginContainer container = new LoginContainer ();
1062                         cell.Controls.Add (container);
1063
1064                         ITemplate template = LayoutTemplate;
1065                         if (template == null)
1066                                 template = new LoginTemplate (this);
1067
1068                         template.InstantiateIn (container);
1069
1070                         IEditableTextControl editable;
1071
1072                         editable = container.UserNameTextBox as IEditableTextControl;
1073
1074                         if (editable != null)
1075                                 editable.TextChanged += new EventHandler (UserName_TextChanged);
1076
1077                         editable = container.PasswordTextBox as IEditableTextControl;
1078
1079                         if (editable != null)
1080                                 editable.TextChanged += new EventHandler (Password_TextChanged);
1081
1082                         ICheckBoxControl checkBox = container.RememberMeCheckBox as ICheckBoxControl;
1083
1084                         if (checkBox != null)
1085                                 checkBox.CheckedChanged += new EventHandler (RememberMe_CheckedChanged);
1086                         
1087                 }
1088
1089                 protected override void LoadViewState (object savedState)
1090                 {
1091                         if (savedState == null) {
1092                                 base.LoadViewState (null);
1093                                 return;
1094                         }
1095
1096                         object[] state = (object[]) savedState;
1097                         base.LoadViewState (state [0]);
1098                         if (state [1] != null)
1099                                 (LoginButtonStyle as IStateManager).LoadViewState (state [1]);
1100                         if (state [2] != null)
1101                                 (LabelStyle as IStateManager).LoadViewState (state [2]);
1102                         if (state [3] != null)
1103                                 (TextBoxStyle as IStateManager).LoadViewState (state [3]);
1104                         if (state [4] != null)
1105                                 (HyperLinkStyle as IStateManager).LoadViewState (state [4]);
1106                         if (state [5] != null)
1107                                 (InstructionTextStyle as IStateManager).LoadViewState (state [5]);
1108                         if (state [6] != null)
1109                                 (TitleTextStyle as IStateManager).LoadViewState (state [6]);
1110                         if (state [7] != null)
1111                                 (CheckBoxStyle as IStateManager).LoadViewState (state [7]);
1112                         if (state [8] != null)
1113                                 (FailureTextStyle as IStateManager).LoadViewState (state [8]);
1114                         if (state [9] != null)
1115                                 (ValidatorTextStyle as IStateManager).LoadViewState (state [9]);
1116                 }
1117
1118                 protected virtual void OnAuthenticate (AuthenticateEventArgs e)
1119                 {
1120                         // this gets called after OnLoggingIn and the authentication so we can change the result
1121                         AuthenticateEventHandler authenticate = (AuthenticateEventHandler) Events [authenticateEvent];
1122                         if (authenticate != null)
1123                                 authenticate (this, e);
1124                 }
1125
1126                 protected override bool OnBubbleEvent (object source, EventArgs e)
1127                 {
1128                         // check for submit button
1129                         CommandEventArgs cea = (e as CommandEventArgs);
1130                         if ((cea != null) && (cea.CommandName == LoginButtonCommandName)) {
1131                                 AuthenticateUser ();
1132                                 return true;
1133                         }
1134                         return false;
1135                 }
1136
1137                 protected virtual void OnLoggedIn (EventArgs e)
1138                 {
1139                         // this gets called only if the authentication was successful
1140                         EventHandler loggedIn = (EventHandler) Events [loggedInEvent];
1141                         if (loggedIn != null)
1142                                 loggedIn (this, e);
1143                 }
1144
1145                 protected virtual void OnLoggingIn (LoginCancelEventArgs e)
1146                 {
1147                         // this gets called before OnAuthenticate so we can abort the authentication process
1148                         LoginCancelEventHandler loggingIn = (LoginCancelEventHandler) Events [loggingInEvent];
1149                         if (loggingIn != null)
1150                                 loggingIn (this, e);
1151                 }
1152
1153                 protected virtual void OnLoginError (EventArgs e)
1154                 {
1155                         // this gets called only if the authentication wasn't successful
1156                         EventHandler loginError = (EventHandler) Events [loginErrorEvent];
1157                         if (loginError != null)
1158                                 loginError (this, e);
1159                 }
1160
1161                 [MonoTODO ("overriden for ?")]
1162                 protected internal override void OnPreRender (EventArgs e)
1163                 {
1164                         base.OnPreRender (e);
1165                         // note: doc says that UserName and Password aren't available at 
1166                         // PageLoad but are during PreRender phase, so... ???
1167                 }
1168
1169                 protected internal override void Render (HtmlTextWriter writer)
1170                 {
1171                         // VisibleWhenLoggedIn isn't applicable to the default login page
1172                         if (!VisibleWhenLoggedIn && !IsDefaultLoginPage () && IsLoggedIn ())
1173                                 return;
1174
1175                         if (Page != null) {
1176                                 Page.VerifyRenderingInServerForm (this);
1177                         }
1178
1179                         EnsureChildControls ();
1180
1181                         RenderContents(writer);
1182                 }
1183
1184                 protected override object SaveViewState ()
1185                 {
1186                         object[] state = new object [10];
1187                         state [0] = base.SaveViewState ();
1188                         if (logonButtonStyle != null)
1189                                 state [1] = (logonButtonStyle as IStateManager).SaveViewState ();
1190                         if (labelStyle != null)
1191                                 state [2] = (labelStyle as IStateManager).SaveViewState ();
1192                         if (textBoxStyle != null)
1193                                 state [3] = (textBoxStyle as IStateManager).SaveViewState ();
1194                         if (hyperLinkStyle != null)
1195                                 state [4] = (hyperLinkStyle as IStateManager).SaveViewState ();
1196                         if (instructionTextStyle != null)
1197                                 state [5] = (instructionTextStyle as IStateManager).SaveViewState ();
1198                         if (titleTextStyle != null)
1199                                 state [6] = (titleTextStyle as IStateManager).SaveViewState ();
1200                         if (checkBoxStyle != null)
1201                                 state [7] = (checkBoxStyle as IStateManager).SaveViewState ();
1202                         if (failureTextStyle != null)
1203                                 state [8] = (failureTextStyle as IStateManager).SaveViewState ();
1204                         if (validatorTextStyle != null)
1205                                 state [9] = (validatorTextStyle as IStateManager).SaveViewState ();
1206
1207                         for (int i=0; i < state.Length; i++) {
1208                                 if (state [0] != null)
1209                                         return (object) state;
1210                         }
1211                         return null; // reduce view state
1212                 }
1213
1214                 [MonoTODO ("for design-time usage - no more details available")]
1215                 protected override void SetDesignModeState (IDictionary data)
1216                 {
1217                         base.SetDesignModeState (data);
1218                 }
1219
1220                 protected override void TrackViewState ()
1221                 {
1222                         base.TrackViewState ();
1223                         if (logonButtonStyle != null)
1224                                 (logonButtonStyle as IStateManager).TrackViewState ();
1225                         if (labelStyle != null)
1226                                 (labelStyle as IStateManager).TrackViewState ();
1227                         if (textBoxStyle != null)
1228                                 (textBoxStyle as IStateManager).TrackViewState ();
1229                         if (hyperLinkStyle != null)
1230                                 (hyperLinkStyle as IStateManager).TrackViewState ();
1231                         if (instructionTextStyle != null)
1232                                 (instructionTextStyle as IStateManager).TrackViewState ();
1233                         if (titleTextStyle != null)
1234                                 (titleTextStyle as IStateManager).TrackViewState ();
1235                         if (checkBoxStyle != null)
1236                                 (checkBoxStyle as IStateManager).TrackViewState ();
1237                         if (failureTextStyle != null)
1238                                 (failureTextStyle as IStateManager).TrackViewState ();
1239                         if (validatorTextStyle != null)
1240                                 (validatorTextStyle as IStateManager).TrackViewState ();
1241                 }
1242
1243
1244                 // events
1245
1246                 public event AuthenticateEventHandler Authenticate {
1247                         add { Events.AddHandler (authenticateEvent, value); }
1248                         remove { Events.RemoveHandler (authenticateEvent, value); }
1249                 }
1250
1251                 public event EventHandler LoggedIn {
1252                         add { Events.AddHandler (loggedInEvent, value); }
1253                         remove { Events.RemoveHandler (loggedInEvent, value); }
1254                 }
1255
1256                 public event LoginCancelEventHandler LoggingIn {
1257                         add { Events.AddHandler (loggingInEvent, value); }
1258                         remove { Events.RemoveHandler (loggingInEvent, value); }
1259                 }
1260
1261                 public event EventHandler LoginError {
1262                         add { Events.AddHandler (loginErrorEvent, value); }
1263                         remove { Events.RemoveHandler (loginErrorEvent, value); }
1264                 }
1265
1266
1267                 // private stuff
1268
1269                 private bool AuthenticateUser ()
1270                 {
1271                         LoginCancelEventArgs lcea = new LoginCancelEventArgs ();
1272                         OnLoggingIn (lcea);
1273                         if (lcea.Cancel)
1274                                 return true;
1275
1276                         string mp = MembershipProvider;
1277                         MembershipProvider provider = (mp.Length == 0) ?
1278                                 provider = Membership.Provider : Membership.Providers [mp];
1279                         if (provider == null) {
1280                                 throw new HttpException (Locale.GetText ("No provider named '{0}' could be found.", mp));
1281                         }
1282
1283                         AuthenticateEventArgs aea = new AuthenticateEventArgs ();
1284                         aea.Authenticated = provider.ValidateUser (UserName, Password);
1285                         OnAuthenticate (aea);
1286
1287                         if (aea.Authenticated) {
1288                                 string url = DestinationPageUrl;
1289                                 FormsAuthentication.SetAuthCookie (UserName, RememberMeSet);
1290                                 if (url.Length == 0) {
1291                                         Redirect (FormsAuthentication.LoginUrl);
1292                                 } else {
1293                                         Redirect (url);
1294                                 }
1295                                 OnLoggedIn (EventArgs.Empty);
1296                                 return true;
1297                         } else {
1298                                 OnLoginError (EventArgs.Empty);
1299                                 if (FailureAction == LoginFailureAction.RedirectToLoginPage) {
1300                                         // login page is defined in web.config
1301                                         FormsAuthentication.RedirectToLoginPage ();
1302                                 }
1303                                 return false;
1304                         }
1305                 }
1306
1307                 private void LoginClick (object sender, CommandEventArgs e)
1308                 {
1309                         RaiseBubbleEvent (sender, (EventArgs)e);
1310                 }
1311
1312                 private bool IsEmpty (Style style)
1313                 {
1314                         if (style == null)
1315                                 return true;
1316                         return style.IsEmpty;
1317                 }
1318
1319                 private bool IsDefaultLoginPage ()
1320                 {
1321                         if ((Page == null) || (Page.Request == null))
1322                                 return false;
1323                         string url = Page.Request.Url.AbsolutePath;
1324                         string defaultLogin = FormsAuthentication.LoginUrl;
1325                         return (String.Compare (defaultLogin, 0, url, url.Length - defaultLogin.Length, defaultLogin.Length,
1326                                 true, CultureInfo.InvariantCulture) == 0);
1327                 }
1328
1329                 private bool IsLoggedIn ()
1330                 {
1331                         if ((Page == null) || (Page.Request == null))
1332                                 return false;
1333                         return Page.Request.IsAuthenticated;
1334                 }
1335
1336                 private void Redirect (string url)
1337                 {
1338                         if ((Page != null) && (Page.Response != null))
1339                                 Page.Response.Redirect (url);
1340                 }
1341
1342                 private void UserName_TextChanged (object sender, EventArgs e)
1343                 {
1344                         UserName = ((ITextControl)sender).Text;
1345                 }
1346
1347                 private void Password_TextChanged (object sender, EventArgs e)
1348                 {
1349                         _password = ((ITextControl)sender).Text;
1350                 }
1351
1352                 private void RememberMe_CheckedChanged (object sender, EventArgs e)
1353                 {
1354                         RememberMeSet = ((ICheckBoxControl)sender).Checked;
1355                 }
1356         }
1357 }
1358
1359 #endif