//
// javascript-mobile-desktop-geolocation
// https://github.com/estebanav/javascript-mobile-desktop-geolocation
//
// Copyright J. Esteban Acosta Villafañe
// Licensed under the MIT licenses.
//
// Based on Stan Wiechers > geo-location-javascript v0.4.8 > http://code.google.com/p/geo-location-javascript/
//
// Revision: $Rev: 01 $:
// Author: $Author: estebanav $:
// Date: $Date: 2012-09-07 23:03:53 -0300 (Fri, 07 Sep 2012) $:

function handleBlackBerryLocationTimeout(){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){bb.error({message:"Position unavailable",code:2})}else{var e=null;if(blackberry.location.timestamp){e=new Date(blackberry.location.timestamp)}bb.success({timestamp:e,coords:{latitude:blackberry.location.latitude,longitude:blackberry.location.longitude}})}bb.success=null;bb.error=null}}var bb={success:0,error:0,blackberryTimeoutId:-1};var geoPosition=function(){var e={};var t=null;var n="undefined";var i="http://freegeoip.net/json/?callback=JSONPCallback";e.getCurrentPosition=function(e,n,r){t.getCurrentPosition(e,n,r)};e.jsonp={callbackCounter:0,fetch:function(e,t){var n="JSONPCallback_"+this.callbackCounter++;window[n]=this.evalJSONP(t);e=e.replace("=JSONPCallback","="+n);var r=document.createElement("SCRIPT");r.src=e;document.getElementsByTagName("HEAD")[0].appendChild(r)},evalJSONP:function(e){return function(t){e(t)}}};e.confirmation=function(){return confirm("This Webpage wants to track your physical location.\nDo you allow it?")};e.init=function(){try{var s=typeof navigator.geolocation!=n;if(!s){if(!e.confirmation()){return false}}if(typeof geoPositionSimulator!=n&&geoPositionSimulator.length>0){t=geoPositionSimulator}else if(typeof bondi!=n&&typeof bondi.geolocation!=n){t=bondi.geolocation}else if(s){t=navigator.geolocation;e.getCurrentPosition=function(e,r,i){function s(t){var r;if(typeof t.latitude!=n){r={timestamp:t.timestamp,coords:{latitude:t.latitude,longitude:t.longitude}}}else{r=t}e(r)}t.getCurrentPosition(s,r,i)}}else if(typeof window.blackberry!=n&&blackberry.location.GPSSupported){if(typeof blackberry.location.setAidMode==n){return false}blackberry.location.setAidMode(2);e.getCurrentPosition=function(e,t,n){bb.success=e;bb.error=t;if(n["timeout"]){bb.blackberryTimeoutId=setTimeout("handleBlackBerryLocationTimeout()",n["timeout"])}else{bb.blackberryTimeoutId=setTimeout("handleBlackBerryLocationTimeout()",6e4)}blackberry.location.onLocationUpdate("handleBlackBerryLocation()");blackberry.location.refreshLocation()};t=blackberry.location}else if(typeof Mojo!=n&&typeof Mojo.Service.Request!="Mojo.Service.Request"){t=true;e.getCurrentPosition=function(e,t,n){parameters={};if(n){if(n.enableHighAccuracy&&n.enableHighAccuracy==true){parameters.accuracy=1}if(n.maximumAge){parameters.maximumAge=n.maximumAge}if(n.responseTime){if(n.responseTime<5){parameters.responseTime=1}else if(n.responseTime<20){parameters.responseTime=2}else{parameters.timeout=3}}}r=new Mojo.Service.Request("palm://com.palm.location",{method:"getCurrentPosition",parameters:parameters,onSuccess:function(t){e({timestamp:t.timestamp,coords:{latitude:t.latitude,longitude:t.longitude,heading:t.heading}})},onFailure:function(e){if(e.errorCode==1){t({code:3,message:"Timeout"})}else if(e.errorCode==2){t({code:2,message:"Position unavailable"})}else{t({code:0,message:"Unknown Error: webOS-code"+errorCode})}}})}}else if(typeof device!=n&&typeof device.getServiceObject!=n){t=device.getServiceObject("Service.Location","ILocation");e.getCurrentPosition=function(e,n,r){function i(t,r,i){if(r==4){n({message:"Position unavailable",code:2})}else{e({timestamp:null,coords:{latitude:i.ReturnValue.Latitude,longitude:i.ReturnValue.Longitude,altitude:i.ReturnValue.Altitude,heading:i.ReturnValue.Heading}})}}var s=new Object;s.LocationInformationClass="BasicLocationInformation";t.ILocation.GetLocation(s,i)}}else{e.getCurrentPosition=function(t,n,r){e.jsonp.fetch(i,function(e){t({timestamp:e.timestamp,coords:{latitude:e.latitude,longitude:e.longitude,heading:e.heading}})})};t=true}}catch(o){if(typeof console!=n)console.log(o);return false}return t!=null};return e}()