var gTempsMaxAparicio = 60; // Temps màxim que tardarà la mosca en apareixer (en segons)
var MOSCA3Obj = null;
var MOSCA3Obj_rot = 0;
var bMoscaEnMoviment = false;
var gIncMosca = 15;
var gIncMosca_temps = 15;
var gMoscaDiv = null;
var gIncMoscaDiag = 0;
var gTimeoutMosca = null;
var gArrTimeoutMosca = [];
gArrTimeoutMosca[0] = null;
gArrTimeoutMosca[1] = null;
gArrTimeoutMosca[2] = null;
gArrTimeoutMosca[3] = null;
gArrTimeoutMosca[4] = null;
gArrTimeoutMosca[5] = null;
var gEvitarTraspassarScroll = true;
var gMarxaMosca = false;

function initMosca()
{
	gIncMoscaDiag = parseInt(Math.sqrt((gIncMosca*gIncMosca)/2));
	gMoscaDiv = MM_findObj("moscaDiv");

	srcMoscaObj = '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="55" height="55" id="MOSCA3" align="middle">';
	srcMoscaObj += '	<param name="allowScriptAccess" value="sameDomain" />';
	srcMoscaObj += '	<param name="movie" value="'+jsNivell+'swf/MOSCA3.swf" />';
	srcMoscaObj += '	<param name="menu" value="false" />';
	srcMoscaObj += '	<param name="quality" value="high" />';
	srcMoscaObj += '	<param name="wmode" value="transparent" />';
	srcMoscaObj += '	<param name="bgcolor" value="#ffffff" />';
	srcMoscaObj += '	<embed src="'+jsNivell+'swf/MOSCA3.swf" menu="false" quality="high" wmode="transparent" bgcolor="#ffffff" width="55" height="55" name="MOSCA3" align="middle" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />';
	srcMoscaObj += '<'+'/object>';	
	gMoscaDiv.innerHTML = srcMoscaObj;
	

	var isInternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
	MOSCA3Obj = isInternetExplorer ? document.all.MOSCA3 : document.MOSCA3;
	
	calculaAmpladagAlturaFrame();
	startSaveScrollCoordinates();
	
	initApareixMosca();
}


function initApareixMosca()
{
	setTimeout("apareixMosca();", Math.random() * gTempsMaxAparicio*1000);
}

// Handle all the FSCommand messages in a Flash movie.
function MOSCA3_DoFSCommand(command, args) 
{
	if (command == "mouseOver")
	{
		bMoscaEnMoviment = false;
		avancaMosca(5, 12, true, "null");
	}
	//if (command == "click") alert("click");
//	if (command == "mouseDown") alert("mouseDown");
}
//document.onmousedown = apareixMosca;


function mouMosca()
{
	if (bMoscaEnMoviment == true) return;
	bMoscaEnMoviment = true;
	_recorregut1();
}


function apareixMosca()
{
	eliminaTimeouts();
	if (!gMoscaDiv) return;

	// La mosca apareixarà des de l'esquerra o des de dalt amb una probabilitat del 50%
	if (Math.random() > 0.5)	// apareix des de l'esquerra
	{
		var ttop = parseInt(50 + Math.random()*500);
		var tleft = -100;
		_rotaMosca(2);	// fem que la mosca miri cap a la dreta
	}
	else											// apareix des de dalt
	{
		var ttop = -100;
		var tleft = parseInt(50 + Math.random()*700);
		_rotaMosca(4);	// fem que la mosca miri cap a baix
	}
	// Posicionem la mosca fora de la pantalla
	gMoscaDiv.style.top = ttop + "px";
	gMoscaDiv.style.left = tleft + "px";
	//Fem la mosca visible
	gMoscaDiv.style.visibility = "visible";
	gEvitarTraspassarScroll = true;
	gMarxaMosca = false;
	//I que avanci
	_recorregut2();
}

function desapareixMosca()
{
	gMarxaMosca = true;

	if (!gMoscaDiv) return;
	if (gMoscaDiv.style.visibility == "hidden") return;
	
	ttop = parseInt(gMoscaDiv.style.top);
	tleft = parseInt(gMoscaDiv.style.left);
	if (ttop > -100 && tleft > -100){
		eliminaTimeouts();
		avancaMosca(3, 8, true, "desapareixMosca()");
	}
	else
	{
		gMoscaDiv.style.visibility = "hidden";
		gMoscaDiv.style.top = "0px";
		gMoscaDiv.style.left = "0px";
		eliminaTimeouts();
		initApareixMosca();
	}
}

function eliminaTimeouts()
{
	if (gTimeoutMosca) clearTimeout(gTimeoutMosca);
	gTimeoutMosca = null;
	for (i=0; i<gArrTimeoutMosca.length; i++)
	{
		if (gArrTimeoutMosca[i]) clearTimeout(gArrTimeoutMosca[i]);
		gArrTimeoutMosca[i] = null;
	}
}

//**************************************************************************************
//**************************************************************************************
//	Recorreguts predefinits de la mosca. Alguns són completament aleatoris
//**************************************************************************************
//**************************************************************************************

// Ha d'apareixer per l'esquerra per sota de 150px
function _recorregut1(fase)
{
	if (isNaN(fase)) _mouMosca1(-1, 150, "_recorregut1(1)");
	else if (fase == 1) _mouMosca0(100, "_recorregut1(2)");
	else if (fase == 2) _mouMosca1(-1, 10, "_recorregut1(3)");
	else if (fase == 3) _mouMosca2(400, "_recorregut1(4)");
	else if (fase == 4) _mouMosca3(650, 350, "_recorregut1(5)");
	else if (fase == 5) setTimeout('_mouMosca4(400, "_recorregut1(6)");',20000);
	else if (fase == 6) _mouMosca5(500, 450, "_recorregut1(7)");
	else if (fase == 7) _mouMosca6(300, "_recorregut1(8)");
	else if (fase == 8) _mouMosca7(50, 300, "_recorregut1(9)");
	else if (fase == 9) _mouMosca0(-90, "null");
}

// Aquest recorregut és aleatori
function _recorregut2(fase)
{
	if (isNaN(fase)) avancaMosca(8, 14, true, "_recorregut2(1)");	
	else if (fase == 1) gArrTimeoutMosca[0] = setTimeout('avancaMosca(5, 10, true, "_recorregut2(2)");', Math.random()*500);
	else if (fase == 2) gArrTimeoutMosca[1] = setTimeout('avancaMosca(5, 10, true, "_recorregut3()");', Math.random()*3000);
}

function _recorregut3(fase)
{
	if (isNaN(fase)) gArrTimeoutMosca[2] = setTimeout("_recorregut3(0)", Math.random()*3000)
	fase++;
	if (fase < 5)
		gArrTimeoutMosca[3] = setTimeout('avancaMosca(2, 3, true, "_recorregut3('+fase+')");',gIncMosca_temps);
	else
		setTimeout('desapareixMosca()', Math.random()*10000+5000);
}




//**************************************************************************************
// Fa avançar la mosca un nombre aleatori de vegades entre mouMin i mouMax
// Si canviaDir = 1 pot ser que canvii de la direcció actual a una adjacent (sense fer girs bruscos)
//
// Abans de cridar aquesta funció s'ha de rotar la mosca en algun sentit pq MOSCA3Obj_rot sigui != -1
//**************************************************************************************
function avancaMosca(mouMin, mouMax, canviaDir, strFunc)
{
	if (MOSCA3Obj_rot == -1) return;
	if (mouMin == mouMax) mou = mouMin;
	else	mou = aleatori(mouMin, mouMax);
	if (canviaDir == true)
	{
		var n = MOSCA3Obj_rot;
		var aleat = Math.random();
		if (aleat < 0.333) { n--; if (n < 0) n = 7; }
		else if (aleat > 0.666) { n++; if (n > 7) n = 0; }
		_rotaMosca(n);
	}
	_mouMoscaNCops(mou, MOSCA3Obj_rot, strFunc);
}


//*******************************************
// Rota la mosca en la direcció n
//*******************************************
function _rotaMosca(n)
{
	if (!MOSCA3Obj){return;}

	MOSCA3Obj.GotoFrame(n);
	MOSCA3Obj_rot = n;
}


//*******************************************
//*******************************************
//	La funció _mouMoscaNCops(..) mou la mosca
//	n vegades en la direcció que indica dir
//		Segons la variable 'dir':
//			0:up, 1:diagonal up drt, 2:drt, 3:diag dwn drt, 4:dwn, 5:diag dwn esq, 6:esq, 7:diag up esq
//  Després executa strFunc
//
// Si gEvitarTraspassarScroll == true la mosca no sortirà de la pantalla. Abans s'ha d'haver cridat la 
//	funció calculaAmpladagAlturaFrame() pq ompli les variables gAmpladaFrame i gAlturaFrame
//*******************************************
//*******************************************
function _mouMoscaNCops(n, dir, strFunc)
{
	if (!gMoscaDiv) return;

	ttop = parseInt(gMoscaDiv.style.top);
	tleft = parseInt(gMoscaDiv.style.left);

	var tDirCanviada = false;
	if ( gMarxaMosca || (gEvitarTraspassarScroll == true && tleft > (gAmpladaFrame-150+gScrollX) ))
	{
		if (dir == 2){
			if (Math.random() > 0.5) dir = 1;
			else dir = 3;
		}
		else if (dir == 1) dir = 0;
		else if (dir == 3) dir = 4;
		tDirCanviada = true;
	}
	
	if ( gMarxaMosca || (gEvitarTraspassarScroll == true && ttop > (gAlturaFrame-150+gScrollY) ))
	{
		if (dir == 4){
			if (Math.random() > 0.5) dir = 3;
			else dir = 5;
		}
		else if (dir == 3)
		{
			if (tDirCanviada) dir = 5;	// Fem un gir brusc si està a la cantonada inf drt
			else dir = 2;
		}
		else if (dir == 5) dir = 6;
	}

	_rotaMosca(dir); //Rota la mosca
	
	switch(dir)
	{
		case 0:
			ttop -= gIncMosca;																			break;
		case 1:
			ttop -= gIncMoscaDiag;			tleft += gIncMoscaDiag;			break;
		case 2:
			tleft += gIncMosca;																			break;
		case 3:
			ttop += gIncMoscaDiag;			tleft += gIncMoscaDiag;			break;
		case 4:
			ttop += gIncMosca;																			break;
		case 5:
			ttop += gIncMoscaDiag;			tleft -= gIncMoscaDiag;			break;
		case 6:
			tleft -= gIncMosca;																			break;
		case 7:
			ttop -= gIncMoscaDiag;			tleft -= gIncMoscaDiag;			break;
	}
	gMoscaDiv.style.top = ttop + "px";
	gMoscaDiv.style.left = tleft + "px";
	n--;
	if (n > 0) gTimeoutMosca = setTimeout("_mouMoscaNCops("+n+","+dir+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}

}


//*******************************************
//*******************************************
//	Les funcions _mouMoscaX(..) mouen la
//	mosca fins a una posició determinada
//	per fin, finx i finy.
//  Després executen strFunc
//*******************************************
//*******************************************

// Mou la mosca amunt
function _mouMosca0(fin, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(0);
	
	//Desplaça la mosca
	ttop = parseInt(gMoscaDiv.style.top);
	ttop -= gIncMosca;
	gMoscaDiv.style.top = ttop + "px";
	
	if (ttop > fin)	setTimeout("_mouMosca0("+fin+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}

// Mou la mosca en diagonal cap amunt i a la dreta
function _mouMosca1(finx, finy, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(1);
	
	ttop = parseInt(gMoscaDiv.style.top);
	tleft = parseInt(gMoscaDiv.style.left);
	ttop -= gIncMoscaDiag;
	tleft += gIncMoscaDiag;
	gMoscaDiv.style.top = ttop + "px";
	gMoscaDiv.style.left = tleft + "px";
	if (finy != -1 && ttop > finy) para = false;
	else if (finx != -1 && tleft < finx) para = false;
	else para = true;
	if (!para)		setTimeout("_mouMosca1("+finx+","+finy+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}

// Mou la mosca cap a la dreta
function _mouMosca2(fin, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(2);
	
	//Desplaça la mosca
	tleft = parseInt(gMoscaDiv.style.left);
	tleft += gIncMosca;
	gMoscaDiv.style.left = tleft + "px";
	
	if (tleft < fin)	setTimeout("_mouMosca2("+fin+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}


// Mou la mosca en diagonal cap avall i a la dreta
function _mouMosca3(finx, finy, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(3);
	
	ttop = parseInt(gMoscaDiv.style.top);
	tleft = parseInt(gMoscaDiv.style.left);
	ttop += gIncMoscaDiag;
	tleft += gIncMoscaDiag;
	gMoscaDiv.style.top = ttop + "px";
	gMoscaDiv.style.left = tleft + "px";
	if (finy != -1 && ttop > finy) para = false;
	else if (finx != -1 && tleft < finx) para = false;
	else para = true;
	if (!para)		setTimeout("_mouMosca3("+finx+","+finy+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}


// Mou la mosca avall
function _mouMosca4(fin, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(4);
	
	//Desplaça la mosca
	ttop = parseInt(gMoscaDiv.style.top);
	ttop += gIncMosca;
	gMoscaDiv.style.top = ttop + "px";
	
	if (ttop < fin)	setTimeout("_mouMosca4("+fin+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}


// Mou la mosca en diagonal cap avall i a l'esquerra
function _mouMosca5(finx, finy, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(5);
	
	ttop = parseInt(gMoscaDiv.style.top);
	tleft = parseInt(gMoscaDiv.style.left);
	ttop += gIncMoscaDiag;
	tleft -= gIncMoscaDiag;
	gMoscaDiv.style.top = ttop + "px";
	gMoscaDiv.style.left = tleft + "px";
	if (finy != -1 && ttop < finy) para = false;
	else if (finx != -1 && tleft > finx) para = false;
	else para = true;
	if (!para)		setTimeout("_mouMosca5("+finx+","+finy+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}


// Mou la mosca cap a l'esquerra
function _mouMosca6(fin, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(6);
	
	//Desplaça la mosca
	tleft = parseInt(gMoscaDiv.style.left);
	tleft -= gIncMosca;
	gMoscaDiv.style.left = tleft + "px";
	
	if (tleft > fin)	setTimeout("_mouMosca6("+fin+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}


// Mou la mosca en diagonal cap amunt i a l'esquerra
function _mouMosca7(finx, finy, strFunc)
{
	if (!gMoscaDiv) return;

	//Rota la mosca
	_rotaMosca(7);
	
	ttop = parseInt(gMoscaDiv.style.top);
	tleft = parseInt(gMoscaDiv.style.left);
	ttop -= gIncMoscaDiag;
	tleft -= gIncMoscaDiag;
	gMoscaDiv.style.top = ttop + "px";
	gMoscaDiv.style.left = tleft + "px";
	if (finy != -1 && ttop < finy) para = false;
	else if (finx != -1 && tleft > finx) para = false;
	else para = true;
	if (!para)		setTimeout("_mouMosca7("+finx+","+finy+",'"+strFunc+"')", gIncMosca_temps);
	else{
		if (strFunc == "null") bMoscaEnMoviment = false;
		else eval(strFunc);
	}
}


function aleatori(inferior,superior){
	var numPosibilitats = superior - inferior;
	var aleat = Math.random() * numPosibilitats;
	aleat = Math.round(aleat);
	return parseInt(inferior) + aleat;
} 