Ext.namespace('Conf', 'ConfData');

ConfData.data = {};

/*
Conf.currentItem; // name_id текущего конфигурируемого продукта
Conf.currentItemPrice;
Conf.currentItemPriceCur;
Conf.currentItemCurCode;
Conf.currentItemThisDiscount;
Conf.currentItemRecord; // данные текущего конфигурируемого продукта
*/

Conf.cookie = new Ext.state.CookieProvider({
	 path: "/"
	,expires: new Date(new Date().getTime()+(1000*60*60*.5)) // 30 min
});



Conf.setTotalPrice = function(val){
	//Ext.getCmp('total-price').setText(Ys.number_format(Math.ceil(Number(Conf.currentItemPrice) - Number(!Ext.isEmpty(Conf.currentItemThisDiscount)?Conf.currentItemPrice*Conf.currentItemThisDiscount:0) + Number(!Ext.isEmpty(val)?val:0)), 0, ',', ' ')+' '+Conf.currentItemPriceCur);
	Conf.confWindow.el
		.child('.x-window-bl .x-toolbar-ct .x-toolbar-left', false)
		.update('<div style="font-size: 30px; padding: 10px 0; text-align: center;">'+Ys.number_format(Math.ceil(Number(Conf.currentItemPrice) - Number(!Ext.isEmpty(Conf.currentItemThisDiscount)?Conf.currentItemPrice*Conf.currentItemThisDiscount:0) + Number(!Ext.isEmpty(val)?val:0)), 0, ',', ' ')+' '+Conf.currentItemPriceCur+'</div>');
	//Ext.getCmp('total-price').setText(Ys.number_format(Math.ceil(Number(Conf.currentItemPrice) - Number(!Ext.isEmpty(Conf.currentItemThisDiscount)?Conf.currentItemPrice*Conf.currentItemThisDiscount:0) + Number(!Ext.isEmpty(val)?val:0)), 0, ',', ' ')+' '+Conf.currentItemPriceCur);
}

Conf.recalc = function(groupId){
	if(Ext.isEmpty(Conf.currentItemRecord) || !Ext.isArray(Conf.currentItemRecord) || Conf.currentItemRecord.length == 0) return false;
	var summ = 0, selected, selectedPrice;
	Ext.each(Conf.currentItemRecord, function(item, index){
		/*Ext.each(item.items, function(item2, index2){
			selected = Ext.getCmp('radio_'+item2.group_id+'_'+item2.item_id).getGroupValue();
			selectedPrice = Number(item.items[selected].price);
			//echo(item2.item_id+' '+item2.item_name+' '+Ext.getCmp('radio_'+item2.group_id+'_'+item2.item_id).getGroupValue()+' '+item.items[index2].price+' <b>'+item.items[selected].price+'</b>');
		});*/
		if(!Ext.isEmpty(item.items) && item.items.length > 0){
			var item2 = item.items[0];
			selected = Ext.getCmp('radio_'+item2.group_id+'_'+item2.item_id).getGroupValue();
			if(!Ext.isEmpty(selected)){
				if(item.items[selected].price < 0)
					selectedPrice = Number(0);
				else
					selectedPrice = Number(item.items[selected].price);
				
				if(!Ext.isEmpty(groupId) && groupId == item.group_id){
					for(var i = selected; i < item.items.length; i++){
						var diff = Number(item.items[i].price-selectedPrice);
						Ext.fly('price_'+item.items[i].item_id).dom.innerHTML = '<b>'+(diff > 0?'+'+Ys.number_format(diff, 0, ',', ' ')+'</b> '+item.items[i].cur_name:'&#160;');
					}
					for(var i = selected; i >= 0; i--){
						var diff = Number(selectedPrice - item.items[i].price);
						Ext.fly('price_'+item.items[i].item_id).dom.innerHTML = '<b>'+(diff > 0?Ys.number_format((item.items[i].price < 0?0:-diff), 0, ',', ' ')+'</b> '+item.items[i].cur_name:'&#160;');
					}
				}
			}
		}
		summ += selectedPrice;
	});
	Conf.setTotalPrice(summ);
}

/*
 * defaultItem -- если без конф. окна, передать нужные итемы = array(item, item, ..., item)
 */
Conf.serialize = function(defaultItem){
	//console.log(Conf.currentItemRecord);
	if(Ext.isEmpty(Conf.currentItemRecord) || !Ext.isArray(Conf.currentItemRecord) || Conf.currentItemRecord.length == 0) return false;
	var selected, conf = [], c = 0;
	Ext.each(Conf.currentItemRecord, function(item, index) {
		var selectedItem;
		if(!Ext.isEmpty(item.items) && item.items.length > 0){
			var item2 = item.items[0];
			if(Ext.isEmpty(defaultItem)) {
				selected = Ext.getCmp('radio_'+item2.group_id+'_'+item2.item_id).getGroupValue();
				selectedItem = item.items[selected];
			}
			else {
				selectedItem = defaultItem[c++];
			}
		}
		if(!Ext.isEmpty(selectedItem)) {
			conf.push({
				 group_id: item.group_id
				,item_id: selectedItem.item_id
				,item_name: selectedItem.item_name
				,count: selectedItem.count
				,price: selectedItem.price
				,cur_name: selectedItem.cur_name
				,cur_code: selectedItem.cur_code
				,b: selectedItem.bonus
				,img: selectedItem.img
				,name_id: selectedItem.name_id
				,real_price_str: selectedItem.real_price_str
				,name: selectedItem.name
			});
		}
	});
	return Ext.encode(conf);
}

// ищет поле field, содержащее значение value в array conf
// conf = [{field: value, field2: value2}, {field: value, field2: value2}, {field: value, field2: value2}]
Conf.findItemByField = function(conf, field, value){
	if(Ext.isEmpty(conf) || !Ext.isArray(conf) || conf == 0) return false;
	var ret = false;
	Ext.each(conf, function(item, index){
		//echo(item[field]+' '+field+' '+value);
		if(item[field] == value){
			ret = item;
		}
	});
	return ret;
}

Conf.insertConfSummary = function(conf, div) {
	if(Ext.isEmpty(conf) || !Ext.isArray(conf) || conf.length == 0) return false;
	if(Ext.isEmpty(div)) div = Ext.get('conf-summary-inf');

	var ret = '';
	var summ = Number(0), bonus = false;
	Ext.each(conf, function(item, index) {
		//console.log(item);
		if(item.price != 0){
			if(item.price < 0)
				bonus = true;
			ret += ''
			+'<li style="text-align: left; line-height: 1.3em !important; margin-top: 4px; margin-bottom: 4px;" '+(item.price < 0?'class="bonus ext-information-message"':'')+'><a class="local ext-link" href="/catalog/'+item.name_id+'/">'+item.item_name+'</a>'
				+'<div style="text-align: right;">'
					+'<b>'+Ys.number_format(Math.ceil(Number((item.price < 0?0:item.price))), 0, ',', ' ')+'</b>&#160;'+item.cur_name
				+'</div>'
				+(bonus == true?
					'<div class="ext-message-body x-hidden">'
						+(item.img?'<p style="text-align: center;"><img src="/descr/'+item.name_id+'/i/'+item.img+'" width="60" height="60" /></p>':'')
						+(item.name?'<p>'+item.name+'</p>':'')
						+(item.real_price_str?'<p>Цена вне комплекта: <b>'+item.real_price_str+'</b></p>':'')
					+'</div>'
				:'')
			+'</li>';
			if(item.price > 0)summ += Number(item.price);
		}
	});
	div.dom.innerHTML = (Ext.isEmpty(ret)?'':''
		//+'<div style="text-align: left;">&#160;+&#160;<span style="font-weight: bold;">'+Ys.number_format(Math.ceil(Number(summ)), 0, ',', ' ')+'</span>&#160;'+Conf.currentItemPriceCur+'</div>'
		+'<ul style="font-size: 8px; padding: 0; margin: 0 2px 0 10px;">'
			+'<li style="line-height: 1.2em !important;">'+Conf.currentItemName
				+'<div style="text-align: right;">'
					+'<b>'+Ys.number_format(Math.ceil(Number(Conf.currentItemPrice-(Conf.currentItemPrice*Conf.currentItemThisDiscount))), 0, ',', ' ')+'</b>&#160;'+Conf.currentItemPriceCur
				+'</div>'
			+'</li>'
			+ret
		+'</ul>'
		+'<div style="text-align: right; border-top: 1px dashed #fccc8e; margin-top: 2px; padding-top: 1px;">Итого:&#160;<span style="font-weight: bold;">'+Ys.number_format(Math.ceil(Number(summ) + Number(Conf.currentItemPrice-(Conf.currentItemPrice*Conf.currentItemThisDiscount))), 0, ',', ' ')+'</span>&#160;'+Conf.currentItemPriceCur+'</div>'
		+'');
	
	User.applyInfMsg(div.dom);
	
	if(Ext.isEmpty(ret)) {
		Ext.DomHelper.applyStyles(div, 'border: 0; padding: 5px 0; margin: 0;');
		return false;
	}
	else {
		Ext.DomHelper.applyStyles(div, 'text-align: left; padding: 6px 6px; margin: 6px 0; border-bottom: 1px solid #fccc8e; border-top: 1px solid #fccc8e;');
		
		try {
			//console.log(div.getWidth());
			var imgs = Ext.get(Ext.DomQuery.selectNode('.product_inf .imgs'));
			imgs.pause(1).scale(500 - div.getWidth(), '', {
				//duration: 1
			});
			if(bonus) {
				var main = Ext.DomQuery.selectNode('.product_inf .main');
				Ext.get(Ext.DomHelper.insertHtml('afterBegin', main, '<div class="bonus"></bonus>')).hide().pause(1).fadeIn();
			}
			/*
			else {
				Ext.get(Ext.DomQuery.selectNode('.product_inf .main .bonus')).fadeOut({remove: true});
			}
			*/
		}
		catch(e){
			//console.log(e);
		}
		
		return div;
	}
}

Conf.saveConf = function(nameId, conf, nocookie) {
	if(nocookie) {
		ConfData.data[nameId] = Ext.decode(conf);
	}
	else {
		Conf.cookie.set(nameId, conf);
	}
}

Conf.getConf = function(nameId){
	return (Ext.isEmpty(ConfData.data[nameId])?Conf.cookie.get(nameId, '[]'):Ext.encode(ConfData.data[nameId]));
}

Conf.confPanel = new Ext.Panel({
	 //region: 'center'
	//,layout: 'fit'
	width: 508
	,bodyStyle: 'padding: 5px;'
	,autoScroll: true
	,border: false
});

Conf.configuration = function(contEl){
	contEl.mask('', 'x-mask-loading');
	try{
		Ext.Ajax.request({
			 url: '/conf/'
			,params: {
				 type: 'get'
				,id: Conf.currentItem
			}
			,success: function(response){
				try{
					var ret = Ext.decode(response.responseText);
					var r = ret.data;
				}
				catch(e){
					Ext.Msg.alert('Fail', 'Неизвестный ответ сервера.<br />'+response.responseText);
					contEl.getEl().unmask();
				}
				finally{
					if(!Ext.isEmpty(r)){
						if(ret.err == 1){
							Ext.Msg.alert('Fail', ret.msg+'<br />'+response.responseText);
						} else {
							
							Conf.currentItemRecord = r;
							
							if(!Ext.isEmpty(Conf.confPanel.items)){
								Ext.each(Conf.confPanel.items, function(item, index){
									Conf.confPanel.remove(Conf.confPanel.items.last(), true);
								});
								Conf.confWindow.center();
							}
							
							var conf = Ext.decode(Conf.getConf(Conf.currentItem));
							Ext.each(r, function(item, index){

								var radioGroupItems = [];
								var priceLabels = '';
								var defaultChecked = false;
								Ext.each(item.items, function(item2, index2){
									var check;
									if(!Ext.isEmpty(conf) && Ext.isArray(conf) && conf.length > 0){
										check = Conf.findItemByField(conf, 'item_id', item2.item_id);
										check = (check !== false?true:false);
									} else
										check = (item2.name_id == 0?true:false);
									
									if(check === true)
										defaultChecked = true;
									
									if(index2 == (item.items.length-1) && defaultChecked === false){
										//Ext.fly(item.items[0]).setValue(true);
										check = true;
									};
									
									/*echo(Ext.encode(Conf.findItemByField(conf, 'item_id', item2.item_id)));
									check = (item2.name_id == 0?true:false);*/
									
									radioGroupItems.push(
										new Ext.form.Radio({
											 boxLabel: item2.item_name
											,name: 'group_'+item2.group_id
											,id: 'radio_'+item2.group_id+'_'+item2.item_id
											,inputValue: index2
											//,checked: check
											,listeners: {
												check: {
													fn: function(){
														if(!this.checked) return false;
														Ext.fly('img_group_'+item2.group_id).setStyle('background-image', 'url(/descr/'+item2.name_id+'/i/'+item2.img+')');
														Conf.recalc(item2.group_id);
													}
												},
												render: {
													fn: function(){
														if(check)
															this.setValue(true);
														contEl.unmask();
													},
													delay: 200
												}
											}
										})
									);
									
									priceLabels += '<div type="conf-price" item_id="'+item2.item_id+'" price="'+item2.price+'" cur_name="'+item2.cur_name+'" style="text-align: right; white-space: nowrap; font-size: 11px; margin: 7px 0 12px 0;" id="price_'+item2.item_id+'">'+(Ext.isEmpty(item2.price) || item2.price == 0?'&#160;':'<b>'+Ys.number_format((item2.price<0?'0':item2.price), 0, ',', ' ')+'</b>&#160;'+item2.cur_name)+'</div>';
									//echo((Ext.isEmpty(item2.price) || item2.price == 0?'':item2.price+'&#160;'+item2.cur_name));
								});
								
								var radioGroup = new Ext.form.RadioGroup({
									 columns: 1
									,items: radioGroupItems
								});
								
								Conf.confPanel.add(
									{
										 xtype: 'fieldset'
										,title: item.group_name
										,width: 500
										,autoHeight: true
										,layout: 'column'
										,items: [
											 {
												 width: 70
												,border: false
												,html: '<div id="img_group_'+item.group_id+'" style="background: no-repeat center center; height: 70px; margin-right: 10px;"></div>'
											}
											,{
												 width: 300
												,border: false
												,items: [
													radioGroup
												]
											}
											,{
												 width: 70
												,border: false
												,html: priceLabels
											}
										]
									}
								);
							});
							
							Conf.confPanel.add({
								 xtype: 'label'
								,id: 'total-price'
								,style: 'font-size: 20px; margin-left: 270px;'
							});
							
							
							Conf.confWindow.doLayout();
							//Conf.setTotalPrice();
						}
					} else {
						Ext.Msg.alert('Fail', 'Пустой ответ сервера.');
						contEl.unmask();
					}
					
					Conf.confWindow.center();
				}
			}
			,failure: function(response){
				Ext.Msg.alert('Fail', 'Ошибка.<br />Проверьте соединение с интернетом.<br />'+response.responseText);
				contEl.unmask();
			}
		});
	}
	catch(e){
		Ext.Msg.alert('Fail', 'Внутренняя ошибка скрипта.<br />Обновите страницу и попробуйте еше раз.<br />'+e.s);
		contEl.unmask();
	}
}

Conf.confWindow = new Ext.Window({
	 closeAction: 'hide'
	,autoHeight: false
	//,autoWidth: !Ext.isIE
	//,modal: true
	,width: 540
	,closable: false
	,autoScroll: true
	,items: [Conf.confPanel]
	,style: 'background-color: #fff;'
	,buttons: [
		{
			 text: 'Применить'
			,handler: function(){
				Conf.confWindow.getEl().mask('', 'x-mask-loading');
				Conf.saveConf(Conf.currentItem, Conf.serialize());
				Conf.confWindow.hide();
				(new Ext.util.DelayedTask()).delay(100, function(){
					var div = Conf.insertConfSummary(Ext.decode(Conf.getConf(Conf.currentItem)));
					if(div !== false){
						//div.frame('fca536');
						div.highlight('fca536', {
							duration: 2
						});
					}
				}, this);
			}
			,id: 'apply-button'
		},
		{
			 text: 'Отмена'
			,handler: function(){
				Conf.confWindow.hide();
			}
		}
	]
	,listeners: {
		show: {
			fn: function(){
				var visBox = Ys.getVisibleArea();
				if(Ext.isIE) Conf.confPanel.setWidth(518);
				if(Ext.isIE) Conf.confWindow.setWidth(560);
				Conf.confWindow.setHeight(visBox.height-100);
				
				Conf.confWindow.center();
				
				Conf.configuration(this.getEl());
			}
		}
	}
});

Conf.init = function(item){
	Conf.currentItem = item.getAttribute('name_id');
	Conf.currentItemPrice = item.getAttribute('price');
	Conf.currentItemPriceCur = item.getAttribute('price_cur');
	Conf.currentItemCurCode = item.getAttribute('cur_code');
	Conf.currentItemThisDiscount = item.getAttribute('this_discount');
}

Conf.parseConf = function(data, nocookie) {
	if(Ext.isEmpty(nocookie)) nocookie = false;
	var bonus = [];
	Conf.currentItemRecord = data;
	
	var savedConf = Ext.decode(Conf.getConf(Conf.currentItem));
	
	Ext.each(data, function(item) {
		Ext.each(item.items, function(item2) {
			
			// begin проверим, может в куках затаилась старая инфа
			if(!Ext.isEmpty(savedConf)) {
				Ext.each(savedConf, function(item2_1, index) {
					if(item2_1.group_id == item2.group_id && item2_1.item_id == item2.item_id && item2_1.price == item2.price) {
						item2_1['keep'] = true;
					}
				});
			}
			// end проверим, может в куках затаилась старая инфа
			
			// нашли бонус
			if(item2.bonus == '1') { // Ext.isEmpty(bonus) && 
				bonus.push(item2);
			}
		});
	});
	
	// begin проверим на наличие бонуса в куках и удалим не тру
	//console.log(savedConf);
	if(!Ext.isEmpty(savedConf) && savedConf.length) {
		var removed = [];
		Ext.each(savedConf, function(item) {
			if(item['keep'] == true) {
				if(!Ext.isEmpty(bonus) && bonus.length) {
					Ext.each(bonus, function(item2) {
						if(!Ext.isEmpty(item2) && item.group_id == item2.group_id && item.item_id == item2.item_id && item.price == item2.price) {
							bonus.remove(item2);
						}
					});
				}
			}
			else {
				removed.push(item);
			}
		});
		Ext.each(removed, function(item) {
			savedConf.remove(item);
		});
	}
	// end проверим на наличие бонуса в куках и удалим не тру
	
	if(!Ext.isEmpty(bonus)) { // сохраним в куку бонус
		Conf.saveConf(Conf.currentItem, Conf.serialize(bonus), nocookie);
	}
	else if(Ext.isEmpty(savedConf)) {
		Conf.cookie.clear(Conf.currentItem);
	}
	else {
		Conf.saveConf(Conf.currentItem, Conf.serialize(savedConf), nocookie);
	}
}



Ext.onReady(function(){
	Ext.each(Ext.DomQuery.select('div[type=configure_btn]'), function(item) {
		var itemEl = Ext.get(item);
		if(itemEl.hasClass('please-wait'))
			itemEl.removeClass('please-wait');
		
		new Ext.Button({
			 renderTo: item
			//,text: 'Сконфигурировать'
			,text: 'Конфигуратор'
			,icon: '/i/16_icons/cog.png'
			,cls: 'x-btn-text-icon'
			,handler: function() {
				Conf.init(item);
				if(!Ext.isIE && item.hasAttribute('sklad') && item.getAttribute('sklad') != '1')
					Ext.getCmp('apply-button').hide();
				Conf.confWindow.setTitle('Конфигуратор '+item.getAttribute('name'));
				Conf.confWindow.show(this.getEl());
			}
		});
		
		// begin add bonus goods
		Ext.Ajax.request({
			 url: '/conf/'
			,params: {
				 id: Conf.currentItem
				,type: 'get'
			}
			,scope: this
			,success: function(response) {
				try {
					var data = Ext.decode(response.responseText).data;
					Conf.parseConf(data);
					try {
						var div = Conf.insertConfSummary(Ext.decode(Conf.getConf(Conf.currentItem))).highlight('fca536', {
							duration: 2
						});
					}
					catch(e) {
						//console.log(e);
					}
				}
				catch(e) {
					//console.log(e);
				}
				//console.log(bonus);
			}
		});
		// end add bonus goods

	});

	var itemEl = Ext.get('conf-summary-inf');
	if(itemEl && itemEl.hasClass('please-wait')) itemEl.removeClass('please-wait');

	
	if(!Ext.isEmpty(Server.bonusData) && Server.bonusData.length) {
		//console.log(Server.bonusData);
		Ext.Ajax.request({
			 url: '/conf/'
			,params: {
				 id: Ext.encode(Server.bonusData)
				 //id: 100008
				,type: 'get'
			}
			,scope: this
			,success: function(response) {
				try {
					var data = Ext.decode(response.responseText).data;
					Ext.each(data, function(item, index) {
						Conf.currentItem = Server.bonusData[index];
						Conf.parseConf(item, true);
						/*
						try {
							var div = Conf.insertConfSummary(Ext.decode(Conf.getConf(Conf.currentItem))).highlight('fca536', {
								duration: 2
							});
						}
						catch(e) {
							console.log(e);
						}
						*/
					});
					
					//console.log(ConfData.data);
				}
				catch(e) {
					//console.log(e);
				}
			}
		});
	}
	
	
	/*
	if(!Ext.isEmpty(Conf.currentItem)){
		// show saved conf
		Conf.insertConfSummary(Ext.decode(Conf.getConf(Conf.currentItem)));
	}
	*/

	
	
	
});
