/*
Скрипты взяты со страницы: http://xpoint.ru/know-how/JavaScript/PoleznyieFunktsii?31
*/


/*
Функции addHandler() и removeHandler() вызывают специализированные функции, если они поддерживаются браузером.
Иначе функциональность эмулируется — создаётся список обработчиков, которые надо вызвать при возникновении события.
Последнее работает правильно только в том случае, если обработчики назначаются исключительно через addHandler().
*/

function addHandler(object, event, handler)
{
	if (typeof object.addEventListener != 'undefined')
	{
		object.addEventListener(event, handler, false);
	} else if (typeof object.attachEvent != 'undefined')
	{
		object.attachEvent('on' + event, handler);
	} else {
		var handlersProp = '_handlerStack_' + event;
		var eventProp = 'on' + event;
		if (typeof object[handlersProp] == 'undefined')
		{
			object[handlersProp] = [];
			if (typeof object[eventProp] != 'undefined')
			{
				object[handlersProp].push(object[eventProp]);
			}
			object[eventProp] = function(e)
			{
				var ret = true;
				for (var i = 0; ret != false && i < object[handlersProp].length; i++)
				{
					ret = object[handlersProp][i](e);
				}
				return ret;
			}
		}
		object[handlersProp].push(handler);
	}
}

function removeHandler(object, event, handler)
{
	if (typeof object.removeEventListener != 'undefined')
	{
		object.removeEventListener(event, handler, false);
	} else if (typeof object.detachEvent != 'undefined')
	{
		object.detachEvent('on' + event, handler);
	} else {
		var handlersProp = '_handlerStack_' + event;
		if (typeof object[handlersProp] != 'undefined')
		{
			for (var i = 0; i < object[handlersProp].length; i++)
			{
				if (object[handlersProp][i] == handler)
				{
					object[handlersProp].splice(i, 1);
					return;
				}
			}
		}
	}
}

/*
Пример:
addHandler(document.getElementById('test'), 'click', handler2);
removeHandler(document.getElementById('test'), 'click', handler2);
*/


/*
Если обработчик хочет предотвратить стандартную обработку события (к примеру, переход по ссылке при клике),
не всегда достаточно вернуть false. Это будет работать правильно в Internet Explorer и в эмуляции, но возвратное
значение обработчиков, назначенных через addEventListener(), игнорируется. Для таких обработчиков в DOM
существует метод preventDefault() объекта Event. Итого получаем:
*/

function handler(e)
{
	e = e || window.event;

	// здесь что-то делаем

	if (typeof e.preventDefault != 'undefined') {
		e.preventDefault();
	}
	return false;
}

/*
В разных браузерах под «страницей» понимаются разные вещи — в некоторых обработчик onload
следует привязывать к объекту window, в некоторых — к объекту document, да ещё и способы привязки
могут отличаться (см. выше). Для облегчения этой задачи предлагается следующая функция:
*/

function setGlobalOnLoad(f) {
	 var root = window.addEventListener || window.attachEvent ? window : document.addEventListener ? document : null
	 if (root){
			if(root.addEventListener) root.addEventListener("load", f, false)
			else if(root.attachEvent) root.attachEvent("onload", f)
	 } else {
			if(typeof window.onload == 'function') {
				 var existing = window.onload
				 window.onload = function() {
						existing()
						f()
				 }
			} else {
				 window.onload = f
			}
	 }
}
