////////////////////////////////////////////////////////////
// Калькулятор сборщика ПК // sgm_nn@mail.ru // 2002-2005 //
////////////////////////////////////////////////////////////
// используемые файлы:
// standart_functions.js
// table_functions.js
///////////////////////

var TITLE = 'Калькулятор сборщика ПК'

// нумерация строк таблицы:
// - в массивах rows[] 0,1,...
// - в программе - с 1,2,...

//----------------------------------
//Исходный файл прайса (структура):
//==================================
//
//КОМПЬЮТЕРНАЯ КОМИССИОНКА
//		
//ПРАЙС-1 на 27 декабря 2003 г.
//		
//...
//курс		30
//Наименование	у.е.	руб.
//CD-привод			
//Asus			
//52x  CD-S520	23,00	690
//BENQ			
//52x, black OEM	18,33	550
//52x, OEM	17,00	510
//Cyber			
//52x,  CD526D,  retail	17,00	510 1	8 // 1 - наличие/заказ; 8 - N поз. в default конф-ии
//...
//CDRW-привод			
//AOpen			
//52x32x52	38,67	1160
//...
//---------------------------------

var DIR0 = ''
var DIR1 = '_js_lib/'
var DIR2 = 'pc_calc/'

if (location.href.search(DIR2) != -1) {
	//если текущий каталог - не корневой

	DIR0 = '../'
	DIR1 = DIR0 + DIR1
	DIR2 = ''
}

document.write('' +
'<script language="JavaScript" src="' + DIR1 +'table_functions.js"></script>' +
'<script language="JavaScript" src="' + DIR1 + 'standart_functions.js"></script>' +
'<body onload="onload1();" onkeypress="bodyEvent(event);">' +
'<div name="form1" id="form1">' +
	'<font color="red">Ждите... Идет загрузка...</font>' +
	'<iframe name="1txt" id="1txt" src="' + DIR0 + '1.txt" width=0 height=0></iframe>' +
	'<iframe name="pc" id="pc" src="' + DIR2 + 'pc.txt" width=0 height=0></iframe>' +
	'<iframe name="iH" id="iH" src="' + DIR2 + 'invoiceHead.txt" width=0 height=0></iframe>' +
	'<iframe name="iF" id="iF" src="' + DIR2 + 'invoiceFoot.txt" width=0 height=0></iframe>' +
'</div>' +
'<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>' +
'')


var icon1 = '<img src="' + DIR2 + 'calc4.gif" width="15" height="15" align="left" hspace="0">'

var thead_node //заголовок таблицы
var tbody_node //тело таблицы
var tfoot_node //подвал таблицы
var current_node //текущая строка (обычно с формой)

var N_col = 0
var name_col = 1
var pcs_col = 2
var qty_col = 3
var price_col = 4
var sum_col = 5

var currentData = new Array(0)
var blankData = new Array(0)
var totalQty = 0
var totalSum = 0

var RoublesIn$ = 1 // = 30

var demo = false
var ue = false

var groups = new Array(0)
groups[0] = ''

var groups_begin = new Array(0) //in names & prices
groups_begin[0] = 0

var groups_end = new Array(0) //in names & prices
groups_end[0] = 0

var names = new Array(0)
names[0] = ''

var invoice_N
var invoice_date

var width1 = 740 //755 //ширина основной таблицы
var width2c = width1 - 283 //ширина ширина поля select configs
var width2 = width1 - 220 //ширина поля select name и колонки Наименование
var width3 = 36  // ширина колонки qty

var pattern = ''
var pattern_total = 0

var sort1 = 'А-я'
var sort_begin = 0 //смещение массива names при сортировке

var names_all_html = '' //"все товары" в отд. перем. для ускор. работы
var names_all_html_sort = '' //то же, но отсортированные по цене

var colorNormal = '#ffffff' //таблица - белая
var colorEdit = 'threedface' //'#ffffee' // '#ffff00' //ред.строка - выделена цветом
var colorEditInput = '#ffffff' //'threedface' //'#cceecc'

var colorGreenButton = '#66bb99'
var colorRedButton = '#eeaa00'

var colorABCsort = '#009900'
var color123sort = '#bb6633'

var optConfig0 =
'CPU /MB[+...] /RAM /HDD [/Video /... /Modem] /FDD /DVD [+KB +M +SP +...]'

var PC_ARRAY

var skidka = 3 //3%
var skidka0 = "Всего товаров на cумму:<br>Cкидка &nbsp; -3%:<br>"

var s1 = ''

var ALL_ITEMS = 'фильтр-1 : ВСЕ ТОВАРЫ'

//=== standart_functions.js
var OPERA
var WEBTV
var IE
var MOZILLA


//-----------------------------------------------------------------------------------------
function onload1() {
	var str1 = window.frames['1txt'].document.body.innerText
	if (!str1) {
		//mozilla firefox
		str1 = document.getElementById("1txt").contentDocument.body.innerHTML
		str1 = str1.replace(/\<\/?pre\>/g, '')
	}

	str1 = str1.replace(/&quot;/g, '"') //opera
	str1 = str1.replace(/&amp;/g, '&') //opera
	str1 = str1.replace(/\'/g, '\'\'') //на случай ошибки в прайсе (' вместо ")
	str1 = str1.replace(/\"\"/g, '\'\'')
	str1 = str1.replace(/\'\'\'\'/g, '\'\'')
	str1 = str1.replace(/\"/g, '')
	str1 = str1.replace(/ - /g, ', ') // исп. в select.names: ... - ... руб. - ... у.е.
	str1 = str1.replace(/</g, '&lt;')
	str1 = str1.replace(/>/g, '&qt;')
	str1 = str1.replace(/\r/g, '') // Windows'ового ВК в Unix'е нет
//document.,write(str1)
    //лишние пробелы мешают
	str1 = str1.replace(/   /g, ' ')
	str1 = str1.replace(/  /g, ' ')

	var strings = str1.split(/\r?\n/g)

	var buttons1 = window.frames['pc'].document.body.innerText
	if (!buttons1) {
		//mozilla firefox
		buttons1 = document.getElementById("pc").contentDocument.body.innerHTML
		buttons1 = buttons1.replace(/\<\/?pre\>/g, '')
	}
	//надпись на кнопке = фильтр-1 (группа товара) = фильтр-2 = цвет кнопки

	buttons1 = buttons1.replace(/\/\/.*\r?\n/g, '') //удалить строки комментарий
	buttons1 = buttons1.replace(/\r?\n?=\r?\n?/g, '=') //удалить лишние переводы строк
	buttons1 = buttons1.replace(/"/g, '\'\'')
	buttons1 = buttons1 + '\n' // для последней кнопки

	PC_ARRAY = buttons1.split(/\r?\n *(\r?\n)+/g)

    buttons1 =
'Демо=Demo>=Автоматическая сборка\nсистемного блока ПК=' + colorGreenButton + '=#ffffff=menu1(\'demo\')\n' + //=====
'\n' +

'||\n' +
'\n' +

    buttons1 +

'||\n' +
'\n' +

'Сброс=&nbsp;С=Очистка всей таблицы\n(без восстановления)=' + colorRedButton + '=#ffffff=menu1(\'new\')' //=====

	buttons1 = buttons1.split(/\r?\n *(\r?\n)+/g)

	str1 =
	create_title(TITLE, width1, icon1) + //=====

	create_menu(
//надпись_верхнего_главного_меню=выполняемая_функция\n
//\tнадпись_выпадающего_подменю_1_уровня=выполняемая_функция\n
//\t\tнадпись_выпадающего_подменю_2_уровня=выполняемая_функция\n
//...
// [\'] на ["] не заменять!
'&Файл=\n' +
'	&Новый				Ctrl+Shift+N=menu1(\'new\')\n' +
'	&Открыть...			Ctrl+Shift+O=menu1(\'open\')\n' +
'	! &Сохранить		Ctrl+Shift+S=menu1(\'save\')\n' +
'	Сохранить &как...	=menu1(\'save_as\')\n' +
'	-\n' +
'	&Печать Счета...	Ctrl+Shift+P=menu1(\'invoice\')\n' +
'	О&тправить Счет на E-mail...=menu1(\'submit\')\n' +
'	-\n' +
'	&Закрыть			=menu1(\'exit\')\n' +
'&Правка=\n' +
'	&Удалить строку		Ctrl+Shift+E=menu1(\'delete\')\n' +
'	&Вставить строку	Ctrl+Shift+I=menu1(\'insert\')\n' +
'	-\n' +
'	&Найти / Фильтр...	Ctrl+Shift+F=menu1(\'find\')\n' +
'	-\n' +
'	v Сортировка по &алфавиту	Ctrl+Shift+A=menu1(\'sort\')\n' +
'&Вид=\n' +
'	v &Панель кнопок	=menu1(\'buttonsBar\')\n' +
'	v &Конфигурационная строка=menu1(\'configsBar\')\n' +
'	v &Строка состояния	=menu1(\'statusBar\')\n' +
'	-\n' +
'	Обно&вить			F5=menu1(\'refresh\')\n' +
'	-\n' +
'	v Ски&дка			Ctrl+Shift+D=menu1(\'skidka\')\n' +
'	v Цены в &рублях	Ctrl+Shift+R=menu1(\'roubles\')\n' +
'С&ервис=\n' +
'	Д&емо				=menu1(\'demo\')\n' +
'	&Логика				Ctrl+Shift+K=menu1(\'logic\')\n' +
'	-\n' +
'	&Курс у.е. в рублях...		=menu1(\'ue\')\n' +
'	-\n' +
'	! &Настройки...		=menu1(\'settings\')\n' +
'&Справка=\n' +
'	Отправить отз&ывы и предложения на E-mail...=menu1(\'mail\')\n' +
'	-\n' +
//mozilla '	О &программе		=menu1(\'about\')\n' +
'	О &программе		=menu1(\'about\')' +
	'') + //=====

	create_buttons(width1, buttons1) + //=====

	create_configsBar(width1) + //=====

'<div id="tableHolder"' +
' style="' +
' width:' + width1 + ';' +
' border:2px inset;' +
'"' +
'>' +
'</div>' +

	create_statusbar(
	new Array(width1, 29, 38, 60, 61),
	new Array(icon1 + '&nbsp; Включен', '', '0', '', '0.00'),
	new Array('status', 'status_prc', 'status_qty', 'status_ue', 'status_sum')
	) + //=====

''

    str1 =
'<form id="myFORM" enctype="text/plain" action="mailto:9158@mail.ru?Subject=FOMENCO.RU...Счет..."' +
'>' +

	 create_window(str1) + //=====

'</form>'

	str1 +=
'<span id="invoiceHead"' +
' style="' +
' position:absolute;' +
' height:0px;' +
' width:' + width1 + 'px;' +
' visibility:hidden;' +
'"' +
'>'

	//локально и через сервер фрейм работает по разному
	s1 = window.frames['iH'].document.body.innerText
	if (IE) {
		s1 = ((s1.search(/^</) == -1) ?
		window.frames['iH'].document.body.innerHTML :
		window.frames['iH'].document.body.innerText)
	}
	else {
		s1 = document.getElementById("iH").contentDocument.body.innerHTML
		s1 = s1.replace(/\<\/?pre\>/g, '')
		s1 = s1.replace(/&lt;/g, '<').replace(/&gt;/g, '>')
		s1 = s1.replace(/&quot;/g, '"') //opera
		s1 = s1.replace(/&amp;/g, '&') //opera
	}

	str1 += s1 +
'</span>' +

'<span id="invoiceFoot"' +
' style="' +
' position:absolute;' +
' height:0px;' +
' width:' + width1 + 'px;' +
' visibility:hidden;' +
'"' +
'>'

	//локально и через сервер фрейм работает по разному
	s1 = window.frames['iF'].document.body.innerText
	if (IE) {
		s1 = ((s1.search(/^</) == -1) ?
		window.frames['iF'].document.body.innerHTML :
		window.frames['iF'].document.body.innerText)
	}
	else {
		//mozilla firefox
		s1 = document.getElementById("iF").contentDocument.body.innerHTML
		s1 = s1.replace(/\<\/?pre\>/g, '')
		s1 = s1.replace(/&lt;/g, '<').replace(/&gt;/g, '>')
		s1 = s1.replace(/&quot;/g, '"') //opera
		s1 = s1.replace(/&amp;/g, '&') //opera
	}

	str1 += s1 +
'</span>'

	document.getElementById('form1').innerHTML = str1

	brand = ''

	var group_num = 0
	var name_num = 0
	
	var start = 0
	columns2 = new Array(0)

	// 4я кол. - наличие (заказ для поставщ.)
	var default_conf = new Array() //5я кол. - номер в конф. по уиолч.

	for (var string_num = 1; string_num < strings.length; string_num++) {
		columns = strings[string_num].split(/\t/g)	

		if (!start) {
			if (columns[0] == 'курс') {
				RoublesIn$ = parseFloat(columns[1])
				if (!RoublesIn$) { //Mozilla
					RoublesIn$ = parseFloat(columns[2])
				}
				document.getElementById('kurs').innerHTML = RoublesIn$
			}
			if (columns[0] == 'Наименование') { start = 1 }
		}
//		else {
		else if (strings[string_num + 1]) { //Mozilla
			if (!columns[1]) {
				columns2 = strings[string_num + 1].split(/\t/g)

				if (!columns2[1]) {
					group_num++
					groups[group_num] = columns[0]

					if (name_num) {	groups_end[group_num - 1] = name_num + 1 }
					groups_begin[group_num] = name_num + 1
				}
				else {
					brand = columns[0]
				}
			}
			else {
				name_num++
				columns[1] = parseInt(columns[1].replace(/,/g, ".") * 100) / 100
	
				//цену вперед - для возможности сортировки внутри группы
				var p = pad_with_zeros(columns[1], 2) //=====
				p = '      ' + p
				p = p.substring(p.length - 9)
				names[name_num] = p + '<a> </a>' +
					groups[group_num] + '<a> </a>' + brand + '<a> </a>' +
						columns[0].replace(groups[group_num] + ' ', '').replace(brand + ' ', '')

				if (columns[5] > 0) {
					default_conf[columns[5]] =
						 groups[group_num] + '<a> </a>' + names[name_num]
				}
			}
		}
	}
	groups_end[group_num] = name_num + 1

	group_num++

	groups_begin[group_num] = 1
	groups_end[group_num] = name_num + 1
	groups[group_num] = ALL_ITEMS

	//массив names = неотсортированный + отсортированный по ценам
	var names2 = new Array(0)
	for (i = 0; i <  groups.length - 1; i++) {
		names2 = names.slice(groups_begin[i], groups_end[i])
		names2.sort()
		for (j = 0; j < names2.length; j++) {
			names[names.length] = names2[j]
		}
	}

	config() //=====

	var head_data = new Array(
		'&nbsp;N&nbsp;',
		'&nbsp;Наименование&nbsp;',
		'&nbsp;Ед.&nbsp;<br>изм.',
		'&nbsp;Кол-&nbsp;<br>во',
		'&nbsp;&nbsp;&nbsp;&nbsp;Цена,&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;руб.&nbsp;&nbsp;&nbsp;&nbsp;',
		'&nbsp;&nbsp;&nbsp;&nbsp;Сумма,&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;руб.&nbsp;&nbsp;')
    var head_align = new Array("center", "center", "center", "center", "center", "center")

    var body_data = new Array("&nbsp;", "&nbsp;", "&nbsp;", "&nbsp;", "&nbsp;", "&nbsp;")
    var body_align = new Array("right", "", "center", "right", "right", "right")

	var foot_data = new Array((skidka ? skidka0 : '') + 'ИТОГО:', '&nbsp;', '&nbsp;')
    var foot_align = new Array("right", "right", "right")
	var foot_colspan = new Array(2 ,2, 2)

	var table_node = create_table(1, 6,
		head_data, head_align,
		body_data, body_align,
		foot_data, foot_align, foot_colspan) //=======

	table_node.bgColor = colorNormal
	table_node.width = width1
//	table_node.border = 1
	table_node.cellPadding = 2
	table_node.cellSpacing = 0

	table_node.style.fontFamily = 'Arial'
	table_node.style.fontSize = 12 //11

    thead_node = document.getElementById("tableHead")
    tbody_node = document.getElementById("tableBody")
    tfoot_node = document.getElementById("tableFoot")

	thead_node.rows[0].cells[N_col].style.width = 1
	thead_node.rows[0].cells[name_col].style.width = width2
	thead_node.rows[0].cells[pcs_col].style.width = 1
	thead_node.rows[0].cells[qty_col].style.width = width3
	thead_node.rows[0].cells[price_col].style.width = 1
	thead_node.rows[0].cells[sum_col].style.width = 1


	for (i = 0; i < tbody_node.childNodes.length; i++) {
		tbody_node.childNodes[i].onclick = function() { moveEditRow(this) } //=====
	}

	current_node = tbody_node.rows[0]
	renumTableRows() //=====
	modeEditRow('edit') //=====
/*
	if (default_conf.length) {
		var str1 = ''
		for (i = 1; i < default_conf.length; i++) {
			str1 += '||' + default_conf[i].replace(/&nbsp;/g, '<a> </a>') + '||1'
		}
		str1 = '0:=' + str1
		conf_load(str1) //=====
		config('add', '(default)') //=====
	}
*/
	makeActive(document.getElementById('popup1')) //=====
	activeMenu = null
}

//-----------------------------------------------------------------------------------------
function bodyEvent(k) {
//	var k = event.keyCode
	if (IE || OPERA) {
		k = k.keyCode
	}
	else {
		k = k.which
		if (!k) k = 27 //mozilla
	}
//alert(k)

	switch (k) {
	case 27: //Esc
		if (activeMenu) {
			var el = activeMenu
			hideMenu() //=====
			if (menuOver) {
				//если мышь на верхнем меню
				menuOver = null
				setMenu(el, 'over') //=====
			}
		}

	case 14: //Ctrl+Shift+N
		menu1('new') //=====
		break
	case 15: //Ctrl+Shift+O
		menu1('open') //=====
		break
	case 19: //Ctrl+Shift+S
		menu1('save') //=====
		break
	case 16: //Ctrl+Shift+P
		menu1('invoice') //=====
		break

	case 5: //Ctrl+Shift+E
		menu1('delete') //=====
		break
	case 9: //Ctrl+Shift+I
		menu1('insert') //=====
		break
	case 6: //Ctrl+Shift+F
		menu1('find') //=====
		break
	case 1: //Ctrl+Shift+A
		menu1('sort') //=====
		break

	case 11: //Ctrl+Shift+K
		menu1('logic') //=====
		break

	case 18: //Ctrl+Shift+R
		menu1('roubles') //=====
		break
	case 4: //Ctrl+Shift+D
		menu1('skidka') //=====
		break
	}
}


//-----------------------------------------------------------------------------------------
function menu1(mode) {
	var this1 = document.getElementById('_' + mode)

	switch (mode) {

	//------------------------
	// Файл
	//------------------------
	case 'new':
		document.getElementById('configs').selectedIndex = 0
		config('sel') //=====
		break

	//------------------------
	case 'open':
		document.getElementById('configs').style.visibility = ''
		document.getElementById('configs').focus()
		break

	//------------------------
	case 'save':
		config('add') //=====
		break

	//------------------------
	case 'save_as':
		config('add') //=====
		break

	//------------------------
	case 'invoice':
		if (!(totalSum > 0)) {
			alert(
'Невозможно отображение Счета!\n'+
'Заполните строки таблицы или\n' +
'исправьте имеющиеся ошибки.')
			return
		}

		var d = new Date()
		invoice_N = customDateString(d, 'yymmdd') //=====
		invoice_date = customDateString(d) //=====

		document.getElementById('invoice_N').innerHTML = invoice_N
		document.getElementById('invoice_date').innerHTML = invoice_date
		document.getElementById('sum_str').innerHTML =
			sum_str(parseFloat(totalSum), 0, ue) //======

//		if (NN) {
//			netscape.security.PrivilegeManager.disablePrivelege('UniversalBrowserWrite')
//		}

		var win2 = window.open(
			'', '',
			'toolbar=0, scrollbars=1' +
			', resizable=1, height=300, width=630' +
			', top=0, left=0' +
			', screenX=0, screenY=0' //mozilla
		)

		win2.document.write(
'<html>\n' +
'<head>\n' +
'<meta http-equiv="Content-type" content="text/html;' +
'  charset=windows-1251\">\n' +
'<title>FOMENCO.RU - Счет N ' + invoice_N + '/   от ' + invoice_date + '</title>\n' +
'</head>\n' +
'<body>\n' +
'')

		win2.document.write(document.getElementById('invoiceHead').innerHTML)

		win2.document.write(
'<div' +
' style="' +
' width:' + (width1 + 4) + 'px;' +
' border:1px solid;' +
'"' +
'>\n' +
'')

		modeEditRow('normal') //======
		win2.document.write(tableHolder.innerHTML)
		modeEditRow('edit') //======

	win2.document.write(
'</div>\n' +
'')

		win2.document.write(document.getElementById('invoiceFoot').innerHTML)

		win2.document.write(
'\n' +
'</body>\n' +
'</html>\n' +
'')

//		win2.print()
		break

	//------------------------
	case 'submit':
		if (!(totalSum > 0)) {
			alert(
'Невозможна отправка Счета!\n'+
'Заполните строки таблицы или\n' +
'исправьте имеющиеся ошибки.')
			return
		}

		modeEditRow('normal') //======

//		var tel = win2.input(
//'Укажите свой контактный телефон\n' +
//'(для иногородних - с кодом города):')

		document.getElementById('myFORM').submit()

		modeEditRow('edit') //======
		break

	//------------------------
	case 'exit':
		document.getElementById('popup1').style.visibility = 'hidden'
		break

	//------------------------
	// Правка
	//------------------------
	case 'delete':
		editRow('delete') //=====
		break
	case 'insert':
		editRow('insert') //=====
		break
	case 'find':
		editRow('pattern') //=====
		break
	case 'sort':
		editRow('sort') //=====
		if (sort1 != 'А-я') {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/v/, '.')
		}
		else {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/<b>.*<\/b>/i, '<b>v</b>')
		}
		break

	//------------------------
	// Вид
	//------------------------
	case 'buttonsBar':
		if (document.getElementById('mode').style.visibility != 'hidden') {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/v/, '.')
			document.getElementById('mode').style.visibility = 'hidden'
			document.getElementById('mode').style.position = 'absolute'
		}
		else {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/<b>.*<\/b>/i, '<b>v</b>')
			document.getElementById('mode').style.visibility = ''
			document.getElementById('mode').style.position = ''
		}
		break
	case 'configsBar':
		if (document.getElementById('mode').style.visibility != 'hidden') {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/v/, '.')
			document.getElementById('mode').style.visibility = 'hidden'
			document.getElementById('mode').style.position = 'absolute'
		}
		else {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/<b>.*<\/b>/i, '<b>v</b>')
			document.getElementById('mode').style.visibility = ''
			document.getElementById('mode').style.position = ''
		}
		break
	case 'statusBar':
		if (document.getElementById('mode').style.visibility != 'hidden') {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/v/, '.')
			document.getElementById('mode').style.visibility = 'hidden'
			document.getElementById('mode').style.position = 'absolute'
		}
		else {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/<b>.*<\/b>/i, '<b>v</b>')
			document.getElementById('mode').style.visibility = ''
			document.getElementById('mode').style.position = ''
		}
		break

	//------------------------
	case 'refresh':
//??
		break

	//------------------------
	// Сервис
	//------------------------
	case 'demo':
		var alert1 = demoClick() //=====

		if (alert1) {
			alert1 =
'Калькулятор сборщика ПК >>> Демо-сборка ПК *\n' +
'----------------------------------------------------------------------------------------------' +
				alert1 + '\n' +
'----------------------------------------------------------------------------------------------' +
				'\n' +
'* демо (упрощенная логика, сообщения для сведения)'
			alert(alert1)
		}
		break

	//------------------------
	case 'logic':
		var alert1 = 0
		var result_array = logic_result() //=====

//alert(result_array[1])

		if (!result_array[alert1]) {
			result_array[alert1] =
'\n                            --- Замечаний нет ---'
		}
		result_array[alert1] =
'Калькулятор сборщика ПК >>> Логика *\n' +
'----------------------------------------------------------------------------------------------' +
			result_array[alert1] + '\n' +
'----------------------------------------------------------------------------------------------' +
			'\n' +
'* демо (упрощенная логика, сообщения для сведения)'

		alert(result_array[alert1])
		break

	//------------------------
	case 'ue':
		var k = prompt(
'Введите текущий курс у.е. в виде  123  или  123,4  (или  123.45):', RoublesIn$)
		if (k) {
			RoublesIn$ = parseFloat(k.replace(/,/g, '.'))
			document.getElementById('kurs').innerHTML = RoublesIn$

			if (totalSum) {
				calc('курс') //===
			}
		}
		break

	//------------------------
	case 'skidka':
		if (skidka) {
			skidka = 0
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/v/, '.')
		}
		else {
			skidka = 3 //3%
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/<b>.*<\/b>/i, '<b>v</b>')
		}

		tfoot_node.rows[0].cells[0].innerHTML = (skidka ? skidka0 : '') + 'ИТОГО:'
		if (parseInt(tfoot_node.rows[0].cells[1].innerHTML)) {
			calc() //=====
		}
		break

	//------------------------
	case 'roubles':
		document.getElementById('ue').checked = ue

		ue = !ue

		if (ue) {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/v/, '.')
		}
		else {
			this1.cells[0].innerHTML = this1.cells[0].innerHTML.replace(/<b>.*<\/b>/i, '<b>v</b>')
		}

		if (ue) {
			thead_node.rows[0].cells[price_col].innerHTML =
		 		thead_node.rows[0].cells[price_col].innerHTML.replace(/руб./g, 'у.е.')
			thead_node.rows[0].cells[sum_col].innerHTML =
		 		thead_node.rows[0].cells[sum_col].innerHTML.replace(/руб./g, 'у.е.')
		}
		else {
			thead_node.rows[0].cells[price_col].innerHTML =
		 		thead_node.rows[0].cells[price_col].innerHTML.replace(/у.е./g, 'руб.')
			thead_node.rows[0].cells[sum_col].innerHTML =
		 		thead_node.rows[0].cells[sum_col].innerHTML.replace(/у.е./g, 'руб.')
		}

		if (totalSum) {
			calc('у.е.') //=====
		}
		break

	//------------------------
	// Справка
	//------------------------
	case 'mail':
		//???
		document.getElementById('myFORM').submit()
		//???
		break

	//------------------------
	case 'about':
		var d = new Date()
		d = d.getYear()
		d = d + (d > 2000 ? 0 : 1900)
		alert('' +
'Калькулятор сборщика ПК >>> Справка\n' +
'--------------------------------------------------------------------------\n' +
'\'Калькулятор сборщика ПК\' позволяет\n' +
'легко и быстро рассчитать стоимость\n' +
'любой конфигурации компьютера.\n' +
'\n' +
'При работе формируется типовой \'Счет\'\n' +
'для оплаты  - в виде обычной странички,\n' +
'которую можно распечатать на принтере.\n' +
'\n' +
'\'Калькулятор\' был создан для облегчения\n' +
'сборки и расчета стоимости компьютеров \n' +
'в \'Компьютерной комиссионке\' (Н.Новгород).\n' +
'\n' +
'Последнее тестирование в броузерах:\n' +
'IE 5.0, Mozilla 1.7.2, Firefox 0.9.3, Opera 7.23.\n' +
'\n' +
'          (c) 1996-' + d + ' sgm_nn@mail.ru' +
'')
		break

	}
}    	

//-----------------------------------------------------------------------------------------
function create_configsBar(width1) {
	var str1 =
'<span' +
' style="' +
' font-family:arial; font-size:11px;' +
' vertical-align:super;' +
'"' +
'>' +

	'Конфигурация '

	if (IE) {
		str1 +=
		selectImitation("configs", width2c, 2, '', optConfig0) //=====
	}

	str1 +=
	'<select name="configs" id="configs"' +
	' style="' +
	' width:' + width2c + 'px;' +
	' font-face:arial; font-size:11px;'

	if (IE) {
		str1 +=
		' visibility:hidden;'
	}

	str1 +=
	' "' +
	' onChange="config(\'sel\')"'

	if (IE) {
		str1 +=
		' onBlur="this.style.visibility=\'hidden\'"' //см. selectImitation()
	}

	str1 +=
	'>' +
//		'	    <option>---' +
		'<option>' + optConfig0 +
	'</select>' +

	'&nbsp; &nbsp;[<a href="javascript:config(\'help\')" void title="помощь по конфигурации">?</a>]' +
	'&nbsp; &nbsp;[<a href="javascript:config(\'add\')" void title="сохранить данную конфигурацию">+</a>]' +
	'&nbsp; &nbsp;[<a href="javascript:config(\'del\')" void title="удалить выбранную конфигурацию">x</a>]' +
	'&nbsp; &nbsp; ' +

	split_vert(16, 'groove') + //=====
	split_vert(16, 'outset') + //=====

	'&nbsp;&nbsp;1 у.е. = <a href ="javascript:menu1(\'ue\')" id="kurs" name="kurs">' +
		RoublesIn$ + '</a> руб.' +
	'<input id="ue" name="ue" type="checkbox"' +
	(!ue ? ' checked' : '') +
	' void title="расчеты проводить в рублях" onClick="menu1(\'roubles\');"' +
	' style="' +
	' position:absolute;' +
	'"' +
	'>' +
'</span>'

	var bottom_border1 = '2'

	str1 = create_bar(str1, 19, 'configsBar', bottom_border1) //=====

	return str1
}

//-----------------------------------------------------------------------------------------
function config(mode, name0) {
//alert(document.cookie)

	var e = document.getElementById('configs')

	//------------------------
	if (mode == 'help') {
		alert('' +
'Калькулятор сборщика ПК >>> Конфигурация *\n' +
'-------------------------------------------------------------------------------\n' +
'[выбор пустой строки] - очистка таблицы\n' +
'"(default)" - конфигурация по умолчанию\n' +
'[+] - сохранить новую конфигурацию\n' +
'       (или вновь сделанные изменения)\n' +
'[x] - удалить выбранную конфигурацию\n' +
'-------------------------------------------------------------------------------\n' +
'* конфигурации сохраняются в "Cookie"')
	}

	//------------------------
	else if (!mode || mode == 'sel') {
		if (!mode) {
			e.options.length = 0
//			e.options[0] = new Option('---', '')
			e.options[0] = new Option('- ' + optConfig0 + ' - [price] -' , '')
			e.selectedIndex = 0

//			document.getElementById('configs0').value ='- ' + optConfig0 + ' - [price] -'

			var c = document.cookie
		    if (c) {
				c = c.split('; ')
				for (var i = 0; i < c.length; i++) {
					var s = c[i].split('=')
					s[0] = unescape(s[0])
					s[1] = unescape(s[1])
					p = s[1].split(':=')

					e.options[i + 1] = new Option(p[0], s[0] + ':=' + p[1])
					if (name0 == s[0]) { e.options[i + 1].selected = 'true' }
				}	
			}
		}
		else if (e.selectedIndex) {
			conf_load(e.options[e.selectedIndex].value) //=====
			if (IE) {
				document.getElementById('configs0').value = e.options[e.selectedIndex].value
			}
		}
		else if (!parseFloat(totalSum) || confirm(
'Очистить таблицу?')) {
			clearTableRows() //=====
    	}
	}

	else {
		var name = ''
		if (e.options[e.selectedIndex]) { //opera
			var name = e.options[e.selectedIndex].text
		}


	//------------------------
		if (mode == 'add') {
			if (name0 == '(default)') {
				name = name0
			}
			else {
				if (!(totalSum > 0)) {
					alert(
'Сохранение данной конфигурации невозможно.\n' +
'(Заполните таблицу или исправьте все ошибки.)')
					return
				}

				// название - по первой cтроке
				if (!e.selectedIndex) { //новая конфигурация
					modeEditRow('normal') //=====
					if (parseInt(tbody_node.rows[0].cells[qty_col].innerHTML)) {
						name = tbody_node.rows[0].cells[name_col].innerHTML
					    var n = name.split(/<a> <\/a>/gi) // группа, производитель, описание
//						name = n[1] + '<a> </a>' + n[2]
						name = n[2]
					}
					modeEditRow('edit') //=====
				}
				else {
					name = e.options[e.selectedIndex].text
				}

				//запрос названия
//				var name2 = prompt(
//'Введите название конфигурации:', name.replace(/&nbsp;/g, ' '))

				var result_array = logic_result() //=====

				var name2 = prompt(
'Введите название конфигурации по стандартной схеме:\n' +
'CPU /MB[+...] /RAM /HDD [/VGA /SB /...] /FDD /CD [+KB +M +S +TFT +...]'
, result_array[1])

				if (name2) {
					name = name2.replace(/ /g, '&nbsp;')
				}
				else {
					return
				}
				name = name.replace(/&nbsp;/g, ' ')
			}

			modeEditRow('normal') //=====
			var str1 = ''
			for (i = 1; i <= tbody_node.rows.length; i++) {
				var name1 = tbody_node.rows[i - 1].cells[name_col].innerHTML
				if (name1 != '&nbsp;') {
					var qty1 = parseInt(tbody_node.rows[i - 1].cells[qty_col].innerHTML)
					str1 += '||' + name1
					str1 += '||' + qty1
				}
			}
			str1 = str1.replace(/&nbsp;/g, '<a> </a>')
			str1 = name + ':=' + str1
			var d = new Date()
			d.setTime(d.getTime() + (365 * 24 * 60 * 60 * 1000))

			// name        // введенное название
			var name2 = '' // название Cookie
			var name3 = '' // текущее название
			for (var i = 1; i < e.options.length; i++) {
				if (e.options[i].text == name) {
					e.selectedIndex = i
					name2 = e.options[i].value
					name2 = name2.split(':=')
					name2 = name2[0]
					name3 = e.options[i].text
					break
				}						
			}

			modeEditRow('edit') //=====

			if (name2 && name3 == name) {
				// если есть такое название (случайное совпадение?)

				if (name0 != '(default)' && !confirm(
'Конфигурация с таким именем уже есть.\n' + 
'Удалить старую (!) и сохранить новую?')) {
					return
				}

				name = name2
				
			}
			else {
				// замена имени Cookie (и конфигурации)

				if (name != '(default)' && !confirm(
'Сохранить Конфигурацию\n\n' + name + ' ?')) {
					return
				}

//				name = e.options[e.selectedIndex].value
//				name = name.split(/:=/g)
//				name = name[0]
//
//				deleteCookie(name) //=====
//
//				name = new Date() // название Cookie =  миллисекунд с 01/01/1970
//				name = name.getTime()
			}

			setCookie(name, str1, d) //=====

            document.getElementById('myFORM').reset()
			config(e.selectedIndex, name) //=====
 		}

	//------------------------
		else if (mode == 'del' && e.selectedIndex) {
			if (confirm(
'Удалить конфигурацию?\n\n' + e.options[e.selectedIndex].text)) {

				name = e.options[e.selectedIndex].value
				name = name.split(/:=/g)
				name = name[0]

				deleteCookie(name) //=====

				e.options[e.selectedIndex] = null
				config() //===
				clearTableRows() //=====
				renumTableRows() //=====				
			}
		}
	}

	if (IE) {
		document.getElementById('configs0').value = document.getElementById('configs').options[document.getElementById('configs').selectedIndex].text
	}
}

//-----------------------------------------------------------------------------------------
function conf_load(str1) {
	clearTableRows() //=====

	var group_num = 0
	var name_num = 0

	str1 = str1.split(/:=/g) // CookieName:=CookieValue
	str1 = str1[1]

	str1 = str1.replace(/  /g, '&nbsp;')
	str1 = str1.replace(/^\|\|/, '') //Mozilla
	str1 = str1.replace(/<a> ?<\/a>/gi, '<a> </a>') //не IE
	var v = str1.split(/\|\|/g) //наименование1||кол-во1||наименование2||кол-во2||...
	var v2 = new Array(0)
	var conf_rows = v.length / 2

	if (document.getElementById('groups')) {
		modeEditRow('normal') //=====
	}

	var n = ''
	var q = 0
	var p = 0

	var alert1 = ''
	for (var n = 0; n < conf_rows; n++) {
		if (!tbody_node.childNodes[n]) {
			var blank_node = clone_row(tbody_node, n) //=====
			blank_node.onclick = function() { moveEditRow( this) } //=====
		}
 
		//N
//		tbody_node.childNodes[n].cells[N_col].innerHTML = n + 1
//	    tbody_node.rows[n].id = n + 1
	
		//Наименование
		tbody_node.childNodes[n].cells[name_col].innerHTML =
			v[n * 2] //группа, производитель, описание

		v2 = v[n * 2].split(/<a> <\/a>/gi)

		group_num = 0
		name_num = 0
		for (var i = 0; i < groups.length; i++) {
			if (groups[i] == v2[0]) {
				group_num = i
				break
			}
		}
	
		if (group_num) {
			for (i = groups_begin[group_num]; i < groups_end[group_num]; i++) {
				var v2 = names[i].split(/<a> <\/a>/gi)
//alert(v2[1] + '<a> </a>' + v2[2] + ' ' + v2[3] +'\n'+ v[n * 2])
				if (v2[1] + '<a> </a>' + v2[2] + ' ' + v2[3] == v[n * 2]) {
					name_num = i	
					break
				}
			}
    	}
		if (name_num) {
			tbody_node.childNodes[n].style.color = ""
		}
		else {
			tbody_node.childNodes[n].style.color = "red"
			alert1 =
'Красным указаны отсутствующие\n' +
'в  новом  прайсе  комплектующие !\n' +
'1. Замените их на имеющиеся аналоги.\n' +
'2. Сохраните изменения в конфигурации.'
		}

		//Ед. изм.
		tbody_node.childNodes[n].cells[pcs_col].innerHTML = 'шт.'

		//Кол-во
		q = v[n * 2 + 1]
		tbody_node.childNodes[n].cells[qty_col].innerHTML = q

		//Цена
		v2 = names[name_num].split(/<a> <\/a>/g)
		if (v2[0]) {
			p = v2[0].trim() //======
			p = pad_with_zeros(p, 2) //=====
			var r = Math.round(p * RoublesIn$ / 10) * 10
			r = pad_with_zeros(r, 2) //=====

			if (!ue) {
				tbody_node.childNodes[n].cells[price_col].title = p + ' у.е.'
				p = r
			}
			else {
				tbody_node.childNodes[n].cells[price_col].title = r + ' руб.'
			}
			tbody_node.childNodes[n].cells[price_col].innerHTML = p

			//Сумма
			p = p * q
			p = pad_with_zeros(p, 2) //=====
			tbody_node.childNodes[n].cells[sum_col].innerHTML = p
		}
		else {
			tbody_node.childNodes[n].cells[price_col].innerHTML = '?'
			tbody_node.childNodes[n].cells[sum_col].innerHTML = '?'
		}
	}

	addTableRow() //=====
	current_node = tbody_node.childNodes[tbody_node.childNodes.length - 1]

	renumTableRows() //=====

	calc() //===

	modeEditRow('edit') //=====

	document.getElementById('status').innerHTML = icon1 + '&nbsp; ' +
		document.getElementById('configs').options[document.getElementById('configs').selectedIndex].text

	if (alert1) { alert(alert1) }
}

//-----------------------------------------------------------------------------------------
function editRow(mode, data1) {

	if (!mode) {
		var group_num = 0
		var name_num = 0
		var name1 = new Array(0) //
		var name = ''
//alert(data1)
    	if (data1) {
			name1 = data1[name_col].replace(/<a> ?<\/a>/gi, '<a> </a>') //opera
			name1 = name1.split(/<a> <\/a>/g) // группа, производитель, описание
//alert(name1)
			name = data1[name_col]
		}
		else {
			data1 = new Array(0, '', 'шт.', 0, '0.00', '0.00')
		}

		var str0 = 'фильтр-1 : (группа товара)'
		var str1 = ''
		var str2 = str0
		var str3 = ''

		for (var i = 1; i < groups.length; i++) {
			str1 +=
		'<option value=' + i

			str3 = groups[i] +
				'&nbsp; (' + (groups_end[i] - groups_begin[i]) + ') '

//alert(groups[i]+'\n'+ name1[0])
//if (groups[i] && name1[0]) alert(groups[i]+'\n'+name1[0])
			if (groups[i] == name1[0]) {
				str1 += ' selected'
				group_num = i
				str2 = str3
			}
			str1 +=
		'>' +
			str3 +
		'</option>'
		}

		data1[name_col] = ''

		if (IE) {
			data1[name_col] +=
			selectImitation("groups", 210, 0, colorEditInput, str2) //=====
		}

		data1[name_col] +=
'<font style="font-size:11">' +
	'<select name="groups" id="groups"' +
	' style="' +
	' width:210px;' +
	' background-color:' + colorEditInput + ';' +
	' font-size:11px;'

		if (IE) {
			data1[name_col] +=
	' visibility:hidden;'
		}

		data1[name_col] +=
	'"' +
	' onChange="group_onChange();"'

		if (IE) {
			data1[name_col] +=
	' onBlur="this.style.visibility=\'hidden\'"' //см. selectImitation()
		}

		data1[name_col] +=
	'>' +
		'<option value=0>' +
			str0 +
		'</option>' +
		str1 +
	'</select>' +

	' &nbsp; ' +
	'<a href="javascript:editRow(\'pattern\')"' +
	' void title="выбор товаров по ключевому слову' +
		(name[1] ? '\n(может удалить выбранный товар !)' : '') + '">фильтр-2 / поиск' +
	'</a>' +
	' :' +
	'<b id="pattern" style="color:' + color123sort + '">' + pattern + '</b>' +
	' &nbsp; (<a id="pattern_total">' + pattern_total + '<a/>)' +

	' &nbsp; ' +
	'<a href="javascript:menu1(\'sort\')"' +
	' void title="сортировка товаров: [А-я] - по названию, [0-9] - по цене">' +
		'сорт.: ' +
		'<b id="sort" style="color:' + (sort1 == 'А-я' ? colorABCsort : color123sort) + '">' +
			sort1 +
		'</b>' +
	'</a>' +

	' &nbsp; [' +
	'<a href="javascript:editRow(\'help\')" void title="помощь">' +
		'?' +
	'</a>' +
	']' +

	' &nbsp; [' +
	'<a href="javascript:editRow(\'insert\')"' +
	' void title="вставить пустую строку перед этой строкой">' +
		'+' +
	'</a>' +
	']' +

	' &nbsp; [' +
	'<a href="javascript:editRow(\'delete\')"' +
	' void title="удалить текущую строку">' +
		'x' +
	'</a>' +
	']' +
'</font>' +
'<br>' +
''

		data1[name_col] +=
'<span id="names1" name="names1">' +
		names_create(group_num, name) + //=====
'</span>'

		if (!data1[pcs_col]) { data1[pcs_col] = 'шт.' }

		data1[qty_col] = 
'<input id="qty" name="qty" onChange="qty_onChange()"' +
' value=' +
		data1[qty_col] +
' style="' +
' text-align:right;' +
' width:' + (width3 - 2) + ';' +
' background-color:' + colorEditInput + ';' + //colorEdit
' font-size:11px;' +
'"' +
'>'

		if (!data1[price_col]) { data1[price_col] = '0.00' }
		if (!data1[sum_col]) { data1[sum_col] = '0.00' }

		return data1
	}

	else if (mode == 'help') {
		alert('' +
'Калькулятор сборщика ПК >>> Редактирование\n' +
'-------------------------------------------------------------------------------\n' +
'Переход  : клик левой кнопкой на строке\n' +
'Очистка  : выбор пустой "Группы товара"\n' +
'[фильтр] - выбор товаров по критерию *\n' +
'[сорт.]     - сортировка по названию/цене\n' +
'[+]            - вставить пустую строку\n' +
'[x]            - удалить текущую строку\n' +
'-------------------------------------------------------------------------------\n' +
'* фильтр "все товары" - работает медленнее')
	}
	else if (mode == 'insert') {
		table_row = parseInt(current_node.id)
		modeEditRow('normal') //=====
		var clone_node = clone_row(tbody_node, table_row) //=====
		clone_node.onclick = function() { moveEditRow(this) } //=====
		clear_table(tbody_node, table_row) //=====
		current_node = tbody_node.childNodes[table_row - 1]
		renumTableRows() //=====
		modeEditRow('edit')
	}
	else if (mode == 'delete') {
		if (tbody_node.rows.length > 2) {
			current_row = parseInt(current_node.id)
			if (!parseFloat(current_node.cells[sum_col].innerHTML) ||
					confirm('Удалить выбранную строку N ' + current_row + ' ?')) {

				remove_row(tbody_node, current_row) //=====
				if (current_row >= tbody_node.rows.length - 1) { current_row -= 1 }		
				if (!current_row) { current_row = 1 }		
				current_node = tbody_node.rows[current_row - 1]
				renumTableRows() //=====
				calc() //=====
				modeEditRow('edit') //=====
			}
		}
		else {
			alert(
'Последнюю строку удалить нельзя!')
		}
	}
	else if (mode == 'pattern') {
		var p = prompt(
'Введите ключевое слово фильтра (до 10 символов):', pattern)
		if (p != null) {
			if (p.length > 10) {
				p = p.substring(0, 15) //+ '...'
			}
			document.getElementById('pattern').innerHTML = p
			pattern = p
			if (!document.getElementById('groups').selectedIndex ||
				document.getElementById('groups').selectedIndex != document.getElementById('groups').length - 1 &&
				confirm('Искать товар во всех группах?')
			) {
				document.getElementById('groups').selectedIndex = document.getElementById('groups').length - 1
			}
			group_onChange() //=====
			if (document.getElementById('names').length > 1) {
				document.getElementById('names').selectedIndex = 1
				name_onChange() //=====
			}
		}
	}
	else if (mode == 'sort') {
		if  (sort1 == 'А-я') {
			sort1 = '0-9'
			sort_begin = (names.length - 1) / 2
			document.getElementById('sort').style.color = color123sort
		}
		else {
			sort1 = 'А-я'
			sort_begin = 0
			document.getElementById('sort').style.color = colorABCsort
		}

		document.getElementById('sort').innerHTML = sort1
		if (document.getElementById('groups').selectedIndex) {
			group_onChange() //=====
		}
	}
	else {
		alert(
'ERROR')
	}

	return
}

//-----------------------------------------------------------------------------------------
function modeEditRow(mode) {
	if (mode == 'normal') {
		var data1 = new Array('&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;', '&nbsp;')

		var group_num = parseInt(document.getElementById('groups').value)

		data1[name_col] = '&nbsp;'
		if (document.getElementById('names').selectedIndex) {
			var p = new Array(0)
			p = document.getElementById('names').options[document.getElementById('names').selectedIndex].text.split(/ - /g)
    		p = groups[group_num] + '<a> </a>' + p[0]
    		data1[name_col] = p
		}
//alert(data1)
		if (data1[name_col] != '&nbsp;') {  // пусто, если нет названия
			data1[N_col] = current_node.id
			data1[pcs_col] = current_node.cells[pcs_col].innerHTML
			data1[qty_col] = parseInt(document.getElementById('qty').value)
			data1[price_col] = current_node.cells[price_col].innerHTML
			data1[sum_col] = current_node.cells[sum_col].innerHTML

			if (!data1[sum_col]) { current_node.style.color = 'red' }
		}
		current_node.bgColor = colorNormal
		current_node.onclick = function() { moveEditRow(this) } //======

		var td_node
		for (i = 0; i < current_node.cells.length; i++) { 
			td_node = current_node.cells[i]

			td_node.style.background = colorNormal
			td_node.style.borderStyle = ''
			td_node.style.borderWidth = ''

			if (current_node.id == 1) {
				td_node.style.borderTopWidth = '1px'
				td_node.style.borderTopStyle = 'solid'
			}
			td_node.style.borderLeftStyle = 'solid'
			td_node.style.borderBottomStyle = 'solid'
			td_node.style.borderLeftWidth = '1px'
			td_node.style.borderBottomWidth = '1px'
			td_node.style.borderColor = '#cccccc'
		}
//alert(data1)
		edit_row(tbody_node, current_node.id, data1) //=====
	}

    else { //edit_row
		current_node.style.color = ''

		var data1 = new Array(current_node.id, '&nbsp;', 'шт.', 0, 0, 0)

		s1 = current_node.cells[name_col].innerHTML
		s1= s1.replace(/&amp;/g, '&')
		data1[name_col] = s1
//alert(data1)
		if (data1[name_col] != '&nbsp;') {  // пусто, если нет названия
//			data1[N_col] = current_node.id
			data1[pcs_col] = current_node.cells[pcs_col].innerHTML
			data1[qty_col] = parseInt(0 + current_node.cells[qty_col].innerHTML) //0!
			data1[price_col] = current_node.cells[price_col].innerHTML
			data1[sum_col] = current_node.cells[sum_col].innerHTML
		}

		if (!currentData[qty_col]) { current_node.color = '' }
		current_node.onclick = function() { }

		var td_node
		for (i = 1; i < current_node.cells.length; i++) { 
			td_node = current_node.cells[i]

			td_node.style.borderColor = ''
			td_node.style.borderLeftStyle = 'solid'
			td_node.style.borderRightStyle = ''
			td_node.style.borderWidth = '1px'

			if (i == 1) {
				td_node.style.borderLeftWidth = '2px'
				td_node.style.borderLeftStyle = 'outset'
				td_node.style.borderLeftStyle = 'outset'
				td_node.style.borderLeftColor = 'buttonhighlight'
			}
			else if (i == current_node.cells.length - 1) {
				td_node.style.borderRightWidth = '0px'
			}

			td_node.style.borderStyle = 'outset'
			td_node.style.borderTopWidth = '1'
			td_node.style.borderBottomWidth = '2'
			td_node.style.background = colorEdit
		}
//alert(data1)
		data1 = editRow(0, data1) //=====
		edit_row(tbody_node, current_node.id, data1) //=====
	}
}

//-----------------------------------------------------------------------------------------
function moveEditRow(new_node) {
	pattern = '' //сброс фильтра

	modeEditRow('normal') //=====
	current_node = new_node
	renumTableRows() //=====
	modeEditRow('edit') //=====
}

//-----------------------------------------------------------------------------------------
function names_create(group_num, name1) {
	if (!name1) {
		name1 = ''
	}
	else {
//		name1 = name1.replace(/<a> ?<\/a>/gi, '<a> </a>') //? - для opera
		name1 = name1.replace(/<a> ?<\/a>/gi, ' ') //? - для opera
//		r1 = new RegExp(ALL_ITEMS + '<a> ?<\/a>', 'i')
		r1 = new RegExp(ALL_ITEMS + ' ')
		name1 = name1.replace(r1, '')
	}
//alert(name1)
/*
	if (group_num == groups.length - 1 && !pattern &&
			(sort1 == 'А-я' && names_all_html || sort1 != 'А-я' && names_all_html_sort)) {
		var r = (sort1 == 'А-я' ? names_all_html : names_all_html_sort)

		if (name1) {
			var n = name1.split(/<a> <\/a>/gi) // цена, группа, производитель, описание
//			n = n[1] + '<a> </a>' + n[2] + '<a> </a>' + n[3]
			n = n[1]
			var r1 = n.replace(/\+/g, '\\+')		
			r1 = r1.replace(/(\(|\))/g, '\\$1')		
			r1 = new RegExp('<option[^>]*>' + r1)

			r = r.replace(/ selected/, '')		
			r = r.replace(r1, '<option selected>' + n)

			if (IE) {
				name_onChange() //=====				
			}
		}
		return (r)
	}
*/
//	if (name1) { name1 = name1.replace(/  /g, ' ') }

	var reg_exp = new RegExp(pattern, "ig") // образец поиска

	var v2 = new Array(0)
	var n = ''
	var n2 = ''
	var p = 0
	var r = 0

	if (group_num == groups.length - 1) {
		window.status = 'Ждите... Идет обработка данных   '
	}

	var str0 = '(описание товара)'
	var str1 = ''
	var str2 = str0
	var str3 = ''
	var str4 = ''

	pattern_total = 0
	for (name_num = groups_begin[group_num] + sort_begin; name_num < groups_end[group_num] + sort_begin; name_num++) {
		v2 = names[name_num].split(/<a> <\/a>/gi) // цена, группа, производитель, описание
		n = v2[2] + '<a> </a>' + v2[3]

		if (!pattern || n.search(reg_exp) != -1) {
			if (pattern) { pattern_total++ }

//?			n2 = v2[1] + '<a> </a>' + v2[2] + '<a> </a>' + v2[3]
			n2 = v2[1] + ' ' + v2[2] + ' ' + v2[3]
			p = v2[0].trim() //=====
			r = Math.round(p * RoublesIn$ / 10) * 10
			r = pad_with_zeros(r, 2) //=====

			// если фильтр1 == все товары, то название = группа+описание товара
			str3 = (group_num == groups.length - 1 ? (v2[1] + ' ') : '') +
				(v2[2] + ' ' + v2[3]) +	' - ' + p + ' у.е. - ' + r + ' руб.'

			r1 = new RegExp(ALL_ITEMS + ' ')
			str3 = str3.replace(r1, '')

//alert(str3)
//if (name1) alert(name1+'\n'+n2)
			if (name1 && name1 == n2) {
				str2 = str3
			}

			str1 +=
	'<option' + (name1 && name1 == n2 ? ' selected' : '') + ' value="' + name_num + '">' +
	str3 +
	'</option>'

			if (group_num == groups.length - 1) {
				window.status += '|'
			}
		}
	}

	var s1 = ''

	if (IE) {
		s1 +=
		selectImitation("names", (width2 - 2), 0, colorEditInput, str2) //=====
	}

	s1 +=
'<select name="names" id="names"' +
' style="' +
' background-color:' + colorEditInput + '; width:' + (width2 - 2) + ';' +
' font-size:11px;'

	if (IE) {
		s1 +=
' visibility:hidden;'
	}

	s1 +=
'"' +
' onChange="name_onChange()"'

	if (IE) {
		s1 +=
' onBlur="this.style.visibility=\'hidden\'"' //см. selectImitation()
	}

	s1 +=
'>' +
	'<option value=0>' +
		str0 +
	'</option>' +
	str1 +
'</select>'

	str1 = s1

	if (group_num == groups.length - 1) {
		window.status = ''
	}

	if (group_num == groups.length - 1 && !pattern) {
		if (sort1 == 'А-я') {
			names_all_html = str1
		}
		else {
			names_all_html_sort = str1
		}
	}
	return (str1)
}

//-----------------------------------------------------------------------------------------
function group_onChange() {
	var group_num = parseInt(document.getElementById('groups').selectedIndex)

	if (document.getElementById('names').selectedIndex) {
		var p = new Array(0)
		p = document.getElementById('names').options[document.getElementById('names').selectedIndex].text.split(/ - /g)
		p = groups[group_num] + '<a> </a>' + p[0]

		document.getElementById('names1').innerHTML = names_create(group_num, p) //=====
	}
	else {
		document.getElementById('names1').innerHTML = names_create(group_num) //=====
	}
	document.getElementById('pattern_total').innerHTML = pattern_total

	if (IE) {
		document.getElementById('groups0').value = document.getElementById('groups').options[document.getElementById('groups').selectedIndex].text
	}

	if (!group_num)  {
		document.getElementById('names').selectedIndex = 0

		name_onChange() //======
	}
}

//-----------------------------------------------------------------------------------------
function name_onChange() {
	var p = new Array(0)

	if (document.getElementById('names').selectedIndex) {
		p = document.getElementById('names').options[document.getElementById('names').selectedIndex].text.split(/ - /g)
	}
	else {
		p[1] = ''
		p[2] = ''
	}

	if (IE) {
		document.getElementById('names0').value =
document.getElementById('names').options[document.getElementById('names').selectedIndex].text
	}

	if (!ue) {
		current_node.cells[price_col].title = p[1]
		p = p[2].replace(/ руб./g, '')
	}
	else {
		current_node.cells[price_col].title = p[2]
		p = p[1].replace(/ у.е./g, '')
	}
	current_node.cells[price_col].innerHTML = p

	if (name_num == 0) {
		document.getElementById('qty').value = 0
		current_node.cells[price_col].innerHTML = '0.00'
	}
	else if (document.getElementById('qty').value == 0) {
		document.getElementById('qty').value = 1
	}

	qty_onChange() //=====
}

//-----------------------------------------------------------------------------------------
function qty_onChange() {
	var s =	current_node.cells[price_col].innerHTML * parseInt(document.getElementById('qty').value)
	s = pad_with_zeros(s, 2) //=====

	current_node.cells[sum_col].innerHTML = s

	calc() //===
}

//-----------------------------------------------------------------------------------------
function calc(mode) {
	//current_node - строка не должна быть в режиме 'edit' !!

	var form1 = 0

	//уберем форму
	if (document.getElementById('groups')) {
		form1 = 1
		
		modeEditRow('normal')  //=====
		current_node.bgColor = '' //!
	}

	var h = ''
	var p = ''
	for (var i = 0; i < tbody_node.childNodes.length; i++) {
		if (parseFloat(0 + tbody_node.childNodes[i].cells[price_col].innerHTML)) {
			if (mode == 'у.е.') {
				//обмен значений title и innerHTML
				p = tbody_node.childNodes[i].cells[price_col].title
				p = p.replace(/^(.*) .*$/, '$1')
				tbody_node.childNodes[i].cells[price_col].title =
					tbody_node.childNodes[i].cells[price_col].innerHTML + (!ue ? '  у.е.' : ' руб.')
				tbody_node.childNodes[i].cells[price_col].innerHTML = p
				p = p * parseInt(0 + tbody_node.childNodes[i].cells[qty_col].innerHTML)
				p = pad_with_zeros(p, 2) //=====
				tbody_node.childNodes[i].cells[sum_col].innerHTML = p
			}	
			else if (mode == 'курс') {
				//изменение рублевых цен
				if (!ue) {
					p = tbody_node.childNodes[i].cells[price_col].title
					p = p.replace(/^(.*) .*$/, '$1')
					p = Math.round(p * RoublesIn$ / 10) * 10
					p = pad_with_zeros(p, 2) //=====
					tbody_node.childNodes[i].cells[price_col].innerHTML = p 
					p =	tbody_node.childNodes[i].cells[qty_col].innerHTML * p
					p = pad_with_zeros(p, 2) //=====
					tbody_node.childNodes[i].cells[sum_col].innerHTML = p
				}
				else {
					p = tbody_node.childNodes[i].cells[price_col].innerHTML
					p = Math.round(p * RoublesIn$ / 10) * 10
					p = pad_with_zeros(p, 2) //=====
					tbody_node.childNodes[i].cells[price_col].title = p + ' руб.'
				}
			}
			h +=	
'<input type="hidden" id="name' + (i +1) + '" name="name' + (i +1) + '" value="' +
				tbody_node.childNodes[i].cells[name_col].innerHTML + '">' +
'<input type="hidden" id="qty' + (i +1) + '" name="qty' + (i + 1) + '" value="' +
				tbody_node.childNodes[i].cells[qty_col].innerHTML + '">' +
'<input type="hidden" id="price' + (i +1) + '" name="price' + (i + 1) + '" value="' +
				tbody_node.childNodes[i].cells[price_col].innerHTML + '">'
		}
	}

//???????????????????	tbody_node.childNodes[0].cells[N_col].innerHTML = '1' + h

	totalQty = total_sum(tbody_node, qty_col, 1, tbody_node.rows.length) //=====
//	totalQty = (totalQty > 0) ? totalQty : '?'
	totalQty = (totalQty > 0) ? totalQty : '&nbsp;'
	tfoot_node.rows[0].cells[1].innerHTML = totalQty +
		(skidka ? '<br>&nbsp;<br>&nbsp;' : '')

	totalSum = total_sum(tbody_node, sum_col, 1, tbody_node.rows.length) //=====
	totalSum = Math.round(totalSum * 100) / 100
//	totalSum = (totalSum > 0) ? totalSum : '?'
	totalSum = (totalSum > 0) ? totalSum : (parseInt(totalQty) ? '?' : '&nbsp;')

	totalQty = parseFloat(0 + totalQty)
	totalSum = parseFloat(0 + totalSum)

	if (totalSum != '?') {
//	if (totalSum) {
		var vsego_s = pad_with_zeros(totalSum, 2) //=====
		var inet_s = skidka ? (parseInt(totalSum / (1000 / skidka)) * 10) : 0 //3%

		totalSum = totalSum - inet_s
		totalSum = pad_with_zeros(totalSum, 2) //=====

		if (inet_s) {
			inet_s = pad_with_zeros(inet_s, 2) //=====
		}
		else if (skidka) {
			inet_s = '--&nbsp; &nbsp; '
		}

		var str1 = pad_with_zeros(totalSum, 2) //=====
		str1 = vsego_s +
			(parseFloat(0 + inet_s) ? '<br>-' + inet_s + '<br>' + totalSum : '')
		tfoot_node.rows[0].cells[2].innerHTML = str1 != '0.00' ? str1 : '&nbsp;'
	}
	else if (parseInt(totalQty)) {
		tfoot_node.rows[0].cells[2].innerHTML = '<font color="#f00000">?</font>' +
			(skidka ? '<br>&nbsp;' + '<br>&nbsp;' : '')
	}

	document.getElementById('status_qty').innerHTML = totalQty
	document.getElementById('status_sum').innerHTML = totalSum

	document.getElementById('sum_str').innerHTML =
		sum_str(parseFloat(totalSum), 0, ue) //======
//alert('')
	//вернем форму, если она была
	if (form1) {
		modeEditRow('edit') //=====
	}

	if (!parseInt(0 + totalQty) && document.getElementById('configs').selectedIndex) {
		document.getElementById('configs').selectedIndex = 0
		config('sel') //=====
	}
}



//-----------------------------------------------------------------------------------------
function renumTableRows() {
	//current_node - строка не должна быть в режиме 'edit' !!

	var end_num = tbody_node.rows.length

	//в конце всегда одна пустая строка
	addTableRow() //=====

	end_num = 0
	for (var i = tbody_node.rows.length; i > 0; i--) { // снизу
		var row_node = tbody_node.rows[i - 1]

		if (end_num) {
			row_node.id = i //!
			row_node.cells[N_col].innerHTML = i
		}

		if (!end_num) {
			if ((row_node.cells[name_col].innerHTML != '&nbsp;'
					&& row_node.cells[name_col].innerHTML) //opera теряет &nbsp;!
					 || current_node == tbody_node.rows[i - 2]) {
				end_num = i

				if (row_node.cells[name_col].innerHTML != '&nbsp;'
						&& row_node.cells[name_col].innerHTML) { //opera теряет &nbsp;!
					row_node.id = i //!
					row_node.cells[N_col].innerHTML = i
				}
			}
			else if (i > 2) {
				// в конце - только одна пустая строка (не считая currentRow)
				remove_row(tbody_node, i) //=====
			}
		}
	}
}

//-----------------------------------------------------------------------------------------
function addTableRow() {
	end_num = tbody_node.rows.length + 1
	var clone_node = clone_row(tbody_node, end_num - 1, 1) //=====
	clear_table(tbody_node, end_num, end_num)
	clone_node.id = end_num
	clone_node.onclick = function() { moveEditRow(this) } //=====
}

//-----------------------------------------------------------------------------------------
function demoClick() {
	//автосборка ПК

	if (tbody_node.childNodes.length > 2) {
		 if	(confirm('Внимание! Старые данные будут удалены. Обновить таблицу?')) {
			clearTableRows() //=====	
    	}
		else {
			return
		}
	}

	document.getElementById('configs').selectedIndex = 0


	/////////при сортировке поле names сбрасывается, поэтому:
	if (!current_node.id) {
		moveEditRow(tbody_node.childNodes[1]) //=====
	}
	///////// исправить! ///////////////////////////////////

	moveEditRow(tbody_node.childNodes[0]) //=====

	var result_array = new Array()

	var alert1 = 0
	var alert2 = ''

	var arr1 = PC_ARRAY
	var arr2 = new Array()
	var n0 = 1
	var n1 = 1

	for (var i = 0; i < arr1.length; i++) {
		if (arr1[i].search(/\|\|/) == -1) {
			arr2 = arr1[i].split(/!!!!!/) //кнопка !!!!! скрипт
			arr2[0] = arr2[0].split(/=/)

			if (arr2[0][4] && !arr2[0][4].replace(/ *$/, '')) { //если надписи не черные
				result_array = buttonClick(arr2[0][0], result_array, n0, n1) //=====

				if (result_array[alert1].search(/Ошибка!/i) != -1) {
					//все повторить, начиная с процессора

					clearTableRows() //=====

					result_array = new Array()
					arr2 = new Array()
					i = -1
					n0++
					n1++

					if (n0 == 4) {
						//число попыток собрать ПK (перебор процессоров)
						if (!confirm(
'Ошибка! Были 3 попытки с разными процессорами.\n' +
'Побробовать со всеми остальными процессорами?'
							)) {
							break
						}
					}
				}
//				else {
					alert2 += result_array[alert1]

					if (!result_array[alert1] && parseInt(0 + document.getElementById('qty').value)) {
						moveEditRow(tbody_node.childNodes[current_node.id]) //=====
					}

//					n1 = 1
//				}
			}
		}
		else if (arr1[i].search(/\|\|\|\|/) != -1) {
			break // авто-сборка только системного блока ПК, остальное - пропустить
		}
	}
	moveEditRow(tbody_node.childNodes[0]) //=====

	return (alert2)
}

//-----------------------------------------------------------------------------------------
function buttonClick(group_and_pattern, result_array, n0, n1) {
	//нажатие клавиши выбора

	var demo = 0

	if (!n0) {
		//номер попытки (для демо)
		n0 = 1
	}
	if (!n1) {
		//с какого номера начинать (для демо)
		n1 = 1
	}

	if (!result_array) {
		result_array = logic_result() //=====
	}
	else {
		demo = 1
	}

	var g = group_and_pattern.split(/=/)
	var group = g[0]
	var pattern = g[1]

	if (group == 'Демо' || group == 'Сброс') {
	document.getElementById('status').innerHTML = icon1 + '&nbsp; ' + result_array[0]
		return
	}

	if (sort1 == 'А-я') {
		//сортировка по цене
		menu1('sort') //=====
	}

	var alert1 = 0

	window.status = 'Ждите... ' + n0 + '-й поиск комплектующего "' + group +'" '

	for (var g = 1; g < groups.length; g++) {
		if (groups[g] == group) {
			document.getElementById('myFORM').groups.selectedIndex = g

			group_onChange() //=====
	
			for (var n = n1; n < document.getElementById('names').options.length; n++) {
				document.getElementById('names').selectedIndex = n
				name_onChange() //=====

				modeEditRow('normal')  //=====

				var data_array = new Array(0)
				data_array[0] = current_node.cells[name_col].innerHTML

				result_array = logic(data_array, result_array, PC_ARRAY) //=====

				modeEditRow('edit')  //=====

				if (!result_array[alert1]) {
					//если поиск успешно завершен

					break
				}
				else if (result_array[alert1].search(/Внимание!/i) != -1) {
					//прервать поиск (встроенные Звук, Видео, Сеть, ...)

					break
				}

				window.status += '|'
			}
		}
	}

	//персчет конфигурации - устранение накопления названий!
	result_array = logic_result() //конфигурация

//	if (result_array[alert1]) {
//		document.getElementById('names').selectedIndex = 0
//		name_onChange() //=====
//		if (result_array[alert1].search(/Внимание!/i) != -1) {
//			result_array[alert1] = ''
//		}
//		else {
//			result_array[alert1] += '\nВнимание! ' + group + ' - отсутствует'
//		}
//	}

	if (!result_array[alert1] && parseInt(0 + document.getElementById('qty').value)) {
//		moveEditRow(tbody_node.childNodes[current_node.id]) //=====
	}
	else {
		if (demo || !confirm(result_array[alert1] + ' !\n' +
'Добавить товар "' + document.getElementById('names').options[document.getElementById('names').selectedIndex].text + '" ?')) {
			document.getElementById('names').selectedIndex = 0
			name_onChange() //=====
			editRow('delete') //=====
		}
	}
	moveEditRow(tbody_node.childNodes[current_node.id]) //=====		

	window.status = ''

	return (result_array)
}

//-----------------------------------------------------------------------------------------
function logic_result() {
	modeEditRow('normal')  //=====

	var data = new Array(0)
	for (var i = 0; i < tbody_node.rows.length; i++) {
		data[i] = tbody_node.rows[i].cells[name_col].innerHTML
	}
	
 	var result_array = logic(data, 0, PC_ARRAY) //=====

	document.getElementById('status').innerHTML = icon1 + '&nbsp; ' + result_array[1].replace(/( \/ )*$/, '')

	modeEditRow('edit')  //=====

	return (result_array)
}

//-----------------------------------------------------------------------------------------
function logic(data_array, result_array, arr1) {
	if (!result_array) {
		result_array = new Array()
	}

	var s = '' //см. pc.txt
	var ALERT = '' //см. pc.txt
	var SHORT = result_array[1] ? result_array[1] : '' //см. pc.txt
	var arr2 = new Array()

	for (var i = 0; i < arr1.length; i++) {
		if (arr1[i].search(/\|\|/) == -1) {
			arr2 = arr1[i].split(/!!!!!/) //кнопка !!!!! скрипт
			arr2[0] = arr2[0].split(/=/)
			reg_exp = new RegExp('^' + arr2[0][0])

			for (var j = 0; j < data_array.length; j++) {
				s = data_array[j].replace(/&nbsp;/g, ' ')

				if (s.search(reg_exp) != -1) {    	
					arr2[1] = arr2[1].replace(/\r?\n/g, '')
					arr2[1] = arr2[1].replace(/&amp;&amp;/g, '&&') //Mozilla

					eval(arr2[1]) //см. pc.txt
				}
			}
		}
	}

	result_array[0] = ALERT
	result_array[1] = SHORT

//	document.getElementById('status').innerHTML = icon1 + '&nbsp; ' + SHORT.replace(/( \/ )*$/, '')

 	return (result_array)
}

//-----------------------------------------------------------------------------------------
function clearTableRows(begin_row) {
	begin_row = begin_row ? begin_row : 0

	if (current_node.id) {
		moveEditRow(tbody_node.childNodes[0]) //=====
	}

	if (current_node.bgColor != colorNormal) {
		// преобразуем в обычную строку
		modeEditRow('normal') //=====
	}

	//очистка строк и итогов
	clear_table(tbody_node, begin_row, tbody_node.rows.length) //=====
	clear_table(tfoot_node, 1, 1, 2) //=====

	//удаление лишних пустых строк
	renumTableRows() //=====

	// преобразуем в строку редактирования
	modeEditRow('edit') //======

	//очистка строки состояния
	document.getElementById('status').innerHTML = icon1
	document.getElementById('status_qty').innerHTML = '0'
	document.getElementById('status_sum').innerHTML = '0.00'
}
