﻿//include common.js
//document.write("<script src=\"" + "common.js" + "\" type=\"text/javascript\"></script>");

var Ascent = Ascent || {};
Ascent.Search = Ascent.Search || {};
Ascent.Search.AgencyTourSearch = Ascent.Search.AgencyTourSearch || {};
Ascent.Search.AgencyTourSearch.generateTable = 
	function (searchItems, settings/*hash, columnNames*/) {
        var tableStr = "<table>";
        var i = 0;
		var columnNames = $.map(settings.tableColumns, function (e, i) { return e.name; });
		var hash = settings.hash;
		// если переданы columnNames, то вставляем в таблице секцию <thead></thead>
        if (columnNames) {
            tableStr += "<thead><tr>";
            for (i = 0; i < columnNames.length; i++) {
                tableStr += "<th>" + columnNames[i] + "</th>";
            }
            tableStr += "</tr></thead>";
        }

		// вставляем секцию <tbody></tbody>
        tableStr += "<tbody>";
	    for (i = 0; i < searchItems.length; i++) {
			var item = searchItems[i];
			var acc = $.trim(item.AccomodationName);
			var hotelName = item.HotelName.contains("(") && item.HotelName.contains(")") 
				? $.trim(item.HotelName.slice(0, item.HotelName.indexOf("("))) 
				: $.trim(item.HotelName);
			var bookFormHref = 'http://www.ascent-travel.ru/admin/BookTour/Show?priceKey=' + item.PriceKey
                + '&date=' + searchItems[i].TourDateLong + '&hash=' + hash 
				+ '&hotel=' + hotelName + "&acc=" + acc + "&price=" + item.Price;
	        /*var simpleBasketHref = 'http://www.ascent-travel.ru/MasterWebStandard1/SimpleBasket.aspx?priceKey=' + searchItems[i].PriceKey
                + '&date=' + searchItems[i].TourDateLong;
			*/
	        var hotelQuota = new Ascent.Library.Classes.Quota(item.HotelQuota);
	        var aviaQuota = new Ascent.Library.Classes.Quota([item.CharterThereQuota, item.CharterBackQuota]);

	        tableStr += "<tr>";
	        if (item.HotelURL != "" && settings.showHotelLinks)
	            tableStr += "<td><a href='" + item.HotelURL + "' target='_blank' >" + hotelName + "</a></td>"
	        else
	            tableStr += "<td>" + hotelName + "</td>";

	        tableStr += "<td>" + item.RoomName + "</td>";
	        tableStr += "<td>" + item.RoomCategoryName + "</td>";
	        tableStr += "<td>" + item.AccomodationName + "</td>";
	        tableStr += "<td>" + item.PansionName + "</td>";
	        tableStr += "<td>" + item.Nights + "</td>";
	        tableStr += "<td class='" + hotelQuota.cssClass + "'>"
                + "<a class='iframe' "
                    + " href='" + bookFormHref + "'>"
                + item.Price + " " + (item.Currency != "рб" ? item.Currency : "руб.") + "</a></td>";
	        tableStr += "<td class='" + aviaQuota.cssClass + "'><img src='" + aviaQuota.img + "' width='14'></td>";
	        tableStr += "<td>" + item.TourDateLong + "</td>";
	        tableStr += "</tr>";
	    }
	    tableStr += "</tbody></table>";

	    return tableStr;
    };

(function ($) {

    $.fn.tourSearch = function (config) {
	
		if (!this.length) {
			// элемент не определен
			return this;
		}
	
        var $form = $(this);
        var $content = $("div.content");
        var $breadcrumbs = $("div.breadcrumbs");
        var $loading = $("div.loading").show();

        var defaults =
        {
            recordsPerPage: 40,
			tableHeight: 300,
            tableColumns:
            [
                { name: "Название отеля", width: 198 }, 
				{ name: "Номер", width: 52 },
				{ name: "Категория", width: 90 },
				{ name: "Размещение", width: 90 },
				{ name: "Пансион", width: 65 },
				{ name: "Ночи", width: 45 },
                { name: "Цена тура", width: 80 },
				{ name: "<img src='http://www.ascent-travel.ru/images/icons/plane-icon.png' width='16'>", width: 30 },
				{ name: "Дата заезда", width: 83 }
            ],

            departureCityCode: 1,
            departureCityName: "Москва",
            nights: { begin: 4, end: 21, bottom: 7, top: 14 },
            adults: { begin: 1, end: 10, selected: 2 },
            children: { begin: 0, end: 10, selected: 0 },

            notFound: "Поиск не дал результатов. Измените параметры и повторите попытку",

            formText:
            {
                country: { hintText: "Выберите страну", errorText: "К сожалению, на данный момент предложений в '%%' нет." },
                resort: { hintText: "Выберите регион", errorText: "К сожалению, на данный момент предложений в '%%' нет." },
                city: { hintText: "Выберите курорт", errorText: "К сожалению, на данный момент предложений в '%%' нет." },
                stars: { hintText: "Выберите звездность", errorText: "К сожалению, на данный момент предложений в '%%' нет." },
                tourType: { hintText: "Выберите тип тура", errorText: "К сожалению, на данный момент предложений с типом '%%' нет." }
            },

            breadcrumbsText:
            {
                departure: "Вылет",
                resort: "Курорт",
                hotel: ["Отель", "Звездность"]
            },

            costHint: { color: "gray", text: "Опционально" },

            elementIDs:
            {
                nightsTo: "nightsTo", nightsFrom: "nightsFrom",
                adults: "adults", children: "children",
                currency: "currency",

                country: "country",
                resort: "resort",
                city: "city",
                stars: "stars",
                tourType: "tourType",

                dateFrom: "dateFrom",
                dateTo: "dateTo",
                cost: "cost",

                submit: "button"
            },

            serviceFolderPath: "http://www.ascent-travel.ru/admin/",
            megatecServiceFolderPath: "http://www.ascent-travel.ru/Services/",
			
			showHotelLinks: true,
			countries: [],
			hash: ""
        };
        var serviceFolderPath = defaults.serviceFolderPath;
        var megatecServiceFolderPath = defaults.megatecServiceFolderPath;
        var settings = $.extend(true, {}, defaults, config);
		
		if (!settings.hash) {
			alert("Вставьте полученный код в инициализационный скрипт!"); 
			return false;
		}		

        

        // инициализируем поля формы соответствующими значениями
        var $nightsTo = $("select#" + settings.elementIDs.nightsTo, $form);
        var $nightsFrom = $("select#" + settings.elementIDs.nightsFrom, $form);
        var $adults = $("select#" + settings.elementIDs.adults, $form);
        var $children = $("select#" + settings.elementIDs.children, $form);

        var $country = $("select#" + settings.elementIDs.country, $form)
			.hintableSelect({text: settings.formText.country.hintText})
			.data("errorText", settings.formText.country.errorText);
        var $resort = $("select#" + settings.elementIDs.resort, $form)
			.hintableSelect({text: settings.formText.resort.hintText})
			.data("errorText", settings.formText.resort.errorText);
        var $city = $("select#" + settings.elementIDs.city, $form)
			.hintableSelect({text: settings.formText.city.hintText})
			.data("errorText", settings.formText.city.errorText);
        var $stars = $("select#" + settings.elementIDs.stars, $form)
			.hintableSelect({text: settings.formText.stars.hintText})
			.data("errorText", settings.formText.stars.errorText);
        var $tourType = $("select#" + settings.elementIDs.tourType, $form)
			.hintableSelect({text: settings.formText.tourType.hintText})
			.data("errorText", settings.formText.tourType.errorText);
        var $currency = $("select#" + settings.elementIDs.currency, $form);

        var $dateFrom = $("input#" + settings.elementIDs.dateFrom, $form);
        var $dateTo = $("input#" + settings.elementIDs.dateTo, $form);
        var $cost = $("input#" + settings.elementIDs.cost, $form);
        var $submit = $("input#" + settings.elementIDs.submit, $form);

        for (i = settings.nights.begin; i <= settings.nights.end; i++) {
            if (i != settings.nights.begin) {
                $nightsTo.append($("<option value=" + i + (i == settings.nights.top ? " selected" : "") + ">" + i + "</option>"));
            }
            if (i != settings.nights.end) {
                $nightsFrom.append($("<option value=" + i + (i == settings.nights.bottom ? " selected" : "") + ">" + i + "</option>"));
            }
        }

        for (i = settings.adults.begin; i <= settings.adults.end; i++) {
            $adults.append($("<option value=" + i + (i == settings.adults.selected ? " selected" : "") + ">" + i + "</option>"));
        }

        for (i = settings.children.begin; i <= settings.children.end; i++) {
            $children.append($("<option value=" + i + (i == settings.children.selected ? " selected" : "") + ">" + i + "</option>"));
        }

        // ограничиваем возможность выбора пункта select#nightFrom только теми, что больше выбранного пункта в select#nightTo
        $nightsFrom.change(function () {
            var fromValue = $(this).val();
            var toValue = $nightsTo.val();
            var selectedChanged = false;
            $("option", $nightsTo).each(function (i, e) {
                if (parseInt(e.value) <= parseInt(fromValue)) {
                    e.disabled = true;
                }
                else {
                    if (!selectedChanged && parseInt(toValue) <= parseInt(fromValue)) {
                        selectedChanged = true;
                        e.selected = true;
                    }
                    e.disabled = false;
                }
            });
        });
		
		$dateFrom.val("").datepicker(
			{
				minDate: $dateFrom.data("dates") ? $dateFrom.data("dates")[0] : new Date(),
				showAnim: 'fadeIn',
				beforeShowDay: function (date) {
					if ($.inArray(date.formatRussian(), $dateFrom.data("dates")) > -1) {
						return [true, ''];
					}
					else {
						return [false, ''];
					}
				},
				onSelect: function (str, date) {
					$dateTo.datepicker("setDate", str);
				}
			}
		);
		
		$dateTo.val("").datepicker(
			{
				minDate: $dateTo.data("dates") ? $dateTo.data("dates")[0] : new Date(),
				showAnim: 'fadeIn',
				// если dateFrom >= dateTo, то такая конечная дата становится неактивной
				beforeShowDay: function (date) {
					var dateFrom = $dateFrom.val().trim();

					if ($.inArray(date.formatRussian(), $dateTo.data("dates")) > -1) {
						if (dateFrom !== "" && date >= dateFrom.constructDate()) {
							return [true, ''];
						}
						else {
							return [false, ''];
						}
					}
					else {
						return [false, ''];
					}
				}
			}
		);

        $cost.hintableInput(settings.costHint);

        $form.ajaxError(function (e, xhr, settings, exception) {
            alert("Произошла ошибка AJAX");
        });

        //-------------------------------------------------------------------------------------------------------------------------------------------

        $.get(serviceFolderPath + "TourSearch/GetCountriesJsonp", { officeCode: settings.departureCityCode },
        function (data) {
			var countries = data;
			var optionsString = "";
			for (var i in countries) {
				var e = countries[i];
				if (!settings.countries.length || $.inArray(e, settings.countries) > -1) {
					optionsString += "<option value=" + e + ">" + i + "</option>";
				}
			}			
			
            $country.appendHint().append(optionsString).attr("disabled", false).attr("selectedIndex", 0);
            $loading.hide();
        }, "jsonp");

        $country.change(function () {
            $loading.show();
            $resort.attr("selectedIndex", 0).attr("disabled", true);
            $city.attr("selectedIndex", 0).attr("disabled", true);
            $stars.attr("selectedIndex", 0).attr("disabled", true);
			$tourType.attr("selectedIndex", 0).attr("disabled", true);
            
            $dateFrom.val("").attr("disabled", true);
            $dateTo.val("").attr("disabled", true);

            // грузим содержимое select#resort
            $.get(serviceFolderPath + "TourSearch/GetResortsJsonp", { countryCode: $country.val(), officeCode: settings.departureCityCode },
            function (data) {
                var resorts = data;
                if ($.isEmptyObject(resorts)) {
                    alert($country.data("errorText").replace("%%", $country.selectedText()));                    
                }
                else {
                    var optionsString = ""
                    if (!resorts.w && !resorts.s && resorts.c) {
                        // в выборке только обычные (common) курорты, добавляем их просто так
                        for (var i in resorts.c) {
                            optionsString += "<option value='" + resorts.c[i] + "'>" + i + "</option>";
                        }
                    }
                    else {
                        if (resorts.w) {
                            optionsString += "<option disabled='disabled'>----Зимний отдых----</option>";
                            for (var i in resorts.w) {
                                optionsString += "<option value='" + resorts.w[i] + "'>" + i + "</option>";
                            }
                        }
                        if (resorts.s) {
                            if (resorts.w) {
                                optionsString += "<option disabled='disabled'></option>";
                            }
                            optionsString += "<option disabled='disabled'>----Летний отдых----</option>";
                            for (var i in resorts.s) {
                                optionsString += "<option value='" + resorts.s[i] + "'>" + i + "</option>";
                            }
                        }
                        if (resorts.c) {
                            if (resorts.w || resorts.s) {
                                optionsString += "<option disabled='disabled'></option>";
                            }
                            optionsString += "<option disabled='disabled'>----Регионы без категории----</option>";
                            for (var j in resorts.c) {
                                optionsString += "<option value='" + resorts.c[j] + "'>" + j + "</option>";
                            }

                        }
                    }
                    $resort.empty().appendHint().append(optionsString).attr("disabled", false).attr("selectedIndex", 0);
                }                
                $loading.hide();
            }, "jsonp");
            return false;
        });

        $resort.change(function () {
            $loading.show();
            // чистим списки
            $city.attr("selectedIndex", 0).attr("disabled", true);
            $stars.attr("selectedIndex", 0).attr("disabled", true);
			$tourType.attr("selectedIndex", 0).attr("disabled", true);
            
            $dateFrom.val("").attr("disabled", true);
            $dateTo.val("").attr("disabled", true);

            $.get(serviceFolderPath + "TourSearch/GetCitiesJsonp", { resortCode: $resort.val(), officeCode: settings.departureCityCode },
            function (data) {
                var cities = data;
                if ($.isEmptyObject(cities)) {
                    alert($resort.data("errorText").replace("%%", $resort.selectedText()));
                }
                else {
                    var optionsString = "";
                    for (var i in cities) {
                        optionsString += "<option value='" + cities[i] + "'>" + i + "</option>"
                    }
                    $city.empty().appendHint().append(optionsString).attr("selectedIndex", 0).attr("disabled", false);
                }
                $loading.hide();
            }, "jsonp");
            return false;
        });

        $city.change(function () {
            $loading.show();
			// запоминаем выбранные значения
            var starsSelected = 
				{
					index: $stars.find("option").size() ? $stars.attr("selectedIndex") : 0,
					text: $stars.selectedText(),
					value: $stars.val()
				}
				
			var dateFromValue = $dateFrom.val();	
			var dateToValue = $dateTo.val();
			var tourTypeIndex = $tourType.find("option").size() ? $tourType.attr("selectedIndex") : 0;
			
			$stars.attr("selectedIndex", 0).attr("disabled", true);
			$tourType.attr("selectedIndex", 0).attr("disabled", true);
			
			$dateFrom.val("").attr("disabled", true);
            $dateTo.val("").attr("disabled", true);
            // по выбранному пункту select#city получает даты (для инициализации datepicker'a), содержимое select#tourType и select#stars
            $.get(serviceFolderPath + "TourSearch/GetRestOptionsJsonp", { cityCode: $city.val(), officeCode: settings.departureCityCode },
            function (data) {
                var options = data;
                var stars = options.Stars;
                if ($.isEmptyObject(stars)) {
                    alert($city.data("errorText").replace("%%", $city.selectedText()));
                }
                else {
					var optionsString = "<option value='0'>" + "Все" + "</option>";
                    for (var i in stars) {
                        optionsString += "<option value='" + stars[i] + "'>" + stars[i] + "</option>";
                    }
					$stars.empty().appendHint().append(optionsString).attr("disabled", false);
					
					// если звездность была выбрана ранее
					if (starsSelected.index != 0) {
						// проверяем, находится ли старая звездность в массиве новых						
						if ($.inArray(starsSelected.text, stars) > -1) {
							// устанавливаем ее
							$stars.val(starsSelected.value);
						}
						else {
							// скидываем в пункт "Все"
							$stars.val(0); 
						}
					}
					else {
						// устанавливаем значение в "Выберите звездность"
						$stars.attr("selectedIndex", 0);
					}
                }

                var dates = options.Dates;
                if ($.isEmptyObject(dates)) {
                    alert($city.data("errorText").replace("%%", $city.selectedText()));
                }
                else {
					$dateFrom
						.attr("disabled", false).data("dates", dates)
						.datepicker("option", "minDate", dates[0].constructDate());
					// если начальная дата была выбрана
					if (dateFromValue !== "") {
						// проверяем, находится ли она в массиве новых
						if ($.inArray(dateFromValue, dates) > -1) {
							// устанавливаем ее
							$dateFrom.datepicker("setDate", dateFromValue);
						}
						else {
							// ищем в новом массиве (dates) самую ближайшую к старой дате снизу (<)
							var newDateFromValue = $(dates).filter(function (i) {return this.constructDate() < dateFromValue.constructDate();}).last()[0];
							$dateFrom.datepicker("setDate", newDateFromValue);
						}
					}
					
                    $dateTo
						.attr("disabled", false).data("dates", dates)
						.datepicker("option", "minDate", dates[0].constructDate());
					// если начальная дата была выбрана
					if (dateToValue !== "") {
						// проверяем, находится ли она в массиве новых
						if ($.inArray(dateToValue, dates) >= 0) {
							// устанавливаем ее
							$dateTo.datepicker("setDate", dateToValue);
						}
						else {
							// ищем в новом массиве (dates) самую ближайшую к старой дате сверху (>)
							var newDateToValue = $(dates).filter(function (i) {return this.constructDate() > dateFromValue.constructDate();}).first()[0];
							$dateFrom.datepicker("setDate", newDateToValue);
						}
					}
					
                }
				
				if ($.isEmptyObject(options.TourTypes)) {
                    alert($tourType.data("errorText").replace("%%", $tourType.selectedText() ));
                }
                else {
                    var optionsString = "";
                    var tourTypes = options.TourTypes;
                    for (var i in tourTypes) {
                        optionsString += "<option value='" + tourTypes[i] + "'>" + i + "</option>"
                    }
                    $tourType.empty().appendHint().append(optionsString).attr("disabled", false).attr("selectedIndex", tourTypeIndex);
                }
				
                $loading.hide();
            }, "jsonp");
            return false;
        });

        // пользователь нажал кнопку "отправить"
        $submit.click(function () {
            $breadcrumbs.hide();
            $loading.show();
            // опции проверки 
            var goofOptions =
		    {
		        tdf: { empty: true, length: 50, format: dateFormat, name: "Начальная дата" },
		        tdt: { empty: true, length: 50, format: dateFormat, name: "Конечная дата" },
		        pmax: { length: 50, format: /^\d{0,10}$/, name: "Цена" },

		        ct: { 
					name: "Город",
					elem: $city,
					valid: {
						fn: $city.isChanged,
						errorMsg: "Выберите курорт"
					}
				},
		        cn: { 
					name: "Страна",
					elem: $country,
					valid: {
						fn: $country.isChanged,
						errorMsg: "Выберите страну"
					}
				},
		        hs: { 
					name: "Звездность",
					elem: $stars,
					valid: {
						fn: $stars.isChanged,
						errorMsg: "Выберите звездность"
					}
				},
		        tt: { 
					name: "Тип тура",
					elem: $tourType,
					valid: {
						fn: $tourType.isChanged,
						errorMsg: "Выберите тип тура"
					}
				}	        
		    };

            // собираем параметры формы
            var parameters =
		    {
		        token: 1,
		        jsSearchFilter:
                {
                    searchFilter:
                    {
                        tdf: $dateFrom.val(),  // tourDateFrom (dateBegin)
                        tdt: $dateTo.val(),    // tourDateTo (dateEnd)
                        ct: $city.val(),        // cityKeys (city)
                        cn: $country.val(),
                        nf: $nightsFrom.val(),  // nightsFrom
                        nt: $nightsTo.val(),    // nightsTo
                        ad: $adults.val(),      // adultsCount
                        ch: $children.val(),    // childrenCount
                        //pmax: $cost.val(),
                        rate: $currency.val(),  // rate (currency)
                        tt: $tourType.val(),    // tourType

                        df: settings.departureCityCode,          // departFromKeys (regionCode, город вылета)
                        useTST: true,               // useTourSubTypes
                        main: true,                 // mainOnly
                        psize: settings.recordsPerPage, // pageSize
                        hqm: 7,                     // hotelQuotaMask
                        aqm: 7,                     // aviaQuotaMask
                        sort: 'PriceSort'
                    }
                },
		        firstItemNumber: 0,
				priceKeys: ""
		    };

            var searchFilter = parameters.jsSearchFilter.searchFilter;
			if ($cost.val() != "") {
				searchFilter.price = $cost.val();
			}
            if ($stars.val() != "0") {
                // звездность указана
                searchFilter.hs = $stars.val();
            }

            // проверка параметров на валидность при помощи опций (см. файл ascent.jquery.utilities.js)
            var errorObj = $.goofDefence(searchFilter, goofOptions);
			var errorString = "";
			// превращаем объект ошибки в строку для алерта
			$.each(errorObj, function (i, e) {
				switch (e.error.constructor) {
					case Array:
						errorString += e.error[0] + "\n";
						break;
					case String:
						errorString += e.error + "\n";
						break;					
				}
			});
			
            if (errorString === "") {
				var serviceUrl = megatecServiceFolderPath + "MWTourSearchService.asmx/GetSearchResults?priceKeys=";
				$.get(serviceUrl, { jsSearchFilter: JSON.stringify(parameters.jsSearchFilter), token: 1, firstItemNumber: 0 }, 
				function (response) {
                    var searchItems = eval(response.SearchItems);
                    var totalRecords = response.TotalCount;

                    if (searchItems.length > 0) {
                        var breadcrumbsString = "<span class='caption'>" + settings.breadcrumbsText.departure + ":</span> <span class='value'>" + settings.departureCityName + "</span>";
                        breadcrumbsString += "<span class='caption'>" + settings.breadcrumbsText.resort + ":</span> <span class='value'>" + searchItems[0].CityName + "</span>";

                        // если выбраны все звездности
                        if (searchFilter.hs) {
                            breadcrumbsString += "<span class='caption'>" + settings.breadcrumbsText.hotel[0] + ":</span> <span class='value'>" + searchFilter.hs + "</span>";
                        }
                        else {
                            breadcrumbsString += "<span class='caption'>" + settings.breadcrumbsText.hotel[1] + ":</span> <span class='value'>" + "Любая" + "</span>";
                        }

                        $breadcrumbs.empty().append(breadcrumbsString).show();
						$.extend($.fn.ingrid, {"generateSearchTable" : Ascent.Search.AgencyTourSearch.generateTable});
                        $content.empty().append(Ascent.Search.AgencyTourSearch.generateTable(searchItems, settings/*settings.hash, $.map(settings.tableColumns, function (e, i) { return e.name; }) */));
                        $("table", $content)
		                .ingrid(
		                {
							"settings": settings,
		                    url: settings.megatecServiceFolderPath + "MWTourSearchService.asmx/GetSearchResults",
		                    dataType: "jsonp",
		                    height: settings.tableHeight,
		                    colWidths: $.map(settings.tableColumns, function (e, i) { return e.width; }),
		                    //extraParams: parameters,
		                    searchFilter: searchFilter,
		                    resizableCols: false,
		                    unsortableCols: [],		                    
		                    rowSelection: false,
		                    recordsPerPage: settings.recordsPerPage,
		                    totalRecords: totalRecords,
		                    sorting: true,
							hash: settings.hash
		                });
 
                    }
                    else {
                        $content.empty().append($("<h1 align='center'>" + settings.notFound + "</h1>"));
                    }
                    $loading.hide();
                }, "jsonp");
            }
            else {
                alert(errorString);
                $loading.hide();
                return false;
            }
        });
    }

})(jQuery);

