/* Autohinter for uir.
 * Class implements hinter for cities, city parts and streets.
 */

function Autocomplete(iSearch, varValueHidden, ajaxUrl, urlSearchParam, lDataShow, iRequest, cClickCallback) 
{
	$('form').keypress(function(e){
		return e.keyCode!=13;
	});
	
	iSearch.get(0).description = iSearch.val();
    	iSearch.click(function() {
		if(this.description == $(this).val()) {
			$(this).val("");
		}
	});
	
	// container for selected items
	var lItem = $('<div></div>').addClass('autocomplete');
	// wrapper for hint
	var lHintWrapper = $('<div></div>').addClass('hint-wrapper').css("z-index","99999");
	// hints
	var lHint = $('<ul></ul>');
	// hidden field
	var iHidden = iSearch.next('input[name='+varValueHidden+']');
	
	lHint.wrap(lHintWrapper);
	
	iSearch.wrap(lItem).after(lHint.parent());
	// hack, must be inserted in DOM
	lHintWrapper = lHint.parent();
	
	// keyup handler for city
	iSearch.keyup(function(event){
		call_ajax(event);
	}).blur(function(){
	       // fix for problem on click
		setTimeout(hide_autocomplete, 300);
	});
	
	// universal autohinter method/class
	var call_ajax = function(event) { 
		// reset hidden value
		iHidden.val("");
		
		if(event.type != 'click') {
			
		}
		
		// find active item
		var active = lHint.find('li[val].active');
		var position = -1;
		// get position before active item
		if(active.length != 0) {
			position = active.prevAll('li[val]').length;
		}
		
		var rows = lHint.find('li[val]').removeClass('active');
		var key_action = false;
		var scroll = 0;
		
		// 40 - down, 38 - up
		if((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
			position++;
			key_action = true;
			scroll = (position != 0  ? Math.abs(position-1) : 0 );
		} else if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
			position--;
			key_action = true;
			scroll = (position > 0  ? Math.abs(position-1) : (position == -1) ? rows.length - 1 : 0 );
		} else if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
			if(active.length == 1) {
				active.click();
				return;
			}
		}
	
		if(key_action) {
			rows.eq(position).addClass('active');
			lHintWrapper.scrollTop(rows.eq(position).outerHeight() * scroll);
			return;
		}
		
		// less than min_search chars

		if(iSearch.attr('value').length < 2 )
    {
			return;
		}
		
    if ((iSearch.attr('value') == "as") || (iSearch.attr('value') == "As") || (iSearch.attr('value') == "AS") || (iSearch.attr('value') == "Es") || (iSearch.attr('value') == "es") || (iSearch.attr('value') == "ES") || (iSearch.attr('value') == "EŠ") || (iSearch.attr('value') == "Eš") || (iSearch.attr('value') == "eš") || (iSearch.attr('value') == "aš") || (iSearch.attr('value') == "Aš") || (iSearch.attr('value') == "AŠ"))
      ;    
    else { 
  		if(iSearch.attr('value').length < 3 )
  		{
  			return;
  		} 
		}

		var reqData = {};
		reqData[urlSearchParam] = iSearch.attr('value');
		$.getJSON(ajaxUrl, reqData,
				function(data) 
				{ 
					lHint.empty();

					if(data.length == 0) {/*
						lHint.append('<li>'+""+'</li>');*/
						lHintWrapper.hide();
						return;
					}
					
					$.each(data, function(i, type)
					{
						var groupLabel = $('<li><span>'+type.name+'</span></li>').addClass('label').appendTo(lHint);
						// append data to hinter
						$.each(type.locations, function(a, item)
							{
								var li = $('<li></li>').attr('val', item[iRequest]).appendTo(lHint);
				
								// add highlight to finded string
								var search = iSearch.attr('value');

								for(var key in lDataShow)
								{
									var text = item[key];
									var rec;
									 
									if(!lDataShow[key]) {
									   if(key == "description"){
										    rec = $('<span class="'+key+'"> > ('+text+')</span>');
										  }else{
										    rec = $('<span class="'+key+'">'+text+'</span>');
										  }
									} else {
										rec = $('<span class="'+key+'">'+(lDataShow[key](text))+'</span>');
									}
									
									if(key == iRequest)
										rec.addClass('selected');
									
									rec.appendTo(li);
								}
							
								// add click event for select a city
								li.click(select_location);
								li.next("span").click(select_location);
							}
						);
					});
					
					lHint.children('li[val]').eq(0).addClass('active');
					// show hinter
					lHintWrapper.show();
				});
	};
	
	var select_location = function() {
		iHidden.val($(this).attr("val"));
		iSearch.val($(this).children().eq(0).text());
		//lHint.hide();
        // fix for problem on click
		hide_autocomplete();
		iSearch.blur();
		
		if(cClickCallback !== undefined || cClickCallback !== null) {
			cClickCallback(iSearch);
		}
	};
		
	var hide_autocomplete = function() {
		lHintWrapper.hide();
		if(iHidden.val().length == 0)
			iSearch.val(iSearch.get(0).description);
	};
}

