if(!mdv) {
    var mdv;
    mdv = {};
}

mdv.sug = {
    sugFocusId: -1,
    checkText: '',
    text: {},
    vars: {}
}

function odvSuggest(event, value, usage){
    if(event.keyCode === 38 || event.keyCode === 40 || event.keyCode === 27 || mdv.sug.checkText === value){
        return false;
    }
    
    mdv.sug.checkText = value;
    
	window.setTimeout(
		function(){
            if(mdv.sug.checkText != value){
				return false
			}
			sendOdvSuggest(value, usage)
		}, 400);
}

function sendOdvSuggest(value, usage){ 
	if (value.length >= mdv.sug.sendOdvSuggestMin) {
        var sort = '';
        if (mdv.sug.vars.sort === '2') {
            sort = '&w_regPrefAl=1&w_objPrefAl=35&w_prefStModesAm=7&prMinQu=1';
        }
        var anyObjFilter = jQuery('#itdLPxx_type_' + usage).attr('value');
		var url = mdv.sug.url + 'language=de&anySigWhenPerfectNoOtherMatches=0&locationServerActive=1&anyObjFilter_sf=' + anyObjFilter + '&itdLPxx_usage=' 
                    + usage + '&anyMaxSizeHitList=600&SpEncId=0&type_sf=any&name_sf=' + value  
                    + '&itdLPxx_checkText=' + value + '&stateless=1&outputFormat=JSON' + sort; 
                   
		jQuery.ajax({url: url, success: odvSuggest_onAjaxComplete});
	}
	else if (document.getElementById('odvOverlay')){
        jQuery('#odvOverlay').remove();
    }
};


/* Create the odv suggest overlay */
function odvSuggest_onAjaxComplete(response){
 	var json = null;
 	var efa = null;
    
    // remove old suggestion  list
    if(jQuery('#odvOverlay').length > 0){
		jQuery('#odvOverlay').remove();
	}

 	if (response && response.responseText)	{
 		json = response.responseText;
 	} 
    else if (response) {
 		json = response;
 	}
    else {
        return false;
    }

 	eval('efa = ' + json + ';'); 

    var checkText = efa.parameters[0].value;
 	
    if(!efa.stopFinder || mdv.sug.checkText != checkText || efa.stopFinder === 0) {
		return false;
	}
    
    var usage = efa.parameters[1].value;
    var length = efa.stopFinder.length;
    var stateless = '';
    var txt = '';
    var img = '';
    var onclick = '';
    var coord;
    var center = '';
    var point;
    var odvSug = '<div class="dynamiclistContainer"><div class="dynamiclist" id="odvOverlay"><div id="odvSg">';
    var quickInput = jQuery('#qInput').length > 0 ? true : false;

	if (efa.stopFinder.point){
		length = 1;
	}
    
	// sort result list if more than one hit 
	if (length > 1) {
        if (mdv.sug.vars.sort === '2') {
            efa.stopFinder.sort(alphabetComparision).sort(qualityComparision);
        }
        else if ( mdv.sug.vars.sort === '3') {
            efa.stopFinder.sort(qualityComparision); 
            efa.stopFinder.sort(typeComparison);
        }
        else {
            efa.stopFinder.sort(alphabetComparision).sort(typeComparison);
        }
	}

	for(i=0;i < length; i ++){
		point =  efa.stopFinder[i] || efa.stopFinder.point;
        
        // reinitialize variables
        txt = '';
        img = '';
        onclick = '';
        center = '';
        
        switch (point.anyType) {
            case 'poi': 
                img = '<img src="' + mdv.sug.vars.imgPath + 'efa_ico/poi.gif" alt="' + mdv.sug.text.poi + '"/>';
                break;
            case 'stop': 
                img = '<img src="' + mdv.sug.vars.imgPath + 'efa_ico/stop.gif" alt="' + mdv.sug.text.stop + '"/>';
                break;
            case 'loc': 
                img = '<img src="' + mdv.sug.vars.imgPath + 'efa_ico/address.gif" alt="' + mdv.sug.text.place + '"/>';
                break;
            default:
                img = '<img src="' + mdv.sug.vars.imgPath + 'efa_ico/address.gif" alt="' + mdv.sug.text.address + '"/>';
        } 

        txt = getPointText(point);
        
        if (point.ref.coords && !quickInput) {
            coord = point.ref.coords.split(',');
            center = 'mdv.map.setMapCenter(\'karte_rechts_map\', \'' + coord[0] + '\', \'' + coord[1] + '\', \'7\');jQuery(\'#itdLPxx_mapMarker_' + usage + '\').attr(\'value\', \'' + coord[0] + ':' + coord[1] + '\');mdv.map.setMapMarker(\'' + usage + '\', \'karte_rechts_map\');'
        }
         
		onclick = center + 'submitPoint(\''+  point.stateless + '\',\''+  usage + '\',\''+  txt + '\');';
		odvSug = odvSug.concat('<div id="sug_', i, '" class="sugItem">', img, '<a id="sugLink_', i, '" href="javascript:void(0);" onclick="', onclick, '" class="sugFo">',  txt, '</a></div>');
	}
    
    odvSug = odvSug.concat('</div></div></div>');
    jQuery(odvSug).insertAfter(jQuery('#name_' + usage));
};

// Get point text.
function getPointText (point) {
    txt = point.ref.place;
    if (point.anyType !='loc' && txt != '') {
        txt = txt.concat(', ', point.object);
        if (point.buildingNumber) {
            txt = txt.concat (' ',point.buildingNumber);
        }
    }
    return txt;
}

// Submits an item of suggestion list
function submitPoint(stateless, usage, txt){
    mdv.sug.checkText = txt; 
    jQuery('#name_' + usage).val(txt);
    jQuery('#nameInfo_' + usage).val(stateless);
    jQuery('#odvOverlay').remove();
}

// Clear suggestion list
function clearSug() {
    mdv.sug.sugFocusId = -1
    jQuery('#odvOverlay').remove();        
}

// Navigation in suggestion list
jQuery(document).keyup(function(event){
    if(jQuery('#sug_0').length > 0 && (event.keyCode == 40 || event.keyCode == 38)){   
        var counter = jQuery('#odvSg').children().size();
        // check if cursor key were used down
        if(event.keyCode == 40){
            if(mdv.sug.sugFocusId < counter -1){
                mdv.sug.sugFocusId++;
                jQuery('div.actSug').removeClass('actSug');
                jQuery('#sug_' + mdv.sug.sugFocusId).addClass('actSug');
                jQuery('#sug_' + mdv.sug.sugFocusId).focus();
            }
        }
        //up
        else if(event.keyCode == 38 && mdv.sug.sugFocusId > 0){
            mdv.sug.sugFocusId--;
            jQuery('div.actSug').removeClass('actSug');
            jQuery('#sug_' + mdv.sug.sugFocusId).addClass('actSug');
            jQuery('#sug_' + mdv.sug.sugFocusId).focus();            
        }
    }
    if((jQuery('#sug_0').length > 0 && event.keyCode == 27)){
        var sug = jQuery(".odvSg");  
        jQuery('.sugItem').css('display', 'none');
    }     
});

// Comparison of point type.
function typeComparison(a, b)	{
	if(a.anyType == 'stop'){
		a.sortPos = 1
	}
	else if(a.anyType == 'loc'){
		a.sortPos = 2
	}
	else if(a.anyType != 'poi'){
		a.sortPos = 3
	}
	else{
		a.sortPos = 4
	} 
	if(b.anyType == 'stop'){
		b.sortPos = 1
	}
	else if(b.anyType == 'loc'){
		b.sortPos = 2
	}
	else if(b.anyType != 'poi'){
		b.sortPos = 3
	}
	else{
		b.sortPos = 4
	} 
   
   if (a.sortPos < b.sortPos) {
        return -1;
     }
     else if (a.sortPos > b.sortPos) {
       return  1;
     }
     else {
       return 0;
     }
}

// Alphabetical comparison of point name.
function alphabetComparision (a, b) {
    var compA = getPointText(a);
    var compB = getPointText(b);
    
    if (compA < compB) {
        return -1;
     }
     else if (compA > compB) {
       return  1;
     }
     else {
       return 0;
     }
}

// Comparison of match quality of points.
function qualityComparision (a, b) {
    if (a.quality < b.quality) {
        return 1;
     }
     else if (a.quality > b.quality) {
       return  -1;
     }
     else {
       return 0;
     }
}
