/*
 * jQuery autoFill plugin 1.0.0
 *
 * dependencies:
 * autocomplete.js di jQuery
 * 
 */

/*
 * esempio di chiamata 
 * 	'inputType' : 'r'=regione, 'p'=provincia, 'c'=cittą.
 * 	'numOfSet' : numero della tripletta regione/provincia/citta.
 * 	'totNumOfSets' : numero totale delle triplette.
 * 
  $('#inputId').autoFill({
    	'inputType': 'r',
    	'numOfSet' : 1,
    	'totNumOfSets' : 3
  });
*/

function localDomicilio() {
	this.autocomplCityCb = function(data, index){
		try{
			if ((data.CityList != null) && (data.CityList.localArrayName != null)) {
				var arrayStr = "localDomicilio" + "[" + data.CityList.localArrayName + "]" + "[0]";
				var localActualCall = eval(arrayStr);
				var res = data.CityList.cities;
				localActualCall.setOptions({data:res}).click();
			}
		}catch(e){
		}
	};
	this.autocomplProvCb = function(data, index){
		try{
			if ((data.ProvinceList != null) && (data.ProvinceList.localArrayName != null)) {
				var arrayStr = "localDomicilio" + "[" + data.ProvinceList.localArrayName + "]" + "[1]";
				var localActualCall = eval(arrayStr);
				var res = data.ProvinceList.provinces;
				localActualCall.setOptions({data:res}).click();
			}
		}catch(e){
		}
   };
   this.autocomplRegionCb = function(data, index){
		try{
			if ((data.RegionList != null) && (data.RegionList.localArrayName != null)) {
				var arrayStr = "localDomicilio" + "[" + data.RegionList.localArrayName + "]" + "[2]";
				var localActualCall = eval(arrayStr);			
				var res = data.RegionList.regions;
				localActualCall.setOptions({data:res}).click();
			}
		}catch(e){
		}
   };
   
   this.generateFields = function(numFields){
	   for (var i = 1; i<=numFields; i++) {
		   this[i] = [undefined,undefined,undefined, "localDomicilio", 
		              function(data){ localDomicilio.autocomplCityCb(data); },
		              function(data){ localDomicilio.autocomplProvCb(data); },
		              function(data){ localDomicilio.autocomplRegionCb(data); }];
	   }	
   };
   
}
var localDomicilio = new localDomicilio();

(function($) {
	
	
	var $aF = $.autoFill = function( settings ){
		$aF( settings );
	};
	
	$aF.defaults = {		    
		localCalls:["http://api.community.alice.it/local-api-web/resources/autocomplete/region/#.js?callback=localDomicilio",
		            "http://api.community.alice.it/local-api-web/resources/autocomplete/province/#.js?callback=localDomicilio",
		            "http://api.community.alice.it/local-api-web/resources/autocomplete/city/#.js?callback=localDomicilio"],
		inputType : "c",
		numOfSet : 1,
		totNumOfSets : 1
	};	
	
	$aF.findValueCallback = function(event, data, formatted, localArray) {
		if (localArray[1] != undefined)
			localArray[1].val(data.province.name);
		if (localArray[2] != undefined)
			localArray[2].val(data.province.region.name);
	};
	
	$aF.findProvValueCallback = function(event, data, formatted, localArray) {
		if (localArray[2] != undefined)
			localArray[2].val(data.region.name);
	};
	
	$aF.setObjectToFill = function(obj, inputType, localArray, numOfSet) {
		var res = $(obj)
			.autocomplete([], {
				selectFirst: false,
				formatItem: function(row, i, max) {
					return row.name;
				},
				formatMatch: function(row, i, max) {
					return row.name;
				},
				formatResult: function(row) {
					return row.name;
				}
			})
			.blur(function(){
				$aF.autocompl(jQuery(this), inputType, localArray, numOfSet);
			})
			.keyup(function(){
				$aF.autocompl(jQuery(this), inputType, localArray, numOfSet);
			})
			.change(function(){
				//rinnova l'autocomplete su citta e provincia se cambia la regione
				if ( inputType=="r" ) {
					localArray[1].setOptions({data:[]});
					localArray[0].setOptions({data:[]});
				} else if (inputType=="p") {
					localArray[0].setOptions({data:[]});
				}
			});
		
		if ( inputType=="c" ) {
			res.result(function(event, data, formatted){$aF.findValueCallback(event, data, formatted, localArray);});
		} else if (inputType=="p") {
			res.result(function(event, data, formatted){$aF.findProvValueCallback(event, data, formatted, localArray);});
		}
		
		return res;
	};
	
	$aF.autocompl = function(jElem, type, localArray, numOfSet){
		var val = jElem.val();
		// Chiama al terzo e quarto carattere (se va in timeout al terzo, riparte l'autocomplete al quarto)
		if(val!=undefined && val.length>2 && val.length<5){
			var ajaxCall;
			var index = 0;
			var regionVal = "";
			
			if(type=="p"){
				index = 1;
				regionVal = (localArray[2] != undefined) ? localArray[2].val() : "";
				//aggiunto query param region su autocomplete provincia nel caso in cui valore regione > 2 caratteri
				if (typeof regionVal == "string" && regionVal.length>2) {
					ajaxCall = $aF.defaults.localCalls[index] + "[" + numOfSet + "]" + "[5]" + "&region=" + regionVal;
				} else {
					ajaxCall = $aF.defaults.localCalls[index] + "[" + numOfSet + "]" + "[5]";
				}
			}
			
			if(type=="c"){
				index = 2;
				var provVal = (localArray[1] != undefined) ? localArray[1].val() : "";
				var params = "";
				var numpar = 0;
				//aggiunto query param province su autocomplete citta nel caso in cui valore provincia > 2 caratteri
				if (typeof provVal == "string" && provVal.length>2) {
					params = "&province=" + provVal;
					++numpar;
				}
				regionVal = (localArray[2] != undefined) ? localArray[2].val() : "";
				//aggiunto query param region su autocomplete citta nel caso in cui valore regione > 2 caratteri
				if (typeof regionVal == "string" && regionVal.length>2) {
					params += "&region=" + regionVal;
					++numpar;
				}
				if (params != "") {
					if (numpar==1) {
						ajaxCall = $aF.defaults.localCalls[index] + "[" + numOfSet + "]" + "[4]" + params;
					}
					if (numpar==2) {
						ajaxCall = $aF.defaults.localCalls[index] + "[" + numOfSet + "]" + "[4]" + params;
					}
				} else {
					ajaxCall = $aF.defaults.localCalls[index] + "[" + numOfSet + "]" + "[4]";
				}
				
			}
			var prefix = val.substring(0,3).toLowerCase();
			if(!ajaxCall){
				ajaxCall = $aF.defaults.localCalls[index] + "[" + numOfSet + "]" + "[6]";
			}
			ajaxCall = ajaxCall.replace(/#/, prefix);
			ajaxCall += "&localArrayName=" + numOfSet;
			jQuery.ajax({
				type:"GET",
				url:ajaxCall,
				dataType:"script",
				async:true,
				cache:true,
				scriptCharset:"UTF-8"
			});
		}
	};	
	
	$.fn.autoFill = function( settings ) {
		var tgt=this;
		settings = $aF.settings = $.extend( {}, $aF.defaults, settings );
		
		if (localDomicilio[1]==null)
			localDomicilio.generateFields($aF.settings.totNumOfSets);
		
		switch ($aF.settings.inputType) {
			case "r":
				localDomicilio[$aF.settings.numOfSet][2] = jQuery(this);
				break;
			case "p":
				localDomicilio[$aF.settings.numOfSet][1] = jQuery(this);
				break;
			case "c":
				localDomicilio[$aF.settings.numOfSet][0] = jQuery(this);
				break;	
			default:
				break;
		}
		$aF.setObjectToFill(tgt, $aF.settings.inputType, localDomicilio[$aF.settings.numOfSet], $aF.settings.numOfSet);
	};	
		
})(jQuery);
