/***********************************************************************************\
*
*    Projecte Col·lectiva. Versió 2.0.0 (1/1/2012)
* 
*    Copyright (C) Gerard Romo Garrido (www.toomates.net)
*
*    This program is free software: you can redistribute it and/or modify
*    it under the terms of the GNU General Public License as published by
*    the Free Software Foundation, either version 3 of the License, or
*    (at your option) any later version.
*
*    This program 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 General Public License for more details.
*
*    You should have received a copy of the GNU General Public License
*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*
************************************************************************************/

VersioPortable=0;	// 0 --> Versió online, 1 --> Versió portable
VersioInicial=0;	// 1 --> Versió inicial, 0 --> Versió toomates.net

/************************************************************************************
*
* Tokens
*
************************************************************************************/

TokensHTML=[
"br/",
"sup",
"sub",
"b",
"i"
];

TokensMathML=[
"abs",
"and",
"annotation",
"annotation-xml",
"apply",
"approx",
"arccos",
"arccosh",
"arccot",
"arccoth",
"arccsc",
"arccsch",
"arcsec",
"arcsech",
"arcsin",
"arcsinh",
"arctan",
"arctanh",
"arg",
"bind",
"bvar",
"card",
"cartesianproduct",
"cbytes",
"ceiling",
"cerror",
"ci",
"cn",
"codomain",
"complexes",
"compose",
"condition",
"conjugate",
"cos",
"cosh",
"cot",
"coth",
"cs",
"csc",
"csch",
"csymbol",
"curl",
"declare",
"degree",
"determinant",
"diff",
"divergence",
"divide",
"domain",
"domainofapplication",
"el",
"emptyset",
"eq",
"equivalent",
"eulergamma",
"exists",
"exp",
"exponentiale",
"factorial",
"factorof",
"false",
"floor",
"fn",
"forall",
"gcd",
"geq",
"grad",
"gt",
"ident",
"image",
"imaginary",
"imaginaryi",
"implies",
"in",
"infinity",
"int",
"integers",
"intersect",
"interval",
"inverse",
"lambda",
"laplacian",
"lcm",
"leq",
"limit",
"list",
"ln",
"log",
"logbase",
"lowlimit",
"lt",
"maction",
"malign",
"maligngroup",
"malignmark",
"malignscope",
"math",
"matrix",
"matrixrow",
"max",
"mean",
"median",
"menclose",
"merror",
"mfenced",
"mfrac",
"mfraction",
"mglyph",
"mi",
"min",
"minus",
"mlabeledtr",
"mlongdiv",
"mmultiscripts",
"mn",
"mo",
"mode",
"moment",
"momentabout",
"mover",
"mpadded",
"mphantom",
"mprescripts",
"mroot",
"mrow",
"ms",
"mscarries",
"mscarry",
"msgroup",
"msline",
"mspace",
"msqrt",
"msrow",
"mstack",
"mstyle",
"msub",
"msubsup",
"msup",
"mtable",
"mtd",
"mtext",
"mtr",
"munder",
"munderover",
"naturalnumbers",
"neq",
"none",
"not",
"notanumber",
"note",
"notin",
"notprsubset",
"notsubset",
"or",
"otherwise",
"outerproduct",
"partialdiff",
"pi",
"piece",
"piecewise",
"plus",
"power",
"primes",
"product",
"prsubset",
"quotient",
"rationals",
"real",
"reals",
"reln",
"rem",
"root",
"scalarproduct",
"sdev",
"sec",
"sech",
"selector",
"semantics",
"sep",
"set",
"setdiff",
"share",
"sin",
"sinh",
"subset",
"sum",
"tan",
"tanh",
"tendsto",
"times",
"transpose",
"true",
"union",
"uplimit",
"variance",
"vector",
"vectorproduct",
"xor"
];

/************************************************************************************
*
* Diccionari General Català
*
************************************************************************************/

DiccionariGeneral_Cat=[
"",
"Identificaci&oacute;",
"Identificador",
"Password",
"Accedir",
"S&oacute;c un usuari nou, vull enregistrar-me",
"Nom/&Agrave;lies/Pseud&ograve;nim",
"Identificador",
"Password",
"Repeteix el Password",
"Enregistrar-me",
"No pot ser buit",
"No &eacute;s un valor num&egrave;ric",
"No es un nombre enter",
"Nom&eacute;s poden ser lletres i d&iacute;gits, sense espais",
"Usuari no trobat",
"Error de connexi&oacute;",
"El password i la seva repetici&oacute; no coincideixen",
"Impossible realitzar enregistrament",
"Ja existeix un altre usuari amb aquest identificador",
"Identificador no acceptable",
"Desconnectar",
"Par&agrave;metre obligatori no trobat",
"Novetats",
"Sense nom",
"Arxiu",
"Carregant",
"Nom",
"Adre&ccedil;a web",
"Pes",
"Amb soluci&oacute;",
"Desenvolupament",
"General",
"Teoria",
"Manipulatiu",
"Generador d&#39;exercicis",
"Did&agrave;ctica",
"Turisme matem&agrave;tic",
"Manualitats",
"Pr&agrave;ctiques",
"Exercicis",
"Retall de diari",
"Jocs, puzzles",
"Webs de recursos",
"Material de suport",
"Recursos",
"Experi&egrave;ncies",
"Compet&egrave;ncies b&agrave;siques",
"Dossier",
"Llibre digital",
"Lectura (fragment de llibre)",
"TIC",
"General",
"Amb PC",
"GeoGebra",
"Full de c&agrave;lcul",
"Calculadora cient&iacute;fica",
"Moodle",
"Audiovisual",
"No definit",
"Document sonor",
"V&iacute;deo",
"Localitzaci&oacute; GoogleMaps",
"Transversal",
"No definit",
"Economia personal",
"Societat",
"Literatura",
"Astronomia",
"M&uacute;sica",
"Economia",
"Criptografia",
"Humor",
"Art",
"Angl&egrave;s",
"Usuari no identificat",
"Link",
"Secci&oacute;",
"Acci&oacute; no permesa",
"Tema",
"Nota",
"Contingut",
"Comentari",
"Selecciona",
"Sortir",
"Usuari desconegut",
"Exercici",
"Enunciat",
"Soluci&oacute;",
"Pauta",
"Solucions",
"Indefinit",
"Exercici autogenerat",
"Configuraci&oacute;",
"Generador",
"Formulari",
"Qu&egrave;txup",
"Enviant",
"Nom del generador",
"Adre&ccedil;a del generador",
"Configuraci&oacute; del generador",
"Joc",
"Temps (segons)",
"Temps",
"Adre&ccedil;a de la compilaci&oacute;",
"Compilaci&oacute; d&#39;exercicis",
"Text",
"Corregir",
"Puntuaci&oacute;",
"Nova partida",
"Afegir nova activitat",
"Acc&eacute;s denegat",
"Les meves activitats",
"Error accedint a dades",
"Una secci&oacute; no pot quedar buida",
"Primer tema",
"Un curs no pot quedar buit",
"Acceptar",
"Cancel·lar",
"Tancar",
"No s&#39;ha pogut gravar la puntuaci&oacute;",
"No es pot fer aqu&iacute;",
"L&#39;activitat ja est&agrave; al portadocuments",
"Portadocuments",
"Selecciona el curs al qual vols accedir",
"Identificador del curs",
"Password del curs (opcional)",
"Sortir del curs",
"Curs no trobat",
"Password no v&agrave;lid",
"Configuraci&oacute; general",
"Arxiu",
"Nom Classe",
"Nom Objecte",
"Configurar",
"Activitat de refer&egrave;ncia",
"Nombre d&#39;objectes",
"Codi Bewoom",
"Generar Codi Bewoom",
"Curs",
"Grup",
"#",
"Tots",
"Selecciona el curs i el grup",
"Camins",
"Permetre Practicar",
"Qu&egrave;txup",
"Sortir de l&#39;activitat",
"Intentar-ho de nou",
"Objectiu",
"Columnes",
"Puntuaci&oacute; m&agrave;xima absoluta",
"Seguiment",
"Descripci&oacute;",
"Error accedint als usuaris",
"Tipus de par&agrave;metre indeterminat",
"Impossible accedir a la base de dades",
"Usuari",
"Curs",
"Password (Opcional)",
"Ja existeix un altre curs amb aquest login",
"Impossible accedir a taula",
"Aqu&iacute; nom&eacute;s poden haver temes",
"Aqu&iacute; nom&eacute;s poden haver seccions",
"Refer&egrave;ncia",
"Activitat de velocitat",
"Sense solucions",
"Amb solucions",
"Amb seguiment diari",
"Alumnes",
"Professors/es",
"Selecci&oacute; de curs i grup",
"Selecciona un curs i un grup",
"Supervisors",
"Supervisats",
"Eliminar",
"Selecciona un nou supervisor",
"Supervisor desconegut",
"Ja est&agrave;s associat a aquest supervisor",
"Puntuacions",
"Has de tancar abans aquesta vinyeta",
"Seguiment diari de puntuacions",
"Concepte",
"Puntuaci&oacute; m&agrave;xima",
"Visites",
"Via d&#39;acc&eacute;s no autoritzada",
"Imatge HTML",
"Imatge",
"Cursos",
"Per",
"Puntuaci&oacute; m&agrave;xima avui",
"Resposta",
"Hola",
"Anterior",
"Sense",
"dades",
"M&agrave;xim",
"M&iacute;nim",
"Promig",
"Visible",
"Invisible",
"Visible nom&eacute;s a novetats",
"Invisible nom&eacute;s a novetats",
"Visualitzaci&oacute;",
"Autoria",
"Jo mateix/a",
"Indeterminat",
"Nombre d&#39;exercicis",
"Nombre de columnes",
"Amplada de les caselles (p&iacute;xels)",
"Altura de les caselles (p&iacute;xels)",
"Massa intents!",
"Confirmi l&#39;eliminaci&oacute; del recurs",
"Soluci&oacute; proposada, en poden haver m&eacute;s",
"Nou",
"Copiar",
"Moure",
"Editar",
"Enlla&ccedil;ar",
"Referenciar",
"Anotar",
"Comentar",
"Llibreta de notes",
"Nom&eacute;s indicacions",
"Amb explicacions",
"Per defecte",
"Sense seguiment",
"Seguiment &uacute;nic",
"Seguiment diari",
"Password incorrecte",
"Perqu&egrave; enregistrar-me",
"Aquesta web no demana ni emmagatzema dades personals. Aquesta web &eacute;s 100% gratu&iuml;ta i sempre ho ser&agrave;.",
"No s&#39;han trobat activitats",
"No s&#39;han trobat alumnes",
"Des d&#39;una c&ograve;pia no es pot editar un recurs",
"Com crear els teus propis cursos",
"El teu navegador &eacute;s compatible amb MathML?",
"Problemes",
"Massa curt",
"Massa llarg",
"Esquema",
"Contrarellotge",
"Ja estic!"
];

/***********************************************************************************\
*
*
*
* Bloc Kernel (rutines generals)
*
*
*
************************************************************************************/

function TreureQuot(Cadena) {
	do {
		var CadenaAbans=Cadena;
		Cadena=Cadena.replace("&quot;",'"');
		Cadena=Cadena.replace(" ",'_');
	} while(CadenaAbans!=Cadena);
	return (Cadena);
}


function TreureNomesQuot(Cadena) {
	do {
		var CadenaAbans=Cadena;
		Cadena=Cadena.replace("&quot;",'"');
	} while(CadenaAbans!=Cadena);
	return (Cadena);
}

/************************************************************************************
*
* Funció Trim
*
************************************************************************************/

function Trim(myString){
	return myString.replace(/^\s+/g,'').replace(/\s+$/g,'')
}

/************************************************************************************
*
* Funció ReplaceAll
*
************************************************************************************/

function ReplaceAll(Cadena,CadenaAntiga,CadenaNova) {
	// Substitueix totes les CadenaAntiga per CadenaNova a Cadena
	Cadena=""+Cadena;
	do {
		var CadenaAbans=Cadena;
		Cadena=Cadena.replace(CadenaAntiga,CadenaNova);
	} while (CadenaAbans!=Cadena);
	return (Cadena);
}

/************************************************************************************
*
* Nombres aleatoris
*
************************************************************************************/

function GenerarEnterAleatoriAcotat(Minim,Maxim) {
	// Retorna un nombre enter aleatori entre Minim i Maxim INCLOSOS
	// Suposem Minim>0, Maxim >0, 
	// Aquesta rutina centralitza tota la generació de nombres aleatoris de BeWooM
	if (Minim<0) {
		Minim=-Minim;
	}
	if (Maxim<0) {
		Maxim=-Maxim;
	}
	if (Minim>Maxim) {
		var NombreAuxiliar=Minim;
		Minim=Maxim;
		Maxim=NombreAuxiliar;
	}
	return (Math.round(Math.random()*(Maxim-Minim)+Minim));
}

/***********************************************************************************\
*
* Objecte Imatge
*
************************************************************************************/

function Imatge(TheUrlBase,TheNom,TheAlt,TheAmplada,TheAltura) {
	// Gestiona els arxius d'imatges
	// UrlBase inclou l'últim "/"
	this.UrlBase=TheUrlBase;		// Directori-web on està l'arxiu
	this.Nom=TheNom;			// Nom de l'arxiu
	this.Amplada=TheAmplada;
	this.Altura=TheAltura;
	this.Alt=TheAlt;
}

Imatge.prototype.GenerarHTML = function() {
	// Retorna la imatge de la forma <img>...
	var Text="";
	if (this.Nom=="") return("");
	Text+='<img src="'+this.UrlBase+this.Nom+'"';
	if (this.Alt!="") Text+=' alt="'+this.Alt+'"';
	if (this.Amplada>0) Text+=' width="'+this.Amplada+'"';
	if (this.Altura>0) Text+=' height="'+this.Altura+'"';
	Text+="></img>";
	return(Text);
}

function DeterminarURLBase(CadenaURL) {
	// Agafa la part de la base (fins a l'últim /) 
	// Retorna l'últim "/".
	if (CadenaURL=="") return("");
	CadenaURL=CadenaURL+"";
	var i=CadenaURL.length;
	while (i>=0) {
		if (CadenaURL.substring(i,i+1)=="/") {
			return(CadenaURL.substring(0,i+1));
		}
		i-=1;
	}
	return("");
}

function EsDireccioCompleta(Cadena) {
	// Si comença per "http://" o "www."  vol dir que és un link absolut.
	if (Cadena.substring(0,7)=='http://' || Cadena.substring(0,4)=='www.') return(true);
	return (false);
}

/***********************************************************************************\
*
* DecodeQuetxup
*
************************************************************************************/

function DecodeQuetxup(Text,Directori) {
	var Text2=this.GestionarImatgesQuetxup(Text,Directori);
	Text2=this.GestionarLinksQuetxup(Text2,Directori);
	if (VersioPortable==1) Text2=CanviarLinksALocalhost(Text2);
	return (Text2);
}

function CanviarLinksALocalhost(Text) {
	var Text2=ReplaceAll(Text,"http://www.toomates.net/","http://localhost/");
	return(Text2);
}

function GestionarImatgesQuetxup(Cadena,TheUrlBase) {
	// Analitza si hi ha parts com QUETXUPIMG(triangle.jpg,179,281)
	// i les converteix en una cadena de la forma:
	// <img src='http:/.../triangle.jpg' alt='triangle.jpg' width='179' height='281'></img>
	// Si el nom és relatiu (no comença per "http://" o "www."
	// Agafa com a adreça arrel TheUrlBase
	//
	var MyCutter=new Cutter(Cadena,"QUETXUPIMG");
	var NovaCadena="";
	if (MyCutter.Final) return (Cadena);
	NovaCadena+=MyCutter.Tallar();
	while (!MyCutter.Final) {	
		var Parametres=MyCutter.TallarParametres();
		var MyCutter2=new Cutter(Parametres,",");
		var NomArxiu=MyCutter2.Tallar();
		var AmpladaImatge=0;
		if (!MyCutter2.Final) AmpladaImatge=MyCutter2.Tallar();
		var AlturaImatge=0;
		if (!MyCutter2.Final) AlturaImatge=MyCutter2.Tallar();
		if (EsDireccioCompleta(NomArxiu)) var MyImatge=new Imatge("",NomArxiu,"",AmpladaImatge,AlturaImatge);
		else var MyImatge=new Imatge(TheUrlBase,NomArxiu,"",AmpladaImatge,AlturaImatge);
		NovaCadena+="<div>"+MyImatge.GenerarHTML()+"</div>";
		//NovaCadena+=MyImatge.GenerarHTML();
		NovaCadena+=MyCutter.Tallar();
	}
	return (NovaCadena);
}

function GestionarLinksQuetxup(Cadena,TheUrlBase) {
	// Analitza si hi ha parts com QUETXUPLINK(link,nomvisual)
	// i les converteix en una cadena de la forma:
	// <a></a>
	//
	var MyCutter=new Cutter(Cadena,"QUETXUPLINK");
	var NovaCadena="";
	if (MyCutter.Final) return (Cadena);
	NovaCadena+=MyCutter.Tallar();
	while (!MyCutter.Final) {	
		var Parametres=MyCutter.TallarParametres();
		var MyCutter2=new Cutter(Parametres,",");
		var NomURL=MyCutter2.Tallar();
		var NomVisual=MyCutter2.Tallar();
		if (EsDireccioCompleta(NomURL)) NovaCadena+= '<a href="'+NomURL+'"';
		else NovaCadena+= '<a href="'+TheUrlBase+NomURL+'"';
		NovaCadena+='target="_blank">'+NomVisual+'</a> ';
		NovaCadena+=MyCutter.Tallar();
	}
	return (NovaCadena);
}

/************************************************************************************
*
*  Gestió de Cookies
*
************************************************************************************/

function AfegirCookie(Nom,Valor) {
	var TempsVidaCookie=new Date();
	var MinutsVidaCookie=60000;
	TempsVidaCookie.setTime(TempsVidaCookie.getTime()+MinutsVidaCookie*60*1000);
	setCookie(Nom,Valor,TempsVidaCookie);
}

function setCookie(sName,sValue,oExpires,sPath,sDomain,bSecure) {
	// Crea una cadena de cookie basada en los argumentos pasados. 
	// Sólo son obligatorios los dos primeros, de forma que la función comprueba
	// que ambos existan antes de añadir la cadena de cookie;
	var sCookie=sName+"=" +encodeURIComponent(sValue);
	if (oExpires) {
		sCookie+= "; expires=" + oExpires.toGMTString();
	}
	if (sPath) {
		sCookie+= "; path =" + sPath;
	}
	if (sDomain) {
		sCookie += "; domain=" + sDomain;
	}
	if (bSecure) {
		sCookie += "; secure";
	}
	document.cookie = sCookie;
}
function getCookie(sName) {
	// recupera el valor de una cookie
	var sRE = "(?:; )?" + sName + "=([^;]*);?";
	var oRE = new RegExp(sRE);
	if (oRE.test(document.cookie)) {
		return decodeURIComponent(RegExp["$1"]);
	} else {
		return null;
	}
}
function deleteCookie(sName,sPath,sDomain) {
	setCookie(sName,"",new Date(0),sPath,sDomain);
}

/************************************************************************************
*
* Gestió de paràmetres URI
*
************************************************************************************/

function ExtreureParametreURINavegador(parameter){
	// 
	// Retorna el parametre de la cadena URI del navegador
	//
	return(ExtreureParametreURIDeCadena(parameter,location.href));
}

function ExtreureParametreURIDeCadena(parameter,url) {
	//
	// Retorna el parametre de qualsevol cadena
	// Font del codi:  http://login.osirislms.com
	//
	var Contingut="";
	/* Obtiene la posicion donde se encuentra el signo ?, 
	ahi es donde empiezan los parametros */
	var index = url.indexOf("?");
	/* Obtiene la posicion donde termina el nombre del parametro
	e inicia el signo = */
	parameter+="=";
	index = url.indexOf(parameter,index) + parameter.length;
	/* Verifica que efectivamente el valor en la posicion actual 
	es el signo = */ 
	index-=1;
	if (url.charAt(index) == "="){
		// Obtiene el valor del parametro
		var result = url.indexOf("&",index);
		if (result == -1){result=url.length;};
		// Despliega el valor del parametro
		Contingut=url.substring(index + 1,result);
	}
	return (decodeURIComponent(Contingut));
} 

function AfegirParametreURIInicial(PartInicial,NomParametre,ContingutParametre) {
	var Text="";
	Text=PartInicial+"?"+NomParametre+"="+encodeURIComponent(ContingutParametre);
	return (Text);
}

function AfegirParametreURISecundari(PartInicial,NomParametre,ContingutParametre) {
	var Text="";
	Text=PartInicial+"&"+NomParametre+"="+encodeURIComponent(ContingutParametre);
	return (Text);
}

/************************************************************************************
*
* Gestió de demandes AJAX
*
************************************************************************************/

function PeticioAJAX(Url,TheFuncioBe,TheFuncioMal) {
	FuncioRetornAJAXBe=TheFuncioBe;
	FuncioRetornAJAXMal=TheFuncioMal;
	this.Carregador=new net.CarregadorAJAX(Url,this.RetornBe,this.RetornMal);
}

PeticioAJAX.prototype.RetornBe = function() {
	var ContingutAJAX=this.req.responseText;
	eval(FuncioRetornAJAXBe);
}
PeticioAJAX.prototype.RetornMal = function() {
	eval(FuncioRetornAJAXMal);
}

function GenerarDemandaAJAXSenseRetorn(TheUrl) {
	var UrlTotal=TheUrl+"&rand="+GenerarStringRand();
	var cargador = new net.CarregadorAJAX(UrlTotal,NoFerRes,"","","");	
}

function NoFerRes() {
}

function GenerarStringRand() {
	// Genera una cadena aleatòria utilitzada com a paràmetre URI per a evitar
	// els proxis no desitjats.
	var n1=GenerarEnterAleatoriAcotat(1000,9999);
	var n2=GenerarEnterAleatoriAcotat(1000,9999);
	var n3=GenerarEnterAleatoriAcotat(1000,9999);
	var Text=n1.toString()+n2.toString()+n3.toString();
	return (Text);
}

/************************************************************************************
*
* Gestió de demandes AJAX --> Accés a la informació del servidor
*
************************************************************************************/

//
// Font del codi: http://www.librosweb.es/ajax/capitulo7/utilidades_y_objetos_para_ajax.html
//

var net = new Object();
 
net.READY_STATE_UNINITIALIZED=0;
net.READY_STATE_LOADING=1;
net.READY_STATE_LOADED=2;
net.READY_STATE_INTERACTIVE=3;
net.READY_STATE_COMPLETE=4;
 
// Constructor

net.CarregadorAJAX = function(url, funcion, funcionError) {
	this.url = url;
  	this.req = null;
  	this.onload = funcion;
  	this.onerror = (funcionError) ? funcionError : this.defaultError;
  	this.cargaContenidoXML(url);
}
 
net.CarregadorAJAX.prototype = {
  cargaContenidoXML: function(url) {
    if(window.XMLHttpRequest) {
      this.req = new XMLHttpRequest();
    }
    else if(window.ActiveXObject) {
      this.req = new ActiveXObject("Microsoft.XMLHTTP");
    }
 
    if(this.req) {
      try {
        var loader = this;
        this.req.onreadystatechange = function() {
          loader.onReadyState.call(loader);
        }
        this.req.open('GET', url, true);
        this.req.send(null);
      } catch(err) {
        this.onerror.call(this);
      }
    }
  },
 
  onReadyState: function() {
    var req = this.req;
    var ready = req.readyState;
    if(ready == net.READY_STATE_COMPLETE) {
      var httpStatus = req.status;
      if(httpStatus == 200 || httpStatus == 0) {
        this.onload.call(this);
      }
      else {
        this.onerror.call(this);
      }
    }
  },
 
  defaultError: function() {
    alert("Se ha producido un error al obtener los datos"
      + "\n\nreadyState:" + this.req.readyState
      + "\nstatus: " + this.req.status 
      + "\nheaders: " + this.req.getAllResponseHeaders());
  }
}

/************************************************************************************
*
* Gestió de demandes AJAX --> Gestió dels errors del PHP
*
************************************************************************************/

function GestionarErrorsRespostaPHP(ContingutAJAX) {
	// 
	// Comprova si ContingutAJAX és un missatge d'error ERRORxxx
	// i retorna el seu codi xxx ( amb ERROR però sense xxx = -1)
	//
	if (ContingutAJAX.substring(0,5)!="ERROR") return(0);
	var CodiError=ContingutAJAX.substring(5);
	if(CodiError>0) return(CodiError); 
	return(-1);
}

function GestionarOKRespostaPHP(ContingutAJAX) {
	// 
	// Comprova si ContingutAJAX és un missatge tipus OKxxx
	// i retorna el seu codi o 0 ( amb OK però sense xxx = -1)
	//
	if (ContingutAJAX.substring(0,2)!="OK") return(0);
	var Codi=ContingutAJAX.substring(2);
	if (Codi>=0) return(Codi);
	return(-1);
}


/************************************************************************************
*
*  MathMTML
*
************************************************************************************/

/* March 19, 2004 MathHTML (c) Peter Jipsen http://www.chapman.edu/~jipsen
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or (at
your option) any later version.
This program 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 General Public License 
(at http://www.gnu.org/copyleft/gpl.html) for more details.*/

function convertMath(node) {// for Gecko
  if (node.nodeType==1) {
    var newnode = 
      document.createElementNS("http://www.w3.org/1998/Math/MathML",
        node.nodeName.toLowerCase());
    for(var i=0; i < node.attributes.length; i++)
      newnode.setAttribute(node.attributes[i].nodeName,
        node.attributes[i].nodeValue);
    for (var i=0; i<node.childNodes.length; i++) {
      var st = node.childNodes[i].nodeValue;
      if (st==null || st.slice(0,1)!=" " && st.slice(0,1)!="\n") 
        newnode.appendChild(convertMath(node.childNodes[i]));
    }
    return newnode;
  }
  else return node;
}

function convert() {
  var mmlnode = document.getElementsByTagName("math");
  var st,str,node,newnode;
  for (var i=0; i<mmlnode.length; i++)
    if (document.createElementNS!=null)
      mmlnode[i].parentNode.replaceChild(convertMath(mmlnode[i]),mmlnode[i]);
    else { // convert for IE
      str = "";
      node = mmlnode[i];
      while (node.nodeName!="/MATH") {
        st = node.nodeName.toLowerCase();
        if (st=="#text") str += node.nodeValue;
        else {
          str += (st.slice(0,1)=="/" ? "</m:"+st.slice(1) : "<m:"+st);
          if (st.slice(0,1)!="/") 
             for(var j=0; j < node.attributes.length; j++)
               if (node.attributes[j].nodeValue!="italic" &&
                 node.attributes[j].nodeValue!="" &&
                 node.attributes[j].nodeValue!="inherit" &&
                 node.attributes[j].nodeValue!=undefined)
                 str += " "+node.attributes[j].nodeName+"="+
                     "\""+node.attributes[j].nodeValue+"\"";
          str += ">";
        }
        node = node.nextSibling;
        node.parentNode.removeChild(node.previousSibling);
      }
      str += "</m:math>";
      newnode = document.createElement("span");
      node.parentNode.replaceChild(newnode,node);
      newnode.innerHTML = str;
    }
}

/************************************************************************************
*
*  BroserDetect
*
************************************************************************************/

//
// http://www.quirksmode.org/js/detect.html
// 
// QuirksMode.org is the personal site of Peter-Paul Koch, 
// freelance web developer and JavaScript guru in Amsterdam, the Netherlands.
//

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

/************************************************************************************
*
* Matriu
*
************************************************************************************/

/************************************************************************************
*
* Matriu --> Casella
*
************************************************************************************/

function Casella(TheFila,TheColumna) {
	// Contingut de la casella
	this.Text= new Array();
	this.Text[1]="";	// Normalment l'enunciat
	this.Text[2]="";	// Normalment la solució
	this.Ocupacio=0;	// Ocupació de la casella
				// 0 --> No ocupada
				// 1 --> Ocupada definitivament
				// 2 --> Ocupada temporalment
	this.ParetN=1;
	this.ParetS=1;
	this.ParetE=1;
	this.ParetO=1;		// En principi la casella té totes les parets.

	this.Fila=TheFila;
	this.Columna=TheColumna;
	this.FuncioOnClic="";
	this.Id=MyCodiDivUnico.NouCodi("CASELLA");
	this.CasellaFixa=false;		// true --> No il·lumina encara que la resta sí
}

/************************************************************************************
*
* Matriu --> Constructor
*
************************************************************************************/

function Matriu(TheId,TheNom,TheFiles,TheColumnes) {
	// Gestiona una taula de caselles Files*Columnes

	this.Id=TheId;
	this.Nom=TheNom;

	this.Tauler= new Array();

	/////////////////////////////////////////////////////////////////////////////
	//
	// Configuració
	//
	/////////////////////////////////////////////////////////////////////////////

	this.Files=new EntradaEnter("",0);
	this.Files.Id="NFILES"+TheId;
	this.Files.Nom="Files";
	this.Files.Valor=4;
	this.Files.ValorMinim=1;
	this.Columnes=new EntradaEnter("",0);
	this.Columnes.Id="NCOLUMNES"+TheId;
	this.Columnes.Nom="Columnes";
	this.Columnes.Valor=3;
	this.Columnes.ValorMinim=1;

	if (TheFiles) this.Files.Valor=TheFiles;
	if (TheColumnes) this.Columnes.Valor=TheColumnes;
	

	// Amplada de la matriu
	this.ModeAmplada=new EntradaSelector("",0);
	this.ModeAmplada.Id="MODEAMPLADA"+TheId;
	this.ModeAmplada.Nom="Amplada per";
	this.ModeAmplada.AfegirNomOpcio("Total en %"); // 0
	this.ModeAmplada.AfegirNomOpcio("amplada de columna"); // 1

	this.AmpladaTotalPercentatge=new EntradaEnter("",0);
	this.AmpladaTotalPercentatge.Id="AMPLADAPERCENT"+TheId;
	this.AmpladaTotalPercentatge.Nom="Amplada de la taula (%)";
	this.AmpladaTotalPercentatge.Valor=80;
	this.AmpladaTotalPercentatge.ValorMinim=1;

	this.AmpladaCasella=new EntradaEnter("",0);
	this.AmpladaCasella.Id="AMPLADACASELLA"+TheId;
	this.AmpladaCasella.Nom="Amplada de les columnes (píxels)";
	this.AmpladaCasella.Valor=50;
	this.AmpladaCasella.ValorMinim=1;

	this.AlturaCasella=new EntradaEnter("",0);
	this.AlturaCasella.Id="ALTURACASELLA"+TheId;
	this.AlturaCasella.Nom="Altura de les files (píxels)";
	this.AlturaCasella.Valor=50;
	this.AlturaCasella.ValorMinim=1;

	// Característiques de les caselles 

	this.AlineacioHoritzontal=new EntradaSelector("",0);
	this.AlineacioHoritzontal.Id="ALINEAHORITZONTAL"+TheId;
	this.AlineacioHoritzontal.Nom="Alineació hortizontal";
		this.AlineacioHoritzontal.AfegirNomOpcio("No definida"); // 0
		this.AlineacioHoritzontal.AfegirNomOpcio("Esquerra"); // 1
		this.AlineacioHoritzontal.AfegirNomOpcio("Dreta"); // 2
		this.AlineacioHoritzontal.AfegirNomOpcio("Centrada"); // 3

	this.AlineacioVertical=new EntradaSelector("",0);
	this.AlineacioVertical.Id="ALINEAVERTICAL"+TheId;
	this.AlineacioVertical.Nom="Alineació vertical";
		this.AlineacioVertical.AfegirNomOpcio("No definida"); // 0
		this.AlineacioVertical.AfegirNomOpcio("Superior"); // 1
		this.AlineacioVertical.AfegirNomOpcio("Inferior"); // 2
		this.AlineacioVertical.AfegirNomOpcio("Centrada"); // 3

	// Nombre de línies en blanc afegides després del text

	this.NombreLiniesBlanc=new EntradaEnter("",0);
	this.NombreLiniesBlanc.Id="NLINIESBLANC"+TheId;
	this.NombreLiniesBlanc.Nom="Nombre de línies en blanc";
	this.NombreLiniesBlanc.Valor=0;
	this.NombreLiniesBlanc.ValorMinim=0;
	this.IluminarCaselles=false;		// true --> Ilumina caselles amb el ratolí
}

Matriu.prototype.ConstruirMatriu =function () {
	this.Columnes.Valor=parseFloat(this.Columnes.Valor);
	this.Files.Valor=parseFloat(this.Files.Valor);
	this.Tauler= new Array();
	// El primer índex són les files
	for (var i=1;i<=this.Files.Valor;i++) {
		this.Tauler[i]=new Array();
		// El segon índex són les columnes
		for (var j=1;j<=this.Columnes.Valor;j++) {
			this.Tauler[i][j]=new Casella(i,j);
		}
	}
}

Matriu.prototype.DeterminarFiles =function (NCaselles) {
	// Determina this.Files en funció de les caselles i el nombre de columnes.
	this.Files.Valor=Math.ceil(NCaselles/this.Columnes.Valor);
}

/************************************************************************************
*
* Matriu --> Input/Output de valors
*
************************************************************************************/

Matriu.prototype.PutText = function(Text,Fila,Columna,Index) {
	//Coloca un text a la Matriu.
	this.Tauler[Fila][Columna].Text[Index]=Text;
}

Matriu.prototype.PutFuncioOnClic = function(Funcio,Fila,Columna) {
	this.Tauler[Fila][Columna].FuncioOnClic=Funcio;
}

Matriu.prototype.PutTextUniDim = function(Text,PosicioCasella,Index) {
	var Fila=1;
	var Columna=1;
	for (var i=1;i<PosicioCasella;i++) {
		Columna=Columna+1;
		if (Columna>this.Columnes.Valor) {
			Columna=1;
			Fila+=1;
		}
	}
	this.PutText(Text,Fila,Columna,Index);
}

Matriu.prototype.GetText = function(Fila,Columna,Index) {
	//Agafa un text a la Matriu.
	var Contingut=this.Tauler[Fila][Columna].Text[Index];
	return (Contingut);
}

/************************************************************************************
*
* Matriu --> Input/Output d'altres informacions
*
************************************************************************************/

Matriu.prototype.CasellaOcupada = function(Fila,Columna) {
	if (this.Tauler[Fila][Columna].Ocupacio==0) return (false);
	return(true);
}

Matriu.prototype.EliminarParetMedianera = function(Fila,Columna,Paret) {
	// La paret pot ser "N","S","E" o "O".
	if (Paret=="N") {
		this.Tauler[Fila][Columna].ParetN=0;
		if (Fila>1) this.Tauler[Fila-1][Columna].ParetS=0;
	}
	if (Paret=="S") {
		this.Tauler[Fila][Columna].ParetS=0;
		if (Fila<this.Files.Valor) this.Tauler[Fila+1][Columna].ParetN=0;
	}
	if (Paret=="E") {
		this.Tauler[Fila][Columna].ParetE=0;
		if (Columna<this.Columnes.Valor) this.Tauler[Fila][Columna+1].ParetO=0;
	}
	if (Paret=="O") {
		this.Tauler[Fila][Columna].ParetO=0;
		if (Columna>1) this.Tauler[Fila][Columna-1].ParetE=0;
	}
}

Matriu.prototype.ComptarCasellesLliures = function() {
	var Lliures=0;
	this.Columnes.Valor=parseFloat(this.Columnes.Valor);
	this.Files.Valor=parseFloat(this.Files.Valor);
	for (var i=1;i<=this.Files.Valor;i++) {
		for (var j=1;j<=this.Columnes.Valor;j++) {
			if (this.Tauler[i][j].Ocupacio==0) Lliures+=1;
		}
	}
	return (Lliures);
}

/************************************************************************************
*
* Matriu --> Visualitzar 
*
************************************************************************************/
			
Matriu.prototype.VisualitzarMatriu =function(Index,Centrada) {
	// Visualitza la matriu fent servir ccs
	var Text="<div>";
	this.Columnes.Valor=parseFloat(this.Columnes.Valor);
	this.Files.Valor=parseFloat(this.Files.Valor);
	for (var i=1;i<=this.Files.Valor;i++) {
		for (var j=1;j<=this.Columnes.Valor;j++) {
			var Contingut=this.GetText(i,j,Index);
			Text+=this.GenerarAtributsCasella(i,j,Contingut);
			if (Contingut!="") Text+=Contingut;
			else Text+="&nbsp;";
			Text+="</div>";
		}
		Text+='<br style="clear:left">';
	}
	Text+="</div>";
	return (Text);
}

Matriu.prototype.GenerarAtributsCasella=function(Fila,Columna,Contingut) {
	//Genera els atributs de la columna: <td atribut atribut... >
	var Text="";
	Text='<div id="'+this.Tauler[Fila][Columna].Id+'" style="';
	Text+='float:left; margin:0px; ';

	// Vores. En comptes de no posar-les, les posem de color blanc (invisibles) per 
	// a evitar la diferent interpretació que fan IE i Firefox del tamany
	if (this.Tauler[Fila][Columna].ParetN>0) Text+='border-top:1px solid black; ';
	else Text+='border-top:1px solid white; ';
	if (this.Tauler[Fila][Columna].ParetS>0) Text+='border-bottom:1px solid black; ';
 	else Text+='border-bottom:1px solid white; ';
	if (this.Tauler[Fila][Columna].ParetE>0) Text+='border-right:1px solid black; ';
	else Text+='border-right:1px solid white; ';
	if (this.Tauler[Fila][Columna].ParetO>0) Text+='border-left:1px solid black; ';
	else Text+='border-left:1px solid white; ';

	// Altura i amplada
	Text+= " height:" + this.AlturaCasella.Valor + "px; ";
	Text+= " width:" + this.AmpladaCasella.Valor + "px; ";

	// Alineació horitzontal
	if (this.AlineacioHoritzontal.Valor!=0) {
		//Text+=" align:";
		Text+=" text-align:";
		if (this.AlineacioHoritzontal.Valor==1) Text+="left; ";
		if (this.AlineacioHoritzontal.Valor==2) Text+="right; ";
		if (this.AlineacioHoritzontal.Valor==3) Text+="center; ";
	}

	// Alineació vertical
	if (this.AlineacioVertical.Valor!=0) {
		Text+=" valign:";
		if (this.AlineacioVertical.Valor==1) Text+="top; ";
		if (this.AlineacioVertical.Valor==2) Text+="botton; ";
		if (this.AlineacioVertical.Valor==3) Text+="middle; ";
	}
	
	// Si la casella està buida, podem posar-la d'un altre color:
	if (Contingut=="") Text+='background-color:gray; ';

	// Final
	Text+= '"';

	// Events de ratolí
	if (this.Tauler[Fila][Columna].FuncioOnClic!="") {
		Text+=" onclick='"+this.Tauler[Fila][Columna].FuncioOnClic+"'";
	}
	if(this.IluminarCaselles==true && this.Tauler[Fila][Columna].CasellaFixa==false) {
		Text+= ' onmouseover="IluminarCasella('+"'"+this.Tauler[Fila][Columna].Id+"')"+'"';
		Text+= ' onmouseout="DesiluminarCasella('+"'"+this.Tauler[Fila][Columna].Id+"')"+'"';
	}
	Text+= '>';
	return (Text);
}

function IluminarCasella(Id) {
	var DivCasella=document.getElementById(Id);
	if (DivCasella) DivCasella.style.backgroundColor="cyan";
}

function DesiluminarCasella(Id) {
	var DivCasella=document.getElementById(Id);
	if (DivCasella) DivCasella.style.backgroundColor="white";
}

Matriu.prototype.VisualitzarMatriuTable =function(Index,Centrada) {
	// Visualitza la matriu fent servir <table>
	var Text="<table style='width:100%;' >";
	//var Text="<table style='border:2px black solid'; width:100%;
	for (var i=1;i<=this.Files.Valor;i++) {
		Text+="<tr>";
		for (var j=1;j<=this.Columnes.Valor;j++) {
			Text+="<td style='border:1px solid white;'>";
			//Text+="<td style='border:1px solid black;'>";
			var Contingut=this.GetText(i,j,Index);
			Text+=Contingut;
			Text+="</td>";
		}
		Text+='</tr>';
		// Afegim un espai de separació
		Text+='<tr><td><br/><br/><td></tr>';
	}
	Text+="</table>";
	return (Text);
}

/************************************************************************************
*
* Matriu --> Configurar
*
************************************************************************************/

Matriu.prototype.CarregarConfiguracio=function(Mode) {
	// Si Mode=1 (opcional) no apareix l'etiqueta de submenú (quan només hi ha una matriu)
	var Text="";
	Text+=this.Files.Output();
	Text+=this.Columnes.Output();
	var Text1=this.AmpladaTotalPercentatge.Output();
	var Text2=this.AmpladaCasella.Output();
	Text+=this.ModeAmplada.Output(Text1,Text2);
	Text+=this.AlturaCasella.Output();
	Text+=this.AlineacioHoritzontal.Output();
	Text+=this.NombreLiniesBlanc.Output();	
	if (Mode==1) return (Text);
	var Text2=GenerarMenuDespegable(this.Id,this.Nom,Text);
	return(Text2);
}

Matriu.prototype.DescarregarConfiguracio=function() {
	this.Files.Descarregar();
	this.Columnes.Descarregar();
	if (this.ModeAmplada.Valor==0) this.AmpladaTotalPercentatge.Descarregar();
	if (this.ModeAmplada.Valor==1) this.AmpladaCasella.Descarregar();
	this.AlturaCasella.Descarregar();
	this.AlineacioHoritzontal.Descarregar();
	this.NombreLiniesBlanc.Descarregar();	
}

Matriu.prototype.ValidarConfiguracio=function() {
	var TotBe=true;
	if(!this.Files.Validar()) TotBe=false;
	if(!this.Columnes.Validar()) TotBe=false;
	this.ModeAmplada.Descarregar();
	if (this.ModeAmplada.Valor==0) if(!this.AmpladaTotalPercentatge.Validar()) TotBe=false;
	if (this.ModeAmplada.Valor==1) if(!this.AmpladaCasella.Validar()) TotBe=false;
	if(!this.AmpladaTotalPercentatge.Validar()) TotBe=false;
	if(!this.AlturaCasella.Validar()) TotBe=false;
	if(!this.AlineacioHoritzontal.Validar()) TotBe=false;
	if(!this.NombreLiniesBlanc.Validar()) TotBe=false;	
	return (TotBe);
}

/***********************************************************************************\
*
* CodiDivUnic
*
************************************************************************************/

/*
	Genera una cadena del tipus TOO_XXX única per identificar els DIV's
	que es van generant dinàmicament, cada vegada que s'executa NouCodi()
	
*/

function CodiDivUnico() {
	this.Capcalera="TOO_";
	this.Index=1;
}

CodiDivUnico.prototype.NouCodi = function (TextBase) {
	var Text=this.Capcalera+TextBase+this.Index;
	this.Index=this.Index+1;
	return(Text);
}

var MyCodiDivUnico = new CodiDivUnico();

/***********************************************************************************\
*
* Diccionari
*
************************************************************************************/

function Traduir(CodiDoble) {
	var Text="";	
	if (CodiDoble==undefined) return("");
	// Un CodiDoble és un string que consta de lletres (el diccionari)
	// i de dígits (l'índex dintre d'aquest diccionari)
	var Diccionari=ExtreureText(CodiDoble);
	var Index=ExtreureNombre(CodiDoble);
	if (Index==0) return("");
	switch(Diccionari) {
		case("JOC"): 	Text=TraduirJoc(Index); break;
		case("BEWOOM"): Text=TraduirBewoom(Index); break;
		case("GEN"): 	Text=TraduirGenerador(Index); break;
		default: 	Text=TraduirGeneral(Index); break;
	}
	return(Text);
}

function TraduirJoc(Index) {
	var Text="";
	switch(IdiomaSeleccionat) {
		case("CAT"): Text=DiccionariJoc_Cat[Index]; break;
		case("CAS"): Text=DiccionariJoc_Cas[Index]; break;
		case("ITA"): Text=DiccionariJoc_Ita[Index]; break;
	}
	return(Text);
}

function TraduirBewoom(Index) {
	var Text="";
	switch(IdiomaSeleccionat) {
		case("CAT"): Text=DiccionariBewoom_Cat[Index]; break;
		case("CAS"): Text=DiccionariBewoom_Cas[Index]; break;
		case("ITA"): Text=DiccionariBewoom_Ita[Index]; break;
	}
	return(Text);
}

function TraduirGenerador(Index) {
	var Text="";
	switch(IdiomaSeleccionat) {
		case("CAT"): Text=DiccionariGen_Cat[Index]; break;
		case("CAS"): Text=DiccionariGen_Cas[Index]; break;
		case("ITA"): Text=DiccionariGen_Ita[Index]; break;
	}
	return(Text);
}

function TraduirGeneral(Index) {
	var Text="";
	switch(IdiomaSeleccionat) {
		case("CAT"): Text=DiccionariGeneral_Cat[Index]; break;
		case("CAS"): Text=DiccionariGeneral_Cas[Index]; break;
		case("ITA"): Text=DiccionariGeneral_Ita[Index]; break;
	}
	return(Text);
}

function ExtreureText(CadenaEntrada) {
	var Cadena=CadenaEntrada+"";
	if (Cadena.length<=0) return ("");
	var Posicio=0;
	var CadenaSortida="";
	while (Posicio<Cadena.length) {
		var Lletra=Cadena.substring(Posicio,Posicio+1);
		if (Lletra=="0"||Lletra=="1"||Lletra=="2"||Lletra=="3"||Lletra=="4"||Lletra=="5"||Lletra=="6"||Lletra=="7"||Lletra=="8"||Lletra=="9") {
			// no fer res
		}
		else CadenaSortida+=Lletra;
		Posicio+=1;
	}
	return (CadenaSortida);
}

function ExtreureNombre(CadenaEntrada) {
	var Cadena=CadenaEntrada+"";
	if (Cadena.length<=0) return ("");
	var Posicio=0;
	var CadenaSortida="";
	while (Posicio<Cadena.length) {
		var Lletra=Cadena.substring(Posicio,Posicio+1);
		if (Lletra=="0"||Lletra=="1"||Lletra=="2"||Lletra=="3"||Lletra=="4"||Lletra=="5"||Lletra=="6"||Lletra=="7"||Lletra=="8"||Lletra=="9") {
			CadenaSortida+=Lletra;
		}
		Posicio+=1;
	}
	return (CadenaSortida);
}

function CanviarAIdioma(NomIdioma) {
	IdiomaSeleccionat=NomIdioma;
	if(IdiomaSeleccionat=="CAT") {
		RetornCarregarDiccionariBe("");
		return;
	}
	var Url="collectiva2/diccionaris/diccionarigeneral_";
	switch(IdiomaSeleccionat) {
		case("CAT"): Url+="cat"; break;
		case("CAS"): Url+="cas"; break;
		case("ITA"): Url+="ita"; break;
	}
	Url+=".txt";
	Url=AfegirParametreURIInicial(Url,"rand",GenerarStringRand());
	var FuncioBe="RetornCarregarDiccionariBe(ContingutAJAX)";
	var FuncioMal="RetornCarregarDiccionariMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

function RetornCarregarDiccionariBe(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	switch(IdiomaSeleccionat) {
		case("CAT"): break;	// el diccionari català està precarregat
		case("CAS"): DiccionariGeneral_Cas=eval("(["+ContingutAJAX+"])"); break;
		case("ITA"): DiccionariGeneral_Ita=eval("(["+ContingutAJAX+"])"); break;
	}
	AfegirCookie("AUTOOMATESIdioma",IdiomaSeleccionat);
	RefrescarFinestral();
}

function RetornCarregarDiccionariMal() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

function IniciarIdioma() {
	if (getCookie("AUTOOMATESIdioma")) {
		IdiomaSeleccionat=getCookie("AUTOOMATESIdioma");
	}
	if (IdiomaSeleccionat=="CAT") {
		RetornIniciarIdiomaBe("");
		return;
	}
	var Url="collectiva2/diccionaris/diccionarigeneral_";
	switch(IdiomaSeleccionat) {
		case("CAT"): Url+="cat"; break;
		case("CAS"): Url+="cas"; break;
		case("ITA"): Url+="ita"; break;
	}
	Url+=".txt";
	Url=AfegirParametreURIInicial(Url,"rand",GenerarStringRand());
	var FuncioBe="RetornIniciarIdiomaBe(ContingutAJAX)";
	var FuncioMal="RetornIniciarIdiomaMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

function RetornIniciarIdiomaBe(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	switch(IdiomaSeleccionat) {
		case("CAT"): break;	// el diccionari català està precarregat
		case("CAS"): DiccionariGeneral_Cas=eval("(["+ContingutAJAX+"])"); break;
		case("ITA"): DiccionariGeneral_Ita=eval("(["+ContingutAJAX+"])"); break;
	}
	RefrescarFinestral();
	IniciFinestres();
}

function RetornIniciarIdiomaMal() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
	IdiomaSeleccionat="CAT";
	RefrescarFinestral();
	IniciFinestres();
}

/***********************************************************************************\
*
* Rutina de Enigma que no es pot carregar via AJAX per IExplorer
*
************************************************************************************/

function RectificarLletra(Lletra) {
	// Passa qualsevol lletra a majúscula i treu accents
	var Lletra2="";
	Lletra2=Lletra.toUpperCase();
	if (Lletra2=="À" || Lletra2=="Á" || Lletra2=="Ä") Lletra2="A";
	if (Lletra2=="È" || Lletra2=="É" || Lletra2=="Ë") Lletra2="E";
	if (Lletra2=="Ì" || Lletra2=="Í" || Lletra2=="Ï") Lletra2="I";
	if (Lletra2=="Ò" || Lletra2=="Ó" || Lletra2=="Ö") Lletra2="O";
	if (Lletra2=="Ù" || Lletra2=="Ú" || Lletra2=="Ü") Lletra2="U";
	return (Lletra2);
}

/************************************************************************************
*
* Cutter
*
************************************************************************************/

function Cutter(TheText,TheSeparador) {
	this.Text=""+TheText;
	this.Separador=""+TheSeparador;
	this.Posicio=0;
	this.ParentesisObrir=0;
	this.ParentesisTancar=0;
	this.Final=false; 	// Indica si ja s'ha arribat al final del text i 
				// no es pot agafar res més
	if (TheText=="") this.Final=true;
}
Cutter.prototype.Tallar = function () {
	// Des de la posició actual cerca el Separador
	// Retorna la cadena que hi ha fins a ell (no inclós)
	// retorna false si s'ha arribat al final (estigui o no el separador)
	var TextActual="";
	if (!this.Text) return;
	if (this.Posicio>this.Text.length) {
		this.Final=true;
		return (TextActual);
	}
	while (this.Posicio<this.Text.length) {	
		if (this.TestCadena(this.Posicio)) {
			this.Posicio=this.Posicio+this.Separador.length;
			if (this.Posicio>this.Text.length) {
				this.Final=true;
			}	
			return (TextActual);
		}
		TextActual=TextActual+this.Text.substring(this.Posicio,this.Posicio+1);
		this.Posicio=this.Posicio+1;
	}
	this.Final=true;
	return (TextActual);
}

Cutter.prototype.TestCadena = function(Posicio) {
	// Comprova si en la posicio del Text està la cadena Separador
	// Si no hi ha Separador retorna false
	if (this.Separador.length<=0) return (false);
	var PosicioSeparador=0;
	while (PosicioSeparador<this.Separador.length) {
		var LletraText=this.Text.substring(Posicio,Posicio+1);
		var LletraSeparador=this.Separador.substring(PosicioSeparador,PosicioSeparador+1);
		if (LletraText!=LletraSeparador) return (false);
		Posicio=Posicio+1;
		PosicioSeparador=PosicioSeparador+1;
	}
	return (true);
}

Cutter.prototype.Detect = function () {
	// Des de la posició actual cerca el Separador
	// Retorna true si l'ha trobat i la posició després del Separador
	// retorna false si s'ha arribat al final i no l'ha trobat
	// Deixa en la variable TextInicial el text fins al separador
	if (this.Posicio>this.Text.length) {
		this.Final=true;
		return (false);
	}
	while (this.Posicio<this.Text.length) {	
		if (this.TestCadena(this.Posicio)) {
			this.Posicio=this.Posicio+this.Separador.length;
			if (this.Posicio>this.Text.length) {
				this.Final=true;
			}	
			return (true);
		}
		this.Posicio=this.Posicio+1;
	}
	this.Final=true;
	return (false);
}
Cutter.prototype.TallarParametres=function () {
	// Des de la posició actual del text, analitza una secció ( Cadena ) ...
	// i retorna Cadena, comptabilitzant els possibles paràmetres interiors.
	// Retorna "" si no s'ha trobat un text d'aquest tipus
	if (this.Posicio>this.Text.length) {
		this.Final=true;
		return ("");
	}
	while (this.Posicio<this.Text.length) {	
		var LletraText=this.Text.substring(this.Posicio,this.Posicio+1);
		this.Posicio=this.Posicio+1;
		if (LletraText=="(") return (this.TallarFinalParametres());
		if (LletraText!=" ") return("");
	}
	this.Final=true;
	return ("");
}
Cutter.prototype.TallarFinalParametres=function () {
	// Des de la posició actual del text, analitza una secció Cadena ) ...
	// i retorna Cadena, comptabilitzant els possibles paràmetres interiors.
	// Retorna "" si no s'ha trobat un text d'aquest tipus
	this.ParentesisObrir=0;
	this.ParentesisTancar=0;
	var TextInterior="";
	if (this.Posicio>this.Text.length) {
		this.Final=true;
		return ("");
	}
	while (this.Posicio<this.Text.length) {	
		var LletraText=this.Text.substring(this.Posicio,this.Posicio+1);
		this.Posicio=this.Posicio+1;
		if (LletraText=="(") this.ParentesisObrir=this.ParentesisObrir+1;
		if (LletraText==")") {
			this.ParentesisTancar=this.ParentesisTancar+1;
			if (this.ParentesisTancar==this.ParentesisObrir+1) {
				return (TextInterior);
			}
		}
		TextInterior=TextInterior + LletraText;
	}
	this.Final=true;
	return ("");
}

/************************************************************************************
*
* Generadors de HTML específics
*
************************************************************************************/

function Espais(n) {
	//Genera una cadena amb n espais (per a fer separacions)
	var Text="";	
	for (var i=0;i<n;i++) Text=Text+"&nbsp;";
	return (Text);
}

function GenerarDivsOposats(ContingutDivEsquerra,ContingutDivDreta,NomDiv) {
	// Genera dintre d'un div amb dos divs oposats, un a l'esquerra i un altre a la dreta
	var DivBase=document.getElementById(NomDiv);
	if (!DivBase) {
		DivBase=document.createElement('div');
		DivBase.id=NomDiv;
		document.appendChild(DivBase);
	}
	var DivEsquerra=document.getElementById(NomDiv+'ESQUERRA');
	if (!DivEsquerra) {
		DivEsquerra=document.createElement('span');
		DivEsquerra.id=NomDiv+'ESQUERRA';
		DivBase.appendChild(DivEsquerra);
	}
	var DivDreta=document.getElementById(NomDiv+'DRETA');
	if (!DivDreta) {
		DivDreta=document.createElement('span');
		DivDreta.id=NomDiv+'DRETA';
		DivDreta.className="dreta";
		DivBase.appendChild(DivDreta);
	}
	DivEsquerra.innerHTML=ContingutDivEsquerra;
	DivDreta.innerHTML=ContingutDivDreta;
}

function GenerarHTMLDuesColumnes(TextEsquerra,TextDreta,PercentatgeEsquerra) {
	// Genera un HTML a dues columnes, donat el HTML de les dues i la seva proporció
	var PercentatgeDreta=100-PercentatgeEsquerra;
	var Text="";
	Text+='<div style="width: '+PercentatgeEsquerra+'%; float:left;">';
	Text+=TextEsquerra;
	Text+='</div>';
	Text+='<div style="width: '+PercentatgeDreta+'%; float:right;">';
	Text+='<div style="margin:10px;">';
	Text+=TextDreta;
	Text+="</div>";
	Text+="</div>";
	return(Text);
}

function GenerarHTMLDuesColumnesOposades(TextEsquerra,TextDreta,PercentatgeEsquerra) {
	// Genera un HTML a dues columnes, donat el HTML de les dues i la seva proporció
	var PercentatgeDreta=100-PercentatgeEsquerra;
	var Text="";
	Text+='<div style="width: '+PercentatgeEsquerra+'%; float:left;">';
	Text+=TextEsquerra;
	Text+='</div>';
	Text+='<div style="width: '+PercentatgeDreta+'%; float:right;">';
	Text+='<div style="margin:10px; text-align:right;">';
	Text+=TextDreta;
	Text+="</div>";
	Text+="</div>";
	return(Text);
}

function GenerarHTMLCapcalera(OpcionsEsquerra,OpcionsDreta,Titol) {
	var Text="";
	var TextEsquerra="<small><small>"+OpcionsEsquerra+"</small></small>";
	var TextDreta="<small><small>"+OpcionsDreta+"</small></small>";
	Text=GenerarHTMLDuesColumnesOposades(TextEsquerra,TextDreta,50);
	Text+="<br/><br/>";
	// Text+="<big>"+Titol+"</big>";
	Text+=Titol;
	Text+="<br/>";
	return (Text);
}


/************************************************************************************
*
* Selectors generals
*
************************************************************************************/

function GenerarSelector(TextSelector,FuncioOnclick) {
	// Genera un text "viu" que executa FuncioOnclick
	var Id=MyCodiDivUnico.NouCodi("SELECTOR");
	var Text='';	
	Text+='<span id="'+Id+'" style="cursor: pointer; color: blue; text-decoration: none;';
	Text+='"';
	Text+=' onclick="'+FuncioOnclick+';"';

	Text+= ' onmouseover="IluminarSelector('+"'"+Id+"')"+'"';
	Text+= ' onmouseout="DesiluminarSelector('+"'"+Id+"')"+'"';
	Text+='>';
	Text+=TextSelector;
	Text+="</span>";
	return (Text);
}

function IluminarSelector(IdDiv) {
	var IdDiv=document.getElementById(IdDiv);
	if(IdDiv) IdDiv.style.textDecoration='underline';
}

function DesiluminarSelector(IdDiv) {
	var IdDiv=document.getElementById(IdDiv);
	if(IdDiv) IdDiv.style.textDecoration='none';
}

function GenerarBoto(Nom,Funcio) {
	// Genera un botó que executa Funcio
	var Text="";
	Text='<input type="button" value="'+Nom+'"';
	Text+=" onclick='"+Funcio+";'>";
	return (Text);
}

/***********************************************************************************\
*
* LinkMesInfo
*
************************************************************************************/

function GenerarEnllacMesInfo(Codi,Nom) {
	var Id=MyCodiDivUnico.NouCodi("MESINFO");
	var Text='<a id="'+Id+'"';
	Text+=' style="cursor: pointer; color: blue; text-decoration: none;"';
	Text+= ' onmouseover="IluminarSelector('+"'"+Id+"')"+'"';
	Text+= ' onmouseout="DesiluminarSelector('+"'"+Id+"')"+'"';
	Text+=' href="http://www.toomates.net/kiwipedia/';
	Text+="info"+Codi+"/";
	Text+="info"+Codi;
	switch(IdiomaSeleccionat) {
		case("CAT"): Text+="_cat"; break;
		case("CAS"): Text+="_cat"; break;
		case("ITA"): Text+="_cat"; break;
	}
	Text+=".html";
	Text+='" target="_blank"; ';
	Text+=' onclick ="VisitaMesInfo('+Codi+');"';
	Text+=' >'+Nom+'</a>';
	return(Text);
}


function GenerarLinkMesInfo(Codi) {
	var Text='<small><small>';
	Text+=GenerarEnllacMesInfo(Codi,"+Info");
	Text+='</small></small>';
	Text+='<img src="collectiva2/logos/mesinfo.png"  alt="Més informació" width="18" height="18"></img>';
	return(Text);
}

function VisitaMesInfo(Codi) {
	GenerarRegistreEstadistic(7,Codi);
}

/***********************************************************************************\
*
* Moviment de divs
*
************************************************************************************/

function DivMobil() {
	this.Id=MyCodiDivUnic.NouCodi();
	this.PosY=256;
	this.PosX=416;
	this.Amplada=100;	// negatiu = sense amplada definida
	this.Altura=80; 	// negatiu = sense altura definida
	this.ColorFons="rgb(255, 0, 0)";
	this.ColorTinta="rgb(0, 0, 0)";
}

DivMobil.prototype.GenerarHTML=function(ContingutHTML) {
	//
	// El continent
	//
	var Text='<div id="'+this.Id+'"';
	Text+=' style="top: '+this.PosY+'px; left: '+this.PosX+'px;';
	if (this.Amplada>=0) Text+=' width:'+this.Amplada+'px;';
	if (this.Altura>=0) Text+=' height:'+this.Altura+'px;';

	Text+=' position: absolute; background-color: '+this.ColorFons;
	Text+='; color: '+this.ColorTinta+'; cursor: move; z-index: 11;"';
	//
	// Moure
	//
	Text+=' onmousedown="comienzoMovimiento(event,this.id);"';
	Text+=' onmouseover="this.style.cursor='+"'"+'move'+"'"+'"';

	Text+='>';
	//
	// El contingut
	//
	Text+=ContingutHTML;
	//
	// Tanco el div del continent
	//
	Text+='</div>';
	return(Text);
}

function carga()
{
	posicion=0; elMovimiento=null;
	
	// IE
	if(navigator.userAgent.indexOf("MSIE")>=0) navegador=0;
	// Otros
	else navegador=1;
}

function evitaEventos(event)
{
	// Funcion que evita que se ejecuten eventos adicionales
	if(navegador==0)
	{
		window.event.cancelBubble=true;
		window.event.returnValue=false;
	}
	if(navegador==1) event.preventDefault();
}

function comienzoMovimiento(event, id) {
	carga();	// aquesta crida ha d'anar fora i només un cop al principi
	elMovimiento=document.getElementById(id);
	
	/* Si el elemento que se le hizo click es texto (nodeType=3) se toma como target
	el elemento padre */
	if(elMovimiento.nodeType==3) elMovimiento=elMovimiento.parentNode;
	
	 // Obtengo la posicion del cursor
	if(navegador==0)
	 {
	 	cursorComienzoX=window.event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
		cursorComienzoY=window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop;

		document.attachEvent("onmousemove", enMovimiento);
		document.attachEvent("onmouseup", finMovimiento);
	}
	if(navegador==1)
	{    
		cursorComienzoX=event.clientX+window.scrollX;
		cursorComienzoY=event.clientY+window.scrollY;
		
		document.addEventListener("mousemove", enMovimiento, true); 
		document.addEventListener("mouseup", finMovimiento, true);
	}
	
	elComienzoX=parseInt(elMovimiento.style.left);
	elComienzoY=parseInt(elMovimiento.style.top);
	// Actualizo el posicion del elemento
	elMovimiento.style.zIndex=++posicion;
	
	evitaEventos(event);
}

function enMovimiento(event)
{  
	var xActual, yActual;
	if(navegador==0)
	{    
		xActual=window.event.clientX+document.documentElement.scrollLeft+document.body.scrollLeft;
		yActual=window.event.clientY+document.documentElement.scrollTop+document.body.scrollTop;
	}  
	if(navegador==1)
	{
		xActual=event.clientX+window.scrollX;
		yActual=event.clientY+window.scrollY;
	}
	
	elMovimiento.style.left=(elComienzoX+xActual-cursorComienzoX)+"px";
	elMovimiento.style.top=(elComienzoY+yActual-cursorComienzoY)+"px";

	evitaEventos(event);
}

function finMovimiento(event)
{
	if(navegador==0)
	{    
		document.detachEvent("onmousemove", enMovimiento);
		document.detachEvent("onmouseup", finMovimiento);
	}
	if(navegador==1)
	{
		document.removeEventListener("mousemove", enMovimiento, true);
		document.removeEventListener("mouseup", finMovimiento, true); 
	}
}


/***********************************************************************************\
*
*
*
* Bloc Formularis
*
*
*
************************************************************************************/

/************************************************************************************
*
* Gestió dels formularis --> Conversor Binari - Base32
*
************************************************************************************/

function ConvertirCincBinariABase32(CadenaBinari) {
	var TotZeros="00000";
	if (CadenaBinari.length<5) {
		var Diferencia=5-CadenaBinari.length;
		CadenaBinari=CadenaBinari+TotZeros.substring(0,Diferencia);
	}
	if (CadenaBinari.length>5) {
		CadenaBinari=CadenaBinari.substring(0,5);
	}
	var m="";
	switch (CadenaBinari) {
		case '00000': m='0';break;
		case '00001': m='1';break;
		case '00010': m='2';break;
		case '00011': m='3';break;
		case '00100': m='4';break;
		case '00101': m='5';break;
		case '00110': m='6';break;
		case '00111': m='7';break;
		case '01000': m='8';break;
		case '01001': m='9';break;
		case '01010': m='A';break;
		case '01011': m='B';break;
		case '01100': m='C';break;
		case '01101': m='D';break;
		case '01110': m='E';break;
		case '01111': m='F';break;
		case '10000': m='G';break;
		case '10001': m='H';break;
		case '10010': m='I';break;
		case '10011': m='J';break;
		case '10100': m='K';break;
		case '10101': m='L';break;
		case '10110': m='M';break;
		case '10111': m='N';break;
		case '11000': m='O';break;
		case '11001': m='P';break;
		case '11010': m='Q';break;
		case '11011': m='R';break;
		case '11100': m='S';break;
		case '11101': m='T';break;
		case '11110': m='U';break;
		case '11111': m='V';break;
		default:LogError(2166);	// Nombre no trobat a ConvertirCincBinariABase32
	}
	return (m);
}

function ConvertirBase32ACincBinari(Base32) {
	var m=Base32.toString();
	switch (m) {
		case '0': Binari='00000';break;
		case '1': Binari='00001';break;
		case '2': Binari='00010';break;
		case '3': Binari='00011';break;
		case '4': Binari='00100';break;
		case '5': Binari='00101';break;
		case '6': Binari='00110';break;
		case '7': Binari='00111';break;
		case '8': Binari='01000';break;
		case '9': Binari='01001';break;
		case 'A': Binari='01010';break;
		case 'B': Binari='01011';break;
		case 'C': Binari='01100';break;
		case 'D': Binari='01101';break;
		case 'E': Binari='01110';break;
		case 'F': Binari='01111';break;
		case 'G': Binari='10000';break;
		case 'H': Binari='10001';break;
		case 'I': Binari='10010';break;
		case 'J': Binari='10011';break;
		case 'K': Binari='10100';break;
		case 'L': Binari='10101';break;
		case 'M': Binari='10110';break;
		case 'N': Binari='10111';break;
		case 'O': Binari='11000';break;
		case 'P': Binari='11001';break;
		case 'Q': Binari='11010';break;
		case 'R': Binari='11011';break;
		case 'S': Binari='11100';break;
		case 'T': Binari='11101';break;
		case 'U': Binari='11110';break;
		case 'V': Binari='11111';break;
		default:LogError(2206);	// Nombre no trobat a ConvertirBase32ACincBinari
	}
	return (Binari);
}

function ConvertirBinariABase32(CadenaBinari) {
	var PosicioInicial=0;
	var Base32="";
	if (CadenaBinari=="") return("");
	do {
		CadenaBinariCinc=CadenaBinari.substring(PosicioInicial,PosicioInicial+5);
		Base32+=ConvertirCincBinariABase32(CadenaBinariCinc);
		PosicioInicial+=5;
	} while(PosicioInicial<CadenaBinari.length);
	return (Base32);
}

function ConvertirBase32ABinari(CadenaBase32) {
	var PosicioInicial=0;
	var Binari="";
	if (CadenaBase32=="") return("");
	do {
		var Digit32=CadenaBase32.substring(PosicioInicial,PosicioInicial+1);
		Binari+=ConvertirBase32ACincBinari(Digit32);
		PosicioInicial+=1;
	} while(PosicioInicial<CadenaBase32.length);
	return (Binari);
}

function ConvertirBinariABase10(CadenaBinari) {
	if (CadenaBinari=="") return(0);
	var Cadena=CadenaBinari+"";
	var Total=0;
	var Posicio=Cadena.length-1;
	var Potencia2=1;
	while (Posicio>=0) {
		var Digit=Cadena.substring(Posicio,Posicio+1);
		if (Digit=="1") Total=Total+Potencia2;
		Potencia2=Potencia2*2;
		Posicio-=1;
	}
	return (Total);
}

function ConvertirBase10ABinari(Valor,XifresBinari) {
	var CadenaBinari="";
	while (Valor>0) {
		if (Valor%2) CadenaBinari="1"+CadenaBinari;
		else CadenaBinari="0"+CadenaBinari;
		Valor=Valor>>1;
	}
	while(CadenaBinari.length<XifresBinari) CadenaBinari="0"+CadenaBinari;
	return(CadenaBinari);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada
*
************************************************************************************/

function Entrada(TheAqui,CodiNom) {
	this.Nom=Traduir(CodiNom);	// El nom de l'entrada
	this.Valor="";					// El valor de l'entrada
	this.ValorInicial="";				// Valor per defecte
	this.Id=MyCodiDivUnico.NouCodi("ENTRADA");
	this.IdMissatgeError=MyCodiDivUnico.NouCodi("MIS_ERROR");
	// 
	// Configuració 
	//
	this.AfegirSaltLinia=true;	
	this.Invisible=false;
	this.Fix=false;
	this.CodiMesInfo=0;		// 0 --> No té fitxer ajuda associat
	this.NoPotSerBuit=false;
	this.AmpladaPx=30;
	this.NomURL="";			// "" significa que no té sortida URL
	this.NomJSON="";		// "" significa que no té sortida JSON
	this.ContingutModificat=false;
	this.Aqui=TheAqui;
	this.SortidaURLObligatori=false;
	this.SortidaJSONObligatoria=false;
}

Entrada.prototype.MirarSiContingutModificat = function() {
	// Retorna true si l'usuari ha modificat el contingut per pantalla
	return(this.ContingutModificat);
}

Entrada.prototype.FuncioOnChange = function() {
	// Marca aquest element com a modificat
	this.ContingutModificat=true;
}

Entrada.prototype.MirarSiTeSortidesURLObligatories = function() {
	return(this.SortidaURLObligatori);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Input/Output per pantalla
*
************************************************************************************/

Entrada.prototype.OutputHTML = function() {
	var Text="";
	if (this.Invisible==true) return("");
	if (this.Nom!="") {
		Text= this.Nom + ":&nbsp;";
	}
	Text+=this.OutputHTMLEspecific();
	if (this.CodiMesInfo>0) Text+="&nbsp;&nbsp;"+this.GenerarMesInfo();
	Text+=this.GenerarEspaiMissatgeError();
	if (this.AfegirSaltLinia==true) Text+="<br />";
	return(Text);
}

Entrada.prototype.GenerarMesInfo = function() {
	Text=GenerarLinkMesInfo(this.CodiMesInfo);
	return(Text);
}

Entrada.prototype.OutputHTMLEspecific = function() {
	// Rutina reescrivible
	return("");
}

Entrada.prototype.Descarregar = function() {
	// Intenta descarregar el valor introduït per l'usuari a la variable Valor.
	if (this.Invisible==true) return;
	if (this.Fix==true) return;
	if (this.MirarSiContingutModificat()==false) return;
	this.DescarregarEspecific();
}

Entrada.prototype.DescarregarEspecific = function() {
	// Rutina reescrivible
}

Entrada.prototype.Validar = function() {
	// Comprova si el valor introduït per l'usuari en pantalla és vàlid.
	// Retorna true si és vàlid i false si no és vàlid
	if (this.Invisible==true) return (true);
	if (this.NoPotSerBuit==true) {
		var Valor=document.getElementById(this.Id).value;
		if (!Valor || Trim(Valor)=="") {
			this.GenerarMissatgeError(11);		// "No pot ser buit"			
			return(false);
		}
	}
	if (this.ValidarEspecific()==false) return(false);
	return(true);
}

Entrada.prototype.ValidarEspecific = function() {
	// Rutina reescrivible
	// Comprova si el valor introduït per l'usuari en pantalla és vàlid.
	// Retorna true si és vàlid i false si no és vàlid
	return (true);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Input/Output per URL
*
************************************************************************************/

Entrada.prototype.OutputURL = function(NomesModificat) {
	var Text="";
	if(this.SortidaURLObligatori!=true)  {
		if (this.Invisible==true) return("");
		if (NomesModificat==true && this.MirarSiContingutModificat()==false) return("");
		if (this.NomURL=="") return("");	
	}
	var v=this.Valor+"";
	Text=this.NomURL+"="+encodeURIComponent(this.ConvertirCaractersHTML(v));
	return(Text);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Input/Output per JSON i URL
*
************************************************************************************/

Entrada.prototype.OutputJSON = function(NomesModificat) {
	var Text="";
	if (this.SortidaJSONObligatoria==false) {
		if (NomesModificat==true && this.MirarSiContingutModificat()==false) return("");
		if (this.Valor==this.ValorInicial) return("");
	}
	if (this.NomJSON!="") Text=this.NomJSON+":";
	Text+='"'+this.CodificarHTMLValid(this.ConvertirCaractersHTML(this.Valor))+'"';
	return(Text);
}

Entrada.prototype.InputURL = function(TheValor) {
	if (TheValor==undefined) return;
	this.Valor=this.DecodificarHTMLValid(decodeURIComponent(TheValor));
}

Entrada.prototype.Input = function(TheValor) {
	if (TheValor==undefined) return;
	this.Valor=this.DecodificarHTMLValid(TheValor);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Input/Output per JSON i URL --> Gestió Tokens HTML
*
************************************************************************************/

Entrada.prototype.CodificarHTMLValid = function(Cadena) {
	// Substitueix cadenes HTML vàlides <> per alternatives que passin el filtre php strip_tags []
	Cadena=""+Cadena;
	Cadena=this.SubstituirTotsTokens(Cadena,TokensHTML,"<",">","[","]");
	Cadena=this.SubstituirTotsTokens(Cadena,TokensMathML,"<",">","[","]");
	return(Cadena);
}

Entrada.prototype.DecodificarHTMLValid = function(Cadena) {
	// Substitueix cadenes HTML vàlides [] per alternatives que passin el filtre php strip_tags <>
	Cadena=""+Cadena;
	Cadena=this.SubstituirTotsTokens(Cadena,TokensHTML,"[","]","<",">");
	Cadena=this.SubstituirTotsTokens(Cadena,TokensMathML,"[","]","<",">");
	return(Cadena);
}

Entrada.prototype.SubstituirTotsTokens = function(Cadena,Taula,AnticInici,AnticFinal,NouInici,NouFinal) {
	for (var i=0;i<Taula.length;i++) {
		var CadenaBuscada=AnticInici+Taula[i]+AnticFinal;
		var NovaCadena=NouInici+Taula[i]+NouFinal;
		Cadena=ReplaceAll(Cadena,CadenaBuscada,NovaCadena);	
		var CadenaBuscada=AnticInici+"/"+Taula[i]+AnticFinal;
		var NovaCadena=NouInici+"/"+Taula[i]+NouFinal;
		Cadena=ReplaceAll(Cadena,CadenaBuscada,NovaCadena);	
	}
	return(Cadena);
}

Entrada.prototype.ConvertirCaractersHTML = function(Cadena) {
	// Fa un filtre de seguretat de caràcters extranys...
	var Text="";
	if (Cadena=="") return ("");
	for (var i=0;i<Cadena.length;i++) {
		var Lletra=Cadena.substring(i,i+1);
		switch (Lletra) {
		        case "'" : Lletra = "&#39;"; break;
	        	case "·" : Lletra = "&middot;"; break;
			case '"' : Lletra = "&quot;"; break;
			case '\n': Lletra = "<br />"; break;
			case '%' : Lletra = "&#37;"; break;
		}
		Text=Text+Lletra;
	}
	return (Text);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Gestió dels missatges d'error
*
************************************************************************************/

Entrada.prototype.GenerarEspaiMissatgeError = function() {
	var Text="";
	Text+='<span id="'+this.IdMissatgeError+'" style="color:red;"></span>';
	return(Text);
}

Entrada.prototype.ResetMissatgeError = function() {
	// Esborra l'espai del missatge d'error per si abans va aparèixer algun
	if (this.Invisible==true) return;
	var Id=document.getElementById(this.IdMissatgeError);
	if(Id) Id.innerHTML="";
}

Entrada.prototype.GenerarMissatgeError = function(CodiError) {
	var Id=document.getElementById(this.IdMissatgeError);
	var Text="&nbsp;<small><small><b>"+Traduir(CodiError)+"</b></small></small>";
	Id.innerHTML=Text;
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Enter
*
************************************************************************************/

function EntradaEnter(TheAqui,CodiNom) {
	Entrada.call(this,TheAqui,CodiNom);
	this.ValorMinim=null;
	this.ValorMaxim=null;
	this.Valor=0;
	this.ValorInicial=0;
	this.AmpladaPx=7;
}
EntradaEnter.prototype = new Entrada();

EntradaEnter.prototype.OutputHTMLEspecific = function() {
	var Text="";
	Text+='<input type="text" id="' + this.Id +'"';
	Text+=' size="' + this.AmpladaPx + '" '; 
	Text+=' value="' + this.Valor + '"';
	if (this.Fix==true) Text+=' disabled="disabled" ';
	Text+=' onchange="'+this.Aqui+'FuncioOnChange();"';
	Text+='>';
	return (Text);
}

EntradaEnter.prototype.OutputJSON = function(NomesModificat) {
	var Text="";
	if (NomesModificat==true && this.MirarSiContingutModificat()==false) return("");
	if (this.Valor==this.ValorInicial) return("");
	if (this.NomJSON!="") Text=this.NomJSON+":";
	Text+=this.Valor;
	return(Text);
}
	
EntradaEnter.prototype.DescarregarEspecific = function() {
	var RespostaUsuari=document.getElementById(this.Id).value;
	this.Valor=RespostaUsuari;
}

EntradaEnter.prototype.ValidarEspecific = function() {
	var Valor=document.getElementById(this.Id).value;
	if (!isFinite(Valor)||isNaN(Valor)) {
		this.GenerarMissatgeError(12);
		return (false);
	}
	if (Math.floor(Valor)!=Valor) {
		this.GenerarMissatgeError(13);
		return (false);
	}
	if (this.ValorMinim!=null) {
		if (Valor<this.ValorMinim) return (false);
	}
	if (this.Maxim!=null) {
		if (Valor>this.ValorMaxim) return (false);
	}
	return (true);
}

EntradaEnter.prototype.CarregarValorDeCadenaBinari =function(CadenaBinari,Inici,NombreBits) {
	var Cadena=CadenaBinari.substring(Inici,Inici+NombreBits);
	var ValorEnter=ConvertirBinariABase10(Cadena);
	this.Valor=ValorEnter;
}

EntradaEnter.prototype.OutputBinari =function(NombreBits) {
	var Cadena=ConvertirBase10ABinari(this.Valor,NombreBits);
	return(Cadena);
}

EntradaEnter.prototype.Input = function(TheValor) {
	if (TheValor==undefined) return;
	this.Valor=parseFloat(TheValor);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Puntuació
*
************************************************************************************/

function EntradaPuntuacio(TheAqui,CodiNom) {
	EntradaEnter.call(this,TheAqui,CodiNom);
	this.ValorMinim=0;
	this.ValorMaxim=999;
	this.Buit=true;
	this.ModeSeguiment=1;	// 1 --> Sense Seguiment, 2 --> Seguiment únic, 3 --> Seguiment diari
	this.IdUsuari=0;	// 0 --> Id desconeguda
	this.LoginUsuari="";	// "" --> Login desconegut 
}
EntradaPuntuacio.prototype = new EntradaEnter();

EntradaPuntuacio.prototype.OutputHTMLEspecific = function() {
	var Contingut=Valor;
	if (this.Buit==true) {
		Contingut="---";
	}
	var Text="";
	Text+='<input type="text" id="' + this.Id +'"';
	Text+=' size="' + this.AmpladaPx + '" '; 
	Text+=' value="' + this.Contingut + '"';
	if (this.Fix==true) Text+=' disabled="disabled" ';
	Text+=' onchange="'+this.Aqui+'FuncioOnChange();"';
	Text+='>';
	return (Text);
}

EntradaPuntuacio.prototype.GenerarHTML = function(Mode) {
	var Text="";
	if (this.ModeSeguiment==1) return("");
	if (NomUsuari=="") return("");
	Text+="<small><small>"+this.GenerarHTMLPla(Mode)+"</small></small>";
	return (Text);
}

EntradaPuntuacio.prototype.GenerarHTMLPla = function(Mode) {
	var Text="";
	if (Mode==1 && (this.Buit==true || this.Valor<=0)) return("");
	var ColorFons=this.DeterminarColorFons(this.Valor);
	Puntuacio="---";
	if (this.Buit==false && this.Valor>=0) {
		Puntuacio=""+this.Valor;
	}
	var Percentatge="<small><small><sup>%</sup></small></small>";
	Text+="<span style='background-color:#"+ColorFons+";'>&nbsp;"+Puntuacio+Percentatge+"&nbsp;</span>";
	return (Text);
}

EntradaPuntuacio.prototype.DeterminarColorFons = function(TheValor) {
	if(TheValor<=0) return("ffbab4"); // vermell
	if(TheValor<100) return("fffb93"); // groc
	return("b5ffb4");	// verd
}

EntradaPuntuacio.prototype.Input = function(TheValor) {
	var v=this.RectificarPuntuacio(TheValor);
	if(v<0) {
		this.Buit=true;
		return;
	}
	this.Buit=false;
	this.Valor=v;
}

EntradaPuntuacio.prototype.RectificarPuntuacio = function(TheValor) {
	var v=Math.round(parseFloat(TheValor));
	if(v<0) return(-1);
	if (v>999) v=999;	// A la b.d. es codifica amb tres dígits
	return(v);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Text
*
************************************************************************************/

function EntradaText(TheAqui,CodiNom) {
	Entrada.call(this,TheAqui,CodiNom);
	this.TextArea=false;			// Genera un 'textarea'
	this.Files=4;
	this.Columnes=50;
	this.MaximaLongitud=0;			// 0 --> No té màxima longitud
	this.MinimaLongitud=0;			// 0 --> No té mínima longitud
	this.ValorInicial="";
	this.Valor="";
}
EntradaText.prototype = new Entrada();

EntradaText.prototype.OutputHTMLEspecific = function() {
	var Text="";
	if (this.TextArea==false) {
		Text+= '<input type="text" id="' + this.Id +'"';
		Text+= 'size="' + this.AmpladaPx + '" '; 
		Text+= 'value="' + this.Valor + '"';
		if (this.Fix==true) Text+=' disabled="disabled" ';
		Text+=' onchange="'+this.Aqui+'FuncioOnChange();"';
		Text+='>';
	}
	else {
		Text+= '<br /><textarea id="' + this.Id +'"';
		Text+= 'size="' + this.AmpladaPx + '" '; 
		Text+= 'rows="' + this.Files + '" '; 
		Text+= 'cols="' + this.Columnes + '" '; 
		if (this.Fix==true) Text+=' disabled="disabled" ';
		Text+=' onchange="'+this.Aqui+'FuncioOnChange();"';
		Text+='>'+this.Valor+'</textarea>';
	}	
	return (Text);
}

EntradaText.prototype.DescarregarEspecific = function() {
	var RespostaUsuari=document.getElementById(this.Id).value;
	this.Valor=RespostaUsuari;
}

EntradaText.prototype.ValidarEspecific = function() {
	var RespostaUsuari=document.getElementById(this.Id).value;
	if (this.MaximaLongitud>0) {
		if (RespostaUsuari.length>this.MaximaLongitud) {
			this.GenerarMissatgeError(1);
			return (false);
		}
	}
	if (this.MinimaLongitud>0) {
		if (RespostaUsuari.length<this.MinimaLongitud) {
			this.GenerarMissatgeError(1);
			return (false);
		}
	}
	return (true);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> EstructuraJSON
*
************************************************************************************/

function EntradaJSON(TheAqui,CodiNom) {
	EntradaText.call(this,TheAqui,CodiNom);
	this.TextArea=false;			// Genera un 'textarea'
	this.Files=4;
	this.Columnes=50;
	this.MaximaLongitud=0;			// 0 --> No té màxima longitud
	this.MinimaLongitud=0;			// 0 --> No té mínima longitud
}
EntradaJSON.prototype = new EntradaText();

EntradaJSON.prototype.OutputJSON = function(NomesModificat) {
	var Text="";
	if (NomesModificat==true && this.MirarSiContingutModificat()==false) return("");
	if (this.NomJSON!="") Text=this.NomJSON+":";
	if (this.Valor=="") Text+="{}";
	else Text+=this.Valor;
	return(Text);
}

/***********************************************************************************\
*
* Entrada -->  Identificador
*
************************************************************************************/

function EntradaIdentificador(TheAqui,CodiNom) {
	EntradaText.call(this,TheAqui,CodiNom);
	this.NoPotSerBuit=true;
	this.MinimaLongitud=3;
	this.MaximaLongitud=18;
}
EntradaIdentificador.prototype = new EntradaText();

EntradaIdentificador.prototype.ValidarEspecific =function() {
	//Només pot ser una paraula amb lletres i números, sense espais
	var IdentificadorProposat=document.getElementById(this.Id).value;
	if (IdentificadorProposat.match(/\W/)) {
		this.GenerarMissatgeError(14);
		return(false)
	}
	if (this.MaximaLongitud>0) {
		if (IdentificadorProposat.length>this.MaximaLongitud) {
			this.GenerarMissatgeError(239);
			return (false);
		}
	}
	if (this.MinimaLongitud>0 && this.NoPotSerBuit==true) {
		if (IdentificadorProposat.length<this.MinimaLongitud) {
			this.GenerarMissatgeError(238);
			return (false);
		}
	}
	return(true);
}

/***********************************************************************************\
*
* Entrada --> Password
*
************************************************************************************/

function EntradaPassword(TheAqui,CodiNom) {
	EntradaIdentificador.call(this,TheAqui,CodiNom);
}
EntradaPassword.prototype = new EntradaIdentificador();

EntradaPassword.prototype.OutputHTMLEspecific = function() {
	var Text="";
	Text+= '<input type="password" id="' + this.Id +'"';
	Text+= 'size="' + this.AmpladaPx + '" '; 
	Text+= 'value="' + this.Valor + '"';
	if (this.Fix==true) Text+=' disabled="disabled" ';
	Text+=' onchange="'+this.Aqui+'FuncioOnChange();"';
	Text+='>';
	return (Text);
}

/***********************************************************************************\
*
* Entrada --> PasswordCurs
*
************************************************************************************/

function EntradaPasswordCurs(TheAqui,CodiNom) {
	EntradaPassword.call(this,TheAqui,CodiNom);
	this.NoPotSerBuit=false;	// Els cursos tenen password opcional
}
EntradaPasswordCurs.prototype = new EntradaPassword();

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> HTML
*
************************************************************************************/

function EntradaHTML(TheAqui,CodiNom) {
	Entrada.call(this,TheAqui,CodiNom);
}
EntradaHTML.prototype = new Entrada();

EntradaHTML.prototype.OutputHTMLEspecific = function() {
	var Text=this.Valor;
	return (Text);
}

EntradaHTML.prototype.OutputJSON = function(NomesModificat) {
	return("");
}

/***********************************************************************************\
*
* Gestió dels formularis --> Seguidor
*
************************************************************************************/

function Seguidor(TheAqui,CodiNom) {
	Entrada.call(this,TheAqui,CodiNom);
	this.Missatges=new Array();
	this.NombreMaximMissatges=5;
	this.AmbRodonetaCarregant=false;
}
Seguidor.prototype = new Entrada();

Seguidor.prototype.AfegirMissatge = function(TheMissatge) {
	this.AmbRodonetaCarregant=false;
	if (this.Missatges.length>=this.NombreMaximMissatges) {
		for (var i=0;i<this.Missatges.length-1;i++) {
			this.Missatges[i]=this.Missatges[i+1];
		}
		this.Missatges[this.Missatges.length-1]=TheMissatge;
	}
	else this.Missatges[this.Missatges.length]=TheMissatge;
	this.Refrescar();
}

Seguidor.prototype.Refrescar = function() {
	var Div=document.getElementById(this.Id);
	if (Div) Div.innerHTML=this.OutputHTML();
}

Seguidor.prototype.OutputHTML = function() {
	var Text='<div id="'+this.Id+'">';
	for (var i=0;i<this.Missatges.length;i++) {
		Text+="<br/>";
		Text+=this.Missatges[i];
		if(this.AmbRodonetaCarregant==true && i==this.Missatges.length-1) {
			Text+='<img src="collectiva2/logos/rodoneta_carregant.gif" alt="carregant" width="16" height="16">';
		}
	}
	Text+="</div>";
	return(Text);
}

Seguidor.prototype.Reset = function() {
	this.Missatges=new Array();
}

Seguidor.prototype.AfegirMissatgeCarregant = function() {
	this.AmbRodonetaCarregant=true;
	this.Refrescar();
}


/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Boto
*
************************************************************************************/

function EntradaBoto(TheAqui,CodiNom,TheNomFuncio) {
	Entrada.call(this,TheAqui,CodiNom);
	this.NomFuncio=TheNomFuncio;
	this.Nom="";
	this.NomBoto=Traduir(CodiNom);
}
EntradaBoto.prototype = new Entrada();

EntradaBoto.prototype.OutputHTMLEspecific = function() {
	var Text="";
	Text='<input type="button" value="'+this.NomBoto+'"';
	Text+=" onclick='"+this.NomFuncio+";'>";
	return (Text);
}

EntradaBoto.prototype.OutputJSON = function(NomesModificat) {
	return("");
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> Link
*
************************************************************************************/

function EntradaLink(TheAqui,CodiNom,TheNomFuncio) {
	Entrada.call(this,TheAqui,CodiNom);
	this.NomFuncio=TheNomFuncio;
	this.Nom="";
	this.NomBoto=Traduir(CodiNom);
}
EntradaLink.prototype = new Entrada();

EntradaLink.prototype.OutputHTMLEspecific = function() {
	var Text="";
	Text+='<span style="cursor: pointer; color: blue; text-decoration: underline;';
	Text+='"';
	Text+=' onclick="'+this.NomFuncio+';">';
	if (this.NomBoto!="") Text+=this.NomBoto;
	else Text+="("+Traduir(24)+")";	// Sense nom
	Text+="</span>";
	return(Text);
}

EntradaLink.prototype.OutputJSON = function(NomesModificat) {
	return("");
}

/***********************************************************************************\
*
* Gestió dels formularis --> Entrada --> SortidaModal
*
************************************************************************************/

function EntradaSortidaModal(TheAqui,CodiNom,TheNomFuncio,TheAquiFormulari) {
	Entrada.call(this,TheAqui,CodiNom);
	this.NomFuncio=TheNomFuncio;
	this.AquiFormulari=TheAquiFormulari;
	this.Nom="";
	this.NomBoto=Traduir(CodiNom);
	this.Selector=false;
}
EntradaSortidaModal.prototype = new Entrada();

EntradaSortidaModal.prototype.OutputHTMLEspecific = function() {
	var Text="";
	Funcio=this.AquiFormulari+"EliminarFormulariModal();"+this.NomFuncio;
	if (this.Selector==false) {
		Text='<input type="button" value="'+this.NomBoto+'"';
		Text+=" onclick='"+Funcio+";'>";
		return (Text);
	}
	Text+=GenerarSelector(this.NomBoto,Funcio);
	return(Text);
}

EntradaSortidaModal.prototype.OutputJSON = function(NomesModificat) {
	return("");
}

/************************************************************************************
*
* Gestió dels formularis --> Entrada --> True/False
*
************************************************************************************/

function EntradaTrueFalse(TheAqui,CodiNom) {
	// Internament es codifica de la següent manera:
	// 1 --> True
	// 0 --> False
	Entrada.call(this,TheAqui,CodiNom);
	this.Valor=0;
	this.ValorInicial=0;
}
EntradaTrueFalse.prototype = new Entrada();

EntradaTrueFalse.prototype.OutputHTMLEspecific = function() {
	var Text='<input type="checkbox" ';
	if (this.Valor==1) Text+=' checked="checked"';
	Text+=' id="' + this.Id+'"';
	if (this.Fix) Text+=' disabled="disabled" ';
	Text+=' onchange="'+this.Aqui+'FuncioOnChange();"';
	Text+= '">'
	return (Text);
}

EntradaTrueFalse.prototype.DescarregarEspecific = function() {
	var RespostaUsuari=document.getElementById(this.Id).checked;
	if (RespostaUsuari==true) this.Valor=1;
	else this.Valor=0;
}

EntradaTrueFalse.prototype.OutputBinari = function() {
	if (this.Valor==1) return("1");
	return("0");
}

EntradaTrueFalse.prototype.CarregarValorDeCadenaBinari =function(CadenaBinari,Inici) {
	var Cadena=CadenaBinari.substring(Inici,Inici+1);
	if(Cadena=="1") this.Valor=1;
	else this.Valor=0;
}

EntradaTrueFalse.prototype.Input = function(TheValor) {
	if (TheValor==undefined) return;
	this.Valor=parseFloat(TheValor);
}

EntradaTrueFalse.prototype.OutputJSON = function(NomesModificat) {
	var Text="";
	if (NomesModificat==true && this.MirarSiContingutModificat()==false) return("");
	if (this.Valor==this.ValorInicial) return("");
	if (this.NomJSON!="") Text=this.NomJSON+":";
	Text+=this.Valor;
	return(Text);
}

/************************************************************************************
*
* Gestió dels formularis --> Entrada --> Selector d'opcions
*
************************************************************************************/

function EntradaSelector(TheAqui,CodiNom) {
	// Gestiona un objecte de configuració de tipus Opció
	// Les opcions possibles són 0, 1, 2,...
	// La primera opció és la 0.
	// Només es visualitzen les opcions <>""
	// Cada opció té un nom.
	Entrada.call(this,TheAqui,CodiNom);
	this.NomOpcions=new Array();
	this.Valor=0;
	this.ValorInicial=0;
	this.Items=new Array();
}
EntradaSelector.prototype = new Entrada();

EntradaSelector.prototype.AfegirNomOpcio =function(CodiNom) {
	this.NomOpcions[this.NomOpcions.length]=Traduir(CodiNom);
}

EntradaSelector.prototype.OutputHTMLEspecific = function() {
	var Text="";
	Text+='<select id="' + this.Id + '"';
	Text+=' onchange="'+this.Aqui+'AccioCanviSeleccio();"';
	if (this.Fix) Text+=' disabled="disabled" ';
	Text+=">";
	for (var i=0;i<this.NomOpcions.length;i++) {
		// Només es visualitzen aquelles opcions que no estan buides
		if (this.NomOpcions[i]!="") {
			if (this.Fix==false || i==this.Valor) {
				Text=Text + '<option value=' + i;
				if (i==this.Valor) Text=Text+' selected="selected" ';
				Text=Text+ '>';
				Text=Text + this.NomOpcions[i];
				Text=Text + "</option>";
			}
		}
	}
	Text= Text+"</select>";
	//
	// Visualitzem totes els subentrades si n'hi ha
	//
	if (this.Items.length>0) {
		Text+='<table id="' + this.Id + "TABLE"+ '" style=" display: block;">';	
		Text=Text+"<tr><td WIDTH=30></td><td>";
		for (var i=0;i<this.Items.length;i++) {
			var IdSubMenu=this.Id+"_"+i;
			if (this.Valor==i) Text=Text+'<div id="' + IdSubMenu + '" style=" display: block;">';
			else Text=Text+'<div id="' + IdSubMenu + '" style=" display: none;">';
			if(this.Items[i]) Text+=this.Items[i].OutputHTML("",false);
			Text+="</div>";
		}
		Text=Text+"</td></tr></table>";
	}
	return (Text);
}

EntradaSelector.prototype.ValidarEspecific = function() {
	var RespostaUsuari=document.getElementById(this.Id).value;
	//
	// Només validem el submenú actiu si n'hi ha
	//
	if (this.Items.length>0) {
		if(this.Items[this.Valor]) return(this.Items[this.Valor].Validar());
	}
	return (true);
}

EntradaSelector.prototype.DescarregarEspecific =function() {
	var RespostaUsuari=document.getElementById(this.Id).value;
	this.Valor=parseFloat(RespostaUsuari);
	//
	// Només descarreguem el submenú actiu si n'hi ha
	//
	if (this.Items.length>0) {
		if(this.Items[this.Valor]) this.Items[this.Valor].Descarregar();
	}
}

EntradaSelector.prototype.AccioCanviSeleccio =function() {
	this.FuncioOnChange();
	// Visualitzem el submenú si n'hi ha
	var RespostaUsuari=document.getElementById(this.Id).value;
	for (var i=0;i<this.Items.length;i++) {
		var IdSubMenu=this.Id+"_"+i;
		var oDiv=document.getElementById(IdSubMenu);
		if (RespostaUsuari==i)  oDiv.style.display="block";
		else  oDiv.style.display="none";
	}
}

EntradaSelector.prototype.MirarSiContingutModificat = function() {
	if (this.ContingutModificat==true) return(true);
	var RespostaUsuari=-1;
	var Div=document.getElementById(this.Id);
	if (Div) RespostaUsuari=Div.value;
	else RespostaUsuari=this.Valor;
	if(this.Items[RespostaUsuari]) return(this.Items[RespostaUsuari].MirarSiContingutModificat());
	return(false);
}

EntradaSelector.prototype.CarregarValorDeCadenaBinari =function(CadenaBinari,Inici,NombreBits) {
	var Cadena=CadenaBinari.substring(Inici,Inici+NombreBits);
	var ValorEnter=ConvertirBinariABase10(Cadena);
	this.Valor=ValorEnter;
}

EntradaSelector.prototype.OutputBinari =function(NombreBits) {
	var Cadena=ConvertirBase10ABinari(this.Valor,NombreBits);
	return(Cadena);
}

EntradaSelector.prototype.Input = function(TheValor) {
	if (TheValor==undefined) return;
	this.Valor=parseFloat(TheValor);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Formulari
*
************************************************************************************/

function Formulari(TheAqui,CodiNom) {
	Entrada.call(this,TheAqui,CodiNom);
	this.TitolF=Traduir(CodiNom);	// Titol del formulari
	this.Items=new Array();				// Elements d'entrada del formulari
	// 
	// Configuració 
	//
	this.AfegirSaltLinia=true;	
	this.Desplegable=false;
	this.ColorFons="#fff2d2";
	this.Amplada=0;		// 0 --> No definida
	this.Altura=0;		// 0 --> No definida
	this.ConvertirMathML=false;
	//
	// Variables per a un formulari modal
	//
	this.NomDivModal=MyCodiDivUnico.NouCodi("FORMMODAL");
	this.FuncioAcceptarModal="";	// Funció cridada si s'accepta formulari Modal
	this.CodiNomBotoAcceptar=117;	// "Acceptar"
	this.CodiNomBotoCancellar=118;	// "Cancel·lar"
	this.AmbBotoCancellacio=true;	// Indica si té o no possibilitat de ser cancel·lat
	this.Aqui=TheAqui;
	this.IdMissatgeError=MyCodiDivUnico.NouCodi("FORMERROR");
	//
	// Un formulari JSON només té sortida com a JSON
	//
	this.FormulariJSON=false;
	this.NomURL="";
	this.IndexFinestra=0;
	this.IndexZ=1;
	this.JSONEntreCorxets=false;
	this.CodiMesInfo=0;		// 0 --> Sense link +Info
	this.MargeEsquerra=10;		// Percentatge marge esquerra interior
}
Formulari.prototype = new Entrada();

Formulari.prototype.FormulariBuit = function() {
	if (this.Items.length==0) return(true);
	return(false);
}

Formulari.prototype.Reset = function() {
	this.Items=new Array();
}

/***********************************************************************************\
*
* Gestió dels formularis --> Formulari
*
************************************************************************************/

Formulari.prototype.OutputHTML = function(CadenaSubformularisGermans,Desplegable) {
	var Text="";
	if (this.Invisible==true) return("");
	if(this.TitolF!="") {
		if (CadenaSubformularisGermans==""||CadenaSubformularisGermans==undefined) {
			Text+='<div style="background-color:#627dd1; color:white;';
			if (Desplegable==true) {
				Text+='cursor:pointer; text-decoration: underline; padding:2px;"; onclick="ToggleDivDesplegable ('+"'"+ this.Id +"'"+')";';
				Text+=">";
				Text+="<small>"+this.TitolF+'<img src="collectiva2/logos/obridor.png" width="13" height="14"></img></small></div>';
				Text+='<table id="' + this.Id + '"';	
				Text+=' style="display:none;">';
				if(this.CodiMesInfo!=0) Text+=this.GenerarMesInfo();
			}
			else {
				Text+='">';
				Text+="<small><small>"+this.TitolF+"</small></small></div>";
				if(this.CodiMesInfo!=0) Text+=this.GenerarMesInfo();
				Text+='<table id="' + this.Id + '">';	
			}
		}	
		else {
			Text+='<div style="background-color:#627dd1; color:white; cursor: pointer; text-decoration: underline;"';
			Text+=' onclick="ObreAquestDivItancaElsAltres('+"'"+ this.Id +"','"+ CadenaSubformularisGermans +"');"+'"';
			Text+=">";
			Text+="<small><small>"+this.TitolF+'&nbsp;<img src="collectiva2/logos/obridor.png" width="13" height="14"></img></small></small></div><br/>';
			if(this.CodiMesInfo!=0) Text+=this.GenerarMesInfo();
			Text+='<table id="' + this.Id+'"'+' style="display:none;" >';
		}
		Text+="<tr><td WIDTH="+this.MargeEsquerra+"%></td><td WIDTH="+(100-this.MargeEsquerra)+"%>";
	}
	else {
		if(this.CodiMesInfo!=0) Text+=this.GenerarMesInfo();
		Text+='<table><tr><td>';
	}
	var NovaCadenaSubformularisGermans=this.GenerarCadenaSubformularisGermans();
	for (var i=0;i<this.Items.length;i++) {
		if (this.Items[i]) {
			// Si és un subformulari li passem els seus germans
			if (this.Items[i].Items) Text+="<br />"+this.Items[i].OutputHTML(NovaCadenaSubformularisGermans,false);
			else Text+=this.Items[i].OutputHTML();
		}
	}
	Text+="</td></tr></table>";
	Text+=this.GenerarEspaiMissatgeError();
	//if (this.AfegirSaltLinia==true) Text+="<br />";
	return(Text);
}

Formulari.prototype.GenerarMesInfo = function() {
	var Text='<div style="float:right;">';
	Text+=GenerarLinkMesInfo(this.CodiMesInfo);
	Text+="</div>";
	return(Text);
}

Formulari.prototype.Insertar = function(CadenaSubformularisGermans,Desplegable) {
	var Text="";
	Text='<div style="background-color:'+this.ColorFons+';';
	if (this.Amplada>0) Text+=' width='+this.Amplada+";";
	if (this.Altura>0) Text+=' height='+this.Altura+";";
	Text+='">';
	Text+=this.OutputHTML("",Desplegable);
	Text+="</div>";
	return(Text);
}

Formulari.prototype.GenerarCadenaSubformularisGermans = function() {
	var Text="";
	var Continue=0;
	for (var i=0;i<this.Items.length;i++) {
		if (this.Items[i]) {
			if (this.Items[i].Items) {
				if (Continue==1) Text+=",";
				Continue=1;
				Text+=this.Items[i].Id;
			}
		}
	}
	return(Text);
}

function ObreAquestDivItancaElsAltres(DivObrir,CadenaDivsTancar) {
	var Div=document.getElementById(DivObrir);
	if (Div) Div.style.display=(Div.style.display=='none')? "block": "none";
	var MyCutter=new Cutter(CadenaDivsTancar,",");
	while (!MyCutter.Final) {
		var DivTancar=MyCutter.Tallar();
		if (DivTancar!=DivObrir) {
			Div=document.getElementById(DivTancar);
			if (Div) Div.style.display="none";
		 }
	}
}

function GenerarDivDesplegable(TextTitol,TextContingut) {
	//
	// Un primer span del títol
	//
	var Id=MyCodiDivUnico.NouCodi("DIVDESPL");
	var Text='<span style="cursor: pointer; color: blue; text-decoration: underline;"';
	Text+=' onclick="ToggleDivDesplegable ('+"'"+ Id +"'"+');">'+"&nbsp;"+TextTitol+"&nbsp;&#8711;"+"</span>";
	// 
	// I després una table que apareix i desapareix
	//
	Text+='<table id="' + Id + '" style=" display: none;">';	
	Text+="<tr><td WIDTH=30></td><td>";
	Text+=TextContingut+"</td></tr></table>";
	return (Text);
}

function ToggleDivDesplegable (sDivId) {
	// Obridor-Tancador de menús
	var oDiv=document.getElementById(sDivId);
	oDiv.style.display=(oDiv.style.display=='none')? "block": "none";
}

Formulari.prototype.Descarregar = function() {
	if (this.Invisible==true) return(true);
	// 
	// Intenta descarregar tot el formulari des de la pantalla a les variables Valor
	// Retorna true si ha pogut o false si s'ha trobat amb algun error
	//
	if (this.Invisible==true) return(true);
	this.ResetMissatgeError();
	if (this.Validar()==false) return (false);
	for (var i=0;i<this.Items.length;i++) {
		if (this.Items[i]) {
			this.Items[i].Descarregar();
		}
	}
	return(true);
}

Formulari.prototype.Validar = function() {
	// 
	// Comprova que totes les entrades són acceptables 
	// Retorna true si totes són acceptables o false si alguna no ho és
	// Encara que aparegui alguna entrada innacceptable, les valida totes
 	// per a que apareguin tots els missatges d'error i no només el primer.
	//
	if (this.Invisible==true) return(true);
	var TotBe=true;
	for (var i=0;i<this.Items.length;i++) {
		if (this.Items[i]) {
			this.Items[i].ResetMissatgeError();
			if (this.Items[i].Validar()==false) TotBe=false;
		}
	}
	return(TotBe);
}

Formulari.prototype.MirarSiContingutModificat = function() {
	// Retorna true si l'usuari ha modificat algun valor del formulari
	for (var i=0;i<this.Items.length;i++) {
		if (this.Items[i]) {
			if (this.Items[i].MirarSiContingutModificat()) return(true);
		}
	}
	return(false);
}

Formulari.prototype.MirarSiTeSortidesURLObligatories = function() {
	// Retorna true si el formulari té sortides URL obligatories
	for (var i=0;i<this.Items.length;i++) {
		if (this.Items[i]) {
			if (this.Items[i].MirarSiTeSortidesURLObligatories()) return(true);
		}
	}
	return(false);
}

Formulari.prototype.Configurar = function(TheIndexZ) {
	this.IndexZ=TheIndexZ;
	this.ExecutarModal();
}

Formulari.prototype.ExecutarModal = function() {
	if (this.FormulariBuit())  {
		MissatgeModalText("Res a configurar");
		return;
	}
	var DivModal=document.getElementById(this.NomDivModal);
	DivModal.style.visibility="visible";
	var PosX=0;
	var PoxY=0;
	var Text=this.OutputHTML();
	Text+=this.GenerarHTMLBotoneraModal();
	DivModal.innerHTML=Text;

	var Amplada=this.Amplada;
	var Altura=this.Altura;

	if (Amplada==0) Amplada=document.body.clientWidth/2;
	if (Altura==0) Altura=document.body.clientHeight/2;

	PosX=(document.body.clientWidth-Amplada)/2;
	PosY=(document.body.clientHeight-Altura)/2+(document.documentElement.scrollTop+document.body.scrollTop);


	DivModal.style.top = PosY + 'px';
	DivModal.style.left = PosX + 'px';
	DivModal.style.zIndex=this.IndexZ+1;

	DivModal.style.width = Amplada + 'px';
	//DivModal.style.height = Altura + 'px';
	if (this.IndexZ==1) {
		var DivVel=document.getElementById("Vel_translucid");
		DivVel.style.visibility="visible";
	}
	if (this.ConvertirMathML==true) convert();
	
}

Formulari.prototype.GenerarHTMLBotoneraModal = function() {
	var Text="";
	if (this.FuncioAcceptarModal!="") {
		var Funcio=this.Aqui+"AceptarFormulariModal()";
		Text+=GenerarBoto(Traduir(this.CodiNomBotoAcceptar),Funcio);
	}
	if (this.AmbBotoCancellacio==true) {
		if (Text!="") Text+="&nbsp;&nbsp;";
		var Funcio=this.Aqui+"CancellarFormulariModal()";
		Text+=GenerarBoto(Traduir(this.CodiNomBotoCancellar),Funcio);
	}
	return (Text);
}

Formulari.prototype.AceptarFormulariModal = function() {
	if (!this.Descarregar()) return;	
	eval(this.FuncioAcceptarModal);
}

Formulari.prototype.CancellarFormulariModal = function() {
	this.EliminarFormulariModal();
}

Formulari.prototype.EliminarFormulariModal = function() {
	if (this.IndexZ==1) {
		var DivVel=document.getElementById("Vel_translucid");
		DivVel.style.visibility="hidden";
	}
	var DivModal = document.getElementById(this.NomDivModal);
	//
	// Buidem el contingut per a que no peti el convert() del MathML
	//
	DivModal.innerHTML="";	
	DivModal.style.visibility="hidden";	
}

Formulari.prototype.GenerarDivModal = function() {
	var Text='<div id="'+ this.NomDivModal + '" class="formularimodal"></div>';	
	return(Text);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Formulari --> Input/Output per URL
*
************************************************************************************/

Formulari.prototype.OutputURL = function(NomesModificat) {
	var Text="";
	if (this.SortidaURLObligatori!=true) {
		if (this.Invisible==true) return("");
		if (NomesModificat==true && this.MirarSiContingutModificat()==false && this.MirarSiTeSortidesURLObligatories()==false) return("");
	}
	if (this.FormulariJSON==true) {
		Text=this.OutputJSON(NomesModificat);
		Text=this.NomURL+"="+encodeURIComponent(Text);
	}
	else {
		for (var i=0;i<this.Items.length;i++) {
			if (this.Items[i]) {
				var TextItem=this.Items[i].OutputURL(NomesModificat);
				if (TextItem!="") {
					if (Text!="") Text+="&";
					Text+=TextItem;
				}
			}
		}
	}
	return(Text);
}

/***********************************************************************************\
*
* Gestió dels formularis --> Formulari --> Input/Output per JSON
*
************************************************************************************/

Formulari.prototype.OutputJSON = function(NomesModificat) {
	if (this.Invisible==true) return("");
	if (NomesModificat==true && this.MirarSiContingutModificat()==false) return("{}");
	var TokenEntrada="{";
	var TokenSortida="}";
	if (this.JSONEntreCorxets==true) {
		TokenEntrada="[";
		TokenSortida="]";
	}
	var Text=TokenEntrada;
	var ElementInicial=true;
	for (var i=0;i<this.Items.length;i++) {
		if (this.Items[i]) {
			//
			// Una estructura JSON s'ha de carregar tota
			//
			var TextItem=this.Items[i].OutputJSON(false);
			if (TextItem!="") {
				if (ElementInicial!=true) Text+=",";
				ElementInicial=false;
				Text+=TextItem;
			}
		}
	}
	Text+=TokenSortida;
	if (this.NomJSON!="") Text=this.NomJSON+":"+Text;
	return(Text);
}

Formulari.prototype.InputObjecteJSON = function(ObjecteJSON) {
	//
	// Rutina reescrivible
	//
}

/***********************************************************************************\
*
* Gestió dels formularis --> Formulari --> Gestió dels missatges d'error
*
************************************************************************************/

Formulari.prototype.GenerarEspaiMissatgeError = function() {
	var Text="";
	Text+='<span id="'+this.IdMissatgeError+'"></span>';
	return(Text);
}

Formulari.prototype.ResetMissatgeError = function() {
	// Esborra l'espai del missatge d'error per si abans va aparèixer algun
	var Id=document.getElementById(this.IdMissatgeError);
	if (Id) Id.innerHTML="";
}

Formulari.prototype.GenerarMissatgeError = function(CodiError) {
	var Id=document.getElementById(this.IdMissatgeError);
	var Text='<span style="color:red">&nbsp;<small><b>'+Traduir(CodiError)+'</b></small></span>';
	Id.innerHTML=Text;
}

Formulari.prototype.GenerarMissatgeInfo = function(Codi) {
	var Id=document.getElementById(this.IdMissatgeError);
	var Text='<span style="color:green">&nbsp;<small><b>'+Traduir(Codi)+'</b></small></span>';
	Id.innerHTML=Text;
}

/***********************************************************************************\
*
* Formulari --> FormulariExtern
*
************************************************************************************/

function FormulariExtern(TheAqui,TheObjecteConfigurador) {
	Formulari.call(this,TheAqui,0);
	this.ObjecteConfigurador=TheObjecteConfigurador
}
FormulariExtern.prototype = new Formulari();

FormulariExtern.prototype.OutputHTML = function() {
	var Text="";
	var NouIndexZ=this.IndexZ+1;
	var Funcio=this.ObjecteConfigurador+"Configurar("+NouIndexZ+");"
	Text=GenerarSelector(Traduir(134),Funcio);
	return(Text);
}

FormulariExtern.prototype.MirarSiContingutModificat = function() {
	var Text=this.ObjecteConfigurador+"MirarSiContingutModificat()";
	var Resultat=eval(Text);
	return(Resultat);
}

FormulariExtern.prototype.MirarSiTeSortidesURLObligatories = function() {
	var Text=this.ObjecteConfigurador+"MirarSiTeSortidesURLObligatories()";
	var Resultat=eval(Text);
	return(Resultat);
}

FormulariExtern.prototype.OutputJSON = function(NomesModificat) {
	var Funcio=this.ObjecteConfigurador+"OutputJSON()";
	var Resultat=eval(Funcio);
	return(Resultat);
}

/***********************************************************************************\
*
* FormulariMissatge
*
************************************************************************************/

function FormulariMissatge(TheAqui) {
	Formulari.call(this,TheAqui,0);
	this.ColorFons="#c1ffb6";
	this.CodiNomBotoAcceptar=117;	// "Acceptar"
	this.AmbBotoCancellacio=false;
	this.FuncioAcceptarModal="EliminarMissatgeModal()";
	this.Items[1]=new Seguidor(TheAqui+"Items[1].",0);
	this.NomDivModal="FORMULARIMISSATGE";
	this.FormulariObert=false;
}
FormulariMissatge.prototype = new Formulari();

MyFormulariMissatge=new FormulariMissatge("MyFormulariMissatge.");

function MissatgeModalText(TextContingut) {
	if (MyFormulariMissatge.FormulariObert==false) {
		MyFormulariMissatge.ExecutarModal();
		MyFormulariMissatge.FormulariObert=true;
	}
	MyFormulariMissatge.Items[1].AfegirMissatge(TextContingut);
}

function MissatgeModal(CodiContingut) {
	var Text=Traduir(CodiContingut);
	MissatgeModalText(Text);
}

function EliminarMissatgeModal() {
	MyFormulariMissatge.Items[1].Reset();
	MyFormulariMissatge.EliminarFormulariModal();
	MyFormulariMissatge.FormulariObert=false;
}

function AfegirMissatgeModalCarregant() {
	MyFormulariMissatge.Items[1].AfegirMissatgeCarregant();
}

/***********************************************************************************\
*
* Menú contextual
*
************************************************************************************/

	//  Menú contextual con botón derecho by Mauricio Alejandro  
	//  Actualizado por El Codigo para soporte multinavegador (01/11/2005)  
	//  
	//  Este script y otros muchos pueden  
	//  descarse on-line de forma gratuita  
	//  en El Código: www.elcodigo.com  
   
	//  pocicion absoluta del menu=0, menu con el boton derecho=1  
  
	//  muestra el menu  

function sombra(e,ContingutHTML) {  
   
	if (document.getElementById) {  
		mimenu = document.getElementById("cepilomenu")  
	}
	else if (document.all) {  
      		mimenu = document.all.cepilomenu  
   	}  
	mimenu.innerHTML=ContingutHTML;
     
   	/*La gestion de eventos con IE4 e IE5 utiliza el objeto window.event, que no forma 
   	parte de DOM2. IE5 soporta getElementById, pero sigue usando este objeto para la 
   	gestion de eventos, por lo que hay que tratarle de forma exclusiva */  
  
	if (!e) var e = window.event  
     
   	//distancia a bordes  
    	var borde_derecho = document.body.clientWidth - e.clientX  
    	var borde_inferior = document.body.clientHeight - e.clientY  
   
    	//distancia del menu al puntero  
    	if (borde_derecho < mimenu.offsetWidth)  
		mimenu.style.left = document.body.scrollLeft + e.clientX - cepilomenu.offsetWidth + 'px'  
    	else  
       		mimenu.style.left = document.body.scrollLeft + e.clientX + 'px'  
    
     	//posicion vertical  
     	if (borde_inferior < mimenu.offsetHeight)  
       		mimenu.style.top = document.body.scrollTop + e.clientY - cepilomenu.offsetHeight  
    	else  
       		mimenu.style.top = document.body.scrollTop + e.clientY  
  
   	mimenu.style.visibility = "visible"  
     
   	return (false);
}    
  
function ItemMenuContextual(NomItem,FuncioItem,ItemActiu) {
	this.Nom=NomItem;
	this.Funcio=FuncioItem;
	this.Actiu=ItemActiu;
}

ItemMenuContextual.prototype.GenerarHTML = function() {
	var Text="";
	var IdItem=MyCodiDivUnico.NouCodi("ITEMMENU");
	var IluminarItem="IluminarItem('"+IdItem+"');";
	var DesiluminarItem="DesiluminarItem('"+IdItem+"');";
	if (this.Actiu==true) {
		Text="<div id='"+IdItem+"' class='menuitem_obert'";
		Text+= " onclick='ExecutarItem("+'"'+this.Funcio+'"' + ");' ";
		Text+= ' onmouseover ="'+IluminarItem+'" ';
		Text+= ' onmouseout ="'+DesiluminarItem+'" ';
		Text+=">";

	}
	else {
		Text="<div id='"+IdItem+"' class='menuitem_tancat'>";
	}
	Text+=this.Nom;
	Text+="</div>";
	return(Text);
}

function IluminarItem(IdDiv) {
	ColorFons="#ffebd2";
	var IdDiv=document.getElementById(IdDiv);
	IdDiv.style.backgroundColor=ColorFons;
}

function DesiluminarItem(IdDiv) {
	ColorFons="#FF9";
	var IdDiv=document.getElementById(IdDiv);
	IdDiv.style.backgroundColor=ColorFons;
}

ExecutarItem = function(NomItem) {
	visibilidad();
	eval(NomItem);
}

function MenuContextual() {
	this.Items=new Array(); // Array de ItemMenuContextual
}

MenuContextual.prototype.Reset = function() {
	this.Items=new Array();
}

MenuContextual.prototype.AfegirItem = function(NomItem,FuncioItem,ItemValid) {
	this.Items[this.Items.length]=new ItemMenuContextual(NomItem,FuncioItem,ItemValid);
}

MenuContextual.prototype.GenerarHTML = function() {
	var Text="<div>";
	for (var i=0;i<this.Items.length;i++) {
		Text+=this.Items[i].GenerarHTML();
	}
	Text+='<div style="float:right;">';
	Text+=GenerarLinkMesInfo(5);
	Text+="</div>";
	Text+="</div>";
	return(Text);
}

MenuContextual.prototype.Executar = function(event) {
	var Text=this.GenerarHTML();
	sombra(event,Text);
}

MyMenuContextual=new MenuContextual();


/***********************************************************************************\
*
* Finestra
*
************************************************************************************/

function Finestra(TheIndexFinestra,TheIndexFinestraMare,TheNomPestanya) {
	if (TheIndexFinestra==undefined) return;
	// Hi ha quatre div del Dom associats a una finestra:
	//	boto_IndexFinestra		(pestanya)
	//	menu_IndexFinestra		(Menu)
	//	Espai_Treball_IndexFinestra	(Espai de treball)
	// 	finestra_IndexFinestra		(Menu+Espai de Treball)
	this.IndexFinestra=TheIndexFinestra;
	this.IndexFinestraMare=TheIndexFinestraMare; // si =0 no té mare.
	this.Color="#ffcc89";
	this.ColorClar="#ffebd2";
	this.ColorTancat="#bfbfbf";
	this.NomPestanya=TheNomPestanya;
	
	this.Autodestruible=false; 	// Una finestra per defecte no es pot tancar.
	this.BotoActualitzar=true; 	// Una finestra per defecte té botó "actualitzar"
	this.ModeEdicio=0;		// Inicialment és Actualitzant
	this.ModeEdicioUsuari=1;	// El ModeEdicio de l'usuari
	this.KiwisCensurat=false;
	this.TipusFinestra="finestra";
	this.ActualitzarEnCascada=false;
}

Finestra.prototype.CarregarLexic = function () {
	// Aquesta rutina serà reescrita per cada activitat en particular
}

Finestra.prototype.Obrir = function() {
	// Passa la finestra a visible per a l'usuari
	var AutoomatesEspai_X=document.getElementById('AUTOOMATES_ESPAI_'+this.IndexFinestra);
	AutoomatesEspai_X.style.cssText = 'display:inline';
	var Vinyeta=document.getElementById('AUTOOMATES_VINYETADOBLE_'+this.IndexFinestra);
	Vinyeta.style.backgroundColor=this.Color;
	var Vinyeta=document.getElementById('AUTOOMATES_VINYETA_'+this.IndexFinestra);
	Vinyeta.style.backgroundColor=this.Color;

}

var PrimerCanvi=0;

Finestra.prototype.Tancar = function() {
	// Fa que la finestra sigui invisible a l'usuari
	var AutoomatesEspai_X=document.getElementById('AUTOOMATES_ESPAI_'+this.IndexFinestra);
	AutoomatesEspai_X.style.cssText = 'display:none';
	var Vinyeta=document.getElementById('AUTOOMATES_VINYETADOBLE_'+this.IndexFinestra);
	Vinyeta.style.backgroundColor=this.ColorTancat;
	var Vinyeta=document.getElementById('AUTOOMATES_VINYETA_'+this.IndexFinestra);
	Vinyeta.style.backgroundColor=this.ColorTancat;
	// Al primer canvi de finestra diem adeu a la capçalera
	if (PrimerCanvi!=31415) MinimitzarCap();
	PrimerCanvi=31415;
	return(true);
}

/***********************************************************************************\
*
* Finestra --> Gestió del ModeEdicio
*
************************************************************************************/

Finestra.prototype.GenerarBotoAccioInterna = function(CodiText,NomFuncio) {
	var Funcio2="";
	if (NomFuncio!="") Funcio2="Finestral["+this.IndexFinestra+"]."+NomFuncio;
	var TextBoto=Traduir(CodiText);
	var Text=GenerarBoto(TextBoto,Funcio2);
	return (Text);
}

Finestra.prototype.GenerarSelectorAccioInterna = function(TextSelector,NomFuncio) {
	var Funcio2="";
	if (NomFuncio!="") Funcio2="Finestral["+this.IndexFinestra+"]."+NomFuncio;
	var Text=GenerarSelector(TextSelector,Funcio2);
	return (Text);
}

Finestra.prototype.PassarAMode = function(Mode) {
	this.ModeEdicio=Mode;
	this.Refrescar();
}

/***********************************************************************************\
*
* Finestra --> Refrescar
*
************************************************************************************/

Finestra.prototype.Refrescar = function() {
	// Passa el contingut de les variables HTMLxxx als div's
	this.RefrescarEspaiVinyeta();
	this.RefrescarEspaiTreball();	
}

Finestra.prototype.RefrescarEspaiTreball = function() {
	var Text='';
	Text+='<div id="MARGE_DRET_TOTAL'+this.IndexFinestra+'" style="width: 5%; float:left;"></div>';
	Text+='<div id="ESPAI_ESQUERRA_TOTAL'+this.IndexFinestra+'" style="width: 95%; float:right; font-size:'+AlturaLletres+'px;">';
	Text+=this.GenerarHTMLEspaiTreball();
	Text+="</div>";
	var Treball=document.getElementById('AUTOOMATES_TREBALL_'+this.IndexFinestra);
	Treball.innerHTML=Text;
	// hem d'afegir la possible versió per a imprimir
	// abans de fer el convert() per a que es visualitzin els
	// elements MathML correctament i després ocultar-la
	var finestra=document.getElementById("Versio_Imprimir");
	finestra.innerHTML=this.GenerarHTMLVersioImpressora();	
	if (this.IndexFinestra==FinestraActual) {
		if (this.IndexFinestra!=5) {
			convert(); 	// Activem els elements MathML
		}
	}
	var finestra=document.getElementById("Versio_Imprimir");
	finestra.style.cssText = 'display:none';
}

Finestra.prototype.RefrescarEspaiVinyeta = function() {
	var Vinyeta=document.getElementById('AUTOOMATES_VINYETA_'+this.IndexFinestra);
	Vinyeta.innerHTML="&nbsp;"+this.GenerarHTMLPestanya()+"&nbsp;";
}

Finestra.prototype.GenerarHTMLPestanya = function() {
	return (this.NomPestanya);
}

/***********************************************************************************\
*
* Finestra --> GenerarHTML
*
************************************************************************************/

Finestra.prototype.GenerarHTMLEspaiTreball = function() {
	var Funcio="this.GenerarHTMLEspaiTreballMode"+this.ModeEdicio+"()";
	var Text=eval(Funcio);
	Text="<br />"+Text;
	return (Text);
}

Finestra.prototype.GenerarHTMLEspaiTreballMode0 = function() {
	var Text="<br /><br /><span style='color: green;'>"+Traduir(26)+"</span>&nbsp;&nbsp;";
	Text+='<img src="collectiva2/logos/rodoneta_carregant.gif" alt="carregant" width="16" height="16">';
	return(Text);
}

Finestra.prototype.GenerarHTMLMenuMode0 = function() {
	return("");
}

Finestra.prototype.GenerarHTMLVersioImpressora = function() {
	if (this.ModeEdicio==0) return("");
	return ("");
}

Finestra.prototype.GenerarNomVinyeta = function(Text) {
	this.NomPestanya=Text;
	this.RefrescarEspaiVinyeta();
}

/***********************************************************************************\
*
* Finestra --> Actualitzar
*
************************************************************************************/

var IdActivitatModificada=-1;

function ActualitzarFinestral(TheIdActivitatModificada) {
	IdActivitatModificada=TheIdActivitatModificada;
	Finestral[1].ActualitzarIContinuarActualitzant();
}

Finestra.prototype.Actualitzar = function() {
	// Aquesta rutina és reescrita per cada activitat en particular.
	// s'han d'actualitzar les variables this.HTMLxxxx
	// i al final s'ha de cridar a this.FinalActualitzar() i this.Refrescar() per a que aparegui
	// la informació a la pantalla
	this.FinalActualitzar();
	this.Refrescar();
}

Finestra.prototype.ActualitzarIContinuarActualitzant = function() {
	this.ActualitzarEnCascada=true;
	if (IdActivitatModificada!=undefined) {
		if (this.FinestraAmbActivitatAfectada()==true) {
			this.Actualitzar();
		}
		else this.FinalActualitzar();
	}
	else {
		this.Actualitzar();
	}
}

Finestra.prototype.FinestraAmbActivitatAfectada = function() {
	// Rutina reescrivible
	return(false);
}

Finestra.prototype.FinalActualitzar = function() {
	if (this.ActualitzarEnCascada==true) {	
		this.ActualitzarEnCascada=false;
		for (var i=this.IndexFinestra+1;i<=Finestral.length;i++) {
			if (Finestral[i]) {
				Finestral[i].ActualitzarIContinuarActualitzant();
				return;
			}
		}
	}
}

Finestra.prototype.Imprimir = function() {
	// Visualitza una finestra especial de la pantalla sense cap logo
	// i amb una versió del text específica per a treballar amb paper
	// aquesta rutina normalment es cridada per l'usuari
	// amb la rutina Quetxup.GenerarMissatgeVisualitzacioImprimir()
	//
	EntrarEnVersioImprimir();
}

/************************************************************************************
*
* Finestra --> Inteface amb el Portadocuments
*
************************************************************************************/

Finestra.prototype.EnganxarCopiaDesDePortadocuments = function(IdActivitat) {
	MyPortadocuments.DesactivarAccio();
	MissatgeModal(121); // No es pot fer aquí
}

Finestra.prototype.EnganxarActivitatMogudaDesDePortadocuments = function(IdActivitat) {
	MyPortadocuments.DesactivarAccio();
	MissatgeModal(121); // No es pot fer aquí
}

Finestra.prototype.EnganxarReferencia = function(IdActivitat) {
	MyPortadocuments.DesactivarAccio();
	MissatgeModal(121); // No es pot fer aquí
}

/************************************************************************************
*
* Finestra --> Reset
*
************************************************************************************/

Finestra.prototype.Reset=function (){
	this.GestionarVinyetaiEspaiFinestra(this.IndexFinestra,this.Color);
	//this.Actualitzar();
}	

Finestra.prototype.GestionarVinyetaiEspaiFinestra =function(TheIndexFinestra,TheColor) {
	// Dintre del div 'TOOMATES_CINTA' ha d'haver el span 'AUTOOMATES_VINYETA_X'
	// Si no està el fem de nou.
	var AutoomatesCinta=document.getElementById('AUTOOMATES_CINTA');
	// Afegim (si no existeix) una vinyeta nova amb el nom
	var AutoomatesVinyeta_X=document.getElementById('AUTOOMATES_VINYETA_'+TheIndexFinestra);
	if (!AutoomatesVinyeta_X) {
		AutoomatesVinyeta_X=document.createElement('span');
		AutoomatesVinyeta_X.id='AUTOOMATES_VINYETADOBLE_'+TheIndexFinestra;
		var AutoomatesEspaiVinyeta_X=document.createElement('span');
		AutoomatesEspaiVinyeta_X.id='AUTOOMATES_ESPAI_VINYETA_'+TheIndexFinestra;
		AutoomatesEspaiVinyeta_X.innerHTML="&nbsp;";
		
		if (AutoomatesCinta.hasChildNodes()) {
			// Les finestres es van afegint cap a l'esquerra de l'anterior
			var VinyetaInicial=AutoomatesCinta.firstChild;
			AutoomatesCinta.insertBefore(AutoomatesEspaiVinyeta_X,VinyetaInicial);
			AutoomatesCinta.insertBefore(AutoomatesVinyeta_X,AutoomatesEspaiVinyeta_X);
		}
		else {
			// Afegim la primera finestra
			AutoomatesCinta.appendChild(AutoomatesVinyeta_X);
		}

		// Dintre de la Vinyeta hi ha l'espai del nom a l'esquerra i la creu per a
		// Tancar-la a la dreta.
		
		AutoomatesVinyeta2_X=document.createElement('span');
		AutoomatesVinyeta2_X.id='AUTOOMATES_VINYETA_'+TheIndexFinestra;
		document.getElementById('AUTOOMATES_VINYETADOBLE_'+TheIndexFinestra).appendChild(AutoomatesVinyeta2_X);

		if (Finestral[TheIndexFinestra].Autodestruible==true) {
			AutoomatesVinyeta_Creu=document.createElement('span');
			AutoomatesVinyeta_Creu.id='AUTOOMATES_VINYETA_CREU_'+TheIndexFinestra;
			var Text='<span style="cursor: pointer; color: blue;';
			//Text+='text-decoration: underline;';
			Text+='"';
			var Funcio="Finestral["+TheIndexFinestra+"].AutodestruccioPerBoto();";
			Text+=' onclick="'+Funcio+'">';
			Text+="&nbsp;<small>X&nbsp;</small>";
			Text+='</span>';
			AutoomatesVinyeta_Creu.innerHTML=Text;
			document.getElementById('AUTOOMATES_VINYETADOBLE_'+TheIndexFinestra).appendChild(AutoomatesVinyeta_Creu);
		}

	}

	// Dintre del div 'TOOMATES_ESPAI' ha d'haver el div 'AUTOOMATES_ESPAI_X'
	// Si no està el fem de nou.
	var AutoomatesEspai=document.getElementById('AUTOOMATES_ESPAI');
	var AutoomatesEspai_X=document.getElementById('AUTOOMATES_ESPAI_'+TheIndexFinestra);
	if (!AutoomatesEspai_X) {
		AutoomatesEspai_X=document.createElement('div');
		AutoomatesEspai_X.id='AUTOOMATES_ESPAI_'+TheIndexFinestra;
		AutoomatesEspai.appendChild(AutoomatesEspai_X);
	}
	// Dintre del div 'TOOMATES_ESPAI_X' ha d'haver el div 'AUTOOMATES_CAP_X'
	// Si no està el fem de nou.
	var AutoomatesCap_X=document.getElementById('AUTOOMATES_CAP_'+TheIndexFinestra);
	if (!AutoomatesCap_X) {
		AutoomatesCap_X=document.createElement('div');
		AutoomatesCap_X.id='AUTOOMATES_CAP_'+TheIndexFinestra;
		AutoomatesEspai_X.appendChild(AutoomatesCap_X);
	}

	// Dintre del div 'TOOMATES_ESPAI_X' ha d'haver el div 'AUTOOMATES_TREBALL_X'
	// Si no està el fem de nou.
	var AutoomatesTreball_X=document.getElementById('AUTOOMATES_TREBALL_'+TheIndexFinestra);
	if (!AutoomatesTreball_X) {
		AutoomatesTreball_X=document.createElement('div');
		AutoomatesTreball_X.id='AUTOOMATES_TREBALL_'+TheIndexFinestra;
		AutoomatesEspai_X.appendChild(AutoomatesTreball_X);
	}
	
	// Li posem color i propietats a la vinyeta i al cap
	AutoomatesVinyeta_X.style.backgroundColor=this.ColorTancat;
	AutoomatesVinyeta_X.style.cursor="pointer";

	AutoomatesCap_X.style.backgroundColor=this.Color;
	//AutoomatesCap_X.style.height="30px";
	AutoomatesCap_X.className='estil_cap';
	AutoomatesVinyeta_X.onclick=function () {
		PassarAFinestra(TheIndexFinestra);
	};
	AutoomatesEspai_X.style.display="none";
}

/************************************************************************************
*
* Finestra --> Gestió de les dades estadístiques d'ús
*
************************************************************************************/

Finestra.prototype.ActualitzarVisitaFinestra =function(CodiAccio) {
	GenerarRegistreEstadistic(CodiAccio,0);
}

/************************************************************************************
*
* Finestra --> Eliminació de la finestra
*
************************************************************************************/

Finestra.prototype.Autodestruccio=function (){
	// La pròpia finestra s'autoelimina, visualitzant la finestra mare.
	// Si no té mare no es pot autodestruir

	if (this.IndexFinestraMare==0) return;
	
	// Eliminem la vinyeta
	var AutoomatesCinta=document.getElementById('AUTOOMATES_CINTA');
	var AutoomatesVinyeta_X=document.getElementById('AUTOOMATES_VINYETADOBLE_'+this.IndexFinestra);
	if (AutoomatesVinyeta_X) AutoomatesCinta.removeChild(AutoomatesVinyeta_X);
	var AutoomatesEspaiVinyeta_X=document.getElementById('AUTOOMATES_ESPAI_VINYETA_'+this.IndexFinestra);
	if (AutoomatesEspaiVinyeta_X) AutoomatesCinta.removeChild(AutoomatesEspaiVinyeta_X);

	// Eliminem l'espai de la finestra
	var AutoomatesEspai=document.getElementById('AUTOOMATES_ESPAI');
	var AutoomatesEspai_X=document.getElementById('AUTOOMATES_ESPAI_'+this.IndexFinestra);
	if (AutoomatesEspai_X) AutoomatesEspai.removeChild(AutoomatesEspai_X);

	// El programa principal eliminarà aquest objecte finestra i activarà la finestra mare
	EliminarICanviDeFinestra(this.IndexFinestra,this.IndexFinestraMare);
}

Finestra.prototype.AutodestruccioPerBoto=function (){
	if (this.IndexFinestra==FinestraActual) this.Autodestruccio();
	else {
		PassarAFinestra[this.IndexFinestra];
	}
}


/************************************************************************************
*
* Finestra --> Rutines vàries
*
************************************************************************************/

Finestra.prototype.ActualitzarFinestraMare =function(NovaPuntuacio) {
	// Actualitza la finestra Mare.
	if (this.IndexFinestraMare>0) {
 		Finestral[this.IndexFinestraMare].Actualitzar(NovaPuntuacio);
	}
}

Finestra.prototype.PassarAFinestraMare =function() {
	// Activa la finestra mare (però no elimina aquesta)
	if (this.IndexFinestraMare>0) {
 		PassarAFinestra(this.IndexFinestraMare);
	}
}

Finestra.prototype.ActualitzarFinestraMareIAutodestruccio =function() {
	// Actualitza la finestra Mare i després s'autodestrueix
	this.ActualitzarFinestraMare();
	this.Autodestruccio();
}

/************************************************************************************
*
* Finestra --> Gestionar estadístiques de Visites
*
************************************************************************************/

function GenerarCookieSessio() {
	// Identifica la sessió actual amb un codi de 5 lletres aleatòries
	// Aquesta web NO emmagatzema ni utilitza dades personals dels usuaris, i per 
	// tant NO fa servir la IP de l'usuari. 
	//
	CodiSessio=getCookie("AUTOOMATESSessio2");
	if (CodiSessio!=null) return;
	CodiSessio=GenerarCodiAlfanumeric();
	AfegirCookie("AUTOOMATESSessio2",CodiSessio);
}

function GenerarCodiAlfanumeric() {
	var Codi=""+GenerarLletraAleatoria();
	Codi+=GenerarLletraAleatoria();
	Codi+=GenerarLletraAleatoria();
	Codi+=GenerarLletraAleatoria();
	Codi+=GenerarLletraAleatoria();
	return(Codi);
}

function GenerarLletraAleatoria() {
	var Abecedari="ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789";
	var CodiLletra=GenerarEnterAleatoriAcotat(0,Abecedari.length-1);
	var Lletra=Abecedari.substr(CodiLletra,1);
	return(Lletra);
}

/************************************************************************************
*
* Finestra Modal
*
************************************************************************************/

function FinestraModal(TheIndexFinestra,TheIndexFinestraMare,CodiNom) {
	Finestra.call(this,TheIndexFinestra,TheIndexFinestraMare,Traduir(CodiNom));
	this.ContingutEspaiTreballHTML="";
	this.ContingutMenuHTML="";
	this.Autodestruible=true;
}
FinestraModal.prototype = new Finestra();

FinestraModal.prototype.Actualitzar = function() {
	this.PassarAMode(1);
	this.FinalActualitzar();
}

/************************************************************************************
*
* Finestra Modal --> Generar HTML
*
************************************************************************************/

FinestraModal.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text="<br /><br />";
	Text+=this.ContingutEspaiTreballHTML;
	return (Text);
}

FinestraModal.prototype.GenerarHTMLMenuMode1 = function() {
	var Text="";
	Text=this.ContingutMenuHTML;
	return(Text);
}

FinestraModal.prototype.Tancar = function() {
	var Text=Traduir(180)+"<br/><img src='collectiva2/logos/boto_tancar.jpg' alt='botó tancar' width='145' height='72'></img>";
	MissatgeModalText(Text);	// "Has de tancar abans aquesta vinyeta"
	return(false);
}

/***********************************************************************************\
*
* Finestral
*
************************************************************************************/

/***********************************************************************************\
*
* Variables generals
*
************************************************************************************/

	var Finestral=new Array();	// Array de finestres.

	var FinestraQuetxup=-1; // Només pot haver una vinyeta Quètxup oberta

	var FinestraEsquema=-1;


	var FinestraActual=0;
		// 0 --> Finestra Play
		// 1 --> Finestra Info


	var MatriuEsquemes=new Array();	// Serveix per al botó "anterior" dels esquemes.

	var MathMLDetectat=false;	// Indica si s'ha detectat automàticament el MathML
	var MissatgeBrowserDetectat="";	// El nom del browser que genera el detector de MathML
	var MathMLConfirmat=false;	// L'usuari ha confirmat que no s'ha detectat MathML

	MyPortadocuments=new Portadocuments();

	var IdiomaSeleccionat="CAT";	// Idioma per defecte


	var MyKiwis=null;		// Objecte Kiwis

	BewoomGeneradorCarregat=false;	// Indica que no s'ha carregat encara bewoomgen.js

	var objeto_json=false;
	var NAjaxCarregant=0; 		// Nombre de demandes AJAX carregant 
	var SequenciaAnimacioAjax=0;	// Posició de l'animació AJAX


	// Variables d'ocultació de capçalera
		var CapOcult=0;	// Per a la "versió per a imprimir"


	// Identificació de l'usuari

	var NomUsuari="";	// Si està buit no està identificat
	var LoginUsuari="";
	var PasswordUsuari="";

	// Objectes globals del mòdul Quètxup

	var NSteps=0; 			// Comptador de passos de la generació
	var GeneracioActiva=false;	// Indica que s'està generant una Llistat d'exercicis
	var FinestraGenesis=0;		// IndexFinestra en la es produeix la generació
	var FinestraCronometre=0;	// Per a gestionar el cronòmetre.

	var MyGenerador=null;		// Objecte Generador per a la generació dels exercicis

	var MyJoc=null;

	var ObjecteConfiguracioJSON=null;	// Gestiona la configuració per JSON

	var AlturaLletres=20;			// Altura inicial del text de treball


/************************************************************************************
*
* Finestral --> Reset 
*
************************************************************************************/

function AutoomatesReset() {
	GenerarCookieSessio();
	GenerarEspaiHTMLAutoomates();
	CarregarCookieIdentificacioUsuari();
	ChequearMathML();
	IniciarIdioma();
	// IniciarIdioma crida al final a IniciFinestres()
}

function IniciFinestres() {
	Finestral[1] = new FinestraInfo(1,0);
	Finestral[1].Reset();
	Finestral[2] = new VisorKiwis(2,0);
	Finestral[2].Reset();
	Finestral[3] = new FinestraUsuari(3,0);
	Finestral[3].Reset();
	var IdActivitat=ExtreureParametreURINavegador("a");
	var VisualitzarNovetats=true;
	if (IdActivitat>0) VisualitzarNovetats=false;
	GenerarRegistreEstadistic(5,IdActivitat);
	if(VersioInicial==1) {
		//
		// Versió inicial: Només hi ha un curs id = 1
		//
		Finestral[4] = new VisorNovetats(4,0,1);
		Finestral[4].Reset();
		if(IdActivitat=="") IdActivitat=1;
		Finestral[5] = new VisorActivitats(5,0,IdActivitat,"Toomates");
		Finestral[5].Reset();
		Finestral[6] = new VisorActivitats(6,0,0,"Curs");
		Finestral[6].Reset();
		FinestraEsquema=-1;
		ActualitzarFinestral();
		if (VisualitzarNovetats==true) PassarAFinestra(4);
		else PassarAFinestra(5);
	}
	else {
		//
		// Versió on-line www.toomates.net. El curs principal és #2005 i 
		// té les cocotrainer en #2961
		//
		if(IdActivitat=="") IdActivitat=2005;
		if (VersioPortable==0) { 
			Finestral[4] = new VisorNovetats(4,0,2005);
			Finestral[4].Reset();
			Finestral[5] = new VisorActivitats(5,0,IdActivitat,"Toomates");
			Finestral[5].Reset();
			Finestral[6] = new VisorActivitats(6,0,0,"Curs");
			Finestral[6].Reset();
			FinestraEsquema=7;
			Finestral[7] = new VisorEsquema(7,0,2961);
			Finestral[7].Reset()
			ActualitzarFinestral();
			if (VisualitzarNovetats==true) PassarAFinestra(4);
			else PassarAFinestra(5);
		}
		else {
			Finestral[4] = new VisorActivitats(4,0,IdActivitat,"Toomates");
			Finestral[4].Reset();
			Finestral[5] = new VisorActivitats(5,0,0,"Curs");
			Finestral[5].Reset();
			FinestraEsquema=6;
			Finestral[6] = new VisorEsquema(6,0,2961);
			Finestral[6].Reset();
			ActualitzarFinestral();
			PassarAFinestra(4);
		}
	}
}

function GenerarEspaiHTMLAutoomates() {
	// Si no existeix el <div> 'AUTOOMATES' al htm, l'afegeix al final
	var Autoomates=document.getElementById("AUTOOMATES");
	if (!Autoomates) {
		Autoomates=document.createElement('div');
		Autoomates.id='AUTOOMATES';
		document.body.appendChild(Autoomates);
	}
	if (VersioPortable==1) {
		var DivCap=document.getElementById('Cap');
		if (DivCap) {
			DivCap.innerHTML='<div id="FINESTRASEGUIMENT" style="width:40%; float:center;"></div><img src="collectiva2/logos/logo_toomates_basic_portable.jpg" alt="Toomates" width="332" height="82"><br />';
		}
	}
	// Dintre del div 'TOOMATES' ha d'haver el div 'AUTOOMATES_PRIMERA_LINIA'
	// si no està el fem de nou.

	var AutoomatesPrimeraLinia=document.getElementById('AUTOOMATES_PRIMERA_LINIA');
	if (!AutoomatesPrimeraLinia) {
		AutoomatesPrimeraLinia=document.createElement('div');
		AutoomatesPrimeraLinia.id='AUTOOMATES_PRIMERA_LINIA';
		AutoomatesPrimeraLinia.className="cinta";
		Autoomates.appendChild(AutoomatesPrimeraLinia);
	}

	// Dintre del div 'PRIMERA_LINIA' ha d'haver el div 'AUTOOMATES_CINTA'
	// A l'esquerra. Si no està el fem de nou.

	var AutoomatesCinta=document.getElementById('AUTOOMATES_CINTA');
	if (!AutoomatesCinta) {
		AutoomatesCinta=document.createElement('span');
		AutoomatesCinta.id='AUTOOMATES_CINTA';
		AutoomatesCinta.className="cinta";
		AutoomatesPrimeraLinia.appendChild(AutoomatesCinta);
	}

	// Dintre del div 'PRIMERA_LINIA' ha d'haver el div 'AUTOOMATES_IDIOMES'
	// A la dreta. Si no està el fem de nou.

	var AutoomatesIdiomes=document.getElementById('AUTOOMATES_IDIOMES');
	if (!AutoomatesIdiomes) {
		AutoomatesAJAX=document.createElement('span');
		AutoomatesAJAX.id='AUTOOMATES_VISOR_AJAX';
		AutoomatesAJAX.innerHTML="";
		AutoomatesAJAX.className="InfoAjax";
 		AutoomatesPrimeraLinia.appendChild(AutoomatesAJAX);
		AutoomatesIdiomes=document.createElement('span');
		var Text=GenerarHTMLSelectorIdiomes();
		Text+=GenerarHTMLSelectorAlturaLletres()
		Text+=GenerarHTMLReferenciaCollectiva();
		AutoomatesIdiomes.innerHTML=Text;
		AutoomatesIdiomes.id='AUTOOMATES_IDIOMES';	
		AutoomatesIdiomes.className="idiomes";
		AutoomatesPrimeraLinia.appendChild(AutoomatesIdiomes);
	}

	// Dintre del div 'TOOMATES' ha d'haver el div 'AUTOOMATES_ESPAI'
	// Si no està el fem de nou.

	var AutoomatesEspai=document.getElementById('AUTOOMATES_ESPAI');
	if (!AutoomatesEspai) {
		AutoomatesEspai=document.createElement('div');
		AutoomatesEspai.id='AUTOOMATES_ESPAI';
		Autoomates.appendChild(AutoomatesEspai);
	}
}

function GenerarHTMLSelectorIdiomes() {
	var Text="<small><small><b>";
	if(IdiomaSeleccionat!="CAT") {
		Text+=GenerarSelector("CAT","CanviarAIdioma('CAT')");
		Text+='&nbsp;';
	}
	if(IdiomaSeleccionat!="CAS") {
		Text+=GenerarSelector("CAS","CanviarAIdioma('CAS')");
		Text+='&nbsp;';
	}
	if(IdiomaSeleccionat!="ITA") {
		Text+=GenerarSelector("ITA","CanviarAIdioma('ITA')");
		Text+='&nbsp;';
	}
	Text+="</b></small></small>&nbsp;&nbsp;";
	return (Text);
}

function GenerarHTMLSelectorAlturaLletres() {
	var Text="<small><small><b>";
	Text+=GenerarSelector("A+","AugmentarAlturaLletres()");
	Text+='&nbsp;';
	Text+=GenerarSelector("a-","DisminuirAlturaLletres()");
	Text+="</b></small></small>&nbsp;&nbsp;";
	return (Text);
}

function AugmentarAlturaLletres() {
	AlturaLletres=AlturaLletres+1;
	RefrescarFinestral();
}

function DisminuirAlturaLletres() {
	if(AlturaLletres<=0) return;
	AlturaLletres=AlturaLletres-1;
	RefrescarFinestral();
}

function GenerarHTMLReferenciaCollectiva() {
	var Text="";
	Text+='<span>';
	Text+='<small><small><small>Powered by ';
	Text+=GenerarEnllacMesInfo(4,"Col·lectiva 2.0");
	Text+='</small></small></small></span>';
	return (Text);
}

function RefrescarFinestral() {
	for(var i=0;i<Finestral.length;i++) {
		if (Finestral[i]) Finestral[i].Refrescar();
	}
	DivIdiomes=document.getElementById('AUTOOMATES_IDIOMES');
	if(DivIdiomes) DivIdiomes.innerHTML=GenerarHTMLSelectorIdiomes()+GenerarHTMLSelectorAlturaLletres()+GenerarHTMLReferenciaCollectiva();
}

/************************************************************************************
*
* Missatges de seguiment, registre d'accions i gestió d'errors interns
*
************************************************************************************/

function MissatgeSeguiment(Text,SegonsVida) {
	var Text2='<small><small><span style="color:green;">'+Text+'</span></small></small>';
	var Treball=document.getElementById('FINESTRASEGUIMENT');
	if (Treball) {
		Treball.innerHTML=Text2;
		StepsMissatgeSeguiment=0;
		setTimeout("StepMissatgeSeguiment()",100);
	}
}

function StepMissatgeSeguiment() {
	if(StepsMissatgeSeguiment<=10) { 
		AcolorirMissatgeSeguiment(StepsMissatgeSeguiment*10);
	}
	if(StepsMissatgeSeguiment>=50) {
		AcolorirMissatgeSeguiment((60-StepsMissatgeSeguiment)*10);
	}
	if(StepsMissatgeSeguiment<=60) {
		StepsMissatgeSeguiment+=1;	
		setTimeout("StepMissatgeSeguiment()",100);
	}
	else {
		var Text2='';
		var Treball=document.getElementById('FINESTRASEGUIMENT');
		if (Treball) Treball.innerHTML=Text2;
	}
}

function AcolorirMissatgeSeguiment(Color) {
	var Treball=document.getElementById('FINESTRASEGUIMENT');
	if (Treball) {
		Treball.style.filter='alpha(opacity='+Color+')';	// IE
		Treball.style.opacity=Color/100;			// standard
		Treball.style.MozOpacity=Color/100;			// Firefox
		Treball.style.KHTMLOpacity=Color/100;			// webkit
	}
}

function GenerarRegistreEstadistic(CodiAccio,IdActivitat) {
	//
	// Afegeix una entrada per a l'estudi estadístic d'activitats visitades
	//
	if (VersioPortable==1) return;	// La versió portable no genera seguiment estadístic
	if (CodiAccio==undefined) CodiAccio=0;
	var Url="collectiva2/php/regrestadistica.php";
	Url=AfegirParametreURIInicial(Url,"a",IdActivitat);
	Url=AfegirParametreURISecundari(Url,"s",CodiSessio);
	Url=AfegirParametreURISecundari(Url,"c",CodiAccio);
	if (NomUsuari!="") {
		if (LoginUsuari!="") {
			Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
		}
	}		
	GenerarDemandaAJAXSenseRetorn(Url);
}


function LogError(Codi) {
	MissatgeSeguiment('<span style="color:red;">Error '+Codi+'</span>',5);	
	GenerarRegistreEstadistic(10,Codi);
}

/************************************************************************************
*
* Finestral --> Minimitzar capçalera
*
************************************************************************************/

function MinimitzarCap() {
	var Text="";
	var Cap=document.getElementById('Cap');
	if (Cap) {
		Text+="<div>";
		Text+='<div id="FINESTRASEGUIMENT" style="width:40%; float:left;"></div>';
		Text+='</div>';
		Text+='<span style="width: 59%; float:right; text-align:right;">';
		//Text+='<div style="margin:10px; ">';
		Text+='<small><small><small><small>';
		Text+='<a href="http://www.toomates.net/kiwipedia/coopera/coopera.htm" target="_blank">Coopera</a>';
		Text+='<img src="collectiva2/logos/pera.jpg" alt="Coopera" width="11" height="15"></img>';
		Text+='&nbsp;-&nbsp;';
		Text+='<a href="http://www.toomates.net/kiwipedia/toomapes/toomapes.htm" target="_blank">Toomapes</a>';
		Text+='<img src="collectiva2/logos/mon.jpg" alt="Toomapes" width="16" height="16"></img>';
		Text+='&nbsp;-&nbsp;';
		Text+='<a href="http://www.toomates.net/kiwipedia/index.html" target="_blank">Kiwipèdia</a>';
		Text+='<img src="collectiva2/logos/mesinfo.png" alt="Kiwipèdia" width="18" height="18"></img>';
		Text+='&nbsp;-&nbsp;';
		Text+='<span style="cursor: pointer; color: blue; text-decoration:underline;" onclick="Finestral[5].RecarregarActivitat(4637);PassarAFinestra(5);">Cool·lecció</span><img src="collectiva2/logos/cesta.jpg" alt="cool·lecció" width="18" height="17">';
		Text+='&nbsp;-&nbsp;';
		Text+='<a href="http://www.facebook.com/pages/Toomates-matematiques-per-a-la-diversitat/472825340056" target="_blank">YouToo: Toomates al Facebook</a><img src="collectiva2/logos/facebook_logo_15_14.jpg" alt="facebook" width="14" height="15">';
		Text+='</small></small></small></small>&nbsp;&nbsp;&nbsp;&nbsp;';
		if(VersioPortable==1) {
			Text+='<img src="collectiva2/logos/logo_toomates_petit_portable.jpg" alt="Toomates" width="177" height="22"></img>';
		}
		else {
			Text+='<img src="collectiva2/logos/logo_toomates_petit.jpg" alt="Toomates" width="86" height="20"></img>';
		}

		//Text+="</div>";
		Text+="</span>";
		Text+="</div>";
		Cap.innerHTML=Text;
	}
}

/************************************************************************************
*
* Finestral --> Missatge no identificat
*
************************************************************************************/

function MissatgeNoIdentificat() {
	// Retorna un text d'avís si no està identificat
	// Retorna "" si s'ha detectat, o si MathMLConfirmat=true
	var Text="";
	if (NomUsuari!="") return ("");
	// Missatge "Atenció: Usuari no identificat"
	Text+='<br /><div id="FINESTRA_AVIS_MathML", class="FinestraAvis"><small>';
	Text+='<img src="collectiva2/logos/atencio_petit_16_16.gif" alt="Atenció" width="16" height="16"></img>';
	Text+="&nbsp;";
	Text+="No estàs identificat! Identifica't per a registrar la teva puntuació.";
	Text+="<a href='http://www.toomates.net/kiwipedia/info9/info9_cat.html' target='_blank'>&nbsp;Més informació</a>";
	Text+="</div>";
	return (Text);
}

/************************************************************************************
*
* Finestral --> Reset --> Procés ChequearMathML
*
************************************************************************************/

function ChequearMathML() {
	// Chequea si el navegador té MathML
	// i deixa el resultat a les variables MathMLDetectat i MissatgeBrowserDetectat
	MathMLConfirmat=false;
	MissatgeBrowserDetectat="Navegador: " +':&nbsp;' + BrowserDetect.browser + '&nbsp;' + 
		BrowserDetect.version + '&nbsp;'+ " versió: " + '&nbsp;'
		+ BrowserDetect.OS;
	MissatgeBrowserDetectat=MissatgeBrowserDetectat+".&nbsp;"
	// Només suposem el MathML si és el Firefox 3.0
	// o un explorer amb el plugin de MathPlayer

	if (BrowserDetect.browser=="Firefox" && BrowserDetect.version>=2) {
		MathMLDetectat=true;
		MissatgeBrowserDetectat=MissatgeBrowserDetectat+" activat"; // Activat
	}
	else {
		if (checkForMathPlayer()==1) {
			// hi ha IE amb MathPlayer
			MathMLDetectat=true;
			MissatgeBrowserDetectat=MissatgeBrowserDetectat +"&nbsp;"+ "noseque" +"&nbsp;" +" activat "; // Activat
		} 
		else {
			MissatgeBrowserDetectat=MissatgeBrowserDetectat + " desactivat "; // Desactivat	
		}
	}
}	

/************************************************************************************
*
* Finestral -->  Reset --> Procés ChequearMathML --> Comprovació de IE amb MathPlayer
*
************************************************************************************/
//
// http://www.dessci.com/en/products/mathplayer/author/creatingsites.htm
//

function checkForMathPlayer() {
	if (isIEWindows()) {
		if (ieVersion() >=6.0) {
			if (isMPInstalled()) {
				var start=navigator.appVersion.indexOf("MathPlayer");
				if (start!=-1) {
					return (1); // IE & Mathplayer (OK)
				}
				else {
					return (-1); // IE & Mathplayer no acceptable
				}
			}
			else {
				return (-2); // IE sense Mathplayer
			}
		}
		else {
			return (-3); // IE massa antic per a Mathplayer
		}
	}
	else {
		return (0); // Explorador no IE.
	}
}
function isMPInstalled() {
	try {
		var oMP=new ActiveXObject ("MathPlayer.Factory.1");
		return true;
	}
	catch (e) {
		return false;
	}
}
function isIEWindows () {
	return ((navigator.appName=="Microsoft Internet Explorer") &&
		(navigator.appVersion.indexOf("Windows") != -1));
}
function ieVersion () {
	var ieVer=0;
	var start = navigator.appVersion.indexOf("MSIE ");
	if (start!=-1) {
		ieVer=parseFloat (navigator.appVersion.substring(start+5));
	}
	return ieVer;
}

/************************************************************************************
*
* Finestral --> Reset --> Carregar Cookie amb l'identificador d'usuari
*
************************************************************************************/

function CarregarCookieIdentificacioUsuari() {
	// Intentem carregar les cookies identificatives si és que n'hi ha
	if (getCookie("AUTOOMATESNom")) {
		NomUsuari=getCookie("AUTOOMATESNom");
		LoginUsuari=getCookie("AUTOOMATESIdentificador");
		PasswordUsuari=getCookie("AUTOOMATESPassword");
	}
}


/************************************************************************************
*
* Finestral --> Gestió de la finestra per a Imprimir
*
************************************************************************************/

document.onclick=PaginaTocada;	

function PaginaTocada() {
	// Si s'està en mode "Versió per a imprimir", la capçalera està oculta
	// i se surt fent click en la pàgina
	// el comptador CapOcult és perquè no surti amb el propi click d'entrada
	if (CapOcult==0) return;
	if (CapOcult==2) {
		CapOcult=1;
		return;
	}
	SortirDeVersioImprimir();
}

function SortirDeVersioImprimir() {
	CapOcult=0;
	var finestra=document.getElementById("Contenidor_Centrat");
	finestra.style.cssText = "{width: 80%; margin-left:auto; margin-right:auto; text-align: left; background-color: white;}";
	var finestra=document.getElementById("Versio_Imprimir");
	finestra.style.cssText = 'display:none';
}

function EntrarEnVersioImprimir() {
	CapOcult=2;
	var Text="Fes click a la pantalla per sortir de la visualització per a impressora.\n";
	Text+="Selecciona abans 'mode practicar' si vols imprimir també les solucions.";
	alert(Text);
	var finestra=document.getElementById("Contenidor_Centrat");
	finestra.style.cssText = 'display:none';
	var finestra=document.getElementById("Versio_Imprimir");
	finestra.style.cssText = 'display:inline';
	window.print();
}

/************************************************************************************
*
* Finestral --> Gestió del canvi de Vinyeta
*
************************************************************************************/

function PassarAFinestra(NovaFinestra) {
	// Tanca la finestra actual i obre la finestra NovaFinestra 
	if (!Finestral[NovaFinestra]) return;
	if (Finestral[FinestraActual]) if (TancarFinestraActual()==false) return;	
	FinestraActual=NovaFinestra;
	Finestral[FinestraActual].Obrir();
}

function TancarFinestraActual() {
	return(Finestral[FinestraActual].Tancar());
}

function RefrescarFinestraActual() {
	PassarAFinestra(FinestraActual);
}

function EliminarICanviDeFinestra(IndexFinestraAEliminar,IndexFinestraDesti) {
	// Elimina la finestra IndexFinestraAEliminar i salta a IndexFinestraDesti
	// l'eliminació dels div's ja s'ha fet a l'objecte finestra
	if (Finestral[IndexFinestraAEliminar]) Finestral[IndexFinestraAEliminar]=null;
	PassarAFinestra(IndexFinestraDesti);
}

/************************************************************************************
*
* Finestral --> Comprovar si Kiwis està censurat
*
************************************************************************************/

function HiHaCensuraKiwis() {
	for (var i=0;i<Finestral.length;i++) {
		if (Finestral[i]) {
			if (Finestral[i].KiwisCensurat==true) return(true);
		}
	}
	return(false);
}

/***********************************************************************************\
*
* Finestra Info
*
************************************************************************************/

function FinestraInfo(TheIndexFinestra,TheIndexFinestraMare) {
	// Genera una finestra de tipus informativa.
	Finestra.call(this,TheIndexFinestra,TheIndexFinestraMare,"Info");
	this.HTMLPestanya="Info";
	this.BotoActualitzar=false;
}
FinestraInfo.prototype = new Finestra();

FinestraInfo.prototype.GenerarHTMLEspaiTreball = function() {
	var Text="<br />";
	if (VersioPortable==1) {
		Text+="<big><p style='text-align:center; color:blue;'>Toomates Portable</p></big>";
		Text+="<p style='text-align:center;'>Versió de l'aplicatiu Col·lectiva: 2.0 (31 d'octubre del 2011)</p>";
		Text+="<p style='text-align:center;'>Versió de la base de dades de Cool·lecció: 31 d'octubre del 2011</p>";
		Text+="<p style='text-align:center;'>Toomates Portable utilitza el programa <a href='http://www.UsbWebserver.com'>USBWebserver8</a></p>";
	}
	Text+="<big><p style='text-align:center; color:blue;'>Projecte Autoomates: Toomates, Col·lectiva, Cool·lecció, Cocotrainer, BeWooM, Quètxup & Kiwis</p></big>";
	Text+="<p style='text-align:center;'>(c) Gerard Romo Garrido, 2008, 2009, 2010, 2011   gerard_romo_toomates@yahoo.es</p>";
	Text+="<p style='text-align:center;'>Tot el projecte Autoomates és 100% software lliure Open-Source</p>";
	Text+="<p style='text-align:center;'>Més informació a <a href='http://www.toomates.net'>www.toomates.net</a></p>";
	Text+="<big><p style='text-align:center; color:blue;'>Llibertat d´&uacute;s – Llibertat de modificaci&oacute; – Llibertat de c&ograve;pia – Llibertat de distribuci&oacute;</p></big>";
	Text+='<p style="text-align:center;">Es permet qualsevol &uacute;s, modificaci&oacute;, c&ograve;pia i distribuci&oacute;, sempre que siguin emprats en &agrave;mbits educatius, sense &agrave;nim de lucre i se’n citi l’autoria i la proced&egrave;ncia. <a HREF="http://creativecommons.org/licenses/by-nc-sa/2.5/es/deed.ca">M&eacute;s informaci&oacute;</a></p>';
	Text+="<p style='text-align:center;'>" + '<a href="http://cat.creativecommons.org/">Creative Commons</a>' +"</p>";
	Text+="<br /><br />";
	Text+="<p style='text-align:center;'>" + "Es recomana fer servir el navegador Firefox" +"</p>";
	Text+="<p style='text-align:center;'>"+'<img src="collectiva2/logos/logo_firefox3.jpg"  alt="Logo Firefox 3" width="93" height="126"></img></p>';
	Text+="<br/>";
	Text+="<p>JavaScript Virtual Keyboard (numpad variant), version 2.7</p>";
	Text+="<p>Copyright (C) 2006-2008 Dmitriy Khudorozhkov (mailto:dmitrykhudorozhkov@yahoo.com)</p>";
	return(Text);
}

/************************************************************************************
*
* Finestra Usuari
*
************************************************************************************/

function FinestraUsuari(TheIndexFinestra,TheIndexFinestraMare) {
	this.DadesUsuari= new Array();
	this.DocentsUsuari=new Array();
	this.FormulariIdentificacio=new Object();
	this.FormulariNouUsuari=new Object();
	Finestra.call(this,TheIndexFinestra,TheIndexFinestraMare,Traduir(157));	// "Usuari"
}
FinestraUsuari.prototype = new Finestra();

FinestraUsuari.prototype.Actualitzar = function() {
	if (NomUsuari=="") this.PassarAMode(1);
	else this.PassarAMode(2);
	this.FinalActualitzar();
}

FinestraUsuari.prototype.GenerarHTMLPestanya = function() {
	if (NomUsuari=="") return (Traduir(157));	// "Usuari"
	return (Traduir(157)+"("+NomUsuari.substr(0,10)+")");	// "Usuari"
}

/************************************************************************************
*
* Finestra Usuari --> Generar HTML
*
************************************************************************************/

/************************************************************************************
*
* Finestra Usuari --> Mode 1: Usuari No identificat
*
************************************************************************************/

FinestraUsuari.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text="<br /><br />";
	var TextEsquerra="";
	var Aqui="Finestral["+this.IndexFinestra+"].FormulariIdentificacio.";
	this.FormulariIdentificacio=new Formulari(Aqui,1);
	this.FormulariIdentificacio.Items[1]=new EntradaIdentificador(Aqui+"Items[1].",2);	// Identificador
	this.FormulariIdentificacio.Items[2]=new EntradaPassword(Aqui+"Items[2].",3);		// Password
	this.FormulariIdentificacio.Items[2].NoPotSerBuit=true;
	var Funcio='Finestral['+this.IndexFinestra+'].IntentarIdentificacio()';
	this.FormulariIdentificacio.Items[3]=new EntradaBoto(Aqui+"Items[3].",4,Funcio);	// Accedir 
	TextEsquerra=this.FormulariIdentificacio.Insertar("",false);

	// També ofereix la possibilitat de registrar-se
	var Aqui="Finestral["+this.IndexFinestra+"].FormulariNouUsuari.";
	this.FormulariNouUsuari=new Formulari(Aqui,5);				// Sóc un usuari nou, vull enregistrar-me
	this.FormulariNouUsuari.Desplegable=true;
	this.FormulariNouUsuari.Items[1]=new EntradaText(Aqui+"Items[1].",6);		// El meu nom/nick/àlies és
	this.FormulariNouUsuari.Items[1].NomURL="n";
	this.FormulariNouUsuari.Items[2]=new EntradaIdentificador(Aqui+"Items[2].",7);	// El meu identificador serà
	this.FormulariNouUsuari.Items[2].NomURL="u";
	this.FormulariNouUsuari.Items[3]=new EntradaPassword(Aqui+"Items[3].",8);	// Password
	this.FormulariNouUsuari.Items[3].MinimaLongitud=3;
	this.FormulariNouUsuari.Items[3].MaximaLongitud=10;
	this.FormulariNouUsuari.Items[3].NomURL="pu";
	this.FormulariNouUsuari.Items[3].NoPotSerBuit=true;
	this.FormulariNouUsuari.Items[4]=new EntradaPassword(Aqui+"Items[4].",9);	// Repeteix Password
	this.FormulariNouUsuari.Items[4].MinimaLongitud=3;
	this.FormulariNouUsuari.Items[4].MaximaLongitud=10;
	this.FormulariNouUsuari.Items[4].NoPotSerBuit=true;
	var Funcio='Finestral['+this.IndexFinestra+'].IntentarRegistreUsuariNou()';
	this.FormulariNouUsuari.Items[5]=new EntradaBoto(Aqui+"Items[4].",10,Funcio);	// Registrar-me
	TextEsquerra+="<br/><br/>";
	TextEsquerra+=this.FormulariNouUsuari.Insertar("",true);
	TextEsquerra+="<br/><br/>";
	TextEsquerra+=this.GenerarInformacioPerqueRegistrarse();
	var TextDreta=this.GenerarInformacioImportant();
	TextDreta+=this.GenerarInformacioAlgunsTutorials();
	var Text=GenerarHTMLDuesColumnes(TextEsquerra,TextDreta,40);
	return (Text);
}

FinestraUsuari.prototype.GenerarHTMLMenuMode1 = function() {
	var Text="";
	return(Text);
}

FinestraUsuari.prototype.GenerarInformacioPerqueRegistrarse =function() {
	var Text="<div style='text-align:center;'>";
	Text+='<br />'+ GenerarEnllacMesInfo(9,Traduir(230));
	Text+="<br /><br /><small><small><small><p style='text-align:center;'>"+Traduir(231)+"</p></small></small></small>";
	Text+="</div><br />";
	return (Text);
}

FinestraUsuari.prototype.GenerarInformacioImportant =function() {
	var Text="<div class='FinestraText'>";
	Text+="Important:<br/><small>";
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;Per obrir els <b>documents</b><img src="collectiva2/logos/icona_document.jpg" WIDTH=17 HEIGHT=18 alt="document word"/> de Toomates ';
	Text+="necessites un editor de text, com per exemple l'editor <b>OpenOffice</b> (gratu&iuml;t)<br/>";
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://ca.openoffice.org/" target="_blank">Descarregar OpenOffice</a>';
	Text+="<br /><br />";
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;Per treballar amb les activitats interactives <b>Qu&egrave;txup</b><img src="collectiva2/logos/quetxup.png" WIDTH=25 HEIGHT=18 alt="Qu&egrave;txup"/>&nbsp;<img src="collectiva2/logos/exercici.gif" WIDTH=16 HEIGHT=16 alt="Exercici"/> ';
	Text+="necessites un navegador compatible amb <b>MathML</b>, com el Mozilla <b>Firefox</b>.<br />";
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.mozilla-europe.org/ca/firefox/" target="_blank">Descarregar Mozilla Firefox</a><br />';
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.toomates.net/kiwipedia/info2/info_mathml/info_mathml.php" target="_blank">'+Traduir(236)+'</a>';	// "El teu navegador és compatible amb MathML?"
	Text+="<br /><br />";
	Text+="</small></div>";
	return (Text);
}

FinestraUsuari.prototype.GenerarInformacioAlgunsTutorials =function() {
	var Text="<div class='FinestraText'>";
	Text+="Alguns mini tutorials:<br/><small>";
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;';
	Text+=GenerarEnllacMesInfo(10,Traduir(235));	// "Com crear els teus propis cursos"
	Text+="<br />";
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.toomates.net/Llistes/a2010/set/cocotrainer.pdf" target="_blank">Sobre els esquemes Cocotrainer</a>';
	Text+='<img src="collectiva2/logos/logo_pdf.gif" WIDTH=18 HEIGHT=18 alt="document pdf"/>';
	Text+="<br />";
	Text+="</small><br /></div>";
	return (Text);
}

/************************************************************************************
*
* Finestra Usuari --> Mode 1: Usuari No identificat --> Intentar identificació
*
************************************************************************************/

FinestraUsuari.prototype.IntentarIdentificacio =function() {
	// Intenta accedir a la base de dades d'usuaris per a intentar una identificació de l'usuari
	// Retorna el nom o una cadena buida si no està
	if (this.FormulariIdentificacio.Descarregar()!=true) return;
	IdentificadorProposat=this.FormulariIdentificacio.Items[1].Valor;
	PasswordProposat=this.FormulariIdentificacio.Items[2].Valor;
	var Url="collectiva2/php/login.php";	
	Url=AfegirParametreURIInicial(Url,"u",IdentificadorProposat);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordProposat);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornIdentificacioBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornIdentificacioMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

FinestraUsuari.prototype.RetornIdentificacioBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.FormulariIdentificacio.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	NomUsuari=decodeURIComponent(ContingutAJAX);
	LoginUsuari=this.FormulariIdentificacio.Items[1].Valor;
	PasswordUsuari=this.FormulariIdentificacio.Items[2].Valor;
	this.EmmagatzemarIdentificacio();
	this.PassarAMode(2);
	ActualitzarFinestral();
	this.ActualitzarVisitaFinestra(3);	// Identificació
}

FinestraUsuari.prototype.RetornIdentificacioMal =function() {
	this.FormulariIdentificacio.GenerarMissatgeError(16);	// "Error de connexió"
}

/************************************************************************************
*
* Finestra Usuari --> Mode 1: Usuari No identificat --> Intentar Registre Nou
*
************************************************************************************/

FinestraUsuari.prototype.IntentarRegistreUsuariNou =function() {
	// Intenta registrar un usuari nou
	if (this.FormulariNouUsuari.Descarregar()!=true) return;
	PasswordProposat=this.FormulariNouUsuari.Items[3].Valor;
	RepeticioPasswordProposat=this.FormulariNouUsuari.Items[4].Valor;
	if(PasswordProposat!=RepeticioPasswordProposat) {
		// "El password i la seva repetició no coincideixen"
		this.FormulariNouUsuari.Items[4].GenerarMissatgeError(17);
		return;
	}
	if(this.FormulariNouUsuari.Items[2].Valor.substring(0,5)=="ERROR") {
		this.FormulariNouUsuari.Items[2].GenerarMissatgeError(20);
		return;
	}
	var Url="collectiva2/php/nouusuari.php";
	Url=AfegirParametreURIInicial(Url,"rand",GenerarStringRand());
	Url+="&"+this.FormulariNouUsuari.OutputURL();
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornNouUsuariBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornNouUsuariMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

FinestraUsuari.prototype.RetornNouUsuariBe =function(ContingutAJAX) {	
	// El mòdul "nouusuari.php" retorna un missatge si no s'ha pogut registrar
	// o "OK" si s'ha pogut
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.FormulariNouUsuari.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.FormulariNouUsuari.GenerarMissatgeError(18);
		return;
	}
	NomUsuari=this.FormulariNouUsuari.Items[1].Valor;
	LoginUsuari=this.FormulariNouUsuari.Items[2].Valor;
	PasswordUsuari=this.FormulariNouUsuari.Items[3].Valor;
	this.EmmagatzemarIdentificacio();
	this.PassarAMode(2);
	ActualitzarFinestral();
	this.ActualitzarVisitaFinestra(9);	// nou registre d'entrada
}

FinestraUsuari.prototype.RetornNouUsuariMal =function() {	
	this.FormulariNouUsuari.GenerarMissatgeError(16);	// "Error de connexió"
}

FinestraUsuari.prototype.EmmagatzemarIdentificacio =function(CadenaNomUsuari) {
	//Generem una cookie identificativa
	AfegirCookie("AUTOOMATESNom",NomUsuari);
	AfegirCookie("AUTOOMATESIdentificador",LoginUsuari);
	AfegirCookie("AUTOOMATESPassword",PasswordUsuari);
}

/************************************************************************************
*
* Finestra Usuari --> Mode 2: (Usuari identificat)
*
************************************************************************************/

FinestraUsuari.prototype.GenerarHTMLEspaiTreballMode2 = function() {
	var Nom=NomUsuari.substring(0,8);
	this.GenerarNomVinyeta(Traduir(157)+"("+Nom+")");
	var Text=Traduir(192)+"&nbsp;"+NomUsuari;	// "Hola"
	var Funcio="Finestral["+this.IndexFinestra+"].Desconectar()";
	var Aqui="Finestral["+this.IndexFinestra+"]";
	var Boto=new EntradaBoto(Aqui,21,Funcio);
	Text+="&nbsp;&nbsp;"+Boto.OutputHTML();
	//
	// Accedir a professors
	//
	Text+="<br/>";
	var Funcio="Finestral["+this.IndexFinestra+"].VisualitzarProfessors()";
	var Boto=new EntradaLink(Aqui,173,Funcio);	// "Supervisors"
	Boto.CodiMesInfo=11;
	Text+=Boto.OutputHTML();
	Text+="<br/>";
	//
	// Accedir a alumnes
	//
	var Funcio="Finestral["+this.IndexFinestra+"].VisualitzarAlumnes()";
	var Boto=new EntradaLink(Aqui,174,Funcio);	// "Supervisats"
	Boto.CodiMesInfo=12;
	Text+=Boto.OutputHTML();
	Text+="<br/>";
	//
	// Seguiment diari 
	//
	var Funcio="Finestral["+this.IndexFinestra+"].VisualitzarSumaPuntuacions()";
	var Boto=new EntradaLink(Aqui,181,Funcio);	// "Seguiment diari de puntuacions"
	Text+=Boto.OutputHTML();
	Text+="<br/>";

	return(Text);
}

FinestraUsuari.prototype.GenerarHTMLMenuMode2 = function() {
	var Text="";
	return(Text);
}

FinestraUsuari.prototype.VisualitzarAlumnes = function() {
	var Finestra=Finestral.length;
	Finestral[Finestra]=new VisorAlumnes(Finestra,this.IndexFinestra);
	Finestral[Finestra].Reset();
	Finestral[Finestra].Actualitzar();
	PassarAFinestra(Finestra);
}

FinestraUsuari.prototype.VisualitzarProfessors = function() {
	var Finestra=Finestral.length;
	Finestral[Finestra]=new VisorProfessors(Finestra,this.IndexFinestra);
	Finestral[Finestra].Reset();
	Finestral[Finestra].Actualitzar();
	PassarAFinestra(Finestra);
}

FinestraUsuari.prototype.VisualitzarSumaPuntuacions = function() {
	var Finestra=Finestral.length;
	Finestral[Finestra]=new VisorSeguimentDiariUsuariSumaPuntuacions(Finestra,this.IndexFinestra);
	Finestral[Finestra].Reset();
	Finestral[Finestra].Actualitzar();
	PassarAFinestra(Finestra);
}

/************************************************************************************
*
* Finestra Usuari --> Mode 2: Desconectar
*
************************************************************************************/

FinestraUsuari.prototype.Desconectar =function() {
	this.ActualitzarVisitaFinestra(4);	// Desidentificació
	// Esborrem les cookies identificatives
	deleteCookie("AUTOOMATESNom");
	deleteCookie("AUTOOMATESIdentificador");
	deleteCookie("AUTOOMATESPassword");
	NomUsuari="";
	LoginUsuari="";
	PasswordUsuari="";
	this.GenerarNomVinyeta(Traduir(157));	// "Usuari"
	ActualitzarFinestral();
	this.PassarAMode(1);
}

/***********************************************************************************\
*
* Visor Kiwis
*
************************************************************************************/

function VisorKiwis(TheIndexFinestra,TheIndexMare) {
	// Genera una finestra de tipus Kiwis
	Finestra.call(this,TheIndexFinestra,TheIndexMare,"Kiwis");
	MyKiwis=new Kiwis();
	this.BotoActualitzar=false;
}
VisorKiwis.prototype = new Finestra();

VisorKiwis.prototype.GenerarHTMLEspaiTreballMode0 = function () {
	var Text="";
	Text="<br /><br />&nbsp;&nbsp;INPUT:&nbsp;";
	Text= Text + '<input type="text" id="INPUTKIWIS"';
	Text= Text + 'size="100" '; 
	Text= Text + 'value="" onchange="ExecutarKiwis();">';
	Text=Text+'<input type="button" value=">"';
	Text=Text+ '" onclick="ExecutarKiwis();">';

	// Afegim un espai per a visualitzar l'output de Kiwis
	Text=Text+'<div id="OUTPUT_KIWIS"></div>';
	return (Text);
}

function ExecutarKiwis() {
	if (HiHaCensuraKiwis()) {
		AvisarKiwisCensurat();
		return;
	}
	var TextInput=document.getElementById("INPUTKIWIS").value;
	var StatusInput=MyKiwis.Input(TextInput,0);
	var TextOutput="";
	if (StatusInput!="") {
		// Entrada no acceptable
		TextOutput=DiccionariKiwis.Traduir(2) + "&nbsp;"+StatusInput;
	} 
	else {
		// Entrada acceptable
		TextOutput=MyKiwis.OutputExpressio(4);		
		TextOutput=TextOutput+"&nbsp;&nbsp;-->&nbsp;&nbsp;";
		TextOutput=TextOutput+MyKiwis.OutputResultat(4);
	}
	var finestra=document.getElementById("OUTPUT_KIWIS");
	finestra.innerHTML="<br />"+TextOutput;
	convert();
}

function AvisarKiwisCensurat() {
	alert("Ops! Ara no es pot fer servir la calculadora!");
}

/***********************************************************************************\
*
*
*
* Bloc Activitat
*
*
*
************************************************************************************/

function Activitat(TheIndexFinestra,TheAqui) {
	if (TheAqui==undefined && TheIndexFinestra==undefined) return;
	Formulari.call(this,TheAqui,0);
	this.Altura=400;
	this.IndexFinestra=TheIndexFinestra;
	this.AmbInfoPrevi=true;		// false --> No té finestreta info previ
	//
	// Per a insertar noves activitats en referència a aquesta
	//
	this.ActivitatReferencia=0;
	this.PosicioRelativa=0;
	this.NomDivModal="FORMULARIMODAL"+this.IndexFinestra;
	this.ActivitatSecundaria=false;
	this.URLAfegirNovaActivitat="collectiva2/php/novaactprim.php";
	//
	// Per a afegir els forats d'insertar activitat primària
	//
	this.ActivitatIniciTema=false;
	this.ActivitatColumnaInicial=false;
	this.ActivitatColumnaFinal=false;
	//
	// Per a visualitzar en un esquema
	//
	this.ActivitatOberta=false;
	//
	// Contingut de la B.D.
	//
	var Aqui=this.Aqui+"Items[1].";			// IdActivitat = 1
	this.Items[1]=new EntradaEnter(Aqui,0);		
		this.Items[1].Invisible=true;
	Aqui=this.Aqui+"Items[2].";			// Seccio = 2 
	this.Items[2]=new EntradaEnter(Aqui,0);
		this.Items[2].Invisible=true;
	Aqui=this.Aqui+"Items[3].";			// Tema = 3
	this.Items[3]=new EntradaEnter(Aqui,0);
		this.Items[3].Invisible=true;
	Aqui=this.Aqui+"Items[4].";			// Fila = 4
	this.Items[4]=new EntradaEnter(Aqui,0);
		this.Items[4].Invisible=true;
	Aqui=this.Aqui+"Items[5].";			// Columna = 5
	this.Items[5]=new EntradaEnter(Aqui,0);	
		this.Items[5].Invisible=true;
	Aqui=this.Aqui+"Items[6].";			// Editor = 6
	this.Items[6]=new EntradaEnter(Aqui,0);
		this.Items[6].Invisible=true;
	Aqui=this.Aqui+"Items[7].";			// PermetreComentaris = 7
	this.Items[7]=new EntradaEnter(Aqui,0);
		this.Items[7].Invisible=true;
	Aqui=this.Aqui+"Items[8].";			// Visualitzacio = 8
	this.Items[8]=new EntradaEnter(Aqui,0);
		this.Items[8].Invisible=true;
	Aqui=this.Aqui+"Items[9].";			// IdActivitatMare = 9
	this.Items[9]=new EntradaEnter(Aqui,0);
		this.Items[9].Invisible=true;
	Aqui=this.Aqui+"Items[10].";			// IdMaster = 10
	this.Items[10]=new EntradaEnter(Aqui,0);
		this.Items[10].Invisible=true;
	Aqui=this.Aqui+"Items[11].";			// Titol = 11
	this.Items[11]=new EntradaText(Aqui,27);
		this.Items[11].NomURL="tit";
		this.Items[11].NoPotSerBuit=true;
		this.Items[11].AmpladaPx=60;
	Aqui=this.Aqui+"Items[12].";			// Url = 12
	this.Items[12]=new EntradaText(Aqui,28);
		this.Items[12].NomURL="url";
		this.Items[12].NoPotSerBuit=true;
		this.Items[12].AmpladaPx=60;
	Aqui=this.Aqui+"Items[13].";			// Autor = 13
	this.Items[13]=new EntradaEnter(Aqui,0);
		this.Items[13].Invisible=true;
	Aqui=this.Aqui+"Items[14].";			// Tipus = 14
	this.Items[14]=new EntradaEnter(Aqui,0);
		this.Items[14].Invisible=true;
		this.Items[14].NomURL="tip";
	Aqui=this.Aqui+"Items[17].";			// CompetenciesBasiques = 17
	this.Items[17]=new EntradaTrueFalse(Aqui,0);
		this.Items[17].Invisible=true;
	Aqui=this.Aqui+"Items[22].";			// Puntuació Màxima Absoluta = 22
	this.Items[22]=new EntradaPuntuacio(Aqui,108);
	this.Items[22].Invisible=true;	
	Aqui=this.Aqui+"Items[23].";			// CodiPermisos = 23
	this.Items[23]=new EntradaEnter(Aqui,0);
	this.Items[23].Invisible=true;
	Aqui=this.Aqui+"Items[24].";			// IdCurs = 24
	this.Items[24]=new EntradaEnter(Aqui,0);
	this.Items[24].Invisible=true;
	Aqui=this.Aqui+"Items[25].";			// IdElement = 25
	this.Items[25]=new EntradaEnter(Aqui,0);
	this.Items[25].Invisible=true;
	//
	// Subformulari descripció
	//
	Aqui=this.Aqui+"Items[26].";
	this.Items[26]=new Formulari(Aqui,153);			// "Descripció"
	Aqui=this.Aqui+"Items[26].Items[1].";			// Solucio = 26.1
	this.Items[26].Items[1]=new EntradaSelector(Aqui,30);	
		this.Items[26].Items[1].AfegirNomOpcio(166);	// 0 --> "Sense solució"
		this.Items[26].Items[1].AfegirNomOpcio(167);	// 1 --> "Amb solució"
		this.Items[26].Items[1].AfegirNomOpcio(223);	// 2 --> "Només indicacions"
		this.Items[26].Items[1].AfegirNomOpcio(224);	// 3 --> "Solucions desenvolupades"
		this.Items[26].Items[1].NomURL="sol";
	Aqui=this.Aqui+"Items[26].Items[2].";
	this.Items[26].Items[2]=new EntradaSelector(Aqui,31);	// Desenvolupament = 26.2
		this.Items[26].Items[2].AfegirNomOpcio(32);	// 0
		this.Items[26].Items[2].AfegirNomOpcio(33);	// 1
		this.Items[26].Items[2].AfegirNomOpcio(34);	// 2
		this.Items[26].Items[2].AfegirNomOpcio(35);	// 3
		this.Items[26].Items[2].AfegirNomOpcio(36);	// 4
		this.Items[26].Items[2].AfegirNomOpcio(37);	// 5
		this.Items[26].Items[2].AfegirNomOpcio(38);	// 6
		this.Items[26].Items[2].AfegirNomOpcio(39);	// 7
		this.Items[26].Items[2].AfegirNomOpcio(40);	// 8
		this.Items[26].Items[2].AfegirNomOpcio(41);	// 9
		this.Items[26].Items[2].AfegirNomOpcio(42);	// 10
		this.Items[26].Items[2].AfegirNomOpcio(43);	// 11
		this.Items[26].Items[2].AfegirNomOpcio(44);	// 12
		this.Items[26].Items[2].AfegirNomOpcio(45);	// 13
		this.Items[26].Items[2].AfegirNomOpcio(46);	// 14
		this.Items[26].Items[2].AfegirNomOpcio(47);	// 15
		this.Items[26].Items[2].AfegirNomOpcio(48);	// 16
		this.Items[26].Items[2].AfegirNomOpcio(49);	// 17
		this.Items[26].Items[2].AfegirNomOpcio(50);	// 18
		this.Items[26].Items[2].AfegirNomOpcio(237);	// 19 --> Problemes
		this.Items[26].Items[2].NomURL="des";
	Aqui=this.Aqui+"Items[26].Items[3].";			// Tic = 26.3
	this.Items[26].Items[3]=new EntradaSelector(Aqui,51);	
		this.Items[26].Items[3].AfegirNomOpcio(91);
		this.Items[26].Items[3].AfegirNomOpcio(52);	
		this.Items[26].Items[3].AfegirNomOpcio(53);
		this.Items[26].Items[3].AfegirNomOpcio(54);
		this.Items[26].Items[3].AfegirNomOpcio(55);
		this.Items[26].Items[3].AfegirNomOpcio(56);
		this.Items[26].Items[3].AfegirNomOpcio(57);
		this.Items[26].Items[3].NomURL="tic";
	Aqui=this.Aqui+"Items[26].Items[4].";
	this.Items[26].Items[4]=new EntradaSelector(Aqui,58);	// Audiovisual = 26.4
		this.Items[26].Items[4].AfegirNomOpcio(91);
		this.Items[26].Items[4].AfegirNomOpcio(60);
		this.Items[26].Items[4].AfegirNomOpcio(61);
		this.Items[26].Items[4].AfegirNomOpcio(62);
		this.Items[26].Items[4].NomURL="aud";
	Aqui=this.Aqui+"Items[26].Items[5].";
	this.Items[26].Items[5]=new EntradaSelector(Aqui,63);	// Transversal = 26.5
		this.Items[26].Items[5].AfegirNomOpcio(91);
		this.Items[26].Items[5].AfegirNomOpcio(65);
		this.Items[26].Items[5].AfegirNomOpcio(66);
		this.Items[26].Items[5].AfegirNomOpcio(67);
		this.Items[26].Items[5].AfegirNomOpcio(68);
		this.Items[26].Items[5].AfegirNomOpcio(69);
		this.Items[26].Items[5].AfegirNomOpcio(70);
		this.Items[26].Items[5].AfegirNomOpcio(71);
		this.Items[26].Items[5].AfegirNomOpcio(72);
		this.Items[26].Items[5].AfegirNomOpcio(73);
		this.Items[26].Items[5].AfegirNomOpcio(74);
		this.Items[26].Items[5].NomURL="tra";
	//
	// Subformulari seguiment
	//
	Aqui=this.Aqui+"Items[27].";
	this.Items[27]=new Formulari(Aqui,152);			// "Seguiment"
	Aqui=this.Aqui+"Items[27].Items[1].";			// Tipus seguiment = 27.1
	this.Items[27].Items[1]=new EntradaSelector(Aqui,152);	
		this.Items[27].Items[1].AfegirNomOpcio(225);	// 0 --> "Per defecte"
		this.Items[27].Items[1].AfegirNomOpcio(226);	// 1 --> "Sense seguiment"
		this.Items[27].Items[1].AfegirNomOpcio(227);	// 2 --> "Seguiment únic"
		this.Items[27].Items[1].AfegirNomOpcio(228);	// 3 --> "Seguiment diari"
		this.Items[27].Items[1].NomURL="seg";
	this.Items[27].Items[1].Valor=0;

	this.FuncioAcceptarModal=TheAqui+"AcceptarFormulariModal()";
	this.MyGestorVisualitzacio=new GestorVisualitzacio(TheAqui+"MyGestorVisualitzacio.");
	this.MyGestorVisualitzacio.FuncioAcceptarModal=TheAqui+"UpdateVisualitzacio()";
	this.MyGestorAutoria=new GestorAutoria(TheAqui+"MyGestorAutoria.");
	this.MyGestorAutoria.FuncioAcceptarModal=TheAqui+"UpdateAutoria()";
	this.IconaActivitat=new Imatge("","","",0,0);
	this.VisualitzarIcones=true; // Simplificar les icones repetides
}
Activitat.prototype = new Formulari();

/************************************************************************************
*
* Activitat --> Update i nova activitat
* 
************************************************************************************/

Activitat.prototype.OmplirFormulariNovaActivitat = function() {
	this.ExecutarModal();
}

Activitat.prototype.AceptarFormulariModal = function() {
	var Url="";
	if (this.Descarregar()==false) return;
	if (NomUsuari=="") {
		this.GenerarMissatgeError(75);
		return;
	}
	if (this.ActivitatReferencia!=0) {
		// És una nova activitat primària
		Url=this.URLAfegirNovaActivitat;
		Url=AfegirParametreURIInicial(Url,"ar",this.ActivitatReferencia);
		Url=AfegirParametreURISecundari(Url,"pr",this.PosicioRelativa);
		Url=AfegirParametreURISecundari(Url,"tip",this.Items[14].Valor);
	}
	else {
		// És una modificació a una activat ja creada
		Url="collectiva2/php/updateact.php";	
		Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);
	}
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	Url+="&"+this.OutputURL(true);	// Només descarreguem els elements modificats.
	var FuncioBe=this.Aqui+"RetornUpdateBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornUpdateMal()";
	this.GenerarMissatgeInfo(97);	// "Enviant"
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Activitat.prototype.RetornUpdateBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.GenerarMissatgeError(18);
		return;
	}
	this.EliminarFormulariModal();
	ActualitzarFinestral(this.Items[1].Valor);
	this.ActualitzarVisitaActivitat(8); // Registre editar
}

Activitat.prototype.RetornUpdateMal =function(ContingutAJAX) {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

Activitat.prototype.CarregarActivitatPerJSON = function(ArrayJSON) {
	this.Items[1].Input(ArrayJSON[0]);
	this.Items[2].Input(ArrayJSON[1]);
	this.Items[3].Input(ArrayJSON[2]);
	this.Items[4].Input(ArrayJSON[3]);
	this.Items[5].Input(ArrayJSON[4]);
	this.Items[6].Input(ArrayJSON[5]);
	this.Items[27].Items[1].Input(ArrayJSON[6]);
	this.Items[8].Input(ArrayJSON[7]);
	this.Items[9].Input(ArrayJSON[8]);
	this.Items[10].Input(ArrayJSON[9]);
	this.Items[11].InputURL(ArrayJSON[10]);
	this.Items[13].Input(ArrayJSON[12]);
	this.Items[14].Input(ArrayJSON[13]);
	this.Items[26].Items[1].Input(ArrayJSON[14]);
	this.Items[17].Input(ArrayJSON[15]);
	this.Items[26].Items[2].Input(ArrayJSON[16]);
	this.Items[26].Items[3].Input(ArrayJSON[17]);
	this.Items[26].Items[4].Input(ArrayJSON[18]);
	this.Items[26].Items[5].Input(ArrayJSON[19]);
	this.Items[22].Input(ArrayJSON[20]);
	this.Items[22].ModeSeguiment=ArrayJSON[6];
	this.Items[23].Input(ArrayJSON[21]);
	this.Items[24].Input(ArrayJSON[22]);
	this.Items[25].Input(ArrayJSON[23]);
	this.CarregarCampURL(ArrayJSON[11]);
}

Activitat.prototype.PermetAfegirActivitatPrimaria = function() {
	if (this.Items[23].Valor==1) return(true);
	return(false);
}

Activitat.prototype.CarregarCampURL = function(Contingut) {
	this.Items[12].Input(Contingut);
}

/************************************************************************************
*
* Activitat --> Generar HTML 1D
* 
************************************************************************************/

Activitat.prototype.GenerarHTML1D = function(Mode) {
	var Text="";
	Text='<span ';
	//
	// Afegim els events de ratolí
	//
	var FuncioOnMouseOver=this.Aqui+"CursorSobreActivitat()";
	Text+=' onmouseover ="'+FuncioOnMouseOver+';"';
	var FuncioOnMouseOut=this.Aqui+"CursorForaActivitat()";
	Text+=' onmouseout ="'+FuncioOnMouseOut+';"';
	var FuncioOnClick="Entrar()";
	Text+=' onclick="'+this.Aqui+FuncioOnClick+';" ';
	var FuncioOnMenu="GenerarMenuContextual(event)";
	Text+=' oncontextmenu ="'+this.Aqui+FuncioOnMenu+';"';
	//
	// Afegim l'estil
	//
	Text+=' style="cursor: pointer; color: blue; ';
	if(this.ActivitatInvisible()==true) Text+=' background-color:#cccccc; ';
	Text+='"';
	Text+=">";	
	//
	// Afegim el nom
	//
	Text+=this.GenerarHTMLNom();
	Text+="</span>";
	//
	// Afegim les icones
	//
	Text+=this.GenerarHTMLIcones();
	//
	// Afegim la informació de seguiment de puntuació
	//
	Text+=this.GenerarHTMLSeguimentPuntuacio();
	//
	// I per últim una finestreta invisible per a visualitzar la infoprevi
	//
	this.NomDivUnic=MyCodiDivUnico.NouCodi("PREVIS");
	if (this.AmbInfoPrevi==true) {
		Text+='<span id="'+ this.NomDivUnic+ '" class="previsualitzacio"></span>';	
		Text+="</span>";
	}
	return(Text);
}

Activitat.prototype.GenerarHTML1DTitol = function(Mode) {
	var Text="";
	Text='<span id="'+this.Id+'" ';
	Text+=">";	
	//
	// Afegim el nom
	//
	Text+=this.GenerarHTMLNom();
	Text+="</span>";
	//
	// Afegim les icones
	//
	Text+=this.GenerarHTMLIcones();
	//
	// Afegim la informació de seguiment de puntuació
	//
	Text+=this.GenerarHTMLSeguimentPuntuacio();
	return(Text);
}

Activitat.prototype.ActivitatInvisible = function() {
	if (this.Items[8].Valor!=1 && this.Items[8].Valor!=7) return(true);
	return(false);
}

Activitat.prototype.GenerarHTMLNom = function() {
	var Text='<span id="'+this.Id+'">'; 
	var Nom=Trim(this.Items[11].Valor);
	if (Nom=="") Nom="("+Traduir(24)+")";	// "Sense Nom"
	Text+=Nom+"</span>";
	return(Text);
}

Activitat.prototype.GenerarHTMLIcones = function() {
	//
	// Aquesta rutina s'ha de reescriure per a cada tipus d'Element particular
	//
	var Text="";
	if(this.VisualitzarIcones==false) return("");
	Text+=this.GenerarHTMLIconaActivitat();
	Text+=this.GenerarHTMLIconesDidactiques();
	return(Text);
}

Activitat.prototype.GenerarHTMLIconaActivitat = function() {
	return(this.IconaActivitat.GenerarHTML());
}

Activitat.prototype.GenerarHTMLIconesDidactiques = function() {
	var Text="";
	var a='<img src="collectiva2/logos/';
	// Amb solució		
	var Solucio=this.Items[26].Items[1].Valor;
	if (Solucio==1) Text+=a+'amb_solucions.png" WIDTH=18 HEIGHT=18 alt="document amb soluci&oacute;"/>';
	if (Solucio==2) Text+=a+'amb_indicacions.png" WIDTH=27 HEIGHT=18 alt="només indicacions"/>';
	if (Solucio==3) Text+=a+'amb_explicacions.png" WIDTH=27 HEIGHT=18 alt="amb explicacions"/>';
	// TIC
	var Tic=this.Items[26].Items[3].Valor;
	if (Tic==1) Text+=a+'icona_pc.gif" WIDTH=18 HEIGHT=18 alt="amb pc"/>';
	if (Tic==2) Text+=a+'logo_geogebra.jpg" WIDTH=18 HEIGHT=16 alt="amb geogebra"/>';
	if (Tic==3) Text+=a+'icona_full_calcul.jpg" WIDTH=18 HEIGHT=18 alt="full de c&agrave;lcul"/>';
	if (Tic==4) Text+=a+'calculadora.gif" WIDTH=20 HEIGHT=27 alt="amb calculadora cient&iacute;fica"/>';
	if (Tic==5) Text+=a+'moodle_32_32.jpg" WIDTH=32 HEIGHT=32 alt="Moodle"/>';
	// Desenvolupament
	var Des=this.Items[26].Items[2].Valor;
	if (Des==1) Text+=a+'teoria.jpg" WIDTH=19 HEIGHT=26 alt="teoria"/>';
	if (Des==3) Text+=a+'icona_codi.jpg" WIDTH=25 HEIGHT=20 alt="generador"/>';
	if (Des==4) Text+=a+'logo_didactica.gif" WIDTH=31 HEIGHT=23 alt="didactica"/>';
	if (Des==5) Text+=a+'link_turisme.jpg" WIDTH=27 HEIGHT=27 alt="turisme"/>';
	if (Des==6) Text+=a+'logo_manualitats.jpg" WIDTH=24 HEIGHT=21 alt="manualitats"/>';
	if (Des==9) Text+=a+'logo_premsa.gif" WIDTH=33 HEIGHT=28 alt="retall de premsa"/>';
	if (Des==15) Text+=a+'logo_competencies_basiques38_25.jpg" WIDTH=38 HEIGHT=25 alt="Compet&egrave;ncies b&agrave;siques"/>';
	if (Des==16) Text+=a+'dossier.gif" WIDTH=18 HEIGHT=18 alt="dossier"/>';
	if (Des==19) Text+=a+'problemes.png" WIDTH=18 HEIGHT=26 alt="problemes"/>';
	// Audiovisuals
	var Audiovis=this.Items[26].Items[4].Valor;
	if (Audiovis==1) Text+=a+'icona_sonor.gif" WIDTH=18 HEIGHT=18 alt="document sonor"/>';
	if (Audiovis==2) Text+=a+'icona_film.jpg" WIDTH=19 HEIGHT=19 alt="video"/>';
	if (Audiovis==3) Text+=a+'icona_google_maps_34_20.jpg" WIDTH=20 HEIGHT=34 alt="TooMapes"/>';
	// Transversal
	var Trans=this.Items[26].Items[5].Valor;
	if (Trans==8) Text+=a+'icona_humor.gif" WIDTH=15 HEIGHT=15 alt="humor"/>';
	if (Trans==9) Text+=a+'logo_art.jpg" WIDTH=18 HEIGHT=18 alt="art"/>';	
	if (Trans==10) Text+=a+'english.gif" WIDTH=18 HEIGHT=12 alt="English"/>';
	// Seguiment
	var Seguiment=this.Items[27].Items[1].Valor;
	if (Seguiment==2) Text+='<img src="collectiva2/logos/seguiment_simple.png" WIDTH=19 HEIGHT=24 alt="seguiment simple"/>';
	if (Seguiment==3) Text+='<img src="collectiva2/logos/seguiment_diari.jpg" WIDTH=24 HEIGHT=25 alt="seguiment diari"/>';	
	return(Text);
}

/************************************************************************************
*
* Activitat --> Gestió de l'enregistrament d'accions
* 
************************************************************************************/

Activitat.prototype.ActualitzarVisitaActivitat =function(CodiAccio) {
	GenerarRegistreEstadistic(CodiAccio,this.Items[1].Valor);
}

/************************************************************************************
*
* Activitat --> Gestió del cursor passant sobre l'activitat
* 
************************************************************************************/

Activitat.prototype.CursorSobreActivitat =function() {
	IluminarSelector(this.Id);
	//
	// De moment eliminat fins que trobi el problema
	//
	//if (this.AmbInfoPrevi==true) this.IniciVisualitzarInfoPrevi();
}

Activitat.prototype.CursorForaActivitat =function() {
	DesiluminarSelector(this.Id);
	//
	// De moment eliminat fins que trobi el problema
	//
	//if (this.AmbInfoPrevi==true) this.EliminarInfoPrevi();
}

Activitat.prototype.IniciVisualitzarInfoPrevi =function() {
	this.TempsInfoPrevi=1;
	this.CronoInfoPrevi();
}

Activitat.prototype.CronoInfoPrevi =function() {
	if (this.TempsInfoPrevi>0) {
		this.TempsInfoPrevi+=1;
		if (this.TempsInfoPrevi>=4) {
			this.VisualitzarInfoPrevi();
			this.TempsInfoPrevi=0;
			return;
		}
		setTimeout(this.Aqui+"CronoInfoPrevi()",1000);
	}
}

Activitat.prototype.VisualitzarInfoPrevi= function() {
	var Url="collectiva2/php/loadinfoprevi.php";	
	Url=AfegirParametreURIInicial(Url,"e",this.Items[25].Valor);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornCarregarInfoPreviBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCarregarInfoPreviMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Activitat.prototype.RetornCarregarInfoPreviBe =function(ContingutAJAX) {
	var FinestraPrevi=document.getElementById(this.NomDivUnic);
	if(FinestraPrevi) {
		FinestraPrevi.style.visibility="visible";
		FinestraPrevi.innerHTML=ContingutAJAX;	
	}
}

Activitat.prototype.RetornCarregarInfoPreviMal =function(ContingutAJAX) {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

Activitat.prototype.EliminarInfoPrevi =function(IdActivitat) {
	this.TempsInfoPrevi=0;
	var FinestraPrevi=document.getElementById(this.NomDivUnic); 
	if(FinestraPrevi) FinestraPrevi.style.visibility="hidden";
}

/***********************************************************************************\
*
* Activitat --> Entrar
*
************************************************************************************/

Activitat.prototype.Entrar = function() {
	// Rutina reescrivible
}

/***********************************************************************************\
*
* Activitat --> Menú contextual
*
************************************************************************************/

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Obrir Menú 
*
************************************************************************************/

Activitat.prototype.GenerarMenuContextual = function(event) {
	MyMenuContextual.Reset();
	MyMenuContextual.AfegirItem(Traduir(215),this.Aqui+"Copiar()",this.PermetreCopiar());			// "Copiar"
	MyMenuContextual.AfegirItem(Traduir(216),this.Aqui+"Moure()",this.PermetreMoure());			// "Moure"
	MyMenuContextual.AfegirItem(Traduir(217),this.Aqui+"Editar()",this.PermetreEditar());			// "Editar"
	MyMenuContextual.AfegirItem(Traduir(175),this.Aqui+"Eliminar()",this.PermetreEliminar());		// "Eliminar"
	MyMenuContextual.AfegirItem(Traduir(218),this.Aqui+"Linkar()",this.PermetreLinkar());			// "Enllaçar"
	MyMenuContextual.AfegirItem(Traduir(219),this.Aqui+"Referenciar()",this.PermetreReferenciar());		// "Referenciar"
	MyMenuContextual.AfegirItem(Traduir(203),this.Aqui+"CanviarVisualitzacio()",this.PermetreCanviarVisualitzacio());// "Visualització"
	MyMenuContextual.AfegirItem(Traduir(204),this.Aqui+"CanviarAutoria()",this.PermetreCanviarAutoria());	// "Autoria"
	MyMenuContextual.AfegirItem(Traduir(220),this.Aqui+"Anotar()",this.PermetreAnotar());			// "Anotar"
	MyMenuContextual.AfegirItem(Traduir(221),this.Aqui+"Comentar()",this.PermetreComentar());		// "Comentar"
	MyMenuContextual.AfegirItem(Traduir(222),this.Aqui+"AccedirLlibretaNotes()",this.PermetreAccedirLlibretaNotes());// "Llibreta de notes"
	MyMenuContextual.AfegirItem(Traduir(152),this.Aqui+"Seguiment()",this.PermetreSeguiment());		// "Seguiment"
	MyMenuContextual.AfegirItem("Punts",this.Aqui+"AccedirDiari()",this.PermetreAccedirDiari());		// "Diari"
	MyMenuContextual.AfegirItem("Diari",this.Aqui+"AccedirHistorial()",this.PermetreAccedirHistorial());	// "Historial"
	MyMenuContextual.Executar(event);
}

Activitat.prototype.PermetreSeguimentDiari = function() {
	return(false);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Copiar
*
************************************************************************************/

Activitat.prototype.Copiar = function() {
	var IdActivitat=this.Items[1].Valor;
	var Tipus=this.Items[14].Valor;
	var Nom=this.Items[11].Valor;
	MyPortadocuments.AfegirActivitat(IdActivitat,Tipus,Nom,1);
}

Activitat.prototype.PermetreCopiar = function() {
	if (NomUsuari=="") return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Canviar Visualització
*
************************************************************************************/

Activitat.prototype.CanviarVisualitzacio = function() {
	this.MyGestorVisualitzacio.CarregarVisualitzacio(this.Items[8].Valor);
	this.MyGestorVisualitzacio.ExecutarModal();
}

Activitat.prototype.PermetreCanviarVisualitzacio = function() {
	if (NomUsuari=="") return(false);
	if (this.Items[23].Valor!=1) return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Canviar Visualització --> Gestió de la visualització
*
************************************************************************************/

function GestorVisualitzacio(TheAqui) {
	Formulari.call(this,TheAqui,203);		// "Visualització"
	this.Items[0]=new EntradaHTML(TheAqui+"Items[0].",0);
	this.Items[0].Valor=Traduir(83)+":";	// "Selecciona"
	this.Items[1]=new EntradaSelector(TheAqui+"Items[1].",0);
	this.Items[1].AfegirNomOpcio(199);	// 0 --> "Visible"
	this.Items[1].AfegirNomOpcio(200);	// 1 --> "Invisible"
	this.Items[1].AfegirNomOpcio(201);	// 2 --> "Visible només a novetats"
	this.Items[1].AfegirNomOpcio(202);	// 3 --> "Invisible només a novetats"
	this.NomDivModal="FormulariModal2";
}
GestorVisualitzacio.prototype = new Formulari();

GestorVisualitzacio.prototype.CarregarVisualitzacio = function(TheVisualitzacio) {
	switch(TheVisualitzacio) {
		case '1': this.Items[1].Valor=0; break;
		case '4': this.Items[1].Valor=2; break;
		case '7': this.Items[1].Valor=3; break;
		default: this.Items[1].Valor=1;
	}
}

Activitat.prototype.UpdateVisualitzacio = function(NovaVisualitzacio) {
	var Url="";
	if (this.MyGestorVisualitzacio.Descarregar()==false) return;
	var NovaVisualitzacio=0;
	switch(this.MyGestorVisualitzacio.Items[1].Valor) {
		case 0: NovaVisualitzacio=1; break;
		case 1: NovaVisualitzacio=0; break;
		case 2: NovaVisualitzacio=4; break;
		case 3: NovaVisualitzacio=7; break;
	}
	if (NomUsuari=="") {
		this.GenerarMissatgeError(75);
		return;
	}
	Url="collectiva2/php/updatevis.php";	
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	Url=AfegirParametreURISecundari(Url,"vis",NovaVisualitzacio);
	var FuncioBe=this.Aqui+"RetornUpdateVisualitzacioBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornUpdateVisualtizacioMal()";
	this.MyGestorVisualitzacio.GenerarMissatgeInfo(97);	// "Enviant"
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Activitat.prototype.RetornUpdateVisualitzacioBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.MyGestorVisualitzacio.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.MyGestorVisualitzacio.GenerarMissatgeError(18);
		return;
	}
	this.MyGestorVisualitzacio.EliminarFormulariModal();
	ActualitzarFinestral(this.Items[1].Valor);
}

Activitat.prototype.RetornUpdateVisualitzacioMal =function(ContingutAJAX) {
	this.MyGestorVisualitzacio.GenerarMissatgeError(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Autoria
*
************************************************************************************/

Activitat.prototype.CanviarAutoria = function() {
	//this.MyGestorAutoria.CarregarVisualitzacio(this.Items[8].Valor);
	this.MyGestorAutoria.ExecutarModal();
}

Activitat.prototype.PermetreCanviarAutoria = function() {
	if (NomUsuari=="") return(false);
	if (this.Items[23].Valor!=1) return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Autoria --> Gestió de l'autoria
*
************************************************************************************/

function GestorAutoria(TheAqui) {
	Formulari.call(this,TheAqui,204);		// "Autoria"
	this.Items[0]=new EntradaHTML(TheAqui+"Items[0].",0);
	this.Items[0].Valor=Traduir(83)+":";	// "Selecciona"
	this.Items[1]=new EntradaSelector(TheAqui+"Items[1].",0);
	this.Items[1].AfegirNomOpcio(205);			// 0 --> "Jo mateix"
	this.Items[1].AfegirNomOpcio(206);			// 1 --> "Indeterminat"
	this.Items[1].AfegirNomOpcio(157);			// 2 --> "Usuari"
	this.Items[1].Items[2]=new EntradaIdentificador(this.Aqui+"Items[1].Items[2].",2); // "Identificador"
	this.NomDivModal="FormulariModal2";
}
GestorAutoria.prototype = new Formulari();

Activitat.prototype.UpdateAutoria = function() {
	if (this.MyGestorAutoria.Descarregar()==false) return;
	var NovaAutoria=this.MyGestorAutoria.Items[1].Valor;
	if (NomUsuari=="") {
		this.GenerarMissatgeError(75);
		return;
	}
	var Url="collectiva2/php/updateaut.php";	
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	Url=AfegirParametreURISecundari(Url,"aut",NovaAutoria);
	if(NovaAutoria==2) {
		Url=AfegirParametreURISecundari(Url,"c",this.MyGestorAutoria.Items[1].Items[2].Valor);
	}
	var FuncioBe=this.Aqui+"RetornUpdateAutoriaBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornUpdateAutoriaMal()";
	this.MyGestorAutoria.GenerarMissatgeInfo(97);	// "Enviant"
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Activitat.prototype.RetornUpdateAutoriaBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.MyGestorAutoria.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.MyGestorAutoria.GenerarMissatgeError(18);
		return;
	}
	this.MyGestorAutoria.EliminarFormulariModal();
	ActualitzarFinestral(this.Items[1].Valor);
}

Activitat.prototype.RetornUpdateAutoriaMal =function(ContingutAJAX) {
	this.MyGestorAutoria.GenerarMissatgeError(16);	// "Error de connexió"
}

/************************************************************************************
*
* Activitat --> Menú contextual --> Seguiment
*
************************************************************************************/

Activitat.prototype.Seguiment =function() {
	FinestraSeguimentDiari=Finestral.length;
	Finestral[FinestraSeguimentDiari]=new VisorSeguimentDiariUsuariActivitat(FinestraSeguimentDiari,this.IndexFinestra,this.Items[1].Valor); // "Seguiment diari"
	if (this.Items[23].Valor!=1) Finestral[FinestraSeguimentDiari].SelectorMode.Fix=true;
	Finestral[FinestraSeguimentDiari].Reset();
	Finestral[FinestraSeguimentDiari].Actualitzar();
	PassarAFinestra(FinestraSeguimentDiari);
}

Activitat.prototype.PermetreSeguiment = function() {
	if (NomUsuari=="") return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Moure
*
************************************************************************************/

Activitat.prototype.Moure = function() {
	var IdActivitat=this.Items[1].Valor;
	var Tipus=this.Items[14].Valor;
	var Nom=this.Items[11].Valor;
	MyPortadocuments.AfegirActivitat(IdActivitat,Tipus,Nom,3);
}

Activitat.prototype.PermetreMoure = function() {
	if (NomUsuari=="") return(false);
	if (this.Items[23].Valor!=1) return(false);
	// A novetats no es pot insertar nous elements. 
	if (Finestral[this.IndexFinestra].MySacActivitats.Mode==0) return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Referenciar
*
************************************************************************************/

Activitat.prototype.Referenciar = function() {
	var IdActivitat=this.Items[1].Valor;
	var Tipus=this.Items[14].Valor;
	var Nom=this.Items[11].Valor;
	MyPortadocuments.AfegirActivitat(IdActivitat,Tipus,Nom,2);
}

Activitat.prototype.PermetreReferenciar = function() {
	if (NomUsuari=="") return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Editar
*
************************************************************************************/

Activitat.prototype.Editar = function() {
	this.ExecutarModal();
}

Activitat.prototype.PermetreEditar = function() {
	if (NomUsuari=="") return(false);
	//
	// Si és una còpia no pot editar
	//
	if (this.Items[10].Valor!=this.Items[1].Valor) return(false);
	if (this.Items[23].Valor!=1) return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Eliminar
*
************************************************************************************/

Activitat.prototype.Eliminar = function() {
	var Aqui=this.Aqui+"ConfirmadorEliminacio.";
	this.ConfirmadorEliminacio= new Formulari(Aqui,0);
	this.ConfirmadorEliminacio.Items[0]=new EntradaHTML(Aqui+"Items[0].",0);
	this.ConfirmadorEliminacio.Items[0].Valor=Traduir(212); // "Confirmi l'eliminació del recurs";
	this.ConfirmadorEliminacio.Items[0].Valor+="<br/>";
	this.ConfirmadorEliminacio.Items[0].Valor+=this.Items[11].Valor;
	var FuncioEliminar=this.Aqui+"EliminarConfirmat()";
	this.ConfirmadorEliminacio.Items[1] = new EntradaSortidaModal(Aqui+"Items[1].",175,FuncioEliminar,Aqui);	// "Eliminar"
	this.ConfirmadorEliminacio.NomDivModal="FormulariModal2";
	this.ConfirmadorEliminacio.ExecutarModal();
}

Activitat.prototype.EliminarConfirmat = function() {
	if (NomUsuari=="") return;
	var Url="collectiva2/php/delactivitat.php";
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornEliminarBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornEliminarMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Activitat.prototype.PermetreEliminar = function() {
	if (NomUsuari=="") return(false);
	if (this.Items[23].Valor!=1) return(false);
	return(true);
}

Activitat.prototype.RetornEliminarBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		MissatgeModal(18);
		return;
	}
	this.ActualitzarVisitaActivitat(2);
	ActualitzarFinestral(this.Items[1].Valor);
}

Activitat.prototype.RetornEliminarMal =function(ContingutAJAX) {
	MissatgeModal(16);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Linkar
*
************************************************************************************/

Activitat.prototype.Linkar = function() {
	var Text="http://www.toomates.net?a=";
	Text+=this.Items[1].Valor;
	MissatgeModalText(Text);	
}

Activitat.prototype.PermetreLinkar = function() {
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Anotar
*
************************************************************************************/

Activitat.prototype.Anotar = function() {
	Finestral[this.IndexFinestra].AnotarActivitat(this.Items[1].Valor);
}

Activitat.prototype.PermetreAnotar = function() {
	if (NomUsuari=="") return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Comentar
*
************************************************************************************/

Activitat.prototype.Comentar = function() {
	Finestral[this.IndexFinestra].ComentarActivitat(this.Items[1].Valor);
}

Activitat.prototype.PermetreComentar = function() {
	if (NomUsuari=="") return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Obrir Llibreta de notes
*
************************************************************************************/

Activitat.prototype.AccedirLlibretaNotes = function() {
	var FinestraPuntuacions=Finestral.length;
	Finestral[FinestraPuntuacions]=new VisorPuntuacions(FinestraPuntuacions,this.IndexFinestra,this.Items[1].Valor);
	Finestral[FinestraPuntuacions].Reset();
	Finestral[FinestraPuntuacions].Actualitzar();
	PassarAFinestra(FinestraPuntuacions);
}

Activitat.prototype.PermetreAccedirLlibretaNotes = function() {
	if (NomUsuari=="") return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Diari
*
************************************************************************************/

Activitat.prototype.AccedirDiari = function() {
	FinestraSeguimentDiariActivitat=Finestral.length;
	Finestral[FinestraSeguimentDiariActivitat]=new VisorSeguimentDiariActivitat(FinestraSeguimentDiariActivitat,this.IndexFinestra,this.Items[1].Valor);
	Finestral[FinestraSeguimentDiariActivitat].Reset();
	Finestral[FinestraSeguimentDiariActivitat].Actualitzar();
	PassarAFinestra(FinestraSeguimentDiariActivitat);
}

Activitat.prototype.PermetreAccedirDiari = function() {
	if (NomUsuari=="") return(false);
	if (this.Items[23].Valor!=1) return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Menú contextual --> Historial
*
************************************************************************************/

Activitat.prototype.AccedirHistorial = function() {
	FinestraHistorial=Finestral.length;
	Finestral[FinestraHistorial]=new VisorHistorial(FinestraHistorial,this.IndexFinestra,this.Items[1].Valor,0);
	Finestral[FinestraHistorial].Reset();
	Finestral[FinestraHistorial].Actualitzar();
	PassarAFinestra(FinestraHistorial);
}

Activitat.prototype.PermetreAccedirHistorial = function() {
	if (NomUsuari=="") return(false);
	return(true);
}

/***********************************************************************************\
*
* Activitat --> Gestionar Puntuació
*
************************************************************************************/

Activitat.prototype.GenerarHTMLSeguimentPuntuacio = function() {
	//
	// El curs principal i les seves seccions i temes no tenen puntuació associada
	//
	if (this.Items[24].Valor==1 && (this.Items[14].Valor==4||this.Items[14].Valor==6||this.Items[14].Valor==7)) return("");
	var Text=this.Items[22].GenerarHTML();
	return(Text);
}

Activitat.prototype.Puntuar = function(NovaPuntuacio) {
	//	
	// Retorna false si no s'ha actualitzat el registre de nova puntuacio
	//
	if (NomUsuari=="") return(false);
	if(NovaPuntuacio<=0) return(false);
	//
	// Si fa un seguiment únic i la puntuació no és màxima no cal que envïi res.
	//
	if(this.Items[22].Valor>=NovaPuntuacio && this.TipusSeguiment()==2) return(false);
	if(this.Items[22].Valor<NovaPuntuacio) this.Items[22].Input(NovaPuntuacio);
	this.EnviarNovaPuntuacioMaxima(NovaPuntuacio);
	return(true);
}

Activitat.prototype.TipusSeguiment = function() {
	//
	// Determina el tipus de seguiment associat a l'activitat. 
	// Pot ser explícit o per defecte en funció del tipus d'element
	//
	var Mode=this.Items[27].Items[1].Valor;
	if (Mode==0) Mode=this.DeterminarModeSeguimentPerTipus();
	return(Mode);
}

Activitat.prototype.DeterminarModeSeguimentPerTipus = function() {
	//
	// Aquesta rutina té una còpia idèntica a kernel.php (php)
	// Cal mantenir la coherència en tot moment.
	//
	var Tipus=this.Items[14].Valor;
	switch (Tipus) {
	        case 1: return(1);          	// Arxiu: Sense seguiment.
	        case 2: return(1);          	// Link: Sense seguiment.
	        case 3: return(2);          	// Arxiu Quètxup Old: Seguiment únic.
	        case 4: return(1);          	// Curs: Sense seguiment.
	        case 5: return(1);          	// EtiquetaCurs: Sense seguiment.
	        case 6: return(4);          	// Secció: Seguiment ADALT I ABAIX
	        case 7: return(4);          	// Tema: Seguiment únic ADALT I ABAIX
	        case 8: return(1);          	// Vídeo: Sense seguiment.
	        case 9: return(1);          	// ImatgeHTML: Sense seguiment.
	        case 10: return(1);          	// Anotació: Sense seguiment.
	        case 11: return(1);          	// Comentari: Sense seguiment.
	        case 12: return(1);          	// ---
	        case 13: return(1);          	// ---
	        case 14: return(1);          	// Resum puntuacions: Sense Seguiment.
	        case 15: return(1);          	// Data: Sense seguiment.
	        case 16: return(1);          	// Nom: Sense seguiment.
	        case 17: return(1);          	// Text: Sense seguiment.
	        case 18: return(1);          	// Referència: Sense seguiment.
	        case 19: return(2);          	// Exercici antic: Seguiment únic.
	        case 20: return(2);          	// Arxiu Quètxup: Seguiment únic.
	        case 21: return(2);          	// Activitat Quètxup antiga: Seguiment únic
	        case 22: return(2);          	// Esquema: Seguiment únic.
	        case 23: return(1);          	// Imatge: Sense seguiment.
	        case 24: return(1);          	// Icona: Sense seguiment.
	        case 25: return(1);          	// ---
	        case 26: return(2);          	// Exercici autogenerat: Seguiment únic.
	        case 27: return(2);          	// Compilació d'exercicis: Seguiment únic.
	        case 28: return(1);          	// ---
	        case 29: return(2);          	// Exercici: Seguiment únic.
	}
	return(1); // si no diu res, sense seguiment.
}

Activitat.prototype.EnviarNovaPuntuacioMaxima = function(NovaPuntuacio) {
	MissatgeSeguiment("Actualitzant la puntuació de l'activitat...");
	var Url="collectiva2/php/puntuaractivitat.php";
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"p",NovaPuntuacio);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornPuntuarActivitatBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornPuntuarActivitatMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Activitat.prototype.RetornPuntuarActivitatBe =function(ContingutAJAX) {
	var CodiResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiResposta!=0) {
		MissatgeModal(CodiResposta);
		return;
	}
	CodiResposta=GestionarOKRespostaPHP(ContingutAJAX);
	if (CodiResposta==0) {
		LogError(6252);	// Activitat.prototype.RetornPuntuarActivitatBe
		return;
	}	
	if(this.CalActualitzarFinestralPerNovaPuntuacio(CodiResposta)) {
		this.ActualitzarVisitaActivitat(6);
		ActualitzarFinestral(this.Items[1].Valor);
	}
}

Activitat.prototype.CalActualitzarFinestralPerNovaPuntuacio =function(Codi) {
	switch(parseFloat(Codi)) {
		case 1: // No fa res perquè l'activitat no té seguiment
			return(false);
		case 2:	//Millora la puntuació màxima absoluta (seguiment 1)
			return(true);
		case 3: // No millora la puntuació màxima absoluta (seguiment 1)
			return(false);
		case 4: // Primera puntuació màxima absoluta (seguiment 1)
			return(true);
		case 5: // Millora la puntuació màxima d'avui (seguiment 2)
			return(true);
		case 6: // No millora la puntuació màxima d'avui (seguiment 2)
			return(false);
		case 7: // Primera puntuació màxima d'avui (seguiment 2)
			return(true);
		case 8: //Baixa la puntuació màxima que tenia (seguiment 3)
			return(true);
		case 9: // Iguala la puntuació màxima que tenia (seguiment 3)
			return(false);
		case 10:// Millora la puntuació màxima que tenia (seguiment 3)
			return(false);
		case 11:// Primer valor enregistrat (seguiment 3)
			return(true);
	}
	LogError(6286);
}

Activitat.prototype.RetornPuntuarActivitatMal =function() {
	MissatgeModal(120);	// "No s'ha pogut gravar la puntuació
}

/***********************************************************************************\
*
* Activitat --> Arxiu	(1)
* 
************************************************************************************/

function ActivitatArxiu(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(25);	// "Arxiu"
	this.Items[14].Valor=1;	// Tipus = 1 (arxiu)
}
ActivitatArxiu.prototype = new Activitat();

ActivitatArxiu.prototype.GenerarHTML1D = function(Mode) {
	var Text="";
	Text='<a ';
	Text+=' href="';
	Text+=this.Items[12].Valor;		// Url
	Text+='" target="_blank"; ';
	//
	// Afegim els events de ratolí
	//
	var FuncioOnMouseOver=this.Aqui+"CursorSobreActivitat()";
	Text+=' onmouseover ="'+FuncioOnMouseOver+';"';
	var FuncioOnMouseOut=this.Aqui+"CursorForaActivitat()";
	Text+=' onmouseout ="'+FuncioOnMouseOut+';"';
	FuncioOnClick=this.Aqui+"ActualitzarVisitaActivitat(1)"; // Onclick és generar estadística entrada
	Text+=' onclick="'+FuncioOnClick+';" ';
	var FuncioOnMenu="GenerarMenuContextual(event)";
	Text+=' oncontextmenu ="'+this.Aqui+FuncioOnMenu+';"';
	//
	// Afegim l'estil
	//
	Text+=' style="cursor: pointer; color: blue; text-decoration:none; ';
	if(this.ActivitatInvisible()==true) Text+=' background-color:#cccccc; ';
	Text+='"';
	Text+=">";	
	//
	// Afegim el nom
	//
	Text+=this.GenerarHTMLNom();
	Text+="</a>";
	//
	// Afegim les icones
	//
	Text+=this.GenerarHTMLIcones();
	//
	// Afegim la informació de seguiment de puntuació
	//
	Text+=this.GenerarHTMLSeguimentPuntuacio();
	//
	// I per últim una finestreta invisible per a visualitzar la infoprevi
	//
	this.NomDivUnic=MyCodiDivUnico.NouCodi("PREVIS");
	if (this.AmbInfoPrevi==true) {
		Text+='<span id="'+ this.NomDivUnic+ '" class="previsualitzacio"></span>';	
		Text+="</span>";
	}
	return(Text);
}

ActivitatArxiu.prototype.GenerarHTMLIconaActivitat = function() {
	var Text="";
	var Extensio="";
	var MyCutter=new Cutter(this.Items[12].Valor,".");
	while (!MyCutter.Final) {
		Extensio=MyCutter.Tallar();
	}
	switch(Extensio) {
		case "doc": this.IconaActivitat=new Imatge("collectiva2/logos/","icona_document.jpg","document word",17,18); break;
		case "xls": this.IconaActivitat=new Imatge("collectiva2/logos/","icona_full_calcul.jpg","full de c&agrave;lcul",18,18); break;
		case "pdf": this.IconaActivitat=new Imatge("collectiva2/logos/","logo_pdf.gif","document pdf",18,18); break;
		case "ppt": this.IconaActivitat=new Imatge("collectiva2/logos/","icona_presentacio.jpg","presentaci&oacute;",18,18); break;
		case "sxw": this.IconaActivitat=new Imatge("collectiva2/logos/","icona_oo_writer.gif","document openoffice writer",16,16); break;
		case "odt": this.IconaActivitat=new Imatge("collectiva2/logos/","icona_oo_writer.gif","document openoffice writer",16,16); break;
		default: return("");
	}
	return (this.IconaActivitat.GenerarHTML());
}

ActivitatArxiu.prototype.CarregarCampURL = function(Contingut) {
	this.Items[12].InputURL(Contingut);
}

/***********************************************************************************\
*
* Activitat --> Link	(2)
* 
************************************************************************************/

function ActivitatLink(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(76);	// "Link"
	this.Items[14].Valor=2;
	this.Items[12].Valor="http://";
	this.IconaActivitat=new Imatge("collectiva2/logos/","link_extern.jpg","link",21,23);
}
ActivitatLink.prototype = new Activitat();

ActivitatLink.prototype.GenerarHTML1D = function(Mode) {
	var Text="";
	Text='<a ';
	Text+=' href="';
	Text+=this.Items[12].Valor;		// Url
	Text+='" target="_blank"; ';
	//
	// Afegim els events de ratolí
	//
	var FuncioOnMouseOver=this.Aqui+"CursorSobreActivitat()";
	Text+=' onmouseover ="'+FuncioOnMouseOver+';"';
	var FuncioOnMouseOut=this.Aqui+"CursorForaActivitat()";
	Text+=' onmouseout ="'+FuncioOnMouseOut+';"';
	FuncioOnClick=this.Aqui+"ActualitzarVisitaActivitat(1)"; // Onclick és generar estadística entrada
	Text+=' onclick="'+FuncioOnClick+';" ';
	var FuncioOnMenu="GenerarMenuContextual(event)";
	Text+=' oncontextmenu ="'+this.Aqui+FuncioOnMenu+';"';
	//
	// Afegim l'estil
	//
	Text+=' style="cursor: pointer; color: blue; text-decoration:none; ';
	if(this.ActivitatInvisible()==true) Text+=' background-color:#cccccc; ';
	Text+='"';
	Text+=">";	
	//
	// Afegim el nom
	//
	Text+=this.GenerarHTMLNom();
	Text+="</a>";
	//
	// Afegim les icones
	//
	Text+=this.GenerarHTMLIcones();
	//
	// Afegim la informació de seguiment de puntuació
	//
	Text+=this.GenerarHTMLSeguimentPuntuacio();
	//
	// I per últim una finestreta invisible per a visualitzar la infoprevi
	//
	this.NomDivUnic=MyCodiDivUnico.NouCodi("PREVIS");
	if (this.AmbInfoPrevi==true) {
		Text+='<span id="'+ this.NomDivUnic+ '" class="previsualitzacio"></span>';	
		Text+="</span>";
	}
	return(Text);
}

ActivitatLink.prototype.CarregarCampURL = function(Contingut) {
	this.Items[12].InputURL(Contingut);
}

/***********************************************************************************\
*
* Activitat --> Curs	(4)
* 
************************************************************************************/

function ActivitatCurs(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(158); // "Curs"
	this.Items[14].Valor=4;
	this.Items[12]=new EntradaIdentificador(TheAqui+"Items[12].",2); // "Identificador (login)"
	this.Items[12].NoPotSerBuit=true;
	this.Items[12].NomURL="log";
	this.Items[13]=new EntradaPasswordCurs(TheAqui+"Items[13].",159); // "Password (Opcional)"
	this.Items[13].NomURL="pas";
	this.Items[26].Invisible=true;	// No té descripció didàctica
	this.IconaActivitat=new Imatge("collectiva2/logos/","curs.jpg","curs",18,17);
}
ActivitatCurs.prototype = new Activitat();

ActivitatCurs.prototype.Entrar = function() {
	Finestral[6].RecarregarActivitat(this.Items[12].Valor);
	PassarAFinestra(6);
	this.ActualitzarVisitaActivitat(1);
}

/***********************************************************************************\
*
* Activitat --> Etiqueta de Secció	(6)
* 
************************************************************************************/

function ActivitatSeccio(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(77);	// "Secció"
	this.Items[14].Valor=6;
	this.Items[12].Invisible=true;
	this.Items[26].Invisible=true;	// No té descripció didàctica
}
ActivitatSeccio.prototype = new Activitat();

ActivitatSeccio.prototype.Entrar = function() {
	Finestral[this.IndexFinestra].RecarregarActivitat(this.Items[1].Valor);
}

/***********************************************************************************\
*
* Activitat --> Etiqueta de Tema	(7)
* 
************************************************************************************/

function ActivitatTema(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(79);	// "Tema"
	this.Items[12].Invisible=true;
	this.Items[14].Valor=7;
	this.Items[26].Invisible=true;	// No té descripció didàctica
}
ActivitatTema.prototype = new Activitat();

ActivitatTema.prototype.Entrar = function() {
	Finestral[this.IndexFinestra].RecarregarActivitat(this.Items[1].Valor);
}

/***********************************************************************************\
*
* Activitat --> ImatgeHTML	(9)
* 
************************************************************************************/

function ActivitatImatgeHTML(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(186);	// "Imatge HTML"
	this.Items[14].Valor=9;
	this.AmbInfoPrevi=false;
}
ActivitatImatgeHTML.prototype = new Activitat();

ActivitatImatgeHTML.prototype.GenerarHTML1D = function(Mode) {
	// En mode Entrar es visualitza la imatge.
	var Text=TreureNomesQuot(this.Items[12].Valor);
	return (Text);	
}

/***********************************************************************************\
*
* Activitat --> Anotació	(10)
* 
************************************************************************************/

function ActivitatAnotacio(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(80);	// "Nota"
	this.Items[14].Valor=10;
	this.Items[26].Invisible=true;	// No té descripció didàctica
	this.Items[12].TextArea=true;
	this.Items[12].Nom=Traduir(81);	// Contingut
	this.ActivitatSecundaria=true;
	this.URLAfegirNovaActivitat="collectiva2/php/novaactsec.php";
	this.AmbInfoPrevi=false;
	this.IconaActivitat=new Imatge("collectiva2/logos/","anotacio.png","Anotaci&oacute;",17,17);
}
ActivitatAnotacio.prototype = new Activitat();

ActivitatAnotacio.prototype.GenerarHTML1D = function() {
	var Text="";
	var NomTancada='REF_TANCADA_'+this.Items[1].Valor;
	var NomOberta='REF_OBERTA_'+this.Items[1].Valor;
	Text+='<span id='+NomTancada+'>';
	Text+='<span style="cursor: pointer; ';
	Text+=' color: blue; text-decoration: underline;"';
	Text+=' onclick="'+this.Aqui+'ObrirNota(';
	Text+="'"+NomTancada+"','"+NomOberta+"'"+ ');">';
	Text+="<small><small>";
	var Nom=decodeURIComponent(this.GenerarHTMLNom());
	Text+=Nom;
	Text+="</small></small>";
	Text+="</span>";
	Text+="</span>";
	Text+='<span id='+NomOberta+' style="display:none">';
	Text+='<span>';
	Text+="<small>"+decodeURIComponent(this.Items[12].Valor)+"</small>";
	Text+="</span>";
	Text+="</span>";
	Text+=this.GenerarHTMLIcones();
	return (Text);	
}

ActivitatAnotacio.prototype.ObrirNota =function(NomTancada,NomOberta) {
	var Div=document.getElementById(NomTancada);
	Div.style.display="none";
	var Div=document.getElementById(NomOberta);
	Div.style.display="inline";
}

/***********************************************************************************\
*
* Activitat --> Comentari	(11)
* 
************************************************************************************/

function ActivitatComentari(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.Items[26].Invisible=true;	// No té descripció didàctica
	this.Items[14].Valor=11;
	this.Items[12].TextArea=true;
	this.Items[12].Nom=Traduir(81);	// Contingut
	this.TitolF=Traduir(82);	// "Comentari"
	this.ActivitatSecundaria=true;
	this.ContingutCarregat=false;
	this.URLAfegirNovaActivitat="collectiva2/php/novaactsec.php";
	this.Index=1;	
	this.IconaActivitat=new Imatge("collectiva2/logos/","comentari.png","Comentari",16,18);
}
ActivitatComentari.prototype = new Activitat();

ActivitatComentari.prototype.GenerarHTML1D = function(Mode) {
	var Text="";
	if (this.Index==1) Text+="&nbsp;";
	Text+='<span ';
	var StyleGeneral="cursor: pointer; color: green; text-decoration: underline;";
	Text+='style="'+StyleGeneral+'"';
	var AccioOnClick="Entrar()";
	Text+=' onclick="'+this.Aqui+AccioOnClick+';" ';
	//var AccioOnMouseOver="IniciVisualitzarInfoPrevi('"+NomDivUnic+"')";
	//Text+=' onmouseover ="'+this.Aqui+AccioOnMouseOver+';"';
	//var AccioOnMouseOut="EliminarInformacioPrevi('"+NomDivUnic+"')";
	//Text+=' onmouseout ="'+this.Aqui+AccioOnMouseOut+';"';
	var FuncioOnMenu="GenerarMenuContextual(event)";
	Text+=' oncontextmenu ="'+this.Aqui+FuncioOnMenu+';"';
	Text+="><small><sup>";
	Text+="<b>["+this.Index+"]</b>";
	Text+="</sup></small></span>";
	return(Text);
}

ActivitatComentari.prototype.Entrar = function() {	
	//
	// Carreguem el contingut del comentari
	//
	if (this.ContingutCarregat==true) {
		this.VisualitzarComentariEnModal();
		return;
	}
	var Url="collectiva2/php/loadcoment.php";
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);
	if (this.ContingutCarregat==true) {
		this.VisualitzarComentariEnModal();
		return;
	}
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornCarregarContingutComentariBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCarregarContingutComentariMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

ActivitatComentari.prototype.RetornCarregarContingutComentariBe =function(ContingutAJAX) {
	this.Items[12].InputURL(ContingutAJAX);
	this.ContingutCarregat=true;
	this.VisualitzarComentariEnModal();
}

ActivitatComentari.prototype.RetornCarregarContingutComentariMal =function() {
	MissatgeModal(16);
}

ActivitatComentari.prototype.VisualitzarComentariEnModal =function() {
	this.ExecutarModal();
}

/***********************************************************************************\
*
* Activitat --> Data	(15)
* 
************************************************************************************/

function ActivitatData(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.Items[14].Valor=15;
	this.AmbInfoPrevi=false;
}
ActivitatData.prototype = new Activitat();

ActivitatData.prototype.GenerarHTML1D = function() {
	var Color="#ffebd2";
	var Text='<br/><div style="background-color:'+Color+'" >';
	Text+=this.GenerarHTMLNom();
	Text+="</div>";
	return (Text);
}

/***********************************************************************************\
*
* Activitat --> Nom	(16)
*
************************************************************************************/

function ActivitatNom(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.Items[14].Valor=16;
	this.AmbInfoPrevi=false;
}
ActivitatNom.prototype = new Activitat();

ActivitatNom.prototype.GenerarHTML1D = function() {
	var Text="";
	Text+='<small><span style="color: green; font-size:70%; ">'+Traduir(189);
	Text+="&nbsp;"+this.GenerarHTMLNom()+'</span></small>';
	return (Text);
}

/***********************************************************************************\
*
* Activitat --> Text	(17)
* 
************************************************************************************/

function ActivitatText(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.Items[26].Invisible=true;		// No té descripció didàctica
	this.Items[12].TextArea=true;
	this.Items[12].Nom=Traduir(81);		// Contingut
	this.Items[14].Valor=17;
	this.AmbInfoPrevi=false;
}
ActivitatText.prototype = new Activitat();

ActivitatText.prototype.GenerarHTML1D = function() {
	var Text='<span class="FinestraText"';
	Text+=' oncontextmenu ="'+this.Aqui+'GenerarMenuContextual(event);"';	
	Text+=" >";
	Text+=decodeURIComponent(this.Items[12].Valor);
	Text+="</span>";
	return (Text);	
}

/***********************************************************************************\
*
* Activitat --> Referència	(18)
* 
************************************************************************************/

function ActivitatReferencia(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(164);	// "Referència"
	this.Items[12].Invisible=true;
	this.Items[14].Valor=18;
	this.Items[26].Invisible=true;
	this.IconaActivitat=new Imatge("collectiva2/logos/","autoref_16_17.png","Autorefer&egrave;ncia",16,17);
}
ActivitatReferencia.prototype = new Activitat();

ActivitatReferencia.prototype.Entrar = function() {
	Finestral[this.IndexFinestra].RecarregarActivitat(this.Items[12].Valor);
}

/***********************************************************************************\
*
* Activitat Imatge (23)
*
************************************************************************************/

function ActivitatImatge(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(187);	// "Imatge"
	this.Items[14].Valor=23;
	this.Items[12].Nom=Traduir(153);		// "Descripció"
	this.Items[12].Valor="QUETXUPIMG(Nom_arxiu,Altura_pixels,Amplada_pixels)"
	this.AmbInfoPrevi=false;
}
ActivitatImatge.prototype = new Activitat();

ActivitatImatge.prototype.GenerarHTML1D = function() {
	// En mode Entrar es visualitza la imatge.
	var Text='<span oncontextmenu ="'+this.Aqui+'GenerarMenuContextual(event);">';	
	Text+=DecodeQuetxup(this.Items[12].Valor,"");
	Text+="</span>";
	return (Text);	
}

/***********************************************************************************\
*
* Portadocuments
* 
************************************************************************************/

function AssenyaladorActivitat(TheIdActivitat,TheTipus,TheNom,TheAccio,TheIndex) {
	this.Index=TheIndex;
	this.IdActivitat=TheIdActivitat;
	this.TipusActivitat=TheTipus;
	this.NomActivitat=TheNom;
	this.AccioAssociada=TheAccio;		// 1 --> Copiar activitat
						// 2 --> Referenciar activitat
}

AssenyaladorActivitat.prototype.GenerarHTML = function() {
	var Text="";
	Text+=this.GenerarHTMLAccioAssociada();
	Text+=this.GenerarHTMLNomActivitat();
	Text+=this.GenerarHTMLTipusActivitat();
	Text+="&nbsp;&nbsp;";
	Text+=this.GenerarHTMLBotoEnganxar();
	Text+="&nbsp;";
	Text+=this.GenerarHTMLBotoCancellar();
	return(Text);
}

AssenyaladorActivitat.prototype.GenerarHTMLAccioAssociada = function() {
	var Text="";
	switch(this.AccioAssociada) {
		case 1:Text+="Còpia de"; break;
		case 2:Text+="Referència a"; break;
		case 3:Text+="Retall de"; break;
		default:alert("Acció no determinada");
	}
	Text+="&nbsp;";
	return(Text);
}

AssenyaladorActivitat.prototype.GenerarHTMLNomActivitat = function() {
	var Text="";
	Text+=this.NomActivitat;
	return(Text);
}

AssenyaladorActivitat.prototype.GenerarHTMLTipusActivitat = function() {
	var Text="<small><sup>&nbsp;(";
	switch(this.TipusActivitat) {
		case 1: Text+="Arxiu"; break;
		case 2: Text+="Link"; break;
		case 7: Text+="Tema"; break;
		case 6: Text+="Secció"; break;
		default: Text+="Activitat";
	}
	Text+=")</sup></small>";
	return(Text);
}

AssenyaladorActivitat.prototype.GenerarHTMLBotoEnganxar = function() {
	var Text="";
	var Funcio="";
	var NomBoto="";
	switch(this.AccioAssociada) {
		case 1:	Funcio="MyPortadocuments.EnganxarCopia("+this.Index+")";
			NomBoto="Enganxar";
			break;
		case 2:	Funcio="MyPortadocuments.EnganxarReferencia("+this.Index+")";
			NomBoto="Enganxar";
			break;
		case 3:	Funcio="MyPortadocuments.EnganxarActivitatMoguda("+this.Index+")";
			NomBoto="Enganxar";
			break;
		default: alert("Acció no determinada");
	}
	Text+=GenerarSelector(NomBoto,Funcio);
	return(Text);
}

AssenyaladorActivitat.prototype.GenerarHTMLBotoCancellar = function() {
	var Text="";
	var Funcio="MyPortadocuments.EliminarEntrada("+this.Index+")";
	Text+=GenerarSelector("Cancel·lar",Funcio);
	return(Text);
}

function Portadocuments() {
	this.Activitats=new Array();	// Array d'AssenyaladorActivitat
	this.AssenyaladorActiu=false;
	this.IndexAssenyaladorActiu=0;
}

Portadocuments.prototype.Refrescar = function() {
	var DivPortadocuments=document.getElementById('PORTADOCUMENTS');
	var Contingut=this.GenerarHTML();
	if (Contingut!="") {
		DivPortadocuments.style.visibility="visible";
		DivPortadocuments.innerHTML=Contingut;
	}
	else {
		DivPortadocuments.innerHTML="";
		DivPortadocuments.style.visibility="hidden";	
	}
}

Portadocuments.prototype.GenerarHTML = function() { 
	if(this.Activitats.length==0) return("");
	var LlistatActivitats="";
	for (var i=0;i<this.Activitats.length;i++) {
		if (this.Activitats[i]!=null) {
			var a=this.Activitats[i].GenerarHTML();
			if (a!="") LlistatActivitats+=a+"<br/>";
		}
	}
	if (LlistatActivitats=="") return("");
	var Text=Traduir(123);
	Text+="<br />";
	Text+='<table><tr><td style="width: 10%;"></td>';
	Text+='<td style="width: 90%;">';
	Text+=LlistatActivitats;
	Text+="</td></tr></table>";	
	Text+="<br />";
	return(Text);
}

Portadocuments.prototype.TipusAccio = function() {
	//
	// Retorna el tipus d'acció que està demanant el portadocuments
	// 0 --> Cap
	// 1 --> Enganxar còpia d'activitat
	// 2 --> Enganxar activitat moguda
	// 3 --> Enganxar referència a activitat
	if(this.AssenyaladorActiu==false) return(0);
	if(this.Activitats[this.IndexAssenyaladorActiu]) return(this.Activitats[this.IndexAssenyaladorActiu].AccioAssociada);
	return(0);
}

Portadocuments.prototype.IdActivitatActiva = function() {
	//
	// Retorna la id de l'activitat activa del portadocuments o 0 si no n'hi ha cap.
	//
	if(this.AssenyaladorActiu==false) return(0);
	if(this.Activitats[this.IndexAssenyaladorActiu]) return(this.Activitats[this.IndexAssenyaladorActiu].IdActivitat);
	return(0);
}

Portadocuments.prototype.NomActivitatActiva = function() {
	//
	// Retorna el nom de l'activitat activa del portadocuments o "" si no n'hi ha cap.
	//
	if(this.AssenyaladorActiu==false) return("");
	if(this.Activitats[this.IndexAssenyaladorActiu]) return(this.Activitats[this.IndexAssenyaladorActiu].NomActivitat);
	return("");
}

Portadocuments.prototype.EliminarEntrada = function(IndexEntrada) {
	this.Activitats[IndexEntrada]=null;
	this.Refrescar();
}

Portadocuments.prototype.AfegirActivitat = function(TheIdActivitat,TheTipus,TheNom,TheAccio) {
	if (this.ActivitatJaEstaAlPortadocuments(TheIdActivitat)) {
		MissatgeModal(122);	// "Ja està al portadocuments"
		return;
	}
	var p=this.Activitats.length;
	this.Activitats[p]=new AssenyaladorActivitat(TheIdActivitat,TheTipus,TheNom,TheAccio,p);
	this.Refrescar();
}

Portadocuments.prototype.ActivitatJaEstaAlPortadocuments = function(TheIdActivitat) {
	for (var i=0;i<this.Activitats.length;i++) {
		if (this.Activitats[i]!=null) {
			if (this.Activitats[i].IdActivitat==TheIdActivitat) return(true);
		}
	}
	return(false);
}

Portadocuments.prototype.EnganxarCopia = function(TheIndexActivitat) {
	this.AssenyaladorActiu=true;
	this.IndexAssenyaladorActiu=TheIndexActivitat;
	var IdActivitat=this.Activitats[TheIndexActivitat].IdActivitat;
	Finestral[FinestraActual].EnganxarCopiaDesDePortadocuments(IdActivitat);
}

Portadocuments.prototype.EnganxarActivitatMoguda = function(TheIndexActivitat) {
	this.AssenyaladorActiu=true;
	this.IndexAssenyaladorActiu=TheIndexActivitat;
	var IdActivitat=this.Activitats[TheIndexActivitat].IdActivitat;
	Finestral[FinestraActual].EnganxarActivitatMogudaDesDePortadocuments(IdActivitat);
}

Portadocuments.prototype.NoEsFinestraAmbActivitats = function() {
	if (Finestral[FinestraActual].MySacActivitats) return(false);
	return(true);
}

Portadocuments.prototype.DesactivarAccio = function() {
	//
	// Cancel·la una acció des d'una finestra que no pot rebre l'activitat, però no elimina
	// l'activitat del portadocuments
	//
	if(this.AssenyaladorActiu==false) return;
	this.AssenyaladorActiu=false;
	this.Refrescar();
}

Portadocuments.prototype.EliminarAccio = function() {
	//
	// Elimina l'activitat assenyalada al portadocuments (quan s'ha realitzat l'acció d'enganxar)
	//
	if(this.AssenyaladorActiu==false) return;
	this.AssenyaladorActiu=false;
	this.EliminarEntrada(this.IndexAssenyaladorActiu);
	this.Refrescar();
}

Portadocuments.prototype.EnganxarReferencia = function(TheIndexActivitat) {
	this.AssenyaladorActiu=true;
	this.IndexAssenyaladorActiu=TheIndexActivitat;
	var IdActivitat=this.Activitats[TheIndexActivitat].IdActivitat;
	Finestral[FinestraActual].EnganxarReferencia(IdActivitat);
}

/***********************************************************************************\
*
* SacActivitats
*
************************************************************************************/

function SacActivitats(TheIndexFinestra,TheAqui,TheActivitats,TheModeCarrega) {
	this.IndexFinestra=TheIndexFinestra;
	this.Aqui=TheAqui;
	this.Activitats=new Array();
	this.ModeCarrega=TheModeCarrega;
	if(!TheActivitats) return;
	for (var i=0;i<TheActivitats.length;i++) {
		var Tipus=TheActivitats[i][13];
		this.AfegirNovaActivitat(Tipus,TheActivitats[i]);
	}
	this.GestionarPuntuarActivitatCentral();
}

SacActivitats.prototype.AfegirNovaActivitat = function(Tipus,ObjecteJSONContingut) {
	var p=this.Activitats.length;
	var i=this.IndexFinestra;
	var a=this.Aqui+"Activitats["+p+"].";
	switch (Tipus) {
		case 1: this.Activitats[p]=new ActivitatArxiu(i,a); break;
		case 2: this.Activitats[p]=new ActivitatLink(i,a); break;
		case 3: this.Activitats[p]=new ActivitatArxiuQuetxupOld(i,a); break;
		case 4: this.Activitats[p]=new ActivitatCurs(i,a); break;	
	//	case 5: this.Activitats[p]=new ActivitatEtiquetaCurs(i,a); break;
		case 6: this.Activitats[p]=new ActivitatSeccio(i,a); break;
		case 7: this.Activitats[p]=new ActivitatTema(i,a); break;
	//	case 8: this.Activitats[p]=new ActivitatVideo(i,a); break;
		case 9: this.Activitats[p]=new ActivitatImatgeHTML(i,a); break;
		case 10:this.Activitats[p]=new ActivitatAnotacio(i,a);	break;
		case 11:this.Activitats[p]=new ActivitatComentari(i,a); break;
	//	case 14:this.Activitats[p]=new ActivitatResumPuntuacions(i,a); break;
		case 15:this.Activitats[p]=new ActivitatData(i,a); break;
		case 16:this.Activitats[p]=new ActivitatNom(i,a); break;
		case 17:this.Activitats[p]=new ActivitatText(i,a); break;
		case 18:this.Activitats[p]=new ActivitatReferencia(i,a); break;
		case 19:this.Activitats[p]=new ActivitatExerciciAntic(i,a); break;
		case 20:this.Activitats[p]=new ActivitatArxiuQuetxup(i,a); break;
		case 21:this.GestionarElementTipus21(p,i,a,ObjecteJSONContingut); break;
		case 22:this.Activitats[p]=new ActivitatEsquema(i,a); break;
		case 23:this.Activitats[p]=new ActivitatImatge(i,a); break;
		case 24:this.Activitats[p]=new ActivitatIcona(i,a); break;
		case 25:this.Activitats[p]=new Activitat(i,a); break;
		case 26:this.Activitats[p]=new ActivitatExerciciAutoGenerat(i,a); break;
		case 27:this.Activitats[p]=new ActivitatCompilacioExercicis(i,a); break;
		case 29:this.Activitats[p]=new ActivitatExercici(i,a); break;
		default:this.Activitats[p]=new Activitat(i,a); break;
	}
	if (Tipus!=21 && ObjecteJSONContingut!=undefined ) this.Activitats[p].CarregarActivitatPerJSON(ObjecteJSONContingut);		
	return(p);
}

SacActivitats.prototype.GestionarElementTipus21 = function(p,i,a,ObjecteJSONContingut) {
	var Text="";
	var CadenaParam=ObjecteJSONContingut[11];
	//
	// Els elements de tipus 21 poden ser de dos tipus, 26 o 27
	if (CadenaParam==""||CadenaParam==undefined) return;
	var CadenaParametres=decodeURIComponent(CadenaParam);
	// Paràmetre "g" : Nom de l'objecte Joc (Llista, Contrarellotge, Enigma, Parelles1 ...)
	var NomJoc=ExtreureParametreURIDeCadena("g",CadenaParametres);
	// Paràmetre "p" : 	=1 --> Permet practicar amb el joc
	var Permetre=ExtreureParametreURIDeCadena("p",CadenaParametres);
	// Paràmetre "t" : Segons de temps per a completar el joc (0 = infinit)
	var SegonsJoc=ExtreureParametreURIDeCadena("t",CadenaParametres);
	// Paràmetre "f" : Nom de l'arxiu d'exercicis
	var ArxiuQuetxup=decodeURIComponent(ExtreureParametreURIDeCadena("f",CadenaParametres));
	// Paràmetre "a" : Activitat amb els exercicis
	var Activitat=ExtreureParametreURIDeCadena("a",CadenaParametres);
	// Paràmetre "b" : Nom del generador d'exercicis (Bewoom, Puzzle, Equacions...)
	var Generador=ExtreureParametreURIDeCadena("b",CadenaParametres);
	// Paràmetre "c" : Codi de configuració del generador d'exercicis
	var Codi=ExtreureParametreURIDeCadena("c",CadenaParametres);
	// Paràmetre "q" : Configuració pròpia del joc (Cadena AJAX)
	var ax=TreureQuot(CadenaParametres);
	var bx=ExtreureParametreURIDeCadena("q",ax);

	var ConfiguracioJoc=bx;
	if (ConfiguracioJoc!="") {
		// Canvis per a la retrocompatibilitat amb activitats antigues.
		// El Generador ha d'estar fora dels paràmetres del joc, però fins al gener'2011
		// estava dintre. Igual que el CodiGen
		//
		var ConfiguracioJSON=eval("("+ConfiguracioJoc+")");
		if (ConfiguracioJSON.Generador!="" && ConfiguracioJSON.Generador!=undefined) {
			Generador=ConfiguracioJSON.Generador;
		}
		if (ConfiguracioJSON.CodiGen!="" && ConfiguracioJSON.CodiGen!=undefined) {
			Codi=ConfiguracioJSON.CodiGen;
		}
		//
		// Hi ha activitats Quètxup amb Generador d'exercicis que en realitat
		// són tipus de jocs
		//
		if (Generador=="Enigma") {
			Generador="Bewoom";
			NomJoc="Enigma";
		}
		if (Generador=="Bingo") {
			Generador="Bewoom";
			NomJoc="Bingo";
		}
	}
	//
	// Configuració Quètxup
	//
	PrimerParametre=true;
	Text="{Q:{";
	if (SegonsJoc!="") {
		Text+="T:"+SegonsJoc;
		PrimerParametre=false;
	}
	if (Permetre=="1") {
		if (PrimerParametre==true) Text+=",";
		Text+=" P:1 ";
		PrimerParametre=false;
	}
	Text+="},";
	//
	// Configuració del joc
	//
	var DireccioJoc=this.GenerarDireccioAssociadaAJoc(NomJoc);	
	Text+="J:{";
	Text+='N:"'+NomJoc+'",';
	Text+='A:"'+DireccioJoc+'",';
	Text+="R:0,";
	Text+="C:{}},";
	//
	// O Arxiu d'exercicis o configuració del generador
	//
	if (ArxiuQuetxup!="") {
		//
		// Arxiu d'exercicis compilats
		//
		Text+="E:{";
		Text+='A:"'+ArxiuQuetxup+'"';
		Text+="}}";
		this.Activitats[p]=new ActivitatCompilacioExercicis(i,a);
		this.Activitats[p].ContingutCarregat=true;
		ObjecteJSONContingut[11]="["+Text+",-1]";
		this.Activitats[p].CarregarActivitatPerJSON(ObjecteJSONContingut);
		return(p);		
	}
	if (Generador!="") {
		//
		// Exercici autogenerat
		//
		var DireccioGenerador=this.GenerarDireccioAssociadaAGenerador(Generador);	
		Text+="G:{";
		Text+='N:"'+Generador+'",';
		Text+='A:"'+DireccioGenerador+'",';
		Text+="R:0,";
		Text+="C:{";
		if (Codi!="") Text+='C:"'+Codi+'"}}}'
		this.Activitats[p]=new ActivitatExerciciAutoGenerat(i,a);
		this.Activitats[p].ContingutCarregat=true;
		ObjecteJSONContingut[11]="["+Text+",-1]";
		this.Activitats[p].CarregarActivitatPerJSON(ObjecteJSONContingut);
		return(p);	
	}			
	alert("element tipus 21 indefinit");
}

SacActivitats.prototype.GenerarDireccioAssociadaAJoc = function(NomJoc) {
	switch(NomJoc) {
		case "Enigma":return("a2011/ago/enigma.txt");
		case "Llista":return("");
		case "Bingo":return("a2011/ago/bingo.txt");
		case "Parelles1":return("a2011/ago/parelles1.txt");
		case "Contrarellotge":return("a2011/ago/contrarellotge.txt");
		default:alert("joc "+NomJoc+" no carregat");
	}
}

SacActivitats.prototype.GenerarDireccioAssociadaAGenerador = function(NomGen) {
	switch(NomGen) {
		case "Equacions":return("a2011/ago/equacions.txt");
		case "Compra":return("a2011/ago/compra.txt");
		case "Cadenes":return("a2011/ago/cadenes.txt");
		case "Puzzle":return("a2011/ago/cadenes.txt");
		case "OperacionsOcultes":return("a2011/ago/cadenes.txt");
		case "Bewoom":return("");
		default:alert("generador:"+NomGen+" no carregat");
	}
}

SacActivitats.prototype.CrearNovaActivitatPrimaria = function(Tipus,TheActivitatReferencia,ThePosicioRelativa) {
	var p=this.AfegirNovaActivitat(Tipus);
	this.Activitats[p].NomDivModal="FORMULARIMODAL"+this.IndexFinestra;
	this.Activitats[p].ActivitatReferencia=TheActivitatReferencia;
	this.Activitats[p].PosicioRelativa=ThePosicioRelativa;
	this.Activitats[p].OmplirFormulariNovaActivitat();
	return(p);
}


SacActivitats.prototype.AnotarActivitat = function(TheActivitat) {
	var p=this.AfegirNovaActivitat(10);
	this.Activitats[p].NomDivModal="FORMULARIMODAL"+this.IndexFinestra;
	this.Activitats[p].ActivitatReferencia=TheActivitat;
	this.Activitats[p].ExecutarModal();
}

SacActivitats.prototype.ComentarActivitat = function(TheActivitat) {
	var p=this.AfegirNovaActivitat(11);
	this.Activitats[p].NomDivModal="FORMULARIMODAL"+this.IndexFinestra;
	this.Activitats[p].ActivitatReferencia=TheActivitat;
	this.Activitats[p].ExecutarModal();
}

SacActivitats.prototype.BuscarPerIdActivitat = function(TheActivitat) {
	for (var i=0;i<this.Activitats.length;i++) {
		if (this.Activitats[i]) {
			if (this.Activitats[i].Items[1].Valor==TheActivitat) return (i);
		}
	}	
	return(-1);
}

/***********************************************************************************\
*
* SacActivitats --> Gestionar Activitat Central
*
************************************************************************************/

SacActivitats.prototype.VisualitzarNomActivitatCentral = function() {
	var Text="";
	Text+=this.Activitats[0].GenerarHTML1DTitol();
	return(Text);
}

SacActivitats.prototype.IdActivitatCentral = function() {
	return(this.Activitats[0].Items[1].Valor);
}

/***********************************************************************************\
*
* SacActivitats --> Puntuar Activitat Central
*
************************************************************************************/

SacActivitats.prototype.GestionarPuntuarActivitatCentral = function() {
	if(!this.Activitats) return;
	if(!this.Activitats[0]) return;
	if(this.ModeCarrega==1) {
		//
		// Si és un contingut, només puntua temes i seccions que no siguin 
		// del curs principal
		if(this.Activitats[0].Items[24].Valor==1) return;
		var Tipus=this.Activitats[0].Items[14].Valor;
		if(Tipus!=6 && Tipus!=7) return;
		this.PuntuarActivitatCentral(1);
	}
	if(this.ModeCarrega==3) this.PuntuarActivitatCentral(1);
}

SacActivitats.prototype.PuntuarActivitatCentral = function(TipusPuntuacio) {
	var NovaPuntuacio=-1;
	switch(TipusPuntuacio) {
		case 1: NovaPuntuacio=this.PuntuarMitjanaPuntuacionsLimit100(); break;
		case 2: NovaPuntuacio=this.PuntuarMitjanaPuntuacions(); break;
		case 3: NovaPuntuacio=this.PuntuarPercentatgeActivitatsCompletes(); break;
		default:LogError(7233);	// ModePuntuacio no trobat a SacActivitats.prototype.Puntuar
	}
	this.Activitats[0].Puntuar(NovaPuntuacio);
	return(NovaPuntuacio);
}

SacActivitats.prototype.PuntuarPercentatgeActivitatsCompletes= function() {
	// Determina el % d'activitats avaluables amb puntuació >=100
	var NombreActivitatsAvaluables=0;
	var NombreActivitatsCompletes=0;
	for (var i=1;i<this.Activitats.length;i++) {
		if (this.Activitats[i]) {
			var ModeSeguiment=this.Activitats[i].Items[27].Items[1].Valor;
			if (ModeSeguiment!=1) {
				NombreActivitatsAvaluables+=1;
				if (this.Activitats[i].Items[22].Valor>=100) {	// activitat realitzada
					NombreActivitatsCompletes+=1;
				}
			}
		}
	}
	if(NombreActivitatsAvaluables==0) return(-1);
	var Percentatge=Math.round(NombreActivitatsCompletes/NombreActivitatsAvaluables*100);
	if (Percentatge>100) Percentatge=100;
	return(Percentatge);
}

SacActivitats.prototype.PuntuarMitjanaPuntuacions= function() {
	// Determina la mitjana de totes les puntuacions. 
	// Si una activitat no té puntuació compta com zero.
	var NombreActivitatsAvaluables=0;
	var PuntsAcumulats=0;
	for (var i=1;i<this.Activitats.length;i++) {
		if (this.Activitats[i]) {
			var ModeSeguiment=this.Activitats[i].Items[27].Items[1].Valor;
			if (ModeSeguiment!=1) {
				NombreActivitatsAvaluables+=1;
				if (this.Activitats[i].Items[22].Valor>=0) {
					PuntsAcumulats+=this.Activitats[i].Items[22].Valor;
				}
			}
		}
	}
	if(NombreActivitatsAvaluables==0) return(-1);
	var Percentatge=Math.round(PuntsAcumulats/NombreActivitatsAvaluables);
	if (Percentatge>999) Percentatge=999;
	return(Percentatge);
}

SacActivitats.prototype.PuntuarMitjanaPuntuacionsLimit100= function() {
	// Determina la mitjana de totes les puntuacions, amb límit 100.
	// Si una activitat no té puntuació compta com zero.
	var NombreActivitatsAvaluables=0;
	var PuntsAcumulats=0;
	for (var i=1;i<this.Activitats.length;i++) {
		if (this.Activitats[i]) {
			var ModeSeguiment=this.Activitats[i].Items[27].Items[1].Valor;
			if (ModeSeguiment!=1) {
				NombreActivitatsAvaluables+=1;
				if (this.Activitats[i].Items[22].Valor>=0) {
					if (this.Activitats[i].Items[22].Valor>100) PuntsAcumulats+=100; 
					else PuntsAcumulats+=this.Activitats[i].Items[22].Valor;
				}
			}
		}
	}
	if(NombreActivitatsAvaluables==0) return(-1);
	var Percentatge=Math.round(PuntsAcumulats/NombreActivitatsAvaluables);
	if (Percentatge>999) Percentatge=999;
	return(Percentatge);
}

/************************************************************************************
*
* VisorActivitats --> Cache d'activitats
* 
************************************************************************************/

function ActivitatCacheada(TheIdActivitat,TheCadena) {
	this.IdActivitat=TheIdActivitat;
	this.Cadena=TheCadena;
}

function CacheActivitats() {
	this.MatriuCache=new Array(); 	// Array de ActivitatCacheada
	this.MaximaPosicio=200;		// Límit de capacitat del caché
}

CacheActivitats.prototype.Afegir= function(TheIdActivitat,TheCadena) {
	for (var i=0;i<this.MatriuCache.length;i++) {
		if (this.MatriuCache[i].IdActivitat==TheIdActivitat) {
			// Si ja està, es renova per aquesta més actual
			this.MatriuCache[i].Cadena=TheCadena;
			return;
		}
	}
	// Si no s'ha trobat s'afegeix
	var NovaPosicio=this.MatriuCache.length;
	if (NovaPosicio>this.MaximaPosicio) {
		this.MatriuCache=new Array();	
		NovaPosicio=0;
	}
	this.MatriuCache[NovaPosicio]= new ActivitatCacheada(TheIdActivitat,TheCadena);
}

CacheActivitats.prototype.Recuperar= function(TheIdActivitat) {
	for (var i=0;i<this.MatriuCache.length;i++) {
		if (this.MatriuCache[i].IdActivitat==TheIdActivitat) {
			return(this.MatriuCache[i].Cadena);
		}
	}
	return("");
}

CacheActivitats.prototype.Reset= function() {
	// Esborra tota la memòria caché
	this.MatriuCache=new Array();
}

/***********************************************************************************\
*
* Visor
* 
************************************************************************************/

function Visor(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat,TheTitolVinyeta) {
	if (!TheIndexFinestra) return;
	Finestra.call(this,TheIndexFinestra,TheIndexFinestraMare,TheTitolVinyeta);
	this.Autodestruible=false;
	this.IdentificadorCurs="";
	this.PasswordCurs="";
	// Activitat a visualitzar
	this.IdActivitat=TheIdActivitat;
	this.ModeCarrega=-1;
	this.MyCache=new CacheActivitats();
	// Generem un sac d'activitats buits.
	var Aqui="Finestral["+this.IndexFinestra+"].MySacActivitats.";
	this.MySacActivitats=new SacActivitats(this.IndexFinestra,Aqui,null,this.ModeCarrega);
}
Visor.prototype = new Finestra();

/************************************************************************************
*
* Visor --> Actualitzar
* 
************************************************************************************/

Visor.prototype.Actualitzar = function() {
	if(this.IdActivitat==0 && this.IdentificadorCurs=="" && this.PasswordCurs=="") {
		this.PassarAMode(3);
		this.FinalActualitzar();
		return;
	}
	this.CarregarContingut();
}

Visor.prototype.CarregarContingut = function() {
	var Url="collectiva2/php/loadcont.php";
	Url=AfegirParametreURIInicial(Url,"a",this.IdActivitat);
	Url=AfegirParametreURISecundari(Url,"m",this.ModeCarrega);
	if (this.IdentificadorCurs!="") Url=AfegirParametreURISecundari(Url,"c",this.IdentificadorCurs);
	if (this.PasswordCurs!="") Url=AfegirParametreURISecundari(Url,"pc",this.PasswordCurs);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	if (NomUsuari!="") {
		Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
		Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	}
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarContingutBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarContingutMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
	this.PassarAMode(0); // Visualitza "Carregant..."
	MissatgeSeguiment("Actualitzant "+this.NomPestanya);
}

Visor.prototype.RetornCarregarContingutBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		if(this.IdentificadorCurs!="") {
			this.IdentificadorCurs="";	
			this.PassarAMode(3);
			return;
		}
	}
	this.MyCache.Afegir(this.IdActivitat,ContingutAJAX);
	this.Contingut=eval("("+ContingutAJAX+")");
	var Aqui="Finestral["+this.IndexFinestra+"].MySacActivitats.";
	this.MySacActivitats=new SacActivitats(this.IndexFinestra,Aqui,this.Contingut.Elements,this.ModeCarrega);
	this.GenerarPagina();
	this.FinalActualitzar();
	this.PassarAMode(1);
}

Visor.prototype.RetornCarregarContingutMal =function() {
	MissatgeModal(16);
	this.FinalActualitzar();
}

Visor.prototype.FinestraAmbActivitatAfectada = function() {
	if(this.MySacActivitats.BuscarPerIdActivitat(IdActivitatModificada)!=-1) return(true);
	return(false);
}

Visor.prototype.GenerarPagina =function() {
	// Rutina reescrivible
}

/************************************************************************************
*
* Visor --> Mode 3: Selecció de curs i el seu password
* 
************************************************************************************/

Visor.prototype.GenerarHTMLEspaiTreballMode3 = function() {
	var Text="<br /><br /><br />";
	var Aqui="Finestral["+this.IndexFinestra+"].FormulariAccesCurs.";
	this.FormulariAccesCurs=new Formulari(Aqui,124);
	this.FormulariAccesCurs.Altura=80;
	this.FormulariAccesCurs.Amplada=200;
	this.FormulariAccesCurs.Items[1]=new EntradaIdentificador(Aqui+"Items[1].",125);// Identificador
	this.FormulariAccesCurs.Items[2]=new EntradaPasswordCurs(Aqui+"Items[2].",126);	// Password
	var Funcio='Finestral['+this.IndexFinestra+'].IntentarEntradaCurs()';
	this.FormulariAccesCurs.Items[3]=new EntradaBoto(Aqui+"Items[3].",4,Funcio); 	// Accedir
	Text+=this.FormulariAccesCurs.Insertar();
	return(Text);
}

Visor.prototype.IntentarEntradaCurs = function() {
	if (this.FormulariAccesCurs.Descarregar()!=true) return;
	this.IdentificadorCurs=this.FormulariAccesCurs.Items[1].Valor;
	this.PasswordCurs=this.FormulariAccesCurs.Items[2].Valor;
	this.Actualitzar();
}

Visor.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text=this.GenerarHTMLEspaiTreballPerMode(1);
	return(Text);	
}

Visor.prototype.GenerarHTMLEspaiTreballMode2 = function() {
	var Text=this.GenerarHTMLEspaiTreballPerMode(2);
	return(Text);	
}

Visor.prototype.GenerarHTMLEspaiTreballMode4 = function() {
	var Text=this.GenerarHTMLEspaiTreballPerMode(4);
	return(Text);	
}

Visor.prototype.GenerarHTMLEspaiTreballPerMode = function(Mode) {
	var OpcionsEsquerra=this.GenerarHTMLOpcionsEsquerra(Mode);
	var OpcionsDreta=this.GenerarHTMLOpcionsDreta(Mode);
	var Titol=this.GenerarHTMLTitol(Mode);
	var Text=GenerarHTMLCapcalera(OpcionsEsquerra,OpcionsDreta,Titol);
	Text+=this.GenerarHTMLBloc(Mode);
	return(Text);	
}

Visor.prototype.GenerarHTMLOpcionsEsquerra = function(Mode) {
	// Rutina reescrivible
	return("");
}

Visor.prototype.GenerarHTMLOpcionsDreta = function(Mode) {
	// Rutina reescrivible
	return("");
}

Visor.prototype.GenerarHTMLTitol = function(Mode) {
	// Rutina reescrivible
	return("");
}

/***********************************************************************************\
*
* VisorActivitats
* 
************************************************************************************/
/************************************************************************************
*
* VisorActivitats --> ClanActivitats
* 
************************************************************************************/

function ClanActivitats(TheIndexActivitat,TheIdActivitat,TheIndexFinestra) {
	this.IndexFinestra=TheIndexFinestra;
	this.IndexActivitatPrimaria=TheIndexActivitat;		// Assenyala una posició del sac d'activitats
	this.IdActivitatPrimaria=TheIdActivitat;
	this.IndexActivitatsSecundaries=new Array();		// Matriu de posicions del sac d'elements
	this.IdActivitatsSecundaries=new Array();		// Matriu de ids d'activitats secundàries	
}

ClanActivitats.prototype.GenerarHTML = function(Mode) {
	var Text="";
	// En primer lloc visualitzem l'element principal
	Text+=Finestral[this.IndexFinestra].MySacActivitats.Activitats[this.IndexActivitatPrimaria].GenerarHTML1D(Mode);
	// I després visualitzem tots els elements secundaris
	for (var i=0;i<this.IndexActivitatsSecundaries.length;i++) {
		var Index=this.IndexActivitatsSecundaries[i];
		Text+=Finestral[this.IndexFinestra].MySacActivitats.Activitats[Index].GenerarHTML1D(Mode);
	}
	return (Text);
}

ClanActivitats.prototype.AfegirElementSecundari = function(Index,IdActivitat,IdActivitatMare) {
	// Busca al Clan la IdActivitatMare
	// si la troba afegeix l'activitat i retorna true
	// si no la troba retorna false
	if (this.IdActivitatPrimaria==IdActivitatMare) {
		this.IndexActivitatsSecundaries[this.IndexActivitatsSecundaries.length]=Index;
		this.IdActivitatsSecundaries[this.IdActivitatsSecundaries.length]=IdActivitat;
		return (true);
	}
	for (var i=0;i<this.IndexActivitatsSecundaries.length;i++) {
		if (this.IdActivitatsSecundaries[i]==IdActivitatMare) {
			this.IndexActivitatsSecundaries[this.IndexActivitatsSecundaries.length]=Index;
			this.IdActivitatsSecundaries[this.IdActivitatsSecundaries.length]=IdActivitat;
			return (true);
		}
	}
	return (false);
}

ClanActivitats.prototype.GenerarHTMLIcones = function() {
	var Text="";
	Text+=Finestral[this.IndexFinestra].MySacActivitats.Activitats[this.IndexActivitatPrimaria].GenerarHTMLIcones();
	for (var i=0;i<this.IndexActivitatsSecundaries.length;i++) {
		var Index=this.IndexActivitatsSecundaries[i];
		Text+=Finestral[this.IndexFinestra].MySacActivitats.Activitats[Index].GenerarHTMLIcones();
	}
	return (Text);
}

ClanActivitats.prototype.MarcarVisualitzarIcones = function(Mode) {
	Finestral[this.IndexFinestra].MySacActivitats.Activitats[this.IndexActivitatPrimaria].VisualitzarIcones=Mode;
	for (var i=0;i<this.IndexActivitatsSecundaries.length;i++) {
		var Index=this.IndexActivitatsSecundaries[i];
		Finestral[this.IndexFinestra].MySacActivitats.Activitats[Index].VisualitzarIcones=Mode;
	}
}

/************************************************************************************
*
* VisorActivitats --> PosicioActivitat
* 
************************************************************************************/

function PosicioActivitat(IndexActivitat,IdActivitat,TheIndexFinestra) {
	//
	// Tècnicament, a una posició d'un tema pot haver-hi més d'una activitat principal
	// 
	this.Clans=new Array();
	this.IndexFinestra=TheIndexFinestra;
	this.Clans[0]=new ClanActivitats(IndexActivitat,IdActivitat,this.IndexFinestra);
	//
	// Informació per a insertar nous elements
	//
	this.PermetInsertar=Finestral[this.IndexFinestra].MySacActivitats.Activitats[IndexActivitat].PermetAfegirActivitatPrimaria();
	this.EsPosicioInicial=false;
	this.EsColumnaInicial=false;
	this.EsColumnaFinal=false;
	this.EsSeccioTema=false;	// Indica que s'estan visualitzant seccions o temes 
					// i per tant només s'inserta a dalt i a baix
	var Tipus=Finestral[this.IndexFinestra].MySacActivitats.Activitats[IndexActivitat].Items[14].Valor;
	if(Tipus==6 || Tipus==7) this.EsSeccioTema=true;
}

PosicioActivitat.prototype.AfegirElement = function(Index,IdActivitat,IdActivitatMare) {
	if (IdActivitatMare==0) this.AfegirElementPrimari(Index,IdActivitat);
	else this.AfegirElementSecundari(Index,IdActivitat,IdActivitatMare);
}

PosicioActivitat.prototype.AfegirElementPrimari = function(Index,IdActivitat) {
	var PosicioClan=this.Clans.length;
	this.Clans[PosicioClan]=new ClanActivitats(Index,IdActivitat,this.IndexFinestra,this.IndexFinestra);
}

PosicioActivitat.prototype.AfegirElementSecundari = function(Index,IdActivitat,IdActivitatMare) {
	// Busca als clans la IdActivitatMare
	// i la posiciona allà.
	// Retorna false si no l'ha trobat o la posició està buida
	// Retorna true si l'ha trobat.
	if (this.Clans.length==0) return (false);
	for (var i=0;i<this.Clans.length;i++) {
		if (this.Clans[i].AfegirElementSecundari(Index,IdActivitat,IdActivitatMare)==true) return (true);
	}
	return (false);
}

PosicioActivitat.prototype.GenerarHTML = function(Mode,Context) {
	var Text="";
	if(Mode==2 && this.PermetInsertar==true) Text+=this.InsertarPrevi(Context);
	for (var i=0;i<this.Clans.length;i++) {
		Text+=this.Clans[i].GenerarHTML(Mode);
	}
	if(Mode==2 && this.PermetInsertar==true) Text+=this.InsertarPost(Context);
	return (Text);
}

PosicioActivitat.prototype.GenerarHTMLIcones = function() {
	var Text="";
	for (var i=0;i<this.Clans.length;i++) {
		Text+=this.Clans[i].GenerarHTMLIcones();
	}
	return (Text);
}

PosicioActivitat.prototype.MarcarVisualitzarIcones = function(Mode) {
	for (var i=0;i<this.Clans.length;i++) {
		this.Clans[i].MarcarVisualitzarIcones(Mode);
	}
}

PosicioActivitat.prototype.InsertarPrevi = function(Context) {
	var Text="";
	if(this.EsPosicioInicial) Text+=this.GenerarInsertador(4,Context)+"<br/>"; // Inici tema
	if(this.EsColumnaInicial && !this.EsSeccioTema) Text+=this.GenerarInsertador(2,Context); // Columna inicial
	return (Text);
}

PosicioActivitat.prototype.InsertarPost = function(Context) {
	var Text="";
	if(this.EsSeccioTema) Text+="<br/>";
	Text+=this.GenerarInsertador(1,Context); // Columna següent
	if(this.EsColumnaFinal && !this.EsSeccioTema) Text+="<br/>"+this.GenerarInsertador(3,Context); // Fila següent
	return (Text);
}

PosicioActivitat.prototype.GenerarInsertador = function(Pos,Context) {
	AvisAlgunInsertadorVisible=true;
	var Text="";
	switch(Context) {
		case 1: Text=this.GenerarInsertadorSeccions(Pos); break;
		case 2: Text=this.GenerarInsertadorTemes(Pos); break;
		case 3: Text=this.GenerarInsertadorActivitats(Pos); break;
		default: LogError(7628); break;
	}
	return(Text);
}

PosicioActivitat.prototype.GenerarInsertadorSeccions = function(Pos) {
	var IndexActivitatReferencia=this.Clans[0].IndexActivitatPrimaria;
	var Funcio="Finestral["+this.IndexFinestra+"].";
	switch(MyPortadocuments.TipusAccio()) {
		case 0: Funcio+="AfegirSeccio("+IndexActivitatReferencia+","+Pos+")"; break;
		case 1: Funcio+="EnganxarSeccioCopiada("+IndexActivitatReferencia+","+Pos+")"; break;
		case 3: Funcio+="EnganxarMogudaSeccio("+IndexActivitatReferencia+","+Pos+")"; break;
		case 2: Funcio+="EnganxarReferenciaSeccio("+IndexActivitatReferencia+","+Pos+")"; break;
		default: LogError(7641); break;
	}
	var Text='<span class="buitactiu" onclick="'+Funcio+'">';
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;</span>';
	return(Text);	
}

PosicioActivitat.prototype.GenerarInsertadorTemes = function(Pos) {
	var IndexActivitatReferencia=this.Clans[0].IndexActivitatPrimaria;
	var Funcio="Finestral["+this.IndexFinestra+"].";
	switch(MyPortadocuments.TipusAccio()) {
		case 0: Funcio+="AfegirTema("+IndexActivitatReferencia+","+Pos+")"; break;
		case 1: Funcio+="EnganxarTemaCopiat("+IndexActivitatReferencia+","+Pos+")"; break;
		case 3: Funcio+="EnganxarMogutTema("+IndexActivitatReferencia+","+Pos+")"; break;
		case 2: Funcio+="EnganxarReferenciaTema("+IndexActivitatReferencia+","+Pos+")"; break;
		default: LogError(7656); break;
	}
	var Text='<span class="buitactiu" onclick="'+Funcio+'">';
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;</span>';
	return(Text);	
}

PosicioActivitat.prototype.GenerarInsertadorActivitats = function(Pos) {
	var IndexActivitatReferencia=this.Clans[0].IndexActivitatPrimaria;
	var Funcio="Finestral["+this.IndexFinestra+"].";
	switch(MyPortadocuments.TipusAccio()) {
		case 0: Funcio+="AfegirActivitatPrimaria("+IndexActivitatReferencia+","+Pos+")"; break;
		case 1: Funcio+="EnganxarActivitatCopiadaBis("+IndexActivitatReferencia+","+Pos+")"; break;
		case 3: Funcio+="EnganxarMogudaActivitatPrimariaBis("+IndexActivitatReferencia+","+Pos+")"; break;
		case 2: Funcio+="EnganxarReferenciaActivitatPrimariaBis("+IndexActivitatReferencia+","+Pos+")"; break;
		default: LogError(7671); break; 
	}
	var Text='<span class="buitactiu" onclick="'+Funcio+'">';
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;</span>';
	AvisAlgunInsertadorVisible=true;
	return(Text);	
}

/************************************************************************************
*
* VisorActivitats --> Constructor
*
************************************************************************************/

function VisorActivitats(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat,TheTitolVinyeta) {
	if (!TheIndexFinestra) return;
	Visor.call(this,TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat,TheTitolVinyeta);
	this.ModeCarrega=1;
	//
	// Formulari de selecció del tipus d'activitat a insertar
	//
	this.FormulariTipusNouElement=new Formulari("Finestral[" + TheIndexFinestra + "].FormulariTipusNouElement"+".");
	this.FormulariAccesCurs=new Object();
}
VisorActivitats.prototype = new Visor();

VisorActivitats.prototype.RecarregarActivitat = function(TheIdActivitat) {
	// Si només anem navegant dintre del curs, podem fer servir la caché d'activitats.
	this.IdActivitat=TheIdActivitat;
	var Cadena=this.MyCache.Recuperar(this.IdActivitat);
	if (Cadena!="") {
		this.RetornCarregarContingutBe(Cadena);
		return;
	}
	this.CarregarContingut();
}

VisorActivitats.prototype.SortirCurs= function() {
	//
	// Obliga a que aparegui el formulari d'introduir curs
	//
	this.IdentificadorCurs="";
	this.PasswordCurs="";
	this.IdActivitat=0;
	this.PassarAMode(3);
}

/************************************************************************************
*
* Visor d'activitats --> Generar Pàgina
* 
************************************************************************************/

VisorActivitats.prototype.GenerarPagina =function() {
	this.Pagina=new Array();
	this.MatriuPosicions=new Array();
	this.GenerarMatriuPaginaAmbActivitatsPrimaries();
	this.AfegirActivitatsSecundaries();
	this.PaginaAmbPosicionsInsertables=this.DetectarAlgunaPosicioInsertable();
	this.MarcarPosicionsExtremes();
	//this.IndexarComentaris();
	this.OrdenarColumnes();
	this.SimplificarIcones();
}

VisorActivitats.prototype.GenerarMatriuPaginaAmbActivitatsPrimaries =function() {
	//
	// Genera la matriu Pagina amb les Posicions associades al SacActivitats
	//
	var CursAnterior=-1;
	var SeccioAnterior=-1;
	var TemaAnterior=-1;
	var EditorAnterior=-1;
	var FilaAnterior=-1;
	var ColumnaAnterior=-1;
	var CursActual=0;
	var SeccioActual=0;
	var TemaActual=0;
	var EditorActual=0;
	var FilaActual=0;
	var ColumnaActual=0;
	var TipusActual=0;
	var TipusAnterior=0;
	for (var i=1;i<this.MySacActivitats.Activitats.length;i++) {
		if (this.MySacActivitats.Activitats[i].Items[9].Valor==0) {
			CursActual=this.MySacActivitats.Activitats[i].Items[24].Valor;
			SeccioActual=this.MySacActivitats.Activitats[i].Items[2].Valor;
			TemaActual=this.MySacActivitats.Activitats[i].Items[3].Valor;
			EditorActual=this.MySacActivitats.Activitats[i].Items[6].Valor;
			FilaActual=this.MySacActivitats.Activitats[i].Items[4].Valor;
			ColumnaActual=this.MySacActivitats.Activitats[i].Items[5].Valor;
			TipusActual=this.MySacActivitats.Activitats[i].Items[14].Valor;
			if (FilaActual!=FilaAnterior||EditorActual!=EditorAnterior||
				SeccioActual!=SeccioAnterior||TemaActual!=TemaAnterior||
				CursActual!=CursAnterior||TipusActual==6||TipusActual==7||
				TipusActual==15||TipusActual==16||
				TipusAnterior==15||TipusAnterior==16) {
					// Cal forçar una nova fila
					this.AfegirActivitatEnNovaFila(i);
			}
			else {
				// Si la columna canvia, cal forçar un canvi de columna
				if (ColumnaActual!=ColumnaAnterior) {	
					this.AfegirActivitatEnNovaColumna(i);
				}
				else {
					this.AfegirActivitatEnPosicioActual(i);
				}
			}
			CursAnterior=CursActual;
			SeccioAnterior=SeccioActual;
			TemaAnterior=TemaActual;
			EditorAnterior=EditorActual;
			FilaAnterior=FilaActual;
			ColumnaAnterior=ColumnaActual;
			TipusAnterior=TipusActual;
		}
	}
}

VisorActivitats.prototype.AfegirActivitatsSecundaries =function() {
	for (var i=1;i<this.MySacActivitats.Activitats.length;i++) {
		var IdActivitatMare=this.MySacActivitats.Activitats[i].Items[9].Valor;
		if (IdActivitatMare!=0) {
			var IdActivitat=this.MySacActivitats.Activitats[i].Items[1].Valor;
			this.AfegirActivitatSecundariaAPagina(i,IdActivitat,IdActivitatMare);
		}
	}
}

VisorActivitats.prototype.AfegirActivitatSecundariaAPagina =function(Index,IdActivitat,IdActivitatMare) {
	for (var Fila=0;Fila<this.Pagina.length;Fila++) {
		for (var Columna=0;Columna<this.Pagina[Fila].length;Columna++) {
			var Posicio=this.Pagina[Fila][Columna];
			if (this.MatriuPosicions[Posicio].AfegirElementSecundari(Index,IdActivitat,IdActivitatMare)) return;
		}
	}
}

VisorActivitats.prototype.DetectarAlgunaPosicioInsertable =function() {
	for (var Fila=0;Fila<this.Pagina.length;Fila++) {
		for (var Columna=0;Columna<this.Pagina[Fila].length;Columna++) {
			var Posicio=this.Pagina[Fila][Columna];
			if(this.MatriuPosicions[Posicio].PermetInsertar==true) return(true);
		}		
	}
	return(false);	
}

VisorActivitats.prototype.MarcarPosicionsExtremes = function() {
	if(this.Pagina.length==0) return;
	var Posicio=this.Pagina[0][0];
	this.MatriuPosicions[Posicio].EsPosicioInicial=true;
	for (var Fila=0;Fila<this.Pagina.length;Fila++) {
		Posicio=this.Pagina[Fila][0];
		this.MatriuPosicions[Posicio].EsColumnaInicial=true;
		Posicio=this.Pagina[Fila][this.Pagina[Fila].length-1];
		this.MatriuPosicions[Posicio].EsColumnaFinal=true;
	}
}

VisorActivitats.prototype.AfegirActivitatEnPosicioActual = function(Index) {
	//
	// Passa ObjecteJsonContingut[Index] a la posició actual
	// Suposem que MatriuContingut té almenys una fila i que aquesta fila té
	// almenys una columna
	//
	var FilaAra=this.Pagina.length-1;
	var ColumnaAra=this.Pagina[FilaAra].length-1;
	var Posicio=this.Pagina[FilaAra][ColumnaAra];
	var IdActivitatElement=this.MySacActivitats.Activitats[Index].Items[1].Valor;
	var IdActivitatMare=this.MySacActivitats.Activitats[Index].Items[9].Valor;
	this.MatriuPosicions[Posicio].AfegirElement(Index,IdActivitatElement,IdActivitatMare);
}

VisorActivitats.prototype.AfegirActivitatEnNovaColumna = function(Index) {
	// Generem una nova posició
	var NovaPosicio=this.MatriuPosicions.length;
	var IdActivitatElement=this.MySacActivitats.Activitats[Index].Items[1].Valor;
	this.MatriuPosicions[NovaPosicio]=new PosicioActivitat(Index,IdActivitatElement,this.IndexFinestra);
	// Suposem que Pagina té almenys una fila
	var FilaAra=this.Pagina.length-1;
	var NovaColumna=this.Pagina[FilaAra].length;
	this.Pagina[FilaAra][NovaColumna]=NovaPosicio;
}

VisorActivitats.prototype.AfegirActivitatEnNovaFila = function(Index) {
	// Generem una nova posició
	var NovaPosicio=this.MatriuPosicions.length;
	var IdActivitatElement=this.MySacActivitats.Activitats[Index].Items[1].Valor;
	this.MatriuPosicions[NovaPosicio]=new PosicioActivitat(Index,IdActivitatElement,this.IndexFinestra);
	var NovaFila=this.Pagina.length;
	this.Pagina[NovaFila]=new Array();
	this.Pagina[NovaFila][0]=NovaPosicio;
}

VisorActivitats.prototype.ModificacionsPaginaEspecifiques =function() {
	// Rutina reescrivible
}

VisorActivitats.prototype.IndexarComentaris =function() {
	for (var Fila=0;Fila<this.Pagina.length;Fila++) {
		for (var Columna=0;Columna<this.Pagina[Fila].length;Columna++) {
			var Posicio=this.Pagina[Fila][Columna];
			this.MatriuPosicions[Posicio].IndexarComentaris();
		}
	}
}

/************************************************************************************
*
* Visor d'activitats --> Ordenar columnes
* 
************************************************************************************/

VisorActivitats.prototype.OrdenarColumnes =function() {
	//
	// En Novetats de vegades les columnes queden desordenades produint un efecte
	// poc estètic. Cal ordenar-les.
	//
	for (var Fila=0;Fila<this.Pagina.length;Fila++) this.OrdenarColumnesFila(Fila);
}

VisorActivitats.prototype.OrdenarColumnesFila =function(Fila) {
	if(this.Pagina[Fila].length<2) return;
	for (var Columna=0;Columna<this.Pagina[Fila].length-1;Columna++) {
		var ColumnaInicial=this.ColumnaPosicio(Fila,Columna);
		for (var Columna2=Columna+1;Columna2<this.Pagina[Fila].length;Columna2++) {
			var ColumnaFinal=this.ColumnaPosicio(Fila,Columna2);
			if(ColumnaInicial>ColumnaFinal) {
				this.IntercanviarPosicions(Fila,Columna,Columna2);
				var Aux=ColumnaInicial;
				ColumnaInicial=ColumnaFinal;
				ColumnaFinal=Aux;
			}
		}
	}
}

VisorActivitats.prototype.ColumnaPosicio =function(Fila,Columna) {
	var IndexMatriuPosicions=this.Pagina[Fila][Columna];
	var IndexAlSac=this.MatriuPosicions[IndexMatriuPosicions].Clans[0].IndexActivitatPrimaria;
	var Columna=this.MySacActivitats.Activitats[IndexAlSac].Items[5].Valor;
	return(Columna);
}

VisorActivitats.prototype.IntercanviarPosicions =function(Fila,Columna1,Columna2) {
	var IndexMatriuPosicions1=this.Pagina[Fila][Columna1];
	var IndexMatriuPosicions2=this.Pagina[Fila][Columna2];
	this.Pagina[Fila][Columna1]=IndexMatriuPosicions2;
	this.Pagina[Fila][Columna2]=IndexMatriuPosicions1;
}

/************************************************************************************
*
* Visor d'activitats --> Simplificar icones
* 
************************************************************************************/

VisorActivitats.prototype.SimplificarIcones =function() {
	//
	// Si totes les columnes tenen les mateixes icones, només cal visualitzar-les a l'última columna 
	for (var Fila=0;Fila<this.Pagina.length;Fila++) this.SimplificarIconesFila(Fila);
}

VisorActivitats.prototype.SimplificarIconesFila =function(Fila) {
	for (var Columna=0;Columna<this.Pagina[Fila].length;Columna++) {
		this.MatriuPosicions[this.Pagina[Fila][Columna]].MarcarVisualitzarIcones(true);
	}
	if(this.Pagina[Fila].length<2) return;
	var IconesPrimeraColumna=this.MatriuPosicions[this.Pagina[Fila][0]].GenerarHTMLIcones();
	for (var Columna=0;Columna<this.Pagina[Fila].length;Columna++) {
		var IconesColumna=this.MatriuPosicions[this.Pagina[Fila][Columna]].GenerarHTMLIcones();
		if(IconesPrimeraColumna!=IconesColumna) return;
	}
	// Totes les columnes tenen les mateixes icones, només cal visualitzar-les a la última
	for (var Columna=0;Columna<this.Pagina[Fila].length-1;Columna++) {
		this.MatriuPosicions[this.Pagina[Fila][Columna]].MarcarVisualitzarIcones(false);
	}
}	

/************************************************************************************
*
* VisorActivitats --> Generar HTML Bloc
* 
************************************************************************************/

VisorActivitats.prototype.GenerarHTMLBloc = function(Mode) {
	var Text="<br />";
	if(Mode==2) Text+=this.GenerarMissatgeEstasInsertant();
	Text+='<div id="MARGE_DRET'+this.IndexFinestra+'" style="width: 3%; float:left;"></div>';
	Text+='<div id="ESPAI_ESQUERRA_'+this.IndexFinestra+'" style="width: 97%; float:right;">';
	if(this.PaginaBuida()) Text+=this.GenerarHTMLBlocBuit(Mode);
	else Text+=this.GenerarHTMLContingutBloc(Mode);
	var Nom="FORMULARIGENERADOR";
	Text+='<div id="'+Nom+'" class="formularimodal"></div>';
	var Nom="FORMULARIMODAL"+this.IndexFinestra;
	Text+='<div id="'+Nom+'" class="formularimodal"></div>';
	//
	// Afegim el div modal del selector del tipus de nova activitat
	//
	Text+=this.FormulariTipusNouElement.GenerarDivModal();
	return (Text);
}

VisorActivitats.prototype.GenerarMissatgeEstasInsertant = function() {
	var Text='<div style="text-align:center;">';
	Text+="<small>Selecciona la posició ";
	Text+='<span class="buitactiu">';
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;</span>';
	Text+="</small></div><br/><br/>";
	return(Text);
}

VisorActivitats.prototype.PaginaBuida = function() {
	// Retorna true si no hi ha cap activitat
	if(this.Pagina.length==0) return (true);
	return(false)
}

VisorActivitats.prototype.GenerarHTMLContingutBloc = function(Mode) {
	AvisAlgunInsertadorVisible=false;
	var Text=""
	for (var Fila=0;Fila<this.Pagina.length;Fila++) {
		var TextFila="";
		for (var Columna=0;Columna<this.Pagina[Fila].length;Columna++) {
			// Suposem que no hi ha columnes buides
			var Posicio=this.Pagina[Fila][Columna];
			TextFila+=this.MatriuPosicions[Posicio].GenerarHTML(Mode,this.Contingut.Mode);
			TextFila+="&nbsp;";		
		}		
		if (TextFila!="") TextFila+="<br />";
		Text+=TextFila;
	}
	if(AvisAlgunInsertadorVisible==false && Mode==2) {
		 Text+=this.GenerarInsertadorInici(Mode);
	}
	return (Text);
}


VisorActivitats.prototype.GenerarInsertadorInici = function() {
	var Funcio="Finestral["+this.IndexFinestra+"].AfegirActivitatPrimariaEnTemaBuit()";
	var Text='<span class="buitactiu" onclick="'+Funcio+'">';
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;</span>';
	return(Text);
}

VisorActivitats.prototype.GenerarHTMLBlocBuit = function(Mode) {
	var Text="";
	switch(this.Contingut.Mode) {
		case 0: Text="(Sense Novetats)"; break;
		case 1: Text="(Curs buit)"; break;
		case 2: Text="(Secció buida)"; break;
		case 3: Text="(Tema buit)";; break;
		case 4: Text="(Selecció buida)";; break;
		default:LogError(8078); break;
	}
	var Funcio="";
	if (Mode==2) {
		switch(this.Contingut.Mode) {
			case 1: Funcio=this.DeterminarFuncioEnCursBuit(); break;
			case 2: Funcio=this.DeterminarFuncioEnSeccioBuida(); break;
			case 3: Funcio=this.DeterminarFuncioEnTemaBuit(); break;
			default:LogError(8086);	// mode no acceptable en VisorActivitats.prototype.GenerarMissatgePaginaBuida
		}
		Text+='<span class="buitactiu" onclick="'+Funcio+'">';
		Text+='&nbsp;&nbsp;&nbsp;&nbsp;</span>';
	}
	return(Text);	

}

VisorActivitats.prototype.DeterminarFuncioEnCursBuit = function() {
	var Funcio="";
	switch(MyPortadocuments.TipusAccio()) {
		case 0: return("Finestral["+this.IndexFinestra+"].AfegirActivitatPrimariaEnIniciCurs()");
		case 1: return("Finestral["+this.IndexFinestra+"].EnganxarCopiaActivitatPrimariaEnIniciCurs()");
		case 3: return("Finestral["+this.IndexFinestra+"].EnganxarMogudaActivitatPrimariaEnIniciCurs()");
		case 2: return("Finestral["+this.IndexFinestra+"].EnganxarReferenciaActivitatPrimariaEnIniciCurs()");
	}
	LogError(8103); 	// Valor no acceptable en VisorActivitats.prototype.DeterminarFuncioEnCursBuit
}

VisorActivitats.prototype.DeterminarFuncioEnSeccioBuida = function() {
	var Funcio="";
	switch(MyPortadocuments.TipusAccio()) {
		case 0: return("Finestral["+this.IndexFinestra+"].AfegirActivitatPrimariaEnIniciSeccio()");
		case 1: return("Finestral["+this.IndexFinestra+"].EnganxarCopiaActivitatPrimariaEnIniciSeccio()");
		case 3: return("Finestral["+this.IndexFinestra+"].EnganxarMogudaActivitatPrimariaEnIniciSeccio()");
		case 2: return("Finestral["+this.IndexFinestra+"].EnganxarReferenciaActivitatPrimariaEnIniciSeccio()");
	}
	LogError(8114); // Valor no acceptable en VisorActivitats.prototype.DeterminarFuncioEnSeccioBuida
}

VisorActivitats.prototype.DeterminarFuncioEnTemaBuit = function() {
	var Funcio="";
	switch(MyPortadocuments.TipusAccio()) {
		case 0: return("Finestral["+this.IndexFinestra+"].AfegirActivitatPrimariaEnTemaBuit()");
		case 1: return("Finestral["+this.IndexFinestra+"].EnganxarCopiaActivitatPrimariaEnTemaBuit()");
		case 3: return("Finestral["+this.IndexFinestra+"].EnganxarMogudaActivitatPrimariaEnTemaBuit()");
		case 2: return("Finestral["+this.IndexFinestra+"].EnganxarReferenciaActivitatPrimariaEnTemaBuit()");
	}
	LogError(8125);	// Valor no acceptable en VisorActivitats.prototype.DeterminarFuncioEnTemaBuit
}

/************************************************************************************
*
* VisorActivitats --> Generar Capçalera
* 
************************************************************************************/

VisorActivitats.prototype.GenerarHTMLOpcionsEsquerra = function(Mode) {
	var Text="";
	if(this.Contingut.Mode==2||this.Contingut.Mode==3||this.Contingut.Mode==4) {
		var Funcio="RecarregarActivitat("+this.Contingut.Curs[1]+")";
		var NomCurs=this.Contingut.Curs[0];
		Text+=this.GenerarSelectorPetit(NomCurs,Funcio);
	}
	if(this.Contingut.Mode==3||this.Contingut.Mode==4) {
		Text+="<small> > </small>";
		Funcio="RecarregarActivitat("+this.Contingut.Seccio[1]+")";
		var NomSeccio=this.Contingut.Seccio[0];
		Text+=this.GenerarSelectorPetit(NomSeccio,Funcio);
	}
	if(Text!="") Text+='&nbsp;<img src="collectiva2/logos/adalt.jpg" alt="pujar" width="13" height="17"></img>';
	return(Text);
}

VisorActivitats.prototype.GenerarSelectorPetit = function(Nom,Funcio) {
	var Text="<b>";
	Text+=this.GenerarSelectorAccioInterna(decodeURIComponent(Nom),Funcio);
	Text+="</b>";
	return(Text);
}

VisorActivitats.prototype.GenerarHTMLTitol = function(Mode) {
	var Text="";
	if(this.Contingut.Mode==0) return(Traduir(23)); // Novetats.
	Text=this.MySacActivitats.VisualitzarNomActivitatCentral();
	if(this.Contingut.Mode==4) Text="Selecció:&nbsp;";
	return(Text);
}

VisorActivitats.prototype.GenerarHTMLOpcionsDreta = function(Mode) {
	var Text="";
	//
	// Si està en un curs específic, permet surtir-ne
	//
	if (this.CursAmbLogin()) {
		var Funcio="Finestral["+this.IndexFinestra+"].SortirCurs()";
		Text+=GenerarSelector("Sortir del curs <img src='collectiva2/logos/sortir.jpg' WIDTH=16 HEIGHT=16 alt='sortir'/>",Funcio);
		Text+="<br/>";
 	}
	if(NomUsuari=="") {
		// Si no estàs identificat t'invita a identificar-te
		var Funcio="PassarAFinestra(3)";
		Text+=GenerarSelector("No estàs identificat <img src='collectiva2/logos/noidentificat.jpg' WIDTH=23 HEIGHT=20 alt='no identificat'/>",Funcio);
		return(Text);
	}
	if (this.ModeEdicio==2) {
		//
		// Si ha demanat insertar una activitat nova, l'únic que pot fer és sortir
		//
		var Funcio="Finestral["+this.IndexFinestra+"].PassarAMode(1)";
		Text=GenerarSelector("Cancel·lar",Funcio);
		return(Text);
	}
	if (this.PermetInsertarActivitatsNoves()) {
		//
		// Missatge d'afegir una nova secció, tema, activitat
		//
		var Funcio="Finestral["+this.IndexFinestra+"].PassarAMode(2)";
		var Text2="";
		switch(this.Contingut.Mode) {
			case 1: Text2="Afegir una nova secció <img src='collectiva2/logos/afegir.jpg' WIDTH=15 HEIGHT=16 alt='afegir'/>"; break;
			case 2: Text2="Afegir un nou tema <img src='collectiva2/logos/afegir.jpg' WIDTH=15 HEIGHT=16 alt='afegir'/>"; break;
			case 3: Text2="Afegir una nova activitat <img src='collectiva2/logos/afegir.jpg' WIDTH=15 HEIGHT=16 alt='afegir'/>"; break;
		}
		if (Text2!="") {
			Text+=GenerarSelector(Text2,Funcio);
			Text+="<br/>";
		}
	}
	if (this.Contingut.Mode==2 ||this.Contingut.Mode==3) {
		//
		// Accedir al diari del tema o secció
		//
		var Funcio="Finestral["+this.IndexFinestra+"].MySacActivitats.Activitats[0].AccedirHistorial()";
		if(this.Contingut.Mode==2) var Text2="Diari de la secció <img src='collectiva2/logos/ditada.jpg' WIDTH=17 HEIGHT=18 alt='diari'/>";
		else var Text2="Diari del tema <img src='collectiva2/logos/ditada.jpg' WIDTH=17 HEIGHT=18 alt='diari'/>";
		Text+=GenerarSelector(Text2,Funcio);
		Text+="<br/>";
	}
	return(Text);
}

VisorActivitats.prototype.PermetInsertarActivitatsNoves = function() {
	if(this.ModeCarrega!=1) return(false);
	if(NomUsuari=="") return(false);
	//
	// Si són seccions o temes, només l'editor del curs pot afegir-ne
	//
	if(this.Contingut.Mode==1 || this.Contingut.Mode==2) {
		if(!this.MySacActivitats.Activitats[0]) return(true);
		if(!this.MySacActivitats.Activitats[0].PermetAfegirActivitatPrimaria()) return(false);
	}
	return(true);
}

VisorActivitats.prototype.CursAmbLogin = function() {
	//
	// Indica si s'està visualitzant un curs amb un identificador escrit, per tant
	// pot sortir-ne si vol
	//
	if(!this.MySacActivitats.Activitats[0]) return(false);
	if(this.MySacActivitats.Activitats[0].Items[24].Valor==1) return(false);
	if(this.IdentificadorCurs!="") return(true);
	return(false);
}

/************************************************************************************
*
* Visor d'activitats --> Accions
* 
************************************************************************************/

/************************************************************************************
*
* Visor d'activitats --> Accions --> Insertar nova activitat
* 
************************************************************************************/

VisorActivitats.prototype.AfegirActivitatPrimariaEnIniciCurs = function() {
	// 
	// Volem insertar una secció inicial dintre d'un curs buit de seccions
	//
	var Tipus=6;
	var PosicioRelativa=4;
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	this.AfegirActivitatPrimariaSabentElTipus(Tipus,IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.AfegirTema = function(IndexActivitatReferencia,PosicioRelativa) {
	var Tipus=7;
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.AfegirActivitatPrimariaSabentElTipus(Tipus,IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.AfegirSeccio = function(IndexActivitatReferencia,PosicioRelativa) {
	var Tipus=6;
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.AfegirActivitatPrimariaSabentElTipus(Tipus,IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.AfegirActivitatPrimariaEnIniciSeccio = function() {
	// 
	// Volem insertar un tema nou inicial dintre d'una secció buida
	//
	var Tipus=7;
	var PosicioRelativa=4;
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	this.AfegirActivitatPrimariaSabentElTipus(Tipus,IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.AfegirActivitatPrimariaEnTemaBuit = function() {
	this.AfegirActivitatPrimaria(0,4);
}

VisorActivitats.prototype.AfegirActivitatPrimaria = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.FormulariTipusNouElement.Reset();
	this.FormulariTipusNouElement.Altura=300;
	this.FormulariTipusNouElement.Amplada=400;
	this.FormulariTipusNouElement.CodiMesInfo=15;
	this.FormulariTipusNouElement.TitolF=Traduir(83)+":";	// "Selecciona:"
	var AquiFormulari="Finestral["+this.IndexFinestra+"].FormulariTipusNouElement.";
	var TextA="Finestral["+this.IndexFinestra+"].AfegirActivitatPrimariaSabentElTipus(";
	var TextB=","+IdActivitatReferencia+","+PosicioRelativa+")";
	// Arxiu
	var NomFuncio=TextA+1+TextB;
	var Aqui=AquiFormulari+"Items[1].";
	this.FormulariTipusNouElement.Items[1]=new EntradaSortidaModal(Aqui,25,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[1].Selector=true;
	// Link
	NomFuncio=TextA+2+TextB;
	var Aqui=AquiFormulari+"Items[2].";
	this.FormulariTipusNouElement.Items[2]=new EntradaSortidaModal(Aqui,76,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[2].Selector=true;
	// Text
	NomFuncio=TextA+17+TextB;
	var Aqui=AquiFormulari+"Items[3].";
	this.FormulariTipusNouElement.Items[3]=new EntradaSortidaModal(Aqui,106,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[3].Selector=true;
	// Exercici explícit
	NomFuncio=TextA+29+TextB;
	var Aqui=AquiFormulari+"Items[4].";
	this.FormulariTipusNouElement.Items[4]=new EntradaSortidaModal(Aqui,86,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[4].Selector=true;
	// Exercici autogenerat
	NomFuncio=TextA+26+TextB;
	var Aqui=AquiFormulari+"Items[5].";
	this.FormulariTipusNouElement.Items[5]=new EntradaSortidaModal(Aqui,92,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[5].Selector=true;
	// Compilació d'exercicis
	NomFuncio=TextA+27+TextB;
	var Aqui=AquiFormulari+"Items[6].";
	this.FormulariTipusNouElement.Items[6]=new EntradaSortidaModal(Aqui,105,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[6].Selector=true;
	// Curs
	NomFuncio=TextA+4+TextB;
	var Aqui=AquiFormulari+"Items[7].";
	this.FormulariTipusNouElement.Items[7]=new EntradaSortidaModal(Aqui,158,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[7].Selector=true;
	// Esquema
	NomFuncio=TextA+22+TextB;
	var Aqui=AquiFormulari+"Items[8].";
	this.FormulariTipusNouElement.Items[8]=new EntradaSortidaModal(Aqui,240,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[8].Selector=true;
	// Imatge 
	NomFuncio=TextA+23+TextB;
	var Aqui=AquiFormulari+"Items[9].";
	this.FormulariTipusNouElement.Items[9]=new EntradaSortidaModal(Aqui,187,NomFuncio,AquiFormulari);
	this.FormulariTipusNouElement.Items[9].Selector=true;
	// Executem el formulari
	this.FormulariTipusNouElement.ExecutarModal();
}

VisorActivitats.prototype.AfegirActivitatPrimariaSabentElTipus = function(Tipus,IdActivitatReferencia,PosicioRelativa) {
	this.MySacActivitats.CrearNovaActivitatPrimaria(Tipus,IdActivitatReferencia,PosicioRelativa);
}

/************************************************************************************
*
* Visor d'activitats --> Accions --> Enganxar activitat copiada des del portadocuments
* 
************************************************************************************/

VisorActivitats.prototype.EnganxarCopiaActivitatPrimariaEnIniciCurs = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarActivitatCopiada(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarCopiaActivitatPrimariaEnIniciSeccio = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarActivitatCopiada(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarCopiaActivitatPrimariaEnTemaBuit = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarActivitatCopiada(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarTemaCopiat = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarActivitatCopiada(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarSeccioCopiada = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarActivitatCopiada(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarActivitatCopiadaBis = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarActivitatCopiada(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarActivitatCopiada = function(IdActivitatReferencia,PosicioRelativa) {
	var IdActivitat=MyPortadocuments.IdActivitatActiva();
	if (NomUsuari=="") return;
	var Url="collectiva2/php/novaactprim.php";
	Url=AfegirParametreURIInicial(Url,"a",IdActivitat);
	Url=AfegirParametreURISecundari(Url,"ar",IdActivitatReferencia);
	Url=AfegirParametreURISecundari(Url,"copia",1);
	Url=AfegirParametreURISecundari(Url,"pr",PosicioRelativa);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"tip",0);	// Per a que no es queixi
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornEnganxarActivitatCopiadaBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornEnganxarActivitatCopiadaMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
	this.PassarAMode(0);
}

VisorActivitats.prototype.RetornEnganxarActivitatCopiadaBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		MissatgeModal(18);
		return;
	}
	MyPortadocuments.EliminarAccio();
	ActualitzarFinestral();
}

VisorActivitats.prototype.RetornEnganxarActivitatCopiadaMal =function() {
	MissatgeModal(120);	// "No s'ha pogut gravar la puntuació
}

/************************************************************************************
*
* Visor d'activitats --> Accions --> Enganxar activitat moguda des del portadocuments
* 
************************************************************************************/

VisorActivitats.prototype.EnganxarMogudaActivitatPrimariaEnIniciCurs = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarMogudaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);	
}

VisorActivitats.prototype.EnganxarMogudaActivitatPrimariaEnIniciSeccio = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarMogudaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);	
}

VisorActivitats.prototype.EnganxarMogudaActivitatPrimariaEnTemaBuit = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarMogudaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);	
}

VisorActivitats.prototype.EnganxarMogutTema = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarMogudaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarMogudaSeccio = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarMogudaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarMogudaActivitatPrimariaBis = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarMogudaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarMogudaActivitatPrimaria = function(IdActivitatReferencia,PosicioRelativa) {
	if (NomUsuari=="") return;
	var IdActivitat=MyPortadocuments.IdActivitatActiva();
	var Url="collectiva2/php/moureactivitat.php";
	Url=AfegirParametreURIInicial(Url,"a",IdActivitat);
	Url=AfegirParametreURISecundari(Url,"ar",IdActivitatReferencia);
	Url=AfegirParametreURISecundari(Url,"pr",PosicioRelativa);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornEnganxarMogudaActivitatPrimariaBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornEnganxarMogudaActivitatPrimariaMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorActivitats.prototype.RetornEnganxarMogudaActivitatPrimariaBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		MissatgeModal(18);
		return;
	}
	MyPortadocuments.EliminarAccio();
	this.MyCache.Reset();	// Per a evitar que es vegi l'anterior com a fantasma
	ActualitzarFinestral();
}

VisorActivitats.prototype.RetornEnganxarMogudaActivitatPrimariaMal =function() {
	MissatgeModal(120);	// "No s'ha pogut gravar la puntuació
}

/************************************************************************************
*
* Visor d'activitats --> Accions --> Enganxar Referència des del portadocuments
* 
************************************************************************************/

VisorActivitats.prototype.EnganxarReferenciaActivitatPrimariaEnIniciCurs = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarReferenciaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);	
}

VisorActivitats.prototype.EnganxarReferenciaActivitatPrimariaEnIniciSeccio = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarReferenciaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);	
}

VisorActivitats.prototype.EnganxarReferenciaActivitatPrimariaEnTemaBuit = function() {
	var IdActivitatReferencia=this.MySacActivitats.IdActivitatCentral();
	var PosicioRelativa=4;
	this.EnganxarReferenciaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);	
}

VisorActivitats.prototype.EnganxarReferenciaTema = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarReferenciaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarReferenciaSeccio = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarReferenciaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarReferenciaActivitatPrimariaBis = function(IndexActivitatReferencia,PosicioRelativa) {
	var IdActivitatReferencia=this.MySacActivitats.Activitats[IndexActivitatReferencia].Items[1].Valor;
	this.EnganxarReferenciaActivitatPrimaria(IdActivitatReferencia,PosicioRelativa);
}

VisorActivitats.prototype.EnganxarReferenciaActivitatPrimaria = function(IdActivitatReferencia,PosicioRelativa) {
	if (NomUsuari=="") return;
	var NomActivitat=MyPortadocuments.NomActivitatActiva();
	var IdActivitat=MyPortadocuments.IdActivitatActiva();
	var p=this.MySacActivitats.AfegirNovaActivitat(18);
	this.MySacActivitats.Activitats[p].NomDivModal="FORMULARIMODAL"+this.IndexFinestra;
	this.MySacActivitats.Activitats[p].ActivitatReferencia=IdActivitatReferencia;
	this.MySacActivitats.Activitats[p].PosicioRelativa=PosicioRelativa;
	this.MySacActivitats.Activitats[p].Items[12].Valor=IdActivitat;
	this.MySacActivitats.Activitats[p].Items[11].Valor="Referència a "+NomActivitat;
	this.MySacActivitats.Activitats[p].Items[12].SortidaURLObligatori=true;
	this.MySacActivitats.Activitats[p].Items[11].SortidaURLObligatori=true;
	this.MySacActivitats.Activitats[p].OmplirFormulariNovaActivitat();
	MyPortadocuments.EliminarAccio();
}

/************************************************************************************
*
* Visor d'activitats --> Accions --> Anotar activitat
* 
************************************************************************************/

VisorActivitats.prototype.AnotarActivitat = function(IdActivitat) {
	this.MySacActivitats.AnotarActivitat(IdActivitat);
}

/************************************************************************************
*
* Visor d'activitats --> Accions --> Comentar activitat
* 
************************************************************************************/

VisorActivitats.prototype.ComentarActivitat = function(IdActivitat) {
	this.MySacActivitats.ComentarActivitat(IdActivitat);
}

/************************************************************************************
*
* Visor d'activitats --> Accions --> Accions des del portadocuments
* 
************************************************************************************/

VisorActivitats.prototype.EnganxarCopiaDesDePortadocuments = function(IdActivitat) {
	this.PassarAMode(2);
}

VisorActivitats.prototype.EnganxarActivitatMogudaDesDePortadocuments = function(IdActivitat) {
	this.PassarAMode(2);
}

VisorActivitats.prototype.EnganxarReferencia = function(IdActivitat) {
	this.PassarAMode(2);
}

/***********************************************************************************\
*
* Visor Novetats
* 
************************************************************************************/

function VisorNovetats(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat) {
	if (!TheIndexFinestra) return;
	VisorActivitats.call(this,TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat,Traduir(23));
	this.Autodestruible=true;
	this.MissatgeTemaBuit="No hi ha novetats";
	this.ModeCarrega=2;
}
VisorNovetats.prototype = new VisorActivitats();

/************************************************************************************
*
* Visor Novetats --> Accions --> Accions des del portadocuments
* 
************************************************************************************/

VisorNovetats.prototype.EnganxarCopiaDesDePortadocuments = function(IdActivitat) {
	MyPortadocuments.EliminarAccio();
	MissatgeModal(121);
}

VisorNovetats.prototype.EnganxarActivitatMogudaDesDePortadocuments = function(IdActivitat) {
	MyPortadocuments.EliminarAccio();
	MissatgeModal(121);
}

VisorNovetats.prototype.EnganxarReferencia = function(IdActivitat) {
	MyPortadocuments.EliminarAccio();
	MissatgeModal(121);
}

/***********************************************************************************\
*
*
*
* Bloc Exercicis i Activitats Quètxup
*
*
*
************************************************************************************/

/************************************************************************************
*
* Activitat --> Exercici	(29)
* 
************************************************************************************/

function Index(TheIndexExercici) {
	// Gestiona els índexs dels exercicis 
	this.IndexExercici=TheIndexExercici;	// El primer exercici és 0
						// però visualitza un 1
	this.TextFix=""; 			// Si <>"" --> Obligatori surt el text
	this.TokenIndex=")";
	this.IndexActivat=false;
}
Index.prototype.Output = function() {
	var Text="";
	if (this.IndexActivat==false) return("");
	if (this.TextFix!="") Text=this.TextFix+this.TokenIndex+"&nbsp;";
	else Text='<font color="green">'+(this.IndexExercici+1)+this.TokenIndex+"&nbsp;"+"</font>";
	return (Text);
}

function ActivitatExercici(TheIndexFinestra,TheAqui) {
	if (TheAqui==undefined && TheIndexFinestra==undefined) return;
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.CodiMesInfo=3;
	this.TitolF=Traduir(86);				// "Exercici"
	this.Items[14].Valor=29;				// Tipus = 29

	Aqui=this.Aqui+"Items[12].";
	this.Items[12]=new Formulari(Aqui,81);		 	// Contingut = 12	
	this.Items[12].NomURL="url";
	this.Items[12].FormulariJSON=true;
	Aqui=this.Aqui+"Items[12].Items[1].";
	this.Items[12].Items[1]=new EntradaText(Aqui,87);	// Enunciat = 12.1
		this.Items[12].Items[1].NoPotSerBuit=true;
		this.Items[12].Items[1].TextArea=true;
		this.Items[12].Items[1].Columnes=70;
		this.Items[12].Items[1].SortidaJSONObligatoria=true;
	Aqui=this.Aqui+"Items[12].Items[2].";
	this.Items[12].Items[2]=new EntradaText(Aqui,88);	// Solució = 12.2
		this.Items[12].Items[2].TextArea=true;
		this.Items[12].Items[2].Columnes=70;
		this.Items[12].Items[2].SortidaJSONObligatoria=true;
	Aqui=this.Aqui+"Items[12].Items[3].";
	this.Items[12].Items[3]=new EntradaText(Aqui,89);	// Pauta = 12.3
	this.Items[12].Items[3].Valor="___D2___";
		this.Items[12].Items[3].AmpladaPx=70;
		this.Items[12].Items[3].SortidaJSONObligatoria=true;
		this.Items[12].Items[3].CodiMesInfo=1;
	Aqui=this.Aqui+"Items[12].Items[4].";
	this.Items[12].Items[4]=new EntradaText(Aqui,90);	// Solucions = 12.4
		this.Items[12].Items[4].AmpladaPx=70;
	this.Items[12].JSONEntreCorxets=true;

	this.FuncioFinalGenerarNouContingutBe="";
	this.ContingutCarregat=false;
	//
	// Formulari d'execució de l'exercici
	//
	this.AmbBotoCorregir=true;
	this.AmbBotoSolucio=true;
	this.FuncioExerciciCorregitBe="";	// Funció que es crida quan s'ha corregit i està bé
	this.FuncioExerciciCorregitMal="";	// o està malament.
	this.MyGestorInteractiu=new Object(); 
	this.IdDivIntents="";
	this.IdDivMissatgeCorrecte="";
	this.IdDivMissatgeIncorrecte=""; 
	this.IdDivMissatgeRes="";
	this.IdDivSolucioGeneral="";
	this.NombreIntentsFallits=0;
	this.NombreMaximIntentsFallits=3;	// = 0 --> No hi ha màxim
	this.CalPuntuarExerciciBe=false;
	this.ExerciciBloquejat=false;		// Si s'ha vist la solució ja no es pot corregir.
	//
	// Camps associats a la generació d'un exercici
	//
	this.Enunciat="";
	this.SolucioHTML="";
	this.Pauta="";
	this.SolucionsInteractives="";
	this.Operacions=1;
	//
	// Camps associats al conjunt d'exercicis
	//
	this.Titol="";
	this.EnunciatGeneral="";
	this.SolucioGeneral="";
	this.PautaGeneral="";
	//	
	// Activitat Quètxup associada a aquests exercicis
	//
	this.NomActivitat="";
	this.UrlActivitat="";
	this.ConfiguracioActivitat="";
	//
	// Índex de l'exercici
	//
	this.IndexExercici=0;
	this.MyIndex =new Index(this.IndexExercici);
	//
	// Tipus de gestor interactiu
	//
	this.ModelGestorInteractiu="RespostaAlfaNumericaMultiple";
	this.BaseURL="";
	this.IconaActivitat=new Imatge("collectiva2/logos/","exercici.gif","Exercici",16,16);
}
ActivitatExercici.prototype = new Activitat();

ActivitatExercici.prototype.PutIndex = function(TheIndex) {
	this.IndexExercici=TheIndex;
	this.MyIndex.IndexExercici=TheIndex;
	this.MyIndex.IndexActivat=true;
}

/***********************************************************************************\
*
* Activitat --> Exercici --> Camps específics
* 
************************************************************************************/

ActivitatExercici.prototype.CarregarCampURL = function(Contingut) {
	if (Contingut!="") {
		var Text=this.TransformarEntrada(Contingut);
		var ArrayExerciciJSON=eval("("+Text+")");
		this.Items[12].Items[1].Input(ArrayExerciciJSON[0][0]);
		this.Items[12].Items[2].Input(ArrayExerciciJSON[0][1]);
		this.Items[12].Items[3].Input(ArrayExerciciJSON[0][2]);
		this.Items[12].Items[4].Valor="";
		var NombreRespostesPautades=ArrayExerciciJSON[0].length-3;
		for (var j=1;j<=NombreRespostesPautades;j++) {
			var TextSolucio=ArrayExerciciJSON[0][j+2];
			if (this.SolucionsInteractives!="") this.Items[12].Items[4].Valor+=" ; ";
			this.Items[12].Items[4].Valor+=TextSolucio;
		}	
	}
}

ActivitatExercici.prototype.TransformarEntrada = function(Contingut) {
	//var Text=decodeURIComponent(Contingut);
	return(Contingut);
}

ActivitatExercici.prototype.CarregarPerArrayJSON = function(TheArray,ThePautaPerDefecte) {
	this.Enunciat=TheArray[0];
	this.SolucioHTML=TheArray[1];
	this.Pauta=TheArray[2];
	if (this.Pauta=="") this.Pauta=ThePautaPerDefecte;
	//
	// Respostes és un text amb totes les respostes separades per punt i coma.
	// Serveix per a editar-les
	//
	this.SolucionsInteractives="";
	var NombreRespostesPautades=TheArray.length-3;
	for (var j=1;j<=NombreRespostesPautades;j++) {
		var TextSolucio=TheArray[j+2];
		if (this.SolucionsInteractives!="") this.SolucionsInteractives+=" ; ";
		this.SolucionsInteractives+=TextSolucio;
	}
}

ActivitatExercici.prototype.GenerarGestorInteractiu = function() {
	//
	// Per alguna raó, el objecte Resposta s'oblida
	//

	if (this.ContingutAJAXGenerador!=undefined) {
		if (this.ContingutAJAXGenerador!="") {
			eval(this.ContingutAJAXGenerador);
		}
	}

	eval("this.MyGestorInteractiu=new "+this.ModelGestorInteractiu+"(this.IndexExercici,this.Pauta,this.IndexFinestra);");

	var MyCutter=new Cutter(this.SolucionsInteractives,";");
	while (!MyCutter.Final) {
		var Solucio=Trim(MyCutter.Tallar());
		this.MyGestorInteractiu.AfegirSolucio(Solucio);
	}
	this.MyGestorInteractiu.InfoExtra=this.InfoExtra;
}

/***********************************************************************************\
*
* Activitat --> Exercici --> GenerarNouContingut
* 
************************************************************************************/

ActivitatExercici.prototype.GenerarNouContingut = function() {
	this.Enunciat=this.Items[12].Items[1].Valor;
	this.SolucioHTML=this.Items[12].Items[2].Valor;
	this.Pauta=this.Items[12].Items[3].Valor;
	this.SolucionsInteractives=this.Items[12].Items[4].Valor;
	this.FinalGenerarNouContingutBe();
}

ActivitatExercici.prototype.FinalGenerarNouContingutBe = function() {
	if (this.FuncioFinalGenerarNouContingutBe!="") {
		eval(this.FuncioFinalGenerarNouContingutBe);
	}
}

ActivitatExercici.prototype.FinalGenerarNouContingutMal = function() {
	// Rutina reescrivible
	MissatgeModal(16);
}

/***********************************************************************************\
*
* Activitat --> Exercici --> Entrar
* 
************************************************************************************/

ActivitatExercici.prototype.Entrar = function() {
	MyJoc=null;
	if (this.ContingutCarregat==true) {
		this.ExecutarExercici();
		return;
	}
	this.FuncioFinalGenerarNouContingutBe=this.Aqui+"ExecutarExercici()";	
	var Url="collectiva2/php/loadexercici.php";
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);	// IdActivitat
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornCarregarContingutExerciciBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCarregarContingutExerciciMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

ActivitatExercici.prototype.RetornCarregarContingutExerciciBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	this.CarregarCampURL(ContingutAJAX);
	this.ContingutCarregat=true;
	this.FuncioFinalGenerarNouContingutBe=this.Aqui+"ExecutarExercici()";
	this.GenerarNouContingut();
}

ActivitatExercici.prototype.RetornCarregarContingutExerciciMal =function() {
	MissatgeModal(16);	// "Error de connexió"
}

ActivitatExercici.prototype.ExecutarExercici =function() {
	this.CalPuntuarExerciciBe=false;
	var Aqui=this.Aqui+"FormulariExecucio.";
	this.FormulariExecucio=new Formulari(Aqui,0);
	this.FormulariExecucio.TitolF=this.Items[11].Valor;
	this.FormulariExecucio.MargeEsquerra=0;
	this.FormulariExecucio.NomDivModal="FORMULARIMODAL"+this.IndexFinestra;
	Aqui=this.Aqui+"FormulariExecucio.Items[1].";
	this.FormulariExecucio.Items[1]=new EntradaHTML(Aqui,0);
	//
	// En principi un exercici "suelto" no visualitza la solució.
	//
	this.AmbBotoSolucio=false;
	//	
	// i té infinits intents de resposta
	//
	this.NombreMaximIntentsFallits=0;
	this.FormulariExecucio.Items[1].Valor=this.GenerarHTMLEspaiTreball();
	var FuncioSortida=this.Aqui+"TancarExercici()";
	Aqui=this.Aqui+"FormulariExecucio.Items[2].";
	this.FormulariExecucio.Items[2]=new EntradaSortidaModal(Aqui,119,FuncioSortida,this.Aqui);

	this.FormulariExecucio.ConvertirMathML=true;
	this.FormulariExecucio.AmbBotoCancellacio=false;
	this.FormulariExecucio.ExecutarModal();
	this.ActualitzarVisitaActivitat(1);
}

ActivitatExercici.prototype.TancarExercici =function() {
	if (this.CalPuntuarExerciciBe==true) this.Puntuar(100);
}

ActivitatExercici.prototype.GenerarHTMLEspaiTreball =function() {
	var Text="<div style='background-color:white; padding:8px;'>";
	Text+=this.GenerarHTML();
	Text+="</div>";
	return(Text);
}


/***********************************************************************************\
*
* Activitat --> Exercici --> Generar HTML
* 
************************************************************************************/

ActivitatExercici.prototype.GenerarHTML = function() {	
	var Text="";
	var TextIndex=this.MyIndex.Output();	
	//
	// Iniciem el gestor de la interacció
	//
	this.GenerarGestorInteractiu();
	//
	// Afegim la pregunta
	//
	var Enunciat=DecodeQuetxup(this.Enunciat,this.BaseURL);
	if (this.MyGestorInteractiu.EsTipusTest()) Enunciat=this.ModificarEnunciatTest(Enunciat); 
	Text+="<big>"+Enunciat+"</big>";

	//
	// Afegim la resposta general (oculta)
	//

	Text+="<br />";
	if (this.ModeMini!=true) Text+="<br />";
	Text+=this.GenerarHTMLSolucioGeneral();

	//	
	// Afegim missatge "Resposta:"
	//

	Text+="<div>";

	if (this.ModeMini!=true) {
		Text+='<small><small><font color="blue">'+Espais(4) ;
		Text+= Traduir(191)+ ":&nbsp;</small></small></font>";	// "Resposta"
	}
	
	//
	// Afegim formulari d'entrada de resposta:
	//
	FuncioCorregir=	this.Aqui+"Corregir(true)";
	Text+=Espais(3)+this.MyGestorInteractiu.Output(0);

	//
	// Afegim el botó de correcció
	//	

	if (this.MyGestorInteractiu.HiHaAlgoPerCorregir() && this.AmbBotoCorregir==true) {
		// Afegim tot el que cal per a corregir una resposta.
		Text+=Espais(3)+this.GenerarBotoCorreccio();
	}

	//
	// Opcionalment afegim el botó de visualitzar solució individual
	//
	if (this.AmbBotoSolucio) {
		Text+=Espais(1)+this.GenerarBotoSolucio();
	}
	
	//
	// Afegim la solució pautada oculta
	//

	// Text+=this.GenerarHTMLSolucioPautada();

	Text+="</div>";

	// Donem format a tot plegat
	if (TextIndex!="") {
		Text="<table><tr><td style='valign:top'><b>"+TextIndex+"</b></td><td>"+Text+"</td></tr></table>";
	} 
	return (Text);
}

ActivitatExercici.prototype.GenerarBotoSolucio =function() {
	var Text="";
	var f=this.Aqui+"VisualitzarSolucio()";
	var TextBoto="S";
	Text+=GenerarBoto(TextBoto,f);
	return(Text);
}

ActivitatExercici.prototype.VisualitzarSolucio =function() {
	this.ExerciciBloquejat=true;
	this.MyGestorInteractiu.VisualitzarSolucioPautada();
	this.VisualitzarSolucioGeneral();
	// Visualitzar les solucions d'un exercici implica no poder puntuar aquesta llista
	if(MyJoc) MyJoc.AbortarPartida();
}

ActivitatExercici.prototype.GenerarHTMLSolucioGeneral =function() {
	this.IdDivSolucioGeneral=MyCodiDivUnico.NouCodi("SOLGEN");
	var Text="";
	var Solucio=DecodeQuetxup(this.SolucioHTML,this.BaseURL);
	if (Solucio=="") return("");
	Text+='<div style="display: none;" ';
	Text+='id="'+this.IdDivSolucioGeneral+'">'+Espais(3)+Solucio+'<br /><br /></div>';
	return (Text);
}

ActivitatExercici.prototype.VisualitzarSolucioGeneral = function () {
	var oDiv=document.getElementById(this.IdDivSolucioGeneral);
	if (oDiv) oDiv.style.display="inline";
}

ActivitatExercici.prototype.ModificarEnunciatTest =function(Cadena) {
	// Si la pregunta és Test posem les lletres indicadores amb color verd
	Cadena=Cadena.replace("A)","<br />"+this.CadenaTest("A"));
	Cadena=Cadena.replace("B)","<br />"+this.CadenaTest("B"));
	Cadena=Cadena.replace("C)","<br />"+this.CadenaTest("C"));
	Cadena=Cadena.replace("D)","<br />"+this.CadenaTest("D"));
	Cadena=Cadena.replace("E)","<br />"+this.CadenaTest("E"));
	Cadena=Cadena.replace("F)","<br />"+this.CadenaTest("F"));
	Cadena=Cadena.replace("G)","<br />"+this.CadenaTest("G"));
	Cadena=Cadena.replace("H)","<br />"+this.CadenaTest("H"));
	return(Cadena);
}

ActivitatExercici.prototype.CadenaTest =function(Lletra) {
	var Color="green"
	return('<span style="color: '+Color+';"><small><b>'+Lletra+')</b></small></span>');
}

/************************************************************************************
*
* Exercici --> Corregir
*
************************************************************************************/

ActivitatExercici.prototype.Corregir = function(BotoPolsat) {
	//
	// BotoPolsat 	= true si ha sigut l'usuari qui ha polsat el botó
	// 		= false si s'ha fet una correcció automàtica
	//
	if(this.ExerciciBloquejat==true) return(false);
	var Resultat=this.CorregirGeneric();
	if (Resultat==true) {
		this.ExerciciBe=true;
		if (MyJoc!=null) MyJoc.AccioExerciciCorrecte(this.IndexExercici);
		if (this.Items[1].Valor>0) {
			//
			// Si és un exercici individual, avisa per a actualitzar a 100%
			//
			this.CalPuntuarExerciciBe=true;
		}
	}
	else {
		this.ExerciciBe=false;
		if (MyJoc!=null) MyJoc.AccioExerciciIncorrecte(this.IndexExercici);	
		if (BotoPolsat==true && this.NombreMaximIntentsFallits>0) {
			this.NombreIntentsFallits+=1;
			this.VisualitzarIntentsFallits();
			if (this.NombreIntentsFallits>this.NombreMaximIntentsFallits) {
				this.ExerciciBloquejat=true; 
				if (MyJoc!=null) MyJoc.FinalitzarPartida();
				//return;
			}
		}  
	}
	return (Resultat);		
}

ActivitatExercici.prototype.VisualitzarIntentsFallits = function() {
	var NIntents=this.NombreIntentsFallits;
	var MaxIntents=this.NombreMaximIntentsFallits;
	var Text="";
	var oDiv=document.getElementById(this.IdDivIntents);
	if (oDiv) {
		Text=MaxIntents-NIntents+1;
		if (Text<=0) {
			Text="<span style='color:red;'><sup><small>0</small></sup></span>";
		}
		else {
			Text="<span style='color:green;'><sup><small>"+Text+"</small></sup></span>";
		}
		oDiv.innerHTML=Text;
	}
}

ActivitatExercici.prototype.CorregirGeneric = function() {
	this.GestionarEvitarAcolorirRespostes();
	this.AmagarMissatgesCorrecteIncorrecte();
	var Resultat=this.MyGestorInteractiu.Corregir();
	if (Resultat==true) this.VisualitzarMissatgeCorrecte();
	else this.VisualitzarMissatgeIncorrecte();
	return (Resultat);		
}

ActivitatExercici.prototype.GestionarEvitarAcolorirRespostes=function() {
	// A vegades no és interessant l'acolorir les respostes en verd si està bé o 
	// en groc si està malament, per a evitar donar massa pistes o perquè si les respostes
	// poden estar en llocs diferents, no és una informació bona.
	if (MyJoc) {
		MyJoc.EvitarAcolorirRespostesExercici=false;
		if (this.Pauta.search("###")!=-1) MyJoc.EvitarAcolorirRespostesExercici=true;
	}
}

ActivitatExercici.prototype.VisualitzarMissatgeCorrecte=function() {
	var oDiv=document.getElementById(this.IdDivMissatgeCorrecte);
	if (oDiv) oDiv.style.display="inline";
	var oDiv=document.getElementById(this.IdDivMissatgeRes);
	if (oDiv) oDiv.style.display="none";
	// Si no es pintaven de colors, ara sí
	if (MyJoc) {
		var EvitarAcolorirRespostesSempre=MyJoc.EvitarAcolorirRespostesSempre;
		var EvitarAcolorirRespostesExercici=MyJoc.EvitarAcolorirRespostesExercici;
		if (EvitarAcolorirRespostesSempre==false || EvitarAcolorirRespostesExercici==false) {
			this.MyGestorInteractiu.VisualitzarTotVerd();
		}
	}
	this.VisualitzarSolucioGeneral(); // Si està bé, també visualitzem la solució HTML
}

ActivitatExercici.prototype.VisualitzarMissatgeIncorrecte=function() {
	var oDiv=document.getElementById(this.IdDivMissatgeIncorrecte);
	if (oDiv) oDiv.style.display="inline";
	var oDiv=document.getElementById(this.IdDivMissatgeRes);
	if (oDiv) oDiv.style.display="none";
}

ActivitatExercici.prototype.AmagarMissatgesCorrecteIncorrecte=function() {
	var oDiv=document.getElementById(this.IdDivMissatgeCorrecte);
	if (oDiv) oDiv.style.display="none";
	oDiv=document.getElementById(this.IdDivMissatgeIncorrecte);
	if (oDiv) oDiv.style.display="none";
	var oDiv=document.getElementById(this.IdDivMissatgeRes);
	if (oDiv) oDiv.style.display="inline";
}

ActivitatExercici.prototype.GenerarBotoCorreccio =function(TextBoto) {
	var Text="";
	var f=this.Aqui+"Corregir(true)";
	var TextBoto=" ? ";
	if (this.ModeMini==true) TextBoto="?";
	Text+=GenerarBoto(TextBoto,f);
	// Afegim l'espai per a visualitzar el nombre d'intents fallits
	this.IdDivIntents=MyCodiDivUnico.NouCodi("INTENTS");
	this.IdDivMissatgeCorrecte=MyCodiDivUnico.NouCodi("CORRECTE");
	this.IdDivMissatgeIncorrecte=MyCodiDivUnico.NouCodi("INCORRECTE");
	this.IdDivMissatgeRes=MyCodiDivUnico.NouCodi("RES");
	// Afegim els missatges Correcte / Incorrecte (ocults)
	if (this.ModeMini==false) {
		Text+=Espais(3)+'<span style="color: green; display: none;" id="'+this.IdDivMissatgeCorrecte+'">Correcte</span>';
		Text+=Espais(3)+'<span style="color: red; display: none;" id="'+this.IdDivMissatgeIncorrecte+'">Incorrecte</span>';
		Text+=Espais(3);
	}
	else {
		Text+='&nbsp;<span style="display: none;" id="'+this.IdDivMissatgeCorrecte+'"><img src="collectiva2/logos/quetxup/ok.png" alt="ok" width="18" height="17"></img></span>';
		Text+='&nbsp;<span style="display: none;" id="'+this.IdDivMissatgeIncorrecte+'"><img src="collectiva2/logos/quetxup/no_ok.png" alt="no_ok" width="16" height="16"></span>';
		Text+='&nbsp;<span style="display: none;" id="'+this.IdDivMissatgeRes+'"><img src="collectiva2/logos/quetxup/res.png" alt="res" width="16" height="16"></span>';
	}
	Text+='<span id="'+this.IdDivIntents+'"></span>&nbsp;';
	return(Text);
}

/***********************************************************************************\
*
* Activitat --> Exercici --> Edició
* 
************************************************************************************/

ActivitatExercici.prototype.Editar = function() {
	if (this.ContingutCarregat==true) {
		this.ExecutarModal();
		return;
	}
	var Url="collectiva2/php/loadexercici.php";
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornEditarCarregarContingutExerciciBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornEditarCarregarContingutExerciciMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

ActivitatExercici.prototype.RetornEditarCarregarContingutExerciciBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	this.CarregarCampURL(ContingutAJAX);
	this.ContingutCarregat=true;
	this.ExecutarModal();
}

ActivitatExercici.prototype.RetornEditarCarregarContingutExerciciMal =function() {
	MissatgeModal(16);	
}

/***********************************************************************************\
*
*
* Objecte RespostaAlfaNumericaMultiple
*
* Gestiona la interactivitat d'un exercici amb l'usuari.
*
*
************************************************************************************/

function RespostaAlfaNumericaMultiple(TheIndexExercici,Pauta,TheIndexFinestra) {
	this.IndexFinestra=TheIndexFinestra;
	this.IndexExercici=TheIndexExercici;
	this.InfoExtra=""; // Una informació extra que es pot afegir després.
	this.Parts=new Array(); // Array de BlocsDeMultiRespostaAlfaNumerica
	MyCutter=new Cutter(Pauta,"|||");
	while(!MyCutter.Final) {
		var tros=MyCutter.Tallar();
		var IndexPart=this.Parts.length;
		this.Parts[IndexPart]=new BlocsDeMultiRespostaAlfaNumerica(this.IndexExercici,IndexPart,tros,this.IndexFinestra);
	}
}

RespostaAlfaNumericaMultiple.prototype.EsTipusTest = function() {
	// Retorna true si la resposta és de tipus Test
	for (var i=0;i<this.Parts.length;i++) {
		if (this.Parts[i].EsTipusTest()) return (true);
	}
	return (false);
}

RespostaAlfaNumericaMultiple.prototype.VisualitzarSolucioPautada = function() {
	for (var i=0;i<this.Parts.length;i++) {
		this.Parts[i].VisualitzarSolucioPautada();
	}
}

/************************************************************************************
*
* RespostaAlfaNumericaMultiple --> Entrada de solucions
*
************************************************************************************/

RespostaAlfaNumericaMultiple.prototype.AfegirSolucio = function(TextSolucio) {
	// Afegeix una solució a la última posició possible. Retorna false 
	// Si està tot ple.
	for (var i=0;i<this.Parts.length;i++) {
		if (this.Parts[i].AfegirSolucio(TextSolucio)) return (true);
	}
	return (false);
}

/************************************************************************************
*
* RespostaAlfaNumericaMultiple --> Output
*
************************************************************************************/

RespostaAlfaNumericaMultiple.prototype.Output = function(Mode) {
	var Text="";
	for (var i=0;i<this.Parts.length;i++) {
		Text=Text+this.Parts[i].Output(Mode);
	}
	return (Text);
}

/************************************************************************************
*
* RespostaAlfaNumericaMultiple --> Corregir
*
************************************************************************************/

RespostaAlfaNumericaMultiple.prototype.Corregir =function () {
	var RespostaCorrecta=true;
	for (var i=0;i<this.Parts.length;i++) {
		if (!this.Parts[i].Corregir()) RespostaCorrecta=false;
	}
	return (RespostaCorrecta);
}

RespostaAlfaNumericaMultiple.prototype.HiHaAlgoPerCorregir =function () {
	// Indica si hi ha algo interactiu. Si no, no cal afegir el botó 
	// de corregir individual.
	for (var i=0;i<this.Parts.length;i++) {
		if (this.Parts[i].HiHaAlgoPerCorregir()) return(true);
	}
	return (false);
}

RespostaAlfaNumericaMultiple.prototype.VisualitzarTotVerd=function () {
	for (var i=0;i<this.Parts.length;i++) {
		this.Parts[i].VisualitzarTotVerd();
	}
}

RespostaAlfaNumericaMultiple.prototype.AccioExerciciCorrecte=function () {
	// Aquesta rutina pot ser reescrita per objectes tipus Resposta
	// per a produir una acció especial quan l'usuari encerta
}

RespostaAlfaNumericaMultiple.prototype.AccioExerciciIncorrecte=function () {
	// Aquesta rutina pot ser reescrita per objectes tipus Resposta
	// com per exemple Puzzle
	// per a produir una acció especial quan l'usuari no encerta
}

/************************************************************************************
*
* RespostaAlfaNumericaMultiple --> Capturar Resposta
*
************************************************************************************/

RespostaAlfaNumericaMultiple.prototype.CapturarResposta =function () {
	var Respostes="";
	for (var i=0;i<this.Parts.length;i++) {
		if (Respostes!="") Respostes+=", ";
		Respostes+=this.Parts[i].CapturarResposta();
	}
	return (Respostes);
}

/***********************************************************************************\
*
* BlocsDeMultiRespostaAlfaNumerica
*
************************************************************************************/

function BlocsDeMultiRespostaAlfaNumerica(TheIndexExercici,TheIndexPart,ThePauta,TheIndexFinestra) {
	this.IndexFinestra=TheIndexFinestra;
	this.IndexExercici=TheIndexExercici;
	this.IndexPart=TheIndexPart;
	this.Blocs=new Array(); // Array de MultiRespostaAlfaNumerica
	var MyCutter=new Cutter(ThePauta,"###");
	while(!MyCutter.Final) {
		var Pauta=MyCutter.Tallar();
		var IndexBloc=this.Blocs.length;
		this.Blocs[IndexBloc]=new MultiRespostaAlfaNumerica(this.IndexExercici,this.IndexPart,IndexBloc,Pauta,this.IndexFinestra);
	}
}

BlocsDeMultiRespostaAlfaNumerica.prototype.EsTipusTest = function() {
	// Retorna true si és tipus Test
	for (var i=0;i<this.Blocs.length;i++) {
		if (this.Blocs[i].EsTipusTest()) return (true);
	}
	return (false);
}

BlocsDeMultiRespostaAlfaNumerica.prototype.VisualitzarSolucioPautada = function() {
	for (var i=0;i<this.Blocs.length;i++) {
		this.Blocs[i].VisualitzarSolucioPautada();
	}
}

/************************************************************************************
*
* BlocsDeMultiRespostaAlfaNumerica --> Entrada de solucions
*
************************************************************************************/

BlocsDeMultiRespostaAlfaNumerica.prototype.AfegirSolucio = function(TextSolucio) {
	// Afegeix una solució a la última posició possible. Retorna false 
	// Si està tot ple.
	for (var i=0;i<this.Blocs.length;i++) {
		if (this.Blocs[i].AfegirSolucio(TextSolucio)) return (true);
	}
	return (false);
}

/************************************************************************************
*
* BlocsDeMultiRespostaAlfaNumerica --> Output
*
************************************************************************************/

BlocsDeMultiRespostaAlfaNumerica.prototype.Output = function(Mode) {
	var Text="";
	for (var i=0;i<this.Blocs.length;i++) {
		Text=Text+this.Blocs[i].Output(Mode);
	}
	return (Text);
}

/************************************************************************************
*
* BlocsDeMultiRespostaAlfaNumerica --> Corregir
*
************************************************************************************/

BlocsDeMultiRespostaAlfaNumerica.prototype.Corregir =function () {
	// Corregeix i retorna true si és correcte.
	// retorna false si no és correcte, buit o és una respota no acceptable
	
	// Generem una matriu per a assenyalar els blocs utilitzats del document
	var BlocsUtilitzatsDocument=new Array();
	for (var i=0;i<this.Blocs.length;i++) BlocsUtilitzatsDocument[i]=false;
	
	// Anem mirant bloc a bloc de solucions (variable i) si està o no en el document
	for (var i=0;i<this.Blocs.length;i++) {
		var BlocTrobat=false;
		for (var j=0;j<this.Blocs.length;j++) {
			// Anem mirant en els blocs del document (variable j)
			// Només els que no s'han utilitzat encara
			// Si coincideix o no
			if (BlocsUtilitzatsDocument[j]==false) {
				if (this.Blocs[i].Corregir(j)) {
					// Si s'ha trobat el marca com utilitzat
					BlocTrobat=true;
					BlocsUtilitzatsDocument[j]=true;
					break;
				}
			}
		}
		if (!BlocTrobat) return (false);
	}
	// Tots els blocs s'han trobat. Per tant la resposta és correcte.
	return (true);
}

BlocsDeMultiRespostaAlfaNumerica.prototype.HiHaAlgoPerCorregir =function () {
	// Indica si hi ha algo interactiu. Si no, no cal afegir el botó 
	// de corregir individual.
	for (var i=0;i<this.Blocs.length;i++) {
		if (this.Blocs[i].HiHaAlgoPerCorregir()) return(true);
	}
	return (false);
}

BlocsDeMultiRespostaAlfaNumerica.prototype.VisualitzarTotVerd=function () {
	for (var i=0;i<this.Blocs.length;i++) {
		this.Blocs[i].VisualitzarTotVerd();
	}
}

/************************************************************************************
*
* BlocsDeMultiRespostaAlfaNumerica --> Capturar Resposta
*
************************************************************************************/

BlocsDeMultiRespostaAlfaNumerica.prototype.CapturarResposta =function () {
	var Respostes="";
	for (var i=0;i<this.Blocs.length;i++) {
		if (Respostes!="") Respostes+=", ";
		Respostes+=this.Blocs[i].CapturarResposta();
	}
	return (Respostes);
}

/***********************************************************************************\
*
* MultiRespostaAlfaNumerica
*
************************************************************************************/

function MultiRespostaAlfaNumerica(TheIndexExercici,TheIndexPart,TheIndexBloc,ThePauta,TheIndexFinestra) {
	// Una resposta alfanumèrica múltiple es de la forma 
	// Text ___Format1___ text ___Format2___ text...
	this.IndexFinestra=TheIndexFinestra;
	this.IndexExercici=TheIndexExercici;
	this.IndexPart=TheIndexPart;
	this.IndexBloc=TheIndexBloc;
	this.Pauta=ThePauta;
	this.Respostes=new Array(); // Matriu de RespostaAlfaNumerica's

	// Agafa de ThePautaResposta els trosos    "  TextPrevi ___Nom___  " , que representen
	// cada resposta alfanumèrica.
	
	var MyCutter=new Cutter(ThePauta,"___");
	while (!MyCutter.Final) {
		var Text=MyCutter.Tallar(); // Text abans del ___
		if (MyCutter.Final) return; // no hi han més entrades.
		var Format=MyCutter.Tallar();  // Text dintre del ___
		var IndexResposta=this.Respostes.length;
		this.Respostes[IndexResposta]= new RespostaAlfaNumerica(TheIndexExercici,TheIndexPart,TheIndexBloc,IndexResposta,Format,this.IndexFinestra);
	}
}

MultiRespostaAlfaNumerica.prototype.EsTipusTest = function() {
	// Retorna true si és de tipus Test
	for (var i=0;i<this.Respostes.length;i++) {
		if (this.Respostes[i].EsTipusTest==true) return (true);
	}
	return (false);
}

MultiRespostaAlfaNumerica.prototype.VisualitzarSolucioPautada = function() {
	for (var i=0;i<this.Respostes.length;i++) {
		this.Respostes[i].VisualitzarSolucioPautada();
	}
} 

/************************************************************************************
*
* MultiRespostaAlfaNumerica --> Entrada de solucions
*
************************************************************************************/

MultiRespostaAlfaNumerica.prototype.AfegirSolucio = function(TextSolucio) {
	// Afegeix una solució a la última posició possible. Retorna false 
	// Si està tot ple.
	for (var i=0;i<this.Respostes.length;i++) {
		if (this.Respostes[i].InputSolucio(TextSolucio)) return (true);
	}
	return (false);
}

/************************************************************************************
*
* MultiRespostaAlfaNumerica --> Output
*
************************************************************************************/

MultiRespostaAlfaNumerica.prototype.Output = function(Mode) {
	if (Mode==0 || Mode==5) return (this.OutputInteractiu(Mode));
	else return(this.OutputEstatic(Mode));
}

MultiRespostaAlfaNumerica.prototype.OutputInteractiu= function(Mode) {
	// Substitueix a la pauta cada cadena ___Format___ per una cadena útil.
	var Text="";	
	var MyCutter=new Cutter(this.Pauta,"___");
	var IndexResposta=0;
	while (!MyCutter.Final) {
		var TextPrevi=MyCutter.Tallar(); // Text abans del ___
		Text=Text+TextPrevi;
		if (MyCutter.Final) return (Text); // no hi han més entrades.
		var FormatResposta=MyCutter.Tallar();  	// Text dintre del ___
							// és el text que cal substituir
		if (Mode==0) Text=Text+this.Respostes[IndexResposta].OutputInteractiu();
		else Text=Text+this.Respostes[IndexResposta].OutputEstatic(Mode);		
		IndexResposta=IndexResposta+1;
	}
	return (Text);
}

MultiRespostaAlfaNumerica.prototype.OutputEstatic = function (Mode) {
	var Text="";
	for (var i=0;i<this.Respostes.length;i++) {
		Text+=this.Respostes[i].OutputEstatic(Mode);
	}
	return (Text);
}

/************************************************************************************
*
* MultiRespostaAlfaNumerica --> Corregir
*
************************************************************************************/

MultiRespostaAlfaNumerica.prototype.Corregir= function(BlocDocument) {
	var RespostaCorrecta=true;
	for (var i=0;i<this.Respostes.length;i++) {
		if (!this.Respostes[i].Corregir(BlocDocument)) RespostaCorrecta=false;
	}
	return (RespostaCorrecta);
}

MultiRespostaAlfaNumerica.prototype.VisualitzarTotVerd=function () {
	for (var i=0;i<this.Respostes.length;i++) {
		this.Respostes[i].VisualitzarTotVerd();
	}
}

MultiRespostaAlfaNumerica.prototype.HiHaAlgoPerCorregir =function () {
	// Indica si hi ha algo interactiu. Si no, no cal afegir el botó 
	// de corregir individual.
	if (this.Respostes.length>0) return(true);
	return (false);
}

/************************************************************************************
*
* MultiRespostaAlfaNumerica --> Capturar Resposta
*
************************************************************************************/

MultiRespostaAlfaNumerica.prototype.CapturarResposta =function () {
	var Respostes="";
	for (var i=0;i<this.Respostes.length;i++) {
		if (Respostes!="") Respostes+=", ";
		Respostes+=this.Respostes[i].CapturarResposta();
	}
	return (Respostes);
}

/***********************************************************************************\
*
* RespostaAlfaNumerica
*
************************************************************************************/

function RespostaAlfaNumerica(TheIndexExercici,TheIndexPart,TheIndexBloc,TheIndexResposta,TheFormat,TheIndexFinestra) {
	// Aquest objecte és el nucli de tot el mòdul. Gestiona el contingut d'una resposta
	// explícita numèrica o 'tipus test', i la seva presentació en pantalla.
	this.IndexFinestra=TheIndexFinestra;
	this.IndexExercici=TheIndexExercici;
	this.IndexPart=TheIndexPart;
	this.IndexBloc=TheIndexBloc;
	this.IndexResposta=TheIndexResposta;
	this.Format=TheFormat;	
	this.SolucioHTML="";
	this.SolucioIntroduida=false;	// Indica si s'ha carregat la solució

	// Configuració:
	this.TextEspaiResposta="_____"; // Forma de visualitzar l'espai buit 
					// en la sortida per pantalla per a imprimir
	this.EsTipusTest=false;		// Indica si l'exercici és de tipus test.
	if (this.Format) {
		if (this.Format.substring(0,1)=="T") this.EsTipusTest=true;
	}
}

RespostaAlfaNumerica.prototype.VisualitzarSolucioPautada = function() {
	var Id='INPUT_'+this.IndexExercici+"_"+this.IndexPart+"_"+this.IndexBloc+"_"+this.IndexResposta+"_"+this.IndexFinestra;
	if (Id) {
		document.getElementById(Id).value=this.OutputSolucio();
		document.getElementById(Id).style.cssText = 'background-color: #ffe2b1';
	}
} 

/************************************************************************************
*
* RespostaAlfaNumerica --> Entrada de solucions
*
************************************************************************************/

RespostaAlfaNumerica.prototype.InputSolucio= function(TheSolucio) {
	if (this.SolucioIntroduida==true) return (false);
	this.SolucioHTML=TheSolucio;
	this.SolucioIntroduida=true;
	return (true);
}

/************************************************************************************
*
* RespostaAlfaNumerica --> Output
*
************************************************************************************/

RespostaAlfaNumerica.prototype.OutputInteractiu= function() {
	// Genera el Codi HTML per a la pregunta.
	// L'entrada de formulari HTML es de la forma INPUT_4_3_2_1_7
	var Text="";
	var Id='INPUT_'+this.IndexExercici+"_"+this.IndexPart+"_"+this.IndexBloc+"_"+this.IndexResposta+"_"+this.IndexFinestra;
	if (this.Format.substring(0,1)=="T") Text+=this.GenerarHTMLSelectorTest(Id,this.Format.substring(1,2));
	else Text+=this.GenerarHTMLSelectorExplicit(Id,this.Format.substring(0,1));
	return (Text);
}

RespostaAlfaNumerica.prototype.GenerarHTMLSelectorExplicit =function(TheId,TheLongitud) {
	var Text="";
	//	
	// L --> amplada gran
	// C --> amplada petita
	// qualsevol diferent --> amplada normal
	//
	var IdNumPad="numpad"+TheId;
	var IdSwitch="switch"+TheId;
	var Amplada="10";
	switch (TheLongitud) {
		case "L": Amplada="50"; break;
		case "C": Amplada="5"; break;
		default: Amplada="10"; break;
	}
	var Text='<input type="text" id="'+TheId+'" size="'+Amplada+'" ';
	Text+='onkeypress="SiEsEnterCorregir(event,'+"'"+FuncioCorregir+"'"+')" ';
	Text+="onkeyup='getCaretPositions(this,"+'"'+TheId+'"'+");' onclick='getCaretPositions(this,"+'"'+TheId+'"'+");'";
	Text+=">";
	Text+='<img onclick="javascript:numpad_change('+"'"+TheId+"'"+','+"'"+IdNumPad+"','"+IdSwitch+"'"+')" style="cursor:pointer;" id="'+IdSwitch+'" src="collectiva2/logos/teclat.jpeg" width="12" height="15"></img>';
	Text+='<span id="'+IdNumPad+'"></span>';
	return (Text);
}

function SiEsEnterCorregir(e,FuncioCorregir) {
	var characterCode
	if(e && e.which){ // NN4 specific code
		e = e
		characterCode = e.which
	}
	else {
		e = e
		characterCode = e.keyCode // IE specific code
	}
	if (characterCode == 13) {
		// Si és enter Corregeix
		eval(FuncioCorregir);
	}
}


RespostaAlfaNumerica.prototype.GenerarHTMLSelectorTest =function(TheId,UltimaOpcio) {
	var Abecedari="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	var Text="";
	Text+='<select id="' + TheId + '">';
	Text+='<option value=0>-</option>';
	for (var i=1;i<=Abecedari.length;i++) {
		var Lletra=Abecedari.charAt(i-1);
		Text+='<option value=' + i + '>';
		Text=Text + Lletra
		Text=Text + "</option>";
		// UltimaOpcio també pot ser un nombre en llistes Quètxup antigues ___T5___
		if (Lletra==UltimaOpcio || UltimaOpcio==i) break;
	}
	Text+="</select>&nbsp;&nbsp;";
	return (Text);
}


RespostaAlfaNumerica.prototype.OutputEstatic= function(Mode) {
	var Text="";
	if (Mode==5) return(this.OutputSolucio());
	if (Mode==2||Mode==3) return("'"+this.SolucioHTML+"',");
}

RespostaAlfaNumerica.prototype.OutputSolucio= function() {
	var Text=this.OutputValorSolucio();
	// Si la solució és decimal agafem només el nombre de xifres decimals
	// que pertoquen.
	if (this.Format.substring(0,1)=="D") {
		var NDecimals=this.Format.substring(1);
		// Si demanem decimals, i la solució no és una fracció,
		// la visualitzem com a decimal.
		// Per a la visualització, queda una mica lleig el nombre
		// amb pocs decimals, i per tant el visualitzem amb algun més
		if (NDecimals<3) NDecimals=3;
		if (isFinite(Text)) {
			var Text2=parseFloat(Text);
			var Text3=Text2.toFixed(NDecimals);
			Text=parseFloat(Text3);
		}
	}
	//Text+="&nbsp;&nbsp;";
	return (Text);
}

RespostaAlfaNumerica.prototype.OutputValorSolucio= function() {
	var Text="";
	if (this.Format.substring(0,1)=="T") Text+=this.SolucioTest();
	else {
		Text=this.SolucioHTML;
	}
	return (Text);
}

RespostaAlfaNumerica.prototype.SolucioTest= function() {
	var Abecedari="ABCDEFGHIJK";
	var Text="";
	Text=Abecedari.charAt(parseFloat(this.SolucioHTML)-1);
	return (Text);
}

RespostaAlfaNumerica.prototype.OutputEnunciatImpressora= function() {
	var Text=this.TextEspaiResposta;
	return (Text);
}

/************************************************************************************
*
* RespostaAlfaNumerica --> Corregir
*
************************************************************************************/

RespostaAlfaNumerica.prototype.Corregir = function (BlocDocument) {
	var Resultat=false;
	// Compara la solució amb el que hi ha en el document
	// Fa servir un objecte Kiwis
	// El bloc pot ser diferent ja que els blocs es poden intercanviar
	if (this.SolucioIntroduida==false) return (true);
	if (!MyKiwis) {
		MyKiwis=new Kiwis();
	}
	if (!MyGenerador) {
		MyGenerador=new Bewoom();
	}

	var NomFinestra="INPUT_"+ this.IndexExercici + "_" + this.IndexPart + "_"+ BlocDocument + "_" + this.IndexResposta+ "_" + this.IndexFinestra;
	var RespostaUsuari=document.getElementById(NomFinestra).value;
	if (this.Format.substring(0,1)=="S") {
		// Si és de tipus literal fa una comparació com a cadenes
		if(Trim(this.SolucioHTML)==Trim(RespostaUsuari)) Resultat=true;
		else Resultat=false;
	}
	else {
		var RespostaUsuariRectificada=this.PassarComaAPunt(RespostaUsuari);
		if (this.Format.substring(0,1)=="D") {
			// Si la resposta és decimal agafem el seu grau de precisió
			MyKiwis.NDecimalsPrecisio=this.Format.substring(1);
		}
		if (this.Format.substring(0,1)=="F" ||this.Format.substring(0,1)=="N" ||this.Format.substring(0,1)=="C") {
			MyKiwis.Arbre.MyCalculadora.ExigirTipusIguals=true;
			MyKiwis.NDecimalsPrecisio=8;	// Exigim la màxima precissió si són decimals
		} else MyKiwis.Arbre.MyCalculadora.ExigirTipusIguals=false;
		Resultat=MyKiwis.CompararNombres(RespostaUsuariRectificada,this.SolucioHTML,true);
	}
	
	// Retornem el resultat per a recompte de correctes / incorrectes
	return (Resultat);
}

RespostaAlfaNumerica.prototype.VisualitzarTotVerd=function () {
	var Id='INPUT_'+this.IndexExercici+"_"+this.IndexPart+"_"+this.IndexBloc+"_"+this.IndexResposta+"_"+this.IndexFinestra;
	document.getElementById(Id).style.cssText = 'background-color: #91ff7d';
}

RespostaAlfaNumerica.prototype.PassarComaAPunt = function (Text) {
	// Degut a que els meus alumnes posen comes en comptes de punt, fem un filtre...
	var Posicio=0;
	var TextOutput="";
	var Lletra="";
	while (Posicio<Text.length) {	
		Lletra=Text.substring(Posicio,Posicio+1);
		if (Lletra==",") Lletra=".";
		TextOutput=TextOutput+Lletra;
		Posicio=Posicio+1;
	}
	return (TextOutput);
}

/************************************************************************************
*
* RespostaAlfaNumerica --> Capturar Resposta
*
************************************************************************************/

RespostaAlfaNumerica.prototype.CapturarResposta =function () {
	var NomFinestra="INPUT_"+ this.IndexExercici + "_" + this.IndexPart + "_"+ this.IndexBloc + "_" + this.IndexResposta+ "_" + this.IndexFinestra;
	var RespostaUsuari=document.getElementById(NomFinestra).value;
	return (""+RespostaUsuari);
}

/***********************************************************************************\
*
* Activitat --> Exercici Antic
* 
************************************************************************************/

function ActivitatExerciciAntic(TheIndexFinestra,TheAqui) {
	ActivitatExercici.call(this,TheIndexFinestra,TheAqui);
	this.Items[14].Valor=19;		// Tipus = 19
}
ActivitatExerciciAntic.prototype = new ActivitatExercici();

ActivitatExerciciAntic.prototype.TransformarEntrada = function(Contingut) {
	var Text=decodeURIComponent(Contingut);
	return(Text);
}

/***********************************************************************************\
*
* Activitat --> Exercici múltiple
* 
************************************************************************************/

function ActivitatExerciciMultiple(TheIndexFinestra,TheAqui) {
	if (TheAqui==undefined && TheIndexFinestra==undefined) return;
	ActivitatExercici.call(this,TheIndexFinestra,TheAqui);	
	var Aqui=this.Aqui+"Items[12].";
	this.Items[12]=new Formulari(Aqui,81);	 						// Contingut = 12	
	this.Items[12].NomURL="url";
	this.Items[12].FormulariJSON=true;
	this.Items[12].Items[1]=new Formulari(Aqui+"Items[1].",130);				// Configuració General = 12.1
	this.Items[12].Items[1].NomJSON="Q";
	this.Items[12].Items[1].Items[1]=new EntradaEnter(Aqui+"Items[1].Items[1].",102);	// "Temps (segons)"
	this.Items[12].Items[1].Items[1].NomJSON="T";
	this.Items[12].Items[1].Items[2]=new EntradaTrueFalse(Aqui+"Items[1].Items[2].",145);	// "Permetre practicar"
	this.Items[12].Items[1].Items[2].NomJSON="P";
	this.Items[12].Items[1].Items[3]=new EntradaEnter(Aqui+"Items[1].Items[3].",149);	// "Objectiu"
	this.Items[12].Items[1].Items[3].NomJSON="O";
	this.Items[12].Items[1].Items[3].NoPotSerBuit=true;
	this.Items[12].Items[1].Items[3].ValorMinim=1;
	this.Items[12].Items[1].Items[3].Valor=100;
	this.Items[12].Items[1].Items[4]=new EntradaEnter(Aqui+"Items[1].Items[4].",150);	// Nombre de columnes
	this.Items[12].Items[1].Items[4].NomJSON="C";
	this.Items[12].Items[1].Items[4].ValorMinim=1;
	this.Items[12].Items[1].Items[4].Valor=2;
	this.Items[12].Items[1].Items[5]=new EntradaTrueFalse(Aqui+"Items[1].Items[5].",241);	// "Activitat Contrarellotge"
	this.Items[12].Items[1].Items[5].NomJSON="R";
	this.Items[12].Items[1].Items[5].Valor=0;
	this.Items[12].Items[2]=new Formulari(Aqui+"Items[2].",101);				// Joc
	this.Items[12].Items[2].NomJSON="J";
	this.Items[12].Items[2].Items[1]=new EntradaText(Aqui+"Items[2].Items[1].",131);	// "Arxiu"
	this.Items[12].Items[2].Items[1].NomJSON="A";
	this.Items[12].Items[2].Items[2]=new EntradaText(Aqui+"Items[2].Items[2].",132);	// "Nom Classe"
	this.Items[12].Items[2].Items[2].NomJSON="N";
	this.Items[12].Items[2].Items[3]=new EntradaEnter(Aqui+"Items[2].Items[3].",135);	// "Activitat de referència"
	this.Items[12].Items[2].Items[3].NomJSON="R";
	this.Items[12].Items[2].Items[4]=new FormulariExtern(Aqui+"Items[2].Items[4].","MyJoc.");// "Configuració Joc"
	this.Items[12].Items[2].Items[4].NomJSON="C";
	this.Items[12].Items[2].Items[4].FormulariJSON=true;
	this.ConfiguracioJoc=new Object();
	this.Mode=1;	// 1 --> Play
			// 2 --> Editar
	this.ExerciciCorregit=false;
	this.IconaActivitat=new Imatge("collectiva2/logos/","quetxup.png","Exercici múltiple",25,18);
}
ActivitatExerciciMultiple.prototype = new ActivitatExercici();

ActivitatExerciciMultiple.prototype.CarregarCampURL = function(Contingut) {
	if (Contingut=="") return;
	var CadenaUrlJSON=decodeURIComponent(Contingut);
	this.ObjecteUrlJSONTotal=eval("("+CadenaUrlJSON+")");
	this.ObjecteUrlJSON=this.ObjecteUrlJSONTotal[0];
	if (this.ObjecteUrlJSON.Q) {
		this.Items[12].Items[1].Items[1].Input(this.ObjecteUrlJSON.Q.T);
		this.Items[12].Items[1].Items[2].Input(this.ObjecteUrlJSON.Q.P);
		this.Items[12].Items[1].Items[3].Input(this.ObjecteUrlJSON.Q.O);
		this.Items[12].Items[1].Items[4].Input(this.ObjecteUrlJSON.Q.C);
		this.Items[12].Items[1].Items[5].Input(this.ObjecteUrlJSON.Q.R);
	}
	if (this.ObjecteUrlJSON.J) {
		this.Items[12].Items[2].Items[1].Input(this.ObjecteUrlJSON.J.A);
		this.Items[12].Items[2].Items[2].Input(this.ObjecteUrlJSON.J.N);
		this.Items[12].Items[2].Items[3].Input(this.ObjecteUrlJSON.J.R);
		this.ConfiguracioJoc=this.ObjecteUrlJSON.J.C;
	}
	this.CarregarCampURLEspecific();
}

ActivitatExerciciMultiple.prototype.CarregarCampURLEspecific = function(ArrayJSON) {
	// Rutina reescrivible
}

ActivitatExerciciMultiple.prototype.Entrar = function() {
	this.ObrirActivitat(1);
}

ActivitatExerciciMultiple.prototype.Editar = function() {
	this.ObrirActivitat(2);
}

ActivitatExerciciMultiple.prototype.OmplirFormulariNovaActivitat = function() {
	this.ObrirActivitat(3);
}

/***********************************************************************************\
*
* Activitat --> Exercici múltiple --> Entrar
* 
************************************************************************************/

/***********************************************************************************\
*
* Activitat --> Exercici múltiple --> Entrar --> Primera Part: Carreguem el camp Url
* 
************************************************************************************/

ActivitatExerciciMultiple.prototype.ObrirActivitat = function(TheMode) {
	// 
	// Mode: 1 play 2 editar 3 nou
	//
	this.Mode=TheMode;
	MyJoc=null;
	MyBlocExercicis=new BlocExercicis();
	if (this.Mode==3) {
		// Una nova activitat la fem a partir d'un Url inicial
		var Text='[{Q:{},J:{},G:{}},-1]';
		this.Mode=2;
		this.RetornCarregarContingutExerciciBe(Text);
		return;
	}
	if (this.ContingutCarregat==true) {
		this.CarregarIConfigurarAutoomatesJoc();
		return;
	}
	var Url="collectiva2/php/loadexercici.php";
	Url=AfegirParametreURIInicial(Url,"a",this.Items[1].Valor);	// IdActivitat
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	if (NomUsuari!="") {
		Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
		Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	}
	var FuncioBe=this.Aqui+"RetornCarregarContingutExerciciBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCarregarContingutExerciciMal()";
	MissatgeModalText("Carregant activitat");
	AfegirMissatgeModalCarregant();
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

ActivitatExerciciMultiple.prototype.RetornCarregarContingutExerciciBe =function(ContingutAJAX) {
	this.ContingutCarregat=true;
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	MissatgeModalText("OK");
	this.CarregarCampURL(ContingutAJAX);
	this.CarregarIConfigurarAutoomatesJoc();
}

ActivitatExerciciMultiple.prototype.RetornCarregarContingutExerciciMal =function() {
	MissatgeModal(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Activitat --> Exercici múltiple --> Entrar --> Segona part: Carreguem Joc i el configurem
* 
************************************************************************************/

ActivitatExerciciMultiple.prototype.CarregarIConfigurarAutoomatesJoc = function() {
	var NomArxiuJoc=this.Items[12].Items[2].Items[1].Valor;
	if (NomArxiuJoc=="" ||NomArxiuJoc==undefined) {
		this.RetornCarregarAutoomatesJocBe("");
		return;
	}
	var Url="Llistes/"+NomArxiuJoc;	
	Url+="?rand="+GenerarStringRand();
	var FuncioBe=this.Aqui+"RetornCarregarAutoomatesJocBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCarregarAutoomatesJocMal()";
	MissatgeModalText("Carregant joc "+NomArxiuJoc);
	AfegirMissatgeModalCarregant();
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

ActivitatExerciciMultiple.prototype.RetornCarregarAutoomatesJocBe =function(ContingutAJAX) {
	//
	// Procesem el codi
	//
	MissatgeModalText("OK");
	this.ReservaCodi="";
	if (ContingutAJAX!="") {
		this.ReservaCodi=ContingutAJAX;
		eval(ContingutAJAX);
	}
	//
	// Generem l'objecte Autoomates ( model "MyJoc = new Enigma()" )
	//
	var NomObjecte=this.Items[12].Items[2].Items[2].Valor;
	if (NomObjecte==""||NomObjecte==undefined||NomObjecte=="Llista") {
		MyJoc=new AutoomatesJoc();
	}
	else {
		var Text="MyJoc=new "+NomObjecte+"()";
		eval(Text);
	}
	//
	// Configurem l'objecte AutoomatesJoc
	//
	MyJoc.InputObjecteJSON(this.ConfiguracioJoc);
	MyJoc.FuncioFinalPartida=this.Aqui+"Corregir()";
	MyJoc.FuncioAbortarPartida=this.Aqui+"Abortar()";
	this.CarregarIConfigurarEspecific();

}

ActivitatExerciciMultiple.prototype.RetornCarregarAutoomatesJocMal =function() {
	MissatgeModal(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Activitat --> Exercici múltiple --> Entrar --> Tercera part: Carreguem i configurem específic
* 
************************************************************************************/

ActivitatExerciciMultiple.prototype.CarregarIConfigurarEspecific =function() {
	//
	// Rutina reescrivible. Al final ha de cridar a this.ExecutarActivitat()
	this.ExecutarActivitat();
}

/***********************************************************************************\
*
* Activitat --> Exercici múltiple --> Entrar --> Cuarta part: Executem l'activitat
* 
************************************************************************************/

ActivitatExerciciMultiple.prototype.ExecutarActivitat =function() {
	vkb=null;	// Eliminem el teclat virtual per a que es faci un de nou
	EliminarMissatgeModal();
	MyJoc.BaseURL=this.BaseURL;
	if (this.Mode==1) {
		if (FinestraQuetxup==-1) FinestraQuetxup=Finestral.length;
		Finestral[FinestraQuetxup]=new FinestraModal(FinestraQuetxup,this.IndexFinestra);
		Finestral[FinestraQuetxup].Reset();
		Finestral[FinestraQuetxup].NomPestanya=Traduir(146);	// "Quètxup"	
		Finestral[FinestraQuetxup].PassarAMode(1);
		PassarAFinestra(FinestraQuetxup);
		this.NombreActivitatsFetes=0;
		this.PrimeraVegadaExecucio=true;
		this.ExecutarActivitatPlay();
	}
	else this.ExecutarActivitatEditar();
}

ActivitatExerciciMultiple.prototype.ExecutarActivitatPlay =function() {
	this.GenerarBlocExercicis();
}

ActivitatExerciciMultiple.prototype.FinalGenerarBlocExercicisBe =function() {
	this.ExerciciCorregit=false;
	MyJoc.Titol=this.Titol;
	MyJoc.EnunciatGeneral=this.EnunciatGeneral;
	MyJoc.SolucioGeneral=this.SolucioGeneral;
	MyJoc.FinalGenesis();
	Finestral[FinestraQuetxup].ContingutEspaiTreballHTML=this.GenerarHTMLJoc();
	Finestral[FinestraQuetxup].ContingutMenuHTML="";
	Finestral[FinestraQuetxup].Refrescar();
	if(this.PrimeraVegadaExecucio==true) {
		this.IniciarCronometre();
		this.ActualitzarVisitaActivitat(1);
	}
	this.PrimeraVegadaExecucio=false;
}

ActivitatExerciciMultiple.prototype.GenerarHTMLJoc =function() {
	var Text="";
	Text=this.GenerarHTMLCapcaleraJoc();
	if(this.Items[12].Items[1].Items[5].Valor==1) {
		Text+=this.GenerarHTMLIndexActivitatNonStop();
	}
	Text+=MyJoc.ContingutJocHTML;
	if (MyJoc.SolucioJocHTML=="") return(Text);
	//	
	// Afegim un div ocult amb la solució i un botó de visualització de solució
	//
	var IdDiv=MyCodiDivUnico.NouCodi("SOLUCIOJOC");
	var Funcio=this.Aqui+"VisualitzarSolucioJoc('"+IdDiv+"')";
	Text+="<br/><br/>"+GenerarSelector(Traduir(88),Funcio);	// "Solució"
	Text+="<br/>";
	Text+='<div id="'+IdDiv+'" style="visibility:hidden">';
	Text+=MyJoc.SolucioJocHTML;
	Text+="</div>";
	return(Text);
}

ActivitatExerciciMultiple.prototype.GenerarHTMLIndexActivitatNonStop =function() {
	var Text="";
	Text+="<span style='color: green;'><big><big><big>"+(this.NombreActivitatsFetes)+"</big></big></big></span>";
	var Objectiu=this.Items[12].Items[1].Items[3].Valor;
	Text+="<span style='color: blue;'><big><sup><sup>/"+Objectiu+"</sup></sup></big></span>";
	Text+="<br/>";
	return(Text);
}

ActivitatExerciciMultiple.prototype.VisualitzarSolucioJoc =function(Div) {
	var DivSolucio=document.getElementById(Div);
	DivSolucio.style.visibility="visible";
	this.SegonsPerAcabar=0;	// El temps passa a 0 per a no poder continuar (Activitats NonStop)
	this.Corregir();
}

ActivitatExerciciMultiple.prototype.ExecutarActivitatEditar =function() {
	this.Configurar(1);
}

/************************************************************************************
*
* Activitat --> Exercici múltiple --> Generar BlocExercicis
*
************************************************************************************/

ActivitatExerciciMultiple.prototype.GenerarBlocExercicis =function() {
	MyBlocExercicis.Columnes=this.Items[12].Items[1].Items[4].Valor;
	if (MyBlocExercicis.NombreColumnesProposatsPerGenerador>0) {
		MyBlocExercicis.Columnes=MyBlocExercicis.NombreColumnesProposatsPerGenerador;
	}
	MyBlocExercicis.Exercicis=new Array();
	MyBlocExercicis.ModelGestorInteractiu=this.ModelGestorInteractiu;
	if(MyBlocExercicis.NombreExercicisProposatsPerGenerador>0) {
		MyBlocExercicis.NombreExercicis=MyBlocExercicis.NombreExercicisProposatsPerGenerador;
	}
	MyJoc.IniciGenesis(); 
	if (MyJoc.Items[1].Valor>0) MyBlocExercicis.NombreExercicis=MyJoc.Items[1].Valor;
	this.FuncioFinalGenerarNouContingutBe=this.Aqui+"FinalGenerarNouExerciciBlocBe()";	
	MissatgeModalText("Generant exercici 1 de "+MyBlocExercicis.NombreExercicis);
	this.GenerarNouContingut();
}

ActivitatExerciciMultiple.prototype.FinalGenerarNouExerciciBlocBe =function() {
	if(MyBlocExercicis.Afegir(this.Enunciat,this.SolucioHTML,this.Pauta,this.SolucionsInteractives)==true) {
		var p=MyBlocExercicis.Exercicis.length-1;
		MyBlocExercicis.Exercicis[p].Operacions=this.Operacions;
		MyBlocExercicis.Exercicis[p].BaseURL=this.BaseURL;
		MyBlocExercicis.Exercicis[p].ModelGestorInteractiu=this.ModelGestorInteractiu;
		MyBlocExercicis.Exercicis[p].ContingutAJAXGenerador=this.ContingutAJAXGenerador;
		MyBlocExercicis.Exercicis[p].InfoExtra=this.InfoExtra;
		if(MyBlocExercicis.GeneracioCompleta()==true) {
			EliminarMissatgeModal();
			// Finalització de la generació d'exercicis.
			this.FinalGenerarBlocExercicisBe();
			return;
		}
		else MissatgeModalText("Generant exercici "+(p+2)+" de "+MyBlocExercicis.NombreExercicis);
	}	
	this.GenerarNouContingut();
}

/************************************************************************************
*
* Activitat --> Exercici múltiple --> Gestió de la correcció de l'activitat
*
************************************************************************************/

ActivitatExerciciMultiple.prototype.Corregir = function() {
	if (this.ExerciciCorregit==true) return;	// Evitem que l'usuari pugui corregir dues vegades
	this.ExerciciCorregit=true;
	var Puntuacio=MyJoc.Corregir(this.SegonsEndavant,this.Items[12].Items[1].Items[3].Valor);
	if(this.Items[12].Items[1].Items[5].Valor==1) {
		//
		// Si és una activitat non-stop (contrarellotge)...
		//

		if(this.SegonsPerAcabar<=0) {
			//
			// ... i el temps s'ha acabat puntuem de forma específica i sortim
			//
			Puntuacio=this.CalcularPercentatgeNonStop();
		}
		else {
			//
			// ... i el temps no s'ha acabat...
			//
			if(Puntuacio>=100)  {
				//
				// ... i l'activitat està ben feta intentem una nova activitat
				//
				this.NombreActivitatsFetes+=1;
				this.ExecutarActivitatPlay();
				return;			
			}
			else {
				//
				// ... i l'activitat no està ben feta s'ha de continuar
				//
				this.ExerciciCorregit=false; // ???
				return;
			}
		}
	}
	this.SegonsPerAcabar=-1;	// Per a evitar que continui el cronòmetre
	this.SegonsEndavant=-1;
	this.Puntuar(Puntuacio);
	this.VisualitzarPuntuacioObtinguda(Puntuacio);
}

ActivitatExerciciMultiple.prototype.CalcularPercentatgeNonStop = function() {
	var Punts=this.NombreActivitatsFetes;
	var Objectiu=this.Items[12].Items[1].Items[3].Valor;
	if (Objectiu==0) Puntuacio=Punts;
	else Puntuacio=Punts*100/Objectiu;
	var v=Math.round(parseFloat(Puntuacio));
	if(v<0) v=-1;
	if (v>999) v=999;
	return(v);
}

ActivitatExerciciMultiple.prototype.VisualitzarPuntuacioObtinguda = function(Puntuacio) {
	//
	// Matxaca el div FINESTRAPUNTUACIO amb la informació de després de puntuar
	//
	var Text='<div>';
	if(Puntuacio<0) Puntuacio="---";
	Text+="Puntuació: <span style='color:green;'><big><b>"+Puntuacio+"</b></big></span><small><sup>%</sup></small>";
	Text+=MyJoc.VisualitzarResultat();
	Text+="&nbsp;&nbsp;&nbsp;";
	var Funcio=this.Aqui+"Sortir()";
	Text+=GenerarSelector(Traduir(147),Funcio);	// "Sortir de l'activitat"
	Text+="</div>";
	var DivPuntuacio=document.getElementById("FINESTRAPUNTUACIO");
	if (DivPuntuacio) {
		DivPuntuacio.innerHTML=Text;
		DivPuntuacio.style.display= "block";
	}
}

ActivitatExerciciMultiple.prototype.Sortir =function() {
	Finestral[FinestraQuetxup].Autodestruccio();
}

ActivitatExerciciMultiple.prototype.GenerarIVisualitzarNovaPartida =function() {
	this.ExecutarActivitatPlay();
}

/************************************************************************************
*
* Activitat --> Exercici múltiple --> Abortar Partida
*
************************************************************************************/

ActivitatExerciciMultiple.prototype.Abortar = function() {
	this.ExerciciCorregit=true;
	this.SegonsPerAcabar=-1;	// Per a evitar que continui el cronòmetre
	this.SegonsEndavant=-1;
	this.VisualitzarPuntuacioObtinguda(-1);
}

/************************************************************************************
*
* Activitat --> Exercici múltiple --> Generar Capçalera
*
************************************************************************************/

ActivitatExerciciMultiple.prototype.GenerarHTMLCapcaleraJoc = function() {
	var Text='<div id="FINESTRAPUNTUACIO" style=" display:block;">';
	var Funcio=this.Aqui+"Corregir()";
	var TextEsquerra=GenerarSelector(Traduir(107),Funcio);	// "Corregir"
	var TextDreta=this.GenerarHTMLOpcionsJoc();
	var Titol=this.GenerarHTML1DTitol();
	Text+=GenerarHTMLCapcalera(TextEsquerra,TextDreta,Titol);
	Text+="</div>";
	if (this.Items[12].Items[1].Items[1].Valor>0) Text+=this.GenerarEspaiCronometre();
	return(Text);
}

ActivitatExerciciMultiple.prototype.GenerarEspaiCronometre = function() {
	var Text="";
	return (Text);
}

ActivitatExerciciMultiple.prototype.GenerarHTMLOpcionsJoc = function() {
	var Text="";
	Text+='<span id="TEMPSJOC" style="color:green;">0:00</span>';
	if (!MathMLDetectat) {
		Text+='<br/><img src="collectiva2/logos/atencio_petit_16_16.gif" alt="Atenció" width="16" height="16"></img>';
		Text+="&nbsp;";
		Text+='<a href="http://www.toomates.net/kiwipedia/info16/info16_cat.html" target="_blank">'+ "MathML no detectat"+'</a>';
	}
	if(NomUsuari=="") {
		// Si no estàs identificat t'invita a identificar-te
		Text+="<br/>";
		var Funcio="PassarAFinestra(3)";
		Text+=GenerarSelector("No estàs identificat",Funcio);
		return(Text);
	}
	return(Text);
}

/************************************************************************************
*
* Activitat --> Exercici múltiple --> Cronòmetre
*
************************************************************************************/

ActivitatExerciciMultiple.prototype.IniciarCronometre = function() {
	// Al final del temps salta a Corregir();
	if (this.Items[12].Items[1].Items[1].Valor>0) this.SegonsPerAcabar=this.Items[12].Items[1].Items[1].Valor;
	this.SegonsEndavant=0;
	setTimeout(this.Aqui+"HaPassatUnSegon()",1000);
}
ActivitatExerciciMultiple.prototype.HaPassatUnSegon = function() {
	// Si no està el div del rellotge sortim perquè s'ha sortit de l'activitat
	if (!document.getElementById("TEMPSJOC")) return;
	if (this.Items[12].Items[1].Items[1].Valor>0) {
		this.SegonsPerAcabar=this.SegonsPerAcabar-1;
		this.VisualitzarTempsRestant();
		if (this.SegonsPerAcabar<=0) {
			this.Corregir();
			return;
		}
	}
	if (this.SegonsEndavant>=0) {
		this.SegonsEndavant+=1;
		this.VisualitzarTempsEndavant();
		setTimeout(this.Aqui+"HaPassatUnSegon()",1000);
	}
}

ActivitatExerciciMultiple.prototype.VisualitzarTempsRestant = function() {
	// Visualitza el cronòmetre en la pantalla.
	// Poso el if per a evitar un NaN extrany
	if (this.SegonsPerAcabar>=0) {
		var Minuts=Math.floor(this.SegonsPerAcabar/60);
		var Segons=this.SegonsPerAcabar % 60;
		if (Segons<10) Segons="0" + Segons;
		var Temps=Minuts + ":" + Segons
		// La barra proporcional al temps
		var Ample=100/parseFloat(this.Items[12].Items[1].Items[1].Valor)*this.SegonsPerAcabar;
		var ColorFons="#c4fc80";  //verd
		if (Ample<33) ColorFons="#f9f103";  //groc
		if (Ample<10) ColorFons="red";
		var Text="<div style=' background-color:"+ColorFons+"; width:" + Ample + "%; height:20;' />";
		Text+=Temps;
		Text+="</div>";
		var finestra=document.getElementById("ESPAICRONOMETRE");
		if (finestra) finestra.innerHTML=Text;
	}
}

ActivitatExerciciMultiple.prototype.VisualitzarTempsEndavant = function() {
	// Visualitza el cronòmetre en la pantalla.
	if(this.SegonsEndavant<0) return;
	var Minuts=Math.floor(this.SegonsEndavant/60);
	var Segons=this.SegonsEndavant % 60;
	if (Segons<10) Segons="0" + Segons;
	var TempsEndavant=Minuts + ":" + Segons
	var finestra=document.getElementById("TEMPSJOC");
	if (finestra) finestra.innerHTML=TempsEndavant;
}

ActivitatExerciciMultiple.prototype.GenerarEspaiCronometre = function() {
	var Text="<table align='center' width='200' height='20' border='1' bordercolor='blue' cellspacing='0' bdcolor='#FF0000'>";
	Text+="<tr><td width='100%'>";
	Text+="<div id='ESPAICRONOMETRE'></div>";
	Text+="</td></tr></table>";
	return (Text);
}

/***********************************************************************************\
*
* Activitat --> Exercici Autogenerat (26)
* 
************************************************************************************/

function ActivitatExerciciAutoGenerat(TheIndexFinestra,TheAqui) {
	if (TheAqui==undefined && TheIndexFinestra==undefined) return;
	ActivitatExerciciMultiple.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(92);	// "Exercici autogenerat"
	this.Items[14].Valor=26;		// Tipus = 26
	var Aqui=this.Aqui+"Items[12].";
	this.Items[12].Items[3]=new Formulari(Aqui+"Items[3].",94);				// "Generador"
	this.Items[12].Items[3].NomJSON="G";
	this.Items[12].Items[3].Items[1]=new EntradaText(Aqui+"Items[3].Items[1].",131);	// "Arxiu"
	this.Items[12].Items[3].Items[1].NomJSON="A";
	this.Items[12].Items[3].Items[2]=new EntradaText(Aqui+"Items[3].Items[2].",132);	// "Nom Classe"
	this.Items[12].Items[3].Items[2].NomJSON="N";
	this.Items[12].Items[3].Items[3]=new EntradaEnter(Aqui+"Items[3].Items[3].",135);	// "Activitat de referència"
	this.Items[12].Items[3].Items[3].NomJSON="R";
	this.Items[12].Items[3].Items[4]=new FormulariExtern(Aqui+"Items[3].Items[4].","MyGenerador.");	// "Configuració"
	this.Items[12].Items[3].Items[4].NomJSON="C";
	this.ConfiguracioGenerador=new Object();
}
ActivitatExerciciAutoGenerat.prototype = new ActivitatExerciciMultiple();

ActivitatExerciciAutoGenerat.prototype.CarregarCampURLEspecific = function() {
	if (this.ObjecteUrlJSON.G) {
		this.Items[12].Items[3].Items[1].Input(this.ObjecteUrlJSON.G.A);
		this.Items[12].Items[3].Items[2].Input(this.ObjecteUrlJSON.G.N);
		this.Items[12].Items[3].Items[3].Input(this.ObjecteUrlJSON.G.R);
		this.ConfiguracioGenerador=this.ObjecteUrlJSON.G.C;
	}
}

/***********************************************************************************\
*
* Activitat --> Exercici Autogenerat --> Carregar i configurar generador
* 
************************************************************************************/

ActivitatExerciciAutoGenerat.prototype.CarregarIConfigurarEspecific = function() {
	var Arxiu=this.Items[12].Items[3].Items[1].Valor;
	if (Arxiu==""||Arxiu==undefined||Arxiu=="Bewoom") {
		this.RetornCarregarObjecteAutoomatesGenBe("");
		return;
	}	
	var Url="Llistes/"+this.Items[12].Items[3].Items[1].Valor;
	Url+="?rand="+GenerarStringRand();
	var FuncioBe=this.Aqui+"RetornCarregarObjecteAutoomatesGenBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCarregarObjecteAutoomatesGenMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

ActivitatExerciciAutoGenerat.prototype.RetornCarregarObjecteAutoomatesGenBe =function(ContingutAJAX) {
	//
	// Procesem el codi
	//
	// Abans tornem a processar el codi perquè per alguna raó s'oblida
	if (this.ReservaCodi!="") {
		eval(this.ReservaCodi);
	}

	this.ContingutAJAXGenerador=ContingutAJAX;
	if (ContingutAJAX!="") eval(ContingutAJAX);
	//
	// Generem l'objecte Autoomates ( model "MyGenerador = new Enigma()" )
	//
	var Objecte=this.Items[12].Items[3].Items[2].Valor;
	if (Objecte==""||Objecte==undefined||Objecte=="Bewoom") {
		MyGenerador=new Bewoom();
	}
	else {
		var Text="MyGenerador=new "+this.Items[12].Items[3].Items[2].Valor+"()";
		eval(Text);
	}
	MyGenerador.InputObjecteJSON(this.ConfiguracioGenerador);
	MyGenerador.IniciGenesis();
	this.Titol=MyGenerador.GenerarTitol();
	this.EnunciatGeneral=MyGenerador.GenerarEnunciatGeneral();
	this.PautaGeneral=MyGenerador.GenerarPautaGeneral();
	if (MyGenerador.ModelGestorInteractiu!="") this.ModelGestorInteractiu=MyGenerador.ModelGestorInteractiu;
	MyBlocExercicis.NombreExercicisProposatsPerGenerador=MyGenerador.NombreExercicis;
	this.ExecutarActivitat();
}

ActivitatExerciciAutoGenerat.prototype.RetornCarregarObjecteAutoomatesGenMal =function() {
	MissatgeModal(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Activitat --> Exercici Autogenerat --> Generar exercici
* 
************************************************************************************/

ActivitatExerciciAutoGenerat.prototype.GenerarNouContingut = function() {
	NStepsGeneracioExercici=0;
	GeneracioActiva=true;
	FuncioRetornFinalGeneracio=this.Aqui+"FinalGenerarNouExercici()";
	MyGenerador.ResetGenesis();
	// El Generador pot exigir un tipus de resposta determinat
	if (MyGenerador.TipusResposta!=null && MyGenerador.TipusResposta!=undefined) {
		this.TipusResposta=MyGenerador.TipusResposta;
	}
	this.ProcesCrearExerciciPerGenerador();
}

ActivitatExerciciAutoGenerat.prototype.ProcesCrearExerciciPerGenerador =function() {
	if (GeneracioActiva==false) return;
	NStepsGeneracioExercici=NStepsGeneracioExercici+1;
	var Status=MyGenerador.Generar();
	if (Status==1) {
		GeneracioActiva=false;
		this.FinalGenerarNouExercici();
		return;
	}
	if (Status<0) GeneracioActiva=false;
	var FuncioIteracio=this.Aqui+"ProcesCrearExerciciPerGenerador()";
	setTimeout(FuncioIteracio,0);
}

ActivitatExerciciAutoGenerat.prototype.FinalGenerarNouExercici = function() {
	this.Enunciat=MyGenerador.Enunciat;
	this.SolucioHTML=MyGenerador.SolucioHTML;
	this.Pauta=MyGenerador.Pauta;
	this.SolucionsInteractives=MyGenerador.Solucio;
	this.InfoExtra=MyGenerador.InfoExtra;
	this.Operacions=MyGenerador.NombreOperacions();
	this.FinalGenerarNouContingutBe();
}

/***********************************************************************************\
*
* Activitat --> Compilació d'exercicis
* 
************************************************************************************/

function ActivitatCompilacioExercicis(TheIndexFinestra,TheAqui) {
	if (TheAqui==undefined && TheIndexFinestra==undefined) return;
	ActivitatExerciciMultiple.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(105);	// "Compilació d'exercicis"
	this.Items[14].Valor=27;
	var Aqui=this.Aqui+"Items[12].";
	this.Items[12].Items[3]=new EntradaText(Aqui+"Items[3].",104);	// "Adreça de la compilació"
	this.Items[12].Items[3].NomJSON="E";
}
ActivitatCompilacioExercicis.prototype = new ActivitatExerciciMultiple();

ActivitatCompilacioExercicis.prototype.CarregarCampURLEspecific = function() {
	this.Items[12].Items[3].Input(this.ObjecteUrlJSON.E);
}

/***********************************************************************************\
*
* Activitat --> Compilació d'exercicis --> Carregar i configurar generador
* 
************************************************************************************/

ActivitatCompilacioExercicis.prototype.CarregarIConfigurarEspecific = function() {
	if (this.Items[12].Items[3].Valor==""||this.Items[12].Items[3].Valor==undefined) {
		this.ExecutarActivitat();
		return;
	}		
	var Url="Llistes/"+this.Items[12].Items[3].Valor;	// Arxiu
	Url+="?rand="+GenerarStringRand();
	var FuncioBe=this.Aqui+"RetornCarregarArxiuExercicisBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCarregarArxiuExercicisMal()";
	MissatgeModalText("Carregant exercicis "+this.Items[12].Items[3].Valor);
	AfegirMissatgeModalCarregant();
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

ActivitatCompilacioExercicis.prototype.RetornCarregarArxiuExercicisBe =function(ContingutAJAX) {
	MissatgeModalText("OK");
	try {
		this.ContingutArxiu=eval("("+ContingutAJAX+")");      
      	} catch(err) {
		MissatgeModalText("Error de sintaxi en l'arxiu");
		return;
	}
	this.Titol=this.ContingutArxiu.Titol;
	this.EnunciatGeneral=this.ContingutArxiu.Enunciat;
	this.SolucioGeneral=this.ContingutArxiu.SolucioGeneral;
	if (this.ContingutArxiu.NombreExercicis) {
		MyBlocExercicis.NombreExercicisProposatsPerGenerador=this.ContingutArxiu.NombreExercicis;
	}
	if (this.ContingutArxiu.Columnes) {
		MyBlocExercicis.NombreColumnesProposatsPerGenerador=this.ContingutArxiu.Columnes;
	}
	if (this.ContingutArxiu.EnunciatsNoRepetits!=undefined) {
		MyBlocExercicis.EnunciatsNoRepetits=this.ContingutArxiu.EnunciatsNoRepetits;
	}
	if (this.Items[14].Valor!=3) this.BaseURL=DeterminarURLBase("Llistes/"+this.Items[12].Items[3].Valor);
	this.ExecutarActivitat();
}

ActivitatCompilacioExercicis.prototype.RetornCarregarArxiuExercicisMal =function() {
	MissatgeModal(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Activitat --> Arxiu Quètxup 	(20)
* 
************************************************************************************/

function ActivitatArxiuQuetxup(TheIndexFinestra,TheAqui) {
	ActivitatCompilacioExercicis.call(this,TheIndexFinestra,TheAqui);
	this.Items[14].Valor=20;		// Tipus = 20
	this.ContingutCarregat=true;
}
ActivitatArxiuQuetxup.prototype = new ActivitatCompilacioExercicis();

ActivitatArxiuQuetxup.prototype.CarregarCampURL = function(Contingut) {
	if (Contingut=="") return;
	this.CadenaUrlJSON=decodeURIComponent(Contingut);	
	this.Items[12].Items[3].Valor=this.CadenaUrlJSON;
}

ActivitatArxiuQuetxup.prototype.PermetreEditar = function() {
	return(false);
}

/***********************************************************************************\
*
* Activitat --> Arxiu Quètxup Old 	(3)
* 
************************************************************************************/

function ActivitatArxiuQuetxupOld(TheIndexFinestra,TheAqui) {
	ActivitatCompilacioExercicis.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(105);	// "Compilació d'exercicis"
	this.Items[14].Valor=20;		// Tipus = 20
	this.ContingutCarregat=true;
}
ActivitatArxiuQuetxupOld.prototype = new ActivitatCompilacioExercicis();

ActivitatArxiuQuetxupOld.prototype.CarregarCampURL = function(Contingut) {
	if (Contingut=="") return;
	this.CadenaUrlJSON=decodeURIComponent(TreureNomesQuot(Contingut));
	this.ObjecteUrlJSON=eval("("+this.CadenaUrlJSON+")");
	var CodiAutoomatesFive=this.ObjecteUrlJSON.Codi.substring(1);
	this.Items[12].Items[3].Valor="quetxup/QUETXUP"+CodiAutoomatesFive+".txt";
	this.BaseURL='Llistes/quetxup/QUETXUP'+CodiAutoomatesFive+"files/";	
}

ActivitatArxiuQuetxupOld.prototype.PermetreEditar = function() {
	return(false);
}

/***********************************************************************************\
*
* Activitat --> Compilació d'exercicis --> Generar exercici
* 
************************************************************************************/

ActivitatCompilacioExercicis.prototype.GenerarNouContingut = function() {
	var NombreExercicis=this.ContingutArxiu.Exercicis.length;
	var i=GenerarEnterAleatoriAcotat(0,NombreExercicis-1);
	if (!this.ContingutArxiu.Exercicis[i]) {
		alert("Error");
		return;
	}
	var PautaPerDefecte=this.ContingutArxiu.PautaResposta;
	this.CarregarPerArrayJSON(this.ContingutArxiu.Exercicis[i],PautaPerDefecte);
	this.FinalGenerarNouContingutBe();
}

/***********************************************************************************\
*
* BlocExercicis
* 
************************************************************************************/

function BlocExercicis() {
	this.Exercicis=new Array();
	//
	// Condicions per a la incorporació d'exercicis
	//
	this.SolucionsNoRepetides=false;
	this.EnunciatsNoRepetits=true;
	this.NombreExercicis=5;
	this.NombreExercicisProposatPerGenerador=0;
	this.NombreColumnesProposatsPerGenerador=0;
	//
	// Visualització d'exercicis
	//
	this.ModelGestorInteractiu="";
	this.EnunciatsAmbIndex=true;
	this.NLiniesEnBlanc=2;
	this.Columnes=2;
	this.VisualitzarSolucions=false;
}

/***********************************************************************************\
*
* BlocExercicis --> Afegir un nou exercici
* 
************************************************************************************/

BlocExercicis.prototype.Afegir = function(TheEnunciat,TheSolucio,ThePauta,TheSolInterac) {
	if (this.TestExerciciGeneratAcceptable(TheEnunciat,TheSolInterac)==false) return(false);
	var p=this.Exercicis.length;
	var Aqui="MyBlocExercicis.Exercicis["+p+"].";
	this.Exercicis[p]=new ActivitatExercici(FinestraQuetxup,Aqui);
	this.Exercicis[p].PutIndex(p);
	this.Exercicis[p].Enunciat=TheEnunciat;
	this.Exercicis[p].SolucioHTML=TheSolucio;
	this.Exercicis[p].Pauta=ThePauta;
	this.Exercicis[p].SolucionsInteractives=TheSolInterac;
	if (this.ModelGestorInteractiu!="") this.Exercicis[p].ModelGestorInteractiu=this.ModelGestorInteractiu;
	return(true);
}

BlocExercicis.prototype.TestExerciciGeneratAcceptable = function(TheEnunciat,TheSolInterac) {
	//
	// Determina si aquest exercici és vàlid o no
	//
	if (this.SolucionsNoRepetides==true) {
		if (this.TestSolucioOnTopRepetida(TheSolInterac)) return (false);
		// Si la solució no està repetida, l'enunciat no ho pot estar.
		return (true);
	}
	if (this.EnunciatsNoRepetits==true) {
		if (this.TestEnunciatOnTopRepetit(TheEnunciat)) return (false);
	}
	return (true);
}

BlocExercicis.prototype.TestSolucioOnTopRepetida = function (TheSolucio) {
	if (this.Exercicis.length<1) return (false);
	for (var j=0;j<this.Exercicis.length;j++) {
		if (this.ExercicisAmbMateixaSolucio(j,TheSolucio)) return(true);
	}
	return (false);
}

BlocExercicis.prototype.ExercicisAmbMateixaSolucio = function (i,TheSolucio) {
	var Text1=this.Exercicis[i].SolucionsInteractives;
	if (Text1==TheSolucio) return(true);
	return(false);
}

BlocExercicis.prototype.TestEnunciatOnTopRepetit = function (TheEnunciat) {
	if (this.Exercicis.length<1) return (false);
	for (var j=0;j<this.Exercicis.length;j++) {	
		if (this.ExercicisAmbMateixEnunciat(j,TheEnunciat)) return(true);
	}
	return (false);
}

BlocExercicis.prototype.ExercicisAmbMateixEnunciat = function (i,TheEnunciat) {
	var Text1=this.Exercicis[i].Enunciat;
	if (Text1==TheEnunciat) return(true);
	return(false);
}

BlocExercicis.prototype.GeneracioCompleta = function () {
	if (this.Exercicis.length>=this.NombreExercicis) return(true);
	return(false);
}

/***********************************************************************************\
*
* BlocExercicis --> Generar HTML exercicis
* 
************************************************************************************/

BlocExercicis.prototype.OutputHTML = function() {
	//
	// Si només hi ha un exercici no visualitza l'índex.
	//
	if(this.Exercicis.length==1) {
		this.Exercicis[0].MyIndex.IndexActivat=false;
	}
	if(this.Columnes==1) return(this.OutputHTMLUnicaColumna());
	//
	// Varies columnes. Fem servir una taula
	//
	var Files=Math.ceil(this.Exercicis.length/this.Columnes);
	var MyMatriu=new Matriu("MATRIU","",Files,this.Columnes);

	MyMatriu.AmpladaCasella=100;

	MyMatriu.AlturaCasella=100;

	MyMatriu.ConstruirMatriu();
	var Fila=1;
	var Columna=1;
	for (var i=0;i<this.Exercicis.length;i++) {
		var Contingut=this.Exercicis[i].GenerarHTML();
		MyMatriu.PutText(Contingut,Fila,Columna,1);
		Columna+=1;
		if (Columna>this.Columnes) {
			Columna=1;
			Fila+=1;
		}
	}
	return(MyMatriu.VisualitzarMatriuTable(1));
}


BlocExercicis.prototype.OutputHTMLUnicaColumna = function() {
	var Text="<br />";	
	for (var i=0;i<this.Exercicis.length;i++) {
		if (this.Exercicis[i]) {
			Text+=this.Exercicis[i].GenerarHTML();
			Text+=this.AfegirSeparadorEntreExercicis(1);
			Text+="<br />";
		}
	}
	return(Text);
}

BlocExercicis.prototype.AfegirSeparadorEntreExercicis= function(Mode) {
	var Text="";
	// Afegim línies en blanc després de l'exercici
	for (var i=0;i<parseInt(this.NLiniesEnBlanc)+1;i++) {
		Text+="<br />";
	}
	// Per a la visualització en pantalla s'afegeix una fina línia blava entre
	// els exercicis per que es vegi millor on comença i acaba cadascun
	//if (Mode==0) Text+="</br><hr SIZE=1 COLOR=#c0f9fb></hr>";
	Text+="</br><hr SIZE=1 COLOR=#c0f9fb></hr>";
	return (Text);
}

/***********************************************************************************\
*
* BlocExercicis --> Rutines vàries
* 
************************************************************************************/

BlocExercicis.prototype.ComptarTotalOperacions = function() {
	var n=0;
	for (var i=0;i<this.Exercicis.length;i++) {
		if (this.Exercicis[i]) n+=this.Exercicis[i].Operacions;
	}
	return(n);
}

BlocExercicis.prototype.TestTotsElsExercicisBe = function() {	
	for (var n=0;n<this.Exercicis.length;n++) {
		if (this.Exercicis.ExerciciBe==false) return (false);
	}
	return(true);
}

BlocExercicis.prototype.PercentatgeExercicisBe = function() {
	var Encerts=0;
	var Errades=0;
	var Puntuacio=0;
	for (var i=0;i<this.Exercicis.length;i++) {
		var Resultat=this.Exercicis[i].Corregir(false);
		if (Resultat==true) Encerts=Encerts+1;
		if (Resultat==false) Errades=Errades+1;
		if (this.VisualitzarSolucions==true) BlocExercicis[i].VisualitzarSolucio();
	}
	if (Encerts+Errades==0) {
		return (-1);
	}
	return(Math.round(100*Encerts/(Encerts+Errades)));
}

/***********************************************************************************\
*
* Autoomates
*
************************************************************************************/

function Autoomates(TheAqui) {
	Formulari.call(this,TheAqui,0);
	this.FuncioAcceptarModal=TheAqui+"DescarregarConfiguracio()";
	this.NomJSON="C";
}
Autoomates.prototype = new Formulari();

Autoomates.prototype.DescarregarConfiguracio =function() {
	// Rutina reescrivible
	if (!this.Descarregar()) return;
	this.EliminarFormulariModal();
}


/***********************************************************************************\
*
* Autoomates --> AutoomatesGen
*
************************************************************************************/

function AutoomatesGen() {
	Autoomates.call(this,"MyGenerador.");
	//
	// Titol i descripció genèrica dels exercicis generats. Els pot generar ell 
	// mateix o venir des de fora.
	//
	this.Titol="";
	this.EnunciatGeneral="";
	this.PautaGeneral="";
	//
	// Output de la rutina Generar() si ha generat bé l'exercici (retorna 1)
	//
	this.Enunciat="";
	this.SolucioHTML="";
	this.Pauta="";
	this.Solucio=""; 
	this.NombreExercicis=10;	// Nombre d'exercicis proposats pel generador
	this.NomDivModal="FORMULARIGENERADOR";
	this.ModelGestorInteractiu="";
}
AutoomatesGen.prototype = new Autoomates();

AutoomatesGen.prototype.IniciGenesis =function() {
	if (this.ModelGestorInteractiu!="") {
		MyBlocExercicis.ModelGestorInteractiu=this.ModelGestorInteractiu;
	}
	if (this.NombreExercicis>0) {
		MyBlocExercicis.NombreExercicisProposatPerGenerador=this.NombreExercicis;
	}
}

AutoomatesGen.prototype.ResetGenesis =function() {
	// Rutina reescrivible
}

AutoomatesGen.prototype.Generar =function() {
	// Rutina reescrivible
}

AutoomatesGen.prototype.NombreOperacions =function() {
	return(1);
}

AutoomatesGen.prototype.GenerarTitol = function() {
	return("");
}

AutoomatesGen.prototype.GenerarEnunciatGeneral = function() {
	return("");
}

AutoomatesGen.prototype.GenerarPautaGeneral = function() {
	return("");
}

/***********************************************************************************\
*
* Autoomates --> AutoomatesJoc
*
************************************************************************************/

function AutoomatesJoc() {
	Autoomates.call(this,"MyJoc.");
	//
	// Titol i descripció genèrica dels exercicis generats (INPUT)
	//
 	this.Titol="";
	this.EnunciatGeneral="";
	this.SolucioGeneral=""; 
	//
	// Configuració del joc
	//
	this.NombreExercicis=10;	// Nombre d'exercicis a generar per a jugar
	this.Autor="";
	this.DataCreacio="";
	this.Icones=new Array();		// Array d'icones.
	this.ObjecteGestorInteractiu="";	// Si no és "" és el tipus de resposta necessari.
	this.NomDivModal="FORMULARIJOC";
	this.ColorFons="#ceffce";

	/////////////////////////////////////////////////////////////////////////////
	//
	// Presentació
	//
	/////////////////////////////////////////////////////////////////////////////

	this.VisualitzarExercicis=true; // No visualitza els exercicis (per exemple en "Parelles")
	this.NombreMaximIntentsFallits=2;	// Si és 0 significa infinits intents
	this.EvitarAcolorirRespostesSempre=false;
	this.NomOperacionsPerHora="Op/h";

	/////////////////////////////////////////////////////////////////////////////
	//
	// Output
	//
	/////////////////////////////////////////////////////////////////////////////

	this.ContingutJocHTML="";
	this.SolucioJocHTML="";
	this.FuncioFinalPartida="";
	this.BaseURL="";

	this.Items[1]=new EntradaEnter("MyJoc.Items[1].",207);	// "Nombre d'exercicis"
	this.Items[1].Valor=0;	
	this.Items[1].NomJSON="N";
}
AutoomatesJoc.prototype = new Autoomates();

AutoomatesJoc.prototype.InputObjecteJSON = function(ObjecteJSON) {
	if (ObjecteJSON==undefined) return;
	if (ObjecteJSON.N!=undefined) this.Items[1].Valor=ObjecteJSON.N;
}

/************************************************************************************
*
* Autoomates --> AutoomatesJoc --> IniciGenesis
*
************************************************************************************/

AutoomatesJoc.prototype.IniciGenesis =function() {
}

/************************************************************************************
*
* Autoomates --> AutoomatesJoc --> FinalGenesis
*
************************************************************************************/

AutoomatesJoc.prototype.FinalGenesis =function() {
	this.ContingutJocHTML=this.GenerarContingutJocHTML();
	this.SolucioJocHTML=this.GenerarSolucioJocHTML();
}

/************************************************************************************
*
* Autoomates --> AutoomatesJoc --> GenerarContingutHTML
*
************************************************************************************/

AutoomatesJoc.prototype.GenerarContingutJocHTML =function() {
	var Text="";
	Text+=this.GenerarHTMLIcones();
	Text+=this.GenerarHTMLTitol();
	Text+=this.GenerarHTMLEnunciatJoc();	
	Text+=this.GenerarHTMLExercicis();
	Text+="<br /><br /><br />"; // Per que no quedi tant pegat abaix
	return (Text);
}

AutoomatesJoc.prototype.GenerarHTMLIcones = function() {
	if (!this.Icones.length>0) return("");
	var Text='<div>';
	for (i=0;i<this.Icones.length;i++) {
		switch(this.Icones[i]) {
			case 1: Text+='<img src="collectiva2/logos/quetxup/sense_calculadora.jpg" WIDTH=39 HEIGHT=50 alt="Sense calculadora"/>';
				break;
			case 2: Text+='<img src="collectiva2/logos/quetxup/sense_llapis.jpg" WIDTH=49 HEIGHT=50 alt="Sense escriure"/>';
				break;
		}
		if (i!=this.Icones.length-1) Text+="&nbsp;&nbsp;";
	}
	Text+="</div>";
	return(Text);
}

AutoomatesJoc.prototype.GenerarHTMLTitol =function() {
	var Text=Trim(this.Titol);
	if (Text=="") Text="Exercicis";
	Text="<h2>"+this.PosarIniciAmbMajuscula(Text)+"<hr />"+"</h2>";
	return (Text);
}

AutoomatesJoc.prototype.PosarIniciAmbMajuscula =function(Text) {
	var Text=Text.substring(0,1).toUpperCase() + Text.substring(1);
	return (Text);
}

AutoomatesJoc.prototype.GenerarHTMLEnunciatJoc =function() {
	var Text=DecodeQuetxup(Trim(this.EnunciatGeneral),this.BaseURL);
	if (Text=="") return("");
	Text="<p>"+Text+"</p>"+"<br />";
	return (Text);
}

/************************************************************************************
*
* Autoomates --> AutoomatesJoc --> GenerarHTML --> Exercicis
*
************************************************************************************/

AutoomatesJoc.prototype.GenerarHTMLExercicis = function() {
	var Text="<br />";	
	if (this.VisualitzarExercicis==false) return ("");
	var VisualitzarIndex=this.EnunciatsAmbIndex;
	Text+=MyBlocExercicis.OutputHTML();
	return(Text);
}

/************************************************************************************
*
* Autoomates --> AutoomatesJoc --> GenerarSolucioJocHTML
*
************************************************************************************/

AutoomatesJoc.prototype.GenerarSolucioJocHTML =function() {
	return(this.SolucioGeneral);
}

/************************************************************************************
*
* Autoomates --> AutoomatesJoc --> Corregir
*
************************************************************************************/

AutoomatesJoc.prototype.Corregir = function(TheTemps,TheObjectiu) {
	// Corregeix la Autoomates i retorna la puntuació (0% --> 999% sense decimals)
	if(MyBlocExercicis.TestTotsElsExercicisBe()==false) return(0);
	var Percentatge=MyBlocExercicis.PercentatgeExercicisBe();
	this.Resultat=this.PuntuarDirecta(Percentatge,TheObjectiu);
	return (this.Resultat);
}

AutoomatesJoc.prototype.CorregirExercici = function(IndexExercici,Usuari) {
	//
	// Corregeix l'exercici i executa una possible interactivitat amb la pantalla
	//
	// Usuari = 1 --> S'ha polsat el botó "Corregir"
	//
	if (BlocExercicis[IndexExercici]==undefined || BlocExercicis[IndexExercici]==null) return("");
	var Resultat=BlocExercicis[IndexExercici].Corregir(false);
	if (Usuari==1) {
		if (Resultat==true) this.AccioExerciciCorrecte(IndexExercici);
		else this.AccioExerciciIncorrecte(IndexExercici);
	}
	return(Resultat);
}

AutoomatesJoc.prototype.AccioExerciciCorrecte = function(IndexExercici) {
	// Aquesta rutina pot ser reescrita per jocs hereus de Autoomates
}

AutoomatesJoc.prototype.AccioExerciciIncorrecte = function(IndexExercici) {
	// Aquesta rutina pot ser reescrita per jocs hereus de Autoomates
}

AutoomatesJoc.prototype.VisualitzarResultat = function() {
	var Text="";
	return(Text);
}

AutoomatesJoc.prototype.FinalitzarPartida = function() {
	// Dóna la partida per acabada.
	eval(this.FuncioFinalPartida);
}

AutoomatesJoc.prototype.AbortarPartida = function() {
	// Dóna la partida per acabada, sense corregir-la
	eval(this.FuncioAbortarPartida);
}


/***********************************************************************************\
*
* Autoomates --> AutoomatesJoc --> AutoomatesJocVelocitat
* 
************************************************************************************/

function LlistaVelocitat() {
	AutoomatesJoc.call(this);
	this.OperacionsPerHora=0;
}
LlistaVelocitat.prototype = new AutoomatesJoc();

LlistaVelocitat.prototype.Corregir = function(TheTemps,TheObjectiu) {
	this.Temps=TheTemps;
	if (MyBlocExercicis.PercentatgeExercicisBe()!=100) return(0);
	this.OperacionsPerHora=this.DeterminarOperacionsPerHora();
	this.Resultat=this.PuntuarDirecta(this.OperacionsPerHora,TheObjectiu);
	return (this.Resultat);
}

LlistaVelocitat.prototype.DeterminarOperacionsPerHora = function() {
	// 
	// Calcula la velocitat a la qual s'han fet les operacions en Operacions per hora (sense decimals)
	// o retorna 0 si no procedeix.
	// Utilitza les variables this.Temps i this.Resultat
	//
	if (this.Temps==0) return("---");
	var Operacions=MyBlocExercicis.ComptarTotalOperacions();
	if (Operacions==0) return("---");
	var TempsHores=this.Temps/3600;
	var Oph=Math.round(Operacions/TempsHores);
	return(Oph);
}

LlistaVelocitat.prototype.VisualitzarResultat = function() {
	// Genera un petit HTML amb el resum del resultat
	var Text="<br/>";
	if (this.Resultat>0) {
		Text+="Velocitat: <span style='color:green;'>"+this.OperacionsPerHora+"</span>&nbsp; Op/h";	
	}
	else 	Text+="Velocitat: ---";	
	Text+="<br />";
	return(Text);
}

/************************************************************************************
*
* Autoomates --> AutoomatesJoc --> Puntuar Proporcionalitat Directa i inversa
*
************************************************************************************/

AutoomatesJoc.prototype.PuntuarDirecta = function(Punts,Objectiu) {
	var Puntuacio=0;
	if (Objectiu==0) Puntuacio=Resultat;
	else Puntuacio=Punts*100/Objectiu;
	var v=Math.round(parseFloat(Puntuacio));
	if(v<0) v=-1;
	if (v>999) v=999;
	return(v);
}

AutoomatesJoc.prototype.PuntuarInversa = function(Punts,Objectiu) {
	var Puntuacio=0;
	if (Punts==0) Puntuacio=-1;
	else Puntuacio=100*Objectiu/Punts;
	var v=Math.round(parseFloat(Puntuacio));
	if(v<0) v=-1;
	if (v>999) v=999;
	return(v);
}

/***********************************************************************************\
*
* Autoomates --> AutoomatesJoc --> Cartró
* 
************************************************************************************/

/***********************************************************************************\
*
* Autoomates --> AutoomatesJoc --> Cartró --> Escac
* 
************************************************************************************/

function Escac(TheTextContingut,TheIndex,TheAmplada,TheAltura) {
	this.Contingut=TheTextContingut;
	this.Id=MyCodiDivUnico.NouCodi("CASELLA");
	this.Activa=true;	// False: Indica que aquesta fitxa ja s'ha eliminat
				// del tauell de joc. És com si no existís.
	this.Index=TheIndex;
	this.Amplada=100;
	if (TheAmplada>0) this.Amplada=TheAmplada;
	this.Altura=80;
	if (TheAltura>0) this.Altura=TheAltura;
	this.Seleccionada=false;	// true --> Se li ha fet un clic
	this.Fixa=false;		// true --> No té interacció
	this.ColorFons="";
}

Escac.prototype.Output = function(AmbVida) {
	var Text='<td id="'+this.Id+'"';
	Text+=" style='";
	if (AmbVida==true) Text+=" cursor: pointer;";
	Text+=" border:1px solid black;";
	Text+=" height:" + this.Altura + "px; ";
	Text+=" width:" + this.Amplada + "px; ";
	Text+=" text-align:center; ";
	if(this.ColorFons!="") Text+=" background-color:"+this.ColorFons+"; ";
	Text+="'";	// Final de style
	if(this.Fixa==false && AmbVida==true) {
		var FuncioOnClick="MyJoc.Seleccionar("+this.Index+");";
		Text+=' onclick="'+FuncioOnClick+'"; ';
		var FuncioOnMouseOver="MyJoc.Caselles["+this.Index+"].Iluminar();";
		Text+=' onmouseover="'+FuncioOnMouseOver+'"; ';
		var FuncioOnMouseOut="MyJoc.Caselles["+this.Index+"].Desiluminar();";
		Text+=' onmouseout="'+FuncioOnMouseOut+'"; ';
	}
	Text+=">";
	Text+=this.Contingut;
	Text+="</td>";
	return(Text);
}

Escac.prototype.Pintar = function(Mode) {
	// Mode : 
	// 	"normal"	: El fons del tauell
	//	"seleccionada"	: Il·luminada 1
	//	"marcada"	: Il·luminada 2
	//	"eliminada"	: El fons de darrera del tauell
	var Color="white";
	if (Mode=="normal") Color="white";	
	if (Mode=="seleccionada") Color="green";	
	if (Mode=="marcada") Color="#9eff95";
	if (Mode=="eliminada") Color="#badffe";
	var DivCasella=document.getElementById(this.Id);
	if (DivCasella) DivCasella.style.backgroundColor=Color;
}

Escac.prototype.Eliminar = function() {
	this.Activa=false;
	this.Pintar("eliminada");
	var DivCasella=document.getElementById(this.Id);
	if (DivCasella) DivCasella.innerHTML="&nbsp;";
}

Escac.prototype.Seleccionar = function() {
	if (this.Activa==false) return;
	this.Seleccionada=true;
	this.Pintar("seleccionada");
}

Escac.prototype.Desseleccionar = function() {
	if (this.Activa==false) return;
	this.Seleccionada=false;
	this.Pintar("normal");
}

Escac.prototype.Iluminar = function() {
	if (this.Activa==false) return;
	this.Pintar("marcada");
}

Escac.prototype.Desiluminar = function() {
	if (this.Activa==false) return;
	if (this.Seleccionada==true) {
		this.Pintar("seleccionada");
	}
	else this.Pintar("normal");
}

/***********************************************************************************\
*
* Autoomates --> AutoomatesJoc --> Cartró --> Constructor
* 
************************************************************************************/

function Cartro() {
	AutoomatesJoc.call(this);
	//
	// Configuració del cartró
	//
	var Aqui="MyJoc.Items[1].";
	this.Items[1]=new EntradaEnter(Aqui,207);	// Nombre d'exercicis
		this.Items[1].Valor=10;
		this.Items[1].NomJSON="N";
	var Aqui="MyJoc.Items[2].";
	this.Items[2]=new EntradaEnter(Aqui,208);	// Nombre de columnes
		this.Items[2].Valor=5;
		this.Items[2].NomJSON="C";
	var Aqui="MyJoc.Items[3].";
	this.Items[3]=new EntradaEnter(Aqui,209);	// Amplada de les caselles
		this.Items[3].Valor=100;
		this.Items[3].NomJSON="AM";
	var Aqui="MyJoc.Items[4].";
	this.Items[4]=new EntradaEnter(Aqui,210);	// Altura de les caselles
		this.Items[4].Valor=80;
		this.Items[4].NomJSON="AL";
	this.Tauell=new Array();	// Array bidimensional d'enters
					// Els índexs de les caselles
	this.Caselles=new Array();	// Array d'objectes "Escac"
}
Cartro.prototype = new AutoomatesJoc();

Cartro.prototype.InputObjecteJSON = function(ObjecteJSON) {
	if (ObjecteJSON.N!=undefined) this.Items[1].Valor=ObjecteJSON.N;
	if (ObjecteJSON.C!=undefined) this.Items[2].Valor=ObjecteJSON.C;
	if (ObjecteJSON.AM!=undefined) this.Items[3].Valor=ObjecteJSON.AM;
	if (ObjecteJSON.AL!=undefined) this.Items[4].Valor=ObjecteJSON.AL;
}

Cartro.prototype.ResetCartro = function() {
	this.Tauell=new Array();
	this.Tauell[0]=new Array();
	this.Caselles=new Array();
}

Cartro.prototype.AfegirCasella = function(TheTextCasella) {
	// Afegeix una nova casella i retorna la seva posició com a identificador
	// únic d'aquesta casella
	var IndexCasella=this.Caselles.length;
	this.Caselles[IndexCasella]=new Escac(TheTextCasella,IndexCasella,this.Items[3].Valor,this.Items[4].Valor);
	//
	// Afegeix al Tauell una nova posició més
	//
	if (this.Tauell.length==0) {
		this.Tauell[0]=new Array();
	}
	var FilaActual=this.Tauell.length-1;
	var ColumnaActual=this.Tauell[FilaActual].length;
	if (ColumnaActual>=this.Items[2].Valor) {
		this.Tauell[this.Tauell.length]=new Array();
		FilaActual=this.Tauell.length-1;
		ColumnaActual=0;
	}
	this.Tauell[FilaActual][ColumnaActual]=IndexCasella;
	return(IndexCasella);
}

Cartro.prototype.OutputCasella = function(Index,AmbVida) {
	var Text="";
	Text+=this.Caselles[Index].Output(AmbVida);
	return(Text);
}

Cartro.prototype.EsCasellaMorta = function(Index) {
	// Retorna true si la casella Index està marcada com Activa=false
	if (this.Caselles[Index].Activa==true) return(false);
	return(true);
}

Cartro.prototype.PintarCasella = function(IndexCasella,Mode) {
	if (IndexCasella<0) return;
	this.Caselles[IndexCasella].Pintar(Mode);
}

Cartro.prototype.EliminarCasella = function(IndexCasella) {
	this.Caselles[IndexCasella].Eliminar();
}

Cartro.prototype.DeterminarPercentatgeParellesTrobades = function() {
	var Eliminades=0;
	if (this.Caselles.length==0) return(0);
	for (var i=0;i<this.Caselles.length;i++) {
		if (this.Caselles[i].Activa==false) Eliminades+=1;
	}
	var Percentatge=Math.round(Eliminades/this.Caselles.length*100);
	return(Percentatge);
}

Cartro.prototype.BarrellarCartro = function() {
	//
	// Remena totes les posicions del tauell
	//
	for (var Fila=0;Fila<this.Tauell.length;Fila++) {
		for (var Columna=0;Columna<this.Tauell[Fila].length;Columna++) {
			var Casella=this.Tauell[Fila][Columna];
			if (this.Caselles[Casella].Fixa==false) {
				this.BarrellarPosicio(Fila,Columna);
			}
		}
	}
}

Cartro.prototype.BarrellarPosicio = function(Fila,Columna) {
	do {
		var Files=this.Tauell.length-1;
		var NovaFila=GenerarEnterAleatoriAcotat(0,Files);
		var Columnes=this.Tauell[NovaFila].length-1;
		var NovaColumna=GenerarEnterAleatoriAcotat(0,Columnes);
		var NovaCasella=this.Tauell[NovaFila][NovaColumna];
	} while(this.Caselles[NovaCasella].Fixa==true);
	var ContingutNovaPosicio=this.Tauell[NovaFila][NovaColumna];
	var ContingutAntigaPosicio=this.Tauell[Fila][Columna];
	this.Tauell[NovaFila][NovaColumna]=ContingutAntigaPosicio;
	this.Tauell[Fila][Columna]=ContingutNovaPosicio;
}

Cartro.prototype.OutputHTMLCartro = function(AmbVida) {
	var Text="";
	Text+="<table style='border:2px black solid'";
	Text+=">";
	for (var Fila=0;Fila<this.Tauell.length;Fila++) {
		Text+="<tr>";
		for (var Columna=0;Columna<this.Tauell[Fila].length;Columna++) {
			var IndexCasella=this.Tauell[Fila][Columna];
			Text+=this.Caselles[IndexCasella].Output(AmbVida);
		}
		Text+="</tr>";
	}
	Text+="</table>";
	return(Text);
}

Cartro.prototype.Seleccionar = function(IdCasella) {
	//
	// Rutina reescrivible pel joc
	//
}

Cartro.prototype.PermutarPosicionsCartro = function(IdCasellaA,IdCasellaB) {
	for (var FilaA=0;FilaA<this.Tauell.length;FilaA++) {
		for (var ColumnaA=0;ColumnaA<this.Tauell[FilaA].length;ColumnaA++) {
			var IndexCasellaA=this.Tauell[FilaA][ColumnaA];
			if (IndexCasellaA==IdCasellaA) {
				for (var FilaB=0;FilaB<this.Tauell.length;FilaB++) {
					for (var ColumnaB=0;ColumnaB<this.Tauell[FilaB].length;ColumnaB++) {
						var IndexCasellaB=this.Tauell[FilaB][ColumnaB];
						if (IndexCasellaB==IdCasellaB) {
							var Aux=this.Tauell[FilaA][ColumnaA];
							this.Tauell[FilaA][ColumnaA]=this.Tauell[FilaB][ColumnaB];
							this.Tauell[FilaB][ColumnaB]=Aux;
							return;
						}
					}
				}
			}
		}
	}
}

/***********************************************************************************\
*
*
* Mòdul Esquema
*
* 
************************************************************************************/

/***********************************************************************************\
*
* ActivitatEsquema (22)
* 
************************************************************************************/

function ActivitatEsquema(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(240);	// "Esquema"
	this.Items[12].TextArea=true;
	this.Items[12].Nom=Traduir(81);	// Contingut
	this.Items[12].Valor="Activitats:[],Camins:[]";
	this.Items[12].Invisible=true;
	this.Items[12].SortidaURLObligatori=true;
	this.Items[14].Valor=22;
	this.Items[26].Invisible=true;	// No té descripció didàctica
	this.IconaActivitat=new Imatge("collectiva2/logos/","coco.png","esquema",20,28);
}
ActivitatEsquema.prototype = new Activitat();

ActivitatEsquema.prototype.Entrar = function() {
	if(FinestraEsquema<0) {
		FinestraEsquema=Finestral.length;
		Finestral[FinestraEsquema] = new VisorEsquema(FinestraEsquema,0,this.Items[1].Valor);
		Finestral[FinestraEsquema].Reset();
		Finestral[FinestraEsquema].Actualitzar();
	}
	else {
		Finestral[FinestraEsquema].CanviarEsquema(this.Items[1].Valor);
	}
	PassarAFinestra(FinestraEsquema);
	this.ActualitzarVisitaActivitat(1);
}

ActivitatEsquema.prototype.PermetreEditar = function() {
	return(false);
}

/***********************************************************************************\
*
* Mòdul Esquema --> GenerarHTML2D
* 
************************************************************************************/

/***********************************************************************************\
*
* Mòdul Esquema --> GenerarHTML2D --> Play
* 
************************************************************************************/

Activitat.prototype.GenerarHTML2DPlay = function() {
	Text='<div id="'+this.Id+'"';
	if (this.ActivitatOberta==true)  {
		Text+=" style='width: 150px; height: 50px; border:1px solid black; cursor:pointer; background-color:#ccffcc;'";
		Text+=' onclick="'+this.Aqui+'Entrar()" ';
		Text+=' onmouseover ="'+this.Aqui+'IluminarCasella()"';
		Text+=' onmouseout ="'+this.Aqui+'DesiluminarCasella()"';
		var FuncioOnMenu="GenerarMenuContextual(event)";
		Text+=' oncontextmenu ="'+this.Aqui+FuncioOnMenu+';"';
	}
	else {
		Text+=" style='width: 150px; height: 50px; border:1px solid black; background-color:#cccccc'";
	}
	Text+=">";	
	//
	// Afegim el nom
	//
	Text+="<small><small><small>"+this.GenerarHTMLNom()+"</small></small></small>";
	//
	// Afegim les icones
	//
	Text+=this.GenerarHTMLIcones();
	//
	// Afegim la informació de seguiment de puntuació
	//
	Text+=this.GenerarHTMLSeguimentPuntuacio2D();
	//
	// I per últim una finestreta invisible per a visualitzar la infoprevi
	//
	this.NomDivUnic=MyCodiDivUnico.NouCodi("PREVIS");
	if (this.AmbInfoPrevi==true) {
		Text+='<span id="'+ this.NomDivUnic+ '" class="previsualitzacio"></span>';	
		Text+="</span>";
	}
	return(Text);
}

Activitat.prototype.IluminarCasella = function() {
	var Div=document.getElementById(this.Id);	
	if (Div) Div.style.backgroundColor="#9cfea0";
}

Activitat.prototype.DesiluminarCasella = function() {
	var Div=document.getElementById(this.Id);	
	if (Div) Div.style.backgroundColor="#ccffcc";
}

Activitat.prototype.GenerarHTMLSeguimentPuntuacio2D = function() {
	//
	// El curs principal i les seves seccions i temes no tenen puntuació associada
	//
	if (this.Items[24].Valor==1 && (this.Items[14].Valor==4||this.Items[14].Valor==6||this.Items[14].Valor==7)) return("");
	var Text="<div style='float:right; padding:2px;'><big><big>";
	Text+=this.Items[22].GenerarHTML();
	if(this.Items[22].Valor>=100) Text+='<img src="collectiva2/logos/quetxup/ok.png" alt="ok" width="18" height="17"></img>';
	Text+="</big></big></div>";
	return(Text);
}

/***********************************************************************************\
*
* Mòdul Esquema --> GenerarHTML2D --> Editar
* 
************************************************************************************/

Activitat.prototype.GenerarHTML2DEditar = function() {
	var Text="<div id='"+this.Id+"'; style='";
	Text+="width: 250px; border:1px solid black; background-color:#e2fd85'";
	Text+=' oncontextmenu ="'+this.Aqui+'GenerarMenuContextual2D(event,'+this.Fila+','+this.Columna+');"';
	Text+=">";
	Text+="<small><small><small>"+this.GenerarHTMLNom()+"</small></small></small>";
	Text+=this.GenerarHTMLIcones();
	if(this.Items[14].Valor!=24 && this.SenseCamins==false) Text+=this.GenerarHTMLEdicioCamins2D();
	return(Text);
}

Activitat.prototype.GenerarHTMLEdicioCamins2D = function() {
	// Afegim informació per a editar
	var Text="<br/>";
 	if (this.EsEntrada==true) {
		Text+="<div style='background-color:#fdccff'>";
		var Funcio="Finestral["+this.IndexFinestra+"].EliminarEntrada("+this.Items[1].Valor+")";
		Text+=GenerarSelector("-Entrada",Funcio);
		Text+="</div>";
	}
	if (this.EsSortida==true) {
		Text+="<div style='background-color:#ffa68c'>";
		Text+="Objectiu:";
		var Id="SORTIDA_"+this.Fila+"_"+this.Columna;
		Text+='<input type="text" id="' + Id +'"';
		Text+=' size=10; '; 
		Text+=' value="' + this.PercentatgeSortida + '"';
		var Funcio="Finestral["+this.IndexFinestra+"].CanviPercentatgeSortida("+this.Fila+','+this.Columna+")";
		Text+=' onchange="'+Funcio+';"';
		Text+='>';
		var Funcio="Finestral["+this.IndexFinestra+"].EliminarSortida("+this.Items[1].Valor+")";
		Text+=GenerarSelector("-Sortida",Funcio);
		Text+="</div>";
	}
	if(this.EsEntrada==false && this.EsSortida==false) {
		var Funcio="Finestral["+this.IndexFinestra+"].AfegirSortida("+this.Items[1].Valor+")";
		Text+=GenerarSelector("+Sortida",Funcio);
		Text+="<br/>";
		var Funcio="Finestral["+this.IndexFinestra+"].AfegirEntrada("+this.Items[1].Valor+")";
		Text+=GenerarSelector("+Entrada",Funcio);
	}
	return(Text);
}

/***********************************************************************************\
*
* Mòdul Esquema --> GenerarHTML2D --> Editar --> Menú contextual
*
************************************************************************************/

Activitat.prototype.GenerarMenuContextual2D = function(event,Fila,Columna) {
	MyMenuContextual.Reset();
	// Una icona no permet entrar
	if(this.Items[14].Valor!=24) MyMenuContextual.AfegirItem("Entrar",this.Aqui+"Entrar()",this.PermetreEntrar()); 
	MyMenuContextual.AfegirItem("+Activitat a la dreta",this.Aqui+"InsertarActivitatDreta("+Fila+","+Columna+")",this.PermetreInsertarActivitatDreta());
	MyMenuContextual.AfegirItem("+Activitat a l'esquerra",this.Aqui+"InsertarActivitatEsquerra("+Fila+","+Columna+")",this.PermetreInsertarActivitatEsquerra());
	MyMenuContextual.AfegirItem("-Activitat",this.Aqui+"EliminarActivitat("+Fila+","+Columna+")",this.PermetreEliminarActivitat());
	MyMenuContextual.AfegirItem("+Columna a la dreta",this.Aqui+"InsertarNovaColumnaDreta("+Fila+","+Columna+")",this.PermetreInsertarNovaColumnaDreta()); 
	MyMenuContextual.AfegirItem("+Columna a l'esquerra",this.Aqui+"InsertarNovaColumnaEsquerra("+Fila+","+Columna+")",this.PermetreInsertarNovaColumnaEsquerra()); 
	MyMenuContextual.AfegirItem("-Columna",this.Aqui+"EliminarColumna("+Fila+","+Columna+")",this.PermetreEliminarColumna());
	MyMenuContextual.AfegirItem("+Fila abaix",this.Aqui+"InsertarNovaFilaAbaix("+Fila+","+Columna+")",this.PermetreInsertarNovaFilaAbaix()); 
	MyMenuContextual.AfegirItem("+Fila adalt",this.Aqui+"InsertarNovaFilaAdalt("+Fila+","+Columna+")",this.PermetreInsertarNovaFilaAdalt());
	MyMenuContextual.AfegirItem("-Fila",this.Aqui+"EliminarFila("+Fila+","+Columna+")",this.PermetreEliminarFila());  
	MyMenuContextual.AfegirItem("Icona",this.Aqui+"InsertarIcona("+Fila+","+Columna+")",this.PermetreInsertarIcona());  
	MyMenuContextual.Executar(event);
}

Activitat.prototype.PermetreEntrar = function(event) {
	return(true);
}

Activitat.prototype.InsertarActivitatDreta = function(Fila,Columna) {
	Finestral[this.IndexFinestra].InsertarActivitatDreta(Fila,Columna);
}

Activitat.prototype.PermetreInsertarActivitatDreta = function(event) {
	return(true);
}

Activitat.prototype.InsertarActivitatEsquerra = function(Fila,Columna) {
	Finestral[this.IndexFinestra].InsertarActivitatEsquerra(Fila,Columna);
}

Activitat.prototype.PermetreInsertarActivitatEsquerra = function(event) {
	return(true);
}

Activitat.prototype.EliminarActivitat = function(Fila,Columna) {
	Finestral[this.IndexFinestra].EliminarActivitat(Fila,Columna);
}

Activitat.prototype.PermetreEliminarActivitat = function(event) {
	return(true);
}

Activitat.prototype.InsertarNovaColumnaDreta = function(Fila,Columna) {
	Finestral[this.IndexFinestra].InsertarNovaColumnaDreta(Fila,Columna);
}

Activitat.prototype.PermetreInsertarNovaColumnaDreta = function(event) {
	return(true);
}

Activitat.prototype.InsertarNovaColumnaEsquerra = function(Fila,Columna) {
	Finestral[this.IndexFinestra].InsertarNovaColumnaEsquerra(Fila,Columna);
}

Activitat.prototype.PermetreInsertarNovaColumnaEsquerra = function(event) {
	return(true);
}

Activitat.prototype.EliminarColumna = function(Fila,Columna) {
	Finestral[this.IndexFinestra].EliminarColumna(Fila,Columna);
}

Activitat.prototype.PermetreEliminarColumna = function(event) {
	return(true);
}

Activitat.prototype.InsertarNovaFilaAbaix = function(Fila,Columna) {
	Finestral[this.IndexFinestra].InsertarNovaFilaAbaix(Fila,Columna);
}

Activitat.prototype.PermetreInsertarNovaFilaAbaix = function(event) {
	return(true);
}

Activitat.prototype.InsertarNovaFilaAdalt = function(Fila,Columna) {
	Finestral[this.IndexFinestra].InsertarNovaFilaAdalt(Fila,Columna);
}

Activitat.prototype.PermetreInsertarNovaFilaAdalt = function(event) {
	return(true);
}

Activitat.prototype.EliminarFila = function(Fila,Columna) {
	Finestral[this.IndexFinestra].EliminarFila(Fila,Columna);
}

Activitat.prototype.PermetreEliminarFila = function(event) {
	return(true);
}

Activitat.prototype.InsertarIcona = function(Fila,Columna) {
	Finestral[this.IndexFinestra].InsertarIcona(Fila,Columna);
}

Activitat.prototype.PermetreInsertarIcona = function(event) {
	return(true);
}

/***********************************************************************************\
*
* Mòdul Esquema --> GenerarHTML2D --> Insertar activitat copiada des del portadocuments
* 
************************************************************************************/

Activitat.prototype.GenerarHTML2DInsertar = function() {
	var Text="<div id='"+this.Id+"'; style='";
	Text+="width: 250px; border:1px solid black; border-style:dashed; cursor:pointer; background-color:#fddeef'";
	Text+=' onclick="'+this.Aqui+'InsertarAqui('+this.Fila+','+this.Columna+');"';
	Text+=">";
	Text+="<small><small><small>"+this.GenerarHTMLNom()+"</small></small></small>";
	Text+=this.GenerarHTMLIcones();
	return(Text);
}

Activitat.prototype.InsertarAqui = function(Fila,Columna) {
	Finestral[this.IndexFinestra].EnganxarActivitat(Fila,Columna);	
}

/***********************************************************************************\
*
* Mòdul Esquema --> GenerarHTML2D --> Visualitzacions específiques
* 
************************************************************************************/

ActivitatArxiu.prototype.GenerarHTML2DPlay = function(Mode) {
	var Text="<a id='"+this.Id+"'; style='";
	if (this.ActivitatOberta==true)  {
		Text+="width: 250px; border:1px solid black; cursor:pointer; text-decoration:none; background-color:#ccffcc'";
		var AccioOnClick=this.GenerarNomFuncioOnClick(1);
		Text+=' onclick="'+this.Aqui+AccioOnClick+';" ';
		Text+=' onmouseover ="'+this.Aqui+'IluminarCasella()"';
		Text+=' onmouseout ="'+this.Aqui+'DesiluminarCasella()"';
		Text+=' href="';
		Text+=this.Items[12].Valor;		// Url
		Text+='" target="_blank"; ';
		Text+=">";
	}
	else {
		Text+="width: 250px; border:1px solid black; text-decoration:none; background-color:#cccccc'>";
	}
	var NomDivUnic=MyCodiDivUnico.NouCodi("PREVIS");
	Text+=this.GenerarHTMLNom();
	Text+="<br/>";
	Text+=this.Items[22].GenerarHTML(1);
	Text+=this.GenerarHTMLIconaActivitat();
	Text+=this.GenerarHTMLIconesDidactiques();
	Text+="</a>";
	return(Text);
}

ActivitatText.prototype.GenerarHTML2DPlay = function(Mode) {
	var Text="<div id='"+this.Id+"'; style='";
	Text+="width: 250px; border:1px solid black; text-decoration:none; background-color:#white'>";
	Text+=this.Items[12].Valor;
	Text+="</div>";
	return(Text);
}

ActivitatImatge.prototype.GenerarHTML2DPlay = function(Mode) {
	// En mode Entrar es visualitza la imatge.
	var Text="<div>";
	Text+=DecodeQuetxup(this.Items[12].Valor,"");
	Text+="</div>";
	return (Text);	
}

/***********************************************************************************\
*
* Activitat --> Icona (24)
* 
************************************************************************************/

function ActivitatIcona(TheIndexFinestra,TheAqui) {
	Activitat.call(this,TheIndexFinestra,TheAqui);
	this.TitolF=Traduir(186);	// "Imatge HTML"
	this.Items[14].Valor=24;
	this.Items[27].Items[1].Valor=1;
	this.AmbInfoPrevi=false;
	this.Codi=8;
}
ActivitatIcona.prototype = new Activitat();

ActivitatIcona.prototype.GenerarHTML2DPlay = function(Mode) {
	var Text='<div style="text-align:center">';
	switch(this.Codi) {		
		case 1:	Text+='<img src="collectiva2/logos/esquema/fletxa_dreta_26_20.png" WIDTH=26 HEIGHT=20 alt="Fletxa Est"/>';
			break;
		case 2:	Text+='<img src="collectiva2/logos/esquema/fletxa_avall_20_26.png" WIDTH=20 HEIGHT=26 alt="Fletxa Sud"/>';
			break;			
		case 3:	Text+='<img src="collectiva2/logos/esquema/fletxa_esquerra_26_20.png" WIDTH=26 HEIGHT=20 alt="Fletxa Oest"/>';
			break;
		case 4:	Text+='<img src="collectiva2/logos/esquema/fletxa_adalt_20_26.png" WIDTH=20 HEIGHT=26 alt="Fletxa Nord"/>';
			break;
		case 5:	Text+='';
			break;
		case 7:	Text+='<img src="collectiva2/logos/esquema/no_llapis_68_51.jpg" WIDTH=68 HEIGHT=51 alt="Sense llapis"/>';
			break;
		default:Text+='<img src="collectiva2/logos/esquema/e_desconegut.jpg" WIDTH=35 HEIGHT=50 alt="Element desconegut"/>';
			break;
	}
	Text+="</div>";
	return(Text);
}

ActivitatIcona.prototype.GenerarHTML2DContingut = function(Mode) {
	var Text='';
	switch(this.Codi) {		
		case 1:	Text+='<img src="collectiva2/logos/esquema/fletxa_dreta_26_20.png" WIDTH=26 HEIGHT=20 alt="Fletxa Est"/>';
			break;
		case 2:	Text+='<img src="collectiva2/logos/esquema/fletxa_avall_20_26.png" WIDTH=20 HEIGHT=26 alt="Fletxa Sud"/>';
			break;			
		case 3:	Text+='<img src="collectiva2/logos/esquema/fletxa_esquerra_26_20.png" WIDTH=26 HEIGHT=20 alt="Fletxa Oest"/>';
			break;
		case 4:	Text+='<img src="collectiva2/logos/esquema/fletxa_adalt_20_26.png" WIDTH=20 HEIGHT=26 alt="Fletxa Nord"/>';
			break;
		case 5:	Text+='<span>(buit)</span>';
			break;
		case 7:	Text+='<img src="collectiva2/logos/esquema/no_llapis_68_51.jpg" WIDTH=68 HEIGHT=51 alt="Sense llapis"/>';
			break;
		default:Text+='<img src="collectiva2/logos/esquema/e_desconegut.jpg" WIDTH=35 HEIGHT=50 alt="Element desconegut"/>';
			break;
	}
	Text+="";
	return(Text);
}

/***********************************************************************************\
*
* VisorEsquema --> Objecte Activitats
*
************************************************************************************/

function Activitats(ObjecteActivitatsJSON) {
	// MyActivitats és una matriu bidimensional files - columnes
	// amb les activitats associades a l'esquema
	this.Files=new Array();
	if(!ObjecteActivitatsJSON) return;
	// Carreguem la matriu d'activitats associada a l'esquema
	for(var Fila=0;Fila<ObjecteActivitatsJSON.length;Fila++) {
		this.Files[Fila]=new Array();
		for(var Columna=0;Columna<ObjecteActivitatsJSON[Fila].length;Columna++) {
			var TheIdActivitat=ObjecteActivitatsJSON[Fila][Columna];
			this.Files[Fila][Columna]=TheIdActivitat;
		}		
	}
}

Activitats.prototype.OutputJSON = function() {
	var Text="Activitats:[";
	for(var Fila=0;Fila<this.Files.length;Fila++) {
		var TextFila="[";
		for(var Columna=0;Columna<this.Files[Fila].length;Columna++) {
			if(TextFila!="[") TextFila+=",";
			TextFila+=this.Files[Fila][Columna];
		}
		TextFila+="]";
		if(Text!="Activitats:[") Text+=",";
		Text+=TextFila;		
	}
	Text+="]";
	return(Text);
}

Activitats.prototype.ActivitatJaExisteix = function(IdActivitat) {
	for(var Fila=0;Fila<this.Files.length;Fila++) {
		for(var Columna=0;Columna<this.Files[Fila].length;Columna++) {
			if(this.Files[Fila][Columna]==IdActivitat) return(true);
		}
	}
	return(false);
}

Activitats.prototype.EsquemaBuit = function() {
	// Retorna true si no hi han activitats.
	if(this.Files.length==0) return(true);
	for(var Fila=0;Fila<this.Files.length;Fila++) {
		for(var Columna=0;Columna<this.Files[Fila].length;Columna++) {
			if(this.Files[Fila][Columna]) return(false);
		}
	}
	return(true);
}

Activitats.prototype.InsertarNovaActivitatDreta = function(Fila,Columna) {
	this.Files[Fila].splice(Columna+1,0,-5);
}

Activitats.prototype.InsertarNovaActivitatEsquerra = function(Fila,Columna) {
	this.Files[Fila].splice(Columna,0,-5);
}


Activitats.prototype.EliminarActivitat = function(Fila,Columna) {
	this.Files[Fila].splice(Columna,1);
	if(this.Files[Fila].length==0) {
		// Si la fila s'ha quedat buida l'eliminem també
		this.Files.splice(Fila,1);
	}
}

Activitats.prototype.InsertarNovaColumnaDreta = function(Fila,Columna) {
	this.InsertarNovaColumna(Columna+1);
}

Activitats.prototype.InsertarNovaColumnaEsquerra = function(Fila,Columna) {
	this.InsertarNovaColumna(Columna);
}

Activitats.prototype.InsertarNovaColumna = function(Columna) {
	for(var Fila=0;Fila<this.Files.length;Fila++) {
		this.InsertarNovaColumnaEnFila(Fila,Columna);
	}	
}

Activitats.prototype.InsertarNovaColumnaEnFila = function(Fila,Columna) {
	if(this.Files[Fila].length<Columna) {
		// Si no n'hi ha prou columnes omplim amb columnes buides
		for(var x=this.Files[Fila].length;x<=Columna;x++) {
			this.Files[Fila].splice(x,0,-5);
		}	
	}
	this.Files[Fila].splice(Columna,0,-5);
}


Activitats.prototype.EliminarColumna = function(Columna) {
	for(var Fila=0;Fila<this.Files.length;Fila++) {
		this.Files[Fila].splice(Columna,1);
	}	
}

Activitats.prototype.InsertarNovaFilaAbaix = function(Fila) {
	if(this.Files.length<=Fila) {
		// Si no n'hi ha prou reomplim per a no deixar forats a la matriu
		for(var y=this.Files.length;y<=Fila;y++) {
			this.Files[y]=new Array();
			this.Files[y][0]=-5;
		}
	}
	this.InsertarNovaFila(Fila+1);
}

Activitats.prototype.InsertarNovaFila = function(Fila) {
	this.Files.splice(Fila,0,[-5]);
}

Activitats.prototype.InsertarNovaFilaAdalt = function(Fila) {
	if(this.Files.length<Fila) {
		// Si no n'hi ha prou reomplim per a no deixar forats a la matriu
		for(var y=this.Files.length;y<Fila;y++) {
			this.Files[y]=new Array();
			this.Files[y][0]=-5;
		}
	}
	this.InsertarNovaFila(Fila);
}

Activitats.prototype.EliminarFila = function(Fila) {
	this.Files.splice(Fila,1);
}

Activitats.prototype.SubstituirActivitat =function(NovaActivitat,Fila,Columna) {
	this.Files[Fila][Columna]=NovaActivitat;
}

Activitats.prototype.EnganxarCopiaDesDePortadocumentsIniciEsquema =function(NovaActivitat) {
	if(this.Files.length==0) {
		this.Files[0]=new Array();
	}
	this.Files[0].splice(0,0,NovaActivitat);
}

/***********************************************************************************\
*
* VisorEsquema --> Objecte Sortida
*
************************************************************************************/

function Sortida(TheIdActivitat,ThePercentatge) {
	this.IdActivitat=TheIdActivitat;
	this.Percentatge=ThePercentatge;
}

Sortida.prototype.OutputJSON = function() {
	return("["+this.IdActivitat+","+this.Percentatge+"]");
}

/***********************************************************************************\
*
* VisorEsquema --> Objecte Cami
*
************************************************************************************/

function Cami(ObjecteCamiJSON) {
	this.CamiObert=false;
	this.MySortides=new Array();
	this.MyEntrades=new Array();
	if (ObjecteCamiJSON) {
		if(ObjecteCamiJSON[0]) {
			for(var i=0;i<ObjecteCamiJSON[0].length;i++) {
				this.MySortides[i]=new Sortida(ObjecteCamiJSON[0][i][0],ObjecteCamiJSON[0][i][1]);
			}
		}
		if(ObjecteCamiJSON[1]){
			for(var i=0;i<ObjecteCamiJSON[1].length;i++) {
				this.MyEntrades[i]=ObjecteCamiJSON[1][i];
			}
		}
	}
}

Cami.prototype.CamiNoBuit = function() {
	// Retorna true si el camí té alguna cosa significativa (si val la pena gravar-lo)
	// Si un camí no té entrades no és significatiu.
	if(this.MyEntrades.length==0) return(false);
	return(true);
}

Cami.prototype.OutputJSON = function() {
	var Text="[";
	var TextSortides="[";
	for(var i=0;i<this.MySortides.length;i++) {
		if(TextSortides!="[") TextSortides+=",";
		TextSortides+=this.MySortides[i].OutputJSON();		
	}
	TextSortides+="]";
	Text+=TextSortides;
	Text+=",";
	var TextEntrades="[";
	for(var i=0;i<this.MyEntrades.length;i++) {
		if(TextEntrades!="[") TextEntrades+=",";
		TextEntrades+=this.MyEntrades[i];		
	}
	TextEntrades+="]";
	Text+=TextEntrades;
	Text+="]";
	return(Text);
}

Cami.prototype.EliminarActivitat = function(IdActivitat) {
	//
	// 1. Eliminem l'activitat de les sortides
	//
	for(var i=0;i<this.MySortides.length;i++) {
		if(this.MySortides[i].IdActivitat==IdActivitat) {
			this.MySortides.splice(i,1);
		}
	}
	//
	// 2. Eliminem l'activitat de les entrades
	//
	for(var i=0;i<this.MyEntrades.length;i++) {
		if(this.MyEntrades[i]==IdActivitat) {
			this.MyEntrades.splice(i,1);
		}
	}
}

Cami.prototype.EliminarEntrada = function(IdActivitat) {
	for(var i=0;i<this.MyEntrades.length;i++) {
		if(this.MyEntrades[i]==IdActivitat) {
			this.MyEntrades.splice(i,1);
		}
	}
}

Cami.prototype.AfegirEntrada = function(IdActivitat) {
	// Si ja està com entrada no cal afegir-la
	for(var i=0;i<this.MyEntrades.length;i++) {
		if(this.MyEntrades[i]==IdActivitat) return;
	}
	this.MyEntrades[this.MyEntrades.length]=IdActivitat;
}

Cami.prototype.AfegirSortida = function(IdActivitat) {
	// Si ja està com sortida no cal afegir-la
	for(var i=0;i<this.MySortides.length;i++) {
		if(this.MySortides[i].IdActivitat==IdActivitat) return;
	}
	this.MySortides[this.MySortides.length]=new Sortida(IdActivitat,0);
}

Cami.prototype.EliminarSortida = function(IdActivitat) {
	for(var i=0;i<this.MySortides.length;i++) {
		if(this.MySortides[i].IdActivitat==IdActivitat) {
			this.MySortides.splice(i,1);			
		}
	}
}

Cami.prototype.CanviPercentatgeSortida = function(IdActivitat,NouPercentatge) {
	for(var i=0;i<this.MySortides.length;i++) {
		if(this.MySortides[i].IdActivitat==IdActivitat) {
			this.MySortides[i].Percentatge=NouPercentatge;			
		}
	}
}

/***********************************************************************************\
*
* VisorEsquema --> Objecte Esquema
*
************************************************************************************/

function Esquema(Cadena) {
	var TheActivitats=new Array();
	var TheCamins=new Array();
	if(Cadena=="") return;
	var Objecte=eval("({"+Cadena+"})");
	this.MyActivitats=new Activitats(Objecte.Activitats);
	this.MyCamins=new Array();
	if(!Objecte) return;
	if(!Objecte.Camins) return;
	// Carreguem la matriu de camins associada a l'esquema
	for(var i=0;i<Objecte.Camins.length;i++) {
		this.MyCamins[i]=new Cami(Objecte.Camins[i]);
	}
}

Esquema.prototype.OutputJSON = function() {
	var Text="";
	Text+=this.MyActivitats.OutputJSON();
	Text+=",";
	var TextCamins="Camins:[";
	for(var i=0;i<this.MyCamins.length;i++) {
		if(this.MyCamins[i].CamiNoBuit()) {
			if(TextCamins!="Camins:[") TextCamins+=",";
			TextCamins+=this.MyCamins[i].OutputJSON();
		}
	}
	Text+=TextCamins;
	Text+="]";
	return(Text);
}

Esquema.prototype.EsquemaBuit = function() {
	// Retorna true si l'esquema està buit, no té activitats.
	return(this.MyActivitats.EsquemaBuit());
}

/***********************************************************************************\
*
* VisorEsquema --> Objecte Esquema --> Edició de camins
*
************************************************************************************/

Esquema.prototype.EliminarEntrada = function(IndexCami,IdActivitat) {
	this.MyCamins[IndexCami].EliminarEntrada(IdActivitat);
}

Esquema.prototype.AfegirEntrada = function(IndexCami,IdActivitat) {
	this.MyCamins[IndexCami].AfegirEntrada(IdActivitat);
}

Esquema.prototype.AfegirSortida = function(IndexCami,IdActivitat) {
	this.MyCamins[IndexCami].AfegirSortida(IdActivitat);
}

Esquema.prototype.EliminarSortida = function(IndexCami,IdActivitat) {
	this.MyCamins[IndexCami].EliminarSortida(IdActivitat);
}

Esquema.prototype.EliminarCami = function(IndexCami) {
	if(this.MyCamins.length<=0) return;
	this.MyCamins.splice(IndexCami,1);			
}

Esquema.prototype.AfegirNouCami = function() {
	var Index=this.MyCamins.length;
	this.MyCamins[Index]=new Cami();
}

/***********************************************************************************\
*
* VisorEsquema --> Objecte Esquema --> Edició d'activitats
*
************************************************************************************/

Esquema.prototype.InsertarNovaActivitatDreta = function(Fila,Columna) {
	this.MyActivitats.InsertarNovaActivitatDreta(Fila,Columna);
}

Esquema.prototype.InsertarNovaActivitatEsquerra = function(Fila,Columna) {
	this.MyActivitats.InsertarNovaActivitatEsquerra(Fila,Columna);
}

Esquema.prototype.InsertarNovaColumnaDreta = function(Fila,Columna) {
	this.MyActivitats.InsertarNovaColumnaDreta(Fila,Columna);
}

Esquema.prototype.InsertarNovaColumnaEsquerra = function(Fila,Columna) {
	this.MyActivitats.InsertarNovaColumnaEsquerra(Fila,Columna);
}

Esquema.prototype.EliminarColumna = function(Fila,Columna) {
	// En primer lloc s'han d'eliminar totes les aparicions de les activitats de 
	// la columna als camins
	for(var Fila=0;Fila<this.MyActivitats.Files.length;Fila++) {
		var IdActivitat=this.MyActivitats.Files[Fila][Columna];
		for(var i=0;i<this.MyCamins.length;i++) {
			this.MyCamins[i].EliminarActivitat(IdActivitat);
		}
	}
	// Ara ja podem eliminar les activitats de la columna
	this.MyActivitats.EliminarColumna(Columna);
}

Esquema.prototype.InsertarNovaFilaAbaix = function(Fila,Columna) {
	this.MyActivitats.InsertarNovaFilaAbaix(Fila);
}

Esquema.prototype.InsertarNovaFilaAdalt = function(Fila,Columna) {
	this.MyActivitats.InsertarNovaFilaAdalt(Fila);
}

Esquema.prototype.EliminarFila = function(Fila,Columna) {
	// En primer lloc s'han d'eliminar totes les aparicions de les activitats de 
	// la fila als camins
	for(var Columna=0;Columna<this.MyActivitats.Files[Fila].length;Columna++) {
		var IdActivitat=this.MyActivitats.Files[Fila][Columna];
		for(var i=0;i<this.MyCamins.length;i++) {
			this.MyCamins[i].EliminarActivitat(IdActivitat);
		}
	}
	// Ara ja podem eliminar les activitats de la fila
	this.MyActivitats.EliminarFila(Fila);
}

Esquema.prototype.EliminarActivitat =function(Fila,Columna) {
	//
	// 1. Eliminem l'activitat de qualsevol camí on estigui
	//
	var IdActivitat=this.MyActivitats.Files[Fila][Columna];
	for(var i=0;i<this.MyCamins.length;i++) {
		this.MyCamins[i].EliminarActivitat(IdActivitat);
	}
	//
	// 2. Eliminem l'activitat de les activitats de l'esquema
	//
	this.MyActivitats.EliminarActivitat(Fila,Columna);
}

Esquema.prototype.EnganxarCopiaDesDePortadocumentsIniciEsquema =function(IdActivitat) {
	this.MyActivitats.EnganxarCopiaDesDePortadocumentsIniciEsquema(IdActivitat);	
}

Esquema.prototype.SubstituirActivitat =function(NovaActivitat,Fila,Columna) {
	//
	// 1. Eliminem l'activitat antiga de qualsevol camí on estigui
	//
	var AntigaActivitat=this.MyActivitats.Files[Fila][Columna];
	for(var i=0;i<this.MyCamins.length;i++) {
		this.MyCamins[i].EliminarActivitat(AntigaActivitat);
	}
	this.MyActivitats.SubstituirActivitat(NovaActivitat,Fila,Columna);
}

Esquema.prototype.InsertarIconaPerCodi =function(Fila,Columna,Codi) {
	//
	// 1. Eliminem l'activitat antiga de qualsevol camí on estigui
	//
	var AntigaActivitat=this.MyActivitats.Files[Fila][Columna];
	for(var i=0;i<this.MyCamins.length;i++) {
		this.MyCamins[i].EliminarActivitat(AntigaActivitat);
	}
	this.MyActivitats.SubstituirActivitat(-Codi,Fila,Columna);
}

Esquema.prototype.CanviPercentatgeSortida =function(Fila,Columna,Cami,NouPercentatge) {
	var Activitat=this.MyActivitats.Files[Fila][Columna];
	this.MyCamins[Cami].CanviPercentatgeSortida(Activitat,NouPercentatge);
}

/************************************************************************************
*
* VisorEsquema
* 
************************************************************************************/

function VisorEsquema(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat) {
	if (TheIndexFinestra==undefined) return;
	Visor.call(this,TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat,"Cocotrainer");
	this.Esquema=null;
	this.MatriuEsquemes=new Array();
	this.MatriuEsquemes[0]=2961;
	this.CamiActual=0;		// Index del camí que actualment es presenta per a editar-lo
	this.ModeCarrega=3;
}
VisorEsquema.prototype = new Visor();

VisorEsquema.prototype.CanviarEsquema = function(TheIdActivitat) {
	this.MatriuEsquemes[this.MatriuEsquemes.length]=TheIdActivitat;
	this.IdActivitat=TheIdActivitat;
	this.Actualitzar();
}

/************************************************************************************
*
* VisorEsquema --> Generar Pàgina
* 
************************************************************************************/

VisorEsquema.prototype.GenerarPagina =function() {
	var Cadena=this.Contingut.Elements[0][11];
	this.MyEsquema=new Esquema(Cadena);
	this.IndexActivitatIcona=this.MySacActivitats.AfegirNovaActivitat(24);
	this.TxequearEsquema();
}

/************************************************************************************
*
* VisorEsquema --> Generar Capçalera
* 
************************************************************************************/

VisorEsquema.prototype.GenerarHTMLOpcionsEsquerra = function(Mode) {
	var Text="";
	if (this.MatriuEsquemes.length>1) Text+=this.GenerarSelectorEsquemaAnterior();
	return(Text);
}

VisorEsquema.prototype.GenerarSelectorEsquemaAnterior = function() {
	var Text="<br/>";
	Funcio="Finestral["+this.IndexFinestra+"].RetrocedirAEsquemaAnterior()";
	Text+=GenerarSelector(Traduir(193)+"&nbsp;",Funcio);	// "Anterior"
	Text+='<img src="collectiva2/logos/adalt.jpg" alt="pujar" width="13" height="17"></img>';
	Text+="<br/>";
	return(Text);
}

VisorEsquema.prototype.RetrocedirAEsquemaAnterior = function() {
	var Text="";
	if (this.MatriuEsquemes.length<2) return;
	this.MatriuEsquemes.splice(this.MatriuEsquemes.length-1,1);
	var IdEsquemaAnterior=this.MatriuEsquemes[this.MatriuEsquemes.length-1];
	this.IdActivitat=IdEsquemaAnterior;
	this.Actualitzar();
}

VisorEsquema.prototype.GenerarHTMLOpcionsDreta = function(Mode) {
	var Text="";
	if(NomUsuari=="") {
		// Si no estàs identificat t'invita a identificar-te
		var Funcio="PassarAFinestra(3)";
		Text=GenerarSelector("<small><small>No estàs identificat</small></small>",Funcio);
		return(Text);
	}
	if (Mode==2) {
		//
		// Si ha demanat insertar una activitat nova, l'únic que pot fer és sortir
		//
		var Funcio="Finestral["+this.IndexFinestra+"].PassarAMode(1)";
		Text+='<img src="collectiva2/logos/atencio_petit_16_16.gif" alt="Atenció" width="16" height="16"></img>';
		Text=GenerarSelector("<small><small>Cancel·lar</small></small>",Funcio);
		return(Text);
	}
	if (Mode==4) {
		//
		// Si s'està editant, només es pot sortir d'edició
		//
		var Funcio="Finestral["+this.IndexFinestra+"].SortirEditarEsquema()";
		Text+='<img src="collectiva2/logos/atencio_petit_16_16.gif" alt="Atenció" width="16" height="16"></img>';
		Text=GenerarSelector("<small><small>Finalitzar edició</small></small>",Funcio);
		return(Text);
	}
	if (this.EsquemaEditable()) {
		//
		// Missatge d'afegir una nova secció, tema, activitat
		//
		var Funcio="Finestral["+this.IndexFinestra+"].EditarEsquema()";
		Text+=GenerarSelector("<small><small>Editar</small></small>",Funcio);
		Text+="<br/>";
	}
	return(Text);
}

VisorEsquema.prototype.EsquemaEditable= function() {
	if(!this.MySacActivitats.Activitats[0]) return(false);
	if(this.MySacActivitats.Activitats[0].Items[23].Valor==1) return(true);
	return (false);
}

VisorEsquema.prototype.EditarEsquema= function() {
	this.ModeEdicioUsuari=4;
	this.PassarAMode(4);
}

VisorEsquema.prototype.SortirEditarEsquema= function() {
	this.ModeEdicioUsuari=1;
	this.PassarAMode(1);
}

VisorEsquema.prototype.CancellarInsercio= function() {
	this.ModeEdicioUsuari=1;
	this.PassarAMode(1);
}

VisorEsquema.prototype.GenerarHTMLTitol = function(Mode) {
	var Text="";
	Text=this.MySacActivitats.VisualitzarNomActivitatCentral();
	if (Mode==4) Text+=this.VisualitzarCamiEditable();
	return(Text);
}

/************************************************************************************
*
* Visor Esquema --> Mode 4 : Editar
* 
************************************************************************************/

VisorEsquema.prototype.GenerarSelectorFinalitzarEdicio = function() {
	var Text="<br/>";
	Funcio="Finestral["+this.IndexFinestra+"].FinalitzarEdicio()";
	Text+=GenerarSelector("Sortir d'edició",Funcio);
	Text+="<br/><br/>";
	return(Text);
}

VisorEsquema.prototype.FinalitzarEdicio = function() {
	this.PassarAMode(1);
}

/************************************************************************************
*
* Visor Esquema --> Mode 4 : Editar --> Visualitzar Camí editable
* 
************************************************************************************/

VisorEsquema.prototype.VisualitzarCamiEditable = function() {
	var Text="<br /><br />";
	this.ResetActivitatsAmbInformacioCamins();
	if(this.MyEsquema.MyCamins.length==0) return(this.VisualitzarSenseCamins());
	this.ActualitzaActivitatsAmbInformacioCamiActual();
	if (this.CamiActual<=0) this.CamiActual=0;
	if (this.CamiActual>=this.MyEsquema.MyCamins.length) this.CamiActual=this.MyEsquema.MyCamins.length-1;
	Text+="<br /><br />";
	Text+=this.VisualitzarCamiActual();
	Text+="<br/><br/>"
	return(Text);
}

VisorEsquema.prototype.VisualitzarSenseCamins = function() {
	var Text="<br /><br />Sense camins";
	Text+="&nbsp;&nbsp;&nbsp;";
	var Funcio="Finestral["+this.IndexFinestra+"].AfegirNouCami()";
	Text+=GenerarSelector("+Camí",Funcio);
	Text+="<br/><br/>";
	return(Text);
}

VisorEsquema.prototype.VisualitzarCamiActual = function() {
	var Text="Camí actual:"+(this.CamiActual+1)+" de "+this.MyEsquema.MyCamins.length;
	Text+="&nbsp;&nbsp;&nbsp;";
	if(this.CamiActual==0) {
		Text+="<<<";
	}
	else {
		var Funcio="Finestral["+this.IndexFinestra+"].RetrocedirCami()";
		Text+=GenerarSelector("<<<",Funcio);
	}
 	Text+="&nbsp;&nbsp;&nbsp;";
	if(this.CamiActual>=this.MyEsquema.MyCamins.length-1) {
		Text+=">>>";
	}
	else {
		var Funcio="Finestral["+this.IndexFinestra+"].AvancarCami()";
		Text+=GenerarSelector(">>>",Funcio);
	}
 	Text+="&nbsp;&nbsp;&nbsp;";
	var Funcio="Finestral["+this.IndexFinestra+"].EliminarCami()";
	Text+=GenerarSelector("Eliminar",Funcio);
 	Text+="&nbsp;&nbsp;&nbsp;";
	var Funcio="Finestral["+this.IndexFinestra+"].AfegirNouCami()";
	Text+=GenerarSelector("+Camí",Funcio);
	return(Text);
}

VisorEsquema.prototype.RetrocedirCami= function() {
	if(this.CamiActual==0) return;
	this.CamiActual-=1;
	this.Refrescar();
}

VisorEsquema.prototype.AvancarCami= function() {
	if(this.CamiActual>=this.MyEsquema.MyCamins.length-1) return;
	this.CamiActual+=1;
	this.Refrescar();
}

VisorEsquema.prototype.ResetActivitatsAmbInformacioCamins= function() {
	// Elimina la informació associada al camí actual
	for (var i=1;i<this.MySacActivitats.Activitats.length;i++) {
		this.MySacActivitats.Activitats[i].EsEntrada=false;
		this.MySacActivitats.Activitats[i].EsSortida=false;
		this.MySacActivitats.Activitats[i].PercentatgeSortida=-1;
		if(this.MyEsquema.MyCamins.length==0) this.MySacActivitats.Activitats[i].SenseCamins=true;
 		else this.MySacActivitats.Activitats[i].SenseCamins=false;
	}
}

VisorEsquema.prototype.ActualitzaActivitatsAmbInformacioCamiActual= function() {
	// Passem la informació del camí actual a les activitats
	var CamiActual=this.MyEsquema.MyCamins[this.CamiActual];
	for (var i=0;i<CamiActual.MySortides.length;i++) {
		var IdActivitat=CamiActual.MySortides[i].IdActivitat;
		var Percentatge=CamiActual.MySortides[i].Percentatge;
		var IndexAlSac=this.MySacActivitats.BuscarPerIdActivitat(IdActivitat);
		if (IndexAlSac>=0) {
			this.MySacActivitats.Activitats[IndexAlSac].EsSortida=true;
			this.MySacActivitats.Activitats[IndexAlSac].PercentatgeSortida=Percentatge;
		}
	}
	for (var i=0;i<CamiActual.MyEntrades.length;i++) {
		var IdActivitat=CamiActual.MyEntrades[i];
		var IndexAlSac=this.MySacActivitats.BuscarPerIdActivitat(IdActivitat);
		if (IndexAlSac>=0) {
			this.MySacActivitats.Activitats[IndexAlSac].EsEntrada=true;
		}
	}	
}

/************************************************************************************
*
* Visor Esquema --> Generar HTML Esquema
* 
************************************************************************************/

VisorEsquema.prototype.GenerarHTMLBloc = function(Mode) {
	// Mode 1 --> Play
	//	2 --> Insertar activitat des del portadocuments
	//	4 --> Editar esquema
	var Text="";
	if(Mode==2) Text+=this.GenerarMissatgeEstasInsertant();
	if(Mode!=1) Text+="<br/><small><small><small>"+this.MyEsquema.OutputJSON()+"</small></small></small>";
	Text+="<br/><br/>";
	Text+='<div style="width: 10%; float:left;"></div>';
	Text+='<div style="width: 90%; float:right;">';
	Text+="<table>";
	if(this.MyEsquema.MyActivitats.EsquemaBuit()==true) {
		Text+="(esquema buit)";
	}
	else {
		for (var i=0;i<this.MyEsquema.MyActivitats.Files.length;i++) {
			Text+=this.GenerarHTMLActivitatFila(i,Mode);
		}
	}	
	Text+="</table>";
	Text+="</div>";
	return(Text);
}

VisorEsquema.prototype.GenerarMissatgeEstasInsertant = function() {
	var Text='<div style="text-align:center;">';
	Text+="<small>Selecciona la posició ";
	Text+='<span class="buitactiu">';
	Text+='&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>';
	Text+=" on vols l'activitat&nbsp;&nbsp;&nbsp;";
	var Funcio="Finestral["+this.IndexFinestra+"].PassarAMode(1)";
	Text+=GenerarSelector(Traduir(118),Funcio); // "Cancel.lar"
	Text+="</small></div><br/><br/>";
	return(Text);
}

VisorEsquema.prototype.GenerarHTMLActivitatFila = function(i,Mode) {
	var Text="<tr>";
	for (var j=0;j<this.MyEsquema.MyActivitats.Files[i].length;j++) {
		Text+=this.GenerarHTMLActivitatFilaColumna(i,j,Mode);
	}	
	Text+="</tr>";
	return(Text);
}

VisorEsquema.prototype.GenerarHTMLActivitatFilaColumna = function(Fila,Columna,Mode) {
	var Text="<td HEIGHT=50>";	
	var IdActivitat=this.MyEsquema.MyActivitats.Files[Fila][Columna];
	var IndexAlSac=-1;
	if (IdActivitat<0) {	
		//
		// Es tracta d'una icona.
		//
		this.MySacActivitats.Activitats[this.IndexActivitatIcona].Codi=-IdActivitat;
		IndexAlSac=this.IndexActivitatIcona;
	}
	else  {
		IndexAlSac=this.MySacActivitats.BuscarPerIdActivitat(IdActivitat);
		if (IndexAlSac<0) {
			//
			// Activitat no trobada. Visualitzem una icona de "activitat desconeguda"
			//
			this.MySacActivitats.Activitats[this.IndexActivitatIcona].Codi=8;
			IndexAlSac=this.IndexActivitatIcona;
		}
	}
	this.MySacActivitats.Activitats[IndexAlSac].Fila=Fila;
	this.MySacActivitats.Activitats[IndexAlSac].Columna=Columna;
	switch(Mode) {
		case 1: Text+=this.MySacActivitats.Activitats[IndexAlSac].GenerarHTML2DPlay();
			break;
		case 2: Text+=this.MySacActivitats.Activitats[IndexAlSac].GenerarHTML2DInsertar();
			break;
		case 4: Text+=this.MySacActivitats.Activitats[IndexAlSac].GenerarHTML2DEditar();
			break;
		default: error("Mode no trobat a GenerarHTMLActivitatFilaColumna");
			break;
	}
	Text+="</td>";
	return(Text);
}

/************************************************************************************
*
* Visor Esquema --> Txequear Esquema
* 
************************************************************************************/

VisorEsquema.prototype.TxequearEsquema = function() {
	// Anem fent passades perquè un camí que s'obri pot fer que s'obri algun
	// altre camí anterior, i cal tenir-lo en compte
	var NousOberts=false;
	do {
		NousOberts=false;
		for (var i=0;i<this.MyEsquema.MyCamins.length;i++) {
			if (this.ObrirCami(i)==true) NousOberts=true;
		}
	} while (NousOberts==true);
}

VisorEsquema.prototype.ObrirCami = function(i) {
	// Comprova si el camí és vàlid. Retorna true si s'ha obert ara
	if (this.MyEsquema.MyCamins[i].CamiObert==true) return(false);
	// Si totes les sortides són vàlides...
	var Sortides=this.MyEsquema.MyCamins[i].MySortides;
	for (var j=0;j<Sortides.length;j++) {
		var IdActivitat=Sortides[j].IdActivitat;
		var PercentatgeASuperar=Sortides[j].Percentatge;
		var PercentatgeActual=this.PuntuacioActivitat(IdActivitat);
		if (PercentatgeActual<PercentatgeASuperar && PercentatgeASuperar>0) return (false);
	}
	// ... Obre totes les entrades
	var Entrades=this.MyEsquema.MyCamins[i].MyEntrades;
	this.MyEsquema.MyCamins[i].CamiObert=true;
	for (var j=0;j<Entrades.length;j++) {
		var IdActivitat=Entrades[j];
		this.ObrirActivitat(IdActivitat);
	}
	return(true);
}

VisorEsquema.prototype.PuntuacioActivitat = function(IdActivitat) {
	var Index=this.MySacActivitats.BuscarPerIdActivitat(IdActivitat);
	if(Index<0) return(-1);
	return(this.MySacActivitats.Activitats[Index].Items[22].Valor);
}

VisorEsquema.prototype.ObrirActivitat = function(IdActivitat) {
	var Index=this.MySacActivitats.BuscarPerIdActivitat(IdActivitat);
	if(Index<0) return(-1);
	this.MySacActivitats.Activitats[Index].ActivitatOberta=true;
}

/************************************************************************************
*
* Visor Esquema --> Puntuar Esquema
* 
************************************************************************************/

VisorEsquema.prototype.PuntuarEsquema = function() {
	// Retorna la puntuacio de l'esquema o -1 si no l'ha trobat
	if (this.ModePuntuacio==0) return(-1);
	if (this.ModePuntuacio==1) return (this.MySacActivitats.Puntuar(1));
	// Avaluem per CamiAvaluador
	//return(this.CamiAvaluador.Avaluar());
}

/************************************************************************************
*
* Visor Esquema --> Accions d'edició de l'esquema amb camins
* 
************************************************************************************/

VisorEsquema.prototype.EliminarEntrada =function(IdActivitat) {
	this.MyEsquema.EliminarEntrada(this.CamiActual,IdActivitat);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.AfegirEntrada =function(IdActivitat) {
	this.MyEsquema.AfegirEntrada(this.CamiActual,IdActivitat);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.AfegirSortida =function(IdActivitat) {
	this.MyEsquema.AfegirSortida(this.CamiActual,IdActivitat);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.EliminarSortida =function(IdActivitat) {
	this.MyEsquema.EliminarSortida(this.CamiActual,IdActivitat);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.EliminarCami =function() {
	if(this.MyEsquema.MyCamins.length<=0) return;
	this.MyEsquema.EliminarCami(this.CamiActual);
	if(this.CamiActual>this.MyEsquema.MyCamins.length-1) {
		this.CamiActual=this.MyEsquema.MyCamins.length-1;
	}
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.AfegirNouCami =function() {
	this.MyEsquema.AfegirNouCami();
	this.CamiActual=this.MyEsquema.MyCamins.length-1;
	// No es grava res fins mentre el camí estigui buit
	this.Refrescar();
}

VisorEsquema.prototype.CanviPercentatgeSortida = function(Fila,Columna) {
	var Id="SORTIDA_"+Fila+"_"+Columna;
	var Div=document.getElementById(Id);
	if (Div) {
		var NouPercentatge=Div.value;
		if (NouPercentatge>=0 && NouPercentatge<=999) {
			this.MyEsquema.CanviPercentatgeSortida(Fila,Columna,this.CamiActual,NouPercentatge);
			this.GravarCanvisEsquema(false);
			return;
		}
		else {
			alert("Valor no acceptable");
		}
	}
}

/************************************************************************************
*
* Visor Esquema --> Accions d'edició de l'esquema amb activitats
* 
************************************************************************************/

VisorEsquema.prototype.InsertarActivitatDreta =function(Fila,Columna) {
	this.MyEsquema.InsertarNovaActivitatDreta(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.InsertarActivitatEsquerra =function(Fila,Columna) {
	this.MyEsquema.InsertarNovaActivitatEsquerra(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.EliminarActivitat =function(Fila,Columna) {
	this.MyEsquema.EliminarActivitat(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.InsertarNovaColumnaDreta =function(Fila,Columna) {
	this.MyEsquema.InsertarNovaColumnaDreta(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.InsertarNovaColumnaEsquerra =function(Fila,Columna) {
	this.MyEsquema.InsertarNovaColumnaEsquerra(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.EliminarColumna =function(Fila,Columna) {
	this.MyEsquema.EliminarColumna(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.InsertarNovaFilaAbaix =function(Fila,Columna) {
	this.MyEsquema.InsertarNovaFilaAbaix(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.InsertarNovaFilaAdalt =function(Fila,Columna) {
	this.MyEsquema.InsertarNovaFilaAdalt(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.EliminarFila =function(Fila,Columna) {
	this.MyEsquema.EliminarFila(Fila,Columna);
	this.GravarCanvisEsquema(false);
}

VisorEsquema.prototype.EnganxarCopiaDesDePortadocuments =function(IdActivitat) {
	if(this.MyEsquema.MyActivitats.ActivitatJaExisteix(IdActivitat)) {
		MissatgeModal(241); // "L'activitat ja existeix dintre de l'esquema
		return;
	}
	if (this.MyEsquema.EsquemaBuit()==true) {
		this.MyEsquema.EnganxarCopiaDesDePortadocumentsIniciEsquema(IdActivitat);
		MyPortadocuments.EliminarAccio();
		this.GravarCanvisEsquema(true);
		return;
	}
	this.PassarAMode(2);
}

VisorEsquema.prototype.EnganxarActivitatMogudaDesDePortadocuments = function(IdActivitat) {
	//
	// Un esquema no pot contenir activitats pròpies, només còpies.
	//
	MyPortadocuments.EliminarAccio();
	MissatgeModal(121);
}

VisorEsquema.prototype.EnganxarReferencia = function(IdActivitat) {
	//
	// Un esquema no pot contenir activitats pròpies, només còpies.
	//
	MyPortadocuments.EliminarAccio();
	MissatgeModal(121);
}

VisorEsquema.prototype.EnganxarActivitat =function(Fila,Columna) {
	// Substitueix l'activitat que hi ha al portadocuments a [Fila,Columna] 
	var IndexActivitat=MyPortadocuments.IndexAssenyaladorActiu;
	var NovaActivitat=MyPortadocuments.Activitats[IndexActivitat].IdActivitat;
	this.MyEsquema.SubstituirActivitat(NovaActivitat,Fila,Columna);
	MyPortadocuments.EliminarAccio();
	this.GravarCanvisEsquema(true);
}

VisorEsquema.prototype.InsertarIcona =function(Fila,Columna) {
	var Text="Selecciona:<br/>";
	var Funcio="Finestral["+this.IndexFinestra+"].InsertarIconaPerCodi("+Fila+","+Columna+",1)";
	Text+=GenerarSelector("Fletxa Est",Funcio);
	Text+="<br/>";
	var Funcio="Finestral["+this.IndexFinestra+"].InsertarIconaPerCodi("+Fila+","+Columna+",2)";
	Text+=GenerarSelector("Fletxa Sud",Funcio);
	Text+="<br/>";
	var Funcio="Finestral["+this.IndexFinestra+"].InsertarIconaPerCodi("+Fila+","+Columna+",3)";
	Text+=GenerarSelector("Fletxa Oest",Funcio);
	Text+="<br/>";
	var Funcio="Finestral["+this.IndexFinestra+"].InsertarIconaPerCodi("+Fila+","+Columna+",4)";
	Text+=GenerarSelector("Fletxa Nord",Funcio);
	Text+="<br/>";
	var Funcio="Finestral["+this.IndexFinestra+"].InsertarIconaPerCodi("+Fila+","+Columna+",5)";
	Text+=GenerarSelector("Espai en blanc",Funcio);
	Text+="<br/>";
	var Funcio="Finestral["+this.IndexFinestra+"].InsertarIconaPerCodi("+Fila+","+Columna+",7)";
	Text+=GenerarSelector("Sense llapis",Funcio);
	Text+="<br/>";
	MissatgeModalText(Text);
}

VisorEsquema.prototype.InsertarIconaPerCodi =function(Fila,Columna,Codi) {
	EliminarMissatgeModal();
	this.MyEsquema.InsertarIconaPerCodi(Fila,Columna,Codi);
	this.GravarCanvisEsquema(false);
}

/************************************************************************************
*
* Visor Esquema --> Gravar modificacions a l'esquema
* 
************************************************************************************/

VisorEsquema.prototype.GravarCanvisEsquema =function(RecarregarEsquema) {
	//
	// Genera una nova cadena JSON associada a l'esquema i la grava.
	// Opcionalment recarrega l'esquema un altre cop
	//
	this.RecarregarEsquemaDespresGravar=RecarregarEsquema;
	if (NomUsuari=="") {
		this.GenerarMissatgeError(75);		// Usuari no identificat
		return;
	}
	Url="collectiva2/php/updateact.php";	
	Url=AfegirParametreURIInicial(Url,"a",this.IdActivitat);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var NovaCadenaJSON=this.MyEsquema.OutputJSON();
	Url+="&url="+NovaCadenaJSON;
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornGravarCanvisEsquemaBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornGravarCanvisEsquemaMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorEsquema.prototype.RetornGravarCanvisEsquemaBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		this.Refrescar();
		return;
	}
	if (ContingutAJAX!="OK") {
		MissatgeModal(18);
		this.Refrescar();
		return;
	}
	if(this.RecarregarEsquemaDespresGravar==true) {
		this.Actualitzar();
		return;
	}
	this.Refrescar();
}

VisorEsquema.prototype.RetornUpdateMal =function() {
	MissatgeModal(16);	// "Error de connexió"
}

/************************************************************************************
*
*
*
* Bloc Docència
*
*
* 
************************************************************************************/

/***********************************************************************************\
*
* Gràfica Temporal
*
************************************************************************************/

function GraficaTemporal(TheAmple,TheAlt,TheDades) {
	var TaulaTemporal=new Array();
	var one_day=1000*60*60*24;
	var DataInicial=true;
	var DataAnterior=new Object();
	for (var i=0;i<TheDades.length;i++) {
		var DataCadena=TheDades[i][0];
		var Any=parseFloat(DataCadena.substring(0,2))+2000;
		var Mes=parseFloat(DataCadena.substring(2,4))-1;
		var Dia=parseFloat(DataCadena.substring(4,6));
		var DataAra=new Date(Any,Mes,Dia);
		if(DataInicial==false) {
			var DiesEntreMig=Math.ceil((DataAra.getTime()-DataAnterior.getTime())/(one_day));
			for (var j=1;j<DiesEntreMig;j++) {
				var p=TaulaTemporal.length;
				TaulaTemporal[p]=new Array();
				var DiaSeguent=new Date(DataAnterior.getTime()+one_day*j);
				TaulaTemporal[p][0]=this.OutputDiaMes(DiaSeguent);
				TaulaTemporal[p][1]=0;
			}
		}
		DataInicial=false;
		var p=TaulaTemporal.length;
		TaulaTemporal[p]=new Array();
		TaulaTemporal[p][0]=this.OutputDiaMes(DataAra);
		TaulaTemporal[p][1]=TheDades[i][1];
		DataAnterior=DataAra;
	}
	//
	// Afegim el que queda fins al dia d'avui
	//
	if(TheDades.length>0) {
		var DataAvui=new Date();
		var DiesEntreMig=Math.ceil((DataAvui.getTime()-DataAra.getTime())/(one_day));
		for (var j=1;j<DiesEntreMig;j++) {
			var p=TaulaTemporal.length;
			TaulaTemporal[p]=new Array();
			var DiaSeguent=new Date(DataAra.getTime()+one_day*j);
			TaulaTemporal[p][0]=this.OutputDiaMes(DiaSeguent);
			TaulaTemporal[p][1]=0;
		}
	}
	GraficaBarres.call(this,TheAmple,TheAlt,TaulaTemporal);	
}
GraficaTemporal.prototype = new GraficaBarres();

GraficaTemporal.prototype.OutputDiaMes = function(TheData) {
	var Text="";
	Text+=TheData.getDate();
	if (Text=='1') Text+=this.AfegirMes(TheData.getMonth()+1);
	if (TheData.getDay()==0||TheData.getDay()==6) {
		// Remarquem dissabtes i diumenges
		Text='<span style="color: white; background-color:cyan;">'+Text+'</span>';
	}
	return(Text);
}

GraficaTemporal.prototype.AfegirMes = function(TheMes) {
	switch(TheMes) {
		case 1:return("<br/>G");
		case 2:return("<br/>F");
		case 3:return("<br/>M");
		case 4:return("<br/>A");
		case 5:return("<br/>M");
		case 6:return("<br/>J");
		case 7:return("<br/>J");
		case 8:return("<br/>A");
		case 9:return("<br/>S");
		case 10:return("<br/>O");
		case 11:return("<br/>N");
		case 12:return("<br/>D");
	}
	return("<br/>X");
}

/***********************************************************************************\
*
* Gràfica de barres en HTML
*
************************************************************************************/

function GraficaBarres(TheAmple,TheAlt,TheDades) {
	//
	// Genera una gràfica de barres en HTML amb les Dades
	// Ample= amplada en pixels
	// Alt = Altura en pixels
	// Dades = Matriu Bidimensional [x,y]. Exemple: Dades=[[Dia1,12],[Dia2,34],[Dia3,4]]
	//
	// Retorna l'HTML del gràfic
	this.Ample=TheAmple;
	this.TheAlt=TheAlt;
	this.Dades=TheDades;
}

GraficaBarres.prototype.GenerarHTML = function() {
	var MaximRangX=50;	// Fixem un màxim per a l'eix X per a que la gràfica
				// no es vegi enorme
	var Text="";
	if (this.Dades==undefined) return(Traduir(194)+" "+Traduir(195));	// "Sense dades"
	if (!(this.Dades.length>0)) return(Traduir(194)+" "+Traduir(195));
	//Text+="<table align=center width=" + this.Ample + " cellpadding=2 cellspacing=2 border=0>";
	Text+="<table align=center width=" + this.Ample + " cellpadding=0 cellspacing=0 border=0>";
	Text+= "<tr bgcolor=#fad87f>";

	// Reduïm el rang als últims 90 valors si n'hi ha més
	var IndexInicial=0;
	var IndexFinal=this.Dades.length-1;
	if (this.Dades.length>90) this.IndexInicial=IndexFinal-90;

	// Calculem els valors màxim i mínim d'Y en el rang de X seleccionat

	var ValorMaximY=this.Dades[IndexInicial][1];
	var ValorMinimY=this.Dades[IndexInicial][1];
	for (var i=IndexInicial+1;i<=IndexFinal;i++) {
		if (this.Dades[i][1]<ValorMinimY) ValorMinimY=this.Dades[i][1];
		if (this.Dades[i][1]>ValorMaximY) ValorMaximY=this.Dades[i][1];
	}

	var RangY=ValorMaximY-ValorMinimY;
	var NombreColumnes=IndexFinal-IndexInicial;
	var AmpleColumna=parseInt((this.Ample-(NombreColumnes*4))/NombreColumnes);
	if (AmpleColumna>100) AmpleColumna=100;
	if (AmpleColumna<10) AmpleColumna=10;
	
	for (var i=IndexInicial;i<=IndexFinal;i++) {
		var ValorY=this.Dades[i][1];
		Text+="<td align=center valign=bottom width=" + AmpleColumna + ">";
		// Només apareix el nombre a la barra del valor màxim
		var h=parseInt(ValorY / (ValorMaximY / 200)); 
		if(ValorY==ValorMaximY) Text+="<small><small><small>"+ValorY + "</small></small></small><br>";
		Text+="<div style=' background-color:blue; width:" + (AmpleColumna) + "; height:" + h + ";' />";
		Text+="</td>";
	}
	Text+="</tr>";		
	Text+="<tr bgcolor=black; height=3></tr>";		
	Text+="<tr bgcolor=#fad87f>";
	for (var i=IndexInicial;i<=IndexFinal;i++) {
		var ValorX=this.Dades[i][0];
		Text+="<td align=center><small><small>" + ValorX + "</small></small></td>";
	}
	Text+="</tr></table>";	
	return(Text);
}

/***********************************************************************************\
*
* Visor Seguiment diari Activitat
* 
************************************************************************************/

function VisorSeguimentDiariActivitat(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat) {
	if (!TheIndexFinestra) return;
	FinestraModal.call(this,TheIndexFinestra,TheIndexFinestraMare,152);	// "Seguiment"
	this.IdActivitat=TheIdActivitat;
	var Aqui="Finestral["+TheIndexFinestra+"].";		
}
VisorSeguimentDiariActivitat.prototype = new FinestraModal();

/************************************************************************************
*
* Visor Seguiment diari --> Actualitzar
* 
************************************************************************************/

VisorSeguimentDiariActivitat.prototype.Actualitzar = function() {
	this.CarregarContingut();
	this.Refrescar();
}

VisorSeguimentDiariActivitat.prototype.CarregarContingut = function() {
	if (NomUsuari=="") {
		this.FinalActualitzar();
	}
	var Url="collectiva2/php/diariactivitat.php";
	Url=AfegirParametreURIInicial(Url,"a",this.IdActivitat);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarSeguimentActivitatBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarSeguimentActivitatMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorSeguimentDiariActivitat.prototype.RetornCarregarSeguimentActivitatBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	var ObjecteJSONContingut=eval("("+ContingutAJAX+")");
	this.GenerarGrafica(ObjecteJSONContingut.Diari);
	this.FinalActualitzar();
	this.PassarAMode(1);
}

VisorSeguimentDiariActivitat.prototype.RetornCarregarSeguimentActivitatMal =function() {
	MissatgeModal(16);
	this.FinalActualitzar();
}

/************************************************************************************
*
* Visor Seguiment diari --> Generar gràfica
* 
************************************************************************************/

VisorSeguimentDiariActivitat.prototype.GenerarGrafica =function(ObjecteJSONDiari) {
	this.MyGrafica=new GraficaTemporal(500,200,ObjecteJSONDiari);	
}

/************************************************************************************
*
* Visor Seguiment diari --> Mode 1: Visualitzar Gràfica
* 
************************************************************************************/

VisorSeguimentDiariActivitat.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text="";
	Text+="<br /><br />";
	Text+=this.MyGrafica.GenerarHTML();
	return(Text);
}

VisorSeguimentDiariActivitat.prototype.GenerarHTMLMenuMode1= function() {
	var Text="";
	return (Text);
}

/***********************************************************************************\
*
* Visor Seguiment diari Usuari-Activitat-Puntuacio
* 
************************************************************************************/

/***********************************************************************************\
*
* Selector Mode seguiment
* 
************************************************************************************/

function SelectorModeSeguiment(TheAqui) {
	EntradaSelector.call(this,TheAqui,152);		// Seguiment
	this.AfegirNomOpcio(225);			// 0 --> "Per defecte"
	this.AfegirNomOpcio(226);			// 1 --> "Sense seguiment"
	this.AfegirNomOpcio(227);			// 2 --> "Seguiment únic"
	this.AfegirNomOpcio(228);			// 3 --> "Seguiment diari"
}
SelectorModeSeguiment.prototype = new EntradaSelector();

function VisorSeguimentDiariUsuariActivitat(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat) {
	if (!TheIndexFinestra) return;
	FinestraModal.call(this,TheIndexFinestra,TheIndexFinestraMare,152);	// "Seguiment"
	this.IdActivitat=TheIdActivitat;
	var Aqui="Finestral["+TheIndexFinestra+"].";		
	this.SelectorMode=new SelectorModeSeguiment(Aqui);	
}
VisorSeguimentDiariUsuariActivitat.prototype = new FinestraModal();

VisorSeguimentDiariUsuariActivitat.prototype.AccioCanviSeleccio = function() {
	this.SelectorMode.DescarregarEspecific();
	var NouModeSeguiment=this.SelectorMode.Valor;
	if (NomUsuari=="") {
		this.GenerarMissatgeError(75);
		return;
	}
	Url="collectiva2/php/updateseg.php";	
	Url=AfegirParametreURIInicial(Url,"a",this.IdActivitat);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	Url=AfegirParametreURISecundari(Url,"seg",NouModeSeguiment);
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornUpdateSeguimentBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornUpdateSeguimentMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorSeguimentDiariUsuariActivitat.prototype.RetornUpdateSeguimentBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.MyGestorVisualitzacio.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.MyGestorVisualitzacio.GenerarMissatgeError(18);
		return;
	}
	ActualitzarFinestral(this.IdActivitat);
}

VisorSeguimentDiariUsuariActivitat.prototype.RetornUpdateSeguimentMal =function() {
	this.MyGestorVisualitzacio.GenerarMissatgeError(16);	// "Error de connexió"
}

/************************************************************************************
*
* Visor Seguiment diari --> Actualitzar
* 
************************************************************************************/

VisorSeguimentDiariUsuariActivitat.prototype.Actualitzar = function() {
	this.CarregarContingut();
	this.Refrescar();
}

VisorSeguimentDiariUsuariActivitat.prototype.CarregarContingut = function() {
	if (NomUsuari=="") {
		this.FinalActualitzar();
		this.PassarAMode(2);
	}
	var Url="collectiva2/php/diariusuariactivitat.php";
	Url=AfegirParametreURIInicial(Url,"a",this.IdActivitat);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	if (NomUsuari!="") {
		Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
		Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	}
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarSeguimentBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarSeguimentMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorSeguimentDiariUsuariActivitat.prototype.RetornCarregarSeguimentBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	var ObjecteJSONContingut=eval("("+ContingutAJAX+")");
	if (ObjecteJSONContingut.Mode==-1) this.SelectorMode.Invisible=true;
	else this.SelectorMode.Input(ObjecteJSONContingut.Mode);
	this.GenerarGrafica(ObjecteJSONContingut.Diari);
	this.FinalActualitzar();
	this.PassarAMode(1);
}

VisorSeguimentDiariUsuariActivitat.prototype.RetornCarregarSeguimentMal =function() {
	MissatgeModal(16);
	this.FinalActualitzar();
}

/************************************************************************************
*
* Visor Seguiment diari --> Generar gràfica
* 
************************************************************************************/

VisorSeguimentDiariUsuariActivitat.prototype.GenerarGrafica =function(ObjecteJSONDiari) {
	this.MyGrafica=new GraficaTemporal(500,200,ObjecteJSONDiari);	
}

/************************************************************************************
*
* Visor Seguiment diari --> Mode 1: Identificat
* 
************************************************************************************/

VisorSeguimentDiariUsuariActivitat.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text="";
	Text+=this.SelectorMode.OutputHTML();
	Text+="<br /><br />";
	Text+=this.MyGrafica.GenerarHTML();
	return(Text);
}

VisorSeguimentDiariUsuariActivitat.prototype.GenerarHTMLMenuMode1= function() {
	var Text="";
	return (Text);
}

/************************************************************************************
*
* Visor Seguiment diari --> Mode 2: No estàs identificat
* 
************************************************************************************/

VisorSeguimentDiariUsuariActivitat.prototype.GenerarHTMLEspaiTreballMode2 = function() {
	var Text="";
	Text="<br /><br /><br />"+Traduir(75);
	return(Text);
}

VisorSeguimentDiariUsuariActivitat.prototype.GenerarHTMLMenuMode2= function() {
	var Text="";
	return (Text);
}

/***********************************************************************************\
*
* Visor Seguiment diari Usuari- Suma de puntuacions
* 
************************************************************************************/

function VisorSeguimentDiariUsuariSumaPuntuacions(TheIndexFinestra,TheIndexFinestraMare) {
	if (!TheIndexFinestra) return;
	VisorSeguimentDiariUsuariActivitat.call(this,TheIndexFinestra,TheIndexFinestraMare,0);
}
VisorSeguimentDiariUsuariSumaPuntuacions.prototype = new VisorSeguimentDiariUsuariActivitat();

VisorSeguimentDiariUsuariSumaPuntuacions.prototype.CarregarContingut = function() {
	if (NomUsuari=="") {
		this.FinalActualitzar();
		this.PassarAMode(2);
	}
	var Url="collectiva2/php/diariusuaripunts.php";
	Url=AfegirParametreURIInicial(Url,"rand",GenerarStringRand());
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarSeguimentBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarSeguimentMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

/***********************************************************************************\
*
* Visor Puntuacions
* 
************************************************************************************/

function Alumne(TheAqui,TheIdUsuari,TheNom,TheCurs,TheGrup,ThePosicio,TheIdActivitat,TheIndexFinestra) {
	this.Aqui=TheAqui;
	this.IdUsuari=TheIdUsuari;
	this.Nom=TheNom;
	this.Curs=TheCurs;
	this.Grup=TheGrup;
	this.Posicio=ThePosicio;
	this.IdActivitat=TheIdActivitat;
	this.IndexFinestra=TheIndexFinestra;
}

Alumne.prototype.GenerarHTML = function() {
	var Text="";
	Text+='<span ';
	var StyleGeneral="cursor: pointer; color: blue;";
	Text+='style="'+StyleGeneral+'"';
	Text+=' onclick ="'+this.Aqui+'GenerarMenuContextual(event);"';
	Text+=' oncontextmenu ="'+this.Aqui+'GenerarMenuContextual(event);"';
	Text+=">";
	Text+=this.Nom;
	Text+="</span>";
	return(Text);
}

Alumne.prototype.GenerarMenuContextual = function(event) {
	MyMenuContextual.Reset();
	if(this.Curs==0 && this.Grup=="") {
		var Funcio=this.Aqui+"EliminarAlumne()";
		MyMenuContextual.AfegirItem("Eliminar",Funcio,true);		// "Eliminar alumne"
	}
	else {
		var Funcio=this.Aqui+"TreureAlumne()";
		MyMenuContextual.AfegirItem("Treure del grup",Funcio,true);	// "Treure alumne del grup"
	}
	var Funcio=this.Aqui+"VisualitzarHistorial()";
	MyMenuContextual.AfegirItem("Diari",Funcio,true);			// "Diari"
	MyMenuContextual.Executar(event);
}

/***********************************************************************************\
*
* Alumne --> Accions --> Treure Alumne
*
************************************************************************************/

Alumne.prototype.TreureAlumne = function() {
	var Url="collectiva2/php/treurealumne.php";
	if(NomUsuari=="") return;
	Url=AfegirParametreURIInicial(Url,"a",this.IdUsuari);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornTreureAlumneBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornTreureAlumneMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Alumne.prototype.RetornTreureAlumneBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.GenerarMissatgeError(18);
		return;
	}
	Finestral[this.IndexFinestra].Actualitzar();
}

Alumne.prototype.RetornTreureAlumneMal =function() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Alumne --> Accions --> Eliminar Alumne
*
************************************************************************************/

Alumne.prototype.EliminarAlumne = function() {
	var Url="collectiva2/php/delalumne.php";
	if(NomUsuari=="") return;
	Url=AfegirParametreURIInicial(Url,"a",this.IdUsuari);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornEliminarAlumneBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornEliminarAlumneMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

Alumne.prototype.RetornEliminarAlumneBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.GenerarMissatgeError(18);
		return;
	}
	Finestral[this.IndexFinestra].Actualitzar();
}

Alumne.prototype.RetornEliminarAlumneMal =function() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Alumne --> Accions --> Historial
*
************************************************************************************/

Alumne.prototype.VisualitzarHistorial = function() {
	FinestraHistorial=Finestral.length;
	Finestral[FinestraHistorial]=new VisorHistorial(FinestraHistorial,this.IndexFinestra,this.IdActivitat,this.IdUsuari);
	Finestral[FinestraHistorial].Reset();
	Finestral[FinestraHistorial].Actualitzar();
	PassarAFinestra(FinestraHistorial);
}

/************************************************************************************
*
* Selector de curs
* 
************************************************************************************/

function EntradaCurs(TheAqui) {
	EntradaSelector.call(this,TheAqui,139);		// "Curs"
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]=Traduir(194)+" "+Traduir(139);	// "Sense curs"
	for (var i=1;i<=10;i++) {
		this.AfegirNomOpcio(0);
		this.NomOpcions[this.NomOpcions.length-1]=""+i;
	}
}
EntradaCurs.prototype = new EntradaSelector();

function EntradaSelectorCurs(TheAqui) {
	EntradaCurs.call(this,TheAqui);
	this.AfegirNomOpcio(142);			// "Tots"
	this.OpcioTots=this.NomOpcions.length-1;
}
EntradaSelectorCurs.prototype = new EntradaCurs();

function EntradaCursAlumne(TheAqui,TheIdAlumne,TheCurs) {
	EntradaCurs.call(this,TheAqui);
	this.IdAlumne=TheIdAlumne;
	this.Nom="";
	this.Valor=TheCurs;
}
EntradaCursAlumne.prototype = new EntradaCurs();

EntradaCursAlumne.prototype.FuncioOnChange =function() {
	this.ContingutModificat=true;
	if(!this.Validar()) return;
	this.Descarregar();
	var Url="collectiva2/php/canviarcurs.php";
	if(NomUsuari=="") return;
	Url=AfegirParametreURIInicial(Url,"a",this.IdAlumne);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"c",this.Valor);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornCanviarCursBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCanviarCursMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

EntradaCursAlumne.prototype.RetornCanviarCursBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.GenerarMissatgeError(18);
		return;
	}
}

EntradaCursAlumne.prototype.RetornCanviarCursMal =function() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

/************************************************************************************
*
* Selector de grup
* 
************************************************************************************/

function EntradaGrup(TheAqui) {
	EntradaSelector.call(this,TheAqui,140);		// "Grup"
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]=Traduir(194)+" "+Traduir(140);	// "Sense grup"
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="A";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="B";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="C";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="D";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="E";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="F";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="G";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="H";
	this.AfegirNomOpcio(0);
	this.NomOpcions[this.NomOpcions.length-1]="I";
}
EntradaGrup.prototype = new EntradaSelector();

EntradaGrup.prototype.PassarNumeroALletra = function(Numero) {
	switch(Numero) {
		case 0:return("");
		case 1:return("A");
		case 2:return("B");
		case 3:return("C");
		case 4:return("D");
		case 5:return("E");
		case 6:return("F");
		case 7:return("G");
		case 8:return("H");
		case 9:return("I");
	}
	alert("error");
}

EntradaGrup.prototype.PassarLletraANumero = function(Lletra) {
	switch(Lletra) {
		case '':return(0);
		case 'A':return(1);
		case 'B':return(2);
		case 'C':return(3);
		case 'D':return(4);
		case 'E':return(5);
		case 'F':return(6);
		case 'G':return(7);
		case 'H':return(8);
		case 'I':return(9);
	}
	alert("error");
}

function EntradaSelectorGrup(TheAqui) {
	EntradaGrup.call(this,TheAqui);
	this.AfegirNomOpcio(142);			// "tots"
	this.OpcioTots=this.NomOpcions.length-1;
}
EntradaSelectorGrup.prototype = new EntradaGrup();

function EntradaGrupAlumne(TheAqui,TheIdAlumne,TheGrup) {
	EntradaGrup.call(this,TheAqui);
	this.Nom="";
	this.IdAlumne=TheIdAlumne;
	this.Valor=this.PassarLletraANumero(TheGrup);
}
EntradaGrupAlumne.prototype = new EntradaGrup();

EntradaGrupAlumne.prototype.FuncioOnChange =function() {
	this.ContingutModificat=true;
	if(!this.Validar()) return;
	this.Descarregar();
	var Url="collectiva2/php/canviargrup.php";
	if(NomUsuari=="") return;
	Url=AfegirParametreURIInicial(Url,"a",this.IdAlumne);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"g",this.PassarNumeroALletra(this.Valor));
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornCanviarGrupBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornCanviarGrupMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

EntradaGrupAlumne.prototype.RetornCanviarGrupBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.GenerarMissatgeError(18);
		return;
	}
}

EntradaGrupAlumne.prototype.RetornCanviarGrupMal =function() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

/************************************************************************************
*
* Selector de posicio
* 
************************************************************************************/

function EntradaPosicio(TheAqui) {
	EntradaEnter.call(this,TheAqui,141); // "#"
	this.ValorMinim=1;
}
EntradaPosicio.prototype = new EntradaEnter();


function EntradaPosicioAlumne(TheAqui,TheIdAlumne,ThePosicio) {
	EntradaPosicio.call(this,TheAqui);
	this.IdAlumne=TheIdAlumne;
	this.Nom="";
	this.Valor=ThePosicio;
}
EntradaPosicioAlumne.prototype = new EntradaPosicio();

EntradaPosicioAlumne.prototype.FuncioOnChange =function() {
	this.ContingutModificat=true;
	if(!this.Validar()) return;
	this.Descarregar();
	var Url="collectiva2/php/mourealumne.php";
	if(NomUsuari=="") return;
	Url=AfegirParametreURIInicial(Url,"a",this.IdAlumne);
	Url=AfegirParametreURISecundari(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"p",this.Valor);
	Url=AfegirParametreURISecundari(Url,"rand",GenerarStringRand());
	var FuncioBe=this.Aqui+"RetornMoureAlumneBe(ContingutAJAX)";
	var FuncioMal=this.Aqui+"RetornMoureAlumneMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

EntradaPosicioAlumne.prototype.RetornMoureAlumneBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.GenerarMissatgeError(18);
		return;
	}
}

EntradaPosicioAlumne.prototype.RetornMoureAlumneMal =function() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
}

/************************************************************************************
*
* Selector de concepte
* 
************************************************************************************/

function EntradaConcepte(TheAqui) {
	EntradaSelector.call(this,TheAqui,182);		// "Concepte"
	this.AfegirNomOpcio(183);			// 0 --> "Puntuació màxima"
	this.AfegirNomOpcio(184);			// 1 --> "Visites"
}
EntradaConcepte.prototype = new EntradaSelector();

/***********************************************************************************\
*
* Visor Puntuacions
* 
************************************************************************************/

function VisorPuntuacions(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat) {
	Finestra.call(this,TheIndexFinestra,TheIndexFinestraMare,"Notes");	// "Puntuacions"
	this.Autodestruible=true;
	var Aqui="Finestral["+this.IndexFinestra+"].SelectorCursGrup.";
	this.SelectorCursGrup=new Formulari(Aqui,171); // "Selecció de curs i grup"
	this.SelectorCursGrup.Items[1]=new EntradaSelectorCurs(Aqui+"Items[1].");
	this.SelectorCursGrup.Items[2]=new EntradaSelectorGrup(Aqui+"Items[2].");
	this.SelectorCursGrup.Items[3]=new EntradaConcepte(Aqui+"Items[3].");
	this.SelectorCursGrup.Items[3].Invisible=true;
	var Funcio='Finestral['+this.IndexFinestra+'].CarregarPuntuacions()';
	this.SelectorCursGrup.Items[4]=new EntradaBoto(Aqui+"Items[4].",4,Funcio);	// "Accedir"
	this.SenseSeleccioInicial=true;
	this.IdActivitat=TheIdActivitat;
}
VisorPuntuacions.prototype = new Finestra();

/************************************************************************************
*
* Visor Puntuacions --> Actualitzar
* 
************************************************************************************/

VisorPuntuacions.prototype.Actualitzar = function() {
	if(this.SenseSeleccioInicial==true) {
		this.PassarAMode(1);
		this.FinalActualitzar();
	}
	else {
		this.CarregarPuntuacions();
	}
}

/************************************************************************************
*
* Visor Puntuacions --> Actualitzar --> Carregar Puntuacions
* 
************************************************************************************/

VisorPuntuacions.prototype.CarregarPuntuacions = function() {
	if (this.SelectorCursGrup.Descarregar()!=true) return;
	if (NomUsuari=="") return;
	var Url="collectiva2/php/loadpunts.php";
	Url=AfegirParametreURIInicial(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url+="&rand="+GenerarStringRand();
	if (this.IdActivitat>0) {
		Url=AfegirParametreURISecundari(Url,"a",this.IdActivitat);
	} 
	var CursSeleccionat=this.SelectorCursGrup.Items[1].Valor;
	if (CursSeleccionat==this.SelectorCursGrup.Items[1].OpcioTots) {
		Url=AfegirParametreURISecundari(Url,"sc",1);
	}
	else {
		Url=AfegirParametreURISecundari(Url,"c",CursSeleccionat);
	}
	var GrupSeleccionat=this.SelectorCursGrup.Items[2].Valor;
	if (GrupSeleccionat==this.SelectorCursGrup.Items[2].OpcioTots) {
		Url=AfegirParametreURISecundari(Url,"sg",1);
	}
	else {
		var Grup=this.SelectorCursGrup.Items[2].Valor;
		Url=AfegirParametreURISecundari(Url,"g",this.SelectorCursGrup.Items[2].PassarNumeroALletra(Grup));

	}
	Url=AfegirParametreURISecundari(Url,"i",this.SelectorCursGrup.Items[3].Valor);
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarPuntuacionsBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarPuntuacionsMal()";
	MissatgeModalText("Carregant puntuacions");
	AfegirMissatgeModalCarregant();
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorPuntuacions.prototype.RetornCarregarPuntuacionsBe =function(ContingutAJAX) {
	EliminarMissatgeModal();
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	this.GenerarMatriuPuntuacionsInteractives(ContingutAJAX);
	this.SenseSeleccioInicial=false;
	this.PassarAMode(1);
	this.FinalActualitzar();
}

VisorPuntuacions.prototype.GenerarMatriuPuntuacionsInteractives =function(ContingutAJAX) {
	this.MatriuPunts=new Array();
	this.MatriuPuntuacions=eval("("+ContingutAJAX+")");
	for (i=0;i<this.MatriuPuntuacions.Puntuacions.length;i++) {
		this.MatriuPunts[i]=new Array();
		var Nom=this.MatriuPuntuacions.Puntuacions[i][0][0];
		var Curs=this.MatriuPuntuacions.Puntuacions[i][0][1];
		var Grup=this.MatriuPuntuacions.Puntuacions[i][0][2]
		var Posicio=this.MatriuPuntuacions.Puntuacions[i][0][3];
		var IdUsuari=this.MatriuPuntuacions.Puntuacions[i][0][4];
		var TheAqui="Finestral["+this.IndexFinestra+"].MatriuPunts["+i+"][0].";
		this.MatriuPunts[i][0]=new Alumne(TheAqui,IdUsuari,Nom,Curs,Grup,Posicio,this.IdActivitat,this.IndexFinestra);
		// Després venen totes les puntuacions de les activitats
		for (var j=0;j<this.MatriuPuntuacions.Puntuacions[i][1].length;j++) {
			var Puntuacio=this.MatriuPuntuacions.Puntuacions[i][1][j];
			var IdActivitat=this.MatriuPuntuacions.Activitats[j][2];
			var Aqui="Finestral["+this.IndexFinestra+"].MatriuPunts["+i+"]["+(j+1)+"].";
			this.MatriuPunts[i][j+1]=new EntradaPuntuacio(Aqui,0);
			this.MatriuPunts[i][j+1].Input(Puntuacio);
		}
	}
}

/************************************************************************************
*
* Visor Puntuacions --> Generar Matriu Puntuacions interactives.
* 
************************************************************************************/

VisorPuntuacions.prototype.RetornCarregarPuntuacionsMal =function() {
	MissatgeModalText("Error carregant puntuacions");
	this.FinalActualitzar();
}


/************************************************************************************
*
* Visor Puntuacions --> GenerarHTML
* 
************************************************************************************/

VisorPuntuacions.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text="<br />";
	Text+=this.SelectorCursGrup.Insertar("",false);
	if (this.SenseSeleccioInicial==true) {
		Text+="<br/><br/>"+Traduir(172);	// "Selecciona un curs i un grup"
	}
	else Text+=this.GenerarLlistatPuntuacions();
	Text+="<br/><br/><br/>";
	return(Text);
}

VisorPuntuacions.prototype.GenerarHTMLMenuMode1= function() {
	var Text="";
	return (Text);
}

/************************************************************************************
*
* Visor Puntuacions --> Generar Text Puntuacions
* 
************************************************************************************/

VisorPuntuacions.prototype.GenerarLlistatPuntuacions =function() {
	var Text="";
	this.NombreActivitats=this.MatriuPuntuacions.Activitats.length;
	this.NombreAlumnes=this.MatriuPunts.length;
	if (this.NombreActivitats==0) {
		Text+="<br />"+Traduir(232)+".";
		return(Text);
	}
	if (this.NombreAlumnes==0) {
		Text+="<br />"+Traduir(233)+".";
		return(Text);
	}
	Text+=this.VisualitzarActivitats();
	Text+=this.VisualitzarPuntuacions();
	return (Text);
}

VisorPuntuacions.prototype.VisualitzarActivitats = function() {
	var Text="<br />Activitats:";
	for (var i=0;i<this.NombreActivitats;i++) {
		Text+="<br />";
		Text+=(i+1);
		Text+=".&nbsp;&nbsp;";
		Text+=decodeURIComponent(this.MatriuPuntuacions.Activitats[i][0]);
	}
	return(Text);
}

VisorPuntuacions.prototype.VisualitzarPuntuacions = function() {
	var Text="";
	Text+=this.VisualitzarCapTaulaPuntuacions();
	Text+=this.VisualitzarCosTaulaPuntuacions();
	return(Text);
}

VisorPuntuacions.prototype.VisualitzarCapTaulaPuntuacions =function() {
	var Text="<br />";
	Text+='<table id="PUNTUACIONS_'+this.IndexFinestra+'" class="taulagris">';
	Text+='<thead>';
	Text+='<tr class="liniainicial">';
	Text+='<th></th>';	// La primera columna és la posició de l'alumne
	Text+='<th>'+Traduir(27)+'</th>';	// "Nom"
	Text+='<th>'+Traduir(139)+'</th>';	// "Curs"
	Text+='<th>'+Traduir(140)+'</th>';	// "Grup"
	for (var i=0;i<this.NombreActivitats;i++) {
		Text+='<th>';
		Text+=(i+1);
		Text+='</th>';
	}
	Text+='<th>Promig</th>';		// "Promig"
	Text+='</tr>';
	Text+='</thead>';
	return (Text);
}

VisorPuntuacions.prototype.VisualitzarCosTaulaPuntuacions =function() {
	var Text="";
	Text+='<tbody>';
	for (i=0;i<this.MatriuPunts.length;i++) {
		Text+=this.VisualitzarNotesAlumne(i);
	}
	Text+='</tbody>';
	Text+='</table>';
	return(Text);
}

VisorPuntuacions.prototype.VisualitzarNotesAlumne =function(Index) {
	var Text="<tr>";
	// La primera columna és l'índex
	var Posicio=this.MatriuPunts[Index][0].Posicio;
	Text+=this.VisualitzarColumna(Posicio);
	// La segona columna és el nom
	var Nom=this.MatriuPunts[Index][0].GenerarHTML();
	Text+=this.VisualitzarColumna(Nom);
	// La tercera columna és el curs
	var Curs=this.MatriuPunts[Index][0].Curs;
	Text+=this.VisualitzarColumna(Curs);
	// La quarta columna és el grup
	var Grup=this.MatriuPunts[Index][0].Grup;
	Text+=this.VisualitzarColumna(Grup);
	// Després venen totes les puntuacions de les activitats
	for (var i=1;i<this.MatriuPunts[Index].length;i++) {
		var Puntuacio=this.MatriuPunts[Index][i].GenerarHTMLPla();
		Text+=this.VisualitzarColumna(Puntuacio);
	}
	// Per últim el promig de notes
	var PuntuacioAcumulada=0;
	for (var i=1;i<this.MatriuPunts[Index].length;i++) {
		Puntuacio=this.MatriuPunts[Index][i].Valor;
		if(Puntuacio<0) Puntuacio=0;
		if(Puntuacio>100) Puntuacio=100;
		PuntuacioAcumulada+=Puntuacio;
	}
	var Puntuacio=this.CalcularPromig(PuntuacioAcumulada,this.MatriuPunts[Index].length-1);
	Text+=this.VisualitzarColumna(Puntuacio);	
	Text+="</tr>";
	return(Text);
}

VisorPuntuacions.prototype.CalcularPromig =function(TotalPunts,NActivitats) {
	if(NActivitats<=0) return("---");
	var Promig=TotalPunts/NActivitats;
	var Percentatge=Math.round(Promig);
	if (Percentatge>100) Percentatge=100;
	var Percent=Percentatge+"<sup><small>%</small></sup>";
	return(Percent);
}

VisorPuntuacions.prototype.VisualitzarColumna =function(Contingut) {
	var Text="";
	Text+='<td>';
	Text+=Contingut;
	Text+='</td>';
	return (Text);
}

/***********************************************************************************\
*
* Visor Alumnes
* 
************************************************************************************/

function VisorAlumnes(TheIndexFinestra,TheIndexFinestraMare) {
	FinestraModal.call(this,TheIndexFinestra,TheIndexFinestraMare,174);	// "Alumnes"
	var Aqui="Finestral["+this.IndexFinestra+"].SelectorCursGrup.";
	this.SelectorCursGrup=new Formulari(Aqui,171); // "Selecció de curs i grup"
	this.SelectorCursGrup.Items[1]=new EntradaSelectorCurs(Aqui+"Items[1].");
	this.SelectorCursGrup.Items[2]=new EntradaSelectorGrup(Aqui+"Items[2].");
	var Funcio='Finestral['+this.IndexFinestra+'].CarregarAlumnes()';
	this.SelectorCursGrup.Items[3]=new EntradaBoto(Aqui+"Items[3].",4,Funcio); // Accedir 
	this.SenseSeleccioInicial=true;
}
VisorAlumnes.prototype = new FinestraModal();

/************************************************************************************
*
* Visor Alumnes --> Actualitzar
* 
************************************************************************************/

VisorAlumnes.prototype.Actualitzar = function() {
	if(this.SenseSeleccioInicial==true) {
		this.PassarAMode(1);
		this.FinalActualitzar();
	}
	else {
		this.CarregarAlumnes();
	}
}

/************************************************************************************
*
* Visor Alumnes --> Actualitzar --> Carregar Alumnes
* 
************************************************************************************/

VisorAlumnes.prototype.CarregarAlumnes = function() {
	if (this.SelectorCursGrup.Descarregar()!=true) return;
	if (NomUsuari=="") return;
	var Url="collectiva2/php/loadalumnes.php";
	Url=AfegirParametreURIInicial(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url+="&rand="+GenerarStringRand();
	var CursSeleccionat=this.SelectorCursGrup.Items[1].Valor;
	if (CursSeleccionat==this.SelectorCursGrup.Items[1].OpcioTots) {
		Url=AfegirParametreURISecundari(Url,"sc",1);
	}
	else {
		Url=AfegirParametreURISecundari(Url,"c",CursSeleccionat);
	}
	var GrupSeleccionat=this.SelectorCursGrup.Items[2].Valor;
	if (GrupSeleccionat==this.SelectorCursGrup.Items[2].OpcioTots) {
		Url=AfegirParametreURISecundari(Url,"sg",1);
	}
	else {
		var Grup=this.SelectorCursGrup.Items[2].Valor;
		Url=AfegirParametreURISecundari(Url,"g",this.SelectorCursGrup.Items[2].PassarNumeroALletra(Grup));

	}
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarAlumnesBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarAlumnesMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorAlumnes.prototype.RetornCarregarAlumnesBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	this.MatriuAlumnes=eval("("+ContingutAJAX+")");
	this.SenseSeleccioInicial=false;
	this.PassarAMode(1);
	this.FinalActualitzar();
}

VisorAlumnes.prototype.RetornCarregarAlumnesMal =function() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
	this.FinalActualitzar();
}

/************************************************************************************
*
* Visor Alumnes --> GenerarHTML
* 
************************************************************************************/

VisorAlumnes.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text="<br />";
	Text+=this.SelectorCursGrup.Insertar("",false);
	if (this.SenseSeleccioInicial==true) {
		Text+="<br/><br/>"+Traduir(172);	// "Selecciona un curs i un grup"
	}
	else Text+=this.GenerarLlistatAlumnes();
	return(Text);
}

VisorAlumnes.prototype.GenerarHTMLMenuMode1= function() {
	var Text="";
	return (Text);
}

/************************************************************************************
*
* Visor Alumnes --> Generar Text Alumnes
* 
************************************************************************************/

VisorAlumnes.prototype.GenerarLlistatAlumnes =function() {
	var Text="";
	this.MatriuCursos=new Array();
	this.MatriuGrups=new Array();
	this.MatriuPosicions=new Array();
	if (this.MatriuAlumnes.length==0) {
		return("No s'han trobat alumnes.");
	}
	var Text=this.VisualitzarCapTaula('Alumnes');
	var Comptador=1;
	for (var i=0;i<this.MatriuAlumnes.length;i++) {
		Text+=this.VisualitzarIniciLinia(Comptador);
		var IdAlumne=this.MatriuAlumnes[i][4];
		// IdAlumne=0 significa que s'ha esborrat
		if(IdAlumne!=0) {
			//
			//Nom
			//
			Text+=this.VisualitzarColumna(this.MatriuAlumnes[i][0],Comptador);
			//
			// Curs
			//
			var p=this.MatriuCursos.length;
			var Aqui="Finestral["+this.IndexFinestra+"].MatriuCursos["+p+"].";
			var Curs=this.MatriuAlumnes[i][1];
			this.MatriuCursos[p]= new EntradaCursAlumne(Aqui,IdAlumne,Curs);
			Text+=this.VisualitzarColumna(this.MatriuCursos[p].OutputHTML(),Comptador);
			//
			// Grup
			//
			var p=this.MatriuGrups.length;
			var Aqui="Finestral["+this.IndexFinestra+"].MatriuGrups["+p+"].";
			var Grup=this.MatriuAlumnes[i][2];
			this.MatriuGrups[p]= new EntradaGrupAlumne(Aqui,IdAlumne,Grup);
			Text+=this.VisualitzarColumna(this.MatriuGrups[p].OutputHTML(),Comptador);
			//
			// Posicio
			//
			var p=this.MatriuPosicions.length;
			var Aqui="Finestral["+this.IndexFinestra+"].MatriuPosicions["+p+"].";
			var Posicio=this.MatriuAlumnes[i][3];
			this.MatriuPosicions[p]= new EntradaPosicioAlumne(Aqui,IdAlumne,Posicio);
			Text+=this.VisualitzarColumna(this.MatriuPosicions[p].OutputHTML(),Comptador);
			//
			// Eliminar
			//
			var Funcio="Finestral["+this.IndexFinestra+"].EliminarRegistreDocent("+i+")";
			Text+=this.VisualitzarColumna(GenerarSelector(Traduir(175),Funcio),Comptador);
			//	
			// Final de línia
			//
			Text+=this.VisualitzarFinalLinia();
		}
	}
	Text+=this.VisualitzarPeuTaula();
	Text+="<br/><br/>";
	return (Text);
}

VisorAlumnes.prototype.VisualitzarCapTaula =function(NomTaula) {
	var Text="<br />";
	Text+='<table id="table_'+NomTaula+'" class="taulagris">';
	Text+='<thead>';
	Text+='<tr class="liniainicial">';
	Text+='<th>Nom</th>';
	Text+='<th>Curs</th>';
	Text+='<th>Grup</th>';
	Text+='<th>Posici&oacute;</th>';
	Text+='<th></th>';	// Columna "eliminar"
	Text+='</tr>';
	Text+='</thead>';
	Text+='<tbody>';
	return (Text);
}

VisorAlumnes.prototype.VisualitzarPeuTaula =function() {
	var Text="";
	Text+='</tbody>';
	Text+='<tbody>';
	Text+='<tr class="liniainicial">';
	Text+='</td>';
	Text+='</td>';
	Text+='</td>';
	Text+='</td>';
	Text+='</tr>';
	Text+='</tr>';
	Text+='</tbody>';
	Text+='</table>';
	return (Text);
}

VisorAlumnes.prototype.VisualitzarIniciLinia =function(Comptador) {
	var Text="";
	if (Comptador%2==0) {
		Text+='<tr class="liniaparell">';
	}
	else {
		Text+='<tr class="liniasenar">';
	}
	return (Text);
}

VisorAlumnes.prototype.VisualitzarFinalLinia =function() {
	var Text="";
	Text="</tr>";
	return (Text);
}

VisorAlumnes.prototype.VisualitzarColumna =function(Contingut,Comptador) {
	var Text="";
	if (Comptador%2==0) {
		Text+='<td class="liniaparell">';
	}
	else {
		Text+='<td class="liniasenar">';
	}
	Text+=Contingut;
	Text+='</td>';
	return (Text);
}

VisorAlumnes.prototype.EliminarRegistreDocent = function(Fila) {
	//Aquesta rutina és una còpia de la rutina equivalent de VisorProfessors
	if (NomUsuari=="") return;
	var IdAlumne=this.MatriuAlumnes[Fila][4];
	var Url="collectiva2/php/deldocent.php";
	Url=AfegirParametreURIInicial(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"d",IdAlumne);
	Url+="&rand="+GenerarStringRand();
	FilaAEliminarRegistreDocent=Fila;
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornEliminarRegistreDocentBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornEliminarRegistreDocentMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorAlumnes.prototype.RetornEliminarRegistreDocentBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModal(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		MissatgeModal(18);
		return;
	}
	// 
	// Eliminem la fila afectada marcant com a 0 la seva Id.
	//
	this.MatriuAlumnes[FilaAEliminarRegistreDocent][4]=0;
	this.Refrescar();
}

VisorAlumnes.prototype.RetornEliminarRegistreDocentMal =function() {
	this.NouProfessor.GenerarMissatgeError(16);	// "Error de connexió"
}

/***********************************************************************************\
*
* Visor Professors
* 
************************************************************************************/

function VisorProfessors(TheIndexFinestra,TheIndexFinestraMare) {
	FinestraModal.call(this,TheIndexFinestra,TheIndexFinestraMare,173);	
}
VisorProfessors.prototype = new FinestraModal();

/************************************************************************************
*
* Visor Professors --> Actualitzar
* 
************************************************************************************/

VisorProfessors.prototype.Actualitzar = function() {
	this.CarregarProfessors();
}

/************************************************************************************
*
* Visor Professors --> Actualitzar --> Carregar Professors
* 
************************************************************************************/

VisorProfessors.prototype.CarregarProfessors = function() {
	if (NomUsuari=="") return;
	var Url="collectiva2/php/loadprofes.php";
	Url=AfegirParametreURIInicial(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url+="&rand="+GenerarStringRand();
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarProfessorsBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarProfessorsMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorProfessors.prototype.RetornCarregarProfessorsBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	this.MatriuProfessors=eval("("+ContingutAJAX+")");
	this.PassarAMode(1);
	this.FinalActualitzar();
}

VisorProfessors.prototype.RetornCarregarProfessorsMal =function() {
	this.GenerarMissatgeError(16);	// "Error de connexió"
	this.FinalActualitzar();
}

/************************************************************************************
*
* Visor Professors --> GenerarHTML
* 
************************************************************************************/

VisorProfessors.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	var Text="<br />";
	Text+=this.GenerarLlistatProfessors();
	return(Text);
}

VisorProfessors.prototype.GenerarHTMLMenuMode1= function() {
	var Text="";
	return (Text);
}

/************************************************************************************
*
* Visor Professors --> Generar Text Professors
* 
************************************************************************************/

VisorProfessors.prototype.GenerarLlistatProfessors =function() {
	var Text="";
	if (this.MatriuProfessors.length==0) {
		Text+="No s'han trobat professors."+"<br/><br/>";;
	}
	for (var i=0;i<this.MatriuProfessors.length;i++) {
		Text+="<br/>"+(i+1)+".&nbsp;";
		var Id=this.MatriuProfessors[i][0];
		Text+=this.MatriuProfessors[i][1];
		Text+="&nbsp;(Curs:";
		Text+=this.GenerarNomCurs(this.MatriuProfessors[i][2]);
		Text+="&nbsp;Grup:";
		Text+=this.GenerarNomGrup(this.MatriuProfessors[i][3]);
		Text+=")&nbsp;";
		var Funcio="Finestral["+this.IndexFinestra+"].EliminarRegistreDocent("+Id+")";
		Text+=GenerarSelector(Traduir(175),Funcio);
		//Text+="<br/>";
	}
	Text+="<br/><br/>";
	//
	// Generem un formulari de nou professor
	var Aqui="Finestral["+this.IndexFinestra+"].NouProfessor.";
	this.NouProfessor=new Formulari(Aqui,176); 					// "Selecciona un nou supervisor"
	this.NouProfessor.Items[1]=new EntradaIdentificador(Aqui+"Items[1].",7);	// "Identificador"
	var Funcio='Finestral['+this.IndexFinestra+'].GenerarNouProfessor()';
	this.NouProfessor.Items[2]=new EntradaBoto(Aqui+"Items[2].",4,Funcio);		// Accedir 
	Text+=this.NouProfessor.Insertar("",false);
	return (Text);
}

VisorProfessors.prototype.GenerarNomCurs =function(Curs) {
	if(Curs==0) return("---");
	return(Curs);
}

VisorProfessors.prototype.GenerarNomGrup =function(Grup) {
	if(Grup=="") return("---");
	return(Grup);
}

VisorProfessors.prototype.EliminarRegistreDocent = function(Id) {
	if (NomUsuari=="") return;
	var Url="collectiva2/php/deldocent.php";
	Url=AfegirParametreURIInicial(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"d",Id);
	Url+="&rand="+GenerarStringRand();
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornEliminarRegistreDocentBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornEliminarRegistreDocentMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorProfessors.prototype.RetornEliminarRegistreDocentBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.NouProfessor.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.NouProfessor.GenerarMissatgeError(18);
		return;
	}
	this.Actualitzar();
}

VisorProfessors.prototype.RetornEliminarRegistreDocentMal =function() {
	this.NouProfessor.GenerarMissatgeError(16);	// "Error de connexió"
}

VisorProfessors.prototype.GenerarNouProfessor =function() {
	if (this.NouProfessor.Descarregar()!=true) return;
	var LoginNouProfessor=this.NouProfessor.Items[1].Valor;
	if (NomUsuari=="") return;
	var Url="collectiva2/php/noudocent.php";
	Url=AfegirParametreURIInicial(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url+="&rand="+GenerarStringRand();
	Url=AfegirParametreURISecundari(Url,"d",LoginNouProfessor);
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornGenerarNouProfessorBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornGenerarNouProfessorMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
}

VisorProfessors.prototype.RetornGenerarNouProfessorBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		this.NouProfessor.GenerarMissatgeError(CodiErrorResposta);
		return;
	}
	if (ContingutAJAX!="OK") {
		this.NouProfessor.GenerarMissatgeError(18);
		return;
	}
	this.Actualitzar();
}

VisorProfessors.prototype.RetornGenerarNouProfessorMal =function() {
	this.NouProfessor.GenerarMissatgeError(16);	// "Error de connexió"
	this.FinalActualitzar();
}

/***********************************************************************************\
*
* Visor Historial
* 
************************************************************************************/

function VisorHistorial(TheIndexFinestra,TheIndexFinestraMare,TheIdActivitat,TheIdAlumne) {
	FinestraModal.call(this,TheIndexFinestra,TheIndexFinestraMare,0);
	this.IdActivitat=TheIdActivitat;
	this.IdAlumne=TheIdAlumne;
	this.NomPestanya="Diari";
}
VisorHistorial.prototype = new FinestraModal();

/************************************************************************************
*
* Visor Historial --> Actualitzar
* 
************************************************************************************/

VisorHistorial.prototype.Actualitzar = function() {
	this.CarregarHistorial();
}

/************************************************************************************
*
* Visor Historial --> Actualitzar --> Carregar Historial
* 
************************************************************************************/

VisorHistorial.prototype.CarregarHistorial = function() {
	if (NomUsuari=="") return;
	var Url="collectiva2/php/historial.php";
	Url=AfegirParametreURIInicial(Url,"u",LoginUsuari);
	Url=AfegirParametreURISecundari(Url,"pu",PasswordUsuari);
	Url=AfegirParametreURISecundari(Url,"a",this.IdActivitat);
	if(this.IdAlumne>0) Url=AfegirParametreURISecundari(Url,"e",this.IdAlumne);
	Url+="&rand="+GenerarStringRand();
	var FuncioBe="Finestral["+this.IndexFinestra+"].RetornCarregarHistorialBe(ContingutAJAX)";
	var FuncioMal="Finestral["+this.IndexFinestra+"].RetornCarregarHistorialMal()";
	CarregadorContingut = new PeticioAJAX(Url,FuncioBe,FuncioMal);
	this.PassarAMode(0);
}

VisorHistorial.prototype.RetornCarregarHistorialBe =function(ContingutAJAX) {
	var CodiErrorResposta=GestionarErrorsRespostaPHP(ContingutAJAX);
	if (CodiErrorResposta!=0) {
		MissatgeModalText("Error "+CodiErrorResposta);
		return;
	}
	this.Historial=eval("("+ContingutAJAX+")");
	this.PassarAMode(1);
	this.FinalActualitzar();
}

VisorHistorial.prototype.RetornCarregarHistorialMal =function() {
	MissatgeModalText("Error carregant Historial");
	this.FinalActualitzar();
}

/************************************************************************************
*
* Visor Historial --> GenerarHTML
* 
************************************************************************************/

VisorHistorial.prototype.GenerarHTMLEspaiTreballMode1 = function() {
	switch(this.Historial.Mode) {
		case 1:Text=this.GenerarHTMLHistorialTema(); break;
		case 2:Text=this.GenerarHTMLHistorialSeccio(); break;
		case 3:Text=this.GenerarHTMLHistorialActivitat(); break;
		default:LogError(14426);
	}
	return(Text);
}

/************************************************************************************
*
* Visor Historial --> Generar HTML Historial Tema
* 
************************************************************************************/

VisorHistorial.prototype.GenerarHTMLHistorialTema =function() {
	var Text="";
	Text+=this.GenerarHTMLCapcaleraTema();
	Text+="<br/><br/>";
	Text+='<table id="Historial_'+this.IndexFinestra+'" class="taulagris">';
	Text+=this.VisualitzarCapTaulaHistorialTema();
	Text+="<tbody>";
	for (var i=0;i<this.Historial.Items.length;i++) {
		Text+=this.VisualitzarApuntHistorialTema(i);
	}
	Text+='</tbody>';
	Text+='</table>';
	return(Text);
}

VisorHistorial.prototype.GenerarHTMLCapcaleraTema =function() {
	var Text="<br/>Diari del tema<br/>";
	return (Text);
}

VisorHistorial.prototype.VisualitzarCapTaulaHistorialTema =function() {
	var Text="";
	Text+='<thead>';
	Text+='<tr class="liniainicial">';
	Text+='<th>Data-Hora</th>';
	Text+='<th>Activitat</th>';
	Text+='<th>Acció</th>';	
	Text+='</tr>';
	Text+='</thead>';
	return (Text);
}

VisorHistorial.prototype.VisualitzarApuntHistorialTema =function(Index) {
	var Text="<tr>";
	var Data=this.Historial.Items[Index][0];
	Text+=this.VisualitzarColumna(Data);
	var NomActivitat=this.Historial.Items[Index][1];
	var IdActivitat=this.Historial.Items[Index][2];
	Text+=this.VisualitzarColumnaActivitat(NomActivitat,IdActivitat);
	var NomCodi=this.CodificarAccio(this.Historial.Items[Index][3]);
	Text+=this.VisualitzarColumna(NomCodi);
	Text+="</tr>";
	return(Text);
}

VisorHistorial.prototype.VisualitzarColumna =function(Contingut) {
	var Text="";
	Text+='<td>';
	Text+=Contingut;
	Text+='</td>';
	return (Text);
}

VisorHistorial.prototype.VisualitzarColumnaActivitat =function(Nom,Id) {
	var Text=this.VisualitzarColumna(Nom);
	return (Text);
}

VisorHistorial.prototype.CodificarAccio =function(Codi) {
	// 1 Entrar activitat
	// 2 Eliminar activitat
	// 3 identificar-se
	// 4 desidentificar-se
	// 5 Inici
	// 6 Puntuar activitat
	// 7 Més info
	// 8 Editar activitat
	// 9 Nou registre usuari
	// 10 Error intern

	switch(Codi) {
		case 1:return("Entrar");
		case 2:return("Eliminar");
		case 3:return("Identificació");
		case 4:return("Sortir");
		case 5:return("Començar");
		case 6:return("Puntuar");
		case 7:return("+Info");
		case 8:return("Editar");
		case 9:return("Registrar");
		case 6:return("(Error intern)");
	}
	return ("???");
}

/************************************************************************************
*
* Visor Historial --> Generar HTML Historial Secció
* 
************************************************************************************/

VisorHistorial.prototype.GenerarHTMLHistorialSeccio =function() {
	var Text="";
	Text+=this.GenerarHTMLCapcaleraSeccio();
	Text+="<br/><br/>";
	Text+='<table id="Historial_'+this.IndexFinestra+'" class="taulagris">';
	Text+=this.VisualitzarCapTaulaHistorialTema();
	Text+="<tbody>";
	for (var i=0;i<this.Historial.Items.length;i++) {
		Text+=this.VisualitzarApuntHistorialTema(i);
	}
	Text+='</tbody>';
	Text+='</table>';
	return(Text);
}

VisorHistorial.prototype.GenerarHTMLCapcaleraSeccio =function() {
	var Text="<br/>Diari de la secció<br/>";
	return (Text);
}
/************************************************************************************
*
* Visor Historial --> Generar HTML Historial Activitat
* 
************************************************************************************/

VisorHistorial.prototype.GenerarHTMLHistorialActivitat =function() {
	var Text="";
	Text+=this.GenerarHTMLCapcaleraActivitat();
	Text+="<br/><br/>";
	Text+='<table id="Historial_'+this.IndexFinestra+'" class="taulagris">';
	Text+=this.VisualitzarCapTaulaHistorialActivitat();
	Text+="<tbody>";
	for (var i=0;i<this.Historial.Items.length;i++) {
		Text+=this.VisualitzarApuntHistorialActivitat(i);
	}
	Text+='</tbody>';
	Text+='</table>';
	return(Text);
}

VisorHistorial.prototype.GenerarHTMLCapcaleraActivitat = function() {
	var Text="<br/>Diari de l'activitat<br/>";
	return (Text);
}

VisorHistorial.prototype.VisualitzarCapTaulaHistorialActivitat = function() {
	var Text="";
	Text+='<thead>';
	Text+='<tr class="liniainicial">';
	Text+='<th>Data-Hora</th>';
	Text+='<th>Acció</th>';	
	Text+='</tr>';
	Text+='</thead>';
	return (Text);
}

VisorHistorial.prototype.VisualitzarApuntHistorialActivitat = function(Index) {
	var Text="<tr>";
	var Data=this.Historial.Items[Index][0];
	Text+=this.VisualitzarColumna(Data);
	var NomCodi=this.CodificarAccio(this.Historial.Items[Index][3]);
	Text+=this.VisualitzarColumna(NomCodi);
	Text+="</tr>";
	return(Text);
}

