var Theme = window.Theme = {},
	Insales = window.Insales = {
	version: 0.1 };
	
Insales.Product = function(product) {
	var 
		Product = this;
	
	// Хранилище для данных о Вариантах и Опциях
	Product.DB = {Options:{}, Variants:{}};
	
	// Создаем массив опций в нашем хранилище. (Proudct.DB.Options)
	// Опция имеет следущую структуру:
	//
	// -id      - Идентификатор опции
	// -title   - Название опции
	// -Values  - Массив возможных значений данной опции.
	//            Наполнять этот массив будем чуть ниже,
	//            при разборе product.variants.
	// --value  - Каждое значение опции является массивом
	//            и соодержит все варианты с данным значением
	//            текущей опции
	$.each(product.option_names, function(i, Option) {
		Product.DB.Options[Option.id] = $.extend({Values:{}}, Option)
	});
	
	// Создаем массив вариантов в нашем хранилище. (Product.DB.Variants)
	// Вариант имеет следущую структуру:
	//
	// -id       - Идентификатор варианта
	// -title    - Название варианта
	// -price    - Цена варианта
	// -oldPrice - Старая цена варианта
	// -Options  - Массив опций варианта
	// --option  - Значение опции. 
	//             Ключ являеется идентификатором опции. 
	//             (Options["9999"]) где 9999 - идентификатор опции.
	$.each(product.variants, function(i, Variant){
		var ProductVariant = Product.DB.Variants[Variant.id] = {
                        id        : Variant.id,
                        title     : Variant.title,
                        price     : Variant.price,
                        prices    : Variant.prices,
                        oldPrice  : Variant.old_price,
                        sku       : Variant.sku,
                        available : Variant.available,
                        quantity  : Variant.quantity,
                        Options   : {} // Наполняем опции чуть ниже.
		}
		
		$.each(Variant.option_values, function(i, Value){
			// Добавляем опцию варианту
			ProductVariant.Options[Value.option_name_id] = Value.title;
			
			// !!! Заполняем значение опций в Product.DB (Product.DB.Options[].values)
			// Если значение опции упоминается впервые в Product.DB.Options[].values
			if(!Product.DB.Options[Value.option_name_id].Values[Value.title])
				Product.DB.Options[Value.option_name_id].Values[Value.title] = {};
				
			// Добавляем вариант в Product.DB.Options[].values
			Product.DB.Options[Value.option_name_id].Values[Value.title][Variant.id] = Variant;
		});
	});
};

Insales.Product.prototype.getVariants = function(query) {
	var
		Product = this,
		Result = $.extend({}, Product.DB.Variants);
		
	if($.isEmptyObject(query))
		return Result;
	
	$.each(query, function(optionId, optionValue){
		$.each(Result, function(variantId, Variant){
			if(!Variant.Options[optionId] || 
				Variant.Options[optionId] != optionValue )	
				delete Result[variantId]
		});
	});
	
	return Result;
};

Insales.Product.prototype.getOptions = function(query) {

	var Variants = this.getVariants(query),
		Options = {};
	
	$.each(Variants, function(variantId, Variant){
		$.each(Variant.Options, function(optionId, optionValue){
			if(!Options[optionId])
				Options[optionId] = {};
				
			Options[optionId][optionValue] = true;
		});
	});
	
	return Options;
};

Insales.Product.prototype.getStructure = function() {
	return this.DB.Options;
};

Insales.objectLength = function(object){
	var length = 0;
	
	if(!$.isEmptyObject(object))
		$.each(object, function(){
			length++;
		});
	return length;
};

Insales.removeProduct = function(id) {
	$("<form/>", {"method":"post","action":"/cart_items/"+id}).append(
		$("<input/>", {"type":"hidden","value":"delete","name":"_method"})
	).appendTo($("body")).submit();
}
