// Счетчик созданных к данному времени экземпляров объекта PopupTip
var jsps_PT_counter = 0;
// Список всех созданных к данному времени экземпляров объекта PopupTip
var jsps_PT_list = new Array();
// Функция-конструктор
function PopupTip(pClassName)
{
// Создаем свободно позиционируемый контейнер, который и будет 
// реализовывать всплывающие подсказки, и задаем его стиль
var popupElement = document.createElement("DIV");
if (pClassName)
popupElement.className = pClassName
else
{
	popupElement.style.backgroundColor = "#FFFFCC";
	popupElement.style.borderLeftStyle = "solid";
	popupElement.style.borderLeftColor = "#CCCCCC";
	popupElement.style.borderLeftWidth = "1";
	popupElement.style.borderTopStyle = "solid";
	popupElement.style.borderTopColor = "#CCCCCC";
	popupElement.style.borderTopWidth = "1";
	popupElement.style.borderRightStyle = "solid";
	popupElement.style.borderRightColor = "#CCCCCC"; 
	popupElement.style.borderRightWidth - "1"; 
	popupElement.style.borderBottomStyle = "solid";
	popupElement.style.borderBottomColor = "#CCCCCC";
	popupElement.style.borderBottomWidth = "1";
	popupElement.style.paddingLeft = "2"; 
	popupElement.style.paddingTop = "1";
	popupElement.style.paddingRight = "2";
	popupElement.style.paddingBottom = "1";
	popupElement.style.fontSize = "80%";
	}
popupElement.style.position = "absolute";
popupElement.style.visibility = "hidden";
var tipText = document.createTextNode("");
popupElement.appendChild(tipText);
document.body.appendChild(popupElement);
// Объявляем общедоступные свойства и методы
this.popupTipStyle = popupElement.style;
this.enabled = true;
this.setTip = mjspsPTSetTip;
this.removeTip = mjspsPTRemoveTip;
// Список всех всплывающих подсказок
this.tips = new Array(); 
//Объявляем различные служебные свойства
this.popup = popupElement;
var piObject = jspsGetProgramInfo();
this.isIEorOpera = ((piObject.programName == JSPS_GPI_MSIE) ||(piObject.programName == JSPS_GPI_OPERA));
// Номер данного экземпляра объекта в списке jsps_PT_list
this.myNumber = jsps_PT_counter;
// Заносим данный экземпляр объекта в список jsps_PT_list
jsps_PT_list[jsps_PT_counter] = this;
// Увеличиваем счетчик экземпляров этого объекта на единицу,
// подготавливая его для создания нового экземпляра
jsps_PT_counter++;
}
// Служебная функция, возвращающая индекс элемента массива tips,
// соответствующего переданному ей элементу страницы (параметр pElement)
function jspsPTGetElementIndex(pPTObject, pElement)
{
	var elementIndex = -1;
for (var i = 0; i < pPTObject.tips.length; i++)
if (pPTObject.tips[i][0] == pElement)
elementIndex = i;
return elementIndex;
}
// Функция, реализующая метод setTip
function mjspsPTSetTip(pElement, pTipText)
{
// Проверяем, передан ли параметр pTipText, и, если не передан,
// извлекаем текст подсказки из свойства title
var isTipInTitle = false;
if (!pTipText)
{
	pTipText = pElement.title;
// "Позаимствовав" текст подсказки из свойства title, не
// забудем присвоить этому свойству пустую строку, чтобы подавить
// вывод всплывающих подсказок самим Web-обозревателем
pElement.title = "";
// Признак, был ли текст подсказки взят из свойства title
isTipInTitle = true;
}
// Проверяем, не находится ли уже в массиве tips текст подсказки для
// данного элемента страницы
var elementIndex = jspsPTGetElementIndex(this, pElement);
if (elementIndex == -1)
{
// Если подсказка для данного элемента страницы еще не создана,
// добавляем ее в массив tips
if (this.isIEorOpera)
{
//В случае Internet Explorer и Opera мы сначала сохраняем
// уже привязанные к событиям onMouseOver и onMouseOut этого
// элемента страницы обработчики 
var onMouseOverHandler = null;
var onMouseOutHandler = null;
if (pElement.onmouseover)
onMouseOverHandler = pElement.onmouseover;
if (pElement.onmouseout)
onMouseOutHandler = pElement.onmouseout;
// Создаем новый элемент массива tips, который сам является
// массивом. Вот элементы вложенного массива: элемент
// страницы, текст подсказки, признак, был ли этот текст 
// взят из свойства title, и сохраненные ранее обработчики
// событий onMouseOver и onMouseOut
this.tips[this.tips.length] = new Array(pElement, pTipText, isTipInTitle, onMouseOverHandler, onMouseOutHandler);
// Привязываем обработчики к событиям элемента
pElement.onmouseover = jspsPTShowPopupTipIEandOpera;
pElement.onmouseout = jspsPTHidePopupTipIEandOpera;
}
else
{
// В случае Firefox все несколько проще. Вложенный массив

// будет содержать только элемент страницы, текст подсказки и

// признак, был ли этот текст взят из свойства title

this.tips[this.tips.length] = new Array(pElement, pTipText, isTipInTitle) ;

// Привязываем функции-слушатели к событиям элемента
pElement.addEventListener("mouseover", jspsPTShowPopupTipFF, false);
pElement.addEventListener("mouseout", jspsPTHidePopupTipFF, false);
}
// Создаем в экземпляре объекта, соответствующем элементу
// страницы, свойство ptobjectNumber и присваиваем ему
// порядковый номер экземпляра объекта PopupTip в массиве
// jsps_PT_list. Он понадобится нам, чтобы получить доступ
//к экземпляру этого объекта из функций-обработчиков событий
//и функций-слушателей
pElement.ptObjectNumber = this.myNumber;
}
else
{
// Если же к данному элементу страницы уже была привязана 
// подсказка, мы только меняем ее текст
this.tips[elementIndex][1] = pTipText;
this.tips[elementIndex][2] = isTipInTitle;
}
 }
// Функция, реализующая метод removeTip
function mjspsPTRemoveTip(pElement)
{
// Получаем индекс элемента массива, где хранится текст подсказки
// для данного элемента страницы
var elementIndex = jspsPTGetElementIndex(this, pElement);
if (elementIndex > -1)
{
if (this.isIEorOpera)
{
// В случае Internet Explorer и Opera возвращаем на место
// сохраненные обработчики событий или, если таковых нет,
// просто их удаляем
pElement.onmouseover = (this.tips[elementIndex][3]) ?
this.tips [elementIndex][3] : null;
pElement.onmouseout = (this.tips[elementIndex][4]) ?
this.tips [elementIndex][4] : null;
}
else
{
	//В случае Firefox удаляем функции-слушатели событий
	pElement.removeEventListener("mouseover", jspsPTShowPcpupTipFF, false);
	pElement.removeEventListener("mouseout", jspsPTHidePopupTipFF, false);
	}
	// Если текст подсказки был взят из свойства title, возвращаем
	// его снова в это свойство
	if (this.tips[elementIndex][5])
pElement.title = this.tips[elementIndex][5];
// Удаляем элемент массива tips, соответствующий данному элементу 
// страницы
delete this.tips[elementIndex];
this.tips.splice(elementIndex, 1);
// Удаляем созданное ранее свойство ptObjectNumber
pElement.removeAttribute("ptObjectNumber");
}
 }
// Функция, выводящая подсказку для Internet Explorer и Opera
function jspsPTShowPopupTipIEandOpera()
{
// Получаем экземпляр объекта PopupTip по его порядковому номеру
var src = event.srcElement;
var my = jsps_PT_list[src.ptObjectNumber];
// Получаем индекс элемента массива, где хранится текст подсказки
// для данного элемента страницы
var elementIndex = jspsPTGetElementIndex(my, src);
if (elementIndex > -1)
{
	var el = my.tips[elementIndex];
// Вызываем сохраненный обработчик события onMouseOver
if (el[3]) el[3]();
if (my.enabled)
{
// Выводим подсказку на экран
my.popup.firstChild.nodeValue = el[1];
my.popupTipStyle.left = event.clientX +20;
// Располагаем всплывающую подсказку под элементом страницы.
// Свойства offsetTop и offsetHeight объекта,
// соответствующего элементу страницы, возвращают
// вертикальную координату верхнего левого угла
// этого элемента страницы и его высоту соответственно
my.popupTipStyle.top = src.offsetTop + src.offsetHeight;
my.popupTipStyle.visibility = "visible";
}
 }
  }
// Функция, прячущая подсказку для Internet Explorer и Opera
function jspsPTHidePopupTipIEandOpera()
{
	// Получаем экземпляр объекта PopupTip по его порядковому номеру
	var src = event.srcElement;
	var my = jsps_PT_list[src.ptObjectNumber];
// Получаем индекс элемента массива, где хранится текст подсказки 
// для данного элемента страницы
var elementIndex = jspsPTGetElementIndex(my, src);
if (elementIndex > -1)
{
// Убираем подсказку с экрана
my.popupTipStyle.visibility = "hidden";
var el = my.tips[elementIndex];
// Вызываем сохраненный обработчик события onMouseOut
if (el[4]) el[4]();
}
 }
// Функция, выводящая подсказку для Firefox
function jspsPTShowPopupTipFF(event)
{
// Получаем экземпляр объекта PopupTip по его порядковому номеру
var src = event.target;
var my = jsps_PT_list[src.ptObjectNumber];
if (my.enabled)
{
// Получаем индекс элемента массива, где хранится текст подсказки
// для данного элемента страницы
var elementIndex = jspsPTGetElementIndex(my, src);
if (elementIndex > -1)
{
// Выводим подсказку на экран
my.popup.firstChild.nodeValue = my.tips[elementIndex][1];
my.popupTipStyle.left = event.clientX +20;
// Располагаем всплывающую подсказку под элементом страницы.
// Свойства offsetTop и offsetHeight объекта,
// соответствующего элементу страницы, возвращают
// вертикальную координату верхнего левого угла
// этого элемента страницы и его высоту соответственно
my.popupTipStyle.top = src.offsetTop + src.offsetHeight;
my.popupTipStyle.visibility = "visible";
} 
 }
  }

// Функция, прячущая подсказку для Firefox
function jspsPTHidePopupTipFF(event)
{
// Получаем экземпляр объекта PopupTip по его порядковому номеру
var src = event.target;
var my = jsps_PT_list[src.ptObjectNumber];
// Получаем индекс элемента массива, где хранится текст подсказки
// для данного элемента страницы
var elementIndex = jspsPTGetElementIndex(my, src);
if (elementIndex > -1)
// Убираем подсказку с экрана
my.popupTipStyle.visibility = "hidden";
}


