/// <summary>
        /// Get Contact object with details from specified Xml data
        /// </summary>
        /// <param name="node">Xml data cursor model</param>
        /// <param name="resolver">Xml namespace resolver</param>
        /// <returns>Contact with details</returns>
        private static Contact GetContactDetail(XPathNavigator node, IXmlNamespaceResolver resolver)
        {
            Contact c = new Contact();
            c.Link = GetContactLink(node, resolver);

            const string xpathSelect = @"at:content/cc:Contact";

            XPathNodeIterator contactNodes = node.Select(xpathSelect, resolver);

            while (contactNodes.MoveNext())
            {
                XPathNavigator currentContactNode = contactNodes.Current;

                c.Id = GetContactId(currentContactNode);

                if (currentContactNode.HasChildren)
                {
                    currentContactNode.MoveToFirstChild();
                    do
                    {
                        switch (currentContactNode.Name)
                        {
                            case ContactXmlElementAddr1:
                                c.AddressLine1 = currentContactNode.Value;
                                break;
                            case ContactXmlElementAddr2:
                                c.AddressLine2 = currentContactNode.Value;
                                break;
                            case ContactXmlElementAddr3:
                                c.AddressLine3 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCity:
                                c.City = currentContactNode.Value;
                                break;
                            case ContactXmlElementCompanyName:
                                c.CompanyName = currentContactNode.Value;
                                break;
                            case ContactXmlElementConfirmed:
                                c.Confirmed = currentContactNode.ValueAsBoolean;
                                break;
                            case ContactXmlElementCountryCode:
                                c.CountryCode = currentContactNode.Value;
                                break;
                            case ContactXmlElementCountryName:
                                c.CountryName = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField1:
                                c.CustomField1 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField2:
                                c.CustomField2 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField3:
                                c.CustomField3 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField4:
                                c.CustomField4 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField5:
                                c.CustomField5 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField6:
                                c.CustomField6 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField7:
                                c.CustomField7 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField8:
                                c.CustomField8 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField9:
                                c.CustomField9 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField10:
                                c.CustomField10 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField11:
                                c.CustomField11 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField12:
                                c.CustomField12 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField13:
                                c.CustomField13 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField14:
                                c.CustomField14 = currentContactNode.Value;
                                break;
                            case ContactXmlElementCustomField15:
                                c.CustomField15 = currentContactNode.Value;
                                break;
                            case ContactXmlElementEmailAddresss:
                                c.EmailAddress = currentContactNode.Value;
                                break;
                            case ContactXmlElementEmailType:
                                c.EmailType = GetEmailType(currentContactNode.Value);
                                break;
                            case ContactXmlElementFirstName:
                                c.FirstName = currentContactNode.Value;
                                break;
                            case ContactXmlElementHomePhone:
                                c.HomePhone = currentContactNode.Value;
                                break;
                            case ContactXmlElementInsertTime:
                                c.InsertTime = currentContactNode.ValueAsDateTime;
                                break;
                            case ContactXmlElementJobTitle:
                                c.JobTitle = currentContactNode.Value;
                                break;
                            case ContactXmlElementLastName:
                                c.LastName = currentContactNode.Value;
                                break;
                            case ContactXmlElementLastUpdateTime:
                                c.LastUpdateTime = currentContactNode.ValueAsDateTime;
                                break;
                            case ContactXmlElementMiddleName:
                                c.MiddleName = currentContactNode.Value;
                                break;
                            case ContactXmlElementName:
                                c.Name = currentContactNode.Value;
                                break;
                            case ContactXmlElementNote:
                                c.Note = currentContactNode.Value;
                                break;
                            case ContactXmlElementPostalCode:
                                c.PostalCode = currentContactNode.Value;
                                break;
                            case ContactXmlElementStateCode:
                                c.StateCode = currentContactNode.Value;
                                break;
                            case ContactXmlElementStateName:
                                c.StateName = currentContactNode.Value;
                                break;
                            case ContactXmlElementStatus:
                                c.Status = GetContactStatus(currentContactNode.Value);
                                break;
                            case ContactXmlElementSubPostalCode:
                                c.SubPostalCode = currentContactNode.Value;
                                break;
                            case ContactXmlElementWorkPhone:
                                c.WorkPhone = currentContactNode.Value;
                                break;
                            case ContactXmlElementContactLists:
                                if (currentContactNode.HasChildren)
                                {
                                    // loop through all the Contact List
                                    XPathNavigator contactListsNode = currentContactNode.Clone();
                                    XPathNodeIterator lists = contactListsNode.Select("//cc:ContactList", resolver);
                                    while (lists.MoveNext())
                                    {
                                        // get current Contact List
                                        XPathNavigator list = lists.Current;

                                        ContactList contactList = new ContactList();
                                        // get the id of Contact List
                                        contactList.Id = GetContactListId(list);

                                        ContactOptInList optInList = new ContactOptInList();
                                        optInList.ContactList = contactList;

                                        if (list.HasChildren)
                                        {
                                            list.MoveToFirstChild();
                                            do
                                            {
                                                switch (list.Name)
                                                {
                                                    case ContactXmlElementOptInSource:
                                                        optInList.OptInSource = GetOptSource(list.Value);
                                                        break;
                                                    case ContactXmlElementOptInTime:
                                                        optInList.OptInTime = list.ValueAsDateTime;
                                                        break;
                                                }
                                            } while (list.MoveToNext());
                                        }

                                        // add the Contact List to current Contact
                                        c.ContactLists.Add(optInList);
                                    }
                                }
                                break;
                        }

                    } while (currentContactNode.MoveToNext());
                }

                break;
            }

            return c;
        }
    /// <summary>
    /// Get Contact information from the form
    /// </summary>
    /// <returns></returns>
    private Contact GetContactInformation()
    {
        Contact contact = new Contact();
        contact.Id = (string) Session["ContactIdToUpdate"];
        contact.Link = (string)Session["ContactEditLink"];
        contact.Status = ContactStatus;

        #region contact information
        contact.EmailAddress = Server.HtmlEncode(txtEmail.Text.Trim());
        contact.FirstName = Server.HtmlEncode(txtFirst.Text.Trim());
        contact.MiddleName = Server.HtmlEncode(txtMiddle.Text.Trim());
        contact.LastName = Server.HtmlEncode(txtLast.Text.Trim());
        contact.HomePhone = Server.HtmlEncode(txtHome.Text.Trim());
        contact.AddressLine1 = Server.HtmlEncode(txtAddr1.Text.Trim());
        contact.AddressLine2 = Server.HtmlEncode(txtAddr2.Text.Trim());
        contact.AddressLine3 = Server.HtmlEncode(txtAddr3.Text.Trim());
        contact.City = Server.HtmlEncode(txtCity.Text.Trim());
        contact.StateCode = string.IsNullOrEmpty(dropDownState.SelectedValue)
                                ? string.Empty
                                : dropDownState.SelectedValue;
        contact.StateName = string.IsNullOrEmpty(dropDownState.SelectedValue)
                                ? Server.HtmlEncode(txtOtherState.Text.Trim())
                                : dropDownState.SelectedItem.Text;
        contact.PostalCode = Server.HtmlEncode(txtZip.Text.Trim());
        contact.SubPostalCode = Server.HtmlEncode(txtSubZip.Text.Trim());
        contact.CountryName = dropDownCountry.SelectedItem.Text;
        contact.CountryCode = dropDownCountry.SelectedValue;
        #endregion

        #region contact lists
        // loop throught all the checkbox controls
        foreach (ListItem item in chkListContactLists.Items)
        {
            if (!item.Selected) continue;

            ContactOptInList contactOptInList = new ContactOptInList();
            contactOptInList.ContactList = new ContactList(item.Value);
            contact.ContactLists.Add(contactOptInList);
        }
        #endregion

        return contact;
    }
    /// <summary>
    /// Get Contact information from the form
    /// </summary>
    /// <returns></returns>
    private Contact GetContactInformation()
    {
        Contact contact = new Contact();
        contact.Id = (string) Session["ContactIdToUpdate"];
        contact.Link = (string)Session["ContactEditLink"];
        contact.Status = ContactStatus;

        #region contact information
        contact.EmailAddress = Server.HtmlEncode(txtEmail.Text.Trim());
        contact.FirstName = Server.HtmlEncode(txtFirst.Text.Trim());
        contact.MiddleName = Server.HtmlEncode(txtMiddle.Text.Trim());
        contact.LastName = Server.HtmlEncode(txtLast.Text.Trim());
        contact.HomePhone = Server.HtmlEncode(txtHome.Text.Trim());
        contact.AddressLine1 = Server.HtmlEncode(txtAddr1.Text.Trim());
        contact.AddressLine2 = Server.HtmlEncode(txtAddr2.Text.Trim());
        contact.AddressLine3 = Server.HtmlEncode(txtAddr3.Text.Trim());
        contact.City = Server.HtmlEncode(txtCity.Text.Trim());
        contact.StateCode = string.IsNullOrEmpty(dropDownState.SelectedValue)
                                ? string.Empty
                                : dropDownState.SelectedValue;
        contact.StateName = string.IsNullOrEmpty(dropDownState.SelectedValue)
                                ? Server.HtmlEncode(txtOtherState.Text.Trim())
                                : dropDownState.SelectedItem.Text;
        contact.PostalCode = Server.HtmlEncode(txtZip.Text.Trim());
        contact.SubPostalCode = Server.HtmlEncode(txtSubZip.Text.Trim());
        contact.CountryName = dropDownCountry.SelectedItem.Text;
        contact.CountryCode = dropDownCountry.SelectedValue;
        #endregion

        #region company
        contact.CompanyName = Server.HtmlEncode(txtComp.Text.Trim());
        contact.JobTitle = Server.HtmlEncode(txtJob.Text.Trim());
        contact.WorkPhone = Server.HtmlEncode(txtWork.Text.Trim());
        contact.EmailType = (ContactEmailType)Enum.Parse(typeof(ContactEmailType), rbtnListEmail.SelectedValue);
        #endregion

        #region custom fields
        contact.CustomField1 = Server.HtmlEncode(txtCust1.Text.Trim());
        contact.CustomField2 = Server.HtmlEncode(txtCust2.Text.Trim());
        contact.CustomField3 = Server.HtmlEncode(txtCust3.Text.Trim());
        contact.CustomField4 = Server.HtmlEncode(txtCust4.Text.Trim());
        contact.CustomField5 = Server.HtmlEncode(txtCust5.Text.Trim());
        contact.CustomField6 = Server.HtmlEncode(txtCust6.Text.Trim());
        contact.CustomField7 = Server.HtmlEncode(txtCust7.Text.Trim());
        contact.CustomField8 = Server.HtmlEncode(txtCust8.Text.Trim());
        contact.CustomField9 = Server.HtmlEncode(txtCust9.Text.Trim());
        contact.CustomField10 = Server.HtmlEncode(txtCust10.Text.Trim());
        contact.CustomField11 = Server.HtmlEncode(txtCust11.Text.Trim());
        contact.CustomField12 = Server.HtmlEncode(txtCust12.Text.Trim());
        contact.CustomField13 = Server.HtmlEncode(txtCust13.Text.Trim());
        contact.CustomField14 = Server.HtmlEncode(txtCust14.Text.Trim());
        contact.CustomField15 = Server.HtmlEncode(txtCust15.Text.Trim());
        #endregion

        #region Notes
        contact.Note = Server.HtmlEncode(txtNotes.Text.Trim());
        #endregion

        #region contact lists
        // loop throught all the checkbox controls
        foreach (ListItem item in chkListContactLists.Items)
        {
            if (!item.Selected) continue;

            ContactOptInList contactOptInList = new ContactOptInList();
            contactOptInList.ContactList = new ContactList(item.Value);
            contact.ContactLists.Add(contactOptInList);
        }
        #endregion

        return contact;
    }