
/*
==========================
developed by Ulitin Alexander
E-mail: shotmnan0@rambler.ru
ICQ: 274691302
==========================
*/

// Объявление глобальных переменных
var DOM = (typeof(document.getElementById)!='undefined');
var menu_div, _menu_a, div_i = null;

var menujs =
{
	// addEvent - функция добавления события 
	/* Пример вызова: menujs.addEvent(document,'click',menu.check);
	document - объект, которому назначается событие
	click - название события
	menu.check - имя функции (ВАЖНО: при использовании конструкции вроде menujs.addEvent(document,'click',function(){alert('сообщение')});) - это событие не удаляется!!!
	*/
	addEvent: function(el, evname, func){
		if(el.addEventListener) // Gecko / W3C
			el.addEventListener(evname, func, false);
		else if(el.attachEvent) // IE
			el.attachEvent('on' + evname, func);
		else
			el['on' + evname] = func;
	},
	
	// addEvent - функция удаления события
	// Пример вызова: аналогично предыдущей функции (если необходимо удалить созданное событие - объект, имя события и имя функции должны совпадать)
	removeEvent: function(el, evname, func){
		if(el.detachEvent) // IE
			el.detachEvent('on' + evname, func);
		else if(el.removeEventListener) // Gecko / W3C
			el.removeEventListener(evname, func, false);
		else
			el['on' + evname] = null;
	},
	
	/* Функция получения коодринат местоположения объекта на странице (el - объект, который анализируем)
	функция возвращает ассоциативный массив со значениями положения объекта
		Элементы массива:
		'top' - расстояние в пикселях от верхнего края объекта до верхней точки документа
		'left' - расстояние в пикселях от левого края объекта до левого края документа
		'right' - расстояние в пикселях от нижнего края объекта до верхней точки документа
		'bottom' - расстояние в пикселях от правого края объекта до левого края документа
		 */
	getRealPos: function(el){
		if(!el || !el.offsetParent)
			return false;
		var res=Array();
		res['left'] = el.offsetLeft;
		res['top'] = el.offsetTop;
		var objParent = el.offsetParent;
		while ( (objParent) && (objParent.tagName != 'BODY') ){
			res['left'] += objParent.offsetLeft;
			res['top'] += objParent.offsetTop;
			objParent = objParent.offsetParent;
		}
		res['right'] = res['left'] + el.offsetWidth;
		res['bottom'] = res['top'] + el.offsetHeight;
		return res;
	},
	
	// Функция предзагрузки изображений (если это необходимо)
	// Пример вызова: menujs.Images('images/open.gif','images/edit.gif');
	Images: function(){
		var d = document;
		if(d.images){
			if(!d.MM_p) d.MM_p = new Array();
			var i,j = d.MM_p.length, a = menujs.Images.arguments;
			for(i=0; i < a.length; i++){
				if (a[i].indexOf("#")!=0){
					d.MM_p[j] = new Image;
					d.MM_p[j++].src = a[i];
				}
			}
		}
	}
}

// Объект выпадающего меню.
var menu =
{
	// Метод show - вызывает меню
	/* Получает параметры:
	obj - необходимо передавать объект, относительно которого будет рисоваться меню
	arr - массив определённой структуры:
		в данном случае [['название пункта','ссылка'],['название пункта','ссылка']]
	Пример вызова: onClick="menu.show(this,[['Просмотр','#open'],['Создать подкатегорию','#child']])"
	*/
	show: function(obj,arr){
		if(div_i)div_i.className = '';
		menu_div = document.getElementById('menu');
		
		_menu_a = document.getElementById('menu_a');
		
		if(!arr){_menu_a.innerHTML = '';}
		div_i = obj;
		pos = menujs.getRealPos(obj);
		_menu = menu_div;
		_menu.style.top = pos.top + 18 + 'px';
		_menu.style.left = pos.left - 10 + 'px';
		
		var btn_td = obj.parentNode.parentNode.parentNode.parentNode.parentNode;
		var btn_id = btn_td.getAttribute("id");
                var razdpos = btn_id.indexOf("_");
		var btn_pref = btn_id.substr(0, razdpos+1);
		var btn_num = btn_id.substr(razdpos+1, btn_id.length);
		var btn_num_int = parseInt(btn_num);
		
		var next_btn_id = btn_pref + (btn_num_int + 1);
		var next_btn_td = document.getElementById(next_btn_id);
		next_pos = menujs.getRealPos(next_btn_td);
		
		_menu.style.width = next_pos.left - pos.left + 4 + 'px';
		if(arr){
			_menu_a.innerHTML = menu.initFunc(arr);
		}
		else{return;}
		_menu_pos = menujs.getRealPos(_menu);		
		_menu.style.display = 'block';
		menujs.addEvent(document,'click',menu.check);
		menujs.addEvent(document,'keypress',menu.press);		
	},
	
	hide: function(){
		menu_div.style.display = 'none';
		menujs.removeEvent(document, 'click', menu.check);
		menujs.removeEvent(document, 'keypress', menu.press);
	},
	
	/* Метод initFunc - описывает правила для обработки массива и генерации html кода - описывается отображение пунктов меню
	Этот метод не вызывается извне объекта menu
	Получает параметры:
	arr - массив определённой структуры:
		в данном случае [['название пункта','ссылка'],['название пункта','ссылка']]
	*/
	initFunc: function(arr){
		var html = '<table cellpadding="0" cellspacing="0" width="100%"><tr height="10"><td height="10" class="news_lt" width="10">&nbsp;</td><td height="10" class="news_top">&nbsp;</td><td height="10" class="news_rt" width="10">&nbsp;</td></tr>';
		for(i in arr){
			// Здесь в переменную html добавлется по одной строке, соответственно здесь и настраивается вид пунктов меню
			html += '<tr height="20"><td height="20" class="menu_left" width="10"></td><td height="20" valign="middle"><a class="menu_a" height="20" href="'+arr[i][1]+'">'+arr[i][0]+'</a></td><td class="menu_right" width="10"></td></tr>';
		}
		html += '<tr height="10"><td height="10" class="news_lb" width="10">&nbsp;</td><td height="10" class="news_btm">&nbsp;</td><td height="10" class="news_rb" width="10">&nbsp;</td></tr></table>';
		return html;
	},
	
	// Метод press - скрывает меню при нажатии определённой клавиши, в данном случае - Esc
	press: function(e){
		if(!e) e = window.event;
		if(!e) return;
		if(e.keyCode == 27)
			menu.hide();
	},
	
	// Метод check - проверяет - нужно ли скрывать меню или нет.
	// В данном случае метод вызывается при кликании мышью, если координаты "клика" не совпадают с координатами меню и каких-либо объектов, то меню закрывается!
	check: function(e){
		if(!div_i)
			return;
		var x = e.clientX + document.body.scrollLeft;
		var y = e.clientY + document.body.scrollTop;
		/*menu_button region*/
		if(div_i){
			var pos = menujs.getRealPos(div_i);
			if(x >= pos['left'] && x <= pos['right'] && y >= pos['top'] && y <= pos['bottom'])
				return;
		}
		/*menu region*/
		if(_menu){
			var pos = menujs.getRealPos(_menu);
			if(x >= pos['left'] && x <= pos['right'] && y >= pos['top'] && y <= pos['bottom'])
				return;
		}
		menu.hide();
	}
	
}
