/* Функция добавляет элемент option в список. */
function addOption (oListbox, text, value, isDefaultSelected, isSelected, isDisabled)
{
	// Проверяем, существует ли добавляемый элемент в списке
	for(var i = 0; i < oListbox.options.length; i++){
		// Если существует, то не добавляем ничего и завершаем выполнение функции
		if(oListbox.options[i].value == value){
			return 0;
		}
	}
	// Если добавляемый элемент пустой, то не добваляем его
	if(text == "" || value == "") return 0;
	// Создаём новый тэг option
	var oOption = document.createElement("option");
	// Добавляем к нему текстовый узел и записываем туда текст
	oOption.appendChild(document.createTextNode(text));
	// Устанавливаем аттрибут value
	oOption.setAttribute("value", value);
	// Если элементы в данный момент выделен, то устанавливаем ему это значение
	if (isDefaultSelected){ 
		oOption.defaultSelected = true;
		oOption.setAttribute("class", 'selected');
	} else if (isSelected){
		oOption.selected = true;
		oOption.setAttribute("class", 'selected');
	}
	// Если элемент не доступен, устанавливаем свойство disabled в значение true и добавляем элемент в конец списка
	if(isDisabled){
		oOption.disabled = true;
		oListbox.appendChild(oOption);
	// Если элемент доступен, то добавляем его в начала списка в алфавитном порядке
	} else {
		for(var i = 0; i < oListbox.options.length; i++){
			if(oListbox.options[i].disabled){
				oListbox.insertBefore(oOption, oListbox.options[i]);
				break;
			} else if ( (i+1 != oListbox.options.length) && (oListbox.options[i].value < oOption.value && oListbox.options[i+1].value > oOption.value)){
				oListbox.insertBefore(oOption, oListbox.options[i+1]);				
				break;
			} else {
				oListbox.appendChild(oOption);
			}
		}
	}
}

var oSels = new Array();	// Выбранные элементы
var SelValues = new Array();	// Значение выбранных элементов
var arrlist = new Array();	// Массив элементов из XML файла (список проектов)

/* Функция загружает XML файл и вытаскивает из него элементы для списков выборки */
function Load(){
	/* Загрузка XML файда */
		var xmlDoc;
		// code for IE
		if (window.ActiveXObject) {
			xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
		// code for Mozilla, Firefox, Opera, etc.
		} else if (document.implementation.createDocument) {
			xmlDoc=document.implementation.createDocument("","",null);
		} else {
			alert('Your browser cannot handle this script');
		}
		
		//if( window.opera && window.getSelection ){ alert("Вы используете устаревшую версию Opera. С данным браузером фильтр может работать некорректно."); }
		
		xmlDoc.async=false;
		xmlDoc.load("/xml/filtermenu.xml");
		// Массив элементов из XML файла
		var x=xmlDoc.documentElement.childNodes;
		
		var k = 0, m = 0;
		// Просматриваем массив элементов
		for (var i=0;i<x.length;i++)
		{
			// Если тип узла "Элемент"
			if (x[i].nodeType==1) { 
				// Вытаскиваем значения
				arrlist[k] = new Array();
				arrlist[k].branch = x[i].getAttribute("branch");
				arrlist[k].automation = x[i].getAttribute("automation");
				arrlist[k].process = x[i].getAttribute("process");
				var y = x[i].childNodes;
				arrlist[k].product = new Array();
				m = 0;
				for(var j=0;j<y.length;j++){
					if(y[j].nodeType==1){			
						arrlist[k].product[m] = y[j].childNodes[0].nodeValue;
						m++;
					}
				}
				k++;
			} 
		}		
		
		/* Обработка select */	
		// Получаем объекты, которые в данный момент выбраны в списках
		oSels[0] = document.getElementById('select_branch'); 
		oSels[1] = document.getElementById('select_process'); 
		oSels[2] = document.getElementById('select_automation'); 
		oSels[3] = document.getElementById('select_product'); 
		// Заполняем массив
		for(var j = 0; j < 4; j++){
			SelValues[j] = new Array();
			for(var i = 0; i < oSels[j].options.length; i++){
				SelValues[j][oSels[j].options[i].value] =  oSels[j].options[i].value;
			}
		}
		Change('select_branch');
}
/* Функция выполняется при выборе другого элемента в списке; id - идентификатор списка, в котором выбрали другой элемент */
function Change (id){
	// Получаем объект выбранного элемента
	var objSel = document.getElementById(id); 
	if ( objSel.selectedIndex != -1)
	{		
		var branch ;
		var automation;
		var product;
		var process;
		var dis_list = new Array(); // Список элементов, которые будут недоступны
		
		// Если выбраны элементы в других списках, получаем их объекты
		if(oSels[0].selectedIndex != 0) branch = oSels[0].options[oSels[0].selectedIndex].value;
		if(oSels[1].selectedIndex != 0) process = oSels[1].options[oSels[1].selectedIndex].value;
		if(oSels[2].selectedIndex != 0) automation = oSels[2].options[oSels[2].selectedIndex].value;
		if(oSels[3].selectedIndex != 0) product = oSels[3].options[oSels[3].selectedIndex].value;
		// Очищаем все списки
		for(var i=0;i<4;i++){	
			oSels[i].options.length = 1;
			dis_list[i] = new Array();
		}
		// Просматриваем исходный массив элементов и по нему заполняем списки
		for(var i = 0 ; i < arrlist.length ; i++){
			var flag_exit = false;
			// Если хотя бы один выбранный элемент в списке не соответствует элементу в исходном массиве элементов (проекты), то добавляем этот объект в список недоступных элементов
			if( branch && arrlist[i]['branch'] != branch ){ 
				flag_exit = true;
			}
			if( process && arrlist[i]['process'] != process ){ 
				flag_exit = true;
			}
			if( automation && arrlist[i]['automation'] != automation ){
				flag_exit = true;
			}
			if( product ){ 
				var tmp_flag;
				// Временный флаг, проверяет наличие выбранного продукта в проекте
				tmp_flag = false;
				// Проверяем наличие выбранного продукта в проекте
				for(var j = 0; j < arrlist[i]['product'].length; j++){
					if( arrlist[i]['product'][j] == product ) { 
						tmp_flag = true;
						break;
					}
				}
				// Если такого продукта в проекте нет, то переходим к следующему проекту
				if(tmp_flag == false) {
					flag_exit = true;
				}
			}
			// Переходим к следующей итерации, если проект на соответствует заданным условиям фильтра
			if (flag_exit) {
				dis_list[0][dis_list[0].length] = arrlist[i]['branch'];
				dis_list[1][dis_list[1].length] = arrlist[i]['process'];
				dis_list[2][dis_list[2].length] = arrlist[i]['automation'];
				dis_list[3][dis_list[3].length] = new Array();
				for(var j = 0; j < arrlist[i]['product'].length; j++){
					dis_list[3][dis_list[3].length-1][j] = arrlist[i]['product'][j];
				}
				continue;
			}
			
			// Если проект соответствует условию выборки, то добавляем его элементы в списки выборки
			if(arrlist[i]['branch'] != branch){
				addOption(oSels[0], arrlist[i]['branch'], arrlist[i]['branch'] );
			} else if( branch ){
				addOption(oSels[0], arrlist[i]['branch'], arrlist[i]['branch'], false, true );
			}			
			if(arrlist[i]['process'] != process){
				addOption(oSels[1], arrlist[i]['process'], arrlist[i]['process'] );
			} else if( process ){
				addOption(oSels[1], arrlist[i]['process'], arrlist[i]['process'], false, true );
			}			
			if(arrlist[i]['automation'] != automation){
				addOption(oSels[2], arrlist[i]['automation'], arrlist[i]['automation'] );
			} else if ( automation ){
				addOption(oSels[2], arrlist[i]['automation'], arrlist[i]['automation'], false, true );
			}
			
			// Заполняем список продуктов
			for(var j = 0; j < arrlist[i]['product'].length; j++){
				if(arrlist[i]['product'][j] == product){
					addOption(oSels[3], arrlist[i]['product'][j], arrlist[i]['product'][j], false, true );
				} else {
					addOption(oSels[3], arrlist[i]['product'][j], arrlist[i]['product'][j]);
				}
			}
		}

		// Добавляем в списки выборки элементы меню "Отрасль", "Тип процесса", "Автоматизация" с аттрибутом disabled
		for( var j = 0; j < 3; j++ ){
			dis_list[j].sort();
			for( var n = 0; n < dis_list[j].length; n++ ){
				addOption(oSels[j], dis_list[j][n], dis_list[j][n], false, false, true );
			}
		}
		var dis_products = new Array();
		var k = 0;
		// Добавляем в списки выборки элементы меню "Продукт" с аттрибутом disabled
		for( var j = 0; j < dis_list[3].length; j++ ){
			for( var n = 0; n < dis_list[3][j].length; n++ ){
				dis_products[k++] = dis_list[3][j][n];
			}
		}
		dis_products.sort();
		for( var j = 0; j < dis_products.length; j++ ){
			addOption(oSels[3], dis_products[j], dis_products[j], false, false, true );
		}
	// Если в фильтре элементы не выбраны, то восстанавливаем все списки
	} else {		
		for(var j = 0; j < 4; j++){
			oSels[j].options.length = 1;
		}
		for(var i=0;i<4;i++){
			for(var j in SelValues[i]){	
				if(SelValues[i][j] == 0) continue;					
				addOption(oSels[i], SelValues[i][j], SelValues[i][j]);
			}				
		}
	}
}
