diff --git a/demo-no-simulation-args.html b/demo-no-simulation-args.html new file mode 100644 index 00000000..767bcd03 --- /dev/null +++ b/demo-no-simulation-args.html @@ -0,0 +1,39 @@ + + + javascript-mobile-desktop-geolocation Demo With No Simulation + + + +

javascript-mobile-desktop-geolocation With No Simulation

+

Results:

+

+

+

+ + + + + \ No newline at end of file diff --git a/js/geoPosition.js b/js/geoPosition.js index d3041602..894b3199 100644 --- a/js/geoPosition.js +++ b/js/geoPosition.js @@ -7,251 +7,281 @@ // // Based on Stan Wiechers > geo-location-javascript v0.4.8 > http://code.google.com/p/geo-location-javascript/ // -// Revision: $Rev: 01 $: +// Revision: $Rev: 01 $: // Author: $Author: estebanav $: -// Date: $Date: 2012-09-07 23:03:53 -0300 (Fri, 07 Sep 2012) $: +// Date: $Date: 2012-09-07 23:03:53 -0300 (Fri, 07 Sep 2012) $: -var bb = { - success: 0, - error: 0, - blackberryTimeoutId : -1 - }; +var bb = { + success: 0, + error: 0, + blackberryTimeoutId : -1 +}; function handleBlackBerryLocationTimeout() { - if(bb.blackberryTimeoutId!=-1) { - bb.error({ message: "Timeout error", - code: 3 - }); - } + if(bb.blackberryTimeoutId!=-1) { + bb.error({ message: "Timeout error", + code: 3 + }); + } } function handleBlackBerryLocation() { - clearTimeout(bb.blackberryTimeoutId); - bb.blackberryTimeoutId=-1; - if (bb.success && bb.error) { - 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.error({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.success( { timestamp: timestamp , - coords: { - latitude: blackberry.location.latitude, - longitude: blackberry.location.longitude - } - }); + clearTimeout(bb.blackberryTimeoutId); + bb.blackberryTimeoutId=-1; + if (bb.success && bb.error) { + 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.error({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.success( { timestamp: timestamp , + coords: { + latitude: blackberry.location.latitude, + longitude: blackberry.location.longitude } - //since blackberry.location.removeLocationUpdate(); - //is not working as described http://na.blackberry.com/eng/deliverables/8861/blackberry_location_removeLocationUpdate_568409_11.jsp - //the callback are set to null to indicate that the job is done - - bb.success = null; - bb.error = null; + }); } + //since blackberry.location.removeLocationUpdate(); + //is not working as described http://na.blackberry.com/eng/deliverables/8861/blackberry_location_removeLocationUpdate_568409_11.jsp + //the callback are set to null to indicate that the job is done + + bb.success = null; + bb.error = null; + } } var geoPosition=function() { - var pub = {}; - var provider=null; - var u="undefined"; - var ipGeolocationSrv = 'http://freegeoip.net/json/?callback=JSONPCallback'; + var pub = {}; + var provider=null; + var u="undefined"; + var ipGeolocationSrv = 'http://freegeoip.net/json/?callback=JSONPCallback'; - pub.getCurrentPosition = function(success,error,opts) - { - provider.getCurrentPosition(success, error,opts); + var fixArgs = function(success, error, opts){ //make all args optional. + var ret = {success: function(){}, error: function(){}, opts:{}}; + if(arguments.length == 0){ + throw "You must provide a success callback"; + } + if(arguments.length >= 1){ + ret.success = success; + } + if(arguments.length >= 2){ + if(error === Object(error)){ + ret.opts = error; + } else { + ret.error = error; + } } + if(arguments.length == 3){ + ret.opts = opts; + } + return ret; + }; + + pub.getCurrentPosition = function(success,error,opts) { + var args = fixArgs.apply(null, arguments); + success = args.success, error = args.error, opts = args.opts; - pub.jsonp = { - callbackCounter: 0, + provider.getCurrentPosition(success, error,opts); + }; - fetch: function(url, callback) { - var fn = 'JSONPCallback_' + this.callbackCounter++; - window[fn] = this.evalJSONP(callback); - url = url.replace('=JSONPCallback', '=' + fn); + pub.jsonp = { + callbackCounter: 0, - var scriptTag = document.createElement('SCRIPT'); - scriptTag.src = url; - document.getElementsByTagName('HEAD')[0].appendChild(scriptTag); - }, + fetch: function(url, callback) { + var fn = 'JSONPCallback_' + this.callbackCounter++; + window[fn] = this.evalJSONP(callback); + url = url.replace('=JSONPCallback', '=' + fn); - evalJSONP: function(callback) { - return function(data) { - callback(data); - } + var scriptTag = document.createElement('SCRIPT'); + scriptTag.src = url; + document.getElementsByTagName('HEAD')[0].appendChild(scriptTag); + }, + + evalJSONP: function(callback) { + return function(data) { + callback(data); } } - + }; + - pub.init = function() - { - try - { - //console.debug(( typeof(geoPositionSimulator)!=u ) && (geoPositionSimulator.length > 0 ) ); - if ( ( typeof(geoPositionSimulator)!=u ) && (geoPositionSimulator.length > 0 ) ){ - provider=geoPositionSimulator; - } else if (typeof(bondi)!=u && typeof(bondi.geolocation)!=u ) { - provider=bondi.geolocation; - } else if (typeof(navigator.geolocation)!=u) { - provider=navigator.geolocation; - pub.getCurrentPosition = function(success, error, opts) { - function _success(p) { - //for mozilla geode,it returns the coordinates slightly differently - var params; - if(typeof(p.latitude)!=u) { - params = { - timestamp: p.timestamp, - coords: { - latitude: p.latitude, - longitude: p.longitude - } - }; - } else { - params = p; - } - success( params ); - } - provider.getCurrentPosition(_success,error,opts); - } - } else if(typeof(window.blackberry)!=u && blackberry.location.GPSSupported) { - // set to autonomous mode - if(typeof(blackberry.location.setAidMode)==u) { - return false; - } - blackberry.location.setAidMode(2); - //override default method implementation - pub.getCurrentPosition = function(success,error,opts) - { - //alert(parseFloat(navigator.appVersion)); - //passing over callbacks as parameter didn't work consistently - //in the onLocationUpdate method, thats why they have to be set - //outside - bb.success = success; - bb.error = error; - //function needs to be a string according to - //http://www.tonybunce.com/2008/05/08/Blackberry-Browser-Amp-GPS.aspx - if(opts['timeout']) { - bb.blackberryTimeoutId = setTimeout("handleBlackBerryLocationTimeout()",opts['timeout']); - } else { - //default timeout when none is given to prevent a hanging script - bb.blackberryTimeoutId = setTimeout("handleBlackBerryLocationTimeout()",60000); - } - blackberry.location.onLocationUpdate("handleBlackBerryLocation()"); - blackberry.location.refreshLocation(); - } - provider = blackberry.location; - - } else if ( typeof(Mojo) !=u && typeof(Mojo.Service.Request)!="Mojo.Service.Request") { - provider = true; - pub.getCurrentPosition = function(success, error, opts) { - parameters = {}; - if( opts ) { - //http://developer.palm.com/index.php?option=com_content&view=article&id=1673#GPS-getCurrentPosition - if (opts.enableHighAccuracy && opts.enableHighAccuracy == true ){ - parameters.accuracy = 1; - } - if ( opts.maximumAge ) { - parameters.maximumAge = opts.maximumAge; - } - if (opts.responseTime) { - if( opts.responseTime < 5 ) { - parameters.responseTime = 1; - } else if ( opts.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 ){ - success( { timestamp: p.timestamp, - coords: { - latitude: p.latitude, - longitude: p.longitude, - heading: p.heading - } - }); - }, - onFailure: function( e ){ - if (e.errorCode==1) { - error({ code: 3, - message: "Timeout" - }); - } else if (e.errorCode==2){ - error({ code: 2, - message: "Position unavailable" - }); - } else { - error({ code: 0, - message: "Unknown Error: webOS-code" + errorCode - }); - } - } - }); - } + pub.init = function() { + try { + //console.debug(( typeof(geoPositionSimulator)!=u ) && (geoPositionSimulator.length > 0 ) ); + if ( ( typeof(geoPositionSimulator)!=u ) && (geoPositionSimulator.length > 0 ) ){ + provider=geoPositionSimulator; + } else if (typeof(bondi)!=u && typeof(bondi.geolocation)!=u ) { + provider=bondi.geolocation; + } else if (typeof(navigator.geolocation)!=u) { + provider=navigator.geolocation; + pub.getCurrentPosition = function(success, error, opts) { + var args = fixArgs.apply(null, arguments); + success = args.success, error = args.error, opts = args.opts; + var _success = function(p) { + //for mozilla geode,it returns the coordinates slightly differently + var params; + if(typeof(p.latitude)!=u) { + params = { + timestamp: p.timestamp, + coords: { + latitude: p.latitude, + longitude: p.longitude + } + }; + } else { + params = p; + } + success( params ); + }; + provider.getCurrentPosition(_success, error, opts); + } + } else if(typeof(window.blackberry)!=u && blackberry.location.GPSSupported) { + // set to autonomous mode + if(typeof(blackberry.location.setAidMode)==u) { + return false; + } + blackberry.location.setAidMode(2); + //override default method implementation + pub.getCurrentPosition = function(success,error,opts) + { + var args = fixArgs.apply(null, arguments); + success = args.success, error = args.error, opts = args.opts; + //alert(parseFloat(navigator.appVersion)); + //passing over callbacks as parameter didn't work consistently + //in the onLocationUpdate method, thats why they have to be set + //outside + bb.success = success; + bb.error = error || function(){}; + //function needs to be a string according to + //http://www.tonybunce.com/2008/05/08/Blackberry-Browser-Amp-GPS.aspx + if(opts['timeout']) { + bb.blackberryTimeoutId = setTimeout("handleBlackBerryLocationTimeout()",opts['timeout']); + } else { + //default timeout when none is given to prevent a hanging script + bb.blackberryTimeoutId = setTimeout("handleBlackBerryLocationTimeout()",60000); } - else if (typeof(device)!=u && typeof(device.getServiceObject)!=u) { - provider=device.getServiceObject("Service.Location", "ILocation"); + blackberry.location.onLocationUpdate("handleBlackBerryLocation()"); + blackberry.location.refreshLocation(); + }; + provider = blackberry.location; - //override default method implementation - pub.getCurrentPosition = function(success, error, opts){ - function callback(transId, eventCode, result) { - if (eventCode == 4) { - error({message:"Position unavailable", code:2}); - } else { - //no timestamp of location given? - success( { 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 { - pub.getCurrentPosition = function(success, error, opts) { - pub.jsonp.fetch(ipGeolocationSrv, - function( p ){ success( { timestamp: p.timestamp, - coords: { - latitude: p.latitude, - longitude: p.longitude, - heading: p.heading - } - });}); + } else if ( typeof(Mojo) !=u && typeof(Mojo.Service.Request)!="Mojo.Service.Request") { + provider = true; + pub.getCurrentPosition = function(success, error, opts) { + var args = fixArgs.apply(null, arguments); + success = args.success, error = args.error, opts = args.opts; + var parameters = {}; + if( opts ) { + //http://developer.palm.com/index.php?option=com_content&view=article&id=1673#GPS-getCurrentPosition + if (opts.enableHighAccuracy && opts.enableHighAccuracy == true ){ + parameters.accuracy = 1; + } + if ( opts.maximumAge ) { + parameters.maximumAge = opts.maximumAge; + } + if (opts.responseTime) { + if( opts.responseTime < 5 ) { + parameters.responseTime = 1; + } else if ( opts.responseTime < 20 ) { + parameters.responseTime = 2; + } else { + parameters.timeout = 3; } - provider = true; + } } + var r = new Mojo.Service.Request( 'palm://com.palm.location' , { + method:"getCurrentPosition", + parameters:parameters, + onSuccess: function( p ){ + success( { timestamp: p.timestamp, + coords: { + latitude: p.latitude, + longitude: p.longitude, + heading: p.heading + } + }); + }, + onFailure: function( e ){ + if (e.errorCode==1) { + error({ code: 3, + message: "Timeout" + }); + } else if (e.errorCode==2){ + error({ code: 2, + message: "Position unavailable" + }); + } else { + error({ code: 0, + message: "Unknown Error: webOS-code" + e.errorCode + }); + } + } + }); + } + + } + else if (typeof(device)!=u && typeof(device.getServiceObject)!=u) { + provider=device.getServiceObject("Service.Location", "ILocation"); + + //override default method implementation + pub.getCurrentPosition = function(success, error, opts){ + var args = fixArgs.apply(null, arguments); + success = args.success, error = args.error, opts = args.opts; + function callback(transId, eventCode, result) { + if (eventCode == 4) { + error({message:"Position unavailable", code:2}); + } else { + //no timestamp of location given? + success( { timestamp:null, + coords: { + latitude: result.ReturnValue.Latitude, + longitude: result.ReturnValue.Longitude, + altitude: result.ReturnValue.Altitude, + heading: result.ReturnValue.Heading } + }); + } + } + provider.ILocation.GetLocation({'LocationInformationClass': 'BasicLocationInformation'}, callback); } - catch (e){ - if( typeof(console) != u ) console.log(e); - return false; - } - return provider!=null; + } else { + pub.getCurrentPosition = function(success, error, opts) { + var args = fixArgs.apply(null, arguments); + success = args.success, error = args.error, opts = args.opts; + pub.jsonp.fetch(ipGeolocationSrv, + function( p ){ success( { timestamp: p.timestamp, + coords: { + latitude: p.latitude, + longitude: p.longitude, + heading: p.heading + } + }); + }); + }; + provider = true; + } + + } - return pub; -}(); + catch (e){ + if( typeof(console) != u ) console.err(e); + return false; + } + return provider!=null; + }; + return pub; +}(); \ No newline at end of file