function handlerID(){
	return handlerID.next++;
}
handlerID.next=1;

function addEvent(element,type,handler){
	//Функция добавления обработчиков событий.

	if(!handler.$$guid) handler.$$guid=handlerID(); //Добавляем индекс функции
	if(!element.events) element.events={}; //Создаём таблицу событий
	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]=function handleEvent(event){
		//Функция обработки события. Вызывает добавленные обработчики.
		event=event||fixIEEvent(window.event); //Нормализуем событие
		
		var returnValue=true;
		var handlers=this.events[event.type];
		
		//Вызываем обработчики в контесте текущего объекта с событием в качестве аргумента.
		for(var j in handlers) if(handlers[j].call(this,event)===false) returnValue=false;
		
		return returnValue;
	}
}

function removeEvent(element,type,handler){
	//Функция удаления обработчиков событий.
	if(element.events && elements.events[type]) delete elements.events[type][handler.$$guid];
}


function fixIEEvent(event){
//Функция, чтобы фиксить косяки события IE
	event.preventDefault=function(){this.returnValue=false;};
	event.stopPropagation=function(){this.cancelBubble=true;};
	return event;
}

function domReady(handler){
//Функция добавления обработчиков загрузки страницы
	function isDOMReady(){
		if(domReady.done) return;

		if(document && document.getElementsByTagName && document.getElementById && document.body){
			clearInterval(domReady.timer);
			for(var j=0;j<domReady.handlers.length;j++) (domReady.handlers[j])();
			domReady.handlers=null;
			domReady.done=true;
		}
	}

	if(domReady.done) return handler();

	if(domReady.timer) domReady.handlers.push(handler);
	else{
		addEvent(window,'load',isDOMReady);
		domReady.handlers=[handler];
		domReady.timer=setInterval(isDOMReady,13);
	}
}

function FunctionArrayCaller(){
	var funs={};
	this.add=function(f){
		if(!f.$$guid) f.$$guid=handlerID(); //Добавляем индекс функции
		funs[f.$$guid]=f;
	};
	this.remove=function(f){delete funs[f.$$guid];};
	this.run=function(){for(var j in funs)(funs[j])();};
}
