Option Strict On
Imports 
Microsoft.VisualBasic
Imports System.ComponentModel

Namespace MikesControls
    
Public Class DynamicEmail
        
Inherits WebControl

#Region "Declarations"
        
Private _emailName, _domain, _extension As String
#End Region

#Region
 "Properties"
        <Browsable(
True), Bindable(True)> Public Property EmailLinkText() As String
            Get
                If 
ViewState("emailLinkText"Is Nothing Then
                    Return 
""
                
Else
                    Return 
ViewState("emailLinkText").ToString()
                
End If
            End Get
            Set
(ByVal value As String)
                ViewState(
"emailLinkText"value
            
End Set
        End Property

        
<Browsable(True), Bindable(True)> Public Property FullEmailAddress() As String
            Get
                If 
ViewState("fullEmailAddress"Is Nothing Then
                    Return 
""
                
Else
                    Return 
ViewState("fullEmailAddress").ToString()
                
End If
            End Get
            Set
(ByVal value As String)
                
If value "" Then
                    
_extension ""
                    
_domain ""
                    
_emailName ""
                    
ViewState.Remove("fullEmailAddress")
                
Else
                    
ViewState("fullEmailAddress"value
                    ParseFullEmailAddress(value)
                
End If
            End Set
        End Property

        
<Browsable(True), Bindable(True)> Public Property EmailName() As String
            Get
                If 
ViewState("emailName"Is Nothing Then
                   Return 
""
                
Else
                   Return 
ViewState("emailName").ToString()
                
End If
            End Get
            Set
(ByVal value As String)
                
If value "" Then
                    
ViewState.Remove("emailName")
                
Else
                    
ViewState("emailName"value
                
End If
            End Set
        End Property

        
<Browsable(True), Bindable(True)> Public Property Domain() As String
            Get
                If 
ViewState("domain"Is Nothing Then
                   Return 
"" 
                
Else
                   Return 
ViewState("domain").ToString()
                
End If   
            End Get
            Set
(ByVal value As String)
                
If value "" Then
                    
ViewState.Remove("domain")
                
Else
                    
ViewState("domain"value
                
End If
            End Set
        End Property

        
<Browsable(True), Bindable(True)> Public Property Extension() As String
            Get
                Dim 
retValue As String = ""
                
If Not ViewState("extension"Is Nothing Then
                   
retValue ViewState("extension").ToString()
                
End If   

                
' Remove dot if necessary
                
If retValue.IndexOf(".") > -Then
                    If 
retValue.Substring(01"." Then
                        
retValue retValue.Substring(1)
                    
End If
                End If
                Return 
retValue
            
End Get
            Set
(ByVal value As String)
                
If value "" Then
                    
ViewState.Remove("extension")
                
Else
                    
' Remove dot if necessary
                    
If value.Substring(01"." Then
                        
value value.Substring(1)
                    
End If
                    
ViewState("extension"value
                
End If
            End Set
        End Property

        Public ReadOnly Property 
FullEmailAddressEmailName() As String
            Get
                If 
ViewState("fullEmailAddress"Is Nothing Then
                    Return Me
.EmailName
                
Else
                    Return 
_emailName
                
End If
            End Get
        End Property

        Public ReadOnly Property 
FullEmailAddressDomain() As String
            Get
                If 
ViewState("fullEmailAddress"Is Nothing Then
                    Return Me
.Domain
                
Else
                    Return 
_domain
                
End If
            End Get
        End Property

        Public ReadOnly Property 
FullEmailAddressExtension() As String
            Get
                If 
ViewState("fullEmailAddress"Is Nothing Then
                    Return Me
.Extension
                
Else
                    Return 
_extension
                
End If
            End Get
        End Property

        
<Browsable(True), DefaultValue(" AT "), Bindable(True)> Public Property DomainDelimiterText() As String
            Get
                If 
ViewState("DomainDelimiterText"Is Nothing Then
                    Return 
" AT "
                
Else
                    Return 
ViewState("DomainDelimiterText").ToString()
                
End If
            End Get
            Set
(ByVal value As String)
                ViewState(
"DomainDelimiterText"value
            
End Set
        End Property

        
<Browsable(True), DefaultValue(" DOT "), Bindable(True)> Public Property ExtensionDelimiterText() As String
            Get
                If 
ViewState("ExtensionDelimiterText"Is Nothing Then
                    Return 
" DOT "
                
Else
                    Return 
ViewState("ExtensionDelimiterText").ToString()
                
End If
            End Get
            Set
(ByVal value As String)
                ViewState(
"ExtensionDelimiterText"value
            
End Set
        End Property
        
<Browsable(False), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
        
Protected ReadOnly Property DynamicEmailFunctionCall() As String
            Get
                If 
ViewState("fullEmailAddress"Is Nothing Then
                    Return 
"this.href=DynamicEmail('" Me.EmailName & "','" Me.Domain & "','" Me.Extension & "')"
                
Else
                    Return 
"this.href=DynamicEmail('" & _emailName & "','" & _domain & "','" & _extension & "')"
                
End If
            End Get
        End Property
#End Region

#Region
 "Overrides"
        
Protected Overrides Sub OnPreRender(ByVal As System.EventArgs)
            
MyBase.OnPreRender(e)

            
Dim dynamicEmailJavaScript As New StringBuilder()
            dynamicEmailJavaScript.Append(
"<script language=""javascript"">;")
            dynamicEmailJavaScript.Append(
"function DynamicEmail(name, domain, extension, subject)")
            dynamicEmailJavaScript.Append(
"{")
            dynamicEmailJavaScript.Append(
"return ""mailto:"" + name + ""@"" + domain + ""."" + extension")
            dynamicEmailJavaScript.Append(
"}")
            dynamicEmailJavaScript.Append(
"</" "script>")
            
' 2.0 version
            
Page.ClientScript.RegisterClientScriptBlock(Page.GetType(), "mc:DynamicEmailControl", dynamicEmailJavaScript.ToString(), False)
            
' 1.1 version
            'Page.RegisterClientScriptBlock("mc:DynamicEmailControl", dynamicEmailJavaScript.ToString())
        
End Sub

        Protected Overrides Sub 
AddAttributesToRender(ByVal writer As System.Web.UI.HtmlTextWriter)
            
MyBase.AddAttributesToRender(writer)
            writer.AddAttribute(HtmlTextWriterAttribute.Href, 
" ")
            writer.AddAttribute(HtmlTextWriterAttribute.Onclick, 
Me.DynamicEmailFunctionCall)
            writer.AddAttribute(
"onmouseover"Me.DynamicEmailFunctionCall)
        
End Sub

        Protected Overrides ReadOnly Property 
TagKey() As System.Web.UI.HtmlTextWriterTag
            
Get
                Return 
HtmlTextWriterTag.A
            
End Get
        End Property

        Protected Overrides Sub 
RenderContents(ByVal writer As System.Web.UI.HtmlTextWriter)
            
Dim textToRender As String = ""
            
If Me.EmailLinkText Is Nothing OrElse Me.EmailLinkText "" Then
                If 
ViewState("fullEmailAddress"Is Nothing Then
                    
textToRender = Me.EmailName & Me.DomainDelimiterText & Me.Domain & Me.ExtensionDelimiterText & Me.Extension
                
Else
                    
textToRender _emailName & Me.DomainDelimiterText & _domain & Me.ExtensionDelimiterText & _extension
                
End If
            Else
                
textToRender = Me.EmailLinkText
            
End If
             
writer.Write(textToRender)
        
End Sub
#End Region

#Region
 "Helper Members"
        
Private Function FullEmailAddressIsValid(ByVal fullEmailAddress As StringAs Boolean

            Return True
        End Function

        Private Sub 
ParseFullEmailAddress(ByVal fullEmailAddress As String)
            _emailName 
""
            
_extension ""
            
_domain ""
            
If fullEmailAddress "" Then
                Exit Sub
            End If
            
' Got this RegEx straight out of the docs.
            
If Regex.IsMatch(fullEmailAddress, "^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$"Then
                Dim 
atPos As Integer = fullEmailAddress.IndexOf("@")
                
Dim lastDot As Integer = fullEmailAddress.LastIndexOf(".")
                
If atPos -Or lastDot -Then
                    
' Do nothing -- malformed email address that somehow escaped the RegEx
                
Else
                    
_emailName fullEmailAddress.Substring(0, atPos)
                    _domain 
fullEmailAddress.Substring(atPos + 1, lastDot - atPos - 1)
                    _extension 
fullEmailAddress.Substring(lastDot + 1)
                
End If
            End If
        End Sub
#End Region
    End Class
End Namespace

Colorized by: CarlosAg.CodeColorizer