function ValidateAmadeusOrder(lat, toIssueStatus) {	 
	var TO_DEPOSITED = 1
	var TO_BOOKED = 2
	var TO_ORDERED = 3

	var noError = 1;
	var el, re, dn, m;
	var dateNow = dateValidator.getToday();
	for (var i = 1; i < 50; i++) {
		var deleteElement = $("deleted" + i);
		if (deleteElement && deleteElement.value == 'True') continue;
		el = uniform["fldLastName" + i];
		if (!el) break;
		if (toIssueStatus != TO_DEPOSITED) {
			re = /^[a-zA-Z]+$/;
			el.value = el.value.replace(/^\s*|\s*$/g, "");
			if (!re.exec(el.value)) {
				alert(message.IncorrectPassengerLastName + " №" + i + ".");
				noError = 0;
				break;
			}
			el = uniform["fldFirstName" + i];
			el.value = el.value.replace(/^\s*|\s*$/g, "");
			if (!re.exec(el.value)) {
				alert(message.IncorrectPassengerName + " №" + i + ".");
				noError = 0;
				break;
			}
		}

		dn = uniform["fldDocType" + i];
		dn = dn.options[dn.selectedIndex].text;
		el = uniform["fldDocNumber" + i];
		if (dn == message.BirthDocument) {
			el.value = BirthCert2Rus(el.value);
		}

		if (toIssueStatus == TO_ORDERED) {
			el = uniform["fldDocNumber" + i];
			el.value = el.value.replace(/^\s*|\s*$/g, "");
			if (el.value == '') {
				alert("Требуется указать номер документа для пассажира №" + i + '.');
				noError = 0;
				break;
			}
			if (!ValidateDocNum(dn, el.value)) {
				alert(message.IncorrectDocumentNumber + " №" + i);
				noError = 0;
				break;
			}
		}
		var ageCategory = uniform["fldAgeCategory" + i].value;

		el = uniform["fldBirthDate" + i];
		var v = el.value;
		if ((ageCategory != 'взр' && toIssueStatus == TO_BOOKED) || toIssueStatus == TO_ORDERED) {
			if (v == message.DDMMYYYY) {
				alert("Требуется указать дату рождения для пассажира №" + i);
				noError = 0;
				break;
			}
			if (!dateValidator.checkBirthday(v)) {
				alert(message.IncorrectBirthDate + " №" + i);
				noError = 0;
				break;
			}
			re = /(\d+)[^\d]+(\d+)[^\d]+(\d+)/;
			var m = el.value.match(re);
			if (ageCategory != 'взр') {
				var dt1 = new Date(+m[3], m[2] - 1, +m[1]);
				el = uniform["fldDepartureDate"];
				if (el = el && el.value) {
					m = el.match(re);
					if (m) {
						var dt2 = new Date(+m[3], m[2] - 1, +m[1]);
						var maxAge = ageCategory == "мл" ? 2 : 12;
						var ageTypeMsg = ageCategory == "мл" ? "младенцем" : "ребёнком";
						dt1.setFullYear(dt1.getFullYear() + maxAge, dt1.getMonth(), dt1.getDate());
						if (dt1 <= dt2) {
							alert("Пассажир №" + i + " не является " + ageTypeMsg + " младше " + maxAge + " лет.");
							noError = 0;
							break;
						}
					}
				}
			}
		}
		else if (v != message.DDMMYYYY) {
			if (check_date(v, "dd.mm.yy") || !dateValidator.checkBirthday(v)) {
				alert(message.IncorrectBirthDate + " №" + i);
				noError = 0;
				break;
			}
		}
		el = uniform["fldSex" + i];
		v = el.options[el.selectedIndex].value;
		if (toIssueStatus != TO_DEPOSITED && v != message.SexM && v != message.SexF) {
			alert(message.SelectSex + " №" + i);
			noError = 0;
			break;
		}
		dn = uniform["fldDocType" + i];
		if (dn.options[dn.selectedIndex].text != message.Passport && dn.options[dn.selectedIndex].text != message.BirthDocument) {
			el = uniform["fldExDate" + i];
			if (toIssueStatus == TO_ORDERED) {
				if (el != null && el.value == message.DDMMYYYY) {
					alert(message.ForPassenger + " №" + i + " " + message.TypeDocExpirationDate)
					noError = 0;
					break;
				}
				if (!dateValidator.checkDocument(el.value)) {
					alert(message.ForPassenger + " №" + i + " " + message.IncorrectDocumentExpirationDate);
					noError = 0;
					break;
				}
			}
			else if (el.value != message.DDMMYYYY) {
				if (check_date(el.value, "dd.mm.yy") || !dateValidator.checkDocument(el.value)) {
					alert(message.ForPassenger + " №" + i + " " + message.IncorrectDocumentExpirationDate);
					noError = 0;
					break;
				}
			}
		}
		if (toIssueStatus == TO_ORDERED
				&& (!$('fldCitizenship' + i)
					|| $F('fldCitizenship' + i).length < 3
					|| ($('fldDocType' + i).options[$('fldDocType' + i).selectedIndex].text == message.AlienSPassport
						&& $F('fldCitizenship' + i) == "RUS"))) {
			alert(message.ForPassenger + " №" + i + " " + message.IncorrectPassengerCitizenship);
			noError = 0;
			break;
		}
	}
	if (noError && !IsPhoneValid())
		noError = 0;
	return noError;
}

function BirthCert2Rus(str) //К заявке 11390
{
	try {
		var temp1 = "ABEKMHOPCTX3";
		var temp2 = "АВЕКМНОРСТХЗ";
		var str = str.toUpperCase();
		str1 = str.substr(str.length - 8, 2);
		str2 = str.substr(str.length - 6);
		str = str.slice(0, str.length - 8);
		for (var i = 0; i < temp1.length; i++) {
			while (str1.indexOf(temp1.substr(i, 1)) != str1.lastIndexOf(temp1.substr(i, 1))) {
				str1 = str1.replace(temp1.substr(i, 1), temp2.substr(i, 1));
			}
			str1 = str1.replace(temp1.substr(i, 1), temp2.substr(i, 1));
		}
		return str.concat(str1, str2);
	} catch (exception) { }
}

function IsPhoneValid() {
	var phonevalue = $F("fldPhone").toString().replace(/^\s+/, '').replace(/\s+$/, '');
	$("fldPhone").value = phonevalue;
	if (phonevalue == '') return true;
	var regexp = /[а-яА-ЯёЁ]+/g;
	var isValid = !regexp.test(phonevalue);
	if (!isValid)
		alert('Некорректно введен контактный телефон.');
	return isValid;
}

function ValidateDocNum(dn, num) {
	n = num.length
	if (n < 2) return false;
	switch (dn) {
		case message.Passport:
			if (n != 10) return false;
			for (j = 0; j != n; j++)
				if (CharType(num.charAt(j)) != 'N') return false;
			break;

		case message.ForeignPassport: case message.NationalPassport:
			if (n != 9) return false;
			for (j = 0; j != n; j++)
				if (CharType(num.charAt(j)) != 'N') return false;
			break;

		case message.Certificate:
			if (n > 20) return false;
			for (j = 0; j != n; j++)
				if (CharType(num.charAt(j)) == '?') return false;
			break;

		case message.BirthDocument:
			if (arguments[2] && arguments[2] != 'РФ') return true;
			if (n > 13) return false;
			for (j = 0; j != 7; j++) {
				if (num.charAt(j) != 'X' && num.charAt(j) != 'x' && num.charAt(j) != 'V' && num.charAt(j) != 'v' && num.charAt(j) != 'I' && num.charAt(j) != 'i')
					break;
			}
			if (j == 0) return false;
			if ((CharType(num.charAt(j)) != 'R' && CharType(num.charAt(j)) != 'r') || (CharType(num.charAt(j + 1)) != 'R' && CharType(num.charAt(j + 1)) != 'r')) return false;
			if (n - j != 8) return false;
			for (j += 2; j != n; j++)
				if (CharType(num.charAt(j)) != 'N') return false;
			break;

		case message.AlienSPassport:
			if (n > 20) return false;
			break;
		default:
			return true;
	}
	return true;
}

function CharType(ch) {
	var ccyr = "абвгдеёжзийклмнопрстуфхцчшщьыъэюя";
	var code = ch.charCodeAt(0);
	if (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0))
		return 'L';
	else if (code >= 'a'.charCodeAt(0) && code <= 'z'.charCodeAt(0))
		return 'l';
	else if (code >= '0'.charCodeAt(0) && code <= '9'.charCodeAt(0))
		return 'N';
	else if (ccyr.indexOf(ch) != -1)
		return 'r';
	else if (ccyr.indexOf(ch.toLowerCase()) != -1)
		return 'R';
	return '?';
}

function blockDocType(element, position, changeDate) {
	var el = document.getElementById('fldExDate' + position);
	var citizenship = document.getElementById('fldCitizenship' + position);
	var Block = function() {
		el.disabled = true;
		var dateNow = new Date();
		dateNow.getFullYear();
		dateNow.setFullYear(dateNow.getFullYear() + 1);
		var date = dateNow.getDate().toString();
		if (date.length == 1) date = '0' + date;
		var month = parseInt(dateNow.getMonth()) + 1;
		if (month.toString().length == 1) month = '0' + month;
		el.value = date + '.' + month + '.' + dateNow.getFullYear();
	}
	var UnBlock = function() {
		el.disabled = false;
		if (changeDate) el.value = message.DDMMYYYY;
	}
	switch (element.options[element.selectedIndex].text) {
		case message.Passport:
			Block();
			citizenship.value = "RUS";
			break;
		case message.BirthDocument:
			Block();
			break;
		case message.ForeignPassport:
			UnBlock();
			citizenship.value = "RUS";
			break;
		case message.AlienSPassport:
			UnBlock();
			if (citizenship.value == "RUS") citizenship.value = "";
			break;
		default:
			UnBlock();
			break;
	}
}

if (self.message) {
	var order2_message = message.OrderMessage;
	var teleplaneOrderConfirmMessage = {
		save: message.OrderLLBeSaved,
		"delete": message.OrderLLBeDeleted,
		order: message.OrderTickets,
		delay: message.SaveOrder,
		order2: order2_message,
		order3: message.OrderLLBeCreated
	};
}

var order2_re = /=SUM=/g;
var order2_cur = /=CURRENCY_NAME=/g;

var amadeus = {
	order: {
		// Поля документа, которые нужно заполнить при выборе пассажира
		selectPassengerFields: {
			LastName: "lastName",
			FirstName: "firstName",
			DocType: "documentTypeId",
			DocNumber: "documentNumber",
			BirthDate: "birthDate",
			Sex: ["sex", function (val) { return val.replace(message.SexM, "M").replace(message.SexF, "F"); } ],
			ExDate: "documentExpire",
			Citizenship: "nationality"
		},

		// Делегат для заполнения полей после выбора пассажира
		setSelectedName: function (value, passenger) {
			if (!document) return;
			fillPassengerFields(value, passenger, amadeus.order.selectPassengerFields);
			var element = document.getElementById(passenger.formatString.format("DocType" + passenger.number));
			if (element) blockDocType(element, passenger.number, false);
		},
		selectPassenger: function (number, partnerId) {
			var passenger = new PassengerRecord("fld{0}", number);
			selectPassengerFromListNet(passenger,
				"amadeus_passenger",
				"{0} {1}".format(passenger.getField("LastName").value,
					passenger.getField("FirstName").value
				),
				"amadeus",
				partnerId,
				this.setSelectedName
			);
		}
	},
	getForm: function () {
		if (amadeus.formId) return document.forms[amadeus.formId];
		return document.forms[0];
	},
	attachBehavioursToPlaceTables: function () {
		var tables = $('table.direction-list-table'); // Таблицы рейсов для каждого направления.
		// Функция установки атрибутов доступа (раскрашивает ячейки рейсов в статусы (доступен/недоступен/минимальная_цена).
		var setAccess = function (input) {
			if (tables.length < 2) return;
			if ($(input).closest("table.direction-list-table")[0] != tables[0]) return;

			var r = refs[input.value];
			// Все ячейки рейсов устанавливаются в статус "недоступен".
			var tdSelector = "td:eq(6)";
			var tds = $(tables[1]).find('tr').find(tdSelector);
			if (!tds.length) {
				tdSelector = "td:eq(0)";
				tds = $(tables[1]).find('tr').find(tdSelector);
			}
			tds.addClass("disabled").removeClass("min-price").removeClass("enabled").closest("tr").attr("title", "Рейс не соответствует выбранному.");

			// Удаление статуса "недоступен" для доступных рейсов.
			for (var i = 0; i < r.length; i++)
				$(tables[1]).find('tr input:radio:first[value=' + r[i] + ']').closest("tr").find(tdSelector).removeClass("disabled").addClass("enabled").closest("tr").attr("title", "Доступен");

			// Установка статусов для рейсов с минимальной ценой.
			var r = minPrices[input.value];
			for (var i = 0; i < r.length; i++)
				$(tables[1]).find('tr input:radio:first[value=' + r[i] + ']').closest("tr").find("td.enabled").removeClass("enabled").addClass("min-price").closest("tr").attr("title", "Минимальная цена для выбранного рейса.");
		}

		// Обработчик щелчка мыши.
		var click = function (e) {
			var tr = this;
			tr = tr.tagName.toLowerCase() != "tr" ? $(tr).parents("tr:first") : $(tr);
			// Сброс атрибута "selected"
			tr.closest("table.direction-list-table").find("tr").removeClass("selected");

			// Установка статуса "selected" и фокусировка элемента для текущей строки.
			var input = tr.addClass("selected").find("input:radio:first").attr("checked", "checked")[0];
			try { input && input.focus(); } catch (ex) { };

			// Установка статусов если присутствует таблица для направления "обратно".
			if (tables.length < 2) return;
			setAccess(input);
		};

		// Установка обработчика onclick для строк таблицы.
		tables.find('tr').add("input:radio:first").bind("click", click);

		// Если не выбрано ни одного элемента, выбрать самый первый элемент и установить атрибуты.
		if (!tables.find('tr input:radio:first[checked]').length)
			tables.find('tr:nth-child(2) input:radio:first').attr("checked", "checked");

		// Выделяем цветом выбранные элементы.
		tables.find('tr input:radio:first[checked]').closest("tr").addClass("selected").each(function (index, el) { setAccess($(el).find("input:radio:first")[0]); });
	},
	checkSelectedPlaces: function (e) {
		var tables = $('table.direction-list-table');
		if (tables.length < 2) return true;
		var sl = $(tables[1]).find('tr input:radio:first[checked]').closest("tr");
		var tdSelector = "td:eq(6)";
		if (sl.find(tdSelector).length == 0) tdSelector = "td:eq(0)";
		if (sl.find(tdSelector).hasClass("disabled")) {
			alert("Выбран недоступный рейс.");
			return false;
		}
		return true;
	},
	SI: function (el, seg, id) {
		el = $(el);
		var container = document.createElement("div");
		container.innerHTML = "Please wait...";
		container.className = "flight-info";
		container.style.position = "absolute";
		container.style.top = el.offset().top + "px";
		container.style.left = el.offset().left + 50 + "px";
		container.style.background = "lightyellow";
		container.style.border = "solid black 2px";
		container.style.padding = "4px";
		$(container).load("ShowFlightInfo.aspx", { id: id, seg: seg });
		var hide = function () { $(".flight-info").remove(); };
		$(container).bind("mousedown", function (e) { e.stopPropagation(); });
		$(document).bind("mousedown", function (e) { hide(); });
		document.body.appendChild(container);
	},
	setDateFields: function (watermarkText) {
		var hideWatermark = function (el) { if (el.value == watermarkText) el.value = ""; }
		var showWatermark = function (el) { if (!el.value) el.value = watermarkText; }
		for (var i = 1; i < arguments.length; i++) {
			var elms = $("." + arguments[i]);
			elms.bind("focus", function (e) { hideWatermark(this); });
			elms.bind("blur", function (e) { showWatermark(this); });
			elms.bind("keydown", function (e) { FormatDate(this, e.keyCode, 'down'); });
			elms.bind("keyup", function (e) { FormatDate(this, e.keyCode, 'up'); });
			elms.each(function (index, el) { el.maxLength = 10; showWatermark(el); });
		}
	},
	retailGetPassengersForm: function () {
		return {
			firstName: "FirstName_",
			lastName: "LastName_",
			documentType: "DocumentType_",
			documentNumber: "DocumentNumber_",
			birthDate: "BirthDate_",
			sex: "Sex_",
			documentExpire: "DocumentExpire_",
			nationality: "Nationality_",
			ageCategory: "AgeCategory_"
		};
	},
	getPassengersForm: function () {
		return {
			firstName: "fldFirstName",
			lastName: "fldLastName",
			documentType: "fldDocType",
			documentNumber: "fldDocNumber",
			birthDate: "fldBirthDate",
			sex: "fldSex",
			documentExpire: "fldExDate",
			nationality: "fldCitizenship",
			ageCategory: "fldAgeCategory"
		}
	},
	retailValidatePassengers: function () {
		var noError = 1;
		var template = amadeus.retailGetPassengersForm();
		var uniform = amadeus.getForm();
		var el, re, dn;
		var startFormZero = 0;
		for (var i = 0; i < 50; i++) {
			el = uniform[template.lastName + i];
			if (!el) continue;
			el.value = el.value.replace(/[^-a-zа-яё' ]/gi, " ");
			if (!i) startFormZero = 1;
			re = /^[a-zA-Z]+$/;
			el.value = el.value.replace(/^\s*|\s*$/g, "");
			if (!re.exec(el.value)) {
				alert(message.PassengerLastNameShouldBeTypedWithLatinSymbols + " №" + (i + startFormZero) + ".");
				noError = 0;
				break;
			}
			el = uniform[template.firstName + i];
			el.value = el.value.replace(/[^a-zа-яё' ]/gi, " ");
			el.value = el.value.replace(/^\s*|\s*$/g, "");
			if (!re.exec(el.value)) {
				alert(message.PassengerFirstNameShouldBeTypedWithLatinSymbols + " №" + (i + startFormZero) + ".");
				noError = 0;
				break;
			}

			dn = uniform[template.documentType + i];
			dn = dn.options[dn.selectedIndex].text;

			if (self.toIssue) {
				el = uniform[template.documentNumber + i];
				el.value = el.value.replace(/^\s*|\s*$/g, "");
				if (el.value == '') {
					alert("Требуется указать номер документа для пассажира №" + (i + startFormZero) + '.');
					noError = 0;
					break;
				}
				if (!ValidateDocNum(dn, el.value)) {
					alert(message.IncorrectDocumentNumber + " №" + (i + startFormZero));
					noError = 0;
					break;
				}
			}
			el = uniform[template.birthDate + i];
			var v = el.value;
			if (v == message.DDMMYYYY) {
				if ((+uniform[template.ageCategory + i].value && uniform[template.ageCategory + i].value != 'взр' && !self.toIssue) || self.toIssue) {
					alert("Требуется указать дату рождения для пассажира №" + (i + startFormZero));
					noError = 0;
					break;
				}
			} else {
				//				if (check_date(v, "dd.mm.yy")) {
				//					alert(message.IncorrectBirthDate + " №" + (i + startFormZero));
				//					noError = 0;
				//					break;
				//				}
				re = /[\d]{4}$/g;
				var year = el.value.match(re);
				var dateNow = new Date();
				if (+year > dateNow.getFullYear() || +year < 1900) {
					alert(message.IncorrectBirthDate + " №" + (i + startFormZero));
					noError = 0;
					break;
				}
			}
			el = uniform[template.sex + i];
			v = el.options[el.selectedIndex].value;
			if (v != "M" && v != "F") {
				alert(message.SelectSex + " №" + (i + startFormZero));
				noError = 0;
				break;
			}
			if (self.toIssue) {
				dn = uniform[template.documentType + i];
				if (dn.options[dn.selectedIndex].text != message.Passport && dn.options[dn.selectedIndex].text != message.BirthDocument) {
					el = uniform[template.documentExpire + i];
					if (el != null && el.value == message.DDMMYYYY) {
						alert(message.ForPassenger + " №" + (i + startFormZero) + " " + message.TypeDocExpirationDate)
						noError = 0;
						break;
					}
					if (check_date(el.value, "dd.mm.yy")) {
						alert(message.ForPassenger + " №" + (i + startFormZero) + " " + message.IncorrectDocumentExpirationDate);
						noError = 0;
						break;
					}
					year = el.value.match(re);
					if (year < dateNow.getFullYear() || year > 2100 || year < 1900) {
						alert(message.ForPassenger + " №" + (i + startFormZero) + " " + message.IncorrectDocumentExpirationDate);
						noError = 0;
						break;
					}
				}
				if (!uniform[template.nationality + i]
				|| uniform[template.nationality + i].value.length < 3
				|| (uniform[template.documentType + i].options[uniform[template.documentType + i].selectedIndex].text == message.AlienSPassport
				&& uniform[template.nationality + i].value == "RUS")) {
					alert(message.ForPassenger + " №" + (i + startFormZero) + " " + message.IncorrectPassengerCitizenship);
					noError = 0;
					break;
				}
			}
		}
		return noError;
	},
	initializeFlightsByPriceTable: function (tab, tab_index) {
		var notRowspanSelector = "td:not([serviceField])";
		var form = amadeus.getForm();
		var selectRow = function (el) {
			var row = $(el).closest("tr");
			var inp = row.find("input:radio")[0];
			if (inp.disabled) return;
			inp.checked = "checked";
			highlightRow(inp);
		};
		var highlightRow = function (el, init) {
			var row = $(el).closest("tr");
			var fnd = tab.find("input:radio[name=" + el.name + "]").closest("tr").find(notRowspanSelector).removeClass("selected")
				.each(function () { this.style.cursor = "pointer"; });
			row.find(notRowspanSelector).addClass("selected");
			var refs = row[0].getAttribute("refs");
			if (!refs) return;
			refs = refs.split(',');
			var rIds = row[0].id.split("_");
			if (+rIds[2]) return;
			var otherDirection = tab.find("tr[id ^= fl_" + rIds[1] + "_" + (1 - rIds[2]) + "_]");
			if (!otherDirection.length) return;
			otherDirection.find("input:radio").each(function () { this.disabled = "disabled"; });
			for (var i = 0; i < refs.length; i++) {
				$("#fl_" + rIds[1] + "_" + (1 - rIds[2]) + "_" + refs[i]).find("input:radio").removeAttr("disabled");
			}
			var b = otherDirection.find("input:radio:not([disabled])")[0];
			b.checked = "checked";
			highlightRow(b);
		};
		tab.find(notRowspanSelector).bind("click", function () { selectRow(this); });
		var radios = tab.find("input:radio");
		radios.bind("click", function () { highlightRow(this); });
		radios.each(function (i, el) { if (this.checked) highlightRow(this, true); });
	},
	initializeFlightsByPrice: function () {
		for (var i = 0; i < 100; i++) {
			var tab = $get("tab_" + i);
			if (!tab) return;
			amadeus.initializeFlightsByPriceTable($(tab), i);
		}
	},
	selectFlightByPrice: function (el) {
		var form = amadeus.getForm();
		var ind = $(el).closest("tr")[0].id.split("_")[1];
		form.selectedPrice.value = ind;
		var inp2 = $("input[name=route" + ind + "_" + "1][checked]")[0];
		if (!inp2) return true;
		var inp1 = $("input[name=route" + ind + "_" + "0][checked]")[0];
		if (inp2.disabled) {
			alert("Выбранные рейсы не сочетаются между собой.");
			return false;
		}
		return true;
	}
}

function AddBonusCard(element) {
	for (var i = 1; i < 10; i++) {
		var bonusCard = $('fldBonusCard' + i);
		if (bonusCard) {
			Element.removeClassName(bonusCard.parentElement.parentElement, 'hidden');
		}
		else
			break;
	}
	Element.addClassName(element, 'hidden');
}

function StatusUpdater(timeleft, valueFieldId, unitFieldId, onTimeOverFeedback) {
	var _timeleft = timeleft;
	var _divisor;
	var _timeoutId;
	if (timeleft > 60000) {
		_divisor = 60000;
		unitFieldId.innerHTML = 'мин';
	}
	else {
		_divisor = 1000;
		unitFieldId.innerHTML = 'сек';
	}
	valueFieldId.innerHTML = _timeleft / _divisor;
	var _stop = function() {
		if (_timeoutId)
			clearTimeout(_timeoutId);
	};
	this.stop = _stop;
	var updateTime = function() {
		_timeleft = _timeleft - _divisor;
		valueFieldId.innerHTML = _timeleft / _divisor;
		if (_timeleft < 1) {
			onTimeOverFeedback();
			_stop();
		}
	};
	this.start = function() {
		_timeoutId = setInterval(function() { updateTime(); }, _divisor);
	};
	this.start();
}
