	var KLADR_SERVER = "http://kladr.org.ru/addr_suggest.php";
	
	function AddressSuggestions() {}
	AddressSuggestions.prototype.requestSuggestions = function(autoControl, bTypeAhead) 
	{
	var oThis = this;
	var sendValue = autoControl.textbox.value;
	var req = { task: "suggest", value: sendValue };
	var parent = autoControl.group.getParent(autoControl);
	for (t in parent) req[t] = parent[t];  // add all properties in request
	
	if (this.lastReq)
	if (req.region != this.lastReq.region || req.zone != this.lastReq.zone || req.settlement != this.lastReq.settlement) JsHttpRequest.CACHE = {};

	if (!autoControl.needAutocomplete(oThis))
	{

	return;
	}
 	
	JsHttpRequest.query( KLADR_SERVER, req, 
	function(result, errors)
	{
		if (result)
		{
 	        	if (autoControl.textbox.value == sendValue)
			{
// 				if (result.level == 5)
// 				{
// 				alert(';');
// 				//autoControl.selectedNode = result;
// 				//autoControl.showInputs();
// 				}
				
				autoControl.autosuggest(result, bTypeAhead);
				oThis.lastReq = req;
				
 	                }
		}
 	},
 	false
 	);
 	}
 	AddressSuggestions.prototype.fieldToString = function(s) {
 	    if (s.level<5) return s.name + " (" + s.type + ")";
 	    else return s.name;
 	}
 	
 	function KladrGroup() {
 	    this.inputs = [];
 	    this.titles = [];
 	    this.correct = null;
 	}
 	
	KladrGroup.prototype.check = function() 
	{
 	    var oThis = this;
 	    var index = this.getIndex();
 	    var bId = this.getBuildingId();
 	    var sId = this.getStreetId();
	//alert ("buildinID "+ bId +" getStreetId" + sId);
 	    var req = {
		refer: 1,
 	        task: "checkIndex",
 	        userIndex: index,
 	        buildingId: bId,
 	        streetId: sId
 	    };
 	    oThis.correct = 2; // идет проверка
 	    JsHttpRequest.query(
 	        KLADR_SERVER, req, function(result, errors) {
 	                if (result && result.correct) {
 	                oThis.correct = 1;
 	                oThis.getIndexInput().textbox.className = "";
 	            }
 	            else {
 	                oThis.correct = 0;
 	                oThis.getIndexInput().textbox.className = "blocked";
 	            }
 	            },
 	            false
 	        );
 	}
 	
 	KladrGroup.prototype.getIndexInput = function() {
 	    for (var i=0;i<this.inputs.length;i++) {
 	        if (this.inputs[i].selectedNode &&
 	            this.inputs[i].selectedNode.level == 5) break; // дом
 	    }
 	    if (i<this.inputs.length-1)
 	        return this.inputs[i+1];
 	    return null;
 	}
 	
 	KladrGroup.prototype.getIndex = function() {
 	    for (var i=0;i<this.inputs.length;i++) {
 	        if (this.inputs[i].selectedNode &&
 	            this.inputs[i].selectedNode.level == 5) break; // дом
 	    }
 	    if (i<this.inputs.length-1)
 	        return this.inputs[i+1].textbox.value;
 	    return null;
 	}
// ОСТАЛОСЬ НАЙТИ АЙДИ ТЕКУЩЕГО БИЛДИНГА!!! ВСЯ ПРОБЛЕМА В АЙДИ, надо генерировать нормальный список домов и их айдишников

 	KladrGroup.prototype.getBuildingId = function() {
 	    for (var i=0;i<this.inputs.length;i++) {
	        if (this.inputs[i].selectedNode &&
	            this.inputs[i].selectedNode.level == 5)
	            return this.inputs[i].selectedNode.id;
	    }
	    return null;
	}
	
	KladrGroup.prototype.getStreetId = function() {
	    for (var i=0;i<this.inputs.length;i++) {
	        if (this.inputs[i].selectedNode &&
	            this.inputs[i].selectedNode.level == 4)
	            return this.inputs[i].selectedNode.id;
	    }
	    return null;
	}
	
	KladrGroup.prototype.add = function(c,t) {
	    if (this.inputs.length>0) c.textbox.style.display = "none";
	    this.inputs.push(c);
	    c.group = this;
	    this.titles.push(t);
	}
	KladrGroup.prototype.needAutoComplete = function(c) 
	{

	    var p = this.inputs.indexOf(c);
	    if (p>0 && this.inputs[p-1].selectedNode.level == 5)
		{
		return false;
		}
	    return true;
	}
// Определение следующего текстового поля
	KladrGroup.prototype.showNextInput = function(c)
	{
		var p = this.inputs.indexOf(c);
		if (p<this.inputs.length-1)
		{
			this.inputs[p+1].textbox.value = "";
			this.inputs[p+1].textbox.style.display = "block";
			if (c.selectedNode.level==4)
				this.titles[p+1].innerHTML = "Дом:"
			else if (c.selectedNode.level==5)
				this.titles[p+1].innerHTML = "Индекс:"
			else if (c.selectedNode.level==3)
				this.titles[p+1].innerHTML = "Улица/дом:"
			else
			{
				switch(p)
				{
				case 0:
				if (c.selectedNode.type=="Город")
				this.titles[p+1].innerHTML = "Город/поселение/улица:";
				else
				this.titles[p+1].innerHTML = "Адм.Район/город:";
				break;

				case 1:
				if (c.selectedNode.level==2)
				this.titles[p+1].innerHTML = "Поселение/улица/дом:";
				else
				this.titles[p+1].innerHTML = "Город/село/улица:"
				break;

				case 2:
				if (c.selectedNode.level==2)
				this.titles[p+1].innerHTML = "Поселение/улица/дом:";
				break;
				}
			}
		}
	}



//Скрытие ненужных текстовых полей кладра
	KladrGroup.prototype.hideNextInputs = function(c) 
	{
	    var p = this.inputs.indexOf(c);
	    for (var i=p+1;i<this.inputs.length;i++) {
	        this.inputs[i].textbox.style.display = "none";
	        this.titles[i].innerHTML = "";
	    }
	}

//функция заполнения поля индекса -------------------------------
	KladrGroup.prototype.IndexFilling = function(c)
	{	
	var oThis = this;
	var bId = this.getBuildingId();
	var sId = this.getStreetId();
	var p = oThis.inputs.indexOf(c);	
	var i=p+1;
	var req = {
			refer: 2,
			task: "checkIndex",
			buildingId: bId,
			streetId: sId
		  };

	JsHttpRequest.query(KLADR_SERVER, req, 
	function(result, errors)
	{
		oThis.inputs[i].textbox.value = result['res'];
	}
	,false );
	}

//переход к следующей текстовой области
	KladrGroup.prototype.focusNext = function(c) 
	{
	    var p = this.inputs.indexOf(c);
	    if (p<this.inputs.length-1) {
	        this.inputs[p+1].textbox.focus();
	    }
	}

	KladrGroup.prototype.getParent = function(input) {
	    var res = [];
	    var p = this.inputs.indexOf(input);
	    if (p==0 || p==-1) return null;
	    var cn = this.inputs[p-1].selectedNode;
	    if (!cn) return null;
	    switch (cn.level) {
	        case "0": return {region:cn.id};
	        case "1": return {zone:cn.id};
	        case "2": return {city:cn.id};
	        case "3": return {settlement:cn.id};
	        case "4": return {street:cn.id};
	        case "5": return {building:cn.id};
	    }
	}
	KladrGroup.prototype.setFilter = function(filter) {
	    this.filter = filter;
	}
