1
0
Fork 0
mirror of https://github.com/shouptech/share-a-bike.git synced 2026-02-03 20:39:43 +00:00

Working revision

This commit is contained in:
mikeshoup@gmail.com 2010-12-17 17:57:12 +00:00
parent c2eb2ffe6a
commit fac4f30c9a
4 changed files with 94 additions and 39 deletions

View file

@ -16,47 +16,50 @@ MainAssistant.prototype = {
// API URL for BCycle // API URL for BCycle
var url = 'http://api.bcycle.com/services/mobile.svc/ListKiosks'; var url = 'http://api.bcycle.com/services/mobile.svc/ListKiosks';
var gpsSuccess = true; gpsLatitude = 0;
var gpsResult = 0; gpsLongitude = 0;
// Perform AJAX request to BCycle API
var ajaxRequest = function(url, onComplete, onFailure) {
var kioskRequest = new Ajax.Request(url, {
method: "get",
evalJSON: 'force',
contentType: 'application/x-www-form-urlencoded',
requestHeaders: {
"USER_AGENT": navigator.userAgent
},
onComplete: onComplete,
onFailure: onFailure
});
};
var onGpsSuccess = function(result) { var onGpsSuccess = function(result) {
gpsResult = result; gpsLatitude = result.latitude;
gpsLongitude = result.longitude;
// Place AJAX request
ajaxRequest(url, onAjaxComplete, onAjaxFailure);
}; };
var onGpsFailure = function(result) { var onGpsFailure = function(result) {
gpsSuccess = false; // Failure in GPS
this.showSpinner(false); this.showSpinner(false);
}; };
// Function for when AJAX request is complete // Function for when AJAX request is complete
var onAjaxComplete = function(transport) { onAjaxComplete = function(transport) {
var kiosks = [5]; this.sortKiosks(gpsLatitude, gpsLongitude, transport);
kiosks[0] = {name: "Name 1", distance: "0.1 mi", address: "100 Fake St", bikes: "0", docks: "1"};
kiosks[1] = {name: "Name 2", distance: "0.2 mi", address: "100 Fake St", bikes: "0", docks: "1"};
kiosks[2] = {name: "Name 3", distance: "0.3 mi", address: "100 Fake St", bikes: "0", docks: "1"};
kiosks[3] = {name: "Name 4", distance: "0.4 mi", address: "100 Fake St", bikes: "0", docks: "1"};
kiosks[4] = {name: "Name 5", distance: "12.2 mi", address: "100 Fake St", bikes: "0", docks: "1"};
// Display Kiosks
this.listModel = {
items: kiosks
};
this.controller.setWidgetModel("kioskList", this.listModel);
// We're done, stop spinning // We're done, stop spinning
this.showSpinner(false); this.showSpinner(false);
}.bind(this); }.bind(this);
var onAjaxFailure = function(transport) { onAjaxFailure = function(transport) {
// There has been a failure, stop spinning // There has been a failure, stop spinning
this.showSpinner(false); this.showSpinner(false);
}; };
// Get GPS Coord // Get GPS Coord
this.getGpsCoord(onGpsSuccess, onGpsFailure); this.getGpsCoord(onGpsSuccess, onGpsFailure);
if(gpsSuccess) {
// Place AJAX request
this.ajaxRequest(url, onAjaxComplete, onAjaxFailure);
};
}, },
// Find GPS Coordinate // Find GPS Coordinate
@ -69,22 +72,70 @@ MainAssistant.prototype = {
}); });
}, },
// Perform AJAX request to BCycle API
ajaxRequest: function(url, onComplete, onFailure) {
var kioskRequest = new Ajax.Request(url, {
method: "get",
evalJSON: 'force',
contentType: 'application/x-www-form-urlencoded',
requestHeaders: {
"USER_AGENT": navigator.userAgent
},
onComplete: onComplete,
onFailure: onFailure
});
},
// Function to start/stop spinning // Function to start/stop spinning
showSpinner: function(show) { showSpinner: function(show) {
this.controller.get('findButton').mojo[(show ? 'activate' : 'deactivate')](); this.controller.get('findButton').mojo[(show ? 'activate' : 'deactivate')]();
}, },
// Function to find nearest kiosks and sort them
sortKiosks: function(latitude, longitude, kioskResult) {
// Function to calculate distance between to lat/lon points
var calcDistance = function(lat1, lon1, lat2, lon2) {
var R = 3958.761; // Earth's Radius in miles
var dLat = (lat2-lat1) * Math.PI/180; // Convert to Radians
var dLon = (lon2-lon1) * Math.PI/180; // Convert to Radians
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat1 * Math.PI/180) * Math.cos(lat2 * Math.PI/180) *
Math.sin(dLon/2) * Math.sin(dLon/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return d;
};
var closestKiosks = [];
var nClosest = 5;
// Initialize an empty set of kiosks
for(var i = 0; i < nClosest; i++) {
closestKiosks[i] = null;
}
// Loop through the kiosks
for(i = 0; i < kioskResult.responseJSON.d.list.length; i++) {
var kiosk = kioskResult.responseJSON.d.list[i];
for(var j = 0; j < closestKiosks.length; j++) {
if(closestKiosks[j] === null) {
closestKiosks[j] = kiosk;
break;
} else {
var d1 = calcDistance(latitude, longitude, closestKiosks[j].Location.Latitude, closestKiosks[j].Location.Longitude);
var d2 = calcDistance(latitude, longitude, kiosk.Location.Latitude, kiosk.Location.Longitude);
if(d2 < d1) {
// Swap
var temp = kiosk;
kiosk = closestKiosks[j];
closestKiosks[j] = temp;
}
}
}
}
var kiosks = [];
for(i = 0; i < closestKiosks.length; i++) {
d = calcDistance(latitude, longitude, closestKiosks[i].Location.Latitude, closestKiosks[i].Location.Longitude);
kiosks[i] = {
name: closestKiosks[i].Name,
distance: d.toFixed(2) + ' mi',
address: closestKiosks[i].Address.Street,
bikes: closestKiosks[i].BikesAvailable,
docks: closestKiosks[i].DocksAvailable
};
}
this.listModel = {
items: kiosks
};
this.controller.setWidgetModel("kioskList", this.listModel);
}
}; };

View file

@ -7,7 +7,7 @@ opus.Gizmo({
styles: { styles: {
zIndex: 2, zIndex: 2,
opacity: 1, opacity: 1,
bgImage: "images/Sharrow-BG.jpg" bgImage: ""
}, },
chrome: [ chrome: [
{ {
@ -21,13 +21,15 @@ opus.Gizmo({
}, },
{ {
name: "scroller1", name: "scroller1",
mode: "free",
scrollPosition: { scrollPosition: {
left: 0, left: 0,
top: 0 top: 0
}, },
type: "Palm.Mojo.Scroller", type: "Palm.Mojo.Scroller",
l: 0, l: 0,
t: 261, t: 0,
h: "100%",
styles: { styles: {
cursor: "move", cursor: "move",
overflow: "hidden" overflow: "hidden"
@ -46,7 +48,7 @@ opus.Gizmo({
type: "Palm.Mojo.List", type: "Palm.Mojo.List",
l: 0, l: 0,
t: 0, t: 0,
h: 100 h: "100%"
} }
] ]
} }

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

View file

@ -1,8 +1,10 @@
.kiosk_left_col { .kiosk_left_col {
float: left; float: left;
padding-left: 5px;
} }
.kiosk_right_col { .kiosk_right_col {
float: right; float: right;
padding-right: 5px;
} }
.kiosk_name { .kiosk_name {