//JavaScript
/**
 * Объект, изменяющий внешний вид выпадающих списков.
 * Изменяет выпадающие списки согласно пользовательским настройкам.
 */
function SelBox(  ajaxList, attrs, showError, inputs, lines, boxes )
{
	if( !inputs || typeof inputs != "object" ) return false;
	if( !lines || typeof lines != "object" ) return false;
	if( !boxes || typeof boxes != "object" ) return false;
	
	this.ajax = ( ajaxList ) ? new XHRObject( {ShowError : true} ) : false;
	this.boxes = boxes; // ИД элементов, содержащих списки
	this.inputs = inputs; // ИД скрытых Инпутов, в которые будут занасится значения
	this.lines = lines; // ИД линейных элементов. Сюда заносится выбранный элемент для отображения на странице

	this.showError = showError; // Отбражать ошибки на странице
	this.items = new Array(); // Сюда будут записаны массивы с данными для других списков
	
	this.predX = new Array(); // Массив номеров предыдущих выборов. Используется и заполняется см. ниже
	this.attrs = ( typeof attrs == "object" ) ? attrs : false; // Атрибуты Класс линейных объектов (активного, подгружаемого, неактивного)
}

// Устанавливаем списки разных уровней 
SelBox.prototype.SetItems = function( items, level )
{
	if( !items || typeof items != "object" ) return false;
	if( !level || typeof level != "number" ) return false;
	
	this.items[level] = items; // Регистрируем список значений списка
}

// Первый шаг, вызывается на странице. Необходим для  назначения обработчиков списку первого уровня
SelBox.prototype.FirstStep = function()
{
	var o = this, lines = this.lines, boxes = this.boxes;
	
	var _line = ( document.getElementById ) ? document.getElementById(lines[0]) : document.all.lines[0]; // Получаем линейный элемент
	if( !_line || _line == "undefined" ) return false;
	_line.onclick = function(){o.ShowBox(1) }; // Назначаем ему обработчик, который будет показывать и скрывать список
	
	var _box = ( document.getElementById ) ? document.getElementById(boxes[0]) : document.all.boxes[0]; // Получаем элемент со списком
	var _divs = _box.getElementsByTagName("div"); // Получаем все элементы списка
	if( !_divs || _divs.length <= 0 ) return false;
	try
	{
		for( var i = 0; i < _divs.length; i++ )
		{;
			_divs[i].onclick = function(x){ return function(){o.ClickElement(_divs[x], 1, x)} }(i); // Назначаем им обработчик выбора
		}
	}
	catch( e )
	{
		if( this.showError !== false ) alert("Ошибка в конструкторе: " + e); // Если разрешено выводить ошибки - выводим
	}
}

// Отображаем и скрываем элемент списка (+)
SelBox.prototype.ShowBox = function( level, oper )
{
	var boxID = this.boxes[level-1] ; // Получаем ид списка, который нужно отобразить или скрыть
	var _box = ( document.getElementById ) ? document.getElementById(boxID) : document.all.boxID; // Получаем сам список
	if( !_box || _box == "undefined" ) return false;
	
	if( !oper || oper === undefined )
	{
		var oper;
		if( _box.parentNode.style.display == "block" )
		{
			oper = "hide";
		}
		else
		{
			oper = "show";
		}
	}
	if( oper == "hide") // Если список отображен
	{
		_box.parentNode.style.display = "none"; // Скрываем его
	}
	else // Если скрыт
	{
        _box.parentNode.style.display = "block";	// Отображаем его
	}
}

// Метод задает текст внутри линейного элемента и изменяет его атрибут класс, а также изменяет свойство value у сткрытого инпута
SelBox.prototype.CreateTextInLineElement = function( text, level )
{
	if( typeof text != "number" ) var text = text.split("*");
	
 	var lineID = this.lines[level-1], inptID = this.inputs[level-1]; // Ид текущего линейного объека
	var _line = ( document.getElementById ) ? document.getElementById(lineID) : document.all.lineID; // Сам линейный объект
	var _input = ( document.getElementById ) ? document.getElementById(inptID) : document.all.inptID; // Элемент скрытого инпута

	if( !_line || _line == "undefined" || !_input || _input == "undefined" ) return false;
	if( text != 0 ) // Если параметр Текст не равен 0
	{
		_line.innerHTML = ""; // Очищаем содержимое линейного элемента
		_input.value = ""; // Очищаем свойство value скрытого инпута
		
 		_line.innerHTML = text[1]; // Назначаем им новое содержимое
 		_input.value = text[0];
 	
 		if( _line.parentNode.className != this.attrs.active ) _line.parentNode.className = this.attrs.active; // Изменяем класс на активный
 		var o = this; // создаем экземпляр текущего класса для использования внутри обработчика
 		_line.onclick = function(){o.ShowBox(level)} // Назначаем обработчик показа скрытия
 	}
 	else // если текст равен 0
 	{
 		var boxID = this.boxes[level-1]; // Ид элемента списка
	 	var _box = ( document.getElementById ) ? document.getElementById(boxID) : document.all.boxID; // Сам элемент списка
	 	if( !_box || _box == "undefined" ) return false;
	 	
	 	_line.parentNode.className = this.attrs.notActive; // назначаем класс неактивного элемента
	 	
 		_line.innerHTML = ""; // Очищаем содержимое всех элементов, относящихся к текущнему списку
 		_input.value = "";
 		_line.onclick = "";
 		
 		_box.innerHTML = "";
 	}
}
/* 
Обработчик события онклик (
													_elem - текущий выбранный элемент в списке, 
													level - уровень, 
													x - номер предыдкущего выбранного элемента в списке, 
													callFunc - необяз, функция обратного вызова, помогает при работе ajax выполнять после завершения его работы что-либо)
*/
SelBox.prototype.ClickElement = function( _elem, level, x, callFunc ) 
{
	if( !_elem || _elem == "undefined" ) return false;
 	try
 	{
 		if( level == 1 ) this.CreateTextInLineElement(0, 3); // Если уровень1, очищаем содержимое элементов третьего уровня (---ДОРАБОТАТЬ---)
 		var _arA = _elem.getElementsByTagName("a"); // получаем массив элементов А в одном элементе списка
 		_a = _arA[0]; // Нам нужен только первый тег
 		if( !_a || _a == "undefined" ) // Если он не найден
 		{
 			_a = _elem; // Значик содержимое будет записываться в сам элемент списка
 		}
 		var items = _a.parentNode.getAttribute("pID") + "*" +_a.innerHTML;
 		this.CreateTextInLineElement( items, level ); // Записываем содержимое в инпут и линейный элемент
 		
 		if( level < 3 ) // Если уровень меньше 3 значит надо продолжать формировать другие уровни
 		{
 			this.CreateNextLevel( _elem, level+1, x ); // Создаем новый уровень
 		}
 		
 		this.ShowBox(level, "hide"); // Скрываем текущий список
 		if( callFunc )
 		{
 			window.onload = callFunc;
 		}
 	}
 	catch( e )
 	{
 		if( this.showError !== false ) alert("Произошла ошибка: " + e);
 	}
}

// Формируем список элементов следующего уровня
SelBox.prototype.CreateNextLevel = function( _e, level, x )
{
	var o = this; // Создаем экземпляр текущего класса для использования в обработчике
	
	var boxID = this.boxes[level-1]; // Получаем Ид списка
 	var _box = ( document.getElementById ) ? document.getElementById(boxID) : document.all.boxID; // Сам список
 	if( !_box || _box == "undefined" ) return false;
 	_box.innerHTML = ""; // Очищаем содержимое списка
 	
 	this.predX[level] = x; // сохраняем номер предыдущего выбора
 	
 	try
 	{
		var item; // массив, в который будут перенесено будущее содержимое элементов списка
		if( this.ajax  )
		{
 			this.GetAjax( _e.getAttribute("pID"), _box, level);
 	 	}
 	 	else
 	 	{
			if( level == 2 ) // Если уровень 2 (---------ДОРАБОТАТЬ---------)
			{
	 			item = this.items[level][x]; // То массив с содержимым будет иметь такой вид
			}
			else if (level > 2)// Если урвень больше 2
			{
				if( typeof  this.predX[level-1] != "undefined" ) item = this.items[level][this.predX[level-1]][x]; // Массив будет иметь такой вид
 			}
 			
 				for( var i = 0; i < item.length; i++ ) // Перебираем Содержимое будущего списка
 				{
 					var _div = document.createElement("div"), _a = document.createElement("a"); // Создаем элемненты DIV и A
 			
 					_a.innerHTML = item[i]; // Заносим в элемент А текущее содержимое
 					_a.setAttribute("href", "javascript: void(0)"); // Отключаем реакцию ссылки на клик
 			
 					_div.appendChild(_a); // Добавляем элемент А в элемент DIV - элемент списка готов
 					_div.className = "select_drop_in_item"; // Добавляем класс элементу списка для упаления стилями
 			
 					_div.onclick = function(_e, x ){ return function(){o.ClickElement(_e, level, x)} }(_div, i); // Назначаем обработчик события
 			
 					if( _div && _div != "undefined" ) _box.appendChild(_div); // Добавляем элемент списка к общему списку
 				}
 		
 				this.CreateTextInLineElement("0 * Выберите элемент", level); // Добавляем содержимое в линейный элемент и инпут
 		}
 	}
 	catch( e )
 	{
 		if( this.showError !== false ) alert("Произошла ошибка: " + e); 	
 	}
}

SelBox.prototype.GetAjax = function( parent_id, _box, level )
{
	var _obj = this;
	this.ajax.GetResults = function()
	{
		var response = this.xmlHttp.responseText;
		//метод возможно переопределить на странице с целью получения нужного результата
	}
	this.ajax.Process('/index.php', params);
}

/*
Пример создания тем для списков в ручную без использования AJAX
items = [
				[
					"Увлажнитель 1",
					"Увлажнитель 2",
					"Увлажнитель 3"
				],
				[
					"Кондиционер 1",
					"Кондиционер 2",
					"Кондиционер 3"
				],
				[
					"Кресло 1",
					"Кресло 2",
					"Кресло 3"
				]
			  ];
jsSelBox.SetItems(items, 2);
items = [
				[
					["Увлажнитель 1.1 Lite","Увлажнитель 1.2 Medium","Увлажнитель 1.3 Hard"],
					["Увлажнитель 2.1 Lite","Увлажнитель 2.2 Medium","Увлажнитель 2.3 Hard"],
					["Увлажнитель 3.1 Lite","Увлажнитель 3.2 Medium","Увлажнитель 3.3 Hard"]
				],
				[
					["Кондиционер 1.1 Lite","Кондиционер 1.2 Medium","Кондиционер 1.3 Hard"],
					["Кондиционер 2.1 Lite","Кондиционер 2.2 Medium","Кондиционер 2.3 Hard"],
					["Кондиционер 3.1 Lite","Кондиционер 3.2 Medium","Кондиционер 3.3 Hard"]
				],
				[
					["Кресло 1.1 Lite","Кресло 1.2 Medium","Кресло 1.3 Hard"],
					["Кресло 2.1 Lite","Кресло 2.2 Medium","Кресло 2.3 Hard"],
					["Кресло 3.1 Lite","Кресло 3.2 Medium","Кресло 3.3 Hard"]
				]
			]
jsSelBox.SetItems(items, 3);	*/

