// базовые переменные для выплывающих вкладок
var Insets = Array();
Insets["left"] = Array(); // массив с параметрами
Insets["left"]["main"] = 'leftinsets'; // главный блок с вкладками, его двигает Эксплорер
Insets["left"]["container"] = 'leftcontainer'; // контейнер с вкладками
Insets["left"]["name"] = 'linset'; // общее название вкладок
Insets["left"]["project"] = 0; // базовый проект (его вкладка никогда не убирается)
Insets["left"]["max"] = 5; // общее количество вкладок
Insets["left"]["height"] = 106; // высота одной вкладки
Insets["left"]["width"] = 252; // ширина одной вкладки
Insets["left"]["separator"] = 2; // расстояние между вкладками
Insets["left"]["indent"] = 237; // размер скрытой области вкладки
Insets["left"]["delay"] = 10; // задержка по времени для вывода/сокрытия вкладок при выплывании
Insets["left"]["removal"] = 17; // шаг смещения вкладки при выплывании/сворачивании
Insets["left"]["position"] = Array(); // массив с параметрами текущего положения для каждой вкладки
Insets["left"]["direction"] = Array(); // массив со смещением развертывания/сворачивания для каждой вкладки
Insets["left"]["open"] = Array(); // массив со статусами развернутости/свернутости для каждой вкладки
Insets["left"]["timer"] = Array(); // идентификатор таймаута для вывода/скрытия вкладки
Insets["left"]["hidedcount"] = 4; // количество итераций для вывода/скрытия названия вкладки
Insets["left"]["hidedremoval"] = 3; // шаг смещения при каждой итерации для вывода/скрытия названия вкладки
Insets["left"]["hidedtimer"] = 0; // идентификатор таймаута для вывода/скрытия названия вкладки
Insets["left"]["move"] = true; // статус, можно ли двигать названия вкладок
Insets["left"]["hided"] = false; // статус, скрыты ли названия вкладок


// позиционируем вкладки по центру нужной стороны экрана и отображаем блок с ними
// prefix - идентификатор нужного массива с параметрами
function Insets_Middle(prefix)
{
	// вычисляем ширину и высоту
	var width = (document.compatMode == 'CSS1Compat' && !window.opera) ? document.documentElement.clientWidth : document.body.clientWidth;
	var height = (document.compatMode == 'CSS1Compat' && !window.opera) ? document.documentElement.clientHeight : document.body.clientHeight;
	var nextpos = 0; // переменная для длины блока с вкладками
	var middle = 0; // переменная со значением отступа для позиционирования блока вкладок
	// если позиционирование вкладок слева или справа 
	if (prefix == "left" || prefix == "right")
	{
		// вычисляем общую длину блока с вкладками
		for (var i = 0; i < Insets[prefix]["max"]; i++)
		{			
			nextpos += Insets[prefix]["height"] + Insets[prefix]["separator"];
		}
		middle = (height/2) - (nextpos/2); // вычисляем точку начала блока вкладок
		// двигаем вкладки на нужную величину (с круглением)
		if(document.layers)
		{
			document.layers[Insets[prefix]["container"]].top = middle.toFixed(0);
		}
		else
		{
			document.getElementById(Insets[prefix]["container"]).style.top = middle.toFixed(0);
		}
	}
	// если позиционирование вкладок сверху или снизу
	if (prefix == "top" || prefix == "bottom")
	{
		// вычисляем общую длину блока с вкладками
		for (var i = 0; i < Insets[prefix]["max"]; i++)
		{			
			nextpos += Insets[prefix]["width"] + Insets[prefix]["separator"];
		}
		middle = (height/2) - (nextpos/2); // вычисляем точку начала блока вкладок
		// двигаем вкладки на нужную величину
		if(document.layers)
		{
			document.layers[Insets[prefix]["container"]].left = middle;
		}
		else
		{
			document.getElementById(Insets[prefix]["container"]).style.left = middle;
		}
	}
	// отображаем блок вкладок на экране
	document.getElementById(Insets[prefix]["main"]).style.display = "block";
}


// инициализируем базовые значения для всех вкладок
// prefix - идентификатор нужного массива с параметрами
function Insets_Initialize(prefix)
{
	// устанавливаем значения для каждой вкладки
	for (var i = 0; i < Insets[prefix]["max"]; i++)
	{
		Insets[prefix]["position"][i] = 0;
		Insets[prefix]["direction"][i] = -Insets[prefix]["removal"];
		Insets[prefix]["open"][i] = false;
	}
	// устанавливаем статусы скрытости и движения названий вкладок
	Insets[prefix]["hided"] = false;
	Insets[prefix]["move"] = true;
}


// задаем состояние открытой/закрытой вкладки при клике
// prefix - идентификатор нужного массива с параметрами
// m - номер вкладки, на которой произошло нажатие мыши
function Insets_GetOpenClose(prefix, m)
{
	// если нет смещения вкладки, то она будет открыта
	if (Insets[prefix]["position"][m] <= 0)
	{
		Insets[prefix]["open"][m] = true;
		Insets[prefix]["timer"][m] = setTimeout("Insets_Show_Close('" + prefix + "', " + m + ")", 2000);
	}
	// если есть смещение вкладки, то ее будут закрывать
	else if (Insets[prefix]["position"][m] >= Insets[prefix]["indent"])
	{
		Insets[prefix]["open"][m] = false;
	}
}


// инициируем движение вкладок
// prefix - идентификатор нужного массива с параметрами
// m - номер вкладки, на которой произошло нажатие мыши
function Insets_Show_Close(prefix, m)
{
	// очищаем таймаут, во избежание
	clearTimeout(Insets[prefix]["timer"][m]);
	// проходимся по всем вкладкам и скрываем ненужные
	for (var i = 0; i < Insets[prefix]["max"]; i++)
	{
		// если вкладка показана и не вызванная вкладка
		if (m != i && Insets[prefix]["position"][i] > 0)
		{
			Insets[prefix]["direction"][i] = -Insets[prefix]["removal"]; // задаем шаг сворачивания
			// вызываем функцию смещения для сворачивания вкладки
			if (Insets[prefix]["position"][i] >= 0)
			{
				Insets_Move(prefix, i);
			}
		}
	}
	// двигаем необходимую вкладку
	Insets[prefix]["direction"][m] = -Insets[prefix]["direction"][m]; // задаем шаг развертывания/свертывания
	// если вкладка развернута, свернута или в движении вызываем функцию смещения
	if (Insets[prefix]["position"][m] <= 0 || Insets[prefix]["position"][m] >= Insets[prefix]["indent"])
	{
		Insets_Move(prefix, m);
	}
}


// двигаем конкретную вкладку
// prefix - идентификатор нужного массива с параметрами
// m - номер вкладки, на которой произошло нажатие мыши
function Insets_Move(prefix, m)
{
	// устанавливаем позицию смещения для вкладки
	Insets[prefix]["position"][m] += Insets[prefix]["direction"][m];
	// в зависимости от браузера смещаем вкладку на нужную позицию
	if (document.layers)
	{
		document.layers[Insets[prefix]["name"] + m].left = Insets[prefix]["position"][m] + "px";
	}
	else
	{
		document.getElementById(Insets[prefix]["name"] + m).style.left = Insets[prefix]["position"][m] + "px";
	}
	// если еще не достигли предела перемещения, то рекурсия
	if (Insets[prefix]["position"][m] > 0 && Insets[prefix]["position"][m] < Insets[prefix]["indent"])
	{
		setTimeout("Insets_Move('" + prefix + "', " + m + ")", Insets[prefix]["delay"]);
	}
	// если предел перемещения достигнут
	else
	{
		// если открыли вкладку
		if (Insets[prefix]["position"][m] >= Insets[prefix]["indent"])
		{
			Insets[prefix]["open"][m] = true; // статус - вкладка открыта
			clearTimeout(Insets[prefix]["hidedtimer"]); // очищаем возможные таймауты от перемещения мыши
			Insets[prefix]["move"] = false; // двигать имена нельзя
		}
		// если закрыли вкладку
		if (Insets[prefix]["position"][m] <= 0)
		{
			clearTimeout(Insets[prefix]["timer"][m]);
			Insets[prefix]["open"][m] = false; // статус - вкладка закрыта
			Insets[prefix]["move"] = true; // двигать имена можно
		}
		// если при смещении вкладка превысила допустимые границы
		if (Insets[prefix]["position"][m] > Insets[prefix]["indent"] || Insets[prefix]["position"][m] < 0)
		{
			// если вкладка открыта - ставим смещение на максимально допустимое
			Insets[prefix]["position"][m] = (Insets[prefix]["position"][m] > Insets[prefix]["indent"]) ? Insets[prefix]["indent"] : Insets[prefix]["position"][m];
			// если вкладка открыта - ставим смещение на минимально допустимое
			Insets[prefix]["position"][m] = (Insets[prefix]["position"][m] < 0) ? 0 : Insets[prefix]["position"][m];
			// в зависимости от браузера смещаем вкладку на нужную позицию
			if (document.layers)
			{
				document.layers[Insets[prefix]["name"] + m].left = Insets[prefix]["position"][m] + "px";
			}
			else
			{
				document.getElementById(Insets[prefix]["name"] + m).style.left = Insets[prefix]["position"][m] + "px";
			}
		}
		// если двигать имена можно и они не скрыты
		if (Insets[prefix]["move"] && Insets[prefix]["hided"] == false)
		{
			clearTimeout(Insets[prefix]["hidedtimer"]); // очищаем предидущий таймаут скрытия/вывода имен
			Insets[prefix]["hidedtimer"] = setTimeout("Insets_Hided('" + prefix + "')", 5000); // задаем новый таймаут скрытия/вывода имен
		}
	}
}


// автоматически скрываем вкладку, если мышка с нее ушла и отменяем если вернулась
// prefix - идентификатор нужного массива с параметрами
// m - номер вкладки, на которой произошло нажатие мыши
// status - статус, скрываем или нет
function Insets_Auto_Hide(prefix, m, status)
{
	// сделали небольшую паузу и понеслась...
	// если вкладка открыта или проверочный статус это подтверждает
	if (Insets[prefix]["open"][m] == true)
	{
		clearTimeout(Insets[prefix]["timer"][m]); // очищаем таймаут скрытия вкладки
		Insets[prefix]["open"][m] = true; // ставим положительный статус открытия вкладки
		// если мышка с вкладки ушла
		if (status != 0)
		{
			Insets[prefix]["timer"][m] = setTimeout("Insets_Show_Close('" + prefix + "', " + m + ")", 2000); // задаем новый таймаут скрытия/вывода вкладки
		}
	}
	// если вкладка закрыта
	else
	{
		if (status != 0)
		{
			clearTimeout(Insets[prefix]["timer"][m]); // очищаем таймаут скрытия вкладки
		}
		// если можно двигать имена вкладок
		if (Insets[prefix]["move"])
		{
			clearTimeout(Insets[prefix]["hidedtimer"]); // очищаем таймаут скрытия/вывода имен
			// если мышь над вкладкой а статус имен стоит как свернутые
			if (status == 0 && Insets[prefix]["hided"])
			{
				Insets[prefix]["hided"] = false; // ставим статус имен на открытые
				setTimeout("Insets_Hided('" + prefix + "')", Insets[prefix]["delay"]); // задаем новый таймаут скрытия/вывода имен
			}
			// если мышь не над вкладкой
			else if (status != 0)
			{
				Insets[prefix]["hidedtimer"] = setTimeout("Insets_Hided('" + prefix + "')", 5000); // задаем новый таймаут скрытия/вывода имен
			}
		}
	}
}


// инициируем движение имен вкладок
// prefix - идентификатор нужного массива с параметрами
function Insets_Hided(prefix)
{
	// ели можно двигать имена
	if (Insets[prefix]["move"])
	{
		var indent = -(Insets[prefix]["hidedremoval"]*Insets[prefix]["hidedcount"]); // задаем переменную со смещением для всех имен
		// проходимся по всем вкладкам и скрываем ненужные имена
		
		for (var i = 0; i < Insets[prefix]["max"]; i++)
		{
			// если вкладка не открыта, не является базовой и не скрыто имя
			if (Insets[prefix]["open"][i] == false && i != Insets[prefix]["project"] && Insets[prefix]["position"][i] >= 0)
			{
				Insets[prefix]["hided"] = true; // ставим статус скрытости имени
				Insets[prefix]["direction"][i] = -Insets[prefix]["hidedremoval"]; // заадаем шаг и направление смещения 
				// ставим таймаут для смещения имени
				Insets[prefix]["hidedtimer"] = setTimeout("Insets_HidedMove('" + prefix + "', " + i + ")", Insets[prefix]["delay"]);
			}
			// если вкладка открыта, не является базовой и скрыто имя
			if (Insets[prefix]["open"][i] == false && i != Insets[prefix]["project"] && Insets[prefix]["position"][i] <= indent)
			{
				Insets[prefix]["hided"] = false; // ставим статус скрытости имени
				Insets[prefix]["direction"][i] = -Insets[prefix]["direction"][i]; // заадаем шаг и направление смещения 
				// ставим таймаут для смещения имени
				Insets[prefix]["hidedtimer"] = setTimeout("Insets_HidedMove('" + prefix + "', " + i + ")", Insets[prefix]["delay"]);
			}
		}
	}
}


// двигаем имена у вкладок
// prefix - идентификатор нужного массива с параметрами
// m - номер вкладки, на которой произошло нажатие мыши
function Insets_HidedMove(prefix, m)
{
	// если имена можно дввигать
	if (Insets[prefix]["move"])
	{
		var indent = -(Insets[prefix]["hidedremoval"]*Insets[prefix]["hidedcount"]); // задаем переменную со смещением для всех имен
		Insets[prefix]["position"][m] += Insets[prefix]["direction"][m]; // задаем новую позицию для имени
		// в зависимости от браузера смещаем вкладку на нужную позицию
		if (document.layers)
		{
			document.layers[Insets[prefix]["name"] + m].left = Insets[prefix]["position"][m] + "px";
		}
		else
		{
			document.getElementById(Insets[prefix]["name"] + m).style.left = Insets[prefix]["position"][m] + "px";
		}
		// если предельные значения смещения еще не достигнуты, то рекурсия
		if (Insets[prefix]["position"][m] > indent && Insets[prefix]["position"][m] < 0)
		{
			setTimeout("Insets_HidedMove('" + prefix + "', " + m + ")", Insets[prefix]["delay"]);
		}
		// если предельные значения смещения достигнуты
		else
		{
			// если при смещении имя превысило допустимые границы
			if (Insets[prefix]["position"][m] > 0 || Insets[prefix]["position"][m] < indent)
			{
				// если имя не отображается, задаем минимально допустимое смещение
				Insets[prefix]["position"][m] = (Insets[prefix]["position"][m] > 0) ? 0 : Insets[prefix]["position"][m];
				// если имя отображается, задаем максимально допустимое смещение
				Insets[prefix]["position"][m] = (Insets[prefix]["position"][m] < indent) ? indent : Insets[prefix]["position"][m];
				// в зависимости от браузера смещаем вкладку на нужную позицию
				if (document.layers)
				{
					document.layers[Insets[prefix]["name"] + m].left = Insets[prefix]["position"][m] + "px";
				}
				else
				{
					document.getElementById(Insets[prefix]["name"] + m).style.left = Insets[prefix]["position"][m] + "px";
				}
			}
			// обнуляем шаг и направление смещения
			Insets[prefix]["direction"][m] = (Insets[prefix]["position"][m] == 0) ? -Insets[prefix]["removal"] : Insets[prefix]["direction"][m];
		}
	}
}