// JavaScript Document
//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//																																				              //
//		addEvent(element, type, handler) - функция для привязки обработчика события к элементу				  //
//      removeEvent(element, type, handler) - функция для удаления обработчика события из элемента			  //
//																																							  //
//		например: addEvent (h1[0], "mouseover", function())																			  //
//						addEvent (this, "click", function())																						  //
//																																							  //
// 		работает во всех браузерах																												  //
//		в функциях привязки доступно ключевое слово this (указывает на текущий элемент)							  //	
//																																							  //
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



function addEvent (element, type, handler){
	// присвоение каждому обработчику события уникального идентификатора
	if (!handler.$$guid) handler.$$guid=addEvent.guid++;
	
	//созание хэш-таблицы видов событий для элемента
	if(!element.events) element.events={};
	
	//создание хэш-таблицы обработчиков событий для каждой пары элемент-событие
	var handlers=element.events[type] ;
	if(!handlers){
		handlers=element.events[type]={};
		// сохранение существующего обработчика события если он существует
		if(element["on"+type]){
			handlers[0]=element["on"+type];
		}
	}
	
	// сохранение обработчика события в хэш-таблице
	handlers[handler.$$guid]=handler;
	
	//назначение глобального обработчика события для выполнения всей работы
	element["on"+type]=handleEvent;
};

//счетчик используемый для создания унмкальных идентификаторов
addEvent.guid=1;

function removeElement(element, type, handler){
	// удаление обработчика из хэш-таблицы
	if(element.events && element.events[type]){
	delete element.events[type][handler.$$guid];
	}
};

function handleEvent(event){
	var returnValue=true;
	
	//захват объекта события (IE спользует глобальный объект события)		
	event=event||fixEvent(window.event);
	
	//получение ссылки на хэш-таблицу обработчиков событий
	var handlers=this.events[event.type];
	
	//выполнение каждого обработчика события
	for (var i in handlers){
		this.$$handleEvent=handlers[i];
		if(this.$$handleEvent(event) === false) {
			returnValue=false;
		}
	}
	
	return returnValue;
};

//добавление к IE-объекту события некоторых упущенных методов
function fixEvent(event){
	//добавление стандартных (W3C) методов событий
	event.preventDefault=fixEvent.preventDefault;
	event.stopPropagation=fixEvent.stopPropagation;
	return event;
};

fixEvent.preventDefault=function(){
	this.returnValue=false;
};

fixEvent.stopPropagation=function(){
	this.cancelBubble=true;
};
