﻿/* расширение калькулятора для получения данных через Ajax */

Cache = function(maxItemCount)
{
	this.maxItemCount = maxItemCount;
};

Cache.prototype =
{
	debug: false,
	items: {},
	orderedItems: [],
	
	Debug: function(msg)
	{
		if (this.debug)
		{
			Utils.debug(msg);
		}
	},

	GetItem: function(key)
	{
		var item = this.items[key];
		return item ? item.value : null;
	},

	AddItem: function(key, value)
	{
		if (this.items[key] != null)
		{
			this.RemoveItem(key);
		}
		else
		{
			if (this.orderedItems.length == this.maxItemCount)
			{
				this._RemoveItemByIndex(0);
			}
		}

		var item =
		{
			key: key,
			value: value,
			timestamp: new Date()
		};

		this.items[key] = item;
		this.orderedItems.push(item);

		this.Debug("Cache items count = " + this.orderedItems.length);
	},

	RemoveItem: function(key)
	{
		for (var i = 0; i < this.orderedItems.length; ++i)
		{
			if (this.orderedItems[i].key == key)
			{
				this._RemoveItemByIndex(i);
				break;
			}
		}
	},

	_RemoveItemByIndex: function(itemIndex)
	{
		var item = this.orderedItems.splice(itemIndex, 1)[0];
		this.items[item.key] = null;
	}
	
};

; (function($)
{
	$.CalcDataProvider = $.CalcDataProvider || $();

	jQuery.extend($.CalcDataProvider,
	{
		cache: new Cache(20),

		urls:
		{
			regionCitiesForOsago: "/xml/regionCities.wbp",
			regionCities: "/xml/cityList.wbp",
			vehicleVendors: "/xml/vendors.wbp",
			vehicleModels: "/xml/models.wbp",
			pedressMethods: "/xml/pedressMethods.wbp",
			vehicleModelModificationsAndPrices: "/xml/modelModificationsAndPrices.wbp",
			vehicleModelModifications: "/xml/modelModifications.wbp",
			pedressMethods: "/xml/pedressMethods.wbp",
			dsagoInsuranceMoney: "/xml/dsagorewards.wbp"
		},

		rUrlWithParams: /\?/,

		// *******************************************************************************
		// Получить список городов региона, в которых есть офисы РГС.
		// *******************************************************************************
		_GetRegionCitiesWithOfficesCacheKey: function(regionID)
		{
			var params =
			{
				region: regionID
			};

			return this._GetDataAsyncKey(this.urls.regionCities, params);
		},

		GetRegionCitiesWithOffices: function(completeCallback, regionID)
		{
			var dataKey = this._GetRegionCitiesWithOfficesCacheKey(regionID);
			return this._GetDataAsync(completeCallback, dataKey);
		},

		SetRegionCitiesWithOffices: function(data, regionID)
		{
			var dataKey = this._GetRegionCitiesWithOfficesCacheKey(regionID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},


		// *******************************************************************************
		// Получить список городов региона для расчета Осаго.
		// *******************************************************************************
		_GetRegionCitiesForOsagoCacheKey: function(regionID)
		{
			var params =
			{
				region: regionID
			};

			return this._GetDataAsyncKey(this.urls.regionCitiesForOsago, params);
		},

		GetRegionCitiesForOsagoSync: function(regionID)
		{
			var dataKey = this._GetRegionCitiesForOsagoCacheKey(regionID);
			return this._GetDataSync(dataKey);
		},

		GetRegionCitiesForOsago: function(completeCallback, regionID)
		{
			var dataKey = this._GetRegionCitiesForOsagoCacheKey(regionID);
			return this._GetDataAsync(completeCallback, dataKey);
		},

		SetRegionCitiesForOsago: function(data, regionID)
		{
			var dataKey = this._GetRegionCitiesForOsagoCacheKey(regionID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},


		// *******************************************************************************
		// Получить список производителей ТС заданного типа ТС.
		// *******************************************************************************
		_GetVehicleVendorsCacheKey: function(showVendorType, vehicleTypeID, selectedVehicleVendorID)
		{
			var params =
			{
				showVendorType: showVendorType,
				type: vehicleTypeID,
				selected: selectedVehicleVendorID == undefined ? null : selectedVehicleVendorID
			};

			return this._GetDataAsyncKey(this.urls.vehicleVendors, params);
		},

		GetVehicleVendorsWithoutTypes: function(completeCallback, vehicleTypeID, selectedVehicleVendorID)
		{
			var dataKey = this._GetVehicleVendorsCacheKey(false, vehicleTypeID, selectedVehicleVendorID);
			return this._GetDataAsync(completeCallback, dataKey);
		},

		SetVehicleVendorsWithoutTypes: function(data, vehicleTypeID, selectedVehicleVendorID)
		{
			var dataKey = this._GetVehicleVendorsCacheKey(false, vehicleTypeID, selectedVehicleVendorID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},

		GetVehicleVendors: function(completeCallback, vehicleTypeID, selectedVehicleVendorID)
		{
			var dataKey = this._GetVehicleVendorsCacheKey(true, vehicleTypeID, selectedVehicleVendorID);
			return this._GetDataAsync(completeCallback, dataKey);
		},

		SetVehicleVendors: function(data, vehicleTypeID, selectedVehicleVendorID)
		{
			var dataKey = this._GetVehicleVendorsCacheKey(true, vehicleTypeID, selectedVehicleVendorID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},


		// *******************************************************************************
		// Получить список моделей для типа ТС и производителя.
		// *******************************************************************************
		_GetVehicleModelsCacheKey: function(vehicleTypeID, vehicleVendorID, selectedVehicleModelID)
		{
			var params =
			{
				type: vehicleTypeID,
				vendor: vehicleVendorID,
				selected: selectedVehicleModelID == undefined ? null : selectedVehicleModelID
			};

			return this._GetDataAsyncKey(this.urls.vehicleModels, params);
		},

		GetVehicleModels: function(completeCallback, vehicleTypeID, vehicleVendorID, selectedVehicleModelID)
		{
			var dataKey = this._GetVehicleModelsCacheKey(vehicleTypeID, vehicleVendorID, selectedVehicleModelID);
			return this._GetDataAsync(completeCallback, dataKey);
		},

		SetVehicleModels: function(data, vehicleTypeID, vehicleVendorID, selectedVehicleModelID)
		{
			var dataKey = this._GetVehicleModelsCacheKey(vehicleTypeID, vehicleVendorID, selectedVehicleModelID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},



		// *******************************************************************************
		// VehicleModelModificationsAndPrices
		// *******************************************************************************
		_GetVehicleModelModificationsAndPricesCacheKey: function(vehicleModelID, vehiclePriceGroupID)
		{
			var params =
			{
				ModelID: vehicleModelID,
				VehiclePriceGroupID: vehiclePriceGroupID
			};

			return this._GetDataAsyncKey(this.urls.vehicleModelModificationsAndPrices, params);
		},

		SetVehicleModelModificationsAndPrices: function(data, vehicleModelID, vehiclePriceGroupID)
		{
			var dataKey = this._GetVehicleModelModificationsAndPricesCacheKey(vehicleModelID, vehiclePriceGroupID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},

		//GetVehicleModelModificationsAndPrices: function(completeCallback, vehicleModelID, vehiclePriceGroupID)
		//{
		//	var dataKey = this._GetVehicleModelModificationsAndPricesCacheKey(vehicleModelID, vehiclePriceGroupID);
		//	return this._GetDataAsync(completeCallback, dataKey);
		//},

		GetVehicleModelModificationsAndPrices: function (completeCallback, vehicleModelID, vehiclePriceGroupID) {
			return $.post(	"/xml/modelPrices.wbp",
					{ VehiclePriceGroupID: vehiclePriceGroupID, ModelID: vehicleModelID },
					function (modelPrices) {
						completeCallback(modelPrices, true);
					},
					"json"
				);
		},



		// *******************************************************************************
		// VehicleModelModifications
		// *******************************************************************************
		_GetVehicleModelModificationsCacheKey: function(vehicleModelID)
		{
			var params =
			{
				ModelID: vehicleModelID
			};

			return this._GetDataAsyncKey(this.urls.vehicleModelModifications, params);
		},

		SetVehicleModelModifications: function(data, vehicleModelID)
		{
			var dataKey = this._GetVehicleModelModificationsCacheKey(vehicleModelID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},

		GetVehicleModelModifications: function(completeCallback, vehicleModelID)
		{
			var dataKey = this._GetVehicleModelModificationsCacheKey(vehicleModelID);
			return this._GetDataAsync(completeCallback, dataKey);
		},



		// *******************************************************************************
		// RedressMethods
		// *******************************************************************************
		_GetRedressMethodsCacheKey: function(insuranceTypeID, personType, selectedRedressMethodID)
		{
			var params =
			{
				insuranceType: insuranceTypeID,
				personType: personType,
				selected: selectedRedressMethodID == undefined ? null : selectedRedressMethodID
			};

			return this._GetDataAsyncKey(this.urls.pedressMethods, params);
		},

		SetRedressMethods: function(data, insuranceTypeID, personType, selectedRedressMethodID)
		{
			var dataKey = this._GetRedressMethodsCacheKey(insuranceTypeID, personType, selectedRedressMethodID);
			this.cache.AddItem(dataKey.cacheKey, data);
		},

		GetRedressMethods: function(completeCallback, insuranceTypeID, personType, selectedRedressMethodID)
		{
			var dataKey = this._GetRedressMethodsCacheKey(insuranceTypeID, personType, selectedRedressMethodID);
			return this._GetDataAsync(completeCallback, dataKey);
		},



		// *******************************************************************************
		// DsagoInsuranceMoney
		// *******************************************************************************

		_GetDsagoInsuranceMoneyCacheKey: function(currencyCode, regionTypeID, withTrailer)
		{
			var params =
			{
				trailer: withTrailer,
				curCode: currencyCode,
				terType: regionTypeID,
				json: true
			};

			return this._GetDataAsyncKey(this.urls.dsagoInsuranceMoney, params);
		},

		SetDsagoInsuranceMoney: function(data, currencyCode, regionTypeID, withTrailer)
		{
			var dataKey = this._GetDsagoInsuranceMoneyCacheKey(currencyCode, regionTypeID, withTrailer);
			this.cache.AddItem(dataKey.cacheKey, data);
		},

		GetDsagoInsuranceMoney: function(completeCallback, currencyCode, regionTypeID, withTrailer)
		{
			var dataKey = this._GetDsagoInsuranceMoneyCacheKey(currencyCode, regionTypeID, withTrailer);
			return this._GetDataAsync(completeCallback, dataKey);
		},



		// *******************************************************************************
		// Implementation.
		// *******************************************************************************
		_GetDataSync: function(dataKey)
		{
			return this._GetData(null, dataKey, false);
		},

		_GetDataAsync: function(completeCallback, dataKey)
		{
			return this._GetData(completeCallback, dataKey, true);
		},

		_GetData: function(completeCallback, dataKey, async)
		{
			var result;

			var cachedData = this.cache.GetItem(dataKey.cacheKey);
			if (cachedData == null)
			{
				var self = this;

				var ajaxOptions =
				{
					url: dataKey.url,
					data: dataKey.params,
					dataType: "json",
					async: async
				};

				var syncResult = null;
				
				if (async)
				{
					ajaxOptions.success = function(data)
					{
						self.cache.AddItem(dataKey.cacheKey, data);
						completeCallback(data, true);
					};
					ajaxOptions.error = function()
					{
						completeCallback(null, false);
					};
				}
				else
				{
					ajaxOptions.success = function(data)
					{
						syncResult = data;
					};
				}

				$.ajax(ajaxOptions);
				result = async ? null : syncResult;
			}
			else
			{
				if (async)
				{
					completeCallback(cachedData, true);
				}
				result = cachedData;
			};

			return result;
		},

		_GetDataAsyncKey: function(url, params)
		{
			var cacheKey = url + (this.rUrlWithParams.test(url) ? "&" : "?") + jQuery.param(params);
			var result =
			{
				cacheKey: cacheKey,
				url: url,
				params: params
			};

			return result;
		}

	});

})(jQuery);
