/*
 * Градусник, вер. 3
 * (c) Art. Lebedev Studio <http://www.artlebedev.ru/>
 * 2006-06-26
 * Автор: Leechy <leechy@design.ru>
 */

/* имена элементов и классов  */
var sThermoListTag = 'ul';                       /* тэг элемента, содержащий градусник  */
var sThermoListClass = 'thermo';                 /* класс элемента градусника  */

var sThermoItemTag = 'li';                       /* тэг пункта градусника  */
var sThermoItemClass = 'item';                   /* если нужно взять все такие элементы, класс == пустая строка  */

var sThermoItemOver = 'over';                    /* класс элемента при наведении мыши  */
var sThermoItemOpen = 'open';                    /* класс элемента при открытом подменю  */

var sThermoImagesTag = 's'                       /* тэг в котором хранятся картинки  */
var sThermoImageOverClass = 'over';              /* класс картинки, появляющаяся при наведении мыши  */
var eThermoImageOver = new Image();
eThermoImageOver.src = '/images/menu_arrow_up_down.gif';        /* прелоад картинки  */

	/* списки с пунктами подменю  */
var sThermoMenuListPrefix = 'thermo';            /* префикс, дописываемый к ID списка с пунктами  */
var sThermoMenuItemTag = 'li';                   /* тэг пункта подменю (должен быть ребенок списка)  */
var sThermoMenuItemTagsToCopy = 'span,a';        /* тэги, элементов, которых нужно копировать  */

	/* подменю    */
var sThermoSubMenuTag = 'div';                   /*   тэг контейнера подменю    */
var sThermoSubMenuClass = 'sub-menu';            /*   класс контейнера подменю    */
var sThermoSubMenuLinksTag = 'div';              /*   тэг контейнера пунктов подменю    */
var sThermoSubMenuLinksClass = 'sub-menu-links'; /*   класс контейнера пунктов подменю    */
var sThermoSubMenuItemTag = 'div';               /*   тэг элемента с пунктом    */
var sThermoSubMenuItemClass = '';                /*   класс элемента с пунктом    */
var bThermoCopySubMenuItemClass = true;          /*   копировать ли также классы оригинала    */


	/*   дополнительный код    */
var sThermoItemAdditionalHTML = ''; 
                                                 /*   код, который будет вставлен в начале каждого пункта    */

var sThermoSubMenuAdditionalHTML = '';
                                                 /*   код, который будет вставлен в начале каждого подменю    */

var sThermoSubMenuTagAfterTag = 'div';           /*   элемент после пунктов подменю    */
var sThermoSubMenuTagAfterClass = 'bot-border';  /*   класс элемента после пунктов подменю    */


function ThermoItem(oThermo, eThermoItem) {
	this.eThermoItem = eThermoItem;
	this.oThermo = oThermo;
	var eThis = this;

	this.eMenu = null;

	/*   назначаем обработчиков событий    */
//	cmnAdd_event(eThermoItem, 'mouseover', function(){ eThis.itemOver() });
	cmnAdd_event(eThermoItem, 'mouseout', function(){ eThis.itemOut() });
//	cmnAdd_event(eThermoItem, 'mousedown', function(evt){ eThis.itemClick(evt) });

	cmnAdd_event(eThermoItem, 'mouseover', function(evt){ eThis.itemOver(); eThis.itemClick(evt) });

	/*   добавляем картинку со стрелками, если есть куда    */
	var eImagesContainer = eThermoItem.getElementsByTagName( sThermoImagesTag )[0];
	if (eImagesContainer) {
		var eOverImage = document.createElement('img');
		eOverImage.src = eThermoImageOver.src;
		eOverImage.className = sThermoImageOverClass;
		eImagesContainer.appendChild(eOverImage);
	}
	
	/*   добавляем дополнительный код (в начале)    */
	if (sThermoItemAdditionalHTML && sThermoItemAdditionalHTML != '') {
		eThermoItem.innerHTML = sThermoItemAdditionalHTML + eThermoItem.innerHTML;
	}

	return this;
}

/*   функция, вызываемая при наведении мыши на элемент градусника    */
ThermoItem.prototype.itemOver = function() {

	if (this && this.eThermoItem && window.cmnSet_class && this.oThermo.oItemOpened != this) {
		cmnSet_class(this.eThermoItem, sThermoItemOver);
	}
}

/*   функция... при убирания мыши с элемента градусника    */
ThermoItem.prototype.itemOut = function() {
	if (this && this.eThermoItem && window.cmnRemove_class) {
		cmnRemove_class(this.eThermoItem, sThermoItemOver);
	}
}

/*   функция... при клике на элемент градусника    */
ThermoItem.prototype.itemClick = function(evt) {

	if (!evt) evt = window.event;
	var eTarget = (evt.target)? evt.target : evt.srcElement;
	/*   если нажали на картинку - открываем меню
	   проверка "где нажали",если нужно иное поведение, делается именно здесь!    */
	if (eTarget && eTarget.tagName && eTarget.tagName.toLowerCase() == 'img') {
		this.showMenu();
		evt.cancelBubble = true;
		if (evt.stopPropagation) evt.stopPropagation();
		if (evt.preventDefault) evt.preventDefault();
			else if (evt.returnValue) evt.returnValue = false;
		return false;
	}
	return true;
}


/*   показывает меню   */
ThermoItem.prototype.showMenu = function() {
	if (this && this.eThermoItem && this.oThermo) {
		if (!this.eMenu) this.createMenu();
		/*   скрываем другого меню, если оно открыто    */
		if (this.oThermo.oItemOpened) this.oThermo.hideMenu();

		/*   показываем меню   */
		this.eThermoItem.style.zIndex = ++this.oThermo.iZIndex;
		cmnRemove_class(this.eThermoItem, sThermoItemOver);
		cmnSet_class(this.eThermoItem, sThermoItemOpen);
		this.oThermo.oItemOpened = this;
		oActiveThermo = this.oThermo;
	}
}

/*   создает меню   */
ThermoItem.prototype.createMenu = function() {
	if (this && this.eThermoItem && this.eThermoItem.id) {
		var eMenuList = document.getElementById( sThermoMenuListPrefix + this.eThermoItem.id );
		if (eMenuList) {
			/*   создаем элемент подменю    */
			var eSubMenu = document.createElement( sThermoSubMenuTag );
			/*   добавляем ему класс (если необходимо)    */
			if (sThermoSubMenuClass != '') eSubMenu.className = sThermoSubMenuClass;

			/*   создаем контейнер пунктов    */
			var eSubMenuLinks = document.createElement( sThermoSubMenuLinksTag );
			if (sThermoSubMenuLinksClass != '') eSubMenuLinks.className = sThermoSubMenuLinksClass;

			/*   наполняем его пунктами    */
			for (var i = 0; i < eMenuList.childNodes.length; i++) {
				var eChild = eMenuList.childNodes.item(i);
				if (eChild.nodeType == 1 && eChild.tagName.toLowerCase() == sThermoMenuItemTag) {
					/*   создаем элемент с пунктом    */
					var eItem = document.createElement( sThermoSubMenuItemTag );
					/*   добавляем класс   */
					if (sThermoSubMenuItemClass != '') eItem.className = sThermoSubMenuItemClass;
					/*   если нужно копировать класс, копируем    */
					if (bThermoCopySubMenuItemClass) {
						if (eItem.className && eItem.className.length) eItem.className += ' ';
						eItem.className += eChild.className;
					}
					/*   перемещаем элемент    */
					var aElementToCopy = getFirstChildByTagName(sThermoMenuItemTagsToCopy, eChild)
					if (aElementToCopy) eItem.appendChild(aElementToCopy);
					/*   добавляем элемент в под-меню    */
					eSubMenuLinks.appendChild(eItem);
				}
			}
			
			/*   если есть код, которого нужно вставлять перед списком пунктов (например, ради закруглений)    */
			if (sThermoSubMenuAdditionalHTML && sThermoSubMenuAdditionalHTML != '') {
				eSubMenu.innerHTML = sThermoSubMenuAdditionalHTML;
			}
			/*   потом добавляем список пунктов    */
			eSubMenu.appendChild(eSubMenuLinks);

			/*   дальше, если нужно еще элемент добавить - добавляем    */
			if (sThermoSubMenuTagAfterTag && sThermoSubMenuTagAfterTag != '') {
				var eAddElement = document.createElement( sThermoSubMenuTagAfterTag );
				if (sThermoSubMenuTagAfterClass && sThermoSubMenuTagAfterClass != '')
					eAddElement.className = sThermoSubMenuTagAfterClass
				eSubMenu.appendChild(eAddElement);
			}


			/*   делаем ссылку на меню (на всякий случай)    */
			this.eMenu = eSubMenu;
			
			/*   приделываем обработчики    */
			var eThis = this;
			cmnAdd_event(eSubMenu, 'mousedown', function(evt){ eThis.menuDown(evt) })
			cmnAdd_event(eSubMenu, 'click', function(evt){ eThis.menuClick(evt) })

			/*   добавляем под-меню в пункт градусника    */
			this.eThermoItem.appendChild(eSubMenu);

			/*   если это Fx 1.0 - нужно фиксить ширину!    */
			if (navigator.product && navigator.product == 'Gecko' && navigator.userAgent.indexOf('rv:') > 0 && eSubMenuLinks) {
				if (!this.oThermo.aItems.forEach) {
					var iMaxWidth = 0;
					cmnSet_class(eSubMenu, 'sub-menu-invisible');
					for (var i = 0; i < eSubMenuLinks.childNodes.length; i++) {
						var iItemWidth = eSubMenuLinks.childNodes.item(i).offsetWidth;
						if (iItemWidth > iMaxWidth) iMaxWidth = iItemWidth;
					}
					eSubMenu.style.width = iMaxWidth;
					cmnRemove_class(eSubMenu, 'sub-menu-invisible');
				}
			}
		}
	}
}

/*   нажатие на подменю    */
ThermoItem.prototype.menuDown = function(evt) {
	if (!evt) evt = window.event;
	var eTarget = (evt.target)? evt.target : evt.srcElement;

	evt.stopPropagation;
	evt.cancelBubble = true;
	return false;
}

/*   клик по подменю    */
ThermoItem.prototype.menuClick = function(evt) {
	if (!evt) evt = window.event;
	var eTarget = (evt.target)? evt.target : evt.srcElement;

	if (eTarget && eTarget.tagName && eTarget.tagName.toLowerCase() == 'a') {
		if (this.oThermo) this.oThermo.hideMenu();
	}
	return false;
}



/*   объект THermo - содержит градусник, одна штука    */
function Thermo(eThermoList) {
	this.eThermoList = eThermoList;
	this.iZIndex = 100;
	this.oMenuOpened = null;

	var eThis = this;
	
	/*   достаем всех элементов <li> внутри списка с заданным классом (или все, если класс == '')    */
	this.aItems = new Array();
	for (var i = 0; (eItem = eThermoList.getElementsByTagName( sThermoItemTag )[i]); i++) {
		if (sThermoItemClass != '' && eItem.className.indexOf( sThermoItemClass ) >= 0) {
			this.aItems[this.aItems.length] = new ThermoItem(eThis, eItem);
		}
	}
	return this;
}

/*   скрывает меню    */
Thermo.prototype.hideMenu = function() {
	if (this && this.oItemOpened) {
		cmnRemove_class(this.oItemOpened.eThermoItem, sThermoItemOver);
		cmnRemove_class(this.oItemOpened.eThermoItem, sThermoItemOpen);
		this.oItemOpened = null;
	}
}


function closeActiveThermo() {
	if (oActiveThermo) {
		oActiveThermo.hideMenu();
		oActiveThermo = null;
	}
	return true;
}


var aThermometers = new Array();
var oActiveThermo = null;
function initThermometers() {
	for (var i = 0; (eList = document.getElementsByTagName( sThermoListTag )[i]); i++) {
		if (eList.className.indexOf( sThermoListClass ) >= 0) {
			aThermometers[aThermometers.length] = new Thermo(eList);
		}
	}
}

if (window.cmnAdd_event) {
	cmnAdd_event(window, 'load', initThermometers);
	cmnAdd_event(document, 'mousedown', closeActiveThermo);
}




/*   additional    */

function getFirstChildByTagName(sTagNames, eParent) {
	if (!eParent) return null;
	var aTagNames = sTagNames.split(',');
	for (var i = 0; i < eParent.childNodes.length; i++) {
		var eChild = eParent.childNodes.item(i);
		for (var j = 0; j < aTagNames.length; j++) {
			if (eChild.nodeType == 1 && eChild.tagName.toLowerCase() == aTagNames[j].toLowerCase()) {
				return eChild;
			}
		}
	}
	return null;
}

