Archives

Archives / 2010 / December
  • ASP.NET Podcast Show #148 - ASP.NET WebForms to build a Mobile Web Application

    Check the podcast site for the original url.

    This is the video and source code for an ASP.NET WebForms app that I wrote that is optimized for the iPhone and mobile environments. 

    Subscribe to everything.

    Subscribe to WMV.

    Subscribe to M4V for iPhone/iPad.

    Subscribe to MP3.

    Download WMV.

    Download M4V for iPhone/iPad.

    Download MP3.

    Link to iWebKit.

    Source Code:

    <%@ Page Title="MapSplore" Language="C#" MasterPageFile="iPhoneMaster.master" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="AT_iPhone_Default" %>

    <asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
    </asp:Content>
    <asp:Content ID="Content2" ContentPlaceHolderID="Content" Runat="Server" ClientIDMode="Static">
        <asp:ScriptManager ID="sm" runat="server"
            EnablePartialRendering="true" EnableHistory="false" EnableCdn="true" />
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>
        <script  language="javascript"  type="text/javascript">
        <!--
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(endRequestHandle);
        function endRequestHandle(sender, Args) {
            setupMapDiv();
            setupPlaceIveBeen();
        }
        function setupPlaceIveBeen() {
            var mapPlaceIveBeen = document.getElementById('divPlaceIveBeen');
            if (mapPlaceIveBeen != null) {
                var PlaceLat = document.getElementById('<%=hdPlaceIveBeenLatitude.ClientID %>').value;
                var PlaceLon = document.getElementById('<%=hdPlaceIveBeenLongitude.ClientID %>').value;
                var PlaceTitle = document.getElementById('<%=lblPlaceIveBeenName.ClientID %>').innerHTML;
                var latlng = new google.maps.LatLng(PlaceLat, PlaceLon);
                var myOptions = {
                    zoom: 14,
                    center: latlng,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                };
                var map = new google.maps.Map(mapPlaceIveBeen, myOptions);
                var marker = new google.maps.Marker({
                    position: new google.maps.LatLng(PlaceLat, PlaceLon),
                    map: map,
                    title: PlaceTitle,
                    clickable: false
                });
            }
        }
        function setupMapDiv() {
            var mapdiv = document.getElementById('divImHere');
            if (mapdiv != null) {
                var PlaceLat = document.getElementById('<%=hdPlaceLat.ClientID %>').value;
                var PlaceLon = document.getElementById('<%=hdPlaceLon.ClientID %>').value;
                var PlaceTitle = document.getElementById('<%=hdPlaceTitle.ClientID %>').value;
                var latlng = new google.maps.LatLng(PlaceLat, PlaceLon);
                var myOptions = {
                    zoom: 14,
                    center: latlng,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                };
                var map = new google.maps.Map(mapdiv, myOptions);
                var marker = new google.maps.Marker({
                    position: new google.maps.LatLng(PlaceLat, PlaceLon),
                    map: map,
                    title: PlaceTitle,
                    clickable: false
                });
            }

        }
        -->
        </script>
        <asp:HiddenField ID="Latitude" runat="server" />
        <asp:HiddenField ID="Longitude" runat="server" />
        <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js%22%3E%3C/script>
        <script language="javascript" type="text/javascript">
            $(document).ready(function () {
                GetLocation();
                setupMapDiv();
                setupPlaceIveBeen();
            });
            function GetLocation() {
                if (navigator.geolocation != null) {
                    navigator.geolocation.getCurrentPosition(getData);
                }
                else {
                    var mess = document.getElementById('<%=Message.ClientID %>');
                    mess.innerHTML = "Sorry, your browser does not support geolocation. " +
                        "Try the latest version of Safari on the iPhone, Android browser, or the latest version of FireFox.";
                }
            }
            function UpdateLocation_Click() {
                GetLocation();
            }
            function getData(position) {
                var latitude = position.coords.latitude;
                var longitude = position.coords.longitude;
                var hdLat = document.getElementById('<%=Latitude.ClientID %>');
                var hdLon = document.getElementById('<%=Longitude.ClientID %>');
                hdLat.value = latitude;
                hdLon.value = longitude;
            }
        </script>
        <asp:Label ID="Message" runat="server" />
        <asp:UpdatePanel ID="upl" runat="server">
            <ContentTemplate>
        <asp:Panel ID="pnlStart" runat="server" Visible="true">
        <div id="topbar">
            <div id="title">MapSplore</div>
        </div>
        <div id="content">
            <ul class="pageitem">
                <li class="menu">
                    <asp:LinkButton ID="lbLocalDeals" runat="server" onclick="lbLocalDeals_Click">
                    <asp:Image ID="imLocalDeals" runat="server" ImageUrl="~/Images/ArtFavor_Money_Bag_Icon.png" Height="30" />
                    <span class="name">Local Deals.</span>
                    <span class="arrow"></span>
                    </asp:LinkButton>
                    </li>
                <li class="menu">
                    <asp:LinkButton ID="lbLocalPlaces" runat="server" onclick="lbLocalPlaces_Click">
                    <asp:Image ID="imLocalPlaces" runat="server" ImageUrl="~/Images/Andy_Houses_on_the_horizon_-_Starburst_remix.png" Height="30" />
                    <span class="name">Local Places.</span>
                    <span class="arrow"></span>
                    </asp:LinkButton>
                    </li>
                <li class="menu">
                    <asp:LinkButton ID="lbWhereIveBeen" runat="server" onclick="lbWhereIveBeen_Click">
                    <asp:Image ID="imImHere" runat="server" ImageUrl="~/Images/ryanlerch_flagpole.png" Height="30" />
                    <span class="name">I've been here.</span>
                    <span class="arrow"></span>
                    </asp:LinkButton>
                    </li>
                <li class="menu">
                    <asp:LinkButton ID="lbMyStats" runat="server">
                    <asp:Image ID="imMyStats" runat="server" ImageUrl="~/Images/Anonymous_Spreadsheet.png" Height="30" />
                    <span class="name">My Stats.</span>
                    <span class="arrow"></span>
                    </asp:LinkButton>
                    </li>
                <li class="menu">
                    <asp:LinkButton ID="lbAddAPlace" runat="server" onclick="lbAddAPlace_Click">
                    <asp:Image ID="imAddAPlace" runat="server" ImageUrl="~/Images/jean_victor_balin_add.png" Height="30" />
                    <span class="name">Add a Place.</span>
                    <span class="arrow"></span>
                    </asp:LinkButton>
                    </li>
                <li class="button">
                    <input type="button" value="Update Your Current Location" onclick="UpdateLocation_Click()">
                    </li>
            </ul>
        </div>
        </asp:Panel>
        <div>
        <asp:Panel ID="pnlCoupons" runat="server" Visible="false">
            <div id="topbar">
            <div id="title">MapSplore</div>
            <div id="leftbutton">
                <asp:LinkButton runat="server" Text="Return"
                    ID="ReturnFromDeals" OnClick="ReturnFromDeals_Click" /></div></div>
        <div class="content">
        <asp:ListView ID="lvCoupons" runat="server">
            <LayoutTemplate>
                <ul class="pageitem" runat="server">
                    <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
                </ul>
            </LayoutTemplate>
            <ItemTemplate>
                <li class="menu">
                    <asp:LinkButton ID="lbBusiness" runat="server" Text='<%#Eval("Place.Name") %>' OnClick="lbBusiness_Click">
                        <span class="comment">
                        <asp:Label ID="lblAddress" runat="server" Text='<%#Eval("Place.Address1") %>' />
                        <asp:Label ID="lblDis" runat="server" Text='<%# Convert.ToString(Convert.ToInt32(Eval("Place.Distance"))) + " meters" %>' CssClass="smallText" />
                        <asp:HiddenField ID="hdPlaceId" runat="server" Value='<%#Eval("PlaceId") %>' />
                        <asp:HiddenField ID="hdGeoPromotionId" runat="server" Value='<%#Eval("GeoPromotionId") %>' />
                        </span>
                        <span class="arrow"></span>
                    </asp:LinkButton></li></ItemTemplate></asp:ListView><asp:GridView ID="gvCoupons" runat="server" AutoGenerateColumns="false">
                <HeaderStyle BackColor="Silver" />
                <AlternatingRowStyle BackColor="Wheat" />
                <Columns>
                    <asp:TemplateField AccessibleHeaderText="Business" HeaderText="Business">
                        <ItemTemplate>
                            <asp:Image ID="imPlaceType" runat="server" Text='<%#Eval("Type") %>' ImageUrl='<%#Eval("Image") %>' />
                            <asp:LinkButton ID="lbBusiness" runat="server" Text='<%#Eval("Name") %>' OnClick="lbBusiness_Click" />
                            <asp:LinkButton ID="lblAddress" runat="server" Text='<%#Eval("Address1") %>' CssClass="smallText" />
                            <asp:Label ID="lblDis" runat="server" Text='<%# Convert.ToString(Convert.ToInt32(Eval("Distance"))) + " meters" %>' CssClass="smallText" />
                            <asp:HiddenField ID="hdPlaceId" runat="server" Value='<%#Eval("PlaceId") %>' />
                            <asp:HiddenField ID="hdGeoPromotionId" runat="server" Value='<%#Eval("GeoPromotionId") %>' />
                            <asp:Label ID="lblInfo" runat="server" Visible="false" />
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
        </div>
        </asp:Panel>
        <asp:Panel ID="pnlPlaces" runat="server" Visible="false">
        <div id="topbar">
            <div id="title">
                MapSplore</div><div id="leftbutton">
                <asp:LinkButton runat="server" Text="Return"
                    ID="ReturnFromPlaces" OnClick="ReturnFromPlaces_Click" /></div></div>
            <div id="content">
            <asp:ListView ID="lvPlaces" runat="server">
                <LayoutTemplate>
                    <ul id="ulPlaces" class="pageitem" runat="server">
                        <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
                        <li class="menu">
                            <asp:LinkButton ID="lbNotListed" runat="server" CssClass="name"
                                OnClick="lbNotListed_Click">
                                Place not listed
                                <span class="arrow"></span>   
                            </asp:LinkButton>
                        </li>
                    </ul>
                </LayoutTemplate>
                <ItemTemplate>
                <li class="menu">
                    <asp:LinkButton ID="lbImHere" runat="server" CssClass="name"
                        OnClick="lbImHere_Click">
                    <%#DisplayName(Eval("Name")) %>&nbsp;
                    <%# Convert.ToString(Convert.ToInt32(Eval("Distance"))) + " meters" %>
                    <asp:HiddenField ID="hdPlaceId" runat="server" Value='<%#Eval("PlaceId") %>' />
                    <span class="arrow"></span>
                    </asp:LinkButton></li></ItemTemplate></asp:ListView>
        </div>
        </asp:Panel>
        <asp:Panel ID="pnlImHereNow" runat="server" Visible="false">
            <div id="topbar">
            <div id="title">
                MapSplore</div><div id="leftbutton">
                <asp:LinkButton runat="server" Text="Places"
                    ID="lbImHereNowReturn" OnClick="lbImHereNowReturn_Click" /></div></div>
                <div id="rightbutton">
                <asp:LinkButton runat="server" Text="Beginning"
                    ID="lbBackToBeginning" OnClick="lbBackToBeginning_Click" />
                </div>
            <div id="content">
            <ul class="pageitem">
            <asp:HiddenField ID="hdPlaceId" runat="server" />
            <asp:HiddenField ID="hdPlaceLat" runat="server" />
            <asp:HiddenField ID="hdPlaceLon" runat="server" />
            <asp:HiddenField ID="hdPlaceTitle" runat="server" />
            <asp:Button ID="btnImHereNow" runat="server"
                Text="I'm here" OnClick="btnImHereNow_Click" />
                <asp:Label ID="lblPlaceTitle" runat="server" /><br />
            <asp:TextBox ID="txtWhatsHappening" runat="server" TextMode="MultiLine" Rows="2" style="width:300px" /><br />
            <div id="divImHere" style="width:300px; height:300px"></div>
            </div>
            </ul>
        </asp:Panel>
        <asp:Panel runat="server" ID="pnlIveBeenHere" Visible="false">
            <div id="topbar">
            <div id="title">
                Where I've been</div><div id="leftbutton">
                <asp:LinkButton ID="lbIveBeenHereBack" runat="server" Text="Back" OnClick="lbIveBeenHereBack_Click" /></div></div>
            <div id="content">
            <asp:ListView ID="lvWhereIveBeen" runat="server">
                <LayoutTemplate>
                    <ul id="ulWhereIveBeen" class="pageitem" runat="server">
                        <asp:PlaceHolder ID="itemPlaceholder" runat="server" />
                    </ul>
                </LayoutTemplate>
                <ItemTemplate>
                <li class="menu" runat="server">
                    <asp:LinkButton ID="lbPlaceIveBeen" runat="server" OnClick="lbPlaceIveBeen_Click" CssClass="name">
                        <asp:Label ID="lblPlace" runat="server" Text='<%#Eval("PlaceName") %>' /> at
                        <asp:Label ID="lblTime" runat="server" Text='<%#Eval("ATTime") %>' CssClass="content" />
                        <asp:HiddenField ID="hdATID" runat="server" Value='<%#Eval("ATID") %>' />
                        <span class="arrow"></span>
                    </asp:LinkButton>
                </li>
                </ItemTemplate>
            </asp:ListView>
            </div>
            </asp:Panel>
        <asp:Panel runat="server" ID="pnlPlaceIveBeen" Visible="false">
            <div id="topbar">
            <div id="title">
                I've been here
            </div>
            <div id="leftbutton">
                <asp:LinkButton ID="lbPlaceIveBeenBack" runat="server" Text="Back" OnClick="lbPlaceIveBeenBack_Click" />
            </div>
            <div id="rightbutton">
                <asp:LinkButton ID="lbPlaceIveBeenBeginning" runat="server" Text="Beginning" OnClick="lbPlaceIveBeenBeginning_Click" />
            </div>
            </div>
            <div id="content">
                <ul class="pageitem">
                <li>
                <asp:HiddenField ID="hdPlaceIveBeenPlaceId" runat="server" />
                <asp:HiddenField ID="hdPlaceIveBeenLatitude" runat="server" />
                <asp:HiddenField ID="hdPlaceIveBeenLongitude" runat="server" />
                <asp:Label ID="lblPlaceIveBeenName" runat="server" /><br />
                <asp:Label ID="lblPlaceIveBeenAddress" runat="server" /><br />
                <asp:Label ID="lblPlaceIveBeenCity" runat="server" />,
                <asp:Label ID="lblPlaceIveBeenState" runat="server" />
                <asp:Label ID="lblPlaceIveBeenZipCode" runat="server" /><br />
                <asp:Label ID="lblPlaceIveBeenCountry" runat="server" /><br />
                <div id="divPlaceIveBeen" style="width:300px; height:300px"></div>
                </li>
                </ul>
            </div>
               
        </asp:Panel>

            <asp:Panel ID="pnlAddPlace" runat="server" Visible="false">
                    <div id="topbar">
    <div id="title">MapSplore</div><div id="leftbutton">
    <asp:LinkButton ID="lbAddPlaceReturn" runat="server" Text="Back" OnClick="lbAddPlaceReturn_Click" /></div><div id="rightnav">
    </div>
    </div>
    <div id="content">
        <ul class="pageitem">
            <li id="liPlaceAddMessage" runat="server" visible="false">
            <asp:Label ID="PlaceAddMessage" runat="server" />
            </li>
            <li class="bigfield">
            <asp:TextBox ID="txtPlaceName" runat="server" placeholder="Name of Establishment" />
            </li>
            <li class="bigfield">
            <asp:TextBox ID="txtAddress1" runat="server" placeholder="Address 1" />
            </li>
            <li class="bigfield">
            <asp:TextBox ID="txtCity" runat="server" placeholder="City" />
            </li>
            <li class="select">
            <asp:DropDownList ID="ddlProvince" runat="server" placeholder="Select State" /> 
            <span class="arrow"></span>     
            </li>
            <li class="bigfield">
            <asp:TextBox ID="txtZipCode" runat="server" placeholder="Zip Code" />
            </li>
            <li class="select">
            <asp:DropDownList ID="ddlCountry" runat="server"
                onselectedindexchanged="ddlCountry_SelectedIndexChanged" />
            <span class="arrow"></span>
            </li>
            <li class="bigfield">
            <asp:TextBox ID="txtPhoneNumber" runat="server" placeholder="Phone Number" />
            </li>
            <li class="checkbox">
                <span class="name">You Here Now:</span> <asp:CheckBox ID="cbYouHereNow" runat="server" Checked="true" />
            </li>
            <li class="button">
            <asp:Button ID="btnAdd" runat="server" Text="Add Place"
                onclick="btnAdd_Click" />
            </li>
        </ul>
    </div>
            </asp:Panel>
            <asp:Panel ID="pnlImHere" runat="server" Visible="false">
                <asp:TextBox ID="txtImHere" runat="server"
                    TextMode="MultiLine" Rows="3" Columns="40" /><br />
                <asp:DropDownList ID="ddlPlace" runat="server" /><br />
                <asp:Button ID="btnHere" runat="server" Text="Tell Everyone I'm Here"
                    onclick="btnHere_Click" /><br />
            </asp:Panel>

        </div>
        </ContentTemplate>
        </asp:UpdatePanel>

    </asp:Content>

    Code Behind .cs file:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;
    using LocationDataModel;

    public partial class AT_iPhone_Default : ViewStatePage
    {
        private iPhoneDevice ipd;

        protected void Page_Load(object sender, EventArgs e)
        {
            LocationDataEntities lde = new LocationDataEntities();
            if (!Page.IsPostBack)
            {
                var Countries = from c in lde.Countries select c;
                foreach (Country co in Countries)
                {
                    ddlCountry.Items.Add(new ListItem(co.Name, co.CountryId.ToString()));
                }
                ddlCountry_SelectedIndexChanged(ddlCountry, null);
                if (AppleIPhone.IsIPad())
                    ipd = iPhoneDevice.iPad;
                if (AppleIPhone.IsIPhone())
                    ipd = iPhoneDevice.iPhone;
                if (AppleIPhone.IsIPodTouch())
                    ipd = iPhoneDevice.iPodTouch;
            }
        }
        protected void btnPlaces_Click(object sender, EventArgs e)
        {
        }
        protected void btnAdd_Click(object sender, EventArgs e)
        {
            bool blImHere = cbYouHereNow.Checked;
            string Place = txtPlaceName.Text,
                Address1 = txtAddress1.Text,
                City = txtCity.Text,
                ZipCode = txtZipCode.Text,
                PhoneNumber = txtPhoneNumber.Text,
                ProvinceId = ddlProvince.SelectedItem.Value,
                CountryId = ddlCountry.SelectedItem.Value;
            int iProvinceId, iCountryId;
            double dLatitude, dLongitude;
            DataAccess da = new DataAccess();
            if ((!String.IsNullOrEmpty(ProvinceId)) &&
                (!String.IsNullOrEmpty(CountryId)))
            {
                iProvinceId = Convert.ToInt32(ProvinceId);
                iCountryId = Convert.ToInt32(CountryId);
                if (blImHere)
                {
                    dLatitude = Convert.ToDouble(Latitude.Value);
                    dLongitude = Convert.ToDouble(Longitude.Value);
                    da.StorePlace(Place, Address1, String.Empty, City,
                        iProvinceId, ZipCode, iCountryId, PhoneNumber,
                        dLatitude, dLongitude);
                }
                else
                {
                    da.StorePlace(Place, Address1, String.Empty, City,
                        iProvinceId, ZipCode, iCountryId, PhoneNumber);
                }
                liPlaceAddMessage.Visible = true;
                PlaceAddMessage.Text = "Awesome, your place has been added. Add Another!";
                txtPlaceName.Text = String.Empty;
                txtAddress1.Text = String.Empty;
                txtCity.Text = String.Empty;
                ddlProvince.SelectedIndex = -1;
                txtZipCode.Text = String.Empty;
                txtPhoneNumber.Text = String.Empty;
            }
            else
            {
                liPlaceAddMessage.Visible = true;
                PlaceAddMessage.Text = "Please select a State and a Country.";
            }
        }
        protected void ddlCountry_SelectedIndexChanged(object sender, EventArgs e)
        {
            string CountryId = ddlCountry.SelectedItem.Value;
            if (!String.IsNullOrEmpty(CountryId))
            {
                int iCountryId = Convert.ToInt32(CountryId);
                LocationDataModel.LocationDataEntities lde = new LocationDataModel.LocationDataEntities();
                var prov = from p in lde.Provinces where p.CountryId == iCountryId
                           orderby p.ProvinceName select p;
               
                ddlProvince.Items.Add(String.Empty);
                foreach (Province pr in prov)
                {
                    ddlProvince.Items.Add(new ListItem(pr.ProvinceName, pr.ProvinceId.ToString()));
                }
            }
            else
            {
                ddlProvince.Items.Clear();
            }
        }
        protected void btnImHere_Click(object sender, EventArgs e)
        {
            int i = 0;
            DataAccess da = new DataAccess();
            double Lat = Convert.ToDouble(Latitude.Value),
                Lon = Convert.ToDouble(Longitude.Value);
            List<Place> lp = da.NearByLocations(Lat, Lon);
            foreach (Place p in lp)
            {
                ListItem li = new ListItem(p.Name, p.PlaceId.ToString());
                if (i == 0)
                {
                    li.Selected = true;
                }
                ddlPlace.Items.Add(li);
                i++;
            }
            pnlAddPlace.Visible = false;
            pnlImHere.Visible = true;
        }
        protected void lbImHere_Click(object sender, EventArgs e)
        {
            string UserName = Membership.GetUser().UserName;
            ListViewItem lvi = (ListViewItem)(((LinkButton)sender).Parent);
            HiddenField hd = (HiddenField)lvi.FindControl("hdPlaceId");
            long PlaceId = Convert.ToInt64(hd.Value);
            double dLatitude = Convert.ToDouble(Latitude.Value);
            double dLongitude = Convert.ToDouble(Longitude.Value);
            DataAccess da = new DataAccess();
            Place pl = da.GetPlace(PlaceId);
            pnlImHereNow.Visible = true;
            pnlPlaces.Visible = false;
            hdPlaceId.Value = PlaceId.ToString();
            hdPlaceLat.Value = pl.Latitude.ToString();
            hdPlaceLon.Value = pl.Longitude.ToString();
            hdPlaceTitle.Value = pl.Name;
            lblPlaceTitle.Text = pl.Name;
        }
        protected void btnHere_Click(object sender, EventArgs e)
        {
            string UserName = Membership.GetUser().UserName;
            string WhatsH = txtImHere.Text;
            long PlaceId = Convert.ToInt64(ddlPlace.SelectedValue);
            double dLatitude = Convert.ToDouble(Latitude.Value);
            double dLongitude = Convert.ToDouble(Longitude.Value);
            DataAccess da = new DataAccess();
            da.StoreUserAT(UserName, PlaceId, WhatsH,
                dLatitude, dLongitude);
        }
        protected void btnLocalCoupons_Click(object sender, EventArgs e)
        {
            double dLatitude = Convert.ToDouble(Latitude.Value);
            double dLongitude = Convert.ToDouble(Longitude.Value);
            DataAccess da = new DataAccess();

        }
        protected void lbBusiness_Click(object sender, EventArgs e)
        {
            string UserName = Membership.GetUser().UserName;
            GridViewRow gvr = (GridViewRow)(((LinkButton)sender).Parent.Parent);
            HiddenField hd = (HiddenField)gvr.FindControl("hdPlaceId");
            string sPlaceId = hd.Value;
            Int64 PlaceId;
            if (!String.IsNullOrEmpty(sPlaceId))
            {
                PlaceId = Convert.ToInt64(sPlaceId);
            }
        }
        protected void lbLocalDeals_Click(object sender, EventArgs e)
        {
            double dLatitude = Convert.ToDouble(Latitude.Value);
            double dLongitude = Convert.ToDouble(Longitude.Value);
            DataAccess da = new DataAccess();
            pnlCoupons.Visible = true;
            pnlStart.Visible = false;
            List<GeoPromotion> lgp = da.NearByDeals(dLatitude, dLongitude);
            lvCoupons.DataSource = lgp;
            lvCoupons.DataBind();
        }
        protected void lbLocalPlaces_Click(object sender, EventArgs e)
        {
            DataAccess da = new DataAccess();
            double Lat = Convert.ToDouble(Latitude.Value);
            double Lon = Convert.ToDouble(Longitude.Value);
            List<LocationDataModel.Place> places = da.NearByLocations(Lat, Lon);
            lvPlaces.DataSource = places;
            lvPlaces.SelectedIndex = -1;
            lvPlaces.DataBind();
            pnlPlaces.Visible = true;
            pnlStart.Visible = false;
        }
        protected void ReturnFromPlaces_Click(object sender, EventArgs e)
        {
            pnlPlaces.Visible = false;
            pnlStart.Visible = true;
        }
        protected void ReturnFromDeals_Click(object sender, EventArgs e)
        {
            pnlCoupons.Visible = false;
            pnlStart.Visible = true;
        }
        protected void btnImHereNow_Click(object sender, EventArgs e)
        {
            long PlaceId = Convert.ToInt32(hdPlaceId.Value);
            string UserName = Membership.GetUser().UserName;
            string WhatsHappening = txtWhatsHappening.Text;
            double UserLat = Convert.ToDouble(Latitude.Value);
            double UserLon = Convert.ToDouble(Longitude.Value);
            DataAccess da = new DataAccess();
            da.StoreUserAT(UserName, PlaceId, WhatsHappening,
                UserLat, UserLon);
        }
        protected void lbImHereNowReturn_Click(object sender, EventArgs e)
        {
            pnlImHereNow.Visible = false;
            pnlPlaces.Visible = true;
        }
        protected void lbBackToBeginning_Click(object sender, EventArgs e)
        {
            pnlStart.Visible = true;
            pnlImHereNow.Visible = false;
        }
        protected void lbWhereIveBeen_Click(object sender, EventArgs e)
        {
            string UserName = Membership.GetUser().UserName;
            pnlStart.Visible = false;
            pnlIveBeenHere.Visible = true;
            DataAccess da = new DataAccess();
            lvWhereIveBeen.DataSource = da.UserATs(UserName, 0, 15);
            lvWhereIveBeen.DataBind();
        }
        protected void lbIveBeenHereBack_Click(object sender, EventArgs e)
        {
            pnlIveBeenHere.Visible = false;
            pnlStart.Visible = true;
        }

        protected void lbPlaceIveBeen_Click(object sender, EventArgs e)
        {
            LinkButton lb = (LinkButton)sender;
            ListViewItem lvi = (ListViewItem)lb.Parent.Parent;
            HiddenField hdATID = (HiddenField)lvi.FindControl("hdATID");
            Int64 ATID = Convert.ToInt64(hdATID.Value);
            DataAccess da = new DataAccess();
            pnlIveBeenHere.Visible = false;
            pnlPlaceIveBeen.Visible = true;
            var plac = da.GetPlaceViaATID(ATID);
            hdPlaceIveBeenPlaceId.Value = plac.PlaceId.ToString();
            hdPlaceIveBeenLatitude.Value = plac.Latitude.ToString();
            hdPlaceIveBeenLongitude.Value = plac.Longitude.ToString();
            lblPlaceIveBeenName.Text = plac.Name;
            lblPlaceIveBeenAddress.Text = plac.Address1;
            lblPlaceIveBeenCity.Text = plac.City;
            lblPlaceIveBeenState.Text = plac.Province.ProvinceName;
            lblPlaceIveBeenZipCode.Text = plac.ZipCode;
            lblPlaceIveBeenCountry.Text = plac.Country.Name;
        }

        protected void lbNotListed_Click(object sender, EventArgs e)
        {
            SetupAddPoint();
            pnlPlaces.Visible = false;
        }

        protected void lbAddAPlace_Click(object sender, EventArgs e)
        {
            SetupAddPoint();
        }

        private void SetupAddPoint()
        {
            double lat = Convert.ToDouble(Latitude.Value);
            double lon = Convert.ToDouble(Longitude.Value);
            DataAccess da = new DataAccess();
            var zip = da.WhereAmIAt(lat, lon);
            if (zip.Count > 0)
            {
                var z0 = zip[0];
                txtCity.Text = z0.City;
                txtZipCode.Text = z0.ZipCode;
                ddlProvince.ClearSelection();
                if (z0.ProvinceId.HasValue == true)
                {
                    foreach (ListItem li in ddlProvince.Items)
                    {
                        if (li.Value == z0.ProvinceId.Value.ToString())
                        {
                            li.Selected = true;
                            break;
                        }
                    }
                }
            }
            pnlAddPlace.Visible = true;
            pnlStart.Visible = false;
        }
        protected void lbAddPlaceReturn_Click(object sender, EventArgs e)
        {
            pnlAddPlace.Visible = false;
            pnlStart.Visible = true;
            liPlaceAddMessage.Visible = false;
            PlaceAddMessage.Text = String.Empty;
        }
        protected void lbPlaceIveBeenBack_Click(object sender, EventArgs e)
        {
            pnlIveBeenHere.Visible = true;
            pnlPlaceIveBeen.Visible = false;
           
        }
        protected void lbPlaceIveBeenBeginning_Click(object sender, EventArgs e)
        {
            pnlPlaceIveBeen.Visible = false;
            pnlStart.Visible = true;
        }
        protected string DisplayName(object val)
        {
            string strVal = Convert.ToString(val);

            if (AppleIPhone.IsIPad())
            {
                ipd = iPhoneDevice.iPad;
            }
            if (AppleIPhone.IsIPhone())
            {
                ipd = iPhoneDevice.iPhone;
            }
            if (AppleIPhone.IsIPodTouch())
            {
                ipd = iPhoneDevice.iPodTouch;
            }
            return (iPhoneHelper.DisplayContentOnMenu(strVal, ipd));
        }
    }

    iPhoneHelper.cs file:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    public enum iPhoneDevice
    {
        iPhone, iPodTouch, iPad
    }
    /// <summary>
    /// Summary description for iPhoneHelper
    /// </summary>
    ///
    public class iPhoneHelper
    {
     public iPhoneHelper()
     {
      //
      // TODO: Add constructor logic here
      //
     }

    // This code is stupid in retrospect. Use css to solve this problem 

        public static string DisplayContentOnMenu(string val, iPhoneDevice ipd)
        {
            string Return = val;
            string Elipsis = "...";
            int iPadMaxLength = 30;
            int iPhoneMaxLength = 15;
            if (ipd == iPhoneDevice.iPad)
            {
                if (Return.Length > iPadMaxLength)
                {
                    Return = Return.Substring(0, iPadMaxLength - Elipsis.Length) + Elipsis;
                }
            }
            else
            {
                if (Return.Length > iPhoneMaxLength)
                {
                    Return = Return.Substring(0, iPhoneMaxLength - Elipsis.Length) + Elipsis;
                }
            }
            return (Return);
        }

    Source code for the ViewStatePage:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    /// <summary>
    /// Summary description for BasePage
    /// </summary>
    #region Base class for a page.
    public class ViewStatePage : System.Web.UI.Page
    {

        PageStatePersisterToDatabase myPageStatePersister;
       
        public ViewStatePage()
            : base()
        {
            myPageStatePersister = new PageStatePersisterToDatabase(this);
        }

        protected override PageStatePersister PageStatePersister
        {
            get
            {
                return myPageStatePersister;
            }
        }

    }
    #endregion

    #region This class will override the page persistence to store page state in a database.
    public class PageStatePersisterToDatabase : PageStatePersister
    {
        private string ViewStateKeyField = "__VIEWSTATE_KEY";
        private string _exNoConnectionStringFound = "No Database Configuration information is in the web.config.";

        public PageStatePersisterToDatabase(Page page)
            : base(page)
        {
        }

        public override void Load()
        {

            // Get the cache key from the web form data
            System.Int64 key = Convert.ToInt64(Page.Request.Params[ViewStateKeyField]);

            Pair state = this.LoadState(key);

            // Abort if cache object is not of type Pair
            if (state == null)
                throw new ApplicationException("Missing valid " + ViewStateKeyField);

            // Set view state and control state
            ViewState = state.First;
            ControlState = state.Second;
        }

        public override void Save()
        {

            // No processing needed if no states available
            if (ViewState == null && ControlState != null)
                return;

            System.Int64 key;
            IStateFormatter formatter = this.StateFormatter;
            Pair statePair = new Pair(ViewState, ControlState);

            // Serialize the statePair object to a string.
            string serializedState = formatter.Serialize(statePair);

            // Save the ViewState and get a unique identifier back.
            key = SaveState(serializedState);

            // Register hidden field to store cache key in
            // Page.ClientScript does not work properly with Atlas.
            //Page.ClientScript.RegisterHiddenField(ViewStateKeyField, key.ToString());
            ScriptManager.RegisterHiddenField(this.Page, ViewStateKeyField, key.ToString());
        }

        private System.Int64 SaveState(string PageState)
        {
            System.Int64 i64Key = 0;
            string strConn = String.Empty,
                strProvider = String.Empty;

            string strSql = "insert into tblPageState ( SerializedState ) values ( '" + SqlEscape(PageState) + "');select scope_identity();";
            SqlConnection sqlCn;
            SqlCommand sqlCm;
            try
            {
                GetDBConnectionString(ref strConn, ref strProvider);
                sqlCn = new SqlConnection(strConn);
                sqlCm = new SqlCommand(strSql, sqlCn);
                sqlCn.Open();
                i64Key = Convert.ToInt64(sqlCm.ExecuteScalar());
                if (sqlCn.State != ConnectionState.Closed)
                {
                    sqlCn.Close();
                }
                sqlCn.Dispose();
                sqlCm.Dispose();
            }
            finally
            {
                sqlCn = null;
                sqlCm = null;
            }
            return i64Key;
        }

        private Pair LoadState(System.Int64 iKey)
        {
            string strConn = String.Empty,
                strProvider = String.Empty,
                SerializedState = String.Empty,
                strMinutesInPast = GetMinutesInPastToDelete();
            Pair PageState;
            string strSql = "select SerializedState from tblPageState where tblPageStateID=" + iKey.ToString() + ";" +
                "delete from tblPageState where DateUpdated<DateAdd(mi, " + strMinutesInPast + ", getdate());";
            SqlConnection sqlCn;
            SqlCommand sqlCm;
            try
            {
                GetDBConnectionString(ref strConn, ref strProvider);
                sqlCn = new SqlConnection(strConn);
                sqlCm = new SqlCommand(strSql, sqlCn);

                sqlCn.Open();
                SerializedState = Convert.ToString(sqlCm.ExecuteScalar());
                IStateFormatter formatter = this.StateFormatter;

                if ((null == SerializedState) ||
                    (String.Empty == SerializedState))
                {
                    throw (new ApplicationException("No ViewState records were returned."));
                }

                // Deserilize returns the Pair object that is serialized in
                // the Save method.
                PageState = (Pair)formatter.Deserialize(SerializedState);

                if (sqlCn.State != ConnectionState.Closed)
                {
                    sqlCn.Close();
                }
                sqlCn.Dispose();
                sqlCm.Dispose();
            }
            finally
            {
                sqlCn = null;
                sqlCm = null;
            }
            return PageState;
        }

        private string SqlEscape(string Val)
        {
            string ReturnVal = String.Empty;
            if (null != Val)
            {
                ReturnVal = Val.Replace("'", "''");
            }
            return (ReturnVal);
        }
        private void GetDBConnectionString(ref string ConnectionStringValue, ref string ProviderNameValue)
        {
            if (System.Configuration.ConfigurationManager.ConnectionStrings.Count > 0)
            {
                ConnectionStringValue = System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
                ProviderNameValue = System.Configuration.ConfigurationManager.ConnectionStrings["ApplicationServices"].ProviderName;
            }
            else
            {
                throw new ConfigurationErrorsException(_exNoConnectionStringFound);
            }
        }
        private string GetMinutesInPastToDelete()
        {
            string strReturn = "-60";
            if (null != System.Configuration.ConfigurationManager.AppSettings["MinutesInPastToDeletePageState"])
            {
                strReturn = System.Configuration.ConfigurationManager.AppSettings["MinutesInPastToDeletePageState"].ToString();
            }
            return (strReturn);
        }
    }
    #endregion

    AppleiPhone.cs file:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;

    /// <summary>
    /// Summary description for AppleIPhone
    /// </summary>
    public class AppleIPhone
    {
     public AppleIPhone()
     {
      //
      // TODO: Add constructor logic here
      //
     }

        static public bool IsIPhoneOS()
        {
            return (IsIPad() || IsIPhone() || IsIPodTouch());
        }

        static public bool IsIPhone()
        {
            return IsTest("iPhone");
        }

        static public bool IsIPodTouch()
        {
            return IsTest("iPod");
        }

        static public bool IsIPad()
        {
            return IsTest("iPad");
        }

        static private bool IsTest(string Agent)
        {
            bool bl = false;
            string ua = HttpContext.Current.Request.UserAgent.ToLower();
            try
            {
                bl = ua.Contains(Agent.ToLower());
            }
            catch { }
            return (bl);
       
        }
    }

    Master page .cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.HtmlControls;
    using System.Web.UI.WebControls;

    public partial class MasterPages_iPhoneMaster : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
                HtmlHead head = Page.Header;
                HtmlMeta meta = new HtmlMeta();
                if (AppleIPhone.IsIPad() == true)
                {
                    meta.Content = "width=400,user-scalable=no";
                    head.Controls.Add(meta);
                }
                else
                {
                    meta.Content = "width=device-width, user-scalable=no";
                    meta.Attributes.Add("name", "viewport");
                }
                meta.Attributes.Add("name", "viewport");
                head.Controls.Add(meta);
                HtmlLink cssLink = new HtmlLink();
                HtmlGenericControl script = new HtmlGenericControl("script");
                script.Attributes.Add("type", "text/javascript");
                script.Attributes.Add("src", ResolveUrl("~/Scripts/iWebKit/javascript/functions.js"));
                head.Controls.Add(script);
                cssLink.Attributes.Add("rel", "stylesheet");
                cssLink.Attributes.Add("href", ResolveUrl("~/Scripts/iWebKit/css/style.css") );
                cssLink.Attributes.Add("type", "text/css");
                head.Controls.Add(cssLink);
                HtmlGenericControl jsLink = new HtmlGenericControl("script");
                //jsLink.Attributes.Add("type", "text/javascript");
                //jsLink.Attributes.Add("src", ResolveUrl("~/Scripts/jquery-1.4.1.min.js") );
                //head.Controls.Add(jsLink);
                HtmlLink appleIcon = new HtmlLink();
                appleIcon.Attributes.Add("rel", "apple-touch-icon");
                appleIcon.Attributes.Add("href", ResolveUrl("~/apple-touch-icon.png"));
                HtmlMeta appleMobileWebAppStatusBarStyle = new HtmlMeta();
                appleMobileWebAppStatusBarStyle.Attributes.Add("name", "apple-mobile-web-app-status-bar-style");
                appleMobileWebAppStatusBarStyle.Attributes.Add("content", "black");
                head.Controls.Add(appleMobileWebAppStatusBarStyle);
        }

        internal string FindPath(string Location)
        {
            string Url = Server.MapPath(Location);
            return (Url);
        }
    }