/**
 * @include  "js_common.js"
 */


/**
 * stopBubble() - универсальная функция для остановки всплытия события
 *
 * @param e - ссылка на объект-событие
 * @return void
 */
function stopBubble(e)
{
    // это не IE
    if (! document.all) e.stopPropagation();	// и он поддерживает W3C-метод stopPropagation
    else
    // в противном случае нужно воспользоваться способом
	// остановки всплытия события который поддерживает IE
        window.event.cancelBubble = true;
}

//-------------

/* ------------ */

/**
 * stopDefault() - универсальная функция для предотвращения стандартных действий браузера
 *
 * @param e - ссылка на объект-событие
 * @return boolean - всегда FALSE
 */
function stopDefault(e)
{
    // предотвращение стандартных действий W3C-браузера
    if (! document.all) e.preventDefault();
    // ярлык для остановки действия браузера в IE
	else window.event.returnValue = false;
    return false;
}

/**
 * добавляет обработчик события для объекта
 *
 * @author Dean Edwards (with input from Tino Zijdel)
 * @link http://dean.edwards.name/weblog/2005/10/add-event/
 *
 * @param {HTMLElement} toElement - ссылка на элемент или его ID
 * @param {String} tcType - названия события (без ON просто click, submit и т.п.)
 * @param {function} tfHandler - ссылка на функцию-обработчик
 * @return void
 */
function addEvent(toElement, tcType, tfHandler)
{
	if(toElement.constructor == String) toElement = id(toElement);

	// присвоение каждому обработчику события уникального идентификатора
	if (!tfHandler.$$guid) tfHandler.$$guid = addEvent.guid++;
	// создание хэш-таблицы видов событий для элемента
	if (!toElement.events) toElement.events = {};
	// создание хэш-таблицы обработчиков событий для каждой пары элемент-событие
	var handlers = toElement.events[tcType];
	if (!handlers)
	{
		handlers = toElement.events[tcType] = {};
		//	сохранение существующего обработчика события (если он существует)
		if (toElement["on" + tcType])
		{
			handlers[0] = toElement["on" + tcType];
		}
	}

	// сохранение обработчика события в хэш-таблице
	handlers[tfHandler.$$guid] = tfHandler;
	// назначение глобального обработчика события для выполнения всей работы
	toElement["on" + tcType] = handleEvent;
};

/**
 * @var integer
 * счетчик используемый для создания уникальных идентификаторов
 */
addEvent.guid = 1;


/**
 * removeEvent() - удалени обработчика события у объекта
 *
 * @param HTMLobject toElement -
 * @param string tcType - названия события (без ON просто click, submit и т.п.)
 * @param function tfHandler - ссылка на функцию обработчик
 * @return void
 */
function removeEvent(toElement, tcType, tfHandler)
{
	if (element.events && element.events[type]) // удалени обработчика события из хэш-таблицы
	{
		delete element.events[type][tfHandler.$$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;
};

/**
 * fixEvent() - добавление к объекту-событию некоторых "упущенных" в internet Explorer'е методов
 *
 * @param event - ссылка на объект-событие
 */
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; };
