// Авторы - Осовский Л., Максаков А.
// Скрипт разворачивает и сворачивает ветви дерева. Есть управляющий элемент - вершина дерева, который управляет ВСЕМИ ветками дерева.
// Соглашение имен:
// индикаторы - изображения arrow_right.gif (символизирует закрытое состояние ветки) и arrow_down.gif (открытое состояние);
// id этих картинок - foldpic1, где последняя цифра изменяется и соответствует числу (id), передаваемому в качестве аргумента в вызове функции swtch(id);
// id картинки вершины дерева - foldpicAll;
// все элементы дерева являются элементами вложенных списков (теги UL и LI);
// все теги ul имеют стиль style="list-style-type:none", которому скрипт добавляет свойство "display:none" или "display:''" в зависимости от состояния;
// id верхнего элемента списка (вершины дерева) - foldheaderAll;
// id остальных элементов списков (тег LI) - foldheader1, где последняя цифра изменяется и соответствует числу (id), передаваемому в качестве аргумента в вызове функции swtch(id);
// id скрываемых списков (тег UL) - foldinglist1, где последняя цифра изменяется и соответствует числу (id), передаваемому в качестве аргумента в вызове функции swtch(id) для отображения этого списка.
// Вышеуказанное число описывается в виде "id родительского элемента"+"трехзначное число, идентифицирующее элемент на своем уровне".
// Например, 1234012 означает, что это элемент третьего уровня с номером 012, относящийся к элементу 2-го уровня с номером 234, котороый относится к элементу 1-го уровня с номером 1.
// У списка элементы имеют номера его потомков. Т.е. если список имеет номер 1234 , то его элементы - 1234012, например.
// Ограничение: элементов одного уровня, относящихся к одному родительскому элементу, не может быть больше 999-и.


    function initTree() // Функция, инициирует состояние дерева, скрывая все ветви, у индикаторов которых src="arrow-right.gif". Вызывается onclick="initTree()" из тега body после вызова функции инициализации элементов дерева initCheck() (файл toggletree.js) в случае ее использования.
    {
	img1=new Image();
	img1.src="arrow_right.gif";
	img2=new Image();
	img2.src="arrow_down.gif";
	var picDoc = document.images;

	for (var i = 0; i < picDoc.length; i++) {
	    if (picDoc[i].id.substring (0, 7) == "foldpic" && picDoc[i].id != "foldpicAll") {
		var picLen = picDoc[i].src.length;
		var id = picDoc[i].id.substring (7, picDoc[i].id.length);
		var nested = document.getElementById('foldinglist' + id);
		var picAll = document.getElementById('foldpicAll');

		if (picDoc[i].src.substring ((picLen-15), picLen) == "arrow_right.gif") {
		    nested.style.display='none';
		    picAll.src = AllOpened();
		}

		else {
		    nested.style.display='';
		    picAll.src = AllOpened();
		}
	    }
	}
    }


    function swtch(id) // Функция, вызываемая при нажатии на индикатор ветви. Вызывается из изображения стрелки по onclick="swtch(id)".
    {
	var theDiv = document.getElementById('foldheader' + id);
	var picDiv = document.getElementById('foldpic' + id);
	var nested = document.getElementById('foldinglist' + id);
	var picAll = document.getElementById('foldpicAll');

	if (nested.style.display=="none")
	{
	    nested.style.display='';
	    picDiv.src="arrow_down.gif";
	    picAll.src = AllOpened();
	}

	else
	{
	    nested.style.display="none";
	    picDiv.src="arrow_right.gif";
	    picAll.src = "arrow_right.gif";
	}
    }


    function swtchAll() // Разворачивает и сворачивает все дерево по нажатию на индикатор его вершины. Вызывается onclick="swtchTreeAll()" из вершины дерева.
    {
	var picDiv = document.getElementById('foldpicAll');
	var picLen = picDiv.src.length;

	if (picDiv.src.substring ((picLen-15), picLen) == "arrow_right.gif") {
	    OpenAll();
	}

	else {
	    CloseAll();
	}
    }


    function OpenAll() // Разворачивает все дерево по нажатию на индикатор его вершины. Вызывается из функции swtchAll().
    {
	var arrayOful = document.getElementsByTagName("UL");
	var arrayOfimg = document.getElementsByTagName("IMG");

	for (var i = 0; i < arrayOful.length; i++) {
	    var g = arrayOful[i];
	    var g_param = g.id.substring(0, 11);

	    if (g_param == 'foldinglist') {
		g.style.display='';
	    }
	}

	for (var i = 0; i < arrayOfimg.length; i++) {
	    var g = arrayOfimg[i];
	    var g_param = g.id.substring(0, 7);

	    if (g_param == 'foldpic') {
		g.src="arrow_down.gif";
	    }
	}
    }


    function CloseAll() // Cворачивает все дерево по нажатию на индикатор его вершины. Вызывается из функции swtchAll().
    {
	var arrayOful = document.getElementsByTagName("UL");
	var arrayOfimg = document.getElementsByTagName("IMG");

	for (var i = 0; i < arrayOful.length; i++) {
	    var g = arrayOful[i];
	    var g_param = g.id.substring(0, 11);

	    if (g_param == 'foldinglist') {
		g.style.display='none';
	    }
	}

	for (var i = 0; i < arrayOfimg.length; i++) {
	    var g = arrayOfimg[i];
	    var g_param = g.id.substring(0, 7);

	    if (g_param == 'foldpic') {
		g.src="arrow_right.gif";
	    }
	}
    }


    function AllOpened() // Передает в функцию swtch(id) указание на установку индикатора вершины дерева в зависимости от того, все ли ветви дерева открыты или нет.Вызывается из функции swtch(id).
    {
	var arrayOful = document.getElementsByTagName("UL");
	var len = arrayOful.length;

	for (var i = 0 ; i < len ; i++) {

	    if (arrayOful[i].id.substring(0, 11) == 'foldinglist' && arrayOful[i].style.display == 'none') {
		return ("arrow_right.gif");
	    }
	}
	return ("arrow_down.gif");
    }