/**
 * @author hohercak
 */

/* ********************************** */
/*           RegAdresaSuggestData     */
/* ********************************** */
  	function RegAdresaSuggestData(list, totalCount){
    	this.list = list;
    	this.totalCount = totalCount;
  	}

/* ********************************** */
/*           SuggestConfig            */
/* ********************************** */
  	
	/**
	 * Implicitni konfigurace naseptavace Adresy
	 * 
	 */
	function RegAdresaSuggestConfig(){
		
		// super();
		SuggestConfig.apply(this, arguments);
		
		// AJAX request
		this.requestUri = null;

		this.requestHeaders = new Object();
		this.requestHeaders["Content-Type"] = "application/x-www-form-urlencoded";
		this.requestHeaders["pragma"] = "no-cache";
		this.requestHeaders["cache-control"] = "no-cache,no-store,max-age=0";
		this.requestHeaders["expires"] = "0";
		
		this.requestParams = new Object();
	}

	RegAdresaSuggestConfig.prototype = new SuggestConfig;

/* ********************************** */
/*           RegAdresaSuggest         */
/* ********************************** */

	function RegAdresaSuggest(inputId, group, config){
		Suggest.apply(this, arguments);
	}
	
	RegAdresaSuggest.prototype = new Suggest;

	RegAdresaSuggest.prototype.getSuggestBox = function(config, eventController){
		return new RegAdresaSuggestBox(config, eventController);
	};
	
	RegAdresaSuggest.prototype.requestData = function(){
	
		if(!this.config || !this.config.requestUri){
			return;
		}
	
		var ajaxRequest = AjaxRequest.create();
		var controller = this;

  		var method = (this.config.requestMethod)?this.config.requestMethod:"GET";

		var params = new Object();
		for(var param in this.config.requestParams){
			params[param] = this.config.requestParams[param];
		}
		
  		if(this.group){
  			for(var suggest in this.group){
				params[suggest] = this.group[suggest].getInputValue();
  			}
  		} else {
			params[this.getInputId()] = this.getInputValue();
  		}
		
		var url = AjaxRequest.composeUrl(this.config.requestUri, params);
		
		ajaxRequest.open(method, url, true);
		
		if(this.config && this.config.requestHeaders){
			for(var header in this.config.requestHeaders){
				ajaxRequest.setRequestHeader(header, this.config.requestHeaders[header]);
			}
  		}
		
		ajaxRequest.onreadystatechange = function(){
			if (ajaxRequest.readyState == AjaxRequest.COMPLETE){
				if(ajaxRequest.status == 200 && controller.proccessResponse){
					var data = controller.proccessResponse(ajaxRequest);
					controller.setData(data);
				}
			}
		};
		//alert("url : " + url);
		ajaxRequest.send(null);
  	};
	
  	RegAdresaSuggest.prototype.proccessResponse = function(ajaxRequest){
		
		//ActiveXObject("Microsoft.XMLDOM")

		var xmlResponseDocument = ajaxRequest.responseXML.documentElement;
		
		if(ajaxRequest.responseText && !xmlResponseDocument){
			try {
				xmlResponseDocument = new ActiveXObject("Microsoft.XMLDOM");
				xmlResponseDocument.async="false";
				xmlResponseDocument.loadXML(ajaxRequest.responseText);
			} catch(e){
				return null;
			}
		}
		
		var data = new RegAdresaSuggestData();
		var element = null;
		
		if(!this.group){
			element = xmlResponseDocument.getElementsByTagName(this.getInputId());
			if(element && element.length > 0){
				if (element[0].textContent){
					data[this.getInputId()] = element[0].textContent; 
				} else if (element[0].text){
					data[this.getInputId()] = element[0].text; 
				}
			}
		} else {
			for(elementName in this.group){
				element = xmlResponseDocument.getElementsByTagName(elementName);
				if(element && element.length > 0){
					if (element[0].textContent){
						data[elementName] = element[0].textContent; 
					} else if (element[0].text){
						data[elementName] = element[0].text; 
					}
				}
			}
		}
		
		var totalCountElement = xmlResponseDocument.getElementsByTagName("total-count");
		if(totalCountElement && totalCountElement.length > 0){
			if (totalCountElement[0].textContent){
				data.totalCount = totalCountElement[0].textContent; 
			} else if (totalCountElement[0].text){
				data.totalCount = totalCountElement[0].text; 
			}
		}
		
		var listElements = xmlResponseDocument.getElementsByTagName("line");
		var list = null;
		if(listElements && listElements.length > 0){
			list = new Array();
			for(var i = 0; i<listElements.length; i+=1){
				if (listElements[i].textContent){
					list[i] = listElements[i].textContent.trim(); 
				} else if (listElements[i].text){
					list[i] = listElements[i].text; 
				}
			}
		}
		data.list = list; 
		
		return data;
  	};
	
	
/* ********************************** */
/*      RegAdresaSuggestBox           */
/* ********************************** */

	function RegAdresaSuggestBox(config, eventController){
		SuggestBox.apply(this, arguments);
	}

	RegAdresaSuggestBox.prototype = new SuggestBox;
	
	RegAdresaSuggestBox.prototype.getSuggestLinesBox = function(config, eventController){
		return new RegAdresaSuggestLinesBox(config, eventController);
	};
	 
/* ********************************** */
/*      RegAdresaSuggestLinesBox      */
/* ********************************** */

	function RegAdresaSuggestLinesBox(config, eventController){
		SuggestLinesBox.apply(this, arguments);
	}
	
	RegAdresaSuggestLinesBox.prototype = new SuggestLinesBox; 
	
	RegAdresaSuggestLinesBox.prototype.setData = function(data) {
    	this.clear();
    	if(!data || !data.list || !data.list.length || data.list.length == 0){
    		return;
    	}
    	var limit = Math.min(this.limit, data.list.length);
    	var height = 0;
    	for(var i=0;i<limit;i+=1){
      		var line = this.createLineElement(data.list[i]);
      		this.element.appendChild(line);
      		height += line.offsetHeight;
    	}
    	if(height < 300){
    		this.element.style.height = (height + 2) + "px";
    		this.element.style.overflow = "hidden";
    	}else{
    		this.element.style.height = "300px";
    		this.element.style.overflow = "scroll";
    	}
  	};

