// JavaScript Document

function attachEventListener(target, eventType, functionRef, capture)
// parametre: elementet, fx.click, navn på funktion der skal kaldes ved eventet, altid false(propagation fase, se senere)
// funktionen tilføjer eventlisteners, 
// man kan have flere events tilknyttet hvert element, men denne function skal kaldes for hvert af dem
{
	if (typeof target.addEventListener != "undefined") // nyere undtagen IE har denne builtin
	{
		target.addEventListener(eventType, functionRef, capture);
	}
	else if (typeof target.attachEvent != "undefined") // nyere IE har denne builtin
	{
		target.attachEvent("on" + eventType, functionRef); // IE bruger onclick andre kun click
	}
	else // ældre
	{
		eventType = "on" + eventType;
		if (typeof target[eventType] == "function") // fx mylink[onclick] er en function
		{
			var oldListener = target[eventType]; // mylink[onclick], som er en function, kopieres til oldListener
			target[eventType] = function()       // nu defineres en anonym function for mylink[onclick]
			{
				oldListener();					// i den anonyme function udføres den gamle function
				return functionRef();			// og den nye som er overført som parameter udføres også
			}									// så nu er der defineret en function (anonym) der samler alle tidligere
												// definerede 
		}
		else
		{
			target[eventType] = functionRef;
		}
	}
}
//eksempel på brug:
//var mylink = document.getElementById("mylink");
//attachEventListener(mylink, "click", engage, false);


function stopDefaultAction(event)
//fordi return false ikke virker i w3c event listeners
// vær opmærksom på at default action slet ikke kan slås fra i Safari, se JSA side 237 
{
	event.returnValue = false;
	if (typeof event.preventDefault != "undefined")
	{
		event.preventDefault();
	}
}
//eksempel på brug:
//function engage(event)    en funktion som vi har attached til et event med attachEventListener
//{
//	if (typeof event == "undefined")  alstå hvis event ikke er med som parameter, hvilket det ikke er i IE
//	{
//		event = window.event;	men i IE er det til gengæld globalt
//	}
//	alert ("Engage"); // det arbejde som funktionen skal udføre
//	stopDefaultAction(event); //hvis browserens defaultaction skal forhindres, fx. at forfølge en link ved onclick
//	return false; // til ære for gamle browsere
//}
	
function getEventTarget(event)
// det target element eventhandleren giver ikke behøver at være det element, hvorpå
// man specificerede en event handler, men derimod kan være et underliggende element.
// Denne funktion itererer opad sålænge elementet er et tekstelement og der er en forældre
// resten af opad iterationen skal udføres individuelt i den enkelte event handler funktion
{
	var targetElement = null;
	if (typeof event.target != "undefined")
	{
		targetElement = event.target;
	}
	else
	{
		targetElement = event.srcElement;
	}
	while (targetElement.nodeType == 3 && targetElement.parentNode != null)
	{
		targetElement = targetElement.parentNode;
	}
	return targetElement;
}
//Eksempel på brug:
//var mylink = document.getElementById("mylink");    som tidligere
//attachEventListener(mylink, "click", engage, false);   som tidligere
//function engage(event)
//{
//	if (typeof event == "undefined")			som tidligere
//	{
//		event = window.event;					som tidligere
//	}
//	var target = getEventTarget(event);    kald til funktionen ovenfor som returnerer det nærmeste overliggende ikke-tekst element
//	while (target.nodeName.toLowerCase() != "a")   så må vi udføre resten af testen her
//	{
//		target = target.parentNode;					og gå et niveau længere op hvis nødvendigt
//	}
//	var href = target.getAttribute("href");		herfra er det bare eksempel på hvad funktionen kunne lave
//	alert("Engage: " + href);
//	return true;
//}
// sammenhold engage med den anden engage som aflyser default action
// begge dele kan være nødvendigt i en event-handler:
// hvis man skal vide, hvad elementet hedder måske for at læse dets attributter skal man gøre som ovenfor
// og hvis man skal aflyse default action skal man desuden inkludere koden til det 
// begge dele i den enkelte event-handler-funktion


// stop propagation
// caption = false i kaldet til attachEventListener sættes fordi IE kun kan håndtere false
// false betyder alt hvis der er nestede elementer vil hændelsen blive registreret på den inderste ført, så den næstinderste 
// Hvis man vil stoppe denne bubbling når man har håndteret hændelsen kan man stoppe propagation
function stopEvent(event)
{
	if (typeof event.stopPropagation != "undefined")
	{
		event.stopPropagation();  // andre end IE
	}
	else
	{
		event.cancelBubble = true;  // IE
	}
}
// eksempel på brug
//function engage(event)     fra før
//{
//	if .....
//	stopEvent(event);
//	return true;
//}
// det var altså den tredje ting som skal overvejes ved alle event handler funktioner

//Man kan også fjerne en eventhandler igen (detachEventListener) men den funktion har jeg ikke medtaget her.
//se JSA side 237

//***************
//Når det gælder de event-handler-funktioner der skal udføres ved onload er det nødvendigt
//med en speciel håndtering, fordi de forskellige browsere fyrer onload fra forskellige elementer -
//window henholdsvis document (foruden den med attachEvent og addEventListener som også er forskellig)





function detachEventListener(target, eventType, functionRef, capture)
// tre forskellige metoder alt efter browser
{
    if (typeof target.removeEventListener != "undefined")
    {
        target.removeEventListener(eventType, functionRef, capture)
    }
    else if (typeof target.detachEvent != "undefined")
    {
        target.detachEvent("on" + eventType, functionRef);
    }
    else
    {
        target["on" + eventType] = null;
    }

    return true;
};


function addLoadListener(fn)
{
  if (typeof window.addEventListener != 'undefined')
  {
    window.addEventListener('load', fn, false);
  }
  else if (typeof document.addEventListener != 'undefined')
  {
    document.addEventListener('load', fn, false);
  }
  else if (typeof window.attachEvent != 'undefined')
  {
    window.attachEvent('onload', fn);
  }
  else
  {
    var oldfn = window.onload;
    if (typeof window.onload != 'function')
    {
      window.onload = fn;
    }
    else
    {
      window.onload = function()
      {
        oldfn();
        fn();
      };
    }
  }
}

//attachEventListener(document, "mousemove", mousemoveCheckThreshold, false);
//addLoadListener(initDragNDrop);
