
/*
 * Градусник, вер. 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 = '/f/1/global/thermo-over.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 = '<img src="/f/1/global/thermo-over-tl.gif" class="tl over"/><img src="/f/1/global/thermo-over-tr.gif" class="tr over"/><img src="/f/1/global/thermo-over-bl.gif" class="bl over"/><img src="/f/1/global/thermo-over-br.gif" class="br over"/>';
                                                 /*   код, который будет вставлен в начале каждого пункта    */

var sThermoSubMenuAdditionalHTML = '<img src="/f/1/global/d-t.gif" class="tl"/><img src="/f/1/global/d-t.gif" class="tr"/><img src="/f/1/global/d-t.gif" class="bl"/><img src="/f/1/global/d-t.gif" class="br"/><div class="top-border"></div>';
                                                 /*   код, который будет вставлен в начале каждого подменю    */

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;

	}
}

var sThermoSubMenuLinksClassMinIE = 'sub-menu-links-min-ie';        /*   класс контейнера пунктов подменю превышающий допустимое кол-во элементов   */
var sThermoSubMenuLinksClassMinOther = 'sub-menu-links-min-other';  /*   класс контейнера пунктов подменю превышающий допустимое кол-во элементов   */
var eMenuListMaxLenght = '20';                                      /*   Максимально кол-во элементов подменю, выводимое на экран (остальное будет скрыто) */
var sThermoSubMenuLinksId = 's_menu';                               /*   ID контейнера пунктов подменю. */

/*   создает меню   */
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 (eMenuList.childNodes.length > eMenuListMaxLenght) {
			    var ScrollElement = 'div';
			    var ScrollClass = 'Scroll';
			    var rndScrollId = Math.floor(Math.random() * (10000 - 1 + 1)) + 1;

			    var ScrollUpInner = 'div';
			    var ScrollUpInnerClass = 'ScrollUp';
			    var ScrollUpInnerId = 'ScrollUp_'+ rndScrollId;

			    var ScrollDownInner = 'div';
			    var ScrollDownInnerClass = 'ScrollDown';
			    var ScrollDownInnerId = 'ScrollDown_'+ rndScrollId;

				var ScrollUpInner = document.createElement(ScrollUpInner);
					ScrollUpInner.className = ScrollUpInnerClass;
					ScrollUpInner.id = ScrollUpInnerId;
					ScrollUpInner.onmousedown = function (){
						 startTermoListScrollUp(rndScrollId);
					};
					ScrollUpInner.onmouseup = function (){
						stopTermoListScroll();
					};
                var ScrollUpElement = document.createElement(ScrollElement);
                    ScrollUpElement.className = ScrollClass;
					ScrollUpElement.appendChild(ScrollUpInner);

				var ScrollDownInner = document.createElement(ScrollDownInner);
					ScrollDownInner.className = ScrollDownInnerClass;
					ScrollDownInner.id = ScrollDownInnerId;
					ScrollDownInner.onmousedown = function (){
						startTermoListScrollDown(rndScrollId);
					};
					ScrollDownInner.onmouseup = function (){
						stopTermoListScroll();
					};
                var ScrollDownElement = document.createElement(ScrollElement);
                    ScrollDownElement.className = ScrollClass;
					ScrollDownElement.appendChild(ScrollDownInner);

			    if(navigator.appName.indexOf("Explorer")!=-1) {
			        if (sThermoSubMenuLinksClassMinIE != '') eSubMenuLinks.className = sThermoSubMenuLinksClassMinIE;
			        if (sThermoSubMenuLinksId != '') eSubMenuLinks.id = sThermoSubMenuLinksId + '_' + rndScrollId;
			    }else {
			        if (sThermoSubMenuLinksClassMinOther != '') eSubMenuLinks.className = sThermoSubMenuLinksClassMinOther;
			        if (sThermoSubMenuLinksId != '') eSubMenuLinks.id = sThermoSubMenuLinksId + '_' + rndScrollId;
			    }
			}else {
			    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;
			}

			/* Добовляем элемент скроллинга вверх (если необходимо) */
			if (eMenuList.childNodes.length > eMenuListMaxLenght) {
				eSubMenu.appendChild(ScrollUpElement);
			}

			/*   потом добавляем список пунктов    */
			eSubMenu.appendChild(eSubMenuLinks);

			/* Добовляем элемент скроллинга вниз (если необходимо) */
			if (eMenuList.childNodes.length > eMenuListMaxLenght) {
				eSubMenu.appendChild(ScrollDownElement);
			}

			/*   дальше, если нужно еще элемент добавить - добавляем    */
			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');
				}
			}
		}
	}
}

/* Прокрутка элементов подменю */
/* ================================================================================================= */
var scrollStep = 5;
var scrollSpeed = 1;
var iScrollTO = 0;

function startTermoListScrollUp(id){
	iScrollTO = setInterval("ScrollUp("+ id +")", scrollSpeed);
}

function ScrollUp(id){
	document.getElementById('s_menu_'+ id).scrollTop-=scrollStep;
	testThermoSize(id);
}

function startTermoListScrollDown(id){
	iScrollTO = setInterval("ScrollDown("+ id +")", scrollSpeed);
}

function ScrollDown(id){
	document.getElementById('s_menu_'+ id).scrollTop+=scrollStep;
	testThermoSize(id);
}

function stopTermoListScroll(){
	if (iScrollTO != 0 ) {
		clearInterval(iScrollTO);
		iScrollTO = 0;
	}
}


/**
  * Проверяет размер и позцию прокручиваемого списка и отключает при
необходимости стрелки
  */
function testThermoSize(id){
        var elem = document.getElementById('s_menu_'+ id);
		var sUp = document.getElementById('ScrollUp_'+ id);
		var sDown = document.getElementById('ScrollDown_'+ id);

		//log.info('ScrollTop: '+ elem.scrollTop + ' ScrollHeight: '+ elem.scrollHeight + ' OffsetHeight: '+ elem.offsetHeight);

		if(elem.scrollTop == 0){
			cmnRemove_class(sUp, 'vis'); cmnSet_class(sUp, 'hide');
			cmnRemove_class(sDown, 'hide'); cmnSet_class(sDown, 'vis');
			stopTermoListScroll();
		}else if(elem.scrollTop != 0){
			if(elem.scrollHeight - elem.scrollTop == elem.offsetHeight){
				cmnRemove_class(sUp, 'hide'); cmnSet_class(sUp, 'vis');
				cmnRemove_class(sDown, 'vis'); cmnSet_class(sDown, 'hide');
				stopTermoListScroll();
			}else {
				cmnRemove_class(sUp, 'hide'); cmnSet_class(sUp, 'vis');
				cmnRemove_class(sDown, 'hide'); cmnSet_class(sDown, 'vis');
			}
		}
}

/* ================================================================================================= */


/*   нажатие на подменю    */
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 fnShowProps(obj, objName){
    var result = "";
    for (var i in obj) // обращение к свойствам объекта по индексу
        result += objName + "." + i + " = " + obj[i] + "<br />\n";
    document.write(result);
}


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;
}


//fnShowProps(this.oItemOpened.eThermoItem.scrollTop, "thermo")
