function showDescription(id)
{
    hide(getElem('f_description'));

    if(typeof(desc[id]) != 'undefined')
    {
        getElem('description').innerHTML = desc[id];
        show(getElem('f_description'));
    }
}

function changePassengerWord(idJourney)
{
    if (numberOf[idJourney])
    {
        var spanRedefined = getElem("lng_amount_redefined");
                
        if (spanRedefined)
        {
            spanRedefined.innerHTML = numberOf[idJourney].replace(/[\|]/g, "");
            hide(getElem("lng_amount_original"));
            show(getElem("lng_amount_empty"));
        }
    }
    else
    {
            hide(getElem("lng_amount_empty"));
        show(getElem("lng_amount_original"));
    }
}

function updateRoundJourneyPickupPoints(type, id_journey)
{
    var elDepartureCityTable = getElem('departure_city_table');
    if (type != 3)
    {
        hide(elDepartureCityTable);
        return;
    }

    arr = new Object();
    var rjppointsCount = 0;
    var curr_id_journey = frm.journey.value;
    for (var id_rj_pickup_point in rj_pickup_points[curr_id_journey])
    {
        var rjppoint = rj_pickup_points[curr_id_journey][id_rj_pickup_point];
        arr[rjppointsCount] = new ListItem("" + id_rj_pickup_point, unescapeHTML(rjppoint.name + (rjppoint.departure_time == '' ? '' : ' (' + rjppoint.departure_time + ')')));
        rjppointsCount++;
    }

    if (rjppointsCount > 0)
    {
        setupSelect(frm.departure_city, arr);
        show(elDepartureCityTable);
    }
    else if (id_prov == 3106 && cur_type != 25)
    {
        show(elDepartureCityTable);
    }
    else
    {
        clearSelect(frm.departure_city);
        hide(elDepartureCityTable);
    }
}

function updatePage(type, radio)
{
    cur_mode = types[radio];
    updateCall = "checkAvailableTime(calOracleField, " + cur_mode + ")";
    cur_type = type;
    checkRadio(radio);

    switch(Number(types[radio]))
    {
        case 1:
        {
            show(getElem('table_1'));
            hide(getElem('f_returning'));
            hide(getElem('f_description'));
            show(getElem('f_going'));
            break;
        }
        case 2:
        {
            show(getElem('table_1'));
            hide(getElem('f_description'));
            show(getElem('f_going'));
            show(getElem('f_returning'));
            break;
        }
        case 3:
        {
            show(getElem('table_1'));
            hide(getElem('f_description'));
            hide(getElem('f_going'));
            hide(getElem('f_returning'));
            break;
        }
    }

    setupSelectsTable1(cur_type);
    return false;
}

function getElem(id)
{
    return (document.getElementById) ? document.getElementById(id) : document.all(id);
}

function show(elem)
{
    if (elem)
    {
        try
        {
            elem.style.display = "";
        }
        catch(e) {}
    }
}

function isHidden(elem)
{
    try
    {
        return (elem.style.display == "none");
    }
    catch(e)
    {
        return false;
    }
}

function hide(elem)
{
    if (elem)
    {
        try
        {
            elem.style.display = "none";
        }
        catch(e) {
                        
                        }
    }
}

function checkRadio(idx)
{
    if(typeof(frm.jtype.length) != 'undefined')
    {
        frm.jtype[idx].checked = true;
    }
    else
    {
        frm.jtype.checked = true;
    }
}

function disable(elem)
{
    elem.disabled = true;
}

function enable(elem)
{
    elem.disabled = false;
}

function initTable1()
{
    disable(frm.leaving);
    disable(frm.going);
    disable(frm.departure_time);
    disable(frm.return_time);
}

function setupSelectsTable1(type)
{
    switch(cur_mode)
    {
        case 1:
        case 2:
        {
            updateTo(frm.going, frm.leaving);
            break;
        }
        case 3:
        {
            updateT3(frm.departure_time, frm.leaving, frm.departuring);
            break;
        }
    }
}

function compareNames(a, b)
{
    var name1 = a.text;
    var name2 = b.text;

    if (name1.substr(0, 3) == "]x[")
    {
        name1 = name1.substr(3, name1.length);
    }

    if (name2.substr(0, 3) == "]x[")
    {
        name2 = name2.substr(3, name2.length);
    }

    var result = 0;

    if (name1 > name2)
    {
        result = 1;
    }
    else if (name1 < name2)
    {
        result = -1;
    }

    return result;
}

function updateTo(sel, obj, type)
{
    if(!type)
    {
        type = cur_type;
    }

    var point = obj[obj.selectedIndex].value;

    if ((point == "N/A" || point == "0") && obj[obj.selectedIndex + 1])
    {
        point = obj[obj.selectedIndex + 1].value;
    }

    clearSelect(sel);

    var arr = new Array();
    var vals = String(data[type].p[point]).split(',');

    if(vals.length == 0)
    {
        return;
    }

//    var count = 0;
    var point_name = "";

    for (var i in vals)
    {
        if (inArr(hiddenPoints, getDataFromCompositeValue(vals[i], 2)))
        {
            continue;
        }

        point_name = points[routes[vals[i]].e] || pickup_points[routes[vals[i]].e];
        arr.push(new ListItem(vals[i], unescapeHTML(unescape(point_name))));

//        arr[count] = new ListItem(vals[i], unescapeHTML(point_name));
//        count++;
    }

//    arr.sort(compareNames);

    setupSelect(sel, arr, (show_NA_by_deafult && arr.length > 1));
    enable(sel);

    makeHighlighted(sel, true);

    if (st_route && st_route != 0)
    {
        setSelected(sel, (String(st_route).indexOf("_") > 0 ? st_route : st_route + "_" + point), true);
        st_route = 0;
    }

    hide(getElem("destination_points_loading_image"));

    updateT(frm.departure_time, sel, frm.departuring);

    if(cur_mode == 2)
    {
        updateTR(frm.return_time, sel, frm.returning);
    }
}

function updateFlightDescription(sel)
{
    var airportPointsArr = airport_points.split(",");

    var departuringTimeText = getElem("departuring_time");
    var flightDeparturingTimeArrivalText = getElem("flight_direct_time_arrival");
    var flightDeparturingTimeDepartureText = getElem("flight_direct_time_departure");
    var directFlightArrivalText = getElem("direct_flight_arrival");
    var directFlightDepartureText = getElem("direct_flight_departure");

    var returningTimeText = getElem("returning_time");
    var flightReturningTimeArrivalText = getElem("flight_return_time_arrival");
    var flightReturningTimeDepartureText = getElem("flight_return_time_departure");
    var returnFlightArrivalText = getElem("return_flight_arrival");
    var returnFlightDepartureText = getElem("return_flight_departure");

    if (inArr(airportPointsArr, getDataFromCompositeValue(sel[sel.selectedIndex].value, 1)))
    {
        hide(departuringTimeText);
        show(flightDeparturingTimeArrivalText);
        hide(flightDeparturingTimeDepartureText);
        show(directFlightArrivalText);
        hide(directFlightDepartureText);

        if (cur_mode == 2)
        {
            hide(returningTimeText);
            hide(flightReturningTimeArrivalText);
            show(flightReturningTimeDepartureText);
            show(returnFlightDepartureText);
            hide(returnFlightArrivalText);
        }
    }
    else if (inArr(airportPointsArr, getDataFromCompositeValue(sel[sel.selectedIndex].value, 2)))
    {
        hide(departuringTimeText);
        hide(flightDeparturingTimeArrivalText);
        show(flightDeparturingTimeDepartureText);
        show(directFlightDepartureText);
        hide(directFlightArrivalText);

        if (cur_mode == 2)
        {
            hide(returningTimeText);
            show(flightReturningTimeArrivalText);
            hide(flightReturningTimeDepartureText);
            show(returnFlightArrivalText);
            hide(returnFlightDepartureText);
        }
    }
    else
    {
        show(departuringTimeText);
        hide(flightDeparturingTimeArrivalText);
        hide(flightDeparturingTimeDepartureText);
        hide(directFlightArrivalText);
        hide(directFlightDepartureText);

        if (cur_mode == 2)
        {
            show(returningTimeText);
            hide(flightReturningTimeArrivalText);
            hide(flightReturningTimeDepartureText);
            hide(returnFlightArrivalText);
            hide(returnFlightDepartureText);
        }
    }
}

function updateTR(sel, obj, dates, type)
{
    if(!type)
    {
        type = cur_type;
    }

    var idx = obj[obj.selectedIndex].value;

    if ((idx == "N/A" || idx == "0") && obj[obj.selectedIndex + 1].value)
    {
        idx = obj[obj.selectedIndex + 1].value;
    }

    var point1 = routes[idx].s;
    var point2 = routes[idx].e;

    var found = false;
    var arr_i = new Array();

    for (var i in data[type].r)
    {
        var r = routes;

        if((r[i].s == point2) && (r[i].e == point1))
        {
            found = true;
            arr_i.push(i);
            point = i;
        }
    }

    if(!found) return;

    for (h = 0; h < arr_i.length; h++)
    {
        var r = routes;

        for (var times in r[arr_i[h]].dr)
        {
            var arr_dates = r[arr_i[h]].dr[times].split('-');

            if (arr_dates.length == 2)
            {
                var curr_date  = new Date(getStringDate(dates.value));
                var start_date = new Date(getStringDate(arr_dates[0]));
                var end_date   = new Date(getStringDate(arr_dates[1]));

                if ((curr_date >= start_date) && (curr_date <= end_date))
                {
                    var point = arr_i[h];
                    break;
                }
            }
            else
            {
                var point = arr_i[h];
                break;
            }
        }
    }

    frm.route_ret.value = point;

    if(sel.selectedIndex != -1 && sel.options[sel.selectedIndex].value != "N/A")
    {
        var currT = sel.options[sel.selectedIndex].value || "";
    }

    clearSelect(sel);

    used_season_id = 0;//getSeasonId(seasons[getDataFromCompositeValue(point, 0)], dates.value);

    var arr = fillTimesArray(point, dates, used_season_id, frm.journey.value, "destination");

    changeTimeFieldsVisibility(arr, sel);

    if (!getArrayLength(arr))
    {
        disable(sel);
        return;
    }

    setupSelect(sel, arr);
    enable(sel);

    if(currT)
    {
        setSelected(sel, currT);
    }
    else if (default_date == dates.value)
    {
        setNextAvailableTime(frm.returning.value, sel, arr, "returning");
    }

    onDirectTimeChange(57, frm.journey.value, frm.returning.value, getDataFromCompositeValue(frm.return_time[frm.return_time.selectedIndex].value, 0), getDataFromCompositeValue(point, 0), getDataFromCompositeValue(point, 1), used_season_id, point, getDataFromCompositeValue(frm.return_time[frm.return_time.selectedIndex].value, 1), "return");
}

function updateT3(sel, obj, dates, type)
{
    if(!type)
    {
        type = cur_type;
    }

    var leavingPoint = obj[obj.selectedIndex].value;

    if ((leavingPoint == "N/A" || leavingPoint == "0") && obj[obj.selectedIndex + 1])
    {
        leavingPoint = obj[obj.selectedIndex + 1].value;
    }

    var point = data[type].p[leavingPoint];

    frm.journey.value   = data[type].r[point];

    used_season_id = 0; //getSeasonId(seasons[getDataFromCompositeValue(point, 0)], dates.value);

    try
    {
        updateTicketTypes(ticket_types[frm.journey.value][used_season_id]);
    }
    catch(e)
    {
        updateTicketTypes("");
    }

    showDescription(frm.journey.value);
    changePassengerWord(frm.journey.value);

    if (frm.journey.value != "undefined")
        updateRoundJourneyPickupPoints(cur_mode, frm.journey.value);

    if (preferred_currency[frm.journey.value] != null)
    {
        updatePreferredCurrencies(frm.currency, preferred_currency[frm.journey.value]);
    }

    frm.route.value = point;

    if(sel.selectedIndex != -1 && sel.options[sel.selectedIndex].value != "N/A")
    {
        var currT = sel.options[sel.selectedIndex].value || "";
    }

    clearSelect(sel);

    var arr = fillTimesArray(point, dates, used_season_id, frm.journey.value, "departure");

    changeTimeFieldsVisibility(arr, sel);

    var elBlockDepartureTime = getElem("block_departure_time");
    if ((type == 27) || (type == 28))
    {
        elBlockDepartureTime.style.visibility = "hidden";
    }
    else if ((type == 25) && (getArrayLength(arr)))
    {
        elBlockDepartureTime.style.visibility = "visible";
    }

    buildConfirmationDatesSelection();
    buildExtraHTML();

    if (!getArrayLength(arr))
    {
        disable(sel);
        return;
    }

    setupSelect(sel, arr);
    enable(sel);

    if(currT)
    {
        setSelected(sel, currT);
    }
    else if (default_date == dates.value)
    {
        setNextAvailableTime(frm.departuring.value, sel, arr, "departuring");
    }

    onDirectTimeChange(57, frm.journey.value, frm.departuring.value, getDataFromCompositeValue(frm.departure_time[frm.departure_time.selectedIndex].value, 0), getDataFromCompositeValue(frm.route.value, 0), getDataFromCompositeValue(frm.route.value, 1), used_season_id, frm.route.value, getDataFromCompositeValue(frm.departure_time[frm.departure_time.selectedIndex].value, 1), "direct");
}

function updateT(sel, obj, dates, type)
{
    if(!type)
    {
        type = cur_type;
    }

    var point = obj[obj.selectedIndex].value;

    if ((point == "N/A" || point == "0") && obj[obj.selectedIndex + 1])
    {
        point = obj[obj.selectedIndex + 1].value;
    }

    frm.journey.value = data[type].r[point];

    used_season_id = 0;//getSeasonId(seasons[getDataFromCompositeValue(point, 0)], dates.value);

    var point_1 = frm.leaving[frm.leaving.selectedIndex].value;
    var point_2 = getDataFromCompositeValue(obj[obj.selectedIndex].value, 2);
/*
    if (pickup_points[point_1])
    {
        if (ticket_types[frm.journey.value][getDataFromCompositeValue(point, 0)] && ticket_types[frm.journey.value][getDataFromCompositeValue(point, 0)][point_1])
        {
            updateTicketTypes(ticket_types[frm.journey.value][getDataFromCompositeValue(point, 0)][point_1][used_season_id]);
        }
        else
        {
            updateTicketTypes("");
        }
    }
    else
    {
*/
    try
    {
        updateTicketTypes(ticket_types[frm.journey.value][used_season_id]);
    }
    catch(ex)
    {
        updateTicketTypes("");
    }
//    }

    updateRoundJourneyPickupPoints(cur_mode, frm.journey.value);

    showDescription(frm.journey.value);
    changePassengerWord(frm.journey.value);
    fpoints.value = routes[point].e;

    if (preferred_currency[frm.journey.value] != null)
    {
        updatePreferredCurrencies(frm.currency, preferred_currency[frm.journey.value]);
    }

    frm.route.value = point;

    if(sel.selectedIndex != -1 && sel.options[sel.selectedIndex].value != "N/A")
    {
        var currT = sel.options[sel.selectedIndex].value || "";
    }

    clearSelect(sel);

    var arr = fillTimesArray(point, dates, used_season_id, frm.journey.value, "departure");

    changeTimeFieldsVisibility(arr, sel);

    buildConfirmationDatesSelection();
    buildExtraHTML();

    if (!getArrayLength(arr))
    {
        disable(sel);
        return;
    }

    setupSelect(sel, arr);
    enable(sel);

    if(currT)
    {
        setSelected(sel, currT);
    }
    else if (default_date == dates.value)
    {
        setNextAvailableTime(frm.departuring.value, sel, arr, "departuring");
    }

    updateFlightDescription(obj);

    onDirectTimeChange(57, frm.journey.value, frm.departuring.value, getDataFromCompositeValue(frm.departure_time[frm.departure_time.selectedIndex].value, 0), getDataFromCompositeValue(frm.route.value, 0), getDataFromCompositeValue(frm.route.value, 1), used_season_id, frm.route.value, getDataFromCompositeValue(frm.departure_time[frm.departure_time.selectedIndex].value, 1), "direct");
}

function buildExtraHTML()
{
    var extras_viewstate = new Object();

    for (var id_extra in extras[frm.journey.value])
    {
        if ((getElem("extra_tickets_" + id_extra) && isHidden(getElem("extra_tickets_" + id_extra)))
                || extras[frm.journey.value][id_extra].by_default != "Y")
        {
            extras_viewstate[id_extra] = "none";
        }
    }

    var extras_div = getElem("extras_div");

    if (extras_div)
    {
        extras_div.innerHTML = "";
    }

    if (extras[frm.journey.value])
    {
        var extras_table = document.createElement("table");
        extras_table.setAttribute("cellpadding", "0");
        extras_table.setAttribute("cellspacing", "0");

        extras_table.style.borderCollapse = "collapse";

        var extra_table = new Object();

        for (var id_extra in extras[frm.journey.value])
        {
            if (extras[frm.journey.value][id_extra].tickets == "")
            {
                continue;
            }

            extra_table = document.createElement("table");
            extra_table.setAttribute("cellpadding", "2");
            extra_table.setAttribute("cellspacing", "0");
            extra_table.style.borderCollapse = "collapse";

            var td = insertRow(extra_table);

            td.style.fontWeight = "bold";
            td.appendChild(document.createTextNode(unescapeHTML(extras[frm.journey.value][id_extra].name)));

            td = insertRow(extra_table);

            td.appendChild(document.createTextNode(unescapeHTML(extras[frm.journey.value][id_extra].description)));

            td = insertRow(extra_table);

            try
            {
                var radio = document.createElement("<input type='radio' name='extra_book_" + id_extra + "' id='extra_book_" + id_extra + "' value='Y' " + (extras_viewstate[id_extra] != "none" ? "checked" : "") + " onclick='showExtraPrices(" + id_extra + ")' />");
            }
            catch(ex)
            {
                var radio = document.createElement("input");
                radio.setAttribute("type", "radio");
                radio.setAttribute("name", "extra_book_" + id_extra);
                radio.setAttribute("id", "extra_book_" + id_extra);
                radio.setAttribute("value", "Y");
                radio.setAttribute("onclick", "showExtraPrices(" + id_extra +")");
                radio.checked = (extras_viewstate[id_extra] != "none");
            }

            td.appendChild(radio);
            td.appendChild(document.createTextNode(" Yes, Please  "));

            try
            {
                var radio = document.createElement("<input type='radio' name='extra_book_" + id_extra + "' id='extra_book_" + id_extra + "' value='N' " + (extras_viewstate[id_extra] == "none" ? "checked" : "") + " onclick='hideExtraPrices(" + id_extra + ")' />");
            }
            catch(ex)
            {
                var radio = document.createElement("input");
                radio.setAttribute("type", "radio");
                radio.setAttribute("name", "extra_book_" + id_extra);
                radio.setAttribute("id", "extra_book_" + id_extra);
                radio.setAttribute("onclick", "hideExtraPrices(" + id_extra + ")");
                radio.setAttribute("value", "N");
                radio.checked = (extras_viewstate[id_extra] != "none");
            }

            radio.checked = (extras_viewstate[id_extra] == "none");

            td.appendChild(radio);
            td.appendChild(document.createTextNode(" No, Thanks."));

            var extra_tickets = extras[frm.journey.value][id_extra].tickets.split(",");

            var prices_table = document.createElement("table");
            prices_table.setAttribute("cellpadding", "0");
            prices_table.setAttribute("cellspacing", "0");
            prices_table.style.borderCollapse = "collapse";
            prices_table.id = "extra_tickets_" + id_extra;

            prices_table.style.display = (extras_viewstate[id_extra] == "none" ? extras_viewstate[id_extra] : "");

            for (var i = 0; i < extra_tickets.length; i++)
            {
                td = insertRow(prices_table);

                try
                {
                    var select = document.createElement("<select class='fields' name='extra_ticket_" + extra_tickets[i] + "_" + id_extra + "' id='extra_ticket_" + extra_tickets[i] + "_" + id_extra + "'>");
                }
                catch(ex)
                {
                    var select = document.createElement("select");
                    select.setAttribute("name", "extra_ticket_" + extra_tickets[i] + "_" + id_extra);
                    select.setAttribute("id", "extra_ticket_" + extra_tickets[i] + "_" + id_extra);
                    select.setAttribute("class", "fields");
                }

                select.style.width = "43px";

                fillNumeric(select, 0, extras[frm.journey.value][id_extra].max_allowed);

                td.appendChild(select);
                td.appendChild(document.createTextNode("  " + unescapeHTML(ticket_names[extra_tickets[i]])));
            }

            td = insertRow(extra_table);
            td.appendChild(prices_table);

            td = insertRow(extras_table);
            td.appendChild(extra_table);

            td = insertRow(extra_table);
            td.appendChild(document.createTextNode(unescapeHTML("&nbsp;")));
        }

        var table = document.createElement("table");
        table.setAttribute("cellpadding", "0");
        table.setAttribute("cellspacing", "0");

        table.style.borderCollapse = "collapse";

        var tr = table.insertRow(-1);
        td = tr.insertCell(-1);

        td.setAttribute("width", "115");

        td.style.verticalAlign = "top";
        td.appendChild(document.createTextNode("Also available:"));
        td.style.paddingTop = "2px";

        td = tr.insertCell(-1);
        td.setAttribute("width", "369");

        td.appendChild(extras_table);

        extras_div.appendChild(table);
    }
}

function hideExtraPrices(id_extra)
{
    hide(getElem("extra_tickets_" + id_extra));
}

function showExtraPrices(id_extra)
{
    show(getElem("extra_tickets_" + id_extra));
}

function buildConfirmationDatesSelection()
{
    var confirmations_div = getElem("confirmations_div");

    if (confirmations_div)
    {
        confirmations_div.innerHTML = "";
    }

    var confirmations_tr = getElem("confirmations_tr");

    if (show_confirmations[frm.journey.value])
    {
        var confirmations_table = document.createElement("table");
        confirmations_table.setAttribute("cellpadding", "0");
        confirmations_table.setAttribute("cellspacing", "0");
        confirmations_table.setAttribute("border", "0");

        for (var id_confirmation in show_confirmations[frm.journey.value])
        {
            var tr = confirmations_table.insertRow(-1);
            var td = tr.insertCell(-1);
            td.colSpan = 2;
            td.className = "Bodytext";
            td.style.fontWeight = "bold";
            td.appendChild(document.createTextNode("BOOK YOUR ADDITIONAL TOUR")); // add correct spelling

            var tr = confirmations_table.insertRow(-1);
            var td = tr.insertCell(-1);
            td.height = 12;
            td.colSpan = 2;

            var image_line = createLineImage();

            td.appendChild(image_line);

            var tr = confirmations_table.insertRow(-1);
            var td = tr.insertCell(-1);

            td.className = "Bodytext";
            td.style.fontWeight = "bold";
            td.colSpan = 2;
            td.appendChild(document.createTextNode("Tour name: " + show_confirmations[frm.journey.value][id_confirmation].name)); // add correct spelling

            var tr = confirmations_table.insertRow(-1);
            var td = tr.insertCell(-1);
            td.colSpan = 2;
            td.height = 12;

            image_line = createLineImage();

            td.appendChild(image_line);

            var tr = confirmations_table.insertRow(-1);
            var td = tr.insertCell(-1);
            td.width = 130;
            td.appendChild(document.createTextNode("Departing"));  // add correct spellling

            td_for_picker = tr.insertCell(-1);
            td_for_picker.width = 384;

            var date_picker_table = document.createElement("table");
            date_picker_table.cellPadding = 0;
            date_picker_table.cellSpacing = 0;
            date_picker_table.width = 200;

            tr = date_picker_table.insertRow(-1);

            var hidden_day_field = document.createElement("input");
            var hidden_id = "confirmation_" + id_confirmation + "_departuring";

            hidden_day_field.type = "hidden";
            hidden_day_field.name = hidden_id;
            hidden_day_field.id = hidden_id;

            var date = new Date();
            date.setDate(date.getDate() + 1);
            hidden_day_field.value = getJSDate(date);

            var day_id = "_day_confirmation_" + id_confirmation + "_departuring";
            var month_id = "_month_confirmation_" + id_confirmation + "_departuring";
            var year_id = "_year_confirmation_" + id_confirmation + "_departuring";

            var day_select = createDatePickerItem(day_id, day_id, month_id, year_id, hidden_id);
            var month_select = createDatePickerItem(month_id, day_id, month_id, year_id, hidden_id);
            var year_select = createDatePickerItem(year_id, day_id, month_id, year_id, hidden_id);

            try
            {
                var image_link = document.createElement("<a href='javascript:doNothing()' onclick=\"setDateField(getElem('" + day_id + "'), getElem('" + month_id + "'), getElem('" + year_id + "'), getElem('" + hidden_id + "')); self.newWin = window.open('js/calendar.html','cal','dependent=yes,width=180,height=180,titlebar=yes,top=243,left=232');\" />");
            }
            catch (ex)
            {
                var image_link = document.createElement("a");
                image_link.href = "javascript:doNothing()";
                image_link.setAttribute("onclick", "setDateField(getElem('" + day_id + "'), getElem('" + month_id + "'), getElem('" + year_id + "'), getElem('" + hidden_id + "')); self.newWin = window.open('js/calendar.html','cal','dependent=yes,width=180,height=180,titlebar=yes,top=243,left=232')");
            }

            var image = document.createElement("img");
            image.src = "images/calendar3.gif";
            image.width = 20;
            image.height = 18;
            image.border = 0;
            image.style.verticalAlign = "middle";

            image_link.appendChild(image);

            buildDaySelectorWithObject(hidden_day_field, day_select);
            buildMonthSelectorWithObject(hidden_day_field, month_select);
            buildYearSelectorWithObject(hidden_day_field, 0, year_select);

            td = tr.insertCell(-1);
            td.className = "Formtable";
            td.width = 30;

            td.appendChild(hidden_day_field);
            td.appendChild(day_select);

            td = tr.insertCell(-1);
            td.className = "Formtable";
            td.width = 40;

            td.appendChild(month_select);

            td = tr.insertCell(-1);
            td.className = "Formtable";
            td.width = 40;

            td.appendChild(year_select);

            td = tr.insertCell(-1);
            td.className = "Formtable";
            td.width = 20;

            td.appendChild(image_link);

            td_for_picker.appendChild(date_picker_table);

            tr = confirmations_table.insertRow(-1);
            td = tr.insertCell(-1);
            td.colSpan = 2;
            td.height = 12;

            image_line = createLineImage();

            td.appendChild(image_line);
        }

        confirmations_div.appendChild(confirmations_table);

        show(confirmations_tr);
    }
    else if (confirmations_tr)
    {
        hide(confirmations_tr);
    }
}

function createLineImage()
{
    try
    {
        var image_line = document.createElement("<img width=\"100%\" height=\"1\" border=\"0\" src=\"images/pixel_line.gif\" />");
    }
    catch(ex)
    {
        var image_line = document.createElement("img");
        image_line.setAttribute("width", "100%");
        image_line.setAttribute("height", "1");
        image_line.setAttribute("border", "0");
        image_line.setAttribute("src", "images/pixel_line.gif");
    }

    return image_line;
}

function createDatePickerItem(main_id, day_id, month_id, year_id, hidden_id)
{
    try
    {
        var day_select = document.createElement("<select name=\"" + main_id + "\" id=\"" + main_id + "\" class=\"fields\"  onclick=\"updateDate(getElem('" + day_id + "'), getElem('" + month_id + "'), getElem('" + year_id + "'), getElem('" + hidden_id + "'))\" />");
    }
    catch(ex)
    {
        var day_select = document.createElement("select");

        day_select.name = main_id;
        day_select.id = main_id;
        day_select.className = "fields";
        day_select.setAttribute("onclick", "updateDate(getElem('" + day_id + "'), getElem('" + month_id + "'), getElem('" + year_id + "'), getElem('" + hidden_id + "'))");
    }

    return day_select;
}

function insertRow(table)
{
    tr = table.insertRow(-1);
    td = tr.insertCell(-1);

    return td;
}

function getArrayLength(array)
{
    var count = 0;
    for (var id in array)
        count ++;
    return count;
}

function checkNoRunSeasonTime(point, season_id, time, dates)
{
    var date    = new Date(getStringDate(dates));
    var weekDay = date.getDay();

    var rdates  = seasons[point][season_id].dr[time] || "";
    var rtimes  = seasons[point][season_id].nr[time] || "";

    if (!rdates && !rtimes)
    {
        return false;
    }

    rdates = rdates.split("|");
    rtimes = rtimes.split("|");

    for (var i in rdates)
    {
        var dArr    = rdates[i].split("-");
        var tstr    = rtimes[i] || "";
        var start   = new Date(getStringDate(dArr.length == 2 ? dArr[0] : dates));
        var end     = new Date(getStringDate(dArr.length == 2 ? dArr[1] : dates));

        if ((start <= date) && (date <= end))
        {
            return (inArr(tstr.split(','), String(weekDay)));
        }
    }

    return true;
}

function checkNoRunTime(point, time, dates)
{
    var date = new Date(getStringDate(dates));
    var weekDay = date.getDay();

    var rdates = routes[point].dr[time] || "";
    var rtimes = routes[point].nr[time] || "";

    if(!rdates && !rtimes)
        return false;

    rdates = rdates.split("|");
    rtimes = rtimes.split("|");

    for(var i in rdates)
    {
        var dArr = rdates[i].split("-");
        var tstr = rtimes[i] || "";
        var start = new Date(getStringDate(dArr.length == 2 ? dArr[0] : dates));
        var end   = new Date(getStringDate(dArr.length == 2 ? dArr[1] : dates));

        if (((start <= date) && (date <= end)))
        {
            return(inArr(tstr.split(','), String(weekDay)));
        }
    }
    return true;
}

function checkTimeRange(d_start, t_start, hours, dateForProvider/*, timeDifference*/)
{
    hours = Number(hours) || 0;

    var current = dateForProvider || new Date();

    var start = new Date(d_start);
    if(/ANY/.test(t_start))
    {
        t_start = current.getHours() + ":" + (current.getMinutes() + 1);
    }

    if(t_start.indexOf(":") != -1)
    {
        var t_arr = t_start.split(":");

        if(t_arr.length == 2)
        {
            start.setHours(t_arr[0]);
            start.setMinutes(t_arr[1]);
        }
    }

    if(current.getTime() > start.getTime())
    {
        return false;
    }

    var diff = start.getTime() - current.getTime();

    if(diff < hours * 60 * 60 * 1000)
    {
        return false;
    }

    return true;
}

function checkCutOffTime(d_start, t_start, cut_off_time, dateForProvider)
{
    if (cut_off_time)
    {
        var current = new Date(dateForProvider) || new Date();
        var date_tomorrow = new Date(dateForProvider) || new Date();
        date_tomorrow.setDate(date_tomorrow.getDate() + 1);

        var start = new Date(d_start);

        if(/ANY/.test(t_start))
        {
            t_start = current.getHours() + ":" + (current.getMinutes() + 1);
        }

        if(t_start.indexOf(":") != -1)
        {
            var t_arr = t_start.split(":");
            if(t_arr.length == 2)
            {
                start.setHours(t_arr[0]);
                start.setMinutes(t_arr[1]);
            }
        }

        var cut_off_time_arr = cut_off_time.split(":");

        if ((getJSDate(start) == getJSDate(current)) || (getJSDate(start) == getJSDate(date_tomorrow) && ((current.getHours() > cut_off_time_arr[0]) || (current.getHours() == cut_off_time_arr[0] && current.getMinutes() > cut_off_time_arr[1]))))
        {
            return false;
        }
    }

    return true;
}

function checkDates(d_start, t_start, dateForProvider)
{
    if(t_start == "ANY")
    {
        t_start = "23:59";
    }

    if(t_start.indexOf(":") == -1)
    {
        t_start = '';
    }

    var current = dateForProvider || new Date();
    var start = new Date(d_start);

    if(t_start)
    {
        var t_arr = t_start.split(":");
        if(t_arr.length == 2)
        {
            start.setHours(t_arr[0]);
            start.setMinutes(t_arr[1]);
        }
    }

    if(current.getTime() > start.getTime())
    {
        return false;
    }

    return true;
}

function checkReturnJourneyDates(d_start, t_start, d_end, t_end, question_string)
{
    question_string = question_string || "You have selected a return on the same day as your outward journey. Are you sure about this?";
    var flag = false;

    if(t_start == "ANY")
    {
        t_start = "23:59";
    }

    if(t_end == "ANY")
    {
        flag = true;
        t_end = "23:59";
    }

    if(t_start.indexOf(":") == -1)
    {
        t_start = '';
    }

    if(t_end.indexOf(":") == -1)
    {
        t_end = '';
    }

    var start = new Date(d_start);

    if(t_start)
    {
        var t_arr = t_start.split(":");
        if(t_arr.length == 2)
        {
            start.setHours(t_arr[0]);
            start.setMinutes(t_arr[1]);
        }
    }

    var end   = new Date(d_end);

    if(t_end)
    {
        var t_arr = t_end.split(":");
        if(t_arr.length == 2)
        {
            end.setHours(t_arr[0]);
            end.setMinutes(t_arr[1]);
        }
    }

    if(start.getTime() > end.getTime())
    {
        return false;
    }
    else if (start.getTime() == end.getTime() && flag)
    {
        return confirm(question_string);
    }

    return true;
}

function checkReturnJourneyFlightDates(d_start, t_start, d_end, t_end, startFlightArrivals, endFlightArrivals)
{
    var start = new Date(d_start);

    var t_arr = t_start.split(":");
    start.setHours(t_arr[0]);
    start.setMinutes(t_arr[1]);

    var end = new Date(d_end);

    var t_arr = t_end.split(":");
    end.setHours(t_arr[0]);
    end.setMinutes(t_arr[1]);

    if (startFlightArrivals == "P")
    {
        start.setDate(start.getDate() - 1);
    }
    else if (startFlightArrivals == "N")
    {
        start.setDate(start.getDate() + 1);
    }

    if (endFlightArrivals == "P")
    {
        end.setDate(end.getDate() - 1);
    }
    else if (endFlightArrivals == "N")
    {
        end.setDate(end.getDate() + 1);
    }

    if(start.getTime() > end.getTime())
    {
        return false;
    }

    return true;
}

function getStringDate(date)
{
    return (date.substring(4, 6) + "/" + date.substring(6, 8) + "/" + date.substring(0, 4));
}

var updateReturn = true;

function checkAvailableTime(fld, cur_mode)
{
    switch(fld.name)
    {
        case 'departuring':
        {
            if(cur_mode != 3)
            {
                updateT(frm.departure_time, frm.going, frm.departuring);
            }
            else
            {
                updateT3(frm.departure_time, frm.leaving, frm.departuring);
            }
            break;
        }
        case 'returning':
        {
            updateTR(frm.return_time, frm.going, frm.returning);
            break;
        }
    }

    if(cur_mode == 2 && fld.name == 'departuring' && updateReturn)
    {
        updateDateField('main', 'returning', new Date(getStringDate(fld.value)));
        updateTR(frm.return_time, frm.going, frm.returning);
    }

    updateReturn = true;
}

function inArr(arr, val)
{
    for(var i in arr)
    {
        if(arr[i] == val)
        {
            return true;
        }
    }
    return false;
}

function hideUnavailableDates(point, dates, direction, id_journey)
{
    var dates_select = new Object();
    var months_select = new Object();
    var years_select = new Object();

    if (direction == "departure")
    {
        dates_select = getElem("_day_departuring");
        months_select = getElem("_month_departuring");
        years_select = getElem("_year_departuring");

    }
    else
    {
        dates_select = getElem("_day_returning");
        months_select = getElem("_month_returning");
        years_select = getElem("_year_returning");
    }
        
        var selectedValue = dates_select[dates_select.selectedIndex].value;
    var end_day = getDaysInMonthF(new Date(getStringDate(dates.value)));
        

    var dates_array = new Array();

    for(var i = 1; i <= end_day; i++)
    {
        dates_array[i] = "enabled";
    }

    var opts_dates = new Object();

    for(var i = 1; i <= end_day; i++)
    {
        opts_dates[i] = new ListItem(makeTwoDigit(i), i);
    }

    if (dates_select.options.length < end_day)
    {
        clearSelect(dates_select);
        setupSelect(dates_select, opts_dates);
        setSelected(dates_select, selectedValue);

        var arr_times   = new Array();
        var flag        = true;
    }

    for (var date = 1; date <= end_day; date++)
    {
        var date_for_season = new Date(getStringDate(dates.value));
        date_for_season.setDate(date);

        var season_id = 0;//getSeasonId(seasons[getDataFromCompositeValue(point, 0)], getJSDate(date_for_season));

        source_variable = (season_id) ? seasons[getDataFromCompositeValue(point, 0)][season_id].times : routes[point].t;

        arr_times = new Array();

        if (source_variable != "")
        {
            arr_times = source_variable.split(",");
        }

        source_variable = (season_id) ? seasons[getDataFromCompositeValue(point, 0)][season_id] : routes[point];

        for (var j = 0; j < arr_times.length; j++)
        {
            flag = true;

            var weekDay = date_for_season.getDay();

            if (no_run[id_journey] && inArr(no_run[id_journey].split(","), weekDay))
            {
                flag = false;
                break;
            }

            var no_run_days_array = null;
            var run_dates_array = null;

            var date_periods_count = 1;

            var run_dates_periods_array = new Array();

            if (source_variable.dr[arr_times[j]] && source_variable.dr[arr_times[j]] != "")
            {
                run_dates_periods_array = source_variable.dr[arr_times[j]].split("|");
                date_periods_count = run_dates_periods_array.length;
            }

            var no_run_days_periods_array = new Array();

            if (source_variable.nr[arr_times[j]] && source_variable.nr[arr_times[j]] != "")
            {
                no_run_days_periods_array = source_variable.nr[arr_times[j]].split("|");
            }

            for (var i = 0; i < date_periods_count; i++)
            {
                run_dates = run_dates_periods_array[i];
                no_run_days = no_run_days_periods_array[i];

                if (run_dates)
                {
                    var run_dates_array = run_dates.split("-");

                    for (var index in run_dates_array)
                    {
                        run_dates_array[index]   = new Date(getStringDate(run_dates_array[index]));
                    }

                    if (run_dates_array[0] > run_dates_array[1])
                    {
                        var temp            = run_dates_array[0];
                        run_dates_array[0]  = run_dates_array[1];
                        run_dates_array[1]  = temp;
                    }

                    if (date_for_season >= run_dates_array[0] && date_for_season <= run_dates_array[1])
                    {
                        flag = checkNoRunDaysForHide(no_run_days, date_for_season);
                        break;
                    }
                    else
                    {
                        flag = false;
                    }
                }
                else
                {
                    flag = checkNoRunDaysForHide(no_run_days, date_for_season);
                    break;
                }
            }

            if (flag)
            {
                break;
            }
        }

        if (!flag || arr_times.length == 0)
        {
            for(var i = 0; i < dates_select.options.length; i++)
            {
                if(parseInt(dates_select.options[i].value, 10) == parseInt(date, 10))
                {
                    var child = dates_select.options[i];
                    dates_select.removeChild(child);
                    dates_array[parseInt(date, 10)] = "";
                    break;
                }
            }
        }
    }

    var output_date = null;

    if (dates_array[parseInt(selectedValue, 10)] != "enabled")
    {
        var date_selected = new Date(getStringDate(dates.value));

        for (var j = 1; j <= end_day; j++)
        {
            if (dates_array[j] == "enabled" && (direction == "departure" ? (date_selected.setDate(j) >= new Date(getStringDate(default_date))) : (date_selected.setDate(j) > new Date(getStringDate(getElem("departuring").value)))))
            {
                output_date = j;
                break;
            }
        }

        if (output_date)
        {
            date_selected.setDate(output_date);
            setSelected(dates_select, makeTwoDigit(output_date));
        }
        else
        {
            clearSelect(dates_select);

//            getNextAvailableDate(point, id_journey, dates.value);

            if (nextAvailableDate && !(direction != "departure" && getElem("_day_departuring").options[0].text == "n/a"))
            {
                setupSelect(dates_select, opts_dates);

                var nextAvailableDateJS = new Date(getStringDate(String(nextAvailableDate)));

                setSelected(dates_select, makeTwoDigit(nextAvailableDateJS.getDate()));
                setSelected(months_select, monthShort[nextAvailableDateJS.getMonth()]);
                setSelected(years_select, nextAvailableDateJS.getFullYear());

                updateReturn = false;
            }
            else
            {
                var cur_date = date_selected.getDate();
                var opts    = new Object();
                opts[0]     = new ListItem(makeTwoDigit(cur_date), "N/A");

                setupSelect(dates_select, opts);
                return;
            }
        }

        updateDate(dates_select, months_select, years_select, dates);
    }
    else
    {
        setSelected(dates_select, makeTwoDigit(parseInt(selectedValue, 10)));
    }
}

function checkNoRunDaysForHide(no_run_days, date_selected)
{
    var flag = true;

    if (no_run_days)
    {
        no_run_days_array = no_run_days.split(",");
        var weekDay = date_selected.getDay();
        flag = !inArr(no_run_days_array, weekDay);
    }

    return flag;
}

function getSeasonId(seasons, date)
{
    var used_season_id = 0;

    if (!seasons)
    {
        return 0;
    }

    for (var id_season in seasons)
    {
        var season_dates = seasons[id_season].dates.split(",");

        for (var i = 0; i < season_dates.length; i++)
        {
            if (date == season_dates[i])
            {
                used_season_id = id_season;
                return used_season_id;
            }
        }
    }

    return used_season_id;
}

function getDataFromCompositeValue(value, i)
{
    var result = "";
    var tmp_arr = value.split("_");

    if (tmp_arr.length >= i + 1)
    {
        result = tmp_arr[i];
    }

    return result;
}

function getDaysInMonthF(oDate)
{
    var days;
    var month = oDate.getMonth()+1;
    var year  = oDate.getFullYear();

    // RETURN 31 DAYS
    if (month==1 || month==3 || month==5 || month==7 || month==8 ||
        month==10 || month==12)  {
        days=31;
    }
    // RETURN 30 DAYS
    else if (month==4 || month==6 || month==9 || month==11) {
        days=30;
    }
    // RETURN 29 DAYS
    else if (month==2)  {
        if (isLeapYear(year)) {
            days=29;
        }
        // RETURN 28 DAYS
        else {
            days=28;
        }
    }
    return (days);
}

function isLeapYearF(Year)
{
    if (((Year % 4)==0) && ((Year % 100)!=0) || ((Year % 400)==0)) {
        return (true);
    }
    else
    {
        return (false);
    }
}

function setNextAvailableTime(date, sel, arr, direction)
{
    var date_now = new Date();
    date_now.setSeconds(0);

    if (getJSDate(date_now) == date)
    {
        var time_arr = new Array();

        var flag = false;
        var setConcreteTime = true;

        for (var j in arr)
        {
            time_arr = arr[j].id.split(":");

            if (time_arr.length != 2)
            {
                setConcreteTime = arr[j].id != "N/A";

                if (arr[j].id == "ANY")
                {
                    flag = true;
                    break;
                }

                continue;
            }

            date_now.setHours(time_arr[0]);
            date_now.setMinutes(getDataFromCompositeValue(time_arr[1], 0));

            if (date_now > new Date())
            {
                if (setConcreteTime)
                {
                    setSelected(sel, arr[j].id);
                }

                flag = true;
                break;
            }
        }

        if (!flag && !terminalMode)
        {
            date_now = new Date(getStringDate(date));
            date_now.setDate(date_now.getDate() + 1);

            var date = makeTwoDigit(date_now.getDate());
            var month = monthShort[date_now.getMonth()];
            var year = date_now.getFullYear();

            var dayField = new Object();
            var monthField = new Object();
            var yearField = new Object();
            var dateField = new Object();

            if (direction == "departuring")
            {
                dayField = document.main._day_departuring;
                monthField = document.main._month_departuring;
                yearField = document.main._year_departuring;
                dateField = document.main.departuring;
            }
            else
            {
                dayField = document.main._day_returning;
                monthField = document.main._month_returning;
                yearField = document.main._year_returning;
                dateField = document.main.returning;
            }

            setSelected(dayField, date);
            setSelected(monthField, month);
            setSelected(yearField, year);

            updateDate(dayField, monthField, yearField, dateField);
        }
    }
}

function changeTimeFieldsVisibility(arr, sel)
{
    var block = getElem("block_" + sel.name);

    if (!block || block.id != "block_" + sel.name)
    {
        return;
    }

    if (getArrayLength(arr) == 1)
    {
        block.style.visibility = (arr[0].id == "ANY") ? "hidden" : "visible";
    }
    else
    {
        block.style.visibility = (!getArrayLength(arr)) ? "hidden" : "visible";
    }
}

function fillTimesArray(point, dates, used_season_id, id_journey, direction)
{
    if (typeof(point) != "undefined")
        show(getElem(direction + "_times_loading_image"));
    else
    {
        var arr = new Array();
        arr.unshift(new ListItem("N/A", "N/A"));
        return arr;
    }

    var leavingSelect = getElem("leaving");
    var goingSelect = getElem("going");

    if(leavingSelect)
    {
        leavingSelect.disabled = true;
    }

    if (goingSelect)
    {
        goingSelect.disabled = true;
    }

    getRouteTimes(point, id_journey, dates.value, used_season_id, direction);
    getRouteFlights(point, id_journey, used_season_id, dates.value);

    if(leavingSelect)
    {
        leavingSelect.disabled = false;
    }
    if (goingSelect)
    {
        goingSelect.disabled = false;
    }

    hideUnavailableDates(point, dates, direction, id_journey, used_season_id);

    hide(getElem(direction + "_times_loading_image"));

    var arr = new Array();

    var flag = true;

    if (used_season_id)
    {
        var time_flights = new Object();
        var season_times = seasons[getDataFromCompositeValue(point, 0)][used_season_id].times.split(",");

        if (season_times.length == 0)
        {
            return;
        }

        if (getArrayLength(seasons[getDataFromCompositeValue(point, 0)][used_season_id].flights) > 0)
        {
            flag = false;
        }

        for (var i = 0; i < season_times.length; i++)
        {
            if (!checkNoRunSeasonTime(getDataFromCompositeValue(point, 0), used_season_id, season_times[i], dates.value))
            {
                if (seasons[getDataFromCompositeValue(point, 0)][used_season_id].flights && getArrayLength(seasons[getDataFromCompositeValue(point, 0)][used_season_id].flights[season_times[i]]) > 0)
                {
                    time_flights = seasons[getDataFromCompositeValue(point, 0)][used_season_id].flights[season_times[i]];

                    for (var id_flight in time_flights)
                    {
                        arr.push(new ListItem(season_times[i] + "_" + id_flight, time_flights[id_flight].flight_number));
                    }
                }
                else if (flag)
                {
                    arr.push(new ListItem(season_times[i], (/ANY/.test(season_times[i]) ? ANY_TITLE : season_times[i])));
                }
            }
        }
    }
    else
    {
        var vals = String(routes[point].t).split(',');

        if (vals.length == 0)
        {
            return;
        }

        if (getArrayLength(routes[point].flights) > 0)
        {
            flag = false;
        }

        for(var i in vals)
        {
            if(!checkNoRunTime(point, vals[i], dates.value))
            {
                if (routes[point].flights && getArrayLength(routes[point].flights[vals[i]]) > 0)
                {
                    for (var id_flight in routes[point].flights[vals[i]])
                    {
                        arr.push(new ListItem(vals[i] + "_" + id_flight, routes[point].flights[vals[i]][id_flight].flight_number));
                    }
                }
                else if (flag)
                {
                    arr.push(new ListItem(vals[i], (/ANY/.test(vals[i]) ? ANY_TITLE : vals[i])));
                }
            }
        }
    }

    arr.sort(compareNames);

    if (!flag)
    {
        arr.unshift(new ListItem("N/A", "N/A"));
    }

    return arr;
}
function updateSelectors(input)
{
    if (input == "departuring" || input == "returning")
    {
        checkAvailableTime(document.getElementById(input), cur_mode);

       
    }
    else
    {
        setVisualDate(document.getElementById(input));
    }
}
