Browse files

Support HTML5 geolocation using geo.js.

Tested on Android 2.0.
  • Loading branch information...
1 parent a867375 commit 1e4e7b051c12ad21297661172faaa08633552cf8 @msantos committed Mar 5, 2010
Showing with 299 additions and 13 deletions.
  1. +1 −0 priv/www/index.html
  2. +295 −0 priv/www/js/geo.js
  3. +3 −13 priv/www/js/wwallo.js
View
1 priv/www/index.html
@@ -3,6 +3,7 @@
<head>
<title>w w a l l o &lt;&mdash;</title>
<script type="text/javascript" src="js/gears_init.js"></script>
+ <script type="text/javascript" src="js/geo.js"></script>
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="js/jquery.jgrowl.js"></script>
View
295 priv/www/js/geo.js
@@ -0,0 +1,295 @@
+/*!
+ * geo-location-javascript v0.4.3
+ * http://code.google.com/p/geo-location-javascript/
+ *
+ * Copyright (c) 2009 Stan Wiechers
+ * Licensed under the MIT licenses.
+ *
+ * Revision: $Rev: 68 $:
+ * Author: $Author: whoisstan $:
+ * Date: $Date: 2010-02-15 13:42:19 +0100 (Mon, 15 Feb 2010) $:
+ */
+var bb_successCallback;
+var bb_errorCallback;
+
+function handleBlackBerryLocation()
+{
+ if (bb_successCallback && bb_errorCallback)
+ {
+ if(blackberry.location.latitude==0 && blackberry.location.longitude==0)
+ {
+ //http://dev.w3.org/geo/api/spec-source.html#position_unavailable_error
+ //POSITION_UNAVAILABLE (numeric value 2)
+ bb_errorCallback({message:"Position unavailable", code:2});
+ }
+ else
+ {
+ var timestamp=null;
+ //only available with 4.6 and later
+ //http://na.blackberry.com/eng/deliverables/8861/blackberry_location_568404_11.jsp
+ if (blackberry.location.timestamp)
+ {
+ timestamp=new Date(blackberry.location.timestamp);
+ }
+ bb_successCallback({timestamp:timestamp, coords: {latitude:blackberry.location.latitude,longitude:blackberry.location.longitude}});
+ }
+ //If you have passed the method a function, you can cancel the callback using blackberry.location.removeLocationUpdate().
+ //If you have passed a string, the callback cannot be removed.
+ //http://docs.blackberry.com/en/developers/deliverables/11849/blackberry_location_onLocationUpdate_568407_11.jsp
+ if(parseFloat(navigator.appVersion)>=4.6)
+ {
+ blackberry.location.removeLocationUpdate(handleBlackBerryLocation);
+ }
+
+ bb_successCallback = null;
+ bb_errorCallback = null;
+ }
+
+}
+
+var geo_position_js=function()
+{
+
+ var pub = {};
+ var provider=null;
+
+ pub.getCurrentPosition = function(successCallback,errorCallback,options){
+
+ provider.getCurrentPosition(successCallback, errorCallback,options);
+ }
+
+
+
+ pub.init = function()
+ {
+ try
+ {
+ if (typeof(geo_position_js_simulator) != "undefined")
+ {
+ provider = geo_position_js_simulator;
+ }
+ else if (typeof(bondi) != "undefined" && typeof(bondi.geolocation) != "undefined") {
+ provider = bondi.geolocation;
+ }
+
+ else if (typeof(window.google) != "undefined" && typeof(window.google.gears) != "undefined")
+ {
+ provider = google.gears.factory.create('beta.geolocation');
+ pub.getCurrentPosition = function(successCallback, errorCallback, options){
+
+ try
+ {
+ function _successCallback(p){
+ if (typeof(p.latitude) != "undefined") {
+ successCallback({
+ timestamp: p.timestamp,
+ coords: {
+ latitude: p.latitude,
+ longitude: p.longitude
+ }
+ });
+ }
+ else
+ {
+ successCallback(p);
+ }
+ }
+ provider.getCurrentPosition(_successCallback, errorCallback, options);
+ }
+ catch(e)
+ {
+ //this is thrown when the request is denied
+ errorCallback({message:e,code:1});
+ }
+ }
+ }
+ else if (typeof(navigator.geolocation) != "undefined")
+ {
+ provider = navigator.geolocation;
+ pub.getCurrentPosition = function(successCallback, errorCallback, options)
+ {
+ function _successCallback(p){
+
+ //for mozilla geode,it returns the coordinates slightly differently
+ if (typeof(p.latitude) != "undefined") {
+ successCallback({
+ timestamp: p.timestamp,
+ coords: {
+ latitude: p.latitude,
+ longitude: p.longitude
+ }
+ });
+ }
+ else
+ {
+ successCallback(p);
+ }
+ }
+ provider.getCurrentPosition(_successCallback, errorCallback, options);
+ }
+ pub.watchPosition = function(successCallback,errorCallback,options){
+
+ try
+ {
+ provider.watchPosition(successCallback,errorCallback,options);
+
+ pub.clearWatch = function(watchId){
+ if(typeof(provider.clearWatch) != "undefined") // Should always be true, but just in case
+ provider.clearWatch(watchId);
+ }
+ }
+ catch(e)
+ {
+ //thrown when method not available
+ errorCallback({message:e,code:1});
+ }
+
+ }
+ }
+ else if (typeof(Mojo) != "undefined" && typeof(Mojo.Service) != "undefined" && typeof(Mojo.Service.Request) != "Mojo.Service.Request") {
+ provider = true;
+ pub.getCurrentPosition = function(successCallback, errorCallback, options){
+
+ parameters = {};
+ if (options) {
+ //http://developer.palm.com/index.php?option=com_content&view=article&id=1673#GPS-getCurrentPosition
+ if (options.enableHighAccuracy && options.enableHighAccuracy == true) {
+ parameters.accuracy = 1;
+ }
+ if (options.maximumAge) {
+ parameters.maximumAge = options.maximumAge;
+ }
+ if (options.responseTime) {
+ if (options.responseTime < 5) {
+ parameters.responseTime = 1;
+ }
+ else
+ if (options.responseTime < 20) {
+ parameters.responseTime = 2;
+ }
+ else {
+ parameters.timeout = 3;
+ }
+ }
+ }
+
+
+ r = new Mojo.Service.Request('palm://com.palm.location', {
+ method: "getCurrentPosition",
+ parameters: parameters,
+ onSuccess: function(p){
+ successCallback({
+ timestamp: p.timestamp,
+ coords: {
+ latitude: p.latitude,
+ longitude: p.longitude,
+ heading: p.heading
+ }
+ });
+ },
+ onFailure: function(e){
+ if (e.errorCode == 1) {
+ errorCallback({
+ code: 3,
+ message: "Timeout"
+ });
+ }
+ else
+ if (e.errorCode == 2) {
+ errorCallback({
+ code: 2,
+ message: "Position Unavailable"
+ });
+ }
+ else {
+ errorCallback({
+ code: 0,
+ message: "Unknown Error: webOS-code" + errorCode
+ });
+ }
+ }
+ });
+ }
+
+ }
+ else if (typeof(device) != "undefined" && typeof(device.getServiceObject) != "undefined") {
+ provider = device.getServiceObject("Service.Location", "ILocation");
+
+ //override default method implementation
+ pub.getCurrentPosition = function(successCallback, errorCallback, options){
+ function callback(transId, eventCode, result){
+ if (eventCode == 4) {
+ errorCallback({
+ message: "Position unavailable",
+ code: 2
+ });
+ }
+ else {
+ //no timestamp of location given?
+ successCallback({
+ timestamp: null,
+ coords: {
+ latitude: result.ReturnValue.Latitude,
+ longitude: result.ReturnValue.Longitude,
+ altitude: result.ReturnValue.Altitude,
+ heading: result.ReturnValue.Heading
+ }
+ });
+ }
+ }
+ //location criteria
+ var criteria = new Object();
+ criteria.LocationInformationClass = "BasicLocationInformation";
+ //make the call
+ provider.ILocation.GetLocation(criteria, callback);
+ }
+ }
+ else if (typeof(window.blackberry) != "undefined" && blackberry.location.GPSSupported) {
+
+
+ // set to autonomous mode
+ blackberry.location.setAidMode(2);
+
+ //override default method implementation
+ pub.getCurrentPosition = function(successCallback, errorCallback, options){
+
+ //passing over callbacks as parameter didn't work consistently
+ //in the onLocationUpdate method, thats why they have to be set
+ //outside
+ bb_successCallback = successCallback;
+ bb_errorCallback = errorCallback;
+
+ //http://docs.blackberry.com/en/developers/deliverables/11849/blackberry_location_onLocationUpdate_568407_11.jsp
+ //On BlackBerry devices running versions of BlackBerry® Device Software earlier than version 4.6,
+ //this method must be passed as a string that is evaluated each time the location is refreshed.
+ //On BlackBerry devices running BlackBerry Device Software version 4.6 or later, you can pass a string,
+ //or use the method to register a callback function.
+ if(parseFloat(navigator.appVersion)>=4.6)
+ {
+ blackberry.location.onLocationUpdate(handleBlackBerryLocation);
+ }
+ else
+ {
+ blackberry.location.onLocationUpdate("handleBlackBerryLocation()");
+ }
+ blackberry.location.refreshLocation();
+
+ }
+ provider = blackberry.location;
+
+ }
+ }
+ catch (e) {
+ if (typeof(console) != "undefined") {
+ console.log(e);
+ }
+ }
+
+
+
+ return provider!=null;
+ }
+
+
+ return pub;
+}();
View
16 priv/www/js/wwallo.js
@@ -1,6 +1,5 @@
var wwallo = function() {
- var geo = undefined;
var radius = '5';
var units = 'km';
var search = '';
@@ -25,9 +24,6 @@ var wwallo = function() {
'error': function (v) {
return (v ? error = v : error);
},
- 'geo': function (v) {
- return (v ? geo = v : geo);
- },
'address': function (v) {
return (v ? address = v : address);
},
@@ -57,7 +53,7 @@ var wwallo = function() {
function update_position(position) {
- var pos = position.latitude + ',' + position.longitude + ',' + wwallo.radius() + wwallo.units();
+ var pos = position.coords.latitude + ',' + position.coords.longitude + ',' + wwallo.radius() + wwallo.units();
$.getJSON('/geocode/' + pos, function (json) {
wwallo.json(json);
wwallo.pos(pos);
@@ -79,19 +75,13 @@ function noposition(positionError, url) {
}
function get_position() {
- if (typeof google == 'undefined' || typeof google.gears == 'undefined') {
+ if (!geo_position_js.init()) {
noposition();
return (true);
}
- var geo = wwallo.geo() || google.gears.factory.create('beta.geolocation');
- wwallo.geo(geo);
wwallo.error(undefined);
- geo.getCurrentPosition(update_position, noposition, {
- enableHighAccuracy: true,
- gearsRequestAddress: true
- }
- );
+ geo_position_js.getCurrentPosition(update_position, noposition);
}
function main_screen(json, pos) {

0 comments on commit 1e4e7b0

Please sign in to comment.