var mdv;

if (!mdv) {
	mdv = {};
}

if (!mdv.efa) {
	mdv.efa = {};
}

mdv.sug = {
    checkText: '',
    sugFocusId: -1
};

mdv.efa.imgPath = 'http://efaneu.vmobil.at/vvv/img/';

function resetOdv(usage) {
    var any = false;
    
    if ($("ul.tabs > li") && $("ul.tabs > li")[1] && $("ul.tabs > li")[1].children[0].className.indexOf('current') > -1) {
        any = true;
    }
    
    $('#nameInfo_' + usage)[0].value = 'invalid';
    if (document.getElementById('nameState_' + usage)) {
        $('#nameState_' + usage)[0].value = 'empty';
    }

    $('#typeInfo_' + usage)[0].value = 'invalid';
    $('#type_' + usage)[0].value = 'any';
    if (document.getElementById('ihre_eingaben')) { 
        $('#anyObjFilter_' + usage)[0].value = '0';
        $('#place_' + usage)[0].value = '';
    }
    else {
        //var tab = $("ul.tabs > li[id*=" + usage + "]").has("a.current").attr('id').substr($("ul.tabs > li[id*=" + usage + "]").has("a.current").attr('id').indexOf('_') + 1);
        //$('#anyObjFilter_' + usage)[0].value = mdv.efa.anyObjFilters[tab];
    }
}


// Scroll up and down in ODV suggest list.
function initOdvSuggest() {
    $(document).keyup(function(event){
        if(document.getElementById('sug_0') && (event.keyCode === 40 || event.keyCode === 38)){
            var parentSg = document.getElementById('odvSg');
            var counter = parentSg.childNodes.length;
        
            // check if cursor key were used down
        	if(event.keyCode == 40){
                if(mdv.sug.sugFocusId < counter -1){
                    mdv.sug.sugFocusId++;
                
                    $('div.actSug').removeClass('actSug');
                    
                    document.getElementById('sug_' + mdv.sug.sugFocusId).className = 'actSug';
                    document.getElementById('sug_' + mdv.sug.sugFocusId).firstChild.focus();
                }
        	}
            // up
            else if(event.keyCode == 38 && mdv.sug.sugFocusId > 0) {
                mdv.sug.sugFocusId--;
            
                $('div.actSug').removeClass('actSug');
            
               document.getElementById('sug_' + mdv.sug.sugFocusId).className = 'actSug';
               document.getElementById('sug_' + mdv.sug.sugFocusId).firstChild.focus();  
            }
        }
    });
}

// Call suggest.
function odvSuggest(event, value, usage, odvSuggestPlace){
    if(event.keyCode === 38 || event.keyCode === 40 || event.keyCode === 13){
        return false;
    }

	mdv.sug.checkText = value;
	window.setTimeout(function(){
        if(mdv.sug.checkText != value){
            return false
        }
        sendOdvSuggest(value, usage, odvSuggestPlace);
    }, 200);
}


// Request sugestions. 
function sendOdvSuggest(value, usage, odvSuggestPlace){
	if(value.length > 3){
        var place = '';
        var URL = mdv.efa.path + 'XSLT_STOPFINDER_REQUEST';
        if(mdv.efa.debug === 'true') {
            URL = '/' + mdv.efa.virtDir + '/XSLT_STOPFINDER_REQUEST';
        }

		var _params = { 
			language: mdv.efa.language,
			locationServerActive: '1',
			anyObjFilter_sf: 0,
			anyMaxSizeHitList: '26',
			type_sf: 'any',
			name_sf: value,
            outputFormat: 'JSON',
            itdLPxx_usage: usage,
            itdLPxx_place: odvSuggestPlace,
            dataType: 'html',
            itdLPxx_debug: mdv.efa.debug
		};
		
        // consider place
        if (!odvSuggestPlace && !($("ul.tabs > li") && $("ul.tabs > li")[1] && $("ul.tabs > li")[1].children[0].className.indexOf('current') > -1)) {
            if($('#placeInfo_' + usage)[0].value != 'invalid') {
                _params.placeInfo_sf = $('#placeInfo_' + usage)[0].value;
            }
            else {
                _params.place_sf = $('#place_' + usage)[0].value;
            }
        } 
		
		mdv.sug.checkText = value;

		var _ajax = mdvLib.ajax({ host: URL, parameters: _params, onComplete: odvSuggest_onAjaxComplete});
	}
	else {
		if(document.getElementById('odvOverlay')){
			$('#odvOverlay').remove();
		}
	}

};

// Create the suggest list overlay.
function odvSuggest_onAjaxComplete(response){
 	var json = null;
 	var efa = null;
    var usage = null;
    var odvSuggestPlace = "false";
	
	// Check if we need to use the prototype lib.
 	if (response && response.responseText)	{
 		json = response.responseText;
 	// Otherwise use jQuery lib.
 	} else if (response) {
 		json = response;
 	}
 
	//alert( response.responseText );
 
 	eval('efa = ' + json + ';'); 
    
    // no hits
    if(!efa.stopFinder){
		return false;
	}
    
    var odvSuggestDiv, odvSuggest;
    var length = efa.stopFinder.length;
	
	if(efa.stopFinder.point){
		length = 1;
	}

    // layout parameters
    for (var i=0; i < efa.parameters.length; i++) {
        switch (efa.parameters[i].name) {
            case 'usage':
                usage = efa.parameters[i].value;
                break;
            case 'place':
                odvSuggestPlace = efa.parameters[i].value;
                break;
            default:
                break;
        }
    }
    
    // remove old overlay
	if(document.getElementById('odvOverlay')){
		$('#odvOverlay').remove();
	}
    // create new overlay
	odvSuggestDiv = document.createElement('div');
	odvSuggestDiv.id='odvOverlay';
	odvSuggestDiv.className='odvSg';
	odvSuggest = document.createElement('div');
	odvSuggest.id='odvSg';
	if (odvSuggestPlace == 'false') {
		//alert( odvSuggestDiv );

        insertAfter(document.getElementById('place_' + usage).parentNode, odvSuggestDiv, document.getElementById('place_' + usage))
    }
    else {
        insertAfter(document.getElementById('name_' + usage).parentNode, odvSuggestDiv, document.getElementById('name_' + usage))
    }
	
	switch( usage )
	{
		case 'origin':
			odvSuggestDiv.style.marginTop='30px';
			break;
			
		case 'destination':
			odvSuggestDiv.style.marginTop='54px';
			break;
			
		default:
			break;
	}
	
	
	// sort result list if more than one hit 
	if(length > 1){
		efa.stopFinder.sort(typeComparison);
	}
    
    // create item
	for(i=0;i < length; i ++) {
        var add, name, point_name, ptCoords;
		var point =  efa.stopFinder[i] || efa.stopFinder.point;
        var ptRef =  point.ref;
        var point_place = '';
        var type = 'any';
        var any = false;
        
        // any input?
        if ($("ul.tabs > li") && $("ul.tabs > li")[1] && $("ul.tabs > li")[1].children[0].className.indexOf('current') > -1) {
            any = true;
        }
        
        // coordinates
        if(!ptRef.coords){
			ptCoords = new Array(null, null);
		}   
        else {
            ptCoords =  ptRef.coords.split(',');
        }
        
        // name 
        name = point.stateless;

        // visible text
        if (any) {
            point_name = "" + escape(point.name);
        } 
        else if (odvSuggestPlace != 'false') {
            point_place = "" + escape(point.name);
        }
        else {
            point_name = "" + escape(point.object);
            if (point.posttown) {
                point_place = "" + escape(point.posttown);
            }
            else {
                point_place = "" + escape(point.ref.place);
            }
        }
        
        // image
        switch (point.anyType){
            case 'stop':    add = "<img src=" + mdv.efa.imgPath + "odvSuggest/stop.gif\>";
                            break;
            case 'poi':     add = "<img src=" + mdv.efa.imgPath + "odvSuggest/poi.gif\>";
                            break;
            default:        add = "<img src=" + mdv.efa.imgPath + "odvSuggest/address.gif\>";
                            break;
        }
        
        // correct position of hit list for place suggest
        if (!any && odvSuggestPlace === 'false') {
            document.getElementById("odvOverlay").style.marginLeft = '190px';
        }
       
        // create hit item
        var href = 'setOdv(\'' + name + '\',\'' + type + '\',\'' + point_name + '\',\'' + point_place + '\',' + ptCoords[0] + ',' + ptCoords[1] + ',\'' + usage + '\',' + odvSuggestPlace + ')'; 
        odvSuggest.innerHTML += '<div id="sug_' + i + '" class=""><a href="javascript:void(0);" onclick=' + href +' class="sugFo">' + add +  point.name + '</a></div>';
    
        // if only one hit consider it as verified without seleciton
        if (length === 1) {
            if (odvSuggestPlace === 'false') {
                $('#nameInfo_' + usage)[0].value = name;
                $('#typeInfo_' + usage)[0].value = type;
            }
            else {
                $('#placeInfo_' + usage)[0].value= name;
                $('#placeState_' + usage)[0].value= 'empty';
            }
            // focus item on map
            if(ptRef.coords){
                //setMapCenter(jQuery('#itdLPxx_mapType').attr('value'), ptCoords[0], ptCoords[1], mdv.map.text.detailScale, true, mdv.efa.getImg(usage));
            } 
        }
    }
	
	document.getElementById("odvOverlay").appendChild(odvSuggest);
};

// Set name and place input field.
function setOdv(name, type, point_name, point_place, x, y, usage, odvSuggestPlace) {
    // input parameter
    /*
	 * Auf keinen Fall mitschicken, da ansonsten nur
	 * verifiziert, aber nicht abgefragt wird.
	 *
	jQuery('#execInst').attr('value', 'verifyOnly');
	*/
    if (odvSuggestPlace === false) {
        jQuery('#nameInfo_' + usage).attr('value', unescape(name));
        jQuery('#typeInfo_' + usage).attr('value', unescape(type));
        jQuery('#name_' + usage).attr('value', unescape(point_name));
    }
    jQuery('#placeInfo_' + usage).attr('value', 'invalid');
    jQuery('#place_' + usage).attr('value', unescape(point_place));
    jQuery('#placeState_' + usage).attr('value', 'empty');
    jQuery('#name_' + usage).attr('value', unescape(point_place));	
    jQuery('#nameInfo_' + usage).attr('value', unescape(name));
    // focus item on map
    if (x && y) {
        //setMapCenter(jQuery('#itdLPxx_mapType').attr('value'), x, y, mdv.map.text.detailScale, true, mdv.efa.getImg(usage));
    }
    // remove odv suggest
    if(document.getElementById('odvOverlay')){
		$('#odvOverlay').remove();
	}
}

// Sorting of elements respectly its type. 
function typeComparison(a, b)	{
	if(a.type == 'stop'){
		a.sortPos = 1
	}
	else if(a.type == 'poi'){
		a.sortPos = 2
	}
	else{
		a.sortPos = 3
	} 
	if(b.type == 'stop'){
		b.sortPos = 1
	}
	else if(b.type == 'poi'){
		b.sortPos = 2
	}
	else{
		b.sortPos = 3
	} 
   return a.sortPos > b.sortPos; 
}

function replaceSigns(txt){
	txt = txt.replace(/Ü/g, "&#220;");
	txt = txt.replace(/Ö/g, "&#246;");
	txt = txt.replace(/Ä/g, "&#196;"); 
	txt = txt.replace(/ü/g, "&#252;");
	txt = txt.replace(/ö/g, "&#246;");
	txt = txt.replace(/ä/g, "&#228;"); 
	txt = txt.replace(/ß/g, "&#223;"); 
	txt = txt.replace(/ /g, "&#160;");  
	return txt;
}

function insertAfter(parent, node, referenceNode) {
  if (parent && node && referenceNode) {
    parent.insertBefore(node, referenceNode.nextSibling);
  }
}


