var errorHandler = function(msg, url, linenumber) {
	var error_msg = "JavaScript Error: " + msg + " at line number " + linenumber + ". Some scripts on this page may not function.";
	try {
		if (error && obj('inline_messages_list')) {
			error(error_msg);
		} else {
			window.alert(error_msg);
		}
	} catch(e) {
		window.alert(error_msg);
	}
	return true
}

/* 
** Cross-browser event management
** By Scott Andrew LePera 
** http://www.scottandrew.com/weblog/articles/cbs-events
*/

function addEvent(obj, evType, fn, useCapture){
  if (obj.addEventListener){
    obj.addEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.attachEvent){
    var r = obj.attachEvent("on"+evType, fn);
    return r;
  } else {
    console.warn("Handler could not be attached");
  }
} 

function removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
	console.warn("Handler could not be removed");
  }
}

// Hide difference between w3c and IE non-standard events
function getEvent(e) {
    return e ? e : window.event;
} 

function getTarget(e) {
    return e ? e.target : window.event.srcElement;
} 

// To use just add cancelBubble(e) to the top your handler function
function cancelBubble(e) {
    var e = e || window.event;
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
} 

// Cross-browser function to stop default browser action after an event handler
function cancelDefaultAction(e) {
	if (e &&e.preventDefault) e.preventDefault();
	else if (window.event && window.event.returnValue)
	window.eventReturnValue = false;
}

// Mostly cross-browser function to prevent text selection in an element. Requires unselectable class defined in layers.css.
function preventSelection(el) {
	el.unselectable = 'on'; // IE
	cssjs('add', el, 'noselect'); // use CSS class to hide select
}

// Undo preventSelection() 
function allowSelection(el) {
	el.unselectable = 'off'; // IE
	cssjs('remove', el, 'noselect'); // Other browsers
}

// Simulate mouseleave event from IE
// Author: Peter-Paul Koch (slightly modified)
// Website: http://www.quirksmode.org/js/events_mouse.html
// License: Public Domain
// Usage: if (mouseReallyOut(e)) do stuff... in a mouseout handler

function mouseReallyOut(e) {
	if (!e) var e = window.event;
	var tg = (window.event) ? e.srcElement : e.target;
	var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
	while (reltg != tg && reltg.nodeName != 'BODY') {
		reltg = reltg.parentNode;
	}
	return !(reltg == tg);
}

function mouseReallyIn(e) {
	if (!e) var e = window.event;
	var tg = (window.event) ? e.srcElement : e.target;
	var reltg = (e.relatedTarget) ? e.relatedTarget : e.toElement;
	while (reltg != tg && reltg.nodeName != 'BODY') {
		reltg = reltg.parentNode;
	}
	return (reltg == tg);
}

// this function determines whether the event is the equivalent of the microsoft
// mouseleave or mouseenter events.
function isMouseLeaveOrEnter(e, handler)
{		
	if (e.type != 'mouseout' && e.type != 'mouseover') return false;
	var reltg = e.relatedTarget ? e.relatedTarget : e.type == 'mouseout' ? e.toElement : e.fromElement;
	if (typeof reltg == 'undefined')
	{
		//alert(e.target +":" +e.type+":"+e.relatedTarget+":"+e.toElement+":"+e.fromElement);
		return false;
	}
	while (reltg && reltg != handler) reltg = reltg.parentNode;
	return (reltg != handler);
}


function containsDOM (container, containee) {
  var isParent = false;
  do {
    if ((isParent = container == containee))
      break;
    containee = containee.parentNode;
  }
  while (containee != null);
  return isParent;
}

function checkMouseEnter (element, evt) {
  if (element.contains && evt.fromElement) {
    return !element.contains(evt.fromElement);
  }
  else if (evt.relatedTarget) {
    return !containsDOM(element, evt.relatedTarget);
  }
}

function checkMouseLeave (element, evt) {
  if (element.contains && evt.toElement) {
    return !element.contains(evt.toElement);
  }
  else if (evt.relatedTarget) {
    return !containsDOM(element, evt.relatedTarget);
  }
}

// Used to check mouseover/mouseout events are firing on el and not a on child node
function isReally(e,el) {
	var src = (window.event) ? e.srcElement : e.target; // ie : w3c
	if(src==el) return true;
}

/* Get event offset from document top */
function getEventPos( e ) {
	if (!e) var e = window.event;
	var pos = new Object;
	pos.x = 0; pos.y = 0;
	if (typeof(e.pageX) != 'undefined') {
		pos.x = e.pageX;
		pos.y = e.pageY;
	} else if (typeof(e.clientX) != 'undefined') {
		// fucking IE again
		pos.x = e.clientX + document.body.scrollLeft;
		pos.y = e.clientX + document.body.scrollLeft;
	}
	return pos;
}

/*
window.onerror = function(msg, url, linenumber) {
	return errorHandler(msg, url, linenumber)
}
*/
