function g() {
  if(geo_position_js.init()) {
		showLocateLayer();
  }
  
	this.locate = function() {
		var g = document.getElementById('geo');
		g.innerHTML = '<img src="/i/load.gif" alt="Lade..."/> Ihre Position wird ermittelt...';
		geo_position_js.getCurrentPosition(gs,gse,{enableHighAccuracy:true});
	}

	function showLocateLayer() {
		var g = document.getElementById('geo');
		if(!document.getElementById("geoRes") && document.getElementById("geoRes") == null) {
 			g.innerHTML = '<form method="post" action="/"><input type="button" name="geo" value="Position ermitteln" onclick="locate()"/></form><span class="s">Wir haben ermittelt, dass Ihr Ger&auml;t in der Lage ist, Ihre geografische Position an uns zu &uuml;bermitteln. Wenn Sie zustimmen, zeigen wir Orte in Ihrer Umgebung an.</span>';
			document.getElementById('geoWrap').style.display = 'block';
		}
		document.getElementById('geoW').style.display = 'block';
		g.style.display = 'block';
	}
	
	function gse() {
		var g = document.getElementById('geo');
		g.innerHTML = 'Leider k&ouml;nnen wir Ihre Position derzeit nicht ermitteln. Haben Sie der Nutzung Ihrer Position zugestimmt? <a href="/?locate=true">Erneut versuchen</a>';
	}
	
  function gs(p) {
		if(document.getElementById('geo')) {
			var g = document.getElementById('geo');
			if(p.coords.latitude != 0 && p.coords.longitude != 0) {
				g.innerHTML = 'Wir haben Ihre Position ermittelt. Sie werden automatisch weitergeleitet. Sollte die Weiterleitung nicht funktionieren, klicken Sie bitte <a id="gl" href="/?lat=' + p.coords.latitude.toFixed(2) + '&long=' + p.coords.longitude.toFixed(2) + '">hier</a>.';
				document.location.href = '/?lat=' + p.coords.latitude.toFixed(2) + '&long=' + p.coords.longitude.toFixed(2);
			} else {
				g.innerHTML = 'Leider k&ouml;nnen wir Ihre Position derzeit nicht ermitteln. Haben Sie der Nutzung Ihrer Position zugestimmt? Ansonsten sind Sie eventuell an einem Ort, an dem die Lokalisierung nicht m&ouml;glich ist. <a href="/?locate=true">Erneut lokalisieren</a>';
			}
		}
  }
}

var bb_successCallback;
var bb_errorCallback;
function handleBlackBerryLocation()
{
	if (bb_successCallback && bb_errorCallback)
	{
		if(blackberry.location.latitude==0 && blackberry.location.longitude==0)
		{
			bb_errorCallback({message:"Position unavailable", code:2});
		}
		else
		{
			var timestamp=null;
			if (blackberry.location.timestamp)
			{
				timestamp=new Date(blackberry.location.timestamp);
			}
			bb_successCallback({timestamp:timestamp, coords: {latitude:blackberry.location.latitude,longitude:blackberry.location.longitude}});
		}
		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(navigator.geolocation)!="undefined") 
			{
				provider=navigator.geolocation;
				pub.getCurrentPosition = function(successCallback, errorCallback, options)
				{
					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);
				}			
			}
			else if(typeof(window.google)!="undefined")
			{						
				provider=google.gears.factory.create('beta.geolocation');
			}	
			else if (typeof(window.Mojo)!="undefined" && typeof(Mojo.Service.Request)!="Mojo.Service.Request")
			{
				provider=true;
				pub.getCurrentPosition = function(successCallback, errorCallback, options)
				{
				parameters={};
				if(options)
				{
					 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");
				
				pub.getCurrentPosition = function(successCallback, errorCallback, options)
				{
					function callback(transId, eventCode, result) {
					    if (eventCode == 4) 
						{
					        errorCallback({message:"Position unavailable", code:2});
					    }
						else
						{
							successCallback({timestamp:null, coords: {latitude:result.ReturnValue.Latitude, longitude:result.ReturnValue.Longitude, altitude:result.ReturnValue.Altitude,heading:result.ReturnValue.Heading}});
					 	}
					}
				    var criteria = new Object();
    				criteria.LocationInformationClass = "BasicLocationInformation";					
					provider.ILocation.GetLocation(criteria,callback);					
				}
			}									
			else if(typeof(window.blackberry)!="undefined" && blackberry.location.GPSSupported)
			{
				pub.getCurrentPosition = function(successCallback,errorCallback,options)
				{
					bb_successCallback=successCallback;
					bb_errorCallback=errorCallback;
					blackberry.location.onLocationUpdate("handleBlackBerryLocation()");
					blackberry.location.setAidMode(2);
					blackberry.location.refreshLocation();	
				}
				provider=blackberry.location;
			}
		}
		catch (e){ console.log(e); }		
		return  provider!=null;
	}
	return pub;
}();


