Ext.namespace('Bas');

Bas.unsavedChanges = false;
Bas.summCurName = '';
Bas.orderButtonLastClicked; // последняя кликнутая кнопка "заказать", для таргетинга анимации скрытия окна заказа
Bas.subsButtonLastClicked; // последняя кликнутая кнопка "уведомить", для таргетинга анимации скрытия окна заказа

Bas.warningOnLeave = function(){
	if(Bas.unsavedChanges){
		var msg = "На странице имеются несохраненные изменения."
		var e = e || window.event;
		// For IE and Firefox
		if (e) {
			e.returnValue = msg;
		}
		// For Safari
		return msg;
	}
}

onbeforeunload = Bas.warningOnLeave;
window.onclose = Bas.warningOnLeave;

Bas.cookie = new Ext.state.CookieProvider({
	 path: "/"
	,expires: new Date(new Date().getTime()+(1000*60*60*24*1)) // 1 day
});

Bas.saveBasStore = function(){
	var ds = Bas.basStore;
	var changes = ds.getModifiedRecords();
	var modified = [];
	var l = changes.length;
	if(!l){
		Bas.unsavedChanges = false;
		return;
	}
	
	var params = '';
	for(var i = 0; i < l; i++){
		var cache = changes[i];
		//echo(i+' '+cache.get('count')+' '+Ext.encode(cache.data));
		modified.push({
			 'name_id': cache.get('name_id')
			,'key': cache.get('key')
			,'count': cache.get('count')
		});
	}
	Ext.Ajax.request({
		 url: './recount_item/'
		,params: {
			 modified: Ext.encode(modified)
			,'new_basket': 1
		}
		,callback: function(options, success, response){
			if(success){
				var ret = response.responseText;
				try{
					var r = Ext.decode(ret);
					if(r.err == '0' && r.total > Number('0')){
						Bas.unsavedChanges = false;
						ds.commitChanges();
					} else if(r.total == '0') {
						//alert('');
					} else {
						alert('Некая ошибка в ответе сервера: '+ret);
					}
				}
				catch(e){
					alert(e);
				}
			}
		}
		,failure: function(){
			Ext.Msg.show({
				 title: 'Ошибка отправки'
				,msg: 'При отправке данных на сервер произошла ошибка. Проверьте соединение с интернетом и нажмите «OK», чтобы повторить попытку.'
				,buttons: Ext.Msg.OKCANCEL
				,fn: function(buttonId){
					if(buttonId == 'ok'){
						Bas.saveBasStore();
					}					
				}
				,icon: Ext.MessageBox.ERROR
			});
		}
	});
}


Bas.basFields = [
	 {name:'bas_type'}
	,{name:'name_id'}
	,{name:'name'}
	,{name:'price'}
	,{name:'cur_name'}
	,{name:'cur_code'}
	,{name:'conf'}
	,{name:'key'}
	,{name:'count'}
	,{name:'conf_summ'}
	,{name:'unical_id'}
	,{name:'shuttle_id'}
	,{name:'sn'}
	//,{name:'img'}
];

Bas.applyBasketDelBtn = function(){
	// проапплим кнопки "удалить из корзины"
	var items = Ext.DomQuery.select('div[type=basdel]');
	if(!Ext.isEmpty(items.length)){
		Ext.each(items, function(item, index){
			var itemEl = Ext.get(item);
			//itemEl.addClass('ttt')
			itemEl.on('click',
				function(e){
					var delBtn = e.getTarget('', '', true);
					if(!delBtn.hasClass('please-wait')){
						var selCell = Bas.basGrid.getSelectionModel().getSelectedCell();
						var selRec = Bas.basStore.getAt(selCell[0]);
						//Bas.basGrid.getSelectionModel().clearSelections();
						if(confirm('Удалить?')){
							delBtn.addClass('please-wait');
							delBtn.removeClass('btn_delete');
							
							Ext.Ajax.request({
								url: './delete/',
								success: function(response){
									if(Ext.isEmpty(response.responseText)){
										Ext.Msg.alert('Fail', 'Пустой ответ сервера!');
										return;
									}
									var ret = Ext.decode(response.responseText);
									if(Ext.isEmpty(ret) || ret == '-1'){
										Ext.Msg.alert('Fail', 'Ошибка сохранения.<br />Ответ сервера: «'+response.responseText+'»');
									} else if(ret >= Number('0')){
										Ext.get(Bas.basGrid.getView().getRow(selCell[0])).ghost('b', {
											 easing: 'easeOut'
											,duration: .5
											,remove: false
											,useDisplay: false
											,callback: function(){
												Bas.basStore.remove(selRec);
												Bas.basGroupingView.refresh();
												//Bas.basStore.reload();
											}
										});
									}
								},
								failure: function(response){
									item.enable();
									Ext.Msg.alert('Fail', 'Ошибка удаления.<br />Проверьте соединение с интернетом.<br />'+response.responseText);
								},
								params: {
									 id: selRec.get('name_id')
									,sn: selRec.get('sn')
									,unical_id: selRec.get('unical_id')
									,key: selRec.get('key')
								}
							});
							
						}
					}
				}
			);
		});
	}
}
	
Bas.basStore = new Ext.data.GroupingStore({
	 proxy: new Ext.data.HttpProxy({
		url: '/basket/basket.json',
		method: 'POST'
	})
	,sortInfo: {field: 'name', direction: 'ASC'}
	,groupField: 'bas_type'
	,remoteSort: true
	,reader: new Ext.data.JsonReader({
		totalProperty: 'total',
		root: 'data'
	}, Bas.basFields)
	,listeners: {
		loadexception: function() {
			console.log('load failed -- arguments: %o', arguments);
		}
		,load: {
			fn: function(store, record, object){
				Ext.getCmp('basket-order-go').setDisabled(!record.length);
				Ext.getCmp('basket-empty').setDisabled(!record.length);

				Bas.applyBasketDelBtn();
				
				Bas.basGrid.getEl().unmask();
			}
			,delay: 50
		}
		,beforeload: {
			fn: function(store, object){
				Ext.getCmp('basket-order-go').setDisabled(true);
			}
		}
		,remove: {
			fn: function(){
				Bas.applyBasketDelBtn();
			}
			,delay: 50
		}
		,update: {
			fn: function(store, record, operation){
				//alert(store.getAt(store.indexOf(record)).get('count')+'/'+record.get('count')+' '+record.get('name_id')+' '+operation);
				//store.rejectChanges();
				
				//store.commitChanges();
				//echo(store.getModifiedRecords().length + ' ' + record.get('name_id') + ' ' + operation);
				if(operation == Ext.data.Record.EDIT){
					Bas.unsavedChanges = true;
				}
				Bas.saveBasStore();
			}
		}
	}
});

Bas.checkColumn = new Ext.grid.CheckboxSelectionModel({
	listeners: {
		selectionchange: {
			fn: function(){
				Ext.getCmp('basket-item-delete-button').setDisabled(!this.getCount());
			}
		}
	}
});

Bas.countEditor = new Ext.form.NumberField({
	 selectOnFocus: true
	,allowBlank: false
	,allowNegative: false
	,minValue: 1
	,maxValue: 999999
	/*,listeners: {
		change: {
			fn: function(field, nV, oV){
				alert(nV+' '+oV);
			}
		}
	}*/
});

Bas.basColumns = new Ext.grid.ColumnModel([
	 //Bas.checkColumn
	 {
		 dataIndex: 'bas_type'
		,header: 'Тип содержимого'
		,align: 'left'
		,resizable: false
		,width: 100
		,renderer: function(v, metadata, record){
			switch(v){
				case 'basket':
					return 'Обычная корзина';
				case 'basket_conf':
					return 'Сконфигурированные';
				case 'shuttle':
					return 'Шаттлы';
				case 'comiss':
					return 'Уцененные товары';
			}
		}
	}
	,{
		 dataIndex: 'name'
		,menuDisabled: true
		,header: 'Наименование'
		,resizable: false
		,id: 'clmn-name'
		,renderer: function(v, metadata, record){
			var conf = record.get('conf');
			var conf_inf = '';
			if(!Ext.isEmpty(conf) && Ext.isArray(conf)){
				Ext.each(conf, function(v, i){
					conf_inf += '<div style="margin-left: 4px; font-size: 80%;">— '+v['name']+', '+Ys.number_format((v['price']<0?0:v['price']), 0, ',', ' ')+'&#160;'+v['cur_name']+'</div>';
				});
			}
			return '<div>'
					+'<a href="/catalog/'+record.get('name_id')+'/">'+v+'</a>'
						+(!Ext.isEmpty(conf) && Ext.isArray(conf)?', '+Ys.number_format(record.get('price'), 0, ',', ' ')+' '+record.get('cur_name')
						+'<div>'+conf_inf+'</div>':'')
				+'</div>';
		}
	}
	,{
		 dataIndex: 'price'
		,menuDisabled: true
		,header: 'Цена'
		,resizable: false
		,width: 80
		,align: 'right'
		,renderer: function(v, metadata, record){
			return (record.get('bas_type') != 'comiss'?Ys.number_format((Number(record.get('conf_summ')) + Number(v)), 0, ',', ' ')+' '+record.get('cur_name'):'');
		}
	}
	,{
		 dataIndex: 'count'
		,menuDisabled: true
		,header: 'Кол-во'
		,width: 60
		,resizable: false
		,align: 'center'
		,renderer: function(v, metadata, record, row, col){
			var basType = record.get('bas_type');
			if(basType != 'comiss' && basType != 'shuttle'){
				metadata.attr = 'title="Нажмите для редактирования"';
				metadata.css = 'column-editable';
			}
			return (basType != 'comiss'?v:'1')+' шт.';
		}
		,editor: Bas.countEditor
	}
	,{
		 dataIndex: 'summ'
		,menuDisabled: true
		,id: 'clmn-summ'
		,header: 'Сумма'
		,width: 100
		,resizable: false
		,align: 'right'
		,renderer: function(v, metadata, record){
			Bas.summCurName = record.get('cur_name');
			metadata.css = 'clmn-summ';
			return Ys.number_format((Number(record.get('conf_summ')) + Number(record.get('price'))) * record.get('count'), 0, ',', ' ')+' '+record.get('cur_name');
		}
		,summaryType: 'sumOfSumm'
		,summaryRenderer: function(v){
			return '<b>'+Ys.number_format(v, 0, ',', ' ')+'</b> '+Bas.summCurName;
		}
	}
	,{
		 menuDisabled: true
		,width: 30
		,align: 'center'
		,resizable: false
		,renderer: function(v, metadata, record){
			return '<div type="basdel" class="btn_delete"></div>';
		}
	}
]);

Ext.grid.GroupSummary.Calculations['sumOfSumm'] = function(v, record, field){
	var sss = v+(Number(record.get('conf_summ')) + Number(record.get('price'))) * record.get('count');
	//Bas.totalSumm += sss;
	//Ext.getCmp('basket-total-summ').setValue(Bas.totalSumm);
	return sss;
}

Bas.summary = new Ext.grid.GroupSummary(); 

Bas.basGroupingView = new Ext.grid.GroupingView({
	 hideGroupedColumn: true
	,groupTextTpl: '<span>{group}</span> <span style="font-weight: normal;">({[values.rs.length]} {[values.rs.length > 1 ? "шт." : "шт."]})</span>'
});

Bas.basGrid = new Ext.grid.EditorGridPanel({
	 margins: '0 5 5 0'
	,enableColumnMove: false
	,border: true
	,width: 550
	//,height: 500
	//,autoWidth: true
	//,layout: 'fit'
	,autoHeight: true
	,autoScroll: false
	,autoExpandColumn: 'clmn-name'
	,region: 'center'
	,id: 'basket-grid'
	,store: Bas.basStore
	,view: Bas.basGroupingView
	,cm: Bas.basColumns
	,enableColLock: true
	,stripeRows: true
	,loadMask: true
	,clicksToEdit: 1
	//,sm: Bas.checkColumn
	/*,bbar: new Ext.Toolbar({
		 autoWidth: true
		,items: [
			 '->'
			,'Сумма:'
			,' '
			,new Ext.form.NumberField({
				 id: 'basket-total-summ'
				,grow: true
				,allowDecimals: false
				,allowNegative: false
				,readonly: true
			})
		]
	})*/
	,plugins: [
		 Bas.summary
		//,Goods.goodsRowExpander
	]
	,buttons: [
		 {
			 id: 'basket-empty'
			,text: 'Очистить корзину'
			,icon: '/i/16_icons/basket_delete.png'
			,cls: 'x-btn-text-icon'
			,disabled: true
			,handler: function(){
				this.setDisabled(true);
				if(confirm('Очистить корзину?'))
					window.location.href='./empty/';
				else
					this.setDisabled(false);
			}
		}
		,{
			 id: 'basket-order-go'
			,text: 'Оформить заказ'
			,icon: '/i/16_icons/cart_go.png'
			,cls: 'x-btn-text-icon'
			,disabled: true
			,handler: function(){
				this.setDisabled(true);
				window.location.href = '/basket/order/';
			}
		}
	]
	,listeners: {
		beforeedit: {
			fn: function(e){
				if(e.record.get('bas_type') == 'comiss' || e.record.get('bas_type') == 'shuttle') e.cancel = true;
			}
		}
		,render: {
			fn: function(e){
				Bas.basGrid.getEl().mask('', 'x-mask-loading');
				
				Bas.basStore.load({params: {}});
				
				/* if(!Bas.cookie.get('alpha-alert-new-bas')){
					Ext.Msg.show({
						 title: 'WARNING'
						,icon: Ext.MessageBox.WARNING
						,msg: 'Внимание!<br />Новая корзина пребывает в альфа-версии. Использовании ее в реальных заказах может вызвать ошибки!'
						,buttons: Ext.Msg.OK
						,fn: function(){
							Conf.cookie.set('alpha-alert-new-bas', true);
						}
					});
				} */
			}
		}
	}
});

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


Bas.orderForm = new Ext.FormPanel({
	 frame: false
	,border: false
	//,title:'Check/Radio Groups'
	,labelWidth: 110
	,bodyStyle: 'padding: 10px;'
	,monitorValid: true
	,items: [
		{
			 xtype: 'textfield'
			,fieldLabel: 'ФИО'
			,name: 'fio'
			,allowBlank: false
			,minLength: 5
			,maxLength: 50
			,width: 145
		}
		,{
			 xtype: 'textfield'
			,fieldLabel: 'E-mail'
			,name: 'email'
			,allowBlank: false
			,minLength: 5
			,maxLength: 50
			,width: 145
		}
		,{
			 xtype: 'textfield'
			,fieldLabel: 'Телефон с кодом'
			,name: 'tel'
			,allowBlank: false
			,minLength: 5
			,maxLength: 50
			,width: 145
		}
	]
	,listeners: {
		'clientvalidation': {
			fn: function(form, valid){
				Ext.getCmp('order-window-order-btn').setDisabled(!valid);
			}
		}
	}
});

Bas.orderWindow = new Ext.Window({
	 closeAction: 'hide'
	,title: 'Заявка на заказ товара'
	,width: 300
	//,height: 200
	,autoHeight: true
	,closable: true
	,autoScroll: true
	,shadow: false
	,items: [
		{
			 xtype: 'panel'
			,border: false
			,bodyStyle: 'padding: 4px 10px;'
			,html: 'Пожалуйста, аккуратно заполните все поля формы. Эта информация будет использована менеджером для подтверждения вашей заявки.<br /><br />Если вы авторизуетесь, система автоматически подставит данные из вашего профайла.'
		}
		,Bas.orderForm
	]
	,buttons: [
		 {
			 text: 'Отправить заявку'
			,icon: '/i/16x16/truck_desaturate.gif'
			,id: 'order-window-order-btn'
			,disabled: true
			,cls: 'x-btn-text-icon'
			,handler: function(){
				//Bas.orderWindow.hide(Bas.orderButtonLastClicked.getEl());
				
				if(Bas.orderForm.getForm().isValid()){
					Bas.orderWindow.getEl().mask('', 'x-mask-loading');
					// запомним введенные данные в куку
					var data = Ext.encode(Bas.orderForm.getForm().getValues());
					Conf.cookie.set('order-form-data', data);
					
					Ext.Ajax.request({
						 url: '/basket/ugo/'
						,params: {
							 type: 'ordergood'
							,id: Bas.orderButtonLastClicked.getEl().parent('', true).getAttribute('name_id')
							,data: data
						}
						,success: function(response){
							try{
								var ret = Ext.decode(response.responseText);
								var r = ret.data;
								if(ret.err != "0"){
									Ext.Msg.alert('Fail', 'Сервер вернул ошибку: '+ret.msg[0]);
								}
							}
							catch(e){
								Ext.Msg.alert('Fail', 'Неизвестный ответ сервера.<br />'+response.responseText);
							}
							finally{
								if(r){
									Bas.orderWindow.hide();
									Ys.lightMsg.msg('Отлично','Ваша заявка принята');
									Bas.orderButtonLastClicked.getEl().ghost('b', {
										 easing: 'easeOut'
										,duration: .5
										,remove: false
										,useDisplay: false
									});
								}
							}
							Bas.orderWindow.getEl().unmask();
						}
						,failure: function(response){
							Ext.Msg.alert('Fail', 'Ошибка соединения с сервером.<br />Проверьте соединение с интернетом.<br />'+response.responseText);
							Bas.orderWindow.getEl().unmask();
						}
					});
				}
			}
		}
		,{
			 text: 'Закрыть'
			,handler: function(){
				if(Bas.orderForm.getForm().isValid()){
					// запомним введенные данные в куку
					var data = Ext.encode(Bas.orderForm.getForm().getValues());
					Conf.cookie.set('order-form-data', data);
				} else {
					Conf.cookie.set('order-form-data');
				}
				Bas.orderWindow.hide((Ext.isEmpty(Bas.orderButtonLastClicked)?'':Bas.orderButtonLastClicked.getEl()));
			}
		}
	]
	,listeners: {
		show: {
			fn: function(){
				var data = Conf.cookie.get('order-form-data');
				if(Ext.isEmpty(data)){
					Bas.orderWindow.getEl().mask('', 'x-mask-loading');
					
					Ext.Ajax.request({
						 url: '/basket/ugo/'
						,params: {
							 type: 'getuser'
						}
						,success: function(response){
							try{
								var ret = Ext.decode(response.responseText);
								var r = ret.data;
								if(ret.err != "0"){
									Ext.Msg.alert('Fail', 'Сервер вернул ошибку: '+ret.msg[0]);
									Bas.orderWindow.getEl().unmask();
								}
							}
							catch(e){
								Ext.Msg.alert('Fail', 'Неизвестный ответ сервера.<br />'+response.responseText);
								Bas.orderWindow.getEl().unmask();
							}
							finally{
								if(!Ext.isEmpty(r)){
									Bas.orderForm.getForm().setValues(r);
								}
								Bas.orderWindow.getEl().unmask();
							}
						}
						,failure: function(response){
							Ext.Msg.alert('Fail', 'Ошибка соединения с сервером.<br />Проверьте соединение с интернетом.<br />'+response.responseText);
							Bas.orderWindow.getEl().unmask();
						}
					});
				}
			}
		}
	}
});


Bas.subsForm = new Ext.FormPanel({
	 frame: false
	,border: false
	,labelWidth: 110
	,bodyStyle: 'padding: 10px;'
	,monitorValid: true
	,items: [
		{
			 xtype: 'textfield'
			,fieldLabel: 'E-mail'
			,name: 'email'
			,allowBlank: false
			,minLength: 5
			,maxLength: 50
			,width: 145
		}
	]
	,listeners: {
		'clientvalidation': {
			fn: function(form, valid){
				Ext.getCmp('subs-window-order-btn').setDisabled(!valid);
			}
		}
	}
});

Bas.subsWindow = new Ext.Window({
	 closeAction: 'hide'
	,title: 'Уведомить о появлении'
	,width: 300
	,autoHeight: true
	,closable: true
	,autoScroll: true
	,shadow: false
	,items: [
		{
			 xtype: 'panel'
			,border: false
			,bodyStyle: 'padding: 4px 10px;'
			,html: 'Пожалуйста, введите e-mail. При появлении товара на складе вам будет выслано уведомление.<br />Если вы авторизуетесь, система автоматически подставит e-mail из вашего профайла.'
		}
		,Bas.subsForm
	]
	,buttons: [
		 {
			 text: 'Подписаться'
			,icon: '/i/16_icons/email_add.png'
			,id: 'subs-window-order-btn'
			,disabled: true
			,cls: 'x-btn-text-icon'
			,handler: function(){
				if(Bas.subsForm.getForm().isValid()){
					Bas.subsWindow.getEl().mask('', 'x-mask-loading');
					// запомним введенные данные в куку
					var data = Bas.subsForm.getForm().getValues();
					Conf.cookie.set('subs-form-data', Ext.encode(data));
					
					
					Ext.Ajax.request({
						 url: '/subscribe/'
						,params: {
							 email: data.email
							,id: Bas.subsButtonLastClicked.getEl().parent('', true).getAttribute('name_id')
						}
						,success: function(response){
							try{
								var ret = response.responseText;
								if(ret == 'already_signed'){
									Ys.lightMsg.msg('Уже подписаны', 'Вы уже подписаны на этот товар');
									/*Ext.Msg.show({
										 title: 'Подписаны'
										,msg: 'Уже подписаны'
										,buttons: Ext.Msg.OK
										,icon: Ext.MessageBox.INFO
									});*/
								} else if(ret == 'signed'){
									Ys.lightMsg.msg('Отлично', 'Вы подписались на уведомление о появлении');
								} else {
									Ext.Msg.alert('Fail', 'Сервер ответил фигню: '+ret);
								}
							}
							catch(e){
								Ext.Msg.alert('Fail', 'Неизвестный ответ сервера.<br />'+ret);
							}
							finally{
								if(ret == 'signed' || ret == 'already_signed'){
									Bas.subsWindow.hide();
									Bas.subsButtonLastClicked.getEl().ghost('b', {
										 easing: 'easeOut'
										,duration: .5
										,remove: false
										,useDisplay: false
									});
								}
							}
							Bas.subsWindow.getEl().unmask();
						}
						,failure: function(response){
							Ext.Msg.alert('Fail', 'Ошибка соединения с сервером.<br />Проверьте соединение с интернетом.<br />'+ret);
							Bas.subsWindow.getEl().unmask();
						}
					});
				}
			}
		}
		,{
			 text: 'Закрыть'
			,handler: function(){
				if(Bas.subsForm.getForm().isValid()){
					// запомним введенные данные в куку
					var data = Ext.encode(Bas.subsForm.getForm().getValues());
					Conf.cookie.set('subs-form-data', data);
				} else {
					Conf.cookie.set('subs-form-data');
				}
				Bas.subsWindow.hide((Ext.isIE == true?'':Bas.subsButtonLastClicked.getEl()));
			}
		}
	]
	,listeners: {
		show: {
			fn: function(){
				var data = Conf.cookie.get('subs-form-data');
				if(Ext.isEmpty(data)){
					Bas.subsWindow.getEl().mask('', 'x-mask-loading');
					
					Ext.Ajax.request({
						 url: '/basket/ugo/'
						,params: {
							 type: 'getuser'
						}
						,success: function(response){
							try{
								var ret = Ext.decode(response.responseText);
								var r = ret.data;
								if(ret.err != "0"){
									Ext.Msg.alert('Fail', 'Сервер вернул ошибку: '+ret.msg[0]);
									Bas.subsWindow.getEl().unmask();
								}
							}
							catch(e){
								Ext.Msg.alert('Fail', 'Неизвестный ответ сервера.<br />'+response.responseText);
								Bas.subsWindow.getEl().unmask();
							}
							finally{
								if(!Ext.isEmpty(r)){
									Bas.subsForm.getForm().setValues(r);
								}
								Bas.subsWindow.getEl().unmask();
							}
						}
						,failure: function(response){
							Ext.Msg.alert('Fail', 'Ошибка соединения с сервером.<br />Проверьте соединение с интернетом.<br />'+response.responseText);
							Bas.subsWindow.getEl().unmask();
						}
					});
				}
			}
		}
	}
});



Ext.onReady(function(){
	if(!Ext.isEmpty(Ext.fly('basket-detailed')))
		Bas.basGrid.render('basket-detailed');
	
	if(!Ext.isEmpty(User.basketButton)){
		User.basketButton.enable();
		//Bas.basPanel.show(Bas.basPanel.getEl());
	}

	
	


});
