var WoodLoadFlag = false;
var PilLoadFlag = false;

var woodData = [
   	[91, 25, 'Тилья', 'без', 'любой', 3.2], [92, 24, 'Эзац', 'с 1', 'любой', 4.4], [93, 23, 'Эдра', 'со 2', 'ученика и лучше', 5.6],
   	[94, 22, 'Бакката', 'с 3', 'подмастерья и лучше', 6.7], [95, 21, 'Лекс', 'с 4', 'подмастерья и лучше', 7.8], [96, 19, 'Сентис', 'с 5', 'мастера и лучше', 8.8],
	[97, 17, 'Корбус', 'с 6', 'наставника и лучше', 9.8], [98, 15, 'Купер', 'с 7', 'наставника и лучше', 10.7], [99, 12, 'Церус', 'с 8', 'грандмастера', 11.6]
];

var pilData =[
	[[4.8, 12, 1.5], [5.6, 8, 2], [5.7, 7, 2.5], [5.8, 5, 3], [6.6, 5, 3], [6.4, 4, 3.5], [7.3, 4, 3.5], [7, 3, 4], [7.6, 2, 4]],
	[[6.5, 4, 1.5], [8.5, 4, 1.5], [10, 3, 1.5], [], [], [15, 2, 1.5], [17, 2, 1.5], [], [19.5, 1, 1.5]],
	[[6, 12, 2], [7.9, 12, 2], [9.1, 11, 2], [7.2, 7, 3], [8, 7,3], [8.8, 6, 3], [7.3, 4, 4], [7.9, 3, 4], [8.5, 3, 4]],
	[[5, 4, 3], [6.4, 4, 3], [12, 5, 2], [14.5, 5, 2], [], [], [], [], []]
];

function woodmanCalculation(){	var prof = woodmanProf.getValue();
	if (prof == '') prof = 0;
	var topprof = woodmanTopProf.getValue();
	if (topprof == '') topprof = 0;
	if (woodmanHck.getValue()) topprof = topprof + 25 + prof * 0.25;
	var sumprof = prof + topprof;
	var halfprof = sumprof * 0.5;
	var Ver = [0, 0, 0];
	var html = '<table id="calcres""><tr><th rowspan=2 width=70>Ресурс</th><th rowspan=2>Цена,<br>сер</th><th rowspan=2 width=80>Время подхода</th><th colspan=3>Вероятность выполнения</th><th colspan=3>Средние</th></tr>';
	html += '<tr><td class="head">20%</td><td class="head">30%</td><td class="head">40%</td><td class="head">Время сруба</td><td class="head">Доход на ед.<br>прочки, сер</td><td class="head">Доход в<br>минуту, сер</td></tr>';
	for (i = 0; i < 9; i++){		if (WoodLoadFlag && !woodmanGos.getValue()) price = woodManPriceStore.getAt(i).get('price');
		else price = woodData[i][5];
		html += '<tr><td class="head">' + woodData[i][2] + '</td><td>' + price + '</td>';
		if (topprof >= i * 25){
			var Time = 180 + 9 * i - Math.round((sumprof - 30) / 3);
			if (Time < 120) Time = 120;
			delta = 25 * (i + 4);
			Ver[2] = (halfprof / delta);
			if (Ver[2] > 1) Ver[2] = 1;
			if (sumprof < delta){
				Ver[0] = (1 - sumprof / delta);
				Ver[1] = 1 - Ver[0] - Ver[2];
			}
			else Ver[1] = 1 - Ver[2];
			MeanT = Math.floor(Time * 5 * Ver[0] + Time * 4 * Ver[1] + Time * 3 * Ver[2]);
			PrDoh = price / (5 * Ver[0] + 4 * Ver[1] + 3 * Ver[2]);
			TimeDoh = price * 60 / MeanT;
            html += '<td>' + Math.floor(Time / 60) + ' мин. ' + (Time % 60) +
            	' сек.</td><td>' + (Ver[0] * 100).toFixed(1) + '</td><td>' +
            	(Ver[1] * 100).toFixed(1) + '</td><td>' + (Ver[2] * 100).toFixed(1) +
            	'</td><td>' +  Math.floor(MeanT / 60) +	' мин. ' + (MeanT % 60) +
            	' сек.</td><td>' + PrDoh.toFixed(2) + '</td><td>' +	TimeDoh.toFixed(2) + '</td></tr>';
		} else html += '<td colspan=7><font color=#aa0000>Доступно c топором +' + i * 25 + ' и лучше</font></td></tr>';
	}
	if (!WoodLoadFlag) html += '</table><table id="calcres" style="margin-top: 2px;"><tr><td>Рассчет среднего дохода с учетом текущих рыночных цен невозможен из-за ошибки при загрузке данных!</td></tr></table>';
	woodmanWin.body.update(html);
};

var woodmanProf = new Ext.form.NumberField({
	id: 'woodmanprof',
	width: 30,
	allowDecimals: false,
	allowNegative: false,
	enableKeyEvents: true,
	listeners: {
		keyup: function(){
			if (this.getValue() > 255) this.setValue(255);
			woodmanCalculation();
		}
	}
});

var woodmanTopProf = new Ext.form.NumberField({
	id: 'woodmantopprof',
	width: 30,
	allowDecimals: false,
	allowNegative: false,
	enableKeyEvents: true,
	listeners: {
		keyup: function(){
			if (this.getValue() > 255) this.setValue(255);
			woodmanCalculation();
		}
	}
});

var woodmanHck = new Ext.form.Checkbox({
	id: 'woodmanholy',
	listeners: {
		check: woodmanCalculation
	}
});

var woodmanGos = new Ext.form.Checkbox({
	id: 'woodmangos',
	listeners: {
		check: woodmanCalculation
	}
});

var woodmanPriceStore = new Ext.data.JsonStore({
	url: '/superservice/jproducts.php',
	root: 'woods',
	fields: [
		{name: 'name', type: 'string'},
		{name: 'count', type: 'int'},
    	{name: 'price', type: 'float'}
    ],
    listeners: {
    	load: function(){    		WoodLoadFlag = true;    		woodmanCalculation();
    	},
    	loadexception: woodmanCalculation
    }
});

var woodmanWin = new Ext.Window({
	title: 'Калькулятор лесоруба',
	layout: 'fit',
	width: 680,
	height: 298,
	closeAction: 'hide',
	plain: true,
	resizable: false,
	tbar: [
		'<b>Умелка своя</b>', '&nbsp;', woodmanProf, '-',
		'<b>На топоре</b>', '&nbsp;', woodmanTopProf, '-',
		'<b>Праздник</b>', '&nbsp;', woodmanHck, '-',
		'<b>Сдаю по госу</b>', '&nbsp;', woodmanGos, '-', '->',
		{
			text: 'Обновить цены',
			handler: function(){
					woodmanWin.body.getUpdater().indicatorText = '<div class="loading-indicator">Загрузка рыночных цен...</div>';
		           	woodmanWin.body.getUpdater().showLoading();
					woodmanPriceStore.reload();
			}
		}

	],
    listeners: {
		show: function(){
			this.body.getUpdater().indicatorText = '<div class="loading-indicator">Загрузка рыночных цен...</div>';
           	this.body.getUpdater().showLoading();
			woodmanPriceStore.reload();
		}
    },
	bodyStyle: 'padding: 4px;',
	html: ''
});

function carpCalculation(){	var profbon = 0;	var Ver = [0, 0, 0];
	var modName = ['Поленья', 'Топорища', 'Доски', 'Ручки', 'Планки'];
	var html = '<table id="calcres""><tr><th rowspan=2 width=70>Ресурс</th><th rowspan=2 width=90>Целевой<br>ресурс</th><th rowspan=2>Цена,<br>сер</th><th rowspan=2 width=80>Время подхода</th><th colspan=3>Вероятность выполнения<br>(для досок, ручек, планок)</th><th colspan=4>Средние</th></tr>';
	html += '<tr><td class="head">20% (15%)</td><td class="head">30% (25%)</td><td class="head">40% (35%)</td><td class="head">Время распила</td><td class="head">Количество<br>c распила</td><td class="head">Доход на ед.<br>прочки, сер</td><td class="head">Доход в<br>минуту, сер</td></tr>';
	var prof = carpProf.getValue();
	if (prof == '') prof = 0;
	var pilprof = carpPilProf.getValue();
	if (pilprof == '') pilprof = 0;
	var sumprof = prof;
	if (carpHck.getValue()){		profbon = 25 + Math.round(prof * 0.25);		sumprof = 25 + Math.round(sumprof * 1.25);
	}
	sumprof = sumprof + pilprof;
	var halfprof = Math.floor(sumprof / 2);
	for (i = 0; i < 9; i++){		spanner = 0;
		firstFlag = true;
		for (j = 0; j < 4; j++){
			if (pilData[j][i][0] != undefined) spanner++;
		}
		html += '<tr><td class="head" rowspan=' + spanner + '>' + woodData[i][2] + '</td>'
		for (j = 0; j < 4; j++){			if (pilData[j][i][0] != undefined){				if (PilLoadFlag && !carpGos.getValue()) price = carpPriceStore.getAt(j * 9 + i).get('price');
				else price = pilData[j][i][0];
				if (!firstFlag) html +='<tr>';
				if ((i > 1) && (j == 3)) modif = 4;
				else modif = j;
				html += '<td>' + modName[modif] + '</td><td>' + price + '</td>';
				if (prof >= i * 25){					if (j < 2){						Time = 180 + 12 * i - Math.round((sumprof - 25) / (2 + Math.ceil((i + 1) / 3)));
						if (Time < 150) Time = 150;					}else{
						Time = 160 + 15 * i - Math.round((profbon + pilprof - 25) / 2);
						if (Time < 120) Time = 120;
					}
					delta = 130 + 30 * i;
					Ver[2] = (halfprof / delta);
					if (Ver[2] > 1) Ver[2] = 1;
					if (sumprof < delta){
						Ver[0] = (1 - sumprof / delta);
						Ver[1] = 1 - Ver[0] - Ver[2];
					}
					else Ver[1] = 1 - Ver[2];
					if (j == 0){
						MeanU = pilData[j][i][2];						if (sumprof - 50 > i * 40) MeanU += 0.5;
						MinU = Math.floor(MeanU);
						MaxU = Math.ceil(MeanU);
						if (MinU != MaxU) MeanUText = 'от ' + Math.floor(MeanU) + ' до ' + Math.ceil(MeanU);
						else MeanUText = MaxU;
						MeanT = Math.floor(Time * 5 * Ver[0] + Time * 4 * Ver[1] + Time * 3 * Ver[2]);
						PrDoh = price * MeanU / (5 * Ver[0] + 4 * Ver[1] + 3 * Ver[2]);
					}
					if (j == 1){						MeanU = pilData[j][i][2];
						if (sumprof - 90 > i * 40) MeanU += 0.25;
						MinU = Math.floor(MeanU);
						MaxU = Math.ceil(MeanU);
						if (MinU != MaxU) MeanUText = 'от ' + Math.floor(MeanU) + ' до ' + Math.ceil(MeanU);
						else MeanUText = MaxU;
						MeanT = Math.floor(Time * 5 * Ver[0] + Time * 4 * Ver[1] + Time * 3 * Ver[2]);
						PrDoh = price * MeanU / (5 * Ver[0] + 4 * Ver[1] + 3 * Ver[2]);
					}
					if (j > 1){						Min = Math.min(pilData[j][i][2], Math.max(1, Math.floor((sumprof - 25 * (i + 1) + 15) / 30 )));
						Max = Math.min(pilData[j][i][2], Math.max(1, Math.ceil((sumprof - 25 * (i + 1) + 15) / 30 )));
						if (Min != Max) MeanUText = 'от ' + Min + ' до ' + Max;
						else MeanUText = Max;
						MeanU = (Max + Min) / 2;
						MeanT = Math.floor(Time * 7 * Ver[0] + Time * 4 * Ver[1] + Time * 3 * Ver[2]);
						PrDoh = price * MeanU / (7 * Ver[0] + 4 * Ver[1] + 3 * Ver[2]);
					}
					TimeDoh = price * MeanU * 60 / MeanT;
		            html += '<td>' + Math.floor(Time / 60) + ' мин. ' + (Time % 60) + ' сек.</td><td>' +
		            	(Ver[0] * 100).toFixed(1) + '</td><td>' + (Ver[1] * 100).toFixed(1) + '</td><td>' +
		            	(Ver[2] * 100).toFixed(1) +	'</td><td>' +  Math.floor(MeanT / 60) + ' мин. ' +
		            	(MeanT % 60) + ' сек.</td><td>' + MeanUText +'</td><td>' + PrDoh.toFixed(2) +
		            	'</td><td>' + TimeDoh.toFixed(2) + '</td></tr>';
				} else {					if (firstFlag) html += '<td colspan=8 rowspan=' + spanner + '><font color=#aa0000>Доступно ' +	woodData[i][3] + ' ступени плотника</font></td></tr>';				}
				firstFlag = false;
			}
		}
	}
	if (!PilLoadFlag) html += '</table><table id="calcres" style="margin-top: 2px;"><tr><td>Рассчет среднего дохода с учетом текущих рыночных цен невозможен из-за ошибки при загрузке данных!</td></tr></table>';
	carpWin.body.update(html);
};

var carpProf = new Ext.form.NumberField({
	id: 'carpprof',
	width: 30,
	allowDecimals: false,
	allowNegative: false,
	enableKeyEvents: true,
	listeners: {
		keyup: function(){
			if (this.getValue() > 255) this.setValue(255);
			carpCalculation();
		}
	}
});

var carpPilProf = new Ext.form.NumberField({
	id: 'carppilprof',
	width: 30,
	allowDecimals: false,
	allowNegative: false,
	enableKeyEvents: true,
	listeners: {
		keyup: function(){
			if (this.getValue() > 255) this.setValue(255);
			carpCalculation();
		}
	}
});

var carpHck = new Ext.form.Checkbox({
	id: 'carpholy',
	listeners: {
		check: carpCalculation
	}
});

var carpGos = new Ext.form.Checkbox({
	id: 'carpgos',
	listeners: {
		check: carpCalculation
	}
});

var carpPriceStore = new Ext.data.JsonStore({
	url: '/superservice/jproducts.php',
	root: 'pils',
	fields: [
		{name: 'name', type: 'string'},
		{name: 'count', type: 'int'},
    	{name: 'gprice', type: 'float'},
    	{name: 'price', type: 'float'}
    ],
    listeners: {
    	load: function(){
    		PilLoadFlag = true;
    		carpCalculation();
    	},
    	loadexception: carpCalculation
    }
});

var carpWin = new Ext.Window({
	title: 'Калькулятор плотника',
	layout: 'fit',
	width: 840,
	height: 420,
	closeAction: 'hide',
	plain: true,
	resizable: false,
	autoScroll: true,
	tbar: [
		'<b>Умелка своя</b>', '&nbsp;', carpProf, '-',
		'<b>на пиле</b>', '&nbsp;', carpPilProf, '-',
		'<b>Праздник</b>', '&nbsp;', carpHck, '-',
		'<b>Сдаю по госу</b>', '&nbsp;', carpGos, '-', '->',
		{
			text: 'Обновить цены',
			handler: function(){
					carpWin.body.getUpdater().indicatorText = '<div class="loading-indicator">Загрузка рыночных цен...</div>';
		           	carpWin.body.getUpdater().showLoading();
					carpPriceStore.reload();
			}
		}

	],
    listeners: {
		show: function(){
			this.body.getUpdater().indicatorText = '<div class="loading-indicator">Загрузка рыночных цен...</div>';
           	this.body.getUpdater().showLoading();
			carpPriceStore.reload();
		}
    },
	bodyStyle: 'padding: 2px;',
	html: ''
});

var WoodStore = new Ext.data.SimpleStore({
	fields: [
		{name: 'wid', type: 'int'},
		{name: 'weight', type: 'int'},
		{name: 'wname', type: 'string'},
	    {name: 'acclev', type: 'string'},
	    {name: 'acctool', type: 'string'}
	],
    data: woodData
});

function MapAddWood(wid){	var resmap, count, x, y, num;
	if (wid < 96) resmap = listmap;
	else resmap = oppmap;
	count = WoodDetailStore.getCount;
	for (i = 0; i < count; i++){		rec = WoodDetailStore.getAt(i);
		if (rec.get('wid') == wid){			x = rec.get('x');
			y = rec.get('y');
			num = rec.get('count');
			resmap += '<img style="Z-index: 4; position: absolute; left: ' + x*128 +'px; top: ' + y*64- + 'px;" src="http://localhost/superservice/images/korbus.png">';		}	}
//	resmap += '<img style="Z-index: 4; position: absolute; left: 100px; top: 340px;" src="http://localhost/superservice/images/tilja.png">';
//	resmap += '<img style="Z-index: 4; position: absolute; left: 228px; top: 340px;" src="http://localhost/superservice/images/ezac.png">';
//	resmap += '<img style="Z-index: 4; position: absolute; left: 356px; top: 340px;" src="http://localhost/superservice/images/edra.png">';
//	resmap += '<img style="Z-index: 4; position: absolute; left: 484px; top: 340px;" src="http://localhost/superservice/images/bakkata.png">';
//	resmap += '<img style="Z-index: 4; position: absolute; left: 612px; top: 340px;" src="http://localhost/superservice/images/leks.png">';
//	resmap += '<img style="Z-index: 4; position: absolute; left: 740px; top: 340px;" src="http://localhost/superservice/images/sentis.png">';
//	resmap += '<img style="Z-index: 4; position: absolute; left: 868px; top: 340px;" src="http://localhost/superservice/images/korbus.png">';
//	resmap += '<img style="Z-index: 4; position: absolute; left: 996px; top: 340px;" src="http://localhost/superservice/images/kuper.png">';
	return resmap;};

var WoodSelector = new Ext.form.ComboBox({
	name: 'woodselect',
	width: 80,
	tpl: '<tpl for="."><div ext:qtip="<b>Вес:</b> {weight}<br><b>Доступ:</b> {acclev} ступени<br><b>Топор:</b> {acctool}" class="x-combo-list-item">{wname}</div></tpl>',
	store: WoodStore,
	displayField: 'wname',
	typeAhead: true,
	forceSelection: true,
	mode: 'local',
	triggerAction: 'all',
	selectOnFocus: true,
	emptyText: 'Выбрать...',
	listeners: {		select: function(selector, record, index){			MapPanel = Ext.getCmp('woodmap').body;			if (index < 5) MapPanel.applyStyles('padding: 5px; background: url(http://www.freedom.erclans.ru/map/images/bground2.gif)');
			else MapPanel.applyStyles('padding: 5px; background: url(http://www.freedom.erclans.ru/map/images/bground1.gif)');			MapPanel.update(MapAddWood(index + 91));
		}	}
});

var WoodTBar = ['<b>Показать ресурс:</b>', '&nbsp;', WoodSelector, '&nbsp;', {
	id: 'woodrefreshbtn',
	text: 'Обновить',
	handler: function(){		WoodInfoStore.reload();
		WoodDetailStore.reload();
	}
}, '->', '<b>Калькуляторы:</b>', '&nbsp;', {
	id: 'woodcalcbtn',
	text: 'Лесоруба',
	handler: function(){
		woodmanWin.show();
		}
},{
	id: 'carpcalcbtn',
	text: 'Плотника',
	handler: function(){
		carpWin.show();
		}
}];

var WoodDetailStore = new Ext.data.JsonStore({
	url: '/superservice/jwoodinfo.php?detail',
	root: 'wooddata',
	fields: [
		{name: 'wid', type: 'int'},
		{name: 'x', type: 'int'},
		{name: 'y', type: 'int'},
		{name: 'count', type: 'int'}
    ]
});

var WoodInfoStore = new Ext.data.JsonStore({
	url: '/superservice/jwoodinfo.php',
	root: 'wooddata',
	sortInfo: {field: 'count', direction: 'DESC'},
	fields: [
		{name: 'wid', type: 'int'},
		{name: 'count', type: 'int'}
    ]
});

function GetWoodName(val){	return woodData[val - 91][2];}

var WoodInfoGrid = new Ext.grid.GridPanel({
	store: WoodInfoStore,
	viewConfig: {forceFit: true},
	loadMask: {
		msg: 'Запрос к EReality.ru... Ожидайте.',
		store: WoodInfoStore
	},
	columns: [
		{header: '<span style="color: blue;"><b>Ресурс</b></span>', align: 'center', css: 'font-weight: bold;', sortable: false, menuDisabled: true, renderer: GetWoodName, dataIndex: 'wid'},
		{header: '<span style="color: blue;"><b>Количество</b></span>', align: 'center', sortable: true, menuDisabled: true, dataIndex: 'count'}
	],
    listeners: {
    	render: function(){
    		WoodInfoStore.reload();
    		WoodDetailStore.reload();
    	}
    }
});

var WoodInfoTabs = new Ext.TabPanel({	activeTab: 0,
	border: false,
	defaults: {autoScroll: true},
    items: [
    	{
    		id: 'infoTop',
    		title: 'Деревья',
    		layout: 'fit',
   			tabTip: 'Сводная информация<br>по наличию деревьев',
   			bodyStyle: 'background-color: #dfe8f6; padding: 2px;',
   			items: WoodInfoGrid
    	},{    		id: 'infoPil',
    		title: 'Пиломатериалы',
    		layout: 'fit',
   			tabTip: 'Сводная информация<br>по наличию пиломатериалов',
   			bodyStyle: 'background-color: #dfe8f6; padding: 5px;',
   			html: 'Времменно недоступно по причине отсутствия API-данных'
    	}]
});

var WoodPanel = [{		id : 'woodinfo',
		title: 'Сводные',
		region: 'east',
		layout: 'fit',
		width: 300,
		collapsible: true,
		autoScroll: true,
		margins: '2 2 2 0',
		cmargins: '2 2 2 0',
		items: WoodInfoTabs
	},{		id: 'woodmap',
		region: 'center',
		layout: 'fit',
		autoScroll: true,
		margins: '2 2 2 2',
		bodyStyle: 'background-color: #dfe8f6; padding: 5px',
		html: 'Карты размещения ресурсов в доработке!&nbsp;<img style="vertical-align: middle;" src="http://img.ereality.ru/smile/p/104.gif">&nbsp;В тест-режиме работают калькуляторы и сводная по деревьям.'
	}
];