/// <reference path="../jquery.js" />

/*
	Kasko calculator dependencies:
	
	<Field>: <dependend on>
	ContractRegion: none
	ProductionYear: none
	InsuranceType: ProductionYear, ContractRegion, VehicleType or VehicleVendor 
	RedressMethod: InsurantPersonType, InsuranceType
	
	VehicleCost calculation data: ContractRegion, VehicleModel
	VehicleCost calculation controls: ContractRegion, VehicleModel, ProductionYear
*/

/* BEGIN: jQuery вспомогательный метод для заполнения вып. списка */
$.fn.fill = function(arr, emptyText, optionCallback) {
	optionCallback = optionCallback || function(val) { return '<option>' + val + '</option>'; };
	var options = arr && emptyText != null ? '<option value="">' + emptyText + '</option>' : '';
	$.each(arr, function(key, val) {
		options += optionCallback(val, key);
	});
	this.html(options);
	if (arr.length === 1) {
		try { this.val(arr[0]); } catch (e) { if (window.console) console.error(e.name); } // fix for ie6
	}
	return this.attr('disabled', arr.length <= 1 && emptyText != null);
};
/* END: jQuery вспомогательный метод для заполнения вып. списка */

var validationObj1 = {
	onsubmit: false,
	focusInvalid: true,
	focusCleanup: false,
	errorClass: 'with-error',
	rules: {
		vehicleModels: {
			required: true
		},
		vehicleVendors: {
			required: true
		},
		QuotationCriteria_AdmittedDrivers_DriverInfo_Age1: {
			required: function ()  {
				if ($("#dontLimitAdmittedDrivers").is(':checked')) return false;
				if ($("#selectedInsurantTypeValue").val() != "PhysicalPerson") return false;
				var result = $("#agesDate1").val() == "" && $("#ages1").val() == "";
				return result;
				}
		},
		QuotationCriteria_AdmittedDrivers_DriverInfo_DrivingExperienceYears1: {
			required: function ()  {
				if ($("#selectedInsurantTypeValue").val() != "PhysicalPerson") return false;
				if ($("#dontLimitAdmittedDrivers").is(':checked')) return false;
				var result = $("#experienceDate1").val() == "" && $("#experience1").val() == "";
				return result;
				}
		},
		QuotationCriteria_VehicleInfo_VehicleCost: {
			required: true
		},
		QuotationCriteria_AdditionalRisks_InsuranceMoney: {	
			required: "#driverLifeIns:checked" 
		}
	},
	messages: {
		vehicleModels: {
			required: "Модель ТС не выбрана."
		},
		vehicleVendors: {
			required: "Марка ТС не выбрана."
		},
		QuotationCriteria_AdmittedDrivers_DriverInfo_Age1: {
			required: "Возраст или дата рождения водителя должны быть указаны."
		},
		QuotationCriteria_AdmittedDrivers_DriverInfo_DrivingExperienceYears1: {
			required: "Стаж или дата начала стажа водителя должны быть указаны."
		},
		QuotationCriteria_VehicleInfo_VehicleCost: {
			required: "Действительная стоимость ТС не выбрана."
		},
		QuotationCriteria_AdditionalRisks_InsuranceMoney: {	
			required: "Страховая сумма несчастного случая не выбрана."
		}
	},
	errorPlacement: function (error, element) {
		var el = element.parent().parent();
		var name = element.attr("id");
		if(name == "realVehiclesPrice") el = $("#realVehiclesPriceCont");
		else if(name == "experience1" || name == "experienceDate1") el = $("#experienceInputWrapper");
		else if(name == "ages1" || name == "agesDate1") el = $("#agesInputWrapper");
		
		el.find(".error").text(error.text());
	},
	success: function (element) {
		var el = element.parent().parent();
		var name = element.attr("id");

		if(name == "realVehiclesPrice") el = $("#realVehiclesPriceCont");
		else if(name == "experience1" || name == "experienceDate1") el = $("#experienceInputWrapper");
		else if(name == "ages1" || name == "agesDate1") el = $("#agesInputWrapper");
		el.find(".error").text("");

	} ,

	highlight: function (element, errorClass, validClass) {
		var el = $(element).parent().parent();
		var name = $(element).attr("id");
		if(name == "realVehiclesPrice") el = $("#realVehiclesPriceCont");
		else if(name == "experience1" || name == "experienceDate1") el = $("#experienceInputWrapper");
		else if(name == "ages1" || name == "agesDate1") el = $("#agesInputWrapper");
		
		if (!el.hasClass("with-error")) el.addClass("with-error");
	},
	unhighlight: function (element, errorClass, validClass) {
		var el = $(element).parent().parent();
		var name = $(element).attr("id");
		if(name == "realVehiclesPrice") el = $("#realVehiclesPriceCont");
		else if(name == "experience1" || name == "experienceDate1") el = $("#experienceInputWrapper");
		else if(name == "ages1" || name == "agesDate1") el = $("#agesInputWrapper");

		el.find(".error").text("");

		if (el.hasClass("with-error")) el.removeClass("with-error");
	} 

};



Kasko = function(kaskoOptions)
{
	// Init autosuggest controls
	//$("select.autosuggest").autosuggest();
	var notSupportedVehicleTypes = ["1", "5", "6"];
	var vehicleTypesWithVendors = ["2", "3", "4"];
	this.vehicleTypesWithoutVendors = ["7", "8", "9", "10"];

	this.options = kaskoOptions;
	this.inputMasks = new InputMasks();
	this.numPad = new NumPad();
	this.vehicleCostCalculationManager = new Kasko.VehicleCostCalculation.Manager(this);

	kasko = this;

	var UpdateVehicleCostCalculationDataDelegate = function() { kasko.UpdateVehicleCostCalculationData(); };
	var UpdateVehicleCostCalculationSectionDelegate = function() { kasko.vehicleCostCalculationManager.UpdateCalculationSection(); };
	var UpdateVehicleAgeDelegate = function() { kasko.UpdateVehicleAge(); };
	var UpdateInsuranceTypeDelegate = function() { kasko.UpdateInsuranceType(); };
	var UpdateCurrencyRateDelegate = function() { kasko.UpdateCurrencyRate(); };
	var UpdateDsagoInsuranceMoneyDelegate = function() { kasko.DSAGOrequestReward(); };
	var UpdateInsurancePremiumDelegate = function() { kasko.UpdateInsurancePremium(); };
	var UpdateDisplayPricesCurrencyDelegate = function() { kasko.UpdateDisplayPricesCurrency(); };
	var SynchronizeModelInfoDelegate = function() { kasko.SynchronizeModelInfo(); };
	var RefreshVehicleInfoWeightDelegate = function() { kasko.RefreshVehicleInfoWeight(); };
	var RefreshNumberOfSeatsDelegate = function() { kasko.RefreshNumberOfSeats(); };
	var RefreshAdmittedDriversSectionDelegate = function() { kasko.RefreshAdmittedDriversSection(); };
	var UpdateContractSignSectionDelegate = function() { kasko.UpdateContractSignSection(); }
	var RefreshContractTypeDelegate = function(event) { kasko.RefreshContractType(event); }
	var UpdateFranchiseTypeDelegate = function(event) { kasko.UpdateFranchiseType(event); }
	var UpdateFranchisesDelegate = function(event) { kasko.UpdateFranchises(event); } 
	
	this.InitializeAdmittedDriversCloneable();

	this.ctlContractRegion = $("#regionContract");
	this.ctlContractRegion
		.autosuggest()
		.change(UpdateVehicleCostCalculationDataDelegate)
		.change(UpdateDsagoInsuranceMoneyDelegate);

	this.ctlVehicleVendor = $("#vehicleVendors");
	this.ctlVehicleModel = $("#vehicleModels");

	var autosuggestOptionsWithConfirm =
	{
		changeCallback: function(args)
		{
			kasko.vehicleCostCalculationManager.ConfirmCalculatedCostReset(args);
		}
	}

	this.ctlVehicleVendor.autosuggest(autosuggestOptionsWithConfirm);
	this.ctlVehicleModel.autosuggest(autosuggestOptionsWithConfirm);

	kasko.ctlVehicleModelModification = $("*[name='QuotationCriteria_VehicleInfo_ModelModificationID']");

	kasko.ctlProductionYear = $("#yearofIssue");
	kasko.ctlProductionYear
		.change(UpdateVehicleCostCalculationSectionDelegate)
		.change(UpdateVehicleAgeDelegate);

	$("#newVehicleCheckbox").change(UpdateVehicleAgeDelegate);

	kasko.ctlVehicleType = $("#vehicleType");
	kasko.ctlVehicleType.change(RefreshAdmittedDriversSectionDelegate);
	kasko.ctlVehicleType.change(UpdateContractSignSectionDelegate);

	kasko.ctlInsuranceType = $("#insTypes");

	kasko.ctlVehicleCostSection = $("#realVehiclesPriceCont")
	kasko.ctlVehicleCost = $("#realVehiclesPrice");

	this.ctlCurrency = $("#insCurrency");
	this.ctlCurrency
		.change(UpdateCurrencyRateDelegate)
		.change(UpdateInsurancePremiumDelegate)
		.change(UpdateDisplayPricesCurrencyDelegate)
		.change(UpdateDsagoInsuranceMoneyDelegate);

	kasko.currencyCode = kasko.ctlCurrency.val();

	kasko.ctlCurrency.change();

	$.data(document, "kasko-calc", kasko);

	$('#lengthOfInsurance').change(UpdateContractSignSectionDelegate);

	$('#ownerChanged').click(RefreshContractTypeDelegate);
	$('#vehicleChanged').click(RefreshContractTypeDelegate);
	$('#oneYearContract').click(RefreshContractTypeDelegate);
	
	$("#franchiseType").change(UpdateFranchiseTypeDelegate);

	$('#doDSAGO, #trailerDSAGO').click(UpdateDsagoInsuranceMoneyDelegate);

	this.ctlSelectedInsurantTypeValue = $("#selectedInsurantTypeValue");
	this.insurantTypeCtls = $("#insurantTypes td");
	this.insurantTypeCtls.click(function() { kasko.SetInsurantType(this.id); });

	this.ctlDontLimitAdmittedDrivers = $("#dontLimitAdmittedDrivers");
	this.ctlDontLimitAdmittedDrivers.click(RefreshAdmittedDriversSectionDelegate);

	this.ctlAdmittedDriversRestriction = $("#admittedDriversRestriction");

	var ctlVehicleVendorID = this._GetJQueryIDSelector(this.ctlVehicleVendor);

	kasko.ctlVehicleType.depended()
		.addDepended(
		{
			container: ctlVehicleVendorID,
			eventValues: vehicleTypesWithVendors,
			loadCallback: function(dependedItem)
			{
				$.autosuggest.deactivate(dependedItem.container);
				var vehicleType = $(this.element).val();

				var completedCallback = function(resultJson, isSuccesful)
				{
					$.autosuggest.activate(dependedItem.container);
					if (isSuccesful)
					{
						bindSelectBox(dependedItem.container, resultJson["vendors"][vehicleType], function(e) { if (e[2]) { return true; } else { return false; } }, function(e) { return e[0]; }, function(e) { return e[1]; });
						$(dependedItem.container).refreshDepended();
					}
				};

				$.CalcDataProvider.GetVehicleVendors(completedCallback, vehicleType, kasko.options.vendorID);
			},
			clearCallback: function(dependedItem)
			{
				$.autosuggest.changeOptions($(dependedItem.container));
			}
		});

	kasko.ctlVehicleVendor.depended()
		.addDepended({
			container: "#vehicleModels",
			eventValues: null,
			loadCallback: function(dependedItem)
			{
				$.autosuggest.deactivate(dependedItem.container);

				var vendorID = $("#vehicleVendors").val().split(";")[0];
				var completedCallback = function(resultJson, isSuccesful)
				{
					$.autosuggest.activate(dependedItem.container);
					if (isSuccesful)
					{
						bindSelectBox(dependedItem.container,
							resultJson["models"][vendorID],
							function(e)
							{
								return e.active;
							},
							function(e)
							{
								var extStr = "";
								if (e.id != "")
								{
									extStr = "|";
									extStr += e.extension ? "1" : "0";
								}
								if (e.groupId)
								{
									extStr += "|";
									extStr += e.groupId;									
								}
								return e.id + extStr;
							},
							function(e)
							{
								return e.text;
							});
						$(dependedItem.container).refreshDepended();
					}
				};

				$.CalcDataProvider.GetVehicleModels(completedCallback, $("#vehicleType").val(), vendorID, kasko.options.modelID);
			},
			clearCallback: function(dependedItem)
			{
				$.autosuggest.changeOptions($(dependedItem.container));
				$("#hVehicleModel").val("");
				$("#hVehicleModelExt").val("");
			}
		});

	kasko.ctlInsuranceType.depended()
		.addDepended({
			container: "#paymentSchedule",
			loadCallback: function(dependedItem)
			{
				$.autosuggest.deactivate(dependedItem.container);

				var insuranceTypeID = kasko.getInsuranceTypeID();

				var completedCallback = function(resultJson, isSuccesful)
				{
					$.autosuggest.activate(dependedItem.container);
					if (isSuccesful)
					{
						bindSelectBox(dependedItem.container, resultJson["redressMethods"][insuranceTypeID], function(e) { if (e[2]) { return true; } else { return false; } }, function(e) { return e[0]; }, function(e) { return e[1]; });
						$(dependedItem.container).refreshDepended();
					}
				};

				$.CalcDataProvider.GetRedressMethods(completedCallback, insuranceTypeID, kasko.GetPersonType(), kasko.options.redressMethodID);
			},
			clearCallback: function(dependedItem)
			{
				$(dependedItem.container).refreshDepended();
			}
		});

	kasko.ctlVehicleModel.depended()
		.addDepended(
		{
			container: "#dummy",
			loadCallback: UpdateVehicleCostCalculationDataDelegate,
			clearCallback: UpdateVehicleCostCalculationDataDelegate
		})
		.addDepended(
		{
			container: "#absoluteFranchise",
			loadCallback: UpdateFranchisesDelegate,
			clearCallback: UpdateFranchisesDelegate
		})
		.addDepended(
		{
			container: "#numberOfSeats",
			loadCallback: RefreshNumberOfSeatsDelegate,
			clearCallback: RefreshNumberOfSeatsDelegate
		})
		.addDepended(
		{
			container: "#vehicleInfoWeight",
			loadCallback: RefreshVehicleInfoWeightDelegate,
			clearCallback: RefreshVehicleInfoWeightDelegate
		});

	this.InitializeDependencies();

	kasko.ctlVehicleVendor.bind("change", function()
	{
		var value = $("#vehicleVendors").val();
		if (value == null)
			$("#QuotationCriteria_VehicleInfo_MakerID").val("");
		else
			$("#QuotationCriteria_VehicleInfo_MakerID").val(value.split(";")[0]);
	});

	kasko.ctlVehicleModelID = $("#hVehicleModel");
	kasko.ctlVehicleModelInfo = $("#hVehicleModelExt");

	kasko.ctlVehicleModel.bind("change", SynchronizeModelInfoDelegate);
	
	$("#franchiseType").change(UpdateFranchiseTypeDelegate);
	
	kasko.ctlVehicleType.change(function()
	{
		var thisObj = $(this);
		if (jQuery.inArray(thisObj.val(), notSupportedVehicleTypes) != -1)
		{
			CalcActionButtons.setCalculationImpossibleState($("#vehicleTypeIsNotSupportedMessage div").text());
		}
		else
		{
			CalcActionButtons.clearCalculationImpossibleState();
		}
	});

	this.ctlContractType = $('#contractSign');
	this.ctlContractType.change(UpdateContractSignSectionDelegate);

	cUtils = new CalcUtils();
	/* FIELD DEPENDENCIES */
	var fieldDependencies = [
	{
		'main': '#vehicleType', 'dependant': '#vehicleModelsCont', 'type': cUtils.dependencyTypes.selected,
		'params': { 'isInversed': true, values: this.vehicleTypesWithoutVendors }
	},
	{
		'main': '#vehicleType', 'dependant': '.shouldBeHiddenWhenVehicleTypeIsNotSupported, .shouldBeHiddenWhenVehicleTypeIsNotSupported select:not(#admittedDriversRestriction)', 'type': cUtils.dependencyTypes.selected,
		'params': { 'isInversed': true, 'values': notSupportedVehicleTypes }
	},
	{
		'main': '#vehicleType', 'dependant': '#vehicleTypeIsNotSupportedMessage', 'type': cUtils.dependencyTypes.selected,
		'params': { 'values': notSupportedVehicleTypes }
	},
	{
		'main': '#vehicleType', 'dependant': '#vehicleVendorsCont', 'type': cUtils.dependencyTypes.selected,
		'params': { 'isInversed': true, values: this.vehicleTypesWithoutVendors }
	},
	{
		'main': '#driverLifeIns', 'dependant': '.driverLifeInsDependent', 'type': cUtils.dependencyTypes.checked,
		'params': { 'isInversed': false }
	},
	{
		'main': '#doDSAGO', 'dependant': '.doDSAGODependent', 'type': cUtils.dependencyTypes.checked,
		'params': { 'isInversed': false }
	},
	{
		'main': this._GetJQueryIDSelector(this.ctlContractType), 'dependant': '#contractSignCheckboxes', 'type': cUtils.dependencyTypes.selected,
		'params': { 'values': ['2'] }
	},
	{
		'main': this._GetJQueryIDSelector(this.ctlContractType), 'dependant': '#previousContractData', 'type': cUtils.dependencyTypes.selected,
		'params': { 'values': ['2'] }
	}
	];

	cUtils.initDependencyGroup(fieldDependencies);

	$("#conditionalFranshise")
		.click(function() { kasko.UpdateAbsoluteFranchise(); })
		.click(kasko.setFranchiseType);

	/* END FIELD DEPENDENCIED */
	var inputcols = $('#kaskoCalc input, #kaskoCalc select').not(":last, .autosuggest, #vehicleVendor");
	cUtils.checkDependenciesAfterLoad(inputcols);

	kasko.DSAGOrequestReward();

	if (window.location.hash == '#recalculate')
	{
		Utils.debug(window.location.hash);
		var blocks = $('.collapsableForm');
		blocks[0].style.display = 'block';
		if (blocks.length > 1)
		{
			blocks[1].style.display = 'none';
		}
	}

	this.insurantTypeCtls.filter(".active").click();
	

	// Please put all active initialization here

	// Year
	var currentYear = this.GetCurrentYear();
	var maxProductionYear = currentYear;
	var minProductionYear = currentYear - this.options.maxVehicleAge
	this.SetProductionYearRange(minProductionYear, maxProductionYear);

	// VehicleType and dependent
	this.ctlVehicleType.refreshDepended();

	kasko.SynchronizeModelInfo();
	//kasko.RefreshVehicleInfoWeight();

	this.ctlVehicleType.selectConfirm({
		confirmCallBack: function(args)
		{
			kasko.vehicleCostCalculationManager.ConfirmCalculatedCostReset(args)
		}
	});

	this.InitializeInputMasks();
	
	var timeFld = $('#insLengthTimeFrom');
	
	function genOpt(h){
		var opt = [];
		for (var i = h; i < 24; i++){
			var h = (i.toString().length === 1) ? '0' + i : i;
			opt.push('<option value="' + h + ':00">' + h + ':00</option>');
		}
		return $(opt.join(''));
	}
	
	$('input[name*=QuotationCriteria_InsurancePeriod_Beginning]').change(function(){
		var today = new Date(),
			el = $(this),
			val = el.datepicker('getDate');
		
		if (!val){
			val = new Date(today);
		}
		
		if ($.datepicker.formatDate('dd.mm.yy', today) === $.datepicker.formatDate('dd.mm.yy', val)){
			val = today;
		}
		
		var hour = (val.getMinutes() !== 0) ? val.getHours() + 1 : val.getHours();
		if (hour === 24) {
			hour = 0;
			val.setHours(val.getHours() + 1);
			today.setHours(today.getHours() + 1);
		}
		
		el.datepicker('setDate', val);
		$.datepicker.formatDate('dd.mm.yy', today);

		if ($.datepicker.formatDate('dd.mm.yy', today) === $.datepicker.formatDate('dd.mm.yy', val)){
			timeFld.empty();
			timeFld.append(genOpt(hour));
			timeFld.val(hour + ':00');
			timeFld[0].disabled = null;
		} else {
			timeFld.empty();
			timeFld.append(genOpt(0));
			timeFld.val('00:00');
			timeFld[0].disabled = 'disabled';
		}
		
		/* QuotationCriteria_InsurancePeriod_End */
		var dateSplit = this.value.split('.');
		var length = parseInt($('select[name*=QuotationCriteria_InsurancePeriodID]').attr('value')) + 5;
		dateSplit[1] = dateSplit[1].charAt(0) == '0' ? dateSplit[1].charAt(1) : dateSplit[1] ;
		dateSplit[1] = parseInt(dateSplit[1]) + length;
		var dateEnd = new Date(dateSplit[2],dateSplit[1] - 1,dateSplit[0]);
		dateEnd.setDate(dateEnd.getDate()-1);
		var endDate = dateEnd.getDate() <= 10 ? '0'+(dateEnd.getDate()) : (dateEnd.getDate()) ;
		var endMonth = dateEnd.getMonth() + 1 < 10 ? '0'+(dateEnd.getMonth() + 1) : (dateEnd.getMonth() + 1) ;
		$('input[name*=QuotationCriteria_InsurancePeriod_End]').attr('value', endDate+'.'+endMonth+'.'+dateEnd.getFullYear());
	}).change();
	
	/* Payments */

	$(function(){		
		
		var Count = $('select[name=PolicyProjectCriteria_Payments_Count]'),
			CurDate = new Date(),
			payments = [
				{
					amount: $('input[name=PolicyProjectCriteria_Payments_CashPayment_Amount1]'),
					date: $('input[name=PolicyProjectCriteria_Payments_CashPayment_DateTime1]')
				},
				{
					amount: $('input[name=PolicyProjectCriteria_Payments_CashPayment_Amount2]'),
					date: $('input[name=PolicyProjectCriteria_Payments_CashPayment_DateTime2]')/*,
					maxDate: (function(date){
						date = new Date(date);
						date.setMonth(date.getMonth() + 3);
						return date;
					})(CurDate)*/
				},
				{
					amount: $('input[name=PolicyProjectCriteria_Payments_CashPayment_Amount3]'),
					date: $('input[name=PolicyProjectCriteria_Payments_CashPayment_DateTime3]')/*,
					maxDate: (function(date){
						date = new Date(date);
						date.setMonth(date.getMonth() + 6);
						return date;
					})(CurDate)*/
				}
			],
			Premium = parseFloat($('#Premium').val()),
			dates = [];
		
		if (!Premium) return;
		
		payments[1].block = payments[1].amount.parents('.payment');
		payments[2].block = payments[2].amount.parents('.payment');
		
		//payments[1].date.datepicker('option', 'minDate', CurDate);
		//payments[2].date.datepicker('option', 'minDate', CurDate);
		
		//payments[1].date.datepicker('option', 'maxDate', payments[1].maxDate);
		//payments[2].date.datepicker('option', 'maxDate', payments[2].maxDate);
		
		function setDates(){
			var Payments = payments;
			Payments[0].date.change();
		}
		
		payments[0].date.bind('change', function(){
			var Payments = payments,
				curDate = CurDate,
				count = parseInt(Count.val());
			dates[0] = Payments[0].date.datepicker('getDate');
			//if (!dates[0] || dates[0].valueOf() < curDate.valueOf()){
			if (!dates[0]){
				Payments[0].date.datepicker('setDate', curDate);
				dates[0] = curDate;
			}
			
			
			if (count > 1){
				Payments[1].date.change();
			}
			if (count === 3){
				Payments[2].date.change();
			}
		});
		
		payments[1].date.bind('change', function(){
			var Payments = payments,
				count = parseInt(Count.val()),
				curDate = CurDate,
				maxDate = Payments[1].maxDate;
			if (count > 1){
				dates[1] = Payments[1].date.datepicker('getDate');
				//if (!dates[1] || dates[1].valueOf() < curDate.valueOf() || dates[1].valueOf() >  maxDate.valueOf()){
				if (!dates[1]){
					Payments[1].date.datepicker('setDate', (function(date){
						date = new Date(date);
						date.setMonth(date.getMonth() + 3);
						return date;
					})(dates[0]));
				}
				Payments[2].date.change();
			}
		});
		
		payments[2].date.bind('change', function(){
			var Payments = payments,
				curDate = CurDate,
				count = parseInt(Count.val()),
				maxDate = Payments[2].maxDate;
			if (count === 3){
				dates[2] = Payments[2].date.datepicker('getDate');
				//if (!dates[2] || dates[2].valueOf() < curDate.valueOf() || dates[2].valueOf() >  maxDate.valueOf()){
				if (!dates[2]){
					Payments[2].date.datepicker('setDate', (function(date){
						date = new Date(date);
						date.setMonth(date.getMonth() + 6);
						return date;
					})(dates[0]));
				}
			}
		});
		
		Count.change(function(){
			var val = parseInt(Count.val()),
				Payments = payments;
				
			switch (val){
				case 1:
					Payments[0].amount.val(Premium);
					Payments[1].amount.val('');
					Payments[2].amount.val('');
					
					Payments[1].block.hide();
					Payments[2].block.hide();
					break;
				case 2:
					Payments[0].amount.val(Premium / 2);
					Payments[1].amount.val(Premium / 2);
					Payments[2].amount.val('');
					
					Payments[1].block.show();
					Payments[2].block.hide();
					break;
				case 3:
					Payments[0].amount.val(Premium * 40 / 100);
					Payments[1].amount.val(Premium * 30 / 100);
					Payments[2].amount.val(Premium * 30 / 100);
					
					Payments[1].block.show();
					Payments[2].block.show();
					break;
			}
			setDates();
		}).change();
	});
	
	(function($){
		var inputs = [
			[ // Выгодоприобретатель
				$('input[name=PolicyProjectCriteria_BeneficiaryIsInsurant]'), // Страхователь - 64
				$('input[name=PolicyProjectCriteria_BeneficiaryIsOwner]') // Собственник - 65
			],
			[ // Собственник
				$('input[name=PolicyProjectCriteria_OwnerIsInsurant]'), // Страхователь - 67
				$('input[name=PolicyProjectCriteria_OwnerIsBeneficiary]') // Выгодоприобретатель - 68
			],
			[
				$('input[name=InvolvedPersons_Person_Name]'), // ФИО - Наименование организации - 55
				$('input[name=PolicyProjectCriteria_BeneficiaryName]'), // ФИО - Выгодоприобретатель - 66
				$('input[name=PolicyProjectCriteria_OwnerName]') // ФИО - Собственник - 70
			]
		];
		
		inputs[0][0].bind('change click' , function(){ // Выгодоприобретатель - Страхователь
			if (this.checked){
				var val = inputs[2][0].val();
				inputs[2][1].val(val);
				inputs[2][1][0].readonly = 'readonly';
				inputs[2][1].addClass('readonly');
				if (inputs[0][1][0].checked){
					inputs[1][0][0].checked = 'ckeched';
					inputs[2][2].val(val);
					inputs[2][2][0].readonly = 'readonly';
					inputs[2][2].addClass('readonly');
				}
			} else {
				inputs[2][1][0].readonly = null;
				inputs[2][1].removeClass('readonly');
				if (inputs[0][1][0].checked){
					inputs[1][0][0].checked = null;
					inputs[2][2][0].readonly = null;
					inputs[2][2].removeClass('readonly');
				}
			}
		});
		
		inputs[0][1].bind('change click' , function(){ // Выгодоприобретатель - Собственник
			if (this.checked){
				inputs[2][1].val(inputs[2][2].val());
				inputs[1][1][0].checked = 'ckeched';
				if (inputs[0][0][0].checked || inputs[1][0][0].checked){
					inputs[0][0][0].checked = 'checked';
					inputs[1][0][0].checked = 'checked';
					inputs[0][0].triggerHandler('change');
				}
			} else {
				inputs[1][1][0].checked = null;
			}
		});
		
		inputs[1][0].bind('change click' , function(){ // Собственник - Страхователь
			if (this.checked){
				var val = inputs[2][0].val();
				inputs[2][2].val(val);
				inputs[2][2][0].readonly = 'readonly';
				inputs[2][2].addClass('readonly');
				if (inputs[1][1][0].checked){
					inputs[0][0][0].checked = 'ckeched';
					inputs[2][1].val(val);
					inputs[2][1][0].readonly = 'readonly';
					inputs[2][1].addClass('readonly');
				}
			} else {
				inputs[2][2][0].readonly = null;
				inputs[2][2].removeClass('readonly');
				if (inputs[1][1][0].checked){
					inputs[0][0][0].checked = null;
					inputs[2][1][0].readonly = null;
					inputs[2][1].removeClass('readonly');
				}
			}
		});
		
		inputs[1][1].bind('change click' , function(){ // Собственник - Выгодоприобретатель
			if (this.checked){
				inputs[2][2].val(inputs[2][1].val());
				inputs[0][1][0].checked = 'ckeched';
				if (inputs[0][0][0].checked || inputs[1][0][0].checked){
					inputs[0][0][0].checked = 'checked';
					inputs[1][0][0].checked = 'checked';
					inputs[0][0].triggerHandler('change');
				}
			} else {
				inputs[0][1][0].checked = null;
			}
		});

		inputs[0][0].triggerHandler('change');
		inputs[0][1].triggerHandler('change');
		inputs[1][0].triggerHandler('change');
		inputs[1][1].triggerHandler('change');
		
	})($);

	this.OnInitialized();
};


/* Hmmm... must be in UDS, I think */
Kasko.agesToExp = {
	'21': {
		'2': '3',
		'4': '3',
		'100': '0'
	},
	'24': {
		'2': '3',
		'4': '2',
		'100': '0'
	},
	'100': {
		'2': '2',
		'100': '0'
	}
};

Kasko.prototype =
{
	VehicleType:
	{
		Car: 2,
		Special: 7
	},
	ContractType:
	{
		Initial: 1,
		Prolonged: 2
	},

	defaultCurrencyCode: "RUR",
	maxMonthForNewVehicle: 3,

	currencyCode: null,

	// Controls
	ctlVehicleType: null,

	ctlVehicleCost: null,

	ctlProductionYear: null,
	ctlCurrency: null,

	ctlVehicleVendor: null,

	ctlVehicleModel: null,
	ctlVehicleModelID: null,
	ctlVehicleModelInfo: null,

	ctlInsuranceType: null,

	ctlSelectedInsurantTypeValue: null,
	insurantTypeCtls: null,
	ctlDontLimitAdmittedDrivers: null,
	ctlAdmittedDriversRestriction: null,
	ctlContractType: null,

	options: null,
	initialized: false,
	vehicleCostCalculationManager: null,

	_GetJQueryIDSelector: function(ctl)
	{
		return "#" + ctl.get(0).id;
	},

	InitializeDependencies: function()
	{
		var self = this;

		var ctlInsuranceTypeID = this._GetJQueryIDSelector(this.ctlInsuranceType);

		var insTypesDependency =
		{
			container: ctlInsuranceTypeID,
			eventValues: null,
			loadCallback: function(dependedItem)
			{
				self.UpdateInsuranceType();
				$(dependedItem.container).refreshDepended();
			},
			clearCallback: function(dependedItem)
			{
				$.autosuggest.changeOptions($(dependedItem.container));
			}
		};

		var admittedDriversRestrictionDependency =
		{
			container: this._GetJQueryIDSelector(this.ctlAdmittedDriversRestriction),
			eventValues: null,
			loadCallback: function(dependedItem)
			{
				self.UpdateAdmittedDriversRestriction();
				$(dependedItem.container).refreshDepended();
			},
			clearCallback: function(dependedItem)
			{
				$.autosuggest.changeOptions($(dependedItem.container));
			}
		};

		this.ctlVehicleType
			.addDepended(insTypesDependency);

		this.ctlVehicleVendor
			.addDepended(insTypesDependency);

		this.ctlProductionYear.depended()
			.addDepended(insTypesDependency);

		this.ctlContractRegion.depended()
			.addDepended(insTypesDependency)
			.addDepended(admittedDriversRestrictionDependency);
	},

	InitializeAdmittedDriversCloneable: function()
	{
		var franchise = new Franchise();
		var kaskoElement = this;
		
		/* DELETION CONFIRMATION POPUP */
		deleteConfirm = new PopUp('', 'confirm', '<p>Вы уверены что хотите удалить элемент?</p>', '')
		deleteConfirm.setButtonText({ 'ok': 'Да', 'cancel': 'Нет' });
		var ButtonCallback = function() { };
		ButtonCallback.prototype.popupNotify = function(b, o)
		{
			if (b)
			{
				CalcActionButtons.setCalculateQuotationState();
			}
		}
		deleteConfirm.addResultListeners(new ButtonCallback());
		/* END DELETION CONFIRMATION POPUP */
		/* Create deletable and closeable element*/
		closeable = new Closeable(deleteConfirm);
		closeable.setCallback(new DeleteDriverElement(this));
		/* Create cloneable element*/
		cloneable = new Cloneable('#addDriverPattern', //pattern to clone
							'#addDriver', //action button to place cloned elements
							new Array(closeable, this.numPad, this.inputMasks, new DriverElement(), franchise), //binding functionality to newly cloned elements
							'#driversToUseVihcle', //Counter Field selector
							2 //Maximum number of clones
						);
		cloneable._setActionContainer("#addButton");
		$("#addButton").click(CalcActionButtons.setCalculateQuotationState);

		closeable.setCallback(cloneable); //callback to reduce number of cloned elements in cloneable Object

		cloneable._reinit();
	},

	InitializeInputMasks: function()
	{
		$("#insVehiclesAmountCont input, #realVehiclesPrice, #insAmount, #driverLifeInsAmount, #vehicleInfoWeight").numeric();

		var dateBeforeNowInputs = $("*[name='InvolvedPersons_DocumentID_IssuedWhen']");
		InputMasks.InitializeDatePicker(dateBeforeNowInputs, null, new Date());

		InputMasks.InitializeDatePicker($(".PolicyDrivingExperience"), null, null);

		var dateAfterNowInputs = $(
		"*[name='PolicyProjectCriteria_DocumentID_IssuedWhen']" +
		",*[name='PolicyProjectCriteria_Payments_CashPayment_DateTime1']" +
		",*[name='PolicyProjectCriteria_Payments_CashPayment_DateTime2']" +
		",*[name='PolicyProjectCriteria_Payments_CashPayment_DateTime3']" +
		",*[name='QuotationCriteria_InsurancePeriod_Beginning']" +
		",*[name='QuotationCriteria_InsurancePeriod_End']");

		InputMasks.InitializeDatePicker(dateAfterNowInputs, new Date(), null);

		$.mask.definitions['я'] = '[а-яА-Яa-zA-Z]';
		$.mask.definitions['0'] = '[0-9]?';
		$('input[name*=QuotationCriteria_VehicleInfo_StateRegistrationNumber]').mask('я999яя990', { placeholder: '' });
		$('input[name*=QuotationCriteria_VehicleInfo_Passport_Vin]').mask('*****************');
	},

	SynchronizeModelInfo: function()
	{
		Utils.debug("SynchronizeModelInfo");
		var modelValue = this.ctlVehicleModel.val();

		var modelID = "", modelInfo = "";

		if (modelValue != null)
		{
			var values = modelValue.split("|");
			modelID = values[0];
			modelInfo = values[1];
		}

		this.ctlVehicleModelID.val(modelID);
		this.ctlVehicleModelInfo.val(modelInfo);
	},

	// TODO
	UpdateFranchises: function() {
		var modelValue = this.ctlVehicleModel.val();
		var vehicleGroupID = "";
		if (modelValue != null)
		{
			var values = modelValue.split("|");
			vehicleGroupID = values[2];
		}
		if (vehicleGroupID) {
			var franchiseCoef = [];
			var showDinamycFranchise = false;
			for (var id in kaskoFranchise) {
				var franchise = kaskoFranchise[id];
				if (franchise.vgId == vehicleGroupID && franchise.ftId == 3)
					franchiseCoef.push({key: franchise.Id, value: franchise.fp + "%"});
				if (franchise.vgId == vehicleGroupID && franchise.ftId == 6) showDinamycFranchise = true;
			}
			var oldVal = $('#absoluteFranchise').val();
			$('#absoluteFranchise').empty();
			$('#absoluteFranchise').fill(franchiseCoef, null, function(name, id) { return '<option value="' + name.key + '">' + name.value + '</option>'; });
			if (oldVal) $('#absoluteFranchise').val(oldVal);
			
			// Переключаем доступные option'ы
			if ($('#franchiseType option[value="3"]').length === 0)
				$('#franchiseType').append('<option value="3">Безусловная франшиза</option>');
				
			if ($('#franchiseType option[value="6"]').length === 0 && this.ctlSelectedInsurantTypeValue.val() == 'PhysicalPerson' && showDinamycFranchise)
				$('#franchiseType').append('<option value="6">Динамическая франшиза</option>');
			if (this.ctlSelectedInsurantTypeValue.val() != 'PhysicalPerson' || !showDinamycFranchise)
				$('#franchiseType option[value="6"]').remove();
			$('#franchiseType').change();
		} else {
			$('#franchiseType option[value="3"]').remove();
			$('#franchiseType option[value="6"]').remove();
			$('#franchiseType').change();
		}
	},
	
	RefreshVehicleInfoWeight: function()
	{
		Utils.debug("RefreshVehicleInfoWeight");
		var vehicleTypeValue = this.ctlVehicleType.val();

		if (vehicleTypeValue == 3 && this.getVisibleExtendedInfoForModel())
		{
			$("#maxWeightCont").show().enable();
		}
		else
		{
			$("#maxWeightCont").hide().disable();
		}
	},

	SetInsurantType: function(insurantType)
	{
		this.ctlSelectedInsurantTypeValue.val(insurantType);

		this.insurantTypeCtls.removeClass('active');

		var selectedInsurantTypeCtl = this.insurantTypeCtls.filter("#" + insurantType);
		selectedInsurantTypeCtl.addClass('active');

		this.RefreshAdmittedDriversSection();
		this.ctlInsuranceType.refresh();

		this.ctlContractType.change();
		if (this.ctlVehicleModel.val()) this.UpdateFranchises();
	},

	RefreshAdmittedDriversSection: function()
	{
		Utils.debug("Kasko.RefreshAdmittedDriversSection()");

		var admittedDriversSection = $("#admittedDriversSection");
		var admittedDriversListSection = $("#admittedDriversListSection");
		var admittedDriversRestrictionSection = this.ctlAdmittedDriversRestriction;

		if (this.IsOwnerPhysicalPerson() && this.GetVehicleTypeID() != this.VehicleType.Special)
		{
			if (this.ctlDontLimitAdmittedDrivers.checked())
			{
				this.UpdateAdmittedDriversRestriction();
				admittedDriversRestrictionSection.enable().show();
				admittedDriversListSection.hide().disable();
			}
			else
			{
				admittedDriversListSection.enable().show();
				admittedDriversRestrictionSection.hide().disable();
			}

			admittedDriversSection.enable().show();
		}
		else
		{
			this.ctlDontLimitAdmittedDrivers[0].checked = 'checked';
			admittedDriversSection.hide(); //.disable();
		}

		this.UpdateConditionalFranchise();
	},

	UpdateAdmittedDriversRestriction: function()
	{
		Utils.debug("UpdateAdmittedDriversRestriction()");

		var selected = this.ctlAdmittedDriversRestriction.val();
		this.ctlAdmittedDriversRestriction.clearOptions();

		var regionTypeID = this.GetContractRegion().regionTypeID;

		var mapper = function(restriction)
		{
			var result = null;
			if (restriction.territoryTypeID == null || restriction.territoryTypeID == regionTypeID)
			{
				result = { value: restriction.id, text: restriction.name, selected: selected == restriction.id };
			}

			return result;
		};

		var options = jQuery.map(this.options.admittedDriversRestrictions, mapper);
		this.ctlAdmittedDriversRestriction.addOptions(options);
	},

	RefreshNumberOfSeats: function()
	{
		Utils.debug("RefreshNumberOfSeats");
		var vehicleTypeValue = this.ctlVehicleType.val();

		if (vehicleTypeValue == 4 && this.getVisibleExtendedInfoForModel())
		{
			$("#seatcAmountCont").show().enable();
		}
		else
		{
			$("#seatcAmountCont").hide().disable();
		}
	},

	getVisibleExtendedInfoForModel: function()
	{
		var modelValue = this.ctlVehicleModel.val();

		var result = false;

		if (modelValue != null)
		{
			var values = modelValue.split("|");

			if (values.length >= 2)
			{
				result = values[1] == "1";
			}
		}

		return result;
	},

	GetModelModificationImageUrl: function(modelModificationID)
	{
		return this.options.modelModificationImageUrlFormat.replace("{0}", modelModificationID);
	},

	getInsuranceTypeID: function()
	{
		return $("#insTypes").val();
	},

	GetPersonType: function()
	{
		return this.ctlSelectedInsurantTypeValue.val();
	},

	OnInitialized: function()
	{
		if (!this.initialized)
		{
			Utils.debug("Calculator data is loaded.");
			this.options.onInitCallback();
			this.initialized = true;
		}
		//new ValidateUtils(kaskoCalc, validationObj1);

		$('#clientValidationErrors').parent().removeClass('userMessage');
		var validationInstance;
		$('#kaskoCalc').bind('submit', function(){
			
			validationInstance = $('#kaskoCalc').validate(validationObj1);
			if(!$('#kaskoCalc').valid())
			{
				$('#clientValidationErrors').text('Некоторые поля некорректно заполнены. Ошибки выделены в соответствующих полях, пожалуйста, исправьте значения.');;
				$('#clientValidationErrors').parent().addClass('userMessage');
				$('#clientValidationErrors').parent().show();
				return false;
			}
			else
			{
				$('#clientValidationErrors').text('');
				$('#clientValidationErrors').parent().removeClass('userMessage');
				$('#clientValidationErrors').parent().hide();
			}
		});	


	},

	IsOwnerPhysicalPerson: function()
	{
		return this.ctlSelectedInsurantTypeValue.val() == "PhysicalPerson";
	},

	GetCurrentYear: function()
	{
		var currentDate = new Date();
		return currentDate.getFullYear();
	},

	GetContractRegion: function()
	{
		var parts = this.ctlContractRegion.val().split(';');

		var result =
			{
				regionID: parseInt(parts[0]),
				regionInfoTypeID: parseInt(parts[1]),
				vehiclePriceGroupID: parseInt(parts[2]),
				regionTypeID: parseInt(parts[3])
			};

		return result;
	},

	CalculateVehicleAge: function()
	{
		var age = NaN;

		var productionYear = parseInt(this.ctlProductionYear.val());
		if (!isNaN(productionYear))
		{
			age = this.GetCurrentYear() - productionYear;
		};

		return age;
	},

	RecalculatePriceForSelectedCurrency: function(priceInDefaultCurrency)
	{
		var currencyCode = this.ctlCurrency.val();

		var result;
		if (currencyCode == this.defaultCurrencyCode)
		{
			result = priceInDefaultCurrency;
		}
		else
		{
			var rate = this.options.currencies[currencyCode].rate;
			result = priceInDefaultCurrency / rate;
		}

		return Math.roundNumber(result, this.options.decimalDigitsInPrices);
	},

	UpdateVehicleAge: function()
	{
		var age = this.CalculateVehicleAge();

		var ctlVehicleAge = $('#vehicleAge');

		if (!isNaN(age))
		{
			ctlVehicleAge.val(age);
			if (age == 1)
			{
				var currentDate = new Date();
				if (currentDate.getMonth() <= this.maxMonthForNewVehicle)
				{
					ctlVehicleAge.val($('#newVehicleCheckbox').checked() ? 0 : 1);
					$('#newVehicleSection').show();
				}
				else
				{
					ctlVehicleAge.val(1);
				}
			}
			else
			{
				$('#newVehicleSection').hide();
				$('#newVehicleCheckbox').check("off");
			}
		}
		else
		{
			ctlVehicleAge.val("");
		}
	},

	UpdateInsuranceType: function()
	{
		Utils.debug("Kasko.UpdateInsuranceType()");

		var container = this.ctlInsuranceType;
		var currentValue = container.val();

		if (!this.initialized && !isNaN(this.options.insuranceTypeID))
		{
			currentValue = this.options.insuranceTypeID;
		}

		var age = this.CalculateVehicleAge();

		var items = [];

		if (!isNaN(age))
		{
			var programRules = [];

			var vehicleType = this.ctlVehicleType.val();
			if ($.inArray(vehicleType, this.vehicleTypesWithoutVendors) == -1)
			{
				if (this.ctlVehicleVendor.val() != "" && this.ctlVehicleVendor.val() != null)
				{
					var option = $("#vehicleVendors option:selected");
					var foreign = option.val().split(";")[1] == "True";
					var contractRegion = this.GetContractRegion();

					// 1
					if (foreign)
					{
						if (contractRegion.regionTypeID == 1)
						{
							programRules.push({ id: 1, minAge: 0, maxAge: 7 });
						}
						else
						{
							programRules.push({ id: 1, minAge: 0, maxAge: 5 });
						}
					}
					else
					{
						if (contractRegion.regionTypeID == 1)
						{
							programRules.push({ id: 1, minAge: 0, maxAge: 5 });
						}
						else
						{
							programRules.push({ id: 1, minAge: 0, maxAge: 3 });
						}
					}

					// 2
					programRules.push({ id: 2, minAge: 3, maxAge: 12 });

					// 3
					programRules.push({ id: 3, minAge: 3, maxAge: 12 });
				}
			}
			else
			{
				programRules.push({ id: 1, minAge: 0, maxAge: 5 });
				programRules.push({ id: 2, minAge: 3, maxAge: 12 });
				programRules.push({ id: 3, minAge: 3, maxAge: 12 });
			}

			for (var i = 0; i < programRules.length; ++i)
			{
				var programRule = programRules[i];

				if (age >= programRule.minAge && age <= programRule.maxAge)
				{
					var text;
					switch (programRule.id)
					{
						case 1:
							text = "А";
							break;
						case 2:
							text = "Б";
							break;
						case 3:
							text = "В";
							break;
					}
					items.push({ id: programRule.id, text: text, selected: false });
				}
			}

			var found = false;

			if (currentValue)
			{
				for (var i = 0; i < items.length; i++)
				{
					if (items[i].id == currentValue)
					{
						items[i].selected = true;
						found = true;
						break;
					}
				}
			}

			if (!found && items.length > 0)
			{
				items[0].selected = true;
			}

			bindSelectBox(container.get(0), items, function(e) { return e.selected; }, function(e) { return e.id; }, function(e) { return e.text; });
		}
	},

	UpdateCurrencyRate: function()
	{
		var currencyCode = this.ctlCurrency.val();
		var insCurrencyRates = $('#insCurrencyRates');

		insCurrencyRates.val(this.options.currencies[currencyCode].rate);

		var rateSections = $(".currencyRatesSection", insCurrencyRates.parent().parent());
		if (currencyCode == this.defaultCurrencyCode)
		{
			rateSections.hide();
		}
		else
		{
			rateSections.show();
		}
	},

	RecalculatePriceValue: function(ctl, rate)
	{
		var result = NaN;

		var value = parseFloat(ctl.val());
		if (!isNaN(value))
		{
			result = Math.roundNumber(value / rate, this.options.decimalDigitsInPrices);
		}

		return result;
	},

	ChangePriceValue: function(ctl, rate)
	{
		var value = this.RecalculatePriceValue(ctl, rate);
		if (!isNaN(value))
		{
			ctl.val(value);
		}
	},

	UpdateDisplayPricesCurrency: function()
	{
		var newCurrencyCode = this.ctlCurrency.val();

		if (this.currencyCode != newCurrencyCode)
		{
			var oldRate = this.options.currencies[this.currencyCode].rate;
			var newRate = this.options.currencies[newCurrencyCode].rate;

			var recalculationRate = newRate / oldRate;
			this.vehicleCostCalculationManager.UpdatePricesCurrency(recalculationRate);

			this.currencyCode = newCurrencyCode;
		}
	},

	DSAGOrequestReward: function(e)
	{
		var contractRegion = this.GetContractRegion();
		$("#regionHiddenField")[0].value = contractRegion.regionID;

		if ($("#doDSAGO").get(0).checked)
		{
			var container = $('#DSAGOInsAmount');
			var prevValue = container.val();
			var currencyCode = this.ctlCurrency.val();

			var self = this;

			var completedCallback = function(data, isSuccesful)
			{
				if (isSuccesful)
				{
					var selectedText = null;
					if (container[0].options.length > 0)
					{
						selectedText = container[0].options[container[0].selectedIndex].text;
					}

					container.empty();

					var foundSelected = false;
					var items = data.dsagoInsuranceMoney;
					for (var i = 0; i < items.length; i++)
					{
						var selected = false;
						if (selectedText)
						{
							selected = items[i].value == selectedText
						}
						else if (self.options.dsagoInsuranceMoneyID)
						{
							selected = self.options.dsagoInsuranceMoneyID == items[i].id;
						}

						if (selected)
						{
							foundSelected = true;
						}

						items[i].selected = selected;
					}

					if (!foundSelected)
					{
						items[0].selected = true;
					}

					for (var i = 0; i < items.length; i++)
					{
						container.addOption(items[i].id, items[i].value, items[i].selected);
					}
				}
			};

			$.CalcDataProvider.GetDsagoInsuranceMoney(completedCallback, currencyCode, contractRegion.regionInfoTypeID, $('#trailerDSAGO')[0].checked);
		}
	},

	setFranchiseType: function(param)
	{
		var prevVal = $('#franchiseTypeBool')[0].value;
		prevVal = (prevVal == "false") ? $('#franchiseTypeBool').attr('value', 'true') : $('#franchiseTypeBool').attr('value', 'false');
	},

	UpdateConditionalFranchise: function()
	{
		Utils.debug("Kasko.UpdateConditionalFranchise()");

		var conditionalFranchiseValue = null;

		if (this.IsOwnerPhysicalPerson())
		{
			if (!this.ctlDontLimitAdmittedDrivers.checked())
			{
				conditionalFranchiseValue = this.CalculateConditionalFranchiseValue();
			}
		}

		if (conditionalFranchiseValue != null)
		{
			$("#conditionalFranshiseCount").show();

			$("#conditionalFranshiseCount label").hide();
			$('#conditionalFranshise' + conditionalFranchiseValue).show();

			$("#conditionalFranshise").removeAttr('disabled');
		}
		else
		{
			$("#conditionalFranshiseCount").hide();
			$("#conditionalFranshise").attr('disabled', 'disabled');
		};

		this.UpdateAbsoluteFranchise();
	},

	UpdateFranchiseType: function()
	{
		var franchiseType = $("#franchiseType");
		var absoluteFranchise = $("#absoluteFranchiseCont");
		if(franchiseType.val() == 3)
		{
			absoluteFranchise.show();
			absoluteFranchise.css("visibility", "visible");
			$("select", absoluteFranchise).removeAttr('disabled');		
		}
		else
		{
			absoluteFranchise.hide();
			absoluteFranchise.css("visibility", "hidden");
			$("select", absoluteFranchise).attr('disabled', 'disabled');		
		}
	},
	
	UpdateAbsoluteFranchise: function()
	{
		var showAbsoluteFranchise = true;

		var conditionalFranchiseCont = $("#conditionalFranshiseCount:visible");
		if (conditionalFranchiseCont.length > 0)
		{
			var checkbox = $("input[type='checkbox']:visible", conditionalFranchiseCont);
			showAbsoluteFranchise = !checkbox.checked();
		}

		var franchiseType = $("#franchiseTypeCont");
		var absoluteFranchise = $("#absoluteFranchiseCont");		
		if (showAbsoluteFranchise)
		{
			franchiseType.show();
			franchiseType.css("visibility", "visible");			
			
			this.UpdateFranchiseType();
		}
		else
		{
			absoluteFranchise.hide();
			absoluteFranchise.css("visibility", "hidden");
			$("select", absoluteFranchise).attr('disabled', 'disabled');
			
			$("#franchiseType").val(1);
			franchiseType.hide();
			franchiseType.css("visibility", "hidden");			
		}
	},

	CalculateConditionalFranchiseValue: function()
	{
		var exp = $('.experience');
		var ages = $('.ages');
		var percents = new Array();
		for (var i = 0; i < exp.length; i++)
		{
			var curAge = ages[i].value;
			var curExp = exp[i].value;
			for (ageJS in Kasko.agesToExp)
			{
				if (parseInt(curAge) <= parseInt(ageJS))
				{
					for (expJS in Kasko.agesToExp[ageJS])
					{
						if (parseInt(curExp) <= parseInt(expJS) && curExp != '')
						{
							Utils.debug(Kasko.agesToExp[ageJS][expJS]);
							percents.push(Kasko.agesToExp[ageJS][expJS])
							break;
						}
					}
					break;
				};
			}
		}

		var max = percents[0];
		for (var i = 1; i < percents.length; i++)
		{
			max = max < percents[i] ? percents[i] : max;
		}

		if (percents.length == 0)
		{
			max = 0;
		}

		return max != 0 ? max : null;
	},

	RefreshContractType: function(event)
	{
		if ($('#ownerChanged').checked()
		   || $('#vehicleChanged').checked()
	           || !$('#oneYearContract').checked())
		{
			this.ctlContractType.val(this.ContractType.Initial);
			$('#contractSignCheckboxes').hide();
			$('#ownerChanged').setChecked(false);
			$('#vehicleChanged').setChecked(false);
			$('#oneYearContract').setChecked(true);
			this.ctlContractType.change();

			var message = $("#contractSignCont #contractSignMessage");

			var nameAttr = $("#" + event.currentTarget.id).attr("name");
			var msgText = Hint.prototype.hints[nameAttr + "_Message"]

			if (message.length == 0)
			{
				message = $("<div id=\"contractSignMessage\" style=\"clear: both;\" class=\"note\"></div>").hide().appendTo("#contractSignCont");
			}

			message.html(msgText).show();
		}
	},

	UpdateContractSignSection: function()
	{
		Utils.debug("UpdateContractSignSection()");

		if ($('#lengthOfInsurance')[0].value != 7)
		{
			this.ctlContractType.val(this.ContractType.Initial);
			this.ctlContractType.setDisabled();
			$('#contractSignCheckboxes').hide();
		}
		else
		{
			this.ctlContractType.setEnabled();
		}

		if (this.IsOwnerPhysicalPerson()
			&& parseInt(this.ctlContractType.val()) == this.ContractType.Initial
			&& this.GetVehicleTypeID() != this.VehicleType.Special)
		{
			$('#OSAGODataCont').show();
		}
		else
		{
			$('#OSAGODataCont').hide();
		}
		$("#contractSignCont #contractSignMessage").hide();
	},

	GetProductionYear: function()
	{
		return parseInt(this.ctlProductionYear.val());
	},

	UpdateVehicleCostCalculationData: function()
	{
		Utils.debug("UpdateVehicleCostCalculationData()");

		var modelID = this.GetVehicleModelID();
		if (isNaN(modelID))
		{
			this.vehicleCostCalculationManager.ResetModelInfo();
		}
		else
		{
			this.vehicleCostCalculationManager.LoadModelInfo();
		}
	},

	SetProductionYearRange: function(min, max)
	{
		Utils.debug("SetProductionYearRange(" + min + ", " + max + ")");

		var currentProductionYear = this.GetProductionYear();

		this.ctlProductionYear.clearOptions();
		for (var i = max; i >= min; --i)
		{
			this.ctlProductionYear.addOption(i, i.toString());
		}

		var selectedValue = max;
		if (!this.initialized && this.options.productionYear)
		{
			// Restore year from options and reset it to allow user changing.
			selectedValue = this.options.productionYear;
		}
		else
		{
			if (!isNaN(currentProductionYear))
			{
				selectedValue = currentProductionYear;
			}
		}

		this.ctlProductionYear.val(selectedValue);
		this.ctlProductionYear.setEnabled();
		this.ctlProductionYear.change();
	},

	UpdateInsurancePremium: function()
	{
		var currencyCode = this.ctlCurrency.val();
		var currencyName = this.options.currencies[currencyCode].name;

		$('#curLabel').empty().append('Стоимость, ' + currencyName);
	},

	GetVehicleModelID: function()
	{
		var modelID;
		var modelValue = this.ctlVehicleModel.val();
		if (modelValue != null)
		{
			modelValue = modelValue.split("|");
		}

		var modelID = parseInt(modelValue);
		Utils.debug("GetVehicleModelID: " + modelID);
		return modelID;
	},

	SetVehicleModelID: function(modelID)
	{
		this.ctlVehicleModel.val(modelID == null ? "" : modelID);
	},

	GetVehicleModelModificationID: function()
	{
		var modelModificationID = parseInt(this.ctlVehicleModelModification.val());
		return modelModificationID;
	},

	SetVehicleModelModificationID: function(modelModificationID)
	{
		this.ctlVehicleModelModification.val(modelModificationID == null ? "" : modelModificationID);
	},

	GetVehicleTypeID: function()
	{
		return parseInt(this.ctlVehicleType.val());
	},

	GetVehicleCost: function()
	{
		return parseInt(this.ctlVehicleCost.val());
	},

	SetVehicleCost: function(value, raiseChangeEvent)
	{
		this.ctlVehicleCost.val(value == null ? "" : value);
		if (raiseChangeEvent)
		{
			this.ctlVehicleCost.change();
		}
	},

	Dummy: null
};

Kasko.VehicleCostCalculation = {};

/******************************************************************************************************/
/* Kasko.VehicleCostCalculation.Manager */
/******************************************************************************************************/
Kasko.VehicleCostCalculation.Manager = function(kasko)
{
	var self = this;

	this.kasko = kasko;
	this.parametersSectionManager = new Kasko.VehicleCostCalculation.ParametersSectionManager(this);

	this.ctlButtonSection = $("#calculateVehicleCostButton");
	this.ctlParametersSection = $("#calculateVehicleCostParametersSection");

	$("#calculateVehicleCostButton").click(function()
	{
		self.ShowParametersSection();
		self.UpdateParameters(false);
	});

	this.ctlCostRangeMin = $("*[name='QuotationCriteria_VehicleInfo_VehicleCostRangeMin']");
	this.ctlCostRangeMax = $("*[name='QuotationCriteria_VehicleInfo_VehicleCostRangeMax']");

	this.ctlVehicleImage = $("#ModelModificationImage");
	this.imagePopup = new OriginalImagePopup($("#ModelModificationImageSection"), 'ModelModificationImagePopup');
}

Kasko.VehicleCostCalculation.Manager.prototype =
{
	sectionExpanded: false,
	kasko: null,
	modelInfo: null,
	parametersSectionManager: null,
	lastCalculationInfo: null,

	ctlButtonSection: null,
	ctlParametersSection: null,
	ctlCostRangeMin: null,
	ctlCostRangeMax: null,
	ctlVehicleImage: null,

	GetLastCalculationInfo: function()
	{
		return this.lastCalculationInfo;
	},

	SetLastCalculationInfo: function(calculationInfo)
	{
		Utils.debug("MMID=" + calculationInfo.modelModificationID);
		this.lastCalculationInfo = calculationInfo;
	},

	GetCurrentCalculationInfo: function(modelModificationID, calculatedCost)
	{
		var result =
		{
			contractRegionID: this.kasko.GetContractRegion().regionID,
			productionYear: this.kasko.GetProductionYear(),
			modelModificationID: modelModificationID,
			calculatedCost: calculatedCost
		};

		return result;
	},

	CalculatePossibleCostRange: function()
	{
		var range = { min: null, max: null, average: null };

		if (this.modelInfo != null)
		{
			var year = this.kasko.GetProductionYear();
			if (!isNaN(year))
			{
				var sum = 0;
				var count = 0;

				for (var i = 0; i < this.modelInfo.modelModifications.length; ++i)
				{
					var price = this.modelInfo.modelModifications[i].prices[year];
					if (price != null)
					{
						range.min = range.min ? Math.min(range.min, price) : price;
						range.max = range.max ? Math.max(range.max, price) : price;

						sum += price;
						++count;
					}
				}

				if (count > 0)
				{
					range.average = sum / count;
				}
			}
		};

		return range;
	},

	HideCalculationSection: function()
	{
		this.sectionExpanded = false;
		this.ctlButtonSection.hide();
		this.ctlParametersSection.hide();
	},

	ShowParametersSection: function()
	{
		this.sectionExpanded = true;
		this.ctlButtonSection.hide();
		this.ctlParametersSection.show();
	},

	ConfirmCalculatedCostReset: function(args)
	{
		if (!this.kasko.initialized)
			return;

		var parametersSectionManager = this.parametersSectionManager;
		var arguments = args;

		var confirmCallbackDelegate = function()
		{
			Utils.debug("Confirmed");
			parametersSectionManager.Reset();
			args.confirm();
		}

		var cancelCllbackDelegate = function()
		{
			Utils.debug("Cancelled");
			args.cancel();
		}

		if (parametersSectionManager.HasNonDefaultParameterValuesSet())
		{
			var confirmationPopup = new ConfirmationPopup(
				"",
				"При изменении значения данного поля будут удалены значения всех полей в блоке «Определение действительной стоимости ТС». Продолжить?",
				confirmCallbackDelegate,
				cancelCllbackDelegate
				);
			confirmationPopup.Show();
		}
		else
		{
			args.confirm();
		}
	},

	UpdateCalculatedCost: function(modelModificationID, calculatedCostRange, updateCurrentCost)
	{
		Utils.debug("Kasko.VehicleCostCalculation.Manager.UpdateCalculatedCost()");
		Utils.debug("\tmodelModificationID=" + modelModificationID);
		Utils.debug("\tcalculatedCostRange.min=" + calculatedCostRange.min);
		Utils.debug("\tcalculatedCostRange.max=" + calculatedCostRange.max);
		Utils.debug("\tcalculatedCostRange.avg=" + calculatedCostRange.average);
		Utils.debug("\tupdateCurrentCost=" + updateCurrentCost);

		var currentInfo = this.GetCurrentCalculationInfo(modelModificationID, calculatedCostRange.average);

		var prevModelModificationID = this.kasko.GetVehicleModelModificationID();
		Utils.debug("\tprevModelModificationID=" + prevModelModificationID);

		// Update validation range
		this.UpdateCostRange(calculatedCostRange);

		// Update car image
		if (!this.kasko.initialized || prevModelModificationID != modelModificationID)
		{
			Utils.debug("\tUpdate model image.");
			var self = this;

			var errorCallback = function(e)
			{
				var isImageAvailable = false;
				if (e && e.status == 200)
				{
					try
					{
						isImageAvailable = e.responseText.indexOf("HTML") == -1;
					}
					catch (e)
					{
						isImageAvailable = true;
					}
				};
				self.UpdateImage(isImageAvailable);
			};

			$.ajax(
			{
				url: this.kasko.GetModelModificationImageUrl(modelModificationID),
				success: function() { self.UpdateImage(true); },
				error: errorCallback
			});
		}

		// Update vehicle cost
		if (!this.kasko.initialized && this.kasko.options.modelModificationID == modelModificationID)
		{
			this.kasko.options.modelModificationID = null;
		}
		else
		{
			this.kasko.SetVehicleModelModificationID(modelModificationID);

			if (updateCurrentCost)
			{
				var displayPrice = this.kasko.RecalculatePriceForSelectedCurrency(calculatedCostRange.average);
				var oldPrice = this.kasko.GetVehicleCost();
				this.kasko.SetVehicleCost(displayPrice, oldPrice != displayPrice);

				var lastInfo = this.GetLastCalculationInfo();
				if (lastInfo != null)
				{
					this.UpdateCalculationWarnings(currentInfo, lastInfo);
				}
			}
		}

		// Save calculation results
		this.SetLastCalculationInfo(currentInfo);
	},

	ResetCalculatedCost: function()
	{
		Utils.debug("ResetCalculatedCost()");

		var currentInfo = this.GetCurrentCalculationInfo(null, null);
		var lastInfo = this.GetLastCalculationInfo();

		this.kasko.SetVehicleModelModificationID(null);
		this.UpdateImage(false);

		this.UpdateCostRange();

		var clearWarnings = true;
		if (lastInfo != null)
		{
			var currentDisplayCost = this.kasko.GetVehicleCost();
			var lastCalculationDisplayCost = this.kasko.RecalculatePriceForSelectedCurrency(lastInfo.calculatedCost);

			if (lastCalculationDisplayCost == currentDisplayCost)
			{
				// user hs not changed vehicle cost, so we can reset it.
				this.kasko.SetVehicleCost(null, true);
				this.UpdateCalculationWarnings(currentInfo, lastInfo);
				clearWarnings = false;
			}
		}

		if (clearWarnings)
		{
			this.ClearCalculationWarnings();
		}

		// Save calculation results
		this.SetLastCalculationInfo(currentInfo);
	},

	ClearCalculationWarnings: function()
	{
		var warning = $("#VehicleCostWarning");
		warning.hide();
	},

	UpdateCalculationWarnings: function(currentInfo, lastInfo)
	{
		if (!this.kasko.initialized)
		{
			return;
		}

		var showWarning = false;

		if (currentInfo.modelModificationID == null)
		{
			showWarning = false;
		}
		else if (lastInfo.modelModificationID == currentInfo.modelModificationID)
		{
			if (lastInfo.calculatedCost != currentInfo.calculatedCost)
			{
				showWarning = true;
			}
		}

		var warning = $("#VehicleCostWarning");

		if (showWarning)
		{
			var ctlWarningText = $("#VehicleCostWarning div");
			var warningText = null;

			if (lastInfo.contractRegionID != currentInfo.contractRegionID)
			{
				Utils.debug("ContractRegion has been changed and price is recalculated.");
				warningText = "Значение данного поля автоматически пересчитано в связи с изменением параметра «Регион оформления договора».";
			}

			if (lastInfo.productionYear != currentInfo.productionYear)
			{
				Utils.debug("ProductionYear has been changed and price is recalculated.");
				warningText = "Значение данного поля автоматически пересчитано в связи с изменением параметра «Год выпуска автомобиля».";
			}

			if (warningText != null)
			{
				ctlWarningText.text(warningText)
				warning.show();
			}
			else
			{
				warning.hide();
			}
		}
		else
		{
			warning.hide();
		}

		var serverError = warning.parent().children("div.error");
		warning.parent().removeClass("with-error");
		serverError.hide();
		serverError.css("visibility", "hidden"); // hack for ie6
	},

	UpdateImage: function(isImageAvailable)
	{
		var ctlImage = this.ctlVehicleImage;

		if (isImageAvailable)
		{
			// show picture
			var modelModificationID = this.kasko.GetVehicleModelModificationID();
			ctlImage.attr("src", this.kasko.GetModelModificationImageUrl(modelModificationID));
			ctlImage.show();
		}
		else
		{
			ctlImage.hide();
			ctlImage.attr("src", "");
		}
	},

	ShowImagePopup: function()
	{
		var modelModificationID = this.kasko.GetVehicleModelModificationID();
		var imageUrl = this.kasko.GetModelModificationImageUrl(modelModificationID);

		var imagePopup = new ImagePopup("", imageUrl, jQuery.browser.msie ? 600 : null);
		imagePopup.Show();
	},

	ProcessNewModelInfo: function()
	{
		Utils.debug("Kasko.VehicleCostCalculation.Manager.ProcessNewModelInfo");

		/*	Не для всех моделей заданы правильные периоды выпуска, т.ч. данная функ-сть выключена.
		var currentYear = this.kasko.GetCurrentYear();
		var max;
		var min;

		var modelInfo = this.modelInfo;
		
		if (modelInfo != null && modelInfo.modelModifications.length > 0)
		{
		max = 0;
		min = currentYear;

			for (var i = 0; i < modelInfo.modelModifications.length; ++i)
		{
		var modification = modelInfo.modelModifications[i];

				min = Math.min(min, modification.startYear);

				if (modification.endYear != null)
		{
		max = Math.max(max, modification.endYear);
		}
		else
		{
		max = currentYear;
		}
		}
		}
		else
		{
		max = currentYear;
		min = currentYear - this.kasko.options.maxVehicleAge;
		}
		*/

		this.UpdateCalculationSection();
	},

	UpdateCalculationSection: function()
	{
		Utils.debug("Kasko.VehicleCostCalculation.Manager.UpdateCalculationSection()");

		var hasDataForCalculation = false;

		if (this.modelInfo)
		{
			var productionYear = this.kasko.GetProductionYear();

			if (!isNaN(productionYear))
			{
				for (var i = 0; i < this.modelInfo.modelModifications.length; ++i)
				{
					var modification = this.modelInfo.modelModifications[i];
					if (modification.prices[productionYear])
					{
						hasDataForCalculation = true;
						break;
					}
				}
			}
		}

		if (hasDataForCalculation)
		{
			if (!this.sectionExpanded)
			{
				this.ctlButtonSection.show();
			}
			this.UpdateParameters(true);
		}
		else
		{
			this.UpdateCostRange();
			this.HideCalculationSection();
			this.ResetCalculatedCost();
		}
	},

	UpdateParameters: function(updatePrice)
	{
		this.UpdateCostRange();
		var productionYear = this.kasko.GetProductionYear();
		this.parametersSectionManager.Initialize(this.modelInfo, productionYear, updatePrice);
	},

	UpdateCostRange: function(calculatedCostRange)
	{
		var range;
		if (calculatedCostRange)
		{
			range = calculatedCostRange;
		}
		else
		{
			range = this.CalculatePossibleCostRange();
		}

		var displayMin = null;
		var displayMax = null;

		if (!isNaN(range.min) && !isNaN(range.max)
			&& range.min != null && range.max != null)
		{
			var delta = 0.1 * range.average;
			displayMin = this.kasko.RecalculatePriceForSelectedCurrency(range.min - delta);
			displayMax = this.kasko.RecalculatePriceForSelectedCurrency(range.max + delta);
		}

		this.SetCostRange(displayMin, displayMax);
	},

	ResetModelInfo: function()
	{
		this.modelInfo = null;
		this.parametersSectionManager.modelInfo = null;
		this.ProcessNewModelInfo();
	},

	LoadModelInfo: function()
	{
		this.modelInfo = null;
		var self = this;

		var modelID = this.kasko.GetVehicleModelID();

		var completeCollback = function(data, isSuccesful)
		{
			if (isSuccesful && data != null)
			{
				self.modelInfo = data;
				self.modelInfo.modelID = modelID;
			}
			else
			{
				self.modelInfo = null;
			}
			self.ProcessNewModelInfo();
		};

		$.CalcDataProvider.GetVehicleModelModificationsAndPrices(
			completeCollback,
			modelID,
			this.kasko.GetContractRegion().vehiclePriceGroupID);
	},

	SetCostRange: function(min, max)
	{
		if (min != null && !isNaN(min) && max != null && !isNaN(max))
		{
			this.ctlCostRangeMin.val(min);
			this.ctlCostRangeMax.val(max);
			Utils.debug("SetVehicleCostRange(" + min + ", " + max + ")");
		}
		else
		{
			this.ctlCostRangeMin.val("");
			this.ctlCostRangeMax.val("");
			Utils.debug("SetVehicleCostRange(null, null)");
		}
	},

	UpdatePricesCurrency: function(recalculationRate)
	{
		this.kasko.ChangePriceValue(this.kasko.ctlVehicleCost, recalculationRate);

		var min = this.kasko.RecalculatePriceValue(this.ctlCostRangeMin, recalculationRate);
		var max = this.kasko.RecalculatePriceValue(this.ctlCostRangeMax, recalculationRate);

		this.SetCostRange(min, max);

		var warning = $("#VehicleCostWarning");
		var serverError = warning.parent().children("div.error");
		serverError.text("Действительная стоимость ТС должна быть в диапазоне от " + min + " до " + max + ".");
	},

	Dummy: null
}

/******************************************************************************************************/
/* Kasko.VehicleCostCalculation.ParametersSectionManager */
/******************************************************************************************************/
Kasko.VehicleCostCalculation.ParametersSectionManager = function(manager)
{
	this.manager = manager;

	var self = this;

	var createChangeHandler = function(index)
	{
		return function()
		{
			self.Update(index, true);
		};
	};

	for (var i = 0; i < this.parameters.length; ++i)
	{
		var parameter = this.parameters[i];

		parameter.control = $("#" + this.parameters[i].controlID);
		parameter.control.change(createChangeHandler(i));

		if (!parameter.prompt)
		{
			parameter.prompt = "";
		}
	}
};

Kasko.VehicleCostCalculation.ParametersSectionManager.prototype = {
	manager: null,
	defaultSelectValue: "",
	modelInfo: null,
	productionYear: null,
	modelModifications: [],
	parameters:
	[
		{
			prompt: "Выберите тип кузова",
			controlID: "vehicleBodyType",
			propertyName: "bodyTypeID",
			lookupDictionary: "bodyTypes"
		},
		{
			prompt: "Выберите количество дверей",
			controlID: "vehicleNumberOfDoors",
			propertyName: "numberOfDoors"
		},
		{
			prompt: "Выберите двигатель",
			controlID: "vehicleEngineName",
			propertyName: "engine"
		},
		{
			prompt: "Выберите тип КПП",
			controlID: "vehicleTransmissionType",
			propertyName: "transmissionTypeID",
			lookupDictionary: "transmissionTypes"
		},
		{
			prompt: "Выберите модификацию авто",
			controlID: "vehicleModelModificationName",
			propertyName: "name"
		}
	],

	Initialize: function(modelInfo, productionYear, updateCurrentPrice)
	{
		Utils.debug("Kasko.VehicleCostCalculation.ParametersSectionManager.Initialize(updateCurrentPrice=" + updateCurrentPrice + ")");
		var prevModelInfo = this.modelInfo;

		this.modelInfo = modelInfo;
		this.productionYear = productionYear;
		this.modelModifications = [];

		for (var i = 0; i < this.modelInfo.modelModifications.length; ++i)
		{
			var modification = this.modelInfo.modelModifications[i];
			if (modification.prices[this.productionYear])
			{
				this.modelModifications.push(modification);
			}
		}

		var resetParametersValues;
		if (this.manager.kasko.initialized)
		{
			// Kasko has been initialized, this is user action of model selection. Compare if this is really new model.
			resetParametersValues = prevModelInfo == null || prevModelInfo.modelID != this.modelInfo.modelID;	
		}
		else
		{
			// Kasko is being initialized, this is initial page load. Check if model modification is already set in options.
			setParametersValues = this.manager.kasko.options.modelModificationID == null;
		}

		if (resetParametersValues)
		{
			// Reset all parameter values
			for (var i = 0; i < this.parameters.length; ++i)
			{
				this.parameters[i].control.clearOptions();
			}

			this.Reset(); //reset all selected values
		}
		else
		{
			this.Update(this.parameters.length - 1, updateCurrentPrice); //dont change values
		}
	},

	Reset: function()
	{
		this.Update(-1, false); //reset all selected values
	},

	Update: function(updatedParameterIndex, updateCurrentPrice)
	{
		Utils.debug("Vehicle cost parameters are updated.");

		var modificationsForCurrentParameter = [].concat(this.modelModifications);
		var chosenModification = null;

		if (!this.manager.kasko.initialized && this.manager.kasko.options.modelModificationID)
		{
			var modelModificationID = this.manager.kasko.options.modelModificationID;
			chosenModification = jQuery.grep(modificationsForCurrentParameter, function(item) { return item.id == modelModificationID; })[0];
		}

		var allValuesAreSet = true;

		for (var i = 0; i < this.parameters.length; ++i)
		{
			var parameter = this.parameters[i];

			var selectedValue = null;
			if (i <= updatedParameterIndex)
			{
				if (chosenModification != null)
				{
					selectedValue = chosenModification[parameter.propertyName];
				}
				else
				{
					selectedValue = parameter.control.val();
				}

				if (selectedValue == this.defaultSelectValue)
				{
					selectedValue = null;
				}
			}

			var modificationsForNextParameter = this.FillSelectOptions(parameter, modificationsForCurrentParameter, selectedValue);
			modificationsForCurrentParameter = modificationsForNextParameter;

			if (allValuesAreSet)
			{
				var value = parameter.control.val();
				allValuesAreSet = value != this.defaultSelectValue;
			}
		}

		if (allValuesAreSet)
		{
			var firstModification = modificationsForCurrentParameter[0];
			var firstPrice = firstModification.prices[this.productionYear];

			var range =
			{
				min: firstPrice,
				max: firstPrice
			};

			var sum = firstPrice;

			for (var i = 1; i < modificationsForCurrentParameter.length; ++i)
			{
				var price = modificationsForCurrentParameter[i].prices[this.productionYear];
				range.min = Math.min(range.min, price);
				range.max = Math.max(range.max, price);

				sum += price;
			}

			range.average = sum / modificationsForCurrentParameter.length;

			var modelModificationID = firstModification.id; // это влияет только на загружаемую картинку, поэтому можно выбирать просто первую модификацию.
			this.manager.UpdateCalculatedCost(modelModificationID, range, updateCurrentPrice);
		}
		else
		{
			this.manager.ResetCalculatedCost();
		}
	},

	GetModelModificationsForNextParameter: function(parameter, modificationsForParameter, parameterValue)
	{
		var modificationsForNextParameter;

		if (parameterValue)
		{
			var modificationsForNextParameter = [];

			for (var i = 0; i < modificationsForParameter.length; ++i)
			{
				var modification = modificationsForParameter[i];
				if (parameterValue == modification[parameter.propertyName])
				{
					modificationsForNextParameter.push(modification);
				}
			}
		}
		else
		{
			modificationsForNextParameter = modificationsForParameter;
		}

		return modificationsForNextParameter;
	},

	GetSelectOptions: function(parameter, values)
	{
		var mapHandler;
		if (parameter.lookupDictionary)
		{
			var dictionary = this.modelInfo[parameter.lookupDictionary];
			mapHandler = function(value) { return { value: value, text: dictionary[value] }; };
		}
		else
		{
			mapHandler = function(value) { return { value: value, text: value }; };
		}

		var options = $.map(values, mapHandler);
		options.sort(function(x, y)
		{
			if (x.text < y.text) return -1;
			if (x.text > y.text) return 1;
			return 0;
		});

		return options;
	},

	FillSelectOptions: function(parameter, modelModifications, selectedValue)
	{
		var selectedValueFound = false;
		var values = [];

		for (var i = 0; i < modelModifications.length; ++i)
		{
			var value = modelModifications[i][parameter.propertyName];
			values.push(value);
			if (value == selectedValue)
			{
				selectedValueFound = true;
			}
		}

		if (!selectedValueFound)
		{
			selectedValue = null;
		}

		values = values.unique();

		var control = parameter.control;

		control.clearOptions();
		control.addOption(this.defaultSelectValue, parameter.prompt);

		var options = this.GetSelectOptions(parameter, values);

		for (var i = 0; i < options.length; ++i)
		{
			control.addOption(options[i].value, options[i].text);
		}

		if (options.length == 1)
		{
			control.setDisabled();
			control.val(options[0].value);
		}
		else
		{
			control.setEnabled();

			control.val(selectedValue != null ? selectedValue : this.defaultSelectValue);
		}

		return this.GetModelModificationsForNextParameter(parameter, modelModifications, selectedValue);
	},

	HasNonDefaultParameterValuesSet: function()
	{
		var result = false;

		if (this.modelInfo != null)
		{
			for (var i = 0; i < this.parameters.length; ++i)
			{
				var control = this.parameters[i].control;

				if (control.isEnabled())
				{
					if (control.val() != this.defaultSelectValue)
					{
						result = true;
						break;
					}
				}
			}
		}

		return result;
	},

	Dummy: null
};


/**********************************/
/* DriverElement */
/**********************************/
DriverElement = function()
{
};

DriverElement.prototype = {
	init: function(caller)
	{
		for (var i = 1; i <= caller.clones.length; i++)
		{
			var clone = caller.clones[i - 1];
			var ageInput = $("*[name^='QuotationCriteria_AdmittedDrivers_DriverInfo_Age']", clone);
			var birthdayInput = $("*[name^='InvolvedPersons_PhysicalPerson_BirthDay']", clone);

			ageInput.numeric();
			var ageAndBirthdaySync = $.data(clone, "calc-driver-age");
			if (ageAndBirthdaySync != null)
			{
				ageAndBirthdaySync.initialize(ageInput, birthdayInput)
			}
			else
			{
				ageAndBirthdaySync = new StartDateAndDurationSync(ageInput, birthdayInput);
				$.data(clone, "calc-driver-age", ageAndBirthdaySync);
			}

			var expyersInput = $("*[name^='QuotationCriteria_AdmittedDrivers_DriverInfo_DrivingExperienceYears']", clone);
			var startexpyersInput = $("*[name^='QuotationCriteria_AdmittedDrivers_DriverInfo_DrivingExperienceStartDate']", clone);

			expyersInput.numeric();
			var expYearsSync = $.data(clone, "calc-driver-exp-yers");
			if (expYearsSync != null)
			{
				expYearsSync.initialize(expyersInput, startexpyersInput)
			}
			else
			{
				expYearsSync = new StartDateAndDurationSync(expyersInput, startexpyersInput);
				$.data(clone, "calc-driver-exp-yers", expYearsSync);
			}
		}
	},

	OnBeforeCloning: function(clone)
	{
		var dateInputs = $("*[name^='InvolvedPersons_PhysicalPerson_BirthDay'], *[name^='QuotationCriteria_AdmittedDrivers_DriverInfo_DrivingExperienceStartDate']", clone);
		InputMasks.ClearDatePicker(dateInputs);
	},

	OnAfterCloning: function(clone)
	{
		this.initializeClone(clone);
	},

	initializeClone: function(clone)
	{
		InputMasks.InitializeDatePickerForBirthday($("*[name^='InvolvedPersons_PhysicalPerson_BirthDay']", clone), 18, null);
		InputMasks.InitializeDatePicker($("*[name^='QuotationCriteria_AdmittedDrivers_DriverInfo_DrivingExperienceStartDate']", clone), null, new Date());

		$("input", clone).css("position", "static"); //fix for ie6
	}
};

DeleteDriverElement = function(kasko) { 
	this.kasko = kasko;
};

DeleteDriverElement.prototype =
{	
	onRemove: function()
	{
		this.kasko.RefreshAdmittedDriversSection();
	}
};

/**********************************/
/* Franchise */
/**********************************/
Franchise = function() { };

Franchise.prototype =
{
	init: function()
	{
		$('.ages, .experience, .driverExperienceStart').change(function() { kasko.UpdateConditionalFranchise(); });
	}
};
