﻿
// settingsRaw is loaded in CEPPredictiveSearch.ascx
var settings;
if (this.JSON)
    settings = JSON.parse(settingsRaw);
else
    settings = eval('(' + settingsRaw + ')');
    
// Used for completion interval
var timer;

var typeEnum = {"From": 0, "To": 1, "OpenJaw": 2};

$(document).ready(function() {
    $('input.predictiveSearchBox:not([readonly])').each(function() {
        if ($.trim($(this).val()).length < settings.PrefixLength || $(this).val() == settings.Text) {
            $(this).addClass(settings.CssClass);
            $(this).val(settings.Text);
        }
    });

    $('input.predictiveSearchBox:not([readonly])').bind('keyup', function(event) {
        if (event.which != 16 && event.which != 38 && event.which != 40)
            HandleKeyPress(this, event);
    });

    $('input.predictiveSearchBox:not([readonly])').bind('keydown', function(event) {
        if (event.which == 9 || event.which == 38 || event.which == 40)
            HandleKeyPress(this, event);
        // This will prevent "Default Beep" on enter
        else if (event.which == 13)
            return false;
    });

    $('input.predictiveSearchBox:not([readonly])').bind('focus', function(event) {
        GotFocus(this, event);
    });

    $('input.predictiveSearchBox:not([readonly])').bind('blur', function(event) {
        LostFocus(this, event);
    });

    $('a.citySelectorLink').bind('click', function() {
        if (!$('select#ddlFromCountryList option').length) {
            ResetDropdowns(6);
            LoadFromCountries();
        }
        else {
            // preselect
            var additionalFrom = $('#' + settings.HiddenFromId).attr('title');
            var additionalTo = $('#' + settings.HiddenToId).attr('title');
            var countryFrom = additionalFrom.substring(0, additionalFrom.indexOf(','));
            var cityFrom = additionalFrom.substring(additionalFrom.indexOf(',') + 1);
            var cityTo = additionalTo.substring(additionalTo.indexOf(',') + 1);

            // This will trigger also if search field has been cleared (ie cityFrom or cityTo empty)
            if (cityFrom != $('select#ddlFromCityList').val()
                    || cityTo != $('select#ddlToCityList').val()) {
                $('select#ddlFromCountryList').val(countryFrom);
                $('select#ddlFromCountryList').change();
            }
        }

        $('div#citySelector').css('display', 'block');
        return false;
    });

    $('div#citySelector a#btnCloseSelector, div#citySelector a#btnOk').bind('click', function() {
        $('div#citySelector').css('display', 'none');
        return false;
    });

    $('select#ddlFromCountryList').change(function() {
        ResetDropdowns(5);
        LoadFromCities($(this).val());
    });

    $('select#ddlFromCityList').change(function() {
        ResetDropdowns(4);
        // This method needs additional info for airport
        LoadToCountries($(this).find('option:selected'));

        // Open Jaw Countries
        if ($('#txtToTOJ:visible')) {
            // This method needs additional info for airport
            LoadTojCountries($(this).find('option:selected'));
        }
    });

    $('select#ddlToCountryList').change(function() {
        ResetDropdowns(1);
        LoadToCities($('select#ddlFromCityList').val(), $(this).val());
    });

    $('select#ddlToCityList').change(function() {
        // This method needs additional info for airport
        SelectToCity($(this).find('option:selected'));
    });

    $('select#ddlTojCountryList').change(function() {
        $('select#ddlTojCityList').empty();
        $('select#ddlTojCityList').append('<option value="0">' + settings.CityText + '</option>');

        LoadTojCities($('select#ddlFromCityList').val(), $(this).val());
    });

    $('select#ddlTojCityList').change(function() {
        // This method needs additional info for airport
        SelectTojCity($(this).find('option:selected'));
    });

    $(document).bind('click', function(event) {
        var $target = $(event.target);
        if (!$target.parents('div#citySelector').length) {
            $('div#citySelector').css('display', 'none');
        }

        var searchType;

        switch ($('div.resultContainer:visible').attr('id')) {
            case "resultTo":
                searchType = typeEnum.To;
                break;
            case "resultFromTOJ":
                searchType = typeEnum.OpenJaw;
                break;
            default:
                searchType = typeEnum.From;
                break;
        }

        // Choose selected item (if exists) if result list looses focus (and not clicked)
        if (!$target.parents('div#predictiveSearchFrom').length && $('div#resultFrom li.selected').length
            || !$target.parents('div#predictiveSearchTo').length && $('div#resultTo li.selected').length
            || !$target.parents('div#predictiveSearchFromTOJ').length && $('div#resultFromTOJ li.selected').length) {
            ResultSelect($('div.resultContainer:visible li.selected'), searchType, false);
        }
        else {
            $('div.resultContainer').empty();
            $('div.resultContainer').hide();
        }
    });

    $('#' + settings.FareTypeDropDownID).change(function() {
        $('#' + settings.HiddenFareTypeId).val($(this).val());
    });
});

function GotFocus(elem, e) {
    if ($(elem).is(':visible') == false)
        return;

    // Fix to handle input focus in ie < 8
    $(elem).addClass(settings.IeFocusFix);
    
    // If watermark is shown textbox is clear and watermark css is removed
    if ($(elem).hasClass(settings.CssClass)) {
        $(elem).val('');
        $(elem).removeClass(settings.CssClass);
    }
    // Otherwise select text
    else
        $(elem).select();
}

function LostFocus(elem, e) {
    // Fix to handle input focus in ie < 8
    $(elem).removeClass(settings.IeFocusFix);
    
    // If less then 3 chars entered watermark is shown
    if ($.trim($(elem).val()).length < settings.PrefixLength) {
        $(elem).addClass(settings.CssClass);
        $(elem).val(settings.Text);

        switch ($(elem).attr('id')) {
           case settings.TxtFromId:
                $('#' + settings.HiddenFromId).val('');
                $('#' + settings.HiddenFromId).removeAttr('title');
                break;
            case settings.TxtToId:
                $('#' + settings.HiddenToId).val('');
                $('#' + settings.HiddenToId).removeAttr('title');
                break;
            case settings.TxtOpenJawId:
                $('#' + settings.HiddenOpenJawId).val('');
                $('#' + settings.HiddenOpenJawId).removeAttr('title');
                break;
            default:
                break;
        }
            
        return;
    }

    switch ($(elem).attr('id')) {
        case settings.TxtFromId:
            $('#' + settings.TxtToId).focus();
            break;
        case settings.TxtToId:
            $('#' + settings.TxtOpenJawId).focus();
            break;
        case settings.TxtOpenJawId:
            break;
        default:
            break;
    }
}

function HandleKeyPress(elem, e) {
    // Do nothing if less then 3 (or 2 for japanese and chinese) chars entered
    var prefixText = $.trim($(elem).val());
    if (prefixText.length < settings.PrefixLength)
        return;

    var searchType;
    var $resultContainer;

    switch ($(elem).attr('id')) {
        case settings.TxtToId:
            searchType = typeEnum.To;
            $resultContainer = $('#resultTo');
            break;
        case settings.TxtOpenJawId:
            searchType = typeEnum.OpenJaw;
            $resultContainer = $('#resultFromTOJ');
            break;
        default:
            searchType = typeEnum.From;
            $resultContainer = $('#resultFrom');
            break;
    }
        
    var $selectedItem = $resultContainer.find('li.selected');
    
    //tab 9, enter 13, shift 16, up arrow 38, down arrow 40
    var reservedKey = e.which == 9 || e.which == 13 || e.which == 38 || e.which == 40;   
    
    // Completion interval
    if (reservedKey == false) {
        if (timer == null)
            timer = setTimeout("Search('" + prefixText + "', " + searchType + ", false)", 300);
        else {
            clearTimeout(timer);
            timer = setTimeout("Search('" + prefixText + "', " + searchType + ", false)", 300);
        }
    }
    else if (reservedKey == true && $selectedItem.length) {
        // Select item on tab or enter
        if (e.which == 9 || e.which == 13) {
            ResultSelect($selectedItem, searchType, false);

            if (searchType == typeEnum.From) {
                e.preventDefault();
                $('#' + settings.TxtToId).focus();
            }
            else if (searchType == typeEnum.To) {
                e.preventDefault();
                $('#' + settings.TxtOpenJawId).focus();
            }
        }
        else {
            // Change selected item with arrow keys
            $selectedItem.removeClass('selected');                
            var index = $('li').index($selectedItem);
            index = e.which == 38 ? Math.max(index - 1, 0) : Math.min(index + 1, $resultContainer.find('li').length - 1);
            $resultContainer.find('li').eq(index).addClass('selected');

            // Change scroll position when using arrow keys
            var $resultList = $resultContainer.find('ul');
            var scrollPos = e.which == 38 ? $resultList.scrollTop() - 20 : $resultList.scrollTop() + 20;
            $resultList.scrollTop(scrollPos);
        }
    }
}

// isDirect is used mainly to prepopulate text boxes
function Search(prefixText, searchType, isDirect) {
    var station = $('input#' + settings.HiddenFromId).val();
    var searchUrl = "/Utilities/WebServices/PredictiveSearch.asmx";

    // If parameters are parsed from json data ie handles characted encoding better
    var jsondataRaw = "{\"PrefixText\": \"" + prefixText + "\", "
        + "\"Count\": 10, "
        + "\"CepId\": " + settings.CepId + ", "
        + "\"LanguageCode\": \"" + settings.Language + "\", "
        + "\"SearchMode\": \"" + settings.SearchMode + "\"";

    switch (searchType) {
        case typeEnum.To:
            jsondataRaw += ", \"Origin\": \"" + station + "\"";
            searchUrl += "/GetPredictiveSearchTo";
            break;
        case typeEnum.OpenJaw:
            jsondataRaw += ", \"Destination\": \"" + station + "\"";
            searchUrl += "/GetPredictiveSearchOpenJaw";
            break;
        default:
            searchUrl += "/GetPredictiveSearchFrom";
            break;
    }

    jsondataRaw += "}";

    var jsondata;
    if (this.JSON)
        jsondata = JSON.parse(jsondataRaw);
    else
        jsondata = eval('(' + jsondataRaw + ')');

    $.ajax({
        type: "GET",
        url: searchUrl,
        data: jsondata,
        scriptCharset: "utf-8",
        success: function(data) { PopulateResult(data, searchType, isDirect); },
        complete: function() { timer = null; }
    });
}

function GetFaretypes(MarketID) {
    $.ajax({
        type: "GET",
        url: "/Utilities/WebServices/PredictiveSearch.asmx/GetFareTypes?cffMarketID=" + MarketID +"&lang=" + settings.Language,
        success: function(data) { DisplayFareTypeDropDown(data); }
    });
}

function DisplayFareTypeDropDown(data) {

    var $fareTypeDropDown = $('#' + settings.FareTypeDropDownID);
    var $fareTypeContainer = $('#' + settings.FareTypeContainerID);

    if ($fareTypeDropDown) {
        $fareTypeDropDown.empty();
        
        $('string', data).each(function(index) {
            var fareTypeRaw = $(this).text();
            var fareType;
            if (this.JSON)
                fareType = JSON.parse(fareTypeRaw);
            else
                fareType = eval('(' + fareTypeRaw + ')');
              
            if(fareType.FareTypeValue == settings.SelectedFareType) {
                $fareTypeDropDown.append($('<option selected="selected"></option>').val(fareType.FareTypeValue).html(fareType.FareTypeText));
            }
            else {
                $fareTypeDropDown.append($('<option></option>').val(fareType.FareTypeValue).html(fareType.FareTypeText));
            }
        });
        
        $fareTypeDropDown.trigger('change');
    }

    if($('string', data).length <= 1 || settings.DisplayFareSelector == "False")
        $fareTypeContainer.css('display', 'none');
    else
        $fareTypeContainer.css('display', 'block');
}

function PopulateResult(data, searchType, isDirect) {
    var $resultContainer;
    var stnToBeSelectedCode;

    switch (searchType) {
        case typeEnum.To:
            $resultContainer = $('#resultTo');
            stnToBeSelectedCode = $('input#' + settings.HiddenToId).val();
            break;
        case typeEnum.OpenJaw:
            $resultContainer = $('#resultFromTOJ');
            stnToBeSelectedCode = $('input#' + settings.HiddenOpenJawId).val();
            break;
        default:
            $resultContainer = $('#resultFrom');
            stnToBeSelectedCode = $('input#' + settings.HiddenFromId).val();
            break;
    }

    // Reset result container
    $resultContainer.empty();
    $resultContainer.append('<ul></ul>');
    $resultContainer.css('display', 'block'); 
    
    // Return if no match
    if ($('string', data).length < 1) {
        $resultContainer.find('ul').append('<li>' + settings.NoMatchText + '</li>');
        return;
    }

    // Create result list with geo codes as id
    $('string', data).each(function(index) {
        var hitRaw = $(this).text();
        var hit;
        if (this.JSON)
            hit = JSON.parse(hitRaw);
        else
            hit = eval('(' + hitRaw + ')');

        var infoRaw = '{"Intercont":"' + hit.AdditionalInfo.Intercont + '","CountryCode":"' + hit.AdditionalInfo.CountryCode + '","CityCode":"' + hit.AdditionalInfo.CityCode + '","CFFMarketID":"' + hit.AdditionalInfo.CffMarketId + '","CffMarketIdExtended":"' + hit.AdditionalInfo.CffMarketIdExtended + '"}';
            
        if (isDirect == true && hit.Code == stnToBeSelectedCode) {
            ResultSelect($('<li id=\"' + hit.Code + '\">' + hit.Text + '<p style=\"display:none\">' + infoRaw + '</p></li>'), searchType, true);
            return;
        }
        
        var listElem = index == 0
            ? $('<li id=\"' + hit.Code + '\" class=\"selected\">' + hit.Text + '<p style=\"display:none\">' + infoRaw + '</p></li>')
            : $('<li id=\"' + hit.Code + '\">' + hit.Text + '<p style=\"display:none\">' + infoRaw + '</p></li>');

        $resultContainer.find('ul').append(listElem);
    });
    
    // the return in the loop does not exit the function
    if (isDirect == true)
        return;

    // Add click events to list items
    $resultContainer.find('li').bind('click', function(event) {
        ResultSelect($(this), searchType, false);
    });
    
    // fix for dissapearing scroll bar in ie7
    $resultContainer.find('ul').css('width', '100%');

    // Auto select if texbox does not have focus
    if ((searchType == typeEnum.From && $('input.' + settings.IeFocusFix + ':first').attr('id') != settings.TxtFromId) ||
        (searchType == typeEnum.To && $('input.' + settings.IeFocusFix + ':last').attr('id') != settings.TxtToId) ||
        (searchType == typeEnum.OpenJaw && $('input.' + settings.IeFocusFix + ':last').attr('id') != settings.TxtOpenJawId))
        ResultSelect($resultContainer.find('li.selected'), searchType, false);
}

function ResultSelect($item, searchType, isDirect) {
    // Additional information in json format
    var infoRaw = $item.find('p').text();    
    var info;
    if (this.JSON)
        info = JSON.parse(infoRaw);
    else
        info = eval('(' + infoRaw + ')');

    $item.find('p').remove();

    switch (searchType) {
        case typeEnum.To:
            GetFaretypes(info.CffMarketIdExtended);

            $('#' + settings.TxtToId).removeClass(settings.CssClass);
            $('#' + settings.TxtToId).val($item.text());
            $('#' + settings.HiddenToId).val($item.attr('id'));
            $('#' + settings.HiddenToId).attr('title', info.CountryCode + "," + info.CityCode);

            if ($('#' + settings.HiddenIntercontId).val() == 'False')
                $('#' + settings.HiddenIntercontId).val(info.Intercont);

            var domCode = $('#' + settings.HiddenDomesticId).val().split(',');

            if (domCode.length > 0) {
                domCode = domCode[0] + ',' + info.CountryCode;
                $('#' + settings.HiddenDomesticId).val(domCode)
            }
            // Clear domestic country code
            //if ($('#' + settings.HiddenDomesticId).val() != info.CountryCode)
            //    $('#' + settings.HiddenDomesticId).val('');
            
            break;
        case typeEnum.OpenJaw:
            $('#' + settings.TxtOpenJawId).removeClass(settings.CssClass);
            $('#' + settings.TxtOpenJawId).val($item.text());
            $('#' + settings.HiddenOpenJawId).val($item.attr('id'));
            $('#' + settings.HiddenOpenJawId).attr('title', info.CountryCode + "," + info.CityCode);
            break;
        default:
            $('#' + settings.TxtFromId).val($item.text());
            $('#' + settings.TxtFromId).removeClass(settings.CssClass);
            $('#' + settings.HiddenFromId).val($item.attr('id'));
            $('#' + settings.HiddenFromId).attr('title', info.CountryCode + "," + info.CityCode);
            if (isDirect == false) {
                $('#' + settings.TxtToId).val('');
                $('#' + settings.HiddenToId).val('');
                $('#' + settings.TxtOpenJawId).val('');
                $('#' + settings.HiddenOpenJawId).val('');
            }

            $('#txtToTOJ').val($item.text());

            $('#' + settings.HiddenIntercontId).val(info.Intercont);
            $('#' + settings.HiddenDomesticId).val(info.CountryCode);
            break;
    }

    $('div.resultContainer').empty();
    $('div.resultContainer').hide();
}

function ResultSelectPopUp($option, countryText, searchType) {
    // Additional information in json format
    var infoRaw = $option.attr('class');

    // Return if first row in dropdowns selected
    if (infoRaw.length < 5)
        return;

    var info;
    if (this.JSON)
        info = JSON.parse(infoRaw);
    else
        info = eval('(' + infoRaw + ')');
    
    var code = $option.val();
    var text = $option.text() + ", " + countryText + " - " + $option.text() + " (" + code + ")";

    switch (searchType) {
        case typeEnum.To:
            GetFaretypes(info.CFFMarketID);
        
            $('#' + settings.TxtToId).removeClass(settings.CssClass);
            $('#' + settings.TxtToId).val(text);
            $('#' + settings.HiddenToId).val(code);
            $('#' + settings.HiddenToId).attr('title', info.CountryCode + "," + code);
            
            if ($('#' + settings.HiddenIntercontId).val() == 'False')
                $('#' + settings.HiddenIntercontId).val(info.Intercont);
            
            // Clear domestic country code
            if ($('#' + settings.HiddenDomesticId).val() != info.CountryCode)
                $('#' + settings.HiddenDomesticId).val('');
            break;
        case typeEnum.OpenJaw:
            $('#' + settings.TxtOpenJawId).removeClass(settings.CssClass);
            $('#' + settings.TxtOpenJawId).val(text);
            $('#' + settings.HiddenOpenJawId).val(code);
            $('#' + settings.HiddenOpenJawId).attr('title', info.CountryCode + "," + code);
            break;
        default:
            $('#' + settings.TxtFromId).removeClass(settings.CssClass);
            $('#' + settings.TxtFromId).val(text);
            $('#' + settings.HiddenFromId).val(code);
            $('#' + settings.HiddenFromId).attr('title', info.CountryCode + "," + code);

            $('#txtToTOJ:visible').val(text);

            $('#' + settings.HiddenIntercontId).val(info.Intercont);
            $('#' + settings.HiddenDomesticId).val(info.CountryCode);
            break;
    }
}

function ResetDropdowns(level) {
    if (level > 5) {
        $('select#ddlFromCountryList').empty();
        $('select#ddlFromCountryList').append('<option value="0">' + settings.CountryText + '</option>');
    }
    if (level > 4) {
        $('select#ddlFromCityList').empty();
        $('select#ddlFromCityList').append('<option value="0">' + settings.CityText + '</option>');
    }
    if (level > 3) {
        $('select#ddlTojCountryList').empty();
        $('select#ddlTojCountryList').append('<option value="0">' + settings.CountryText + '</option>');
    }
    if (level > 2) {
        $('select#ddlTojCityList').empty();
        $('select#ddlTojCityList').append('<option value="0">' + settings.CityText + '</option>');
    }
    if (level > 1) {
        $('select#ddlToCountryList').empty();
        $('select#ddlToCountryList').append('<option value="0">' + settings.CountryText + '</option>');
    }
    if (level > 0) {
        $('select#ddlToCityList').empty();
        $('select#ddlToCityList').append('<option value="0">' + settings.CityText + '</option>');
    }
}

function LoadFromCountries() {
    $.ajax({
        type: "GET",
        url: "/Utilities/WebServices/PredictiveSearch.asmx/CountryFrom",
        data: "cepId=" + settings.CepId
            + "&languageCode=" + settings.Language
            + "&searchMode=" + settings.SearchMode,
        dataType: "xml",
        success: function(data) {
            PopulateGeoData(data, $('select#ddlFromCountryList'));

            // preselect
            var additionalFrom = $('#' + settings.HiddenFromId).attr('title');
            var additionalTo = $('#' + settings.HiddenToId).attr('title');
            var countryFrom = additionalFrom.substring(0, additionalFrom.indexOf(','));
            var cityFrom = additionalFrom.substring(additionalFrom.indexOf(',') + 1);
            var cityTo = additionalTo.substring(additionalTo.indexOf(',') + 1);

            if (countryFrom != ''
                && (cityFrom != $('select#ddlFromCityList').val() 
                    || cityTo != $('select#ddlToCityList').val())) {
                $('select#ddlFromCountryList').val(countryFrom);
                $('select#ddlFromCountryList').change();
            }
        }
    });
}

function LoadFromCities(countryCode) {
    $.ajax({
        type: "GET",
        url: "/Utilities/WebServices/PredictiveSearch.asmx/CityFrom",
        data: "cepId=" + settings.CepId
            + "&languageCode=" + settings.Language
            + "&countryCode=" + countryCode
            + "&searchMode=" + settings.SearchMode,
        dataType: "xml",
        success: function(data) {
            PopulateGeoData(data, $('select#ddlFromCityList'));

            // preselect
            var additionalFrom = $('#' + settings.HiddenFromId).attr('title');
            var countryFrom = additionalFrom.substring(0, additionalFrom.indexOf(','));
            var cityFrom = additionalFrom.substring(additionalFrom.indexOf(',') + 1);

            if (cityFrom != ''
                && cityFrom != $('select#ddlFromCityList').val()
                && countryFrom == $('select#ddlFromCountryList').val()) {
                $('select#ddlFromCityList').val(cityFrom);
                $('select#ddlFromCityList').change();
            }
        }
    });
}

function LoadToCountries($fromCityOption) {
    $.ajax({
        type: "GET",
        url: "/Utilities/WebServices/PredictiveSearch.asmx/CountryTo",
        data: "cepId=" + settings.CepId
            + "&languageCode=" + settings.Language
            + "&origin=" + $fromCityOption.val()
            + "&searchMode=" + settings.SearchMode,
        dataType: "xml",
        success: function(data) {
            PopulateGeoData(data, $('select#ddlToCountryList'));

            // preselect
            var additionalFrom = $('#' + settings.HiddenFromId).attr('title');
            var additionalTo = $('#' + settings.HiddenToId).attr('title');
            var cityFrom = additionalFrom.substring(additionalFrom.indexOf(',') + 1);
            var countryTo = additionalTo.substring(0, additionalFrom.indexOf(','));

            if (countryTo != ''
                && countryTo != $('select#ddlToCountryList').val()
                && cityFrom == $('select#ddlFromCityList').val()) {
                $('select#ddlToCountryList').val(countryTo);
                $('select#ddlToCountryList').change();
            }
            else {
                var countryText = $('select#ddlFromCountryList option:selected').text();

                ResultSelectPopUp($('select#ddlFromCityList option:selected'), countryText, typeEnum.From);
            }
        }
    });
}

function LoadToCities(fromCity, toCountry) {
    $.ajax({
        type: "GET",
        url: "/Utilities/WebServices/PredictiveSearch.asmx/CityTo",
        data: "cepId=" + settings.CepId
            + "&languageCode=" + settings.Language
            + "&fromCity=" + fromCity
            + "&toCountry=" + toCountry
            + "&searchMode=" + settings.SearchMode,
        dataType: "xml",
        success: function(data) {
            PopulateGeoData(data, $('select#ddlToCityList'));

            // preselect
            var additionalTo = $('#' + settings.HiddenToId).attr('title');
            var countryTo = additionalTo.substring(0, additionalTo.indexOf(','));
            var cityTo = additionalTo.substring(additionalTo.indexOf(',') + 1);

            if (cityTo != ''
                && cityTo != $('select#ddlToCityList').val()
                && countryTo == $('select#ddlToCountryList').val()) {
                $('select#ddlToCityList').val(cityTo);
            }
        }
    });
}

function SelectToCity($toCityOption) {
    var countryText = $('select#ddlToCountryList option:selected').text();

    ResultSelectPopUp($toCityOption, countryText, typeEnum.To);
}

function LoadTojCountries($fromCityOption) {
    $.ajax({
        type: "GET",
        url: "/Utilities/WebServices/PredictiveSearch.asmx/CountryOpenJaw",
        data: "cepId=" + settings.CepId
        + "&languageCode=" + settings.Language
        + "&destination=" + $fromCityOption.val()
        + "&searchMode=" + settings.SearchMode,
        dataType: "xml",
        success: function(data) {
            PopulateGeoData(data, $('select#ddlTojCountryList'));
            var countryToj = additionalToj = '';
            // preselect
            var additionalFrom = $('#' + settings.HiddenFromId).attr('title');
            if ($('#' + settings.HiddenOpenJawId).length > 0)
                additionalToj = $('#' + settings.HiddenOpenJawId).attr('title');
            var cityFrom = additionalFrom.substring(additionalFrom.indexOf(',') + 1);
            if (additionalToj.indexOf(',') > -1)
                countryToj = additionalToj.substring(0, additionalToj.indexOf(','));
            if (countryToj != ''
            && countryToj != $('select#ddlTojCountryList').val()
            && cityFrom == $('select#ddlFromCityList').val()) {
                $('select#ddlTojCountryList').val(countryToj);
                $('select#ddlTojCountryList').change();
            }
        }
    });
}

function LoadTojCities(toCity, fromCountry) {
    $.ajax({
        type: "GET",
        url: "/Utilities/WebServices/PredictiveSearch.asmx/CityOpenJaw",
        data: "cepId=" + settings.CepId
            + "&languageCode=" + settings.Language
            + "&toCity=" + toCity
            + "&fromCountry=" + fromCountry
            + "&searchMode=" + settings.SearchMode,
        dataType: "xml",
        success: function(data) {
            PopulateGeoData(data, $('select#ddlTojCityList'));

            // preselect
            var additionalToj = $('#' + settings.HiddenOpenJawId).attr('title');
            var countryToj = additionalToj.substring(0, additionalToj.indexOf(','));
            var cityToj = additionalToj.substring(additionalToj.indexOf(',') + 1);

            if (cityToj != ''
                && cityToj != $('select#ddlTojCityList').val()
                && countryToj == $('select#ddlTojCountryList').val()) {
                $('select#ddlTojCityList').val(cityToj);
            }
        }
    });
}

function SelectTojCity($tojCityOption) {
    var countryText = $('select#ddlTojCountryList option:selected').text();

    ResultSelectPopUp($tojCityOption, countryText, typeEnum.OpenJaw);
}

function PopulateGeoData(data, elem) {
    $('string', data).each(function(index) {
        var hitRaw = $(this).text();
        var hit;
        if (this.JSON)
            hit = JSON.parse(hitRaw);
        else
            hit = eval('(' + hitRaw + ')');
            
        var infoRaw = '{"Intercont":"' + hit.AdditionalInfo.Intercont + '","CountryCode":"' + hit.AdditionalInfo.CountryCode + '","CFFMarketID":"' + hit.AdditionalInfo.CffMarketId  + '"}';

        $(elem).append('<option value=\"' + hit.Code + '\" class=\'' + infoRaw + '\'>' + hit.Text + '</option>');
    });
}

