/**
 * Скрипт для генерации таблиц соответствия цветов мулине
 * Автор: CupIvan mail@cupivan.ru
 * Дата:  22.03.09
 */
var g_text    = '', g_size;            // текст, размер полей
var g_palette = [], g_palette_cur = 0; // общая таблица цветов
var g_palette_cur  = 'dmc';            // текущая палитра
var g_palette_show = {dmc:1,anchor:1,madeira:1,dimensions:1,gamma:1};
var g_pal_names = {
	dmc: 'DMC', anchor: 'Anchor', madeira: 'Madeira', dimensions: 'Dimensions',
	gamma: 'Гамма', orlis: 'Орлис', belka: 'BELKA', kirov: 'ПНК им. Кирова',
	jpcoats: 'J&P Coats', name: 'Название', mayflower: 'MayFlower', bucilla: 'Bucilla',
	eva: 'Eva Rosenstand', 
_:0};

/** Функция генерации списка доступных палитр */
function gen_options(obj)
{
	var palette, option;
	obj.options.length = 0; // очищаем список
	for (palette in g_pal_names)
	if (palette != '_')
		obj.options[obj.options.length] = (new Option(g_pal_names[palette], palette));
}

/** Функция изменения цвета фона под мышкой */
function chc(obj, color)
{
	if (''+color != 'undefined')
	{
		obj.parentNode.style.backgroundColor = '#' + color;
		obj.parentNode.style.color = '#' + color;
	}
	else
	{
		obj.parentNode.style.backgroundColor = '#FFF';
		obj.parentNode.style.color = '#000';
	}
}

/** Функция генерации таблицы соответствия цветов */
function generate_palette()
{
	var i, j, st = '', colors, row, column, cols, txt, color;
	// получаем список всех отобранных цветов
	colors = find_color(g_palette_cur, txt = g_text);
	// генерируем таблицу
	for (i = 0; i < colors.length - 1; i++)
	{
		row = colors[i];
		st += '<tr>';
		st += '<td style="' +
			'; background: #' + row.color +
			'; width:' + g_size[0] + 'px; height:'+ g_size[1] + 'px' +
			'; "></td>';
		for (column in row)
		{
			if (g_palette_show[column] == 1)
			{
				cols = '';
				for (j = 0; j < row[column].length; j++)
				{
					if (g_palette[column][row[column][j]] != undefined)
						color = ' onmouseover="chc(this, \'' +
							g_palette[column][row[column][j]].color +'\')"' +
							'onmouseout="chc(this)"';
					cols += ((cols == '') ? '' : ', ') + '<span' + color + '>' +
						row[column][j] + '</span>';
				}
				st += '<td style="' +
					'; text-transform:capitalize' +
					'; ">  ' + cols + '  </td>';
			}
			// стираем этот цвет из строки
			if (column == g_palette_cur)
				txt = txt.replace(' ' + row[column] + ' ', ' ');
		}
		st += '</tr>';
	}
	// добавляем заголовок
	cols = '';
	row = '<tr><td><input type="checkbox" style="visibility:hidden" /><br>Цвет</td>';
	for (column in colors[0])
	if (column != 'color')
		if (g_palette_show[column] == 1)
			row += '<td>'+
				'<input type="checkbox" onclick="switch_column(\''+
					column+'\')" checked="checked" id="cc'+column+'"/>'+
				'<br><label for="cc'+column+'">   '+g_pal_names[column]+'   </label>'+
				'</td>';
		// убранные колонки
		else { cols += '<nobr><input type="checkbox" onclick="switch_column(\'' + column +
				'\')" id="cc' + column + '"> <label for="cc' + column + '"> ' +
				g_pal_names[column] + ' </label></nobr> ';
				//alert(cols);
				}
	row += '</tr>';
	st = row + st;

	st = '<table style="text-align: center; ">'+st+'</table>';
	if (colors.length < 2) st = cols = '';
	document.getElementById('colors_table').innerHTML = st;

	// рисуем колонки закрытые
	st = (cols != '') ? '<br>Показать колонки:<br>'+cols+'<br>' : '';
	// ненайденные номера
	txt = colors[colors.length - 1];
	st += (txt.length) ? '<br>Ненайденные номера:<br>'+(''+txt).replace(/,/g, ', ') : '';
	document.getElementById('colors_columns').innerHTML = st;
}

/** Функция смены текста */
function change_text(x)
{
	x = x.toLowerCase();
	// убираем лишние знаки
	x = x.replace('напишите здесь номера интересующих', '');
	x = x.replace('вас цветов, например', '');
	x = x.replace(/[^a-zA-Zа-яА-Я 0-9]/g, ',');
	x = x.replace(/ (\d+)/g, ',$1,');
	x = x.replace(/,\s+/g, ',');
	x = x.replace(/\s+,/g, ',');
	x = x.replace(/,+/g, ',');
	x = x.replace(/^,/g, '');
	x = x.replace(/,$/g, '');
	g_text = x;
	generate_palette();
}

/** Функция смены палитры */
function change_palette(x, y)
{
	g_palette_cur = x.toLowerCase();
	g_palette_show[x] = 1; // показываем столбец палитры на экране
	if (y == undefined) generate_palette();
}

/** Функция смены размера ячеек */
function change_size(x, y)
{
	var sizes = [ [10,10], [30,15], [60,30], [100,50], [200,100] ];
	g_size = sizes[x];
	if (y == undefined) generate_palette();
}
change_size(2, 0);

/** Функция показать/спрятать колонку */
function switch_column(x)
{
	if (x == 'Color') return 0;
	if (g_palette_show[x] == undefined) g_palette_show[x] = 0;
	g_palette_show[x] ^= 1;
	generate_palette();
}

/** Функция генерации ссылки */
function generate_link()
{
	var st = '', url;
	url  = '' + window.location;
	url  = url.replace('.html', '');
	url += '/' + g_palette_cur + '/' + escape(g_text.replace(/^\s+/,'').replace(/\s+$/,''));
	st  += '<div style="border: 1px solid #000; padding: 5px; margin-top: 10px;">';
	st  += '<u>Ссылка на этот набор цветов:</u><br><br>';
	st  += '<span style="color:#777">'+url+' <a href="'+url+'" target="_blank">  (перейти)  </a>';
	st  += '</div>';
	document.getElementById('colors_columns').innerHTML = st;
}

/** Функция поиска цветов, возвращает массив найденных */
function find_color(pal_name, text)
{
	var i, palette, base, row, prop, cols = [], unfind = [];
	palette = g_palette[pal_name];
	text = text.split(',');
	for (i = 0; i < text.length; i++)
	if (palette[text[i]] != undefined)
	{
		// создаем базовый ряд
		base = {}; row = palette[text[i]];
		for (prop in palette.colors)
			base[prop] = ['?'];
		base[pal_name] = [text[i]];
		// добавляем туда информацию из текущего ряда
		for (prop in row)
			base[prop] = row[prop];
		// добавляем ряд в таблицу
		cols.push(base);
	} else unfind.push(text[i]);
	cols.push(unfind);
	return cols;
}

/** Функция добавления палитры соответствия
 * Первая строка - имена палитр
 * Первый столбец - основная палитра
 */
function add_palette(x)
{
	var x = x.toLowerCase();
	var i, j, k, ii, t, row, names;
	x = x.replace(/^\s+/,'').replace(/\s+$/,'').replace(/\r/g,'').split('\n');
	names = x[0].split('\t');
	// перебираем все цвета и сохраняем их в общей таблице
	for (i = 1; i < x.length; i++) // строки в таблице
	{
		t = x[i].split('\t');
		// формируем добавляемый ряд
		row = {};
		for (j = 0; j < names.length; j++)
		if (t[j] != '' && t[j] != undefined)
			row[names[j]] = t[j].replace(/\s+/g,' ').split(',');
		// добавляем ряд во все таблицы соответствий
		// j          - базовая палитра
		// row[j][jj] - текущий номер в базовой палитре
		// k          - палитра соответствия
		// row[k][kk] - номер в палитре соответствия
		for (j in row)    // перебираем все палитры
		if (j != 'color') // палитра с кодами цветов не нужна
		{
			for (jj = 0; jj < row[j].length; jj++) // все номера в этой палитре
			for (k in row)                         // перебираем все остальные палитры
			if ((j == k) && (names[0] != j) && ('name' != j)) continue; else // базовую с текущей не самодублируем...
			// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ?
			for (kk = 0; kk < row[k].length; kk++) // все номера в текущей палитре
			{
				if (g_palette[j] == undefined)
				{
					g_palette[j] = {colors:{}};
					g_palette[j].colors[j] = 0; // основной цвет
				}

				// помечаем, какой есть перевод для данной палитры
				g_palette[j].colors[k] = (g_palette[j].colors[k] == undefined) ?
					1 : g_palette[j].colors[k] + 1;

				if (g_palette[j][row[j][jj]] == undefined)
					g_palette[j][row[j][jj]] = {};
				
				if (g_palette[j][row[j][jj]][k] == undefined)
					g_palette[j][row[j][jj]][k]  = [row[k][kk]];
				else
					// код цвета берем из базовой палитры
					if (k == 'color')
						if (j == names[0])
							g_palette[j][row[j][jj]][k] = [row[k][kk]];
						else;
					else
					// повторные соответствия не добавляем
					if ( (','+g_palette[j][row[j][jj]][k]+',').
						indexOf(','+row[k][kk]+',') == -1)
						g_palette[j][row[j][jj]][k].push(row[k][kk]);
			}
		}
	}
}
