/// <reference path="../../../../../Misc/jquery-1.3.2-vsdoc2.js" />

$(function() {
	$("select[id='regionFld']").autosuggest();
	
	numPad = new NumPad();

	allPrograms = ["Active", "Classic", "Prestige"];

	var allObjects = ['BearingStructuresIncluding',
					  'BearingStructures',
					  'InteriorDecoration',
					  'Homestead',
					  'HomesteadSpecial',
					  'AdditionalBuildings',
					  'Sauna',
					  'CivilLiability'];

	var programControls = {};

	var programSelect = $("#InsuranceProgram");

	function getSelectedProgramName() {
		var id = programSelect.val();
		switch (id) {
			case "8": return "Active";
			case "16": return "Classic";
			case "32": return "Prestige";
		}
	}

	jQuery.each(allPrograms, function(programNumber, program) {
		var programData = {};
		programData.programName = program;
		programData.objects = [];
		programData.objectsByName = {};
		programData.compensationByFirstRiskCheckbox = $("#" + program + "_CompensationByFirstRiskOnly");
		programData.compensationByFirstRiskField = $("#inpt_" + program + "_CompensationByFirstRiskOnly");
		for (var objectNum = 0; objectNum < allObjects.length; objectNum++) {
			var objectName = allObjects[objectNum];
			var checkbox = $("#" + program + "_" + objectName);
			if (checkbox.length > 0) {
				var data = { program: program,
					objectName: objectName,
					checkbox: checkbox,
					objectCostInput: $("#" + program + "_" + objectName + "ObjectCost"),
					insuranceMoneyInput: $("#" + program + "_" + objectName + "InsuranceMoney"),
					insuranceAmountValidationMessage: $("#" + program + "_" + objectName + "InsuranceMoneyValidationError"),
					insuranceMoneyDiv: $("#div_" + program + "_" + objectName + "InsuranceMoney"),
					fullPackageCheckbox: $("#" + program + "_" + objectName + "Risk_1"),
					fullPackageForcedMessage: $("#" + program + "_" + objectName + "FullPackageForcedMessage"),
					detailsBlock: $("#" + program + "_" + objectName + "_block")
				};

				data.objectCostInput.numeric();
				data.insuranceMoneyInput.numeric();				

				if (program != "Active") {
					data.risks = [];
					jQuery.each([1, 2, 3, 4], function(n, riskID) {
						var risk = {
							checkbox: $("#" + program + "_" + objectName + "Risk_" + riskID),
							backingField: $("#inpt_" + program + "_" + objectName + "Risk_" + riskID)
						};
						data.risks.push(risk);
					});
				}

				programData.objects.push(data);
				programData.objectsByName[objectName] = data;
			}
		}
		programControls[program] = programData;
	});

	// Список объектов, для которых необходима логика по принудительному включению 
	// полного пакета рисков и чекбокса "Выплата по первому риску".
	var objectsToCheckRisks = ['BearingStructuresIncluding',
							   'BearingStructures',
							   'InteriorDecoration',
							   'AdditionalBuildings',
							   'Sauna'];

	var prevCheckCompensationByFirstRiskValues = {};

	function checkRisks(program) {
		var compensationByFirstRiskChecked =
			program.compensationByFirstRiskCheckbox[0].disabled
				? prevCheckCompensationByFirstRiskValues[program]
				: program.compensationByFirstRiskCheckbox[0].checked;
		var forceCompensationByFirstRisk = false;
		var forceFillRiskPackageForObject = {};

		$.each(program.objects, function(objectIndex, controls) {
			if (controls.risks && controls.checkbox[0].checked) {
				var insuranceMoney = controls.insuranceMoneyInput.val();
				var objectCost = controls.objectCostInput.val();
				var insuranceMoneyNum = parseFloat(insuranceMoney);
				var objectCostNum = parseFloat(objectCost);

				var checkAmounts = $.inArray(controls.objectName, objectsToCheckRisks) >= 0;

				if (checkAmounts) {
					if (insuranceMoney != "" && objectCost != "" && !isNaN(insuranceMoneyNum) && !isNaN(objectCostNum)
						&& insuranceMoneyNum < objectCostNum) {
						forceFillRiskPackageForObject[controls.objectName] = true;
						forceCompensationByFirstRisk = true;
					}
				}
				else {
					forceFillRiskPackageForObject[controls.objectName] = false;				
				}
			}
		});

		$.each(program.objects, function(objectIndex, controls) {
			if (controls.risks) {
				var allowOnlyFullPackage =
					((compensationByFirstRiskChecked || forceCompensationByFirstRisk)
					  && (program.programName == 'Classic'))
					|| forceFillRiskPackageForObject[controls.objectName];

				var showOnlyFullPackageMessage = forceFillRiskPackageForObject[controls.objectName];

				if (allowOnlyFullPackage) {
					controls.risks[0].checkbox[0].checked = true;
					controls.risks[0].checkbox[0].disabled = true;
				} else {
					controls.risks[0].checkbox[0].disabled = false;
				}

				if (allowOnlyFullPackage && showOnlyFullPackageMessage) {
					controls.fullPackageForcedMessage.show();
				}
				else {
					controls.fullPackageForcedMessage.hide();
				}

				var fullPackageChecked = controls.risks[0].checkbox[0].checked;

				$.each(controls.risks, function(n, risk) {
					if (n != 0) {
						risk.checkbox[0].disabled = fullPackageChecked;
						if (fullPackageChecked) {
							risk.checkbox[0].checked = false;
						}
					}

					risk.backingField.val(risk.checkbox[0].checked ? "on" : "");
				});
			};
		});

		if (forceCompensationByFirstRisk) {
			if (!program.compensationByFirstRiskCheckbox[0].disabled) {
				program.compensationByFirstRiskCheckbox[0].disabled = true;
				prevCheckCompensationByFirstRiskValues[program] = program.compensationByFirstRiskCheckbox[0].checked;
				program.compensationByFirstRiskCheckbox[0].checked = true;
			}
		}
		else if (program.compensationByFirstRiskCheckbox[0].disabled) {
			program.compensationByFirstRiskCheckbox[0].disabled = false;
			program.compensationByFirstRiskCheckbox[0].checked = prevCheckCompensationByFirstRiskValues[program]
		}

		program.compensationByFirstRiskField.val(program.compensationByFirstRiskCheckbox[0].checked ? "on" : "");
	}

	function validateForm() {
		var anySelected = false;
		var program = getSelectedProgramName();

		jQuery.each(programControls[program].objects, function(objectNum, objectData) {
			if (objectData.checkbox[0].checked) {
				anySelected = true;
			}
		});

		if (anySelected) {
			CalcActionButtons.clearCalculationImpossibleState();
		}
		else {
			CalcActionButtons.setCalculationImpossibleState("Пожалуйста выберите как минимум один объект страхования.");
		}
	}

	function removeInsuranceAmountValidationMessage(objectControls) {
		objectControls.insuranceAmountValidationMessage.hide();
		if (objectControls.insuranceMoneyInput.length > 0) {
			objectControls.insuranceMoneyInput[0].readOnly = false;
		}
		objectControls.insuranceMoneyDiv.removeClass("with-error");
	}

	function showErrorMessage(element, errorMessage) {
		var el = $(element).parent().parent();
		if (!el.hasClass("with-error")) el.addClass("with-error");
		el.find(".error").text(errorMessage);
	}

	function hideErrorMessage(element) {
		var el = $(element).parent().parent();

		if (el.hasClass("with-error")) el.removeClass("with-error");
		el.find(".error").text("");
	} 


	function validateFormBeforeSend() {			
		var errorMessage1 = "Стоимость объекта должна быть больше 0";
		var errorMessage2 = "Стоимость объекта не может быть меньше, чем страховая сумма.";
		var errorMessage3 = "Стоимость объекта не указана.";
		var errorSummary = "Некоторые поля некорректно заполнены. Ошибки выделены в соответствующих полях, пожалуйста, исправьте значения.";
		var program = getSelectedProgramName();
		var result = true;
		jQuery.each(programControls[program].objects, function(objectNum, controls) {
			
			hideErrorMessage(controls.objectCostInput);
			if (controls.checkbox[0].checked) 
			{
				var objectCost = controls.objectCostInput.val();
				var insuranceMoney = controls.insuranceMoneyInput.val();
				var insuranceMoneyNum = parseFloat(insuranceMoney);
				var objectCostNum = parseFloat(objectCost);
		
				if (objectCost == "" ) 
				{
					showErrorMessage(controls.objectCostInput, errorMessage3 );
					result = false;
				}		
				if (result && objectCost != "" && !isNaN(objectCostNum) &&  objectCostNum == 0) 
				{
					showErrorMessage(controls.objectCostInput, errorMessage1 );
					result = false;
				}	
				if (result && insuranceMoney != "" && objectCost != "" && !isNaN(insuranceMoneyNum) && !isNaN(objectCostNum)
						&&  objectCostNum < insuranceMoneyNum) 
				{
					showErrorMessage(controls.objectCostInput, errorMessage2 );
					result = false;
				}
			}
		});
		
		if(!result)
		{
			$('#clientValidationErrors').text(errorSummary);
			$('#clientValidationErrors').parent().addClass('userMessage');
			$('#clientValidationErrors').parent().show();
		}
		else
		{
			$('#clientValidationErrors').text('');
			$('#clientValidationErrors').parent().removeClass('userMessage');
			$('#clientValidationErrors').parent().hide();
		}

		return result;
				
	}


	function showDetailsBlock(controls) {
		var element = controls.detailsBlock;
		if (controls.checkbox[0].checked) {
			//element.slideDown('normal');
			element.show();
		}
		else {
			//element.slideUp('normal');
			element.hide();
		}
	}

	$.each(programControls, function(programName, program) {
		$.each(program.objects, function(objectIndex, controls) {
			// Привязка событий к чекбоксам для выбора объектов страхования
			var objectCheckbox = controls.checkbox;
			if (objectCheckbox[0]) {
				objectCheckbox.click(function() {
					showDetailsBlock(controls);
					if (program.programName == "Active") {
						doSetActiveObjectAvailability();
					}
				});

				// Установка видимости полей объектов (страховая сумма, риски, и т.п.) после загрузки страницы, 
				// в зависимости от выбраных объектов страхования.
				showDetailsBlock(controls);
			}

			if (controls.objectCostInput && controls.insuranceMoneyInput) {
				controls.objectCostInput.change(function() {
					if (controls.insuranceMoneyInput.val() == "") {
						if ($('#numpad:visible').length > 0 && $.browser.msie && $.browser.version.substr(0,1) < 7) return;
						controls.insuranceMoneyInput.val(controls.objectCostInput.val());
					}
				});
			}

			if (controls.risks) {
				var checkRiskHandler = function() { checkRisks(program); };

				objectCheckbox.click(checkRiskHandler);

				// Привязка событий к чекбоксам выбора рисков			
				jQuery.each(controls.risks, function(n, risk) {
					if (risk.checkbox) {
						risk.checkbox.click(checkRiskHandler);
					}
				});

				controls.checkbox.click(checkRiskHandler);
				controls.objectCostInput.change(checkRiskHandler);
				controls.insuranceMoneyInput.change(checkRiskHandler);
			}

			controls.checkbox.click(validateForm);

			controls.objectCostInput.change(function() {
				removeInsuranceAmountValidationMessage(controls)
			});
		});

		if (program.compensationByFirstRiskCheckbox[0]) {
			program.compensationByFirstRiskCheckbox.click(function() {
				checkRisks(program);
				program.compensationByFirstRiskField.val(program.compensationByFirstRiskCheckbox[0].checked ? "on" : "");
			});
		}

		checkRisks(program);
	});

	// Маска для поля "год постройки"
	$("#BuildingYear").numeric();

	$("#arealSize").decimalNumeric();

	// Отключение поля "расположено в котеджном поселке" для всех регионов, кроме Московской области
	$("#regionFld").change(function() {
		var placedInCottageSettlementBlock = $("#Active_BearingStructuresPlacedInCottageSettlement_block");
		if ($("#regionFld").val() == '1') {
			placedInCottageSettlementBlock.show();
		} else {
			placedInCottageSettlementBlock.hide();
		}
	});

	// Обработка смены програмы страхования
	programSelect.change(function() {
		showSelectedProgram();
		validateForm();
	});
	programSelect.change();

	jQuery.each(["Classic", "Prestige"], function(programIndex, program) {
		jQuery.each(["BearingStructuresIncluding", "BearingStructures", "InteriorDecoration"], function(n, objectName) {
			// Привязка логики, отключающей объекты "строение без внутренней оттделки" и "внутренняя оттделка"
			// при включении объекта "строение, включая внутреннюю отделку и инженерное оборудование"
			$("#" + program + "_" + objectName).click(function() {
				doSetObjectAvailability(program);
			});
		});
		doSetObjectAvailability(program);
	});

	doSetActiveObjectAvailability();

	HouseOnSubmit = function() 
	{
		var isFormValid = validateFormBeforeSend();
		if (!isFormValid) return false;
		FormSubmit.OnSubmit();
	};

	new FormSubmit();
	$('#CalculateQuotation').bind(FormSubmit.OnSubmitEventName, HouseOnSubmit );
	//FormSubmit.SetCustomSubmitHandler ($('.formSubmitTypeButton'), HouseOnSubmit);

	$("#regionFld").change();
});

function showDependentBlock(elementId) {
	var checkbox = document.getElementById (elementId) ;
	var element = $("#" + elementId + "_block") ;
	if (checkbox.checked) {
		//element.slideDown('normal');
		element.show();
	}
	else {
		//element.slideUp('normal');
		element.hide();
	}
}

function showSelectedProgram (selectId) {
	$(".plan-block").hide();
	$("#InsuranceProgram_" + $("#InsuranceProgram").val ()).show () ;
}

houseCalcCheckboxStatus = { "Active": {}, "Classic": {}, "Prestige": {} };

function disableHouseObject(program, objectName)
{
	var cb = $("#" + program + "_" + objectName)[0];
	if (!cb.disabled)
	{
		houseCalcCheckboxStatus[program][objectName] = cb.checked;
		cb.checked = false;
		cb.disabled = true;
		$("#" + program + "_" + objectName + "_block").hide();
	}
}

function enableHouseObject(program, objectName)
{
	var cb = $("#" + program + "_" + objectName)[0];
	if (cb.disabled)
	{
		cb.disabled = false;
		if (houseCalcCheckboxStatus[program][objectName])
		{
			cb.checked = true;
			$("#" + program + "_" + objectName + "_block").show();
		}
	}
}	

function doSetObjectAvailability(prefix)
{
	var bearingStructuresIncluding = $("#" + prefix + "_BearingStructuresIncluding")[0];
	var secondaryObjects = ["Homestead", "HomesteadSpecial", "AdditionalBuildings", "Sauna", "CivilLiability"];

	if (bearingStructuresIncluding.checked)
	{
		disableHouseObject(prefix, "BearingStructures");
		disableHouseObject(prefix, "InteriorDecoration");
	}
	else {
		enableHouseObject(prefix, "BearingStructures");
		enableHouseObject(prefix, "InteriorDecoration");
	}
	
	if (prefix == "Classic")
	{
		var secondaryObjectsEnabled = bearingStructuresIncluding.checked 
			|| $("#" + prefix + "_BearingStructures")[0].checked 
			|| $("#" + prefix + "_InteriorDecoration")[0].checked;
		
		jQuery.each(secondaryObjects, function(n, objectName) {
			if (secondaryObjectsEnabled) 
			{
				enableHouseObject(prefix, objectName);
			}
			else
			{
				disableHouseObject(prefix, objectName);
			}		
		});
	}
}

function doSetActiveObjectAvailability () {
	var checkbox_Active_BearingStructures = document.getElementById ("Active_BearingStructures") ;
	var checkbox_Active_InteriorDecoration = document.getElementById ("Active_InteriorDecoration") ;
	var checkbox_Active_Homestead = document.getElementById ("Active_Homestead") ;

	if (!checkbox_Active_InteriorDecoration.checked)
	{
		disableHouseObject("Active", "Homestead");
	}
	else {
		enableHouseObject("Active", "Homestead");
	}

	var additionalObjects =
		["AdditionalBuildings",
		 "Sauna",
		 "HomesteadSpecial",
		 "CivilLiability"];

	var isAdditionalObjectsEnabled = 
		checkbox_Active_BearingStructures.checked || checkbox_Active_InteriorDecoration.checked;		
		
	for(var n = 0; n < additionalObjects.length; n++){
		if (!isAdditionalObjectsEnabled)
		{
			disableHouseObject("Active", additionalObjects[n]);
		} else {
			enableHouseObject("Active", additionalObjects[n]);
		}
	}
}
