// VERSAO
var AccoesManager = "1.0";

var sectionControl = Class.create({
	initialize: function() {
	},
	setSection: function(html,div) {
		if (!div) div="contentDiv";
		$(div).innerHTML = html;
	},
	requestSection: function(file,div) {
		_openWindowPOST(file,'xml=true'+((div)?("&div="+div):""));
	},
	userImport: function() {
		this.requestSection("includes/ImportarUtilizadoresInterface.inc.php");
	},
	userManage: function() {
		this.requestSection("includes/UtilizadoresInterface.inc.php");
	},
	userList: function() {
		this.requestSection("includes/UtilizadoresListarInterface.inc.php");
	},
	groupManage: function() {
		this.requestSection("includes/GruposInterface.inc.php");
	},
	groupList: function() {
		this.requestSection("includes/GruposListarInterface.inc.php");
	},
	groupMove: function() {
		this.requestSection("includes/GruposMoverInterface.inc.php");
	},
	actionList: function(step) {
		this.requestSection("includes/AccoesInterface.inc.php",((step)?"stepDiv":false));
	},
	actionAdd: function() {
		this.requestSection("includes/AccoesAdicionarInterface.inc.php");
	},
	configLogins: function() {
		this.requestSection("includes/ConfigInterface.inc.php");
	}
});
// GLOBAL CONSTs
var Consts = {
	ERRO:0,
	MOVE_USER_IN:1,
	MOVE_USER_OUT:2,
	DEL_GROUP:3,
	NEW_USER:4,
	DEL_USER:5,
	NEW_GROUP:6,
	NEW_ACTION:7,
	DEL_ACTION:8,
	IMPORT_DB:9,
	SAVE_DB:10,
	PRINT_CONTENT:11,
	UPDATE_ACTION:12,
	NOTIFY_USER:13,
	NOTIFY_ALL:14,
	DELINQ:15,
	DELSELUSERS:16,
	DELALLUSERS:17,
	INQPREV:18,
	GETACCURL: 19,
	PRINT_CONTENT_DIV: 20,
	DEL_TRY: 21,
	SEND_MAIL_LINK: 22,
	BROWSE_RESULTS: 23,
	VOTE:24,
	CHANGEINQSTATE:25
}
// actionSend
// envia as acções para o php
var actionSend = Class.create({
	initialize: function() {
		this.waiting = false;
		this.currentAction = null;
	},
	send: function(vars,file) { // metodo privado
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		this.waiting = true;
		_openWindowPOST(((file)?file:"executeActions.php"),vars);
	},
	vote:function(id,vote) { //vote = up/down
		var vars = "action=vote&id="+id+"&type="+vote;
		if (utils.readCookie("voted"+id)=="votou") {
			alert("Já votou neste inquérito.");
		} else {
			utils.createCookie("voted"+id,"votou","40");
			this.send(vars);
		}
	},
	browse:function(p) {
		var sort = $('sort').value;
		if (p == 'lastPage') {
			p = this.currentPage;
			this.waiting=false; // tem que ser para o refresh ser automático depois dos votos...
		}
		var page = (p)?p:0;
		this.currentPage = page;
		if (utils.isEmpty(sort)) sort = "data";
		var keywords = utils.htmlentities($('browse_text').value);
		var vars = "refresh=true&sort="+sort+"&page="+page+"&search="+keywords;
		this.send(vars,"includes/BrowseInterface.inc.php");
	},
	previewSurvey: function (id,page) {
		var vars = "preview=true&id="+id+((page)?("&page="+page):"");
		this.send(vars,"inquerito.php");
	},
	getaccURL: function(id) {
		var vars="id="+id;
		this.send(vars,"accurlgen.php");
	},
	delTry: function(id,acc) {
		if (!confirm("De certeza que deseja apagar "+((id==0)?"todas as tentativas anónimas?":"esta tentativa?"))) return;
		var vars="action=del_try&id="+id+((acc)?"&acc="+acc:"");
		this.send(vars);
	},
	deleteSurvey: function(id,pwd) {
		if (confirm("De certeza que deseja apagar este inquérito?\n\nTodos os inquéritos publicados (e suas estatisticas) associados também serão apagados.")) {
			var vars="action=delinq&id="+id+((pwd)?"&pwd="+pwd:"");
			this.send(vars);
		}
	},
	changeSurveyState: function(id, changeTo) {
		var novoestado = (changeTo==1)?'privado':'publico';
		if (confirm("De certeza que deseja mudar este inquérito para "+novoestado+"?\n\nNota: os inquéritos publicos são listados para toda a gente ver e votar (se assim o entenderem)")) {
			var vars="action=changeinqstate&id="+id+"&changeTo="+changeTo;
			this.send(vars);
		}
	},
	notifyUser: function(obj,id) {
		//obj.src = "global/imgs/go.png";
		this.userRowInWait = obj;
		var vars = "action=notifyuser&uid="+id;
		this.send(vars);
	},
	notifyAll: function() {
		var vars = "action=notifyall";
		this.send(vars);
	},
	delSelUsers: function() {
		var t=$('usersList');
		var a=t.rows.length-1;
		var vars="";
		for (var i=1;i<a;i++) {
			var b=$('USR_'+i);
			if (b.checked) {
				if (vars!="") vars+="&";
				vars+="uids[]="+b.value;
			}
		}
		if (vars=="") { return; } // erro, nenhum seleccionado
		vars="action=delselusers&"+vars;
		this.send(vars);
	},
	delAllUsers: function() {
		if (confirm("De certeza que deseja apagar todos os utilizadores?")) this.send("action=delallusers");
	},
	moveUserIn: function () {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var uid = interfaceObj.getSelId(interfaceObj.users());
		var gid = interfaceObj.getSelId(interfaceObj.grupos());
		var vars = "action=in&uid=" + uid + "&gid=" + gid;
		if ((uid) && (gid)) this.send(vars);
		else {
			resposta.setFeedBack("Tem de seleccionar um utilizador e um grupo",true);
		}
	},
	sendMailLink: function() {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var email = $('emaillist');
		var msg = $('emailmsg');
		var url = $('emailurl').value;
		var assunto = $('emailsubject').value;
		if (utils.isEmpty(email.value)) {
			alert('Tem de fornecer pelo menos um E-Mail');
			email.focus();
			return;
		}
		var mailList = email.value.split(';');
		var vmail="";
		for (var i=0;i<mailList.length;i++) {
			var cmail=mailList[i];
			if (!utils.isMail(cmail)) {
				alert('O E-Mail: '+cmail+" não é válido");
				email.focus();
				break;
				return;
			}
			vmail+="&email[]="+cmail;
		}
		var vmsg="&msg="+utils.htmlentities(msg.value);
		var vurl="&url="+url;
		var vassunto="&assunto="+assunto;
		var vars = "action=sendmaillink"+vmail+vmsg+vurl+vassunto;
		this.send(vars);
	},
	moveUserOut: function () {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var uid = interfaceObj.getSelId(interfaceObj.gruposUsers());
		var gid = interfaceObj.getSelId(interfaceObj.grupos());
		var vars = "action=out&uid=" + uid + "&gid=" + gid;
		if ((uid) && (gid)) this.send(vars);
		else {
			resposta.setFeedBack("Tem de seleccionar um utilizador",true);
		}
	},
	importar: function(metodo) {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		if (metodo == "db") {
			var host = $('import_host').value;
			var user = $('import_user').value;
			var pass = $('import_pass').value;
			var dbnome = $('import_db_nome').value;
			var tabela = $('import_db_tabela').value;
			var cnome = $('import_db_campo_nome').value;
			var cmail = $('import_db_campo_email').value;
			var cpwd = $('import_db_campo_pwd').value;
			var hoststring = "&host="+host+((!utils.isEmpty(user))?("&user="+user):"")+((!utils.isEmpty(pass))?("&pass="+pass):"");
			var dbstring = "&dbnome="+dbnome+"&tabela="+tabela+"&cnome="+cnome+"&cmail="+cmail+((!utils.isEmpty(cpwd))?("&cpwd="+cpwd):"");
			vars = "action=importDb"+hoststring+dbstring;
			this.send(vars);
		}
	},
	gravarDBInfo: function() {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var active = $('save_active').checked;
		if (active) {
			var host = $('save_host').value;
			var user = $('save_user').value;
			var pass = $('save_pass').value;
			var dbnome = $('save_db_nome').value;
			var tabela = $('save_db_tabela').value;
			var cnome = $('save_db_campo_email').value;
			var cpwd = $('save_db_campo_pwd').value;
			var md5 = $('save_md5enc').checked;
			var hoststring = "&host="+host+((!utils.isEmpty(user))?("&user="+user):"")+((!utils.isEmpty(pass))?("&pass="+pass):"");
			var dbstring = "&dbnome="+dbnome+"&tabela="+tabela+"&cnome="+cnome+"&cpwd="+cpwd+((md5)?"true":"");
			vars = "action=saveDBinfo"+hoststring+dbstring;
		} else {
			vars = "action=saveDBinfo&turnoff=true";
		}
		this.send(vars);
	},
	addGroup: function() {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var name = $('novo_grupo').value;
		var vars = "action=add_group&novo_grupo="+name;
		if (name) this.send(vars);
		else {
			resposta.setFeedBack("Tem de dar um nome ao grupo",true);
		}
	},
	delGroup: function(obj,gid) {
		/*if (!grp) var grp = interfaceObj.grupos();
		else grp = $(grp);*/
		if (!utils.ask("Deseja mesmo apagar o grupo: "+grupos.getGrupo(gid).nome+"?")) return;
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		//var gid = interfaceObj.getSelId(grp);
		var vars = "action=del_group&gid="+gid;
		if (gid) {
			this.currentGroup = obj;
			this.send(vars);
		}
		else {
			resposta.setFeedBack("Tem de seleccionar um grupo",true);
		}
	},
	addUser: function() {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var nome = $('novo_user_nome').value;
		if (!utils.charsAreValid(nome)) {
			$('novo_user_nome').focus();
			resposta.setFeedBack("Nome contem caracteres invalidos",true);
			return;
		}
		var mail = $('novo_user_email').value;
		if (!utils.isMail(mail)) {
			$('novo_user_email').focus();
			resposta.setFeedBack("Email invalido");
			return;
		}
		var vars = "action=new_user&nome="+nome+"&mail="+mail;
		if ((nome) && (mail)) {
			this.send(vars);
			$('novo_user_nome').value = $('novo_user_email').value = "";
		} else {
			resposta.setFeedBack("Escreva o nome e email do utilizador a adicionar",true);
		}
	},
	delUser: function(obj,uid) {
		if (!utils.ask("Deseja mesmo apagar o utilizador: "+utilizadores.getUser(uid).nome+"?")) return;
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		//var uid = interfaceObj.getSelId(interfaceObj.users());
		var vars = "action=del_user&uid="+uid;
		if (uid) {
			this.currentUser = obj;
			this.send(vars);
		}
		else {
			resposta.setFeedBack("Tem de seleccionar um utilizador",true);
		}
	},
	updateAction: function() {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var nome = $("accoes_novaTxt").value;
		if (!nome) { resposta.setFeedBack("Escolha um nome para o inqu&eacute;rito",true); return; }
		if (!utils.charsAreValid(nome)) { resposta.setFeedBack("Nome inv&aacute;lido",true); return; }
		//var modoBtn = document.accoes.modo; // é um radio não sei se dava com $() para ter o array na mesma
		/*for (i=0;i< modoBtn.length;i++) { // não sei porque o IE não ia lá com o for each
			if (modoBtn[i].checked) { var modo = modoBtn[i].value; break; }
		}*/

		//var modo = ($('accoes_modo_privado').checked)?"privado":"publico"; // já não é usado.
		var modo = "publico";

		var password = "";	var datas = "";	var grupos = "";
		if ($('accoes_passwd').checked) {
			var txt = $('accoes_passwdText').value;
			if ((!utils.isEmpty(txt)) && (utils.charsAreValid(txt))) {
				password += "&password="+txt;
			} else { resposta.setFeedBack("Escreva uma password v&aacute;lida",true);	return;	}
		}

		/*if ($('accoes_usar_agrupamento').checked) {
			var grouplist = document.accoes.agrupamentos.options; // $('accoes_agrupamentos').options tava a dar erro.
			for (i=0;i < grouplist.length;i++) { // de novo, IE não vai la com for each
				if (grouplist[i].selected) { grupos += "&name%5B%5D="+grouplist[i].value; }
			}
		}
		
		if ($('accoes_datas').checked) {
			var dataIni = $('accoes_dataIni').value; var dataFim = $('accoes_dataFim').value; var dataI = dataIni.split("-"); var dataF = dataFim.split("-"); if (dataI[2] > dataF[2]) { // ano inicial maior q final
				var erro = true; } else if (dataI[2] == dataF[2]) {	if (dataI[1] > dataF[1]) { // ano igual, mes inicial maior
					var erro = true; } else if (dataI[1] == dataF[1]) {	if (dataI[0] >= dataF[0]) { // ano e mes iguais, dia inicial maior ou igual que final
						var erro = true; } }
			}
			if (erro) {	resposta.setFeedBack("Data inv&aacute;lida <small>(A data inicial nao pode ser igual nem depois da final)</small>",true); return; }
			datas += "&dataIni="+dataIni+"&dataFim="+dataFim;
		}*/
		var vobrig = "&obrig="+(($('accoes_idObrig').checked)?"1":"0");
		var url = $('accoes_redirurl').value;
		var vurl = (url)?("&url="+url):"";
		var questId = $('accoes_modelos').options[$('accoes_modelos').selectedIndex].value;
		var vars = "action=update_action&id="+servidor.actionEditId+"&nome="+nome+"&modo="+modo+grupos+datas+password+"&questid="+questId+vurl+vobrig;
		if ((questId) && (servidor.actionEditId)) this.send(vars);
	},
	addAction: function() {
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		var nome = $("accoes_novaTxt").value;
		if (!nome) {
			resposta.setFeedBack("Escolha um nome para o inqu&eacute;rito",true);
			return;
		}
		if (!utils.charsAreValid(nome)) {
			resposta.setFeedBack("Nome inv&aacute;lido",true);
			return;
		}
		/*var modoBtn = document.accoes.modo; // é um radio não sei se dava com $() para ter o array na mesma
		for (i=0;i< modoBtn.length;i++) { // não sei porque o IE não ia lá com o for each
			if (modoBtn[i].checked) {
				var modo = modoBtn[i].value;
				break;
			}
		}*/
		var modo = /*($('accoes_modo_privado').checked)?"privado":*/"publico";

		var password = "";
		var datas = "";
		var grupos = "";

		if ($('accoes_passwd').checked) {
			var txt = $('accoes_passwdText').value;
			if ((!utils.isEmpty(txt)) && (utils.charsAreValid(txt))) {
				password += "&password="+txt;
			} else {
				resposta.setFeedBack("Escreva uma password v&aacute;lida",true);
				return;
			}
		}


		/*if ($('accoes_usar_agrupamento').checked) {
			var grouplist = document.accoes.agrupamentos.options; // $('accoes_agrupamentos').options tava a dar erro.
			for (i=0;i < grouplist.length;i++) { // de novo, IE não vai la com for each
				if (grouplist[i].selected) {
					grupos += "&name%5B%5D="+grouplist[i].value;
				}
			}
		}
		if ($('accoes_datas').checked) {
			var dataIni = $('accoes_dataIni').value;
			var dataFim = $('accoes_dataFim').value;
			var dataI = dataIni.split("-");
			var dataF = dataFim.split("-");
			if (dataI[2] > dataF[2]) { // ano inicial maior q final
				var erro = true;
			} else if (dataI[2] == dataF[2]) {
				if (dataI[1] > dataF[1]) { // ano igual, mes inicial maior
					var erro = true;
				} else if (dataI[1] == dataF[1]) {
					if (dataI[0] >= dataF[0]) { // ano e mes iguais, dia inicial maior ou igual que final
						var erro = true;
					}
				}
			}
			if (erro) {
				resposta.setFeedBack("Data inv&aacute;lida <small>(A data inicial nao pode ser igual nem depois da final)</small>",true);
				return;
			}
			datas += "&dataIni="+dataIni+"&dataFim="+dataFim;
		}*/
		var url = $('accoes_redirurl').value;
		var obrig = $('accoes_idObrig').checked;
		var vobrig = "&obrig="+((obrig)?"1":"0");
		var vurl = (url)?("&url="+url):"";
		var questId = $('accoes_modelos').options[$('accoes_modelos').selectedIndex].value;
		var vars = "action=add_action&nome="+nome+"&modo="+modo+grupos+datas+password+"&questid="+questId+vurl+vobrig;
		if (questId) this.send(vars);
	},
	delAction: function(obj,accId) { // esta é chamada directamente
		if (!utils.ask("Deseja mesmo apagar o inquérito?")) { 
			return;
		}
		if (this.waiting) {
			resposta.setFeedBack("A aguardar a ultima resposta do servidor",true);
			return;
		}
		this.currentAction = obj;
		var vars = "action=del_action&accao_id="+accId;
		this.send(vars);
	}
});
// actionResponse
// desencadeia as acções a realizar tendo em conta a resposta do servidor
var actionResponse = Class.create({
	initialize: function() {
	},
	doAction: function(ac) {
		var info = ac.split(",");
		var tipo = info[0];
		if (tipo == Consts.MOVE_USER_IN) { // 1  - user id. 2 - group id
			this.moveIn(info[1],info[2]);
			this.setFeedBack("Utilizador movido",false);
		} else if (tipo == Consts.MOVE_USER_OUT) { //  1  - user id. 2 - group id
			this.moveOut(info[1],info[2]);
			this.setFeedBack("Utilizador movido",false);
		} else if (tipo == Consts.NEW_GROUP) { // 1 - lixo. 2 - group id. 3 - nome
			this.addGroup(info[2],info[3]);
			this.setFeedBack("Grupo adicionado",false);
		} else if (tipo == Consts.DEL_GROUP) { // 1 - group id
			this.delGroup(info[1]);
			this.setFeedBack("Grupo removido",false);
		} else if (tipo == Consts.NEW_USER) { // 1 - user id. 2 - lixo. 3 - nome. 4 - mail. 5 - pass
			this.addUser(info[1],info[3],info[4],info[5]);
			this.setFeedBack("Utilizador adicionado",false);
		} else if (tipo == Consts.DEL_USER) { // 1 - user id
			this.delUser(info[1]);
			this.setFeedBack("Utilizador removido",false);
		} else if (tipo == Consts.NEW_ACTION) { // 1 - string part1 . 2 - string part2 (para concatenar)
			servidor.waiting=false;
			this.addAction(ac.substring(2));
			this.setFeedBack("Inqu&eacute;rito adicionado",false);
		} else if (tipo == Consts.DEL_ACTION) { // lixo
			this.delAction();
			this.setFeedBack("Inqu&eacute;rito removido",false);
		} else if (tipo == Consts.IMPORT_DB) { // lixo
			this.importDB();
			this.setFeedBack("Utilizadores importados",false);
		} else if (tipo == Consts.PRINT_CONTENT_DIV) { // div, tudo concatenado = html
			div = info[1];
			string= info[2];
			total = info.length;
			for (i=3;i<total;i++) string += ","+info[i];
			seccoes.setSection(string,div);
		} else if (tipo == Consts.PRINT_CONTENT) { // tudo concatenado = html
			string = info[1];
			total = info.length;
			for (i=2;i<total;i++) string += ","+info[i];
			seccoes.setSection(string);
		} else if (tipo == Consts.INQPREV) { // pagina
			this.printPreview(ac.substring(3));
		} else if (tipo == Consts.GETACCURL) { //
			this.showaccURL(ac.substring(3));
		} else if (tipo == Consts.DELINQ) { // 
			//document.location.href = "index.php?step=1";
			document.location.reload(true);
		} else if (tipo == Consts.CHANGEINQSTATE) {
			document.location.reload(true);
		} else if (tipo == Consts.UPDATE_ACTION) { // tudo concatenado = nova fila
			var string = info[1];
			var total = info.length;
			for (i=2;i<total;i++) string += ","+info[i];
			this.updateAction(string);
			this.setFeedBack("Inqu&eacute;rito actualizado",false);
		} else if (tipo == Consts.SEND_MAIL_LINK) {
			try {
				$('emaillist').value="";
				//$('emailmsg').value="";
				$('accaourlcontainer').style.display='none;';
			} catch(e) {}
			this.setFeedBack("E-Mail(s) enviado(s)",false);
		} else if (tipo == Consts.DEL_TRY) {
			document.location.reload(true);
		} else if (tipo == Consts.DELSELUSERS) {
			//document.location.href="index.php?step=2"; // mudar isto depois.. fazer só refresh da parte de baixo
			document.location.reload(true);
		} else if (tipo == Consts.NOTIFY_USER) { // lixo
			this.notifyUser();
			this.setFeedBack("Utilizador notificado");
		} else if (tipo == Consts.BROWSE_RESULTS) {
			var string = info[1];
			var total = info.length;
			for (i=2;i<total;i++) string += ","+info[i];
			this.browseResults(string);
		} else if (tipo == Consts.VOTE) {
			this.updateSearchResults();
		}		else if (tipo == Consts.NOTIFY_ALL) { // tudo concatenado 1 = OK ou mensagem erro parcial
			var string = info[1];
			var total = info.length;
			for (i=2;i<total;i++) string += ","+info[i];
			if (string == "OK") {
				this.notifyAll();
				this.setFeedBack("Todos os utilizadores foram notificados.");
			} else {
				seccoes.userList();
				this.setFeedBack("N&atilde;o foi possivel notificar todos os utilizadores");
			}
		} else if (tipo == Consts.ERRO) { // 1 - mensagem
			this.setFeedBack(info[1],true);
		}
		servidor.waiting = false;
	},
	notifyUser: function() {
		var obj = servidor.userRowInWait;
		if (obj) {
			obj.src = "global/imgs/go.png";
			obj.onclick = "return false";
		}
		servidor.userRowInWait = false;

	},
	browseResults: function(s) {
		try { $('searchResults').innerHTML = s; } catch(e) {};
	},
	updateSearchResults:function() {
		try { servidor.browse('lastPage') } catch(e) {};
	},
	notifyAll: function() {
		var ulist = $('usersList');
		try {
			for (var i=2;i<ulist.rows.length;i++) {
				var p = ulist.rows[i].cells[2].childNodes[0].childNodes[0];
				p.src = "global/imgs/go.png";
				p.onclick ="return false";
			}
		} catch(e) {}
	},
	showaccURL: function(s) {
		$('accaourl').innerHTML = s;
		$('accaourlcontainer').style.display="block";
	},
	printPreview: function(s) {
		var html = s.replace("<html><body>","");
		html = html.replace("</body></html>","");
		var pwindow = $("previewWindow");
		pwindow.innerHTML = html;
		pwindow.style.display = "block";
	},
	importDB: function() {
		// para já não precisa fazer nada
	},
	moveIn: function(userid,groupid) {
		var nome = utilizadores.getUser(userid).nome;
		grupos.addUserTo(userid,nome,groupid);
		interfaceObj.addUserToGroupList(userid,nome);
	},
	moveOut: function(userid,groupid) {
		grupos.delUserFrom(userid,groupid);
		interfaceObj.delFromSelect(interfaceObj.gruposUsers(),userid);
	},
	addGroup: function(id,nome) {
		grupos.addGroup(id,nome);
		try { interfaceObj.addGroup(id,nome); } catch(e) {};
	},
	delGroup: function(id) {
		grupos.delGroup(id);
		try { interfaceObj.delGroup(id); } catch(e) { };
	},
	addUser: function(id,nome,mail,pass) {
		utilizadores.addUser(id,nome);
		try { interfaceObj.addUserToUserList(id,nome,mail,pass); } catch(e) {};
	},
	delUser: function(id) {
		utilizadores.delUser(id);
		grupos.delUserFromAll(id);
		interfaceObj.delUser(id);
		interfaceObj.groupSelect();
	},
	addAction: function (ac) {
		// interfaceObj.addAction(ac);
		var td = ac.split("^");
		var id = td[0];
		var nome = td[1];
		var tipo = td[2];
		var pass = td[3];
		var inq = td[4];
		var dataini = td[5];
		var datafim = td[6];
		var grupos = td[7].split(",");
		var url = td[8];
		var obrig = td[9];
		//alert("id:"+id+" nome:"+nome+" pass:"+pass+" tipo:"+tipo+" inqid:"+inq+" di:"+dataini+" df:"+datafim+" grupos:"+td[7]);
		try { accoes.addAction(id,nome,inq,tipo,pass,grupos,dataini,datafim,url,obrig); } catch(e) {}
		$('accaourlcontainer').style.display="none";
		servidor.getaccURL(id);
	},
	updateAction: function(str) {
		var td = str.split("^");
		var nome = td[0];
		var tipo = td[1];
		var pass = td[2];
		var inq = td[3];
		var dataini = td[4];
		var datafim = td[5];
		var grupos = td[6].split(",");
		var url = td[7];
		var obrig = td[8];
		accoes.updateAction(servidor.actionEditId,nome,inq,tipo,pass,grupos,dataini,datafim,url,obrig);
		//seccoes.actionList(true);
		interfaceObj.updateAction(servidor.actionEditId,nome,inq,tipo,pass,grupos,dataini,datafim,url,obrig);
		//seccoes.actionList();
	},
	delAction: function() {
		interfaceObj.delAction();
	},
	setFeedBack: function(msg,err) {
		var x = $('feedback');
		if (err) msg = "<b>Erro:</b> "+msg;
		if (x) x.innerHTML = "<span class='"+((err)?"erro":"info")+"'>"+msg+"</span>";
		if (err) {
			window.location.hash = "feedback";
			$('feedback').focus();
		}
	}
});
// userControl
// lista de utilizadores
var userControl = Class.create({
	initialize: function() {
		this.users = new Array();
	},
	getUsers: function() { // devolve todos os utilizadores
		return this.users;
	},
	getUser: function(id) { // devolve um utilizador
		for (i in this.users) {
			if (this.users[i].id == id)
				return this.users[i];
		}
		return false;
	},
	addUser: function(id,nome) { // adiciona um novo user
		if ((!id) || (!nome)) return false;
		this.users.push({
			'nome':nome,
			'id':id
		});
		return true;
	},
	delUser: function (id) { // apaga um user
		for (i in this.users) {
			if (this.users[i].id == id) {
				this.users.splice(i,1);
				break;
			}
		}
	}
});
// interfaceControl
// faz de intermedio entre todos os objectos e o interface
// é gerado no fim do html porque precisa que todos os elementos já existam
var interfaceControl = Class.create({
	initialize: function(grupos,gruposList,userList,gruposAcc) {
		this.gruposS = grupos;
		this.gruposAccS = gruposAcc;
		this.gruposUsersS = gruposList;
		this.usersS = userList;
		this.populateActions();
	},
	users: function() {
		return $(this.usersS);
	},
	grupos: function() {
		return $(this.gruposS);
	},
	gruposAcc: function() {
		return $(this.gruposAccS);
	},
	gruposUsers: function() {
		return $(this.gruposUsersS);
	},
	populateActions: function() {
		if (!this.gruposAcc()) return false;
		this.populateWithGroups(this.gruposAcc());
	},
	populateWithGroups: function(what) {
		var g = grupos.getGrupos();
		for (i in g) {
			if (g[i].id) this.addToSelect(what,g[i].id,g[i].nome);
		}
	},
	changeCode: function() {
		var url=$('emailurl').value;
		var purl=$('emailpurl').value;
		var nome=$('emailnome').value;
		
		var tip = 'link';
		if ($('abrirem_iframe').checked) tip = 'iframe';
		var jan = 'propria';
		if ($('abrirem_nova').checked) jan = 'nova';

		var pub = "texto";
		if ($('ligacaosfm_img').checked) {
			pub = 'imagem';
		} else if ($('ligacaosfm_none').checked) {
			pub = '';
		}

		//var nsrc="pv_"+((tip=="link")?"link":"iframe")+((pub=="texto")?"t":((pub=="imagem")?"i":"_clean"))+".gif";
		var nsrc="pv_link"+((pub=="texto")?"t":((pub=="imagem")?"i":"_clean"))+".gif";
		$('codeimg').src = "global/imgs/"+nsrc;
		var code="";
		if (tip=="iframe") {
			code+="<iframe width=\"500\" height=\"300\" src=\""+url+"\"></iframe><br />";
		} else {
			var target=(jan=='nova')?" target=\"_blank\"":"";
			code+="<a"+target+" title=\"E-Learning - Avaliação da formação\" href=\""+url+"\">Avaliação da formação - "+nome+"</a>";
		}
		if (pub=="texto") {
			code+=" - <span><small>por <a title=\"Sistemas de Formação Multimédia\" target=\"_blank\" href='http://www.sfm.pt'>SFM</a></small></span>";
		} else if (pub=="imagem") {
			code+=" - <a title=\"E-Learning - Avaliação da formação\" style='text-decoration:none;border:none;' href='http://www.sfm.pt'><img src='"+purl+"' width='65' height='24' border='0' /></a>";
		}
		//code = utils.htmlentities(code);
		$('codearea').value=code;
	},
	getaccURL: function(obj,id) {
		try { $('accoesEdit').style.display="none"; } catch(e) {}
		var al = $('accoesList');
		for (o=0;o<al.rows.length;o++) {
			al.rows[o].className = "";
		}
		obj.parentNode.parentNode.parentNode.className = "selTR accSel";
		servidor.getaccURL(id);
	},
	actionRowSelect: function(obj,id) {
		try { $('accaourlcontainer').style.display="none"; } catch(e) {}
		var ac = $('accoesEdit');
		servidor.actionEditId = id;
		var al = $('accoesList');
		for (o=0;o<al.rows.length;o++) {
			al.rows[o].className = "";
		}
		obj.parentNode.parentNode.parentNode.className = "selTR";
		var act = accoes.getAction(id);

		/*if ((act.dataini) || (act.datafim)) {
			$('accoes_datas').checked = true;
			$('accoes_dataIni').value = act.dataini;
			$('accoes_dataFim').value = act.datafim;
		} else {
			$('accoes_datas').checked = false;
			$('accoes_dataIni').value = $('accoes_dataFim').value = "";
		}*/
		//this.datasOnOff();

		
		$('accoes_novaTxt').value = act.nome;
		if (!utils.isEmpty(act.url)) { $('accoes_redirurl').value=act.url; }

		//var modos = document.accoes.modo;
		/*var len = modos.length;
		for (i=0;i<len;i++) {
			if (modos[i].value == act.tipo)
				modos[i].checked = true;
			else modos[i].checked = false;
		}*/
		
		if (act.pass) {
			$('accoes_passwd').checked = true;
			//$('accoes_passwdText').value = act.pass; // esta pass é md5
		} else {
			$('accoes_passwd').checked = false;
		}
		//$('accoes_modo_privado').checked = (act.tipo != "publico");
		$('accoes_passwdText').value = ""; // quer esteja ligado ou não, eu não posso saber a password
		this.passwordOnOff(true);

		/*var agp = $('accoes_usar_agrupamento');
		var agrp = $('agrupamentos');
		if (act.grupos[0]) {
			agp.checked = true;
			this.groupsOnOff();
			//try {
				for (a=0;a < agrp.options.length;a++) {
					for (b in act.grupos) {
						if (agrp.options[a].value == act.grupos[b]) {
							agrp.options[a].selected = true;
							break;
						} else {
							agrp.options[a].selected = false;
						}
					}
				}
			//} catch(e) {}
		} else {
			agp.checked = false;
			this.groupsOnOff();
		}*/
		$('accoes_idObrig').checked = act.idobrig;
		var inq = $('accoes_modelos');
		for (var d=0;d<inq.options.length;d++) {
			if (inq.options[d].value == act.inq) {
				inq.selectedIndex = d;
				var nomemodelo = inq.options[d].text;
				break;
			}
		}
		$('accoes_inqnome').innerHTML = nomemodelo;
		ac.style.display = "block";
	},
	closeActionEdit: function() {
		var al = $('accoesList');
		for (o=0;o<al.rows.length;o++) {
			al.rows[o].className = "";
		}
		$('accoesEdit').style.display = "none";
	},
	datasOnOff: function() {
		var gr = $('accoes_datas').checked;
		/*$('accoes_dataIni_Month_ID').disabled = 
		$('accoes_dataIni_Month_ID').disabled = $('accoes_dataIni_Day_ID').disabled = $('accoes_dataIni_Year_ID').disabled = $('accoes_dataFim_Month_ID').disabled = $('accoes_dataFim_Day_ID').disabled = $('accoes_dataFim_Year_ID').disabled = !gr;
		$('accoes_dataIni_Year_ID').className = $('accoes_dataFim_Year_ID').className = (gr)?"texto normal":"texto escondido";*/
		$('accoes_dataIni').disabled = $('accoes_dataFim').disabled = !gr;
		$('accoes_dataIni').className = $('accoes_dataFim').className = (gr)?"texto normal":"texto escondido";
	},
	getModo: function() {
		var modoBtn = document.accoes.modo;
		for (i=0;i< modoBtn.length;i++) { // não sei porque o IE não ia lá com o for each
			if (modoBtn[i].checked) {
				var modo = modoBtn[i].value;
				break;
			}
		}
		return modo;
	},
	showHidePwd: function() {
		//var modo = this.getModo();
		//$('accoes_pwdgroup').style.opacity = (modo == "publico")?"1":"0.2";
//		if ((modo != "publico") && ($('accoes_passwd').checked)) {
			this.passwordOnOff();
//		}
	},
	passwordOnOff: function(s) {
		var x =	$('accoes_passwd');
		/*if (this.getModo() != "publico") {
			x.checked = false;
			if (!s) resposta.setFeedBack("N&atilde;o pode proteger com password uma ac&ccedil;&atilde;o que n&atilde;o &eacute; publica",true);
		}*/
		var gr = x.checked;
		$('accoes_passwdText').disabled = !gr;
		$('accoes_passwdText').className = (gr)?"texto normal":"texto escondido";
	},
	groupsOnOff: function() {
		var gr = $('accoes_usar_agrupamento').checked;
		$('agrupamentos').disabled = !gr;
		$('agrupamentos').selectedIndex = -1;
	},
	addToSelect: function(obj,value,opt) {
		var o = new Option(opt,value);
		try { obj.options.add(o, null); }
		catch(e) {	obj.options.add(o,0); }
	},
	delFromSelect: function(obj,id) {
		var length = (obj.options.length)?obj.options.length:obj.length;
		for (i=0; i < length;i++) {
			if (obj.options[i].value == id) {
				try { obj.options.remove(i); }
				catch(e) { obj.remove(i); }
				break;
			}
		}
	},
	updateAction: function (id,nome,inq,tipo,pass,grupos,dataini,datafim,url,obrig) {

		var actions = $('accoesList');
		if (actions) { // .rows .cells
			for (var i=0;i<actions.rows.length;i++) {
				if (actions.rows[i].className == 'selTR') {
					var editRow = actions.rows[i];
					break;
				}
			}
			if (editRow) {
				var nameCell = editRow.cells[0];
				var iconCell = editRow.cells[1];
				nameCell.innerHTML = nome;
				var icons = "<center>";
				icons += "<img class=\"icon\" width=\"16\" height=\"16\" src=\"global/imgs/"+tipo+".png\" title=\""+tipo+"\" alt=\""+tipo+"\" />";
				if (pass) icons += "<img class=\"icon\" width=\"16\" height=\"16\" src=\"global/imgs/pwd.png\" title=\"Protegido com password\" alt=\"Protegido com password\" />";
				icons += "</center>";
				iconCell.innerHTML = icons;
			}
		}
		interfaceObj.closeActionEdit();
	},
	addAction: function(str) {
		var td = str.split("^");
		var actions = $('accoesList');
		if (actions) {
			var newRow = actions.insertRow(-1);
			var len = td.length;
			for (i=0;i<len;i++) {
				var c = newRow.insertCell(i);
				c.innerHTML = td[i];
			}
		}
	},
	delAction: function() {
		var ac = servidor.currentAction;
		var i=ac.parentNode.parentNode.parentNode.rowIndex;
		var actions = $('accoesList');
		actions.deleteRow(i);
		servidor.currentAction = null;
		try { $('accoesEdit').style.display="none"; } catch(e){}
	},
	delUser: function() {
		//this.delFromSelect(this.users(),id);
		var ac = servidor.currentUser;
		var i=ac.parentNode.parentNode.parentNode.rowIndex;
		var actions = $('usersList');
		actions.deleteRow(i);
		servidor.currentUser = null;
	},
	addUserToGroupList: function(id,nome) {
		if (!this.gruposUsers()) return false;
		this.addToSelect(this.gruposUsers(),id,nome);
	},
	addUserToUserList: function(id,nome,mail,pass) {
		if (pass) { // novo metodo
			var t=$('usersList');
			if (t) {
				var r=t.insertRow(-1);
				var rn=r.rowIndex-1;
				r.setAttribute("id","TD_"+rn);
				r.onclick=new Function("rows.selectRow("+rn+")");
				r.className = rows.returnClass(rn);
				var c1=r.insertCell(-1);
				c1.innerHTML="<input onclick=\"this.checked=!this.checked\" id=\"USR_"+rn+"\" name=\"USR_"+rn+"\" type=\"checkbox\" value=\""+id+"\" > "+nome;
				var c2=r.insertCell(-1);
				c2.innerHTML=mail;
				var c3=r.insertCell(-1);
				c3.innerHTML="<center>"+pass+"<center>";
			}
		} else {
			try { 
				this.addToSelect(this.users(),id,nome+" ("+mail+")");
				this.users().selectedIndex = 0
			} catch(e) {}
		}
	},
	addGroup: function(id,nome) {
		try {
			this.addToSelect(this.grupos(),id,nome);
			try { this.addToSelect(this.gruposAcc(),id,nome); } catch (e) {};
		} catch (e) {};
	},
	delGroup: function() {
		//try { this.delFromSelect(this.grupos(),id); } catch(e) {};
		//try { this.delFromSelect(this.gruposAcc(),id); } catch (e) {};
		var ac = servidor.currentGroup;
		var i=ac.parentNode.parentNode.parentNode.rowIndex;
		var actions = $('groupList');
		actions.deleteRow(i);
		servidor.currentGroup = null;
		//this.groupSelect();
	},
	getSelId: function(obj) { // metodo privado - supoe que não é possivel seleccionar mais que um
			var id = false;
			if (obj.selectedIndex > -1) var id = obj.options[obj.selectedIndex].value;
			return id;
	},
	getSelIndex: function(obj) { // metodo privado - supoe que não é possivel seleccionar mais que um
			return (obj.selectedIndex > -1)?obj.selectedIndex:false;
	},
	groupSelect: function(obj) {
		if (!obj) obj = this.grupos();
		if (!this.gruposUsers()) return false;
		var gid = this.getSelId(obj);
		this.gruposUsers().innerHTML = "";
		if (!gid) return false;
		var nameTarget = $('selGName');
		if (nameTarget) nameTarget.innerHTML = grupos.getGrupo(gid).nome;
		users = grupos.getUsersFrom(gid);
		for (i in users) {
			if (users[i].id) this.addToSelect(this.gruposUsers(),users[i].id,users[i].nome);
		}
	}
});

// accoesControl
// mantem a lista de acções actualizada
var actionControl = Class.create({
	initialize: function() {
		this.accoes = new Array();
	},
	addAction: function(id,nome,inq,tipo,pass,grupos,dataini,datafim,url,idobrig) {
		this.accoes.push({
			'nome':nome,
			'id':id,
			'inq': inq,
			'tipo': tipo,
			'pass': ((pass)?pass:""),
			'grupos': ((grupos)?grupos:new Array()),
			'dataini': dataini,
			'datafim': ((datafim)?datafim:""),
			'url': ((url)?url:""),
			'idobrig':((!idobrig||idobrig=='0')?false:true)
		});
	},
	updateAction: function(id,nome,inq,tipo,pass,grupos,dataini,datafim,url,obrig) {
		this.delAction(id);
		this.addAction(id,nome,inq,tipo,pass,grupos,dataini,datafim,url,obrig);
	},
	delAction: function(id) {
		for (i in this.accoes) {
			if (this.accoes[i].id == id) {
				this.accoes.splice(i,1);
				break;
			}
		}
	},
	getActions: function() {
		return this.accoes;
	},
	getAction: function(id) {
		for (i in this.accoes) {
			if (this.accoes[i].id == id) return this.accoes[i];
		}
	}
});
// groupControl
// Serve para manter a lista de grupos actualizada client side
var groupControl = Class.create({
	initialize: function() {
		this.grupos = new Array();
	},
	getGrupos: function() { // devolve todos os grupos
		return this.grupos;
	},
	getGrupo: function(id) {
		for (i in this.grupos) {
			if (this.grupos[i].id == id) {
				return this.grupos[i];
			}
		}
		return false; 
	},
	getUsersFrom: function(id) { // devolve os utilizadores de um grupo
		for (i in this.grupos) {
			if (this.grupos[i].id == id) {
				return this.grupos[i].users;
			}
		}
		return false; 
	},
	addGroup: function(id,nome,users) { // adiciona um novo grupo
		if ((!id) || (!nome)) return false;
		this.grupos.push({
			'nome':nome,
			'id':id,
			'users': ((users)?users:new Array())
		});
		return true;
	},
	delGroup: function (id) { // apaga um grupo
		for (i in this.grupos) {
			if (this.grupos[i].id == id) {
				this.grupos.splice(i,1);
				break;
			}
		}
	},
	addUserTo: function (userid,usernome,grupoid) { // adiciona um utilizador a um grupo
		if ((!userid) || (!usernome) || (!grupoid)) return false;
		for (i in this.grupos) {
			if (this.grupos[i].id == grupoid) {
				this.grupos[i].users.push({
					'id':userid,
					'nome':usernome
				})
				break;
			}
		}
		return true;
	},
	delUserFrom: function(userid,grupoid) { // apaga um utilizador de um grupo
		if ((!userid) || (!grupoid)) return false;
		for (a in this.grupos) {
			if (this.grupos[a].id == grupoid) {
				var g = this.grupos[a].users;
				for (i in g) {
					if (g[i].id == userid) {
						this.grupos[a].users.splice(i,1);
						break;
					}
				}
				break;
			}
		}
		return true;
	},
	delUserFromAll: function(userid) {
		for (i in this.grupos) {
			var h = this.grupos[i];
			for (j in h.users) {
				if (h.users[j].id == userid) {
					h.users.splice(j,1);
					break; // um grupo nunca tem duas vezes o mesmo user
				}
			}
		}
	}
});
// GLOBAL OBJECTS
var utilizadores = new userControl();
var grupos = new groupControl();
var servidor = new actionSend();
var resposta = new actionResponse();
var seccoes = new sectionControl();
var accoes = new actionControl();
