//////////////////////////////////////////////////////////////////////////
// Добавление и удалние обработчиков событий                            //
//////////////////////////////////////////////////////////////////////////

// Добавление обработчика события

function add_event_handler( element, event_name, handler )
{
	var handler_function = handler;
    
	if ( element.addEventListener )
	{
		element.addEventListener(event_name, handler_function, false);
	}
	
	else if ( element.attachEvent )
	{
		handler_function = function()
		{
			handler(window.event);
        }
        
        element.attachEvent("on" + event_name, handler_function);
	}
	
	else
	{
		throw new Error("Невозможно зарегистрировать обработчик события.");
	}
    
	return { "element": element, "event_name": event_name, "handler": handler_function };
}

// Удаление обработчика события

function remove_event_handler( event_handler )
{
	var element = event_handler.element;
    
	if ( element.removeEventListener )
	{
		element.removeEventListener(event_handler.event_name, event_handler.handler, false);
	}
	
	else if ( element.detachEvent )
	{
		element.detachEvent("on" + event_handler.event_name, event_handler.handler);
	}
}

//////////////////////////////////////////////////////////////////////////
// Получение вычисленного стиля элемента                                //
//////////////////////////////////////////////////////////////////////////

function get_element_computed_style_property( element, property_name )
{
	if ( document.defaultView && document.defaultView.getComputedStyle )
	{
		if ( property_name.match(/[A-Z]/) ) property_name = property_name.replace(/([A-Z])/g, "-$1").toLowerCase();
		return document.defaultView.getComputedStyle(element, "").getPropertyValue(property_name);
	}
  
	if ( element.currentStyle )
	{
		var i;
		while ( (i = property_name.indexOf("-")) != -1 ) property_name = property_name.substr(0, i) + property_name.substr(i + 1, 1).toUpperCase() + property_name.substr(i + 2);
		return element.currentStyle[property_name];
	}
  
	return "";
}

//////////////////////////////////////////////////////////////////////////
// Получение границ элемента                                            //
//////////////////////////////////////////////////////////////////////////

function get_element_bounds( element )
{
    var w = element.offsetWidth;
    var h = element.offsetHeight;
	
    var l = 0;
    var t = 0;
	
	while ( element )
    {
		l += element.offsetLeft;
		t += element.offsetTop;
		element = element.offsetParent;
    }

    return { "left": l, "top": t, "width": w, "height": h};
}

//////////////////////////////////////////////////////////////////////////
// Получение положения скролла                                          //
//////////////////////////////////////////////////////////////////////////

function get_scroll_position()
{
	var t = self.pageYOffset || (document.documentElement && document.documentElement.scrollTop) || (document.body && document.body.scrollTop);
	var l = self.pageXOffset || (document.documentElement && document.documentElement.scrollLeft) || (document.body && document.body.scrollLeft);
	
	return { "left": l, "top" : t };
}

//////////////////////////////////////////////////////////////////////////
// Размер тела                                                          //
//////////////////////////////////////////////////////////////////////////

function get_body_size()
{
	var w = (window.innerWidth ? window.innerWidth : (document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body.offsetWidth));
    var h = (window.innerHeight ? window.innerHeight : (document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body.offsetHeight));
    
    return { "width": w, "height": h }; 
}

//////////////////////////////////////////////////////////////////////////
// Получение координат курсора                                          //
//////////////////////////////////////////////////////////////////////////

var mouse_position = { "left" : 0, "top" : 0 };

function get_mouse_position()
{
	return mouse_position;
}

function mouse_move_handler( e )
{
	var l = 0, t = 0;
	
	if ( !e ) e = window.event;

	if ( e.pageX || e.pageY )
	{
    	l = e.pageX;
		t = e.pageY;
	}
  
	else if (e.clientX || e.clientY)
	{
		l = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft) - document.documentElement.clientLeft;
		t = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop) - document.documentElement.clientTop;
	}

	mouse_position = { "left" : l, "top" : t };
}

add_event_handler(document.body, "mousemove", mouse_move_handler);
