if(typeof AO !== "object")
	AO={};
	

/**
 * AO.AutoUser singleton class
 */
AO.Address=function()
{

		
	// ONE PACK
		
	var adresa_map={
		items : {
			stat : { element_id : "adresa_stat",type:"select",send:true},
			kraj : { element_id : "adresa_kraj",type:"select",send:true},
			okres : { element_id : "adresa_okres",type:"select",send:true},
			obec : { element_id : "adresa_obec",type:"select",send:true},
			psc : { element_id : "adresa_psc",type:"input",send:false},
			ulica : { element_id : "adresa_ulica",type:"input",send:false}
		},
		on_air : false,
		state : {}		
	};
	
	
	// SECOND PACK
	
	var kadresa_map={
		items : {
			stat : { element_id : "kadresa_stat",type:"select",send:true},
			kraj : { element_id : "kadresa_kraj",type:"select",send:true},
			okres : { element_id : "kadresa_okres",type:"select",send:true},
			obec : { element_id : "kadresa_obec",type:"select",send:true},
			psc : { element_id : "kadresa_psc",type:"input",send:false},
			ulica : { element_id : "kadresa_ulica",type:"input",send:false}
		},
		on_air : false,
		state : {}
	};


	
	var getMapKeyByElementId = function(map,id)
	{
		for(var k in map)
		{
			if(map[k].element_id===id)
				return k;
		}
		
		return false;
	};
	
		
	// public interface
	return	{		
		// #################################################
		// #################################################
		//   LOCALITY
		// #################################################
		// #################################################
		
		
		/**
		 * complete handlers for gourp "adresa" of localization elements
		 *
		 */
		localityChangedAddress : function(e)
		{
			// running request ignore this one
			if(adresa_map.on_air)
				return;
			
			// temp - save states
			adresa_map.state={};
			adresa_map.on_air=true;
			
			var trigger=getMapKeyByElementId(adresa_map.items,$(e.target).attr("id"));
			
			var extraPost=this.proccesPostAndStates(adresa_map);
			
			var c_handler=this.localityChangedCompleteAddress;
			
			this.localityChanged(trigger,extraPost,c_handler);			
			
		},
		
		
		/**
		 * complete handlers for gourp "kadresa" of localization elements
		 *
		 */
		localityChangedKorespAddress : function(e)
		{
			// running request ignore this one
			if(kadresa_map.on_air)
				return;
			
			// temp - save states
			kadresa_map.state={};
			kadresa_map.on_air=true;
			
			var trigger=getMapKeyByElementId(kadresa_map.items,$(e.target).attr("id"));
			
			var extraPost=this.proccesPostAndStates(kadresa_map);
			
			var c_handler=this.localityChangedCompleteKorespAddress;
			
			this.localityChanged(trigger,extraPost,c_handler);
			
		},
		
		/**
		 * get other post values from family, save current values ... - MAP config
		 *
		 */
		proccesPostAndStates : function(MAP)
		{
			var extraPost={};
			var jqr,elval; // jquery result
			
			for(var key in MAP.items) // private closure var
			{	
				if(!MAP.items[key].send) // dont send ignored ...
					continue;
					
				MAP.state[key]={};
				
				jqr = $("#"+MAP.items[key].element_id);
				
				if(jqr.length>0)
				{
					elval=jqr.val();
					extraPost[key]=elval;					
					MAP.state[key].sel=elval; // save selections					
				}
			}
			
			return extraPost;			
		},
		
				
		/**
		 * change handler for localize element (trigger), asks data for other localization elements
		 * 
		 */
		localityChanged : function(trigger,extraPost,c_handler)
		{
			// adresa_stat	adresa_kraj adresa_okres adresa_obec adresa_psc adresa_ulica
						
			// prepare requests
			var post = {
				_server : "ao",
				_pack : "autoUser",
				_action : "complete_address",
				trigger : trigger									
			};
			
			// add extra post
			AO.Common.Util.recurseMerge(post,extraPost);
				
			$.post(AO.Common.settings.BASE_URL, post, AO.Common.Util.createHandler(c_handler,this), "json");		
		},
		
		
		localityChangedCompleteAddress : function(data)
		{
			this.localityChangedCompleteCore(data,adresa_map);
		},
		
		localityChangedCompleteKorespAddress : function(data)
		{
			this.localityChangedCompleteCore(data,kadresa_map);
		},
		
		
		localityChangedCompleteCore : function(data,MAP)
		{
			// temp states
			var temps=MAP.state;
			
			var element,opts,sel;
			
			var d=data.data;
			
			for(var el_key in d)
			{
				element=$("#"+MAP.items[el_key].element_id);
				
				if(element.length===0)
					continue;
				
				sel=null;
				
				if(MAP.items[el_key].type==="select")
				{
					if(MAP.state[el_key].sel)
						sel=MAP.state[el_key].sel;
					
					if(d[el_key].value)				
						sel=d[el_key].value;
						
					AO.Common.Util.generateOptions(element.get(0), d[el_key].options, sel);
				}else
				{
					// element.val(d[el_key]);
				}					
			}
			
			MAP.state=null;
			MAP.on_air=false;
		}
		
		
	// return end	
	}
	
}();
