/// <reference path="../../../../../Misc/jquery-1.3.2-vsdoc2.js" />

$(function()
{
	var isLoading = true;
	new FormSubmit();

	var selInsuranceProgram = $("#selInsuranceProgram");

	function getSelectedProgramName()
	{
		var id = selInsuranceProgram.val();
		switch (id)
		{
			case "1": return "Fixed";
			case "2": return "Individual";
			case "4": return "Prestige";
		}
	}

	function isSecondStep()
	{
		var insuranceProgram = parseInt(selInsuranceProgram.val());

		if (insuranceProgram == 2 || insuranceProgram == 4)
		{
			return $("#PremiumDiv").css("display") != "none";
		}
		else
		{
			return true;
		}
	}

	function doResetStep2()
	{
		var insuranceProgram = parseInt(selInsuranceProgram.val());

		if (!isLoading)
		{
			if (insuranceProgram == 2 || insuranceProgram == 4)
			{
				CalcActionButtons.setCalculateObjectPricesState();

				if ($("#PremiumDiv").css("display") != "none")
				{
					$("#UserMessagesDiv").hide();
					$("#divIndividualStep2").hide();
					$("#divPrestigeStep2").hide();
					$("#PremiumDiv").hide();
					$("#CaseIDDiv").hide();
				}
			}
			else
			{
				CalcActionButtons.clearCalculateObjectPricesState();
				$("#PremiumDiv").show();
				$("#CaseIDDiv").show();
			}
		}
	};

	// Смена программы страхования
	function setInsuranceProgram()
	{
		var insuranceProgram = parseInt(selInsuranceProgram.val());

		jQuery.each([1, 2, 4], function(n, id)
		{
			var div = $("#divInsuranceProgram" + id);
			if (id != insuranceProgram)
			{
				div.hide();
			}
		});

		$("#divInsuranceProgram" + insuranceProgram).show();

		// Меняем состояние блока кнопок
		if ((insuranceProgram == 2 || insuranceProgram == 4) && $("#inptObjectCostsCalculated").val() != "1")
		{
			CalcActionButtons.setCalculateObjectPricesState();
		}
		else
		{
			CalcActionButtons.clearCalculateObjectPricesState();
		}

		doResetStep2()
	};

	selInsuranceProgram.change(function()
	{
		$("#inptObjectCostsCalculated").val("0");
		$("#UserMessagesDiv").hide();
		setInsuranceProgram(true);
	});

	setInsuranceProgram();

	// Находим все нужные контролы для всех программ
	var allPrograms = ["Fixed", "Individual", "Prestige"];

	var allObjects = ['BearingStructuresIncluding',
					  'BearingStructures',
					  'InteriorDecoration',
					  'Homestead',
					  'HomesteadSpecial',
					  'CivilLiability',
					  'CivilLiabilityWide'];

	var programControls = {};

	jQuery.each(allPrograms, function(programNumber, program)
	{
		var programData = {};
		programData.regionSelect = $("#sel_" + program + "_Region");
		programData.regionSelect.autosuggest();
		programData.citySelect = $("#sel_" + program + "_City");
		programData.citySelect.autosuggest();
		programData.districtSelect = $("#sel_" + program + "_District");
		programData.buildingTypeSelect = $("#sel_" + program + "_BuildingType");
		programData.yearBuiltInput = $("#inpt" + program + "_BuildingYear");
		programData.numberOfFloorsInput = $("#inpt" + program + "_NumberOfFloors");
		programData.topOrBottomFloorCheckbox = $("#inpt_" + program + "_TopOrBottomFloor");
		programData.interiorTrimTypeSelect = $("#sel_" + program + "_InteriorTrimType");
		programData.grossAreaInput = $("#inpt" + program + "_GrossArea");
		programData.marketTypeSelect = $("#sel_" + program + "_MarketType");
		programData.numberOfRoomsSelect = $("#sel_" + program + "_NumberOfRooms");
		programData.initialCityID = $("#inpt_" + program + "_City").val();
		programData.initialDistrictID = $("#inpt_" + program + "_District").val()

		programData.objects = [];
		programData.objectsByName = {};

		for (var objectNum = 0; objectNum < allObjects.length; objectNum++)
		{
			var objectName = allObjects[objectNum];
			var checkbox = $("#inpt_" + program + "_" + objectName);
			if (checkbox.length > 0)
			{
				var data = { program: program,
					objectName: objectName,
					checkbox: checkbox,
					objectCostInput: $("#inpt_" + program + "_" + objectName + "ObjectCost"),
					insuranceMoneyInput: $("#inpt_" + program + "_" + objectName + "InsuranceMoney"),
					insuranceAmountValidationMessage: $("#" + program + "_" + objectName + "InsuranceMoneyValidationError"),
					insuranceMoneyDiv: $("#div_" + program + "_" + objectName + "InsuranceMoney")
				};

				data.objectCostInput.numeric();
				data.insuranceMoneyInput.numeric();

				programData.objects.push(data);
				programData.objectsByName[objectName] = data;
			}
		}
		programControls[program] = programData;
	});

	// Маска для поля ввода года постройки
	jQuery.each(allPrograms, function(programNumber, program)
	{
		programControls[program].yearBuiltInput.numeric();

		if (programControls[program].numberOfFloorsInput.length > 0)
		{
			programControls[program].numberOfFloorsInput.numeric();
		}

		programControls[program].grossAreaInput.decimalNumeric();
	});

	numPad = new NumPad();

	var jsonCache = {};

	// Делает синхронный AJAX-запрос.
	function getJson(url, callback)
	{
		if (jsonCache[url])
		{
			callback(jsonCache[url]);
		}
		else
		{
			$.ajax({
				type: 'GET',
				url: url,
				dataType: 'json',
				success: function(json)
				{
					jsonCache[url] = json;
					callback(json);
				},
				data: {},
				async: false
			});
		}
	}

	// Обновляет значения комбобокса из значений переданного массива. idSelector и nameSelector - функции, принимающие элемент 
	// массива и возвращающие id и name для элементов комбобокса.
	function updateCombobox(combobox, values, defaultValue, idSelector, nameSelector)
	{
		combobox.html("");
		var html = "";
		for (var n = 0; n < values.length; n++)
		{
			var id = idSelector(values[n]);
			html += ("<option value='");
			html += id;
			html += "'";
			if (id == defaultValue)
			{
				html += " selected='true'";
			}
			html += ">";
			html += nameSelector(values[n]);
			html += "</option>";
		}
		combobox.html(html);
	}


	// ########################################
	// Логика для "актив-фиксированный"
	// ########################################

	var fixed = programControls["Fixed"];

	function getFixedPrices()
	{
		$.getJSON("/xml/propertyFixedPrices.wbp?"
				+ "region=" + fixed.regionSelect.val()
				+ "&city=" + fixed.citySelect.val()
				+ "&rooms=" + fixed.numberOfRoomsSelect.val()
				+ "&trim=" + fixed.interiorTrimTypeSelect.val(),
			function(_data)
			{
				for (var key in _data)
				{
					switch (key)
					{
						case "2":
							$("#sel_Fixed_InteriorDecorationInsuranceMoney")[0].value = _data[key][0];
							break;
						case "3":
							var selectedValue = $("#sel_Fixed_HomesteadInsuranceMoney").val();
							if (!selectedValue)
							{
								selectedValue = fixedHomesteadFixedInsuranceMoneyDefault;
							}
							updateCombobox($("#sel_Fixed_HomesteadInsuranceMoney"), _data[key], selectedValue, function(e) { return e; }, function(e) { return e; });
							break;
						case "5":
							var selectedValue = $("#sel_Fixed_CivilLiabilityInsuranceMoney").val();
							if (!selectedValue)
							{
								selectedValue = fixedCivilLiabilityInsuranceMoneyDefault
							}
							updateCombobox($("#sel_Fixed_CivilLiabilityInsuranceMoney"), _data[key], selectedValue, function(e) { return e; }, function(e) { return e; });
							break;
					}
				}
			});
	}

	fixed.regionSelect.change(function()
	{
		getJson("/XML/propertyCities.wbp?region=" + this.value, function(_data)
		{
			for (var key in _data)
			{
				for (var city in _data[key])
				{
					updateCombobox(fixed.citySelect, _data[key][city], $("#inpt_Fixed_City").val(),
						function(item) { return item[0]; },
						function(item) { return item[1]; });
					$.autosuggest.changeOptions(fixed.citySelect.get(0));

				}
			}
			getFixedPrices();
		});
	});

	fixed.citySelect.change(function()
	{
		getFixedPrices();
	});
	fixed.interiorTrimTypeSelect.change(function()
	{
		getFixedPrices();
	});
	fixed.numberOfRoomsSelect.change(function()
	{
		getFixedPrices();
	});

	fixed.regionSelect.change();


	// ############################################
	// "Актив-индивидуальный" и "престиж" 
	// ############################################

	function onRegionChange(program)
	{
		var regionCombo = programControls[program].regionSelect;
		var cityCombo = programControls[program].citySelect;

		getJson("/XML/propertyCities.wbp?region=" + regionCombo.val(), function(_data)
		{
			for (var key in _data)
			{
				for (var city in _data[key])
				{
					updateCombobox(cityCombo, _data[key][city], programControls[program].initialCityID,
						function(item) { return item[0]; },
						function(item) { return item[1]; });
					$.autosuggest.changeOptions(cityCombo.get(0));
				}
			}
			cityCombo.change();
		});
	}

	var districtData = {};
	var minFloors = {};
	var maxFloors = {};

	function onCityChange(program)
	{
		var cityCombo = programControls[program].citySelect;
		var districtCombo = programControls[program].districtSelect;
		var buildingTypeCombo = programControls[program].buildingTypeSelect;

		/* autosuggest bug workaround */
		var cityName = $('input[name="' + cityCombo.attr('name') + '__selectHidden"]').val();
		$('option', cityCombo).each(function() {
			if ($(this).text() === cityName) {
				$(this).attr('selected', 'selected');
			}
		});

		getJson("/XML/propertyDistricts.wbp?city=" + cityCombo.val(), function(_data)
		{
			districtCombo.html("");
			var districtDiv = $("#" + program + "_DistrictSelectDiv");

			if (_data.length == 0)
			{
				districtDiv.hide();

				districtData[program] = null;

				updateCombobox(buildingTypeCombo, defaultBuildingTypes, buildingTypeCombo.val(),
						function(item) { return item.id; },
						function(item) { return item.name; });
			}
			else
			{
				districtDiv.show();
				updateCombobox(districtCombo, _data, programControls[program].initialDistrictID,
						function(item) { return item.id; },
						function(item) { return item.name; });
			}

			onDistrictChanged(program);
		});
	}

	var validity = {};
	validity.Individual = {};
	validity.Prestige = {};

	function isProgramValid(program)
	{
		for (var field in validity[program])
		{
			if (!validity[program][field])
			{
				return false;
			}
		}
		return true;
	}

	function validateRequiredFields(program)
	{
		var controls = programControls[program];
		var requiredFields = [
			{ control: "BuildingYear", msg: "Укажите год постройки." },
			{ control: "NumberOfFloors", msg: "Укажите количество этажей." },
			{ control: "GrossArea", msg: "Укажите площадь квартиры." }
		];
		$.each(requiredFields, function(n, requiredControl)
		{
			var input = $("#inpt" + program + "_" + requiredControl.control);
			if (input.val() == "")
			{
				setFieldValidity(program, false, false, requiredControl.control, requiredControl.msg);
			};
		});
	}

	FormSubmit.validationHandler = function()
	{
		var program = getSelectedProgramName();
		if (!isSecondStep())
		{
			validateRequiredFields(program);
			if (!isProgramValid(program))
			{
				return "Некоторые поля некорректно заполнены. Ошибки выделены в соответствующих полях, пожалуйста, исправьте значения.";
			}
			else
			{
				return;
			}
		}
		else
		{
			var anySelected = false;
			jQuery.each(programControls[program].objects, function(objectNum, objectData)
			{
				if (objectData.checkbox[0].checked)
				{
					anySelected = true;
				}
			});
			if (!anySelected && program == "Fixed")
			{
				return "Пожалуйста выберите как минимум один объект страхования.";
			}
			else
			{
				return;
			}
		}
	};

	function setFieldValidity(program, isValid, hideMessage, field, msg)
	{
		var validationMsg = $("#" + program + "_" + field + "ClientValidationMessage");
		var section = $("#" + program + "_" + field + "Section");

		var serverValidationMsg = $([]);
		if (validationMsg.length > 0)
		{
			serverValidationMsg = $("div.error[id != " + validationMsg[0].id + "]", section);
		}

		if (!hideMessage)
		{
			serverValidationMsg.remove();
			serverValidationMsg = [];
		}

		if (!isValid && !hideMessage)
		{
			validationMsg.text(msg);
			section.addClass("with-error");
			validationMsg.css("visibility", "visible"); // IE6 :(
			validationMsg.show();
		}
		else
		{
			validationMsg.css("visibility", "hidden");
			validationMsg.hide();

			if (serverValidationMsg.length == 0)
			{
				section.removeClass("with-error");
			}
		}

		validity[program][field] = isValid;
	}

	function checkNumberOfFloors(program)
	{
		var floorsInput = programControls[program].numberOfFloorsInput;
		var floorsVal = floorsInput.val();
		var valid = true;
		if (minFloors[program] && maxFloors[program])
		{
			valid = false;
			var floors = parseInt(floorsVal);
			if (!isNaN(floors))
			{
				floorsInput.val(floors);
				valid = (minFloors[program] <= floors && floors <= maxFloors[program]);
			}
		}

		setFieldValidity(program, valid, floorsVal == "", "NumberOfFloors",
				"Для данного типа строения и года постройки количество этажей должно быть от "
					+ minFloors[program] + " до " + maxFloors[program] + ".");
	}

	function checkYearBuild(program)
	{
		var yearsInput = programControls[program].yearBuiltInput;
		var years = parseInt(yearsInput.val());

		var isValid = false;

		if (!isNaN(years))
		{
			var currentYear = (new Date).getFullYear();

			if (1900 <= years && years <= currentYear)
			{
				isValid = true;
			}
		}

		setFieldValidity(program, isValid, yearsInput.val() == "", "BuildingYear",
					"Год постройки не должен быть меньше 1900 года и не может быть больше текущего года.");
	}

	function checkGrossArea(program)
	{
		var grossAreaInput = $("#inpt" + program + "_GrossArea");

		var isValid = false;

		var grossArea = parseFloat(grossAreaInput.val().replace(",", "."));
		grossArea = Math.round(grossArea * 100) / 100;

		if (!isNaN(grossArea))
		{
			grossAreaInput.val(grossArea.toString().replace('.', ','));
			if (0 < grossArea && grossArea <= 1000)
			{
				isValid = true;
			}
		}

		setFieldValidity(program, isValid, grossAreaInput.val() == "", "GrossArea",
					"Должно быть введено положительное числовое значение не большее 1000.");
	}

	function updateMarketTypes(program)
	{
		var year = programControls[program].yearBuiltInput.val();
		var buildingTypeID = programControls[program].buildingTypeSelect.val();
		var marketSelect = $("#sel_" + program + "_MarketType");

		year = parseInt(year);

		var marketTypes;

		minFloors[program] = null;
		maxFloors[program] = null;

		if (districtData[program])
		{
			var districtInfo = districtData[program][buildingTypeID];

			if (!isNaN(year) && districtInfo.years && districtInfo.years.length > 0)
			{
				for (var n = 0; n < districtInfo.years.length; n++)
				{
					var yearDetail = districtInfo.years[n];
					if (yearDetail.minYear <= year && year <= yearDetail.maxYear)
					{
						marketTypes = yearDetail.marketTypes;
						minFloors[program] = yearDetail.minFloors;
						maxFloors[program] = yearDetail.maxFloors;
					}
				}
			}
		}

		if (programControls[program].numberOfFloorsInput.val() != "")
		{
			checkNumberOfFloors(program);
		}

		if (!marketTypes)
		{
			if (districtData[program])
			{
				marketTypes = [defaultPropertyMarketTypes[1]]; // Только "вторичный"
			}
			else
			{
				marketTypes = defaultPropertyMarketTypes;
			}
		}

		var selectedValue = marketSelect.val();

		updateCombobox(marketSelect, marketTypes, marketSelect.val(),
						function(item) { return item.id; },
						function(item) { return item.name; });
	}

	function onDistrictChanged(program)
	{
		var districtID = programControls[program].districtSelect.val();

		if (districtID)
		{
			getJson("/xml/propertyDistrictBuildings.wbp?district=" + districtID, function(_data)
			{
				districtData[program] = _data

				var buildingTypeCombo = programControls[program].buildingTypeSelect;
				var selectedValue = buildingTypeCombo.val();
				buildingTypeCombo.html("");
				for (var buildingTypeID in _data)
				{
					var option = $("<option/>").attr("value", buildingTypeID).appendTo(buildingTypeCombo);
					if (buildingTypeID == selectedValue)
					{
						option.attr("selected", true);
					}
					option.text(_data[buildingTypeID].name);
				}
				updateMarketTypes(program);
			});
			if (!isLoading)
			{
				doResetStep2();
			}
		}
		else
		{
			districtData[program] = null;
			updateMarketTypes(program);

			if (!isLoading)
			{
				doResetStep2();
			}
		}
	}

	jQuery.each(["Individual", "Prestige"], function(n, program)
	{
		var controls = programControls[program];

		controls.grossAreaInput.change(function()
		{
			doResetStep2();
			checkGrossArea(program);
		});
		checkGrossArea(program);

		controls.numberOfFloorsInput.change(function()
		{
			doResetStep2();
			checkNumberOfFloors(program);
		});

		controls.yearBuiltInput.change(function()
		{
			doResetStep2();
			updateMarketTypes(program);
			checkYearBuild(program);
		});
		checkYearBuild(program);

		controls.buildingTypeSelect.change(function()
		{
			doResetStep2();
			updateMarketTypes(program);
		});

		controls.districtSelect.change(function()
		{
			doResetStep2();
			onDistrictChanged(program);
		});

		controls.citySelect.change(function()
		{
			doResetStep2();
			onCityChange(program);
		});

		controls.regionSelect.change(function()
		{
			onRegionChange(program);
			doResetStep2();
		});

		controls.topOrBottomFloorCheckbox.click(function()
		{
			doResetStep2();
		});

		controls.marketTypeSelect.change(function()
		{
			doResetStep2();
		});

		controls.interiorTrimTypeSelect.change(function()
		{
			doResetStep2();
		});

		controls.numberOfRoomsSelect.change(function()
		{
			doResetStep2();
		});
	});


	// ########################################
	// Логика для второго шага расчета
	// #########################################

	function updateRisks(objectNum)
	{
		var prefix = "Prestige_" + programControls["Prestige"].objects[objectNum].objectName + "Risk";
		var fullPackageRiskEnabled = $("#" + prefix + "0")[0].checked;
		for (var n = 1; n <= 3; n++)
		{
			var checkbox = $("#" + prefix + n)[0];
			checkbox.disabled = fullPackageRiskEnabled;
			if (fullPackageRiskEnabled)
			{
				checkbox.checked = false;
			}
		};
	};

	function enableOrDisableObjectControls(program, objectNum)
	{
		var name = program + "_" + programControls[program].objects[objectNum].objectName;
		var checked = $("#inpt_" + name)[0].checked;
		var div = $('#div_' + name);
		var inputs = div[0].getElementsByTagName("INPUT");
		var selects = div[0].getElementsByTagName("SELECT");
		var requiredHints = $(".req", div);

		for (var i = 0; i < inputs.length; i++)
		{
			inputs[i].disabled = !checked;
		}
		for (var i = 0; i < selects.length; i++)
		{
			selects[i].disabled = !checked;
		}

		if (checked)
		{
			var costBtn = jQuery(".numpadButton:first", div);
			var amountBtn = jQuery(".numpadButton:last", div);
			costBtn.show();
			requiredHints.show();

			if (!(program == "Individual" && objectNum == 2))
			{ // Это поле всегда readonly и повторяет значение поля со стоимостью
				amountBtn.show();
			}
		}
		else
		{
			requiredHints.hide();
			jQuery(".numpadButton", div).css("display", "none");
		}

		if (program == "Prestige" && checked)
		{
			updateRisks(objectNum);
		}
	};

	// Логика чекбоксов для "актив-фиксированный"

	jQuery.each(programControls["Fixed"].objects, function(n, obj)
	{
		obj.checkbox.click(function()
		{
			enableOrDisableObjectControls("Fixed", n);
		});
		enableOrDisableObjectControls("Fixed", n);
	});



	// Логика чекбоксов для "актив-индивидуальный"


	var checkboxStatus = { "Individual": {}, "Prestige": {} }

	function disableObject(objectControls, val)
	{
		var cb = objectControls.checkbox[0];
		if (!cb.disabled)
		{
			checkboxStatus[objectControls.program][objectControls.objectName] = cb.checked;
			cb.checked = val;
			cb.disabled = true;
		}
	}

	function enableObject(objectControls)
	{
		var cb = objectControls.checkbox[0];
		if (cb.disabled)
		{
			cb.disabled = false;
			if (checkboxStatus[objectControls.program][objectControls.objectName] != undefined)
			{
				cb.checked = checkboxStatus[objectControls.program][objectControls.objectName];
			}
		}
	}

	var individualCompensationByFirstRiskPrevValue = undefined;

	function updateIndividualCheckboxes(e)
	{
		var controls = programControls["Individual"];
		var cb1 = controls.objects[0].checkbox[0];
		var cb2 = controls.objects[1].checkbox[0];
		var cb3 = controls.objects[2].checkbox[0];
		var cb4 = controls.objects[3].checkbox[0];
		var cb5 = controls.objects[4].checkbox[0];
		var compensationCheckbox = $("#inpt_Individual_CompensationByFirstRiskOnly")[0];

		if (cb1.checked)
		{ // Первая комбинация. Если выбран первый объект, обязательно должны быть выбраны объекты 2 и 3
			disableObject(controls.objects[1], true);
			disableObject(controls.objects[2], true);
		} else
		{
			enableObject(controls.objects[1]);
			enableObject(controls.objects[2]);

			if (!cb2.checked
				&& cb3.checked
				&& cb4.checked
				&& e != undefined
			)
			{ // первые два объекта не выбраны, может быть выбран только один из объектов 3 и 4
				if (this == cb3
				|| this == cb2)
				{ // Если мы снимаем галочку с объекта 2, то по-умолчанию остается объект 3.
					cb4.checked = false;
				} else
				{
					cb3.checked = false;
				}
			}
		}

		if (!cb1.checked && !cb2.checked && !cb3.checked && !cb4.checked)
		{
			disableObject(controls.objects[4], false);
		}
		else
		{
			enableObject(controls.objects[4]);
		}

		var combinationRiskCombo = $("#Individual_CombinationRisk")[0];

		if (!cb1.checked && !cb2.checked && !cb3.checked)
		{
			combinationRiskCombo.disabled = true;
		}
		else
		{
			combinationRiskCombo.disabled = false;
		}


		// Выплата "по первому риску"
		// Если пользователем выбраны основные объекты в комбинации 4 
		// (выбран из основных объектов только Домашнее имущество «общий» договор ИЛИ без иных основных объектов 
		// выбрано «Домашнее имущество «специальный» договор»), то чек-бокс выбран и поле закрыто от изменений
		if (!cb1.checked && !cb2.checked && (cb3.checked || cb4.checked))
		{
			if (!compensationCheckbox.disabled)
			{
				compensationCheckbox.disabled = true;
				individualCompensationByFirstRiskPrevValue = compensationCheckbox.checked;
				compensationCheckbox.checked = true;
			}
		}
		else if (compensationCheckbox.disabled)
		{
			compensationCheckbox.disabled = false;
			compensationCheckbox.checked = individualCompensationByFirstRiskPrevValue;
		}

		for (var n = 0; n < 5; n++)
		{
			enableOrDisableObjectControls("Individual", n);
		}
	};

	jQuery.each([0, 1, 2, 3, 4], function(num, n)
	{
		var controls = programControls["Individual"].objects[n];
		controls.checkbox.click(updateIndividualCheckboxes);
	});

	updateIndividualCheckboxes();


	// Логика чекбоксов для "престиж"

	function updatePrestigeCheckboxes(e)
	{
		var controls = programControls["Prestige"];
		var cb0 = controls.objects[0].checkbox[0];
		var cb1 = controls.objects[1].checkbox[0];
		var cb2 = controls.objects[2].checkbox[0];

		if (cb0.checked)
		{
			disableObject(controls.objects[1], false);
			disableObject(controls.objects[2], false);
		} else
		{
			enableObject(controls.objects[1]);
			enableObject(controls.objects[2]);
		}

		for (var n = 0; n < 7; n++)
		{
			enableOrDisableObjectControls("Prestige", n);
		}
	};

	for (var n = 0; n < 7; n++)
	{
		programControls["Prestige"].objects[n].checkbox.click(updatePrestigeCheckboxes);

		$("#Prestige_" + programControls["Prestige"].objects[n].objectName + "Risk0").click(updatePrestigeCheckboxes);
	};

	updatePrestigeCheckboxes();

	// Логика чекбокса "с учетом износа"

	var wearoutCheckbox = $("#inpt_Prestige_Wearout");
	var wearoutSelect = $("#sel_Prestige_WearoutValue");

	function updateWearout()
	{
		wearoutSelect[0].disabled = wearoutCheckbox[0].checked;
	}

	wearoutCheckbox.click(updateWearout);
	updateWearout();

	// Очистка валидационных сообщений для полей "страховая сумма"

	function removeInsuranceAmountValidationMessage(objectControls)
	{
		objectControls.insuranceAmountValidationMessage.hide();
		if (objectControls.insuranceMoneyInput.length > 0)
		{
			objectControls.insuranceMoneyInput[0].readOnly = false;
		}
		objectControls.insuranceMoneyDiv.removeClass("with-error");
	}

	jQuery.each(["Individual", "Prestige"], function(n, program)
	{
		jQuery.each(['BearingStructuresIncluding',
					  'BearingStructures',
					  'InteriorDecoration'], function(objectNum, objectName)
					  {
					  	if (programControls[program].objectsByName[objectName])
					  	{
					  		var controls = programControls[program].objectsByName[objectName];
					  		controls.objectCostInput.change(function() { removeInsuranceAmountValidationMessage(controls) });
					  	}
					  })
	});

	// Запускаем ajax, подгружающий регионы и города
	jQuery.each(["Individual", "Prestige"], function(n, program)
	{
		programControls[program].regionSelect.change();
	});

	isLoading = false;
});
