function Localizator(call, addressObj) {
	var form=null;
	var defaultAction=null;
	var onSuccessCall=null;
	var addressIdentPointer=0;
	var address=[];
	var addressGeoInfo=[];
	var areYouSure="Tuto adresu jsme bohužel nedokázali na mapě lokalizovat:\n\t%s\n\nPokud jsi si jist/a, že je správná, pokračuj kliknutím na OK. Nebude však fungovat vyhledávání, které je na tuto lokalitou navázáno. Kliknutím na Cancel/Zrušit adresu upravíš.";
	

	this.AddAddress=function(addressObj){
		if(!addressObj.latParam) addressObj.latParam='gps_latitude';
		if(!addressObj.lngParam) addressObj.lngParam='gps_longitude';
		address[address.length]=addressObj;
	}
	
	function DefineSuccessCall(call){
		if(call.tagName && call.tagName.toLowerCase()=='form'){
			form=call;
			defaultAction=form.action;
			form.action="javascript:void(0);";
			YAHOO.util.Event.addListener(form, "submit", startLocalizing);
			return DefaultSubmit;
		}else{
			return call;
		}
	}

	this.startLocalizing=function(){
		startLocalizing();
	}
	
	function startLocalizing(){
		addressIdentPointer=0;
		addressGeoInfo=[];
		if(form){
			FakeSubmit();
			return false;
		}else{
			CheckAddresses();
		}
	}
	
	function ConstructAddressString(){
		var i=addressIdentPointer;
		if(address[i].full && address[i].full.value) return address[i].full.value;

		var street='', city='', zip='', region='', country='';
		if(address[i].street && address[i].street.value) 			street=address[i].street.value;
		if(address[i].city && address[i].city.value) 					city=address[i].city.value;
		if(address[i].zip && address[i].zip.value) 					zip=address[i].zip.value;
		if(address[i].region && address[i].region.value)			region=GetSelectText(address[i].region);
		if(address[i].country && address[i].country.value) 	country=address[i].country.value;
		if(!street && !zip && !city && !region && !country) return false;
		return street+", "+zip+" "+city+", "+region+", "+country;
	} 
	
	function GetSelectText(o){
		var i=o.selectedIndex;
		return i?o.options[i].text:false;
	}
	
	function CheckAddresses(){
		while(address.length>addressIdentPointer){
			var addressString=ConstructAddressString();
			if(addressString){
				geocoder=null;
				geocoder=new GClientGeocoder();
				geocoder.getLocations(addressString, HandleGeoResponse);
				//geocoder.getLatLng(addressString, HandleGeoPoint);
				break;
			}
			addressIdentPointer++;
		}
		if(address.length==addressIdentPointer) Success();
	}

	function Success(){
		onSuccessCall(addressGeoInfo);
	}
	
	function AppendGeoInfo(){
		for(var i=0;i<address.length;i++){
			if(addressGeoInfo[i]){
				if(address[i].latParam && addressGeoInfo[i].lat)
					form.appendChild(CreateHiddenInput(address[i].latParam, addressGeoInfo[i].lat));
				if(address[i].lngParam && addressGeoInfo[i].lng)
					form.appendChild(CreateHiddenInput(address[i].lngParam, addressGeoInfo[i].lng));
			}
		}
		form.appendChild(CreateHiddenInput('geocheck', 'true'));
	}
	
	function HandleGeoResponse(response){
		var lat='', lng='';
		if(!response || response.Status.code != 200){
		}else{
			lat=response.Placemark[0].Point.coordinates[1];
			lng=response.Placemark[0].Point.coordinates[0];
		}
		HandleLatLng(lat, lng);
	}

	function HandleGeoPoint(point){
		var lat='', lng='';
		if(point) var lat=point.lat(), lng=point.lng();
		HandleLatLng(lat, lng);
	}

	function HandleLatLng(lat, lng){
		if(!lat && !ConfirmUnsureAddress()) return false;
		addressGeoInfo[addressIdentPointer]={lat:lat, lng:lng};
		addressIdentPointer++;
		CheckAddresses();
	}

	function ConfirmUnsureAddress(){
		if(confirm(areYouSure.replace(/\%s/, ConstructAddressString()))){
			return true;
		}else{
			var adr=address[addressIdentPointer];
			if(adr.full) adr.full.focus();
			else if(adr.street) adr.street.focus();
			return false;
		}
	}

	/* Call is form */
	function FakeSubmit(){
		if (typeof(GBrowserIsCompatible)=="undefined" || !GBrowserIsCompatible()){
			DefaultSubmit();
		}
		CheckAddresses();
	}
	
	function DefaultSubmit(){
		AppendGeoInfo();
		form.action=defaultAction;
		form.submit();
	}
	
	function CreateHiddenInput(name, value){
		try {
			el=document.createElement("<input name='"+name+"' type='hidden' value='"+value+"' />");
		} catch (e) {
			el=document.createElement("input");
			el.setAttribute("type", "hidden");
			el.setAttribute("name", name);
			el.setAttribute("value", value);
		}
		return el;
	}


	// start
	onSuccessCall=DefineSuccessCall(call);
	if(addressObj) this.AddAddress(addressObj);
}