/**
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 * 
 * @package DOM-Compat/Tests
 * @author  Aurélien Maille <bobe@webnaute.net>
 * @link    http://dev.webnaute.net/Applications/DOM-Compat/ (bientôt)
 * @license http://www.gnu.org/copyleft/lesser.html
 * @version $Id: tests.js,v 1.1 2005/09/30 16:02:27 bobe Exp $
 */

/*
	Tests sur les évènements de base
 */
var test2 = {
	logBox: null,
	
	initialize: function() {
		this.logBox = document.getElementById('log');
		
		document.getElementById('test2a').addEventListener('mousedown', this.logClick, false);
		document.getElementById('test2a').addEventListener('mouseup', this.logClick, false);
		document.getElementById('test2a').addEventListener('click', this.logClick, false);
		document.getElementById('test2a-bis').addEventListener('mousedown', this.logClick, false);
		document.getElementById('test2a-bis').addEventListener('mouseup', this.logClick, false);
		document.getElementById('test2a-bis').addEventListener('click', this.logClick, false);
		document.getElementById('erase-button').firstChild.addEventListener('click', this.eraseLog, false);
		document.getElementById('test2b').addEventListener('mousedown', writeProps, false);
		document.getElementById('test2b').addEventListener('mouseup', writeProps, false);
		document.getElementById('test2c').addEventListener('keydown', writeProps, false);
		document.getElementById('test2d').addEventListener('keyup', writeProps, false);
		document.getElementById('test2e').addEventListener('keypress', writeProps, false);
		document.getElementById('test2f').addEventListener('change', writeProps, false);
		document.getElementById('test2g').addEventListener('change', writeProps, false);
		document.getElementById('test2h').addEventListener('change', writeProps, false);
		document.getElementById('test2i').addEventListener('change', writeProps, false);
		document.getElementById('test2j').addEventListener('change', writeProps, false);
		document.getElementById('test2k').addEventListener('change', writeProps, false);
		document.getElementById('test2l').addEventListener('change', writeProps, false);
		document.getElementById('test2m').addEventListener('select', writeProps, false);
		document.getElementById('test2n').addEventListener('focus', writeProps, false);
		document.getElementById('test2n').addEventListener('blur', writeProps, false);
	},
	
	logClick: function(evt) {
		var spanElt = document.createElement('span');
		spanElt.style.display = 'block';
		spanElt.appendChild(document.createTextNode(evt.type + '\u00A0(' + evt.detail + ')'));
		if( test2.logBox.hasChildNodes() == true )
		{
			test2.logBox.insertBefore(spanElt, test2.logBox.firstChild);
		}
		else
		{
			test2.logBox.appendChild(spanElt);
		}
		
		if( evt.type == 'click' )
		{
			writeProps(evt);
		}
		
		if( evt.target.nodeName.toLowerCase() == 'a' )
		{
			evt.preventDefault();
		}
	},
	
	eraseLog: function() {
		while( test2.logBox.hasChildNodes() == true )
		{
			test2.logBox.removeChild(test2.logBox.firstChild);
		}
	}
};

/*
	Mouvement et position de la souris
 */
var test3 = {
	initialize: function() {
		document.getElementById('mouseArea').addEventListener('mouseover', writeProps, false);
		document.getElementById('mouseArea').addEventListener('mouseout', writeProps, false);
		document.getElementById('mouseArea3').addEventListener('mousemove', writeProps, false);
		document.getElementById('test3a').addEventListener('click', test3.changeMouseEventStatus, false);
		document.getElementById('test3a')._eventDisabled = false;
		document.getElementById('test3b').addEventListener('click', test3.changeMouseEventStatus, false);
		document.getElementById('test3b')._eventDisabled = false;
		document.getElementById('test3c').addEventListener('click', test3.changeAreaPosition, false);
	},
	
	changeMouseEventStatus: function(evt) {
		var type = ( evt.currentTarget.getAttribute('id') == 'test3a' ) ? 'mouseover' : 'mouseout';
		
		if( evt.currentTarget._eventDisabled == true )
		{
			evt.currentTarget._eventDisabled = false;
			//evt.currentTarget.getAttributeNode('value').firstChild.replaceData(0, 7, 'Désactiver');
			evt.currentTarget.setAttribute('value', 'Désactiver le ' + type);
			document.getElementById('mouseArea').addEventListener(type, writeProps, false);
		}
		else
		{
			evt.currentTarget._eventDisabled = true;
			//evt.currentTarget.getAttributeNode('value').firstChild.replaceData(0, 10, 'Activer');
			evt.currentTarget.setAttribute('value', 'Activer le ' + type);
			document.getElementById('mouseArea').removeEventListener(type, writeProps, false);
		}
	},
	
	changeAreaPosition: function(evt) {
		var mouseDiv = document.getElementById('mouseArea3');
		var button	 = document.getElementById('test3c');
		var position = getComputedStyle(mouseDiv, null).position;
		
		if( position != 'static' )
		{
			mouseDiv.style.position = 'static';
			//button.getAttributeNode('value').firstChild.replaceData(26, 8, 'relative');
			button.setAttribute('value', 'Mettre ce div en position relative');
		}
		else
		{
			mouseDiv.style.position = 'relative';
			mouseDiv.style.left		= '5px';
			mouseDiv.style.top		= '5px';
			//button.getAttributeNode('value').firstChild.replaceData(26, 8, 'statique');
			button.setAttribute('value', 'Mettre ce div en position statique');
		}
	}
};

/*
	Test des phases de capture et de bouillonnement d'évènement
 */
var test4 = {
	initialize: function() {
		document.getElementById('calqueName').addEventListener('change', test4.refreshSelect, false);
		document.getElementById('changeEvent').addEventListener('click', test4.changeCalqueEvent, false);
		document.getElementById('calque1').addEventListener('click', test4.testPhase, false);
		document.getElementById('calque1').test4Phase = false;
		document.getElementById('calque1').test4StopP = false;
		document.getElementById('calque2').addEventListener('click', test4.testPhase, false);
		document.getElementById('calque2').test4Phase = false;
		document.getElementById('calque2').test4StopP = false;
		document.getElementById('calque3').addEventListener('click', test4.testPhase, false);
		document.getElementById('calque3').test4Phase = false;
		document.getElementById('calque3').test4StopP = false;
	},
	
	testPhase: function(evt) {
		writeProps(evt);
		alert(evt.currentTarget.getAttribute('id'));
		
		if( evt.currentTarget.test4StopP == true )
		{
			evt.stopPropagation();
		}
	},
	
	refreshSelect: function() {
		var calque = document.getElementById(document.getElementById('calqueName').options[document.getElementById('calqueName').selectedIndex].text);
		var phaseBox  = document.getElementById('phase');
		var stopPBox  = document.getElementById('stopP');
		
		var phaseIndex = ( calque.test4Phase == false ) ? 0 : 1;
		var stopPIndex = ( calque.test4StopP == false ) ? 0 : 1;
		phaseBox.selectedIndex = phaseIndex;
		stopPBox.selectedIndex = stopPIndex;
	},
	
	changeCalqueEvent: function() {
		var calque = document.getElementById(document.getElementById('calqueName').options[document.getElementById('calqueName').selectedIndex].text);
		var phase  = document.getElementById('phase').options[document.getElementById('phase').selectedIndex].text;
		var stopP  = document.getElementById('stopP').options[document.getElementById('stopP').selectedIndex].text;
		
		calque.test4Phase = ( phase == 'capture' );
		calque.test4StopP = ( stopP == 'bloquant' );
		
		calque.removeEventListener('click', test4.testPhase, !calque.test4Phase);
		calque.addEventListener('click', test4.testPhase, calque.test4Phase);
		
		calque.getElementsByTagName('span')[0].firstChild.data = '(' + phase + ')';
		calque.getElementsByTagName('span')[1].firstChild.data = '(' + stopP + ')';
	}
};

/*
	Test d'annulation de l'action par défaut
 */
var test5 = {
	preventDefaultAction: false,
	
	initialize: function() {
		document.getElementById('test5a').addEventListener('click', test5, false);
		document.getElementById('test5b').addEventListener('click', test5, false);
	},
	
	handleEvent: function(evt) {
		if( evt.target.getAttribute('id') == 'test5a' )
		{
			this.preventDefaultAction = !this.preventDefaultAction;
			
			if( this.preventDefaultAction == true )
			{
				//evt.target.getAttributeNode('value').firstChild.replaceData(0, 4, 'A');
				evt.target.setAttribute('value', 'Activer lien');
			}
			else
			{
				//evt.target.getAttributeNode('value').firstChild.replaceData(0, 1, 'Désa');
				evt.target.setAttribute('value', 'Désactiver le lien');
			}
		}
		else if( this.preventDefaultAction )
		{
			evt.preventDefault();
		}
	}
};

/*
	Création de nouvel élément + enregistrement et suppression de guetteurs
 */
var test6 = {
	initialize: function() {
		document.getElementById('makeElem').addEventListener('click', test6.createNewElem, false);
	},
	
	createNewElem: function(evt) {
		if( document.getElementById('newElem') == null )
		{
			var newElem = document.createElement('input');
			newElem.setAttribute('type', 'button');
			newElem.setAttribute('id', 'newElem');
			newElem.setAttribute('value', 'Cliquez ici');
			newElem.addEventListener('click', writeProps, false);
			evt.target.parentNode.appendChild(document.createTextNode('\u00A0'));
			evt.target.parentNode.appendChild(newElem);
			evt.target.parentNode.appendChild(document.createTextNode('\u00A0'));
			newElem = newElem.cloneNode(false);
			newElem.removeAttribute('id');
			newElem.setAttribute('value', 'Retirer le guetteur');
			newElem.addEventListener('click', test6.removeListener, false);
			evt.target.parentNode.appendChild(newElem);
			document.getElementById('makeElem').blur();
			document.getElementById('makeElem').disabled = true;
		}
	},
	
	removeListener: function(evt) {
		document.getElementById('newElem').removeEventListener('click', writeProps, false);
		evt.currentTarget.blur();
		evt.currentTarget.disabled = true;
	}
};

/*
	Déclenchement d'évènements
 */
var test7 = {
	initialize: function() {
		document.getElementById('test7a').addEventListener('click', test7.createNewEvent, false);
		document.getElementById('test7b').addEventListener('click', test7.createNewEvent, false);
		document.getElementById('theDiv').addEventListener('click', writeProps, false);
		document.getElementById('theDiv').addEventListener('MYCustomEvent', writeProps, false);
	},
	
	createNewEvent: function(evt) {
		var newEvt;
		var choiceTarget = document.getElementById('choiceTarget');
		
		if( evt.currentTarget.getAttribute('id') == 'test7a' )
		{
			newEvt = document.createEvent('MouseEvents');
			newEvt.initMouseEvent('click', true, false, window, 1, 0, 0, 0, 0, false, false, true, false, 0, null);
		}
		else
		{
			newEvt = document.createEvent('Events');
			newEvt.initEvent('MYCustomEvent', true, false);
		}
		
		choiceTarget = choiceTarget.options[choiceTarget.selectedIndex].value;
		document.getElementById(choiceTarget).dispatchEvent(newEvt);
	}
};

/*
	Ajout de guetteur en cours de traitement d'évènement
 */
var test8 = {
	initialize: function() {
		document.getElementById('test8a').addEventListener('click', test8.listener1, false);
		document.getElementById('test8b').addEventListener('click', test8.listener3, false);
		document.getElementById('test8b').parentNode.addEventListener('click', test8.listener4, false);
		document.getElementById('test8c').addEventListener('click', test8.listener6, false);
		document.getElementById('test8c').addEventListener('click', test8.listener7, false);
	},
	
	listener1: function(evt) {
		evt.currentTarget.addEventListener('click', test8.listener2, false);
		appendResultLabel(evt.currentTarget.parentNode, true);
		evt.currentTarget.disabled = true;
		evt.currentTarget.blur();
	},
	
	listener2: function(evt) {
		appendResultLabel(evt.currentTarget.parentNode, false);
	},
	
	listener3: function(evt) {
		evt.currentTarget.parentNode.addEventListener('click', test8.listener5, false);
		appendResultLabel(evt.currentTarget.parentNode, false);
		evt.currentTarget.disabled = true;
		evt.currentTarget.blur();
	},
	
	listener4: function(evt) {
		if( evt.target.nodeName.toLowerCase() == 'input' )
		{
			appendResultLabel(evt.currentTarget, false);
		}
	},
	
	listener5: function(evt) {
		if( evt.eventPhase == evt.BUBBLING_PHASE )
		{
			appendResultLabel(evt.currentTarget, true);
		}
	},
	
	listener6: function(evt) {
		evt.currentTarget.removeEventListener('click', test8.listener6, false);
		appendResultLabel(evt.currentTarget.parentNode, false);
		evt.currentTarget.disabled = true;
		evt.currentTarget.blur();
	},
	
	listener7: function(evt) {
		appendResultLabel(evt.currentTarget.parentNode, true);
		evt.currentTarget.disabled = true;
		evt.currentTarget.blur();
	}
};

/*
	Clonage d'élément
 */
var test9 = {
	result: null,
	
	initialize: function() {
		document.getElementById('test9a').addEventListener('click', test9.listener1, false);
	},
	
	listener1: function(evt) {
		if( evt.currentTarget.getAttribute('id') == 'test9a' )
		{
			var newButton = evt.currentTarget.cloneNode(true);
			newButton.setAttribute('id', 'clonedButton');
			newButton.setAttribute('value', 'Bouton cloné');
			newButton.addEventListener('click', test9.listener2, false);
			evt.currentTarget.parentNode.appendChild(document.createTextNode('\u00A0'));
			evt.currentTarget.parentNode.appendChild(newButton);
			evt.currentTarget.parentNode.addEventListener('click', test9.listener3, false);
		}
		else
		{
			test9.result = true;
			appendResultLabel(evt.currentTarget.parentNode, false);
		}
		
		evt.currentTarget.disabled = true;
		evt.currentTarget.blur();
		evt.stopPropagation();
		writeProps(evt);
	},
	
	listener2: function(evt) {
		if( evt.currentTarget.getAttribute('id') != 'test9a' && test9.result == null )
		{
			test9.result = true;
			appendResultLabel(evt.currentTarget.parentNode, true);
			evt.currentTarget.parentNode.removeEventListener('click', test9.listener3, false);
		}
		else
		{
			appendResultLabel(evt.currentTarget.parentNode, false);
			evt.currentTarget.nextSibling.nextSibling.disabled = true;
		}
		evt.currentTarget.disabled = true;
		evt.currentTarget.blur();
		evt.stopPropagation();
		writeProps(evt);
	},
	
	listener3: function(evt) {
		appendResultLabel(evt.currentTarget, false);
		writeProps(evt);
	}
};

/*
	Évènements spécifiques au DOM du W3C
 */
var test10 = {
	initialize: function() {
		if( typeof(document.getElementById('test10').DOM_addEventListener) != 'undefined' )
		{
			document.getElementById('test10').addEventListener('DOMNodeInserted', test10.listener1, false);
			document.getElementById('test10a').addEventListener('click', test10.listener2, false);
		}
		else
		{
			document.getElementById('test10a').disabled = true;
			var bloc = document.createElement('span');
			bloc.style.color = 'red';
			bloc.appendChild(document.createTextNode('Votre navigateur ne supporte pas les évènements de mutation'));
			document.getElementById('test10').getElementsByTagName('div')[0].appendChild(document.createTextNode(' '));
			document.getElementById('test10').getElementsByTagName('div')[0].appendChild(bloc);
		}
	},
	
	listener1: function(evt) {
		evt.currentTarget.removeEventListener('DOMNodeInserted', test10.listener1, false);
		appendResultLabel(evt.currentTarget.getElementsByTagName('div')[0], true);
	},
	
	listener2: function(evt) {
		appendResultLabel(evt.currentTarget.parentNode, false);
		evt.currentTarget.disabled = true;
		evt.currentTarget.blur();
	}
};

/*
	Test pour vérifier que les différentes phases du flux d’évènement se poursuivent selon 
	l’état initial de l’arbre (eg: même si un noeud est retiré durant le traitement de 
	l’évènement et que ce noeud faisait parti de ceux traversés par l’évènement, ses 
	guetteurs doivent quand même être déclenchés.
	http://www.yoyodesign.org/doc/w3c/dom2/events/events.html#Events-flow-capture (et chapitre 
	suivant pour la phase de bouillonnement).
 */
var test11 = {
	initialize: function() {
		document.getElementById('test11a').addEventListener('click', test11.listener1, false);
		document.getElementById('test11a').parentNode.addEventListener('click', test11.listener2, false);
	},
	
	listener1: function(evt) {
		appendResultLabel(document.getElementById('test11'), false);
		evt.currentTarget.parentNode.parentNode.removeChild(evt.currentTarget.parentNode);
	},
	
	listener2: function(evt) {
		if( evt.eventPhase == evt.BUBBLING_PHASE )
		{
			appendResultLabel(document.getElementById('test11'), true);
			writeProps(evt);
		}
	}
};

function appendResultLabel(elem, result)
{
	var color, texte;
	if( result == true )
	{
		color = 'green';
		texte = 'TEST PASSED';
	}
	else
	{
		color = 'red';
		texte = 'TEST FAILED';
	}
	
	if( elem.lastChild.nodeType != Node.ELEMENT_NODE || elem.lastChild.getAttribute('class') != 'label' )
	{
		var label = document.createElement('span');
		label.setAttribute('class', 'label');
		label.style.marginLeft = '6px';
		label.style.fontWeight = 'bold';
		label.style.color	   = color;
		label.appendChild(document.createTextNode(texte));
		elem.appendChild(label);
	}
	else
	{
		elem.lastChild.style.color = color;
		elem.lastChild.firstChild.data = texte;
	}
}

function writeProps(evt)
{
	var cell, texte;
	
	for( var i = 0, m = eventProps.length; i < m; i++ )
	{
		if( typeof(evt[eventProps[i]]) != 'undefined' )
		{
			texte = evt[eventProps[i]];
			
			if( eventProps[i].indexOf('arget') != -1 && texte != null )
			{
				texte += ' (' + evt[eventProps[i]].nodeName;
				if( evt[eventProps[i]].nodeType == Node.ELEMENT_NODE && evt[eventProps[i]].getAttribute('id') )
				{
					texte += ', id:\u00A0' + evt[eventProps[i]].getAttribute('id');
				}
				
				texte += ')';
			}
			else if( eventProps[i] == 'timeStamp' && typeof(evt[eventProps[i]]) == 'object' && typeof(evt[eventProps[i]].getTime) != 'undefined' )
			{
				texte += ' (objet Date)';
			}
		}
		else
		{
			texte = '\u2013';// tiret demi-cadratin
		}
		
		cell = document.getElementById(eventProps[i] + 'Val');
		if( cell.hasChildNodes() == false )
		{
			cell.appendChild(document.createTextNode(texte));
		}
		else
		{
			cell.firstChild.data = texte;
		}
	}
	
	for( i = 0, m = tabPos.length; i < m; i++ )
	{
		if( typeof(evt[tabPos[i] + 'X']) != 'undefined' )
		{
			texte = evt[tabPos[i] + 'X'] + ',\u00A0' + evt[tabPos[i] + 'Y'];
		}
		else
		{
			texte = '\u2013';// tiret demi-cadratin
		}
		
		cell = document.getElementById(tabPos[i] + 'Val');
		if( cell.hasChildNodes() == false )
		{
			cell.appendChild(document.createTextNode(texte));
		}
		else
		{
			cell.firstChild.data = texte;
		}
	}
}

var eventProps	= new Array("type", "eventPhase", "bubbles", "cancelable", "timeStamp", "view", "currentTarget", "target", "relatedTarget", "altKey", "ctrlKey", "shiftKey", "metaKey", "button", "detail", "keyCode");
var tabPos		= new Array("screen", "client", "page", "offset", "layer");

var _listingEvents = {
	disabled: true,
	displayed: false,
	
	processClick: function(evt) {
		var listingBox = document.getElementById('listingEvents');
		
		if( evt.target.nodeName.toLowerCase() == 'h1' )
		{
			var displayVal = '';
			if( _listingEvents.displayed == true )
			{
				_listingEvents.displayed = false;
				displayVal = 'none';
				evt.target.style.borderStyle = '';
				evt.target.style.borderWidth = '';
				evt.target.style.borderColor = '';
			}
			else
			{
				_listingEvents.displayed = true;
				displayVal = 'block';
				evt.target.style.borderStyle = 'solid';
				evt.target.style.borderWidth = '0 0 1px 0';
				evt.target.style.borderColor = 'black';
			}
			
			var contentDiv = listingBox.getElementsByTagName('div')[0];
			for( var i = 0, m = contentDiv.childNodes.length; i < m; i++ )
			{
				if( contentDiv.childNodes[i].nodeType == Node.ELEMENT_NODE && contentDiv.childNodes[i].nodeName.toLowerCase() == 'div' )
				{
					contentDiv.childNodes[i].style.display = displayVal;
				}
			}
		}
		else if( evt.target.nodeName.toLowerCase() == 'img' )
		{
			var image, texte;
			if( _listingEvents.disabled == false )
			{
				image = 'off.png';
				texte = 'Activer le listing des évènements';
			}
			else
			{
				image = 'on.png';
				texte = 'Désactiver le listing des évènements';
			}
			
			evt.target.setAttribute('src', image);
			evt.target.setAttribute('title', texte);
			
			_listingEvents.disabled = !_listingEvents.disabled;
		}
	},
	
	write: function(str) {
		if( this.disabled == true )
		{
			return;
		}
		
		var contentBox = document.getElementById('listingEvents').getElementsByTagName('div')[1];
		
		if( contentBox.firstChild != null && contentBox.firstChild.getAttribute('class') == 'todelete' )
		{
			contentBox.removeChild(contentBox.firstChild);
		}
		
		var bloc = document.createElement('div');
		bloc.appendChild(document.createTextNode(str));
		contentBox.appendChild(bloc);
		
		if( contentBox.childNodes.length > 10 )
		{
			contentBox.removeChild(contentBox.firstChild);
		}
	}
};

var _viewFlow = {
	disabled: true,
	displayed: false,
	listFlow: false,
	isDefaultPreventedFix: false,
	
	processClick: function(evt) {
		var listingBox = document.getElementById('eventFlow');
		
		if( evt.target.nodeName.toLowerCase() == 'h1' )
		{
			var displayVal = '';
			if( _viewFlow.displayed == true )
			{
				_viewFlow.displayed = false;
				displayVal = 'none';
				evt.target.style.borderStyle = '';
				evt.target.style.borderWidth = '';
				evt.target.style.borderColor = '';
			}
			else
			{
				_viewFlow.displayed = true;
				displayVal = 'block';
				evt.target.style.borderStyle = 'solid';
				evt.target.style.borderWidth = '0 0 1px 0';
				evt.target.style.borderColor = 'black';
			}
			
			var contentDiv = listingBox.getElementsByTagName('div')[0];
			for( var i = 0, m = contentDiv.childNodes.length; i < m; i++ )
			{
				if( contentDiv.childNodes[i].nodeType == Node.ELEMENT_NODE && contentDiv.childNodes[i].nodeName.toLowerCase() == 'div' )
				{
					contentDiv.childNodes[i].style.display = displayVal;
				}
			}
		}
		else if( evt.target.nodeName.toLowerCase() == 'img' )
		{
			var image, texte;
			if( _viewFlow.disabled == false )
			{
				image = 'off.png';
				texte = 'Activer le listing du flux d’évènement';
			}
			else
			{
				image = 'on.png';
				texte = 'Désactiver le listing du flux d’évènement';
			}
			
			evt.target.setAttribute('src', image);
			evt.target.setAttribute('title', texte);
			
			_viewFlow.disabled = !_viewFlow.disabled;
		}
		else if( evt.target.nodeName.toLowerCase() == 'span' && evt.target.getAttribute('class') == 'elemFlow' )
		{
			// grr Mozilla
			var propertyName = ( navigator.userAgent.indexOf('Gecko') != -1 ) ? 'MozOutline' : 'outline';
			
			if( evt.target.elem.style[propertyName] == '' )
			{
				evt.target.elem.style[propertyName] = '1px dotted red';
			}
			else
			{
				evt.target.elem.style[propertyName] = '';
			}
		}
	},
	
	erase: function(evt) {
		if( _viewFlow.disabled == false && ( ( evt.currentTarget.nodeType == Node.DOCUMENT_NODE && evt.type.indexOf('mouse') == -1 )
			|| ( evt.currentTarget.nodeType == Node.ELEMENT_NODE && evt.currentTarget.getAttribute('id') != 'eventFlow' ) ) )
		{
			_viewFlow.listFlow = !_viewFlow.disabled;
			var contentDiv = document.getElementById('eventFlow').getElementsByTagName('div')[1];
			while( contentDiv.childNodes.length > 0 )
			{
				contentDiv.removeChild(contentDiv.firstChild);
			}
		}
		else
		{
			_viewFlow.listFlow = false;
		}
	},
	
	write: function(str) {
		if( this.listFlow == false )
		{
			return;
		}
		
		var bloc = document.createElement('div');
		bloc.appendChild(document.createTextNode(str));
		document.getElementById('eventFlow').getElementsByTagName('div')[1].appendChild(bloc);
		
		if( arguments.length > 1 && arguments[1] == 'B' )
		{
			bloc.style.fontWeight = 'bold';
		}
	},
	
	writeStep: function(elem, evt, hasListener) {
		if( this.listFlow == false )
		{
			return;
		}
		
		var contentBox = document.getElementById('eventFlow').getElementsByTagName('div')[1];
		var str		= '';
		var blocElt = document.createElement('div');
		var spanElt = document.createElement('span');
		
		spanElt.appendChild(document.createTextNode(elem.nodeName));
		if( elem.nodeType == Node.ELEMENT_NODE )
		{
			spanElt.setAttribute('class', 'elemFlow');
			spanElt.elem = elem;
		}
		blocElt.appendChild(spanElt);
		str	 = '\u00A0: ';
		blocElt.appendChild(document.createTextNode(str));
		
		str = ( hasListener ) ? 'listeners triggered' : 'no listener';
		spanElt = spanElt.cloneNode(false);
		spanElt.removeAttribute('class');
		spanElt.appendChild(document.createTextNode(str));
		spanElt.elem = null;
		if( hasListener )
			spanElt.style.color = 'green';
		
		blocElt.appendChild(spanElt);
		contentBox.appendChild(blocElt);
		
		if( evt._isPropagationStopped == true )
		{
			blocElt = blocElt.cloneNode(false);
			blocElt.style.marginLeft = '25px';
			blocElt.style.fontWeight = 'normal';
			blocElt.style.color		 = 'red';
			blocElt.appendChild(document.createTextNode('stopPropagation() called'));
			contentBox.appendChild(blocElt);
		}
		else if( evt._isDefaultPrevented == true && this.isDefaultPreventedFix == false )
		{
			this.isDefaultPreventedFix = true;
			blocElt = blocElt.cloneNode(false);
			blocElt.style.marginLeft = '25px';
			blocElt.style.fontWeight = 'normal';
			blocElt.style.color		 = 'red';
			blocElt.appendChild(document.createTextNode('preventDefault() called'));
			contentBox.appendChild(blocElt);
		}
	}
};

/* TODO: Ajouter un test pour le cas des enregistrements en double de même EventListener 
		 pour vérifier que l’ordre d’appel est correct. Voir eventOrderByRegister.html */

document.addEventListener('load', function(evt) {
	test2.initialize();
	test3.initialize();
	test4.initialize();
	test5.initialize();
	test6.initialize();
	test7.initialize();
	test8.initialize();
	test9.initialize();
	test10.initialize();
	test11.initialize();
	
	document.getElementById('eventFlow').addEventListener('click', _viewFlow.processClick, false);
	document.getElementById('listingEvents').addEventListener('click', _listingEvents.processClick, false);
	
	writeProps(evt);
}, false);

var tmp = new Image();
tmp.src = './on.png';

