function crea_finestra(url)
  {
  carta=window.open(url, 'displayWindow', 'toolbar=0,location=0,directories=0,screenX=0,screenY=0,status=0,menubar=0,scrollbars=1,resizable=0,width=500,height=400');
  carta.focus();
  }
  
ns4 = (document.layers)? true:false
all = (document.getElementById)? true:false

function init() {
   if (ns4) {
     capa1 = document.capa1
  }
}

function muestra(obj)
{
	if (ns4) obj.visibility = "show"
	else if (all) document.getElementById(obj).style.visibility="visible"
}

function oculta(obj)
{
	if (ns4) obj.visibility = "hide"
	else if (all) document.getElementById(obj).style.visibility="hidden"
}

/*constructor objecte pregunta
	parametres:
	correcte(indexs dels botons radio q corresponen a les respostes correctes),
	els indexs han d'estar ordenats de menor a major
	missatge:es un array d 2 posicions,la 1º té el missatge de l'opció correcte i l'altra té el missatge de l'opció incorrect
	
	Tots els radios de la pregunta han d'estar en el mateix formulari
*/
function pregunta(correcte,missatge) {
	this.correcte=correcte;
	this.missatge=missatge;
	this.corregir=corregir;
	this.hits=0;
}

function corregir(form) {
	var i;
	var res=0;
	var trobat=1;
	var nOpcions=(form.length-1);//El botó no es compta
	var radios=form.elements;
	for(i=0;i<nOpcions;i++) {//recòrrer tots els radios
		if(radios[i].checked) {
			if(cercaBinaria(this.correcte,i)==1) {//cerca dins l'array el radio actual c
				this.hits++;
			}
			else {
				radios[i].checked=false;//inicialitza el radio incorrecte
			}
		}
	}
	if(this.missatge.length==2) {
		if(this.hits==this.correcte.length) {//tots els radio correctes
			alert(this.missatge[0]);
			res=1;
		}
		else {
			alert(this.missatge[1]);
		}
	}
	else {
		alert(this.missatge[0]+" "+this.hits +" / "+ this.correcte.length);
		if(this.hits==this.correcte.length) {
			res=1;
		}
	}
	this.hits=0;
	return res;
}

/*Constructor objecte ordre
	parametres(correcte):
	correcte=Array amb les respostes ordenats correctament,es pot pasar com array o com a llista de valors,
	Exemple b=new Array(nº elems)
			//omplir Array
			a=new ordre(b);
	missatge:es un array d 2 posicions,la 1º té el missatge de l'opció correcte i l'altra té el missatge de l'opció incorrect	
	Metodes:
		corregir(formulari);corregeix l'exercici,
		rep com a parametre el formulari on està l'exercici
	
*/
function ordre(correcte,missatge) {
	this.correcte=correcte;
	this.missatge=missatge;
	this.corregir=corregirOrd;
} 

function corregirOrd(form) {
	var i;
	var trobat=1;
	for(i=0;i<this.correcte.length;i++) {//recòrrer l'array de correctes
		form.elements[i].value=form.elements[i].value.toUpperCase();
		if(form.elements[i].value!=this.correcte[i].toUpperCase()) {//si es incorrecte inicialitza el camp de text
				trobat=0;
				form.elements[i].value="";
		}
	}
	if(trobat) {
		alert(this.missatge[0]);
	}
	else {
		alert(this.missatge[1]);
	}
}
/*	Constructor Objecte MarcarMultiple
	Parametres:
		Array amb els indexs q s'han de marcar,
		missatge:es un array d 3 posicions,la 1º té el missatge de l'opció correcte 
		la 2º té el missatge de l'opció incorrect i l'altra el missatge de control
	Metodes:
		corregir(form)=corregeix l'exercici
		control(botó),s'ha de cridar en l'event onclick del checkbox
			//Ex: <option type="checkbox" onclick="multi.control(this);">
		
	
	Atributs:
		correcte:Array amb els index q s'han d marcar
		clickats=nombre de checkboxes=

*/
function marcarMultiple(solucio,missatge) {
	this.correcte=solucio;
	this.missatge=missatge;
	this.clickats=0;
	this.corregir=corregirMultiple;
	this.control=control;
	this.maxim=this.correcte.length;
}

function control(casella) {
	if(casella.checked) {
		if(this.clickats==this.correcte.length) {
			alert(this.missatge[2]+" "+this.correcte.length);
			casella.checked=false;
		}
		else {
			this.clickats++;
		}	
	}
	else {
		this.clickats--;
	}	
}
function corregirMultiple(form) {
	var i;
	var hits=0;
	var trobat=1;
	var checks=form.elements;
	for(i=0;i<(checks.length-1)&& trobat;i++) {//recòrre tots els checksbutton
		if(checks[i].checked) {
			if(cercaBinaria(this.correcte,i)==1) {//cerca l'index actual a l'array de correctes
				hits++;
			}
			else {
				checks[i].checked=false;//reinitza el checkbutton
				this.clickats--;
			}
			if(hits==this.correcte.length) {//si tots estàn bé
				trobat=0;
			}
		}	
	}
	if(!trobat) {
		alert(this.missatge[0]);
	}
	else {
		alert(this.missatge[1]);
	}
	
}


/*
	Definició objecte selectOpcio 
	
	S'utilitza en textes q tenen espais en els que s'ha 
	d'escollir la paraula correcte d'una llista donada
	
	Parametres;
		Array amb els indexs q s'han de marcar
		missatge:es un array d 2 posicions,
		la 1º té el missatge de l'opció correcte i l'altra té el missatge de l'opció incorrect
	Atributs:
		correcte:Array pasat per parametre
	Metodes:
		corregir:corregeix l'exercici
			Parametres:formulari on está l'exercici	
*/

function selectOpcio(correcte,missatge) {
	this.correcte=correcte;
	this.missatge=missatge;
	this.corregir=corregirOpcio
}
function corregirOpcio(form) {
	var elems=form.elements.length-1;
	var i;
	var selects=form.elements;
	var hits=0;
	for(i=0;i<elems;i++) {
		if(selects[i].selectedIndex==this.correcte[i]) {
			hits++;
		}
		else {
			selects[i].selectedIndex=0;
		}
	}
	if(hits==elems) {
		alert(this.missatge[0]);
	}
	else {
		alert(this.missatge[1]);
	}
}

/*
	Definició objecte QuadreText
	Parametres;
		Array amb els les respostes correctes
	Atributs:
		correcte:Array pasat per parametre
		missatge:es un array d 2 posicions,la 1º té el missatge de l'opció correcte i l'altra té el missatge de l'opció incorrect
	Metodes:
		corregir:corregeix l'exercici
			Parametres:formulari on está l'exercici	
*/

function QuadreText(correcte,missatge) {
	var i;
	for(i=0;i<correcte.length;i++) {
		correcte[i]=correcte[i].toLowerCase();
	}
	this.missatge=missatge;
	this.correcte=correcte;
	this.corregir=corregirText;
}

function corregirText(form) {
	var i;
	var hits=0;
	for(i=0;i<form.elements.length-1;i++) {
		if(form.elements[i].value.toLowerCase()==this.correcte[i]) {
			hits++;
		}
		else {
			form.elements[i].value="";
		}
	}
	if(hits==this.correcte.length) {
		alert(this.missatge[0]);
	}
	else {
		alert(this.missatge[1]);		
	}
}
/*
	Constructor objecte fletxes
	paràmetres:
		array de strings amb les solucions: Ex:var a =new Array("2a","3b","5f")
		formulari on está localitzat l'exercici
	Atributs:
		form=formulari on està l'exercici
		correcte=l'array d'strings passat
		quadre=objecte QuadreText,que és el que corregeix amb el seu mètode corregir
		missatge:es un array d 2 posicions,la 1º té el missatge de l'opció correcte i l'altra té el missatge de l'opció incorrect
	Mètodes:
		corregir:
			corregeix l'exericici cridant al metode corregir del seu objecte QuadreText
			
			

*/
function Fletxes(correcte,formulari,missatge) {
	this.quadre=new QuadreText(correcte,missatge);
	this.form=formulari;
	this.corregir=corregirFletxes;
	this.form.elements[0].value=correcte[0];//inicialitza el primer resultat
	
}
function corregirFletxes() {
	this.quadre.corregir(this.form);
}
function initCamps(form) {
	var i;
	for(i=0;i<(form.elements.length-1);i++) {
		form.elements[i].value="";
	}
}
function newWindow(url,width,height,scrollBar) {
	carta=window.open(url, 'displayWindow', 'toolbar=0,location=0,directories=0,screenX=0,screenY=0,status=0,menubar=0,scrollbars='+scrollBar+',resizable=0,width='+width+',height=0'+height+"'");
  	carta.focus();
}

function cercaBinaria(array,elem) {
	var inici=0;
	var fi=array.length-1;
	var trobat=false;
	var mig;
	while(inici<=fi && !trobat) {
		var mig=parseInt((fi+inici)/2);
		if(array[mig]==elem) {
			trobat=true;
		}
		else {
			if(array[mig]<elem) {
				inici=mig+1;
			}
			else {
				fi=mig-1;	
			}
		}	
	}
	if(trobat) {
		return 1;
	}
	else {
		return -1;		
	}
}	

