Erreur d'exécution JScript [Fermé]

Signaler
Messages postés
142
Date d'inscription
vendredi 8 août 2008
Statut
Membre
Dernière intervention
20 juin 2011
-
Messages postés
142
Date d'inscription
vendredi 8 août 2008
Statut
Membre
Dernière intervention
20 juin 2011
-
Bonjour,

j'ai un soucis avec mes pages de site web...J'ai un menu, codé en Javascript qui se s'affiche plus, j'ai

"Une erreur est survenue.
souhaitez vous effectuer un debogage?

ligne27
erreur : objet attendu"

je lance le débogage :

"une exception de type 'Erreur d'exécution Microsoft JScript : objet attendu' n'a pas pu être gérée"

l'extrait de code est :
<SCRIPT language="JavaScript" type="text/JavaScript">
	// Affiche le menu dans la page:
	writeMenus();
	
</SCRIPT>


Est-ce que quelqu'un pourrait m'orienter sur le soucis...sachant que si je ne choisi pas d'efectuer le débogage, ma page s'affiche nickel, mais sans le menu, donc le programme s'arrête à writeMenus.

Merci d'avance

7 réponses

Messages postés
4100
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
2 septembre 2013
838
Bonjour,

Ta fonction javascript permet de créer et afficher ton menu, il serait donc bon de nous en donner le code puisque l'erreur doit être à l'intérieur.

Quitte à faire, mets tout le code du fichier javascript que tu importes pour gérer ton menu.

Merci.
Messages postés
142
Date d'inscription
vendredi 8 août 2008
Statut
Membre
Dernière intervention
20 juin 2011
9
ah pardon...

function writeMenus()
{
	if (!isDOM && !isIE4 && !isNS4)
	{
		return;
	}
	
	for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0])
	{
		// Variable for holding HTML for items and positions of next item.
		var str = '', itemX = 0, itemY = 0;
		
		// Remember, items start from 1 in the array (0 is menu object itself, above).
		// Also use properties of each item nested in the other with() for construction.
		for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem])
		{
			var itemID = 'menu' + currMenu + 'item' + currItem;
			
			// The width and height of the menu item - dependent on orientation!
			var w = (isVert ? width : length);
			var h = (isVert ? length : width);
			
			// Create a div or layer text string with appropriate styles/properties.
			// Thanks to Paul Maden (www.paulmaden.com) for helping debug this in IE4, apparently
			// the width must be a miniumum of 3 for it to work in that browser.
			if (isDOM || isIE4)
			{
				str += '<div id="' + itemID + '" style="position: statique; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; visibility: inherit; ';
				
				if (backCol)
				{
					str += 'background: ' + backCol + '; ';
				}
				str += '" ';
			}
			
			if (isNS4)
			{
				str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' +  w + '" height="' + h + '" visibility="inherit" ';
				
				if (backCol)
				{
					str += 'bgcolor="' + backCol + '" ';
				}
			}
			
			if (borderClass)
			{
				str += 'class="' + borderClass + '" ';
			}
			
			// Add mouseover handlers and finish div/layer.
			str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')">';
			
			// Add contents of item (default: table with link inside).
			// In IE/NS6+, add padding if there's a border to emulate NS4's layer padding.
			// If a target frame is specified, also add that to the <a> tag.
			
			str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' + (!isNS4 && borderClass ? 3 : 0) + '"><tr><td align="left" height="' + (h - 7) + '">' + '<a class="' + textClass + '" href="' + href + '"' + (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';
			
			if (target > 0)
			{
				// Set target's parents to this menu item.
				menu[target][0].parentMenu = currMenu;
				menu[target][0].parentItem = currItem;
				
				// Add a popout indicator.
				if (popInd)
				{
					str += '<td class="' + textClass + '" align="right">' + popInd + '</td>';
				}
			}
			str += '</tr></table>' + (isNS4 ? '</layer>' : '</div>');
			
			if (isVert)
			{
				itemY += length + spacing;
			}
			else
			{
				itemX += length + spacing;
			}
		}
		
		if (isDOM)
		{
			var newDiv = document.createElement('div');
			document.getElementsByTagName('body').item(0).appendChild(newDiv);
			newDiv.innerHTML = str;
			ref = newDiv.style;
			ref.position = 'absolute';
			ref.visibility = 'hidden';
		}

		// Insert a div tag to the end of the BODY with menu HTML in place for IE4.
		if (isIE4)
		{
			document.body.insertAdjacentHTML('beforeEnd', '<div id="menu' + currMenu + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
			ref = getSty('menu' + currMenu + 'div');
		}
		
		// In NS4, create a reference to a new layer and write the items to it.
		if (isNS4)
		{
			ref = new Layer(0);
			ref.document.write(str);
			ref.document.close();
		}

		for (currItem = 1; currItem < menu[currMenu].length; currItem++)
		{
			itemName = 'menu' + currMenu + 'item' + currItem;
			if (isDOM || isIE4)
			{
				menu[currMenu][currItem].ref = getSty(itemName);
			}
			if (isNS4)
			{
				menu[currMenu][currItem].ref = ref.document[itemName];
			}
		}
	}
	
	with(menu[0][0])
	{
		ref.left = x;
		ref.top = y;
		ref.visibility = 'visible';
	}
}
Messages postés
142
Date d'inscription
vendredi 8 août 2008
Statut
Membre
Dernière intervention
20 juin 2011
9
allo?
qu'est-ce qui ne va pas avec mon appel de fonction???
Messages postés
4100
Date d'inscription
jeudi 7 avril 2005
Statut
Contributeur
Dernière intervention
2 septembre 2013
838
Re,

As-tu bien inclut le fichier dans lequel se situe le code javascript que tu utilise ?
Si oui, ne te manquerait-il pas un autre fichier ? Car de ce que je vois, le code de ta fonction fait référence à des variable que ne sont pas définies à l'intérieur de la fonction elle même, il doit donc y avoir autre chose. (Il y a d'autre code dans le fichier ou se situe ta fonction ?)

Dans tous les cas, je dirai que le plus simple c'est de retourné sur le site où tu as pompé ce code, et de demander à son auteur directement.
Messages postés
142
Date d'inscription
vendredi 8 août 2008
Statut
Membre
Dernière intervention
20 juin 2011
9
bon, voici la code entier du menuG, là, je n'avais mis que la fonction:
var isDOM = (document.getElementById ? true : false); 
var isIE4 = ((document.all && !isDOM) ? true : false);
var isNS4 = (document.layers ? true : false);

function getRef(id)
{
	if (isDOM)
	{
		return document.getElementById(id);
	}
	
	if (isIE4)
	{
		return document.all[id];
	}
	
	if (isNS4)
	{
		return document.layers[id];
	}
}

function getSty(id)
{
	return (isNS4 ? getRef(id) : getRef(id).style);
} 

// Hide timeout.
var popTimer = 0;
// Array showing highlighted menu items.
var litNow = new Array();

function popOver(menuNum, itemNum)
{
	clearTimeout(popTimer);
	hideAllBut(menuNum);
	litNow = getTree(menuNum, itemNum);
	changeCol(litNow, true);
	targetNum = menu[menuNum][itemNum].target;
	if (targetNum > 0)
	{
		thisX = parseInt(menu[menuNum][0].ref.left) + parseInt(menu[menuNum][itemNum].ref.left);
		thisY = parseInt(menu[menuNum][0].ref.top) + parseInt(menu[menuNum][itemNum].ref.top);
		with (menu[targetNum][0].ref)
		{
			left = parseInt(thisX + menu[targetNum][0].x);
			top = parseInt(thisY + menu[targetNum][0].y);
			visibility = 'visible';
		}
	}
}

function popOut(menuNum, itemNum)
{
	if ((menuNum == 0) && !menu[menuNum][itemNum].target)
	{
		hideAllBut(0)
	}
	else
	{
		popTimer = setTimeout('hideAllBut(0)', 500);
	}
}

function getTree(menuNum, itemNum)
{
	// Array index is the menu number. The contents are null (if that menu is not a parent)
	// or the item number in that menu that is an ancestor (to light it up).
	itemArray = new Array(menu.length);
	
	while(1)
	{
		itemArray[menuNum] = itemNum;
		
		// If we've reached the top of the hierarchy, return.
		if (menuNum == 0)
		{
			return itemArray;
		}
		itemNum = menu[menuNum][0].parentItem;
		menuNum = menu[menuNum][0].parentMenu;
	}
}

// Pass an array and a boolean to specify colour change, true = over colour.
function changeCol(changeArray, isOver)
{
	for (menuCount = 0; menuCount < changeArray.length; menuCount++)
	{
		if (changeArray[menuCount])
		{
			newCol = isOver ? menu[menuCount][0].overCol : menu[menuCount][0].backCol;
			// Change the colours of the div/layer background.
			with (menu[menuCount][changeArray[menuCount]].ref)
			{
				if (isNS4)
				{
					bgColor = newCol;
				}
				else
				{
					backgroundColor = newCol;
				}
			}
		}
	}
}

function hideAllBut(menuNum)
{
	var keepMenus = getTree(menuNum, 1);
	for (count = 0; count < menu.length; count++)
	{
		if (!keepMenus[count])
		{
			menu[count][0].ref.visibility = 'hidden';
		}
	}
	changeCol(litNow, false);
}

// *** MENU CONSTRUCTION FUNCTIONS ***

function Menu(isVert, popInd, x, y, width, overCol, backCol, borderClass, textClass)
{
	// True or false - a vertical menu?
	this.isVert = isVert;
	// The popout indicator used (if any) for this menu.
	this.popInd = popInd
	// Position and size settings.
	this.x = x;
	this.y = y;
	this.width = width;
	// Colours of menu and items.
	this.overCol = overCol;
	this.backCol = backCol;
	// The stylesheet class used for item borders and the text within items.
	this.borderClass = borderClass;
	this.textClass = textClass;
	// Parent menu and item numbers, indexed later.
	this.parentMenu = null;
	this.parentItem = null;
	// Reference to the object's style properties (set later).
	this.ref = null;
}

function Item(text, href, frame, length, spacing, target)
{
	this.text = text;
	this.href = href;
	this.frame = frame;
	this.length = length;
	this.spacing = spacing;
	this.target = target;
	// Reference to the object's style properties (set later).
	this.ref = null;
}

function writeMenus()
{
	if (!isDOM && !isIE4 && !isNS4)
	{
		return;
	}
	
	for (currMenu = 0; currMenu < menu.length; currMenu++) with (menu[currMenu][0])
	{
		// Variable for holding HTML for items and positions of next item.
		var str = '', itemX = 0, itemY = 0;
		
		// Remember, items start from 1 in the array (0 is menu object itself, above).
		// Also use properties of each item nested in the other with() for construction.
		for (currItem = 1; currItem < menu[currMenu].length; currItem++) with (menu[currMenu][currItem])
		{
			var itemID = 'menu' + currMenu + 'item' + currItem;
			
			// The width and height of the menu item - dependent on orientation!
			var w = (isVert ? width : length);
			var h = (isVert ? length : width);
			
			// Create a div or layer text string with appropriate styles/properties.
			// Thanks to Paul Maden (www.paulmaden.com) for helping debug this in IE4, apparently
			// the width must be a miniumum of 3 for it to work in that browser.
			if (isDOM || isIE4)
			{
				str += '<div id="' + itemID + '" style="position: statique; left: ' + itemX + '; top: ' + itemY + '; width: ' + w + '; height: ' + h + '; visibility: inherit; ';
				
				if (backCol)
				{
					str += 'background: ' + backCol + '; ';
				}
				str += '" ';
			}
			
			if (isNS4)
			{
				str += '<layer id="' + itemID + '" left="' + itemX + '" top="' + itemY + '" width="' +  w + '" height="' + h + '" visibility="inherit" ';
				
				if (backCol)
				{
					str += 'bgcolor="' + backCol + '" ';
				}
			}
			
			if (borderClass)
			{
				str += 'class="' + borderClass + '" ';
			}
			
			// Add mouseover handlers and finish div/layer.
			str += 'onMouseOver="popOver(' + currMenu + ',' + currItem + ')" onMouseOut="popOut(' + currMenu + ',' + currItem + ')">';
			
			// Add contents of item (default: table with link inside).
			// In IE/NS6+, add padding if there's a border to emulate NS4's layer padding.
			// If a target frame is specified, also add that to the <a> tag.
			
			str += '<table width="' + (w - 8) + '" border="0" cellspacing="0" cellpadding="' + (!isNS4 && borderClass ? 3 : 0) + '"><tr><td align="left" height="' + (h - 7) + '">' + '<a class="' + textClass + '" href="' + href + '"' + (frame ? ' target="' + frame + '">' : '>') + text + '</a></td>';
			
			if (target > 0)
			{
				// Set target's parents to this menu item.
				menu[target][0].parentMenu = currMenu;
				menu[target][0].parentItem = currItem;
				
				// Add a popout indicator.
				if (popInd)
				{
					str += '<td class="' + textClass + '" align="right">' + popInd + '</td>';
				}
			}
			str += '</tr></table>' + (isNS4 ? '</layer>' : '</div>');
			
			if (isVert)
			{
				itemY += length + spacing;
			}
			else
			{
				itemX += length + spacing;
			}
		}
		
		if (isDOM)
		{
			var newDiv = document.createElement('div');
			document.getElementsByTagName('body').item(0).appendChild(newDiv);
			newDiv.innerHTML = str;
			ref = newDiv.style;
			ref.position = 'absolute';
			ref.visibility = 'hidden';
		}

		// Insert a div tag to the end of the BODY with menu HTML in place for IE4.
		if (isIE4)
		{
			document.body.insertAdjacentHTML('beforeEnd', '<div id="menu' + currMenu + 'div" ' + 'style="position: absolute; visibility: hidden">' + str + '</div>');
			ref = getSty('menu' + currMenu + 'div');
		}
		
		// In NS4, create a reference to a new layer and write the items to it.
		if (isNS4)
		{
			ref = new Layer(0);
			ref.document.write(str);
			ref.document.close();
		}

		for (currItem = 1; currItem < menu[currMenu].length; currItem++)
		{
			itemName = 'menu' + currMenu + 'item' + currItem;
			if (isDOM || isIE4)
			{
				menu[currMenu][currItem].ref = getSty(itemName);
			}
			if (isNS4)
			{
				menu[currMenu][currItem].ref = ref.document[itemName];
			}
		}
	}
	
	with(menu[0][0])
	{
		ref.left = x;
		ref.top = y;
		ref.visibility = 'visible';
	}
}



var menu = new Array();

// Default colours passed to most menu constructors (just passed to functions, not
// a global variable - makes things easier to change later in bulk).
var defOver = '#336699', defBack = '#003366';

// Default 'length' of menu items - item height if menu is vertical, width if horizontal.
var defLength = 22;
var M_over = '#F7D1B0';
var M_out = '#E0E0EF';

var Vertical = true;

var Fleche = '->';

var PosHaut = 81;
var PosGauche = 0;
var PosSubGauche = 150;
var PosSubHaut = -5;
var LargeurMenu = 500 ;
var HauteurItem = 20 ;
var Espacement = 1;

var defRecouv = 190 ;
/* Hauteur d'item par défaut  */
var defHautGrand = 30;
var defHautPetit = 20 ;
var defDecal = 3 ;


// Menu 0 is the special, 'root' menu from which everything else arises.
menu[0] = new Array();
// A vertical menu with a few different colours and no popout indicator, as an example.
// *** MOVE ROOT MENU AROUND HERE ***  it's positioned at (5, 0) and is 17px high now.
menu[0][0] = new Menu(Vertical, Fleche, PosGauche, PosHaut, LargeurMenu, M_over, M_out, 'itemBorder', 'itemText');
// Notice how the targets are all set to nonzero values...
// The 'length' of each of these items is 40, and there is spacing of 10 to the next item.
// Most of the links are set to '#' hashes, make sure you change them to actual files.
menu[0][1] = new Item('&nbsp;Société           ', '../Societe/Societe.asp', '', HauteurItem, Espacement, 0);
menu[0][2] = new Item('&nbsp;Actualités        ', '../Actualites/Actualites.asp', '', HauteurItem, Espacement, 0);
menu[0][3] = new Item('&nbsp;Produits          ', '../Produits/Produits.asp', '', HauteurItem, Espacement, 2);
menu[0][4] = new Item('&nbsp;Téléchargement    ', '../Telechargement/Telechargement.asp', '', HauteurItem, Espacement, 0);
menu[0][5] = new Item('&nbsp;Support           ', '../Support/Support.asp', '', HauteurItem, Espacement, 3);
menu[0][6] = new Item('&nbsp;Contact           ', '../Contact/Contact.asp', '', HauteurItem, Espacement, 4);
menu[0][7] = new Item('&nbsp;Extranet <b>C.S.O</b>', 'http://blablabla.com', '', HauteurItem, 0, 0);
menu[0][8] = new Item('&nbsp;Web Manager       ', '../WebPDV/webpdv.asp', '', HauteurItem, Espacement, 0);
//menu[0][7] = new Item('&nbsp;Accès Revendeurs  ', '../Users/Users.asp', '', HauteurItem, Espacement, 0);
//menu[0][7] = new Item('&nbsp;Revendeurs', '../Contact/Revendeurs.asp', '', HauteurItem, Espacement, 0);

// menu Société.
menu[1] = new Array();
// The File menu is positioned 0px across and 22 down from its trigger, and is 80 wide.
// All text in this menu has the stylesheet class 'item' -- see the <style> section above.
// We've passed a 'greater-than' sign '>' as a popout indicator. Try an image...?
menu[1][0] = new Menu(Vertical, Fleche, PosSubGauche, PosSubHaut, LargeurMenu, M_over, M_out, 'itemBorder', 'itemText');
menu[1][1] = new Item('&nbsp;Activités          ', '../Societe/Societe.asp?menu=activites', '', HauteurItem, 0, 0);
menu[1][2] = new Item('&nbsp;Références         ', '../Societe/Societe.asp?menu=references', '', HauteurItem, 0, 0);
// Non-zero target means this will trigger a popout -- menu[4] whicAh is the 'Reopen' menu.
menu[1][3] = new Item('&nbsp;Partenaires        ', '../Societe/Societe.asp?menu=partenaires', '', HauteurItem, 0, 0);

// menu Produits.
menu[2] = new Array();
menu[2][0] = new Menu(Vertical, Fleche, PosSubGauche, PosSubHaut, LargeurMenu, M_over, M_out, 'itemBorder', 'itemText');
menu[2][1] = new Item('&nbsp;Logiciels          ', '../Produits/Produits.asp?Categ=Logiciels', '', HauteurItem, 0, 0);
menu[2][2] = new Item('&nbsp;Materiels          ', '../Produits/Produits.asp?Categ=Materiels', '', HauteurItem, 0, 0);
menu[2][3] = new Item('&nbsp;Services           ', '../Produits/Produits.asp?Categ=Services', '', HauteurItem, 0, 0);
menu[2][4] = new Item('&nbsp;Tarifs             ', '../Telechargement/Telechargement.asp?CATEG=3-TARIFS', '', HauteurItem, 0, 0);
//menu[2][6] = new Item(' 10 Raisons', '../Produits/Produits.asp?MENU=RAISONS', '', HauteurItem, 0, 0);

// menu Support.
menu[3] = new Array();
menu[3][0] = new Menu(Vertical, Fleche, PosSubGauche, PosSubHaut, LargeurMenu, M_over, M_out, 'itemBorder', 'itemText');
menu[3][1] = new Item('&nbsp;Centre&nbsp;de&nbsp;solutions', 'http://blablabla.com', '', HauteurItem, 0, 0);
menu[3][2] = new Item('&nbsp;Infos Hot-Line       ', 'http://orchestra.vous-ecoute.com/?lang=fr&ppz=f1d7db63-f0d5-4f35-9a37-030a5ee48ebb&ppa=ppav&ppt=kb_art&pppk=661&pg=normal', '', HauteurItem, 0, 0);
menu[3][3] = new Item('&nbsp;Contacter            ', 'http://orchestra.vous-ecoute.com', '', HauteurItem, 0, 0);

// menu Contact.
menu[4] = new Array();
menu[4][0] = new Menu(Vertical, Fleche, PosSubGauche, PosSubHaut, LargeurMenu, M_over, M_out, 'itemBorder', 'itemText');
menu[4][1] = new Item('&nbsp;Nous contacter     ', '../Contact/Contact.asp', '', HauteurItem, 0, 0);
menu[4][2] = new Item('&nbsp;Documentations     ', '../Contact/Demande.asp', '', HauteurItem, 0, 0);

// menu Logiciels.
//menu[5] = new Array();
//menu[5][0] = new Menu(Vertical, Fleche, PosSubGauche, PosSubHaut, LargeurMenu, M_over, M_out, 'itemBorder', 'itemText');
//menu[5][1] = new Item('&nbsp;Hotel', '../Produits/Produits.asp?MENU=HOTEL', '', HauteurItem, 0, 0);
//menu[5][2] = new Item('&nbsp;Restaurant', '../Produits/Produits.asp?MENU=RESTO', '', HauteurItem, 0, 0);
//menu[5][3] = new Item('&nbsp;Orchestra Web', '../Produits/Produits.asp?MENU=ORCHWEB', '', HauteurItem, 0, 0);
//menu[5][4] = new Item('&nbsp;Internet', '../Produits/Produits.asp?MENU=INTERNET', '', HauteurItem, 0, 0);

// menu Matèriels.
//menu[6] = new Array();
//menu[6][0] = new Menu(Vertical, Fleche, PosSubGauche, PosSubHaut, LargeurMenu, M_over, M_out, 'itemBorder', 'itemText');
//menu[6][1] = new Item('&nbsp;PT3000', '../Produits/Produits.asp?MENU=PT3000', '', HauteurItem, 0, 0);

<!-- *** IMPORTANT STYLESHEET SECTION - Change the border classes and text colours *** -->
// Voir le fichier Styles.css dans le dossier des styles

// *** OPTIONAL CODE FROM HERE DOWN ***

// These two lines handle the window resize bug in NS4. See <body onResize="...">.
// I recommend you leave this here as otherwise when you resize NS4's width menus are hidden.

var popOldWidth = window.innerWidth;
nsResizeHandler = new Function('if (popOldWidth != window.innerWidth) location.reload()');


// This is a quick snippet that captures all clicks on the document and hides the menus
// every time you click. Use if youA want.

if (isNS4)
{
	document.captureEvents(Event.CLICK);
}
document.onclick = clickHandle;

function clickHandle(evt)
{
	if (isNS4)
	{
		document.routeEvent(evt);
	}
	hideAllBut(0);
}

// This is just the moving command for the example.

function moveRoot()
{
	with(menu[0][0].ref)
	{
		left = ((parseInt(left) < 100) ? 100 : 5);
	}
}


et le fichier utilisant la fonction :
...
<!-- Scripts JavaScript -->
<SCRIPT language="JavaScript" src="../Scripts/MenuG.js" type="text/JavaScript"></SCRIPT>

...
<BODY>
<SCRIPT language="JavaScript" type="text/JavaScript">
	// Affiche le menu dans la page
	writeMenus(); 
	
</SCRIPT>

...
<TD height="150" valign="top" class="MenuG"> 
             <!-- Le menu est dans cette cellule -->
          </TD>

...
il faut savoir que ce matin encore ce code marchait, que j'avais le menu qui s'afficher, mais tout d'un coup, ptèt le fait de le tester en local, avec un serveur IIS (oui le fichier est en asp) fait planté le truc, mais je pense que c'est au niveau du code car le débogueur s'arrête à la ligne :
writeMenus();
ça ne vient pas du fichier script ça j'en suis persuadé vu qu'il fonctionnait ce matin... en tout cas, merci si tu as pu y jeter un coup d'œil et merci si tu peux m'aider!!!
Messages postés
142
Date d'inscription
vendredi 8 août 2008
Statut
Membre
Dernière intervention
20 juin 2011
9
ps:j'aurais bien demandé à l'auteur du site, mais il ne travaille plus dans la boite pour laquelle je suis stagiaire...
Messages postés
142
Date d'inscription
vendredi 8 août 2008
Statut
Membre
Dernière intervention
20 juin 2011
9
nobody???