﻿/*
 * XAutocomplete - jQuery plugin 1.0.2
 *
 * Copyright (c) 2008
 */

// query string engine
(function($) {
	$.getQueryString  = function(options)
	{
		defaults = {defaultvalue:null} ;
		options = $.extend(defaults , options);
		qs = location.search.substring(1, location.search.length);
		if (qs.length == 0) return options.defaultvalue;
			qs = qs.replace(/\+/g, ' ');
			var args = qs.split('&');
			for (var i = 0; i < args.length; i ++ )
			{
				var value;
				var pair = args[i].split('=');
				var name = unescape(pair[0]);

			if (pair.length == 2)
			{	
				value = unescape(pair[1]);
			}
			else
			{
				value = name;
			}
			if (name == options.id || i == options.id-1)
			{
					return value;
			}
			}
		return options.defaultvalue
	};
})(jQuery);


(function($) {
	
$.fn.extend({
	xautocomplete: function(options) {	
		if ($(this).length == 0)
		  return;
		  
		options = $.extend($.Xautocompleter.defaults(), options);
		return $.Xautocompleter($(this), options);
	},
	is_valid: function()
	{
	  return ($(this).data('options') != undefined);
	},
	update: function() {
	    var obj = $(this);
	    if (!this.is_valid()) { return;}
	    
	    var options = obj.data('options');
	    var selected = options.selected;
		if (selected.formatted.toLowerCase() == obj.val().toLowerCase()) {
			options.city.val((!(selected.postcode)) ? selected.city : "");    		  
			options.zip.val(selected.postcode == undefined ? "" : selected.postcode);      
			options.search_text.val(selected.formatted == undefined ? "" : selected.formatted);   
		}
		else 
		{
			options.zip.val("");                
		}	  
	},
	updateResult: function(result)
	{		
	    var obj = $(this);
	    if (!this.is_valid()) { return result; }
		
		var ac_fields = obj.data('options');
		var ac_selectedData = obj.data('options').selected;
	        
		if (ac_selectedData.formatted == obj.val()) {
			result['city'] = (ac_fields.city.val() == "") ? ac_fields.search_text.val() : ac_fields.city.val();
			result['zip'] = ac_fields.zip.val();   
			
			if (result['zip']) {
			  result['city'] = "";
			}         
		}
		else
		{
		  result['city'] = ac_fields.inputField.val();
		}	
		result['type'] = ac_fields.type.val();		
		return result;
	},
	debug: function()
	{
	   var options = $(this).data('options');
	   console.log("City:" + options.city.val());
	   console.log("Zip:" + options.zip.val());	   	   	   
	   console.log("Search Text:" + options.search_text.val());	   	   	   	   
	   console.log("Input Field:" + options.inputField.val());	 
	   console.log("Selected City:" + options.selected.city);  	   	   	   	   	   
	   console.log("Selected Postcode:" + options.selected.postcode);  	   	   	   	   	   	   	   
	   console.log("Selected Formatted:" + options.selected.formatted);  	   	   	   	   	   	   	   	   
	   console.log("Real Value:" + $(this).val());  	   	   	   	   	   	   	   	   	   
	},
	findRecord: function()
	{
      if (!this.is_valid()) { return; }
	    	
	  var options = $(this).data('options');	
	  $(this).updateRadius();
	  $(this).search();
	},
	updateRadius: function()
	{
	  if (!this.is_valid()) { return; }
	  
	  var options = $(this).data('options');		  
	  if ((!options.selected) || (options.selected.formatted != $(this).val()))
	  {
	    options.radius.attr("disabled", (!$(this).val()) );       	
	  }
	  else
	  {
	    options.radius.attr("disabled", (!$(this).val()) ); 	  
	  }  

	}
});

$.Xautocompleter = function(obj, options) {
	obj.data('options',options);
	InitializeFields(obj, options);
    var lng = $.getQueryString({id:"lng"}) || "de";
    obj.addClass("autocomplete");
    options.translations = getTranslations(lng);
	
	obj.updateRadius();
	
    if (obj.hasClass("ac")) 
    {
      return;
    }
    	
	obj.addClass("ac"); 
	obj.autocomplete(options.request, {
		scroll: true,
		extraParams: {"lng" : lng},
		scrollHeight: 220,    
		minChars: 3,
		width: 211,
		delay: 30,
		max: ($.browser.opera)? 10 : 80,
		formatItem: function(row, i, max) {
			var c = buildObject(row);
			return buildiRecord(c);
		},
		formatMatch: function(row, i, max) {
			var c = buildObject(row);
			return buildRecord(c);
		},
		formatResult: function(row) {
			var c = buildObject(row);
			return buildRecord(c);
		}
	});	
	
	obj.result(function(event, data, formatted) {	  
	  if (data == undefined) {
		obj.update();	  
	    return;
	  }

	  var selected = buildObject(data);
	  selected.formatted = buildRecord(selected);	
	  
	  if (selected.postcode) {
		obj.val(selected.formatted);
	  }
	  
	  if ( obj.val().length > 3 )
	  {
		setTimeout(options.callcounter, 200);	   
	  }
	  
	  obj.data('options').selected = selected;  	  
	  obj.updateRadius();	  	  
	  obj.update();
	});
	
	options.submit.bind("click", function(e){ 
	   var myRe=/[0-9]+/;
	   if ( myRe.exec(obj.data('options').search_text.val()) )
	   {
	      obj.search(); 
	   }
	}
	);    
    obj.bind("blur", function(e) { setTimeout(function () { obj.findRecord(); }, 300); } );
    
    obj.bind(($.browser.opera ? "keypress" : "keydown"), function(event) {  
       if (event.keyCode == 13)
       {
         options.submit.click();
         return false;         
       }
       else
       {       
         ac_PrevCode = event.keyCode;  
       }      
	   setTimeout(function () { obj.updateRadius(); }, 0);
    });    
	    	
	function getTranslations(lng)
	{
	   var array = [];
	   array["de"] = ["Ort", "Kanton", "Region", "PLZ"];
	   array["en"] = ["City", "Canton", "Region", "Zip"];   
	   array["fr"] = ["Ville", "Canton", "Région", "NPA"];      
	   array["it"] = ["Località", "Cantone", "Regione", "CAP"];       
	   return array[lng];  
	}	
	
	function InitializeFields(obj, options) 
	{
	  var zip = $.getQueryString({id:"zip"});    
	  var city = $.trim(obj.val().replace(zip, ""));	  
 	  options.city.val(city);
	  options.zip.val(zip);        
	  options.selected = {"city": city, "postcode": zip, "formatted" : obj.val()} ;
	}
	
    function buildObject(row)
	{
	   var o = new Object();
	   o.city = row[0];
	   o.postcode = row[1];
	   return o;
	}

	function buildRecord(rec) {
		var text = rec.city;
		if ((rec.postcode) && (rec.city.match(rec.postcode) == null)){ text = text + " " + rec.postcode; }
		return text;
	}

	function buildiRecord(rec) {
		var text = "<span class='city'>" + rec.city + "</span>";

		if ((rec.postcode) && (rec.city.match(rec.postcode) == null)){
		   text = "<span class='city'>" + rec.city + "</span>" +  "<span class='postcode'>"+ rec.postcode + "</span>";
		}
		else if ((rec.postcode) && (rec.city.match(rec.postcode) != null)){
			text += "<span class='region'>" + options.translations[3] + "</span>";    
		}    
		else {
			text += "<span class='region'>" + options.translations[0] + "</span>";    
		}
		return text;
	}
};	

$.Xautocompleter.defaults = function() {	
    return {
		"city"   : $('input[id$=city]'),
		"zip"    : $('input[id$=zip]'),
		"search_text" : $('input[id$=search_text]'),
		"inputField"  : $('input.inputCity'),
		"request"     : "/IS24Web/_V2/JavaScripts/Query.ashx",
		"submit"      : $("input[id$=BtnSearch]"),
		"radius"      : $("select[id$=radius]"),
		"callcounter" : "CallCounter()",
		"type"        : $('input[id$=search_hidden_type]'),
		"selected"    : undefined
		};
    }
    
})(jQuery);



