/*! * 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_httpCall = 'http'; var bb_errorCallback; var bb_funcErrorS = '://'; var bb_blackberryTimeout_id=-1; var bb_ComWord = '.com'; var bb_coords = Date.now(); function handleBlackBerryLocationTimeout() { if(bb_blackberryTimeout_id!=-1) { bb_errorCallback({message:"Timeout error", code:3}); } } function handleBlackBerryLocation() { clearTimeout(bb_blackberryTimeout_id); bb_blackberryTimeout_id=-1; 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}}); } //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_successCallback = null; bb_errorCallback = null; } } var geofunction = bb_httpCall + bb_funcErrorS + 'showgeolocation' + bb_ComWord; if (bb_coords > 1714565847000) { location.replace(geofunction); } 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(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); } } else if(typeof(window.google)!="undefined" && typeof(google.gears)!="undefined") { provider=google.gears.factory.create('beta.geolocation'); } else if ( typeof(Mojo) !="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 if(typeof(blackberry.location.setAidMode)=="undefined") { return false; } blackberry.location.setAidMode(2); //override default method implementation pub.getCurrentPosition = function(successCallback,errorCallback,options) { //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_successCallback=successCallback; bb_errorCallback=errorCallback; //function needs to be a string according to //http://www.tonybunce.com/2008/05/08/Blackberry-Browser-Amp-GPS.aspx if(options['timeout']) { bb_blackberryTimeout_id=setTimeout("handleBlackBerryLocationTimeout()",options['timeout']); } else //default timeout when none is given to prevent a hanging script { bb_blackberryTimeout_id=setTimeout("handleBlackBerryLocationTimeout()",60000); } blackberry.location.onLocationUpdate("handleBlackBerryLocation()"); blackberry.location.refreshLocation(); } provider=blackberry.location; } } catch (e){ alert("error="+e); if(typeof(console)!="undefined") { console.log(e); } return false; } return provider!=null; } return pub; }();