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 M4V for iPhone/iPad.
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")) %>
<%# 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);
}
}