// ================================= efa web interface functionality ====================================================

// Toggle default text of input fields
// Parameter: 
// id - ID of input field
// defaultText - default text to hide/display
// state - true when clicked, false on blur 
mdv.beg.toggleDefaultText = function(id, defaultText, state) {
	// hide default text
	if (document.getElementById(id) && document.getElementById(id).value === defaultText && !state) {
		document.getElementById(id).value = '';
	}
	// set default text
	if (document.getElementById(id) && document.getElementById(id).value === '' && state) {
		document.getElementById(id).value = defaultText;
	}
}

// Change identified ODV
mdv.beg.changeIdentifiedODV = function(usage, value) {
	if (jQuery('#itdLPxx_name_' + usage).length > 0 && jQuery('#name_' + usage).length > 0 && jQuery('#itdLPxx_name_' + usage).attr('value') != value) {
		jQuery('#name_' + usage).attr('value', jQuery('#itdLPxx_name_' + usage).attr('value'));
	}
}


// Toggle advanced Options
mdv.beg.toggleAdvancedOptions = function() {
	if(document.getElementById('advancedOptions')) {
		mdv.common.toggleElem(mdvLib.$('advancedOptions_close'));
		mdv.common.toggleElem(mdvLib.$('advancedOptions_open'));
        if(mdvLib.$('advancedOptions_open').style.display === 'none') {
            jQuery('#advancedOptions').slideDown("advancedOptions");
        }
        else {
            jQuery('#advancedOptions').slideUp("advancedOptions");
        }
	}
}


// Set combines MOTs for MOT exclusion.
mdv.beg.setCombMOT = function () {
    if(mdvLib.$('inclMOT_13') && mdvLib.$('inclMOT_14')) {
        mdv.common.attachEventListener(mdvLib.$('inclMOT_13'), 'click', function() { 
            if (mdvLib.$('inclMOT_13').checked) {
                mdvLib.$('inclMOT_14').name = 'inclMOT_14';
            }
            else {
                mdvLib.$('inclMOT_14').name = 'itdLPxx_inclMOT_14';
            }
        }, false); 
    }
}


// Set MOTs for Bayern-Ticket
mdv.beg.toggleBayernTicket = function (state) {
    // set MOT for Bayern-Ticket
    if (state) {
        mdvLib.$('itdLPxx_bayernticket').checked = true;
        mdvLib.$('inclMOT_15').checked = false;
        mdvLib.$('inclMOT_16').checked = false;
    }
    else {
        mdvLib.$('itdLPxx_bayernticket').checked = false;
    }
}


// Toggle selection of all lines in line selection.
mdv.beg.toggleLineSelection = function(id, state) {
    var optionsCount = document.getElementById(id).options.length;
    var i;
    for (i = 0; i < optionsCount; i++) {
        if (state) {
           mdvLib.$(id).options[i].selected='selected';
        }
        else {
            mdvLib.$(id).options[i].selected='';
        }
    }
}


// Toggle "all MOT x" option
mdv.beg.setAllMOTServices = function (select, option, motType) {
    var spl;
    
    this.setDivaStopId(select);
    
    if (mdvLib.$('itdLPxx_MOT_' + motType)) {
        if (select.options[option].selected) {
            jQuery('#itdLPxx_MOT_' + motType).attr('name','MOT');
            jQuery('#itdLPxx_MOT_' + motType).attr('value', motType);
            jQuery('#itdLPxx_allMOT').attr('value',motType);
        }
        else {
            jQuery('#itdLPxx_MOT_' + motType).attr('name','itdLPxx_MOT_' + motType);
            jQuery('#itdLPxx_allMOT').attr('value','');
        }
    }
    if (typeof spTr_arr==='string') {     
        spl = spTr_arr.split('-');
        mdv.request.setField('lineVer', spl[select.selectedIndex])
    }
}

mdv.beg.setDivaStopId = function(select) {
    
    //TTB
    if (typeof oK_map ==='undefined') {
        return;
    }

    var sel_opt = select.options[select.selectedIndex];
    var key = sel_opt.value.replace(/:/g,'_');
    var id_from_map = oK_map[key];
    var diva_stop_id = select.form.elements.divaStopID;
    
    if (id_from_map !== undefined && diva_stop_id) {
        diva_stop_id.value = id_from_map;    
    } else {
        diva_stop_id.value = '';
    }
};

// Switch the TTB mode (odv or line) if necesarry. 
mdv.beg.switchTTBMode = function() {
    if(mdv && mdv.map && mdv.map.dynVal.usage === 'ttb') {
        if ((mdvLib.$('itdLPxx_name_ttb') || mdvLib.$('itdLPxx_nameList_ttb') || (mdvLib.$('name_ttb') && mdvLib.$('name_ttb').type === 'hidden') || mdvLib.$('assignedStops_ttb')) && mdvLib.$('efaRequestLineName')) {
            mdvLib.$('efaRequestLineName').style.display = 'none';
        }
        else if (mdvLib.$('identifiedLineName') && mdvLib.$('odvContainerOuter_ttb')) {
            mdvLib.$('odvContainerOuter_ttb').style.display = 'none';
            mdvLib.$('mode_ttb').value = 'line';
        }
    }
}


// Auto update full screen departure monitor
mdv.beg.dmAutoUpdate = function() {
    var URL = '/dmAjax';
    jQuery('#itdLPxx_mode').attr('value', 'full_screen_update');
    var params = jQuery("#efaRequest").serialize();
    jQuery.post(URL,params,dmFullScreen_onComplete);
}

function dmFullScreen_onComplete(request) {
    if (request) {
        var date = new Date();
        var month = date.getMonth() + 1;
		var target = mdvLib.$('routeListContainer');
        // update departures
		if (target) {
			target.innerHTML = request; 
        }
        // update date
        target = mdvLib.$('dateDisplay');
        if (target) {
			target.innerHTML = date.getDate() + '.' + month + '.' + date.getFullYear(); 
        }
	}
} 

mdv.beg.handleDefaults = function() {
    var i, inputField, 
        odvs = ['origin', 'destination', 'via'];
    for (i=0; i<odvs.length; i+=1) {
        inputField = jQuery('#name_' + odvs[i]);
        if (/Ort \/ Bahnhof \/ Haltestelle/.test(inputField.val())) {
            inputField.val('');
            jQuery('#nameDefaultText_' + odvs[i]).val('');
        }
    }
    return true;
};

// ================================= calendar ====================================================

// Load datepicker.
mdv.beg.loadDatepicker = function() {
    if(mdvLib.$("datepicker")) {
        var lang = mdv.beg.dynVal.language;
        if (lang === 'en') {
            lang = 'en-GB';
        }
        jQuery("#datepicker").datepicker({
            showOn: 'button',
            buttonImage: '/begWR/img/enquiry/calendar.gif',
            buttonImageOnly: true,
            showAnim: 'fadeIn',
            minDate: '-1M',
            maxDate: '+1Y',
            showOtherMonths: true, 
            selectOtherMonths: true,
            dateFormat: 'dd.mm.yy'
        });
        
        jQuery('.ui-datepicker-trigger').click(
            function() {               
                jQuery( "#datepicker" ).datepicker( "option",
				jQuery.datepicker.regional[ lang ] );
            }
        );
    }
}


// Get the datepicker date and set the EFA date 
mdv.beg.setDate = function() {
    var dateArr = mdvLib.$('datepicker').value.split('.');
    mdvLib.$('itdDateDay').value = dateArr[0];
    mdvLib.$('itdDateMonth').value  = dateArr[1];
    mdvLib.$('itdDateYear').value  = dateArr[2];
}


// Get the EFA date and set the datepicker input.
mdv.beg.getDate = function() {
    var d, m, y; 
    d = mdvLib.$('itdDateDay').value;
    m = mdvLib.$('itdDateMonth').value;
    y = mdvLib.$('itdDateYear').value;
    mdvLib.$('datepicker').value = d + '.' + m + '.' + y;
}


// Select previous or next day.
mdv.beg.navigateDate = function(dir) {
    var d, m, y;
    d = mdvLib.$('itdDateDay').value;
    m = mdvLib.$('itdDateMonth').value;
    y = mdvLib.$('itdDateYear').value;
    
	m = m - 1;  
	var currDate = new Date(y, m, d, 12, 0, 0);
	var msec = currDate.getTime();
    
	if (dir != 'prev') {
        msec = msec + (24*60*60*1000); 
    }
	else {  
        msec = msec - (24*60*60*1000); 
    }
	currDate.setTime(msec);
    
	d = currDate.getDate();
	if (d > 0 && d < 10) { 
        d = "0"+d; 
    }

	m = currDate.getMonth() + 1;
	if (m > 0 && m < 10) { 
        m = "0"+m; 
    }

	y = "" + currDate.getFullYear();

    mdvLib.$('itdDateDay').value = d;
    mdvLib.$('itdDateMonth').value = m;
    mdvLib.$('itdDateYear').value = y;
	mdvLib.$('datepicker').value = d + '.' + m + '.' + y;
}


// ================================= add info ======================================================

// Opens/closes a single incident
mdv.beg.toggleIncident = function (id, state) {
    if (state) {
        jQuery('#msg_' + id).slideDown("slow");
        jQuery('#msgOpen_' + id).css('display', 'none');
    }
    else {
        jQuery('#msg_' + id).slideUp("slow");
        jQuery('#msgOpen_' + id).css('display', '');
    }
}

// Sets the search filter (stop or line search)
mdv.beg.setSearchFilter = function (obj) {
    // search filter
    if (jQuery('#search').attr('value') != '' && (jQuery('#itdLPxx_selStop').attr('value') === '')) {
        // find line
        if(jQuery('#searchFilter option:selected').attr('value') === 'line' ) {
            var _params = { selTTLineByNameActive: '1',
                language: mdv.beg.dynVal.language,
                lineReqType: '1',
                lineName: jQuery('#search').attr('value'),
                lsShowTrainsExplicit: '1',
                exactMatch: '1',
                itdLPxx_mode: 'addInfoSearchFilter'
            }
            var ajax = mdvLib.ajax({ host: '/seltt', parameters: _params, method: 'get', onComplete: searchFilter_onAjaxComplete });
        }
        // find stop
        else {
            var _params = { anyMaxSizeHitList: '50',
                anyObjFilter_sf: '2',
                language: mdv.beg.dynVal.language,
                locationServerActive: '1',
                name_sf: jQuery('#search').attr('value'),
                type_sf: 'any',
                stateless: '1',
                itdLPxx_mode: 'addInfoSearchFilter'
            }
            var ajax = mdvLib.ajax({ host: '/stopfinder', parameters: _params, method: 'get', onComplete: searchFilter_onAjaxComplete });
        }
    }
    else if (!(jQuery('.sugFo:focus') > 0)){
        document.forms['efaRequest'].submit();
    }
}

function searchFilter_onAjaxComplete (request) {
   if (request && request.responseText) {
		var text = request.responseText;
        jQuery('#addInfoMsg').html('');
        // error
        if (request.responseText.indexOf('id="stopFinderError"') > 0 || request.responseText.indexOf('id="selTTError"') > 0) {
            jQuery('#overlay').html(text);
        }
        // list or full hit
        else {
            // input/select field 
            jQuery('#searchField').html(text);
            // full hit stop
            if (request.responseText.indexOf('id="itdLPxx_selStop" value="') > 0) {
                jQuery('#itdLPxx_addInfo').attr('value', 'updateMsg');
                document.forms['efaRequest'].submit(); 
            }
            // full hit line
            if (request.responseText.indexOf('id="itdLPxx_selLine" value="') > 0) {
                jQuery('#itdLPxx_addInfo').attr('value', 'updateMsg');
                document.forms['efaRequest'].submit(); 
            }
        }
	}
}

// clears the stop/line search filter
mdv.beg.clearSearchFilter = function () {
    if (jQuery('#itdLPxx_selStop').length > 0) {
        jQuery('#itdLPxx_selStop').attr('value','');
    }
    if (jQuery('#itdLPxx_selLine').length > 0) {
        jQuery('#itdLPxx_selLine').attr('value','');
    }
}


// ================================= odv suggest ============================================================

// Mousdown on document.
jQuery(document).mouseup(function(e) {
    e = e ? e : window.event;
    
    // close suggest list
    if ((e == null || e.button!=2) && jQuery('.dynamiclist:visible').length > 0) {
        mdv.sug.closeSuggest();
    }   
});

// Close suggest list on mousclick outside of the list.
mdv.sug.closeSuggest = function () {
    mdv.sug.sugFocusId = -1;
    jQuery('#odvOverlay').remove();
}


// Scroll up and down in ODV suggest list.
mdv.sug.odvSuggest = function(event, value, usage) {
    
    //if (window.location.port !== '81') {
    //    return;
    //}
    
    // workaround: no suggest list for delfi
    if (jQuery('#delfi').length > 0 && jQuery('#delfi').attr('checked')) {
        return false; 
    }
    
    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
			}
			mdv.sug.sendOdvSuggest(value, usage)
		}, 400);
}

mdv.sug.sendOdvSuggest = function (value, usage){ 
	if (value.length >= mdv.sug.sendOdvSuggestMin) {
        var anyObjFilter = mdv.sug.anyObjFilter;
		var url = mdv.sug.url;
        var radio = jQuery('.type_radioGroup input.efaRadioButton');
        if (radio.length > 0) {
            if (radio[1] && radio[1].checked) {
                anyObjFilter = radio[1].value;
            }
            else if (radio[2] && radio[2].checked) {
                anyObjFilter = radio[2].value;
            }
            else if (radio[3] && radio[3].checked) {
                anyObjFilter = radio[3].value;
            }
        }
        url = url.concat('language=de&locationServerActive=1&w_regPrefAl=1&w_prefStModesAm=3&w_prefStModesAm=1&prMinQu=1&anyObjFilter_sf=', anyObjFilter,
                        '&itdLPxx_usage=', usage,
                        '&type_sf=any&name_sf=', encodeURI(value),
                        '&itdLPxx_checkText=', encodeURI(value),
                        '&stateless=1&outputFormat=JSON');

		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){
		return false;
	}
    
    var usage = efa.parameters[1].value;
    var length = efa.stopFinder.length;
    var stateless = '';
    var txt = '';
    var onclick = '';
    var point;
    var odvSug = '<div class="dynamiclist" id="odvOverlay"><div id="odvSg">';
    var i = 0;

	if (efa.stopFinder.point){
		length = 1;
	}
    
    // sort result list if more than one hit 
	if(length > 1){
        efa.stopFinder.sort(mdv.sug.alphabetComparision).sort(mdv.sug.matchQuality);
    }
    
	for(i=0;i < length; i ++){
		point =  efa.stopFinder[i] || efa.stopFinder.point; 
        txt = '';
        
        if (point.ref.place) {
            txt = point.ref.place;
        }
        if (point.anyType !='loc' && txt != '') {
            txt = txt.concat(', ', point.object);
            if (point.buildingNumber) {
                txt = txt.concat (' ',point.buildingNumber);
            }
        } else if (point.object){
            txt = point.object;
        }
        
        // type 
        if (point.anyType === 'stop') {
            txt = txt.concat(' [', mdv.sug.stop, ']');
        }
        else if (point.anyType === 'poi') {
            txt = txt.concat(' [', mdv.sug.poi, ']');
        }
        else if (point.anyType === 'loc') {
            txt = txt.concat(' [', mdv.sug.locality, ']');
        }
        else {
            txt = txt.concat(' [', mdv.sug.address, ']');
        }
        
		onclick = 'mdv.sug.submitPoint(\''+  point.stateless + '\',\''+  usage + '\',\''+  txt + '\');';
		odvSug = odvSug.concat('<div id="sug_', i, '" class="sugItem"><a id="sugLink_', i, '" href="javascript:', onclick, '" class="sugFo">',  txt, '</a></div>');
	}
    
    odvSug = odvSug.concat('</div></div>');
    jQuery(odvSug).insertAfter(jQuery('#name_' + usage));
    // don't invoke close list event
	jQuery('.dynamiclist').mouseup(function(e) {
         var e = e ? e : window.event;
    
        // stop event propagation
        if ((e == null || e.button!=2)) {
            if (e.stopPropagation) {
                e.stopPropagation();
            }
            if (e.preventDefault) {
                e.preventDefault();
            }
            return false;
        }   
    });
};

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

// Clear suggestion list
mdv.sug.clearSug = function(usage) {
    if (jQuery('#odvOverlay').length > 0) {
        mdv.sug.sugFocusId = -1;
        jQuery('#nameInfo_' + usage).attr('value', 'invalid');
        jQuery('#odvOverlay').remove();
    }
}

// Comparison of point type.
mdv.sug.anyTypeComparison = function (a, b)	{
	if(a.anyType == 'loc'){
		a.sortPos = 1;
	}
    else if(a.anyType == 'stop'){
		a.sortPos = 2;
	}
	else {
		a.sortPos = 3;
	} 
    if(b.anyType == 'loc'){
		b.sortPos = 1;
	}
    else if(b.anyType == 'stop'){
		b.sortPos = 2;
	}
	else{
		b.sortPos = 3;
	} 
   return a.sortPos > b.sortPos; 
}

// Alphabetical comparison of point name.
mdv.sug.alphabetComparision = function (a, b) {
    var compA = '' + a.ref.place;
    var compB = '' + b.ref.place;
    if (a.type !='loc' && compA != '') {
        compA = compA.concat(', ', a.name);
        if (a.buildingNumber) {
            compA = compA.concat (' ',a.buildingNumber);
        }
    }
    if (b.type !='loc' && compB != '') {
        compB = compB.concat(', ', b.name);
        if (b.buildingNumber) {
            compB = compB.concat (' ', b.buildingNumber);
        }
    }
    compA = compA.toUpperCase();
    compB = compB.toUpperCase();
    
    if (compA < compB) {
        return -1;
     }
     else if (compA > compB) {
       return  1;
     }
     else {
       return 0;
     }
}

// Comparison of match quality.
mdv.sug.matchQuality = function (a, b) {
   return (b.quality - a.quality); 
}


// 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('#sugLink_' + mdv.sug.sugFocusId + ':first').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('#sugLink_' + mdv.sug.sugFocusId + ':first').focus();            
        }
    }
    if((jQuery('#sug_0').length > 0 && event.keyCode == 27)){
        var sug = jQuery(".odvSg");  
        jQuery('.sugItem').css('display', 'none');
    }   
});
