﻿this.ascent = this.ascent || {};
this.ascent.cms = this.ascent.cms || {};
this.ascent.cms.widgets = this.ascent.cms.widgets || {};
this.ascent.cms.widgets.pricesearch = this.ascent.cms.widgets.pricesearch || {};
this.ascent.cms.widgets.pricesearch.ticketSearch = this.ascent.cms.widgets.pricesearch.ticketSearch || {};

this.ascent.cms.widgets.pricesearch.ticketSearch.baseUrl = {
	agency: 'http://online.ascent-travel.ru/agent/',
	person: 'http://online.ascent-travel.ru/client/'
};

this.ascent.cms.widgets.pricesearch.ticketSearch.classes = {
	"Y": "Эконом",
	"SUP": "Эконом Super",
	"BUD": "Эконом Budget",
	"ECO": "Эконом Econom",
	"FUL": "Эконом Full",
	"C": "Бизнес-Класс",
	"BUS": "Бизнес-Класс"
};

this.ascent.cms.widgets.pricesearch.ticketSearch.tableColumns = [
	{ name: "Откуда - Куда", width: 130 },
	{ name: "Авиакомпания", width: 160 },
	{ name: "Номер рейса", width: 100 },
	{ name: "Дата и время вылета", width: 150 },
	{ name: "Тариф", width: 90 },
	{ name: "Цена", width: 130 }
];


function sortByCity(a, b) {
	var cityA = a.CityName.toTitleCase();
	var cityB = b.CityName.toTitleCase();
	if (cityA == cityB) {
		return 0;
	}
	else {
		if (cityA < cityB) {
			return -1;
		}
		else {
			return 1;
		}
	}
}

sortByPrior = function (o1, o2) {
	if (o1.prior < 0) {
		return 1;
	}
	if (o2.prior < 0) {
		return -1;
	}
	return o1.prior - o2.prior;
}

if (!this.ascent.cms.widgets.pricesearch.ticketSearch.initializeControls) {
    this.ascent.cms.widgets.pricesearch.ticketSearch.initializeControls =
	function ($, options) {
	    var defaults =
		{
		    tableHeight: 300,
		    notFound: "Поиск не дал результатов. Измените параметры и повторите попытку"
		};

	    var settings = $.extend(true, {}, defaults, options);
	    var $container = options.container;

	    var $form = $container.find("form");


	    var $departureCity = $("select[name='departureCity']", $form)
			.hintableSelect({ text: "Выберите город вылета" });
	    var $arrivalCity = $("select[name='arrivalCity']", $form)
			.hintableSelect({ text: "Выберите город прилета" });

	    var $departureDate = $("input[name='departureDate']", $form);
	    var $arrivalDate = $("input[name='arrivalDate']", $form);
	    var $isRT = $(":radio", $form);
	    var $ow = $(":radio#ow", $form);
	    var $rt = $(":radio#rt", $form);
	    var $ticketsCount = $("input[name='TicketsCount']", $form);
	    //var $submit = $(":button", $form);
	    var $submit = $(":submit[name='tsbutton']", $form);

	    var $loading = $("div.loading", $container);
	    var $content = $("div.content", $container);
	    var $breadcrumbs = $(".breadcrumbs", $container);
	    var $bookButton = $(".book-button", $container);
	    var $bookingButton = $(".btn-booking", $container);
	    var $error = $(".error", $container).hide();
	    var $personButton = $(".person-button", $container);
	    var $agencyButton = $(".agency-button", $container);

	    var $bookContainer = $(".book-wrapper", $container);
	    var $bookQuestionContainer = $(".book-question", $container);

	    var $hint = $("#hint", $container).hint({
	        notFound: "К сожалению, билетов в выбранные пункты нет",
	        selectDepartureDate: "Cначала выберите дату вылета",
	        noArrivalDate: "К сожалению, обратных рейсов на данные числа нет"
	    });

	    $isRT
		.bind("focus.hint", $hint.hide)
		.change(function () {
		    $arrivalDate.attr("disabled", !$rt.attr("checked") || $rt.attr("disabled"));
		    if ($arrivalDate.attr("disabled")) {
		        $arrivalDate.val("").removeData("dates");
		    }
		    else {
		        if ($departureDate.val()) {
		            getArrivalDates($departureDate.val());
		        }
		    }
		});




	    var getArrivalDates = function (str, date) {
	        $loading.show();
	        var jsSearchFilter = {};
	        jsSearchFilter.flightSearchParams = {};
	        jsSearchFilter.flightSearchParams.ctfrom = $departureCity.val();
	        jsSearchFilter.flightSearchParams.ctto = $arrivalCity.val();
	        jsSearchFilter.flightSearchParams.tdate = $departureDate.val();
	        $.get(settings.ajaxUrls.getBackDates,
				{ token: 1, jsFlightSearchFilter: JSON.stringify(jsSearchFilter) },
				function (data) {
				    var departureDate = $departureDate.val().constructDate();
				    var dates = $.grep($.map(data, function (e, i) { return e.dt; }), function (e, i) { return departureDate <= e.constructDate(); });
				    if (dates) {
				        $arrivalDate.data("dates", dates);
				        if (!dates.length) {

				            $ow.attr("checked", true).trigger("change");
				            $rt.attr("disabled", true);
				            $hint.show("noArrivalDate");
				            //$arrivalDate.val("");
				        }
				        else {
				            if ($rt.attr("checked")) {
				                var d = dates[0].constructDate();
				                d.setDate(d.getDate() + 7);

				                if ($.inArray(d.formatRussian(), dates) == -1) {
				                    var darr = $.grep(dates, function (e, i) { return e.constructDate() <= d; })
				                    d = darr[darr.length - 1];
				                }

				                $arrivalDate.datepicker("setDate", d);
				            }
				        }
				    }
				    $loading.hide();
				}, "json");
	    }

	    /*   Datepickers ------------------------------------- */

	    $departureDate
		.datepicker({
		    minDate: new Date(),
		    showAnim: 'fadeIn',
		    beforeShowDay: function (date) {
		        var dates = $departureDate.data("dates");
		        if (dates) {
		            if ($.inArray(date.formatRussian(), dates) > -1) {
		                return [true, ''];
		            }
		            else {
		                return [false, ''];
		            }
		        }
		        else {
		            // error
		            return [false, ''];
		        }
		    },
		    onSelect: getArrivalDates
		});

	    $arrivalDate
		.datepicker({
		    onOpen: function () {
		        var dates = $arrivalDate.data("dates");
		        if (dates && dates.length) {
		            if (dates.length) {
		                return true;
		            }
		            else {
		                $hint.show("noArrivalDate");
		            }
		        }
		        else {
		            $hint.show("selectDepartureDate");
		            return false;
		        }
		    },
		    minDate: new Date(),
		    showAnim: 'fadeIn',
		    // если dateBegin >= dateEnd, то такая конечная дата становится неактивной
		    beforeShowDay: function (date) {
		        var dates = $arrivalDate.data("dates");
		        var departureDate = $.trim($departureDate.val());
		        if (departureDate && dates) {
		            if ($.inArray(date.formatRussian(), dates) != -1) {
		                if (departureDate !== "" && date >= departureDate.constructDate()) {
		                    return [true, ''];
		                }
		                else {
		                    return [false, ''];
		                }
		            }
		            else {
		                return [false, ''];
		            }
		        }
		        else {
		            return [false, ''];
		        }
		    }
		})
		.bind("focus.hide", function (event) {
		    $departureDate.datepicker("hide");
		});


	    //Инициализируем валидную дату
	    if (settings.initDates) {
	        var datesInit = settings.initDates.DatesInit.split(',');
	        var datesInitBack = settings.initDates.DatesInitBack.split(',');
	        var dateTo = settings.initDates.DateToCurr;
	        var dateFrom = settings.initDates.DateFromCurr;
	        $departureDate.attr("disabled", false).data("dates", datesInit).datepicker("option", "minDate", datesInit[0].constructDate()).val(dateTo);
	        $arrivalDate.attr("disabled", false).data("dates", datesInitBack).datepicker("option", "minDate", datesInitBack[0].constructDate()).val(dateFrom);
	    }


	    if (settings.initParams) {
	        $.get(settings.ajaxUrls.getDepartureCities,
			{ token: 1 },
			function (data) {
			    var foreignCities = $(data).filter(function (i) { return data[i].CountryKey != 460 });
			    var originCities = $(data).filter(function (i) { return data[i].CountryKey == 460 });
			    var cities = data.sort(sortByCity);
			    $departureCity.empty();

			    $.each(originCities, function (i, e) {
			        if (!$departureCity.find("option[value=" + e.CityKey + "]").size()) {
			            $departureCity.append(
                            $("<option>", { value: e.CityKey })
                            .addClass(e.CountryKey == 460 ? "origin" : "foreign")
                            .text(e.CityName.toTitleCase() + " (" + e.CountryName.toTitleCase() + ")")
                        );
			        }
			    });

			    if (originCities.size() > 0) {
			        $departureCity.append($("<option disabled>"));
			    }

			    $.each(foreignCities, function (i, e) {
			        if (!$departureCity.find("option[value=" + e.CityKey + "]").size()) {
			            $departureCity.append(
                            $("<option>", { value: e.CityKey })
                            .addClass(e.CountryKey == 460 ? "origin" : "foreign")
                            .text(e.CityName.toTitleCase() + " (" + e.CountryName.toTitleCase() + ")")
                        );
			        }
			    });
			    $departureCity.appendHint().attr("selectedIndex", 0);
			    $loading.hide();
			},
		"json");
	    }

	    $departureCity.bind("change", function () {
	        $loading.show();

	        $isRT.add($departureDate).add($arrivalDate)
			.attr({
			    disabled: function () { return true; }
			    //value: function () { return ""; }
			})
			.filter(":radio#rt").attr("checked", true).trigger("change");

	        $arrivalCity.attr({
	            disabled: function () { return true; }
	        });

	        var jsSearchFilter = {};
	        jsSearchFilter.flightSearchParams = {};
	        jsSearchFilter.flightSearchParams.ctfrom = $departureCity.val();
	        $.get(settings.ajaxUrls.getArrivalCities,
				{ token: 1, jsFlightSearchFilter: JSON.stringify(jsSearchFilter) },
				function (data) {
				    var foreignCities = $(data).filter(function (i) { return data[i].CountryKey != 460 });
				    var originCities = $(data).filter(function (i) { return data[i].CountryKey == 460 });
				    var cities = data.sort(sortByCity);
				    $arrivalCity.empty();

				    $.each(originCities, function (i, e) {
				        if (!$arrivalCity.find("option[value=" + e.CityKey + "]").size()) {
				            $arrivalCity.append(
                            $("<option>", { value: e.CityKey })
                            .addClass(e.CountryKey == 460 ? "origin" : "foreign")
                            .text(e.CityName.toTitleCase() + " (" + e.CountryName.toTitleCase() + ")")
                        );
				        }
				    });

				    if (originCities.size() > 0) {
				        $arrivalCity.append($("<option disabled>"));
				    }


				    $.each(foreignCities, function (i, e) {
				        if (!$arrivalCity.find("option[value=" + e.CityKey + "]").size()) {
				            $arrivalCity.append(
                            $("<option>", { value: e.CityKey })
                            .addClass(e.CountryKey == 460 ? "origin" : "foreign")
                            .text(e.CityName.toTitleCase() + " (" + e.CountryName.toTitleCase() + ")")
                        );
				        }
				    });
				    $arrivalCity.appendHint().attr("selectedIndex", 0).attr("disabled", false);
				    $loading.hide();
				},
			"json");
	    });

	    $arrivalCity.bind("change", function () {
	        $loading.show();

	        $isRT.add($departureDate).add($arrivalDate)
			.attr({
			    disabled: function () { return true; }
			    // value: function () { return ""; }
			})
			.filter(":radio#rt").attr("checked", true).trigger("change");

	        var jsSearchFilter = {};
	        jsSearchFilter.flightSearchParams = {};
	        jsSearchFilter.flightSearchParams.ctfrom = $departureCity.val();
	        jsSearchFilter.flightSearchParams.ctto = $arrivalCity.val();
	        $.get(settings.ajaxUrls.getStraightDates,
				{ token: 1, jsFlightSearchFilter: JSON.stringify(jsSearchFilter) },
				function (data) {
				    var dates = $.map(data, function (e, i) { return e.dt; });
				    if (!dates.length) {
				        $hint.show("notFound");
				    }
				    else {
				        $departureDate
							.data("dates", dates).datepicker("option", "minDate", dates[0])
							.add($arrivalDate).add($isRT).attr("disabled", false);
				    }

				    $loading.hide();
				},
			"json");
	    });


	    /* -------------------------------------------------------------------------- */
	    function validate() {

	        var depc = $("#departure-city", "form#ticket-search").val();
	        var arrc = $("#arrival-city", "form#ticket-search").val();
	        var datd = $departureDate.val();

	        if (depc == "") {
	            alert("Выберите город вылета.");
	            return false;
	        }
	        if (arrc == "") {
	            alert('Выберите город прилета.');
	            return false;
	        }
	        if (datd == null || datd == "") {
	            alert('Введите дату вылета.');
	            return false;
	        }
	        return true;
	    }

	    $submit.bind("click", function () {
	        return validate();
	    });
	    /*
	    $submit.bind("click", function () {
	    $breadcrumbs.hide();
	    $content.empty();
	    $bookContainer.hide();
	    $bookButton.attr("disabled", true).toggleClass("disabled").show();
	    $bookQuestionContainer.hide();

	    var parameters = {
	    ctfrom: $departureCity.val(),
	    ctto: $arrivalCity.val(),
	    tdate: $departureDate.val(),

	    cur: "RUR"
	    };

	    var options = {
	    ctfrom: {
	    prior: 1,
	    name: "Город вылета",
	    elem: $departureCity,
	    // selector: "#" + $departureCity.attr("id"),
	    // context: $form,
	    valid: {
	    fn: $departureCity.isChanged,
	    errorMsg: "Выберите город вылета"
	    }
	    },
	    ctto: {
	    prior: 2,
	    name: "Город прилета",
	    elem: $arrivalCity,
	    // selector: "#" + $arrivalCity.attr("id"),
	    // context: $form,
	    valid: {
	    fn: $arrivalCity.isChanged,
	    errorMsg: "Выберите город прилета"
	    }
	    },
	    tdate: {
	    prior: 3,
	    name: "Дата вылета",
	    elem: $departureDate,
	    // selector: "#" + $departureDate.attr("id"),
	    // context: $form,
	    empty: true,
	    format: dateFormat
	    }
	    ,
	    ticketsCount: {
	    name: "Количество билетов",
	    elem: $ticketsCount,
	    empty: true,
	    length: 3,
	    format: /^\d+$/
	    }
	    };

	    if ($rt.attr("checked")) {
	    parameters.bdate = $arrivalDate.val();
	    options.bdate = {
	    prior: 4,
	    name: "Дата возврата",
	    elem: $arrivalDate,
	    // selector: "#" + $arrivalDate.attr("id"),
	    // context: $form,
	    empty: true,
	    format: dateFormat
	    };
	    }

	    var errorObj = $.goofDefence(parameters, options, false);
	    if (!$.isEmptyObject(errorObj)) {
	    var errorArr = new Array();
	    $.each(errorObj, function (i, e) {
	    errorArr.push($.extend({ name: i }, e));
	    });
	    $hint.show(errorArr.sort(sortByPrior)[0].error);
	    }
	    else {

	    var jsSearchFilter = {};
	    jsSearchFilter.flightSearchParams = parameters;



                
	    $.get(settings.ajaxUrls.getFlights,
	    { token: 1, jsFlightSearchFilter: JSON.stringify(jsSearchFilter) },
	    function (data) {

	    var flights = data;
	    if (!flights.length) {
	    $content.empty().append($("<h1 align='center'>" + settings.notFound + "</h1>"));
	    }
	    else {

	    var isRT = $rt.attr("checked");
	    $breadcrumbs.empty()
	    .append($("<span>").addClass('caption').text("Откуда: "))
	    .append($("<span>").addClass('value').text($departureCity.selectedText()))
	    .append($("<span>").addClass('caption').text("Куда: "))
	    .append($("<span>").addClass('value').text($arrivalCity.selectedText()));

	    if (isRT) {
	    $breadcrumbs
	    .append($("<span>").addClass('caption').text("Дата вылета туда: "))
	    .append($("<span>").addClass('value').text($departureDate.val()))
	    .append($("<span>").addClass('caption').text("Дата вылета обратно: "))
	    .append($("<span>").addClass('value').text($arrivalDate.val()));
	    }
	    else {
	    $breadcrumbs
	    .append($("<span>").addClass('caption').text("Дата вылета: "))
	    .append($("<span>").addClass('value').text($departureDate.val()));
	    }
	    $breadcrumbs.show();

	    var tableColumns = ascent.cms.widgets.pricesearch.ticketSearch.tableColumns;
                            
	    var generateTableFunction = ascent.cms.widgets.pricesearch.ticketSearch.generateTable;
	    $content.empty().append(generateTableFunction(flights,
	    $.map(tableColumns, function (e, i) { return e.name; })));
	    $("table", $content)
	    .ingrid(
	    {
	    url: settings.ajaxUrls.getFlights,
	    dataType: "jsonp",
	    height: settings.tableHeight,
	    colWidths: $.map(tableColumns, function (e, i) { return e.width; }),
	    //extraParams: parameters,
	    //searchFilter: searchFilter,
	    resizableCols: false,
	    unsortableCols: [],
	    rowHoverClass: '',
	    //totalRecords: totalRecords,
	    sorting: false,
	    paging: false,
	    scrolling: false
	    });
	    $bookContainer.show();
                            
	    }
	    },
	    "json");
	    }
	    return false;
	    });

	    */

	}
}


